diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml new file mode 100644 index 0000000000..f8098df66e --- /dev/null +++ b/.github/workflows/compile_changelogs.yml @@ -0,0 +1,40 @@ +name: Compile changelogs + +on: + schedule: + - cron: "0 0 * * *" + +jobs: + compile: + name: "Compile changelogs" + runs-on: ubuntu-latest + steps: + - name: "Setup python" + uses: actions/setup-python@v1 + with: + python-version: '3.x' + - name: "Install deps" + run: | + python -m pip install --upgrade pip + python -m pip install pyyaml + sudo apt-get install dos2unix + - name: "Checkout" + uses: actions/checkout@v1 + with: + fetch-depth: 25 + - name: "Compile" + run: | + python tools/ss13_genchangelog.py html/changelog.html html/changelogs + - name: "Convert Lineendings" + run: | + unix2dos html/changelogs/.all_changelog.yml + - name: Commit + run: | + git config --local user.email "action@github.com" + git config --local user.name "Changelogs" + git pull origin master + git commit -m "Automatic changelog compile [ci skip]" -a || true + - name: "Push" + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 2a1ffe65ec..0ecf4c5b01 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ ## Citadel Station 13 Based and maintained from /tg/station. -[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) +[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) +[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") -[![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) - -[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) [![Krihelimeter](http://www.krihelinator.xyz/badge/Citadel-Station-13/Citadel-Station-13)](http://www.krihelinator.xyz) - -[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") +[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) **Upstream Information** -**Website:** https://tgstation13.org -**Code:** https://github.com/tgstation/tgstation -**Wiki** https://tgstation13.org/wiki/Main_Page -**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus). - +* **Website:** +* **Code:** +* **Wiki:** +* **Codedocs:** +* **/tg/station Discord:** +* **Coderbus Discord:** +* ~~**IRC:** ~~ (dead) + **Citadel Station Information** -**Website:** http://citadel-station.net -**Forums:** http://citadel-station.net/forum -**Ban Appeals:** http://citadel-station.net/forum/forumdisplay.php?fid=8 -**Code:** https://github.com/Citadel-Station-13/Citadel-Station-13 -**Discord:** [Here](https://discord.gg/E6SQuhz) +* **Website:** +* **Code:** +* **Wiki:** +* **Forums:** +* **Ban Appeals:** +* **Discord:** ## DOWNLOADING @@ -162,13 +164,12 @@ All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 a See LICENSE and GPLv3.txt for more details. +The TGS3 API is licensed as a subproject under the MIT license. + +See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. + tgui clientside is licensed as a subproject under the MIT license. Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1 tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). -The TGS3 API is licensed as a subproject under the MIT license. -See tgui/LICENSE.md for the MIT license. -See tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md for the SIL Open Font License. -See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. - -All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. +All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml new file mode 100644 index 0000000000..b827472254 --- /dev/null +++ b/SpacemanDMM.toml @@ -0,0 +1,2 @@ +[langserver] +dreamchecker = true diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm similarity index 100% rename from _maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm rename to _maps/RandomRuins/AnywhereRuins/fountain_hall.dmm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm similarity index 100% rename from _maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm rename to _maps/RandomRuins/AnywhereRuins/golem_ship.dmm diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm new file mode 100644 index 0000000000..acb68d3c80 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm @@ -0,0 +1,1691 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random/more_caves, +/area/icemoon/surface/outdoors/unexplored) +"b" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"U" = ( +/turf/closed/mineral/random/no_caves, +/area/icemoon/surface/outdoors/unexplored) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(3,1,1) = {" +b +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +b +"} +(4,1,1) = {" +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +"} +(5,1,1) = {" +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +"} +(6,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(7,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(8,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(9,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(10,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(11,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(12,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(13,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(14,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(15,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(16,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(17,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(18,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(19,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(20,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(21,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(22,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(23,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(24,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(25,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(26,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(27,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(28,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(29,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(30,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(31,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(32,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(33,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(34,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(35,1,1) = {" +b +b +U +U +U +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +U +U +U +b +b +"} +(36,1,1) = {" +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +"} +(37,1,1) = {" +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +"} +(38,1,1) = {" +b +b +b +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +U +b +b +b +"} +(39,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(40,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm new file mode 100644 index 0000000000..cfc9e5f4ce --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -0,0 +1,2082 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"ab" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ad" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ae" = ( +/turf/closed/wall/r_wall, +/area/icemoon/surface/outdoors) +"af" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"ag" = ( +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"ah" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"ai" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ak" = ( +/turf/closed/wall/ice, +/area/icemoon/surface/outdoors) +"al" = ( +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"am" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"an" = ( +/turf/closed/wall/mineral/snow, +/area/icemoon/surface/outdoors) +"ao" = ( +/obj/item/clothing/under/rank/engineering/chief_engineer, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ap" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"aq" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"ar" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"as" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"au" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"av" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ax" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/o2, +/area/icemoon/surface/outdoors) +"ay" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/o2, +/area/icemoon/surface/outdoors) +"az" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/n2, +/area/icemoon/surface/outdoors) +"aA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/n2, +/area/icemoon/surface/outdoors) +"aB" = ( +/turf/closed/wall, +/area/icemoon/surface/outdoors) +"aC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/o2, +/area/icemoon/surface/outdoors) +"aE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/o2, +/area/icemoon/surface/outdoors) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/n2, +/area/icemoon/surface/outdoors) +"aG" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/n2, +/area/icemoon/surface/outdoors) +"aH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aI" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"aK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aM" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/airless, +/area/icemoon/surface/outdoors) +"aN" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/airless, +/area/icemoon/surface/outdoors) +"aO" = ( +/turf/closed/wall/r_wall/rust, +/area/icemoon/surface/outdoors) +"aP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aV" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aX" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aZ" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ba" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"bd" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bf" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"bh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"bi" = ( +/obj/machinery/door/airlock/engineering{ + name = "The Singularity Engine" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"bj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bk" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Entry"; + req_access_txt = "204" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"br" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bt" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bu" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/power/apc/unlocked{ + dir = 4; + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"by" = ( +/obj/item/stack/rods{ + amount = 2 + }, +/obj/item/shard/plasma, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bA" = ( +/obj/item/flashlight/flare, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"bD" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bI" = ( +/obj/item/pda/clear{ + note = "Chief's asked me to check on the machinery inside PDA. He's also worried about Build, but i'm sure Harry'll handle the construction. I just need to work on Internals. Fuck i'm hungry" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bK" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bM" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bO" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bP" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bQ" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bS" = ( +/obj/structure/sign/poster/official/build{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bT" = ( +/obj/item/pipe_dispenser, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bU" = ( +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bY" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ca" = ( +/obj/item/flashlight, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cb" = ( +/obj/item/book/manual/wiki/atmospherics, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cd" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ce" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cg" = ( +/obj/item/wallframe/apc, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"ch" = ( +/obj/machinery/light/broken, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ci" = ( +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/atmosia_independence{ + pixel_x = -32 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cl" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cn" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"co" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cr" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Production Room"; + req_access_txt = "204" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cs" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ct" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cu" = ( +/obj/structure/girder, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cw" = ( +/obj/machinery/atmospherics/pipe/manifold4w/green/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cA" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cC" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"cD" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"cE" = ( +/obj/machinery/computer/rdconsole/production, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"cG" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"cH" = ( +/obj/item/construction/rcd, +/obj/structure/rack, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_upgrade/frames, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cI" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/space_heater, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cN" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cQ" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cR" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/space_heater, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cT" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"cV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cY" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cZ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/airless, +/area/icemoon/surface/outdoors) +"da" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/airless, +/area/icemoon/surface/outdoors) +"db" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/airless, +/area/icemoon/surface/outdoors) +"dc" = ( +/obj/machinery/power/rad_collector, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"dd" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"de" = ( +/obj/machinery/autolathe, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"df" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dh" = ( +/obj/structure/sign/poster/contraband/grey_tide, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/icemoon/surface/outdoors) +"di" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dj" = ( +/turf/closed/wall/rust, +/area/icemoon/surface/outdoors) +"dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/air, +/area/icemoon/surface/outdoors) +"dl" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/air, +/area/icemoon/surface/outdoors) +"dm" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/vacuum, +/area/icemoon/surface/outdoors) +"dn" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/vacuum, +/area/icemoon/surface/outdoors) +"do" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"dp" = ( +/obj/machinery/light/built, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"dq" = ( +/obj/item/tank/internals/plasma, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"dr" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"ds" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"dt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"du" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/icemoon/surface/outdoors) +"dx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/icemoon/surface/outdoors) +"dy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/icemoon/surface/outdoors) +"dz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/icemoon/surface/outdoors) +"dA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dB" = ( +/obj/structure/girder, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dC" = ( +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"gA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"gD" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"mO" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"oi" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"xh" = ( +/mob/living/simple_animal/hostile/bear/snow, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"CR" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"DM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"Ee" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) +"Wr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/icemoon/surface/outdoors) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +ak +an +ak +ak +an +ab +aa +by +bQ +bQ +aO +ae +ak +ak +ae +aO +aa +"} +(3,1,1) = {" +aa +aa +aa +aj +ab +al +al +ab +ab +ab +ab +ab +ab +al +al +al +do +ae +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aj +al +al +al +al +al +al +al +al +al +al +gA +ak +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aw +aK +bc +bc +bR +bc +bc +cC +cT +ai +Ee +aO +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +al +cD +gA +al +al +aO +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +bd +aa +aa +aa +af +cA +DM +dc +al +ae +aa +"} +(8,1,1) = {" +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +DM +ag +al +ak +aa +"} +(9,1,1) = {" +ab +ab +al +ap +aa +aa +aa +aa +bf +aa +aa +aa +af +af +DM +dc +dp +ae +aa +"} +(10,1,1) = {" +ab +ab +dd +ap +al +aa +aa +aa +aa +aa +bT +aa +af +ab +DM +dc +dq +ak +aa +"} +(11,1,1) = {" +ad +ai +mO +aq +ab +aa +aa +aa +aa +bA +aa +aa +af +aI +DM +dc +al +ak +aa +"} +(12,1,1) = {" +ab +ab +gA +ap +al +ab +aJ +aa +aa +aa +aa +ab +ab +cF +gA +al +al +aO +aa +"} +(13,1,1) = {" +ab +ab +am +ar +at +at +at +at +Wr +bB +bB +bB +tY +cG +gD +ai +dr +ae +aa +"} +(14,1,1) = {" +ab +ah +al +as +au +as +as +as +bg +al +al +cg +gA +al +al +al +al +ae +aa +"} +(15,1,1) = {" +ab +al +al +al +al +al +al +al +bh +bC +al +al +CR +al +al +al +ds +aO +aa +"} +(16,1,1) = {" +aO +aO +ae +ae +ae +aO +ae +aO +bi +ae +aO +ae +ae +aO +ae +aO +ae +aO +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aL +bb +bD +aO +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +oi +bj +ab +ae +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +af +aa +aa +ak +an +dj +ae +aP +bk +aP +ae +aB +aB +dj +aB +aB +aB +aa +aa +"} +(20,1,1) = {" +af +af +ab +aa +aa +af +aC +aQ +bl +bE +bS +cf +cr +cB +cI +ab +aB +aa +aa +"} +(21,1,1) = {" +af +ab +ab +af +af +ab +ab +ab +bj +ab +bU +ch +aB +cE +ab +cY +dj +aa +aa +"} +(22,1,1) = {" +aa +aa +af +ab +ab +ab +xh +ab +bj +ab +bV +ab +aP +cH +ab +de +dj +aa +aa +"} +(23,1,1) = {" +ab +aa +af +ab +ao +ab +ab +aR +bm +ab +bH +ci +aB +aB +aP +aB +aB +ab +aa +"} +(24,1,1) = {" +aa +af +ab +al +ab +ab +ab +aS +bn +ab +bH +ab +ab +cI +cR +aB +dj +ak +ak +"} +(25,1,1) = {" +aa +af +ab +ab +ab +ab +ab +aT +bo +ab +bW +cj +cj +cj +cS +dh +dg +du +ak +"} +(26,1,1) = {" +aa +af +af +an +an +ab +ab +ab +bp +bF +bX +bF +bF +cJ +cV +df +di +dv +dB +"} +(27,1,1) = {" +aa +aa +aa +aa +an +av +aH +av +bj +bG +bY +av +av +cK +cW +aB +dt +dA +dC +"} +(28,1,1) = {" +aa +aa +aa +aa +an +an +dj +ae +bj +bH +ae +aB +cu +cu +aB +dj +ak +ak +dj +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bj +bI +ae +aa +aa +aa +aa +aa +aa +aa +ak +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bH +aO +aa +aa +aa +aa +aa +aa +aa +ak +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bJ +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +ae +ae +ae +ae +ae +br +bK +bZ +ck +cs +cL +aO +ae +ae +aO +aa +"} +(33,1,1) = {" +aa +aa +aa +ae +ax +aD +aM +aU +bs +bL +bZ +cl +ct +cM +cZ +dk +dw +ae +aa +"} +(34,1,1) = {" +aa +aa +aa +ae +ay +aE +aN +aV +bt +bM +ab +cm +co +cN +aN +dl +dx +ae +aa +"} +(35,1,1) = {" +aa +aa +aa +ae +ae +ae +aO +aW +bu +bN +ca +cn +cv +cO +ae +aO +aO +aO +aa +"} +(36,1,1) = {" +aa +aa +aa +ae +az +aF +aM +aX +bv +bN +cb +co +cw +cM +da +dm +dy +ae +aa +"} +(37,1,1) = {" +aa +aa +aa +ae +aA +aG +aN +aY +bw +bM +cc +cp +cx +cP +db +dn +dz +ae +aa +"} +(38,1,1) = {" +aa +aa +aa +ae +aO +aO +ae +aZ +bu +bO +cd +cd +cy +cQ +ae +aO +aO +aO +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +ba +bx +bP +ce +cq +cz +ab +ae +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aO +aO +ae +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm new file mode 100644 index 0000000000..93b221c446 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm @@ -0,0 +1,170 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted/uranium, +/area/icemoon/surface/outdoors) +"b" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"c" = ( +/turf/open/water/cursed_spring, +/area/icemoon/surface/outdoors) +"d" = ( +/obj/item/paper/crumpled{ + info = "When one falls into this hot spring, they shall forever be turned into..." + }, +/turf/open/floor/plating/beach/sand, +/area/icemoon/surface/outdoors) +"I" = ( +/turf/closed/indestructible/fakeglass, +/area/icemoon/surface/outdoors) +"L" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/floor/plating/beach/sand, +/area/icemoon/surface/outdoors) +"U" = ( +/turf/open/floor/plating/beach/sand, +/area/icemoon/surface/outdoors) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +a +a +I +a +a +b +b +b +"} +(3,1,1) = {" +b +b +a +U +U +U +U +U +a +b +b +"} +(4,1,1) = {" +b +a +U +L +c +c +c +U +U +a +b +"} +(5,1,1) = {" +b +a +U +c +c +c +c +c +U +a +b +"} +(6,1,1) = {" +b +I +U +c +c +c +c +c +U +I +b +"} +(7,1,1) = {" +b +a +U +c +c +c +c +c +U +a +b +"} +(8,1,1) = {" +b +a +U +L +c +c +c +U +U +a +b +"} +(9,1,1) = {" +b +b +a +U +U +d +U +U +a +b +b +"} +(10,1,1) = {" +b +b +b +a +a +I +a +a +b +b +b +"} +(11,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm new file mode 100644 index 0000000000..704ac63a7d --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm @@ -0,0 +1,166 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"b" = ( +/obj/structure/sign/poster/contraband/lusty_xenomorph, +/turf/closed/indestructible/abductor, +/area/icemoon/surface/outdoors) +"c" = ( +/turf/open/floor/mineral/diamond, +/area/icemoon/surface/outdoors) +"d" = ( +/obj/item/reagent_containers/food/drinks/trophy/gold_cup, +/turf/open/floor/mineral/diamond, +/area/icemoon/surface/outdoors) +"e" = ( +/obj/item/greentext{ + light_color = "#64C864"; + light_range = 1 + }, +/turf/open/floor/mineral/diamond, +/area/icemoon/surface/outdoors) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(4,1,1) = {" +a +a +a +b +c +c +c +b +a +a +a +"} +(5,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(6,1,1) = {" +a +a +b +c +d +e +d +c +b +a +a +"} +(7,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(8,1,1) = {" +a +a +a +b +c +c +c +b +a +a +a +"} +(9,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm new file mode 100644 index 0000000000..969acdd871 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm @@ -0,0 +1,886 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"b" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered) +"c" = ( +/obj/structure/closet/toolcloset, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/item/crowbar, +/obj/item/weldingtool/largetank, +/obj/item/wirecutters, +/obj/item/radio/off, +/turf/open/floor/wood, +/area/ruin/unpowered) +"d" = ( +/turf/open/openspace/icemoon, +/area/icemoon/surface/outdoors) +"e" = ( +/obj/item/clothing/suit/hooded/explorer, +/obj/item/clothing/mask/gas/explorer, +/obj/item/clothing/gloves/color/black, +/obj/item/storage/backpack/explorer, +/obj/item/flashlight/lantern, +/obj/item/storage/bag/ore, +/obj/structure/closet, +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/wood, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"g" = ( +/obj/structure/fireplace, +/turf/open/floor/wood, +/area/ruin/unpowered) +"h" = ( +/obj/structure/flora/rock/icy, +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"i" = ( +/turf/template_noop, +/area/template_noop) +"j" = ( +/obj/structure/sink/kitchen, +/turf/open/floor/wood, +/area/ruin/unpowered) +"k" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood, +/area/ruin/unpowered) +"m" = ( +/obj/structure/barricade/wooden/crude/snow, +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"n" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered) +"o" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/light/broken{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table/wood, +/obj/item/pen, +/obj/machinery/light/broken{ + dir = 8 + }, +/obj/item/paper/crumpled/bloody{ + info = "help..."; + text = "" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"r" = ( +/obj/item/chair/wood, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/mob_spawn/human/miner/explorer, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/wood, +/area/ruin/unpowered) +"s" = ( +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/wood, +/area/ruin/unpowered) +"u" = ( +/obj/structure/ladder, +/turf/open/floor/wood, +/area/ruin/unpowered) + +(1,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(2,1,1) = {" +i +i +i +i +i +i +i +i +d +d +d +d +d +d +d +d +i +i +i +i +i +i +i +i +i +"} +(3,1,1) = {" +i +i +i +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +i +i +i +"} +(4,1,1) = {" +i +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +i +i +"} +(5,1,1) = {" +i +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +i +"} +(6,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +"} +(7,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +"} +(8,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +i +i +i +"} +(9,1,1) = {" +i +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +d +d +d +d +d +d +d +i +i +"} +(10,1,1) = {" +i +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +i +i +"} +(11,1,1) = {" +i +d +d +d +d +d +d +d +b +b +c +f +f +o +q +b +b +d +d +d +d +d +d +d +i +"} +(12,1,1) = {" +i +d +d +d +d +d +d +d +b +b +e +f +f +f +r +b +b +d +d +d +d +d +d +d +i +"} +(13,1,1) = {" +i +d +d +d +d +d +d +d +b +b +f +f +f +f +s +b +b +d +d +d +d +d +d +d +i +"} +(14,1,1) = {" +i +d +d +d +d +d +d +d +b +b +g +f +f +f +s +b +b +d +d +d +d +d +d +d +i +"} +(15,1,1) = {" +i +d +d +d +d +d +d +d +b +b +f +f +f +f +s +b +b +d +d +d +d +d +d +d +i +"} +(16,1,1) = {" +i +d +d +d +d +d +d +d +b +b +j +f +f +f +s +b +b +d +d +d +d +d +d +d +i +"} +(17,1,1) = {" +i +d +d +d +d +d +d +d +b +b +k +f +f +f +s +b +b +d +d +d +d +d +d +d +i +"} +(18,1,1) = {" +i +d +d +d +d +d +d +d +b +b +l +f +f +f +u +b +b +d +d +d +d +d +d +d +i +"} +(19,1,1) = {" +i +d +d +d +d +d +d +d +b +b +b +f +f +p +b +b +b +d +d +d +d +d +d +d +i +"} +(20,1,1) = {" +i +i +d +d +d +d +d +d +d +b +b +b +f +b +b +b +d +d +d +d +d +d +d +d +i +"} +(21,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +b +f +b +d +d +d +d +d +d +d +d +d +d +i +"} +(22,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +b +f +b +d +d +d +d +d +d +d +d +d +d +i +"} +(23,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +b +f +b +d +d +d +d +d +d +d +d +d +i +i +"} +(24,1,1) = {" +i +i +d +d +d +d +d +d +d +d +d +b +m +b +d +d +d +d +d +d +d +d +d +i +i +"} +(25,1,1) = {" +i +i +i +d +d +d +d +d +d +d +a +h +n +h +a +d +d +d +d +d +d +d +i +i +i +"} +(26,1,1) = {" +i +i +i +d +d +d +d +d +d +a +a +a +h +a +a +a +d +d +d +d +d +d +i +i +i +"} +(27,1,1) = {" +i +i +i +i +d +d +d +d +a +a +a +a +a +a +a +a +a +d +d +d +d +i +i +i +i +"} +(28,1,1) = {" +i +i +i +i +i +d +d +a +a +a +a +a +a +a +a +a +a +a +d +d +i +i +i +i +i +"} +(29,1,1) = {" +i +i +i +i +i +i +i +a +a +a +a +a +a +a +a +a +a +a +i +i +i +i +i +i +i +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm new file mode 100644 index 0000000000..35eb1901f6 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -0,0 +1,1415 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"ab" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"ac" = ( +/obj/structure/fence/door/opened{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) +"ay" = ( +/turf/open/floor/carpet, +/area/ruin/powered) +"aM" = ( +/turf/open/floor/wood, +/area/ruin/powered) +"aP" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/powered) +"aZ" = ( +/obj/structure/sign/poster/ripped, +/turf/closed/wall/rust, +/area/icemoon/underground/explored) +"bR" = ( +/obj/machinery/light/small/broken{ + dir = 4 + }, +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"bY" = ( +/obj/structure/flora/stump, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"cj" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/fishandchips, +/turf/open/floor/plasteel/checker, +/area/ruin/powered) +"cB" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/wood, +/area/ruin/powered) +"dh" = ( +/obj/machinery/door/airlock/wood, +/obj/structure/barricade/wooden/crude/snow, +/turf/open/floor/wood, +/area/ruin/powered) +"fD" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/wood, +/area/ruin/powered) +"gG" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/sashimi{ + pixel_y = 10 + }, +/obj/item/reagent_containers/food/drinks/mug/coco{ + pixel_x = -10 + }, +/obj/item/reagent_containers/food/drinks/mug/coco{ + pixel_x = 10; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet, +/area/ruin/powered) +"hD" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"hI" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"iB" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/icemoon/underground/explored) +"jk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/powered) +"jP" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"kl" = ( +/obj/structure/sign/poster/official/nanotrasen_logo, +/turf/closed/wall, +/area/icemoon/underground/explored) +"ks" = ( +/obj/structure/flora/rock/icy, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"la" = ( +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/mob_spawn/human/corpse/assistant, +/mob/living/simple_animal/hostile/skeleton/eskimo{ + name = "Village Hunter" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"lg" = ( +/obj/structure/flora/grass/both, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"li" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/wood, +/area/ruin/powered) +"lo" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"mi" = ( +/obj/effect/decal/remains/human, +/mob/living/simple_animal/hostile/construct/armored/hostile{ + health = 450; + maxHealth = 450; + name = "Right Hand of the Elder" + }, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"mI" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/grass/both, +/obj/structure/fence{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"oB" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/misc/pj/blue, +/obj/item/clothing/shoes/sneakers/white, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, +/area/ruin/powered) +"oF" = ( +/obj/structure/flora/rock/icy, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"pc" = ( +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"pj" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"pH" = ( +/obj/structure/sign/poster/official/work_for_a_future, +/turf/closed/wall/mineral/wood, +/area/ruin/powered) +"pI" = ( +/obj/structure/flora/rock/pile/icy, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"pP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered) +"pV" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/ruin/powered) +"rC" = ( +/obj/structure/closet/secure_closet/freezer, +/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/condiment/pack/ketchup, +/obj/item/reagent_containers/food/condiment/pack/ketchup, +/obj/item/reagent_containers/food/condiment/pack/ketchup, +/turf/open/floor/plasteel/checker, +/area/ruin/powered) +"sG" = ( +/obj/effect/decal/cleanable/vomit, +/obj/structure/toilet{ + dir = 1 + }, +/mob/living/simple_animal/hostile/skeleton/eskimo{ + name = "Village Hunter" + }, +/turf/open/floor/plating, +/area/ruin/powered) +"sY" = ( +/obj/structure/sink/kitchen{ + dir = 4; + pixel_x = -12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/checker, +/area/ruin/powered) +"tg" = ( +/obj/structure/fence{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"tt" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/skeleton/eskimo{ + name = "Village Hunter" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"tF" = ( +/obj/structure/fence, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"tM" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"tN" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"tX" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, +/area/ruin/powered) +"us" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"ut" = ( +/obj/item/flashlight/lantern{ + on = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/powered) +"vi" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/fence/door, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"wQ" = ( +/turf/closed/wall, +/area/ruin/powered) +"xc" = ( +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"xN" = ( +/obj/structure/bed/dogbed{ + pixel_y = 14 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet, +/area/ruin/powered) +"yb" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered) +"yS" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"zR" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/powered) +"AG" = ( +/obj/structure/showcase/machinery/tv, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken{ + dir = 1 + }, +/turf/open/floor/holofloor/wood, +/area/ruin/powered) +"AM" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/item/pickaxe, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"AN" = ( +/obj/structure/closet/cabinet, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/reagent_containers/glass/bottle/venom, +/obj/item/reagent_containers/glass/bottle/curare, +/obj/item/kitchen/knife/combat/survival, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/snacks/meat/slab/human, +/obj/item/reagent_containers/food/snacks/meat/slab/human, +/obj/item/reagent_containers/food/snacks/meat/slab/human, +/turf/open/floor/wood, +/area/ruin/powered) +"Bq" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Cd" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/ruin/powered) +"Cl" = ( +/obj/structure/sacrificealtar, +/obj/effect/decal/cleanable/blood/old, +/obj/item/kitchen/knife/bloodletter, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"Dm" = ( +/obj/structure/flora/grass/brown, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"DI" = ( +/obj/structure/closet/emcloset, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath/medical, +/obj/item/clothing/mask/breath/medical, +/obj/item/flashlight/lantern, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"DM" = ( +/obj/structure/flora/bush, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Ed" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/wood, +/area/ruin/powered) +"Ei" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/icemoon/underground/explored) +"EF" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/remains/human, +/mob/living/simple_animal/hostile/construct/armored/hostile{ + health = 450; + maxHealth = 450; + name = "Left Hand of the Elder" + }, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"Gr" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/chips, +/obj/item/trash/semki{ + pixel_x = 8; + pixel_y = -4 + }, +/obj/item/clothing/neck/petcollar, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"Gy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/wood, +/turf/open/floor/plating, +/area/ruin/powered) +"GK" = ( +/obj/item/clothing/head/bearpelt, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/burger/fish, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -4 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 10; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/ruin/powered) +"Ha" = ( +/obj/structure/mirror{ + broken = 1 + }, +/turf/closed/wall/mineral/wood, +/area/ruin/powered) +"Hf" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/wood, +/area/ruin/powered) +"Hx" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/rank/cargo/miner, +/obj/item/clothing/suit/hooded/wintercoat/miner, +/obj/item/clothing/shoes/winterboots, +/obj/item/card/id/mining, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/powered) +"IA" = ( +/obj/structure/fireplace{ + fuel_added = 1000; + lit = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet, +/area/ruin/powered) +"IT" = ( +/mob/living/simple_animal/hostile/skeleton/eskimo{ + name = "Village Hunter" + }, +/turf/open/floor/wood, +/area/ruin/powered) +"Kd" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"LZ" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/turf/open/floor/wood, +/area/ruin/powered) +"Nq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"Og" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Os" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/ruin/powered) +"Pp" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/holofloor/wood, +/area/ruin/powered) +"PQ" = ( +/obj/effect/decal/cleanable/blood/splatter, +/mob/living/simple_animal/hostile/illusion{ + deathmessage = "disperses into the air in a cloud of red mist, you feel slightly more at ease."; + desc = "You can't quite make out what you're seeing."; + faction = list("cult"); + health = 500; + maxHealth = 500; + melee_damage_lower = 10; + melee_damage_upper = 30; + name = "Village Elder" + }, +/turf/open/floor/engine/cult, +/area/ruin/powered) +"Qh" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/obj/item/bodypart/head, +/obj/item/bodypart/l_arm{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/item/bodypart/l_leg, +/obj/item/bodypart/r_arm, +/obj/item/bodypart/r_leg{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/bodypart/chest, +/obj/item/organ/heart, +/obj/item/multitool, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"Qt" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/item/restraints/legcuffs/beartrap{ + armed = 1 + }, +/obj/structure/flora/grass/both, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"QR" = ( +/turf/closed/wall/rust, +/area/ruin/powered) +"Rv" = ( +/obj/structure/flora/grass/both, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Si" = ( +/obj/structure/mirror, +/turf/closed/wall/mineral/wood, +/area/ruin/powered) +"Sk" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"SN" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/powered) +"SZ" = ( +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood, +/area/ruin/powered) +"Tc" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"TW" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/grass/both, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"UI" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/blood, +/obj/item/reagent_containers/food/snacks/meat/slab/corgi, +/turf/open/floor/wood, +/area/ruin/powered) +"Vn" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/powered) +"Ws" = ( +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"WH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed, +/obj/item/bedsheet/cult, +/turf/open/floor/wood, +/area/ruin/powered) +"Ze" = ( +/turf/closed/wall, +/area/icemoon/underground/explored) +"Zx" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"ZG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/under/suit/tan, +/turf/open/floor/wood, +/area/ruin/powered) + +(1,1,1) = {" +tN +tN +tN +tN +tN +tN +Og +Og +Og +Og +Og +Og +oF +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +"} +(2,1,1) = {" +tN +tN +tN +tN +pc +Og +Og +bR +Og +Og +Og +jP +Og +Og +Og +Rv +Og +Og +Og +Og +Og +Og +Og +tN +tN +tN +tN +tN +"} +(3,1,1) = {" +tN +tN +tN +xc +pc +Og +Og +aZ +pI +iB +Og +kl +Og +Og +Og +Og +Og +Og +pI +Og +Og +Og +Og +Og +bY +tN +tN +tN +"} +(4,1,1) = {" +tN +tN +tN +pc +Og +Og +Ei +Ze +iB +ks +Ei +Ze +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Tc +pc +pc +Og +Og +pc +tN +tN +"} +(5,1,1) = {" +tN +tN +Og +Og +Og +Rv +Ei +Ei +Ei +aa +pI +Ei +Ei +Vn +Vn +Vn +Ei +Ei +Ei +Ei +Ei +Ei +Ei +pc +Og +Og +Og +Og +"} +(6,1,1) = {" +tN +pI +Og +Og +bY +Ei +Ei +Ei +pI +ab +ab +ab +Ei +Vn +UI +Vn +Vn +wQ +wQ +QR +QR +wQ +Ei +Ei +Og +Rv +Og +Og +"} +(7,1,1) = {" +tN +Og +oF +Og +Ei +Ei +Vn +Vn +Vn +Vn +Og +ab +Bq +pH +jk +tX +Vn +QR +DI +SN +Qh +wQ +Ei +Ei +oF +Og +Og +tN +"} +(8,1,1) = {" +Og +Og +Og +Og +Ei +Ei +Vn +cj +sY +Vn +Og +ab +Vn +Vn +jk +oB +Vn +wQ +DI +tt +Gr +QR +lg +Ei +Ei +Og +Og +tN +"} +(9,1,1) = {" +Og +Og +Og +Ei +Ei +la +Vn +rC +ut +Vn +tF +ac +Vn +AG +IT +yb +Vn +wQ +Nq +SN +QR +QR +Og +Ei +Ei +Og +Og +tN +"} +(10,1,1) = {" +tN +Og +Kd +Ei +Ei +lo +Ha +li +Hf +SZ +ab +ab +Vn +Pp +aM +pP +Vn +wQ +QR +pV +wQ +Og +Tc +Ei +Ei +Og +Og +tN +"} +(11,1,1) = {" +tN +Og +pc +Ei +Ei +lo +Vn +Hx +fD +Vn +yS +ab +Vn +Vn +SZ +Vn +Vn +Og +Og +ab +tg +Bq +Og +Ei +Ei +Og +Og +Og +"} +(12,1,1) = {" +tN +Og +pc +Ei +Ei +lo +Vn +Vn +Vn +Vn +Og +ab +Og +Bq +ab +Tc +DM +ab +ab +ab +Ws +Og +Og +Ei +Ei +Ei +Og +Og +"} +(13,1,1) = {" +tN +Og +pc +Ei +Ei +us +Sk +Qt +vi +Og +yS +ab +ab +ab +ab +Og +Og +ab +Og +Vn +Vn +Vn +Vn +Ei +Ei +Ei +pI +Og +"} +(14,1,1) = {" +tN +Og +Ei +Ei +Ei +Ei +Bq +pj +mI +Og +Og +Og +Og +Og +ab +Og +Og +ab +Og +Vn +LZ +AN +Vn +Ei +Ei +Ei +Og +Og +"} +(15,1,1) = {" +tN +Og +Ei +Vn +Vn +Vn +Vn +Vn +Vn +Vn +Vn +Og +ab +ab +ab +ab +ab +ab +ab +zR +cB +GK +Vn +Ei +Ei +bY +Og +pc +"} +(16,1,1) = {" +tN +Og +Ei +Vn +EF +hD +Si +aP +WH +ZG +Vn +Og +ab +Tc +Og +Og +Og +Og +Og +Vn +Vn +Vn +Vn +Ei +Ei +Og +Og +tN +"} +(17,1,1) = {" +tN +Og +Ei +Vn +Cl +PQ +Ed +jk +aM +aM +Vn +Og +ab +Og +Og +Og +Bq +Og +Og +Og +Gy +sG +Vn +Ei +Ei +Og +Og +tN +"} +(18,1,1) = {" +tN +Og +Ei +Vn +mi +AM +Vn +ay +Os +jk +dh +ab +ab +Og +Og +Og +Og +TW +Og +Og +Vn +Vn +Vn +Ei +Ei +Og +Og +tN +"} +(19,1,1) = {" +tN +Og +Ei +Vn +Vn +Vn +Vn +IA +gG +aM +Vn +Og +Og +Og +pc +Dm +Og +Og +tM +Og +Og +Og +Bq +Ei +Ei +Og +Dm +tN +"} +(20,1,1) = {" +tN +Og +Ei +Ei +Ei +Ei +Vn +xN +Cd +jk +Vn +TW +Og +pc +xc +pc +pc +Og +Og +Og +Og +Og +Og +Ei +Ei +Og +Og +tN +"} +(21,1,1) = {" +tN +Og +Og +pj +Ei +Ei +Vn +Vn +Vn +Vn +Vn +Og +Dm +pc +xc +xc +xc +pc +pj +Og +Og +DM +Ei +Ei +Ei +Og +Og +tN +"} +(22,1,1) = {" +tN +bY +Og +Og +Ei +Ei +Ei +Ei +Bq +Og +Og +Og +pc +xc +hI +Zx +xc +xc +pc +pc +Og +Ei +Ei +Ei +bY +Og +Og +tN +"} +(23,1,1) = {" +tN +tN +pI +Og +Og +Ei +Ei +Ei +Ei +DM +Tc +pc +pc +xc +xc +xc +xc +xc +xc +Ei +Ei +Ei +Ei +Og +Og +Og +Og +tN +"} +(24,1,1) = {" +tN +tN +tN +pc +Og +Og +Og +Ei +Ei +Ei +Ei +Ei +Ei +xc +xc +xc +xc +xc +Ei +Ei +Ei +Ei +pI +oF +Og +Og +Og +tN +"} +(25,1,1) = {" +tN +tN +tN +xc +pc +pc +Og +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Og +Og +Og +Og +Og +Og +tN +"} +(26,1,1) = {" +tN +tN +tN +xc +pc +oF +Og +pI +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +pc +Og +Og +Og +pc +tN +Og +Og +tN +"} +(27,1,1) = {" +tN +tN +tN +tN +tN +tN +Og +Og +Og +Og +Og +Og +Og +pI +oF +Og +Og +Og +Og +Og +bY +Tc +pc +tN +tN +pI +Og +tN +"} +(28,1,1) = {" +tN +tN +tN +tN +tN +tN +Og +Og +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +tN +Og +Og +tN +tN +tN +tN +Og +Og +tN +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm new file mode 100644 index 0000000000..3672599cff --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm @@ -0,0 +1,178 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/ice, +/area/ruin/powered/bathhouse) +"c" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/structure/curtain, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"d" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"e" = ( +/obj/structure/mirror{ + pixel_y = 28 + }, +/obj/structure/sink{ + pixel_y = 20 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"f" = ( +/obj/structure/table/greyscale, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"g" = ( +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"h" = ( +/obj/item/soap, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"i" = ( +/obj/machinery/door/airlock/freezer{ + name = "bath house airlock" + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"j" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/powered/bathhouse) +"k" = ( +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"l" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"m" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"n" = ( +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"o" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) + +(1,1,1) = {" +b +b +b +b +b +d +a +a +"} +(2,1,1) = {" +b +c +g +g +b +j +j +j +"} +(3,1,1) = {" +b +b +g +g +i +k +k +j +"} +(4,1,1) = {" +b +c +g +g +b +l +k +j +"} +(5,1,1) = {" +b +b +g +g +b +m +o +j +"} +(6,1,1) = {" +b +c +g +g +b +j +j +j +"} +(7,1,1) = {" +b +b +g +h +b +n +n +d +"} +(8,1,1) = {" +b +e +g +g +b +n +n +d +"} +(9,1,1) = {" +b +e +g +g +i +n +n +d +"} +(10,1,1) = {" +b +f +g +g +b +n +d +a +"} +(11,1,1) = {" +b +b +b +b +b +d +a +a +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm new file mode 100644 index 0000000000..a7a97dfec9 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm @@ -0,0 +1,1707 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random/volcanic/more_caves, +/area/icemoon/surface/outdoors/unexplored) +"b" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"y" = ( +/mob/living/simple_animal/hostile/megafauna/dragon{ + desc = "Hunted to extinction, the icey moon of lavaland is the final resting place for these creatures."; + name = "the last ash drake" + }, +/turf/open/floor/mineral/gold, +/area/icemoon/underground/explored) +"B" = ( +/turf/closed/mineral/random/no_caves, +/area/icemoon/surface/outdoors/unexplored) +"P" = ( +/turf/open/floor/mineral/silver, +/area/icemoon/underground/explored) +"R" = ( +/turf/open/floor/mineral/gold, +/area/icemoon/underground/explored) +"T" = ( +/turf/closed/mineral/random/no_caves, +/area/icemoon/underground/explored) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(3,1,1) = {" +b +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +b +"} +(4,1,1) = {" +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +"} +(5,1,1) = {" +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +"} +(6,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(7,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(8,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(9,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(10,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(11,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(12,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(13,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(14,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(15,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(16,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(17,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(18,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +T +T +T +T +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(19,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +R +P +P +R +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(20,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +P +R +R +P +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(21,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +P +R +y +P +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(22,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +R +P +P +R +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(23,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +T +T +T +T +T +T +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(24,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(25,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(26,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(27,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(28,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(29,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(30,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(31,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(32,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(33,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(34,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(35,1,1) = {" +b +b +B +B +B +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +B +B +B +B +b +b +"} +(36,1,1) = {" +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +"} +(37,1,1) = {" +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +"} +(38,1,1) = {" +b +b +b +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +B +b +b +b +"} +(39,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(40,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm new file mode 100644 index 0000000000..479610b0b7 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -0,0 +1,806 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/documents/syndicate/mining, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ac" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/unpowered/buried_library) +"ad" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"ae" = ( +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"af" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ag" = ( +/obj/item/feather, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ah" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ai" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ak" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"al" = ( +/turf/closed/wall/mineral/iron, +/area/ruin/unpowered/buried_library) +"am" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/book_of_babel, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ao" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ap" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aq" = ( +/obj/structure/fluff/paper{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ar" = ( +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"as" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/oldstation/protosing, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"at" = ( +/obj/structure/fluff/paper, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"av" = ( +/obj/structure/bookcase/random, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"aw" = ( +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"ax" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"ay" = ( +/obj/machinery/door/keycard/library, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"az" = ( +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aC" = ( +/obj/item/feather, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"aD" = ( +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aE" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aF" = ( +/obj/item/book/manual/random, +/obj/effect/decal/cleanable/dirt, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"aG" = ( +/obj/structure/table/bronze, +/obj/item/stack/ore/slag, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aH" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aI" = ( +/obj/effect/mob_spawn/human/skeleton, +/obj/item/clothing/head/rice_hat, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aK" = ( +/obj/item/feather, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aM" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"aN" = ( +/obj/structure/statue/sandstone/venus, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aO" = ( +/mob/living/simple_animal/pet/fox, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aP" = ( +/obj/item/keycard/library, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aR" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aS" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/secretrecipe, +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aV" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aW" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aX" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aY" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aZ" = ( +/obj/structure/fluff/paper/stack, +/obj/structure/fluff/paper, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ba" = ( +/obj/structure/barricade/wooden/snowed, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bc" = ( +/obj/item/feather, +/obj/structure/fluff/paper, +/obj/structure/fluff/paper{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"be" = ( +/obj/structure/fluff/paper{ + dir = 5 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bg" = ( +/obj/item/paper/fluff/ruins/oldstation/protogun, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bh" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/pet/fox, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bi" = ( +/obj/structure/fluff/paper, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bj" = ( +/obj/item/book/manual/random, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bk" = ( +/obj/structure/fluff/paper{ + dir = 10 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bl" = ( +/obj/item/storage/box/fountainpens, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bm" = ( +/obj/structure/fluff/paper/stack, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bn" = ( +/obj/item/book/manual/random, +/obj/item/stack/sheet/mineral/wood, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bo" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bq" = ( +/obj/structure/mineral_door/wood, +/obj/structure/barricade/wooden/crude/snow, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"br" = ( +/obj/structure/girder, +/turf/closed/mineral/random/snow/no_caves, +/area/ruin/unpowered/buried_library) +"bt" = ( +/obj/effect/decal/cleanable/dirt, +/turf/template_noop, +/area/template_noop) +"bu" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"bw" = ( +/turf/open/floor/wood, +/area/icemoon/underground/explored) +"by" = ( +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"bz" = ( +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bA" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bB" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"bC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 1 + }, +/mob/living/simple_animal/pet/fox, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +ad +bt +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ak +ak +ak +ak +ak +ac +ba +ac +ac +ac +ad +ad +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ak +ak +ak +ak +bo +ak +ak +ak +bm +ae +af +bk +ac +ad +ad +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +ak +ak +aR +ak +ak +ae +bj +av +ak +ah +aL +ah +aT +ac +ad +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +ak +ak +ak +aC +ae +aQ +ah +ak +av +bg +ah +aT +ah +ak +ac +ad +ad +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ad +ac +ak +ae +ak +aM +aO +ah +bm +ah +aA +ah +ao +ah +aq +ac +ad +ad +ad +"} +(7,1,1) = {" +aa +aa +aa +aa +ad +ac +ak +bm +ak +ao +aR +ao +aA +ao +ae +ah +aZ +ah +bC +ac +ad +ad +ad +"} +(8,1,1) = {" +aa +aa +aa +aa +ad +ak +ak +av +aA +ak +aG +aD +aX +ak +ao +ae +ao +ah +ae +ac +br +ad +ad +"} +(9,1,1) = {" +aa +aa +aa +aa +ad +ac +as +av +aF +aD +aD +bz +aD +bB +ak +ae +ao +ae +ao +ac +ax +bw +ad +"} +(10,1,1) = {" +aa +aa +aa +ad +ad +ac +ap +ax +ak +aD +aD +aN +ak +aw +ak +ao +af +aR +ae +bq +ae +bu +ad +"} +(11,1,1) = {" +aa +al +al +al +al +al +ae +ah +aR +aD +ak +aD +aD +by +ao +aw +ao +ae +bm +ac +ae +ad +ad +"} +(12,1,1) = {" +ad +al +ab +aI +ar +al +aR +aE +af +aD +aH +bA +aY +aD +ak +ae +bm +ah +ag +br +ac +ad +ad +"} +(13,1,1) = {" +ad +al +am +aJ +aW +ay +ae +ah +ao +ae +ao +ae +af +ax +bi +ah +ak +ah +bp +ac +ad +ad +ad +"} +(14,1,1) = {" +ad +al +aS +aW +aK +al +at +ah +ak +ah +bh +ah +az +ah +ak +ah +ak +bn +aT +ac +ad +aa +aa +"} +(15,1,1) = {" +ad +al +al +ai +ar +al +bc +ah +aL +ah +aA +ah +ao +ah +ak +ak +bl +ak +ak +ak +ad +aa +aa +"} +(16,1,1) = {" +ad +ad +al +al +al +al +bd +ah +ao +ah +ao +aV +ak +ah +ax +ak +bm +bo +ak +br +bu +aa +aa +"} +(17,1,1) = {" +aa +ad +ad +ad +ad +ac +be +bf +ae +aP +ae +aR +ae +ax +ak +bj +ak +ad +ad +ad +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ad +ac +ac +ac +ac +ac +ac +ba +ac +ac +br +ad +aa +ad +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +aa +ad +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm new file mode 100644 index 0000000000..feaa46336e --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm @@ -0,0 +1,818 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"c" = ( +/obj/structure/ladder, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"d" = ( +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/item/flashlight/lantern{ + on = 1 + }, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"g" = ( +/obj/item/clothing/suit/hooded/explorer, +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"h" = ( +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"i" = ( +/obj/item/kitchen/knife/combat/survival, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) +"T" = ( +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, +/turf/open/floor/plating/ice/icemoon, +/area/icemoon/underground/explored) + +(1,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(2,1,1) = {" +d +d +d +d +d +d +d +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +d +d +"} +(3,1,1) = {" +d +d +d +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +d +"} +(4,1,1) = {" +d +d +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +"} +(5,1,1) = {" +d +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +"} +(6,1,1) = {" +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +"} +(7,1,1) = {" +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +"} +(8,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +"} +(9,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(10,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(11,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(12,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(13,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(14,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +T +a +a +a +a +a +a +a +a +a +a +a +d +"} +(15,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(16,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(17,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(18,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +c +a +a +a +a +a +a +a +a +a +d +"} +(19,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(20,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(21,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(22,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +"} +(23,1,1) = {" +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +"} +(24,1,1) = {" +d +d +a +a +a +a +f +i +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +"} +(25,1,1) = {" +d +d +d +a +a +a +a +g +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +"} +(26,1,1) = {" +d +d +d +d +a +a +a +h +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +"} +(27,1,1) = {" +d +d +d +d +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +d +"} +(28,1,1) = {" +d +d +d +d +d +d +d +a +a +a +a +a +a +a +a +a +a +a +d +d +d +d +d +d +d +"} +(29,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm new file mode 100644 index 0000000000..79a4625aed --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm @@ -0,0 +1,47 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/icemoon/underground/explored) +"b" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"c" = ( +/obj/effect/sliding_puzzle/lavaland, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) + +(1,1,1) = {" +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +a +"} +(3,1,1) = {" +a +b +c +b +a +"} +(4,1,1) = {" +a +b +b +b +a +"} +(5,1,1) = {" +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm new file mode 100644 index 0000000000..a383c2e8c4 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -0,0 +1,1201 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/rock/snow/ice/ore, +/area/icemoon/underground/explored) +"b" = ( +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"d" = ( +/turf/template_noop, +/area/template_noop) +"j" = ( +/obj/effect/mob_spawn/human/miner/explorer, +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"q" = ( +/mob/living/simple_animal/hostile/megafauna/wendigo, +/turf/open/indestructible/necropolis/ice, +/area/icemoon/underground/explored) +"z" = ( +/obj/effect/landmark/portal_exit{ + id = "wendigo arena" + }, +/turf/open/indestructible/necropolis/ice, +/area/icemoon/underground/explored) +"K" = ( +/obj/effect/landmark/portal_exit{ + id = "wendigo arena exit" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"N" = ( +/turf/open/indestructible/necropolis/ice, +/area/icemoon/underground/explored) +"U" = ( +/obj/item/paper/crumpled/bloody{ + info = "for your own sake, do not enter" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) +"V" = ( +/obj/effect/portal/permanent/one_way{ + id = "wendigo arena" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon, +/area/icemoon/underground/explored) + +(1,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(2,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(3,1,1) = {" +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +"} +(4,1,1) = {" +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +"} +(5,1,1) = {" +d +d +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +d +d +"} +(6,1,1) = {" +d +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +d +"} +(7,1,1) = {" +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +"} +(8,1,1) = {" +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +"} +(9,1,1) = {" +d +d +b +b +b +a +a +a +a +a +a +N +N +N +N +N +N +N +N +N +a +a +a +a +a +a +b +b +b +d +d +"} +(10,1,1) = {" +d +d +b +b +a +a +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +a +a +b +b +d +d +"} +(11,1,1) = {" +d +d +b +b +a +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +a +b +b +d +d +"} +(12,1,1) = {" +d +d +b +b +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +b +b +d +d +"} +(13,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(14,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(15,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(16,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(17,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +j +b +d +d +"} +(18,1,1) = {" +d +d +b +K +a +a +a +N +N +N +N +N +N +N +N +q +N +N +N +N +N +N +N +z +a +a +a +V +U +d +d +"} +(19,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(20,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(21,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(22,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(23,1,1) = {" +d +d +b +b +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +b +b +d +d +"} +(24,1,1) = {" +d +d +b +b +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +b +b +d +d +"} +(25,1,1) = {" +d +d +b +b +a +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +a +b +b +d +d +"} +(26,1,1) = {" +d +d +b +b +a +a +a +a +a +a +N +N +N +N +N +N +N +N +N +N +N +a +a +a +a +a +a +b +b +d +d +"} +(27,1,1) = {" +d +d +b +b +b +a +a +a +a +a +a +N +N +N +N +N +N +N +N +N +a +a +a +a +a +a +b +b +b +d +d +"} +(28,1,1) = {" +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +"} +(29,1,1) = {" +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +"} +(30,1,1) = {" +d +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +d +"} +(31,1,1) = {" +d +d +d +d +d +d +b +b +b +a +a +a +a +a +a +a +a +a +a +a +a +a +b +b +b +d +d +d +d +d +d +"} +(32,1,1) = {" +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +"} +(33,1,1) = {" +d +d +d +d +d +d +d +d +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +d +d +d +d +d +d +d +d +"} +(34,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} +(35,1,1) = {" +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +d +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm new file mode 100644 index 0000000000..e233afbfb2 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm @@ -0,0 +1,267 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"b" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/underground/explored) +"e" = ( +/obj/structure/spawner/nether, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(3,1,1) = {" +b +b +b +b +b +a +a +a +a +a +b +b +b +b +b +"} +(4,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +"} +(5,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +"} +(6,1,1) = {" +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(7,1,1) = {" +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(8,1,1) = {" +b +b +a +a +a +a +a +e +a +a +a +a +a +b +b +"} +(9,1,1) = {" +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(10,1,1) = {" +b +b +a +a +a +a +a +a +a +a +a +a +a +b +b +"} +(11,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +"} +(12,1,1) = {" +b +b +b +a +a +a +a +a +a +a +a +a +b +b +b +"} +(13,1,1) = {" +b +b +b +b +b +a +a +a +a +a +b +b +b +b +b +"} +(14,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(15,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm index 1ea3f19c62..862c745f81 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm @@ -70,7 +70,7 @@ /obj/structure/alien/weeds, /obj/item/clothing/mask/facehugger/impregnated, /obj/item/clothing/glasses/night, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /obj/effect/decal/cleanable/blood/old, /obj/item/clothing/under/syndicate/tacticool, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index b4abf9b535..80ad86e3c5 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -476,7 +476,7 @@ }, /obj/item/storage/bag/plants/portaseeder, /obj/item/seeds/cotton, -/obj/item/seeds/cotton, +/obj/item/seeds/cotton/durathread, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bk" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index f48801c199..b71b6838b0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -3,9 +3,9 @@ /turf/template_noop, /area/template_noop) "ac" = ( -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/mesh, /obj/structure/table, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/plating, /area/ruin/powered/snow_biodome) "ad" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm new file mode 100644 index 0000000000..f590af752b --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -0,0 +1,1721 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface) +"ac" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/ruin/unpowered/elephant_graveyard) +"ad" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/closet/crate/grave/lead_researcher, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ae" = ( +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"af" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ag" = ( +/obj/effect/decal/cleanable/vomit, +/obj/item/shovel, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ah" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ai" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aj" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/item/paper/fluff/ruins/elephant_graveyard/final_message, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ak" = ( +/turf/open/floor/plating/asteroid/basalt/wasteland{ + icon_state = "wasteland_dug" + }, +/area/ruin/unpowered/elephant_graveyard) +"al" = ( +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"am" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"an" = ( +/obj/item/reagent_containers/food/snacks/deadmouse, +/obj/item/assembly/mousetrap, +/turf/open/floor/plating/asteroid/basalt/wasteland{ + icon_state = "wasteland_dug" + }, +/area/ruin/unpowered/elephant_graveyard) +"ao" = ( +/obj/structure/statue/bone/skull/half, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ap" = ( +/obj/structure/statue/bone/skull/half{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aq" = ( +/obj/item/reagent_containers/glass/bottle/frostoil{ + desc = "A small bottle. Contains cold sauce. There's a label on here: APPLY ON SEVERE BURNS."; + volume = 10 + }, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ar" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"as" = ( +/obj/structure/flora/rock, +/obj/item/pickaxe{ + layer = 2.5; + pixel_x = -8; + pixel_y = 5 + }, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"at" = ( +/turf/closed/mineral/strong/wasteland, +/area/lavaland/surface) +"au" = ( +/obj/structure/table, +/obj/item/t_scanner/adv_mining_scanner/lesser, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"av" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/barricade/wooden, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aw" = ( +/obj/structure/table, +/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ax" = ( +/obj/structure/statue/bone/rib{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ay" = ( +/obj/structure/statue/bone/rib, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"az" = ( +/obj/structure/table, +/obj/item/pen, +/obj/item/pen, +/obj/item/pen, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aA" = ( +/turf/closed/wall, +/area/ruin/unpowered/elephant_graveyard) +"aB" = ( +/obj/item/chair, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aC" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aD" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/plasma{ + volume = 25 + }, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aF" = ( +/obj/structure/table, +/obj/machinery/power/floodlight, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aG" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/glowstick, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aH" = ( +/turf/closed/wall/mineral/titanium, +/area/ruin/powered/graveyard_shuttle) +"aI" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/graveyard_shuttle) +"aJ" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aK" = ( +/obj/item/cigbutt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aL" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/black, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aN" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/ruin/powered/graveyard_shuttle) +"aO" = ( +/obj/effect/decal/cleanable/glass, +/obj/machinery/computer, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"aP" = ( +/obj/structure/bed, +/obj/item/flashlight/lantern, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aQ" = ( +/obj/machinery/power/floodlight, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aR" = ( +/obj/structure/table, +/obj/item/taperecorder, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aS" = ( +/obj/structure/table, +/obj/item/tape/random, +/obj/item/tape/random, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aT" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candle, +/obj/item/trash/can, +/obj/item/trash/can, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cigbutt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aU" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aV" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aW" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/clothing/mask/gas/explorer/folded, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"aX" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"aY" = ( +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall, +/area/ruin/unpowered/elephant_graveyard) +"aZ" = ( +/obj/item/organ/brain, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ba" = ( +/obj/structure/headpike/bone, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bb" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bc" = ( +/obj/structure/sign/poster/ripped, +/turf/closed/wall, +/area/ruin/unpowered/elephant_graveyard) +"bd" = ( +/obj/item/organ/heart, +/obj/item/organ/eyes, +/obj/item/organ/ears, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"be" = ( +/obj/item/organ/lungs, +/obj/item/organ/liver, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bf" = ( +/turf/closed/mineral/strong/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bg" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/titanium, +/area/ruin/powered/graveyard_shuttle) +"bh" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/chair/office/light, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bi" = ( +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/circuit/off, +/area/ruin/powered/graveyard_shuttle) +"bj" = ( +/obj/structure/barricade/wooden, +/obj/structure/mineral_door/wood, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bk" = ( +/obj/item/kitchen/knife/combat/bone, +/obj/item/organ/tongue, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bl" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bm" = ( +/obj/structure/closet/wardrobe/curator, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bn" = ( +/obj/structure/sink/oil_well, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bo" = ( +/obj/item/stack/medical/gauze/improvised, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bp" = ( +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bq" = ( +/obj/machinery/iv_drip, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"br" = ( +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall/mineral/titanium, +/area/ruin/powered/graveyard_shuttle) +"bs" = ( +/obj/structure/fence/door, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bt" = ( +/obj/structure/table, +/turf/closed/mineral/strong/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bu" = ( +/obj/structure/bed, +/obj/item/trash/pistachios, +/obj/item/trash/chips, +/obj/item/bedsheet/brown, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bv" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/under/misc/overalls, +/obj/item/clothing/mask/bandana/green, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bw" = ( +/obj/structure/rack, +/obj/item/shovel, +/obj/item/wrench, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bx" = ( +/obj/item/reagent_containers/food/snacks/deadmouse, +/obj/item/assembly/mousetrap, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"by" = ( +/obj/structure/closet/emcloset, +/obj/item/light/bulb, +/obj/effect/turf_decal/box/white, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) +"bz" = ( +/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny, +/obj/item/cigbutt, +/obj/item/cigbutt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bA" = ( +/obj/machinery/suit_storage_unit/mining/eva, +/obj/effect/turf_decal/box/white, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) +"bB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bC" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bD" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/elephant_graveyard) +"bE" = ( +/obj/structure/shuttle/engine/heater, +/obj/structure/window{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) +"bF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/elephant_graveyard) +"bG" = ( +/obj/effect/decal/remains/human, +/obj/item/tank/internals/emergency_oxygen/empty, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bH" = ( +/obj/item/paper/fluff/ruins/elephant_graveyard, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"bI" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/graveyard_shuttle) +"bJ" = ( +/obj/structure/sign/warning/xeno_mining, +/turf/closed/wall, +/area/ruin/unpowered/elephant_graveyard) +"bK" = ( +/obj/structure/sign/warning/explosives, +/turf/closed/wall, +/area/ruin/unpowered/elephant_graveyard) +"bL" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bM" = ( +/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker, +/obj/structure/closet/crate/grave, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bN" = ( +/obj/structure/sign/warning/securearea, +/obj/structure/sign/warning/securearea, +/turf/closed/mineral/strong/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bO" = ( +/obj/item/paper/fluff/ruins/elephant_graveyard, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bP" = ( +/obj/structure/barricade/wooden/crude, +/obj/item/paper/fluff/ruins/elephant_graveyard, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/elephant_graveyard) +"bQ" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/cobweb, +/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bR" = ( +/obj/effect/decal/cleanable/generic, +/obj/item/cigbutt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bS" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/rnd/destructive_analyzer, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bT" = ( +/obj/structure/barricade/wooden, +/obj/item/paper/fluff/ruins/elephant_graveyard, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bU" = ( +/obj/item/light/bulb/broken, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/mineral/volcanic/lava_land_surface, +/area/ruin/unpowered/elephant_graveyard) +"bW" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/shuttle{ + name = "archaeology shuttle airlock" + }, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) +"bX" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/head/fedora/curator, +/obj/item/clothing/suit/curator, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"bY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cigbutt, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"bZ" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"ca" = ( +/obj/structure/table, +/obj/item/storage/firstaid/o2, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cb" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/mapping_helpers/network_builder/power_cable, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cc" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cd" = ( +/obj/item/trash/can, +/obj/structure/bedsheetbin/empty, +/obj/structure/table, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ce" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cf" = ( +/obj/structure/bed, +/obj/item/wirecutters, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cg" = ( +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ch" = ( +/obj/effect/decal/remains/human, +/obj/item/restraints/handcuffs/cable/zipties/used, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ci" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/open/floor/plating/asteroid/basalt/wasteland{ + icon_state = "wasteland_dug" + }, +/area/ruin/unpowered/elephant_graveyard) +"cj" = ( +/obj/structure/stone_tile/block/cracked, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ck" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cl" = ( +/obj/structure/closet/crate/grave, +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cm" = ( +/obj/structure/table/optable, +/obj/item/storage/backpack/explorer, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/item/restraints/handcuffs/cable/zipties/used, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"cn" = ( +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"co" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/stone_tile/cracked, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cq" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cr" = ( +/obj/structure/bonfire/prelit, +/obj/effect/decal/cleanable/ash, +/obj/item/organ/tail/lizard, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cs" = ( +/obj/structure/ore_box, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"ct" = ( +/obj/structure/stone_tile, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cu" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"cw" = ( +/obj/structure/closet/crate/grave, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"cx" = ( +/obj/item/light/bulb/broken, +/obj/effect/turf_decal/caution/stand_clear/white, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) +"cz" = ( +/obj/structure/stone_tile, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +at +ab +ab +ab +ac +ac +ac +ac +bf +ac +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +bf +bf +bf +bf +bf +ac +ac +ac +ac +bf +bf +bf +ac +ac +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +bf +bf +aT +bR +bf +bf +bf +ac +bf +bf +bf +bf +bf +bf +bf +ac +ac +ab +ab +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +bf +bf +bf +bz +aK +bY +ae +bf +bf +bf +cs +aE +bJ +bf +bf +bf +ac +ac +ac +ab +ab +ab +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ab +ab +bf +bf +bf +bf +aA +bc +aA +aY +ae +bv +ae +cl +ae +ae +aC +bs +bO +ae +ae +ac +ac +ac +ac +ab +ab +ab +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +ab +bf +bf +bf +aq +al +al +al +aQ +ae +ae +ak +ae +ae +ae +ae +bK +bf +bf +bf +ae +ac +ac +ac +ac +ac +ac +ab +ab +aa +aa +"} +(8,1,1) = {" +aa +aa +ab +ab +ab +bf +bf +al +al +ar +ae +ae +ae +ar +aZ +ae +ba +ae +ba +ae +ae +ae +ae +bf +ae +ac +ac +ac +ac +ac +ac +ac +ab +ab +aa +"} +(9,1,1) = {" +aa +ab +ab +bf +bf +bf +al +al +ak +ae +aE +ae +ae +ae +ba +ae +af +ae +ae +ae +ba +ae +ak +bf +ae +ae +ac +ac +ac +ac +ac +ac +ac +ac +aa +"} +(10,1,1) = {" +ab +ab +bf +bf +bf +al +am +ae +ae +ae +ae +cl +ae +ae +ae +co +bd +bk +ae +ae +ae +ae +aE +bf +bf +ae +ae +ac +ac +ac +ac +bG +bM +ac +ac +"} +(11,1,1) = {" +at +bf +bf +bf +bf +al +ae +ae +ao +ae +ax +ax +ax +ax +ae +ae +be +cr +ae +cz +ae +ae +bn +cw +bf +bf +bB +ac +ac +ac +ac +bL +ae +ae +ac +"} +(12,1,1) = {" +at +bf +bf +bf +bf +al +cl +ae +ae +ae +ae +ci +cj +ce +ae +cj +ae +cq +ae +ae +cu +ae +ae +ae +bf +bf +bC +ac +ac +ac +ac +ac +ac +bD +ac +"} +(13,1,1) = {" +bf +ad +ae +bf +cl +al +ae +ae +ae +ae +cg +ae +ak +ak +cn +ae +cq +ae +ct +ar +ae +cl +ae +ae +bf +bf +ae +ac +ac +ac +ac +ac +ac +ae +ac +"} +(14,1,1) = {" +bf +aj +ae +bf +ae +al +aE +ae +ap +ae +ay +ay +ay +ay +ae +ae +ak +ae +ae +bn +ae +ae +aE +aQ +bf +cl +bB +ae +ac +ac +ac +ac +ac +ae +ac +"} +(15,1,1) = {" +bf +ai +ag +bf +an +al +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +cw +ae +ae +ae +ae +ae +al +bf +ac +ae +ae +bB +ac +ac +ac +ac +bD +ac +"} +(16,1,1) = {" +bf +ai +bf +bf +bf +al +al +al +ae +ae +aE +ae +ar +ae +ba +ae +ae +ae +ae +ae +ba +ae +ae +al +bf +ac +ac +ae +ae +bB +ac +ac +ac +bB +bP +"} +(17,1,1) = {" +bf +ae +af +bf +bf +aE +bf +al +as +au +az +aG +aM +aR +ae +ae +ba +ae +ba +ae +ae +aE +cl +al +bf +bf +ac +ac +ae +bD +ac +ac +ac +bF +bT +"} +(18,1,1) = {" +at +bf +ah +bf +bf +af +bf +ae +ae +aw +aB +ae +ae +aS +ae +ae +aE +ae +ae +ae +ae +ae +ae +al +cb +bf +ac +ac +ac +ae +bB +bB +bF +bB +bP +"} +(19,1,1) = {" +ab +bf +af +av +af +ae +bf +ae +bt +aD +ch +ae +ae +ca +ae +al +al +al +al +al +al +al +al +bx +bf +bf +ac +ac +ac +ac +bF +bB +bV +ac +ac +"} +(20,1,1) = {" +aa +at +bf +bf +bf +bf +bf +bj +bf +aF +aJ +aL +al +al +al +bw +bf +ac +bm +ae +bn +bf +bf +bf +bf +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +"} +(21,1,1) = {" +aa +aa +ab +ac +ac +bf +aU +aE +bf +bf +bf +bf +ck +aX +ae +bf +bf +bf +bf +bf +bf +bf +bf +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +"} +(22,1,1) = {" +aa +aa +ab +ab +ac +bf +aU +ae +bl +cd +bf +bf +bf +bN +ae +bf +bf +bf +bf +ac +ac +ac +ac +ac +ac +ac +ac +ab +ab +ab +ab +ab +ab +bZ +bZ +"} +(23,1,1) = {" +aa +aa +aa +ab +ab +bf +aV +bl +aE +bu +bf +bf +bf +bf +bb +bf +bf +bf +bf +ab +ab +ab +ab +ab +ab +ab +ab +bZ +bZ +bZ +bH +bZ +bZ +bZ +ab +"} +(24,1,1) = {" +aa +aa +aa +aa +ab +at +aP +bo +cc +cf +bf +aH +aH +bg +bW +bg +aH +aH +aH +bH +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +ab +ab +ab +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +at +bf +bf +bf +bf +aH +aN +bQ +bh +cv +bU +by +aH +aH +bI +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +bZ +ab +ab +ab +ab +ab +ab +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aI +aO +bX +bi +bp +bi +cx +bE +aH +bI +bZ +bZ +bZ +bZ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aH +aN +aW +cm +bq +bS +bA +aH +aH +bI +bZ +bZ +bZ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +aH +aH +aH +br +aH +aH +aH +aH +bZ +bZ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 2ec5b88792..dab9d0316b 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -61,8 +61,7 @@ }, /obj/structure/sign/barsign{ pixel_y = -32; - req_access = null; - req_access_txt = "0" + req_access = null }, /turf/open/floor/wood, /area/ruin/unpowered/syndicate_lava_base/bar) @@ -212,7 +211,6 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/arcade/orion_trail{ - icon_state = "arcade"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -270,7 +268,6 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/light/small{ @@ -526,8 +523,8 @@ /obj/structure/closet/crate/secure/gear{ req_access_txt = "150" }, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, +/obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/under/syndicate/combat, /obj/item/clothing/under/syndicate/combat, /obj/item/storage/belt/military, @@ -1501,7 +1498,6 @@ /area/ruin/unpowered/syndicate_lava_base/virology) "fk" = ( /obj/machinery/power/apc/syndicate{ - dir = 2; name = "Experimentation Lab APC"; pixel_y = -24 }, @@ -1565,15 +1561,10 @@ /obj/machinery/door/firedoor, /obj/structure/table/reinforced, /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Chemistry" }, /obj/machinery/door/window/southleft{ - base_state = "left"; dir = 1; - icon_state = "left"; name = "Chemistry"; req_access_txt = "150" }, @@ -1968,9 +1959,7 @@ /area/ruin/unpowered/syndicate_lava_base/virology) "gs" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, @@ -2153,9 +2142,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable/yellow{ icon_state = "1-8" }, @@ -2864,7 +2851,6 @@ /area/ruin/unpowered/syndicate_lava_base/main) "ib" = ( /obj/effect/mob_spawn/human/lavaland_syndicate{ - icon_state = "sleeper_s"; dir = 4 }, /turf/open/floor/plasteel/grimy, @@ -2904,8 +2890,7 @@ /area/ruin/unpowered/syndicate_lava_base/dormitories) "ie" = ( /obj/effect/mob_spawn/human/lavaland_syndicate/comms{ - dir = 8; - icon_state = "sleeper_s" + dir = 8 }, /turf/open/floor/plasteel/grimy, /area/ruin/unpowered/syndicate_lava_base/dormitories) @@ -3029,10 +3014,10 @@ dir = 1 }, /obj/machinery/turretid{ + ailock = 1; control_area = "/area/ruin/unpowered/syndicate_lava_base/main"; dir = 1; icon_state = "control_kill"; - ailock = 1; lethal = 1; name = "Base turret controls"; pixel_y = 30; @@ -3149,7 +3134,6 @@ dir = 1 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, @@ -3321,9 +3305,7 @@ "iT" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -3356,7 +3338,6 @@ dir = 4 }, /obj/machinery/power/apc/syndicate{ - dir = 2; name = "Dormitories APC"; pixel_y = -24 }, @@ -3565,7 +3546,6 @@ /area/ruin/unpowered/syndicate_lava_base/main) "jn" = ( /obj/effect/mob_spawn/human/lavaland_syndicate{ - icon_state = "sleeper_s"; dir = 4 }, /obj/machinery/airalarm/syndicate{ @@ -3591,8 +3571,7 @@ /area/ruin/unpowered/syndicate_lava_base/main) "jq" = ( /obj/effect/mob_spawn/human/lavaland_syndicate{ - dir = 8; - icon_state = "sleeper_s" + dir = 8 }, /obj/machinery/airalarm/syndicate{ pixel_y = 24 @@ -3986,9 +3965,7 @@ /area/ruin/unpowered/syndicate_lava_base/main) "kd" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable/yellow{ icon_state = "1-4" }, @@ -4059,9 +4036,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/main) "kj" = ( @@ -4197,7 +4172,7 @@ "kw" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/combat{ +/obj/item/clothing/gloves/tackler/combat/insulated{ pixel_y = -6 }, /obj/item/tank/internals/emergency_oxygen{ @@ -4247,8 +4222,10 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible/layer3, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "kA" = ( @@ -4266,11 +4243,9 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ - dir = 9 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "kB" = ( @@ -4285,6 +4260,7 @@ /obj/machinery/computer/atmos_control/tank{ dir = 8; frequency = 1442; + input_tag = "syndie_lavaland_n2_in"; name = "Nitrogen Supply Control"; output_tag = "syndie_lavaland_n2_out"; sensors = list("syndie_lavaland_n2_sensor" = "Tank") @@ -4477,12 +4453,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ + dir = 1; + piping_layer = 3 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "kY" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "kZ" = ( @@ -4490,6 +4473,9 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "la" = ( @@ -4503,6 +4489,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lb" = ( @@ -4511,6 +4500,9 @@ /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, /turf/open/floor/plating, /area/ruin/unpowered/syndicate_lava_base/engineering) "lc" = ( @@ -4523,6 +4515,11 @@ /turf/open/floor/plating/airless, /area/ruin/unpowered/syndicate_lava_base/engineering) "ld" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{ + dir = 4; + id = "syndie_lavaland_n2_in"; + piping_layer = 3 + }, /turf/open/floor/plating/airless, /area/ruin/unpowered/syndicate_lava_base/engineering) "le" = ( @@ -4676,15 +4673,24 @@ /turf/open/floor/plating, /area/ruin/unpowered/syndicate_lava_base/engineering) "lr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/engineering) "ls" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lt" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lu" = ( @@ -4694,6 +4700,9 @@ /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 10 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lv" = ( @@ -4848,29 +4857,33 @@ /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lM" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{ + id = "syndie_lavaland_tox_in"; + piping_layer = 3 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating/airless, /area/ruin/unpowered/syndicate_lava_base/engineering) "lN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ - dir = 9 +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/o2{ + dir = 1; + piping_layer = 3 }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lO" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lP" = ( /obj/machinery/computer/atmos_control/tank{ dir = 8; frequency = 1442; + input_tag = "syndie_lavaland_o2_in"; name = "Oxygen Supply Control"; output_tag = "syndie_lavaland_o2_out"; sensors = list("syndie_lavaland_o2_sensor" = "Tank") @@ -4879,12 +4892,15 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "lQ" = ( /obj/machinery/air_sensor{ frequency = 1442; - id_tag = "Syndicate_Construction_o2_sensor" + id_tag = "syndie_lavaland_o2_sensor" }, /turf/open/floor/plating/airless, /area/ruin/unpowered/syndicate_lava_base/engineering) @@ -5083,6 +5099,9 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "mj" = ( @@ -5093,11 +5112,15 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 9 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "mk" = ( /obj/machinery/atmospherics/pipe/manifold/supplymain/visible, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "ml" = ( @@ -5170,7 +5193,6 @@ /obj/machinery/light/small, /obj/structure/cable/yellow, /obj/machinery/power/apc/syndicate{ - dir = 2; name = "Bar APC"; pixel_y = -24 }, @@ -5297,6 +5319,9 @@ /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 5 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "mK" = ( @@ -5304,12 +5329,16 @@ /obj/machinery/computer/atmos_control/tank{ dir = 1; frequency = 1442; + input_tag = "syndie_lavaland_tox_in"; name = "Toxins Supply Control"; output_tag = "syndie_lavaland_tox_out"; sensors = list("syndie_lavaland_tox_sensor" = "Tank") }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 4 + }, /turf/open/floor/plasteel, /area/ruin/unpowered/syndicate_lava_base/engineering) "mM" = ( @@ -5700,9 +5729,7 @@ /area/ruin/unpowered/syndicate_lava_base/arrivals) "nw" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/cable/yellow{ icon_state = "1-4" }, @@ -5998,7 +6025,6 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/structure/cable/yellow{ @@ -6212,7 +6238,6 @@ }, /obj/structure/cable/yellow, /obj/machinery/power/apc/syndicate{ - dir = 2; name = "Telecommunications APC"; pixel_y = -24 }, @@ -6391,7 +6416,6 @@ "oG" = ( /obj/structure/cable, /obj/machinery/power/turbine{ - dir = 2; luminosity = 2 }, /turf/open/floor/engine/vacuum, @@ -6413,6 +6437,21 @@ /obj/structure/sign/departments/chemistry, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/testlab) +"pC" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"qc" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) "tW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -6466,12 +6505,29 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/ruin/unpowered/syndicate_lava_base/arrivals) +"Gm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Go" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + dir = 1; + piping_layer = 3 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) "IJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 1 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/engineering) +"KA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) "Lg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 @@ -6487,6 +6543,12 @@ /obj/effect/decal/cleanable/dirt, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/circuits) +"Ng" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) "Pa" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_lava_base/circuits) @@ -6520,6 +6582,14 @@ }, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"Tt" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/layer3{ + dir = 4; + id = "syndie_lavaland_o2_in"; + piping_layer = 3 + }, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/syndicate_lava_base/engineering) "TC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 4 @@ -6529,6 +6599,24 @@ }, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/testlab) +"Vw" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Wq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) (1,1,1) = {" aa @@ -8363,7 +8451,7 @@ ju ky kW lq -lM +mh mh mG nd @@ -8412,8 +8500,8 @@ jW kk kz kX -lr lN +Go mi mH ne @@ -8513,13 +8601,13 @@ km kB kZ lt -lt +qc mk mJ ng nF -ld -ju +lM +uB ab ab ab @@ -8569,7 +8657,7 @@ mK kD nG og -ju +KA ab ab ab @@ -8612,14 +8700,14 @@ ab ju kD lb -ju -kD -lb -ju -ju -ju -ju -ju +uB +pC +Vw +Wq +Gm +Gm +Gm +Ng ab ab ab @@ -8662,10 +8750,10 @@ ab ju kE lc -ju +KA lQ mm -ju +KA ab ab ab @@ -8712,10 +8800,10 @@ ab ju kF ld -ju +KA lR -ld -ju +Tt +KA ab ab ab @@ -8761,11 +8849,11 @@ ab ab ju ju +lr +Ng ju -ju -ju -ju -ju +lr +Ng ab ab ab diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 1464dd9529..ac1d1ca4d8 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -2368,7 +2368,7 @@ /turf/open/floor/plasteel/airless/white, /area/ruin/space/derelict/medical) "hW" = ( -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/plasteel/airless/white, /area/ruin/space/derelict/medical) "hX" = ( @@ -2610,13 +2610,13 @@ /turf/open/floor/plasteel/airless/white, /area/ruin/space/derelict/medical) "iM" = ( -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/plasteel/airless{ icon_state = "damaged2" }, /area/ruin/space/derelict/medical) "iN" = ( -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/mesh, /turf/open/floor/plasteel/airless{ icon_state = "damaged3" }, @@ -2866,7 +2866,7 @@ /turf/open/floor/plasteel/airless/white, /area/ruin/space/derelict/medical) "jB" = ( -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/mesh, /turf/open/floor/plasteel/airless/white, /area/ruin/space/derelict/medical) "jC" = ( diff --git a/_maps/RandomRuins/SpaceRuins/advancedlab.dmm b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm index 66a3d4e55d..b553bb5c97 100644 --- a/_maps/RandomRuins/SpaceRuins/advancedlab.dmm +++ b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm @@ -185,7 +185,7 @@ name = "Clothes" }, /obj/item/clothing/head/chameleon, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/suit/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/shoes/chameleon, @@ -221,7 +221,7 @@ }, /obj/item/clothing/under/rank/centcom/commander, /obj/item/clothing/head/centhat, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/shoes/sneakers/brown, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index c731bcac5e..2f5c14191b 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -66,7 +66,7 @@ /obj/structure/fluff/bus/passable/seat{ icon_state = "backseat" }, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" }, @@ -90,7 +90,7 @@ /obj/structure/fluff/bus/passable/seat{ icon_state = "backseat" }, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" @@ -158,9 +158,9 @@ "aA" = ( /obj/structure/fluff/bus/passable, /obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/snacks/faggot, -/obj/item/reagent_containers/food/snacks/faggot, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, +/obj/item/reagent_containers/food/snacks/meatball, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" }, @@ -182,7 +182,7 @@ /area/ruin/unpowered/no_grav) "aD" = ( /obj/structure/fluff/bus/passable, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" }, @@ -256,7 +256,7 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) "aP" = ( -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) "aQ" = ( @@ -282,7 +282,7 @@ icon_state = "backseat" }, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" }, @@ -318,7 +318,7 @@ "aZ" = ( /obj/structure/fluff/bus/passable, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/snacks/faggot, +/obj/item/reagent_containers/food/snacks/meatball, /turf/open/floor/plasteel/airless/dark{ icon_state = "bus" }, diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index bf4f0dbfa6..a4c60023e8 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -2202,11 +2202,11 @@ /area/ruin/space/has_grav/deepstorage/armory) "eO" = ( /obj/structure/table, -/obj/item/clothing/gloves/combat{ +/obj/item/clothing/gloves/tackler/combat/insulated{ pixel_x = -3; pixel_y = 4 }, -/obj/item/clothing/gloves/combat{ +/obj/item/clothing/gloves/tackler/combat/insulated{ pixel_x = 3; pixel_y = -2 }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index e820b06f61..343c79a895 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -843,7 +843,7 @@ /area/ruin/space/has_grav/ancientstation/deltacorridor) "cx" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation/deltacorridor) @@ -1651,7 +1651,7 @@ /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) "eD" = ( -/obj/machinery/mecha_part_fabricator, +/obj/machinery/mecha_part_fabricator/offstation, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) @@ -2010,12 +2010,12 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation/deltacorridor) "fu" = ( -/obj/machinery/rnd/production/protolathe, +/obj/machinery/rnd/production/protolathe/offstation, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/ancientstation/rnd) "fv" = ( -/obj/machinery/rnd/production/circuit_imprinter, +/obj/machinery/rnd/production/circuit_imprinter/offstation, /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/dropper, /turf/open/floor/plasteel/white, diff --git a/_maps/RandomRuins/SpaceRuins/spacediner.dmm b/_maps/RandomRuins/SpaceRuins/spacediner.dmm new file mode 100644 index 0000000000..21670da9e4 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/spacediner.dmm @@ -0,0 +1,2918 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"ac" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Shuttle Dock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ad" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ae" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"af" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"ag" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"ah" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external/glass{ + name = "Shuttle Dock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ai" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ak" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"al" = ( +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"am" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/diner/solars) +"an" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"ao" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ap" = ( +/obj/structure/sign/poster/official/pda_ad600{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aq" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ar" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"as" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"at" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/diner/solars) +"au" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"av" = ( +/turf/open/floor/plating/airless, +/area/ruin/space/diner) +"aw" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/diner) +"ax" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/diner) +"ay" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"az" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aA" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/ruin/space/diner/interior) +"aB" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aC" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aD" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aE" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aF" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/crate/freezer, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aL" = ( +/turf/open/floor/engine/airless, +/area/ruin/space/diner) +"aM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"aN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cola/red, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aP" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aQ" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aR" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/ruin/space/diner/interior) +"aS" = ( +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aT" = ( +/obj/structure/cable, +/obj/machinery/power/solar, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/diner/solars) +"aU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/ruin/space/diner/solars) +"aV" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Docking Area" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aW" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Docking Area" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"aX" = ( +/obj/machinery/vending/boozeomat/pubby_maint, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"aZ" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"ba" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bb" = ( +/obj/machinery/gibber, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bc" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/diner/interior) +"bd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Pod Bay" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"be" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel/stairs/old, +/area/ruin/space/diner/interior) +"bf" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"bg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"bh" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/engine/airless, +/area/ruin/space/diner) +"bi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/button{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"bj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bl" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bm" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null; + req_access_txt = "200" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bp" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/rice{ + pixel_x = -8; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/processor, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"br" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/grill, +/obj/machinery/light/small/broken{ + icon_state = "bulb-broken"; + dir = 1 + }, +/obj/machinery/power/apc/highcap/five_k{ + name = "Space Diner APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bu" = ( +/obj/machinery/deepfryer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bv" = ( +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"bx" = ( +/obj/structure/toilet/secret/low_loot{ + icon_state = "toilet00"; + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/eastright, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/diner/interior) +"by" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_y = 32 + }, +/obj/item/reagent_containers/food/urinalcake, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bz" = ( +/obj/structure/urinal{ + pixel_y = 28 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bA" = ( +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/obj/machinery/airalarm/all_access{ + dir = 8; + icon_state = "alarm0"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bB" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bC" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bD" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge/abandoned{ + name = "Staff Entrance" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/meat{ + req_access_txt = "200" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bO" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"bP" = ( +/obj/structure/toilet/secret/low_loot{ + icon_state = "toilet00"; + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/eastright, +/turf/open/floor/mineral/titanium/white, +/area/ruin/space/diner/interior) +"bQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bT" = ( +/obj/structure/rack, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"bU" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"bV" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"bW" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"bX" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"bY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"bZ" = ( +/obj/machinery/icecream_vat, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/all_access{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ca" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + icon_state = "manifold-2"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cd" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ce" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror{ + icon_state = "mirror_broke"; + pixel_x = 24 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cg" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"ch" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"ci" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"ck" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cl" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"cm" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/table/wood/bar, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/snacks/stewedsoymeat, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cn" = ( +/obj/structure/table/wood/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"co" = ( +/obj/structure/table/wood/bar, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/item/trash/plate, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cp" = ( +/obj/structure/table/wood/bar, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cq" = ( +/obj/structure/table/wood/bar, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/structure/frame, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood/bar, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ct" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood/bar, +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/dish_drive, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cu" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/r_wall, +/area/ruin/space/diner/interior) +"cv" = ( +/obj/machinery/door/airlock/grunge/abandoned{ + name = "Restrooms" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cw" = ( +/obj/machinery/airalarm/all_access{ + dir = 1; + icon_state = "alarm0"; + pixel_x = 0; + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/airalarm/all_access{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cz" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/obj/item/beacon, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Teleporter Room" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"cC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cE" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cF" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cG" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cH" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cI" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/computer/slot_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cJ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cK" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cL" = ( +/obj/structure/table/wood, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/trash/plate, +/obj/item/kitchen/fork, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cM" = ( +/obj/machinery/light/broken{ + icon_state = "tube-broken"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/chair, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"cN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cO" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/sign/departments/restroom{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cP" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cQ" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"cS" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 1 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"cT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/report_crimes{ + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cW" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cY" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"cZ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"da" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"db" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/general/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dc" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dd" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + icon_state = "pipe11-2"; + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"de" = ( +/obj/machinery/door/airlock/external{ + name = "Mining Shuttle Dock" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"df" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dg" = ( +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dh" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"di" = ( +/obj/machinery/light/small/broken, +/obj/machinery/teleport/station, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"dj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/computer/teleporter{ + icon_state = "computer"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/ruin/space/diner/interior) +"dk" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/space/nearstation) +"dm" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dn" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"do" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dp" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dq" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dr" = ( +/obj/structure/sign/mining{ + pixel_x = 32 + }, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/rag, +/obj/item/kitchen/fork, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"ds" = ( +/obj/structure/cable, +/obj/machinery/power/solar_control{ + icon_state = "computer"; + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dt" = ( +/obj/structure/sign/poster/ripped{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dv" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 4 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dy" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light/broken{ + icon_state = "tube-broken"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dz" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dB" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dC" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/chair{ + icon_state = "chair_toppled"; + dir = 1 + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dD" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/food/snacks/sushi_rice, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dE" = ( +/obj/machinery/light/small/broken{ + icon_state = "bulb-broken"; + dir = 1 + }, +/turf/open/floor/engine/airless, +/area/ruin/space/diner) +"dF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"dG" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/vending/cola/blue, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dH" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = -4 + }, +/obj/item/reagent_containers/food/condiment/pack/mustard{ + pixel_x = 4 + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dI" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/snacks/hotdog, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dJ" = ( +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dK" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/food/drinks/bottle/whiskey, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dL" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/trash/plate{ + pixel_y = -2 + }, +/obj/item/reagent_containers/food/snacks/burger/mcguffin, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dM" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/machinery/jukebox, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dN" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/kitchen/fork, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dO" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/trash/plate, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dP" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dQ" = ( +/obj/machinery/light, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dR" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/item/reagent_containers/food/drinks/coffee, +/turf/open/floor/carpet, +/area/ruin/space/diner/interior) +"dS" = ( +/obj/item/storage/wallet/random, +/turf/open/floor/engine/airless, +/area/ruin/space/diner) +"dT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"dU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Pod Bay" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"dV" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + icon_state = "hrwindow_spawner_directional"; + dir = 10 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dW" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dX" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"dZ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + icon_state = "hrwindow_spawner_directional"; + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/space/diner/interior) +"ea" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/template_noop, +/area/space/nearstation) +"eb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Docking Area" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ec" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Docking Area" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/closed, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel, +/area/ruin/space/diner/interior) +"ed" = ( +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"ee" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"ef" = ( +/obj/machinery/light/small/broken{ + icon_state = "bulb-broken"; + dir = 1 + }, +/obj/machinery/vending/snack, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"eg" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + icon_state = "hrwindow_spawner_end"; + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/diner) +"eh" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/open/floor/plating/airless, +/area/ruin/space/diner) +"ei" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/airless, +/area/ruin/space/diner) +"ej" = ( +/obj/structure/girder/reinforced, +/turf/open/floor/plating/airless, +/area/ruin/space/diner) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +af +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +dk +dk +dk +af +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +av +ax +af +dk +dk +dk +af +ej +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +av +aL +aL +ag +ag +ag +dg +ag +ag +ag +af +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +af +aL +aL +aL +aL +bB +bT +cg +ch +ch +dh +bB +av +af +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +av +aL +aL +aL +bh +bC +bU +ch +cy +ch +di +bC +dE +aL +af +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +af +aa +aw +aL +aL +aL +aL +bD +bV +ci +cz +ci +dj +dv +aL +dS +av +af +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +af +af +af +ax +aM +aM +aM +bi +ag +bW +ch +cA +ch +cw +ag +dF +dT +av +af +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +ag +ai +an +ag +ag +ag +ag +bd +bj +ag +bX +cj +cB +cS +dm +ag +bj +dU +ag +ax +ax +ej +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +ag +aj +aj +aj +ay +aj +aV +aj +aj +bE +aj +aj +cC +cT +aj +cx +aj +aj +eb +ed +ed +av +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +ag +ak +ao +au +au +aN +aW +au +au +bF +bY +bY +cD +cU +au +dx +au +aN +ec +ee +eh +ed +af +aa +"} +(16,1,1) = {" +aa +ab +ab +ab +al +al +ag +az +aO +ag +ag +bc +bG +aj +ck +aj +bL +dn +ag +ag +ag +ag +ef +ei +af +aa +aa +"} +(17,1,1) = {" +aa +ac +ad +ah +al +ap +ag +ag +ag +ag +ae +ag +bH +ag +ag +ag +cV +aj +ag +af +af +ax +eg +av +aa +aa +aa +"} +(18,1,1) = {" +aa +ab +ab +ab +al +al +ag +aA +aP +aX +ag +ag +bI +ag +cl +ag +cW +do +ag +af +af +aa +aa +af +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +af +ab +al +aq +ag +aB +aQ +aY +be +bk +bJ +ag +ag +ag +cX +cH +ag +ai +dV +aa +aa +af +aa +aa +aa +"} +(20,1,1) = {" +aa +ab +ab +ab +al +al +ag +aC +aR +aZ +ag +bl +bH +bZ +cm +cE +cX +cH +dy +dG +dW +aa +aa +af +aa +aa +aa +"} +(21,1,1) = {" +aa +ac +ad +ah +al +ar +ag +aD +aS +ba +ag +bm +bH +aj +cn +cF +cX +cH +dz +dH +dX +af +af +af +aa +aa +aa +"} +(22,1,1) = {" +aa +ab +ab +ab +al +as +ag +aE +aS +ba +bc +bn +bK +ca +co +cF +cY +dp +dA +dI +bw +ea +ea +ea +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +ag +ak +al +ag +aF +aS +bb +bc +bo +bL +cb +cp +cF +cX +cH +dq +dJ +ag +af +af +af +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +ag +ai +an +ag +ag +ag +bc +ag +bp +bL +cb +cq +cF +cX +cH +dz +dK +dY +aa +aa +af +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +af +af +af +aa +ag +bq +bL +cc +cr +cG +cZ +cH +dz +dL +dW +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +af +am +at +at +aG +aT +af +ag +br +bL +aj +cs +cH +da +cH +dq +dq +dW +aa +af +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +af +aH +af +aa +ag +bs +bL +aj +ct +cH +da +cH +dq +dM +dW +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +af +am +at +at +aI +aT +af +ag +bt +bM +aj +cu +cI +da +cH +dz +dN +dW +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +af +aH +af +aa +bc +bu +bL +aj +ag +cJ +da +cH +dz +dO +dW +aa +aa +aa +af +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +af +am +at +at +aI +aT +af +ag +bv +bN +cd +ag +cK +db +cH +dq +dq +dW +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +af +aH +af +af +bf +bw +bO +bw +bw +cL +dc +cH +dz +dP +dX +aa +aa +af +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +af +am +at +aJ +aU +aU +bg +bx +bP +bP +bc +cM +da +cH +dz +dQ +ag +af +af +af +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +af +aH +af +af +bc +by +bQ +ce +cv +cN +dd +dp +dB +dB +bw +ea +ea +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +af +am +aK +aT +af +ag +bz +bR +bL +ag +cO +cX +dq +dC +dq +dY +af +af +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +af +af +af +aa +ag +bA +bS +cf +ag +cP +cX +dr +dD +dR +dW +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ag +ag +ag +ag +ag +bc +de +ag +ag +ai +dZ +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +ag +aS +df +ds +ag +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +ag +cQ +aS +dt +ag +af +af +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +ag +dg +dg +ag +ag +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm index 8113c586ff..dd7e700146 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm @@ -145,9 +145,6 @@ "aE" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/powered) -"aF" = ( -/turf/open/floor/plating/asteroid, -/area/ruin/powered) "aG" = ( /obj/structure/sink/puddle, /turf/open/floor/plating/asteroid, @@ -241,7 +238,7 @@ /turf/closed/mineral/random/low_chance/earth_like, /area/ruin/powered) "bb" = ( -/turf/closed/mineral/random/earth_like, +/turf/closed/mineral/random/no_caves/earth_like, /area/ruin/powered) "bc" = ( /obj/item/circuitboard/machine/circuit_imprinter, @@ -1137,7 +1134,7 @@ ao ao ak af -aF +am bb bb bb @@ -1189,7 +1186,7 @@ an an ae ae -aF +am bb bb bb @@ -1223,8 +1220,8 @@ bb bb bb ba -aF -aF +am +am ba ba ba @@ -1241,7 +1238,7 @@ ar af at at -aF +am bb fp bb @@ -1275,10 +1272,10 @@ bb bb bb ad -aF -aF -aF -aF +am +am +am +am ba aH aJ @@ -1286,13 +1283,13 @@ aL bb bb aT -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am aR bb bb @@ -1328,23 +1325,23 @@ bb bb ad au -aF +am aB -aF -aF -aF -aF -aF +am +am +am +am +am ba bb -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am bg bb fp @@ -1384,19 +1381,19 @@ bs aC bC WH -aF -aF -aF +am +am +am ba bb bb -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bb bb bb @@ -1432,23 +1429,23 @@ bb bb ad ax -aF +am aD -aF -aF -aF -aF +am +am +am +am bb bb bb aU bd -aF -aF +am +am bl bm -aF -aF +am +am bb bb bb @@ -1484,20 +1481,20 @@ bb bb ad ay -aF -aF -aF +am +am +am aG -aF -aF +am +am bb bb ba av be -aF -aF -aF +am +am +am bn bo bo @@ -1535,24 +1532,24 @@ bb bb bb ba -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bb bb bb bc bf -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am br bb bb @@ -1590,22 +1587,22 @@ bb bb bb bb -aF -aF -aF -aF -aF +am +am +am +am +am bb bb -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am bb bb bb @@ -1642,21 +1639,21 @@ bb bb bb bb -aF -aF -aF -aF -aF +am +am +am +am +am aN -aF -aF -aF -aF +am +am +am +am aR -aF -aF -aF -aF +am +am +am +am bb bb fp @@ -1695,22 +1692,22 @@ bb bb bb ba -aF -aF -aF +am +am +am ba ba -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am +am +am ba ba ba @@ -1752,16 +1749,16 @@ ba aK ba ba -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am bp -aF -aF +am +am aR ba ba @@ -1805,15 +1802,15 @@ ba fp ba aP -aF -aF -aF -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am +am +am +am aR ba ba @@ -1858,15 +1855,15 @@ ba ba aQ aP -aF -aF +am +am aR -aF -aF -aF -aF +am +am +am +am bb -aF +am ba ba aZ @@ -1910,12 +1907,12 @@ ba ba ba ba -aF -aF -aF -aF +am +am +am +am aP -aF +am bg bb bb @@ -1962,12 +1959,12 @@ bb bb ba ba -aF -aF -aF -aF -aF -aF +am +am +am +am +am +am aS bb fp @@ -2015,11 +2012,11 @@ bb bb ba bg -aF -aF -aF -aF -aF +am +am +am +am +am aS bb fp @@ -2066,12 +2063,12 @@ bb bb fp ba -aF -aF +am +am bj -aF -aF -aF +am +am +am aS fp bb @@ -2120,9 +2117,9 @@ ba ba aS bi -aF -aF -aF +am +am +am aS aS bb @@ -2171,10 +2168,10 @@ ba aZ ba aS -aF -aF -aF -aF +am +am +am +am aS aS ba diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 69b56946f2..209feb82e3 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -2688,7 +2688,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/plasteel/grimy, diff --git a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm index 75adc455b0..a1b2271d96 100644 --- a/_maps/RandomRuins/SpaceRuins/vaporwave.dmm +++ b/_maps/RandomRuins/SpaceRuins/vaporwave.dmm @@ -28,7 +28,7 @@ /turf/open/floor/holofloor/beach, /area/ruin/space/has_grav/powered/aesthetic) "i" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/structure/window{ dir = 8 }, diff --git a/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm b/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm index d694fc7c9f..9cc192efc7 100644 --- a/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm +++ b/_maps/RandomRuins/SpaceRuinsStation/roid7.dmm @@ -168,7 +168,7 @@ /turf/template_noop, /area/template_noop) "H" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/plasteel/airless/cafeteria, /area/ruin/space) "I" = ( diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm index da0a0036c5..c842479db7 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm @@ -6,7 +6,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/poddoor/shutters/radiation/preopen, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ab" = ( @@ -16,28 +19,40 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/door/poddoor/shutters/radiation/preopen, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ac" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/poddoor/shutters/radiation/preopen, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ad" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/door/poddoor/shutters/radiation/preopen, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ae" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/poddoor/shutters/radiation/preopen, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, /turf/open/floor/plasteel, /area/engine/engineering) "af" = ( diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm index e15eda336c..e9f314cd1a 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm @@ -2718,7 +2718,7 @@ wt av kA qo -EL +MP MP MP Cb diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm index 37bc2a7dde..a9c5eab318 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm @@ -103,10 +103,6 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/engine/engineering) -"dw" = ( -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "dZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -1170,7 +1166,8 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ dir = 1 }, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/engine/engineering) "Hp" = ( /obj/machinery/atmospherics/components/binary/pump{ @@ -1332,7 +1329,8 @@ /area/engine/engineering) "LS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, /area/engine/engineering) "Mf" = ( /obj/structure/closet/secure_closet/engineering_personal, @@ -2629,7 +2627,7 @@ EN fq LS Hn -dw +tw yf Rh yf @@ -2655,9 +2653,9 @@ XW ST Ok MP -dw -dw -dw +tw +tw +tw Rh Rh Rh diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 3118ad3f5f..1bfb337d99 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -154,13 +154,7 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "cX" = ( -/obj/structure/statue{ - desc = "A lifelike statue of a horrifying monster."; - dir = 8; - icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; - icon_state = "goliath"; - name = "goliath" - }, +/obj/structure/closet/secure_closet/miner, /turf/open/floor/plasteel, /area/mine/living_quarters) "dk" = ( @@ -267,9 +261,13 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "eS" = ( -/obj/structure/table, -/obj/item/gps/mining, -/obj/item/gps/mining, +/obj/structure/statue{ + desc = "A lifelike statue of a horrifying monster."; + dir = 8; + icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; + icon_state = "goliath"; + name = "goliath" + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "fm" = ( @@ -427,7 +425,6 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/structure/displaycase, /turf/open/floor/plasteel, /area/mine/living_quarters) "hP" = ( @@ -773,7 +770,8 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "nH" = ( -/obj/structure/displaycase, +/obj/machinery/light, +/obj/structure/closet/wardrobe/miner, /turf/open/floor/plasteel, /area/mine/living_quarters) "nI" = ( @@ -1086,6 +1084,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 1 }, +/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/mine/living_quarters) "re" = ( @@ -1181,9 +1180,6 @@ name = "Station Intercom (General)"; pixel_x = 28 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 8 }, @@ -1279,12 +1275,8 @@ /turf/open/floor/plasteel, /area/mine/production) "uG" = ( -/obj/structure/table, -/obj/item/clothing/glasses/meson, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, +/obj/structure/ore_box, +/obj/effect/turf_decal/box, /turf/open/floor/plasteel, /area/mine/living_quarters) "uI" = ( @@ -1758,15 +1750,6 @@ "Cd" = ( /turf/closed/wall, /area/mine/production) -"Cg" = ( -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Cj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -1870,7 +1853,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/chair, /turf/open/floor/plasteel, /area/mine/living_quarters) "Dv" = ( @@ -1880,12 +1862,6 @@ }, /turf/open/floor/plating, /area/mine/laborcamp/security) -"DN" = ( -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Ed" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2028,27 +2004,6 @@ }, /turf/open/floor/plating, /area/mine/laborcamp) -"Hk" = ( -/obj/docking_port/stationary{ - area_type = /area/lavaland/surface/outdoors; - dir = 8; - dwidth = 3; - height = 7; - id = "lavaland_common_away"; - name = "Mining base public dock"; - width = 7 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Hm" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Lavaland Shuttle Airlock" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Ho" = ( /obj/machinery/door/airlock{ name = "Restroom" @@ -2121,12 +2076,6 @@ }, /turf/open/floor/plasteel/white, /area/mine/living_quarters) -"If" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Ii" = ( /obj/structure/table, /obj/item/storage/box/donkpockets, @@ -2757,9 +2706,6 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/structure/table, -/obj/item/gps/mining, -/obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) "Pq" = ( @@ -2882,7 +2828,6 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/structure/chair, /turf/open/floor/plasteel, /area/mine/living_quarters) "Rv" = ( @@ -3399,15 +3344,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) -"Zw" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Lavaland Shuttle Airlock" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "ZF" = ( /obj/machinery/telecomms/relay/preset/mining, /obj/machinery/light/small{ @@ -4330,10 +4266,10 @@ VT VT VT VT -Lm -Lm -Lm -Lm +VT +VT +VT +VT VT VT VT @@ -4386,14 +4322,14 @@ VT VT VT VT -Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm +VT +VT +VT +VT +VT +VT +VT +VT VT VT VT @@ -4442,15 +4378,15 @@ wz VT VT VT +VT +VT +VT +VT +VT Lm Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm +VT +VT Lm VT VT @@ -4499,17 +4435,17 @@ wz wz VT VT +VT +VT Lm +VT +VT +VT Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm +VT +VT +VT +VT Lm VT VT @@ -4555,18 +4491,18 @@ Lm wz wz Lm +VT +VT +VT Lm Lm Lm Lm Lm -Lm -Lm -Lm -Lm -Lm -Lm -Lm +VT +VT +VT +VT VT VT VT @@ -4612,6 +4548,8 @@ VT VT wz Lm +VT +VT Lm Lm Lm @@ -4620,10 +4558,8 @@ Lm Lm Lm Lm -Lm -Lm -Lm -Lm +VT +VT VT VT VT @@ -4669,6 +4605,7 @@ VT VT Lm Lm +VT Lm Lm Lm @@ -4678,8 +4615,7 @@ Lm Lm Lm Lm -Lm -Lm +VT VT VT VT @@ -4725,12 +4661,12 @@ my VT VT VT +VT +VT Lm Lm -Lm -Lm -Lm -Lm +VT +VT Lm Lm Lm @@ -4786,10 +4722,10 @@ wz Lm Lm Lm +VT Lm Lm Lm -Hk Lm Lm Lm @@ -4843,11 +4779,11 @@ wz Lm Lm Lm +VT +Lm +Lm Lm Lm -KV -Zw -KV Lm Lm Lm @@ -4902,9 +4838,9 @@ Lm Lm Lm Lm -KV -Ag -KV +Lm +Lm +Lm Lm Lm VT @@ -4959,9 +4895,9 @@ VN VN XX VN -KV -Hm -KV +VN +VN +VN VT VT VT @@ -5013,12 +4949,12 @@ pu bn VN zy -If -DN -If -FE +Ag +Ag +Ag +Ag qZ -KV +VN VT VT VT @@ -5074,8 +5010,8 @@ Ag Ag Ag Ag -Ag -KV +cX +VN VT VT VT @@ -5132,7 +5068,7 @@ uG uG Ag cX -KV +VN VT VT VT @@ -5188,8 +5124,8 @@ KO uG uG Ag -Ag -KV +cX +VN VT VT VT @@ -5245,7 +5181,7 @@ RP Ag Ag Ag -oy +nH VN VT VT @@ -5300,8 +5236,8 @@ VN Pp sx eS -Cg -nH +Ag +Ag hH VN wz diff --git a/_maps/RandomZLevels/Cabin.dmm b/_maps/RandomZLevels/Cabin.dmm deleted file mode 100644 index 4d07c02565..0000000000 --- a/_maps/RandomZLevels/Cabin.dmm +++ /dev/null @@ -1,66505 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/rock/snow, -/area/space) -"ab" = ( -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowforest) -"ac" = ( -/turf/open/floor/plating/asteroid/snow/temperatre, -/area/awaymission/snowforest) -"ad" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/snowforest/lumbermill) -"ae" = ( -/obj/item/grown/log/tree, -/turf/open/floor/plating/asteroid/snow/temperatre, -/area/awaymission/snowforest) -"af" = ( -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"ag" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "lumbermill" - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"ah" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"ai" = ( -/obj/machinery/recycler/lumbermill, -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"aj" = ( -/obj/item/grown/log/tree, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"ak" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"al" = ( -/obj/structure/table/wood, -/obj/item/grown/log/tree, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"am" = ( -/obj/structure/table/wood, -/obj/item/twohanded/required/chainsaw, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest/lumbermill) -"an" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin) -"ao" = ( -/obj/structure/window/fulltile, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ap" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aq" = ( -/turf/open/floor/wood, -/area/awaymission/cabin) -"ar" = ( -/obj/machinery/door/airlock/wood{ - name = "bathroom" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"as" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"at" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"au" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/cabin) -"av" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "cabin APC" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aw" = ( -/obj/machinery/power/smes/magical, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ax" = ( -/obj/structure{ - density = 1; - desc = "Generates power from lava!"; - dir = 2; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; - icon_state = "turbine"; - name = "geothermal generator" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ay" = ( -/obj/machinery/light/small, -/obj/structure/table/wood, -/obj/item/toy/syndicateballoon, -/turf/open/floor/wood, -/area/awaymission/cabin) -"az" = ( -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aA" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aB" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"aC" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"aD" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aE" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aG" = ( -/obj/item/reagent_containers/pill/patch/styptic, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"aH" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aI" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aJ" = ( -/obj/machinery/shower{ - icon_state = "shower"; - dir = 8 - }, -/obj/machinery/door/window/northright, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"aK" = ( -/obj/machinery/shower{ - icon_state = "shower"; - dir = 4 - }, -/obj/machinery/door/window/northleft, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"aL" = ( -/turf/open/floor/plating, -/area/awaymission/cabin) -"aM" = ( -/obj/machinery/telecomms/relay/preset/mining, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aN" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aO" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aP" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aQ" = ( -/obj/machinery/door/airlock/wood{ - name = "maintenance" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aR" = ( -/obj/machinery/door/window/westright{ - name = "fireplace" - }, -/obj/structure/fireplace, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aS" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 24 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aT" = ( -/obj/machinery/door/window/eastleft{ - name = "fireplace" - }, -/obj/structure/fireplace, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aU" = ( -/obj/structure/fireplace, -/obj/machinery/door/window/westright{ - name = "fireplace" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aV" = ( -/obj/machinery/space_heater, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aW" = ( -/obj/structure/fireplace, -/obj/machinery/door/window/eastleft{ - name = "fireplace" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aX" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aY" = ( -/obj/structure/table/wood, -/obj/item/phone, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aZ" = ( -/obj/structure/guncase/shotgun, -/obj/item/gun/ballistic/shotgun/riot, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"ba" = ( -/obj/machinery/door/airlock/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bb" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/britcup, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bd" = ( -/obj/structure/chair/office/dark, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"be" = ( -/obj/machinery/computer/crew, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bf" = ( -/obj/machinery/door/airlock/wood{ - name = "manager's office" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bg" = ( -/obj/machinery/door/window/westright{ - name = "manager's desk" - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bh" = ( -/obj/machinery/light, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bi" = ( -/obj/machinery/door/airlock/wood{ - name = "manager's bedroom" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bj" = ( -/obj/structure/toilet, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bk" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bl" = ( -/obj/machinery/vending/autodrobe{ - req_access_txt = "0" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bm" = ( -/obj/machinery/door/airlock/wood{ - name = "stage left" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bn" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bo" = ( -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bp" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bq" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks, -/turf/open/floor/wood, -/area/awaymission/cabin) -"br" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bs" = ( -/obj/machinery/computer/arcade/battle, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bt" = ( -/obj/machinery/computer/slot_machine, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bu" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bv" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bw" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bx" = ( -/obj/machinery/smartfridge, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"by" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bz" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bA" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bB" = ( -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bC" = ( -/obj/machinery/gibber, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bD" = ( -/obj/structure/table/optable, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bE" = ( -/obj/machinery/computer/operating, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bG" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bH" = ( -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bI" = ( -/obj/machinery/shower{ - icon_state = "shower"; - dir = 4 - }, -/obj/machinery/door/window/eastright, -/obj/structure/window{ - icon_state = "window"; - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bJ" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bK" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/reagent_containers/pill/patch/styptic, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"bL" = ( -/obj/structure/bed, -/obj/item/bedsheet/patriot, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bM" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bN" = ( -/obj/machinery/vending/boozeomat{ - req_access_txt = "0" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bO" = ( -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bP" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bQ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bR" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"bS" = ( -/turf/open/floor/wood/cold, -/area/awaymission/snowforest) -"bT" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bU" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bV" = ( -/obj/structure/table, -/obj/item/kitchen/knife/butcher, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bW" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"bX" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bY" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/processor, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"bZ" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/table, -/obj/item/surgicaldrill, -/obj/item/circular_saw, -/obj/item/cautery, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/hemostat, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"ca" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"cb" = ( -/obj/machinery/gateway{ - dir = 9 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cc" = ( -/obj/machinery/gateway{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cd" = ( -/obj/machinery/gateway{ - dir = 5 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ce" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest) -"cf" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest) -"cg" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest) -"ch" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/instrument/guitar, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ci" = ( -/obj/structure/chair/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cj" = ( -/obj/structure/table, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"ck" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/cafeteria, -/area/awaymission/cabin) -"cl" = ( -/obj/structure/kitchenspike, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"cm" = ( -/obj/structure/table, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"cn" = ( -/obj/structure/bed/roller, -/obj/item/bedsheet, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"co" = ( -/obj/machinery/gateway{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cp" = ( -/obj/machinery/gateway/centeraway, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cq" = ( -/obj/machinery/gateway{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cr" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood/cold, -/area/awaymission/snowforest) -"cs" = ( -/obj/structure/table/wood, -/obj/item/wrench, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ct" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"cu" = ( -/obj/machinery/sleeper{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"cv" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/fire, -/turf/open/floor/plasteel/white, -/area/awaymission/cabin) -"cw" = ( -/obj/machinery/gateway{ - dir = 10 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cx" = ( -/obj/machinery/gateway, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cy" = ( -/obj/machinery/gateway{ - dir = 6 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cz" = ( -/obj/structure/piano, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cA" = ( -/obj/machinery/door/airlock/wood{ - name = "stage right" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cB" = ( -/obj/machinery/door/window/eastleft, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cC" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cD" = ( -/obj/machinery/door/window/westright{ - name = "bar" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cE" = ( -/obj/machinery/door/airlock/wood{ - name = "kitchen" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cF" = ( -/obj/machinery/door/airlock/wood{ - name = "kitchen cold room" - }, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"cG" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/plasteel/freezer, -/area/awaymission/cabin) -"cH" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cI" = ( -/obj/machinery/door/airlock/wood{ - name = "backstage" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cJ" = ( -/obj/machinery/door/airlock/glass_large{ - name = "medbay" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cK" = ( -/obj/machinery/door/airlock/wood{ - name = "cabin" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cL" = ( -/obj/structure/sign/barsign{ - pixel_y = 32; - req_access = null - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cM" = ( -/obj/machinery/door/airlock/wood{ - name = "gateway" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cN" = ( -/obj/machinery/vending/snack, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cO" = ( -/obj/machinery/light, -/obj/machinery/vending/cola, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cP" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cQ" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"cR" = ( -/obj/machinery/door/poddoor/shutters{ - id = "garage_cabin"; - name = "garage door" - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cS" = ( -/obj/machinery/button/door{ - id = "garage_cabin"; - pixel_y = 24 - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cT" = ( -/obj/vehicle/ridden/atv, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cU" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cV" = ( -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cW" = ( -/obj/structure/closet, -/obj/item/key, -/obj/item/key, -/obj/item/key, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cX" = ( -/obj/machinery/light, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/cabin) -"cY" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/asteroid/snow/temperatre, -/area/awaymission/snowforest) -"cZ" = ( -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"da" = ( -/obj/structure/chair, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"db" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dc" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dd" = ( -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"de" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"df" = ( -/obj/structure/kitchenspike, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dg" = ( -/obj/structure/table, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dh" = ( -/obj/structure/kitchenspike, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"di" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dj" = ( -/turf/open/floor/plating/ice/temperate, -/area/awaymission/snowforest) -"dk" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dl" = ( -/obj/item/shard, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dm" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dn" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"do" = ( -/obj/item/chair, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dp" = ( -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dq" = ( -/obj/item/shard, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dr" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"ds" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/temperatre, -/area/awaymission/snowforest) -"dt" = ( -/obj/effect/landmark/mapGenerator/snowy, -/turf/open/floor/plating/asteroid/snow/temperatre, -/area/awaymission/snowforest) -"du" = ( -/obj/structure/closet/toolcloset, -/obj/item/lightreplacer, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/awaymission/cabin) -"dv" = ( -/obj/structure{ - density = 1; - desc = "Generates power from lava!"; - dir = 1; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; - icon_state = "compressor"; - name = "geothermal generator" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(70,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(71,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bS -bS -bS -bS -bS -bS -bS -bS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(73,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bS -ce -ce -ce -bS -bS -bS -bS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(74,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bS -cf -cf -cf -bS -bS -bS -bS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(75,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bS -cg -cg -cg -bS -bS -bS -bS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(76,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -bS -bS -cr -bS -bS -bS -bS -bS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(77,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -an -an -ao -ao -an -an -an -an -an -an -an -an -cK -cK -an -cR -cR -cR -cR -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(78,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ap -au -aH -aN -aq -an -aq -aq -an -bl -bM -bT -ch -cs -cz -an -aq -aq -an -cS -cV -cV -cV -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(79,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aO -aq -ba -aq -aq -an -aq -aq -aq -aq -aq -aq -cI -aq -aq -an -cT -cT -cT -cT -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aP -aq -an -aq -bh -an -bm -an -an -an -an -cA -an -aq -aq -an -cU -cV -cV -cX -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -az -aq -an -aq -aq -an -aq -aq -aq -aq -aq -aq -an -aq -aq -an -cT -cT -cT -cT -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(82,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aq -aA -aI -aA -aq -an -aq -aq -an -bn -aq -aq -aq -aq -bh -an -aq -bh -an -cV -cV -cV -cV -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(83,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ar -an -an -an -aR -an -aq -aq -an -aq -aq -aq -aq -aq -aq -an -aq -aq -an -cU -cV -cV -cX -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(84,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -as -aB -aJ -an -an -an -aq -aq -an -bn -aq -aq -aq -aq -bh -an -aq -aq -an -cV -cV -cV -cV -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(85,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -aS -ba -aq -bh -an -bo -bo -bo -bo -bo -cB -an -aq -aq -ba -cV -cV -cV -cV -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(86,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -at -aC -aK -an -an -an -aq -aq -an -bp -bp -bp -bp -bp -aq -aq -aq -aq -an -cV -cV -cW -cW -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(87,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ar -an -an -an -aT -an -aq -aq -an -bp -bp -bp -bp -bp -aq -aq -aq -cN -an -an -an -an -an -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(88,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aq -ap -aH -aN -aq -an -aq -aq -ba -aq -aq -aq -aq -aq -aq -aq -aq -cO -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(89,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aO -aq -an -aq -aq -an -bq -aq -aq -aq -aq -aq -aq -aq -cP -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(90,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aP -aq -an -aq -bh -an -br -aq -aq -aq -aN -aq -aq -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(91,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -az -aq -ba -aq -aq -an -bs -aq -aq -ci -bu -cC -aq -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(92,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -au -aA -aI -aA -aq -an -aq -aq -an -bt -aq -aq -aq -bp -aq -aq -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(93,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -an -an -aq -aq -an -ap -aq -aq -aq -aq -aq -aq -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(94,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ap -au -aH -aN -aq -an -aq -aq -an -aN -aN -aN -aN -aN -aq -aq -aq -bh -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(95,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aO -aq -ba -aq -bh -an -bu -bu -bu -bu -bu -cD -an -cL -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aP -aq -an -aq -aq -an -aq -aq -aq -aq -aq -aq -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(97,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -az -aq -an -aq -aq -an -bv -bN -bU -aq -ap -aq -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(98,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aq -aA -aI -aA -aq -an -aq -aq -an -an -an -an -bu -an -cE -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(99,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ar -an -an -an -aU -an -aq -aq -an -bw -bO -bO -bO -bO -bO -cE -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(100,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -as -aB -aJ -an -an -an -aq -aq -an -bx -bO -bV -cj -cj -bO -an -aq -bh -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(101,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -aV -ba -aq -aq -an -by -bO -bO -bO -bO -bO -an -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -at -aC -aK -an -an -an -aq -bh -an -bz -bO -bW -ck -cj -bO -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(103,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ar -an -an -an -aW -an -aq -aq -an -an -an -an -an -an -cF -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(104,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aq -ap -aH -aN -aq -an -aq -aq -an -bA -bB -bX -cl -cl -bB -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(105,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aO -aq -an -aq -aq -an -bB -bB -bB -bB -bB -bB -an -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(106,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aP -aq -an -aq -aq -an -bC -bB -bY -bB -ct -cG -an -aq -bh -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(107,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -az -aq -ba -aq -aq -an -an -an -an -an -an -an -an -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dj -dj -dj -dj -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(108,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -au -aA -aI -aA -aq -an -aq -aq -an -bD -bH -bZ -cm -cu -cu -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(109,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -an -an -aq -bh -an -bE -bH -bH -bH -bH -bH -an -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(110,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ap -au -aH -aN -aq -an -aq -aq -an -bF -bP -bH -bH -bH -bH -cJ -aq -aq -ao -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(111,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aO -aq -ba -aq -aq -an -bG -bQ -bP -bH -bH -bH -aq -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(112,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -aP -aq -an -aq -aq -an -bH -bR -ca -cn -cv -cn -an -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(113,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ao -aq -az -az -az -aq -an -aq -aq -an -an -an -an -an -an -an -an -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(114,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aq -aA -aI -aA -aq -an -aq -aq -aq -aq -aq -aH -aq -aq -aq -aq -aq -bh -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(115,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -ar -an -an -an -aU -an -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -aq -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(116,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -as -aB -aJ -an -an -an -bf -an -an -an -an -an -an -an -an -an -cM -cM -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(117,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -aX -bb -az -an -bj -bI -an -aq -aH -aq -cH -bu -az -az -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -av -aD -aL -aQ -az -az -az -an -bk -bJ -an -cb -co -cw -cH -bu -az -az -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -aw -aE -aL -an -aY -bc -bg -an -ar -an -an -cc -cp -cx -cH -aq -az -az -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -du -aF -aL -an -az -bd -az -an -aq -ay -an -cd -cq -cy -cH -bu -az -az -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -dv -ax -aM -an -aZ -be -az -bi -aq -bL -an -aq -aq -aq -cH -bu -az -cQ -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(122,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -an -an -an -an -an -ao -ao -ao -an -an -ao -an -an -ao -ao -ao -ao -ao -an -an -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(123,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(124,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(125,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cZ -cZ -cZ -de -de -de -de -de -de -dk -dk -cZ -cZ -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(126,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cZ -db -cZ -de -dk -de -dk -de -de -de -de -db -aG -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(127,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cY -cZ -cZ -cZ -dd -cZ -cZ -cZ -cZ -dd -cZ -cZ -cZ -db -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(128,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -cZ -df -df -df -df -dh -df -dg -df -cZ -dr -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(129,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -bK -dg -cZ -cZ -do -cZ -cZ -db -df -cZ -dr -dr -cY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(130,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -cZ -df -dl -cZ -db -cZ -dn -dq -df -cZ -dr -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(131,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -dc -cZ -df -cZ -dn -cZ -cZ -cZ -cZ -df -cZ -ds -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(132,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -dd -df -cZ -dl -cZ -db -cZ -db -df -cZ -dr -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(133,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -cZ -df -cZ -db -cZ -cZ -cZ -dl -df -cZ -dr -ds -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(134,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -dc -cZ -dh -cZ -cZ -dp -cZ -do -dp -dg -db -ds -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ac -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -da -da -cZ -df -dg -df -df -df -df -df -df -cZ -dr -dr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(136,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -ag -ah -aj -ak -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cY -cZ -cZ -cZ -db -cZ -cZ -aG -dd -cZ -cZ -cZ -cZ -cZ -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(137,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -aj -al -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cZ -aG -db -di -dm -di -di -di -dm -di -di -cZ -aG -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -ak -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cZ -cZ -cZ -di -di -di -dm -di -di -di -di -cZ -cZ -cZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(139,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -am -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(140,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -am -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -cY -ac -ac -ac -ac -ac -cY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(141,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -am -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(142,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -am -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(143,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ai -af -ak -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(144,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -af -ah -af -ak -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(145,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ad -af -ag -ah -af -ak -ad -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(146,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(147,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(148,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(149,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(150,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(151,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(152,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(153,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(154,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(155,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(156,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(157,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(158,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(159,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(160,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(161,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(162,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(163,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(164,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(165,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(166,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(167,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(168,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(169,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(170,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(171,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(172,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(173,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(174,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(175,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(188,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(189,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(190,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(191,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(192,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(193,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(194,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(201,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(206,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(209,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(211,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(212,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(213,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(214,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(215,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(216,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(217,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(218,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(219,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(220,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(221,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(222,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(223,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(224,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(225,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(226,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(227,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(228,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(229,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(230,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(231,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(232,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(233,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(234,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(235,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(236,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(238,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(239,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(240,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(241,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(242,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(243,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(244,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(245,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(246,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(247,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(248,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(249,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(250,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(251,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(252,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(253,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(254,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(255,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/away_mission/Academy.dmm similarity index 99% rename from _maps/RandomZLevels/Academy.dmm rename to _maps/RandomZLevels/away_mission/Academy.dmm index 97ebb80101..de0b7cc430 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/away_mission/Academy.dmm @@ -4322,7 +4322,7 @@ /turf/open/floor/plating/asteroid/snow, /area/awaymission/academy/academycellar) "mV" = ( -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /turf/open/floor/plating/asteroid/snow, /area/awaymission/academy/academycellar) "mW" = ( diff --git a/_maps/RandomZLevels/away_mission/SnowCabin.dmm b/_maps/RandomZLevels/away_mission/SnowCabin.dmm new file mode 100644 index 0000000000..90f1cb9b3a --- /dev/null +++ b/_maps/RandomZLevels/away_mission/SnowCabin.dmm @@ -0,0 +1,71074 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"ab" = ( +/turf/closed/indestructible/rock/snow, +/area/awaymission/cabin/caves/mountain) +"ac" = ( +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"ad" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin/lumbermill) +"ae" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"af" = ( +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ag" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"ah" = ( +/obj/structure/fence/door/opened, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"ai" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"aj" = ( +/turf/closed/indestructible/hotelwall{ + desc = "This wall looks stupid."; + name = "Purgatory" + }, +/area/awaymission/cabin/caves/mountain) +"ak" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"al" = ( +/obj/structure/table/wood, +/obj/structure/showcase/machinery/tv{ + desc = "A slightly battered looking TV. Various infomercials play on a loop, accompanied by a jaunty tune."; + name = "Television Screen" + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"am" = ( +/obj/structure/chair/comfy{ + color = "#B22222"; + dir = 8 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"an" = ( +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin) +"ao" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ap" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/awaymission/cabin) +"aq" = ( +/turf/open/floor/wood, +/area/awaymission/cabin) +"ar" = ( +/obj/machinery/door/airlock/command{ + name = "Manager's Office" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"as" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"at" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"au" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/cabin) +"av" = ( +/obj/machinery/telecomms/relay/preset/mining, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ax" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin) +"ay" = ( +/obj/machinery/light/small, +/obj/item/storage/backpack/bannerpack{ + pixel_y = 7 + }, +/obj/structure/dresser, +/turf/open/floor/wood, +/area/awaymission/cabin) +"az" = ( +/turf/open/floor/carpet, +/area/awaymission/cabin) +"aA" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/turf/open/floor/wood, +/area/awaymission/cabin) +"aB" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"aC" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"aD" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. It seems to be powered just fine without our intervention."; + name = "nanotrasen power storage unit" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aE" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/baseturf_helper/asteroid/snow, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"aF" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "cabin APC"; + pixel_y = 23 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aG" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"aH" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"aI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/cabin) +"aJ" = ( +/obj/structure/table, +/obj/item/surgicaldrill, +/obj/item/circular_saw, +/obj/item/cautery, +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/hemostat, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"aK" = ( +/obj/structure/table/optable, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"aL" = ( +/turf/open/floor/plating, +/area/awaymission/cabin) +"aM" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"aN" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"aO" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"aP" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + desc = "Contains a large reservoir of soft drinks so that you can refill your cup. For free."; + name = "free refill dispenser" + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"aQ" = ( +/obj/structure{ + anchored = 1; + density = 1; + desc = "Generates power from lava!"; + dir = 1; + icon = 'icons/obj/atmospherics/pipes/simple.dmi'; + icon_state = "compressor"; + name = "geothermal generator" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"aR" = ( +/obj/machinery/door/window/westright{ + name = "fireplace" + }, +/obj/structure/fireplace, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aS" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "sink"; + pixel_y = 28 + }, +/obj/structure/janitorialcart, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/obj/item/caution, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aT" = ( +/obj/machinery/door/window/eastleft{ + name = "fireplace" + }, +/obj/structure/fireplace, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aU" = ( +/obj/structure/fireplace, +/obj/machinery/door/window/westright{ + name = "fireplace" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aV" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/awaymission/cabin) +"aW" = ( +/obj/structure/fireplace, +/obj/machinery/door/window/eastleft{ + name = "fireplace" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"aX" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"aY" = ( +/obj/structure/table/wood, +/obj/item/phone, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"aZ" = ( +/obj/structure/guncase/shotgun, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"ba" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/wood/glass{ + name = "Cabin" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bb" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bc" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bd" = ( +/obj/structure/chair/office, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"be" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bf" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bg" = ( +/obj/machinery/door/window/westleft{ + name = "manager's desk" + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bh" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bi" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "WheresTheSyndiBalloon"; + name = "Manager's Bedroom" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bj" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bk" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bl" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bm" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "snowdinbutworse5"; + name = "Cabin 5" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bn" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bo" = ( +/obj/structure/window{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bp" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bq" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bs" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bt" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"bu" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bv" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bw" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"bx" = ( +/obj/machinery/smartfridge, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"by" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"bz" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "sink"; + pixel_y = 28 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"bA" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bB" = ( +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bC" = ( +/obj/machinery/gibber, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bD" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bE" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bF" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bG" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bH" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/obj/item/soap/nanotrasen{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bJ" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bK" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"bL" = ( +/obj/structure/bed, +/obj/item/bedsheet/nanotrasen, +/obj/item/clothing/suit/hooded/wintercoat/captain{ + name = "manager's winter coat" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bM" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bN" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bO" = ( +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"bP" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bQ" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"bS" = ( +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"bT" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/item/instrument/guitar, +/obj/item/instrument/violin, +/obj/item/instrument/accordion, +/obj/item/instrument/trumpet, +/obj/structure/closet/crate/wooden, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bU" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bV" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Garage" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"bW" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"bX" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"bY" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/processor, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"cb" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cc" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cd" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ce" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"cf" = ( +/obj/structure/table/wood, +/obj/item/toy/snowball, +/obj/item/toy/snowball{ + pixel_y = 8 + }, +/obj/item/toy/snowball{ + pixel_x = 8 + }, +/obj/item/toy/snowball{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/toy/snowball{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/toy/snowball{ + pixel_x = -5; + pixel_y = -2 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"cg" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"ch" = ( +/obj/structure/flora/stump{ + desc = "Breaking it should be easy."; + max_integrity = 20; + name = "old stump" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"ci" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cj" = ( +/obj/structure/table, +/obj/item/clothing/suit/hooded/wintercoat/hydro{ + name = "service winter coat"; + pixel_y = 4 + }, +/obj/item/clothing/suit/hooded/wintercoat/hydro{ + name = "service winter coat"; + pixel_y = 4 + }, +/obj/item/clothing/suit/hooded/wintercoat/hydro{ + name = "service winter coat"; + pixel_y = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"ck" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"cl" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"cm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"cn" = ( +/turf/open/lava, +/area/awaymission/cabin/caves/mountain) +"co" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cp" = ( +/obj/machinery/gateway/centeraway, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cq" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cr" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin) +"cs" = ( +/obj/structure/table/wood, +/obj/item/wrench, +/obj/item/soap, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ct" = ( +/obj/structure/sign/poster/official/soft_cap_pop_art{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cu" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"cv" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"cw" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cx" = ( +/obj/machinery/gateway, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cy" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cz" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/musician/piano, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cA" = ( +/obj/machinery/door/airlock/wood{ + name = "Stage Left" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cB" = ( +/obj/machinery/door/window/eastleft, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cD" = ( +/obj/structure/sign/barsign{ + pixel_y = -32; + req_access = null + }, +/obj/machinery/door/window/westleft{ + name = "Bar" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cE" = ( +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/snowforest) +"cF" = ( +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"cG" = ( +/obj/structure/closet/secure_closet/freezer/meat/open, +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat, +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat, +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat, +/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"cH" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cI" = ( +/obj/structure/chair/office/light, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"cJ" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 8 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"cK" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/sillycup/smallcarton{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"cM" = ( +/obj/machinery/door/airlock/wood{ + name = "Gateway" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"cN" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"cO" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"cP" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"cQ" = ( +/obj/effect/landmark/awaystart, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"cR" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"cS" = ( +/obj/machinery/button/door{ + id = "garage_cabin"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"cT" = ( +/obj/vehicle/ridden/atv, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/awaymission/cabin) +"cU" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"cV" = ( +/obj/vehicle/ridden/atv, +/turf/open/floor/plating, +/area/awaymission/cabin) +"cW" = ( +/obj/item/shovel, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/awaymission/cabin) +"cX" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/awaymission/cabin) +"cY" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"cZ" = ( +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"da" = ( +/obj/structure/chair, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"db" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dc" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka{ + desc = "A fancy bottle of vodka. The name isn't in Galactic Common though."; + name = "Porosha Vodka" + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dd" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle{ + desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for making it harder to get dragged into the ring."; + name = "announcer seat" + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"de" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"df" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dh" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"di" = ( +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dj" = ( +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/snowforest) +"dk" = ( +/obj/structure/chair, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dl" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dm" = ( +/obj/structure/table/reinforced, +/obj/item/pda/syndicate{ + background_color = "#0039A6"; + default_cartridge = /obj/item/cartridge/virus/mime; + desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it."; + name = "soviet PDA"; + note = "TRANSLATED TO GALACTIC COMMON:
My partner has left to help those Nanotrasen fucks three days ago. They said that a distress signal came from down south and they had to check it out. How fucking long does it take to investigate a mining outpost? Either those Nanotrasen fuckers betrayed us or something really did go wrong. Either way, I'm leaving before this becomes an issue for me and anyone else here. That dumb idiot." + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dn" = ( +/obj/structure/table/reinforced, +/obj/item/megaphone/sec{ + name = "soviet megaphone" + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"do" = ( +/obj/structure/table/reinforced, +/obj/item/cigbutt/cigarbutt, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dp" = ( +/obj/machinery/vending/sovietsoda, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dq" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dr" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/reagent_containers/pill/patch/styptic, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ds" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dt" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/food/condiment/mayonnaise, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"du" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"dv" = ( +/obj/structure{ + anchored = 1; + density = 1; + desc = "Generates power from lava!"; + icon = 'icons/obj/atmospherics/pipes/simple.dmi'; + icon_state = "turbine"; + name = "geothermal generator" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"dw" = ( +/mob/living/simple_animal/hostile/bear/snow{ + desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; + melee_damage_lower = 10; + melee_damage_upper = 20; + name = "fat space polar bear"; + speed = 3 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dx" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"dy" = ( +/obj/structure/fence/door, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"dz" = ( +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"dA" = ( +/turf/closed/wall/ice, +/area/awaymission/cabin/snowforest) +"dB" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin) +"dC" = ( +/obj/structure/fence, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"dD" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"dE" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dF" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dG" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dH" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"dI" = ( +/obj/structure/table, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dJ" = ( +/obj/structure/kitchenspike, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dK" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dL" = ( +/obj/structure/fence/door/opened, +/obj/structure/barricade/wooden/crude/snow, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"dM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dN" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"dO" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dP" = ( +/obj/item/shard, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dQ" = ( +/obj/item/lighter/greyscale, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dR" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dS" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dT" = ( +/obj/item/broken_bottle, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dU" = ( +/obj/item/chair, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dV" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dW" = ( +/obj/item/reagent_containers/pill/patch/styptic, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"dX" = ( +/mob/living/simple_animal/pet/penguin/emperor, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/snowforest) +"dY" = ( +/mob/living/simple_animal/pet/penguin/baby, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/snowforest) +"dZ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/mob/living/simple_animal/hostile/bear/snow{ + desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; + melee_damage_lower = 10; + melee_damage_upper = 20; + name = "fat space polar bear"; + speed = 3 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ea" = ( +/obj/item/reagent_containers/food/snacks/carpmeat, +/obj/item/reagent_containers/food/snacks/carpmeat, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/snowforest) +"eb" = ( +/obj/structure/closet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ec" = ( +/obj/machinery/light, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"ed" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ee" = ( +/obj/machinery/light, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"ef" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"eg" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"eh" = ( +/obj/machinery/door/airlock/wood/glass, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ei" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ej" = ( +/obj/structure/chair/wood, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"ek" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/snowforest) +"el" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin) +"em" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"en" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin) +"eo" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ep" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin) +"eq" = ( +/obj/machinery/door/poddoor/shutters{ + id = "garage_cabin"; + name = "garage door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin) +"er" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin) +"es" = ( +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"et" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"eu" = ( +/obj/structure/table/wood/fancy, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ev" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/rag, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ew" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ex" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ey" = ( +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin/snowforest) +"ez" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eA" = ( +/obj/structure/table/wood, +/obj/item/twohanded/required/chainsaw, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"eB" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"eC" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eD" = ( +/obj/structure/bonfire/dense{ + desc = "Multiple logs thrown together into a pile hastily. Let's burn it for fun!."; + name = "pile of logs" + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eE" = ( +/obj/structure/table/wood, +/obj/item/grown/log/tree{ + pixel_x = -7 + }, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree{ + pixel_x = 7 + }, +/obj/item/grown/log/tree{ + pixel_x = 14 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eF" = ( +/obj/structure/table/wood, +/obj/item/grown/log/tree{ + pixel_x = -7 + }, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree{ + pixel_x = 7 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eG" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"eH" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/lumbermill) +"eI" = ( +/obj/effect/turf_decal/stripes/red/corner, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eJ" = ( +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eK" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eL" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eM" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eN" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/awaymission/cabin) +"eO" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass3"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"eP" = ( +/obj/structure/chair/sofa, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"eQ" = ( +/obj/structure/table/wood, +/obj/item/phone{ + desc = "If I forgot where the gateway was then I can just call the station with this phone! Wait, where's the phone lines?"; + name = "phone" + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"eR" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/full, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/lumbermill) +"eS" = ( +/obj/machinery/recycler/lumbermill{ + desc = "Is better at killing people than cutting logs, for some reason." + }, +/obj/machinery/conveyor{ + dir = 4; + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/full, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/lumbermill) +"eT" = ( +/obj/structure/closet/crate/wooden{ + anchored = 1 + }, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/lumbermill) +"eU" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eV" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eW" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/item/wrench, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eX" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"eY" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"eZ" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"fa" = ( +/obj/structure/fence, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"fb" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"fc" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"fd" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"fe" = ( +/obj/structure/table/wood, +/obj/item/shovel, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ff" = ( +/obj/structure/table/wood, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"fg" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fh" = ( +/obj/structure{ + anchored = 1; + desc = "It is a ghostly cat."; + icon = 'icons/mob/mob.dmi'; + icon_state = "catghost"; + layer = 3; + max_integrity = 66666; + name = "Cat" + }, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fi" = ( +/obj/item/trash/can, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"fj" = ( +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fk" = ( +/obj/item/reagent_containers/food/snacks/burger/ghost{ + desc = "I killed a burger for you. Hope you're grateful, bastards."; + pixel_x = -2; + pixel_y = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fl" = ( +/turf/open/floor/carpet, +/area/awaymission/cabin/caves/mountain) +"fm" = ( +/turf/open/chasm{ + desc = "I told you that you can't get past those doors."; + name = "anti-fun pit" + }, +/area/awaymission/cabin/caves/mountain) +"fn" = ( +/obj/structure/table/wood/poker{ + desc = "I bought this for, like, one hundred space credits."; + name = "cheap and fancy table" + }, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fo" = ( +/obj/structure/table/wood/poker{ + desc = "I bought this for, like, one hundred space credits."; + name = "cheap and fancy table" + }, +/obj/structure/showcase/machinery/tv{ + desc = "Up next after these commercials, the season premiere of Ghost Court will be on."; + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "wooden_tv"; + light_range = 8; + name = "Ghastly Entertainment Device" + }, +/turf/open/floor/wood, +/area/awaymission/cabin/caves/mountain) +"fp" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/cabin/caves/mountain) +"fq" = ( +/obj/structure/sign/poster/contraband/fun_police, +/turf/closed/indestructible/riveted, +/area/awaymission/cabin/caves/mountain) +"fr" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fs" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"ft" = ( +/obj/structure/filingcabinet/security, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fu" = ( +/obj/machinery/computer/prisoner{ + desc = "Used to manage tracking implants placed inside criminals and the prison cells."; + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fv" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/ladder/unbreakable/rune{ + alpha = 0; + color = "#000000"; + desc = "Examining things is a good idea after all."; + height = 1; + id = "TheRealSecretPlace"; + name = "\improper Tear In The Fabric of Reality" + }, +/obj/structure/sign/plaques/golden{ + desc = "Holding the record for about 500 years now."; + name = "The Most Annoying Organization Ever"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fx" = ( +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fy" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fz" = ( +/obj/structure/filingcabinet/security, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fA" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fB" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fC" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fD" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/snowforest) +"fE" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fF" = ( +/obj/machinery/vending/sustenance{ + desc = "A vending machine which vends food."; + name = "\improper Snack Machine"; + product_ads = "Sufficiently healthy.;Mmm! So good!;Have a meal.;You need food to live!"; + product_slogans = "Enjoy your meal." + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fI" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fK" = ( +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fM" = ( +/turf/closed/indestructible/fakedoor{ + desc = "It looks like there really is no way out this time."; + name = "Cell Block Y8" + }, +/area/awaymission/cabin/caves/mountain) +"fN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fQ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fS" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fT" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"fV" = ( +/turf/closed/indestructible/fakeglass, +/area/awaymission/cabin/caves/mountain) +"fW" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7210" + }, +/area/awaymission/cabin/caves/mountain) +"fX" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7211" + }, +/area/awaymission/cabin/caves/mountain) +"fY" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7212" + }, +/area/awaymission/cabin/caves/mountain) +"fZ" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile{ + desc = "Enjoy the view."; + name = "window" + }, +/turf/open/floor/plating, +/area/awaymission/cabin/caves/mountain) +"ga" = ( +/mob/living/simple_animal/hostile/bear/snow{ + desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; + melee_damage_lower = 10; + melee_damage_upper = 20; + name = "fat space polar bear"; + speed = 3; + wander = 0 + }, +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"gb" = ( +/obj/machinery/door/airlock/centcom{ + desc = "Look at what you have done."; + max_integrity = 2000; + name = "Jail Cell 7213" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gc" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7214" + }, +/area/awaymission/cabin/caves/mountain) +"gd" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7215" + }, +/area/awaymission/cabin/caves/mountain) +"ge" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7216" + }, +/area/awaymission/cabin/caves/mountain) +"gf" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Jail."; + name = "Jail Cell 7217" + }, +/area/awaymission/cabin/caves/mountain) +"gg" = ( +/obj/structure/weightmachine/stacklifter, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gh" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gi" = ( +/obj/item/toy/spinningtoy{ + anchored = 1; + desc = "He keeps breaking out somehow due to the help of cultists that utilize cargo shipments or atmospherical sabotage." + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gj" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gk" = ( +/obj/item/gun/ballistic/automatic/toy{ + anchored = 1; + desc = "Don't try it."; + name = "Nanotrasen Saber SMG" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gl" = ( +/obj/structure/sign/poster/contraband/free_drone{ + desc = "This poster is just really ironic right now." + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gn" = ( +/obj/structure/ladder/unbreakable/rune{ + alpha = 0; + color = "#000000"; + desc = "It is time to bust out of this joint"; + height = 1; + id = "whatkindofnerdusesmapmakertocheattheirwaytoateleportrune"; + mouse_opacity = 0; + name = "\improper secret escape route" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"go" = ( +/obj/structure/easel{ + desc = "Art so fine, the universe can't handle it!"; + name = "Canvas Art" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gp" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/nullrod/claymore/multiverse{ + anchored = 1; + force = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gq" = ( +/obj/structure/fluff/empty_sleeper{ + desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not LOCKED BEHIND BARS!!!"; + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/showcase/mecha/marauder{ + desc = "Used by vigilantes to fight the ruffians causing trouble in neighborhoods and space stations"; + icon_state = "seraph"; + name = "gang warfare seraph" + }, +/turf/open/indestructible, +/area/awaymission/cabin/caves/mountain) +"gs" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gt" = ( +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gw" = ( +/obj/structure/punching_bag, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/cabin/caves/mountain) +"gx" = ( +/turf/closed/indestructible/rock/snow/ice, +/area/awaymission/cabin/caves/mountain) +"gy" = ( +/obj/structure/barricade/wooden/crude{ + desc = "Buffing things is illegal for it causes fun." + }, +/turf/closed/indestructible/fakedoor{ + desc = "The room for buffing things."; + name = "Exercise Room" + }, +/area/awaymission/cabin/caves/mountain) +"gz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/structure/signpost/salvation{ + density = 0; + desc = "An intercomm. Someone seems to be on the other end. I should use it."; + icon = 'icons/obj/radio.dmi'; + icon_state = "intercom"; + max_integrity = 99999; + name = "\proper Fun Jail intercom"; + pixel_y = 32; + question = "We have a case of fun happening. Get out there and do your job." + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/official/space_cops{ + pixel_y = 32 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gC" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/rock/snow/ice, +/area/awaymission/cabin/caves/mountain) +"gD" = ( +/turf/open/chasm{ + color = "#000000"; + desc = "Leave this place, insect."; + name = "Abyss" + }, +/area/awaymission/cabin/caves/mountain) +"gE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/reagent_containers/food/snacks/egg/rainbow{ + desc = "Was an egg really worth this much effort?"; + name = "easter egg" + }, +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/banhammer{ + desc = "I'm sorry, sir, but fun actions are illegal."; + name = "fun baton" + }, +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"gG" = ( +/turf/closed/indestructible{ + icon = 'icons/turf/floors.dmi'; + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gH" = ( +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gI" = ( +/obj/structure/signpost/salvation{ + desc = "Come closer, insect."; + icon = 'icons/mob/nest.dmi'; + icon_state = "nether"; + max_integrity = 99999; + name = "\proper Netherworld Link"; + question = "You have come far, insect. Farther than most. While I could keep you for an eternity, I would prefer some peace and quiet right now. Now, insect, offer yourself to me." + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gJ" = ( +/obj/structure{ + alpha = 100; + anchored = 1; + desc = "It is impossible to comprehend such a thing"; + icon = 'icons/mob/mob.dmi'; + icon_state = "shadowling_ascended"; + max_integrity = 66666; + mouse_opacity = 0; + name = "Ascension" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gK" = ( +/obj/item/book_of_babel{ + desc = "Finally, a tome that seems actually fucking useful here.
I'm losing my mind here.
Why did I come here?

I'm not myself anymore, am I?"; + icon_state = "bookblind"; + name = "Unknown Tome" + }, +/turf/closed/indestructible{ + icon = 'icons/turf/floors.dmi'; + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/awaymission/cabin) +"gM" = ( +/obj/structure/closet, +/obj/effect/decal/cleanable/dirt, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"gN" = ( +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/awaymission/cabin) +"gO" = ( +/obj/structure/fence/door{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"gP" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"gQ" = ( +/obj/item/storage/book/bible{ + deity_name = "The Holy Lord Above"; + desc = "There is no salvation here."; + icon_state = "burning"; + name = "Holy Tome" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gR" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass2"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"gS" = ( +/obj/item/storage/book/bible{ + deity_name = "THE VOICES IN MY HEAD"; + desc = "There are some things that you can not get.
I had more faith in you than that.
"; + icon_state = "scrapbook"; + name = "Insane Tome" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gT" = ( +/obj/structure/ladder/unbreakable/rune{ + alpha = 0; + color = "#000000"; + desc = "EXAMINING THAT WAS A MISTAKE!"; + icon_state = "7"; + id = "TheRealSecretPlace"; + light_range = 10; + mouse_opacity = 0; + name = "\improper void" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gU" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass_sw"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"gV" = ( +/obj/item/storage/book/bible{ + deity_name = "Cthulhu"; + desc = "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn."; + icon_state = "necronomicon"; + name = "Elder Tome" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"gW" = ( +/obj/structure/flora/tree/dead, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"gX" = ( +/obj/structure/flora/stump{ + desc = "Breaking it should be easy."; + max_integrity = 20; + name = "old stump" + }, +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"gY" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/hooded/wintercoat/hydro, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/head/hardhat, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"gZ" = ( +/obj/item/chair/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ha" = ( +/obj/structure/chair/wood/wings{ + name = "dealer chair" + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hb" = ( +/obj/structure/table/wood/fancy, +/obj/item/coin{ + desc = "Looks old."; + pixel_x = 4; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hc" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hd" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"he" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hf" = ( +/obj/machinery/space_heater, +/obj/effect/decal/remains/robot, +/obj/structure/sign/warning/fire{ + pixel_y = 32 + }, +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hg" = ( +/obj/machinery/door/airlock/maintenance{ + name = "janitor closet" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hh" = ( +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hi" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"hj" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hk" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hl" = ( +/obj/structure/sign/poster/official/here_for_your_safety{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hm" = ( +/obj/machinery/door/airlock/wood{ + name = "Gateway" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hn" = ( +/obj/structure/sign/poster/official/high_class_martini{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ho" = ( +/obj/item/wrench/medical, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"hp" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"hq" = ( +/obj/machinery/vending/medical, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"hr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/generic, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/contraband/missing_gloves{ + pixel_x = 32 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ht" = ( +/obj/structure/window{ + dir = 4 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hu" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/cold, +/obj/item/clothing/glasses/cold, +/obj/item/clothing/glasses/cold, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hv" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/welding{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hw" = ( +/obj/structure/closet/toolcloset, +/obj/item/lightreplacer, +/obj/item/storage/toolbox/mechanical, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/awaymission/cabin) +"hx" = ( +/obj/machinery/door/airlock/wood{ + name = "Stage Right" + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hy" = ( +/obj/machinery/door/airlock/maintenance{ + name = "heater storage" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/cabin) +"hz" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/cabin) +"hA" = ( +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"hB" = ( +/obj/machinery/door/airlock{ + name = "Backstage" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hC" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hD" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"hE" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hG" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"hH" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hI" = ( +/obj/effect/landmark/awaystart, +/obj/structure/sign/poster/official/report_crimes{ + pixel_y = -32 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"hJ" = ( +/obj/item/storage/book/bible{ + deity_name = "Netherworld"; + desc = "Suffering and pain waits for you.
Death will not be your end for, with every step you take, your soul moves closer to me.
Your darkest fears will soon be realized.
There is nowhere to run, for I am everywhere.
"; + icon_state = "tome"; + name = "Void Tome" + }, +/turf/open/indestructible{ + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"hK" = ( +/obj/item/storage/book/bible{ + deity_name = "Greytide"; + desc = "Hey, I'm not actually a spooky book. Can you help me find my toolbox? Thanks."; + icon_state = "insuls"; + name = "Mortal Tome" + }, +/turf/closed/indestructible{ + icon = 'icons/turf/floors.dmi'; + icon_state = "black"; + name = "void" + }, +/area/awaymission/cabin/caves/mountain) +"hL" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/snow, +/area/awaymission/cabin/caves/mountain) +"hM" = ( +/turf/closed/wall/mineral/snow, +/area/awaymission/cabin/caves/mountain) +"hN" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"hO" = ( +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"hP" = ( +/obj/item/candle/infinite, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"hQ" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"hR" = ( +/obj/structure/reagent_dispensers/beerkeg{ + desc = "Hey, Centcom, we located our complimentary case of space beer! The pamphlet didn't lie!"; + name = "complimentary keg of space beer" + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"hS" = ( +/mob/living/simple_animal/hostile/tree{ + desc = "I am death. I will have my vengeance upon my enemies."; + melee_damage_upper = 8; + wander = 0 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"hT" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"hU" = ( +/obj/item/toy/figure/clown{ + desc = "Shut up, we don't talk about him."; + name = "exploration squad Clown" + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"hV" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "Who" + }, +/obj/item/clothing/head/helmet/knight/yellow{ + armor = list("melee" = 11, "bullet" = 2, "laser" = 1, "energy" = 1, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 10); + desc = "A classic metal helmet. The cold has made it unreliable though."; + name = "old medieval helmet"; + pixel_y = 7 + }, +/obj/item/claymore/weak/ceremonial{ + desc = "Brought to you by the guys in charge of making replica katana toys!"; + force = 1; + layer = 3.01; + name = "replica claymore"; + pixel_x = 5; + pixel_y = 8; + throwforce = 2 + }, +/obj/item/shield/riot/roman/fake{ + layer = 3.01; + pixel_x = -7 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"hW" = ( +/obj/item/toy/figure/borg{ + desc = "The robot that was manufactured just for this exploration team."; + name = "exploration squad Cyborg"; + pixel_x = 8; + toysay = "I. AM. ALIVE." + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"hX" = ( +/obj/item/clothing/suit/armor/vest/russian_coat{ + pixel_x = 16; + pixel_y = 16 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"hY" = ( +/obj/effect/decal/cleanable/blood/gibs, +/obj/item/reagent_containers/pill/patch/styptic, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"hZ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ia" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/shard/plasma, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ib" = ( +/obj/item/hatchet, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ic" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/trash/popcorn{ + pixel_y = 12 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"id" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ie" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"if" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ig" = ( +/obj/item/toy/figure/dsquad{ + desc = "The muscle behind the exploration team. May or may not be a secret soldier depending on the mood of Nanotrasen following their own lore."; + name = "exploration squad Officer"; + toysay = "We're top secret until we're not!" + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"ih" = ( +/obj/item/toy/figure/md{ + desc = "The doctor that got volunteered to join the exploration team."; + name = "exploration squad Medic"; + pixel_x = -8; + toysay = "Guess I'll be useless until stuns are involved!" + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"ii" = ( +/turf/closed/indestructible/syndicate, +/area/awaymission/cabin/caves/sovietcave) +"ij" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ik" = ( +/obj/structure/door_assembly/door_assembly_vault{ + anchored = 1; + name = "vault door" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"il" = ( +/obj/item/toy/prize/deathripley{ + desc = "The mining mecha of the exploration team."; + name = "exploraton squad Ripley"; + pixel_y = 15 + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"im" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"in" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"io" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -24 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ip" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/hatch, +/obj/structure/barricade/wooden, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"iq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/simple_animal/hostile/hivebot/range{ + desc = "Looks like he's been left behind."; + faction = list("russian"); + maxHealth = 5; + name = "soviet machine" + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"ir" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/barricade/sandbags, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"is" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/reagent_containers/food/condiment/enzyme, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"it" = ( +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"iu" = ( +/obj/item/grenade/barrier{ + pixel_x = -14; + pixel_y = 14 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"iv" = ( +/turf/closed/wall/mineral/snow, +/area/awaymission/cabin/caves) +"iw" = ( +/obj/structure/floodlight_frame, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"ix" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"iy" = ( +/obj/item/paper/pamphlet/gateway, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"iz" = ( +/turf/closed/wall/ice, +/area/awaymission/cabin/caves) +"iA" = ( +/obj/structure/frame/machine, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iB" = ( +/obj/structure/frame/computer, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iC" = ( +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iD" = ( +/obj/structure/closet/acloset, +/obj/item/clothing/suit/hooded/bloated_human, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iE" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"iF" = ( +/obj/item/shovel{ + desc = "A large tool for digging and moving snow."; + force = 10; + name = "eskimo shovel" + }, +/obj/effect/decal/remains/human{ + color = "#72e4fa" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"iG" = ( +/obj/structure/fluff/iced_abductor, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iH" = ( +/obj/structure/table/glass, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iI" = ( +/obj/structure/closet/acloset, +/obj/item/toy/foamblade, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iJ" = ( +/obj/structure/bed/alien, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"iK" = ( +/obj/structure/flora/rock/icy{ + desc = "A mountain rock." + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"iL" = ( +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"iM" = ( +/turf/open/floor/wood, +/area/awaymission/cabin/caves) +"iN" = ( +/obj/machinery/icecream_vat, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"iO" = ( +/obj/structure/chair, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"iP" = ( +/obj/structure/sign/picture_frame{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/awaymission/cabin/caves) +"iQ" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/cabin/caves) +"iR" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = -7; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iS" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = 7; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iT" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iU" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/mug/coco{ + desc = "Still hot!"; + pixel_x = 7; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iV" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "snowdinbutworse1"; + name = "Cabin 1" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iW" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "snowdinbutworse2"; + name = "Cabin 2" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iX" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "snowdinbutworse3"; + name = "Cabin 3" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iY" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "snowdinbutworse4"; + name = "Cabin 4" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/wood, +/area/awaymission/cabin) +"iZ" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity10" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"ja" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity20" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"jb" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity30" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"jc" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity40" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"jd" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity50" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"je" = ( +/obj/structure/window/reinforced/fulltile/ice{ + name = "frozen window" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "fightingcommunity60" + }, +/turf/open/floor/plating, +/area/awaymission/cabin) +"jf" = ( +/obj/machinery/button/door{ + id = "fightingcommunity60"; + name = "shutter button"; + pixel_x = -8; + pixel_y = 30 + }, +/obj/machinery/button/door{ + id = "WheresTheSyndiBalloon"; + name = "airlock button"; + pixel_x = 8; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jg" = ( +/obj/machinery/button/door{ + id = "snowdinbutworse2"; + name = "airlock button"; + pixel_y = -27 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jh" = ( +/obj/machinery/button/door{ + id = "snowdinbutworse1"; + name = "airlock button"; + pixel_y = -27 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ji" = ( +/obj/machinery/button/door{ + id = "snowdinbutworse3"; + name = "airlock button"; + pixel_y = -27 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jj" = ( +/obj/machinery/button/door{ + id = "snowdinbutworse4"; + name = "airlock button"; + pixel_y = -27 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jk" = ( +/obj/machinery/button/door{ + id = "snowdinbutworse5"; + name = "airlock button"; + pixel_y = -27 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jl" = ( +/obj/machinery/button/door{ + id = "fightingcommunity10"; + name = "shutter button"; + pixel_x = -28; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jm" = ( +/obj/machinery/button/door{ + id = "fightingcommunity20"; + name = "shutter button"; + pixel_x = 28; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jn" = ( +/obj/machinery/button/door{ + id = "fightingcommunity30"; + name = "shutter button"; + pixel_x = -28; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jo" = ( +/obj/machinery/button/door{ + id = "fightingcommunity40"; + name = "shutter button"; + pixel_x = 28; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jp" = ( +/obj/machinery/button/door{ + id = "fightingcommunity50"; + name = "shutter button"; + pixel_x = -28; + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jq" = ( +/obj/item/clothing/suit/hooded/wintercoat/medical{ + pixel_y = 3 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/hooded/wintercoat/medical{ + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/cryoxadone, +/obj/item/reagent_containers/glass/bottle/cryoxadone, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"jr" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/neck/scarf/zebra, +/turf/open/floor/wood, +/area/awaymission/cabin) +"js" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/fire, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"jt" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/neck/scarf/christmas, +/turf/open/floor/wood, +/area/awaymission/cabin) +"ju" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/neck/stripedbluescarf, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jv" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/neck/stripedgreenscarf, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jw" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/cabinet{ + anchored = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/neck/stripedredscarf, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jx" = ( +/obj/structure/table/wood/poker, +/obj/item/dice/d6{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"jy" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/bottle/wine{ + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jz" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/red, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jA" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = -7 + }, +/obj/item/folder/blue{ + pixel_x = 7 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jB" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jC" = ( +/obj/machinery/door/airlock/engineering{ + name = "Generator Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"jD" = ( +/obj/structure/table/wood, +/obj/item/clothing/mask/gas/explorer, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jE" = ( +/obj/structure/closet/crate/bin, +/obj/item/tank/internals/emergency_oxygen/engi/empty, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"jF" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/tray, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jG" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/pistachios, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/can, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jI" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jJ" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/cheesie, +/turf/open/floor/wood, +/area/awaymission/cabin) +"jK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mine/stun, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"jL" = ( +/obj/structure/table/wood, +/obj/machinery/plantgenes{ + name = "tree DNA manipulator"; + pixel_y = 5 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jM" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"jO" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jP" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jQ" = ( +/obj/structure/table/wood, +/obj/structure/sign/warning/nosmoking/circle{ + pixel_x = -16; + pixel_y = 32 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jR" = ( +/obj/structure/table/wood, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = 7; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = -7; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = -3; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = 3; + throwforce = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jS" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/brute, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jT" = ( +/obj/structure/table/wood, +/obj/item/radio/off{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jU" = ( +/obj/structure/chair/wood, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jV" = ( +/mob/living/simple_animal/bot/firebot, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jW" = ( +/obj/structure/table/wood, +/obj/item/gun/energy/floragun, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jX" = ( +/obj/structure/table/wood, +/obj/item/pizzabox/vegetable{ + pixel_x = -6; + pixel_y = 12 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jY" = ( +/obj/structure/table/wood, +/obj/item/razor{ + pixel_y = 3 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"jZ" = ( +/obj/structure/table/wood, +/obj/item/extinguisher{ + pixel_x = -7; + pixel_y = 3 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ka" = ( +/obj/structure/table/wood, +/obj/item/extinguisher, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kb" = ( +/obj/structure/table/wood, +/obj/item/flashlight{ + pixel_x = 4; + pixel_y = 6 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kc" = ( +/obj/structure/table/wood, +/obj/item/flashlight{ + pixel_y = 2 + }, +/obj/item/flashlight{ + pixel_y = 15 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kd" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/construction{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 3 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"ke" = ( +/obj/structure/table/wood, +/obj/item/restraints/legcuffs/beartrap{ + pixel_y = 7 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kf" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kg" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin) +"kh" = ( +/obj/structure/flora/rock/icy{ + desc = "A mountain rock." + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/snowforest) +"ki" = ( +/turf/open/floor/wood/cold, +/area/awaymission/cabin/caves) +"kj" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/awaymission/cabin/caves) +"kk" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/wood, +/area/awaymission/cabin) +"kl" = ( +/obj/structure/bonfire, +/turf/open/floor/plating, +/area/awaymission/cabin/caves) +"km" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/awaymission/cabin/caves) +"kn" = ( +/obj/structure/sign/basic{ + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"ko" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken" + }, +/area/awaymission/cabin/caves) +"kp" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken4" + }, +/area/awaymission/cabin/caves) +"kq" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken5" + }, +/area/awaymission/cabin/caves) +"kr" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken3" + }, +/area/awaymission/cabin/caves) +"ks" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken2" + }, +/area/awaymission/cabin/caves) +"kt" = ( +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"ku" = ( +/turf/open/floor/wood/cold{ + icon_state = "wood-broken7" + }, +/area/awaymission/cabin/caves) +"kv" = ( +/obj/structure/barricade/wooden/snowed, +/obj/structure/barricade/wooden/crude/snow, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kw" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"kx" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ky" = ( +/obj/structure/flora/stump{ + desc = "Breaking it should be easy."; + max_integrity = 20; + name = "old stump" + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kz" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "What" + }, +/obj/item/clothing/head/wizard/fake{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/item/staff{ + layer = 3.01 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kA" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/snowforest) +"kB" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "I Don't Know" + }, +/obj/item/gun/magic/wand{ + desc = "It's just a fancy staff so that holy clerics and priests look cool. What? You didn't think someone would leave a REAL magic artifact with a snowman out in the cold, did you?"; + icon_state = "revivewand"; + layer = 3.01; + name = "holy staff"; + pixel_y = -2 + }, +/obj/item/clothing/head/christmashatg{ + pixel_y = 12; + pixel_x = 3 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kC" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "Because" + }, +/obj/item/clothing/head/scarecrow_hat{ + desc = "A replica straw hat that isn't actually made out of straw"; + name = "synthetic straw hat"; + pixel_x = -1; + pixel_y = 10 + }, +/obj/item/gun/ballistic/shotgun/toy/unrestricted{ + pixel_y = -2 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kD" = ( +/obj/structure/table/wood, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = 7; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = -7; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = -3; + throwforce = 4 + }, +/obj/item/hatchet{ + desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; + force = 4; + name = "weak hatchet"; + pixel_x = 3; + throwforce = 4 + }, +/obj/structure/sign/warning/nosmoking/circle{ + pixel_x = 16; + pixel_y = -32 + }, +/turf/open/floor/wood/cold, +/area/awaymission/cabin/lumbermill) +"kE" = ( +/obj/structure/closet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plating, +/area/awaymission/cabin) +"kF" = ( +/obj/structure/barricade/sandbags, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/assembly/infra, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kJ" = ( +/obj/effect/decal/hammerandsickle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/head/helmet/rus_ushanka, +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/sandbags, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"kN" = ( +/turf/open/floor/plating, +/area/awaymission/cabin/caves/sovietcave) +"kO" = ( +/obj/item/bear_armor, +/turf/open/floor/plating, +/area/awaymission/cabin/caves/sovietcave) +"kP" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + name = "Why" + }, +/obj/item/clothing/head/bandana{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/item/throwing_star{ + desc = "I better not rely on this being useful."; + force = 1; + name = "frozen throwing star"; + throwforce = 1 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kQ" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kR" = ( +/obj/structure/sign/warning/explosives, +/turf/closed/indestructible/syndicate, +/area/awaymission/cabin/caves/sovietcave) +"kS" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kT" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kU" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kV" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kW" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kX" = ( +/obj/structure/ladder/unbreakable/rune{ + desc = "Get me out of this boring room."; + height = 1; + icon_state = "hierophant"; + id = "GETMEOUTOFHEREYOUFUCKS"; + name = "\improper Return Rune" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kY" = ( +/obj/effect/decal/remains/human, +/obj/item/shovel, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"kZ" = ( +/obj/structure/sign/warning, +/turf/closed/indestructible/syndicate, +/area/awaymission/cabin/caves/sovietcave) +"la" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/crowbar/large, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lb" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"lc" = ( +/turf/closed/indestructible/fakedoor{ + desc = "I can't get past this."; + name = "Reinforced Soviet Hatch" + }, +/area/awaymission/cabin/caves/sovietcave) +"ld" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"le" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lf" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lg" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lh" = ( +/obj/effect/decal/remains/human, +/obj/item/reagent_containers/spray/pepper/empty, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"li" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lj" = ( +/obj/effect/decal/remains/xeno, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lk" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ll" = ( +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lm" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ln" = ( +/obj/item/weldingtool/mini, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lo" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lp" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lq" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/mob/living/simple_animal/hostile/statue{ + desc = "Just a snowman. Just a snowman. Oh god, it's just a snowman."; + faction = list("statue","mining"); + health = 5000; + icon_dead = "snowman"; + icon_living = "snowman"; + icon_state = "snowman"; + loot = list(/obj/item/dnainjector/geladikinesis); + maxHealth = 5000; + melee_damage_lower = 65; + melee_damage_upper = 65; + name = "Frosty" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lr" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/kitchen/knife/carrotshiv, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ls" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/melee/baseball_bat, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lt" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lu" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lv" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lw" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/item/clothing/head/helmet/skull{ + armor = list("melee" = 15, "bullet" = 5, "laser" = 5, "energy" = 2, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 20, "acid" = 20); + desc = "It's not bloody for some reason. Dear god."; + name = "human skull" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lx" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ly" = ( +/obj/item/chair/stool, +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lz" = ( +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"lA" = ( +/obj/effect/decal/cleanable/glitter/blue{ + desc = "It looks like fancy glitter to me."; + name = "icy wind" + }, +/obj/effect/decal/remains/xeno/larva, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lB" = ( +/obj/structure/statue/snow/snowman{ + anchored = 1; + desc = "You didn't seriously examine each snowman to see if their description is different, did you?" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lC" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "lumbermill" + }, +/obj/effect/turf_decal/stripes/red/full, +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/lumbermill) +"lD" = ( +/obj/structure/ladder/unbreakable/rune{ + desc = "I want out of this spookfest."; + icon_state = "hierophant"; + id = "GETMEOUTOFHEREYOUFUCKS"; + name = "\improper Emergency Escape Rune" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lE" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/hatchet, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lF" = ( +/obj/effect/mine/stun, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lG" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/grenade/chem_grenade/large, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lH" = ( +/obj/effect/decal/remains/human, +/obj/structure/light_construct, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lI" = ( +/obj/structure/light_construct, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lJ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/remains/human{ + desc = "They look like human remains. They're covered in scratch marks."; + name = "mangled remains" + }, +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/shreds{ + pixel_y = 7 + }, +/obj/effect/decal/cleanable/shreds{ + pixel_x = -3; + pixel_y = -5 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lK" = ( +/obj/item/pickaxe{ + desc = "It's almost broken."; + force = 8; + name = "damaged pickaxe"; + throwforce = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lL" = ( +/obj/effect/decal/remains/human, +/obj/item/pickaxe{ + desc = "It's almost broken."; + force = 8; + name = "damaged pickaxe"; + throwforce = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lM" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/shovel, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lN" = ( +/obj/item/pickaxe/drill, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/clothing/shoes/sneakers/brown, +/obj/structure/closet{ + anchored = 1; + name = "uniform closet" + }, +/obj/item/clothing/under/rank/security/officer/spacepol{ + armor = list("melee" = 2, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10); + desc = "Anyone enjoying their time while working in a megacorporation, planetary government, or band of pirates is under the jurisdiction of the fun police." + }, +/obj/item/clothing/head/helmet, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"lP" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/closed/wall/ice, +/area/awaymission/cabin/caves) +"lQ" = ( +/obj/structure/sign/warning/enginesafety{ + desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift. It seems to particularly focus on how dangerous the sawblade is."; + name = "\improper LUMBERMILL SAFETY" + }, +/turf/closed/wall/mineral/wood, +/area/awaymission/cabin/lumbermill) +"lR" = ( +/obj/structure/closet/crate/wooden{ + desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; + name = "wooden box" + }, +/obj/item/paper{ + info = "Moving these crates through a tunnel that isn't even finished yet is really annoying. It's such a pain in the ass to haul even a single crate to the cabin. It made sense to haul food and other goods however these are fake fucking trophies. Why do they even need these fake artifacts for some asshole's trophy case? We'll just leave the crates in the cave that has all those bones inside. Fuck it."; + name = "Shipment Delivery Note" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/spider/stickyweb, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"lT" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Seriously, I can't map an entire soviet bunker and new landscape for you. You can't get past this."; + name = "Soviet Hatch" + }, +/area/awaymission/cabin/caves/sovietcave) +"lU" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Can you just stop?"; + name = "GO BACK THE WAY YOU CAME" + }, +/area/awaymission/cabin/caves/sovietcave) +"lV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mine/sound/bwoink, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"lW" = ( +/obj/structure/flora/tree/dead, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"lX" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/caves) +"lY" = ( +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/caves) +"lZ" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow{ + name = "packed snow"; + slowdown = 0 + }, +/area/awaymission/cabin/caves) +"ma" = ( +/obj/structure/flora/stump{ + desc = "Breaking it should be easy."; + max_integrity = 20; + name = "old stump" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mb" = ( +/obj/effect/mine/sound/bwoink{ + name = "explosive mine" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mc" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass2"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"md" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"me" = ( +/obj/structure/flora{ + desc = "Looks frozen."; + icon = 'icons/obj/flora/snowflora.dmi'; + icon_state = "snowgrass3"; + name = "frozen flora" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mf" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"mg" = ( +/mob/living/simple_animal/hostile/bear/russian{ + desc = "He'll hold the line against you!"; + light_range = 3; + melee_damage_upper = 25; + name = "Artyom"; + speak = list("Blyat!","Rawr!","GRR!","Growl!"); + wander = 0 + }, +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"mh" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/cabin/caves) +"mi" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/shreds{ + pixel_x = 10; + pixel_y = -12 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mj" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/generic{ + pixel_x = -17 + }, +/obj/effect/decal/cleanable/shreds{ + pixel_y = -12 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mk" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/nanotrasen, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"ml" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mm" = ( +/obj/structure/fence/door, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mn" = ( +/obj/structure/fence/cut/large{ + dir = 4 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mo" = ( +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mp" = ( +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mq" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/decal/cleanable/generic{ + pixel_x = 11; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/shreds{ + pixel_y = -12 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mr" = ( +/obj/effect/decal/cleanable/shreds{ + pixel_x = -12; + pixel_y = -12 + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"ms" = ( +/turf/closed/indestructible/rock/snow/ice, +/area/awaymission/cabin/caves) +"mt" = ( +/obj/structure/fence, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mu" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mv" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mw" = ( +/obj/structure/sign/warning{ + name = "\improper SAWBLADE WARNING"; + pixel_x = -32 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"mx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2{ + desc = "No, the spider web doesn't have any secrets. For fucksake." + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"my" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/gun/ballistic/automatic/surplus{ + desc = "Uses 10mm ammo and its bulky frame prevents one-hand firing. It has the word CHEKOV engraved on the stock."; + name = "chekov's rifle" + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mz" = ( +/obj/structure/fence/end, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mA" = ( +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/closed/wall/ice, +/area/awaymission/cabin/caves) +"mB" = ( +/turf/open/floor/plating/snowed/smoothed, +/area/awaymission/cabin/caves) +"mC" = ( +/obj/item/flashlight/flare, +/obj/effect/light_emitter{ + name = "cave light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mD" = ( +/obj/structure/closet/crate/wooden{ + desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; + name = "wooden box" + }, +/obj/item/fakeartefact, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mE" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/closed/indestructible/rock/snow, +/area/awaymission/cabin/caves) +"mF" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/plasteel/dark/snowdin, +/area/awaymission/cabin/caves) +"mG" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 + }, +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/plasteel/dark/snowdin, +/area/awaymission/cabin/caves) +"mH" = ( +/mob/living/simple_animal/hostile/skeleton/ice{ + desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; + maxHealth = 20; + melee_damage_lower = 5; + melee_damage_upper = 5; + name = "frozen skeleton"; + speed = 7; + wander = 0 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"mI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mJ" = ( +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/plasteel/dark/snowdin, +/area/awaymission/cabin/caves) +"mK" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Seriously, You can't get past this."; + name = "Soviet Hatch" + }, +/area/awaymission/cabin/caves/sovietcave) +"mL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/ladder/unbreakable/rune{ + color = "#ff0000"; + desc = "ONE HUNDRED AND TEN PERCENT REAL."; + id = "whatkindofnerdusesmapmakertocheattheirwaytoateleportrune"; + name = "\improper TOTALLY LEGIT PORTAL OF FUN" + }, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mM" = ( +/obj/machinery/door/airlock/hatch, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mN" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mO" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mP" = ( +/turf/closed/indestructible/rock/snow, +/area/awaymission/cabin/caves) +"mQ" = ( +/obj/structure/closet/crate/wooden{ + desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; + name = "wooden box" + }, +/obj/item/fakeartefact, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"mR" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mS" = ( +/obj/machinery/door/airlock/vault{ + desc = "Made by the Russians."; + name = "Soviet Door" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"mT" = ( +/mob/living/simple_animal/hostile/skeleton/ice{ + desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; + maxHealth = 20; + melee_damage_lower = 5; + melee_damage_upper = 5; + name = "frozen skeleton"; + speed = 7; + wander = 0 + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"mU" = ( +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"mV" = ( +/obj/effect/turf_decal/weather/snow, +/obj/item/flashlight/flare, +/turf/open/floor/plasteel/dark/snowdin, +/area/awaymission/cabin/caves) +"mW" = ( +/obj/effect/turf_decal/weather/snow, +/turf/closed/indestructible/rock/snow, +/area/awaymission/cabin/caves) +"mX" = ( +/obj/effect/turf_decal/weather/snow, +/obj/item/flashlight/flare, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"mY" = ( +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"mZ" = ( +/obj/item/key{ + desc = "A small grey key meant to be placed inside a vehicle. There is nothing special about this key at all besides that."; + name = "ATV key" + }, +/obj/effect/decal/remains/human{ + color = "#72e4fa" + }, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) +"na" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/floor/plating/snowed, +/area/awaymission/cabin/caves) +"nb" = ( +/obj/effect/turf_decal/weather/snow, +/obj/item/pda/syndicate{ + background_color = "#0039A6"; + default_cartridge = /obj/item/cartridge/virus/clown; + desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it."; + name = "soviet PDA"; + note = "TRANSLATED TO GALACTIC COMMON:
DO NOT GO SOUTH." + }, +/obj/effect/decal/remains/human{ + color = "#72e4fa" + }, +/turf/open/floor/plasteel/dark/snowdin, +/area/awaymission/cabin/caves) +"nc" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/wall/ice, +/area/awaymission/cabin/caves) +"nd" = ( +/turf/closed/indestructible/fakedoor{ + desc = "I think that intercomm could open the door."; + name = "Hallway Y8" + }, +/area/awaymission/cabin/caves/mountain) +"ne" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nf" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"ng" = ( +/turf/closed/indestructible/fakedoor{ + desc = "Eh, I don't think trying to get past it is worth it anyways."; + name = "Flood Gate" + }, +/area/awaymission/cabin/caves/mountain) +"nh" = ( +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"ni" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"nj" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/weather/snow/corner, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"nk" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest/sovietsurface) +"nl" = ( +/obj/structure/lattice/catwalk, +/turf/open/indestructible{ + icon_state = "plating"; + name = "bridge" + }, +/area/awaymission/cabin/caves/mountain) +"nm" = ( +/turf/open/indestructible{ + icon_state = "plating"; + name = "plating" + }, +/area/awaymission/cabin/caves/mountain) +"nn" = ( +/turf/open/indestructible/binary{ + density = 1; + desc = "No, I am not going through this."; + icon = 'icons/misc/beach.dmi'; + icon_state = "water"; + name = "dirty water" + }, +/area/awaymission/cabin/caves/mountain) +"no" = ( +/obj/structure/ladder/unbreakable{ + desc = "Finally."; + icon_state = "ladder10"; + id = "whyisitcalledladder10andnotladder1"; + name = "Freedom" + }, +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/turf/open/indestructible{ + icon_state = "plating"; + name = "plating" + }, +/area/awaymission/cabin/caves/mountain) +"np" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/greenglow, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nq" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/shreds, +/turf/open/indestructible{ + icon_state = "plating"; + name = "plating" + }, +/area/awaymission/cabin/caves/mountain) +"nr" = ( +/obj/effect/decal/cleanable/greenglow, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"ns" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/ladder/unbreakable{ + desc = "Who left the grate open?"; + height = 1; + icon_state = "ladder01"; + id = "dealwentoffwithoutahitchBRO"; + name = "Grate"; + pixel_y = -10 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"nt" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/security, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/security, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nv" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/obj/item/mop, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"ny" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/dice/d6/space; + trophy_message = "Stolen from dice collector before he could enjoy his day." + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/cabin/caves/mountain) +"nz" = ( +/obj/effect/light_emitter{ + name = "outdoor light"; + set_cap = 3; + set_luminosity = 6 + }, +/obj/structure/ladder/unbreakable{ + alpha = 0; + desc = "Finally."; + height = 1; + icon_state = ""; + id = "whyisitcalledladder10andnotladder1"; + mouse_opacity = 0; + name = "" + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"nA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/ladder/unbreakable{ + desc = "Yeah, I'll just go back to jail instead of this. It's not like there is an escape out of here, right?"; + icon_state = "ladder10"; + id = "dealwentoffwithoutahitchBRO"; + name = "Sewer Ladder" + }, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nB" = ( +/obj/structure/table/wood/poker, +/obj/item/dice/d6{ + pixel_x = -8 + }, +/turf/open/floor/carpet, +/area/awaymission/cabin) +"nC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nD" = ( +/obj/effect/decal/cleanable/greenglow, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/human/corpse/damaged, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nG" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs, +/mob/living/simple_animal/hostile/skeleton{ + desc = "Oh shit!"; + dir = 1; + faction = list("sewer"); + name = "sewer skeleton"; + wander = 0 + }, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nH" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/mouse{ + faction = list("sewer") + }, +/turf/open/indestructible/hoteltile, +/area/awaymission/cabin/caves/mountain) +"nI" = ( +/obj/effect/rune/malformed{ + color = "#5772E0"; + cultist_desc = "The snowman council will now decide your fate."; + cultist_name = "The Snowman Council Rune"; + desc = "An odd collection of symbols drawn in what seems to be frozen water. Despite the fancy setup, the rune seems quite mundane which makes it unworthy of translation."; + icon_state = "2"; + invocation = "Frosty the Snowman was a jolly happy soul with a corncob pipe and a button nose and his eyes made out of coal!"; + invoke_damage = 60; + name = "ice rune" + }, +/obj/item/clothing/suit/snowman{ + desc = "The dead body of a snowman. There's holes to stick your own body in it."; + name = "snowman corpse" + }, +/obj/item/clothing/head/snowman{ + desc = "The head of a dead snowman. There's enough room inside for your own head."; + pixel_x = -1; + pixel_y = 10 + }, +/turf/open/floor/plating/asteroid/snow, +/area/awaymission/cabin/caves) +"nJ" = ( +/obj/effect/turf_decal/stripes/red/line, +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"nK" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/plating/snowed/temperatre, +/area/awaymission/cabin/snowforest) +"nL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/grunge, +/turf/open/floor/mineral/plastitanium/red{ + name = "soviet floor" + }, +/area/awaymission/cabin/caves/sovietcave) +"nM" = ( +/obj/machinery/door/airlock/glass_large{ + name = "Medical Bay" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/cabin) +"nN" = ( +/obj/machinery/light/small, +/turf/open/floor/wood, +/area/awaymission/cabin) +"nO" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"nR" = ( +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"nS" = ( +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/awaymission/cabin) +"nT" = ( +/obj/structure/window{ + dir = 4 + }, +/obj/structure/chair/stool, +/turf/open/floor/wood, +/area/awaymission/cabin) +"nU" = ( +/obj/machinery/door/airlock{ + name = "Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/cabin) +"nV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"MS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto, +/turf/open/floor/plating, +/area/awaymission/cabin) +"TZ" = ( +/obj/structure/closet/crate/wooden{ + desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; + name = "wooden box" + }, +/obj/item/fakeartefact, +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plating/ice/smooth, +/area/awaymission/cabin/caves) + +(1,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(2,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(3,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(4,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(5,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +"} +(6,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +"} +(7,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +gx +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(8,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +"} +(9,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gC +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +ab +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +"} +(10,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fM +fM +fp +fp +fp +fp +fp +nd +nd +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(11,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fG +fN +fN +fS +fV +gi +fp +fp +gz +fN +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ms +ms +ms +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(12,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fW +gj +fp +fp +fP +fP +gE +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ab +gx +ms +ms +it +mH +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(13,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fr +fI +fH +fQ +fT +fp +fp +fp +fp +fP +fP +gF +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +gx +ms +ms +it +it +ms +ms +ms +ms +gx +gx +gx +gx +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(14,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fs +fJ +fH +fQ +fT +fV +gk +fp +fp +fP +fN +lO +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +gx +gx +ms +it +it +it +it +it +it +mP +ms +ms +gx +gx +gx +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(15,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fX +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +gx +ms +ms +it +it +hO +hO +it +it +it +it +mP +gx +gx +gx +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +"} +(16,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fH +fH +fQ +fT +fp +fp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +gx +ms +it +it +hO +mQ +hO +it +it +it +it +mP +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(17,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fV +gl +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ms +ms +it +hO +hO +hO +hO +it +it +it +it +mP +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(18,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fH +ns +fQ +fT +fY +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ms +it +it +hO +hO +mT +hO +it +ms +it +it +ms +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(19,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fp +fp +fp +fp +fP +gB +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +ms +mD +it +hO +hO +hO +hO +it +it +it +it +ms +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(20,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +ft +fI +fH +fQ +fT +fZ +gm +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +ms +ms +it +hO +hO +hO +hO +hO +it +it +it +ms +gx +gx +gx +ab +ab +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +"} +(21,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fu +fK +fO +fR +fT +gb +gn +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ms +ms +mH +hO +hO +TZ +hO +hO +mH +it +it +ms +ms +gx +gx +ab +ab +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +"} +(22,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fv +fK +fO +fR +fT +fp +fp +fp +fp +fP +fN +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ms +it +it +hO +hO +hO +hO +hO +it +it +it +it +ms +gx +gx +gx +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +"} +(23,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fy +fK +fO +fR +fT +fV +go +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +ms +it +it +it +hO +hO +hO +hO +it +it +ms +it +ms +ms +gx +gx +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +"} +(24,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fz +fJ +fH +fQ +fT +gc +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +ms +it +hO +hO +hO +mT +hO +hO +it +it +it +it +it +ms +ms +gx +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +"} +(25,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fp +fp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +ab +ms +it +hO +hO +hO +hO +hO +hO +it +it +it +ms +it +it +ms +gx +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +"} +(26,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fH +fH +fQ +fT +fV +gp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +gx +ms +it +hO +mQ +hO +hO +hO +it +it +it +it +it +it +it +mP +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +"} +(27,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +gd +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +ms +ms +it +hO +hO +hO +hO +it +it +ms +it +ms +it +it +it +ms +ms +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +"} +(28,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fH +fH +fQ +fT +fp +fp +fp +fp +gA +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ms +it +it +it +hO +hO +it +it +ms +ms +it +it +it +it +it +it +ms +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +"} +(29,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fV +gq +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ms +ms +it +it +it +it +it +ms +ms +mP +mP +it +it +it +it +lR +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(30,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fE +fI +fH +fQ +fT +ge +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ms +ms +ms +ms +ms +ms +ms +ab +ab +mP +mP +it +ms +it +it +mP +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(31,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fF +fJ +fH +fQ +fT +fp +fp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +hS +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +mP +it +it +it +ms +ms +ms +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(32,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fq +fH +fH +fQ +fT +fV +gr +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +gP +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +mP +mP +it +it +ms +ms +it +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(33,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fL +fN +fN +fU +gf +gj +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +ab +gx +gx +gx +mP +it +it +it +it +mH +ms +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(34,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fM +fM +fp +fp +fp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +gx +gx +gx +gx +mP +mP +it +it +mP +mP +mP +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(35,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fP +fN +fp +gg +gs +gv +gy +fP +fN +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +mP +mP +it +it +mP +mP +mP +ab +ab +ab +ab +ab +ab +ab +ab +"} +(36,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fP +fP +fP +fp +gh +gt +gw +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +mP +it +it +it +it +mP +mP +ab +ab +ab +ab +ab +ab +ab +"} +(37,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +ny +fP +fP +fP +fp +fp +fp +fp +fp +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +nz +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kQ +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +it +kQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +mP +mP +it +it +it +it +mP +mP +ab +ab +ab +ab +ab +ab +"} +(38,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fP +fP +fP +fP +fP +fP +fN +fP +fP +fP +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +gP +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mP +mP +it +it +ms +it +it +mP +ab +ab +ab +ab +ab +ab +"} +(39,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fN +fP +fP +fP +gu +fP +fP +fP +fN +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +gP +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +me +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mP +mH +it +it +it +it +ms +mP +ab +ab +ab +ab +ab +ab +"} +(40,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +kx +ac +ac +ac +ac +ac +ac +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +it +kx +kx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ms +ms +ms +it +it +it +ms +ms +ab +ab +ab +ab +ab +ab +"} +(41,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +it +it +it +it +kv +kx +kx +ab +ab +ab +ab +ab +ab +ab +kw +kw +hO +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +gP +kx +kx +kx +lW +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ms +ms +it +it +it +ms +ab +ab +ab +ab +ab +ab +"} +(42,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +ng +ng +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +it +it +it +hO +kw +dj +kx +kx +kx +kx +ab +ab +ab +ab +kw +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +kx +it +kx +kx +ab +ab +ab +ab +kx +kx +kx +kx +ac +ac +ac +gP +ac +kx +kx +ab +ab +kx +kx +kx +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +gW +ac +ac +ac +ac +ac +ac +ac +it +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +iz +iz +mP +mP +mP +mP +mP +iz +iz +iz +iz +nc +ab +ab +ab +ab +ab +"} +(43,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +nr +ne +nn +nn +ne +ne +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +it +it +it +hO +hO +kw +dj +dj +dj +ac +kx +kx +kx +kx +kw +kw +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +gP +ac +kx +kx +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +kx +kx +kx +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +gP +ac +ac +ac +ac +eO +ac +ac +eO +ac +mi +mt +mz +kx +mE +mP +iz +mP +iz +mP +mP +mP +iz +iz +iz +mP +iz +mP +iz +iz +iz +iz +iz +iz +ab +ab +ab +ab +ab +"} +(44,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +nf +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +it +it +it +it +hO +hO +kw +dj +dj +dj +dj +dj +ac +ac +gP +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +kx +kx +kx +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ma +kx +ac +ac +ac +ac +ac +ac +eO +aa +eO +ac +eO +ac +mj +mu +lP +mE +mE +iz +iz +mP +iz +iz +iz +mP +mJ +mJ +mJ +mJ +mJ +mJ +mU +mU +mY +mY +mU +mW +ab +ab +ab +ab +ab +"} +(45,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +nA +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +it +it +it +it +hO +hO +hO +kw +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +lW +kx +kx +ac +ac +ac +ac +gR +ac +ac +ac +ac +eO +ac +ac +ac +ac +mk +mu +mA +mA +mA +iz +mJ +mJ +mJ +mJ +mJ +mJ +mJ +mJ +mJ +mW +mW +mW +mX +mY +mY +mY +mW +mW +ab +ab +ab +ab +ab +"} +(46,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +nH +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +hO +hO +hO +hO +kw +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +kx +kx +ab +ab +ab +kx +kx +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +gR +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ml +mv +mv +mF +mJ +mJ +mJ +mJ +mU +mU +mU +mJ +iC +iC +mP +mP +mP +hO +iC +mZ +hO +hO +mP +mP +ab +ab +ab +ab +ab +"} +(47,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +hO +hO +hO +hO +hO +kw +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gR +eO +ac +ac +ac +ac +ac +mm +mv +mB +mB +iC +iC +iC +iC +iC +mP +mP +iC +iC +hO +hO +hO +hO +hO +hO +hO +hO +na +mP +mP +ab +ab +ab +ab +ab +"} +(48,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +nr +nn +nn +ne +nr +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +hO +it +kv +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +dj +cE +dj +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +kx +kx +kx +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +mn +mv +mC +mB +iC +iC +iC +iC +mP +mP +mP +mP +iC +hO +hO +hO +hO +hO +hO +hO +hO +mP +mP +mP +ab +ab +ab +ab +ab +"} +(49,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +hO +it +kv +kx +ac +ac +ac +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +kx +kx +kx +kx +kx +kx +lW +kx +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +mo +mv +mu +mB +iC +iC +iC +iC +mP +mP +mP +mP +iC +hO +hO +hO +hO +hO +hO +hO +iC +mP +mP +mP +ab +ab +ab +ab +ab +"} +(50,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nf +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +hO +it +it +ab +kx +ac +ac +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +eO +ac +ac +ac +ac +ac +ac +ac +eO +ac +ac +mm +mv +mB +mB +iC +iC +iC +iC +iC +mP +mP +iC +iC +iC +iC +hO +hO +hO +hO +hO +iC +mP +mP +mP +ab +ab +ab +ab +ab +"} +(51,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +it +it +it +hO +hO +hO +hO +hO +it +it +it +ab +kx +ac +ac +dj +dj +dj +dj +ac +ac +iO +iN +ac +ac +ac +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gU +ac +gR +ac +ac +ac +ac +ac +ac +gR +ac +ac +ac +gR +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +mp +mv +mu +mG +mJ +mJ +mJ +mJ +mJ +mJ +mU +mJ +iC +iC +iC +iC +hO +iC +hO +iC +iC +mP +mP +mP +ab +ab +ab +ab +ab +"} +(52,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +nf +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +gx +gx +it +it +it +hO +hO +hO +hO +hO +it +it +it +ab +kx +ac +ac +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +mk +mu +mA +mA +mA +iz +mJ +mJ +mJ +mV +mJ +mJ +mW +mW +mW +mU +mU +mU +mU +mU +mJ +nb +mW +mW +ab +ab +ab +ab +ab +"} +(53,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +nf +nH +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +it +it +it +ab +kx +ac +ac +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +eO +ac +ch +ac +mq +mu +lP +lP +mE +iz +iz +mP +iz +iz +iz +mP +mW +mW +mW +mW +mJ +mJ +mJ +mW +mW +mW +mW +mW +ab +ab +ab +ab +ab +"} +(54,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +it +it +it +it +hO +hO +hO +hO +it +it +it +ab +ab +kx +ac +ac +dj +dj +cE +dj +dj +dj +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +ac +ac +ac +ac +eO +ac +ac +ac +mr +mt +mz +kx +mE +mP +iz +mP +mP +iz +iz +iz +iz +iz +mP +mP +mP +iz +iz +iz +iz +mP +mP +mP +ab +ab +ab +ab +ab +"} +(55,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nr +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +it +it +it +it +hO +hO +hO +hO +it +it +it +ab +ab +kx +ac +ac +ac +dj +dj +dj +dj +dj +dj +ac +ac +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +eO +mc +kx +kx +mE +mP +ab +ab +ab +ab +ab +ab +ab +iz +iz +iz +mP +mP +mP +mP +mP +iz +iz +iz +iz +ab +ab +ab +ab +ab +"} +(56,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +ne +ne +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +it +it +it +hO +hO +hO +hO +it +it +ab +ab +ab +kx +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(57,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +nv +ne +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +iK +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +cE +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gU +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +me +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(58,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +nf +ne +nn +nn +ne +ne +ne +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +hO +hO +hO +hO +it +it +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +ac +ac +ac +ac +gP +ac +ac +eO +ac +ac +ac +ac +ac +ac +kQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(59,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +nr +ne +nx +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +it +hO +hO +hO +hO +it +gx +gx +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gR +ac +ac +ac +ac +ac +ac +ac +gR +ac +ac +ac +eO +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(60,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +nr +nn +nn +ne +ne +nt +ne +ne +ne +ne +nD +nE +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +it +hO +hO +hO +hO +hO +it +gx +gx +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(61,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +nn +nn +ne +nu +nH +ne +nC +nf +nC +ne +nF +nG +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +it +hO +hO +hO +hO +hO +it +it +it +gx +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +eO +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(62,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +nH +nn +nn +nt +ne +ne +nr +ne +ne +ne +nw +ne +nE +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +hO +hO +hO +hO +hO +hO +it +it +it +gx +ab +ab +ab +kx +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +gW +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(63,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nf +ne +ne +nn +nn +nn +nn +nn +nn +nn +nn +nl +nl +nn +nn +ng +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +ki +ki +kq +ks +ki +ki +ki +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(64,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +nf +nn +nn +nn +nn +nn +nn +nn +nn +nl +nl +nn +nn +ng +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +ko +ki +ki +ki +ki +ku +ki +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kQ +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(65,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +ne +ne +ne +nf +ne +ne +ne +ne +ne +ne +ne +ne +nH +ne +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +hO +hO +hO +hO +hO +hO +it +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gU +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(66,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +ne +nr +ne +ne +nH +ne +ne +ne +ne +nr +ne +ne +ne +ne +nr +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +fA +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gW +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +kx +mc +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(67,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +ne +ne +ne +ne +ne +np +ne +ne +ne +ne +ne +nf +ne +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +fw +fB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(68,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +fp +nq +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +fw +fC +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kh +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +lW +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(69,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +nm +nm +nm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +it +it +it +gx +gx +gx +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +hN +ac +ac +em +fx +fx +fB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gR +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(70,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +nm +nm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +it +it +it +gx +gx +gx +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +fw +fx +fx +fD +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(71,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +hO +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +fw +fx +fC +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(72,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +hO +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +cR +ek +ek +ek +ek +ek +ek +fx +fx +fC +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gU +ac +ac +kQ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(73,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +hO +hO +hO +hO +hO +hO +hO +hO +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +cR +bS +ce +ce +ce +bS +bS +bS +fx +fx +fC +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(74,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fp +fp +fp +fp +nm +nm +fp +fp +fp +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +hO +hO +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +cR +bS +bS +cf +cf +cf +bS +bS +bS +fx +fx +fx +fB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gW +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(75,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +hO +hO +hO +hO +hO +hO +hO +it +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ef +bS +bS +cg +cg +cg +bS +bS +bS +fx +fx +fx +fC +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(76,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +it +hO +hO +hO +hO +hO +hO +hO +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dB +dB +dB +dB +dB +dB +dB +dB +dB +dB +dB +dB +cr +el +el +en +el +el +el +el +el +ep +ep +ep +er +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(77,1,1) = {" +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +an +an +an +an +an +an +an +ao +ao +an +an +an +an +an +an +an +an +ba +ba +an +eq +eq +eq +eq +an +dB +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(78,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +it +it +it +it +it +ki +ki +ki +ki +ki +kr +it +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aV +jr +au +jk +an +aq +aq +an +bl +bM +ij +bT +cs +bl +an +aq +aq +an +cS +aL +aL +aL +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(79,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +gx +gx +it +it +ki +ki +ki +kp +ki +ki +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dB +iZ +aN +jl +bb +bb +bb +eg +bm +eg +nS +an +eg +eg +eg +eg +eg +eg +hB +eg +aq +an +cT +cV +gL +cV +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(80,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +it +gx +it +it +it +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +iZ +jy +jG +az +az +az +aq +an +eg +bh +an +cA +an +an +an +an +hx +an +eg +aq +an +cU +nR +aL +ec +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(81,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +gx +gx +gx +gx +iK +hO +hO +hO +hO +hO +hO +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +iZ +bp +aq +az +az +az +aq +an +eg +aq +an +aq +aq +aq +aq +aq +aq +an +eg +aq +an +cV +MS +cV +cV +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(82,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +it +gx +gx +gx +it +it +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aA +aI +aA +aq +an +in +aq +an +bn +aq +aq +aq +aq +bh +an +eg +bh +an +aL +nR +aL +ed +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(83,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +it +it +gx +it +it +it +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +an +nU +an +an +an +aR +an +eg +aq +an +aq +aq +eg +aq +aq +aq +an +eg +aq +an +cU +cW +aL +gN +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +gW +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(84,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +gx +it +it +hO +hO +hO +hO +hO +hO +hO +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +dB +an +as +aB +aH +an +an +an +eg +aq +an +cz +aq +eg +aq +aq +bh +an +eg +aq +an +ed +nR +aL +kE +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(85,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +dB +an +an +an +an +an +aS +hg +eg +bh +an +nT +bo +ht +bo +bo +cB +an +eg +eg +bV +aw +aw +gM +an +an +dB +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(86,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +at +aC +aH +an +an +an +eg +aq +an +aO +aO +hC +hC +hC +bb +bb +eg +aq +an +eb +cX +an +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(87,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +an +nU +an +an +an +aT +an +eg +aq +an +az +aq +aq +az +aq +aq +cO +eg +bh +an +an +an +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +gP +ac +ac +ac +ac +md +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(88,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +au +jt +aV +aq +an +bs +aq +eh +az +aq +az +cO +az +ci +he +hG +aq +eN +an +dB +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dX +dj +dj +dj +dj +dj +dX +dj +dj +dj +dj +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(89,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +no +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kC +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +dB +ja +aN +aq +az +az +az +aq +an +eg +aq +an +aP +az +ej +nB +hd +az +aO +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(90,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +nm +nm +nm +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +kz +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ja +jy +jF +az +az +az +aq +an +eg +bh +an +bq +az +ha +hc +hd +az +az +eg +aq +aq +aN +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(91,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +iK +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +ab +ab +kx +it +ac +hV +ac +hT +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +dB +ja +bp +jm +bb +bb +bb +eg +iY +eg +aq +an +bt +az +ej +jx +hd +az +cO +eg +aq +aq +iR +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(92,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +iK +it +it +gx +gx +gx +gx +ab +ab +ab +kx +kB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aA +aI +aA +jj +an +eg +aq +an +cN +aq +az +aO +az +ci +hF +hG +aq +aq +bp +ao +dB +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dX +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(93,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fp +fp +fp +fp +fp +fp +fp +fp +fp +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +gx +gx +gx +gx +gx +ab +ab +ab +kx +kP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +dB +dB +an +an +an +an +an +an +an +ct +aq +an +jE +aq +aq +az +aq +aq +aO +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +ea +cE +dj +dj +dj +dj +dX +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(94,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +dB +an +an +aq +aV +ju +au +ji +an +eg +aq +an +de +de +de +de +de +bb +bb +eg +bh +an +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dY +ea +dY +ea +dY +dj +dj +dj +dj +dj +dj +ac +ac +gW +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(95,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +iK +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jb +aN +jn +bb +bb +bb +eg +iX +eg +bh +an +hb +bU +ev +eu +cK +cD +an +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +dj +dj +dj +dj +dj +dj +dY +ea +dY +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(96,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jb +jy +jH +az +az +az +aq +an +eg +aq +an +hn +aq +aq +aq +aq +aq +an +eg +aq +aq +aN +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(97,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +fm +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +it +it +it +iK +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +kx +kx +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jb +bp +aq +az +az +az +aq +an +eg +aq +an +bv +bN +nO +aq +ap +aq +an +eg +aq +aq +iU +ao +dB +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(98,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aA +aI +aA +aq +an +in +aq +an +an +an +an +bu +an +eo +an +eg +aq +aq +bp +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +gP +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(99,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +iK +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +kQ +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +an +nU +an +an +an +aU +an +eg +aq +an +bw +bO +bO +bO +bO +hz +hE +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(100,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +cn +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dB +an +as +aB +aH +an +an +an +eg +aq +an +bx +bO +cJ +cF +cJ +hz +an +eg +bh +an +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dX +dj +dj +dj +dj +dj +dj +dj +dj +dX +dj +dj +dj +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(101,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +iK +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +dB +an +an +an +an +an +hf +hy +eg +aq +an +by +hz +hz +hz +hz +hz +an +eg +aq +aq +an +an +dB +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(102,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +ab +ab +it +it +it +it +it +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +hO +it +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +dB +an +at +aC +aH +an +an +an +eg +bh +an +bz +bO +bW +ck +cj +hz +an +eg +aq +aq +aN +ao +dB +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dX +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(103,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +it +it +it +it +it +hO +hO +iL +iL +iL +iL +iL +iL +iL +iL +iL +it +it +it +it +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +an +nU +an +an +an +aW +an +eg +aq +an +an +an +an +an +an +hA +an +eg +aq +aq +iS +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(104,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iK +it +it +it +it +iL +iL +iL +iL +iL +iL +iL +iL +iL +iL +iL +it +it +it +it +it +iK +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dB +an +an +aq +au +jv +aV +aq +an +bs +aq +an +bA +bB +bX +cl +cl +hi +an +eg +aq +aq +bp +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(105,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +it +it +it +it +iL +iL +iL +iL +it +iL +iL +iL +it +it +iL +iL +it +it +iK +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +dB +jc +aN +aq +az +az +az +aq +an +eg +aq +an +hi +hi +hi +hi +hi +hi +an +hh +aq +aq +an +an +dB +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(106,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +it +it +it +it +it +it +it +it +it +iL +iL +iL +it +it +it +iL +iL +it +it +it +it +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jc +jy +jI +az +az +az +aq +an +eg +aq +an +bC +bB +bY +is +dt +cG +an +eg +bh +an +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +dj +dj +dj +ac +ac +gW +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(107,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +it +iK +it +it +it +it +it +it +it +iL +iL +kn +it +it +it +iL +iL +it +it +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +dB +jc +bp +jo +bb +bb +bb +eg +iW +eg +aq +an +an +an +an +an +an +an +an +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dj +dj +dj +dj +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(108,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +it +it +it +it +it +it +it +it +iv +iv +kj +iv +iv +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +dB +an +an +au +aA +aI +aA +jg +an +eg +aq +an +aJ +bG +bE +cv +hq +cv +an +eg +aq +aq +aN +ao +dB +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(109,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +it +iv +iv +iM +iM +iM +iv +iv +it +it +iL +iL +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kg +dB +an +an +an +an +an +an +an +ct +bh +an +aK +bE +bE +bE +bE +lz +an +eg +aq +aq +iT +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(110,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +it +it +it +it +it +it +iv +iM +iM +iM +iM +iM +iv +it +it +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aV +jw +au +jh +an +eg +aq +an +bD +bE +bE +cI +hD +bE +nM +eg +aq +aq +bp +ao +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(111,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +it +it +it +it +it +iv +iP +iM +kl +iM +iM +iv +it +it +iL +iL +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jd +aN +jp +bb +bb +bb +eg +iV +eg +aq +an +cP +cP +cP +cP +jq +cP +cP +eg +aq +aq +an +an +dB +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(112,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +it +it +it +iK +it +iv +iM +iM +iM +iM +iM +iv +it +it +iL +iL +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +it +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +dB +jd +jy +jJ +az +az +az +aq +an +eg +aq +an +bF +bP +cm +ho +bE +lz +an +eg +aq +an +an +dB +dB +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(113,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +it +it +it +it +iv +iv +iQ +km +iQ +iv +iv +it +it +iL +iL +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +it +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +jd +bp +aq +az +az +az +aq +an +eg +nS +an +bF +bQ +cu +hp +js +hp +an +eg +aq +an +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(114,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +gx +gx +ab +it +it +it +iv +iv +iv +iv +iv +it +it +it +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +an +aq +aA +aI +aA +aq +an +in +nN +an +an +an +an +an +an +an +an +eg +bh +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(115,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +gx +gx +gx +gx +gx +gx +kt +kt +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +dB +dB +an +nU +an +an +an +aU +an +eg +eg +nV +ei +et +hj +hr +hs +et +nV +eg +aq +an +dB +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(116,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +an +as +aB +aH +an +an +an +ar +an +an +an +an +an +an +an +an +an +cM +hm +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(117,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kt +kt +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +cY +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dB +dB +an +an +an +an +an +aX +bf +bb +an +bj +bH +an +kk +aq +aq +aq +io +bb +az +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(118,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ax +an +aF +cL +aw +jC +bb +bb +bb +an +bk +bJ +an +cb +co +cw +aq +cH +cQ +ee +an +dB +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(119,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +it +it +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dD +dH +dH +dH +dH +dH +dN +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ax +av +aw +ed +hu +an +aY +bc +bg +an +nU +an +an +cc +cp +cx +eg +eg +cQ +hI +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(120,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +it +iL +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ad +eG +eG +eH +eG +eG +ad +ad +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ax +ed +aw +ed +hv +an +hl +bd +az +an +jf +ay +an +cd +cq +cy +aq +cH +hH +ee +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(121,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +it +iL +iL +iL +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ad +ad +jP +af +af +af +af +af +jP +ad +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ax +aD +aM +du +hw +an +aZ +be +az +bi +hk +bL +an +bn +aq +aq +aq +aq +az +az +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(122,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +it +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ad +af +af +af +af +jB +af +af +af +af +ad +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +dB +ax +aE +aQ +dv +an +an +ao +ao +ao +an +an +je +an +an +jD +jD +an +jA +jz +an +an +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(123,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +kx +ac +ch +ac +ac +ac +ac +ac +ac +ac +ad +ew +af +af +al +kf +ff +eQ +ak +af +af +eY +ad +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +ax +ax +ax +ax +ax +dB +dB +dB +dB +dB +dB +dB +dB +an +ao +ao +an +ao +ao +an +dB +dB +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(124,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +iL +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +ad +af +af +ak +af +am +af +fe +af +af +ad +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dB +dB +dB +dB +dB +dB +dB +ac +ac +ac +ac +ac +ac +dB +dB +dB +dB +dB +dB +dB +dB +dB +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(125,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +jM +af +af +af +jV +af +af +af +jM +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(126,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ad +gY +af +af +af +af +af +af +af +jR +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(127,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +iL +iL +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ch +ac +ac +ac +ac +ac +ad +gY +af +af +ak +af +ak +af +af +kD +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(128,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ch +ac +ac +ad +jQ +af +ak +jX +af +ka +ke +af +eA +ad +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dA +dC +dC +gO +dC +gO +dC +dC +dC +dC +lP +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(129,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iz +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ad +gY +af +jW +af +af +jU +jT +af +jR +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(130,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iz +iz +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +iL +iL +iL +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ad +jM +af +kb +gZ +af +af +jS +af +jM +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +es +ac +ac +dx +dz +dz +dz +dz +dz +gX +dz +dz +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(131,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iA +iC +gx +gx +iA +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +iL +iL +iL +it +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +iK +kx +ac +ac +ac +ac +ac +ac +ac +ad +ad +af +af +ak +jL +af +kd +kc +af +af +ad +ad +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dy +dz +dz +dz +dz +dz +dz +dz +dz +gX +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(132,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iB +iC +iG +iC +iH +gx +gx +gx +gx +gx +gx +gx +gx +iK +it +iL +iL +iL +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ad +ex +af +af +af +jZ +af +jY +af +af +af +eZ +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +ga +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +lX +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(133,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iz +iA +iC +iC +iC +iJ +iz +gx +gx +gx +gx +gx +it +it +it +it +iL +iL +iL +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ad +ad +af +af +af +af +af +af +af +af +af +ad +ad +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dL +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(134,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iz +iz +iD +iH +iI +iz +iz +gx +gx +gx +gx +it +it +it +it +iL +iL +iL +it +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ch +ac +ch +ac +ac +ac +ac +ae +ad +ad +jO +af +af +af +af +af +jO +ad +ad +fb +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(135,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +iz +iz +iz +iz +iz +it +gx +gx +gx +it +it +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +ad +ad +eH +eG +lQ +eG +eH +ad +ad +cZ +fc +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dz +dz +dz +gX +dz +dz +dz +dz +dz +gX +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(136,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +gx +gx +gx +gx +it +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +iK +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +mw +bS +bS +eI +eM +eU +bS +bS +mw +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +gX +dz +dz +dz +dz +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(137,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +gx +gx +gx +it +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ch +ac +ag +cZ +bS +bS +eE +eJ +eR +eV +eE +bS +bS +cZ +fc +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +gX +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(138,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +hO +it +it +it +gx +gx +gx +it +it +iL +iL +iL +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ch +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +bS +eD +eF +eJ +eR +eV +eF +eD +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +dx +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(139,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +hO +hO +it +it +iE +gx +gx +gx +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +bS +eE +cZ +eJ +eR +eV +cZ +eE +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(140,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +hO +hO +it +it +it +gx +gx +it +it +it +iL +iL +iL +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ch +ac +ac +ac +ac +ac +ac +ah +cZ +bS +eF +cZ +eK +eR +eV +cZ +eF +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +gX +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +dz +kA +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(141,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +hO +hO +it +it +it +gx +it +it +it +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +bS +bS +cZ +eJ +lC +eV +cZ +bS +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +aG +dg +dg +dE +dE +dE +dE +dE +dE +hZ +hZ +dg +dg +if +lX +lY +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(142,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +hO +hO +it +it +it +it +it +it +it +it +it +iK +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ch +ac +ac +ac +ag +cZ +bS +bS +cZ +nJ +eS +nK +cZ +bS +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +bK +dh +di +dF +dO +dF +dh +dF +dF +dF +dF +ic +dp +nh +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(143,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +it +hO +it +it +it +it +it +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ch +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +bS +bS +bS +eJ +lC +eV +bS +bS +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +kA +bK +di +di +ds +di +di +dw +di +hY +di +di +di +dh +nh +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(144,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +it +iE +hO +hO +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +bS +bS +bS +eK +eR +eW +bS +bS +bS +cZ +fc +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +da +dk +di +dG +dG +dG +dG +dJ +dG +dI +dG +di +id +ni +lX +lY +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(145,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +it +hO +hO +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ky +ac +ac +ac +ac +ac +ac +ac +ac +ac +ag +cZ +cZ +bS +bS +eL +eT +eX +bS +bS +cZ +cZ +fc +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +kx +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +dx +dz +gX +dz +dz +db +dl +dr +dI +di +di +dU +fi +di +dh +dG +di +id +ni +lZ +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(146,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ai +cZ +cZ +cZ +bS +bS +bS +bS +bS +cZ +cZ +cZ +fd +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dc +dm +di +dG +dP +di +dh +dW +dS +ia +dG +di +id +ni +lX +lY +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(147,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +kx +kx +ac +ac +ch +ac +ac +ac +ac +ac +ch +ac +ey +ez +eC +eC +eC +eC +eC +eC +eC +eC +eC +fa +ey +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +it +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dd +dn +di +dG +di +dS +di +hX +di +di +dG +di +ie +ni +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(148,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +ix +hO +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ky +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +ab +ab +ab +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +dx +dz +dz +dz +dz +dd +dn +ds +dG +di +dT +di +dh +di +dh +dG +di +id +ni +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(149,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +kx +kx +kx +kx +kx +kx +kx +ac +ac +ac +ac +ac +gP +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +gP +ac +dx +dz +dz +dz +dz +db +do +di +dG +di +dh +di +di +di +ib +dG +dw +id +nj +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(150,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ch +ac +ac +ac +ch +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +kx +kx +kx +ac +ac +ac +ac +kx +kx +kx +kx +ab +ab +ab +ab +ab +kx +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +gP +kx +kx +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +ac +kx +kx +lP +lX +dz +gX +dz +db +dl +di +dJ +dQ +di +dV +di +dU +dV +dI +dh +ie +ni +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(151,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +gP +ac +ac +ac +kx +kx +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +it +kx +ab +ab +lX +lX +dz +dz +da +dk +dw +dG +dI +dG +dG +dG +dG +dG +dG +di +id +ni +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(152,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +gP +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ab +ab +ab +ab +lX +lX +kA +bK +di +di +dh +di +di +dW +ds +di +di +di +di +di +nh +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(153,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +lX +lX +bK +dp +dh +dK +dR +dK +dK +dK +dh +dK +dK +di +dp +nh +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(154,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +ix +hO +hO +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +ab +kx +ac +ac +ac +ac +kx +kx +kx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +lX +df +dq +dq +dM +dM +dM +dZ +dM +dM +dM +dM +dq +dq +nk +lX +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(155,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +it +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ch +ac +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +kx +kx +kx +it +kV +kx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +lX +lX +lX +dz +dz +lX +lX +lX +dz +dz +dz +lX +lX +lX +lX +lZ +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(156,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +hO +hO +hO +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +kx +kx +kx +kx +kx +kx +kx +ac +ch +ac +ch +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +gx +iv +iv +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +lX +lX +lZ +lX +ab +lX +lX +lX +lZ +lX +ab +gx +lX +lY +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(157,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +it +it +iF +it +it +it +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ch +ac +kx +kx +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +gx +gx +gx +iv +iv +gx +gx +gx +gx +it +it +gx +gx +lp +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +lY +ab +ab +ab +lY +ab +ab +lY +ab +ab +gx +gx +iL +iL +iL +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(158,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +it +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +ac +gW +ac +ac +ch +ac +ac +ac +ac +ch +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +iK +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +gx +gx +gx +iv +iv +gx +gx +it +it +it +it +it +it +it +it +it +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +it +iL +iL +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(159,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +it +hO +hO +hO +hO +hO +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +ac +ac +ac +ac +ac +ac +ch +ac +ac +ac +ac +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +kU +it +it +gx +gx +kX +it +it +it +it +it +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +iL +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(160,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +hO +hO +hO +hO +hO +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +kx +kx +kx +kx +kx +kx +kx +kx +kx +kx +kx +kx +kx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +it +it +gx +gx +it +it +it +it +it +it +it +gx +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +iL +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(161,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +hO +hO +hO +hO +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +it +kT +it +gx +gx +gx +gx +it +it +it +it +it +it +lu +lu +lu +it +iK +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +iL +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(162,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +gx +gx +gx +gx +gx +it +it +it +it +lu +it +it +it +lu +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(163,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ix +hO +hO +it +it +it +it +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +it +it +kU +it +gx +gx +gx +gx +gx +it +it +it +it +it +nI +it +lu +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +it +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(164,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +kU +it +it +it +gx +gx +gx +gx +gx +gx +lp +gx +lu +it +it +it +lu +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +iL +iL +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(165,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +iy +hO +it +it +it +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +kU +gx +gx +gx +gx +gx +gx +gx +gx +lB +lu +lu +iK +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +it +iL +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(166,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +it +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +gx +it +it +it +hO +hO +hO +ix +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +gx +ab +iL +iL +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(167,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +hL +hO +hO +hO +hO +hO +it +it +it +it +gx +gx +gx +it +it +it +it +gx +gx +hO +ix +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +kS +it +it +gx +it +kU +it +kT +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +ab +gx +gx +ab +iL +iL +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(168,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +hM +hP +hQ +hP +hW +hO +it +gx +it +it +it +it +it +it +it +it +gx +gx +gx +gx +hO +hO +ix +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +gx +ab +iL +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(169,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +hM +hQ +hR +hQ +ig +il +hO +gx +gx +gx +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +kU +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +ab +ab +iL +iL +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(170,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +hM +hP +hQ +hP +ih +hO +hO +gx +gx +gx +iv +iw +iv +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +kT +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +iL +iL +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(171,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +hL +hO +hO +hO +hO +hO +gx +gx +gx +gx +iv +iv +iv +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kU +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +it +iL +iL +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(172,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +kS +gx +it +it +kU +gx +gx +gx +gx +gx +gx +gx +lh +gx +it +it +kU +it +it +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +it +iL +iL +iL +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(173,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +it +it +gx +gx +gx +gx +gx +la +it +it +it +it +gx +gx +it +it +it +kU +gx +it +kS +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +it +iL +iL +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(174,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +ab +gx +gx +gx +it +gx +it +it +it +gx +gx +gx +gx +it +it +it +it +it +it +it +it +it +it +it +it +it +it +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +iL +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(175,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hO +hO +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +it +gx +gx +gx +gx +it +kU +it +gx +gx +kT +gx +it +gx +gx +it +it +it +it +it +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +iL +iL +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(176,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +hO +hU +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +gx +gx +gx +gx +it +it +it +gx +it +it +it +it +kU +gx +gx +lE +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +iL +iL +iL +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(177,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +iK +it +kU +it +gx +gx +gx +it +it +kT +it +it +it +it +kU +it +it +gx +it +it +it +it +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +iL +iL +iL +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(178,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +gx +gx +gx +gx +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +it +gx +it +kT +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +iL +iL +iL +iL +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(179,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +it +gx +gx +gx +gx +it +kU +it +it +ld +gx +lm +ld +gx +gx +gx +it +gx +it +it +it +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +iL +iL +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(180,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +it +gx +gx +gx +it +it +gx +gx +gx +le +le +le +lg +le +lf +gx +it +gx +gx +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(181,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +gx +gx +gx +gx +kU +it +gx +gx +gx +gx +li +ld +lq +lk +lv +gx +it +gx +gx +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +iL +iL +it +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(182,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +kT +it +gx +gx +gx +it +it +gx +gx +gx +lf +li +le +lr +le +ld +gx +it +gx +gx +it +it +kU +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +iK +iL +iL +iL +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(183,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kS +gx +it +kU +gx +gx +gx +it +it +gx +gx +gx +gx +lj +le +li +le +lw +gx +it +gx +it +it +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +it +it +it +iL +iL +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(184,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +gx +gx +gx +kW +it +gx +gx +gx +gx +gx +ln +le +ld +lx +gx +it +gx +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +iL +iL +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(185,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +gx +gx +gx +it +it +it +gx +gx +gx +gx +gx +ls +le +ly +gx +kT +gx +it +it +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +ab +ab +ab +iL +iL +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(186,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +gx +gx +gx +it +gx +kU +gx +gx +gx +gx +li +le +le +lo +gx +lD +gx +it +it +gx +it +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +it +iL +iL +it +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(187,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +gx +gx +gx +it +it +it +it +gx +gx +le +lk +le +ld +lA +gx +gx +gx +lF +gx +gx +kU +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +it +it +iL +iL +it +it +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(188,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kU +it +gx +gx +gx +gx +it +iE +it +it +lg +le +le +lg +lt +gx +gx +gx +it +it +it +gx +it +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +iL +iL +ab +it +it +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(189,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +gx +gx +gx +gx +gx +kU +it +gx +lk +lo +gx +gx +gx +gx +gx +it +gx +gx +gx +it +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +iL +iL +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(190,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +kU +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +gx +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +gx +gx +iL +iL +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(191,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +kT +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +gx +gx +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +gx +ab +ab +iL +iL +ab +ab +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(192,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +gx +gx +kY +it +it +ll +it +kT +it +ll +it +kT +it +it +it +gx +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +ab +gx +ab +it +iL +iL +it +it +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(193,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +kU +it +it +it +it +it +it +gx +gx +gx +gx +gx +gx +it +it +it +kU +gx +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +ab +ab +iL +iL +it +it +it +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(194,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +gx +it +kU +it +it +it +it +gx +it +gx +gx +gx +gx +it +it +gx +gx +gx +kT +it +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +gx +gx +ab +ab +gx +gx +gx +gx +gx +it +iL +iL +it +gx +it +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(195,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kS +it +it +it +it +kU +it +kT +it +it +it +gx +it +it +gx +it +gx +it +it +it +it +it +it +iK +gx +gx +it +it +it +kU +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +ab +gx +gx +gx +ab +ab +gx +gx +gx +ab +ab +gx +it +iL +iL +it +it +it +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(196,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +gx +gx +gx +gx +gx +it +it +gx +it +kU +gx +it +it +it +gx +gx +gx +it +kT +it +gx +it +it +it +gx +it +it +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +iL +iL +ab +ab +it +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(197,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +it +it +iK +it +gx +gx +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +gx +ab +ab +gx +gx +gx +gx +ii +ii +ab +ab +gx +iL +iL +it +ab +ab +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(198,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +gx +it +lp +it +it +it +it +gx +gx +it +kT +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +it +it +ab +it +iL +iL +it +ab +ab +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(199,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kT +it +iu +gx +it +lG +gx +gx +it +lK +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +ii +it +it +it +iL +iL +iL +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(200,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +kY +gx +it +it +it +gx +kU +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +it +it +iL +iL +iL +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(201,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kU +it +gx +gx +gx +it +it +it +it +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +ii +ii +mf +iL +iL +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(202,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +gx +gx +gx +gx +kU +gx +it +it +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +ii +ii +ii +ii +ii +iL +mg +mh +it +it +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(203,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +lN +it +it +it +gx +gx +gx +gx +gx +it +it +iK +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +mM +im +mS +iL +iL +ii +it +it +iK +ii +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(204,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kS +it +it +it +lM +it +gx +gx +gx +it +lH +ii +ii +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +ii +ii +ii +gx +ii +mO +im +ii +ii +ii +mS +ii +ii +ii +ii +ii +ii +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(205,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +kU +gx +it +it +kU +it +it +it +it +ii +iq +ii +gx +ii +ii +ii +ii +gx +ii +ii +ii +ii +gx +gx +ii +lb +im +ii +ii +ii +im +im +kF +iq +ii +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(206,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kU +it +gx +gx +gx +gx +gx +it +it +ii +ik +ii +ir +ii +ii +ii +kH +im +ii +ii +ii +kH +im +ii +ii +gx +ii +im +im +kF +kH +im +im +im +kF +kF +ii +mM +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(207,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +gx +gx +gx +lJ +it +lp +ik +im +ip +jK +im +im +ir +ir +ir +ir +im +ir +ir +ir +ir +ii +gx +ii +im +kF +kF +im +im +im +im +im +im +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(208,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +it +it +gx +gx +it +it +it +ii +ii +ii +jN +im +im +jK +im +im +jK +im +im +im +im +im +ii +ii +ii +im +my +kF +im +im +im +im +im +im +im +im +ii +gx +gx +gx +gx +gx +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(209,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +lL +it +it +it +it +it +it +it +ik +im +ip +im +im +im +im +im +ir +ir +im +im +im +im +im +ii +kO +ii +im +kF +kF +im +im +kJ +im +im +ii +ii +ii +ii +gx +gx +gx +gx +gx +gx +gx +ab +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(210,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +iK +gx +it +it +kU +it +ii +ik +ii +im +jK +im +im +im +ir +im +im +im +kJ +im +im +ii +ii +ii +im +im +kF +im +im +im +im +mI +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(211,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kT +it +it +it +it +kU +ii +im +im +im +im +jK +ir +ir +im +im +im +im +im +ir +im +ii +ii +ii +ii +im +im +im +im +kF +ii +ii +gx +gx +gx +gx +gx +ab +gx +ab +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(212,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +it +it +it +lI +ii +ii +ii +kF +kF +kF +im +im +im +im +im +im +im +im +im +nL +kH +im +nL +im +im +im +im +kF +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(213,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +kT +it +gx +gx +ii +ii +kG +ii +ii +ii +ii +kI +im +im +im +ir +im +ii +im +kF +ii +mN +im +im +im +kF +mR +ii +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(214,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +it +gx +gx +gx +gx +ii +ii +ii +gx +gx +ii +ii +ir +ir +ir +ii +ii +ii +im +im +ii +ii +ii +ii +ii +ii +ii +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(215,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +ir +im +ir +ii +kN +ii +kF +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(216,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +im +ii +ii +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(217,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +kK +kL +kM +ii +gx +ii +im +kF +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(218,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +ii +ii +ii +ii +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(219,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +kF +mI +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(220,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(221,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gK +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lc +lc +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(222,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gS +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +iq +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(223,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gH +gH +gH +gH +gH +hK +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +mI +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(224,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gI +gH +gH +gH +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +iq +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(225,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gH +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(226,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gT +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(227,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gH +gH +hJ +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(228,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gQ +gH +gH +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +ab +gx +gx +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(229,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gH +gH +gH +gV +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +ab +gx +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(230,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gH +gJ +gH +gH +gH +gH +gH +gH +gH +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(231,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +iq +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(232,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(233,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +iq +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(234,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +jN +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(235,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +lS +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(236,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +lS +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(237,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gG +gD +gD +gD +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +lS +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(238,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lT +mK +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(239,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(240,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +gD +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +mI +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(241,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +mI +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(242,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(243,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(244,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lS +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(245,1,1) = {" +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kR +im +im +kR +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(246,1,1) = {" +ab +ab +ab +aj +aj +fh +fj +fj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kZ +jN +im +kZ +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(247,1,1) = {" +ab +ab +ab +aj +eB +fj +fl +fj +fn +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kR +jN +im +kR +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(248,1,1) = {" +ab +ab +ab +aj +eP +fj +fl +fj +fo +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +kZ +im +lS +kZ +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(249,1,1) = {" +ab +ab +ab +aj +fg +fj +fl +fj +fn +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lU +lU +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(250,1,1) = {" +ab +ab +ab +aj +aj +fk +fj +fj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +lV +lV +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(251,1,1) = {" +ab +ab +ab +ab +aj +aj +aj +aj +aj +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +mb +mb +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(252,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(253,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +im +im +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(254,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +mx +mL +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(255,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ii +ii +ii +ii +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +gx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm similarity index 99% rename from _maps/RandomZLevels/TheBeach.dmm rename to _maps/RandomZLevels/away_mission/TheBeach.dmm index cc9f50d029..68eb5c164f 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/away_mission/TheBeach.dmm @@ -666,7 +666,7 @@ pixel_x = 24; specialfunctions = 4 }, -/obj/item/bedsheet/red, +/obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/wood, /area/awaymission/beach) "bU" = ( @@ -799,9 +799,7 @@ /turf/open/floor/wood, /area/awaymission/beach) "cn" = ( -/obj/machinery/vending/boozeomat/all_access{ - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood, /area/awaymission/beach) "co" = ( @@ -897,9 +895,7 @@ /area/awaymission/beach) "cD" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/rag{ - pixel_y = 7 - }, +/obj/item/reagent_containers/rag, /turf/open/floor/wood, /area/awaymission/beach) "cE" = ( @@ -1081,14 +1077,6 @@ /obj/item/clothing/glasses/heat, /turf/open/floor/plating/beach/sand, /area/awaymission/beach) -"iy" = ( -/obj/item/toy/seashell, -/turf/open/floor/plating/beach/coastline_t, -/area/awaymission/beach) -"MD" = ( -/obj/item/toy/seashell, -/turf/open/floor/plating/beach/sand, -/area/awaymission/beach) (1,1,1) = {" aa @@ -4660,9 +4648,9 @@ ac aw af ay -MD ak -MD +ak +ak aT ao aY @@ -4766,7 +4754,7 @@ ac aw af ay -MD +ak ak ak ak @@ -4875,7 +4863,7 @@ ay ak ak ak -MD +ak ak ak ak @@ -5216,7 +5204,7 @@ aY ae aw ag -MD +ak aZ ak ak @@ -5317,7 +5305,7 @@ ak ak ak ak -MD +ak aT aj aj @@ -5328,7 +5316,7 @@ ak ak ak ak -MD +ak aT ao ar @@ -6294,7 +6282,7 @@ ak ak ak ak -iy +ap ar ac ac @@ -6474,7 +6462,7 @@ ac ac ad ag -MD +ak ak ak ak @@ -6822,7 +6810,7 @@ cl bd bd bd -cD +cC cH ba ak @@ -6929,7 +6917,7 @@ cm bd bd bd -cC +cD cH ba ak @@ -8956,7 +8944,7 @@ ak ak ak ak -MD +ak ak ak cu @@ -10328,7 +10316,7 @@ ac ac aw ag -MD +ak ak ak ak @@ -10436,7 +10424,7 @@ ad af ay ak -MD +ak ak ak ak @@ -10574,7 +10562,7 @@ ak ak cO ak -iy +ap ar ac ac @@ -10787,7 +10775,7 @@ ak ak ak aK -MD +ak ap ar ac @@ -10970,7 +10958,7 @@ ac ac ax ag -MD +ak ak ak ak @@ -11000,7 +10988,7 @@ ak ak ak ak -MD +ak bo aq ar @@ -15007,7 +14995,7 @@ ad ag al ak -MD +ak ap ar ab diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm similarity index 99% rename from _maps/RandomZLevels/caves.dmm rename to _maps/RandomZLevels/away_mission/caves.dmm index e9d592c107..c84acf0131 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/away_mission/caves.dmm @@ -924,8 +924,8 @@ /area/awaymission/caves/BMP_asteroid/level_two) "cK" = ( /obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'HOLY SHIT NIGGA WHAT ARE YOU DOING'."; - name = "\improper HOLY SHIT NIGGA WHAT ARE YOU DOING" + desc = "A warning sign which reads 'HOLY SHIT DUDE WHAT ARE YOU DOING'."; + name = "\improper HOLY SHIT DUDE WHAT ARE YOU DOING" }, /turf/closed/wall, /area/awaymission/caves/BMP_asteroid/level_two) diff --git a/_maps/RandomZLevels/challenge.dmm b/_maps/RandomZLevels/away_mission/challenge.dmm similarity index 100% rename from _maps/RandomZLevels/challenge.dmm rename to _maps/RandomZLevels/away_mission/challenge.dmm diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/away_mission/moonoutpost19.dmm similarity index 99% rename from _maps/RandomZLevels/moonoutpost19.dmm rename to _maps/RandomZLevels/away_mission/moonoutpost19.dmm index 0a08edb9b2..7457379bcd 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/away_mission/moonoutpost19.dmm @@ -18,7 +18,6 @@ /area/awaymission/moonoutpost19/hive) "ae" = ( /obj/machinery/computer/arcade{ - icon_state = "arcade"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -359,7 +358,6 @@ /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; plants_off = 1 }, /turf/open/floor/plating/asteroid{ @@ -435,9 +433,7 @@ }, /area/awaymission/moonoutpost19/syndicate) "aZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel/dark{ heat_capacity = 1e+006 }, @@ -490,9 +486,7 @@ /area/awaymission/moonoutpost19/syndicate) "bh" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 2 - }, +/obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel/dark{ heat_capacity = 1e+006 }, @@ -761,7 +755,7 @@ }, /area/awaymission/moonoutpost19/syndicate) "bF" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 1 }, /turf/open/floor/plasteel/freezer{ @@ -915,11 +909,9 @@ /area/awaymission/moonoutpost19/syndicate) "bT" = ( /obj/machinery/power/smes{ - charge = 0; input_level = 10000; inputting = 0; - output_level = 15000; - outputting = 1 + output_level = 15000 }, /obj/structure/cable{ icon_state = "0-8" @@ -961,7 +953,6 @@ /area/awaymission/moonoutpost19/hive) "bX" = ( /obj/machinery/conveyor{ - dir = 2; id = "awaysyndie" }, /obj/effect/turf_decal/stripes/line{ @@ -1334,8 +1325,7 @@ /area/awaymission/moonoutpost19/syndicate) "cC" = ( /obj/machinery/mineral/processing_unit{ - dir = 1; - output_dir = 2 + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1426,8 +1416,6 @@ "cK" = ( /obj/structure/cable, /obj/machinery/power/apc/highcap/fifteen_k{ - dir = 2; - locked = 1; name = "Worn-out APC"; pixel_y = -25; req_access = null; @@ -1472,12 +1460,9 @@ "cN" = ( /obj/structure/cable, /obj/machinery/power/port_gen/pacman{ - desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating{ heat_capacity = 1e+006 }, @@ -1486,12 +1471,9 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/port_gen/pacman/super{ - desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating{ heat_capacity = 1e+006 }, @@ -1823,7 +1805,6 @@ /obj/structure/closet/secure_closet{ desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_state = "cabinet"; - locked = 1; name = "personal closet"; req_access_txt = "150" }, @@ -2036,8 +2017,7 @@ /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; + icon_state = "platingdmg1"; temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) @@ -2059,23 +2039,11 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plating{ +/turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/syndicate) -"dM" = ( -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) "dN" = ( /obj/item/stack/ore/iron{ pixel_x = -7; @@ -2400,14 +2368,12 @@ /area/awaymission/moonoutpost19/research) "eK" = ( /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) "eL" = ( /obj/structure/alien/weeds, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) @@ -2467,7 +2433,6 @@ /area/awaymission/moonoutpost19/research) "eS" = ( /obj/machinery/power/port_gen/pacman{ - desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator" }, /obj/structure/cable{ @@ -2479,7 +2444,6 @@ /area/awaymission/moonoutpost19/research) "eT" = ( /obj/machinery/power/port_gen/pacman/super{ - desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, /obj/structure/cable{ @@ -2525,8 +2489,7 @@ charge = 1.5e+006; input_level = 10000; inputting = 0; - output_level = 15000; - outputting = 1 + output_level = 15000 }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -2619,9 +2582,7 @@ icon_state = "2-8" }, /obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -2655,7 +2616,6 @@ /area/awaymission/moonoutpost19/research) "fh" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/structure/table, @@ -2801,9 +2761,7 @@ icon_state = "1-4" }, /obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -3041,7 +2999,6 @@ "fT" = ( /obj/structure/closet/secure_closet{ icon_state = "sec"; - locked = 1; name = "security officer's locker"; req_access_txt = "201" }, @@ -3109,9 +3066,7 @@ icon_state = "1-2" }, /obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -3241,9 +3196,7 @@ pixel_x = 28 }, /obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -3471,9 +3424,7 @@ req_access = null; start_charge = 100 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -3626,9 +3577,7 @@ pixel_x = 23; req_access = null }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -3712,7 +3661,6 @@ "hb" = ( /obj/machinery/light{ active_power_usage = 0; - dir = 2; icon_state = "tube-broken"; status = 2 }, @@ -3826,7 +3774,6 @@ req_access_txt = "201" }, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) @@ -3842,7 +3789,6 @@ status = 2 }, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) @@ -3867,7 +3813,6 @@ "hq" = ( /obj/structure/closet/secure_closet{ icon_state = "rd"; - locked = 1; name = "research director's locker"; req_access_txt = "201" }, @@ -3885,7 +3830,6 @@ pixel_y = 2 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel/cafeteria{ @@ -3935,9 +3879,7 @@ }, /area/awaymission/moonoutpost19/research) "hw" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -4027,7 +3969,6 @@ }, /obj/machinery/light/small{ active_power_usage = 0; - dir = 2; icon_state = "bulb-broken"; status = 2 }, @@ -4121,7 +4062,7 @@ }, /area/awaymission/moonoutpost19/research) "hP" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -4303,7 +4244,6 @@ /obj/structure/closet/l3closet, /obj/machinery/light/small{ active_power_usage = 0; - dir = 2; icon_state = "bulb-broken"; status = 2 }, @@ -4453,7 +4393,6 @@ }, /obj/machinery/shower{ dir = 4; - icon_state = "shower"; name = "emergency shower" }, /obj/effect/turf_decal/stripes/line{ @@ -4473,7 +4412,7 @@ }, /area/awaymission/moonoutpost19/research) "iw" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 4 }, /obj/machinery/light/small{ @@ -4581,7 +4520,6 @@ }, /obj/machinery/light/small{ active_power_usage = 0; - dir = 2; icon_state = "bulb-broken"; status = 2 }, @@ -4623,9 +4561,7 @@ /area/awaymission/moonoutpost19/research) "iL" = ( /obj/machinery/light/small, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -4720,9 +4656,7 @@ /turf/closed/wall/rust, /area/awaymission/moonoutpost19/arrivals) "iU" = ( -/obj/machinery/vending/boozeomat{ - req_access_txt = "0" - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/plasteel/cafeteria{ dir = 5 }, @@ -4764,7 +4698,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "iZ" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 1 }, /turf/open/floor/plasteel/freezer{ @@ -5680,9 +5614,7 @@ /obj/machinery/door/firedoor/closed{ opacity = 0 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -5830,9 +5762,7 @@ /obj/structure/chair{ dir = 8 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6048,9 +5978,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "lG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6224,9 +6152,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "mh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; @@ -6237,7 +6163,6 @@ /obj/machinery/portable_atmospherics/canister/air, /obj/effect/decal/cleanable/dirt, /obj/structure/window{ - icon_state = "window"; dir = 1 }, /turf/open/floor/plating{ @@ -6271,7 +6196,6 @@ /area/awaymission/moonoutpost19/arrivals) "mm" = ( /obj/structure/closet/secure_closet{ - icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201" @@ -6375,9 +6299,7 @@ /area/awaymission/moonoutpost19/arrivals) "mx" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; @@ -6786,18 +6708,6 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) -"nu" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "nw" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue{ @@ -6842,9 +6752,7 @@ pixel_x = 23; req_access = null }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; @@ -7088,18 +6996,6 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/arrivals) -"nW" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) "nX" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -7117,9 +7013,7 @@ dir = 4 }, /obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; heat_capacity = 1e+006; @@ -7128,12 +7022,9 @@ /area/awaymission/moonoutpost19/arrivals) "nZ" = ( /obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ +/turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/main) "oa" = ( @@ -7163,12 +7054,9 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/plating{ +/turf/open/floor/plating/asteroid{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 251 + heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/main) "od" = ( @@ -7203,7 +7091,6 @@ /obj/structure/window/reinforced, /obj/structure/closet/secure_closet{ icon_state = "science"; - locked = 1; name = "scientist's locker"; req_access_txt = "201" }, @@ -36454,7 +36341,7 @@ hI hI hI hI -nW +lj ba ba ba @@ -36711,7 +36598,7 @@ zZ nA nK Wf -dM +ba ba ba ba @@ -36968,7 +36855,7 @@ zZ lM lN Wf -dM +ba ba ba ba @@ -37225,7 +37112,7 @@ hI nB nL hI -nW +lj ba ba ba @@ -40774,7 +40661,7 @@ du dx dC dI -dM +ba ba ba ba @@ -41594,13 +41481,13 @@ hJ lM lN hI -dM ba ba ba -dM -dM -dM +ba +ba +ba +ba od ba ba @@ -41857,7 +41744,7 @@ nZ nZ nZ oc -dM +ba ba ba ba @@ -42108,13 +41995,13 @@ hI nJ nR hJ -dM ba ba ba -dM -dM -dM +ba +ba +ba +ba ba oe ba @@ -42872,9 +42759,9 @@ lN hJ ba ba -dM -dM -nu +ba +ba +mO ba ba ba diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/away_mission/research.dmm similarity index 100% rename from _maps/RandomZLevels/research.dmm rename to _maps/RandomZLevels/away_mission/research.dmm diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/away_mission/snowdin.dmm similarity index 99% rename from _maps/RandomZLevels/snowdin.dmm rename to _maps/RandomZLevels/away_mission/snowdin.dmm index c24bf45f81..a40066df4f 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/away_mission/snowdin.dmm @@ -5939,7 +5939,7 @@ /turf/open/floor/plasteel, /area/awaymission/snowdin/post/garage) "mD" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 1 }, /obj/machinery/light/small, @@ -8796,7 +8796,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/awaymission/snowdin/post/cavern2) "tk" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, @@ -9643,7 +9643,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/awaymission/snowdin/post/cavern1) "vE" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/high_loot{ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/away_mission/spacebattle.dmm similarity index 99% rename from _maps/RandomZLevels/spacebattle.dmm rename to _maps/RandomZLevels/away_mission/spacebattle.dmm index 66d7f556b4..ca44e7d7b7 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/away_mission/spacebattle.dmm @@ -243,7 +243,7 @@ /area/awaymission/spacebattle/syndicate1) "bg" = ( /obj/structure/table/reinforced, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate1) "bh" = ( diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm similarity index 99% rename from _maps/RandomZLevels/undergroundoutpost45.dmm rename to _maps/RandomZLevels/away_mission/undergroundoutpost45.dmm index 33fdb7a28d..b4ba9869ed 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm @@ -261,9 +261,7 @@ /area/awaymission/undergroundoutpost45/central) "aO" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -423,7 +421,6 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet{ icon_state = "sec"; - locked = 1; name = "security officer's locker"; req_access_txt = "201" }, @@ -626,8 +623,7 @@ /area/awaymission/undergroundoutpost45/central) "bB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -652,8 +648,7 @@ /area/awaymission/undergroundoutpost45/central) "bD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -811,8 +806,7 @@ /area/awaymission/undergroundoutpost45/central) "bV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall, /area/awaymission/undergroundoutpost45/central) @@ -1260,7 +1254,6 @@ }, /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window{ - icon_state = "window"; dir = 8 }, /turf/open/floor/plating{ @@ -1282,7 +1275,6 @@ }, /obj/structure/reagent_dispensers/fueltank, /obj/structure/window{ - icon_state = "window"; dir = 4 }, /turf/open/floor/plating{ @@ -1291,8 +1283,7 @@ /area/awaymission/undergroundoutpost45/central) "cV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/central) @@ -1428,7 +1419,6 @@ /area/awaymission/undergroundoutpost45/central) "dm" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel{ @@ -1448,9 +1438,7 @@ layer = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 2 - }, +/obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -1729,7 +1717,6 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/effect/turf_decal/tile/green{ @@ -1858,9 +1845,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -2125,15 +2110,6 @@ icon_state = "platingdmg1" }, /area/awaymission/undergroundoutpost45/central) -"eu" = ( -/turf/open/floor/plating{ - initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; - heat_capacity = 1e+006; - icon_plating = "asteroidplating"; - icon_state = "asteroidplating"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) "ev" = ( /obj/item/clothing/under/misc/pj/red, /obj/structure/closet/secure_closet{ @@ -2328,9 +2304,7 @@ /obj/machinery/door/firedoor, /obj/item/folder/red, /obj/machinery/door/window/southleft{ - base_state = "left"; dir = 8; - icon_state = "left"; name = "Security Checkpoint"; req_access_txt = "201" }, @@ -2369,9 +2343,7 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/window/southleft{ - base_state = "left"; dir = 4; - icon_state = "left"; name = "Hydroponics Desk"; req_access_txt = "201" }, @@ -2508,9 +2480,7 @@ }, /area/awaymission/undergroundoutpost45/central) "fb" = ( -/obj/effect/turf_decal/tile/green{ - dir = 2 - }, +/obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -2568,7 +2538,6 @@ network = list("uo45") }, /obj/machinery/power/apc/highcap/fifteen_k{ - dir = 2; locked = 0; name = "Hydroponics APC"; pixel_y = -25; @@ -3055,15 +3024,13 @@ /area/awaymission/undergroundoutpost45/central) "gc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/central) "gd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/central) @@ -3319,7 +3286,6 @@ amount = 23 }, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) @@ -3327,7 +3293,6 @@ /obj/structure/table, /obj/item/storage/toolbox/mechanical, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) @@ -3452,7 +3417,6 @@ }, /obj/machinery/camera{ c_tag = "Research Lab"; - dir = 2; network = list("uo45","uo45r") }, /turf/open/floor/plasteel/white{ @@ -3461,7 +3425,6 @@ /area/awaymission/undergroundoutpost45/research) "gZ" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /turf/open/floor/plasteel/white{ @@ -3614,9 +3577,7 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "ho" = ( -/obj/machinery/vending/boozeomat{ - req_access_txt = "0" - }, +/obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -4531,8 +4492,7 @@ /area/awaymission/undergroundoutpost45/gateway) "iX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 @@ -4626,7 +4586,6 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "jf" = ( /obj/structure/closet/secure_closet{ - icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201" @@ -5169,7 +5128,6 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet{ icon_state = "rd"; - locked = 1; name = "research director's locker"; req_access_txt = "201" }, @@ -5934,7 +5892,6 @@ }, /obj/machinery/camera{ c_tag = "Gateway Ready Room"; - dir = 2; network = list("uo45","uo45r") }, /turf/open/floor/plasteel{ @@ -5971,7 +5928,6 @@ /obj/item/reagent_containers/spray/pepper, /obj/structure/closet/secure_closet{ icon_state = "sec"; - locked = 1; name = "security officer's locker"; req_access_txt = "201" }, @@ -6029,9 +5985,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6041,9 +5995,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6064,9 +6016,7 @@ dir = 1; network = list("uo45","uo45r") }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6081,9 +6031,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6096,9 +6044,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6115,9 +6061,7 @@ name = "Research Division Access"; req_access_txt = "201" }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6130,9 +6074,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6151,9 +6093,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6171,9 +6111,7 @@ pixel_y = -24 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6183,7 +6121,6 @@ icon_state = "0-8" }, /obj/machinery/power/apc/highcap/fifteen_k{ - dir = 2; locked = 0; name = "UO45 Research Division APC"; pixel_y = -25; @@ -6196,9 +6133,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6211,9 +6146,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6234,9 +6167,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6245,17 +6176,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "lM" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6270,9 +6197,7 @@ dir = 1; network = list("uo45","uo45r") }, -/obj/effect/turf_decal/tile/purple{ - dir = 2 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6408,7 +6333,6 @@ }, /obj/machinery/camera{ c_tag = "Engineering Secure Storage"; - dir = 2; network = list("uo45") }, /turf/open/floor/plating{ @@ -6472,7 +6396,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window{ - icon_state = "window"; dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -6547,9 +6470,7 @@ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -6744,7 +6665,6 @@ "mE" = ( /obj/structure/cable, /obj/machinery/power/apc/highcap/fifteen_k{ - dir = 2; locked = 0; name = "UO45 Gateway APC"; pixel_y = -25; @@ -7392,9 +7312,7 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/dark{ heat_capacity = 1e+006 }, @@ -7409,9 +7327,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark{ heat_capacity = 1e+006 }, @@ -7495,7 +7411,6 @@ }, /obj/machinery/computer/security/telescreen{ desc = "Used for monitoring the research division and the labs within."; - dir = 2; name = "research monitor"; network = list("uo45r") }, @@ -7687,7 +7602,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/camera{ c_tag = "Dormitories"; - dir = 2; network = list("uo45") }, /obj/effect/turf_decal/tile/neutral{ @@ -7943,8 +7857,7 @@ charge = 1.5e+006; input_level = 10000; inputting = 0; - output_level = 7000; - outputting = 1 + output_level = 7000 }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -7956,8 +7869,7 @@ charge = 1.5e+006; input_level = 30000; inputting = 0; - output_level = 7000; - outputting = 1 + output_level = 7000 }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -8091,9 +8003,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -8121,9 +8031,7 @@ "oJ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -8164,9 +8072,7 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "oM" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -8281,7 +8187,6 @@ dir = 1 }, /obj/machinery/power/port_gen/pacman{ - desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator" }, /obj/structure/cable{ @@ -8296,7 +8201,6 @@ dir = 1 }, /obj/machinery/power/port_gen/pacman/super{ - desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" }, /obj/item/wrench, @@ -8315,7 +8219,6 @@ dir = 1 }, /obj/machinery/power/port_gen/pacman{ - desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator" }, /obj/structure/cable{ @@ -8676,7 +8579,6 @@ /area/awaymission/undergroundoutpost45/engineering) "pE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos{ - dir = 2; icon_state = "in"; id_tag = "UO45_air_out"; name = "air out" @@ -8688,7 +8590,6 @@ /area/awaymission/undergroundoutpost45/engineering) "pF" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ - dir = 2; id = "UO45_air_in" }, /turf/open/floor/engine/air, @@ -9012,7 +8913,6 @@ /obj/item/clothing/glasses/hud/health, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white/corner{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) @@ -9025,7 +8925,6 @@ /obj/item/hand_labeler, /obj/item/clothing/neck/stethoscope, /turf/open/floor/plasteel/white/side{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) @@ -9248,7 +9147,6 @@ }, /obj/machinery/camera{ c_tag = "Atmospherics"; - dir = 2; network = list("uo45") }, /obj/structure/table, @@ -9257,7 +9155,6 @@ pixel_y = 5 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/item/multitool, @@ -9303,21 +9200,15 @@ dir = 10 }, /obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) "qN" = ( /obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -9560,7 +9451,6 @@ /area/awaymission/undergroundoutpost45/engineering) "rl" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/structure/tank_dispenser{ @@ -9643,7 +9533,6 @@ }, /obj/machinery/power/apc/highcap/fifteen_k{ dir = 8; - locked = 1; name = "UO45 Engineering APC"; pixel_x = -25; req_access = null; @@ -9683,7 +9572,6 @@ /obj/item/clothing/head/helmet, /obj/structure/closet/secure_closet{ icon_state = "sec"; - locked = 1; name = "security officer's locker"; req_access_txt = "201" }, @@ -9750,11 +9638,8 @@ "rx" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -10167,9 +10052,7 @@ name = "Privacy Shutters" }, /obj/machinery/door/window/southleft{ - base_state = "left"; dir = 4; - icon_state = "left"; name = "Engineering Reception"; req_access_txt = "201" }, @@ -10260,7 +10143,6 @@ "sj" = ( /obj/structure/cable, /obj/machinery/power/apc/highcap/fifteen_k{ - dir = 2; locked = 0; name = "UO45 Mining APC"; pixel_y = -25; @@ -10280,9 +10162,7 @@ }, /obj/item/storage/backpack/satchel/eng, /obj/item/clothing/gloves/fingerless, -/obj/effect/turf_decal/tile/brown{ - dir = 2 - }, +/obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -10290,8 +10170,7 @@ "sk" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "Mix to Distro"; - on = 0 + name = "Mix to Distro" }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 @@ -10955,9 +10834,7 @@ }, /area/awaymission/undergroundoutpost45/crew_quarters) "tv" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 2 - }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -10969,9 +10846,7 @@ /area/awaymission/undergroundoutpost45/engineering) "tw" = ( /obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 2 - }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/structure/window/reinforced{ dir = 4; layer = 2.9 @@ -11145,8 +11020,7 @@ /area/awaymission/undergroundoutpost45/engineering) "tK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) @@ -11404,11 +11278,8 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -11716,17 +11587,13 @@ }, /area/awaymission/undergroundoutpost45/research) "uL" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/plating{ heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/research) "uM" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/valve, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -11813,8 +11680,7 @@ /area/awaymission/undergroundoutpost45/engineering) "uV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /obj/structure/chair/office/dark{ dir = 8 @@ -12342,9 +12208,7 @@ /obj/structure/sign/warning/electricshock{ pixel_y = -32 }, -/obj/machinery/vending/engivend{ - req_access_txt = "0" - }, +/obj/machinery/vending/engivend, /obj/machinery/camera{ c_tag = "Engineering Foyer"; dir = 1; @@ -12402,11 +12266,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -12415,11 +12276,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -12428,11 +12286,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/turf_decal/bot{ - dir = 2 - }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel{ - dir = 2; heat_capacity = 1e+006 }, /area/awaymission/undergroundoutpost45/engineering) @@ -13274,7 +13129,6 @@ /area/awaymission/undergroundoutpost45/engineering) "xl" = ( /obj/machinery/conveyor{ - dir = 2; id = "UO45_mining" }, /obj/effect/turf_decal/stripes/line{ @@ -13328,7 +13182,6 @@ /area/awaymission/undergroundoutpost45/mining) "xq" = ( /obj/machinery/conveyor{ - dir = 2; id = "UO45_mining" }, /obj/structure/sign/warning/nosmoking{ @@ -13383,8 +13236,7 @@ /area/awaymission/undergroundoutpost45/mining) "xw" = ( /obj/machinery/mineral/processing_unit{ - dir = 1; - output_dir = 2 + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -13468,7 +13320,6 @@ /area/awaymission/undergroundoutpost45/mining) "xE" = ( /obj/machinery/conveyor{ - dir = 2; id = "UO45_mining" }, /obj/machinery/light/small{ @@ -13604,7 +13455,6 @@ /area/awaymission/undergroundoutpost45/mining) "xS" = ( /obj/machinery/mech_bay_recharge_port{ - icon_state = "recharge_port"; dir = 8 }, /obj/structure/cable{ @@ -42626,7 +42476,7 @@ tT gy uN hH -eu +eJ eJ ad ad @@ -42883,7 +42733,7 @@ tU uw uO vk -eu +eJ eJ eJ ad @@ -43140,7 +42990,7 @@ tV ux uP hH -eu +eJ eJ eJ eJ @@ -48811,7 +48661,7 @@ ww xZ yc ww -eu +eJ eJ eJ eJ @@ -49068,7 +48918,7 @@ xX ya yd yf -eu +eJ eJ eJ eJ @@ -49325,7 +49175,7 @@ xY yb ye ww -eu +eJ eJ eJ eJ @@ -51326,9 +51176,9 @@ ad ad ad ad -eu -eu -eu +eJ +eJ +eJ fn eJ eJ diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/away_mission/wildwest.dmm similarity index 99% rename from _maps/RandomZLevels/wildwest.dmm rename to _maps/RandomZLevels/away_mission/wildwest.dmm index 064be0907a..76c59a8e1d 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/away_mission/wildwest.dmm @@ -1610,7 +1610,7 @@ /turf/open/floor/plasteel/cafeteria, /area/awaymission/wildwest/mines) "fi" = ( -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /obj/effect/turf_decal/tile/blue{ dir = 4 }, diff --git a/_maps/cogstation.dm b/_maps/cogstation.dm new file mode 100644 index 0000000000..5c01aaec46 --- /dev/null +++ b/_maps/cogstation.dm @@ -0,0 +1 @@ +#define FORCE_MAP "_maps/cogstation.json" \ No newline at end of file diff --git a/_maps/cogstation.json b/_maps/cogstation.json new file mode 100644 index 0000000000..8adabe69a2 --- /dev/null +++ b/_maps/cogstation.json @@ -0,0 +1,11 @@ +{ + "map_name": "CogStation", + "map_path": "map_files/CogStation", + "map_file": "CogStation.dmm", + "shuttles": { + "cargo": "cargo_box", + "ferry": "ferry_fancy", + "whiteship": "whiteship_cog", + "emergency": "emergency_cog" + } +} \ No newline at end of file diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index be0bf9306e..2902cf12c4 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -60,7 +60,9 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/security/main) "aai" = ( @@ -1337,7 +1339,7 @@ /turf/open/floor/plasteel, /area/security/prison) "adf" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ dir = 1 }, /turf/open/floor/plasteel/freezer, @@ -2696,6 +2698,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/main) "afp" = ( @@ -3093,7 +3098,9 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "agd" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "age" = ( @@ -3986,9 +3993,6 @@ }, /obj/structure/closet/wardrobe/white, /obj/item/clothing/under/suit/waiter, -/obj/item/clothing/under/suit/waiter, -/obj/item/clothing/under/suit/waiter, -/obj/item/clothing/suit/straight_jacket, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "ahD" = ( @@ -4121,24 +4125,18 @@ /turf/open/floor/plasteel, /area/security/main) "ahO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, /obj/structure/chair/sofa/left{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "ahP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/mixed, /obj/item/clothing/under/costume/kilt, -/obj/item/clothing/under/costume/kilt, -/obj/item/clothing/under/dress/skirt/purple, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/beret, /obj/structure/sign/poster/official/fashion{ pixel_x = -32 }, @@ -4440,9 +4438,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -4672,13 +4667,13 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "aiB" = ( -/obj/machinery/vending/kink, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/sign/poster/official/fashion{ pixel_y = 32 }, +/obj/machinery/vending/autodrobe, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aiC" = ( @@ -5101,9 +5096,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -5529,9 +5521,6 @@ dir = 1; pixel_y = -24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -5547,14 +5536,14 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/security/main) "akj" = ( @@ -5794,6 +5783,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) +"akE" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/crew_quarters/fitness/pool) "akF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, @@ -5809,6 +5804,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/processing) +"akH" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/crew_quarters/bar) "akI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5828,6 +5827,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) +"akK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/engine, +/area/science/xenobiology) "akL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/meter, @@ -5861,6 +5864,10 @@ }, /turf/open/floor/plasteel, /area/security/main) +"akP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) "akQ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -5910,6 +5917,31 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/brig) +"akV" = ( +/obj/machinery/door/window/southleft{ + dir = 1; + name = "Test Chamber"; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "misclab"; + name = "test chamber blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) +"akW" = ( +/obj/machinery/door/window/southleft{ + name = "Test Chamber"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) "akX" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -5999,6 +6031,10 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) +"alf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "alg" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -6055,6 +6091,28 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"alm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"aln" = ( +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "alo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -6081,6 +6139,21 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/warden) +"alr" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "als" = ( /obj/machinery/door_timer{ id = "Cell 3"; @@ -6164,6 +6237,29 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"alx" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "aly" = ( /obj/structure/cable{ icon_state = "1-2" @@ -6350,13 +6446,27 @@ "alU" = ( /turf/closed/wall, /area/maintenance/port/fore) -"alX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +"alV" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"alW" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "alY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -6427,6 +6537,31 @@ }, /turf/open/floor/plasteel/dark, /area/security/warden) +"amh" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ami" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "amj" = ( /obj/machinery/door_timer{ id = "Cell 2"; @@ -6447,6 +6582,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) +"aml" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "amm" = ( /obj/structure/cable{ icon_state = "0-8" @@ -6469,6 +6610,12 @@ }, /turf/open/floor/plating, /area/security/brig) +"amo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "amp" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -6596,6 +6743,41 @@ /obj/item/coin/diamond, /turf/open/floor/plating, /area/maintenance/port/fore) +"amG" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"amH" = ( +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "amI" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -6668,6 +6850,31 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/security/brig) +"amP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"amQ" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) "amR" = ( /obj/structure/cable{ icon_state = "0-4" @@ -6688,6 +6895,24 @@ }, /turf/closed/wall/r_wall, /area/security/brig) +"amT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "amU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -6823,6 +7048,23 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"ano" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"anp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "anq" = ( /obj/structure/chair{ dir = 8 @@ -6874,6 +7116,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"anx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "any" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable{ @@ -7007,6 +7257,17 @@ /obj/item/bedsheet/blue, /turf/open/floor/plasteel, /area/security/brig) +"anN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "anO" = ( /obj/docking_port/stationary{ dir = 8; @@ -7195,6 +7456,33 @@ /obj/item/circuitboard/machine/monkey_recycler, /turf/open/floor/plating, /area/maintenance/port/fore) +"aop" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) +"aoq" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "aor" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -7205,6 +7493,24 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) +"aos" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio7"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "aot" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -7474,12 +7780,19 @@ /turf/open/floor/plating, /area/security/warden) "apa" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) +"apb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) "apc" = ( /obj/structure/chair/office/dark, /turf/open/floor/plasteel/showroomfloor, @@ -7637,6 +7950,26 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"apw" = ( +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio1"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "apx" = ( /obj/machinery/door/airlock/atmos/abandoned{ name = "Atmospherics Maintenance"; @@ -7705,7 +8038,9 @@ /area/maintenance/starboard/fore) "apF" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, /turf/open/floor/plating, /area/engine/atmos) "apG" = ( @@ -7734,13 +8069,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"apI" = ( -/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ - dir = 1 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/engine/atmos) "apJ" = ( /turf/closed/wall, /area/construction/mining/aux_base) @@ -7882,11 +8210,7 @@ /turf/open/floor/wood, /area/lawoffice) "aqa" = ( -/obj/structure/closet/secure_closet/personal{ - desc = "Swipe your ID on this locker to claim it. You can drag it around and use it as your own personal storage area. Very useful."; - name = "Personal ID-Locked Locker"; - pixel_y = 10 - }, +/obj/structure/closet/secure_closet/personal, /turf/open/floor/carpet, /area/crew_quarters/dorms) "aqb" = ( @@ -7991,6 +8315,9 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "aqm" = ( @@ -8021,11 +8348,7 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "aqo" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, +/obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/wood, /area/crew_quarters/dorms) "aqp" = ( @@ -8145,6 +8468,24 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"aqB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "aqC" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -8189,6 +8530,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"aqG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "aqH" = ( /obj/machinery/light{ dir = 1; @@ -8277,6 +8626,11 @@ "aqR" = ( /turf/open/floor/plating, /area/maintenance/fore) +"aqS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "aqT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -8454,6 +8808,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"ars" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "art" = ( /obj/machinery/light/small{ dir = 1 @@ -8846,14 +9208,10 @@ /area/security/vacantoffice/b) "ask" = ( /obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 + pixel_x = -2; + pixel_y = 15 }, +/obj/structure/dresser, /turf/open/floor/wood, /area/crew_quarters/dorms) "asl" = ( @@ -8864,7 +9222,6 @@ /turf/open/floor/plating, /area/security/vacantoffice/b) "asm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/chair/comfy/brown{ dir = 4 }, @@ -8933,6 +9290,12 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"asr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/science/xenobiology) "ass" = ( /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Airlock" @@ -8999,6 +9362,13 @@ "asB" = ( /turf/closed/wall, /area/maintenance/department/electrical) +"asC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/science/xenobiology) "asD" = ( /obj/structure/table/wood, /mob/living/simple_animal/pet/fox/Renault, @@ -9830,6 +10200,9 @@ name = "Dormitories Maintenance"; req_access_txt = "12" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "avy" = ( @@ -10285,6 +10658,9 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "awz" = ( @@ -10333,21 +10709,7 @@ /obj/structure/closet{ name = "Holodeck Outfits" }, -/obj/item/clothing/under/trek/Q, -/obj/item/clothing/under/trek/command/next, -/obj/item/clothing/under/trek/command/next, -/obj/item/clothing/under/trek/command/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/engsec/next, -/obj/item/clothing/under/trek/medsci/next, -/obj/item/clothing/under/trek/medsci/next, -/obj/item/clothing/under/trek/medsci/next, /obj/item/clothing/under/misc/blue_camo, -/obj/item/clothing/under/misc/blue_camo, -/obj/item/clothing/under/costume/gladiator, -/obj/item/clothing/under/costume/gladiator, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -11677,7 +12039,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aAs" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/plating, @@ -13056,7 +13418,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/cryopod) "aDL" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/structure/mirror{ @@ -13556,8 +13918,7 @@ /area/crew_quarters/dorms) "aFk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 + dir = 4 }, /turf/open/floor/wood, /area/crew_quarters/bar) @@ -13944,7 +14305,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) "aGk" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/structure/mirror{ @@ -14057,13 +14418,12 @@ /turf/closed/wall, /area/crew_quarters/theatre) "aGw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/wood, /area/crew_quarters/bar) "aGx" = ( @@ -14488,8 +14848,10 @@ /turf/open/floor/plasteel, /area/gateway) "aHw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/wood, /area/crew_quarters/dorms) "aHx" = ( @@ -14712,10 +15074,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aHV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1; - pixel_x = 5 - }, /obj/machinery/light/small{ dir = 4 }, @@ -14728,6 +15086,9 @@ /obj/item/reagent_containers/rag/towel/random, /obj/item/reagent_containers/rag/towel/random, /obj/item/reagent_containers/rag/towel/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet) "aHY" = ( @@ -16335,10 +16696,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/sign/poster/contraband/robust_softdrinks{ - pixel_x = -32; - pixel_y = 32 - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aMh" = ( @@ -17561,7 +17918,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/status_display/evac, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ id = "bridge blast"; @@ -17586,21 +17942,6 @@ }, /turf/open/floor/plating, /area/bridge) -"aPW" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/status_display/evac, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plating, -/area/bridge) "aPX" = ( /obj/structure/cable{ icon_state = "0-8" @@ -17924,7 +18265,6 @@ /obj/structure/closet/wardrobe/white, /obj/item/clothing/suit/ghost_sheet, /obj/item/clothing/suit/ghost_sheet, -/obj/item/clothing/suit/ghost_sheet, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQP" = ( @@ -17952,10 +18292,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQV" = ( -/obj/machinery/vending/autodrobe/all_access, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/vending/clothing, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQW" = ( @@ -17969,7 +18309,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/vending/games, +/obj/machinery/vending/kink, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aQY" = ( @@ -18452,9 +18792,6 @@ name = "Station Intercom (General)"; pixel_x = -27 }, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/russobluecamohat, /obj/item/clothing/head/russobluecamohat, /turf/open/floor/plasteel, /area/crew_quarters/locker) @@ -18775,6 +19112,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port) "aSY" = ( @@ -18937,7 +19275,6 @@ dir = 8 }, /obj/item/clothing/under/costume/kilt, -/obj/item/clothing/under/costume/kilt, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTy" = ( @@ -19455,11 +19792,6 @@ department = "Locker Room"; pixel_x = -32 }, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/under/color/grey, -/obj/item/clothing/under/color/grey, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aUW" = ( @@ -20070,13 +20402,6 @@ "aWn" = ( /obj/structure/closet/wardrobe/black, /obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/civilian/janitor/maid, -/obj/item/clothing/under/rank/civilian/janitor/maid, -/obj/item/clothing/under/costume/maid, -/obj/item/clothing/under/costume/maid, -/obj/item/clothing/accessory/maidapron, -/obj/item/clothing/accessory/maidapron, -/obj/item/clothing/head/beret/black, /obj/item/clothing/head/beret/black, /turf/open/floor/plasteel, /area/crew_quarters/locker) @@ -21425,12 +21750,10 @@ dir = 4; pixel_x = 11 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/structure/mirror{ pixel_x = 28 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "aZp" = ( @@ -21467,7 +21790,7 @@ /turf/open/floor/plating, /area/maintenance/port) "aZt" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/structure/mirror{ @@ -21503,6 +21826,7 @@ /area/crew_quarters/toilet/locker) "aZw" = ( /obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "aZx" = ( @@ -21861,6 +22185,7 @@ c_tag = "Locker Room Toilets"; dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bax" = ( @@ -21995,13 +22320,6 @@ /area/maintenance/port) "baO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "baP" = ( @@ -22187,9 +22505,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bbs" = ( @@ -22556,9 +22872,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bct" = ( -/obj/structure/chair/wood/wings, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) "bcu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -23035,13 +23350,12 @@ /turf/open/floor/carpet, /area/bridge/meeting_room) "bdJ" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 +/obj/machinery/door/airlock{ + id_tag = "LockerShitter3"; + name = "Unit 3" }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "bdK" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -23058,6 +23372,7 @@ dir = 8 }, /obj/structure/bedsheetbin/color, +/obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/locker) "bdN" = ( @@ -23607,13 +23922,6 @@ }, /turf/closed/wall, /area/maintenance/disposal) -"bfa" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/wood/fifty{ - amount = 20 - }, -/turf/open/floor/plating, -/area/maintenance/port) "bfb" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -23802,9 +24110,6 @@ "bfC" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bfD" = ( @@ -24092,14 +24397,12 @@ /turf/open/floor/plating, /area/maintenance/port) "bgr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/maintenance/port) -"bgs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/table/wood/fancy/purple, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/door/airlock{ + id_tag = "LockerShitter4"; + name = "Unit 4" + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "bgt" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -24357,9 +24660,6 @@ /obj/machinery/camera{ c_tag = "Chemistry" }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, /obj/machinery/chem_heater, /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -24717,7 +25017,7 @@ dir = 4 }, /turf/closed/wall, -/area/maintenance/port) +/area/crew_quarters/toilet/locker) "bhR" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -26479,7 +26779,9 @@ /turf/open/floor/plating, /area/maintenance/disposal) "blU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/wood, /area/crew_quarters/dorms) "blV" = ( @@ -27397,6 +27699,10 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "boc" = ( @@ -28857,14 +29163,7 @@ /turf/open/floor/plating, /area/maintenance/starboard) "brz" = ( -/obj/structure/table, -/obj/item/pen, -/obj/machinery/camera{ - c_tag = "Experimentor Lab"; - network = list("ss13","rd") - }, -/obj/item/hand_labeler, -/obj/item/stack/packageWrap, +/obj/machinery/rnd/bepis, /turf/open/floor/plasteel/white/side, /area/science/explab) "brA" = ( @@ -28881,11 +29180,14 @@ "brC" = ( /obj/structure/table, /obj/item/folder/white, -/obj/item/folder/white, /obj/machinery/airalarm{ pixel_y = 23 }, /obj/item/radio/off, +/obj/machinery/camera{ + c_tag = "Experimentor Lab"; + network = list("ss13","rd") + }, /turf/open/floor/plasteel/white/side, /area/science/explab) "brD" = ( @@ -33975,7 +34277,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, /area/science/storage) "bCY" = ( /obj/effect/turf_decal/tile/blue{ @@ -34040,7 +34345,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, /area/science/storage) "bDg" = ( /obj/structure/rack, @@ -34065,7 +34373,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, /area/science/storage) "bDk" = ( /obj/structure/table, @@ -34413,7 +34724,8 @@ icon_state = "4-8" }, /obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, /area/science/storage) "bDZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -34434,13 +34746,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, /area/science/storage) "bEc" = ( /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, /area/science/storage) "bEd" = ( /obj/structure/disposalpipe/segment{ @@ -34564,7 +34878,7 @@ "bEo" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/engine, /area/science/storage) "bEp" = ( /obj/machinery/portable_atmospherics/canister/toxins, @@ -34572,7 +34886,7 @@ pixel_y = 32 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/open/floor/engine, /area/science/storage) "bEq" = ( /obj/machinery/power/apc{ @@ -35168,7 +35482,10 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, /area/science/storage) "bFJ" = ( /obj/structure/bed, @@ -35701,7 +36018,8 @@ /area/medical/medbay/central) "bGY" = ( /obj/machinery/portable_atmospherics/scrubber/huge, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, /area/science/storage) "bGZ" = ( /obj/machinery/holopad, @@ -35764,7 +36082,8 @@ dir = 4; network = list("ss13","rd") }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, /area/science/storage) "bHf" = ( /obj/structure/disposalpipe/segment, @@ -36394,20 +36713,23 @@ "bIz" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, +/turf/open/floor/engine, /area/science/storage) "bIA" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, +/turf/open/floor/engine, /area/science/storage) "bIB" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, +/turf/open/floor/engine, /area/science/storage) "bIC" = ( -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, /area/science/storage) "bID" = ( /obj/structure/disposalpipe/segment{ @@ -36909,21 +37231,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"bJL" = ( -/obj/machinery/door/window/southleft{ - dir = 1; - name = "Test Chamber"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "misclab"; - name = "test chamber blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) "bJM" = ( /obj/structure/cable{ icon_state = "0-8" @@ -37512,14 +37819,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bLa" = ( -/obj/machinery/door/window/southleft{ - name = "Test Chamber"; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/science/xenobiology) "bLb" = ( /obj/structure/cable{ icon_state = "1-2" @@ -37767,33 +38066,38 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/open/floor/plasteel/checker, +/turf/open/floor/plasteel, /area/hallway/primary/aft) "bLI" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bLJ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, +/obj/machinery/computer/atmos_control, /turf/open/floor/plasteel, /area/engine/atmos) "bLK" = ( /turf/closed/wall/r_wall, /area/engine/atmos) "bLL" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, +/obj/machinery/computer/station_alert, +/obj/machinery/airalarm{ + pixel_y = 23 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bLM" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, +/obj/machinery/computer/atmos_alert, /turf/open/floor/plasteel, /area/engine/atmos) "bLN" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, +/obj/machinery/button/door{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = 24; + pixel_y = 4; + req_access_txt = "24" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bLO" = ( @@ -37836,7 +38140,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/chem_dispenser, +/obj/machinery/chem_dispenser/apothecary, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bLV" = ( @@ -38158,25 +38462,11 @@ /turf/closed/wall, /area/engine/atmos) "bML" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bMM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/plasteel, /area/engine/atmos) "bMN" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater, /turf/open/floor/plasteel, /area/engine/atmos) "bMO" = ( @@ -38245,16 +38535,8 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bMY" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) "bMZ" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 - }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, /turf/open/floor/plasteel, /area/engine/atmos) "bNb" = ( @@ -38534,18 +38816,20 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/loading_area{ dir = 8 }, -/turf/open/floor/plasteel/dark/corner, +/turf/open/floor/plasteel, /area/hallway/primary/aft) "bNP" = ( /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -30 +/obj/effect/turf_decal/loading_area{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -38560,9 +38844,6 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /obj/machinery/camera{ c_tag = "Atmospherics Monitoring" }, @@ -38589,6 +38870,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bNU" = ( @@ -38628,17 +38912,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/science/misc_lab) -"bOa" = ( +"bOb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bOb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bOc" = ( @@ -38646,6 +38924,9 @@ dir = 1; name = "Mix to Distro" }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bOd" = ( @@ -38665,16 +38946,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) -"bOg" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Incinerator" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bOh" = ( /obj/structure/grille, /turf/closed/wall/r_wall, @@ -38976,15 +39247,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"bOQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bOR" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -38992,15 +39254,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bOS" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bOT" = ( @@ -39036,9 +39292,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bOW" = ( -/obj/machinery/computer/atmos_control{ - dir = 8 - }, /obj/machinery/requests_console{ department = "Atmospherics"; departmentType = 4; @@ -39048,8 +39301,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/machinery/computer/atmos_control{ + dir = 8 }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) @@ -39098,53 +39351,54 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "bPc" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Mix to Waste" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bPd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) -"bPd" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste In" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bPe" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Ports" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPf" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Mix" - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "bPg" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix Outlet Pump" +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPh" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) "bPi" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -39152,6 +39406,9 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPj" = ( @@ -39267,14 +39524,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPy" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/comfy/black, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bPz" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -39310,41 +39559,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"bPB" = ( -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bPC" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bPD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bPE" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -39567,20 +39781,15 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) -"bQf" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/checker, -/area/hallway/primary/aft) "bQg" = ( /turf/open/floor/plasteel, /area/hallway/primary/aft) "bQh" = ( -/obj/structure/tank_dispenser{ - pixel_x = -1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) "bQi" = ( @@ -39604,15 +39813,15 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bQl" = ( -/obj/machinery/computer/atmos_control{ +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/atmos_alert{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bQm" = ( @@ -39625,15 +39834,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/engine/atmos) -"bQo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bQp" = ( /obj/structure/cable{ @@ -39664,14 +39870,11 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) -"bQr" = ( -/obj/structure/closet/crate, -/turf/open/floor/plasteel, -/area/engine/atmos) "bQs" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "Mix to Filter" + name = "Air to Waste" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -39681,20 +39884,9 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bQu" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bQv" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bQw" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, /turf/open/floor/plasteel, @@ -39718,6 +39910,9 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bQA" = ( @@ -39787,18 +39982,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/tcommsat/computer) -"bQL" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bQM" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -40007,14 +40190,15 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/open/floor/plasteel/dark/corner, +/turf/open/floor/plasteel, /area/hallway/primary/aft) "bRr" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/tank_dispenser, /turf/open/floor/plasteel, /area/engine/atmos) "bRs" = ( @@ -40037,12 +40221,12 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bRu" = ( -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bRv" = ( @@ -40056,25 +40240,20 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bRw" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, +/obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plasteel, /area/engine/atmos) "bRx" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/engine/atmos) -"bRy" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bRz" = ( -/obj/machinery/atmospherics/components/trinary/mixer{ - dir = 8 +"bRy" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -40085,12 +40264,13 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bRB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Waste to Filter" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bRC" = ( @@ -40118,18 +40298,8 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bRF" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRG" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Ports" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -40148,23 +40318,25 @@ /turf/open/floor/plating, /area/engine/atmos) "bRJ" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Unfiltered & Air to Mix" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bRK" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 }, +/obj/structure/lattice, /turf/open/space, /area/space/nearstation) "bRL" = ( @@ -40266,16 +40438,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"bRX" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bRY" = ( /obj/structure/window/reinforced, /obj/structure/table/reinforced, @@ -40460,27 +40622,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bSB" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/engine/atmos) "bSC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -40490,114 +40631,38 @@ /turf/open/floor/plating, /area/engine/atmos) "bSD" = ( -/obj/structure/sign/plaques/atmos{ - pixel_y = -32 - }, -/obj/structure/table, -/obj/item/storage/box, -/obj/item/storage/box, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSE" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = 24; - pixel_y = 4; +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Monitoring"; req_access_txt = "24" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, /area/engine/atmos) "bSF" = ( -/obj/structure/table, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/head/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/multitool, -/obj/item/clothing/glasses/welding, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSG" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSH" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/storage/belt/utility, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/t_scanner, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/plasteel, /area/engine/atmos) "bSI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSJ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"bSK" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 6 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/atmos) "bSM" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"bSN" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) "bSP" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) "bSQ" = ( @@ -40694,71 +40759,6 @@ /obj/machinery/vending/medical, /turf/open/floor/plasteel/white, /area/medical/virology) -"bTa" = ( -/obj/machinery/door/window/northleft{ - dir = 4; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bTb" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bTc" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"bTd" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/science/xenobiology) -"bTe" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window/northleft{ - dir = 4; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) "bTf" = ( /obj/structure/rack, /obj/item/wrench, @@ -41001,16 +41001,23 @@ /area/engine/atmos) "bTM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/engine/atmos) -"bTN" = ( -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring"; - req_access_txt = "24" +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) +"bTN" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/atmos) "bTO" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 6 @@ -41023,30 +41030,11 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bTQ" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTR" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTS" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) "bTT" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bTU" = ( @@ -41058,11 +41046,12 @@ "bTV" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "N2O Outlet Pump" + name = "N2O to Pure" }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "bTW" = ( @@ -41146,16 +41135,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"bUf" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "bUg" = ( /obj/structure/window/reinforced{ dir = 1 @@ -41252,7 +41231,7 @@ /area/science/circuit) "bUr" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 10 }, /turf/open/space, @@ -41395,6 +41374,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/decal/cleanable/oil{ + icon_state = "floor5" + }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bUJ" = ( @@ -41425,31 +41407,15 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 + dir = 9 }, /turf/open/floor/plasteel, /area/engine/atmos) "bUN" = ( -/obj/item/beacon, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUO" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Port" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUP" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Port" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUQ" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Pure to Port" +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -41468,11 +41434,14 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "bUU" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/atmospherics/miner/n2o, +/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, /turf/open/floor/engine/n2o, /area/engine/atmos) "bUV" = ( @@ -41483,6 +41452,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bUY" = ( @@ -41832,6 +41802,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/suit_storage_unit/atmos, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bVS" = ( @@ -41848,17 +41822,10 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bVU" = ( -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/plasteel, -/area/engine/atmos) "bVV" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bVW" = ( @@ -41878,32 +41845,16 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/atmos) -"bVY" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) "bVZ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWa" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWb" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Ports to External" }, /turf/open/floor/plasteel, /area/engine/atmos) "bWc" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -42187,21 +42138,21 @@ }, /area/engine/atmos) "bWN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 }, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWO" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ +/turf/open/floor/plasteel/dark/corner{ dir = 1 }, -/obj/machinery/meter, +/area/engine/atmos) +"bWO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, /turf/closed/wall/r_wall, /area/engine/atmos) "bWP" = ( @@ -42225,42 +42176,15 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bWS" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics West"; - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWT" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Port" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bWU" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Mix to Engine" }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bWV" = ( @@ -42347,42 +42271,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"bXe" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/science/xenobiology) -"bXf" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"bXg" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window/northleft{ - dir = 4; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) "bXh" = ( /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/plasteel, @@ -42610,23 +42498,10 @@ }, /area/engine/atmos) "bXK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, /turf/closed/wall/r_wall, /area/engine/atmos) -"bXL" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"bXM" = ( -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics"; - req_access_txt = "24" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bXN" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -42666,29 +42541,7 @@ /obj/structure/fireaxecabinet{ pixel_x = -32 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXR" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/cartridge/atmos, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXT" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bXU" = ( @@ -42704,11 +42557,19 @@ }, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "Plasma Outlet Pump" + name = "Plasma to Pure" }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXW" = ( @@ -43010,31 +42871,19 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bYJ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/break_room) -"bYK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/checker, -/area/engine/break_room) "bYL" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, -/area/engine/break_room) +/area/engine/atmos) "bYM" = ( /obj/machinery/airalarm{ dir = 1; @@ -43052,9 +42901,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bYN" = ( -/turf/closed/wall, -/area/security/checkpoint/engineering) "bYO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43066,35 +42912,27 @@ /turf/closed/wall, /area/crew_quarters/bar) "bYQ" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bYR" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/engine/atmos) -"bYS" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bYT" = ( /obj/machinery/computer/atmos_control/tank/toxin_tank{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/engine/atmos) "bYU" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/machinery/atmospherics/miner/toxins, +/obj/effect/turf_decal/vg_decals/atmos/plasma, /turf/open/floor/engine/plasma, /area/engine/atmos) "bYV" = ( @@ -43105,6 +42943,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bYX" = ( @@ -43388,42 +43227,29 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bZG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/cable{ icon_state = "1-8" }, /turf/open/floor/plasteel, /area/engine/atmos) -"bZH" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/item/wrench, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bZI" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bZJ" = ( +"bZK" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ dir = 1 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bZK" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bZL" = ( @@ -43806,57 +43632,9 @@ }, /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) -"caE" = ( -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 4; - name = "Atmos RC"; - pixel_x = 30 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"caF" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics Central"; - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"caG" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"caH" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/engine/atmos) -"caI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "caJ" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space, /area/space/nearstation) "caK" = ( @@ -43981,38 +43759,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"caV" = ( -/obj/machinery/door/window/northleft{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) -"caW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window/northleft{ - dir = 4; - name = "Containment Pen"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "containment blast door" - }, -/turf/open/floor/engine, -/area/science/xenobiology) "caX" = ( /obj/machinery/sparker{ id = "testigniter"; @@ -44296,42 +44042,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"cbB" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cbC" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cbD" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cbE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cbF" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/item/cigbutt, -/turf/open/floor/plasteel, -/area/engine/atmos) "cbG" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "CO2 Outlet Pump" + name = "CO2 to Pure" }, /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -44340,6 +44054,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cbH" = ( @@ -44355,9 +44070,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 10 - }, /turf/open/floor/plating, /area/maintenance/aft) "cbK" = ( @@ -44440,13 +44152,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/science/xenobiology) -"cbT" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cbU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44708,24 +44413,12 @@ dir = 4; pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "ccw" = ( /turf/closed/wall/r_wall, /area/engine/engineering) -"ccx" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"ccy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "ccz" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -44741,11 +44434,11 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "ccB" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/miner/carbon_dioxide, +/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "ccC" = ( @@ -44756,6 +44449,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "ccE" = ( @@ -44850,10 +44544,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ccP" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "ccQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45066,52 +44756,24 @@ dir = 4; pixel_x = -22 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cdx" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"cdy" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cdz" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "O2 to Pure" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cdA" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cdB" = ( +"cdC" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ dir = 1 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cdC" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "cdD" = ( @@ -45124,9 +44786,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/aft) "cdF" = ( @@ -45453,6 +45112,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cey" = ( @@ -45476,26 +45136,19 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 }, /turf/open/floor/plasteel, /area/engine/atmos) -"ceC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/maintenance/aft) "ceD" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/aft) "ceE" = ( @@ -45503,6 +45156,9 @@ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/aft) "ceF" = ( @@ -45705,21 +45361,29 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cfi" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/engine/atmos) "cfj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/closed/wall, /area/maintenance/disposal/incinerator) "cfk" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/atmos{ name = "Turbine Access"; req_access_txt = "32" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cfl" = ( @@ -45934,17 +45598,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"cfN" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cfO" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plasteel, -/area/engine/atmos) "cfP" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse{ dir = 4 }, /turf/open/floor/plasteel, @@ -45956,22 +45611,11 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"cfR" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cfT" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "cfU" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/disposal/incinerator) "cfW" = ( @@ -45981,7 +45625,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plating, /area/maintenance/aft) "cfX" = ( @@ -45991,7 +45634,9 @@ pixel_y = -24 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/open/floor/plating, /area/maintenance/aft) "cfY" = ( @@ -46001,14 +45646,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cfZ" = ( /obj/machinery/light_switch{ pixel_y = 26 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cga" = ( @@ -46347,11 +45993,12 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cgW" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -46359,11 +46006,17 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cgX" = ( /obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cgY" = ( @@ -46378,6 +46031,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cgZ" = ( @@ -46388,17 +46044,22 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cha" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "chb" = ( @@ -46413,6 +46074,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "chc" = ( @@ -46422,6 +46086,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "chd" = ( @@ -46429,6 +46096,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "che" = ( @@ -46482,15 +46152,17 @@ /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "chk" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/closed/wall, /area/maintenance/disposal/incinerator) "chl" = ( /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "atmospherics mix pump" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) @@ -46505,16 +46177,13 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/maintenance/disposal/incinerator) "chn" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cho" = ( @@ -46555,13 +46224,6 @@ /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/circuit/telecomms, /area/science/xenobiology) -"cht" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "chu" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -46931,13 +46593,16 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "ciu" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/engine/atmos) "civ" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plating, /area/engine/atmos) "cix" = ( @@ -46972,12 +46637,15 @@ /obj/effect/decal/cleanable/cobweb, /obj/structure/reagent_dispensers/watertank, /obj/item/extinguisher, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "ciC" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 }, /turf/open/space, /area/space/nearstation) @@ -47308,35 +46976,16 @@ /turf/open/floor/plasteel, /area/construction) "cjp" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, /obj/structure/reagent_dispensers/fueltank, /obj/item/storage/toolbox/emergency, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"cjq" = ( -/obj/machinery/atmospherics/components/binary/valve{ - name = "Mix to Space" +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cjr" = ( /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"cjs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"cjt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cju" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -47345,9 +46994,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cjv" = ( @@ -47357,10 +47003,6 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cjw" = ( @@ -47373,9 +47015,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/disposal/incinerator) "cjy" = ( @@ -47640,30 +47280,27 @@ /area/engine/atmos) "cke" = ( /obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "ckf" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "ckg" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/meter, +/obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "ckh" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to MiniSat" - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"cki" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 + dir = 4; + name = "atmospherics mix pump" }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) @@ -47674,17 +47311,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"ckk" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Incinerator to Space" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ckl" = ( /obj/machinery/portable_atmospherics/canister, /obj/effect/decal/cleanable/cobweb, @@ -47698,11 +47324,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/aft) -"ckn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/science/xenobiology) "cko" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -47961,7 +47582,6 @@ /area/engine/atmos) "cld" = ( /obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/binary/pump{ dir = 4; name = "Mix to Incinerator" @@ -47979,19 +47599,6 @@ /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"clg" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -29 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/plating, -/area/maintenance/disposal/incinerator) "clh" = ( /obj/machinery/light/small, /obj/structure/extinguisher_cabinet{ @@ -48022,7 +47629,6 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "clk" = ( @@ -48253,8 +47859,6 @@ "clO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/grey, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/under/misc/assistantformal, /obj/machinery/camera{ c_tag = "Dorms East - Holodeck"; dir = 4 @@ -48277,16 +47881,14 @@ /turf/open/floor/plasteel, /area/engine/engineering) "clT" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/miner/nitrogen, +/obj/effect/turf_decal/vg_decals/atmos/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "clU" = ( /turf/open/floor/engine/n2, /area/engine/atmos) "clV" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/atmospherics/miner/oxygen, +/obj/effect/turf_decal/vg_decals/atmos/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "clW" = ( @@ -48300,9 +47902,11 @@ /turf/open/floor/engine/air, /area/engine/atmos) "cmb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cmd" = ( /turf/closed/wall/r_wall, @@ -48312,20 +47916,14 @@ /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "cmf" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4; + name = "Incinerator to Space" }, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ - pixel_x = 38; - pixel_y = 6 - }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cmg" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden{ @@ -48541,10 +48139,12 @@ /area/engine/engineering) "cmU" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/miner/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "cmV" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/miner/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "cmW" = ( @@ -49294,8 +48894,8 @@ "cpn" = ( /obj/machinery/light, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/engine/engine_smes) @@ -49820,10 +49420,6 @@ }, /turf/open/space, /area/space/nearstation) -"csk" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, -/area/space/nearstation) "csl" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -49879,8 +49475,8 @@ /area/ai_monitored/turret_protected/aisat_interior) "csM" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/structure/transit_tube/crossing/horizontal, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space, /area/space/nearstation) "csN" = ( @@ -49946,7 +49542,7 @@ /area/ai_monitored/turret_protected/aisat_interior) "ctd" = ( /obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space, /area/space/nearstation) "ctg" = ( @@ -50211,13 +49807,6 @@ /obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"ctN" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) "ctP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -50313,8 +49902,8 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "ctY" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat/atmos) "ctZ" = ( @@ -50394,11 +49983,11 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "cuh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/structure/rack, /obj/item/wrench, /obj/item/crowbar/red, /obj/item/clothing/head/welding, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/atmos) "cui" = ( @@ -50431,7 +50020,7 @@ /area/ai_monitored/turret_protected/aisat/service) "cun" = ( /obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to MiniSat" + name = "Incinerator to MiniSat" }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -52331,24 +51920,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "cBn" = ( -/obj/structure/closet, -/obj/item/stack/tile/carpet/royalblue{ - amount = 24 +/obj/structure/sink{ + dir = 4; + pixel_x = 11 }, -/obj/item/stack/tile/carpet/green{ - amount = 24 +/obj/structure/mirror{ + pixel_x = 28 }, -/obj/item/stack/tile/carpet/purple{ - amount = 24 - }, -/obj/item/stack/tile/carpet/orange{ - amount = 24 - }, -/obj/item/stack/tile/wood{ - amount = 24 - }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) "cBo" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -52466,23 +52046,12 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "cBF" = ( +/obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 8 }, -/obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/engine/atmos) -"cBG" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cBH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52495,9 +52064,6 @@ /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "cBJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/engine/atmos) @@ -52541,8 +52107,8 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cBP" = ( -/obj/machinery/portable_atmospherics/canister/air, /obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/vg_decals/atmos/air, /turf/open/floor/engine/air, /area/engine/atmos) "cBS" = ( @@ -52672,9 +52238,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "cCB" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cCC" = ( @@ -52684,18 +52248,16 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cCD" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine" +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "cCE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ +/obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "cCF" = ( @@ -52836,6 +52398,19 @@ /obj/structure/closet/boxinggloves, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"cFG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) "cGz" = ( /obj/structure/table/wood, /obj/item/instrument/violin, @@ -53190,6 +52765,10 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"cLS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/vacantoffice/b) "cMC" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -53220,10 +52799,6 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) -"cMS" = ( -/obj/item/chair/wood, -/turf/open/floor/plating, -/area/maintenance/port) "cNa" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -53881,21 +53456,29 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) -"daI" = ( -/obj/structure/reagent_dispensers/foamtank, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +"daq" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 }, -/obj/effect/turf_decal/stripes/box, /turf/open/floor/plasteel, /area/engine/atmos) +"daI" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dbb" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/engine/atmos) "dbU" = ( /obj/structure/light_construct{ dir = 1 @@ -53965,6 +53548,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"diH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/atmos, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "dly" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54050,6 +53647,13 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"dAe" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) "dBm" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, @@ -54072,6 +53676,16 @@ }, /turf/open/floor/plasteel, /area/security/range) +"dEX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/requests_console{ + department = "Atmospherics"; + departmentType = 4; + name = "Atmos RC"; + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "dFX" = ( /turf/closed/wall, /area/crew_quarters/fitness/pool) @@ -54094,6 +53708,13 @@ /obj/structure/chair/stool/bar, /turf/open/floor/wood, /area/maintenance/bar) +"dMj" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "dMZ" = ( /obj/structure/sign/poster/official/random{ pixel_y = 32 @@ -54126,6 +53747,13 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"dQD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Incinerator to MiniSat" + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "dTI" = ( /obj/structure/urinal{ pixel_y = 32 @@ -54149,6 +53777,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/range) +"dZm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/storage/art) "eaI" = ( /obj/structure/table/reinforced, /obj/item/radio/intercom{ @@ -54205,6 +53837,13 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"eiZ" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/purple/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "elh" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -54221,14 +53860,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/security/execution/transfer) -"epC" = ( -/obj/machinery/door/airlock{ - desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; - id_tag = "MaintDorm1"; - name = "Furniture Storage" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) "epD" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/machinery/light{ @@ -54245,6 +53876,10 @@ /obj/item/assembly/signaler, /turf/open/floor/plating, /area/security/prison) +"eqq" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) "eqA" = ( /obj/machinery/shower{ dir = 8 @@ -54282,6 +53917,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/library) +"eus" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "evR" = ( /turf/open/floor/plating, /area/maintenance/bar) @@ -54310,6 +53952,24 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"eyS" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Pure" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ezF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "eAG" = ( /obj/item/clothing/under/misc/pj/blue, /obj/item/clothing/shoes/sneakers/white, @@ -54391,12 +54051,6 @@ /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating/airless, /area/space/nearstation) -"eHI" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "eJa" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck{ @@ -54427,13 +54081,16 @@ /turf/open/space/basic, /area/space/nearstation) "eSe" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, +/obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"eUW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "eVC" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/firedoor, @@ -54470,6 +54127,11 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"fbp" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/storage) "fcn" = ( /obj/structure/lattice, /turf/closed/wall/r_wall, @@ -54521,10 +54183,23 @@ dir = 4 }, /area/crew_quarters/theatre) +"fiy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "fjS" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"fjU" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "flc" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -54756,6 +54431,13 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"fHi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) "fHG" = ( /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -54780,6 +54462,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/circuit) +"fKC" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "fMp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, @@ -54800,6 +54488,20 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"fPi" = ( +/obj/effect/decal/cleanable/oil{ + icon_state = "floor6" + }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fSO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "fTg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54886,10 +54588,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"gfr" = ( -/obj/structure/bed, -/turf/open/floor/plating, -/area/maintenance/port) "gfC" = ( /obj/effect/turf_decal/tile/red, /obj/structure/chair{ @@ -54920,6 +54618,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"giT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel, +/area/engine/atmos) "gjl" = ( /turf/closed/wall, /area/quartermaster/warehouse) @@ -54950,6 +54659,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"grr" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "grA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -54991,6 +54706,11 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"gxw" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/atmos) "gyr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -55009,6 +54729,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"gAu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External to Waste" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "gBo" = ( /obj/structure/cable{ icon_state = "1-8" @@ -55072,6 +54802,15 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"gMD" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "gNC" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55102,17 +54841,28 @@ /area/crew_quarters/fitness) "gQX" = ( /obj/machinery/button/door{ - desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; - id = "RIPFUN"; - name = "Powerful Gamer Toggle"; + id = "LockerShitter4"; + name = "Door Bolt Control"; normaldoorcontrol = 1; - pixel_x = -24; - pixel_y = 7; + pixel_x = 14; + pixel_y = 38; specialfunctions = 4 }, -/obj/structure/table_frame/wood, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/structure/toilet/secret/low_loot{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "gRZ" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" @@ -55190,16 +54940,13 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"hew" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"hgG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/engine/atmos) "hgO" = ( /obj/structure/table, /obj/item/storage/pill_bottle/dice{ @@ -55230,10 +54977,6 @@ }, /turf/closed/wall, /area/crew_quarters/dorms) -"hnl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/port) "hnU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -55266,6 +55009,11 @@ }, /turf/open/floor/plating, /area/space/nearstation) +"hxn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating, +/area/engine/atmos) "hzK" = ( /turf/open/floor/plasteel/yellowsiding/corner{ dir = 1 @@ -55323,22 +55071,30 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "hPs" = ( -/obj/structure/fireplace, /obj/machinery/airalarm{ dir = 8; pixel_x = 23 }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) "hPP" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/closed/wall, /area/quartermaster/warehouse) +"hQY" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "hRa" = ( /obj/structure/table/reinforced, /obj/machinery/light{ @@ -55472,6 +55228,13 @@ "ipA" = ( /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iql" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/engine/atmos) "itD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55521,13 +55284,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"iwB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/port) "izg" = ( /obj/item/cigbutt/cigarbutt, /turf/open/floor/plating, @@ -55549,18 +55305,6 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"iDS" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 - }, -/turf/open/space/basic, -/area/space) "iEJ" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod One" @@ -55576,6 +55320,14 @@ }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"iIS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/atmos) "iLJ" = ( /obj/item/reagent_containers/glass/bucket, /mob/living/simple_animal/pet/bumbles, @@ -55633,11 +55385,20 @@ }, /area/crew_quarters/theatre) "iTU" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/wood, /area/crew_quarters/bar) +"iVJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "iVU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55764,11 +55525,16 @@ }, /area/maintenance/bar) "jrE" = ( -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, +/obj/item/beacon, /turf/open/floor/plasteel/white, /area/science/circuit) +"jtj" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "juG" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -55807,6 +55573,14 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"jzM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) "jAD" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -55839,6 +55613,10 @@ }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"jBQ" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) "jCq" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -55851,6 +55629,17 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jDr" = ( +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "jEc" = ( /obj/machinery/vr_sleeper{ dir = 8 @@ -55872,6 +55661,12 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"jGI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "jGW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55904,6 +55699,11 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jIj" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/atmos) "jIs" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -55985,6 +55785,17 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jVX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/atmos) "jZT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56020,6 +55831,11 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"kcx" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/space/basic, +/area/space/nearstation) "kdO" = ( /obj/machinery/pool/controller, /turf/open/floor/plasteel/yellowsiding, @@ -56093,6 +55909,10 @@ /area/maintenance/fore/secondary) "khV" = ( /obj/machinery/vending/cola/red, +/obj/structure/sign/poster/contraband/robust_softdrinks{ + pixel_x = -32; + pixel_y = 32 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "kls" = ( @@ -56107,18 +55927,13 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "kmS" = ( +/obj/structure/dresser, /obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 + pixel_x = -2; + pixel_y = 15 }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 + dir = 4 }, /turf/open/floor/carpet, /area/crew_quarters/dorms) @@ -56280,6 +56095,13 @@ /obj/effect/landmark/stationroom/box/engine, /turf/open/space/basic, /area/space) +"kGv" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "kGJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56313,6 +56135,13 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"kJE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "kMt" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, @@ -56370,10 +56199,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"kQO" = ( -/obj/structure/reagent_dispensers/keg/semen, -/turf/open/floor/plating, -/area/maintenance/bar) "kSb" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -56452,6 +56277,19 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"lgX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"lhQ" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/atmos) "lip" = ( /obj/structure/closet{ name = "Suit Closet" @@ -56492,7 +56330,7 @@ }, /area/maintenance/bar) "lsk" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/kink, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "ltK" = ( @@ -56523,6 +56361,11 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"lzt" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/atmos) "lAB" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, @@ -56578,6 +56421,12 @@ }, /turf/open/floor/plating, /area/security/main) +"lKj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -56659,6 +56508,10 @@ }, /turf/closed/wall, /area/crew_quarters/fitness/pool) +"maT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "mbU" = ( /obj/machinery/vr_sleeper{ dir = 8 @@ -56683,6 +56536,11 @@ /obj/structure/bed, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"mfI" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "mgF" = ( /obj/structure/bed, /turf/open/floor/plasteel, @@ -56772,6 +56630,10 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"moS" = ( +/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) "mps" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56816,7 +56678,7 @@ /turf/open/floor/plating, /area/security/main) "myh" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, @@ -56898,6 +56760,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) +"mOG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/atmos) "mPk" = ( /obj/structure/bed, /obj/machinery/button/door{ @@ -57036,6 +56904,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"nmZ" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ + pixel_x = 38; + pixel_y = 6 + }, +/turf/open/floor/engine, +/area/maintenance/disposal/incinerator) "nnp" = ( /obj/structure/closet/secure_closet/medical1, /obj/effect/decal/cleanable/dirt, @@ -57091,6 +56972,12 @@ }, /turf/open/floor/plating, /area/construction) +"nzR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "nBI" = ( /obj/item/cigbutt/cigarbutt, /obj/effect/decal/cleanable/blood/old, @@ -57106,6 +56993,13 @@ }, /turf/open/floor/plating, /area/security/processing) +"nFj" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) "nGf" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light{ @@ -57124,15 +57018,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"nGI" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"nJQ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/turf/open/space, +/area/space/nearstation) "nLu" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -57190,6 +57083,12 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"nTU" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Ports" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "nUV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57216,6 +57115,14 @@ /obj/item/gun/ballistic/revolver/nagant, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) +"nYT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/space, +/area/space/nearstation) "nZE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, @@ -57338,6 +57245,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"omk" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "omX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -57349,17 +57262,29 @@ /turf/open/floor/plasteel, /area/security/prison) "omY" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 +/obj/machinery/button/door{ + id = "LockerShitter3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 14; + pixel_y = 38; + specialfunctions = 4 }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 +/obj/structure/toilet/secret/low_loot{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet/locker) "oqj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -57463,7 +57388,9 @@ /turf/closed/wall, /area/crew_quarters/bar) "oAB" = ( -/obj/structure/fireplace, +/obj/structure/fireplace{ + pixel_y = -6 + }, /turf/open/floor/carpet, /area/crew_quarters/dorms) "oDm" = ( @@ -57504,7 +57431,7 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "oIW" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /turf/open/floor/mineral/titanium/blue, @@ -57563,15 +57490,21 @@ /obj/structure/pool/ladder, /turf/open/pool, /area/crew_quarters/fitness/pool) +"oVN" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oXn" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) "oZl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/pjs, -/obj/item/clothing/under/costume/maid, -/obj/item/clothing/under/costume/maid, /obj/item/clothing/under/rank/civilian/janitor/maid, -/obj/item/clothing/under/rank/civilian/janitor/maid, -/obj/item/clothing/accessory/maidapron, -/obj/item/clothing/accessory/maidapron, /obj/machinery/light{ dir = 8 }, @@ -57611,25 +57544,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) -"plm" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plasteel, -/area/engine/atmos) "plC" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/wood, /area/crew_quarters/bar) "plS" = ( @@ -57680,7 +57601,6 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "pqs" = ( -/obj/machinery/vending/clothing, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -57723,6 +57643,22 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"pzG" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/disposal/incinerator) "pAK" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 3"; @@ -57750,6 +57686,13 @@ /obj/effect/landmark/event_spawn, /turf/closed/wall, /area/crew_quarters/fitness) +"pCj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/atmos) "pDe" = ( /obj/machinery/door/window/southright{ name = "Target Storage" @@ -57888,6 +57831,13 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"pUP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) "qaY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -57998,6 +57948,15 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) +"qvf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "qyj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, @@ -58020,6 +57979,11 @@ }, /turf/open/space, /area/solar/port/aft) +"qJV" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "qLR" = ( /obj/structure/mirror{ pixel_y = 32 @@ -58113,6 +58077,13 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rdl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) "rdG" = ( /obj/machinery/hydroponics/constructable, /obj/item/radio/intercom{ @@ -58125,17 +58096,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/vending/kink, /obj/machinery/light{ dir = 4; light_color = "#e8eaff" }, +/obj/machinery/vending/games, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"rfW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) +"rgL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) "rhX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -58151,6 +58124,13 @@ /obj/structure/chair/comfy/brown, /turf/open/floor/wood, /area/crew_quarters/bar) +"rmQ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "rmX" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/beer, @@ -58222,11 +58202,6 @@ dir = 4 }, /obj/structure/closet/wardrobe/black, -/obj/item/clothing/under/dress/skirt, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/under/custom/trendy_fit, -/obj/item/clothing/under/custom/trendy_fit, /obj/item/clothing/under/dress/sundress, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -58395,6 +58370,10 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"rNG" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/ai_monitored/storage/eva) "rPU" = ( /turf/open/floor/plasteel/white/side{ dir = 4 @@ -58407,6 +58386,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"rTo" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "External to Pumps" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "rTu" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58422,6 +58408,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"rVN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/atmos) "rXl" = ( /obj/structure/chair/office/light, /obj/machinery/firealarm{ @@ -58509,6 +58507,13 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"smP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/engine/atmos) "sqg" = ( /obj/structure/table/wood, /obj/item/clothing/under/misc/pj/red, @@ -58782,12 +58787,16 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "sXA" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/closed/wall, /area/maintenance/bar) "sXV" = ( /turf/closed/wall/r_wall, /area/security/range) +"sYm" = ( +/obj/effect/turf_decal/vg_decals/atmos/mix, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) "sYR" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -58891,11 +58900,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"txm" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/item/crowbar/red, -/turf/open/floor/plating, -/area/maintenance/port) "tyX" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59060,6 +59064,13 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"tSo" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "tWj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -59116,12 +59127,28 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"udT" = ( +/obj/machinery/atmospherics/pipe/manifold/purple/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) "uei" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"ueZ" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -30 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/camera{ + c_tag = "Atmospherics Central"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "ufD" = ( /obj/machinery/vr_sleeper{ dir = 4 @@ -59137,6 +59164,12 @@ dir = 4 }, /area/crew_quarters/fitness) +"ugp" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "ugu" = ( /obj/structure/cable{ icon_state = "1-4" @@ -59331,6 +59364,24 @@ "uGI" = ( /turf/open/floor/grass, /area/security/prison) +"uHc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) +"uHl" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/engine/atmos) "uHp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -59385,19 +59436,18 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) -"uPT" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"uQR" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "O2 to Pure" }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) +/turf/open/floor/plasteel, +/area/engine/atmos) "uQS" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - pixel_x = 5 - }, /obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet) "uRd" = ( @@ -59737,15 +59787,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"vDR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "vEi" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59877,11 +59918,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"vOC" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "vOU" = ( /obj/structure/sign/warning/securearea, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/ai_monitored/nuke_storage) +"vOV" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/space, +/area/space/nearstation) "vPs" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -59895,6 +59951,24 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"vPQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"vQf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to External" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "vTP" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -60033,6 +60107,9 @@ dir = 1; pixel_y = -22 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "wrp" = ( @@ -60044,6 +60121,13 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wvg" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Ports to Incinerator" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "wvX" = ( /obj/structure/table/reinforced, /obj/machinery/light, @@ -60057,6 +60141,13 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"wyE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) "wBd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -60103,6 +60194,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wTk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/locker) "wUg" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -60202,17 +60299,13 @@ /obj/item/coin/gold, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"xfS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 +"xcl" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 }, -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) +/turf/open/space, +/area/space/nearstation) "xgk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60365,6 +60458,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"xud" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "xxi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -60426,12 +60525,6 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"xEu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) "xEB" = ( /obj/machinery/power/apc{ areastring = "/area/ai_monitored/nuke_storage"; @@ -60478,6 +60571,12 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xJC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) "xJW" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance"; @@ -60535,15 +60634,6 @@ /obj/item/instrument/trombone, /turf/open/floor/wood, /area/crew_quarters/theatre) -"xQG" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Shuttle Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "xSW" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -60646,8 +60736,16 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"yan" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal/incinerator) "ycd" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/structure/mirror{ @@ -60704,6 +60802,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"yeA" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/hallway/primary/central) "yhx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -69068,7 +69170,7 @@ aaa aaa aoV aaa -iDS +aaa aaa aaa aoV @@ -69323,11 +69425,11 @@ aaa aaa aaa aaa -asE -asE -nGI -asE -asE +aaa +aaa +aaa +aaa +aaa aoV aaa aaa @@ -69581,9 +69683,9 @@ aaa aaa aaa aaf -awW -auP -awW +aaa +aaa +aaa aaf kls aaa @@ -69839,8 +69941,8 @@ aaa aaa arB arB -xQG -asE +arB +arB aAC aaf aaa @@ -70095,7 +70197,7 @@ aaa aaa aaa arB -xfS +awZ ayk awW aAD @@ -73439,7 +73541,7 @@ ayl aIK ayl beM -asE +arB aaa aaa aaa @@ -77034,10 +77136,10 @@ aXQ aXQ aXQ aXQ -aPz -aPz -epC -aPz +aXQ +aXQ +aXQ +aXQ bhQ bjj bkF @@ -77291,9 +77393,9 @@ aXQ aZt aXQ ycd -aPz +aXQ omY -cMS +aXQ gQX bhQ bjj @@ -77548,12 +77650,12 @@ aXQ aZv aXQ bbL -aPz +aXQ bdJ -txm +aXQ bgr -iwB -hew +bhQ +bjj bkF aaa aaa @@ -77805,10 +77907,10 @@ aWy aYe bbq aZw -aPz +wTk +bct +bct bct -bfa -gfr bhQ bjk bkE @@ -78062,11 +78164,11 @@ aXp baO aZo baw -aPz +cFG hPs cBn -bgs -hnl +bct +bhQ bjk bkF aaa @@ -78319,10 +78421,10 @@ aXQ aXQ aXQ aXQ -aPz -aPz -aPz -aPz +aXQ +aXQ +aXQ +aXQ bhQ bjk aPz @@ -78845,7 +78947,7 @@ blW blW bqi cyD -blW +aZE cyD bvS blW @@ -81397,7 +81499,7 @@ aPF aQZ aRa aTF -aPG +dZm aSX hPP aZF @@ -82476,7 +82578,7 @@ mrR dKP odx rBq -kQO +evR bCq bUs bLv @@ -86258,7 +86360,7 @@ cCi aqX arR asj -arT +cLS ajr atY auo @@ -87814,7 +87916,7 @@ ayL ayW ayW ayW -ayW +rNG aJq aJq aOE @@ -89912,7 +90014,6 @@ bGO bHl bHS bLI -bLI bOR bQg bQg @@ -89922,6 +90023,7 @@ bQg bQg bQg bQg +bQg bYI bDG bHP @@ -90170,17 +90272,17 @@ bKw bLH bRq bNO -bOQ -bQf -bRq +bQg bRq bTK -bUE +jVX +jVX +uHl bUE bWM bXJ -bYH -bYH +bMK +bMK bYH bYH bVg @@ -90388,7 +90490,7 @@ aKF aMf aNB aOE -aPW +aPS aRr aSD ceh @@ -90426,17 +90528,17 @@ bJs bKy bLK bLK -bLK bOT bQi bRs bSC -bLK +oXn +gxw bUG bVO bWO bXK -bYH +bLK bZz caw bYH @@ -90682,18 +90784,18 @@ bCv bJs bKy bLJ -bLJ +bWR bNP bOS bQh bRr -bSB bTL +rVN bUF bVN bWN +jDr bLK -bYJ bRi bZy cbu @@ -90939,7 +91041,7 @@ bCv bJs bKy bLM -bLM +fKC bNQ bOV bQk @@ -90947,9 +91049,9 @@ bRt bSD bTM bUH +bRt bVQ -bWN -bXM +jDr bYL cew bTh @@ -91196,18 +91298,18 @@ bCv bJs bKy bLL -bLL +bOd bNQ bOU bQj bOd -bOd +bMK bRx bTP bVP +cbA bWP -bXL -bYK +bLK bRj bTg bUm @@ -91412,7 +91514,7 @@ gfD woR dgz aJw -aJw +yeA aMh aJq aOE @@ -91452,19 +91554,19 @@ bDr bCy bGP bHn -bLN +cbz bLN bNS bOX bQm bRv -bOd +bSC bTN bTP -bRA +diH +bWQ bWQ bWQ -bYN bRm bTj caA @@ -91715,8 +91817,8 @@ bNR bOW bQl bRu -bSE -bRx +bSC +bTN bUI bVR bWQ @@ -91971,9 +92073,9 @@ bMK bMK bOY bQn -bRx -bMK +bSC bMK +mOG bUJ bVS bWQ @@ -92226,8 +92328,8 @@ bKz bLK bML bNT -bOV -bQj +smP +giT bRw bSF daI @@ -92484,12 +92586,12 @@ bLK bMN bNV bOV -bQo -bRz -bSH -plm -bTP -bRA +giT +bRw +bSF +daI +bUK +bVT bWQ bWQ bWQ @@ -92684,7 +92786,7 @@ aqe arf aqo atm -atm +rgL arf avv awu @@ -92738,29 +92840,29 @@ bHU bJv bKB bLK -bMM +bVW bOd -bOV +iql bQj -bRy -bSG -daI -bUK -bVT -bWR +bVP +cbA +fSO +kJE +ugp +ueZ bXQ -bOd +cbA bZF -bPc -bOd +ezF +hgG ccv cdw cex -bOd -cfN -cfN -bLK -aaf +dEX +cbA +bQt +bLQ +dbb bOh bOh bOh @@ -92940,7 +93042,7 @@ cSA aqe arf asm -blU +atm blU avg awp @@ -93001,20 +93103,20 @@ bJB bKV bRB bSI -bSI +vQf bUM bVV -bWS -bSI -bSI +bVV +bVV +iVJ bZG -caE -cbA -ccy bOd bOd -bQu -cfO +bOd +bOd +bOd +bOd +bOd cgW cit cph @@ -93256,22 +93358,22 @@ bMO bIF bOZ bQp -bRA +alk +gAu +eqq +bOd +bOd +bOd bOd -bTO -bUL -bVU -bMK -bXR bYQ -bXR -bMK -cbz -ccx -cbA -cbA +bOd +bOd +bOd +bOd +bOd +dMj cfi -bRH +bOd cgV bMQ aaf @@ -93512,23 +93614,23 @@ bLK bMR bIH bJF -bQr -bRA -bOd -bTP -bOd bVX -bMK -bMK -bYR -bMK -bMK -cbC bRA +bTP +rTo +bOd +bOd +bOd +bOd +bYQ +bOd +bOd +bOd +bOd +bOd +jtj +jIj bTO -cez -cez -cfQ cgY ciu bVu @@ -93712,7 +93814,7 @@ aqi arf ask atm -atm +rgL arf awq axO @@ -93771,24 +93873,24 @@ bNY bPa bMQ bRC -bMQ -bTP +rdl +daq bUN -bVW -bMK -bXS -bXS -bXS -bMK -cbB -alk -alX -cbA -bQt +bOd +bOd +bOd +bYQ +bOd +bOd +bOd +bOd +bOd +rmQ +lzt apa cgX apF -apI +aaf bOh bOh bOh @@ -93967,8 +94069,8 @@ ajo aps aqk arf -vDR -blU +aqo +atm aHw avn awv @@ -94028,21 +94130,21 @@ bOb bPd cBF bRD -bSK -bTR -bUP -bVZ -bWT -bWa -bYS -bZH -caF -bQt -cBJ -cdy +rdl +daq +bUN bOd +bOd +bOd +bYQ +bOd +bOd +bOd +cBJ +bOd +eus bRy -cfR +bTP cha civ cph @@ -94281,27 +94383,27 @@ bvd bKH bLK bMS -bOa +bTO bPc bQs -bMZ -bSJ -bTQ -bUO -bVY +cez +ceA +daq +bUN +bOd +bOd +bOd +lhQ bOd bOd bOd bOd bOd -cbD bTO -cdx -bOd -bOd -cfP +cez +bUL cgZ -bMQ +rdl aaf bQA ckX @@ -94538,27 +94640,27 @@ bvd bKJ bLR bMV -bOd -bMZ +bTP +eiZ bQv bRF bSM -bTS -bUQ -agd -bUO bVZ -bVZ -bZI -caH -cbF -ccz -cdA -cez +bOd +bOd +bOd +bOd +bOd +bOd +bOd +bOd +bOd +bOd +bTP +bTO bOe -cfQ chb -ciu +iIS bVu ckb ckZ @@ -94737,15 +94839,15 @@ aoa ajo apt aql -aoJ -aoJ -aoJ -aoJ +wyE +wyE +wyE +wyE avw awy -awr -awr -avG +lgX +lgX +qvf wqF aAh aAh @@ -94796,26 +94898,26 @@ bKH bLK bMU bOc -bPe -bQu -bRE -bSJ -bPe -bOd +udT +omk +nTU +pUP +jBQ +agd cCB cCC -bXT -bXT -bXT -caG -cbE -bTU -cdz -cez -bUL -cfP bOd -bMQ +bOd +bOd +bOd +bOd +bOd +bOd +ccz +uQR +cfP +cfQ +ceA aaf bOh bOh @@ -95052,25 +95154,25 @@ bvd bKH bLK bMX -bOd +omk bPg -bQx -bRH -bSM -bTU -bUS -bUS +hQY +bRE +pCj +bPe +wvg +bOd cCD -bXU -bUS -bUS -bUS -bXU -bRF -bMW -cez -cez -cfQ +bOd +bOd +bOd +bOd +bOd +bOd +bOd +bTU +fPi +fHi chd bQy cpP @@ -95309,25 +95411,25 @@ bvd bKH bLK bMW -bOe +oVN bPf -bQw -bRG -bSN -bTT -bUR -bWb +bQx +bRH +vPQ +moS +kGv +bUS cCE bTT +bUS +bUS +bUS +bXU +bUS +bUS +gMD +eyS bUR -bZJ -bUR -bTT -bUR -cdB -bUR -bUR -cfT chc bMQ aaf @@ -95566,11 +95668,11 @@ bvd bKH bLK bMZ -bOg +cdx bPi bQz bRJ -bSM +hxn bTV bUT bWc @@ -95578,12 +95680,12 @@ bWU bXV bYT bZK -bOd +bUR cbG ccA cdC ceB -cez +dAe cez chf cix @@ -95822,14 +95924,14 @@ bvj bvd bKH bLK -bMY +bLK bOf bPh bQy bRI bSP bPh -bQy +jzM bRI cCF bPh @@ -95839,8 +95941,8 @@ bQy bPh bQy bRI -ceA -bLK +bSP +bVO bLK che bLK @@ -96045,7 +96147,7 @@ aOJ oIJ unA aKR -aKR +akH aUg bFC hSZ @@ -96080,13 +96182,13 @@ bvd bKH bzs bRK -aaf -bRK -aaf -bVv -aaf -bRK -aaf +qJV +nJQ +qJV +vOV +qJV +nYT +eUW bVv cCG cCH @@ -96336,7 +96438,7 @@ bFF bvd bKH bzs -bRK +fjU bOh bPj bQA @@ -96366,8 +96468,8 @@ aaf aoV aoV aoV -aoV -aoV +aaa +aaa cCQ aoV aaa @@ -96593,7 +96695,7 @@ bFK bvd bKH bzs -bRK +fjU bOh bPl bQB @@ -96850,10 +96952,10 @@ bvj bJC bKH bzs -bRK +fjU bOh bPk -bPm +sYm bPm bOh bTW @@ -96869,7 +96971,7 @@ ccB cbH bOh aaf -aoV +aaa aoV aaf aoV @@ -96882,7 +96984,7 @@ aoV aoV aoV aoV -aaf +gXs aoV aaa aaa @@ -97107,7 +97209,7 @@ bIj bJC bKH bzs -bRK +fjU bOh bPm bQC @@ -97139,7 +97241,7 @@ aoV aoV aoV aae -aaf +gXs aoV aaa aaa @@ -97364,7 +97466,7 @@ bIi bJC bKH bzs -bRK +fjU bOh bOh bOh @@ -97382,21 +97484,21 @@ bOh bOh bOh bOh -aaf -aaf -ciC -bVu -bVu -bVu -bVu -bVu +xcl caJ +ciC +gXs +gXs +tSo +kcx +kcx +kcx +ciC aoV aoV aoV aoV -aoV -aaf +gXs aoV aaa aaa @@ -97622,52 +97724,52 @@ bJC bKH bzs bUr -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu +qJV +qJV +qJV +qJV +qJV +qJV +qJV +qJV +qJV +qJV +qJV +qJV caJ -aaf -aaf -aaf -aaf -aaf +caJ +caJ +caJ +caJ +eUW cfj cfU -cfj -cfj +maT +maT ckf -cfj -cfj -bUr -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu -bVu +maT +lKj +nzR +nFj +mfI +mfI +mfI +mfI +mfI +mfI +mfI +mfI +mfI +mfI csM -bVu -bVu +mfI +mfI ctd -bVu -bVu -bVu -bVu -caJ +mfI +mfI +mfI +mfI +vOC ctZ ctZ cuo @@ -97891,19 +97993,20 @@ bPn bzs bzs bPn -caI +bPn bPn bzs bzs bzs cfj -cfj +chk cjp chh ciy cke -clg -cfj +cjr +pzG +uHc aoV aoV aoV @@ -97913,7 +98016,6 @@ aoV aoV aoV aaa -aaa aaf aaa csn @@ -97924,7 +98026,7 @@ aag aaa aaa aaa -ctN +nFj ctY cuh cun @@ -98075,7 +98177,7 @@ con uSC con con -eVJ +akE wHk ewu pQp @@ -98153,14 +98255,15 @@ bAw bzs bAw caK -cfj +uHc ciB ckh chj ciA +dQD cjr clh -cfj +uHc aoV aoV aoV @@ -98170,7 +98273,6 @@ aoV aoV aoV aaa -aaa aaf aaa csn @@ -98406,18 +98508,19 @@ bzs bzs bZM cbJ -ceC -ceC +bWe +bWe cfW cfX chk chl -ciz +xud chi ciz -cjq +ciz ckg cmb +yan cpO cpQ cpQ @@ -98427,7 +98530,6 @@ czJ aaf aoV aaa -aaa aaf aaa csn @@ -98667,14 +98769,15 @@ bzs ccF cdG ceE -cfl +grr cfZ -cki +cjr cld -eHI -cjt +cjr +cjr +cjr csq -xEu +xJC wHz cmd cmd @@ -98684,7 +98787,6 @@ aag aag aag aaa -aaa aaf csD csO @@ -98926,12 +99028,13 @@ cdF ceD cfk cfY -rfW +cjr ckj -cjs +cle +cle cle cli -uPT +cme cmY cme cop @@ -98941,7 +99044,6 @@ cqs aaa aag aaa -aaa aaf csD csN @@ -99181,14 +99283,15 @@ cbL cbL cdI ceG -cfj +jGI cgb chn ciE cjv clj -ckk +clj cmf +nmZ cna cnC cor @@ -99198,7 +99301,6 @@ cqt aaa aag aaa -aaa aaf csD csU @@ -99438,12 +99540,13 @@ cbK ccG cdH ceF -cfj +jGI cga chm ciD cju clf +cle csr cme cmZ @@ -99455,7 +99558,6 @@ cqs aaa aag aaa -aaa aaf csD ctb @@ -99695,13 +99797,14 @@ bzs bzs bzs bzs -cfj -cfj -cfj -cfj +fiy +cfl +cfl +cfl cjx cfl cfl +cfl dqu tXL cmd @@ -99712,7 +99815,6 @@ aag aag aag aaa -aaa aaf csD csD @@ -103280,15 +103382,15 @@ bIP bPA bJN bRU -bEm +aml bEm bJN bRU -bXe +aop bEm bJN bRU -bEm +aml bEm bDb cgi @@ -103537,15 +103639,15 @@ bOx bPz bJN bRU -bEm +amo bEm bJN bRU -bEm +amo bEm bJN bRU -bEm +amo cBz bDb cgi @@ -103783,26 +103885,26 @@ bAB bBV bDb bEn -bEm -bEm -bEm -bJL -bLa -bMi -bNo -bPy -bPA +akK +akP +akP +akV +akW +alf +alm +aln +alr bJN bRW -bTb +amG bUe bJN bWl -bXf +aoq bYg bJN bZV -caV +apw cbS bDb cgl @@ -104048,18 +104150,18 @@ bKZ bMi bIu bIO -bPB +alx bLe bRV -bTa +amH bUd bVi bRV -bTa +amH bYf bVi bRV -bTa +amH cbR bDb cgk @@ -104305,18 +104407,18 @@ bLc bMi bNo bOx -bPD +alV bQM bMi -bMi +bOx bRZ bVj bMi -bMi +bOx bRZ bZa bMi -bMi +bOx bRZ cTY cTZ @@ -104562,24 +104664,24 @@ bLb bMk bNn bIQ -bPC -bQL -cBG -bTc -bUf -bTc -bRX -bTc -bUf -bTc -bRX -bTc -cbT -ccP -ccP -cht -ckn -csk +alW +amh +ami +amP +anp +anx +anN +amP +anp +anx +anN +amP +aqG +aqS +aqS +ars +asr +asC czQ czU czZ @@ -104822,15 +104924,15 @@ bOx bMi bQN bRZ -bMi +bOx bMi bVk bRZ -bMi +bOx bMi bZb bRZ -bMi +bOx bMi cfy cgn @@ -105079,15 +105181,15 @@ bIR bPE bLe bRY -bTd +amQ bUg bVi bWm -bTd +amQ bUg bVi bZW -bTd +amQ bUg bDb bDb @@ -105336,15 +105438,15 @@ bOx bPH bJN bSa -bTe +amT bUh bJN bWn -bXg +aos bYh bJN bZX -caW +aqB cbU bDb aaf @@ -105593,15 +105695,15 @@ bOz bPG bJN bEm -bEm +amo bRU bJN bEm -bEm +amo bRU bJN bEm -bEm +amo bRU bDb aaf @@ -105850,15 +105952,15 @@ bOx bPJ bJN bEm -bEm +ano bRU bJN bEm -bXe +apb bRU bJN bEm -bEm +ano bRU bDb aaf @@ -106095,7 +106197,7 @@ bzC bAH bCb bDc -bEo +fbp bDf bEb bGY diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm new file mode 100644 index 0000000000..1ba8c82249 --- /dev/null +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -0,0 +1,137859 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aaa" = ( +/turf/open/space/basic, +/area/space) +"aab" = ( +/obj/structure/sign/poster/official/anniversary_vintage_reprint, +/turf/closed/wall/r_wall, +/area/science/research{ + name = "Research Sector" + }) +"aac" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"aad" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/holodeck/rec_center) +"aae" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 4; + height = 12; + id = "arrivals_stationary"; + name = "cog arrivals"; + roundstart_template = /datum/map_template/shuttle/arrival/cog; + width = 9 + }, +/turf/open/space/basic, +/area/space) +"aaf" = ( +/turf/closed/wall, +/area/science/test_area) +"aag" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/hallway/secondary/entry) +"aah" = ( +/obj/structure/sign/warning/electricshock, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"aai" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall/rust, +/area/maintenance/fore) +"aaj" = ( +/turf/closed/wall/r_wall, +/area/maintenance/port/fore) +"aak" = ( +/obj/machinery/conveyor/auto{ + id = "pb" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aal" = ( +/turf/closed/wall, +/area/maintenance/port/fore) +"aam" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aan" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/ai_monitored/security/armory) +"aao" = ( +/obj/machinery/power/solar{ + id = "forestarboard"; + name = "Fore-Starboard Solar Array" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/fore) +"aap" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aaq" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aar" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "pb" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aas" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aat" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/observatory"; + dir = 1; + name = "Observatory APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aau" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/fore"; + dir = 8; + name = "Port Bow Maintenance APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aav" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "solar" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aaw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/test_area) +"aax" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"aay" = ( +/obj/structure/sign/warning/electricshock, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"aaz" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/ai_monitored/security/armory) +"aaA" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"aaB" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/kitchen/backroom"; + dir = 1; + name = "Kitchen Coldroom APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aaC" = ( +/obj/structure/closet/secure_closet/lethalshots, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/storage/box/firingpins, +/obj/item/storage/box/firingpins, +/obj/effect/spawner/lootdrop/armory_contraband/metastation, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"aaD" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aaE" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/camera{ + c_tag = "Port Bow Maintenance - Fore"; + network = list("ss13","rd") + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aaF" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaG" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/stairs/left, +/area/security/brig) +"aaH" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor"; + pixel_x = 22 + }, +/obj/structure/rack, +/obj/item/gun/energy{ + pixel_y = -6 + }, +/obj/item/gun/energy{ + pixel_y = -3 + }, +/obj/item/gun/energy, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aaJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaK" = ( +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port) +"aaL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/port) +"aaM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/port) +"aaN" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/security/brig) +"aaO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aaP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aaQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaR" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aaS" = ( +/turf/open/floor/plasteel, +/area/security/brig) +"aaT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aaU" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"aaV" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aaW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aaX" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aaY" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 21 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aaZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aba" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"abd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"abe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"abf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"abg" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abh" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/port) +"abi" = ( +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" + }, +/obj/structure/cable, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/port) +"abj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"abk" = ( +/obj/structure/closet/crate/secure/gear{ + name = "Grenade Crate" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/box/flashbangs{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/storage/box/teargas{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/grenade/barrier, +/obj/item/grenade/barrier, +/obj/item/grenade/barrier, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abl" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/structure/rack, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"abm" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"abn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 6 + }, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = -6 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abp" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"abq" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/storage/box/rubbershot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abv" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"abw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001; + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abx" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/port) +"aby" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"abz" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"abA" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"abB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/crew_quarters/theatre/clown) +"abC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/crew_quarters/theatre/clown) +"abD" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abE" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abF" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "sb_out"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/trackimp{ + pixel_x = 4 + }, +/obj/item/storage/box/chemimp{ + pixel_x = -4 + }, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"abI" = ( +/obj/structure/table, +/obj/structure/mirror{ + icon_state = "mirror_broke"; + pixel_x = -24 + }, +/obj/item/storage/briefcase, +/obj/item/circuitboard/machine/vending/donksofttoyvendor, +/obj/item/storage/pill_bottle/happy, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/cogstation/cluwne, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"abJ" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "sb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"abM" = ( +/turf/closed/wall/r_wall, +/area/router/aux) +"abN" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/hallway/secondary/entry) +"abO" = ( +/obj/structure/chair/comfy/brown, +/obj/item/beacon, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"abP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/energy/ionrifle{ + pixel_y = 4 + }, +/obj/item/gun/energy/temperature/security{ + pixel_y = -4 + }, +/obj/item/clothing/suit/armor/laserproof, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"abQ" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/fore) +"abR" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/router/aux) +"abS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/brig) +"abT" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/dorms/purple"; + name = "Crew Quarters A APC"; + pixel_y = -26 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"abU" = ( +/obj/machinery/space_heater, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/dorms/blue"; + name = "Crew Quarters B APC"; + pixel_y = -26 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/fore) +"abV" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"abW" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/router/aux) +"abX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint) +"abY" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"abZ" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "sb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"aca" = ( +/obj/machinery/conveyor{ + dir = 5; + id = "pb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acb" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"acc" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/security/brig) +"acd" = ( +/obj/machinery/button/door{ + id = "armory"; + name = "Armory Blast Door Control"; + pixel_x = -28; + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"ace" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "pb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acf" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "pb_out"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acg" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"ach" = ( +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"aci" = ( +/turf/closed/wall, +/area/medical{ + name = "Medical Booth" + }) +"acj" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "solar_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ack" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/riot, +/obj/item/clothing/suit/armor/riot, +/obj/item/clothing/suit/armor/riot, +/obj/item/clothing/head/helmet/riot, +/obj/item/clothing/head/helmet/riot, +/obj/item/clothing/head/helmet/riot, +/obj/item/shield/riot{ + pixel_x = -6 + }, +/obj/item/shield/riot{ + pixel_x = -6 + }, +/obj/item/shield/riot{ + pixel_x = -6 + }, +/obj/item/clothing/mask/gas/sechailer/swat{ + pixel_x = -4 + }, +/obj/item/clothing/mask/gas/sechailer/swat{ + pixel_x = -4 + }, +/obj/item/clothing/mask/gas/sechailer/swat{ + pixel_x = -4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"acl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_one_access_txt = "3" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"acm" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aco" = ( +/turf/open/floor/plating, +/area/maintenance/port/fore) +"acp" = ( +/turf/open/floor/plating/airless, +/area/science/test_area) +"acq" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/conveyor{ + id = "solar_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acr" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 7 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acs" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"act" = ( +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"acu" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/machinery/recharger, +/obj/item/assembly/signaler{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/assembly/signaler{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/assembly/signaler{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/electropack{ + pixel_x = -10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"acv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"acw" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"acx" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_y = 6 + }, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_y = -6 + }, +/obj/structure/rack, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) +"acz" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "sb_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acA" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "sb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acB" = ( +/obj/machinery/conveyor{ + dir = 6; + id = "sb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id = "armory"; + name = "Armory" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"acD" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"acE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"acF" = ( +/turf/closed/wall, +/area/crew_quarters/lounge) +"acG" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "pb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acH" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"acI" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"acJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + id = "solar_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"acK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical{ + name = "Medical Booth" + }) +"acL" = ( +/obj/machinery/door/poddoor{ + id = "executionspaceblast" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"acM" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_x = -32 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"acN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"acO" = ( +/obj/structure/sign/warning/electricshock, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"acP" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating, +/area/maintenance/fore) +"acQ" = ( +/turf/closed/wall, +/area/crew_quarters/theatre/clown) +"acR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16" + }, +/turf/open/floor/plasteel/checker, +/area/hallway/secondary/entry) +"acS" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/open/floor/plating, +/area/maintenance/fore) +"acT" = ( +/obj/structure/table/reinforced, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"acU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/camera{ + c_tag = "Armory Access"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"acV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/closet/crate/freezer, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/item/reagent_containers/food/snacks/meat/slab, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"acW" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/deliveryChute, +/turf/open/floor/plating/airless, +/area/router/aux) +"acX" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/fore) +"acY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"acZ" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"ada" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"adb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"adc" = ( +/obj/machinery/conveyor{ + id = "sb_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"add" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"ade" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"adf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"adg" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"adh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"adi" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"adj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"adk" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/conveyor{ + id = "solar_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adl" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adm" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"adn" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"ado" = ( +/obj/machinery/power/solar{ + id = "forestarboard"; + name = "Fore-Starboard Solar Array" + }, +/obj/structure/cable, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/fore) +"adp" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/tcommsat/computer) +"adq" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"adr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16" + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"ads" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"adt" = ( +/turf/open/floor/plating, +/area/maintenance/fore) +"adu" = ( +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"adv" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/maintenance/fore) +"adw" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "solar" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"ady" = ( +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/solar/starboard/fore) +"adz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"adA" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"adB" = ( +/obj/structure/sign/poster/official/enlist{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"adC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"adD" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/vending/security, +/turf/open/floor/plasteel, +/area/security/brig) +"adE" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/obj/machinery/syndicatebomb/training, +/turf/open/floor/plasteel, +/area/security/brig) +"adF" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"adG" = ( +/obj/machinery/mass_driver{ + id = "serv_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adH" = ( +/obj/machinery/conveyor/auto{ + dir = 1; + id = "solar" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adI" = ( +/obj/machinery/disposal/bin{ + name = "Service Delivery" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/hydroponics) +"adJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/under/misc/staffassistant, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"adK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/security/brig) +"adL" = ( +/obj/machinery/mass_driver{ + id = "starboard_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"adM" = ( +/turf/closed/wall, +/area/crew_quarters/observatory) +"adN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"adO" = ( +/obj/structure/noticeboard{ + dir = 4; + pixel_x = -27 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"adP" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"adQ" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"adR" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/storage/box/beakers, +/obj/item/hand_labeler, +/obj/item/folder/white{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/stamp, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"adS" = ( +/turf/closed/wall, +/area/construction) +"adT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction) +"adU" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"adV" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/fore"; + dir = 1; + name = "Starboard Bow Maintenance APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"adW" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/right, +/area/security/brig) +"adX" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"adY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"adZ" = ( +/turf/open/floor/plating, +/area/tcommsat/computer) +"aea" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"aeb" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/security/brig) +"aec" = ( +/turf/closed/wall/r_wall, +/area/construction) +"aed" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aee" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aef" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeg" = ( +/obj/structure/sign/warning/electricshock, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"aeh" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aei" = ( +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; + dir = 8; + name = "Arrival Shuttle Hallway APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aej" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating/airless, +/area/engine/engineering{ + name = "Engine Room" + }) +"aek" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ael" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"aem" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aen" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/circuitboard/machine/sleeper, +/obj/structure/frame/machine, +/turf/open/floor/plasteel, +/area/construction) +"aep" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aer" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aes" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aet" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aeu" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aev" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/maintenance/fore) +"aew" = ( +/turf/closed/wall/r_wall, +/area/security/prison) +"aex" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/hypospraykit/regular, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aey" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aez" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeA" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeB" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet/fitness"; + name = "Fitness Toilets APC"; + pixel_y = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aeE" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/construction) +"aeF" = ( +/obj/structure/table, +/obj/item/assembly/infra, +/obj/item/assembly/voice{ + pixel_x = 4; + pixel_y = 12 + }, +/obj/item/assembly/health{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 4; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/construction) +"aeG" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/construction"; + dir = 1; + name = "Construction Area APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/construction) +"aeH" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeI" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"aeJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/security/prison) +"aeK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"aeL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aeM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aeN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Router"; + req_one_access_txt = "1" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aeO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aeQ" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aeR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeS" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aeT" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aeU" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aeV" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/suit/straight_jacket, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aeW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Construction Area"; + req_access_txt = "12" + }, +/turf/open/floor/plasteel, +/area/construction) +"aeX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aeY" = ( +/turf/closed/wall, +/area/crew_quarters/toilet/fitness) +"aeZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"afa" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"afb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afc" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afd" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"afe" = ( +/obj/machinery/door/airlock, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aff" = ( +/turf/closed/wall, +/area/crew_quarters/fitness) +"afg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/open/floor/plating, +/area/maintenance/fore) +"afh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = /area/maintenance/solars/starboard/fore; + dir = 4; + name = "Starboard Bow Solars APC"; + pixel_x = 28 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"afi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"afj" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afl" = ( +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"afm" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction) +"afn" = ( +/obj/machinery/biogenerator, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"afo" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/landmark/start/mime, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre/mime"; + dir = 4; + name = "Mime's Office APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/theatre/mime) +"afp" = ( +/turf/open/floor/plating, +/area/construction) +"afq" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"afr" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/camera{ + pixel_y = -8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"afs" = ( +/obj/machinery/flasher{ + id = "executionflash"; + pixel_x = -25 + }, +/obj/structure/chair/e_chair, +/obj/effect/decal/cleanable/ash{ + pixel_y = -8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aft" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"afu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afv" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"afx" = ( +/obj/machinery/computer/holodeck{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afy" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afA" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"afB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"afD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/r_wall, +/area/maintenance/port/fore) +"afE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall, +/area/crew_quarters/theatre/clown) +"afF" = ( +/obj/machinery/sparker{ + id = "executionburn"; + pixel_x = 25 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"afG" = ( +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"afH" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"afI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afJ" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/plant_analyzer, +/obj/item/cultivator, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"afK" = ( +/turf/closed/wall, +/area/crew_quarters/kitchen) +"afL" = ( +/obj/machinery/door/airlock, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afM" = ( +/obj/structure/closet/crate/internals, +/obj/machinery/camera{ + c_tag = "Construction Area"; + pixel_x = 22 + }, +/obj/item/flashlight, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/turf/open/floor/plating, +/area/construction) +"afN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/hallway/secondary/entry) +"afP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"afR" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/table/reinforced, +/obj/item/paicard, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"afS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"afT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"afU" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs/left, +/area/hallway/secondary/entry) +"afV" = ( +/obj/structure/closet/crate, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/clothing/gloves/color/white, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/structure/sign/poster/contraband/red_rum{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"afW" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/maintenance/fore) +"afX" = ( +/obj/item/cigbutt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/machinery/camera{ + c_tag = "Port Bow Maintenance - Aft"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"afY" = ( +/obj/item/seeds/carrot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"afZ" = ( +/obj/machinery/disposal/bin{ + name = "Brig Catering" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5; + layer = 2.03 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"aga" = ( +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agb" = ( +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"agd" = ( +/obj/structure/fans/tiny/invisible, +/obj/docking_port/stationary{ + dwidth = 1; + height = 4; + name = "escape pod loader"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/space/basic, +/area/space) +"age" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"agf" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"agg" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"agh" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"agi" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"agj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Observatory Access" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"agk" = ( +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agl" = ( +/obj/machinery/disposal/bin{ + name = "Bar Catering" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6; + layer = 2.03 + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"agm" = ( +/obj/structure/table, +/obj/item/sharpener, +/obj/item/kitchen/knife, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"agn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall, +/area/crew_quarters/lounge) +"ago" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"agp" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agq" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"agr" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ags" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/mob/living/simple_animal/pet/redpanda{ + name = "Stinky" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"agt" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agu" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"agv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/brig) +"agw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"agx" = ( +/mob/living/simple_animal/bot/floorbot, +/turf/open/floor/plating, +/area/construction) +"agy" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"agz" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/fore) +"agA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"agB" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"agC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"agD" = ( +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"agE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"agF" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/camera{ + c_tag = "Observatory Viewing Area"; + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agG" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/theatre/mime) +"agH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"agI" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/tower, +/obj/item/seeds/amanita, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"agJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"agK" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agL" = ( +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/solar/port) +"agM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agN" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agO" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agP" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"agQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"agR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agS" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/suit_storage_unit/engine, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"agU" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/t_scanner{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/t_scanner, +/obj/item/assembly/igniter{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/structure/sign/poster/contraband/missing_gloves{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"agV" = ( +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"agW" = ( +/turf/closed/wall/r_wall, +/area/security/processing) +"agX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Starboard Bow Solar Exterior Airlock"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"agY" = ( +/obj/structure/table, +/obj/item/storage/crayons, +/obj/item/toy/beach_ball/holoball, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"agZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aha" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahb" = ( +/obj/machinery/processor, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahc" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 8 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahd" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ahf" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Labor Camp Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"ahg" = ( +/turf/closed/wall/r_wall, +/area/security/warden) +"ahh" = ( +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/tcommsat/computer) +"ahi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = 28 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ahj" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Fore Maintenance - Fore"; + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ahk" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/processing) +"ahl" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"ahm" = ( +/obj/structure/falsewall/reinforced, +/turf/closed/wall, +/area/maintenance/port/fore) +"ahn" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aho" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"ahp" = ( +/obj/machinery/gulag_item_reclaimer{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"ahq" = ( +/turf/open/floor/plasteel, +/area/security/processing) +"ahr" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/ambrosia, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"ahs" = ( +/obj/machinery/light, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/camera{ + c_tag = "Kitchen"; + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aht" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/storage/box/disks, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ahu" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hydroponics) +"ahv" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_x = 32 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"ahw" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ahx" = ( +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahy" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/security/warden) +"ahz" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"ahA" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/crew_quarters/fitness) +"ahB" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/door/window/eastleft{ + name = "Bathroom Stall" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"ahC" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"ahD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/fore"; + dir = 1; + name = "Fore Maintenance APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ahE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"ahF" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/mirror{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"ahG" = ( +/obj/structure/sink{ + pixel_y = 28 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"ahH" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"ahI" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness"; + name = "Fitness Room APC"; + pixel_y = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ahJ" = ( +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"ahK" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ahL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/crew_quarters/observatory) +"ahM" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"ahN" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ahO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"ahP" = ( +/turf/closed/wall, +/area/maintenance/solars/starboard/fore) +"ahQ" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"ahR" = ( +/obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"ahS" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"ahT" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/storage/bag/plants, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahU" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahV" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"ahW" = ( +/obj/structure/closet/secure_closet/personal, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"ahX" = ( +/obj/machinery/deepfryer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ahY" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"ahZ" = ( +/obj/structure/table/glass, +/obj/item/storage/toolbox/emergency{ + pixel_y = 4 + }, +/obj/item/radio/off, +/obj/machinery/camera{ + c_tag = "Arrival Shuttle Hallway" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/hallway/secondary/entry) +"aia" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aib" = ( +/obj/structure/table/glass, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/hallway/secondary/entry) +"aic" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aid" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/cotton, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"aie" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aif" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aig" = ( +/obj/machinery/camera{ + c_tag = "Observatory Holodeck"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aih" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aii" = ( +/obj/structure/closet, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/gps, +/turf/open/floor/plasteel, +/area/storage/tools) +"aij" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aik" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ail" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aim" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"ain" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/processing) +"aio" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"aip" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aiq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/port) +"air" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil/red{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/stack/cable_coil/red, +/obj/item/screwdriver, +/obj/item/multitool{ + pixel_x = -6; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"ais" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"ait" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aiu" = ( +/obj/effect/landmark/start/mime, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/theatre/mime) +"aiv" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aiw" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aix" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"aiy" = ( +/obj/structure/bed, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/effect/landmark/start/clown, +/obj/item/bedsheet/clown, +/obj/structure/sign/plaques/kiddie/perfect_man{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"aiz" = ( +/turf/closed/wall, +/area/maintenance/starboard/fore) +"aiA" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction) +"aiB" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/kitchen"; + name = "Kitchen APC"; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aiC" = ( +/turf/closed/wall, +/area/hallway/secondary/service) +"aiD" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Clown's Office"; + pixel_x = 22 + }, +/obj/item/clothing/under/rank/civilian/clown/yellow, +/obj/item/clothing/under/rank/civilian/clown/blue, +/obj/item/clothing/under/rank/civilian/clown/green, +/obj/item/toy/crayon/spraycan/lubecan, +/obj/item/megaphone/clown, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"aiE" = ( +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/security/processing) +"aiF" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Bow Maintenance"; + req_one_access_txt = "12;25;26;28;35;46" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aiG" = ( +/obj/structure/closet, +/obj/structure/window/reinforced, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"aiH" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/grass, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison) +"aiI" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aiJ" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"aiK" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aiL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison) +"aiM" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/observatory) +"aiN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aiO" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aiP" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aiQ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aiR" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/beaker/waterbottle, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aiS" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-06" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aiT" = ( +/obj/machinery/door/airlock/maintenance/abandoned{ + name = "Port Bow Maintainance"; + req_one_access_txt = "1" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aiU" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aiV" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/construction) +"aiW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Observatory" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/observatory) +"aiX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall, +/area/crew_quarters/observatory) +"aiY" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/door/window/eastright{ + name = "Bathroom Stall" + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aiZ" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"aja" = ( +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/item/caution, +/turf/open/floor/plating, +/area/construction) +"ajb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ajc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"ajd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aje" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ajf" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ajg" = ( +/obj/structure/table, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/item/reagent_containers/food/snacks/pie/cream, +/obj/item/instrument/bikehorn, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"ajh" = ( +/obj/structure/table/glass, +/obj/item/paper_bin/construction, +/obj/item/storage/crayons, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/hallway/secondary/entry) +"aji" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"ajj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ajk" = ( +/obj/effect/landmark/start/clown, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"ajl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/mob/living/simple_animal/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ajm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"ajn" = ( +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/tcommsat/computer) +"ajo" = ( +/obj/structure/table, +/obj/item/toy/dummy, +/obj/structure/mirror{ + pixel_x = -24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/theatre/mime) +"ajp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"ajq" = ( +/obj/effect/landmark/start/clown, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre/clown"; + dir = 4; + name = "Clown's Office APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"ajr" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"ajs" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/mint, +/obj/item/reagent_containers/food/condiment/mayonnaise, +/obj/item/bikehorn{ + pixel_x = -8; + pixel_y = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ajt" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/tcommsat/computer) +"aju" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"ajv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/theatre/mime) +"ajw" = ( +/turf/closed/wall, +/area/construction/secondary) +"ajx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"ajy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/prisoner/management, +/turf/open/floor/plasteel, +/area/security/brig) +"ajz" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ajA" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/plasteel, +/area/security/brig) +"ajB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"ajC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ajD" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ajE" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ajF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction/secondary) +"ajG" = ( +/obj/machinery/computer/arcade, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"ajH" = ( +/obj/structure/rack, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/storage/toolbox/mechanical, +/obj/item/crowbar, +/obj/item/extinguisher, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ajI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ajJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ajK" = ( +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ajL" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/lounge"; + name = "Lounge APC"; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"ajM" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_y = 6 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -8; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ajN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ajO" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"ajP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ajQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ajR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"ajS" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"ajT" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"ajU" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/light/tube, +/obj/item/radio/off, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/camera{ + c_tag = "Security - Interrogation Maintenance"; + dir = 1 + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/security/brig"; + dir = 4; + name = "Brig APC"; + pixel_x = 26 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"ajV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/crew_quarters/theatre/mime) +"ajW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/observatory) +"ajX" = ( +/obj/item/pipe{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/melee/baseball_bat, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/machinery/camera{ + c_tag = "Secondary Construction Area" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"ajY" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ajZ" = ( +/obj/item/multitool, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/tcommsat/computer"; + dir = 1; + name = "Telecomms Access APC"; + pixel_y = 28 + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"aka" = ( +/turf/closed/wall, +/area/crew_quarters/bar) +"akb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Mime's Office"; + req_access_txt = "46" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/crew_quarters/theatre/mime) +"akc" = ( +/obj/machinery/computer/slot_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction/secondary) +"akd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/checkpoint) +"ake" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/rnd/production/techfab/department/service, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"akf" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency{ + pixel_y = 4 + }, +/obj/item/electronics/firelock, +/obj/item/electronics/firealarm, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction/secondary) +"akg" = ( +/obj/machinery/power/solar_control{ + dir = 4; + id = "foreport"; + name = "Port Bow Solar Control" + }, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"akh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction/secondary) +"aki" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/plating, +/area/construction/secondary) +"akj" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"akk" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/construction/secondary) +"akl" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/shuttle/labor{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"akm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/construction/secondary) +"akn" = ( +/obj/machinery/power/solar_control{ + id = "forestarboard"; + name = "Starboard Bow Solar Control" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"ako" = ( +/obj/machinery/button/flasher{ + id = "executionflash"; + pixel_x = 7; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"akp" = ( +/obj/structure/closet/secure_closet/warden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"akq" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/prisoner, +/obj/item/razor, +/obj/item/paper/guides/jobs/security/labor_camp, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/security/processing) +"akr" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Shuttle Dock"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"aks" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"akt" = ( +/obj/machinery/computer/prisoner/management, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Brig Control APC"; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"aku" = ( +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"akv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"akw" = ( +/obj/structure/bed, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"akx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Secondary Construction Area"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"aky" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"akz" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"akA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/security/warden) +"akB" = ( +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"akC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"akD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/hand_labeler{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"akE" = ( +/turf/closed/wall/r_wall, +/area/router/sec) +"akF" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"akG" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"akH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"akI" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"akJ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Telecommunications Maintenance"; + req_access_txt = "61" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/tcommsat/computer) +"akK" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"akL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Security - Brig"; + pixel_x = 22 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"akM" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"akN" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "secblock"; + name = "Security Router" + }, +/obj/machinery/conveyor/auto{ + id = "sec" + }, +/turf/open/floor/plating, +/area/router/sec) +"akO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/security/labor{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"akP" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + name = "Security Router" + }, +/turf/open/floor/plating, +/area/router/sec) +"akQ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"akR" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"akS" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"akT" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"akU" = ( +/obj/machinery/door/window/northleft{ + name = "Showers" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"akV" = ( +/obj/structure/rack, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/item/storage/firstaid/regular, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"akW" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/reagent_containers/hypospray/medipen, +/obj/item/reagent_containers/hypospray/medipen, +/obj/item/reagent_containers/hypospray/medipen, +/obj/item/reagent_containers/hypospray/medipen, +/obj/structure/sign/departments/restroom{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"akX" = ( +/turf/closed/wall, +/area/crew_quarters/dorms/purple) +"akY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"akZ" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"ala" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"alb" = ( +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"alc" = ( +/obj/structure/fermenting_barrel, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"ald" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"ale" = ( +/turf/closed/wall, +/area/crew_quarters/dorms/blue) +"alf" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"alg" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/computer/arcade/minesweeper, +/turf/open/floor/plating, +/area/construction/secondary) +"alh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ali" = ( +/turf/open/floor/plating, +/area/construction/secondary) +"alj" = ( +/obj/machinery/gulag_teleporter, +/turf/open/floor/plasteel, +/area/security/processing) +"alk" = ( +/obj/item/caution, +/turf/open/floor/plating, +/area/construction/secondary) +"all" = ( +/obj/structure/table/glass, +/obj/item/wrench{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/bottle/mutagen{ + pixel_x = -4 + }, +/turf/open/floor/grass, +/area/hydroponics) +"alm" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/grass, +/area/hydroponics) +"aln" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/grass, +/area/hydroponics) +"alo" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"alp" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plasteel, +/area/construction/secondary) +"alq" = ( +/obj/machinery/conveyor/auto{ + id = "sec" + }, +/turf/open/floor/plating, +/area/router/sec) +"alr" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"als" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "sec_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/sec) +"alt" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Labor Camp Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"alu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"alv" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"alw" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/landmark/start/warden, +/obj/machinery/camera{ + c_tag = "Security - Brig Control"; + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"alx" = ( +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"aly" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"alz" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"alA" = ( +/obj/structure/bed, +/obj/item/bedsheet/purple, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"alB" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"alC" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"alD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"alE" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"alF" = ( +/obj/machinery/photocopier, +/obj/machinery/newscaster/security_unit{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/paper/guides/cogstation/letter_sec, +/turf/open/floor/plasteel, +/area/security/warden) +"alG" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"alH" = ( +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = -8 + }, +/obj/item/storage/box/ingredients{ + pixel_x = 6 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"alI" = ( +/obj/structure/weightmachine/stacklifter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"alJ" = ( +/obj/machinery/vending/hydroseeds, +/turf/open/floor/grass, +/area/hydroponics) +"alK" = ( +/obj/effect/landmark/xmastree, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"alL" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"alM" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"alN" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"alO" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"alP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"alQ" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"alR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"alS" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/obj/item/reagent_containers/rag, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"alT" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"alU" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"alV" = ( +/obj/structure/bed, +/obj/item/bedsheet/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"alW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/processing) +"alX" = ( +/obj/structure/table, +/obj/item/storage/box/ingredients, +/obj/item/clothing/head/chefhat, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"alY" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/t_scanner, +/turf/open/floor/plating, +/area/construction/secondary) +"alZ" = ( +/turf/closed/wall/r_wall, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"ama" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/warden) +"amb" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"amc" = ( +/turf/closed/wall, +/area/storage/tools) +"amd" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ame" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/warden) +"amf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"amg" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"amh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/machinery/recharger, +/obj/item/pen/red{ + pixel_y = 4 + }, +/obj/item/pen/blue{ + pixel_x = -4; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ami" = ( +/obj/structure/sign/poster/contraband/grey_tide{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"amj" = ( +/turf/closed/wall/rust, +/area/maintenance/port/fore) +"amk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/maintenance/port/fore) +"aml" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"amm" = ( +/obj/structure/closet/crate/secure/weapon{ + desc = "A secure clothing crate."; + name = "formal uniform crate"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"amn" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/plating, +/area/construction/secondary) +"amo" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"amp" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"amq" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"amr" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Bow Maintenance"; + req_one_access_txt = "12;25;26;28;35;46" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ams" = ( +/obj/machinery/camera{ + c_tag = "Fitness Toilets"; + pixel_x = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"amt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"amu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"amv" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"amw" = ( +/obj/structure/sign/poster/contraband/eat{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"amx" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"amy" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"amz" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"amA" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"amB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/warden) +"amC" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"amD" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"amE" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/crew_quarters/bar"; + dir = 8; + name = "Bar APC"; + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"amF" = ( +/obj/effect/landmark/start/cook, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"amG" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/chapel/main) +"amH" = ( +/obj/item/crowbar/large{ + pixel_y = 3 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/construction/secondary) +"amI" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/warden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"amJ" = ( +/obj/structure/lattice, +/obj/structure/sign/departments/botany{ + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"amK" = ( +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"amL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"amM" = ( +/obj/machinery/light, +/obj/machinery/disposal/bin{ + name = "Kitchen Mailbox" + }, +/obj/effect/turf_decal/delivery/white, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"amN" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/storage/tools) +"amO" = ( +/obj/item/bedsheet/mime, +/obj/structure/bed, +/obj/effect/landmark/start/mime, +/obj/machinery/camera{ + c_tag = "Mime's Office"; + pixel_x = 22 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/theatre/mime) +"amP" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/hallway/secondary/entry) +"amQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastleft{ + name = "Reception Window" + }, +/obj/machinery/door/window/westleft{ + name = "Warden's Desk"; + req_one_access_txt = "2" + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"amR" = ( +/obj/machinery/light/small, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"amS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"amT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/construction/secondary) +"amU" = ( +/obj/structure/beebox, +/obj/item/queen_bee/bought, +/turf/open/floor/grass, +/area/hydroponics) +"amV" = ( +/turf/open/floor/grass, +/area/hydroponics) +"amW" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = -4 + }, +/obj/item/book/manual/hydroponics_pod_people{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/paper/guides/jobs/hydroponics{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/hydroponics) +"amX" = ( +/obj/machinery/suit_storage_unit/security, +/turf/open/floor/plasteel/dark, +/area/security/processing) +"amY" = ( +/turf/closed/wall, +/area/chapel/main) +"amZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ana" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"anb" = ( +/obj/structure/table, +/obj/item/lipstick/black, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/theatre/mime) +"anc" = ( +/obj/item/cigbutt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"and" = ( +/turf/closed/wall/r_wall, +/area/chapel/main) +"ane" = ( +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"anf" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/construction/secondary"; + dir = 1; + name = "Secondary Construction Area APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/construction/secondary) +"ang" = ( +/turf/closed/wall/r_wall, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"anh" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/clothing/glasses/regular, +/obj/machinery/door/window/northright{ + name = "Medical Booth Desk"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"ani" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/poster/official/duelshotgun{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"anj" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ank" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/easel, +/obj/item/canvas/nineteenXnineteen, +/obj/machinery/camera{ + c_tag = "Crew Lounge"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"anl" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"anm" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ann" = ( +/obj/effect/turf_decal/plaque{ + desc = "It reads 'In honor of spacemen past, whose work allowed this station to find its new home. The fact that you stand on a station originally built light years away is a definitive representation of the ingenuity of the human spirit.' Beneath this is the image of a spaceman rocketing upwards by means of what appears to be a match and flatulence." + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ano" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"anp" = ( +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"anq" = ( +/turf/closed/wall, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"anr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"ans" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/destTagger, +/obj/machinery/button/door{ + id = "secblock"; + name = "Router Access Control"; + pixel_x = 8; + pixel_y = 24; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/sec) +"ant" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"anu" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"anv" = ( +/obj/item/stack/sheet/plasteel{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/beakers, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/construction) +"anw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"anx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/tcommsat/computer) +"any" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/patch/styptic, +/obj/item/reagent_containers/pill/patch/styptic, +/obj/item/reagent_containers/pill/patch/styptic, +/obj/item/reagent_containers/pill/patch/styptic, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"anz" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"anA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Fitness Room Maintenance"; + req_one_access_txt = "12;46" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"anB" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/sign/barsign{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"anC" = ( +/obj/machinery/computer/cargo/request, +/obj/effect/turf_decal/delivery, +/obj/machinery/requests_console{ + department = "Security Router"; + name = "Security Router RC"; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/router/sec) +"anD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"anE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"anF" = ( +/obj/machinery/smartfridge, +/turf/closed/wall, +/area/crew_quarters/kitchen) +"anG" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"anH" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/security{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/security/checkpoint) +"anI" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"anJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/item/paper_bin, +/obj/item/stamp/denied{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/stamp{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/pen, +/obj/machinery/power/apc{ + areastring = "/area/security/checkpoint"; + dir = 4; + name = "Security Checkpoint APC"; + pixel_x = 24 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"anK" = ( +/turf/closed/wall/r_wall, +/area/security/detectives_office) +"anL" = ( +/obj/machinery/computer/arcade/minesweeper, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"anM" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"anN" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/analyzer, +/obj/item/wrench{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"anO" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/storage/belt/utility, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/tools) +"anP" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"anQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"anR" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"anS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/tools"; + name = "Auxiliary Tool Storage APC"; + pixel_y = -26 + }, +/obj/machinery/camera{ + c_tag = "Auxiliary Tool Storage"; + dir = 4; + pixel_y = -22 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"anT" = ( +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"anU" = ( +/turf/closed/wall/r_wall, +/area/security/brig) +"anV" = ( +/turf/open/floor/plating, +/area/maintenance/solars/port) +"anW" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "sec_off" + }, +/turf/open/floor/plating, +/area/router/sec) +"anX" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"anY" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"anZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"aoa" = ( +/obj/item/clockwork/component/geis_capacitor/fallen_armor, +/obj/structure/table/bronze, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"aob" = ( +/obj/structure/closet/emcloset, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aoc" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/requests_console{ + department = "Recreation"; + name = "Recreation RC"; + pixel_y = -32 + }, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aod" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/warden) +"aoe" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"aof" = ( +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_y = 32 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aog" = ( +/turf/open/floor/grass, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aoh" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aoi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"aoj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aok" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "Dorm1"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = -7; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"aol" = ( +/obj/machinery/button/door{ + id = "Dorm3"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = 7; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aom" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aon" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aoo" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/ears/earmuffs, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/construction/secondary) +"aop" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"aoq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/warden) +"aor" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aos" = ( +/obj/structure/window/reinforced, +/obj/structure/closet/athletic_mixed, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aot" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aou" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aov" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/grass, +/area/hydroponics) +"aow" = ( +/mob/living/simple_animal/banana_spider{ + name = "Henry" + }, +/turf/open/floor/grass, +/area/hydroponics) +"aox" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"aoy" = ( +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Security Checkpoint"; + pixel_x = 22 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aoz" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/construction/secondary) +"aoA" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/item/flashlight/lamp, +/obj/machinery/door/window/westright{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aoB" = ( +/obj/structure/bed, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Beds"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/security/prison"; + dir = 4; + name = "Prison APC"; + pixel_x = 26 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aoC" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aoD" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aoE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/chapel/main) +"aoF" = ( +/turf/closed/wall/r_wall, +/area/security/main) +"aoG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aoH" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Port Bow Solars External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aoI" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/grass, +/area/hydroponics) +"aoJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aoK" = ( +/turf/closed/wall/r_wall, +/area/router/service) +"aoL" = ( +/obj/structure/chair/stool, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aoM" = ( +/obj/structure/closet/crate, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/capacitor, +/turf/open/floor/plating, +/area/construction) +"aoN" = ( +/obj/structure/closet/crate/internals, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/obj/item/clothing/head/hardhat/orange, +/obj/item/clothing/head/hardhat/orange, +/turf/open/floor/plasteel, +/area/storage/tools) +"aoO" = ( +/turf/open/floor/plasteel, +/area/storage/tools) +"aoP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aoQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"aoR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Brig Control"; + req_access_txt = "3" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/warden) +"aoS" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/conveyor{ + id = "serv_off" + }, +/obj/machinery/door/poddoor/preopen{ + id = "servblock"; + name = "Service Router" + }, +/turf/open/floor/plating, +/area/router/service) +"aoT" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "servblock"; + name = "Service Router" + }, +/turf/open/floor/plating, +/area/router/service) +"aoU" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aoV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aoW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external/glass{ + name = "Port Bow Solars External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aoX" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aoY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aoZ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"apa" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"apb" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"apc" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/brig) +"apd" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"ape" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"apf" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"apg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/router/sec) +"aph" = ( +/turf/open/floor/plasteel/dark, +/area/security/brig) +"api" = ( +/obj/machinery/door/window/southright{ + name = "Weightroom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"apj" = ( +/obj/structure/window/reinforced, +/obj/structure/punching_bag, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"apk" = ( +/obj/structure/closet/lasertag/blue, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"apl" = ( +/obj/structure/chair/sofa/right, +/obj/item/clothing/head/beret/black, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"apm" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"apn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/router/sec) +"apo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction) +"app" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/router/sec) +"apq" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"apr" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/button/massdriver{ + id = "sec_out"; + pixel_x = 24; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router/sec) +"aps" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security{ + name = "Security EVA Prep Room"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"apt" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction) +"apu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"apv" = ( +/turf/closed/wall, +/area/hallway/secondary/entry) +"apw" = ( +/obj/structure/chair/sofa/left, +/obj/effect/landmark/start/assistant, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"apx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"apy" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"apz" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"apA" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/crew_quarters/dorms/purple) +"apB" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/grass, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"apC" = ( +/turf/closed/wall/r_wall, +/area/hydroponics) +"apD" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm1"; + name = "Room 1" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"apE" = ( +/obj/machinery/biogenerator, +/turf/open/floor/grass, +/area/hydroponics) +"apF" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"apG" = ( +/mob/living/simple_animal/chicken{ + name = "Featherbottom"; + real_name = "Featherbottom" + }, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"apH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/main) +"apI" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"apJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera{ + c_tag = "Hydroponics - Fore"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"apK" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -30 + }, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/hydroponics) +"apL" = ( +/obj/structure/chair/sofa/left, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"apM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"apN" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm3"; + name = "Room 3" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"apO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/crew_quarters/dorms/blue) +"apP" = ( +/obj/structure/table, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"apQ" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Solitary Confinement"; + req_one_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"apR" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"apS" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"apT" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/construction) +"apU" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/gun/ballistic/revolver/russian, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"apV" = ( +/turf/closed/wall/rust, +/area/chapel/main) +"apW" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/crew_quarters/kitchen) +"apX" = ( +/obj/structure/fermenting_barrel, +/turf/open/floor/grass, +/area/hydroponics) +"apY" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"apZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Fitness Toilets" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aqa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aqb" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Secondary Construction Area"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/construction/secondary) +"aqc" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/r_wall, +/area/medical{ + name = "Medical Booth" + }) +"aqd" = ( +/obj/structure/chair/sofa/right, +/obj/machinery/camera{ + c_tag = "Chapel - Fore" + }, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"aqe" = ( +/obj/machinery/conveyor{ + id = "serv_off" + }, +/turf/open/floor/plating, +/area/router/service) +"aqf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aqg" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Fitness Room"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aqh" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aqi" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aqj" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aqk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aql" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/bar) +"aqm" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aqn" = ( +/turf/closed/wall/r_wall, +/area/medical{ + name = "Medical Booth" + }) +"aqo" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aqp" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"aqq" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/storage/tools) +"aqr" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/storage/tools) +"aqs" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aqt" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/structure/sign/poster/contraband/hacking_guide{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aqu" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aqv" = ( +/obj/structure/sign/poster/official/no_erp{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aqw" = ( +/turf/closed/wall/r_wall/rust, +/area/maintenance/solars/port) +"aqx" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"aqy" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "serv_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/service) +"aqz" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aqA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"aqB" = ( +/turf/closed/wall, +/area/hydroponics) +"aqC" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hydroponics) +"aqD" = ( +/obj/machinery/vending/sustenance, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aqE" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/sec) +"aqF" = ( +/turf/open/floor/plasteel, +/area/router/sec) +"aqG" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"aqH" = ( +/obj/machinery/power/apc{ + name = "Security Router APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/router/sec) +"aqI" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/hydroponics) +"aqJ" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/router/sec) +"aqK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aqL" = ( +/turf/closed/wall, +/area/security/checkpoint) +"aqM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aqN" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Service Hallway"; + req_one_access_txt = "25;26;28;35" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aqO" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering EVA"; + req_access_txt = "11" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aqP" = ( +/obj/structure/chair/stool, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aqQ" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"aqR" = ( +/obj/item/grown/bananapeel, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"aqS" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aqT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aqU" = ( +/turf/closed/wall/r_wall, +/area/engine/storage{ + name = "Canister Storage" + }) +"aqV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Purple Dorms Maintenance"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms/purple) +"aqW" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/book/manual/chef_recipes, +/obj/item/storage/box/donkpockets, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aqX" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 1"; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"aqY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aqZ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"ara" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"arb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/barbershop"; + dir = 4; + name = "Barbershop APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"arc" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/item/toy/figure/clown, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"ard" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"are" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"arf" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"arg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"arh" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"ari" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"arj" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms/purple) +"ark" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"arl" = ( +/obj/machinery/vending/kink, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Locker Room"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"arm" = ( +/obj/structure/chair/sofa/right, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"arn" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aro" = ( +/obj/structure/closet/firecloset, +/obj/machinery/camera{ + c_tag = "Starboard Bow Maintenance - Starboard"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"arp" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"arq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"arr" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"ars" = ( +/obj/structure/chair/stool, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/landmark/start/bartender, +/obj/item/clothing/under/costume/maid, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"art" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aru" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms/blue) +"arv" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"arw" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Crew Quarters" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"arx" = ( +/obj/machinery/button/door{ + id = "kitchenlock"; + name = "Kitchen Lockup"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ary" = ( +/obj/machinery/food_cart, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"arz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"arA" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"arB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"arC" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 4; + icon_state = "roomnum"; + name = "Room Number 3"; + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"arD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 8; + icon_state = "intact" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Blue Dorms Maintenance"; + req_one_access_txt = "12;46" + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms/blue) +"arE" = ( +/turf/closed/wall/r_wall, +/area/maintenance/starboard/central) +"arF" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to space" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"arG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"arH" = ( +/obj/machinery/disposal/bin{ + name = "Detective's Mailbox" + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"arI" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"arJ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"arK" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/item/destTagger, +/obj/machinery/button/massdriver{ + id = "serv_out"; + pixel_x = 8; + pixel_y = -4 + }, +/obj/machinery/requests_console{ + department = "Service Router"; + name = "Service Router RC"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/router/service) +"arL" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "serv_off" + }, +/turf/open/floor/plating, +/area/router/service) +"arM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/router/service) +"arN" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "gas to sauna" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"arO" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"arP" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"arQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"arR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/falsewall/reinforced{ + req_access_txt = "1" + }, +/turf/open/floor/plasteel, +/area/router/sec) +"arS" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/crew_quarters/dorms/purple) +"arT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"arU" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 1; + icon_state = "roomnum"; + name = "Room Number 2"; + pixel_y = -28 + }, +/obj/machinery/camera{ + c_tag = "Dormitories - Purple"; + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"arV" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/sign/poster/official/soft_cap_pop_art{ + pixel_x = -32 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"arW" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"arX" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"arY" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"arZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"asa" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"asb" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"asc" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"asd" = ( +/turf/closed/wall/rust, +/area/maintenance/starboard/fore) +"ase" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Purple Dorms" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms/purple) +"asf" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Blue Dorms" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms/blue) +"asg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"ash" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"asi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asj" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ask" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Fore"; + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/mob/living/simple_animal/mouse/brown/Tom, +/turf/open/floor/plasteel, +/area/security/prison) +"asl" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/camera{ + c_tag = "Port Bow Solar Maintenance"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"asm" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/service"; + dir = 8; + name = "Service Hall APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"asn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aso" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 8; + icon_state = "roomnum"; + name = "Room Number 4"; + pixel_y = -28 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Dormitories - Blue"; + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"asp" = ( +/obj/structure/chair/comfy/brown, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"asq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/crew_quarters/dorms/blue) +"asr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/fore) +"ass" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ast" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"asu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/rust, +/area/maintenance/disposal) +"asv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asw" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asy" = ( +/obj/effect/landmark/start/assistant, +/obj/machinery/holopad, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/hallway/secondary/entry) +"asz" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Security - Prison Bathroom"; + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"asA" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/turf/open/floor/plating, +/area/router/service) +"asB" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"asC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/button/door{ + id = "servblock"; + name = "Router Access Control"; + pixel_x = 8; + pixel_y = 24; + req_one_access_txt = "12;25;26;28;35;46" + }, +/turf/open/floor/plasteel, +/area/router/service) +"asF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security{ + name = "Labor Camp Arrivals" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"asG" = ( +/obj/structure/sign/warning/nosmoking/circle, +/turf/closed/wall/r_wall, +/area/engine/storage{ + name = "Canister Storage" + }) +"asH" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"asI" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"asJ" = ( +/turf/closed/wall, +/area/crew_quarters/toilet) +"asK" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"asL" = ( +/turf/closed/wall, +/area/security/brig) +"asM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage{ + name = "Canister Storage" + }) +"asN" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"asO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"asP" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"asQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/router/service) +"asR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"asS" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"asT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/mob/living/simple_animal/mouse/gray{ + desc = "A strangely observant rodent."; + name = "Remy" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"asU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Router"; + req_access_txt = "11" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"asV" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"asW" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/security/main) +"asX" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/tape, +/obj/item/radio/off, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"asY" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"asZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/router/service) +"ata" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/main) +"atb" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"atc" = ( +/turf/closed/wall, +/area/security/main) +"atd" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Service Router APC"; + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/router/service) +"ate" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/router/service) +"atf" = ( +/turf/closed/wall/r_wall/rust, +/area/maintenance/starboard/central) +"atg" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/router/service) +"ath" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/router/service) +"ati" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external, +/turf/open/floor/plasteel, +/area/router/service) +"atj" = ( +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"atk" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atl" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/router/service) +"atm" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"atn" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plasteel, +/area/router/service) +"ato" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"atp" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm2"; + name = "Room 2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"atq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/processing) +"atr" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm4"; + name = "Room 4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"ats" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Clown's Office"; + req_access_txt = "46" + }, +/turf/open/floor/plating, +/area/crew_quarters/theatre/clown) +"att" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"atu" = ( +/obj/machinery/computer/cargo/request{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router/service) +"atv" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"atw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/service) +"atx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/router/service) +"aty" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/service) +"atz" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"atA" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atB" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/bikehorn/rubberducky, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"atC" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"atD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router/service) +"atE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/router/service) +"atF" = ( +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"atG" = ( +/turf/open/floor/plasteel/dark, +/area/router/service) +"atH" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/power/apc{ + areastring = "/area/security/processing"; + name = "Labor Shuttle Dock APC"; + pixel_y = -26 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/security/processing) +"atI" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/warden) +"atJ" = ( +/turf/closed/wall/rust, +/area/crew_quarters/theatre/clown) +"atK" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atL" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atM" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atN" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"atO" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/clothing/gloves/color/white, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/item/paper/guides/cogstation/cooks, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"atP" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"atQ" = ( +/obj/structure/closet/lasertag/red, +/obj/structure/sign/poster/official/space_cops{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"atR" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"atS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Bar Backroom"; + req_access_txt = "25" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"atT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"atU" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"atV" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"atW" = ( +/obj/machinery/disposal/bin{ + name = "Parolee Exit" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/brig) +"atX" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/stock_parts/cell/high/plus, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/storage/tools) +"atY" = ( +/obj/machinery/button/door{ + id = "Dorm2"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = -7; + pixel_y = 24; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"atZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall, +/area/hallway/secondary/entry) +"aua" = ( +/obj/structure/chair/wood/normal, +/obj/machinery/button/door{ + id = "Dorm4"; + name = "Dormitory Door Lock"; + normaldoorcontrol = 1; + pixel_x = 7; + pixel_y = 24; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aub" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"auc" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aud" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"aue" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/seeds/random, +/turf/open/floor/plating, +/area/router/service) +"auf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/router/service) +"aug" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/storage/bag/plants, +/turf/open/floor/plasteel, +/area/hydroponics) +"auh" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/storage/pill_bottle/dice, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aui" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Freezer AC Pump" + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"auj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/router/service) +"auk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/service) +"aul" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/mob/living/simple_animal/mouse/brown{ + name = "Chewy" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aum" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/service) +"aun" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/vending/hydronutrients, +/turf/open/floor/plasteel, +/area/hydroponics) +"auo" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aup" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bucket{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"auq" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/router/service) +"aur" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/router/service) +"aus" = ( +/turf/open/floor/engine, +/area/engine/gravity_generator) +"aut" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"auu" = ( +/obj/effect/landmark/start/botanist, +/turf/open/floor/plasteel/dark, +/area/router/service) +"auv" = ( +/obj/structure/bed, +/obj/item/bedsheet/purple, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"auw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aux" = ( +/obj/machinery/light/small, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"auy" = ( +/turf/open/floor/plasteel, +/area/hydroponics) +"auz" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/chem_master, +/turf/open/floor/plasteel, +/area/hydroponics) +"auA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/hydroponics) +"auB" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/purple, +/area/crew_quarters/dorms/purple) +"auC" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"auD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"auE" = ( +/obj/structure/bed, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"auF" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"auG" = ( +/obj/machinery/light/small, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"auH" = ( +/obj/structure/girder/displaced, +/obj/item/reagent_containers/rag, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"auI" = ( +/obj/structure/closet/secure_closet/brig, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"auJ" = ( +/obj/structure/bed, +/obj/item/bedsheet/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/dorms/blue) +"auK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"auL" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"auM" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_x = -32 + }, +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"auN" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"auO" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/plating, +/area/router/service) +"auP" = ( +/obj/structure/chair/sofa/right, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/start/assistant/override, +/turf/open/floor/plasteel, +/area/security/main) +"auQ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"auR" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/secure_construction"; + dir = 1; + name = "Engineering Construction Area APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"auS" = ( +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"auT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"auU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/router/service) +"auV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"auW" = ( +/obj/structure/chair/sofa/left, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/sign/poster/official/the_owl{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/security/main) +"auX" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/stairs/right, +/area/router/service) +"auY" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"auZ" = ( +/obj/structure/disposalpipe/junction/flip, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"ava" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/service) +"avb" = ( +/turf/closed/wall, +/area/hallway/secondary/civilian) +"avc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avd" = ( +/obj/structure/sign/warning{ + name = "\improper COLD TEMPERATURES"; + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"ave" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"avf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Bow Maintenance"; + req_one_access_txt = "12;25;26;28;35;46" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/civilian) +"avg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Brig"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"avh" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/storage/tools) +"avi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance/abandoned{ + name = "Port Bow Maintainance"; + req_one_access_txt = "13" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"avj" = ( +/obj/machinery/photocopier, +/turf/open/floor/carpet/red, +/area/security/brig) +"avk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/plant_analyzer, +/obj/structure/table/glass, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"avl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"avm" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/civilian) +"avn" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/poster/official/spiderlings{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"avo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"avp" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/glass{ + name = "East Primary Hallway"; + req_one_access_txt = "10;12;25;26;28;35;46" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/router/service) +"avq" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/glass{ + name = "East Primary Hallway"; + req_one_access_txt = "10;12;25;26;28;35;46" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/router/service) +"avr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/solar/starboard/fore) +"avs" = ( +/turf/closed/wall, +/area/router/service) +"avt" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"avu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"avv" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating, +/area/space/nearstation) +"avw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/sign/poster/official/wtf_is_co2{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"avx" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/crowbar/large, +/obj/item/crowbar{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/service) +"avy" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plating, +/area/space/nearstation) +"avz" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/service) +"avA" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"avB" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/service) +"avC" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avD" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/storage/belt/utility, +/obj/item/tank/internals/air, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/service) +"avE" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "generator to hot loop" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"avG" = ( +/turf/closed/wall, +/area/security/prison) +"avH" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avJ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/security/main) +"avK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avL" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"avM" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/security/main) +"avN" = ( +/turf/closed/wall, +/area/crew_quarters/barbershop) +"avO" = ( +/obj/structure/table, +/obj/structure/bedsheetbin/color, +/obj/item/clothing/gloves/color/white, +/obj/machinery/camera{ + c_tag = "Laundry Room" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"avP" = ( +/obj/structure/reagent_dispensers/keg, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"avQ" = ( +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avR" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"avS" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"avT" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"avU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"avW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"avX" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"avY" = ( +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/obj/machinery/turretid{ + name = "AI Chamber turret control"; + pixel_x = 5; + pixel_y = -24 + }, +/obj/machinery/door/window/westleft{ + name = "AI Core Access"; + req_access_txt = "65" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"avZ" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"awa" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"awb" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awc" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"awd" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awe" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"awf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Civilian Wing Hallway - Fore" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awh" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"awi" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awj" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awl" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awm" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/maintenance/solars/port) +"awn" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"awo" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awp" = ( +/turf/closed/wall, +/area/hydroponics/lobby) +"awq" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plating, +/area/space/nearstation) +"awr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aws" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/engine/storage{ + name = "Canister Storage" + }) +"awt" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/item/folder/red, +/obj/machinery/door/window/westleft{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"awu" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awv" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/obj/structure/table, +/obj/item/clothing/gloves/color/white, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"aww" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"awx" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hydroponics/lobby) +"awy" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Laundry Room Maintenance"; + req_one_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/barbershop) +"awz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"awA" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"awB" = ( +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/crew_quarters/bar) +"awC" = ( +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"awD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"awE" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/storage/tools) +"awF" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"awG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"awH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"awI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awJ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/flasher/portable, +/turf/open/floor/plasteel, +/area/security/brig) +"awK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"awM" = ( +/obj/structure/rack, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/crowbar/large, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"awN" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/fore) +"awO" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/central"; + dir = 1; + name = "Central Port Maintenance APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"awP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"awQ" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/security/main) +"awR" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"awS" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"awT" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 7 + }, +/turf/open/floor/plasteel, +/area/security/main) +"awU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"awV" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/vending/assist, +/turf/open/floor/plasteel, +/area/storage/tools) +"awW" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to space" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"awX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"awY" = ( +/obj/structure/closet/wardrobe/orange, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"awZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axa" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"axb" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"axc" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/maintenance/solars/port) +"axd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"axe" = ( +/obj/structure/closet/crate, +/obj/item/storage/belt/utility, +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating, +/area/maintenance/fore) +"axf" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"axg" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/camera{ + c_tag = "Arcade"; + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"axh" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"axi" = ( +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/plasteel, +/area/security/brig) +"axj" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"axk" = ( +/obj/item/storage/pill_bottle/penis_enlargement, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"axl" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/item/soap/homemade, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"axm" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall, +/area/security/prison) +"axn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"axo" = ( +/obj/structure/table, +/obj/item/tape, +/obj/item/wrench, +/obj/item/radio/off, +/turf/open/floor/plasteel, +/area/security/brig) +"axp" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"axq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"axr" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"axs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"axt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"axu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/security/brig) +"axv" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/clothing/accessory/armband/deputy, +/obj/item/encryptionkey/headset_sec, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/item/clothing/head/cowboyhat/sec, +/turf/open/floor/plasteel, +/area/security/brig) +"axw" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/main) +"axx" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/camera{ + c_tag = "Fore Maintenance - Aft"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"axy" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/botanist, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"axz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axA" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/item/clothing/accessory/armband/science, +/obj/item/encryptionkey/headset_sci, +/turf/open/floor/plasteel, +/area/security/brig) +"axB" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/item/clothing/accessory/armband/medblue, +/obj/item/encryptionkey/headset_med, +/turf/open/floor/plasteel, +/area/security/brig) +"axC" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axD" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Hydroponics Storage"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"axE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/kudzu{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"axF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"axG" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"axH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"axI" = ( +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"axJ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"axK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axL" = ( +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_y = 32 + }, +/obj/item/assembly/prox_sensor, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"axM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"axN" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axO" = ( +/obj/structure/weightmachine/stacklifter, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"axP" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"axQ" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"axR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"axS" = ( +/obj/structure/closet/crate, +/obj/item/storage/box/lights/mixed, +/obj/item/clothing/mask/gas, +/obj/item/cane, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"axT" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/crayons{ + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"axV" = ( +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"axW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"axX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"axY" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"axZ" = ( +/obj/machinery/requests_console{ + department = "AI"; + departmentType = 5; + pixel_y = 28 + }, +/obj/machinery/door/window/eastright{ + name = "AI Core Access"; + req_access_txt = "65" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aya" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "AI Core Exterior"; + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ayb" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"ayc" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"ayd" = ( +/turf/closed/wall, +/area/hallway/primary/port/fore) +"aye" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"ayf" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ayg" = ( +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"ayh" = ( +/obj/machinery/door/airlock{ + name = "Bathroom" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"ayi" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ayj" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/security/brig) +"ayk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"ayl" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aym" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/prison) +"ayn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"ayo" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"ayp" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"ayq" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"ayr" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"ays" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/space_up, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ayt" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"ayu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/fore) +"ayv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"ayw" = ( +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Service Hallway - Fore"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"ayx" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"ayy" = ( +/turf/open/floor/carpet, +/area/chapel/main) +"ayz" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"ayA" = ( +/obj/structure/window/reinforced, +/obj/structure/destructible/cult/tome, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"ayB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"ayC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"ayD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"ayE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hydroponics/lobby) +"ayF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"ayG" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"ayH" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/mob/living/simple_animal/cockroach, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"ayI" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ayJ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/maintenance/solars/port) +"ayK" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"ayL" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"ayM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"ayN" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"ayO" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"ayP" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"ayQ" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"ayR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/security/brig) +"ayS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ayT" = ( +/obj/machinery/vending/security, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ayU" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/obj/item/key/security, +/turf/open/floor/plasteel, +/area/security/brig) +"ayV" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"ayW" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ayX" = ( +/obj/structure/closet/wardrobe/mixed, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"ayY" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"ayZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aza" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/gloves/botanic_leather, +/obj/item/hand_labeler, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azb" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"azc" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"azd" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/clothing/mask/gas, +/obj/machinery/camera{ + c_tag = "Central Port Maintenace - Port" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aze" = ( +/obj/machinery/power/apc{ + name = "AI Chamber APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"azf" = ( +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"azg" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"azh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"azi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation Maintenance"; + req_access_txt = "63;12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"azj" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"azk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"azl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Security - Brig Aft"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"azm" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"azn" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"azo" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"azp" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"azq" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plating, +/area/space/nearstation) +"azr" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"azs" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"azt" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"azu" = ( +/obj/structure/chair/pew{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"azv" = ( +/obj/machinery/door/window/westleft{ + name = "Holy Driver"; + req_one_access_txt = "22" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "Holydriver" + }, +/turf/open/floor/plating, +/area/chapel/main) +"azw" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "Holydriver" + }, +/turf/open/floor/plating, +/area/chapel/main) +"azx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"azy" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"azz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"azA" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"azB" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"azC" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/barbershop) +"azD" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"azE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"azF" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/tools) +"azG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"azH" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/sign/departments/botany{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"azI" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"azJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"azK" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/machinery/door/window/westleft{ + name = "Boxing Ring" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"azL" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"azM" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 2 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/security/prison) +"azO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"azQ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"azR" = ( +/obj/structure/closet/secure_closet/bar, +/obj/structure/disposalpipe/segment, +/obj/item/clothing/under/costume/maid, +/obj/item/stack/spacecash/c10, +/obj/item/clothing/under/suit/waiter, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"azS" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/closet, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil/red{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil/red, +/obj/item/wrench, +/obj/item/screwdriver{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"azT" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"azU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azV" = ( +/obj/structure/kitchenspike, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"azW" = ( +/obj/effect/landmark/start/botanist, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azX" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/tools) +"azY" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + areastring = "/area/hydroponics/lobby"; + dir = 4; + name = "Hydroponics Lobby APC"; + pixel_x = 24 + }, +/obj/item/clothing/suit/beekeeper_suit, +/obj/item/melee/flyswatter, +/obj/item/clothing/head/beekeeper_head, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"azZ" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "chapelgun"; + name = "Holy Driver" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/chapel/main) +"aAa" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen) +"aAb" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aAc" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aAd" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/processing) +"aAe" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aAf" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/mineral_door/wood, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aAg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/obj/machinery/gibber, +/obj/machinery/camera{ + c_tag = "Kitchen Coldroom"; + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"aAh" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/easel, +/obj/item/canvas/nineteenXnineteen, +/obj/item/storage/crayons, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aAi" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aAj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aAk" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aAl" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aAm" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/door/airlock/freezer{ + name = "Kitchen Coldroom"; + req_access_txt = "28" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"aAn" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/security/brig) +"aAo" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/sign/poster/official/twelve_gauge{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aAp" = ( +/obj/machinery/computer/security/telescreen/entertainment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/bar) +"aAq" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aAr" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aAs" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aAt" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/machinery/camera{ + c_tag = "Hydroponics Storage"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aAu" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/decal/cleanable/dirt, +/obj/item/circuitboard/machine/hydroponics, +/obj/item/circuitboard/machine/hydroponics, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aAv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_y = 6 + }, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_y = -6 + }, +/obj/machinery/vending/security, +/turf/open/floor/plasteel, +/area/security/brig) +"aAw" = ( +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/chapel/main) +"aAx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aAy" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aAz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aAA" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aAB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aAC" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aAD" = ( +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aAE" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aAF" = ( +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"aAG" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"aAH" = ( +/obj/structure/chair/pew{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet, +/area/chapel/main) +"aAI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aAJ" = ( +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aAK" = ( +/obj/structure/transit_tube/horizontal, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aAL" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aAM" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aAN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aAO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/crew_quarters/toilet) +"aAP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/brig) +"aAQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aAR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Telecomms Access Maintenance"; + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aAS" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/item/clothing/accessory/armband/engine, +/obj/item/encryptionkey/headset_eng, +/turf/open/floor/plasteel, +/area/security/brig) +"aAT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aAU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aAV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aAW" = ( +/obj/machinery/chem_master/condimaster{ + name = "BrewMaster 3000" + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aAX" = ( +/turf/open/floor/carpet/red, +/area/security/brig) +"aAY" = ( +/obj/structure/chair, +/turf/open/floor/carpet/red, +/area/security/brig) +"aAZ" = ( +/obj/structure/chair, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"aBa" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aBb" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aBc" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/beekeeper_suit, +/obj/item/melee/flyswatter, +/obj/item/clothing/head/beekeeper_head, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aBd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aBe" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aBf" = ( +/obj/structure/closet{ + name = "Evidence Closet" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aBg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/junction, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aBh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aBi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aBj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"aBk" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/crew_quarters/barbershop) +"aBl" = ( +/obj/structure/chair/comfy/brown, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aBm" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Dormitories" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aBn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aBo" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/epinephrine, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aBp" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/computer/pod/old{ + density = 0; + icon = 'icons/obj/airlock_machines.dmi'; + icon_state = "airlock_control_standby"; + id = "chapelgun"; + name = "Mass Driver Controller"; + pixel_x = 24 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "Holydriver" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aBq" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aBr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aBs" = ( +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aBt" = ( +/obj/structure/chair/comfy/brown, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aBu" = ( +/obj/item/flashlight/lantern, +/turf/open/floor/carpet, +/area/chapel/main) +"aBv" = ( +/obj/structure/chair/pew/left{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"aBw" = ( +/obj/structure/chair/comfy/brown, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/barbershop) +"aBx" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/security/main) +"aBy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16" + }, +/obj/machinery/camera{ + c_tag = "Port Bow Hall - Central"; + dir = 4; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aBz" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aBA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table, +/obj/item/healthanalyzer, +/obj/item/storage/hypospraykit/fire{ + pixel_x = -4 + }, +/obj/item/storage/hypospraykit/brute{ + pixel_x = 4 + }, +/obj/structure/sign/poster/official/nt_storm{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aBB" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aBC" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/main) +"aBD" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aBE" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aBF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"aBG" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/crew_quarters/bar) +"aBH" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aBI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aBJ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aBK" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/security/main) +"aBL" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aBM" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/abandoned_gambling_den"; + name = "Arcade APC"; + pixel_y = -26 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aBN" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aBO" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Hydroponics Storage"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aBP" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aBQ" = ( +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aBR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aBS" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aBT" = ( +/obj/item/razor, +/obj/item/toy/figure/chef{ + pixel_x = -6 + }, +/obj/item/toy/figure/bartender{ + pixel_x = 4 + }, +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"aBU" = ( +/obj/structure/window/reinforced/tinted, +/obj/structure/rack, +/obj/item/soap/nanotrasen, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aBV" = ( +/obj/item/flashlight/lantern, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aBW" = ( +/obj/structure/window/reinforced, +/obj/item/clothing/head/hardhat/cakehat, +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"aBX" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aBY" = ( +/obj/structure/closet/emcloset, +/obj/machinery/camera{ + c_tag = "Security Maintenance"; + dir = 1; + network = list("ss13","medbay") + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aBZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aCa" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/main) +"aCb" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aCc" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/clothing/accessory/armband/cargo, +/obj/item/encryptionkey/headset_cargo, +/turf/open/floor/plasteel, +/area/security/brig) +"aCd" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = /area/maintenance/solars/port; + dir = 1; + name = "Port Solars APC"; + pixel_y = 26 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aCe" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"aCf" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"aCg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/supply, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aCh" = ( +/obj/structure/mineral_door/wood{ + name = "Barbershop" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aCi" = ( +/obj/structure/closet/l3closet/security, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/security/brig) +"aCj" = ( +/obj/machinery/door/window/southleft{ + name = "Showers" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aCk" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/crew_quarters/toilet/fitness) +"aCl" = ( +/obj/structure/closet/bombcloset/security, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/security/brig) +"aCm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aCn" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aCo" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aCp" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/fitness) +"aCq" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aCr" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aCs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aCt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aCu" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"aCv" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"aCw" = ( +/obj/structure/window/reinforced/tinted, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aCx" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aCy" = ( +/obj/structure/table/wood, +/obj/item/storage/book/bible, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aCz" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aCA" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aCB" = ( +/obj/structure/chair/stool/bar, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"aCC" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/security/prison) +"aCD" = ( +/obj/item/trash/plate, +/obj/item/kitchen/fork, +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aCE" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "briglockdown"; + name = "Brig Lockdown"; + pixel_x = 24; + req_access_txt = "2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aCF" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aCG" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aCH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Brig"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aCI" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/botany{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aCJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/main) +"aCK" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/security/prison) +"aCL" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/paper/guides/cogstation/letter_sec, +/turf/open/floor/carpet/red, +/area/security/brig) +"aCM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aCN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aCO" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aCP" = ( +/obj/structure/chair/sofa/left, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/camera{ + c_tag = "Hydroponics Lobby" + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aCQ" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/harebell, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"aCR" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aCS" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aCT" = ( +/obj/machinery/disposal/bin{ + name = "Hydroponics Mailbox" + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/white, +/obj/machinery/requests_console{ + department = "Hydroponics"; + name = "Hydroponics RC"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aCU" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plating, +/area/space/nearstation) +"aCV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/tools) +"aCW" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/junction, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aCX" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aCY" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/biogenerator, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aCZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aDa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/barbershop) +"aDb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint) +"aDc" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Barbershop"; + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aDd" = ( +/obj/structure/chair/office/dark, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aDe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aDf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aDg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/central) +"aDh" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Port Bow Primary Hallway" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aDi" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aDj" = ( +/obj/structure/closet/wardrobe/green, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aDk" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/door/window/eastright{ + name = "Bathroom Stall" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aDl" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aDm" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aDn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/bridge) +"aDo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aDp" = ( +/obj/effect/spawner/structure/window, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/barbershop) +"aDq" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aDr" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Civilian Wing Hallway" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aDs" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/brig) +"aDt" = ( +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aDu" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aDv" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aDw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aDx" = ( +/obj/structure/closet/crate, +/obj/item/gun/ballistic/shotgun/toy/unrestricted, +/obj/item/gun/ballistic/shotgun/toy/unrestricted, +/obj/item/toy/gun, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"aDy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aDz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/sign/departments/restroom{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aDA" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDB" = ( +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aDC" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aDE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aDF" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"aDG" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDH" = ( +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aDJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDL" = ( +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aDM" = ( +/turf/closed/wall, +/area/maintenance/central) +"aDN" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/central) +"aDO" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aDP" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aDQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aDR" = ( +/turf/open/floor/plating, +/area/maintenance/central) +"aDS" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/barbershop) +"aDT" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aDU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aDV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aDW" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aDX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aDY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aDZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEa" = ( +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aEb" = ( +/obj/structure/transit_tube/crossing/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aEc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "63" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aEd" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEe" = ( +/obj/structure/transit_tube/horizontal, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aEf" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior - Port Bow"; + dir = 1; + network = list("tcomms") + }, +/turf/open/space/basic, +/area/space) +"aEg" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aEh" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"aEi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aEj" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"aEk" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aEl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aEm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aEn" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aEo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aEp" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aEq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aEr" = ( +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/lighter, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEs" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aEt" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aEv" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aEw" = ( +/obj/structure/chair, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aEx" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aEy" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/brig) +"aEz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEA" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aEB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aED" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/carpet/red, +/area/security/brig) +"aEE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aEF" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"aEG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aEI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"aEJ" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEK" = ( +/obj/structure/table, +/obj/item/razor, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aEM" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy, +/turf/open/floor/carpet, +/area/chapel/main) +"aEN" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/razor, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEO" = ( +/obj/structure/table, +/obj/item/clothing/accessory/pocketprotector/cosmetology, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEP" = ( +/obj/item/twohanded/required/kirbyplants, +/turf/open/floor/wood, +/area/crew_quarters/barbershop) +"aEQ" = ( +/turf/closed/wall/r_wall, +/area/maintenance/central) +"aER" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aES" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aET" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aEU" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aEV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/central) +"aEW" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aEX" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/poster/official/safety_internals{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aEY" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aEZ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Emergency Storage APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFa" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 10 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFc" = ( +/obj/structure/table, +/obj/item/clothing/suit/toggle/owlwings, +/obj/item/clothing/under/costume/owl, +/obj/item/clothing/mask/gas/owl_mask, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aFd" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFe" = ( +/obj/machinery/photocopier, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"aFf" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=serv"; + location = "sec1" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aFg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aFh" = ( +/obj/structure/chair/pew/right{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet, +/area/chapel/main) +"aFi" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=market"; + location = "sec2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aFj" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"aFk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/checkpoint) +"aFl" = ( +/obj/structure/chair/sofa/right, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/reagent_containers/glass/bottle/diethylamine, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFm" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"aFn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aFo" = ( +/obj/machinery/door/window/southleft{ + name = "Weightroom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"aFp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFq" = ( +/obj/structure/table/wood, +/obj/item/candle{ + pixel_x = 4 + }, +/obj/item/candle{ + pixel_y = 8 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"aFr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFs" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aFt" = ( +/obj/structure/table/glass, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aFv" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/hallway/secondary/entry) +"aFw" = ( +/obj/structure/table, +/obj/item/multitool, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/camera{ + c_tag = "Central Maintenance - Power Monitoring"; + network = list("ss13","rd") + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aFx" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/folder/blue, +/obj/machinery/door/window/westleft{ + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFy" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aFz" = ( +/obj/structure/table, +/obj/item/multitool{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/stack/cable_coil/random, +/obj/item/crowbar, +/turf/open/floor/plating, +/area/maintenance/central) +"aFA" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFB" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFC" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aFD" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=AftH"; + location = "Hydroponics" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFE" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/techstorage/tcomms, +/turf/open/floor/circuit, +/area/bridge) +"aFF" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aFG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/prison) +"aFH" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFI" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "Primary Tool Storage" + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aFJ" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/watertank, +/obj/item/grenade/chem_grenade/antiweed, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFK" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/storage/box/beakers{ + pixel_y = 4 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/pen/blue{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/pen/red{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFL" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/chem_master, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aFM" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/barbershop) +"aFN" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aFO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aFQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFT" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aFU" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aFV" = ( +/obj/structure/window/reinforced, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"aFW" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aFX" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aFY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet, +/area/chapel/main) +"aFZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/security/prison) +"aGa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"aGb" = ( +/obj/machinery/suit_storage_unit/hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aGc" = ( +/obj/item/coin/iron, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"aGd" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aGe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aGf" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aGg" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGh" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aGi" = ( +/obj/machinery/porta_turret/ai{ + dir = 1; + req_access = list(16) + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aGj" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/emergency{ + pixel_y = 4 + }, +/obj/item/analyzer{ + pixel_y = -4 + }, +/obj/item/flashlight{ + pixel_y = 4 + }, +/obj/item/flashlight{ + pixel_y = 4 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aGk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aGl" = ( +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/clipboard, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aGm" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/machinery/door/window/southright{ + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aGn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/bridge) +"aGo" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/screwdriver, +/obj/item/wrench, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/multitool, +/obj/item/multitool, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/security/brig) +"aGp" = ( +/mob/living/simple_animal/mouse/brown, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aGq" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"aGr" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGs" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/bridge) +"aGt" = ( +/obj/machinery/computer/card/minor/hos{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aGu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aGv" = ( +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aGw" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Hydroponics Lobby"; + req_access_txt = "35" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"aGx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGy" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aGz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/bridge"; + name = "Bridge APC"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aGA" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aGB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aGC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aGD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet"; + dir = 8; + name = "Dormitory Toilets APC"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aGE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aGF" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/clothing/glasses/meson, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aGG" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aGH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medical Booth"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/medical{ + name = "Medical Booth" + }) +"aGI" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4 + }, +/obj/item/reagent_containers/pill/patch/silver_sulf{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4 + }, +/obj/item/reagent_containers/pill/patch/styptic{ + pixel_x = 4; + pixel_y = -1 + }, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aGJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Head of Security's APC"; + pixel_y = 24 + }, +/obj/machinery/camera{ + c_tag = "Security - Head of Security's Office"; + pixel_x = 22 + }, +/obj/machinery/computer/security/hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aGL" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/regular, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aGM" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aGN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aGO" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aGP" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aGQ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGR" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/store/cake/chocolate, +/obj/machinery/door/poddoor/preopen{ + id = "kitchenlock"; + name = "Kitchen Lockup" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/kitchen) +"aGS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aGT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aGU" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aGV" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/table, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aGW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"aGX" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Bridge"; + departmentType = 5; + name = "Bridge RC"; + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aGY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -30 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aGZ" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/hallway/secondary/entry) +"aHa" = ( +/obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHb" = ( +/obj/structure/chair, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aHc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aHd" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aHe" = ( +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_y = -32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aHf" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aHg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aHh" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aHi" = ( +/obj/structure/chair/stool, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aHj" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Starboard Bow Solar Exterior Airlock"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"aHk" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHl" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aHm" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aHn" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/central) +"aHo" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/telecomms/relay, +/obj/item/circuitboard/machine/telecomms/server, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aHp" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHq" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/machinery/porta_turret/ai{ + dir = 1; + req_access = list(16) + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"aHr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aHs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"aHt" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/port/fore) +"aHu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHw" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aHx" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall, +/area/security/detectives_office) +"aHy" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/security/detectives_office) +"aHz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/security/detectives_office) +"aHA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/detectives_office) +"aHB" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/emergency{ + pixel_y = 4 + }, +/obj/item/wrench, +/obj/item/wrench{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/light/tube, +/obj/item/light/tube{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aHC" = ( +/obj/machinery/vending/cola/random, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aHD" = ( +/obj/machinery/modular_computer/console/preset/engineering, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aHE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aHF" = ( +/turf/open/floor/plasteel/dark, +/area/bridge) +"aHG" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aHH" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aHI" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aHJ" = ( +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aHK" = ( +/obj/structure/musician/piano, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aHL" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/stack/medical/gauze, +/obj/item/reagent_containers/blood, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aHM" = ( +/turf/open/floor/plasteel, +/area/bridge) +"aHN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Security - Interrogation Room"; + pixel_x = 22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aHO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHP" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"aHQ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aHR" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Security Office APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aHS" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aHT" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aHU" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/mineral_door/woodrustic{ + name = "Nature Preserve" + }, +/turf/open/floor/plasteel, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aHV" = ( +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aHW" = ( +/obj/structure/chair/comfy/brown, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aHX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aHY" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/cryopod) +"aHZ" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/door/window/eastleft{ + name = "Security Office Desk"; + req_one_access_txt = "63" + }, +/obj/item/folder/red, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stamp, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aIa" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aIb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIc" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aId" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aIf" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aIg" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aIh" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aIi" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIk" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aIm" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/requests_console{ + department = "Kitchen"; + departmentType = 2; + name = "Kitchen RC"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aIn" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/security/prison) +"aIo" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aIp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIq" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aIr" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/item/folder/red, +/obj/item/stamp/hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aIs" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aIt" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIu" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIv" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aIw" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIz" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aIA" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aIB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/main) +"aID" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/main) +"aIE" = ( +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aIF" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/recharger, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aIG" = ( +/obj/structure/table, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aIH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aII" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aIJ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIK" = ( +/obj/structure/table/wood, +/obj/item/camera, +/obj/item/folder, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aIL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aIM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aIN" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aIO" = ( +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = -24 + }, +/obj/structure/sign/directions/evac{ + dir = 1; + pixel_y = -32 + }, +/obj/structure/sign/directions/supply{ + dir = 8; + pixel_y = -40 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aIQ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aIR" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/botanist, +/turf/open/floor/plasteel, +/area/hydroponics) +"aIS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/ai, +/obj/item/radio/intercom{ + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_x = 27; + pixel_y = -7 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Common Channel"; + pixel_x = 27; + pixel_y = 5 + }, +/obj/machinery/button/door{ + id = "AIShutter"; + layer = 3.6; + name = "AI Core Shutter Control"; + pixel_x = 24; + pixel_y = -24 + }, +/obj/item/radio/intercom{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = -24; + pixel_y = -8 + }, +/obj/machinery/button/door{ + id = "AIChamberShutter"; + layer = 3.6; + name = "AI Chamber Shutter Control"; + pixel_x = -24; + pixel_y = -24 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aIT" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aIU" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aIV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation Monitoring"; + req_access_txt = "63" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aIW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIX" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aIY" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aIZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aJa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aJb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aJc" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJd" = ( +/turf/closed/wall, +/area/chapel/office) +"aJe" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aJf" = ( +/obj/machinery/camera{ + c_tag = "Chapel - Aft"; + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aJg" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aJh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aJi" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aJj" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft"; + dir = 8; + name = "Chapel APC"; + pixel_x = -26 + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aJk" = ( +/obj/structure/table/wood, +/obj/item/candle, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aJl" = ( +/obj/structure/bodycontainer/crematorium{ + id = "foo" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aJm" = ( +/obj/machinery/light, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aJn" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aJo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aJp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/camera/motion{ + c_tag = "AI"; + network = list("minisat") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aJq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/science, +/turf/open/floor/plasteel, +/area/hydroponics) +"aJr" = ( +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -32 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -24 + }, +/obj/structure/sign/directions/science{ + dir = 8; + pixel_y = -40 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJs" = ( +/obj/structure/noticeboard{ + name = "Hydroponics Requests Board"; + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aJt" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/toy/figure/syndie, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"aJu" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aJv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/main) +"aJw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aJx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJy" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/right, +/area/security/brig) +"aJz" = ( +/obj/structure/chair/comfy/brown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aJA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Port Bow Hall - Dorms Access"; + network = list("ss13","rd") + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJB" = ( +/obj/machinery/computer/security/mining{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aJC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJD" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/storage/belt/medical, +/obj/item/clothing/suit/space/hardsuit/medical, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"aJE" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"aJF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"aJG" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/bridge) +"aJH" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/storage/tools) +"aJI" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable, +/obj/item/shovel/spade, +/obj/item/wrench, +/obj/item/cultivator, +/obj/item/crowbar, +/obj/item/wirecutters, +/obj/item/reagent_containers/glass/bucket, +/obj/item/hatchet, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hydroponics"; + name = "Hydroponics APC"; + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aJJ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aJK" = ( +/obj/structure/filingcabinet, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/bridge) +"aJL" = ( +/turf/open/floor/circuit, +/area/bridge) +"aJM" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/circuit, +/area/bridge) +"aJN" = ( +/obj/machinery/camera{ + c_tag = "Security - Prison Aft"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aJO" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aJP" = ( +/obj/structure/chair/comfy/teal, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/sign/departments/botany{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Civilian Wing Hallway - Starboard"; + dir = 8; + pixel_y = -22 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aJQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"aJS" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aJT" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aJU" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aJV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/security/prison) +"aJW" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aJX" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/bridge) +"aJY" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/storage/box/lights/mixed, +/obj/item/stack/sheet/metal/fifty{ + pixel_x = -3; + pixel_y = -7 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aJZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/main) +"aKa" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aKb" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/civilian) +"aKc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aKd" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "63" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aKe" = ( +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"aKf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/emergency/generic) +"aKg" = ( +/turf/open/floor/plasteel/stairs/right, +/area/hallway/secondary/entry) +"aKh" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"aKi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aKj" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aKk" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/start/detective, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aKl" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aKm" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Storage" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aKn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"aKo" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aKp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aKq" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/chapel/main) +"aKr" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Emergency Storage" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/emergency/generic) +"aKs" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/obj/item/reagent_containers/rag, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aKt" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aKu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/storage/emergency/generic) +"aKv" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aKw" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice, +/obj/item/toy/cards/deck, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aKx" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aKy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/flasher/portable, +/turf/open/floor/plasteel, +/area/security/brig) +"aKz" = ( +/turf/closed/wall, +/area/storage/emergency/generic) +"aKA" = ( +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "bridge blast"; + name = "Bridge Blast Door Control"; + pixel_x = -6; + pixel_y = -3; + req_access_txt = "19" + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aKB" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aKC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aKD" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aKE" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aKF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Telecommunications Control Room"; + req_access_txt = "19;61" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aKG" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/emergency, +/obj/item/crowbar/red, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aKH" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/camera{ + c_tag = "Bridge - Fore"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aKI" = ( +/obj/structure/closet/cabinet, +/obj/item/screwdriver, +/obj/item/storage/crayons, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aKJ" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aKK" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/vending/snack/blue, +/turf/open/floor/plasteel, +/area/bridge) +"aKL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aKM" = ( +/obj/machinery/camera{ + c_tag = "Chapel - Starboard"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aKN" = ( +/obj/structure/chair/pew/left{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aKO" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/security/brig) +"aKP" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/bridge) +"aKQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/chapel/office) +"aKR" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aKS" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aKT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aKU" = ( +/obj/structure/bodycontainer/morgue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aKV" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aKW" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aKX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Chapel Morgue"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aKY" = ( +/obj/structure/chair/sofa/left, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aKZ" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"aLa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"aLb" = ( +/obj/item/toy/prize/honk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aLc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"aLd" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLe" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aLg" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aLh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aLj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/brig) +"aLl" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/vending/autodrobe, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aLm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aLn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aLo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLp" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aLq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aLt" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Visitation Maintainance"; + req_one_access_txt = "63" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/security/main) +"aLv" = ( +/obj/machinery/computer/cryopod{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aLw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-06" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aLx" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aLy" = ( +/obj/machinery/modular_computer/console/preset/command{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aLz" = ( +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLA" = ( +/obj/item/candle{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/item/candle{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aLB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aLC" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLD" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aLE" = ( +/obj/machinery/computer/communications{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aLF" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aLG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aLH" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"aLI" = ( +/obj/structure/table/wood, +/obj/item/storage/box/PDAs, +/obj/item/storage/box/ids{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aLJ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aLK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/bridge) +"aLL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/brig) +"aLM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"aLN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"aLO" = ( +/obj/item/toy/talking/owl, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aLP" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aLQ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/bridge) +"aLR" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/storage/box/bodybags{ + pixel_y = 4 + }, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aLS" = ( +/obj/structure/disposaloutlet{ + dir = 8; + name = "Corpse Outlet" + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aLT" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aLU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/vending/assist, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aLV" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/camera{ + c_tag = "Central Maintenance - Aft"; + network = list("ss13","rd") + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aLW" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aLX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/main) +"aLY" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/main) +"aLZ" = ( +/mob/living/simple_animal/chicken{ + desc = "At least it isn't a court kangaroo."; + name = "amusing cluck"; + real_name = "amusing cluck" + }, +/turf/open/floor/carpet, +/area/security/courtroom) +"aMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aMb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 20 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMd" = ( +/obj/machinery/vending/wardrobe/chap_wardrobe, +/obj/machinery/camera{ + c_tag = "Chapel Office"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aMe" = ( +/obj/machinery/door/window/northleft{ + name = "Game Room" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aMf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/central) +"aMh" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/item/reagent_containers/food/drinks/bottle/champagne, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security RC"; + pixel_y = -32 + }, +/obj/machinery/keycard_auth{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aMi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aMj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aMk" = ( +/obj/structure/closet/crate/coffin, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"aMl" = ( +/obj/effect/landmark/start/bartender, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aMm" = ( +/obj/machinery/computer/med_data, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"aMn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/sign/warning{ + name = "\improper WARNING: MOVING MACHINERY" + }, +/turf/closed/wall, +/area/maintenance/department/chapel) +"aMo" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aMp" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aMq" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aMr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Civilian Wing Hallway - Port" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMs" = ( +/turf/closed/wall, +/area/maintenance/department/chapel) +"aMt" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"aMu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"aMv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8; + icon_state = "chapel" + }, +/area/chapel/main) +"aMw" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aMx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aMy" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aMz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/storage{ + name = "Canister Storage" + }) +"aMA" = ( +/turf/closed/wall, +/area/janitor) +"aMB" = ( +/turf/closed/wall/r_wall, +/area/janitor) +"aMC" = ( +/obj/structure/table/wood, +/obj/item/kitchen/fork, +/obj/item/reagent_containers/food/snacks/salad/herbsalad, +/obj/item/candle{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aMD" = ( +/turf/closed/wall/rust, +/area/maintenance/disposal) +"aME" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMF" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aMG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Central Starboard Maintenance"; + dir = 8; + pixel_y = -22 + }, +/mob/living/simple_animal/hostile/retaliate/bat, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aMH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aMI" = ( +/turf/closed/wall/r_wall, +/area/maintenance/disposal) +"aMJ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aMK" = ( +/obj/vehicle/ridden/wheelchair, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aML" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/chapel/office) +"aMM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/sign/poster/official/help_others{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMN" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aMO" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMP" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/bottle/wine, +/turf/open/floor/plasteel, +/area/security/brig) +"aMQ" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aMR" = ( +/obj/effect/landmark/start/chaplain, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet, +/area/chapel/main) +"aMS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aMT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMU" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet, +/area/chapel/main) +"aMV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aMW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aMX" = ( +/obj/structure/chair/comfy/brown{ + buildstackamount = 0; + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aMY" = ( +/obj/structure/closet, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aMZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aNa" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aNb" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aNc" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/mop, +/obj/item/storage/box/mousetraps, +/obj/item/storage/box/mousetraps, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel, +/area/janitor) +"aNd" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/paper_bin, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aNe" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/food/snacks/spaghetti, +/obj/item/reagent_containers/food/snacks/spaghetti, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aNf" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/clipboard, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aNg" = ( +/obj/machinery/computer/cargo/request{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aNh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aNi" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aNj" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aNk" = ( +/obj/structure/table/glass, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/pen{ + pixel_y = 8 + }, +/obj/item/pen, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aNl" = ( +/obj/structure/table/wood, +/obj/item/trash/plate, +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/condiment/pack/mustard{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/candle{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aNm" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aNn" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aNo" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AIShutter"; + name = "AI Core Shutters" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"aNp" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aNq" = ( +/obj/machinery/door/window/northright{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aNr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aNs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aNt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aNu" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/bar) +"aNv" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aNw" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"aNx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea, +/turf/open/floor/plating, +/area/engine/storage{ + name = "Canister Storage" + }) +"aNy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aNz" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aNA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/security/main) +"aNB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Bow Primary Hallway" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aNC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/camera/motion{ + c_tag = "Telecomms Control Room"; + network = list("tcomms"); + pixel_x = 22 + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "area/tcommsat/computer"; + dir = 1; + name = "Telecomms Server APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aND" = ( +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aNE" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aNF" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aNG" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/table, +/obj/item/taperecorder, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aNH" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Exterior Engineering Access"; + req_access_txt = "11;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aNI" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aNJ" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aNK" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aNL" = ( +/turf/open/floor/plasteel, +/area/security/courtroom) +"aNM" = ( +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aNN" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aNO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aNP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aNQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/storage{ + name = "Canister Storage" + }) +"aNR" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hop) +"aNS" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aNT" = ( +/turf/closed/wall/r_wall, +/area/teleporter) +"aNU" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aNV" = ( +/obj/structure/table, +/obj/item/locator, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aNW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"aNX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/instrument/guitar, +/obj/machinery/camera{ + c_tag = "Bar - Port"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aNY" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=sec2"; + location = "bar" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aNZ" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aOa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "E.V.A. Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aOb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "E.V.A. Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aOc" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aOd" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aOe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"aOf" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOg" = ( +/obj/structure/chair/comfy/teal{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOh" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aOi" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aOj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOl" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOm" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/table/wood, +/obj/item/toy/windupToolbox, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aOo" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/port/fore"; + dir = 4; + name = "Port Bow Primary Hallway APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aOp" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 31 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aOq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/effect/turf_decal/delivery, +/obj/item/extinguisher, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21"; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/bridge) +"aOs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/bridge) +"aOt" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"aOu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"aOv" = ( +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/machinery/camera{ + c_tag = "Courtroom"; + network = list("ss13","rd") + }, +/turf/open/floor/carpet, +/area/security/courtroom) +"aOw" = ( +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aOx" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 4 + }, +/obj/item/radio, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOy" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOz" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Port Bow Hall"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aOA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/chapel) +"aOB" = ( +/turf/closed/wall/r_wall, +/area/security/courtroom) +"aOC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aOD" = ( +/obj/machinery/door/airlock{ + name = "Catering"; + req_one_access_txt = "25;28" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"aOE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aOF" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"aOG" = ( +/obj/structure/chair/comfy/teal{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aOH" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"aOI" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/obj/machinery/flasher{ + id = "ID"; + pixel_x = 8; + pixel_y = 24 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aOJ" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"aOK" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"aOL" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/security/brig) +"aOM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aON" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aOO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aOP" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/gravity_generator) +"aOQ" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to generator" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/window/reinforced/spawner/east, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOS" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aOT" = ( +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) +"aOU" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"aOV" = ( +/turf/open/floor/plasteel/stairs, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOW" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/bot, +/obj/item/clothing/accessory/armband/hydro, +/obj/item/encryptionkey/headset_service, +/obj/item/clothing/under/misc/vice_officer, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aOX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Pool" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/white/side, +/area/crew_quarters/fitness/cogpool) +"aOY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aOZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/bridge) +"aPa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Pool" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side, +/area/crew_quarters/fitness/cogpool) +"aPb" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aPc" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPe" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aPf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"aPg" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aPh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPi" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aPj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPk" = ( +/obj/effect/landmark/start/depsec/science, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPm" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/medical, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPo" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aPp" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aPq" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aPr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/hallway/primary/central) +"aPs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aPt" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"aPu" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/bridge) +"aPv" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Equipment Room"; + req_access_txt = "1" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPw" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Central Hall - Courtroom Access"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/hallway/primary/central) +"aPx" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPy" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPz" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aPA" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPB" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/paper/guides/jobs/security/courtroom, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/security/courtroom) +"aPC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPD" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Equipment Room"; + req_access_txt = "1" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPE" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/toy/talking/AI{ + name = "Nanotrasen-brand toy AI"; + pixel_y = 6 + }, +/obj/item/clothing/glasses/meson, +/obj/machinery/status_display{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"aPF" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/locker) +"aPG" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 21 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPH" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/security/courtroom) +"aPI" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aPJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=bar"; + location = "serv" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aPL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPM" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aPN" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"aPO" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aPQ" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aPR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aPS" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aPT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aPU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"aPV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"aPW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"aPX" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/storage/fancy/donut_box, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPY" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aPZ" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"aQb" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aQc" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aQd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aQe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aQf" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aQi" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"aQk" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aQl" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aQm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aQn" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"aQo" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/security/courtroom) +"aQp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aQq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"aQr" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"aQs" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aQt" = ( +/obj/machinery/pool/controller, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQu" = ( +/obj/structure/table, +/obj/item/toy/beach_ball{ + pixel_y = 12 + }, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQv" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"aQw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aQx" = ( +/obj/machinery/camera{ + c_tag = "Engine Room - Port Bow" + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aQy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/chapel/main) +"aQz" = ( +/obj/structure/chair/comfy/teal, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQA" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQB" = ( +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aQD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aQE" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aQF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aQG" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aQH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aQI" = ( +/obj/structure/chair/comfy/teal, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aQK" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aQL" = ( +/turf/closed/wall, +/area/maintenance/port/central) +"aQM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aQN" = ( +/obj/structure/chair/comfy/brown, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aQO" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aQP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-02" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQQ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQS" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"aQT" = ( +/obj/machinery/door/airlock/engineering{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aQU" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aQV" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aQW" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"aQX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aQY" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted, +/obj/structure/table, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aQZ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Service Hallway"; + req_one_access_txt = "25;26;28;35" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"aRa" = ( +/obj/structure/table/wood, +/obj/item/lighter, +/obj/item/multitool{ + pixel_x = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aRb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/primary/central) +"aRc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) +"aRd" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRe" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase, +/obj/item/assembly/flash, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aRf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRh" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aRi" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRj" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/machinery/sleep_console{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aRk" = ( +/obj/structure/disposalpipe/junction/yjunction, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRl" = ( +/obj/structure/table/wood, +/obj/item/restraints/handcuffs, +/obj/item/laser_pointer/blue, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aRm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aRn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRo" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"aRp" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aRq" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aRr" = ( +/mob/living/simple_animal/chicken{ + name = "Kentucky"; + real_name = "Kentucky" + }, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aRs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRt" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aRv" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aRw" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"aRx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aRy" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"aRz" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aRA" = ( +/obj/structure/table/optable, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aRB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aRC" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aRD" = ( +/turf/closed/wall/r_wall/rust, +/area/engine/gravity_generator) +"aRE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aRF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"aRG" = ( +/obj/machinery/power/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aRH" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/blobstart, +/obj/machinery/camera{ + c_tag = "Central Port Maintenance - Starboard"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aRI" = ( +/obj/structure/rack, +/obj/item/extinguisher, +/obj/item/crowbar, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aRJ" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aRK" = ( +/obj/structure/sign/departments/holy{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRL" = ( +/mob/living/simple_animal/crab/kreb, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aRM" = ( +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"aRN" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRO" = ( +/obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aRP" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aRR" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aRS" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aRT" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aRU" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/main) +"aRV" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aRW" = ( +/turf/open/floor/plating, +/area/maintenance/port/central) +"aRX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aRY" = ( +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"aRZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aSb" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aSc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aSd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aSe" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/chapel/main) +"aSf" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aSg" = ( +/obj/machinery/power/apc{ + name = "Security Maintainance APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aSh" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aSi" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aSj" = ( +/obj/structure/target_stake, +/obj/item/target/syndicate, +/turf/open/floor/plasteel, +/area/science/circuit) +"aSk" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aSl" = ( +/obj/machinery/computer/teleporter{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aSm" = ( +/obj/machinery/teleport/station, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aSn" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aSo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aSp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aSq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSr" = ( +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aSs" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera{ + c_tag = "Bridge Access"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/bridge) +"aSt" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/eva) +"aSu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSv" = ( +/turf/closed/wall, +/area/space/nearstation) +"aSw" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aSy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aSA" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aSB" = ( +/obj/machinery/door/airlock/command{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aSC" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aSD" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aSE" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aSF" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 16 + }, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/surgicaldrill, +/obj/item/cautery, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aSG" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aSH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"aSI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aSJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/main) +"aSK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aSL" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aSM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aSN" = ( +/obj/structure/table, +/obj/machinery/computer/secure_data/laptop{ + dir = 8; + pixel_x = -2; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet/red, +/area/security/brig) +"aSO" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aSP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aSQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aSR" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/tools) +"aSS" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "Chapel" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aST" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"aSU" = ( +/obj/structure/reagent_dispensers/beerkeg, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + name = "Bar RC"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"aSV" = ( +/obj/item/toy/talking/AI, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/hallway/primary/central) +"aSW" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aSX" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aSY" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aSZ" = ( +/obj/structure/chair/stool, +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aTa" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison) +"aTb" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Central Hall - Starboard"; + pixel_x = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aTc" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"aTd" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES" + }, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"aTe" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aTf" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aTg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/brig) +"aTh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/power/apc{ + name = "AI Upload Foyer APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"aTi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aTj" = ( +/obj/machinery/pool/filter{ + pixel_y = 16 + }, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) +"aTk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aTl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aTm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aTn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/department/eva"; + dir = 8; + name = "EVA Maintenance APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aTo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"aTp" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aTq" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aTr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"aTs" = ( +/turf/closed/wall, +/area/maintenance/department/eva) +"aTt" = ( +/obj/structure/closet/secure_closet/detective, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aTu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aTv" = ( +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) +"aTw" = ( +/obj/structure/pool/ladder{ + dir = 2; + pixel_y = 24 + }, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) +"aTx" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aTy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aTz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aTA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aTB" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel{ + icon_state = "chapel" + }, +/area/chapel/main) +"aTC" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aTD" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aTE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"aTF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aTG" = ( +/turf/closed/wall, +/area/router/public) +"aTH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"aTI" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Router" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/router/public) +"aTJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aTK" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Public Router" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/router/public) +"aTL" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Cryogenics"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aTM" = ( +/turf/closed/wall/r_wall, +/area/router/public) +"aTN" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aTO" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aTP" = ( +/obj/machinery/status_display/ai, +/turf/closed/wall/r_wall, +/area/security/courtroom) +"aTQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Thermo-Electric Generator" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aTR" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/stamp, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aTS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aTT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aTU" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aTV" = ( +/turf/closed/wall, +/area/gateway) +"aTW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aTX" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"aTY" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aTZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to space" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aUa" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aUb" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aUc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aUd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aUe" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aUf" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"aUg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aUh" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aUi" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/gateway) +"aUj" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/destTagger, +/obj/machinery/requests_console{ + department = "Public Router"; + name = "Public Router RC"; + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aUk" = ( +/turf/closed/wall/r_wall, +/area/gateway) +"aUl" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/router/public) +"aUm" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aUn" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/computer/cargo/request, +/turf/open/floor/plasteel, +/area/router/public) +"aUo" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/gateway) +"aUp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate/science, +/turf/open/floor/plasteel, +/area/gateway) +"aUq" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/lounge/jazz) +"aUr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aUs" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aUt" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"aUu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/rack, +/turf/open/floor/plasteel, +/area/gateway) +"aUv" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aUw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Jazz Lounge" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"aUx" = ( +/obj/machinery/door/window/northright{ + name = "Game Room" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"aUy" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/do_not_question{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aUz" = ( +/obj/machinery/computer/telecomms/server{ + dir = 4; + network = "tcommsat" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/bridge) +"aUA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aUB" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"aUC" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aUD" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aUE" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aUF" = ( +/obj/machinery/computer/bounty{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"aUG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aUH" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aUI" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aUJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aUK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aUL" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aUM" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/junction, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aUN" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aUO" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/teleporter"; + dir = 4; + name = "Teleporter Room APC"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aUP" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aUQ" = ( +/obj/structure/table, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aUR" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 8; + icon_state = "intact" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aUS" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"aUT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aUU" = ( +/obj/machinery/pool/drain, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) +"aUV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aUW" = ( +/obj/structure/pool/Lboard, +/turf/open/pool, +/area/crew_quarters/fitness/cogpool) +"aUX" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aUY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aUZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"aVa" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aVb" = ( +/obj/structure/pool/Rboard, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aVc" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aVd" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aVe" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aVf" = ( +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aVg" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aVh" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/gateway) +"aVi" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/router/public) +"aVj" = ( +/obj/machinery/vending/cola/random, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aVk" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/gateway) +"aVl" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aVm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aVn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aVo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/router/public) +"aVp" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/obj/machinery/camera{ + c_tag = "Public Router"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/button/massdriver{ + id = "public_out"; + pixel_x = 24; + pixel_y = -6 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "pubblock"; + name = "Router Access Control"; + pixel_x = 24; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aVq" = ( +/obj/structure/table, +/turf/open/floor/plasteel/white, +/area/gateway) +"aVr" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/storage/box/cups, +/obj/structure/sign/poster/official/here_for_your_safety{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aVs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/lounge/jazz) +"aVt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aVu" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aVv" = ( +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aVw" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"aVx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"aVy" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aVz" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aVA" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aVB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"aVC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/central) +"aVD" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"aVE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Dormitory Toilets" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"aVF" = ( +/turf/open/floor/plasteel/white, +/area/science/circuit) +"aVG" = ( +/obj/machinery/ore_silo, +/obj/effect/turf_decal/bot_white, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/nuke_storage"; + dir = 4; + name = "Vault APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aVH" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/civilian"; + dir = 8; + name = "Civilian Wing Hallway APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aVI" = ( +/obj/structure/table, +/obj/item/storage/box/zipties, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aVJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aVK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/space/nearstation) +"aVL" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aVM" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/eva) +"aVN" = ( +/obj/machinery/vending, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aVO" = ( +/obj/structure/table, +/obj/item/tape, +/obj/item/taperecorder{ + pixel_x = -4 + }, +/obj/item/radio/off, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"aVP" = ( +/obj/structure/window/reinforced, +/obj/structure/displaycase/captain, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"aVQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aVR" = ( +/obj/structure/window/reinforced, +/obj/structure/filingcabinet, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"aVS" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aVT" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: WASTE EJECTION"; + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aVU" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aVV" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/structure/cable{ + icon_state = "2-8" + }, +/mob/living/simple_animal/bot/secbot/beepsky{ + desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey, and with a sturdier reinforced chassis, too. "; + health = 45; + maxHealth = 45; + name = "Officer Beepsky" + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aVW" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/gateway) +"aVX" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aVY" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"aVZ" = ( +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aWa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aWb" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aWc" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aWd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aWe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aWf" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aWg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"aWh" = ( +/obj/effect/landmark/start/lawyer, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"aWi" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/disposal"; + dir = 8; + name = "Cryogenics APC"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"aWj" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"aWk" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aWl" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aWm" = ( +/turf/open/floor/plasteel, +/area/gateway) +"aWn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aWo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/cryopod) +"aWp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/gateway) +"aWq" = ( +/obj/structure/rack, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/extinguisher, +/obj/item/crowbar, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aWr" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/turf/open/floor/engine, +/area/gateway) +"aWs" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aWt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"aWu" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness/cogpool"; + dir = 4; + name = "Pool APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"aWv" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aWw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aWx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"aWy" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aWz" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Power Monitoring"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"aWA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"aWB" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"aWC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Defendent's Chair"; + req_one_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aWD" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/item/cigbutt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aWE" = ( +/obj/structure/sign/warning{ + name = "\improper WARNING: MOVING MACHINERY" + }, +/turf/closed/wall/r_wall, +/area/janitor) +"aWF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/janitor) +"aWG" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/clothing/shoes/magboots, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aWH" = ( +/obj/machinery/disposal/bin{ + name = "Corpse Delivery" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aWI" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aWJ" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"aWK" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aWL" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "public" + }, +/turf/open/floor/plating, +/area/router/public) +"aWM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aWN" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/conveyor/auto{ + id = "public" + }, +/turf/open/floor/plating, +/area/router/public) +"aWO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/ai_monitored/storage/eva) +"aWP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aWQ" = ( +/obj/structure/closet/crate/rcd, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aWR" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aWS" = ( +/obj/structure/table, +/obj/item/storage/box/flashes{ + pixel_x = 8 + }, +/obj/item/storage/box/handcuffs{ + pixel_x = -8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/carpet/red, +/area/security/brig) +"aWT" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/router/public"; + dir = 4; + name = "Public Router APC"; + pixel_x = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aWU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"aWV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"aWW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aWX" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical"; + dir = 8; + name = "Medical Booth APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aWY" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + frequency = 1359; + name = "Station Intercom (Security)"; + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aWZ" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/nuke_storage) +"aXa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aXb" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"aXc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aXd" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/central) +"aXe" = ( +/obj/machinery/bookbinder, +/turf/open/floor/wood, +/area/library) +"aXf" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/turf/open/floor/carpet, +/area/library) +"aXg" = ( +/obj/structure/bookcase/random/reference, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"aXh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"aXi" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aXj" = ( +/obj/structure/transit_tube/station/reverse, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Transit Tube Access"; + pixel_x = 22 + }, +/obj/structure/transit_tube_pod{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aXk" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aXl" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aXm" = ( +/obj/machinery/gateway, +/turf/open/floor/engine, +/area/gateway) +"aXn" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aXo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aXp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/reagent_dispensers/foamtank, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"aXq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aXr" = ( +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aXs" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/turf/open/floor/engine, +/area/gateway) +"aXt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/securearea, +/turf/open/floor/plating, +/area/gateway) +"aXu" = ( +/turf/closed/wall, +/area/security/courtroom/jury) +"aXv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aXw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aXx" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"aXy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"aXz" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aXA" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/security/courtroom/jury) +"aXB" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aXC" = ( +/obj/machinery/computer/bank_machine, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aXD" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/structure/closet/crate/silvercrate, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aXE" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/crate/goldcrate, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aXF" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "gas to hot loop" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"aXG" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"aXH" = ( +/obj/structure/sign/warning/securearea, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"aXI" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aXJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aXK" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aXL" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/paper/fluff/jobs/security/beepsky_mom, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aXM" = ( +/turf/closed/wall, +/area/maintenance/department/security) +"aXN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"aXO" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"aXP" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Pool Maintenance"; + req_one_access_txt = "12" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"aXQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/medical{ + name = "Medical Booth" + }) +"aXR" = ( +/turf/closed/wall, +/area/security/courtroom) +"aXS" = ( +/obj/structure/chair/comfy/brown{ + buildstackamount = 0; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aXT" = ( +/obj/structure/chair/comfy/brown{ + buildstackamount = 0; + dir = 1 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"aXU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aXV" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/assembly/timer{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/stack/cable_coil/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/multitool, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aXW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"aXX" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aXY" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aXZ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aYa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"aYb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aYc" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/library) +"aYd" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aYe" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aYf" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/turf/open/floor/plasteel/white, +/area/gateway) +"aYg" = ( +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aYh" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/radio/off, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"aYi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aYj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aYk" = ( +/turf/open/floor/circuit/green, +/area/ai_monitored/nuke_storage) +"aYl" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aYm" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aYn" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/box/smart_metal_foam, +/obj/item/wrench, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/assembly/prox_sensor, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aYo" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Security" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aYp" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) +"aYq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aYr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aYs" = ( +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aYt" = ( +/turf/open/floor/plating, +/area/maintenance/department/security) +"aYu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aYv" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/analyzer, +/obj/item/storage/toolbox/electrical, +/obj/item/gps, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aYw" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aYx" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aYy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-22" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/side, +/area/bridge) +"aYz" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/camera{ + c_tag = "Vault"; + dir = 4; + network = list("vault") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aYA" = ( +/obj/machinery/nuclearbomb/selfdestruct, +/obj/effect/turf_decal/box/white, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aYB" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aYC" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + dir = 1; + name = "Detective's Office APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"aYD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aYE" = ( +/obj/structure/closet/crate/trashcart, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/junction, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aYF" = ( +/obj/structure/table/wood, +/obj/item/storage/box/evidence, +/obj/item/hand_labeler, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aYH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aYI" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/photocopier, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/obj/item/paper/fluff/cogstation/secsolars, +/turf/open/floor/plasteel, +/area/security/main) +"aYJ" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aYK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Civilian Wing Hallway" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"aYL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"aYM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aYN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aYO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"aYP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aYQ" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aYR" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"aYS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/security/brig) +"aYT" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/customs) +"aYU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aYV" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"aYW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/northright{ + name = "Customs Desk"; + req_access_txt = "57" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPFore"; + name = "HoP Fore Desk Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"aYX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/flashlight/lamp, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPFore"; + name = "HoP Fore Desk Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"aYY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Port Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/security/courtroom) +"aYZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"aZa" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aZb" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/eva) +"aZc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aZd" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "E.V.A. Maintenance"; + req_access_txt = "18" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/storage/eva) +"aZe" = ( +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"aZf" = ( +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aZg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"aZh" = ( +/obj/structure/closet/crate, +/obj/machinery/light, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/window/reinforced/spawner/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aZi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aZj" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/caution{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/caution{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/caution{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/caution{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/extinguisher{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/extinguisher{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aZk" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/mass_driver{ + id = "public_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/public) +"aZl" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/public) +"aZm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"aZn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera/motion{ + c_tag = "EVA"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aZo" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"aZp" = ( +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"aZq" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aZr" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aZs" = ( +/obj/structure/safe, +/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/lazarus_injector, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/effect/turf_decal/bot_white/left, +/obj/item/stack/sheet/mineral/diamond, +/obj/item/clothing/under/costume/soviet, +/obj/item/clothing/suit/armor/vest/russian_coat, +/obj/item/clothing/head/helmet/rus_helmet, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aZt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"aZu" = ( +/obj/machinery/blackbox_recorder, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"aZv" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"aZw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/weldingtool, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aZx" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"aZy" = ( +/turf/closed/wall, +/area/lawoffice) +"aZz" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"aZA" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"aZB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"aZC" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"aZD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Chapel Maintenance APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"aZE" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/primary/central"; + dir = 8; + name = "Central Primary Hallway APC"; + pixel_x = -26 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"aZF" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aZG" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aZH" = ( +/obj/structure/disposalpipe/junction, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aZI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"aZJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"aZK" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/storage/toolbox/electrical, +/obj/item/weldingtool, +/obj/item/multitool{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"aZL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"aZM" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet, +/area/security/courtroom) +"aZN" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"aZO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"aZP" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/aiModule/reset/purge{ + pixel_y = 6 + }, +/obj/item/aiModule/reset{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/aiModule/core/full/custom{ + pixel_x = -4 + }, +/obj/machinery/status_display{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"aZQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/plasteel{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"aZR" = ( +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"aZS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"aZT" = ( +/obj/structure/closet/secure_closet/hos, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/storage/box/deputy, +/obj/item/paper/guides/cogstation/letter_hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"aZU" = ( +/obj/structure/chair, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"aZV" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"aZW" = ( +/obj/structure/chair, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"aZX" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"aZY" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"aZZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"baa" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bab" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"bac" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/stack/rods/fifty, +/obj/item/stack/rods/fifty, +/obj/item/storage/toolbox/emergency, +/obj/item/stack/sheet/rglass, +/obj/item/stack/sheet/rglass, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"bad" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bae" = ( +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"baf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Central Plaza - Starboard"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bag" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/storage/belt/utility, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"bah" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/lawoffice) +"bai" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"baj" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker/waterbottle, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bak" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/lawoffice) +"bal" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"bam" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/turf/open/space/basic, +/area/space/nearstation) +"ban" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bao" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bap" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"baq" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bar" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"bas" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"bat" = ( +/obj/structure/chair/stool/bar, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/bar) +"bav" = ( +/obj/structure/chair/sofa/right, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/item/clipboard, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"baw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/lawoffice) +"bax" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"bay" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"baz" = ( +/obj/machinery/photocopier, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baA" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/item/folder/blue, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baB" = ( +/obj/structure/rack, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/extinguisher, +/obj/item/crowbar, +/turf/open/floor/plating, +/area/maintenance/department/security) +"baC" = ( +/obj/machinery/vending/cart, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baD" = ( +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baE" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/library) +"baF" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/landmark/start/head_of_personnel, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baG" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"baH" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/crowbar, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/security) +"baI" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"baJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"baK" = ( +/obj/structure/table/reinforced, +/obj/machinery/light, +/obj/item/kitchen/fork, +/obj/item/reagent_containers/food/snacks/pastatomato, +/obj/machinery/newscaster/security_unit{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"baL" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"baM" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/crowbar/large, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/security) +"baN" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"baO" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"baP" = ( +/obj/structure/closet/secure_closet/captains, +/obj/item/reagent_containers/food/drinks/flask/gold, +/obj/item/clothing/under/rank/captain/suit, +/obj/item/clothing/under/rank/captain/suit/skirt, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/item/clothing/head/centhat{ + name = "\improper green captain's hat" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"baQ" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"baR" = ( +/obj/structure/chair/sofa/left, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"baS" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"baT" = ( +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"baU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"baV" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"baW" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/aiModule/core/full/asimov{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/effect/spawner/lootdrop/aimodule_neutral{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/effect/spawner/lootdrop/aimodule_harmless{ + pixel_y = 6 + }, +/obj/item/aiModule/core/freeformcore{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/aiModule/supplied/freeform{ + pixel_x = -2 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"baX" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/displaycase, +/turf/open/floor/wood, +/area/library) +"baY" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"baZ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bba" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"bbb" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"bbc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"bbd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bbe" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bbf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hop) +"bbg" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bbh" = ( +/turf/closed/wall, +/area/hallway/primary/aft) +"bbi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bbj" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/teleporter) +"bbk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Telecomms Admin"; + departmentType = 5; + name = "Telecomms RC"; + pixel_y = 30 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bbl" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bbm" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bbn" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bbo" = ( +/obj/structure/closet/crate, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bbp" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/carpet, +/area/security/courtroom) +"bbq" = ( +/obj/effect/landmark/start/librarian, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"bbr" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bbs" = ( +/obj/structure/table/wood, +/obj/item/camera, +/obj/item/pen/red, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bbt" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bbu" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plating, +/area/space/nearstation) +"bbv" = ( +/turf/open/space, +/area/space) +"bbw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bbx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bby" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bbz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bbA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bbB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bbC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bbD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bbE" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bbF" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bbG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bbH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bbI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bbJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bbK" = ( +/obj/machinery/light, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bbL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bbM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bbN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bbO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bbP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "HoP Office Maintenance"; + req_access_txt = "57" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/customs) +"bbQ" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"bbR" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/reagent_containers/food/snacks/grown/wheat, +/obj/item/reagent_containers/food/snacks/grown/corn, +/obj/item/reagent_containers/food/snacks/grown/cocoapod, +/obj/item/reagent_containers/food/snacks/grown/chili, +/obj/item/reagent_containers/food/snacks/grown/soybeans, +/obj/item/reagent_containers/food/snacks/grown/tomato, +/obj/item/reagent_containers/food/snacks/grown/cherries, +/obj/structure/sign/poster/contraband/have_a_puff{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bbS" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/gateway) +"bbT" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/sorting) +"bbU" = ( +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bbV" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/warehouse) +"bbW" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/noticeboard{ + dir = 4; + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bbX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bbY" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bbZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bca" = ( +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"bcb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bcc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"bcd" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bce" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "public" + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "cargoblock"; + name = "Public Router" + }, +/turf/open/floor/plating, +/area/router/public) +"bcf" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bcg" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "cargoblock"; + name = "Public Router" + }, +/turf/open/floor/plating, +/area/router/public) +"bch" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bci" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bcj" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bck" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bcl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bcm" = ( +/obj/machinery/computer/cargo/request, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bcn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bco" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bcp" = ( +/obj/machinery/libraryscanner, +/obj/machinery/light, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"bcq" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bcr" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bcs" = ( +/obj/machinery/pdapainter, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bct" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bcu" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Air Hookup" + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bcv" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bcw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/mixing) +"bcx" = ( +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/head_of_personnel, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bcy" = ( +/turf/closed/wall/r_wall, +/area/science/mixing) +"bcz" = ( +/obj/machinery/computer/card{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bcA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bcB" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/gateway) +"bcC" = ( +/obj/machinery/power/apc{ + name = "Research Division Storage APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/gateway) +"bcD" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bcE" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bcF" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bcG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bcH" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/side, +/area/security/courtroom) +"bcI" = ( +/turf/closed/wall/r_wall, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bcJ" = ( +/obj/machinery/button/door{ + id = "HoPAft"; + name = "Aft Shutters"; + pixel_x = -24; + pixel_y = -24; + req_access_txt = "57" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bcK" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/circuit/green, +/area/crew_quarters/cryopod) +"bcL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bcM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bcN" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=bridge2"; + location = "court" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bcO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"bcP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bcQ" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bcR" = ( +/turf/closed/wall, +/area/hallway/primary/central) +"bcS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bcT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bcU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Jury Room Maintainance"; + req_one_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/courtroom/jury) +"bcV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bcW" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + name = "Bar RC"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bcX" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/hallway/primary/central) +"bcY" = ( +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bcZ" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bda" = ( +/obj/structure/table, +/obj/item/hand_tele, +/obj/machinery/camera{ + c_tag = "Teleporter Room"; + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"bdb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/central) +"bdc" = ( +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"bdd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Pool"; + dir = 1 + }, +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/toy/poolnoodle/red, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bde" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/mixing) +"bdf" = ( +/turf/open/floor/plasteel, +/area/science/mixing) +"bdg" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bdh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/toy/poolnoodle/blue, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bdi" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bdj" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/hallway/primary/central) +"bdk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bdl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/closet/athletic_mixed, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/toy/poolnoodle/yellow, +/turf/open/floor/plasteel/white, +/area/crew_quarters/fitness/cogpool) +"bdm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bdn" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bdo" = ( +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 17 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bdp" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bdq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bdr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/hallway/primary/central) +"bds" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/chaplain, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bdt" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bdu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bdv" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/chapel/office) +"bdx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bdy" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/hallway/primary/central) +"bdz" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bdA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bdB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, +/obj/item/toy/eightball, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bdC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdD" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdE" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 8; + icon_state = "intact" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bdF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bdJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Telecommunications Control Room Maintenance"; + req_access_txt = "61" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/bridge) +"bdK" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bdL" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bdM" = ( +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bdN" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bdO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Pool External Maintenance"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bdP" = ( +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) +"bdQ" = ( +/obj/machinery/door/airlock/command{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bdR" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bdS" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/bridge) +"bdT" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/obj/item/hand_labeler, +/obj/item/hand_labeler, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bdU" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bdV" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bdW" = ( +/obj/structure/mineral_door/woodrustic{ + name = "Sauna" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bdX" = ( +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bdY" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) +"bdZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/quartermaster/sorting) +"bea" = ( +/obj/structure/disposalpipe/junction, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/poster/official/report_crimes{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"beb" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/courtroom/jury) +"bec" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bed" = ( +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/plasteel, +/area/science/mixing) +"bee" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bef" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"beg" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"beh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bei" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"bej" = ( +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bek" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bel" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bem" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "hot loop to generator" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"ben" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"beo" = ( +/turf/open/floor/plasteel/white, +/area/gateway) +"bep" = ( +/obj/structure/table/wood, +/obj/item/tape, +/obj/item/taperecorder{ + pixel_x = -4 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/hor"; + dir = 8; + name = "Research Director's Office APC"; + pixel_x = -24 + }, +/obj/item/reagent_containers/food/snacks/muffin/berry, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"beq" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "generator to cold loop" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"ber" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bes" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"bet" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"beu" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bev" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"bew" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"bex" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bey" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall/rust, +/area/space/nearstation) +"bez" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/office) +"beA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/chapel/main) +"beB" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"beC" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"beD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"beE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/maintenance/disposal) +"beF" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beG" = ( +/obj/structure/lattice, +/obj/machinery/camera{ + c_tag = "Routing Depot - Fore Exterior"; + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"beH" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"beI" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"beJ" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"beL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"beM" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beN" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beO" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"beP" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"beQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/security/detectives_office) +"beR" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"beT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"beU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"beV" = ( +/obj/machinery/button/door{ + id = "executionspaceblast"; + name = "Vent to Space"; + pixel_x = 25; + pixel_y = -5; + req_access_txt = "7" + }, +/obj/machinery/button/ignition{ + id = "executionburn"; + pixel_x = 24; + pixel_y = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"beW" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"beX" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"beY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"beZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bfa" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bfb" = ( +/obj/machinery/computer/card/minor/qm, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/keycard_auth{ + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bfc" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bfd" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bfe" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bff" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/qm) +"bfg" = ( +/obj/structure/closet, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bfh" = ( +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"bfi" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bfj" = ( +/mob/living/simple_animal/butterfly, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"bfk" = ( +/mob/living/simple_animal/kiwi, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"bfl" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bfm" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"bfn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "cold loop to space" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"bfo" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bfp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 + }, +/obj/machinery/sparker/toxmix{ + pixel_x = 25 + }, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"bfq" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 2; + height = 5; + id = "laborcamp_home"; + name = "fore bay 1"; + roundstart_template = /datum/map_template/shuttle/labour/cog; + width = 9 + }, +/turf/open/space/basic, +/area/space) +"bfr" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bfs" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "QM #1" + }, +/mob/living/simple_animal/bot/mulebot{ + beacon_freq = 1400; + home_destination = "QM #1"; + suffix = "#1" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bft" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, +/area/hallway/primary/central) +"bfu" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/gateway) +"bfv" = ( +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bfw" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bfx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"bfy" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bfz" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bfA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bfB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Chapel Morgue"; + req_access_txt = "22;27" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bfC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/qm) +"bfD" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bfE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "mail" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bfF" = ( +/obj/machinery/space_heater, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bfG" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bfH" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/button/crematorium{ + id = "foo"; + pixel_x = 8; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bfI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "/area/engine/storage_shared"; + dir = 1; + name = "Electrical Substation APC"; + pixel_y = 26 + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"bfJ" = ( +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bfK" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_x = -11; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/bottle/holywater, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/item/paper/fluff/cogstation/letter_chap{ + pixel_x = 10; + pixel_y = 2 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"bfL" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"bfM" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bfN" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bfO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Jazz Lounge" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bfP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bfQ" = ( +/obj/machinery/light/small, +/obj/item/candle, +/obj/item/trash/candle, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bfR" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bfS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bfT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/chapel/office) +"bfU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bfV" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"bfW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bfX" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bfY" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "QM #2" + }, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bfZ" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bgb" = ( +/obj/structure/disposalpipe/sorting/mail{ + sortType = 30 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bgc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 8 + }, +/area/hallway/primary/central) +"bgd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/central) +"bge" = ( +/turf/closed/wall/r_wall, +/area/storage/primary) +"bgf" = ( +/turf/closed/wall, +/area/quartermaster/warehouse) +"bgg" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bgh" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bgi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"bgj" = ( +/obj/structure/table, +/obj/item/weldingtool/mini, +/obj/item/light/tube, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bgk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "mail" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bgl" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/turf/open/floor/plasteel, +/area/storage/primary) +"bgm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bgn" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bgo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/chapel/main) +"bgp" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bgq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bgr" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/helmet/skull, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bgs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bgt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bgu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgv" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bgw" = ( +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bgx" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgy" = ( +/obj/structure/closet, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/courtroom/jury"; + dir = 4; + name = "Jury Room APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom/jury) +"bgz" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgA" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/lightreplacer, +/obj/item/lightreplacer, +/obj/item/stack/rods/fifty, +/obj/item/stack/rods/fifty, +/turf/open/floor/plasteel, +/area/storage/primary) +"bgC" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bgD" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/item/target, +/obj/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bgE" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Port Central Maintenance"; + req_one_access_txt = "12" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bgG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/central) +"bgH" = ( +/obj/machinery/pipedispenser, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bgI" = ( +/obj/machinery/pipedispenser/disposal, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bgJ" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bgK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bgL" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bgM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bgN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Port Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bgO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/wrench, +/obj/item/pipe_dispenser, +/mob/living/simple_animal/sloth/paperwork, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bgP" = ( +/obj/item/analyzer, +/obj/item/caution, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bgQ" = ( +/turf/closed/wall, +/area/quartermaster/qm) +"bgR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) +"bgS" = ( +/obj/machinery/computer/bounty, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bgT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bgU" = ( +/obj/machinery/computer/cargo, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bgV" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/storage) +"bgW" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hor) +"bgX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"bgY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bgZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bha" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bhb" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhc" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bhd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhe" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/office) +"bhg" = ( +/obj/structure/chair/stool, +/obj/machinery/camera{ + c_tag = "Pool - Sauna"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness/cogpool) +"bhh" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/security/courtroom) +"bhi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/cone, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bhk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bhl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/mineral/wood, +/area/crew_quarters/fitness/cogpool) +"bhm" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bhn" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bho" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/turf/open/floor/plasteel, +/area/storage/primary) +"bhp" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bhq" = ( +/obj/structure/chair/sofa/right, +/obj/item/instrument/recorder, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bhr" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bhs" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bht" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bhu" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/recharge_station, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bhv" = ( +/obj/structure/chair/sofa/left, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bhw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/cc64k_ad{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhx" = ( +/obj/machinery/vending/coffee, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bhy" = ( +/obj/structure/closet/crate/science, +/obj/item/stack/sheet/metal/ten, +/obj/item/stack/sheet/glass/five, +/obj/item/stack/rods/twentyfive, +/obj/item/target/syndicate, +/obj/item/target/alien, +/obj/item/target, +/obj/item/target/clown, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bhz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bhA" = ( +/obj/item/stack/cable_coil/red, +/obj/item/multitool, +/obj/item/wrench, +/obj/item/stack/sheet/metal/five{ + pixel_x = 6; + pixel_y = -6 + }, +/obj/item/paper/fluff/cogstation/letter_arrd, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bhB" = ( +/obj/structure/table/wood, +/obj/item/stack/packageWrap, +/obj/item/paper/fluff/cogstation/bsrb, +/obj/item/paper/fluff/cogstation/survey{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/carpet/royalblue, +/area/bridge) +"bhC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Air Hookup"; + req_one_access_txt = "12;22" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bhE" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bhF" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bhG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bhI" = ( +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"bhJ" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bhK" = ( +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bhL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Waste Disposal"; + req_one_access_txt = "12;50" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bhM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/item/twohanded/required/kirbyplants/dead, +/turf/open/floor/plasteel, +/area/security/main) +"bhO" = ( +/obj/structure/chair/sofa/right, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bhP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21"; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bhS" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bhT" = ( +/obj/structure/sign/departments/engineering, +/turf/closed/wall, +/area/hallway/primary/aft) +"bhU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/janitor) +"bhV" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/pen/blue{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen/red{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bhW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"bhX" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bhY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bhZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bia" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bib" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bic" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bid" = ( +/obj/structure/chair/sofa/left, +/mob/living/simple_animal/pet/cat/Proc, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bie" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bif" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"big" = ( +/turf/closed/wall, +/area/science/circuit) +"bih" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "mail" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bii" = ( +/obj/structure/table/glass, +/obj/item/storage/box/matches, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bij" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bik" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"bil" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 6; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bim" = ( +/turf/open/space/basic, +/area/space/nearstation) +"bin" = ( +/obj/machinery/computer/mecha{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"bio" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bip" = ( +/obj/effect/landmark/start/quartermaster, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"biq" = ( +/obj/structure/closet/secure_closet/hop, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/item/clothing/under/rank/civilian/head_of_personnel/suit, +/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt{ + name = "head of personnel's suitskirt" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bir" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bis" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bit" = ( +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"biu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"biv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"biw" = ( +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/button/door{ + id = "QMLoadDoor"; + layer = 4; + name = "Cargo Loading Doors"; + pixel_x = 24; + pixel_y = 6 + }, +/obj/machinery/button/door{ + id = "QMUnloadDoor"; + layer = 4; + name = "Cargo Unloading Doors"; + pixel_x = 24; + pixel_y = -6 + }, +/obj/machinery/camera{ + c_tag = "Supply - Cargo Bay"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bix" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"biy" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"biz" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"biA" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"biB" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/rd, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"biC" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"biD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"biE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"biF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"biG" = ( +/obj/structure/displaycase/labcage, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/camera{ + c_tag = "Research Director's Office - Starboard"; + network = list("ss13","rd") + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"biH" = ( +/obj/machinery/light/small, +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"biI" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-20"; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"biJ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"biK" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/science/mixing) +"biL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/closed/wall, +/area/crew_quarters/heads/chief) +"biM" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"biN" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"biO" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"biP" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/gateway) +"biQ" = ( +/turf/closed/wall, +/area/crew_quarters/heads/chief) +"biR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "CEPrivacy"; + name = "CE Privacy Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"biS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"biT" = ( +/obj/machinery/pipedispenser, +/turf/open/floor/plasteel, +/area/science/mixing) +"biV" = ( +/turf/closed/wall, +/area/storage/primary) +"biW" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"biX" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"biY" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"biZ" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/office) +"bja" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bjb" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/wrench, +/obj/item/t_scanner, +/turf/open/floor/plasteel, +/area/storage/primary) +"bjc" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stack/sheet/plasteel/twenty, +/turf/open/floor/plasteel, +/area/storage/primary) +"bjd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bje" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjf" = ( +/obj/machinery/pipedispenser/disposal/transit_tube, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bjg" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "E.V.A. Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bji" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bjl" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/r_wall, +/area/quartermaster/office) +"bjm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bjn" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/supply) +"bjo" = ( +/obj/machinery/rnd/production/techfab/department/cargo, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bjp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bjq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bjr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bjs" = ( +/obj/machinery/computer/robotics{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"bjt" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"bju" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + frequency = 1359; + name = "Station Intercom (Security)"; + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bjv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/security/courtroom/jury) +"bjw" = ( +/obj/item/storage/secure/safe{ + pixel_x = 4; + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bjx" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/item/defibrillator/loaded, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bjy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"bjz" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bjA" = ( +/obj/machinery/camera{ + c_tag = "EVA Maintenace - Fore"; + network = list("ss13","rd") + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bjB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/brig) +"bjC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Jury Room" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/courtroom/jury) +"bjD" = ( +/turf/closed/wall/r_wall, +/area/security/courtroom/jury) +"bjE" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet{ + pixel_y = 29 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics - Control Room" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/paper/guides/cogstation/letter_atmos, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/atmos) +"bjF" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft"; + dir = 8; + name = "Head of Personnel APC"; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bjG" = ( +/obj/structure/rack, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bjI" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bjJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bjK" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plasteel, +/area/storage/primary) +"bjL" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/flashlight, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/camera{ + c_tag = "Pool Maintenance"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bjM" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Atmospherics Storage"; + req_one_access_txt = "24;31" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bjN" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bjO" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/item/instrument/piano_synth, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bjP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bjQ" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant/override, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bjR" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjS" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bjT" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"bjU" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjV" = ( +/obj/structure/closet{ + name = "Evidence Closet 5" + }, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bjW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bjX" = ( +/obj/structure/rack, +/obj/machinery/button/door{ + id = "marketdoor"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bjY" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bjZ" = ( +/obj/structure/window/reinforced, +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 12 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westright{ + name = "Emergency Shower" + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/storage/primary) +"bka" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bkb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 9; + id = "mail" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bkc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/conveyor_switch/oneway{ + id = "DeliveryConveyer" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bkd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "mail" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bke" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=sec1"; + location = "bridge2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bkf" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bkg" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 2 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"bkh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bki" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bkj" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor_switch/oneway{ + id = "mail" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bkk" = ( +/obj/machinery/autolathe, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bkl" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/flashlight, +/obj/item/storage/belt/utility, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bkm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Supply - Delivery Office Fore"; + network = list("ss13","rd") + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bkn" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bko" = ( +/turf/open/floor/plasteel, +/area/science/circuit) +"bkp" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bkq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/conveyor/inverted{ + dir = 9; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bkr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoadDoor"; + name = "Cargo Loading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bks" = ( +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bkt" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoadDoor"; + name = "Cargo Loading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bku" = ( +/obj/structure/closet, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bkv" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bkw" = ( +/obj/structure/bookcase/random/fiction, +/obj/effect/spawner/lootdrop/gambling, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bkx" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bky" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/research_director, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"bkz" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bkA" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Bridge - Starboard Quarter"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bkB" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bkC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"bkD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "CEPrivacy"; + name = "CE Privacy Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"bkE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bkF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/security) +"bkG" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/crate/engineering, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/item/twohanded/rcl/pre_loaded, +/obj/item/stock_parts/cell/high/plus, +/obj/item/clothing/glasses/meson, +/obj/item/cartridge/atmos, +/obj/item/cartridge/engineering, +/obj/item/cartridge/engineering, +/obj/item/cartridge/engineering, +/obj/machinery/camera{ + c_tag = "Chief Engineer's Office"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"bkH" = ( +/obj/machinery/computer/atmos_control{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/engine/atmos) +"bkI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/primary) +"bkJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"bkK" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/departments/security{ + pixel_x = -32 + }, +/obj/item/cigbutt, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bkL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bkM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bkN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bkO" = ( +/obj/machinery/vending/kink, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bkP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bkQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bkR" = ( +/obj/machinery/camera{ + c_tag = "EVA Maintenance - Aft"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bkS" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bkT" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"bkU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bkV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bkW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Pool Exterior Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bkX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bkY" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/closet/crate/engineering, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bkZ" = ( +/turf/open/floor/engine/n2, +/area/engine/atmos) +"bla" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blc" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bld" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ble" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/external{ + name = "Cargo Freighter Dock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"blf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel's Office"; + req_access_txt = "57" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"blg" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"blh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Cargo Freighter Dock"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bli" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blj" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/r_wall, +/area/space/nearstation) +"blk" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bll" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bln" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blp" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit) +"blq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/storage/primary) +"blr" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bls" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/sign/poster/official/ion_rifle{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"blt" = ( +/obj/machinery/computer/card/minor/ce{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"blu" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"blv" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"blw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"blx" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 16 + }, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/surgicaldrill, +/obj/item/cautery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bly" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"blz" = ( +/obj/machinery/computer/atmos_control{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/engine/atmos) +"blA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"blB" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"blE" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blF" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blG" = ( +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/mixing) +"blH" = ( +/obj/structure/chair, +/obj/machinery/button/massdriver{ + id = "toxinsdriver"; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"blI" = ( +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/mixing) +"blJ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blK" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "marketdoor" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blL" = ( +/turf/open/floor/engine/o2, +/area/engine/atmos) +"blM" = ( +/turf/open/floor/engine/air, +/area/engine/atmos) +"blN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"blO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"blP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/rust, +/area/maintenance/department/chapel) +"blQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northleft{ + name = "Delivery Office"; + req_one_access_txt = "31;48" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blR" = ( +/obj/machinery/computer/bounty{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blS" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/chair, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"blV" = ( +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"blW" = ( +/obj/structure/table, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/crowbar, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"blX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"blY" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/security/brig) +"blZ" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "QMUnload" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bma" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/landmark/start/assistant/override, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bmb" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"bmc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_one_access_txt = "58" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hos) +"bmd" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/research_director, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"bme" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"bmf" = ( +/obj/structure/sign/departments/evac, +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit) +"bmg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmj" = ( +/obj/machinery/vending/wardrobe/cap_wardrobe, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"bmk" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/dice/d6, +/obj/machinery/camera{ + c_tag = "Jazz Lounge"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bml" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bmm" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bmn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmo" = ( +/turf/closed/wall/rust, +/area/maintenance/department/chapel) +"bmp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bmq" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=court"; + location = "bridge1" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmr" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bms" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/barthpot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bmt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bmu" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bmv" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bmw" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"bmx" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bmy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmz" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/primary) +"bmA" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hallway/secondary/civilian) +"bmB" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bmC" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmD" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/gateway) +"bmF" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/closed/wall, +/area/crew_quarters/fitness/cogpool) +"bmG" = ( +/turf/open/floor/engine, +/area/gateway) +"bmH" = ( +/obj/machinery/computer/upload/borg{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bmI" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/chapel/office"; + dir = 4; + name = "Chapel Office APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bmJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bmK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"bmL" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmM" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bmN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Waste Disposal Maintenance"; + req_one_access_txt = "12;50" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bmO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/lounge/jazz) +"bmP" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/engineering{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bmQ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Foyer - Starboard"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bmR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Teleport Access"; + req_one_access_txt = "17;19" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"bmS" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bmT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"bmU" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/item/instrument/saxophone, +/obj/item/reagent_containers/food/drinks/bottle/vermouth, +/obj/item/clothing/glasses/sunglasses, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bmV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bmW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bmX" = ( +/obj/structure/table, +/obj/item/folder/yellow{ + pixel_y = 4 + }, +/obj/item/pen{ + pixel_y = 4 + }, +/obj/item/clothing/gloves/color/latex{ + pixel_y = 4 + }, +/obj/item/clothing/mask/surgical{ + pixel_y = 4 + }, +/obj/item/healthanalyzer, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/item/paper/guides/cogstation/cdn_chap, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bmY" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/maintenance/disposal) +"bmZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bna" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnb" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bnc" = ( +/obj/structure/sign/directions/command{ + dir = 1; + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_x = -32; + pixel_y = 40 + }, +/obj/structure/sign/directions/science{ + pixel_x = -32; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnd" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album, +/obj/item/storage/box/matches, +/obj/item/storage/fancy/cigarettes/cigpack_robust, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bne" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bnf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bng" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bnh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor{ + id = "DeliveryDoor"; + name = "Delivery Door" + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bni" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/clipboard, +/obj/item/stamp, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/item/pen/blue{ + pixel_x = -5; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bnj" = ( +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'BOMB RANGE"; + name = "BOMB RANGE" + }, +/turf/closed/wall, +/area/science/test_area) +"bnk" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bnl" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/turf/open/floor/engine, +/area/gateway) +"bnm" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bnn" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/door/window/southleft{ + name = "Cargo Desk"; + req_access_txt = "31" + }, +/obj/item/folder, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bno" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bnp" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bnq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bnr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bns" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/maintenance/department/eva) +"bnt" = ( +/obj/machinery/camera{ + c_tag = "Electrical Substation"; + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"bnu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"bnv" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bnx" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bny" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/pen, +/obj/item/wirecutters, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bnz" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnA" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bnC" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Cargo Freighter Dock"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bnD" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar, +/obj/structure/disposalpipe/junction/flip, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bnF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bnG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/bridge) +"bnH" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/fore) +"bnI" = ( +/obj/structure/bed, +/obj/effect/landmark/start/head_of_personnel, +/obj/item/bedsheet/hop, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bnJ" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bnK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"bnL" = ( +/obj/item/beacon, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"bnM" = ( +/obj/effect/turf_decal/delivery, +/obj/item/grown/bananapeel, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bnN" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bnO" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit) +"bnP" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnQ" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bnR" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnS" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"bnT" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"bnU" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/wrench, +/obj/item/flashlight, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bnV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"bnW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"bnX" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/secure_closet/security/cargo, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"bnY" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"bnZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/pen/blue, +/obj/machinery/camera{ + c_tag = "Customs - Fore"; + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPFore"; + name = "HoP Fore Desk Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"boa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/turf/closed/wall, +/area/crew_quarters/heads/chief) +"bob" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/heads/chief) +"boc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/turf/closed/wall, +/area/crew_quarters/heads/chief) +"bod" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southleft{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/item/folder/yellow, +/turf/open/floor/plasteel, +/area/storage/primary) +"boe" = ( +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/nuke_storage) +"bof" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Pool Exterior Access"; + req_access_txt = "13" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) +"bog" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"boh" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"boi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) +"boj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bok" = ( +/obj/structure/table/wood, +/obj/item/paicard, +/obj/item/toy/sword, +/obj/item/toy/figure/assistant, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bol" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"bom" = ( +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"bon" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"boo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/central) +"bop" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/window/eastleft{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"boq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bor" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bos" = ( +/obj/structure/table, +/obj/item/stack/sheet/cardboard/fifty, +/obj/item/stack/wrapping_paper, +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/glass, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bot" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bou" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bov" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bow" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMUnload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"box" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"boy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"boz" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"boA" = ( +/turf/closed/wall, +/area/security/detectives_office) +"boB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMUnload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"boC" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/sign/departments/cargo{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"boD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMUnload" + }, +/obj/machinery/door/poddoor{ + id = "QMUnloadDoor"; + name = "Cargo Unloading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"boE" = ( +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMUnload" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"boF" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMUnload" + }, +/obj/machinery/door/poddoor{ + id = "QMUnloadDoor"; + name = "Cargo Unloading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"boG" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/weldingtool, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/structure/sign/departments/engineering{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"boH" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"boI" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"boJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"boK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"boL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"boM" = ( +/obj/machinery/mineral/ore_redemption{ + input_dir = 4; + output_dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boN" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boO" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 4 + }, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/crew_quarters/bar) +"boP" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boQ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"boR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"boS" = ( +/obj/structure/sign/mining, +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"boT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"boW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boX" = ( +/obj/item/beacon, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"boY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"boZ" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bpa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/window/westleft{ + name = "Treatment Center"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bpb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bpc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bpd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpe" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/window/eastright{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bpf" = ( +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bph" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bpi" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"bpj" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"bpk" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpl" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/autolathe/secure{ + name = "public autolathe" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bpm" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/extinguisher, +/obj/item/crowbar, +/turf/open/floor/plating, +/area/maintenance/aft) +"bpn" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpo" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet/red, +/area/security/brig) +"bpp" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpq" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/engine/air, +/area/engine/atmos) +"bpr" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bps" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/lounge/jazz"; + name = "Jazz Lounge APC"; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bpt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bpu" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpv" = ( +/turf/closed/wall/r_wall, +/area/engine/break_room) +"bpw" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L6" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpy" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/landmark/observer_start, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpz" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bpA" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/aft) +"bpB" = ( +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft) +"bpC" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpD" = ( +/turf/open/floor/plating, +/area/maintenance/aft) +"bpE" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/aft) +"bpF" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpG" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L14" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bpH" = ( +/obj/machinery/jukebox, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bpI" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bpJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/lounge/jazz) +"bpK" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"bpL" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/closed/wall/r_wall, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bpM" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/science/mixing) +"bpN" = ( +/obj/structure/grille, +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bpO" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bpP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bpQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bpR" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/mixing) +"bpS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_y = -32 + }, +/turf/open/floor/carpet/red, +/area/security/brig) +"bpT" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/grass, +/area/hallway/secondary/exit) +"bpU" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bpV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/atmos{ + name = "Aft Air Hookup"; + req_access_txt = "12;24" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bpW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/security/brig) +"bpX" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/sign/poster/official/obey{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"bpY" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bpZ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"bqa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bqb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/civilian) +"bqc" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/medbay/lobby) +"bqd" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqe" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall, +/area/medical/medbay/lobby) +"bqf" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bqg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bqh" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bqi" = ( +/obj/machinery/button/door{ + id = "HoPFore"; + name = "Fore Shutters"; + pixel_x = -24; + pixel_y = 24; + req_access_txt = "57" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bqj" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bql" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/hallway/secondary/civilian) +"bqm" = ( +/turf/closed/wall, +/area/medical/medbay/lobby) +"bqn" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqo" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqp" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"bqq" = ( +/turf/closed/wall, +/area/science/robotics/lab) +"bqr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/science/robotics/lab) +"bqt" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/healthanalyzer, +/obj/item/clothing/neck/stethoscope, +/obj/item/razor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bqu" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Waste Disposal Maintenance"; + req_one_access_txt = "12;50" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bqv" = ( +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bqw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "EngiLockdown"; + name = "Engineering Emergency Lockdown" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/camera{ + c_tag = "Engineering - Entrance"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bqx" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqy" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/camera{ + c_tag = "Supply - Mining Office"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bqz" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqA" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqB" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Library Access" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/library) +"bqC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "E.V.A. Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bqG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bqH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bqI" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/mixing) +"bqJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/obj/machinery/airlock_sensor/incinerator_toxmix{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/engine, +/area/science/mixing) +"bqK" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqL" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"bqM" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/storage/pill_bottle/dice, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"bqN" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqO" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bqP" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bqQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark/corner, +/area/hallway/secondary/entry) +"bqR" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bqS" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bqT" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bqU" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"bqV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bqW" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bqX" = ( +/turf/closed/wall/mineral/titanium/nosmooth, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bqY" = ( +/obj/structure/sign/directions/medical{ + pixel_x = -32; + pixel_y = -24 + }, +/obj/structure/sign/directions/evac{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/structure/sign/directions/supply{ + pixel_x = -32; + pixel_y = -40 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bqZ" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bra" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"brb" = ( +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server{ + name = "Computer Core" + }) +"brc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"brd" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bre" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/central) +"brf" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"brg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"brh" = ( +/obj/structure/sign/departments/custodian{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"bri" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/hallway/secondary/civilian) +"brj" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Central Starboard Maintenance"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/civilian) +"brk" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"brl" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/paper_bin, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/dropper, +/obj/item/stamp/denied{ + pixel_x = -8; + pixel_y = -2 + }, +/obj/item/stamp{ + pixel_x = -8; + pixel_y = 2 + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"brm" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"brn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bro" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"brp" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/machinery/smartfridge/disks, +/turf/open/floor/plasteel, +/area/hydroponics) +"brq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"brr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/warning{ + name = "\improper WARNING: MOVING MACHINERY"; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"brs" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"brt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/chapel/office) +"bru" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"brv" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"brw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/gateway) +"brx" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/storage/tools) +"bry" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"brz" = ( +/obj/machinery/computer/rdconsole/robotics, +/turf/open/floor/circuit, +/area/science/robotics/lab) +"brA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/pda_ad600{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/lounge/jazz) +"brB" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"brC" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/storage/tools) +"brD" = ( +/obj/structure/table, +/obj/machinery/door/window/eastright{ + name = "Auxiliary Tool Storage Desk"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/folder, +/turf/open/floor/plasteel, +/area/storage/tools) +"brE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"brF" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"brG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"brH" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"brI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Central Hall - Aft"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"brJ" = ( +/obj/machinery/vending/assist, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"brK" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/healthanalyzer, +/obj/item/healthanalyzer, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"brL" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"brM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Merchant Plaza" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"brN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"brO" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"brP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"brQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"brR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Construction Area"; + req_access_txt = "31" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"brS" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"brT" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"brU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/lobby) +"brV" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"brW" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Chapel Maintenance"; + req_one_access_txt = "12;22;26;27;50" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"brX" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"brY" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/camera{ + c_tag = "Waste Disposal - Aft" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"brZ" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-02" + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bsa" = ( +/obj/structure/table/glass, +/obj/item/scalpel, +/obj/item/storage/box/cups, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bsb" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/port/central) +"bsc" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/ammonia, +/obj/item/toy/figure/botanist{ + pixel_x = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsd" = ( +/obj/structure/closet/crate/hydroponics, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/clothing/accessory/armband/hydro{ + pixel_y = 4 + }, +/obj/item/clothing/accessory/armband/hydro{ + pixel_y = 4 + }, +/obj/item/clothing/accessory/armband/hydro{ + pixel_y = 4 + }, +/obj/item/clothing/suit/hooded/wintercoat/hydro{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bse" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bsf" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/bed/dogbed/ian, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/sign/poster/official/love_ian{ + pixel_y = 32 + }, +/mob/living/simple_animal/pet/dog/corgi/Ian, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bsg" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsh" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Recycler Exterior Access"; + req_one_access_txt = "13;50" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bsi" = ( +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bsj" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/seed_extractor, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsl" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/ai_monitored/storage/eva) +"bsm" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsn" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bso" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/storage/tools) +"bsp" = ( +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bsq" = ( +/obj/structure/table, +/obj/machinery/door/window/southleft{ + name = "Auxiliary Tool Storage Desk"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/book/manual/wiki/engineering_hacking, +/turf/open/floor/plasteel, +/area/storage/tools) +"bsr" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = -6; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/storage/tools) +"bss" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/hand_labeler{ + pixel_y = 8 + }, +/obj/item/storage/firstaid/regular, +/obj/item/book/manual/wiki/medicine{ + pixel_x = -6 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bst" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bsu" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bsv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/warning/vacuum/external, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bsw" = ( +/turf/open/floor/plasteel/stairs/left, +/area/hydroponics) +"bsx" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Recycler Exterior Access"; + req_one_access_txt = "13;50" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bsy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bsz" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bsA" = ( +/turf/open/floor/plasteel/stairs/right, +/area/hydroponics) +"bsB" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsC" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Hydroponics - Aft" + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"bsD" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bsE" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/hydroponics) +"bsF" = ( +/obj/machinery/vending/hydronutrients, +/turf/open/floor/grass, +/area/hydroponics) +"bsG" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-03" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bsH" = ( +/obj/structure/table/glass, +/obj/item/storage/box/syringes{ + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/hydroponics) +"bsI" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bsJ" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 12; + pixel_y = 8 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/grass, +/area/hydroponics) +"bsK" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light, +/turf/open/floor/grass, +/area/hydroponics) +"bsL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsM" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/hallway/secondary/civilian) +"bsP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bsR" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bsS" = ( +/obj/machinery/door/window/northleft{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bsT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bsU" = ( +/obj/effect/landmark/start/roboticist, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bsV" = ( +/turf/closed/wall, +/area/maintenance/aft) +"bsW" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"bsX" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bsY" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/aft) +"bsZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/aft) +"bta" = ( +/turf/closed/wall/r_wall, +/area/storage/tech) +"btb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/computer/secure_data, +/obj/machinery/requests_console{ + department = "Detective"; + departmentType = 5; + name = "Detective's Office RC"; + pixel_y = 30 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"btc" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Custodial Closet APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/janitor) +"btd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bte" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"btf" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"btg" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bth" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/medical/medbay/lobby) +"bti" = ( +/obj/machinery/door/window/eastleft{ + name = "Waiting Room" + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"btj" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"btk" = ( +/obj/structure/sign/poster/official/nanomichi_ad{ + pixel_x = 32 + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"btl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"btm" = ( +/obj/machinery/disposal/bin{ + name = "Chapel Mailbox" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/delivery/white, +/obj/machinery/requests_console{ + department = "Chapel"; + departmentType = 2; + name = "Chapel RC"; + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"btn" = ( +/obj/machinery/computer/mech_bay_power_console, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bto" = ( +/turf/open/floor/mech_bay_recharge_floor, +/area/science/robotics/lab) +"btp" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/robotics/lab) +"btq" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"btr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bts" = ( +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"btt" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Civilian Wing Hallway - Aft"; + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/civilian) +"btu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/hallway/secondary/civilian) +"btv" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/belt/utility, +/obj/item/stack/cable_coil/random, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"btw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/department/eva) +"btx" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/aft) +"bty" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"btz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btA" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btC" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/storage/tech) +"btF" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"btG" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"btH" = ( +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"btI" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Detainee Locker" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"btJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/hallway/secondary/civilian) +"btK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"btL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"btM" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"btN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/stack/cable_coil/random, +/obj/item/weldingtool, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"btO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"btP" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"btQ" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/AI, +/turf/open/floor/plating, +/area/storage/tech) +"btR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"btS" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"btT" = ( +/turf/closed/wall/r_wall, +/area/router) +"btU" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"btV" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/storage/tech) +"btW" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"btX" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"btY" = ( +/obj/machinery/door/window/eastright{ + name = "Waiting Room" + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"btZ" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/router) +"bua" = ( +/obj/machinery/camera{ + c_tag = "Robotics Backroom"; + dir = 8; + network = list("ss13","medbay"); + pixel_y = -22 + }, +/obj/structure/sign/poster/contraband/borg_fancy_2{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bub" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"buc" = ( +/obj/structure/bed, +/obj/item/clothing/glasses/sunglasses/blindfold, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"bud" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/conveyor{ + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bue" = ( +/turf/closed/wall/r_wall, +/area/router/eva) +"buf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/plasticflaps, +/obj/machinery/door/window/northleft{ + name = "Showers"; + req_one_access_txt = "29;47" + }, +/turf/open/floor/plasteel, +/area/science/lab) +"bug" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/chapel/office) +"buh" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"bui" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"buj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"buk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Routing Depot"; + req_one_access_txt = "10;31" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bul" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bum" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft) +"bun" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"buo" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bup" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"buq" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/router) +"bur" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bus" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/mass_driver{ + dir = 1; + id = "public_in"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router) +"but" = ( +/turf/closed/wall/mineral/titanium/nosmooth, +/area/hallway/primary/central) +"buu" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"buv" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"buw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bux" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"buy" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"buz" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"buA" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/medical/medbay/lobby) +"buB" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Ferry Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"buC" = ( +/obj/structure/table/reinforced, +/obj/item/integrated_circuit_printer, +/obj/item/integrated_electronics/wirer, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"buD" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"buE" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/conveyor/auto{ + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"buF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"buG" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"buH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"buI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"buJ" = ( +/obj/item/beacon, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"buK" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"buL" = ( +/obj/structure/closet/crate/coffin, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"buM" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/button/door{ + id = "capblast"; + name = "Window Blast Door Control"; + pixel_x = -6; + pixel_y = -3; + req_access_txt = "19" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"buN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/rust, +/area/chapel/main) +"buO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"buP" = ( +/obj/item/trash/plate, +/obj/item/lighter/greyscale, +/obj/item/clothing/mask/cigarette/cigar/cohiba, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"buQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Chapel Morgue"; + req_access_txt = "27" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"buR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"buS" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/cmo) +"buT" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/sign/poster/official/soft_cap_pop_art{ + pixel_x = -32 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"buU" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/chips{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"buV" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/telecomms/processor, +/obj/item/circuitboard/machine/telecomms/bus, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"buW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/janitor) +"buX" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/bartender, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"buY" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"buZ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/soulstone/anybody/chaplain, +/obj/item/organ/heart, +/obj/item/book/granter/spell/smoke/lesser, +/obj/item/nullrod, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"bva" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/wall, +/area/janitor) +"bvb" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bvc" = ( +/obj/machinery/computer/cargo/request, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bvd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bve" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Construction Area"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/construction) +"bvf" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"bvg" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/destTagger, +/obj/effect/turf_decal/bot, +/obj/machinery/requests_console{ + department = "EVA Router"; + name = "EVA Router RC"; + pixel_y = 28 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/router/eva) +"bvh" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bvi" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bvj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bvk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvl" = ( +/obj/item/trash/plate, +/obj/item/kitchen/fork, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bvm" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bvn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bvo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bvp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"bvq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bvr" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bvs" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/chapel) +"bvt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bvu" = ( +/turf/closed/wall/r_wall, +/area/chapel/office) +"bvv" = ( +/turf/closed/wall/r_wall/rust, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"bvw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bvx" = ( +/obj/structure/grille, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvy" = ( +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bvz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/router/eva) +"bvA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bvB" = ( +/turf/closed/wall/r_wall/rust, +/area/router) +"bvC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/mob/living/simple_animal/hostile/retaliate/goat{ + name = "Pete" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bvD" = ( +/obj/machinery/camera{ + c_tag = "Bar - Starboard"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bvE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/chapel/main) +"bvF" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bvG" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bvH" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/crew_quarters/bar) +"bvI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/chapel) +"bvJ" = ( +/obj/structure/chair/comfy/brown, +/obj/effect/landmark/start/head_of_personnel, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bvK" = ( +/obj/structure/table/optable, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bvL" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bvM" = ( +/obj/machinery/door/airlock/external/glass{ + name = "External Construction Access"; + req_one_access_txt = "10;31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bvN" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/chapel) +"bvO" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvP" = ( +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvQ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"bvR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bvS" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvT" = ( +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bvU" = ( +/obj/item/caution, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bvV" = ( +/obj/structure/table, +/obj/machinery/light/small, +/obj/item/storage/pill_bottle/epinephrine, +/obj/item/wrench{ + pixel_x = -8 + }, +/obj/item/extinguisher{ + pixel_x = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bvW" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bvX" = ( +/obj/machinery/door/airlock/external{ + name = "External Construction Access"; + req_one_access_txt = "10;31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bvY" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"bvZ" = ( +/obj/item/folder, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bwa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bwb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Chapel Air Hookup"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwc" = ( +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwd" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bwe" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwf" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bwg" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bwh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/requests_console{ + department = "Routing Depot"; + name = "Routing Depot RC"; + pixel_y = 28 + }, +/obj/machinery/button/massdriver{ + id = "eva_in"; + name = "mass driver button (EVA)"; + pixel_x = -24 + }, +/obj/machinery/button/massdriver{ + id = "public_in"; + name = "mass driver button (Public)"; + pixel_x = -24; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/router) +"bwi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bwj" = ( +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwk" = ( +/obj/machinery/chem_master, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/disposal) +"bwl" = ( +/obj/structure/closet/secure_closet/security, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/sign/poster/official/safety_report{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"bwm" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall/r_wall, +/area/gateway) +"bwn" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/mob/living/simple_animal/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bwp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bwq" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/conveyor{ + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bwr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bws" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/autolathe/secure{ + name = "public autolathe" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bwt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bwu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/trash/can, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bwv" = ( +/obj/machinery/disposal/bin{ + name = "Mass Driver" + }, +/obj/structure/sign/warning/deathsposal{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bww" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bwx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/janitor) +"bwy" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/janitor) +"bwz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bwA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"bwB" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/bot_assembly/medbot, +/obj/item/clothing/head/hardhat{ + pixel_x = -2; + pixel_y = 6; + pressure_resistance = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bwC" = ( +/obj/structure/table, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/storage/box/mousetraps, +/obj/item/light/tube, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/machinery/camera{ + c_tag = "Routing Depot" + }, +/turf/open/floor/plasteel, +/area/router) +"bwD" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer, +/obj/item/wrench, +/obj/item/screwdriver, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bwE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwF" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bwG" = ( +/obj/item/cigbutt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bwH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/box/mre/menu2/safe, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bwI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bwJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"bwK" = ( +/obj/machinery/camera{ + c_tag = "Research - Gateway Chamber"; + network = list("ss13","rd") + }, +/obj/machinery/gateway{ + dir = 1 + }, +/turf/open/floor/engine, +/area/gateway) +"bwL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bwM" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/turf/open/floor/engine, +/area/gateway) +"bwN" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Toxins Lab - Port"; + network = list("ss13","rd") + }, +/obj/machinery/meter, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bwO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bwP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bwQ" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bwR" = ( +/turf/open/floor/plasteel, +/area/engine/break_room) +"bwS" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/disposal/deliveryChute{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bwT" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bwU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bwV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bwW" = ( +/turf/closed/wall, +/area/maintenance/disposal) +"bwX" = ( +/obj/machinery/conveyor{ + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bwY" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bwZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clothing/under/misc/mailman, +/obj/item/clothing/head/mailman, +/obj/item/wirecutters, +/obj/item/stack/packageWrap, +/turf/open/floor/plasteel, +/area/router) +"bxa" = ( +/obj/structure/frame/computer, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router) +"bxb" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Waste Disposal - Port"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bxc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bxd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bxe" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bxf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "EVA Router"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bxg" = ( +/obj/machinery/light/small, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/stack/tile/plasteel{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bxh" = ( +/obj/machinery/disposal/bin{ + name = "Corpse Disposal" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bxi" = ( +/obj/structure/closet/l3closet/janitor, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/item/clothing/gloves/color/purple, +/obj/item/clothing/gloves/color/purple, +/obj/item/clothing/under/costume/maid, +/obj/item/clothing/under/costume/maid, +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/janitor) +"bxj" = ( +/turf/closed/wall/r_wall, +/area/maintenance/aft) +"bxk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bxl" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bxm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"bxn" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxo" = ( +/obj/machinery/door/airlock/external{ + name = "Telecommunications External Access"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"bxp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bxq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"bxr" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed, +/obj/item/radio/off{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/turf/open/floor/plasteel, +/area/janitor) +"bxs" = ( +/obj/item/storage/toolbox/mechanical/old, +/obj/item/reagent_containers/food/snacks/chips{ + pixel_x = 3; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bxt" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Telecommunications External Access"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/tcommsat/computer) +"bxu" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/telecomms/broadcaster, +/obj/item/circuitboard/machine/telecomms/receiver, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxv" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxw" = ( +/turf/closed/wall/r_wall, +/area/maintenance/starboard/aft) +"bxx" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxy" = ( +/obj/item/trash/candle, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/disposal) +"bxz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/station_alert, +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/paper/guides/cogstation/letter_eng, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bxA" = ( +/obj/machinery/announcement_system, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"bxB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxC" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/tcommsat/computer) +"bxD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/door/airlock/engineering{ + name = "Telecommunications Chamber"; + req_access_txt = "61" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 29 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bxG" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bxH" = ( +/turf/closed/wall, +/area/storage/tech) +"bxI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxJ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxK" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/item/radio/off, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxL" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bxM" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/hallway/primary/aft) +"bxN" = ( +/obj/structure/rack, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/techstorage/command, +/turf/open/floor/plating, +/area/storage/tech) +"bxO" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bxP" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Central Starboard Exterior Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bxQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/conveyor_switch{ + id = "MiningConveyer" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bxS" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bxT" = ( +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"bxU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bxV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bxW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxY" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bxZ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"bya" = ( +/obj/machinery/computer/telecomms/monitor{ + dir = 1; + network = "tcommsat" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"byb" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/tcommsat/server) +"byc" = ( +/obj/machinery/igniter/incinerator_toxmix, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"byd" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/item/pen/fountain{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/stamp/hop, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bye" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"byf" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Telecommunications Mainframe"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/tcommsat/server) +"byg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"byh" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"byi" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/server) +"byj" = ( +/turf/open/floor/plasteel, +/area/tcommsat/server) +"byk" = ( +/obj/machinery/telecomms/message_server, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byl" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Telecommunications Mainframe"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/tcommsat/server) +"bym" = ( +/obj/machinery/announcement_system, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byn" = ( +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"byo" = ( +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/pen, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/machinery/camera{ + c_tag = "Chapel Game Room"; + dir = 1 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"byp" = ( +/obj/machinery/telecomms/bus/preset_three, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byq" = ( +/obj/machinery/telecomms/receiver/preset_left, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byr" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/flashlight/lamp/green, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"bys" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"byt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Central Starboard Exterior Access" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"byu" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Central Starboard Exterior Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"byv" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"byw" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"byx" = ( +/obj/machinery/telecomms/processor/preset_three, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byy" = ( +/obj/machinery/telecomms/bus/preset_one, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byz" = ( +/obj/machinery/telecomms/receiver/preset_right, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byA" = ( +/obj/machinery/telecomms/processor/preset_one, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byB" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"byC" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"byD" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"byE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/button/massdriver{ + id = "eva_out"; + pixel_x = 24; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"byF" = ( +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "EVA" + }, +/turf/open/floor/plating, +/area/router/eva) +"byG" = ( +/obj/machinery/telecomms/server/presets/service, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byH" = ( +/obj/machinery/telecomms/server/presets/common, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byI" = ( +/obj/machinery/telecomms/hub/preset, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byJ" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byK" = ( +/obj/machinery/telecomms/server/presets/command, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byL" = ( +/obj/machinery/telecomms/server/presets/science, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"byM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Chapel Maintenance"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"byN" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/morgue) +"byO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/tile/plasteel{ + pixel_x = 3; + pixel_y = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"byP" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"byQ" = ( +/turf/closed/wall, +/area/medical/morgue) +"byR" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"byS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"byT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"byU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"byV" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"byW" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"byX" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"byY" = ( +/obj/vehicle/ridden/janicart, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/key/janitor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"byZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/mass_driver{ + dir = 4; + id = "eva_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/eva) +"bza" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bzb" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Ferry Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzc" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/security, +/turf/open/floor/plating, +/area/storage/tech) +"bzd" = ( +/turf/open/floor/plating, +/area/storage/tech) +"bze" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/mob/living/simple_animal/cockroach, +/turf/open/floor/plating, +/area/maintenance/aft) +"bzf" = ( +/obj/structure/janitorialcart, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"bzg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/janitor) +"bzh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzi" = ( +/obj/item/cardboard_cutout, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzj" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/assembly/flash, +/obj/item/assembly/flash, +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating, +/area/storage/tech) +"bzk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bzl" = ( +/obj/structure/closet/secure_closet, +/obj/effect/spawner/lootdrop/organ_spawner, +/obj/effect/spawner/lootdrop/organ_spawner, +/obj/effect/spawner/lootdrop/organ_spawner, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzm" = ( +/obj/machinery/conveyor{ + dir = 5; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzn" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzo" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/flashlight, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bzp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bzq" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/sign/warning/pods{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bzr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/closed/wall, +/area/hallway/primary/aft) +"bzs" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bzt" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bzu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "MiningConveyer" + }, +/turf/open/floor/plating/airless, +/area/quartermaster/miningoffice) +"bzv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "MiningConveyer" + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating/airless, +/area/quartermaster/miningoffice) +"bzw" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bzx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation Room"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bzy" = ( +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bzz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"bzA" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/closed/wall, +/area/science/research{ + name = "Research Sector" + }) +"bzB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzC" = ( +/obj/structure/closet/toolcloset, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bzD" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "evablock"; + name = "EVA Router" + }, +/turf/open/floor/plating, +/area/router/eva) +"bzE" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/conveyor{ + dir = 4; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bzF" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/conveyor{ + dir = 4; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bzG" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bzH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bzJ" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, +/area/science/robotics/lab) +"bzK" = ( +/obj/machinery/disposal/bin{ + name = "Chapel Corpse Delivery" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/full, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bzL" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzM" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bzN" = ( +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bzO" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "recycler"; + name = "Recycler Conveyor Control" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bzP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/router) +"bzQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bzR" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bzS" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bzT" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/central"; + dir = 4; + name = "Central Port Maintenance APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/maintenance/port/central) +"bzU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/machinery/meter, +/turf/closed/wall, +/area/hallway/primary/aft) +"bzV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bzW" = ( +/obj/machinery/vending/assist, +/turf/open/floor/plating, +/area/storage/tech) +"bzX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Toxins Launch Room"; + req_access_txt = "7;8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bzY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bzZ" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"bAa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bAb" = ( +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"bAc" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/gateway) +"bAd" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bAe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router) +"bAf" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"bAg" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"bAh" = ( +/obj/item/reagent_containers/food/condiment/pack/mustard{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/condiment/pack/ketchup{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bAi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router) +"bAj" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/janitor) +"bAk" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Recycler"; + req_one_access_txt = "12;50" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bAl" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bAm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router) +"bAn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bAo" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bAp" = ( +/obj/structure/bed, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/bedsheet/purple, +/obj/effect/landmark/start/janitor, +/turf/open/floor/plasteel, +/area/janitor) +"bAq" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bAr" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bAs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bAt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Fore Maintenance - Starboard"; + pixel_x = 22 + }, +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bAu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bAv" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/bed, +/obj/item/bedsheet/qm, +/obj/effect/landmark/start/quartermaster, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bAw" = ( +/obj/item/paper/fluff/bee_objectives, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"bAx" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bAy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bAz" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/turf/open/floor/engine, +/area/gateway) +"bAA" = ( +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bAB" = ( +/obj/item/beacon, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bAC" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bAD" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bAE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/ai/secondary, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bAF" = ( +/obj/machinery/gateway/centerstation, +/turf/open/floor/engine, +/area/gateway) +"bAG" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bAH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bAI" = ( +/obj/machinery/photocopier, +/obj/machinery/requests_console{ + department = "Law Office"; + name = "Law Office RC"; + pixel_y = 32 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bAJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/hud/health, +/obj/item/stamp/cmo, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/cmo"; + dir = 1; + name = "Chief Medical Officer's Office APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"bAK" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bAL" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: WASTE EJECTION"; + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space) +"bAM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bAN" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/turf/open/floor/engine, +/area/gateway) +"bAO" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bAP" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bAQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bAR" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator Room"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"bAS" = ( +/turf/closed/wall/r_wall/rust, +/area/maintenance/disposal) +"bAT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bAU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bAV" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bAW" = ( +/obj/structure/sign/poster/official/get_your_legs, +/turf/closed/wall, +/area/hallway/secondary/exit) +"bAX" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/item/paper/fluff/cogstation/letter_cap{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bAY" = ( +/obj/machinery/status_display, +/turf/closed/wall, +/area/hallway/secondary/exit) +"bAZ" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/chapel/main) +"bBa" = ( +/obj/structure/sign/poster/official/help_others, +/turf/closed/wall, +/area/hallway/secondary/exit) +"bBb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/grille/broken, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel) +"bBc" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/exit) +"bBd" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/popcorn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bBe" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/sign/warning/pods{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bBf" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bBg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bBh" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "recycler" + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bBj" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/crew_quarters/heads/captain"; + dir = 4; + name = "Captain's Quarters APC"; + pixel_x = 26 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"bBk" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bBl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bBm" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit) +"bBn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bBo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"bBp" = ( +/obj/machinery/conveyor/inverted{ + dir = 9; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBq" = ( +/obj/machinery/recycler, +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBr" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBs" = ( +/obj/machinery/aug_manipulator, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"bBt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bBu" = ( +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bBv" = ( +/turf/closed/wall, +/area/router) +"bBw" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit) +"bBx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/obj/item/t_scanner, +/turf/open/floor/plating, +/area/storage/tech) +"bBy" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bBz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bBA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/ore_box, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bBB" = ( +/obj/machinery/conveyor/auto{ + id = "router" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 4 + }, +/turf/open/floor/plating, +/area/router) +"bBC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bBD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBE" = ( +/obj/structure/grille, +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bBF" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bBG" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bBH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bBI" = ( +/obj/machinery/computer/shuttle/mining, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bBJ" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"bBK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door{ + id = "recycleraccess"; + name = "Recycler Access Control"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bBL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bBM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bBN" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/mixing) +"bBO" = ( +/turf/closed/wall/r_wall, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bBP" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/chemistry) +"bBQ" = ( +/turf/closed/wall, +/area/medical/chemistry) +"bBR" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Computer Core APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bBS" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bBT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bBU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/sign/departments/cargo{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bBV" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bBW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bBX" = ( +/obj/machinery/door/airlock/external{ + name = "Routing Depot"; + req_one_access_txt = "10;31" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bBY" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external{ + name = "EVA Router"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bBZ" = ( +/turf/closed/wall, +/area/hallway/secondary/exit) +"bCa" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bCb" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"bCc" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bCd" = ( +/obj/effect/landmark/start/captain, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bCe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Personnel's Desk"; + departmentType = 5; + name = "Head of Personnel RC"; + pixel_y = -30 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bCf" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/medical/chemistry) +"bCg" = ( +/turf/closed/wall/r_wall, +/area/medical/chemistry) +"bCh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/central) +"bCi" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"bCk" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"bCl" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bCm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bCn" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bCo" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bCp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCq" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/obj/machinery/door/poddoor{ + id = "recycleraccess"; + name = "Recycler Access" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bCr" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bCs" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCt" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/storage/box/engineer{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bCu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bCv" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"bCw" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "eva" + }, +/turf/open/floor/plating, +/area/router/eva) +"bCx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bCy" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "eva" + }, +/turf/open/floor/plating, +/area/router/eva) +"bCz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/under/misc/overalls, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/storage/primary) +"bCA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bCB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bCC" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bCD" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 29 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCE" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "eva" + }, +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "evablock"; + name = "EVA Router" + }, +/turf/open/floor/plating, +/area/router/eva) +"bCF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"bCG" = ( +/obj/item/cigbutt, +/obj/item/radio/intercom{ + frequency = 1359; + name = "Station Intercom (Security)"; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bCI" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bCK" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCL" = ( +/turf/closed/wall/rust, +/area/security/detectives_office) +"bCM" = ( +/turf/closed/wall/r_wall/rust, +/area/security/detectives_office) +"bCN" = ( +/obj/structure/filingcabinet, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCO" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bCP" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase, +/obj/item/taperecorder, +/obj/item/radio{ + pixel_x = -6 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCQ" = ( +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop{ + dir = 8; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bCR" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/mass_driver{ + dir = 8; + id = "airbridge_in"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router) +"bCS" = ( +/obj/structure/closet, +/obj/machinery/camera{ + c_tag = "Central Plaza - Legal Desk"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bCT" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/sorting/mail/flip, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bCU" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/maintenance/disposal) +"bCV" = ( +/turf/open/floor/plating/airless, +/area/maintenance/disposal) +"bCW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/door/airlock/engineering/glass{ + name = "Thermo-Electric Generator"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"bCX" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/snack/random, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bCY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/robotics/lab) +"bCZ" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bDa" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bDb" = ( +/mob/living/simple_animal/mouse/white{ + desc = "Wubba lubba dub dub."; + name = "Rick" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bDc" = ( +/obj/machinery/vending/security, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bDd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bDe" = ( +/obj/machinery/disposal/bin{ + name = "Corpse Delivery" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/red, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bDf" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/service, +/turf/open/floor/plating, +/area/storage/tech) +"bDg" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/medical, +/turf/open/floor/plating, +/area/storage/tech) +"bDh" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/rnd, +/turf/open/floor/plating, +/area/storage/tech) +"bDi" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Service Hallway"; + req_one_access_txt = "25;26;28;35" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bDj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/item/pipe_meter, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"bDk" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 15 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bDl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bDm" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bDn" = ( +/obj/machinery/icecream_vat, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bDo" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bDp" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bDq" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bDr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/item/pipe_meter, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bDs" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bDt" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bDu" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/rag, +/obj/structure/table/wood/fancy, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bDv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bDw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AIChamberShutter"; + name = "AI Chamber Shutters" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bDx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDy" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bDz" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Service Hallway - Aft"; + pixel_x = 22 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDA" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/service) +"bDB" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bDC" = ( +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/router) +"bDE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/snacks/store/cheesewheel, +/obj/item/reagent_containers/food/snacks/grown/pineapple, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/tomato, +/obj/item/reagent_containers/food/snacks/grown/tomato, +/obj/item/reagent_containers/food/snacks/grown/bluecherries, +/obj/item/reagent_containers/food/snacks/grown/citrus/lime, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDF" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDG" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDH" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDI" = ( +/obj/structure/closet/crate/freezer, +/obj/effect/spawner/lootdrop/three_course_meal, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bDK" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"bDL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bDM" = ( +/obj/structure/table/reinforced, +/obj/item/transfer_valve{ + pixel_x = 6 + }, +/obj/item/transfer_valve{ + pixel_x = 6 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -6 + }, +/obj/item/transfer_valve{ + pixel_x = -6 + }, +/obj/machinery/camera{ + c_tag = "Toxins Lab - Starboard"; + dir = 8; + pixel_y = -22 + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bDN" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bDO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bDP" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/bridge) +"bDQ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bDR" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bDS" = ( +/turf/open/floor/plasteel/stairs, +/area/crew_quarters/bar) +"bDT" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bDU" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AIChamberShutter"; + name = "AI Chamber Shutters" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bDV" = ( +/turf/open/floor/plasteel/stairs/left, +/area/crew_quarters/bar) +"bDW" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "AI Chamber"; + req_access_txt = "65" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bDX" = ( +/turf/open/floor/plasteel/stairs/right, +/area/crew_quarters/bar) +"bDY" = ( +/obj/structure/sign/barsign, +/turf/closed/wall, +/area/crew_quarters/bar) +"bDZ" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bEa" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"bEb" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"bEc" = ( +/obj/structure/table, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/radio/off{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/radio/off{ + pixel_x = 4; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/circuit, +/area/bridge) +"bEd" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bEe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bEf" = ( +/obj/structure/reagent_dispensers, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bEg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bEh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bEi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bEj" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/structure/closet/crate, +/obj/machinery/camera{ + c_tag = "Waste Disposal - Starboard" + }, +/obj/item/stack/tile/noslip/thirty, +/obj/structure/sign/poster/official/ue_no{ + pixel_y = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/disposal) +"bEk" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bEl" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bEm" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel's Office"; + req_access_txt = "57" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"bEn" = ( +/obj/machinery/computer/card{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint) +"bEo" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bEp" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/starboard/fore) +"bEq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bEr" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/locker"; + dir = 8; + name = "Locker Room APC"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"bEs" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/storage/eva"; + dir = 4; + name = "EVA APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"bEt" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bEu" = ( +/obj/structure/sign/warning{ + name = "\improper CONSTRUCTION AREA"; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bEv" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bEw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Starboard Bow Solar Maintenance"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bEx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bEy" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bEz" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"bEA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Starboard Bow Solar Maintenance"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bEB" = ( +/obj/structure/rack, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/item/radio/off{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/flashlight, +/obj/item/crowbar/red, +/obj/item/crowbar/red{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = -8 + }, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/machinery/camera{ + c_tag = "Starboard Bow Maintenance - Port"; + pixel_x = 22 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bEC" = ( +/obj/structure/table/glass, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bED" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bEE" = ( +/obj/structure/table, +/obj/item/clothing/under/shorts/red, +/obj/item/clothing/under/shorts/red, +/obj/item/clothing/gloves/boxing{ + pixel_y = 8 + }, +/obj/item/clothing/gloves/boxing{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bEF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bEG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"bEH" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/kitchen/backroom) +"bEI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bEJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bEK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"bEL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bEM" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bEN" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/camera{ + c_tag = "Bridge - Captain's Quarters"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Captain's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_x = 30 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bEO" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bEP" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"bEQ" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/disposal"; + dir = 8; + name = "Waste Disposal APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bER" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"bES" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"bET" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bEU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bEV" = ( +/obj/item/radio/intercom{ + frequency = 1359; + name = "Station Intercom (Security)"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"bEW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bEX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bEY" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bEZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AIChamberShutter"; + name = "AI Chamber Shutters" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai) +"bFa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/router) +"bFb" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/router) +"bFc" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bFd" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bFe" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bFf" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/aiModule/supplied/oxygen{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/aiModule/supplied/quarantine{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/aiModule/zeroth/oneHuman{ + pixel_y = 4 + }, +/obj/effect/spawner/lootdrop/aimodule_harmful{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/aiModule/supplied/protectStation{ + pixel_x = -2 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bFg" = ( +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bFh" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bFi" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bFj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bFk" = ( +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bFl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/xenobiology) +"bFm" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bFn" = ( +/turf/open/floor/plating/asteroid, +/area/chapel/main) +"bFo" = ( +/obj/machinery/smartfridge/extract/preloaded, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bFp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bFq" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line, +/obj/item/slime_scanner, +/obj/item/slime_scanner, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bFr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bFs" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bFt" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bFu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/chemistry) +"bFv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bFw" = ( +/obj/machinery/monkey_recycler, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "area/science/xenobiology"; + name = "Xenobiology Lab APC"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bFx" = ( +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/stripes/line, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bFy" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bFz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/paper/guides/cogstation/janitor, +/turf/open/floor/plasteel, +/area/janitor) +"bFA" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bFB" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bFC" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/item/storage/fancy/donut_box, +/obj/item/storage/box/beakers, +/obj/item/clothing/glasses/science, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bFD" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bFE" = ( +/obj/machinery/smoke_machine, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bFF" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bFG" = ( +/obj/structure/sign/departments/chemistry, +/turf/closed/wall, +/area/medical/chemistry) +"bFH" = ( +/obj/machinery/power/apc{ + name = "Customs APC"; + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bFI" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bFJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bFK" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFL" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFM" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFN" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bFO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFP" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFQ" = ( +/obj/structure/table, +/obj/item/clothing/under/shorts/blue, +/obj/item/clothing/under/shorts/blue, +/obj/item/clothing/gloves/boxing/blue{ + pixel_y = 8 + }, +/obj/item/clothing/gloves/boxing/blue{ + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bFR" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bFS" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bFT" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFU" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFV" = ( +/obj/structure/window/reinforced, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFW" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bFX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bFY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/noticeboard{ + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bFZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bGa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bGb" = ( +/obj/machinery/conveyor/auto{ + id = "router" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bGc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGd" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGe" = ( +/mob/living/simple_animal/crab/Coffee, +/turf/open/floor/plating/asteroid, +/area/chapel/main) +"bGf" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/security/main) +"bGg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bGh" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bGi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/router) +"bGl" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGm" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"bGo" = ( +/obj/structure/rack, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bGp" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bGq" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"bGr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bGs" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bGt" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bGu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"bGv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Arcade" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"bGw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Fitness Room" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"bGx" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"bGy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/massdriver{ + id = "eng_in"; + name = "mass driver button (Engineering)"; + pixel_x = 24; + pixel_y = -8 + }, +/obj/machinery/button/massdriver{ + id = "router_out"; + name = "mass driver button (Other)"; + pixel_x = 24; + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/router) +"bGz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"bGA" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bGB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bGC" = ( +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/camera{ + c_tag = "Starboard Quarter Maintenance - Starboard"; + network = list("ss13","rd") + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bGD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bGE" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bGF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Starboard Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bGG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"bGH" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bGI" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bGJ" = ( +/obj/structure/rack, +/obj/item/storage/box/bodybags, +/obj/item/clothing/gloves/color/grey, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bGK" = ( +/obj/machinery/conveyor{ + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"bGL" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bGM" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-20"; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bGN" = ( +/obj/structure/closet/wardrobe/white, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bGO" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/door/window/eastright{ + name = "Bathroom Stall" + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"bGP" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "secserv"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"bGQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"bGR" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/under/misc/staffassistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bGS" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/door/window/eastright{ + name = "Bathroom Stall" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"bGT" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"bGU" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/closed/wall, +/area/maintenance/port/fore) +"bGV" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall, +/area/maintenance/port/fore) +"bGW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/port/fore) +"bGX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bGY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"bGZ" = ( +/obj/structure/closet/crate/internals, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bHa" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/router/eva"; + dir = 4; + name = "EVA Router APC"; + pixel_x = 24 + }, +/obj/machinery/button/door{ + id = "evablock"; + name = "Router Access Control"; + pixel_x = 24; + pixel_y = 10; + req_access_txt = "19" + }, +/turf/open/floor/plasteel, +/area/router/eva) +"bHb" = ( +/obj/structure/closet/wardrobe/black, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHc" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/obj/structure/window/reinforced/spawner/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bHd" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bHe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"bHf" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHg" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bHh" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/main) +"bHi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bHj" = ( +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHk" = ( +/turf/closed/wall, +/area/crew_quarters/locker) +"bHl" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) +"bHm" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/fore) +"bHn" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bHo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bHq" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHr" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHs" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHt" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bHu" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHv" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/clothing/under/misc/staffassistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHw" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/clothing/under/misc/staffassistant, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHx" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHy" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"bHz" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bHA" = ( +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bHB" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/locker) +"bHC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHF" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/timer{ + pixel_x = -5 + }, +/obj/item/assembly/timer{ + pixel_y = -7 + }, +/obj/item/assembly/timer{ + pixel_y = 6 + }, +/obj/item/assembly/timer{ + pixel_x = 8 + }, +/obj/machinery/airalarm/unlocked{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bHG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay - Starboard"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHH" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/space_cube{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/gateway) +"bHI" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bHK" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, +/area/medical/morgue) +"bHL" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bHM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/tech) +"bHN" = ( +/turf/closed/wall, +/area/maintenance/solars/starboard/aft) +"bHO" = ( +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bHP" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bHQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bHR" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bHS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bHT" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bHU" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bHV" = ( +/obj/machinery/processor/slime, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bHW" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bHX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Port Bow Maintenance"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bHY" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bHZ" = ( +/turf/closed/indestructible{ + desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; + icon_state = "riveted"; + name = "hyper-reinforced wall" + }, +/area/science/test_area) +"bIa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bIb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bIc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plating, +/area/medical/chemistry) +"bId" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/mob/living/simple_animal/bot/firebot, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIe" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIf" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIg" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/reagent_containers/food/snacks/chips, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIk" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall, +/area/medical/chemistry) +"bIl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bIm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bIn" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/evac{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bIp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bIq" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bIr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bIs" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bIt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bIu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_access_txt = "5;6" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bIv" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bIw" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bIx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bIy" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "External Solar Access"; + req_access_txt = "10;13" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bIz" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bIA" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bIB" = ( +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bIC" = ( +/obj/machinery/conveyor/auto{ + id = "disposal" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bID" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bIE" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bIF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bIG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bIH" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bII" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bIJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bIK" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/extinguisher{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bIL" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIM" = ( +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bIN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIO" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIP" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bIQ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIR" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIS" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bIT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"bIU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bIV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bIW" = ( +/obj/structure/table/wood, +/obj/machinery/light, +/obj/item/reagent_containers/food/drinks/bottle/absinthe, +/obj/item/stack/spacecash/c20, +/obj/item/coin/gold, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bIX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bIY" = ( +/obj/machinery/atmospherics/pipe/simple/violet/hidden, +/turf/open/space/basic, +/area/space) +"bIZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bJa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJb" = ( +/obj/machinery/bloodbankgen, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJc" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bJe" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJf" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJg" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/box/rxglasses{ + pixel_x = 2 + }, +/obj/item/pen, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bJh" = ( +/obj/structure/sign/warning/biohazard, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/medical/morgue) +"bJi" = ( +/obj/structure/bodycontainer/morgue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bJj" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bJk" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bJl" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bJm" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/lawoffice"; + dir = 1; + name = "Information Office APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bJn" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/mask/muzzle, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bJo" = ( +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bJp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bJq" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bJr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bJs" = ( +/obj/structure/rack, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bJt" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bJu" = ( +/obj/effect/turf_decal/loading_area, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/science/lab"; + dir = 8; + name = "Research and Development APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bJv" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bJw" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bJx" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bJy" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bJz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bJA" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Circuitry Lab"; + req_access_txt = "47" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bJB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bJC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bJD" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bJE" = ( +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bJF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bJG" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bJH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/chemistry) +"bJI" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bJJ" = ( +/obj/machinery/computer/med_data, +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bJK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/medical/medbay/lobby) +"bJL" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bJM" = ( +/obj/machinery/camera/preset/toxins{ + dir = 4 + }, +/obj/item/target, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bJN" = ( +/obj/machinery/clonepod, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bJO" = ( +/obj/structure/table, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/item/storage/firstaid/radbgone, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bJP" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bJQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bJR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bJS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bJT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bJU" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bJV" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1; + name = "euthanization chamber freezer" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bJW" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bJX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bJY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bJZ" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Main Access"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bKa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bKb" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bKc" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 4 + }, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bKd" = ( +/obj/structure/closet/bombcloset, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bKe" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bKf" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bKg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bKh" = ( +/obj/machinery/door/window/westleft{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bKi" = ( +/obj/machinery/disposal/bin{ + name = "Morgue Delivery Bin" + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/red/full, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bKj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bKk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Morgue Maintenance"; + req_access_txt = "6" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bKl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/router) +"bKm" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/item/storage/box/bodybags, +/obj/structure/table, +/obj/structure/table, +/obj/item/bodybag, +/obj/item/pen/blue, +/obj/item/pen/red{ + pixel_y = 6 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bKn" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/full, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bKo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"bKp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"bKq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bKr" = ( +/obj/item/stack/packageWrap, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router) +"bKs" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bKt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bKu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bKv" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bKw" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) +"bKx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bKy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bKz" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/genetics) +"bKA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/genetics) +"bKB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bKC" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, +/area/medical/genetics) +"bKD" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining Dock Ferry"; + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bKE" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bKF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bKG" = ( +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_x = 24; + pixel_y = -8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/heads/hop) +"bKH" = ( +/obj/item/beacon, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bKI" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/engine, +/area/science/mixing) +"bKJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"bKK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"bKL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router) +"bKM" = ( +/turf/open/floor/engine, +/area/science/xenobiology) +"bKN" = ( +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bKO" = ( +/obj/structure/closet/crate/medical, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/reagent_containers/glass/bottle/ammonia, +/obj/item/reagent_containers/glass/bottle/atropine, +/obj/item/reagent_containers/glass/bottle/bromine, +/obj/item/reagent_containers/glass/bottle/charcoal, +/obj/item/reagent_containers/glass/bottle/diethylamine, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/ethanol, +/obj/item/reagent_containers/glass/bottle/formaldehyde, +/obj/item/reagent_containers/glass/bottle/iron, +/obj/item/reagent_containers/glass/bottle/morphine, +/obj/item/reagent_containers/glass/bottle/salglu_solution, +/obj/item/reagent_containers/glass/bottle/toxin, +/obj/item/reagent_containers/glass/bottle/carbon, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bKP" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/northright{ + name = "Emergency Shower" + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bKQ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/shower{ + dir = 8; + name = "emergency shower"; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"bKR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Library"; + network = list("ss13","rd") + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/library) +"bKS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Genetics Lab"; + req_access_txt = "9" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bKT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bKU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/gene_wardrobe, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bKV" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/clipboard{ + pixel_y = 3 + }, +/obj/item/paper_bin, +/obj/item/hand_labeler, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bKW" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/folder/white, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = 4 + }, +/obj/item/storage/pill_bottle/mutadone, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bKX" = ( +/obj/structure/table_frame, +/obj/item/t_scanner{ + pixel_x = -4 + }, +/obj/machinery/camera{ + c_tag = "Supply - Warehouse Fore"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bKY" = ( +/turf/closed/wall, +/area/medical/genetics) +"bKZ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bLa" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bLb" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/stack/ore/glass, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bLc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bLd" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) +"bLe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"bLf" = ( +/obj/machinery/door/window/eastleft{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bLg" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLh" = ( +/obj/structure/bed, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -28 + }, +/obj/item/bedsheet/captain, +/obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bLi" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bLj" = ( +/obj/machinery/door/window/westright{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bLk" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bLl" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bLm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bLn" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/item/caution, +/obj/item/shovel, +/obj/item/stack/tile/plasteel{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bLo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bLp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"bLq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Genetics Lab"; + req_access_txt = "9" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bLr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bLs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bLt" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bLu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bLv" = ( +/obj/machinery/light, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bLw" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bLx" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bLy" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bLz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bLA" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/table, +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/glass, +/obj/item/flashlight, +/obj/item/assembly/health, +/obj/item/assembly/voice, +/obj/item/assembly/timer, +/obj/item/assembly/infra, +/obj/item/assembly/igniter, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bLB" = ( +/obj/machinery/light, +/obj/item/target, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"bLC" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bLD" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/aft) +"bLE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button/ignition/incinerator/toxmix{ + pixel_x = -24; + pixel_y = 8 + }, +/obj/machinery/button/door/incinerator_vent_toxmix{ + pixel_x = -24; + pixel_y = -2 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"bLF" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bLG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research Aft"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bLH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLI" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"bLJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bLL" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bLM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/genetics) +"bLN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bLO" = ( +/obj/item/pipe{ + pixel_x = -3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/mob/living/simple_animal/bot/cleanbot{ + auto_patrol = 1; + icon_state = "cleanbot1"; + name = "Mopficcer Sweepsky" + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bLP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bLQ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bLR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bLS" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bLT" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bLU" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bLV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLW" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"bLX" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-02" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLY" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bLZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bMa" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bMb" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMc" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMd" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMe" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMf" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMg" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"bMh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bMi" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bMj" = ( +/turf/closed/wall, +/area/medical/medbay/central) +"bMk" = ( +/turf/closed/wall, +/area/medical/virology) +"bMl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/virology) +"bMm" = ( +/obj/structure/table/wood, +/obj/machinery/light, +/obj/item/clothing/under/misc/assistantformal{ + pixel_y = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"bMn" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Monkey Pen"; + req_one_access_txt = "9;39" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMo" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bMq" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Starboard Quarter Maintenance - Port"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bMr" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMs" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMt" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bMu" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMv" = ( +/turf/open/floor/grass, +/area/medical/virology) +"bMw" = ( +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/medical/virology) +"bMx" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/biohazard{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bMy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/biohazard{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bMz" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/router"; + dir = 4; + name = "Router APC"; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 19 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/router) +"bMA" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/router) +"bMC" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMD" = ( +/obj/structure/flora/tree/palm, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/medical/virology) +"bME" = ( +/obj/structure/flora/tree/palm, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/grass, +/area/medical/virology) +"bMF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/southright{ + name = "Cloning Access"; + req_one_access_txt = "9;45" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bMG" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bMH" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/crowbar, +/obj/machinery/requests_console{ + department = "Mining"; + name = "Mining RC"; + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bMI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 15 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bMJ" = ( +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMK" = ( +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bML" = ( +/obj/structure/flora/tree/palm, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/medical/virology) +"bMM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bMN" = ( +/obj/structure/closet/l3closet/virology, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMO" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMQ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bMR" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/rust, +/area/router) +"bMT" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMU" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bMV" = ( +/obj/machinery/light, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/medical/virology) +"bMW" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bMX" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bMY" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bMZ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNa" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNb" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNc" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNd" = ( +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/engine/atmos) +"bNe" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/door/window/northleft{ + name = "AI Upload Chamber"; + req_one_access_txt = "65" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bNf" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/router) +"bNg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Interior Airlock"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNi" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/grass, +/area/medical/virology) +"bNj" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNk" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bNl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"bNm" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/mass_driver{ + dir = 4; + id = "router_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router) +"bNo" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"bNp" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bNq" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNr" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/bedsheetbin, +/obj/item/clothing/glasses/science, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"bNs" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNt" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bNu" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/grass, +/area/medical/virology) +"bNv" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"bNw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNx" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNA" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNC" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/machinery/light, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bND" = ( +/obj/machinery/computer/pandemic, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNE" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/engine/atmos) +"bNF" = ( +/turf/open/floor/plasteel/stairs, +/area/medical/medbay/central) +"bNG" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"bNH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bNI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/departments/evac, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"bNJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/hallway/secondary/exit) +"bNK" = ( +/obj/machinery/power/solar{ + id = "aftstarboard"; + name = "Aft-Starboard Solar Array" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/aft) +"bNL" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bNM" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"bNN" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/router/eva) +"bNO" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bNP" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bNQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bNR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"bNS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bNT" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/port/fore) +"bNU" = ( +/obj/machinery/power/solar{ + id = "aftstarboard"; + name = "Aft-Starboard Solar Array" + }, +/obj/structure/cable, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/aft) +"bNV" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bNW" = ( +/turf/open/floor/plasteel/stairs/left, +/area/hallway/secondary/exit) +"bNX" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/stairs/right, +/area/hallway/secondary/exit) +"bNY" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/stairs/left, +/area/hallway/secondary/exit) +"bNZ" = ( +/turf/open/floor/plasteel/stairs/right, +/area/hallway/secondary/exit) +"bOa" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"bOc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/port) +"bOd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bOe" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external/glass{ + name = "Departures Shuttle Dock" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/port) +"bOg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bOl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOn" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Shuttle Maintenance Access" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/docking, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"bOp" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Departures Shuttle Dock" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bOq" = ( +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/solar/starboard/aft) +"bOr" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bOs" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/bz, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bOt" = ( +/obj/structure/table, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/gateway) +"bOu" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/prox_sensor{ + pixel_x = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 8 + }, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_x = 30; + receive_ore_updates = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bOv" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bOw" = ( +/obj/structure/lattice, +/obj/item/reagent_containers/food/drinks/bottle/grappa, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bOx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/science/research{ + name = "Research Sector" + }) +"bOy" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bOz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bOA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"bOB" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/router/eva) +"bOC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/router/eva) +"bOD" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/obj/machinery/sparker/toxmix{ + pixel_x = 25 + }, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"bOE" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/hand_labeler, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bOF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bOG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bOH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bOI" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen{ + dir = 1; + name = "Test Chamber Monitor"; + network = list("xeno"); + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bOJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/mob/living/simple_animal/pet/cat/space, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bOK" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/northright{ + name = "Secure Xenobiological Containment"; + req_one_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bOL" = ( +/obj/machinery/computer/card{ + dir = 8 + }, +/obj/machinery/keycard_auth{ + pixel_x = 8; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"bOM" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bON" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bOO" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"bOP" = ( +/obj/machinery/shieldwallgen/xenobiologyaccess, +/turf/open/floor/plating, +/area/science/xenobiology) +"bOQ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"bOR" = ( +/obj/structure/table/wood, +/obj/item/pinpointer/nuke, +/obj/item/card/id/captains_spare, +/obj/item/hand_tele, +/obj/item/disk/nuclear, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"bOS" = ( +/obj/structure/table/wood, +/obj/machinery/light, +/obj/item/storage/photo_album/Captain, +/obj/item/camera{ + pixel_y = -6 + }, +/obj/item/stamp/captain, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"bOT" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bOU" = ( +/obj/structure/disposaloutlet, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bOV" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bOW" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/engine, +/area/science/xenobiology) +"bOX" = ( +/obj/structure/table/reinforced, +/obj/item/electropack, +/obj/item/assembly/signaler, +/turf/open/floor/engine, +/area/science/xenobiology) +"bOY" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/machinery/camera{ + c_tag = "Customs - Aft"; + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"bOZ" = ( +/obj/structure/bed, +/obj/item/bedsheet/purple, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPa" = ( +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPb" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPc" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPd" = ( +/obj/structure/table/reinforced, +/obj/item/book/random/triple, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPe" = ( +/obj/structure/table/reinforced, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPf" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPg" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPh" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"bPi" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPj" = ( +/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPk" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/under/misc/staffassistant, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPl" = ( +/obj/structure/chair/sofa/right, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/book/manual/wiki/research_and_development, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bPm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bPn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bPo" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"bPp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bPq" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/mineral/stacking_machine{ + input_dir = 2 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bPr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bPs" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bPt" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/bridge) +"bPu" = ( +/obj/effect/landmark/start/cook, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bPv" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/multitool, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/t_scanner{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/t_scanner{ + pixel_x = -4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bPw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bPx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bPy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bPz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bPA" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bPB" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bPC" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Waste In" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bPD" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Fore"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPE" = ( +/obj/structure/table/glass, +/obj/item/clipboard, +/obj/item/storage/crayons, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPF" = ( +/obj/structure/table/glass, +/obj/item/storage/fancy/cigarettes, +/obj/item/lighter{ + pixel_x = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPG" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bPJ" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bPK" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bPL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bPM" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bPN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bPO" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit) +"bPP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/medbay/central) +"bPQ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bPR" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPS" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bPT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit) +"bPU" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Upload Access"; + req_access_txt = "16" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"bPV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"bPW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/vehicle/ridden/atv, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bPX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bPY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bPZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bQa" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bQb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/camera/motion{ + c_tag = "AI Foyer"; + network = list("minisat"); + pixel_x = 22 + }, +/obj/machinery/turretid{ + control_area = "area/ai_monitored/turret_protected/ai"; + dir = 1; + name = "AI Chamber turret control"; + pixel_x = 5; + pixel_y = 24; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"bQc" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bQd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bQe" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"bQf" = ( +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bQg" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=sci"; + location = "market" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bQi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bQj" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bQk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bQl" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQm" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQn" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQo" = ( +/obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"bQp" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = -26 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bQq" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table/wood, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/paper/guides/cogstation/letter_atmos, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bQr" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bQs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"bQt" = ( +/obj/machinery/conveyor/auto{ + dir = 5; + id = "router" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bQu" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bQv" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bQw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQz" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQA" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bQB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/weldingtool, +/obj/item/wrench/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQC" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQD" = ( +/obj/machinery/power/apc{ + name = "Tech Storage APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"bQE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bQF" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bQG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bQH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bQI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQJ" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc{ + name = "Medbay Treatment Center APC"; + pixel_y = -24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQK" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bQL" = ( +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bQM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bQN" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bQO" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bQP" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bQQ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/red/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bQR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/evac{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bQS" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bQT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/radio/intercom{ + frequency = 1447; + name = "Station Intercom (AI Private)"; + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/status_display{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bQU" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"bQV" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bQW" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"bQX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bQY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQZ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bRa" = ( +/obj/item/cigbutt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"bRb" = ( +/obj/machinery/door/window/southleft{ + name = "Captain's Equipment"; + req_access_txt = "20" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"bRc" = ( +/obj/machinery/suit_storage_unit/captain, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"bRd" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/storage"; + dir = 4; + name = "Canister Storage APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"bRe" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bRf" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRg" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRh" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bRi" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bRj" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bRk" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bRl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/router) +"bRm" = ( +/obj/structure/closet/bombcloset, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bRn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bRo" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"bRp" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bRq" = ( +/obj/machinery/portable_atmospherics/scrubber/huge/movable, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bRr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bRs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRt" = ( +/obj/structure/closet/wardrobe/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/miningoffice"; + dir = 8; + name = "Mining Office APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bRu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bRv" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/space/basic, +/area/space/nearstation) +"bRw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bRx" = ( +/obj/structure/table, +/obj/item/circuitboard/machine/cyborgrecharger, +/obj/item/disk/design_disk, +/obj/machinery/camera/motion{ + c_tag = "Computer Core"; + dir = 1; + network = list("minisat") + }, +/turf/open/floor/circuit/green/telecomms, +/area/science/server{ + name = "Computer Core" + }) +"bRy" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bRA" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bRB" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 29 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRC" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bRD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bRE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bRF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"bRG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bRH" = ( +/obj/structure/chair/sofa/right, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 29 + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bRI" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/central) +"bRJ" = ( +/obj/structure/chair/sofa/left, +/obj/effect/landmark/start/assistant, +/obj/machinery/status_display{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Medbay - Waiting Room"; + network = list("ss13","rd") + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"bRK" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"bRL" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bRM" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/science/research{ + name = "Research Sector" + }) +"bRN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/science/research{ + name = "Research Sector" + }) +"bRO" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bRP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bRQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bRR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bRS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bRT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bRU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bRV" = ( +/obj/structure/sign/departments/chemistry, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/medical/chemistry) +"bRW" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/status_display/ai{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bRX" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bRY" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/belt/medical, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bRZ" = ( +/obj/structure/closet/l3closet, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bSa" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/belt/medolier, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bSb" = ( +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"bSc" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bSd" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bSe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Robotics"; + departmentType = 2; + name = "Robotics RC"; + pixel_x = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bSf" = ( +/obj/structure/table, +/obj/item/analyzer, +/obj/item/healthanalyzer, +/obj/item/plant_analyzer, +/obj/item/aicard, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 29 + }, +/turf/open/floor/plating, +/area/storage/tech) +"bSg" = ( +/obj/machinery/rnd/production/techfab/department/medical, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bSh" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/central) +"bSi" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"bSj" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/camera{ + c_tag = "Xenobiology - Kill Chamber"; + dir = 4 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"bSk" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/public/glass{ + name = "AI Access" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bSl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bSm" = ( +/obj/machinery/modular_computer/console/preset/engineering, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSo" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSp" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bSs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bSt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bSu" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bSv" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSw" = ( +/obj/machinery/power/port_gen/pacman, +/obj/machinery/light, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/plating, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bSx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plasteel, +/area/engine/break_room) +"bSy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bSz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 11 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bSA" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/stairs/right, +/area/hallway/primary/central) +"bSB" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bSC" = ( +/turf/closed/wall, +/area/science/lab) +"bSD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/router) +"bSE" = ( +/turf/closed/wall/r_wall, +/area/science/lab) +"bSF" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "router" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router) +"bSG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/lab) +"bSH" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall/r_wall, +/area/science/lab) +"bSI" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plating, +/area/router) +"bSJ" = ( +/obj/structure/closet/crate/science, +/obj/item/target, +/obj/item/target, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/circuit"; + dir = 1; + name = "Circuitry Lab APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bSK" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSL" = ( +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSM" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/item/folder/white, +/obj/item/disk/design_disk, +/obj/item/disk/design_disk, +/obj/item/disk/tech_disk, +/obj/item/disk/tech_disk, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSO" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/public/glass{ + name = "AI Access" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bSP" = ( +/obj/machinery/computer/rdconsole/core, +/turf/open/floor/plasteel, +/area/science/lab) +"bSQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSR" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bST" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"bSW" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bSX" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_x = 28; + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bSY" = ( +/obj/structure/table, +/obj/item/stock_parts/micro_laser{ + pixel_x = 4 + }, +/obj/item/stock_parts/micro_laser{ + pixel_x = 4 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = -6 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = -6 + }, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bSZ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTb" = ( +/turf/open/floor/plasteel, +/area/science/lab) +"bTc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/lab) +"bTd" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTe" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTh" = ( +/obj/machinery/rnd/production/protolathe/department/science, +/turf/open/floor/plasteel, +/area/science/lab) +"bTi" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/item/reagent_containers/glass/beaker/sulphuric, +/turf/open/floor/plasteel, +/area/science/lab) +"bTj" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -6 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 4 + }, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTk" = ( +/obj/item/rack_parts, +/obj/structure/table_frame, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/warehouse"; + dir = 1; + name = "Warehouse APC"; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bTl" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTm" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTn" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTo" = ( +/obj/structure/table/reinforced, +/obj/item/integrated_electronics/debugger, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bTp" = ( +/obj/machinery/vending/wardrobe/law_wardrobe, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bTq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/circuit) +"bTr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"bTs" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/circuit) +"bTt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bTu" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTv" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bTw" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTx" = ( +/obj/item/stack/tile/plasteel{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bTy" = ( +/obj/item/twohanded/required/kirbyplants, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bTz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bTA" = ( +/obj/structure/filingcabinet/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bTB" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/medical/medbay/lobby) +"bTC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bTD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bTE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bTF" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bTG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"bTH" = ( +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"bTI" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"bTJ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bTK" = ( +/turf/open/floor/engine/co2, +/area/engine/atmos) +"bTL" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"bTM" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/camera{ + c_tag = "Research - Development Lab"; + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_y = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bTN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/science/circuit) +"bTO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bTP" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bTQ" = ( +/obj/machinery/vending/assist, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bTR" = ( +/turf/closed/wall/r_wall, +/area/science/circuit) +"bTS" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bTT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bTU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "recycler" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bTV" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bTW" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"bTX" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/status_display/ai{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bTY" = ( +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"bTZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"bUa" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics - Entrance" + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bUb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bUc" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bUd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bUe" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating/airless, +/area/router/aux) +"bUf" = ( +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bUg" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "router" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"bUh" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bUi" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bUj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bUk" = ( +/obj/structure/closet/crate, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bUl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bUm" = ( +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/emergency_oxygen/double, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bUn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bUo" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"bUp" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor/auto{ + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"bUq" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) +"bUr" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) +"bUs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bUt" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/hallway/primary/central) +"bUu" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/gateway) +"bUv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) +"bUw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bUx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"bUy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bUz" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bUA" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"bUB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/engine_smes"; + dir = 1; + name = "Power Monitoring APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bUC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bUD" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bUE" = ( +/turf/open/floor/plasteel/stairs/right, +/area/hallway/primary/aft) +"bUF" = ( +/obj/machinery/doppler_array/research/science{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bUG" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bUH" = ( +/obj/machinery/shieldgen, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bUI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bUJ" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/science/lab) +"bUK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Quartermaster's Office"; + req_access_txt = "31;41" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bUL" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bUM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/qm) +"bUN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering{ + name = "Primary Tool Storage"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bUO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/primary"; + dir = 1; + name = "Primary Tool Storage APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bUP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/quartermaster/sorting) +"bUQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "DeliveryDoor"; + name = "Cargo Delivery Door Control"; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bUR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/mob/living/simple_animal/bot/firebot, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bUS" = ( +/obj/structure/closet/secure_closet/quartermaster, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/item/clothing/suit/space/eva, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/paper/fluff/cogstation/letter_qm, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bUT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/filingcabinet/filingcabinet, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bUU" = ( +/obj/item/beacon, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bUV" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bUW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/aft"; + dir = 1; + name = "Starboard Quarter Maintenance APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bUX" = ( +/obj/structure/transit_tube/station/reverse/flipped{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bUY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/item/grown/bananapeel, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/router) +"bUZ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/wirecutters, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bVa" = ( +/obj/machinery/light/small, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/router) +"bVb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"bVc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVd" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bVe" = ( +/obj/machinery/photocopier, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"bVf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Engineering - Power Monitoring"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"bVg" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bVh" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bVj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor/auto{ + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bVk" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bVm" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bVn" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"bVo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bVp" = ( +/obj/machinery/computer/card/minor/rd{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"bVq" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bVr" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bVu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_x = 26 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/router) +"bVv" = ( +/obj/structure/sign/departments/xenobio{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"bVw" = ( +/obj/machinery/conveyor/auto{ + dir = 1; + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bVx" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bVy" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"bVz" = ( +/obj/structure/rack, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/extinguisher{ + pixel_x = -4 + }, +/obj/item/crowbar/red{ + pixel_x = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bVA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/router) +"bVB" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bVC" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering{ + name = "AI SMES Access"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bVD" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bVE" = ( +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bVF" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bVG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bVH" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/janitor) +"bVI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bVJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bVK" = ( +/obj/item/restraints/legcuffs/beartrap, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"bVL" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/noticeboard/rd{ + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bVM" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bVN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"bVO" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bVP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bVQ" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bVR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bVS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bVT" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bVU" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"bVV" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bVW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"bVX" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bVY" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southright{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"bVZ" = ( +/obj/machinery/power/apc{ + name = "Cargo Bay APC"; + pixel_y = -24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bWa" = ( +/turf/closed/wall/r_wall, +/area/science/research{ + name = "Research Sector" + }) +"bWb" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWc" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWd" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/sign/poster/official/wtf_is_co2{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"bWe" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Bridge" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bWf" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bWg" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Law Office"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bWh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bWi" = ( +/obj/structure/table/wood, +/obj/item/cartridge/lawyer{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/stamp/law, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bWj" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bWk" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"bWl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Toxins Storage"; + req_access_txt = "7;8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/science/mixing) +"bWm" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering{ + name = "AI SMES Access"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bWn" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bWo" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWp" = ( +/obj/machinery/atmospherics/miner/n2o, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"bWq" = ( +/obj/structure/lattice, +/obj/machinery/camera{ + c_tag = "Routing Depot - Aft Exterior"; + pixel_x = 22 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bWr" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera{ + c_tag = "Research Entrance"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWs" = ( +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWt" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bWu" = ( +/obj/machinery/vending/assist, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bWv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"bWw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/lawoffice) +"bWx" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWy" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWz" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWA" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWB" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWC" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWD" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Medbay" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bWE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bWF" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bWG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bWH" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/hallway/primary/central) +"bWI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bWJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"bWK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"bWL" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWM" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/machinery/camera{ + c_tag = "Central Hall - AI Access"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bWN" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"bWO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bWP" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Computer Core"; + req_access_txt = "30" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bWQ" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"bWR" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/science/research{ + name = "Research Sector" + }) +"bWS" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bWT" = ( +/obj/structure/chair/sofa/left, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWU" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWV" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWW" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWX" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bWY" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"bWZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/hallway/primary/aft) +"bXa" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/multitool{ + pixel_y = 4 + }, +/obj/item/book/manual/wiki/robotics_cyborgs, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bXb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bXc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"bXd" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"bXe" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/miner/toxins, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"bXf" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "EngiLockdown"; + name = "Engineering Emergency Lockdown"; + pixel_x = 24; + pixel_y = -6; + req_access_txt = "11" + }, +/obj/machinery/button/door{ + name = "Privacy Shutters"; + pixel_x = 24; + pixel_y = 6 + }, +/obj/item/twohanded/required/kirbyplants/photosynthetic, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"bXg" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bXh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bXj" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXk" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bXl" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXm" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bXn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bXo" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/disposal/deliveryChute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plating, +/area/router) +"bXq" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bXr" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Research Fore"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"bXt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXu" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bXx" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXy" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXz" = ( +/obj/machinery/power/apc{ + name = "Medbay Lobby APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXA" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bXD" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bXE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bXF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/security/checkpoint/supply) +"bXG" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"bXH" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hydroponics) +"bXI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"bXJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXK" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"bXM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 8; + id = "router_off" + }, +/turf/open/floor/plating, +/area/router) +"bXN" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bXO" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Fore"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bXP" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"bXQ" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXR" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"bXS" = ( +/obj/structure/closet/bombcloset, +/obj/machinery/camera{ + c_tag = "Toxins Lab - Access"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bXT" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bXU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/research{ + name = "Research Sector" + }) +"bXV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"bXW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bXX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bXY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bXZ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/radio/headset/headset_sci, +/obj/item/radio/headset/headset_sci, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYa" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bYc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/research{ + name = "Research Sector" + }) +"bYd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bYe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYf" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "router" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/router) +"bYg" = ( +/obj/machinery/door/poddoor{ + id = "toxinsdriver"; + name = "toxins launcher bay door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/science/mixing) +"bYh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYi" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bYk" = ( +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYl" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bYm" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bYn" = ( +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYo" = ( +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYp" = ( +/obj/structure/rack, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/mask/gas, +/obj/item/wrench, +/obj/item/light/tube, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYq" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYr" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/photocopier, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYs" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Toxins Lab Access"; + req_access_txt = "7;8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bYt" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYv" = ( +/turf/closed/wall, +/area/science/research{ + name = "Research Sector" + }) +"bYw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bYA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYB" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/clothing/gloves/color/latex, +/obj/item/book/manual/wiki/chemistry, +/obj/item/reagent_containers/dropper, +/obj/item/radio/headset/headset_medsci, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bYC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"bYD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bYF" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYG" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"bYH" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"bYI" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/storage/box/beakers, +/obj/item/assembly/timer{ + pixel_y = 6 + }, +/obj/item/assembly/timer{ + pixel_y = 6 + }, +/obj/item/assembly/timer{ + pixel_y = 6 + }, +/obj/item/assembly/timer{ + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_y = -4 + }, +/obj/item/assembly/igniter{ + pixel_y = -4 + }, +/obj/item/assembly/igniter{ + pixel_y = -4 + }, +/obj/item/assembly/igniter{ + pixel_y = -4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bYJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bYK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bYL" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bYM" = ( +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bYN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bYO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bYP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bYQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bYR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"bYS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"bYT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bYU" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bYV" = ( +/obj/machinery/rnd/destructive_analyzer, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"bYW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bYX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bYY" = ( +/turf/open/floor/circuit/green/telecomms, +/area/science/server{ + name = "Computer Core" + }) +"bYZ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/circuit/green/telecomms, +/area/science/server{ + name = "Computer Core" + }) +"bZa" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/storage/box/disks, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"bZb" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "RDServer"; + layer = 3.6; + name = "RD Server Lockup Control"; + pixel_x = -24 + }, +/obj/item/circuitboard/machine/rdserver, +/obj/item/disk/tech_disk, +/turf/open/floor/circuit/green/telecomms, +/area/science/server{ + name = "Computer Core" + }) +"bZc" = ( +/obj/machinery/computer/robotics{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment, +/turf/open/floor/circuit/green/telecomms, +/area/science/server{ + name = "Computer Core" + }) +"bZd" = ( +/obj/effect/landmark/blobstart, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bZe" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"bZf" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bZg" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bZh" = ( +/turf/closed/wall, +/area/crew_quarters/toilet/restrooms) +"bZi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"bZj" = ( +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 4; + node1_concentration = 0.8; + node2_concentration = 0.2; + on = 1; + target_pressure = 4500 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bZk" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"bZl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bZm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=upload"; + location = "med" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bZn" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/door/window/eastright, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"bZo" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"bZp" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bZq" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/door/window/eastright, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"bZr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/hallway/primary/central) +"bZs" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Bathroom Maintenance"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/crew_quarters/toilet/restrooms) +"bZt" = ( +/turf/closed/wall, +/area/maintenance/starboard/aft) +"bZu" = ( +/obj/structure/rack, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/extinguisher, +/obj/item/crowbar, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bZv" = ( +/obj/structure/rack, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/head/hardhat/red{ + pixel_y = 6 + }, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/air, +/obj/item/extinguisher, +/obj/item/crowbar, +/obj/machinery/camera{ + c_tag = "Fire Suppression Storage"; + pixel_x = 22 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bZw" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"bZx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Fire Suppression Storage"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bZy" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"bZz" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Kill Room"; + req_access_txt = "47" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bZA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/library) +"bZB" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bZC" = ( +/obj/machinery/computer/libraryconsole, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/library) +"bZD" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bZE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bZF" = ( +/turf/open/floor/wood, +/area/library) +"bZG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/sign/warning/fire{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"bZH" = ( +/turf/closed/wall, +/area/library) +"bZI" = ( +/obj/machinery/air_sensor/atmos/mix_tank, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"bZJ" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/photocopier, +/turf/open/floor/carpet, +/area/library) +"bZK" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/wood, +/area/library) +"bZL" = ( +/obj/machinery/air_sensor/atmos/nitrous_tank, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"bZM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"bZN" = ( +/obj/structure/closet/crate/freezer, +/obj/item/rack_parts, +/obj/item/rack_parts, +/obj/item/wrench, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"bZO" = ( +/obj/machinery/air_sensor/atmos/toxin_tank, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"bZP" = ( +/obj/machinery/air_sensor/atmos/carbon_tank, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"bZQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bZR" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"bZS" = ( +/turf/closed/wall/r_wall, +/area/library) +"bZT" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/storage/box/pillbottles, +/obj/item/hand_labeler, +/obj/item/clothing/glasses/science, +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"bZU" = ( +/obj/structure/table/wood, +/obj/machinery/door/window/northright{ + name = "Library Desk Window"; + req_access_txt = "37" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"bZV" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"bZW" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/science/mixing) +"bZX" = ( +/obj/structure/table/wood, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"bZY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"bZZ" = ( +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"caa" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cab" = ( +/obj/structure/bookcase/random/adult{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"cac" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cad" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cae" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"caf" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cag" = ( +/obj/structure/table/reinforced, +/obj/item/integrated_electronics/analyzer, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cah" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cai" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"caj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cak" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"cal" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/engine/atmos) +"cam" = ( +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"can" = ( +/obj/machinery/power/turbine{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cao" = ( +/obj/machinery/power/compressor{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cap" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/air_sensor/atmos/incinerator_tank{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/machinery/igniter/incinerator_atmos, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"caq" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"car" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cas" = ( +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"cat" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"cau" = ( +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cav" = ( +/turf/closed/wall/r_wall, +/area/science/explab) +"caw" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) +"cax" = ( +/turf/closed/wall, +/area/science/explab) +"cay" = ( +/obj/machinery/air_sensor/atmos/nitrogen_tank, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"caz" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/science/explab) +"caA" = ( +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/science/explab) +"caB" = ( +/obj/structure/closet/bombcloset, +/turf/open/floor/plasteel, +/area/science/explab) +"caC" = ( +/obj/structure/table, +/obj/item/wrench, +/obj/item/clothing/suit/fire/firefighter, +/obj/item/extinguisher{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel, +/area/science/explab) +"caD" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/disposal) +"caE" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"caF" = ( +/obj/machinery/air_sensor/atmos/oxygen_tank, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"caG" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/science/explab) +"caH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/chair/office/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"caI" = ( +/obj/structure/table/reinforced, +/obj/item/integrated_electronics/analyzer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_x = 30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"caJ" = ( +/obj/machinery/air_sensor/atmos/air_tank, +/turf/open/floor/engine/air, +/area/engine/atmos) +"caK" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"caL" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"caM" = ( +/obj/machinery/light/small, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"caN" = ( +/obj/machinery/light/small, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"caO" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"caP" = ( +/obj/structure/chair/office/light, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/explab) +"caQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Medbay Lobby" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white/side, +/area/medical/medbay/lobby) +"caR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-06" + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"caS" = ( +/obj/machinery/light/small, +/turf/open/floor/engine/air, +/area/engine/atmos) +"caT" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/science/explab) +"caU" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/closed/wall/r_wall, +/area/science/explab) +"caV" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 1"; + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"caW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"caX" = ( +/turf/open/floor/engine, +/area/science/explab) +"caY" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"caZ" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 2"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cba" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/science/explab) +"cbb" = ( +/turf/closed/wall/r_wall, +/area/science/storage) +"cbc" = ( +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/stack/sheet/metal/ten, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/screwdriver, +/obj/item/screwdriver, +/obj/item/multitool, +/obj/item/multitool, +/obj/machinery/camera{ + c_tag = "Research - Circuitry Lab"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cbd" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/item/clothing/ears/earmuffs, +/obj/item/radio, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cbe" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/mask/gas, +/turf/open/floor/engine, +/area/science/explab) +"cbf" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cbg" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/engine, +/area/science/storage) +"cbh" = ( +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/explab) +"cbi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"cbj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cbk" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/qm"; + dir = 8; + name = "Quartermaster's Office APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"cbl" = ( +/obj/structure/table/reinforced, +/obj/item/healthanalyzer, +/turf/open/floor/engine, +/area/science/explab) +"cbn" = ( +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/science/storage) +"cbo" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cbp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "capblast"; + name = "blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"cbq" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/pen, +/turf/open/floor/engine, +/area/science/explab) +"cbt" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/engine, +/area/science/explab) +"cbu" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/science/storage) +"cbv" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/warning/biohazard{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cbw" = ( +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cbx" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes, +/obj/item/pen/blue, +/turf/open/floor/engine, +/area/science/explab) +"cby" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cbz" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/latex, +/obj/item/reagent_containers/dropper, +/obj/item/pen/red, +/turf/open/floor/engine, +/area/science/explab) +"cbA" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/storage/eva) +"cbB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cbC" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/storage) +"cbD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cbE" = ( +/turf/closed/wall/r_wall, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cbF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cbG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cbH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ai_monitored/storage/eva) +"cbI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cbJ" = ( +/obj/structure/table/reinforced, +/obj/item/analyzer, +/obj/item/t_scanner, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/supermatter"; + dir = 4; + name = "Thermo-Electric Generator APC"; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"cbK" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cbL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cbM" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/obj/item/storage/box/lights/mixed, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/structure/cable{ + icon_state = "1-10" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cbN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cbO" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cbP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"cbQ" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/item/reagent_containers/food/snacks/meat/slab/spider, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"cbR" = ( +/obj/structure/cable{ + icon_state = "1-10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cbS" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cbT" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = -2; + pixel_y = -27 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cbU" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/engine/atmos"; + name = "Atmospherics APC"; + pixel_y = -28 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cbV" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/server{ + name = "Computer Core" + }) +"cbW" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cbX" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/item/disk/tech_disk, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/circuit, +/area/bridge) +"cbY" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/server{ + name = "Computer Core" + }) +"cbZ" = ( +/obj/machinery/computer/slot_machine, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cca" = ( +/obj/machinery/computer/slot_machine, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"ccb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs/medium, +/area/crew_quarters/bar) +"ccc" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccd" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cce" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/science/circuit) +"ccf" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cch" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"cci" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/mass_driver{ + id = "workshop_in"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router) +"ccj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Routing Depot"; + req_one_access_txt = "10;31" + }, +/turf/open/floor/plating, +/area/router) +"cck" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ccl" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/maintenance/department/chapel) +"ccm" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/mecha_part_fabricator, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass{ + amount = 20; + layer = 3.2 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"ccn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "router" + }, +/turf/open/floor/plating, +/area/router) +"cco" = ( +/obj/machinery/conveyor/auto{ + id = "router" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"ccp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ccq" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/poster/official/nanomichi_ad{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"ccr" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccs" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cct" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/science/research{ + name = "Research Sector" + }) +"ccu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ccv" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_one_access_txt = "10;24;48" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ccw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ccx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ccy" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "router" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/router) +"ccz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"ccA" = ( +/obj/machinery/disposal/deliveryChute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"ccB" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/folder/white, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/westleft{ + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ccC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ccD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ccE" = ( +/obj/machinery/mass_driver{ + id = "eng_in"; + name = "Router Driver" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/router) +"ccF" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/flashlight, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"ccG" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/camera{ + c_tag = "Atmospherics East"; + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ccH" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "disposal_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ccJ" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "starboard_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ccL" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/rnd/bepis, +/turf/open/floor/engine, +/area/science/explab) +"ccM" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/main) +"ccN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ccO" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccP" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/router/aux) +"ccQ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"ccR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"ccS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/courtroom) +"ccT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ccU" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ccV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"ccW" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"ccX" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ccY" = ( +/obj/structure/cable, +/obj/effect/landmark/start/librarian, +/obj/machinery/power/apc{ + areastring = "/area/library"; + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"ccZ" = ( +/obj/structure/closet/cardboard, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cda" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"cdb" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating/airless, +/area/router/aux) +"cdc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"cdd" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"cde" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"cdf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cdg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdh" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cdi" = ( +/obj/machinery/disposal/deliveryChute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cdj" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/microwave, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdm" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/photocopier, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/paper/guides/cogstation/disposals, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdn" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cdo" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cdp" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cdq" = ( +/obj/machinery/mass_driver{ + id = "sq_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cdr" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cds" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdt" = ( +/turf/closed/wall/r_wall, +/area/router/eng) +"cdu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdv" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdw" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdx" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cdy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall, +/area/engine/break_room) +"cdz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdA" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/sign/warning/enginesafety, +/turf/closed/wall, +/area/engine/break_room) +"cdC" = ( +/turf/closed/wall, +/area/engine/break_room) +"cdD" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_y = 30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cdE" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/item/tape, +/obj/item/taperecorder{ + pixel_x = -4 + }, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"cdF" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cdG" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "engblock"; + name = "Engineering Router" + }, +/turf/open/floor/plating, +/area/router/eng) +"cdH" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall, +/area/engine/break_room) +"cdI" = ( +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"cdJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdK" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office"; + req_access_txt = "56" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cdO" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "EngiLockdown"; + name = "Engineering Emergency Lockdown" + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Aft Hall - Primary Tool Storage"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cdQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "EngiLockdown"; + name = "Engineering Emergency Lockdown" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cdR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/hacking_guide{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cdS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/engine/break_room) +"cdT" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Asteroid Mining Access"; + req_access_txt = "10;24" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cdU" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + id = "eng" + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "engblock"; + name = "Engineering Router" + }, +/turf/open/floor/plating, +/area/router/eng) +"cdV" = ( +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"cdW" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cdZ" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/lobby) +"cea" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/photocopier, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + name = "Cargo RC"; + pixel_y = 30 + }, +/obj/machinery/camera{ + c_tag = "Supply - Delivery Office Aft"; + network = list("ss13","rd") + }, +/obj/item/paper/guides/cogstation/disposals, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ceb" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/storage/belt/utility, +/obj/item/crowbar/large, +/obj/item/multitool, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/mecha_part_fabricator, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass{ + amount = 20; + layer = 3.2 + }, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cec" = ( +/obj/structure/table/glass, +/obj/item/paicard, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"ced" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cee" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cef" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"ceg" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"ceh" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/storage/tech) +"cei" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cej" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cek" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"cel" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cem" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/eastright{ + name = "Medbay Desk"; + req_access_txt = "5" + }, +/obj/item/folder/white, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cen" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/bridge) +"ceo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"cep" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior - Starboard Bow"; + dir = 1; + network = list("tcomms"); + pixel_x = 22 + }, +/turf/open/space/basic, +/area/space) +"ceq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall/rust, +/area/engine/teg_hot) +"cer" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/mass_driver{ + dir = 1; + id = "eng_out"; + name = "Router Driver" + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plating, +/area/router/eng) +"ces" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/conveyor/auto{ + id = "eng" + }, +/obj/structure/window/reinforced/spawner/east, +/turf/open/floor/plating, +/area/router/eng) +"cet" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"ceu" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"cev" = ( +/obj/machinery/vending/games, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"cew" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "service" + }, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plating, +/area/router/eng) +"cex" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"cey" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Arcade" + }, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"cez" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"ceA" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"ceB" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"ceC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/solars/port) +"ceD" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 2; + height = 13; + id = "ferry_home"; + name = "port bay 2"; + width = 5 + }, +/turf/open/space/basic, +/area/space) +"ceE" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Ferry Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ceF" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Ferry Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ceG" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "trash"; + name = "Disposal Driver" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ceH" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id = "trash"; + name = "Disposal Bay Door" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ceI" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ceJ" = ( +/obj/machinery/power/solar_control{ + dir = 4; + name = "Starboard Quarter Solar Control" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"ceK" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/router/eng) +"ceL" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/item/destTagger, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/massdriver{ + id = "eng_out"; + pixel_x = -24; + pixel_y = 24 + }, +/obj/machinery/button/door{ + id = "engblock"; + name = "Router Access Control"; + pixel_x = -24; + pixel_y = 32; + req_access_txt = "31" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceO" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 29 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceP" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/router/eng) +"ceQ" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/cable{ + icon_state = "2-5" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"ceR" = ( +/obj/machinery/door/poddoor{ + id = "TEGMixVent"; + name = "Mixing Chamber Vent" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"ceS" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"ceT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/cargo/request{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/machinery/requests_console{ + department = "Engineering Router"; + name = "Engineering Router RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceU" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/obj/structure/fireaxecabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ceV" = ( +/turf/open/floor/plasteel, +/area/router/eng) +"ceW" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/router/eng) +"ceX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/power/apc{ + name = "Engineering Router APC"; + pixel_y = -24 + }, +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/router/eng) +"ceY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"ceZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Asteroid Mining Access"; + req_access_txt = "10;24" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cfa" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfb" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/photocopier, +/turf/open/floor/carpet/blue, +/area/medical/medbay/central) +"cfc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"cfd" = ( +/obj/structure/closet/crate/wooden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cfe" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Port Bow Hall - Starboard"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cff" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfg" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/effect/landmark/start/research_director, +/obj/machinery/camera{ + c_tag = "Research Director's Office - Port"; + network = list("ss13","rd") + }, +/obj/machinery/keycard_auth{ + pixel_x = -8; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"cfh" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfi" = ( +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfj" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfk" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfl" = ( +/turf/closed/wall, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfm" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cfn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cfo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfp" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfq" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cfr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/airlock/external/glass{ + name = "Mixing Chamber Access"; + req_one_access_txt = "10;24" + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cfs" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cft" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/camera{ + c_tag = "Engineering - Mixing Chamber"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cfu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"cfv" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cfw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Construction Area"; + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cfx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cfy" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"cfz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cfA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfD" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/space/basic, +/area/space/nearstation) +"cfE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"cfF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cfG" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Tech Storage"; + req_access_txt = "19;23" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"cfH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/sparker{ + id = "TEGMixIgniter"; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/remains/human, +/turf/open/floor/engine/vacuum, +/area/engine/teg_hot) +"cfJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"cfK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cfL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cfM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cfN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cfO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cfP" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cfQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Library Access" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/library) +"cfR" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cfS" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cfT" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cfU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cfV" = ( +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cfW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/window/plasma/reinforced/spawner/north, +/obj/structure/window/plasma/reinforced/spawner, +/obj/structure/lattice, +/turf/open/space/basic, +/area/engine/teg_hot) +"cfX" = ( +/obj/item/pipe, +/obj/structure/cable{ + icon_state = "2-5" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cfY" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/metal, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cfZ" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/stairs/right, +/area/science/research{ + name = "Research Sector" + }) +"cga" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cgb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external/glass{ + name = "Mixing Chamber Access"; + req_one_access_txt = "10;24" + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cgc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cgd" = ( +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cge" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cgf" = ( +/obj/structure/table, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cgg" = ( +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cgh" = ( +/obj/machinery/pipedispenser, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"cgi" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"cgj" = ( +/obj/machinery/conveyor/auto{ + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cgk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/conveyor/auto{ + id = "cargo" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cgl" = ( +/obj/machinery/button/door{ + id = "TEGMixVent"; + name = "Mixing Chamber Vent"; + pixel_y = 24; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "atmos mix to burn" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cgn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cgo" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/button/ignition{ + id = "TEGMixIgniter"; + name = "Mix Igniter"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgq" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cgr" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/research"; + dir = 1; + name = "Research Sector APC"; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"cgs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cgt" = ( +/obj/structure/rack, +/obj/item/caution, +/obj/item/caution, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cgu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgv" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cgw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgx" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cgy" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/rust, +/area/maintenance/solars/starboard/aft) +"cgz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cgA" = ( +/obj/machinery/pipedispenser/disposal, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"cgB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cgC" = ( +/obj/structure/grille, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"cgD" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/teg_hot) +"cgE" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cgF" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"cgG" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"cgH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgI" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgK" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgL" = ( +/obj/machinery/computer/rdservercontrol{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server{ + name = "Computer Core" + }) +"cgM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cgN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgP" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/closed/wall/r_wall, +/area/science/server{ + name = "Computer Core" + }) +"cgQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"cgR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgS" = ( +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 4; + node1_concentration = 0.8; + node2_concentration = 0.2; + on = 1; + target_pressure = 4500 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cgU" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "manual mix to burn" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cgV" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cgW" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 5; + id = "mining_home"; + name = "mining shuttle bay"; + roundstart_template = /datum/map_template/shuttle/mining/delta; + width = 7 + }, +/turf/open/space/basic, +/area/space) +"cgX" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cgY" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cgZ" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cha" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 1 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"chb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"chc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"chd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"che" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"chf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"chg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"chh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/tcommsat/computer) +"chi" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"chj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"chk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"chl" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"chm" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/closed/wall/r_wall/rust, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"chn" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/disposal/incinerator"; + dir = 8; + name = "Incinerator APC"; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cho" = ( +/turf/closed/wall/r_wall/rust, +/area/maintenance/department/eva) +"chp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"chq" = ( +/obj/machinery/pipedispenser/disposal/transit_tube, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"chr" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"chs" = ( +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cht" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"chu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"chv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"chw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"chx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"chy" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"chz" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"chA" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"chB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"chC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"chD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"chE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_cold) +"chF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/table, +/obj/item/analyzer, +/obj/item/pipe_dispenser, +/obj/item/wrench, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"chG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"chH" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall/rust, +/area/maintenance/fore) +"chI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"chJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/security) +"chK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/teg_cold) +"chL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"chM" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"chN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"chO" = ( +/obj/structure/table, +/obj/machinery/requests_console{ + department = "Atmospherics"; + departmentType = 4; + name = "Atmos RC"; + pixel_x = 30 + }, +/obj/item/clothing/head/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/clothing/glasses/welding, +/obj/item/multitool, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"chP" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"chQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"chR" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/mixing"; + dir = 1; + name = "Toxins Lab APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/science/storage) +"chS" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"chT" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/engine, +/area/science/storage) +"chU" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) +"chW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"chX" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"chY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/storage/hypospraykit/fire, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"chZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cia" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cib" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cic" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cid" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/item/analyzer, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cie" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_cold) +"cif" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cig" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cih" = ( +/obj/machinery/disposal/deliveryChute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cii" = ( +/obj/machinery/disposal/deliveryChute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cij" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + name = "Science Desk"; + req_one_access_txt = "29;47" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cik" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/mass_driver{ + dir = 8; + id = "router_in"; + name = "Router Driver" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cil" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cim" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 11 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cin" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cio" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/closed/wall, +/area/science/research{ + name = "Research Sector" + }) +"cip" = ( +/obj/machinery/mass_driver{ + id = "cargo_in"; + name = "Router Driver" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciq" = ( +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cir" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"cis" = ( +/obj/structure/sign/warning/vacuum{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cit" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ciu" = ( +/obj/structure/barricade/wooden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/poster/ripped{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"civ" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ciw" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"cix" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ciy" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ciz" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/item/reagent_containers/food/drinks/trophy, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"ciA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/port) +"ciB" = ( +/obj/structure/frame/computer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/airless, +/area/maintenance/port/fore) +"ciC" = ( +/obj/structure/table, +/obj/item/paper/pamphlet/gateway, +/turf/open/floor/plasteel/white, +/area/gateway) +"ciD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"ciE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"ciF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ciG" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "disposal_off" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/machinery/meter, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"ciI" = ( +/turf/closed/wall/r_wall/rust, +/area/quartermaster/warehouse) +"ciJ" = ( +/turf/closed/wall/rust, +/area/quartermaster/warehouse) +"ciK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"ciL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/primary) +"ciM" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor/auto{ + dir = 4; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciN" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/donkpockets{ + pixel_y = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "kitchenlock"; + name = "Kitchen Lockup" + }, +/obj/machinery/door/window/northleft{ + name = "Kitchen Slider"; + req_access_txt = "28" + }, +/obj/machinery/door/window/southleft{ + name = "Bar Slider"; + req_access_txt = "25" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/kitchen) +"ciO" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "disposal_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciP" = ( +/obj/effect/turf_decal/delivery, +/obj/item/weldingtool, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"ciQ" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/primary/aft"; + dir = 1; + name = "Aft Primary Hallway APC"; + pixel_x = 1; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"ciR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/airlock/security{ + name = "Cargo Security Checkpoint"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"ciS" = ( +/obj/machinery/conveyor/auto{ + dir = 9; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/radiation, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"ciU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"ciV" = ( +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciW" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 14 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ciX" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"ciY" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/wrench, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/teg_hot"; + dir = 8; + name = "Hot Loop APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"ciZ" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cja" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cjb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cjc" = ( +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/obj/machinery/door/poddoor{ + name = "Disposal Router" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cjd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cje" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cjf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Cargo Detainment Cell"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cjg" = ( +/obj/machinery/conveyor/auto{ + dir = 1; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cjh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cji" = ( +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 1; + id = "disposal" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cjj" = ( +/turf/closed/wall, +/area/crew_quarters/theatre/mime) +"cjk" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/theatre/mime) +"cjl" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/item/toy/figure/mime, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/theatre/mime) +"cjm" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/service) +"cjn" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen/backroom) +"cjo" = ( +/obj/structure/table, +/obj/item/flashlight/seclite, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"cjp" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/theatre/mime) +"cjq" = ( +/turf/closed/wall/rust, +/area/maintenance/port/central) +"cjr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/server{ + name = "Computer Core" + }) +"cjs" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cjt" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/office"; + dir = 1; + name = "Cargo Office APC"; + pixel_y = 24 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cju" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/table, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/item/clothing/ears/earmuffs, +/obj/item/extinguisher{ + pixel_x = -12; + pixel_y = -2 + }, +/obj/machinery/camera{ + c_tag = "Engineering - Hot Loop"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cjv" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/library) +"cjw" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/wood, +/area/library) +"cjx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"cjy" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/port/central) +"cjz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants/photosynthetic, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cjA" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cjB" = ( +/obj/item/stack/cable_coil/cut/red, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cjC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/clothing/mask/cigarette, +/obj/structure/sign/poster/official/twelve_gauge{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cjD" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall, +/area/maintenance/department/eva) +"cjE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cjF" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cjG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"cjH" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cjI" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"cjJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"cjK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_cold) +"cjL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"cjM" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/toolbox/mechanical, +/obj/item/radio/off, +/obj/item/multitool{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"cjN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Security - Visitation Area"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"cjO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"cjP" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cjQ" = ( +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"cjR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_one_access_txt = "58" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hos) +"cjS" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"cjT" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"cjU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"cjV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Engineering Sector" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cjW" = ( +/obj/structure/bed, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/item/bedsheet/hos, +/obj/effect/landmark/start/head_of_security, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "hos"; + name = "HoS Office Shutters"; + pixel_y = -32; + pixel_x = -5 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"cjX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/engine/teg_cold) +"cjY" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/keycard_auth{ + pixel_x = 8; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cjZ" = ( +/obj/item/beacon, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"cka" = ( +/obj/item/beacon, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ckb" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"ckc" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft/secondary"; + dir = 8; + name = "Aft Air Hookup APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"ckd" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cke" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/wood, +/area/library) +"ckf" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"ckg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/corner, +/area/ai_monitored/storage/eva) +"ckh" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cki" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ckj" = ( +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"ckk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/camera{ + c_tag = "Research Maintenance"; + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/department/science"; + dir = 8; + name = "Research Wing Maintenance APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"ckl" = ( +/turf/open/space/basic, +/area/space/station_ruins) +"ckm" = ( +/turf/closed/wall/r_wall, +/area/engine/teg_cold) +"ckn" = ( +/obj/machinery/door/airlock/external/glass{ + name = "External Solar Access"; + req_access_txt = "10;13" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"cko" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/engine/engineering"; + dir = 4; + name = "Engine Room APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"ckp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/table, +/obj/item/book/manual/wiki/robotics_cyborgs, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"ckq" = ( +/obj/structure/closet/crate/hydroponics, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"ckr" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cks" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"ckt" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cku" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"ckv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_one_access_txt = "10;31" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"ckw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"ckx" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cky" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"ckz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"ckA" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"ckB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate/engineering, +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/item/twohanded/rcl/pre_loaded, +/obj/item/twohanded/rcl/pre_loaded, +/obj/item/stack/cable_coil/red, +/obj/item/stack/cable_coil/red, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/machinery/camera{ + c_tag = "Engineering - Cold Loop"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"ckC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "gas to cold loop" + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"ckD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/crowbar/large, +/obj/item/multitool, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"ckE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"ckF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/teg_cold"; + dir = 4; + name = "Cold Loop APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"ckG" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ckH" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"ckI" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"ckJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/teg_hot) +"ckK" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/clothing/under/rank/cargo/miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ckL" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/clothing/under/rank/cargo/miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ckM" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/item/clothing/under/rank/cargo/miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ckN" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"ckO" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ckP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/lab) +"ckS" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"ckT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckU" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ckX" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"ckY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/checker, +/area/ai_monitored/storage/eva) +"ckZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ai_monitored/storage/eva) +"cla" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"clb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cld" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cle" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/misc_lab"; + dir = 1; + name = "Research Observatory APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"clf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 3"; + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"clg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"clh" = ( +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cli" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"clj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"clk" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cll" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/xenobiology) +"clm" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cln" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"clo" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"clp" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"clq" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"clr" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"cls" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"clt" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"clu" = ( +/obj/machinery/door/window/northleft{ + name = "Library Desk Door"; + req_access_txt = "37" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"clv" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/storage/box/syringes, +/obj/item/reagent_containers/dropper, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"clw" = ( +/obj/effect/landmark/start/librarian, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"clx" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cly" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"clz" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"clA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"clB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"clC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"clD" = ( +/obj/machinery/telecomms/server/presets/medical, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clE" = ( +/obj/machinery/ntnet_relay, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clF" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clG" = ( +/obj/machinery/telecomms/server/presets/engineering, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clH" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"clI" = ( +/obj/machinery/telecomms/bus/preset_four, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clJ" = ( +/obj/machinery/telecomms/broadcaster/preset_left, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clK" = ( +/obj/machinery/telecomms/processor/preset_four, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clL" = ( +/obj/machinery/telecomms/bus/preset_two, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clM" = ( +/obj/machinery/telecomms/broadcaster/preset_right, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clN" = ( +/obj/machinery/telecomms/processor/preset_two, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"clO" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Electrical Substation"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"clP" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/amplifier, +/obj/item/stock_parts/subspace/amplifier, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clQ" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/crystal, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clR" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/transmitter, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clS" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clT" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clU" = ( +/obj/structure/table, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"clV" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Supply - Security Post"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"clW" = ( +/turf/closed/wall/rust, +/area/storage/tech) +"clX" = ( +/turf/closed/wall/rust, +/area/maintenance/starboard/aft) +"clY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/firecloset, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"clZ" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Port"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cma" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Escape Hall - Starboard"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cmb" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Supply - Mining Dock"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cmc" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Starboard Quarter Solar Maintenance"; + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"cmd" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cme" = ( +/obj/structure/bed, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cmf" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cmg" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cmh" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"cmi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmj" = ( +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cml" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cmm" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cmn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cmo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cmp" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmr" = ( +/obj/machinery/gravity_generator/main/station, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cms" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmt" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cmu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cmv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cmw" = ( +/obj/machinery/camera{ + c_tag = "Engineering - Gravity Generator"; + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/gravity_generator) +"cmx" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/engine/gravity_generator) +"cmy" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"cmz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"cmA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Bar Backroom"; + req_access_txt = "25" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"cmB" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; + dir = 4; + name = "Robotics Lab APC"; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cmC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"cmD" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/deliveryChute, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cmE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cmF" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"cmG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cmH" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "cargoblock"; + name = "Cargo Router" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cmI" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/radio/off{ + pixel_x = -3; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cmJ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Mining Dock"; + req_one_access_txt = "10;24;48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cmL" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/aft) +"cmM" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cmN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/item/radio/intercom{ + frequency = 1359; + name = "Station Intercom (Security)"; + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"cmO" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Engineering" + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cmP" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"cmQ" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 4"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cmR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cmS" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"cmT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/folder/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/window/northright{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cmU" = ( +/obj/machinery/camera{ + c_tag = "Medbay - Lobby"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cmV" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cmW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Cargo"; + name = "Cargo RC"; + pixel_x = -30 + }, +/obj/machinery/camera{ + c_tag = "Supply - Quartermaster's Office"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"cmX" = ( +/obj/machinery/light/small, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"cmY" = ( +/obj/machinery/door/airlock/engineering{ + name = "Hot Loop"; + req_one_access_txt = "10;24" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cmZ" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/atmospherics/components/unary/cryo_cell{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cna" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/atmospherics/components/unary/cryo_cell{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cnb" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/box/beakers{ + pixel_x = -4 + }, +/obj/item/storage/box/syringes{ + pixel_x = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cnc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cnd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cne" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cnf" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cng" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"cnh" = ( +/obj/machinery/door/airlock/engineering{ + name = "Cold Loop"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cni" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cnj" = ( +/obj/machinery/camera{ + c_tag = "Research - Observatory"; + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cnk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cnl" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + pixel_x = 5 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cnm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/gateway) +"cnn" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"cno" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cnp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/bridge) +"cnq" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/mob/living/simple_animal/cockroach, +/turf/open/floor/plating, +/area/maintenance/port/central) +"cnr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cns" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cnt" = ( +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + dir = 8; + id = "disposal" + }, +/obj/machinery/door/poddoor{ + name = "Disposal Router" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cnu" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/gateway) +"cnv" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/frame/computer, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cnw" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cnx" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cny" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cnA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cnB" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cnC" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/engine, +/area/science/explab) +"cnD" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/science/xenobiology) +"cnE" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 9; + height = 22; + id = "emergency_home"; + name = "CogStation Escape Dock"; + width = 29 + }, +/turf/open/space/basic, +/area/space) +"cnF" = ( +/obj/structure/disposalpipe/segment, +/obj/item/reagent_containers/food/drinks/bottle/kahlua/empty, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) +"cnG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/solar/port) +"cnH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/port) +"cnI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/port) +"cnJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/port) +"cnK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cnL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnO" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/science/storage) +"cnP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/solar/starboard/aft) +"cnS" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = /area/maintenance/solars/starboard/aft; + dir = 1; + name = "Starboard Quarter Solars APC"; + pixel_y = 26 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"cnT" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/mixing) +"cnU" = ( +/obj/machinery/door/poddoor/incinerator_toxmix, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"cnV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/engine, +/area/science/storage) +"cnW" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/library) +"cnX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/vehicle/ridden/wheelchair, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cnY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/vehicle/ridden/wheelchair, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cnZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/holopad, +/obj/machinery/requests_console{ + department = "Medbay"; + departmentType = 1; + name = "Medbay RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"coa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cob" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/sign/warning/biohazard{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"coc" = ( +/obj/machinery/camera{ + c_tag = "Medbay - Reception"; + dir = 4 + }, +/turf/open/floor/plasteel/stairs, +/area/medical/medbay/central) +"cod" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/medical/medbay/lobby) +"coe" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/camera{ + c_tag = "Medbay Morgue"; + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"cof" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cog" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"coh" = ( +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/storage_shared{ + name = "Electrical Substation" + }) +"coi" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coj" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cok" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"col" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"com" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Robotics Storage"; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"con" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/station_engineer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/storage/primary) +"coo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/storage/primary) +"cop" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "CEPrivacy"; + name = "CE Privacy Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"coq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cor" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cos" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Workshop"; + req_access_txt = "11" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cot" = ( +/obj/machinery/computer/apc_control{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cou" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/chief_engineer, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cov" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/robotics/lab) +"cow" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Asteroid Mining Access"; + req_one_access_txt = "10;48" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cox" = ( +/obj/machinery/vending/wardrobe/robo_wardrobe, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"coy" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"coz" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coA" = ( +/obj/structure/closet/emcloset, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Starboard Quarter"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"coB" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Aft Hallway - MedSci Port"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coC" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Starboard Bow"; + pixel_x = 22 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"coD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coE" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Aft Hall - MedSci Starboard"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coF" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/landmark/start/assistant, +/obj/machinery/camera{ + c_tag = "Aft Hall - Workshop"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coG" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research - Experimentation Lab"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/engine, +/area/science/explab) +"coH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/medical/chemistry) +"coI" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/gateway) +"coJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Virology Access"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/medical/virology) +"coK" = ( +/obj/machinery/camera{ + c_tag = "Medbay - Monkey Pen"; + dir = 4 + }, +/mob/living/carbon/monkey, +/turf/open/floor/grass, +/area/medical/virology) +"coL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=cargo"; + location = "eng2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coM" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"coN" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"coO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Central Hall"; + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/central) +"coP" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/machinery/camera{ + c_tag = "Central Plaza - Port"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"coQ" = ( +/obj/machinery/camera{ + c_tag = "Central Docking Bay" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"coR" = ( +/obj/machinery/camera{ + c_tag = "Ferry Docking Bay"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"coS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Ferry Docking Bay - Starboard"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"coT" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"coU" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Security - Front Desk"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) +"coV" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera{ + c_tag = "Medbay Entrance"; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"coW" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/engineering, +/obj/machinery/camera{ + c_tag = "Technical Storage"; + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/tech) +"coX" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay - Operating Theatre"; + dir = 8; + network = list("ss13","medbay"); + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"coY" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/machinery/camera{ + c_tag = "Medbay - Cryogenics"; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"coZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cpa" = ( +/obj/structure/closet/crate/radiation, +/obj/item/storage/firstaid/radbgone, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpb" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/warning/biohazard{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/medical/virology) +"cpc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cpd" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/crew_quarters/fitness) +"cpe" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/engine, +/area/science/explab) +"cpf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cpg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cph" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cpi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cpj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cpk" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpl" = ( +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cpm" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/lawoffice) +"cpn" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cpo" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpp" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto{ + id = "cargo" + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/preopen{ + id = "cargoblock"; + name = "Cargo Router" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cpq" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/blue, +/area/crew_quarters/abandoned_gambling_den{ + name = "Arcade" + }) +"cpr" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cps" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"cpt" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"cpu" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/wood, +/area/library) +"cpv" = ( +/obj/structure/table, +/obj/machinery/newscaster{ + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cpw" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/screwdriver, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Research - Chemistry Lab"; + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Chemistry"; + departmentType = 1; + name = "Chemistry RC"; + pixel_x = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cpx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"cpy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cpz" = ( +/turf/closed/wall/r_wall, +/area/medical/virology) +"cpA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpB" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"cpC" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space/station_ruins) +"cpD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/engine, +/area/science/storage) +"cpE" = ( +/obj/structure/fans/tiny, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cpF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"cpH" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -32 + }, +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -40 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cpI" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cpJ" = ( +/turf/closed/wall/r_wall/rust, +/area/quartermaster/office) +"cpK" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cpL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cpM" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cpN" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/item/cartridge/atmos, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"cpO" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/item/cartridge/atmos, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"cpP" = ( +/obj/machinery/camera{ + c_tag = "Research - Gateway Atrium"; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"cpQ" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/effect/turf_decal/stripes/line{ + dir = 6; + layer = 2.03 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"cpR" = ( +/obj/structure/closet/crate/engineering/electrical, +/obj/item/electronics/apc, +/obj/item/electronics/apc, +/obj/item/electronics/airalarm, +/obj/item/electronics/airalarm, +/obj/item/electronics/firelock, +/obj/item/electronics/firelock, +/obj/item/electronics/firealarm, +/obj/item/electronics/firealarm, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpS" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpT" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpV" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cpW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cpX" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/engine/air, +/area/engine/atmos) +"cpY" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_hot) +"cpZ" = ( +/obj/structure/table, +/obj/item/tank/internals/air, +/obj/item/clothing/mask/gas, +/turf/open/floor/plasteel/dark, +/area/engine/teg_hot) +"cqa" = ( +/obj/machinery/autolathe, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqb" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cqc" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqd" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/mob/living/simple_animal/hostile/retaliate/goose{ + check_friendly_fire = 1; + desc = "It may not be as wise as an owl, but the Head of Security's pet is far more dangerous."; + faction = list("neutral","silicon","turret","station"); + name = "Officer Snooty" + }, +/turf/open/floor/plasteel, +/area/security/main) +"cqe" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=eng1"; + location = "sci" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cqf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cqg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cqh" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cqi" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cqj" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cqk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=med"; + location = "cargo" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cql" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=eng2"; + location = "evac" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cqm" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/item/storage/box/disks_nanite, +/obj/item/book/manual/wiki/research_and_development{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cqn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Warehouse"; + req_one_access_txt = "10;24" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqr" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/central"; + name = "Central Starboard Maintenance APC"; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"cqs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/clipboard, +/obj/item/paper/guides/jobs/engi/solars, +/obj/item/pen, +/obj/machinery/camera{ + c_tag = "Engineering Foyer - Port"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqt" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/noticeboard/qm{ + dir = 4; + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cqu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/atmos_alert, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/disposal/bin, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqz" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/clothing/gloves/color/latex, +/obj/item/book/manual/wiki/cit/chem_recipies, +/obj/item/book/manual/wiki/cit/chemistry{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/obj/item/paper/fluff/cogstation/chemists, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cqA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/absinthe, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"cqC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqE" = ( +/obj/machinery/conveyor_switch{ + id = "EngiCargoConveyer" + }, +/obj/machinery/button/door{ + id = "EngiDeliverDoor"; + name = "Engineering Delivery Door Control"; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqF" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cqG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqH" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) +"cqI" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/atmospheric_technician, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqK" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/plaques/atmos{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cqL" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqN" = ( +/turf/closed/wall/rust, +/area/maintenance/department/security) +"cqO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cqP" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cqQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cqR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cqS" = ( +/obj/machinery/computer/rdconsole/experiment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_x = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cqT" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cqU" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cqV" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cqW" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cqX" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 5; + height = 7; + id = "supply_home"; + name = "Cargo Shuttle"; + width = 12 + }, +/turf/open/space/basic, +/area/space) +"cqY" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/status_display{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cqZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Medbay"; + departmentType = 1; + name = "Medbay RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cra" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Auxiliary Tool Storage" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/tools) +"crb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/turf/open/floor/plating, +/area/engine/teg_cold) +"crc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"crd" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/item/destTagger, +/obj/item/destTagger, +/obj/item/destTagger, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_y = 32 + }, +/obj/machinery/button/massdriver{ + id = "cargo_out"; + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cre" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Asteroid Mining Access"; + req_one_access_txt = "10;48" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"crf" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/medical/chemistry"; + name = "Chemistry Lab APC"; + pixel_y = -26 + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"crg" = ( +/obj/structure/reagent_dispensers/fueltank/high, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"crh" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "cargo_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cri" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"crj" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"crk" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"crl" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"crm" = ( +/obj/machinery/door/firedoor, +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "EngiCargoConveyer" + }, +/obj/machinery/door/poddoor{ + id = "EngiDeliverDoor"; + name = "Engineering Delivery Door" + }, +/turf/open/floor/plating, +/area/engine/teg_cold) +"cro" = ( +/turf/closed/wall/r_wall/rust, +/area/maintenance/starboard/aft) +"crp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/storage/tech) +"crq" = ( +/obj/structure/closet/crate/freezer, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; + dir = 4; + name = "Morgue APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"crr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Central Hall - Fore"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"crs" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/engine, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"crt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cru" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"crv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"crw" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"crx" = ( +/obj/machinery/camera{ + c_tag = "Engine Room - Port Quarter"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cry" = ( +/obj/structure/bookcase/random/religion, +/obj/effect/turf_decal/bot, +/turf/open/floor/wood, +/area/library) +"crz" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite"; + dir = 1; + network = list("tcomms") + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"crA" = ( +/obj/structure/bookcase/random/fiction, +/obj/effect/turf_decal/bot, +/turf/open/floor/wood, +/area/library) +"crB" = ( +/obj/structure/lattice, +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior - Port"; + dir = 8; + network = list("tcomms") + }, +/turf/open/space/basic, +/area/space/nearstation) +"crC" = ( +/obj/structure/lattice, +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior Starboard"; + dir = 4; + network = list("tcomms") + }, +/turf/open/space/basic, +/area/space/nearstation) +"crD" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Server Room"; + dir = 1; + network = list("tcomms") + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"crE" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior - Port Quarter"; + network = list("tcomms") + }, +/turf/open/space/basic, +/area/space) +"crF" = ( +/obj/machinery/camera/motion{ + c_tag = "Telecomms Satellite Exterior - Starboard Quarter"; + network = list("tcomms"); + pixel_x = 22 + }, +/turf/open/space/basic, +/area/space) +"crG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"crH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"crI" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/mixing) +"crJ" = ( +/obj/structure/window/reinforced, +/obj/machinery/mass_driver{ + dir = 8; + id = "toxinsdriver" + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/mixing) +"crK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"crL" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/science/test_area) +"crM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/science/test_area) +"crN" = ( +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"crO" = ( +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"crP" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/hallway/secondary/entry) +"crQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"crR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"crS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Pod" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"crT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"crU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/crowbar, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"crV" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"crW" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"crX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"crY" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"crZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/hallway/primary/aft) +"csa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/sign/warning/pods{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"csb" = ( +/obj/structure/sign/warning/pods{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"csc" = ( +/obj/structure/fans/tiny/invisible, +/obj/docking_port/stationary{ + dir = 2; + dwidth = 1; + height = 4; + name = "escape pod loader"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/space/basic, +/area/space) +"csd" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cse" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/item/clipboard, +/obj/item/paper/monitorkey, +/obj/item/pen/fountain, +/obj/item/stamp/ce, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Engineer's Desk"; + departmentType = 5; + name = "Chief Engineer's RC"; + pixel_y = -32 + }, +/mob/living/simple_animal/parrot/Poly, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"csf" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Research Director's Desk"; + departmentType = 5; + name = "Research Director's RC"; + pixel_y = -32; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"csg" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"csh" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"csi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"csj" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"csk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"csl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"csm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"csn" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/main) +"cso" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"csp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_x = 28 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"csq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Cold Loop"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"csr" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Bridge"; + departmentType = 5; + name = "Bridge RC"; + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/bridge) +"css" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"cst" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/teg_cold) +"csu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/gateway) +"csv" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/item/storage/toolbox/mechanical, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/paper/guides/cogstation/letter_supp, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"csw" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) +"csx" = ( +/obj/structure/closet/secure_closet/RD, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/paper/fluff/cogstation/letter_rd, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"csy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/xmastree, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "chapel" + }, +/area/chapel/main) +"csz" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"csA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Visitation" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) +"csB" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"csC" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating/asteroid, +/area/hydroponics/garden{ + name = "Nature Preserve" + }) +"csD" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/bridge) +"csE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hop) +"csF" = ( +/obj/structure/bed, +/obj/effect/landmark/start/research_director, +/obj/item/bedsheet/rd, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"csG" = ( +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/lawoffice) +"csH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/library) +"csI" = ( +/obj/structure/table/wood, +/obj/machinery/light_switch{ + pixel_x = 4; + pixel_y = -24 + }, +/obj/item/flashlight/lamp/green, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -6; + pixel_y = -32 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"csJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"csK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/science/robotics/lab) +"csL" = ( +/obj/effect/landmark/xmastree/rdrod, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"csM" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"csN" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"csO" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"csP" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"csQ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"csR" = ( +/turf/open/floor/engine, +/area/science/storage) +"csS" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"csT" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/circuit) +"csU" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/storage/tech) +"csV" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"csW" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"csX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"csY" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"csZ" = ( +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cta" = ( +/obj/effect/landmark/blobstart, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/engine, +/area/science/xenobiology) +"ctb" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/engine, +/area/science/explab) +"ctc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ctd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cte" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctf" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctg" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cth" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cti" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctj" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/mixing) +"ctk" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ctl" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel, +/area/engine/workshop) +"ctm" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 2 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctn" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/obj/item/paper/guides/cogstation/letter_chief, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cto" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctq" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/quartermaster/office) +"cts" = ( +/obj/structure/rack, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"ctt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"ctu" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/machinery/camera{ + c_tag = "Supply - Cargo Office"; + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/item/storage/box/disks, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"ctv" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"ctw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"ctx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cty" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ctz" = ( +/obj/structure/table, +/obj/item/stamp/qm, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/coin/silver{ + pixel_x = -12 + }, +/obj/item/key{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"ctA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_one_access_txt = "31;48" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ctB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ctC" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ctD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/medical/virology) +"ctE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/plasteel, +/area/engine/workshop) +"ctF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/medical/virology) +"ctG" = ( +/turf/closed/wall, +/area/engine/workshop) +"ctH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"ctI" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/engine, +/area/science/explab) +"ctJ" = ( +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/engine/workshop) +"ctK" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"ctL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 5"; + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"ctM" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Pen 6"; + dir = 8; + pixel_y = -22 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"ctN" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ctO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ctP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ctQ" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"ctR" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"ctS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/biohazard{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ctT" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Aft"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"ctU" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"ctV" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/secondary/exit"; + name = "Escape Shuttle Hallway APC"; + pixel_y = -28 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/exit) +"ctW" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ctX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/toolcloset, +/turf/open/floor/plasteel, +/area/engine/workshop) +"ctY" = ( +/obj/structure/sign/departments/xenobio{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"ctZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cua" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cub" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cuc" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Monkey Pen"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cud" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology - Aft Access"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cue" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Lab"; + req_access_txt = "8;55" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cuf" = ( +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cug" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cuh" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cui" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cuj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cuk" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cul" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cum" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/poster/official/science{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cun" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/meat/steak, +/obj/machinery/camera{ + c_tag = "Xenobiology - Test Chamber"; + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cuo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"cup" = ( +/obj/structure/table, +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 16 + }, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/cautery, +/obj/item/clothing/gloves/color/latex, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cuq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cur" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cus" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cut" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 7; + height = 9; + id = "whiteship_home"; + name = "SS13: Merchant Dock"; + width = 13 + }, +/turf/open/space/basic, +/area/space) +"cuu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/toolcloset, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuv" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cuw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cux" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"cuy" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cuz" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cuA" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cuB" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cuC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cuD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cuE" = ( +/obj/structure/lattice, +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES"; + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cuF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cuH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/item/storage/toolbox/emergency, +/obj/item/screwdriver, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/screwdriver, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/workshop"; + dir = 1; + name = "Engineering Workshop APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall, +/area/engine/workshop) +"cuO" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/storage/primary) +"cuP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cuQ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"cuR" = ( +/turf/closed/wall, +/area/router/air) +"cuS" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/mass_driver{ + dir = 1; + id = "workshop_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cuT" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/machinery/conveyor{ + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cuU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/sign/poster/official/build{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuV" = ( +/turf/open/floor/plasteel, +/area/engine/workshop) +"cuW" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cuX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cuY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Chemistry Lab"; + req_access_txt = "8;33;47" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"cuZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cva" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cvb" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cvc" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cvd" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cve" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cvf" = ( +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cvg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cvh" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/computer/rdconsole/production{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cvi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/workshop) +"cvj" = ( +/obj/machinery/light_switch{ + pixel_x = -24 + }, +/obj/machinery/conveyor{ + id = "DeliveryConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cvk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "DeliveryConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cvl" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/router/air) +"cvm" = ( +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Airbridge Router APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cvn" = ( +/obj/structure/table, +/obj/item/destTagger, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/router/air) +"cvo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cvp" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/cargo/request, +/obj/machinery/camera{ + c_tag = "Airbridge Router"; + pixel_x = 22 + }, +/obj/machinery/requests_console{ + department = "Airbridge Router"; + name = "Airbridge Router RC"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cvq" = ( +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor{ + dir = 1; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cvr" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/workshop) +"cvs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/medical/virology) +"cvt" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cvu" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cvv" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Genetics"; + name = "Genetics RC"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cvw" = ( +/obj/structure/closet, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/item/wrench/medical, +/obj/item/screwdriver, +/obj/item/stock_parts/cell/high/plus, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cvx" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/item/hypospray/mkii/tricord, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cvy" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cvz" = ( +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 4; + node1_concentration = 0.8; + node2_concentration = 0.2; + on = 1; + target_pressure = 4500 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cvA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/warning/securearea{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cvB" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/machinery/porta_turret/ai{ + dir = 1; + req_access = list(16) + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cvC" = ( +/obj/machinery/computer/nanite_cloud_controller, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plasteel/dark, +/area/science/server{ + name = "Computer Core" + }) +"cvD" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/rnd/server, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cvE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor{ + id = "RDServer"; + name = "RD Server Lockup" + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cvF" = ( +/obj/item/caution, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cvG" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Lab Access"; + req_access_txt = "55" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cvH" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Toxins Mixing Lab"; + req_access_txt = "7;8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cvI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/telecomms/server{ + dir = 1; + network = "tcommsat" + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"cvJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"cvK" = ( +/obj/structure/chair/sofa/right, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/bridge) +"cvL" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cvM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/gateway) +"cvN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cvO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cvP" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Custodial Closet"; + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cvQ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/chair/office/light, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cvR" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/head/welding, +/obj/item/clothing/glasses/welding, +/obj/item/weldingtool, +/obj/machinery/camera{ + c_tag = "Robotics"; + dir = 8; + network = list("ss13","medbay"); + pixel_y = -22 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cvS" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/clothing/glasses/science, +/obj/item/hand_labeler{ + pixel_y = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cvT" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall, +/area/medical/medbay/central) +"cvU" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/reagent_dispensers/virusfood{ + pixel_x = -32 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cvV" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cvW" = ( +/obj/structure/chair/comfy/black, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cvX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Lab"; + req_access_txt = "8;55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cvY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Lab Access"; + req_access_txt = "55" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cvZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/clipboard, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stamp, +/obj/machinery/door/window/southright{ + name = "Customs Desk"; + req_access_txt = "57" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"cwa" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/flashlight/lamp, +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"cwb" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Research Maintenance"; + req_one_access_txt = "12;47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/science/research{ + name = "Research Sector" + }) +"cwc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/button/door{ + id = "cargoblock"; + name = "Router Access Control"; + pixel_x = -24; + pixel_y = 24; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cwd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) +"cwe" = ( +/obj/structure/closet/secure_closet/exile, +/turf/open/floor/plasteel/white, +/area/gateway) +"cwf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cwg" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cwh" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwi" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/virology) +"cwk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/lounge) +"cwl" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/book/manual/wiki/infections, +/obj/item/folder/white, +/obj/machinery/requests_console{ + department = "Virology"; + name = "Virology RC"; + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwm" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwo" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/microwave, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/virology) +"cwq" = ( +/obj/machinery/door/airlock/engineering{ + name = "Hot Loop"; + req_one_access_txt = "10;24" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cwr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cws" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cwt" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"cwu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cwv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cww" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cwx" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plating, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cwz" = ( +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"cwA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"cwB" = ( +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwC" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cwD" = ( +/obj/structure/transit_tube/diagonal/topleft, +/turf/open/space/basic, +/area/space) +"cwE" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cwF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwH" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, +/area/crew_quarters/toilet/restrooms) +"cwI" = ( +/obj/structure/transit_tube/horizontal, +/turf/open/space/basic, +/area/space) +"cwJ" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/horizontal, +/turf/open/space/basic, +/area/space/nearstation) +"cwK" = ( +/obj/structure/transit_tube/crossing/horizontal, +/turf/open/space/basic, +/area/space) +"cwL" = ( +/obj/structure/transit_tube/horizontal, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"cwM" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/transit_tube/station/reverse/flipped, +/obj/structure/transit_tube_pod{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cwN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"cwO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cwP" = ( +/obj/structure/bed, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/landmark/start/chief_engineer, +/obj/item/bedsheet/ce, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/chief"; + dir = 4; + name = "Chief Engineer's Office APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"cwQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/storage/primary) +"cwR" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cwS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Warehouse"; + req_access_txt = "11" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cwT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/virology) +"cwU" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/hallway/primary/central) +"cwV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cwW" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cwX" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cwY" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/air_sensor/atmos/toxins_mixing_tank, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"cwZ" = ( +/obj/structure/table, +/obj/item/storage/box/beanbag, +/obj/item/gun/ballistic/revolver/doublebarrel, +/obj/item/storage/hypospraykit/toxin, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"cxa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cxb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cxc" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cxd" = ( +/obj/machinery/computer/monitor, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cxe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxf" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cxg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cxh" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cxi" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/item/extinguisher, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Engineering - Primary Tool Storage"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cxj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/reagent_dispensers/foamtank, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cxk" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cxl" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/storage/primary) +"cxm" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cxn" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/item/t_scanner{ + pixel_x = -4 + }, +/obj/item/pipe, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/quartermaster/warehouse) +"cxo" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "Supply - Warehouse Aft"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/mob/living/simple_animal/bot/floorbot, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxs" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/item/storage/toolbox/electrical, +/obj/item/hand_labeler, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cxt" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cxu" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cxv" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_one_access_txt = "10;31" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cxy" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/quartermaster/storage) +"cxz" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Cargo Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxE" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxI" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxK" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxM" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxN" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxO" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxR" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxT" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/paper/guides/cogstation/letter_supp, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cxV" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cxW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Starboard Quarter Maintenance"; + req_one_access_txt = "12;48" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/quartermaster/office) +"cxX" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cxY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cxZ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/button/door{ + id = "MiningConveyorBlastDoor"; + name = "Mining Conveyor Access"; + pixel_x = 8; + pixel_y = -24; + req_one_access_txt = "10;24;48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cya" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cyb" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cyc" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Mining Dock"; + req_one_access_txt = "10;24;48" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cyd" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cye" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cyf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cyg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cyh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Office Maintenance"; + req_one_access_txt = "10;24;48" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"cyi" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 8; + icon_state = "intact" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cyj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cyk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cyl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cym" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cyn" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cyo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"cyp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cyq" = ( +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/power/apc{ + name = "Restrooms APC"; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cyr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cys" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cyt" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyu" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Port"; + pixel_x = 22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cyw" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cyx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cyy" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Medbay Lobby" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white/side, +/area/medical/medbay/lobby) +"cyz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cyA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cyB" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cyE" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cyF" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cyG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cyH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/medical/medbay/lobby) +"cyI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"cyK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cyL" = ( +/obj/structure/closet/cardboard, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyM" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Robotics Lab Maintenance"; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/science/robotics/lab) +"cyO" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyR" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyS" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyU" = ( +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Central Starboard"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cyV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"cyW" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cyX" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cyY" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"cyZ" = ( +/obj/machinery/computer/arcade, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"cza" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"czb" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/paicard, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) +"czc" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/cafeteria, +/area/hallway/secondary/exit) +"czd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cze" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/gateway) +"czg" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/mob/living/simple_animal/hostile/retaliate/bat, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"czh" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"czi" = ( +/obj/structure/bed, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/effect/landmark/start/chief_medical_officer, +/obj/item/bedsheet/cmo, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"czj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"czk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"czl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Aft Maintenance"; + req_access_txt = "12" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit) +"czm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czp" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czq" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/food/drinks/coffee, +/obj/item/pen/blue, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czr" = ( +/obj/structure/table/glass, +/obj/item/storage/toolbox/emergency, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"czu" = ( +/obj/machinery/suit_storage_unit/cmo, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"czv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Morgue"; + req_access_txt = "5;29" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"czw" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"czz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Gateway Chamber"; + req_access_txt = "62" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/gateway) +"czA" = ( +/obj/machinery/modular_computer/console/preset/research{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/coffee, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"czB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"czC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"czE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"czF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 23 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"czG" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"czI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czJ" = ( +/obj/item/beacon, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"czK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"czL" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"czM" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"czN" = ( +/obj/structure/closet/crate/trashcart, +/obj/structure/sign/departments/custodian{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel) +"czO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Waste Disposal"; + req_one_access_txt = "12;50" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"czP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"czQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"czR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/chapel) +"czS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"czT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"czU" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/janitor) +"czV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"czW" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"czX" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/rust, +/area/maintenance/disposal) +"czY" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/janitor) +"czZ" = ( +/obj/effect/landmark/start/janitor, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAa" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/structure/chair/sofa/right, +/obj/item/reagent_containers/food/drinks/bottle/vermouth/empty, +/obj/item/reagent_containers/food/snacks/grown/cannabis{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAb" = ( +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/chair/sofa/left, +/obj/item/storage/box/hug/medical, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cAd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cAe" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAg" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAh" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Custodial Closet"; + req_access_txt = "12;26" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/reagent_containers/pill/floorpill, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/stack/tile/plasteel{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/item/camera, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cAn" = ( +/obj/structure/disposalpipe/junction/flip, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cAo" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/northright{ + name = "Medbay Desk"; + req_access_txt = "5" + }, +/obj/item/clipboard, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/paper/fluff/cogstation/sleepers, +/obj/item/pen, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cAp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cAq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"cAs" = ( +/obj/structure/mopbucket, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/janitor) +"cAt" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/window/southleft{ + name = "Cloning Access"; + req_one_access_txt = "9;45" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cAu" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cAv" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/medical/medbay/central) +"cAw" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/soap, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/structure/disposalpipe/segment, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/machinery/requests_console{ + department = "Custodial Closet"; + name = "Custodial RC"; + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAx" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/landmark/start/janitor, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cAy" = ( +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cAz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cAA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall, +/area/storage/primary) +"cAB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cAD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation Room A"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/caution, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cAG" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAH" = ( +/obj/structure/table, +/obj/item/storage/box/beakers, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cAJ" = ( +/obj/structure/table/wood, +/obj/item/storage/book/bible/booze, +/obj/item/beacon{ + pixel_y = -8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"cAK" = ( +/obj/machinery/computer/med_data, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAL" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/detectives_office) +"cAM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cAN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cAO" = ( +/obj/effect/landmark/start/detective, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cAP" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes, +/obj/item/lighter{ + pixel_x = -4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = -30 + }, +/obj/machinery/camera{ + c_tag = "Detective's Office"; + dir = 1 + }, +/obj/item/reagent_containers/food/drinks/bottle/hcider{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cAQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"cAR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"cAS" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/gateway) +"cAT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"cAU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cAV" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cAW" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cAX" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cAY" = ( +/obj/machinery/door/airlock{ + name = "Catering"; + req_one_access_txt = "25;28" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"cAZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cBa" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cBb" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/main) +"cBc" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cBe" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBg" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBh" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBi" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBj" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cBl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Power Monitoring"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes{ + name = "Power Monitoring" + }) +"cBm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/rnd/production/techfab/department/engineering, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cBn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBp" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cBq" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBr" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"cBs" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"cBt" = ( +/obj/structure/closet/l3closet/scientist, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"cBu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/sign/departments/security{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBv" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"cBx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBz" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"cBA" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Aft Hall - Fore"; + pixel_x = 22 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cBB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cBC" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary{ + name = "Aft Air Hookup" + }) +"cBD" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cBE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBF" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"cBG" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cBH" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBI" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBJ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/power/apc{ + name = "Engineering Foyer APC"; + pixel_y = -24 + }, +/obj/item/storage/firstaid/regular, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cBK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBL" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cBM" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBN" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBO" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBP" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBQ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBR" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBS" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"cBT" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cBU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/crew_quarters/bar) +"cBV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cBW" = ( +/obj/structure/sign/plaques/golden{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cBX" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cBY" = ( +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/carpet/green, +/area/crew_quarters/bar) +"cBZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cCa" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCb" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/sign/departments/security{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cCc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical{ + name = "Medical Booth" + }) +"cCe" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cCf" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Central Maintenance - Fore"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/central) +"cCg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cCi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology/glass{ + name = "Monkey Pen"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cCl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/medical/virology) +"cCm" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCn" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/port/fore) +"cCo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cCp" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/port/fore) +"cCq" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/hallway/primary/central) +"cCr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cCs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"cCt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Chapel Confessions"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) +"cCu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/virology) +"cCv" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cCw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/virology) +"cCx" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCy" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/caution, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation Room B"; + req_access_txt = "39" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cCA" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"cCB" = ( +/obj/machinery/light, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/office) +"cCC" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/chapel/main) +"cCD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cCE" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cCF" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "recycler"; + name = "Recycler Conveyor Control" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cCG" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cCH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cCI" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cCJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"cCK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Library Access" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/library) +"cCL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cCM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/junction, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=bridge1"; + location = "router" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cCN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/left, +/area/hallway/primary/central) +"cCO" = ( +/obj/structure/table, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/item/hand_labeler, +/obj/item/reagent_containers/glass/bottle/formaldehyde, +/obj/item/paper/guides/jobs/medical/morgue, +/obj/item/paper/guides/cogstation/cdn_med{ + pixel_x = -6; + pixel_y = 1 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"cCP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"cCQ" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/light, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cCR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cCS" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cCT" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/stairs/medium, +/area/hallway/primary/aft) +"cCU" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cCV" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plating, +/area/maintenance/department/security) +"cCW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"cCX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"cCY" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cCZ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDa" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDb" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/glasses/science, +/obj/item/pen, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cDc" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/structure/bedsheetbin, +/obj/item/clothing/glasses/hud/health, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cDd" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cDe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cDf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/medical/virology) +"cDg" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + id = "DeliveryConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cDh" = ( +/obj/machinery/computer/card/minor/cmo{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_x = -24 + }, +/obj/item/paper/guides/cogstation/letter_cmo, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cDi" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/closet/crate/solarpanel_small, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cDj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cDk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) +"cDl" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cDm" = ( +/obj/structure/plasticflaps, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "DeliveryConveyer" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cDn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/router/air) +"cDo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/router/air) +"cDp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"cDq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"cDr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/security/courtroom) +"cDs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/dark/side, +/area/bridge) +"cDt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"cDu" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"cDv" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"cDw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"cDx" = ( +/obj/machinery/light_switch{ + pixel_x = -4; + pixel_y = 24 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 6; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet/blue, +/area/crew_quarters/heads/captain) +"cDy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"cDz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"cDA" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/machinery/newscaster/security_unit{ + pixel_x = 30 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cDB" = ( +/obj/item/storage/secure/safe{ + pixel_x = -24 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/dresser, +/obj/item/storage/lockbox/medal, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"cDC" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/captain) +"cDD" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/supply"; + dir = 4; + name = "Cargo Security Checkpoint APC"; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cDE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cDF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cDG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cDH" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/gateway) +"cDI" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/gateway) +"cDJ" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cDK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Gateway Chamber"; + req_access_txt = "62" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/gateway) +"cDN" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/gateway) +"cDO" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDR" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cDS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cDT" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/gateway) +"cDU" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cDV" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Gateway Atrium"; + req_access_txt = "62" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/gateway) +"cDW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cDX" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cDY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/heads/hor) +"cDZ" = ( +/obj/structure/table, +/obj/machinery/computer/med_data/laptop, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Medical Officer's Desk"; + departmentType = 5; + name = "Chief Medical Officer RC"; + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cEa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cEb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Research Director's Office"; + req_access_txt = "30" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) +"cEc" = ( +/obj/effect/turf_decal/bot, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Bridge" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEe" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEj" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Research Sector"; + req_one_access_txt = "29;47" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEl" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEm" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEn" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Research Sector"; + req_one_access_txt = "29;47" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEo" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEq" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEr" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEs" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEt" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEv" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research/glass{ + name = "Research Sector"; + req_one_access_txt = "29;47" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/lab) +"cEx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/lab) +"cEz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEA" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/lab) +"cEC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cED" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cEE" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft"; + dir = 8; + name = "Aft Maintenance APC"; + pixel_x = -26 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cEF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEG" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cEJ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"cEL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"cEM" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEN" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cEO" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/research{ + name = "Chemistry Lab"; + req_access_txt = "8; 33" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/medical/chemistry) +"cEP" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cEQ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cER" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Locker Room"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cES" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cET" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Locker Room"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cEZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFd" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFe" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFg" = ( +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cFh" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFi" = ( +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFk" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFl" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFm" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFn" = ( +/obj/structure/closet/l3closet, +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFs" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/surgical_drapes, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 16 + }, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/surgicaldrill, +/obj/item/cautery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/camera{ + c_tag = "Medbay - Port"; + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/central"; + dir = 8; + name = "Medbay APC"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFu" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFv" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/window/westright{ + name = "Treatment Center"; + req_access_txt = "5" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFz" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/healthanalyzer, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cFA" = ( +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 5 + }, +/obj/item/storage/box/syringes{ + pixel_x = -4 + }, +/obj/item/reagent_containers/dropper, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cFB" = ( +/obj/machinery/vending/snack/teal, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/medical/medbay/central) +"cFD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFF" = ( +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Break Room"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFI" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/carpet/blue, +/area/medical/medbay/central) +"cFL" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFN" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria, +/area/medical/medbay/central) +"cFO" = ( +/obj/structure/closet/crate/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFP" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian, +/obj/item/reagent_containers/pill/patch/styptic, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/medical/medbay/central) +"cFQ" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/carpet/blue, +/area/medical/medbay/central) +"cFR" = ( +/obj/structure/closet/crate/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cFT" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Exterior Airlock"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cFU" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cFV" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cFW" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cFX" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Chemistry Lab"; + req_access_txt = "33" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cFY" = ( +/turf/open/floor/plasteel, +/area/router/air) +"cFZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/button/massdriver{ + id = "airbridge_out"; + pixel_x = -8; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cGa" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cGb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "MedSci Router"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cGc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cGd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay Locker Room"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cGe" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light, +/obj/item/reagent_containers/blood/OMinus{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 6 + }, +/obj/item/storage/box/masks{ + pixel_x = -4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -30 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cGf" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/conveyor{ + dir = 4; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cGg" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/conveyor{ + dir = 4; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cGh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/mass_driver{ + dir = 4; + id = "airbridge_in"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/air) +"cGi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGj" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGk" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGl" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGm" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGn" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGo" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/science/research{ + name = "Research Sector" + }) +"cGp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGr" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/research/glass{ + name = "Xenobiology Lab Access"; + req_access_txt = "55" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGu" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) +"cGv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Lab"; + req_access_txt = "8;55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cGy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cGA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGE" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cGF" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/engine, +/area/science/storage) +"cGG" = ( +/obj/machinery/power/apc{ + areastring = "/area/science/storage"; + dir = 4; + name = "Toxins Storage APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/science/storage) +"cGH" = ( +/obj/machinery/camera{ + c_tag = "Toxins Lab - Storage"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/engine, +/area/science/storage) +"cGJ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/science/storage) +"cGK" = ( +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/engine, +/area/science/storage) +"cGL" = ( +/obj/structure/table, +/obj/item/extinguisher, +/obj/item/storage/toolbox/mechanical, +/obj/item/wrench, +/obj/item/clothing/mask/gas, +/obj/item/extinguisher{ + pixel_x = -7; + pixel_y = 3 + }, +/turf/open/floor/engine, +/area/science/storage) +"cGM" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/engine, +/area/science/storage) +"cGP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/storage) +"cGQ" = ( +/obj/machinery/door/airlock/research{ + name = "Plasma Canister Storage"; + req_access_txt = "7;8" + }, +/turf/open/floor/engine, +/area/science/storage) +"cGR" = ( +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGT" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (Common)"; + pixel_x = 28 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGV" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/storage) +"cGW" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/storage) +"cGX" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cGZ" = ( +/turf/open/floor/plating/airless, +/area/science/storage) +"cHa" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/structure/sign/warning/fire{ + pixel_x = -32 + }, +/obj/machinery/camera{ + c_tag = "Toxins Lab - Plasma Storage"; + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/storage) +"cHb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHd" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHf" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHg" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"cHj" = ( +/obj/structure/table, +/obj/item/storage/hypospraykit/toxin{ + pixel_x = -5 + }, +/obj/item/storage/hypospraykit/fire{ + pixel_x = 5 + }, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/sunglasses, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cHk" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cHl" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cHm" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cHn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/explab) +"cHo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHq" = ( +/obj/structure/closet/firecloset, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHr" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHs" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHt" = ( +/obj/structure/disposalpipe/junction, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHu" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHv" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Research - Experimentation Hall"; + dir = 8; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/science/explab) +"cHw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHy" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHA" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHB" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/power/apc{ + areastring = "/area/science/explab"; + dir = 4; + name = "Experimentation Lab APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, +/area/science/explab) +"cHD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/explab) +"cHE" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHG" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHH" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHI" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"cHJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) +"cHK" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cHL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cHM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cHN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cHO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cHP" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/landmark/start/geneticist, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cHQ" = ( +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cHR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_one_access_txt = "9;45" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"cHS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Genetics Lab"; + req_access_txt = "9" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cHT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/rust, +/area/medical/morgue) +"cHU" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cHV" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cHW" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/obj/item/reagent_containers/glass/beaker, +/obj/structure/sign/poster/official/state_laws{ + pixel_y = 32 + }, +/turf/open/floor/circuit, +/area/science/robotics/lab) +"cHX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cHY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/recharge_station, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cHZ" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + name = "Airbridge Router" + }, +/turf/open/floor/plating, +/area/router/air) +"cIa" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cIb" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/storage/firstaid/radbgone, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_x = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cId" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cIe" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/aft) +"cIf" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cIg" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIh" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cIi" = ( +/obj/structure/window/reinforced/spawner, +/obj/machinery/conveyor{ + dir = 4; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cIj" = ( +/obj/structure/chair, +/obj/effect/landmark/start/geneticist, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIk" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIl" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIm" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIn" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cIo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Genetics Lab Maintenance"; + req_access_txt = "9" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/genetics) +"cIp" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cIq" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/east, +/obj/machinery/conveyor{ + dir = 1; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cIr" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28; + pixel_y = -4 + }, +/obj/machinery/light_switch{ + pixel_x = -24; + pixel_y = 10 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cIs" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cIt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cIu" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cIv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Aft Hall"; + network = list("ss13","rd") + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants/photosynthetic, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cID" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIE" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cII" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIJ" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIK" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIL" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Engineering Sector" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIQ" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIU" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=evac"; + location = "eng1" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIV" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cIZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJb" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJd" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJe" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cJf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cJg" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cJh" = ( +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/obj/machinery/camera{ + c_tag = "Aft Restrooms"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cJi" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cJj" = ( +/obj/machinery/computer/security/mining, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cJk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cJl" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Engine Room - Starboard Quarter"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJm" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cJn" = ( +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cJo" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner, +/area/engine/atmos) +"cJp" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/suit_storage_unit/engine, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cJs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cJt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cJu" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cJv" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Router"; + req_access_txt = "11" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJx" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cJy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/rnd/production/circuit_imprinter, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cJz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 8; + id = "DeliveryConveyor" + }, +/turf/open/floor/plating, +/area/quartermaster/warehouse) +"cJA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJC" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cJD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/terminal, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cJE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cJF" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/closed/wall/r_wall, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/table, +/obj/machinery/light/small, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/engine/gravity_generator"; + dir = 4; + name = "Gravity Generator APC"; + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"cJH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cJI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"cJJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJN" = ( +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/supermatter{ + name = "Thermo-Electric Generator" + }) +"cJP" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"cJR" = ( +/obj/machinery/door/airlock/engineering{ + name = "Canister Storage"; + req_one_access_txt = "10;24" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cJS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cJT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cJU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cJV" = ( +/obj/structure/plasticflaps, +/obj/machinery/door/poddoor{ + id = "DeliveryDoor"; + name = "Delivery Door" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 8; + id = "DeliveryConveyor" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cJW" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJX" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJY" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"cJZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cKa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cKb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cKc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Canister Storage"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/storage{ + name = "Canister Storage" + }) +"cKd" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "DeliveryConveyor" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"cKe" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/public/glass{ + name = "Airbridge Router" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cKf" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cKg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/vending/engivend, +/turf/open/floor/plasteel, +/area/storage/primary) +"cKh" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cKi" = ( +/obj/structure/sign/poster/official/space_cops{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cKj" = ( +/obj/structure/closet/secure_closet/CMO, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/paper/guides/cogstation/letter_cmo, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cKk" = ( +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cKl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"cKm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs, +/area/medical/medbay/central) +"cKn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cKo" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cKp" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cKq" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"cKr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cKs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cKt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cKu" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cKv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cKw" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"cKx" = ( +/obj/structure/grille, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/science/xenobiology) +"cKy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"cKz" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cKA" = ( +/obj/machinery/atmospherics/components/binary/valve, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cKB" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cKC" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/chief_medical_officer, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cKD" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cKE" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) +"cKF" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cKG" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/wardrobe/yellow, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cKI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"cKJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"cKK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"cKL" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cKM" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cKN" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/signaler{ + pixel_x = -4 + }, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler{ + pixel_y = 8 + }, +/obj/item/assembly/signaler{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"cKO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/sign/departments/restroom{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cKP" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/structure/sign/departments/custodian{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cKQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output, +/turf/open/floor/engine/vacuum, +/area/engine/atmos) +"cKR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"cKS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"cKT" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"cKU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"cKV" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"cKW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"cKX" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cKY" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cKZ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/space/basic, +/area/space/nearstation) +"cLa" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) +"cLb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"cLc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"cLd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLe" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/engine/atmos) +"cLf" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/engine/atmos) +"cLg" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/obj/structure/extinguisher_cabinet{ + pixel_y = 29 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLh" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLi" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLj" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/engine/atmos) +"cLk" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "CO2 Outlet Pump" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/engine/atmos) +"cLl" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLm" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cLn" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/under/misc/overalls, +/turf/open/floor/plasteel, +/area/storage/primary) +"cLo" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLp" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLq" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/storage/primary) +"cLs" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLt" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"cLu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"cLv" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"cLw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"cLx" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"cLy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"cLz" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/under/misc/overalls, +/turf/open/floor/plasteel, +/area/storage/primary) +"cLA" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/camera{ + c_tag = "Virology - Starboard"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/virology"; + dir = 4; + name = "Virology Lab APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLB" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/router/air) +"cLC" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/camera{ + c_tag = "Virology - Port"; + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLE" = ( +/obj/structure/closet/crate/medical, +/turf/open/floor/plasteel, +/area/router/air) +"cLF" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLH" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLI" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLJ" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/wirecutters, +/turf/open/floor/plasteel, +/area/router/air) +"cLK" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/conveyor{ + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cLL" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLN" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLO" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/conveyor{ + dir = 8; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cLP" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/item/storage/box/syringes, +/obj/item/hand_labeler, +/obj/item/radio/headset/headset_med, +/obj/structure/sign/warning/biohazard{ + pixel_x = 32 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medical)"; + pixel_y = -30 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cLQ" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/conveyor{ + dir = 8; + id = "airbridge_off" + }, +/obj/machinery/door/poddoor{ + name = "Airbridge Router" + }, +/turf/open/floor/plating, +/area/router/air) +"cLR" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/mass_driver{ + dir = 8; + id = "workshop_in"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cLS" = ( +/obj/machinery/light, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/freezer, +/area/medical/virology) +"cLT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/medical/virology) +"cLU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1; + frequency = 1441; + id = "inc_in" + }, +/turf/open/floor/plating/airless, +/area/medical/virology) +"cLV" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLW" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cLX" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"cLY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/incinerator_output{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cLZ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"cMa" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cMb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cMc" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMd" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "N2 to Airmix" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMe" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"cMg" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMh" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMi" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cMk" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMl" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMm" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMn" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2 to Pure" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMo" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMp" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"cMq" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMr" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMs" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMt" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cMu" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) +"cMv" = ( +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = -24; + pixel_y = 8 + }, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = -40; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMw" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Nitrogen Outlet" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Atmospherics - Starboard Aft"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMA" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMB" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "O2 to Airmix" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMC" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "O2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/engine/atmos) +"cME" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white/corner, +/area/engine/atmos) +"cMF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Air to Pure" + }, +/turf/open/floor/plasteel/white/corner, +/area/engine/atmos) +"cMG" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"cMH" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cMI" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cMJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cMK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"cML" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"cMM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"cMN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"cMO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"cMP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/engine/atmos) +"cMQ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cMR" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cMS" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/space/basic, +/area/space/nearstation) +"cMT" = ( +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"cMU" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/conveyor{ + dir = 8; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cMV" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "workshop_off" + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cMW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/vending/tool, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cMX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/multitool{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/multitool, +/obj/item/multitool, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cMY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/machinery/camera{ + c_tag = "Engineering - Workshop"; + dir = 1 + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/t_scanner, +/obj/item/t_scanner, +/obj/item/t_scanner, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cMZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/chair, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/chair, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/obj/item/stack/cable_coil/red, +/obj/item/stack/cable_coil/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/closet/crate/engineering, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/vending/assist, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNh" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/public/glass{ + name = "Airbridge Router" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cNi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cNj" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cNk" = ( +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/router/air) +"cNl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/router/air) +"cNm" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cNn" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "airbridge_off" + }, +/turf/open/floor/plating, +/area/router/air) +"cNo" = ( +/turf/closed/wall/rust, +/area/engine/workshop) +"cNp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southleft{ + name = "Workshop Desk"; + req_access_txt = "11" + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNq" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/southright{ + name = "Workshop Desk"; + req_access_txt = "11" + }, +/obj/item/folder/yellow, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/workshop) +"cNs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/workshop) +"cNt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/engine/workshop) +"cNu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Workshop"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/workshop) +"cNv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/closed/wall, +/area/engine/workshop) +"cNw" = ( +/turf/closed/wall/r_wall, +/area/router/air) +"cNx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cNy" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningdock/airless) +"cNz" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningdock/airless) +"cNA" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"cNB" = ( +/turf/open/floor/plating, +/area/quartermaster/miningdock/airless) +"cNC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) +"cND" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cNE" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNF" = ( +/obj/item/shovel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNH" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNI" = ( +/turf/open/floor/plating/airless, +/area/router/aux) +"cNJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/aft) +"cNK" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/engine/teg_hot) +"cNL" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/engine/teg_cold) +"cNM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/circuitboard/machine, +/obj/item/circuitboard/machine, +/obj/item/circuitboard/machine, +/obj/item/circuitboard/machine, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/wallframe/camera, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNN" = ( +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/frame/computer{ + dir = 8 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock/airless) +"cNQ" = ( +/obj/structure/sign/warning{ + name = "\improper KEEP CLEAR: HIGH SPEED DELIVERIES" + }, +/turf/closed/wall/r_wall, +/area/router/aux) +"cNR" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNS" = ( +/obj/machinery/power/apc{ + name = "Mining Dock APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch{ + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNU" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/plasteel/fifty, +/turf/open/floor/plating, +/area/quartermaster/miningdock/airless) +"cNV" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cNW" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera{ + c_tag = "Supply - Mining Exterior"; + dir = 4 + }, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cNX" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cNY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external/glass{ + name = "Refinery"; + req_access_txt = "48" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cNZ" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Refinery"; + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock/airless) +"cOa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cOb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOc" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/camera{ + c_tag = "Supply - Refinery Exterior"; + pixel_x = 22 + }, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOd" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/medical/medbay/lobby) +"cOe" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cOf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOh" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOi" = ( +/obj/machinery/conveyor_switch{ + id = "MiningConveyer" + }, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOj" = ( +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/closet/toolcloset, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOl" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningdock/airless/no_grav) +"cOm" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "MiningConveyer" + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/quartermaster/miningdock/airless/no_grav) +"cOn" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOo" = ( +/obj/structure/table, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOp" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOq" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cOr" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOs" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOt" = ( +/obj/structure/closet/crate, +/obj/item/stack/rods/fifty, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOu" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOv" = ( +/obj/item/storage/toolbox/emergency, +/obj/structure/table, +/turf/open/floor/plating/airless, +/area/quartermaster/miningdock/airless/no_grav) +"cOw" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cOx" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/router/medsci"; + dir = 1; + name = "MedSci Router APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/router/medsci) +"cOy" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/router/medsci) +"cOz" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/router/medsci) +"cOA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOD" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/aft) +"cOE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOF" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/router/medsci) +"cOH" = ( +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOI" = ( +/turf/closed/wall/r_wall, +/area/router/medsci) +"cOJ" = ( +/obj/machinery/conveyor{ + id = "medsci_off" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOK" = ( +/obj/structure/table/reinforced, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/item/destTagger, +/obj/machinery/light, +/obj/machinery/button/massdriver{ + id = "medsci_out"; + pixel_x = -8; + pixel_y = 8 + }, +/obj/machinery/requests_console{ + department = "MedSci Router"; + name = "MedSci Router RC"; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOL" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "medsci_off" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOM" = ( +/turf/closed/wall/r_wall, +/area/janitor/aux) +"cON" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Auxiliary Custodial Closet"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/janitor/aux) +"cOO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/janitor/aux) +"cOP" = ( +/obj/machinery/mass_driver{ + id = "medsci_out"; + name = "Router Driver" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOQ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/janitor/aux"; + dir = 1; + name = "Auxiliary Custodial Closet APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOS" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/storage/box/lights/mixed, +/obj/item/light/tube, +/obj/item/radio/off, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOT" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + name = "MedSci Router" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOU" = ( +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + name = "MedSci Router" + }, +/obj/machinery/conveyor{ + dir = 1; + id = "medsci_off" + }, +/turf/open/floor/plating, +/area/router/medsci) +"cOV" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/storage/box/mousetraps, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOW" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOX" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cOY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/janitor/aux) +"cOZ" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Custodial Closet - Auxiliary"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cPa" = ( +/obj/structure/mopbucket, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cPb" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/janitor/aux) +"cPc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cPd" = ( +/obj/machinery/conveyor{ + id = "sq_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPe" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "sq_out"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPf" = ( +/obj/machinery/conveyor/auto, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPg" = ( +/obj/machinery/mass_driver{ + dir = 1; + id = "medsci_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPh" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "sq_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPi" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "viro_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPj" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "viro_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPk" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "viro_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPl" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "viro_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPm" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "sq_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPn" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "sq_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPo" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "viro_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPp" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "viro_out"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPq" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "sq_off" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cPr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hydroponics/lobby) +"cPs" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/bridge) +"cPt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"cPu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cPv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"cPw" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/contraband/kss13{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/department/science{ + name = "Research Maintenance" + }) +"cPx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cPy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cPz" = ( +/obj/structure/lattice, +/obj/structure/transit_tube/curved{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cPA" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cPB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/transit_tube/crossing/horizontal, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cPC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cPD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cPE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cPF" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cPG" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Supply - Warehouse Exterior"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/space/basic, +/area/space/nearstation) +"cPH" = ( +/obj/machinery/conveyor_switch{ + id = "EngiCargoConveyer" + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/sorting"; + dir = 8; + name = "Delivery Office APC"; + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"cPI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Foyer"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cPJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Engineering Foyer"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cPK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Access"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cPL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Access"; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/break_room) +"cPM" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/recharger, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + name = "Security RC"; + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cPN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cPO" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cPP" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus{ + pixel_y = 8 + }, +/obj/item/stock_parts/cell/high/plus{ + pixel_y = 8 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = -8; + pixel_y = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cPQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/genetics"; + dir = 8; + name = "Genetics Lab APC"; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"cPR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cPS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "CMO's Office"; + req_access_txt = "40" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"cPT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"cPU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPW" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cPY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cPZ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQb" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQc" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQd" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQe" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "xenobio2"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQg" = ( +/obj/machinery/door/window/westright{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio1"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQh" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQj" = ( +/obj/machinery/door/window/eastleft{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQl" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "xenobio1"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQm" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQq" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQr" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/button/door{ + id = "xenobio4"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQs" = ( +/obj/machinery/door/window/westright{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQu" = ( +/obj/machinery/door/window/eastleft{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio4"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQv" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/button/door{ + id = "xenobio3"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQw" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQx" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/obj/machinery/button/door{ + id = "xenobio6"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQy" = ( +/obj/machinery/door/window/westright{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio5"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQz" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQB" = ( +/obj/machinery/door/window/eastleft{ + name = "Containment Pen"; + req_one_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQC" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/button/door{ + id = "xenobio5"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQD" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQE" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"cQH" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "xenobio7"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQI" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/glasses/science, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"cQJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQM" = ( +/obj/machinery/door/window/southright{ + name = "Secure Xenobiological Containment"; + req_one_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio7"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cQN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/science/xenobiology) +"cQQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQR" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cQT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cQU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cQV" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-02" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQW" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/machinery/camera{ + c_tag = "Bridge - Port Quarter"; + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQX" = ( +/obj/machinery/photocopier, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQY" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cQZ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cRa" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "MiningConveyer" + }, +/obj/machinery/door/poddoor{ + id = "MiningConveyorBlastDoor"; + name = "Asteroid Mining Load Door" + }, +/turf/open/floor/plating/airless, +/area/quartermaster/miningoffice) +"cRb" = ( +/obj/machinery/computer/cloning, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/item/paper/guides/jobs/medical/cloning{ + pixel_x = -4 + }, +/obj/item/paper/fluff/cogstation/cloner{ + pixel_x = 6 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"cRc" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/airlock/research{ + name = "Aft Observatory"; + req_access_txt = "47" + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cRd" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/airlock/research{ + name = "Aft Observatory"; + req_access_txt = "47" + }, +/turf/open/floor/plasteel/dark, +/area/science/misc_lab{ + name = "Research Observatory" + }) +"cRe" = ( +/obj/machinery/computer/upload/ai{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai) +"cRf" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/flasher{ + id = "ID"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"cRg" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/white/corner, +/area/engine/atmos) +"cRh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/turretid{ + control_area = "area/science/server"; + icon_state = "control_stun"; + name = "Computer Core turret control"; + pixel_x = -3; + pixel_y = -23; + req_access_txt = "65" + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"cVq" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cVO" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dpO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dVR" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dYm" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/storage) +"eCy" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eIh" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "N2O Outlet Pump" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/engine/atmos) +"eKM" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -30 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eTZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eUF" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"fgS" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "Plasma Outlet Pump" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fkx" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"frb" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"fti" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fui" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"fuE" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) +"fuR" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 30 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"fIw" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"guK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/space) +"gDY" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Fuel Pipe to Incinerator" + }, +/obj/machinery/light, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gGG" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"gVV" = ( +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/engine, +/area/science/storage) +"hcR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"hiV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"hlo" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hlV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hDz" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hFa" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/storage) +"hKC" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hMZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Port" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hXk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering{ + name = "Engine Room" + }) +"ifC" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/turf/open/space/basic, +/area/space/nearstation) +"iAW" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"iQY" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jiZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"jml" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + layer = 2.4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jon" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jyu" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"jMO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"jXo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"kxw" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/turf/open/space/basic, +/area/space) +"kzb" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/bridge) +"kOG" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix to Engine" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lcD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Air to Port" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lRy" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mkx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"mqB" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mxW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"mBP" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/science/mixing) +"mEa" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mIm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/engine, +/area/science/storage) +"mIT" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/turf/open/space/basic, +/area/space/nearstation) +"mKP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/tcommsat/computer) +"mNN" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ntC" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Fuel Pipe" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nvn" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nAF" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Mix to Port" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nBM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"nEX" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nLV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ony" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"opd" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"oMB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plating, +/area/engine/atmos) +"pgu" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/space/basic, +/area/space/nearstation) +"prx" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qeq" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"qgO" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qlJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/turf/open/space/basic, +/area/space/nearstation) +"qvB" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qHL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"qWY" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste In" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rdF" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rTW" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) +"rUl" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sdp" = ( +/obj/structure/reagent_dispensers/foamtank, +/turf/open/floor/engine, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"sHB" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sRD" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sVC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/turf/open/space/basic, +/area/space/nearstation) +"tjb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/engineering{ + name = "Engine Room" + }) +"tpQ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/turf/open/space/basic, +/area/space/nearstation) +"tuF" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"tyI" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"tXV" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + layer = 2.4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tZj" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tZC" = ( +/obj/machinery/atmospherics/pipe/manifold4w/orange/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"urj" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 8; + icon_state = "intact" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"uwK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction{ + name = "Engineering Construction Area" + }) +"uAY" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/t_scanner, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uVD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vcb" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vsO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"vxU" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wbu" = ( +/obj/machinery/atmospherics/pipe/simple/violet/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"wPS" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/violet/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) +"wWH" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xcO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "Mix Outlet Pump" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xjk" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xkC" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xoj" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xxP" = ( +/turf/closed/wall, +/area/quartermaster/storage) +"xCy" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xKr" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) + +(1,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(2,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(3,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(4,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(5,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(6,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(7,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(8,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(9,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(10,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(11,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(12,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(13,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(14,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(15,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(16,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(17,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(18,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(19,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(20,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(21,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(22,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(23,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaw +aaf +aaw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(24,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bnj +aaw +bHZ +aaw +bnj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(25,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaw +aaw +acp +bJM +acp +aaw +aaw +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(26,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaf +aaf +acp +bef +crG +crK +acp +aaf +aaf +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(27,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaw +bgD +acp +beh +bKH +crL +acp +bLB +aaw +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(28,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaf +aaf +acp +bFr +crH +crM +acp +aaf +aaf +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(29,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaw +aaw +acp +acp +acp +aaw +aaw +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(30,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bnj +aaw +crG +aaw +bnj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(31,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaw +crH +aaw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(32,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(33,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(34,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(35,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(36,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(37,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(38,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(39,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(40,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(41,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(42,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(43,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +crB +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(44,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aye +aEf +akI +akI +akI +akI +akI +akI +akI +akI +akI +akI +akI +akI +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +crE +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(45,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aye +aaU +akI +adp +ajt +chi +arW +aHo +buV +bxu +akI +bxB +bxQ +bxZ +byb +byi +byn +byp +byB +byG +byL +byB +clI +byn +clP +byi +aaa +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(46,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aye +aaa +akI +adZ +chh +cMf +axF +aIM +mKP +crz +cMf +bxE +bxW +bya +byb +byk +byn +byq +byn +byH +clD +byn +clJ +byn +clQ +byi +aaU +aye +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(47,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aye +aaa +akI +ajZ +anx +akJ +aAI +aMx +cnn +bxx +bxD +bxI +bxJ +byb +byb +byb +byn +byx +byn +byn +byn +byn +clK +byn +clR +byi +aaa +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(48,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aye +aaa +akI +ahh +aCf +akI +aAJ +cMp +aYa +bxm +akI +aNC +bxv +byf +byj +byl +byn +byn +byn +byI +clE +byn +byn +byn +crD +byi +aaa +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(49,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aye +aaU +akI +ajn +aLH +akI +aAK +aRC +bxn +akI +bxA +hiV +cvI +byb +byb +byb +byn +byy +byn +byn +byn +byn +clL +byn +clS +byi +aaa +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(50,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aye +cep +akI +akI +akI +akI +aGa +cMK +bxo +akI +akI +bbk +bxX +byg +byb +bym +byn +byz +byn +byJ +clF +byn +clM +byn +clT +byi +aaU +aye +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(51,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aEa +cMK +bxq +bxC +akI +bxK +bxY +byh +byb +byi +byn +byA +byC +byK +clG +byC +clN +byn +clU +byi +aaa +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(52,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aEa +cMK +bxt +akI +akI +akI +akI +akI +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +byi +crF +aye +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(53,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aEa +aHE +bab +aaa +aaa +aaU +aaa +aaa +aaa +crC +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(54,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aEb +aPT +aaU +aaU +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aye +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(55,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(56,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +agL +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(57,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aiq +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(58,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aiq +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cpC +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(59,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaL +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaL +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(60,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +cpC +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(61,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(62,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEb +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(63,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(64,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +bxT +bxT +bFl +bxT +bFl +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bAb +cKw +cli +bxT +bxT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(65,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bxT +bFj +bHS +bSj +bJr +bFj +bxT +bKE +caV +bKM +bxT +bKE +clf +bKM +bxT +bKE +ctL +bKM +bxT +ctQ +cKx +clj +clk +clj +clm +cln +cln +cln +clp +clq +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(66,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bxT +bFk +bHS +bIE +bJr +bFk +bxT +bKF +bLd +bKM +bxT +bKF +bLd +bKM +bxT +bKF +bKM +bKM +bxT +bxT +cKy +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +clr +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(67,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bxT +bFl +bFl +bZz +bFl +bFl +bxT +bKF +bKM +bKM +bxT +bKF +bKM +bKM +bxT +bKF +bKM +bKM +bxT +bOs +cKz +bOG +bOP +bxT +bOW +bOZ +bPc +bPe +bxT +cls +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(68,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaK +aaM +abi +aaa +aaa +aaU +aEa +aPT +aaU +aaU +aaa +aaU +aPV +bik +bik +bik +bik +bik +bik +cQT +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bbv +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bxT +bFm +bHT +bFt +bJs +bJV +bxT +cQa +cQg +cQk +bxT +cQa +cQs +cQk +bxT +cQa +cQy +cQk +bxT +cvz +cKA +bOH +cQJ +bxT +bKM +bKM +bKM +bKM +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(69,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bOc +aaU +aaU +aaU +aaU +bOc +aaU +aaU +aaU +aaU +bOc +aaU +aaU +aaU +aaU +aEa +aPT +aaU +aaU +aPV +bik +cQS +aIA +aJe +aLE +aLy +aMQ +aNF +cQU +bik +cQT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bxT +cnb +bHU +bOF +bJt +bJW +bxT +cbo +bLf +cQl +bxT +cbo +bLf +cQv +bxT +cbo +bLf +cQC +bxT +ctT +cKB +bOI +cQK +bOT +bKM +bKM +bKM +bPf +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(70,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bOf +ciA +ciA +ciA +ciA +cnG +cnH +aaL +cnI +ciA +cnJ +abh +abh +abh +abh +aEb +aPT +aaU +aaU +aPW +aHD +aIg +aHF +aJn +aHF +aHF +aJn +aHF +aPp +cQV +cQS +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaU +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +bxT +bFo +bHV +bYz +cPU +cPW +cPY +cQb +cQh +cQm +cQh +cQh +cQh +cQh +cQw +cQh +cQz +cQD +cjP +ctR +cQF +cQH +cQL +bKM +bKM +bKM +bKM +bPg +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(71,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abx +aoH +abx +aaU +aaU +aaU +aaU +aaU +aaU +aEa +aPT +aaU +aPU +aTH +bRD +aHF +aHF +aIE +aIE +aIE +aIE +csD +aHF +cQW +aGq +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaU +aaa +bcy +cnU +cnU +cnU +bZW +aaa +aaU +aaU +cbb +cbb +cbb +cbb +cbb +cbb +aaa +aaa +aaa +aaU +aaa +aaa +bxT +cdD +bHW +bIG +cPV +cPX +cPZ +cQc +cQi +cQn +cQi +cQp +cQt +cQi +cQi +cQp +cQA +cQE +cbF +cnl +cla +bOK +cQM +bKM +bKM +bPa +bKM +cun +bxT +cls +aaU +aaU +aaU +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(72,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aju +aoP +aqM +aaU +aaU +aaa +aaa +aaa +aGq +aDn +aLK +aGq +aGq +aKH +cQQ +aHF +aIE +aJu +aKA +bhB +aMX +aIE +aHF +cQX +aQW +bkC +bkC +aQW +bkC +aQW +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +bcw +aUZ +bcw +aaa +bcy +bdc +byc +bdc +bcy +aaU +aaU +aaa +cbb +cbg +chT +cpD +cGH +cbb +aaa +aaa +aaa +aaU +aaa +bAb +bxT +bFq +bHY +bIH +cGA +bJX +bKq +cQd +bLi +bLi +bLF +cQq +bMi +bLi +bLi +cQq +bLi +bLi +cvV +ckS +cQG +cQI +cQN +bKM +bKM +bKM +bKM +bPi +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(73,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +abx +aqw +aoW +aqw +aqw +aaU +aaa +aaa +aaa +aGq +aEe +aUz +bDP +aGq +aGL +cQQ +aHF +aIH +aJz +aKE +aLI +aMX +aIE +aHF +cQY +aQW +bmj +bBt +cDB +bLh +aQW +aQW +bkC +bVN +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +bcw +bde +bcw +bYg +bcy +bfp +cwY +bOD +bcy +aaU +aaU +aaa +cbb +hFa +csR +csR +csR +cbb +aaU +aaU +aaU +aaU +aaU +bAf +bxT +crN +crO +bII +cGB +bFw +bxT +cQe +bLj +ckN +bxT +cQr +bLj +ckN +bxT +cQx +bLj +ckN +bxT +bOy +cla +bOM +cQO +bOU +bKM +bKM +bKM +bPj +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(74,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +abx +akg +apS +arr +abx +aaU +aaa +aaa +aaa +aGq +aXj +aZq +bDQ +hcR +aGM +cQQ +aHF +aII +abO +aKG +aRe +aXS +bbb +aHF +cQQ +aQW +baP +bCd +cjQ +bLk +aVP +cpt +bOR +bXI +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bcw +bee +bcw +crI +bcy +bfo +blG +bfo +bcy +aaa +aaU +aaU +cbb +csR +csR +cGJ +dYm +cbb +cGZ +cGZ +cbb +bxT +bxT +bAg +bBJ +bFs +bIa +bIJ +cGC +bXO +bxT +cQf +cQj +cQo +bxT +cQf +cQu +cQo +bxT +cQf +cQB +cQo +bxT +ctU +ckX +bON +cQP +bxT +bKM +bKM +bKM +bKM +bxT +cls +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(75,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aiN +akj +anV +asl +abx +aaU +aaU +aaU +aaU +aGq +aFE +bdz +bDR +aKF +aLm +cQR +aMi +aQh +aQN +aRa +aRl +aXT +bbc +bbD +cQZ +cDt +cDw +bEq +cps +bMh +bRb +bOQ +bOS +cbi +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bcy +bdf +mBP +crJ +blT +bqJ +bBN +bKI +bOr +aaa +aaU +aaa +cbb +cbn +csR +gVV +cGK +cbb +cbb +cbb +cbb +bJZ +cby +bMx +bxT +bFt +bIb +csY +cGD +bZD +bxT +bKM +bKM +bKF +bxT +bKM +bKM +bKF +bxT +bKM +bKM +bKF +bxT +bOA +clb +bOG +bOP +bxT +bOX +bPb +bPd +bPk +bxT +cls +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(76,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aiN +akz +aDO +asH +awm +axc +awm +ayJ +aqw +aGq +aJL +aUR +bEc +kzb +aGW +aHI +aIL +aKv +aGn +aKK +aLQ +aGn +bbd +bbG +bit +cDu +cDx +bFy +cDC +bOJ +aVR +bBj +bRc +bXI +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bcy +bdt +ctj +bUF +bOv +bfo +blI +bfo +bWS +bcw +bcw +bcw +bcy +cbu +csR +cGF +cGL +cGP +cGV +cHa +cbb +bxV +cOq +cGv +cGw +cGy +cGy +cGy +cGE +bKb +bxT +bKM +bKM +bKF +bxT +bKM +bLd +bKF +bxT +bKM +cnD +bKF +bxT +cue +cvX +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +clr +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(77,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aiN +akB +aDT +atv +awo +atv +axp +atv +azy +aGq +aJM +urj +cbX +aGq +aGX +aHM +aHM +aIP +aJB +aHM +aHM +aNg +aSW +aHM +biF +aQW +buM +bAX +bEN +bOL +aQW +aQW +buO +cbp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bcy +bec +bek +blH +bnm +bwN +bJY +bLE +bOE +bJY +cKI +cbP +bcy +cbC +cnO +csR +csR +cGQ +cGW +mIm +cbb +bKa +cGq +bMy +bxT +bzy +bzy +bIK +bJx +bKc +bxT +cta +caZ +bLy +bxT +bKM +cmQ +bLy +bxT +bKM +ctM +bLy +bxT +ctS +cud +clj +cll +clj +clm +clo +clo +clo +clp +clt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(78,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +bfq +aaa +aaa +aaU +aiN +alu +aDT +aGy +awu +auL +awu +auL +aAc +aGq +aJX +bdE +cen +aGq +cvK +aHM +cnp +aIQ +aJG +aKL +bPt +aNi +aSW +aHM +bju +aQW +buO +buO +aQW +buO +aQW +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bcy +bed +boJ +fuR +bzX +bAl +boL +bAG +cnT +boQ +cKJ +bAP +bcy +chR +cnV +cGG +cGM +cGP +cGV +cGV +cbb +bxT +cGr +bxT +bxT +bFl +bFl +bFl +bFl +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +bxT +cvG +cvY +bxT +bxT +bxT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(79,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +agW +ahf +ain +aaa +ain +alt +agW +aaa +aqw +abx +aCd +aDV +aEp +aEs +aIo +aEs +aNZ +atv +aGq +aGq +bdJ +ceo +aGq +aKY +aHM +aHM +aHM +aHM +aHM +aHM +aHM +aSW +aHM +bjJ +aGq +aaU +aaa +aaU +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +bcy +bcy +bcy +bcy +bcy +bgC +bdf +boR +bDL +boQ +cKJ +bAP +bcy +bWl +bZW +bcy +cbb +cbb +cbb +cbb +cbb +bRh +bTO +bVv +bTR +aaU +aaU +aaU +aaU +cav +cav +cav +cav +cav +cav +cav +aaU +aaU +aaa +aaa +aaa +aaU +cbB +ctY +cvA +cbB +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(80,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +agW +ahk +ain +aaU +ain +ahk +agW +aaU +abx +aiO +amq +avW +awd +awK +axf +awK +aOK +aAi +ceC +aAR +aEm +aGz +aGs +aOp +aOZ +aPu +aOZ +aOZ +aOZ +aSa +aSa +bbe +bnG +bkA +aGq +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaa +aaa +bcw +bdf +bdf +bpM +bFp +bvj +cKK +bAU +bRi +bSl +bRi +bcy +aEF +bko +bko +bko +bTr +aVF +cGt +aVF +bTR +cav +cav +cav +cav +cav +cav +cbe +cbl +cbq +cav +cav +cav +aaU +aaa +aaa +aaa +aaU +cbB +cKr +cub +cbB +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(81,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +agW +ahl +ain +ain +ain +alv +agW +agW +agW +aiP +anV +auL +awr +awM +asL +axu +aOL +asL +asL +asL +aFj +aFj +aFj +bmc +aHP +aHP +aIT +aJK +aKP +aSi +aYh +csr +aNR +blf +aNR +buR +bKp +bKJ +aaa +bdg +bdg +bdg +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +bdg +bdg +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bim +aaU +aaU +aaa +bcw +bhy +bdf +bpR +bJw +bLc +cKL +bAV +bRj +bZf +bZY +bcy +aSj +bko +csT +bko +bTs +aVF +cGs +aVF +cav +cav +cHj +cqS +cav +cav +ccL +caX +caX +caX +ctb +cav +cav +cav +aaa +aaa +aaa +aaU +cbB +cKr +cuf +cbB +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(82,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +agW +aho +ais +akl +akO +aho +alW +amX +agW +aiO +aob +bUA +awk +ajU +asL +axv +aOW +aAn +aAS +aCc +aFj +aFX +aGt +bnW +cjW +aFj +aFj +aGq +bdQ +aSB +aGq +aNR +aNR +bly +bjF +byd +aUB +bKK +aaa +bdg +beN +bgx +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +bEC +bgx +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaU +bcy +biK +bdf +bpR +bJT +bLl +cKM +bQX +bvy +bZg +caa +bcy +aTE +aTE +aTE +aTE +bTG +aVF +cGs +aVF +caw +caA +cHk +caP +caT +caX +caX +caX +cbh +caX +caX +cbx +cav +cav +aaa +aaa +aaa +aaU +cbB +cKr +cub +cbB +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +cpC +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(83,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahg +ahg +ahg +ahg +ahg +ahp +aiE +akq +akT +aAd +atq +atH +anU +anU +asL +asL +azi +asL +anU +axz +aPj +ayM +cCP +aCg +aFm +aGK +cCW +brG +aGu +aMh +aFm +aOr +aKS +aSW +cDs +aNR +biq +blA +bqh +buG +bIW +bKK +aaa +bdg +beR +beJ +bdg +bdg +bdg +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bdg +beJ +beR +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +bcw +biT +bdf +bpR +bwD +bLx +cKN +bWt +bvy +bZj +cac +bcy +aTX +aVF +aVF +aVF +aVF +aVF +cHg +bTP +caw +caB +cHl +caP +caT +caY +caX +caX +caX +caX +caX +ctI +cav +cav +aaa +aaa +aaa +aaU +cbB +cKr +cub +cbB +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(84,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahg +akp +alw +afH +ahg +ahq +aiG +akr +alj +ari +amg +amX +anU +aCr +aKd +aLJ +azj +aph +asL +axA +aPk +aMp +aOn +aCi +aFj +aGb +cCX +bGn +aHW +baK +aFj +aSs +bWe +cPs +bdS +aNR +aPt +aYR +csE +bvJ +aUF +bKK +aaa +bdg +beJ +beJ +aXk +bjg +aXl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +baZ +bjg +bhS +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +bgW +bgW +bgW +bgW +bnk +bqI +bHF +bDM +bOu +bWu +bRk +bZB +cad +bcy +aVF +cGR +cGX +cHb +cHc +cHe +cHh +bTQ +caw +caC +cHk +caP +caT +coG +caX +cHx +cHD +cHJ +caX +cbz +cav +cav +aaa +aaa +aaa +aaU +cbB +cKs +cug +cbB +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(85,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +ahg +aks +akY +alF +ahg +aps +agW +agW +agW +asF +ain +ain +anU +aEw +asX +aNj +aNJ +aph +asL +axB +aPn +aAv +aOO +aCl +aFj +aZT +aGv +bLp +bEV +aIr +aFj +aOs +aIP +aTf +aYy +bbf +bsf +bnI +aRo +bAn +bKG +bLe +aaa +bdg +beJ +beJ +bdg +bdg +bdg +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bdg +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +bgW +bin +bjs +bgW +bgW +bmb +bgW +bgW +bOv +bWS +bcy +cvH +bcy +bcy +bSJ +cGS +cGY +buC +cHd +cHf +cHi +buC +cax +bWd +cHm +cbv +caU +cba +cnC +cHy +cHE +cbt +cpe +cav +cav +cav +aaa +aaa +aaU +cbB +cbE +cKt +cuh +cbE +cbB +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(86,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +anU +anU +acc +anU +ahg +akt +atI +amm +ame +akL +akD +amh +aBA +arq +awJ +awJ +anU +aHb +asY +aNG +aNV +aBb +anU +abS +aPv +abS +aPD +abS +aFj +aFj +aLa +cjR +aFj +aFj +aFj +aGn +bfA +aTu +aGn +aNR +aNR +aNR +aRw +bCe +aNR +aNR +aaa +bdg +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +coQ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bgW +cfg +bjt +bep +bVe +bVp +csf +bgW +jyu +bXg +bXS +bYb +cae +bcy +bfr +cGT +bJz +bTo +cag +cbc +caI +bTo +cax +caE +cHn +csk +cav +cav +cav +cHz +cHF +caX +cav +cav +cav +aaU +aaU +aaU +cbB +cbB +cnj +cKu +cui +clh +cbB +cbB +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(87,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +anU +aaN +aaS +auE +ahy +aku +aly +aoq +aoR +aoV +aoY +apu +aeD +arT +aaS +aNM +anU +aHN +atj +ayf +azn +aBe +bzx +axC +aPY +aAz +aOh +aCG +bpX +aGo +aAz +cjS +anU +aMY +aNK +aNL +aPo +aTD +aNL +aNK +aVj +aNR +bao +bDk +aNR +aaU +aaa +bdg +beJ +bbI +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +cmd +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bgX +bAw +biA +biA +biA +bmd +csI +bgW +bOw +bcy +bRm +bYj +bRq +bcy +big +cce +bJA +bTq +big +big +bTN +big +cax +cpg +cHo +cbw +bXd +cav +cav +cHA +cHG +cav +cav +cbE +cbE +cbE +cbE +cbE +cbE +cle +csW +cKv +cuj +cuq +cus +cbE +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(88,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aah +aaz +byX +byX +byX +byX +byX +aaz +acO +anU +aeb +apc +auI +ahy +aky +amI +aod +amB +ajy +akF +awG +axW +asj +awR +axo +anU +aIl +anU +anU +anU +aBf +anU +aTp +aQb +aaS +aQl +agu +aSk +aUg +blY +cjT +aLk +aNd +aNL +aNL +aPq +aUC +aNL +aNL +aVj +aNR +aNR +bEm +aNR +aaU +aaa +bdg +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bgX +biB +biA +cDS +cDU +cDW +cDY +bgW +bOx +bcy +bcw +bYs +bcw +bcy +bYr +cgV +cGi +cGl +cGo +cGp +cGu +cGp +cGx +cGz +cHp +cHr +cGz +cHu +cHw +cHB +cHH +cHK +cHM +ckP +ckT +ckT +ckT +ckV +cRc +clg +ctc +cua +cvW +cur +clh +cbB +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(89,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aan +aaA +aaA +aaA +aaA +aaA +aaA +aaA +ada +anU +anU +apQ +auK +ahg +akA +amQ +ama +ahg +abS +abS +awZ +aEy +ayS +abS +abS +anU +aIV +anU +ayj +anU +aBj +anU +axN +aQb +aaS +bpo +aAX +aED +aVw +aBF +aKx +aLL +aNf +aNN +aNL +aPq +aUC +aNL +aNL +aVl +aYT +baz +bFH +aYT +aaU +aaa +bdg +beJ +beJ +bdg +bdg +bdg +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bdg +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bGI +bGI +bGI +bGI +aaa +aaa +aaa +aaa +aaa +aaU +bgX +csF +csN +biA +biA +csL +cDj +cDy +bPl +bXx +bXT +bYu +bYA +bYA +bZG +cmV +cGj +cGm +bYv +bYv +cio +cct +caz +bOO +cHq +cHs +cHt +cHv +caG +cHC +cHI +cHL +cHN +ckQ +ckQ +ckU +ckQ +ckW +cRd +csX +ctP +cuk +cul +cur +clh +cbB +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(90,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaU +aaU +aas +aaA +aaC +abn +abq +abG +ack +aaA +adb +anU +aaR +aqa +amZ +adO +acN +amZ +acN +aqY +ajz +alM +axK +axX +azk +awY +awY +azl +aJw +anU +anU +anU +aLw +abS +axT +aQb +aaS +aAY +avj +aSN +aVI +aBF +aKy +anU +aNk +aNL +aNL +aPq +aUC +aNL +aTO +aTP +aYT +baA +bFI +aYT +aYT +bdg +bdg +beJ +beJ +aXk +bjg +aXl +cut +aaa +aaa +aaa +aaa +aaa +aaa +baZ +bjg +bhS +beJ +beJ +bGI +bXP +aaa +aaa +aaa +aaa +aaa +ceE +bjg +ceF +beJ +beJ +bGI +aaa +aaa +aaa +aaa +aaa +aaU +bgW +biG +cve +bky +biA +biA +cDj +cDy +bWT +bXh +bYa +bYw +bYL +bZE +bZE +csP +cGk +cGn +cct +bYo +ckk +bYF +bBP +bFu +bIc +bBQ +bBQ +bFG +cuY +bCg +bCg +cbB +cbB +cbB +cbB +cbB +cbB +cbB +cbE +ctW +cbD +ctZ +ctZ +cld +cus +cbE +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(91,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +ckl +aaa +aaa +aaa +aaa +aaa +aas +aaA +adB +aaF +aaJ +abm +acd +acl +acD +aaG +aeh +aqf +auS +agu +ajx +ana +agu +agu +agu +agu +aqf +asV +aCt +agE +atU +aAV +auV +aGP +bls +aKO +aLx +ayR +ayC +aQE +aMZ +aAZ +aCL +abS +aVO +aKh +anU +anU +abS +abS +aNL +aPz +aUG +aNL +aNL +aVu +aYT +baC +cPt +bcs +aYT +bdj +beF +beJ +beJ +bdg +bdg +bdg +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bdg +beJ +beJ +bGI +bXV +aaa +aaa +aaa +aaa +aaa +bdg +bdg +bGI +beJ +cis +bGI +aaa +aaa +aaa +aaa +aaU +aaU +bgW +biI +cqB +czA +cBt +csx +cDv +bgW +bWU +bXl +bXy +bWa +bYc +bXU +bXU +bWa +bJF +bKv +bYv +bYp +bYx +cPw +bBQ +bFE +bId +bIL +cpw +bKd +cuZ +bKN +bCg +aaU +aaU +aaU +aaU +aaU +aaU +aaU +cbB +cbB +ctN +clh +clh +ctN +cbB +cbB +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(92,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aas +aaA +aaH +aic +aaF +aaF +acu +aaA +acU +adK +aeL +asO +auT +ahE +akQ +ahE +ahE +ahE +ahE +ahE +aqz +atV +aCW +aEC +aEL +aBa +aGG +aHH +aIs +aJy +aKt +aKC +aLn +aQH +aMq +aQm +aSh +aTR +aWS +bpS +anU +aLW +aaS +abS +aLZ +aPB +aUV +aYB +bbg +bcH +bnZ +bqi +bIl +bcJ +bOY +bdr +beJ +beJ +beJ +bdg +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bdg +beJ +ceI +bGI +bXV +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bGI +beJ +bbI +bGI +aaU +aaU +aaU +aaU +aaU +aUk +bgW +bgW +csl +cAQ +bgW +bgW +cEb +bgW +bWV +bXh +bXA +bXU +bpz +aaa +aaU +bXU +bKs +bKv +bYv +bYq +cPv +bYH +bBQ +bDT +bIe +bIM +bIM +bIM +cvt +bJD +bJH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cbB +cbE +cbB +cbB +cbE +cbB +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(93,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aas +aaA +abl +aaF +aaQ +abA +abA +acC +acZ +adW +asV +aeM +adA +aed +afl +afl +afl +aiK +ajA +ajA +aew +avg +aew +axi +atW +aCE +aDW +anU +anU +anU +aPX +abS +ayI +aQM +aSx +aTF +aUv +aVz +aWe +aTF +aWC +aXi +aXO +aYS +aZM +bbp +bcN +aYJ +aNL +aVJ +aYW +baF +bIr +bcx +cvZ +bdr +beJ +beT +bbI +bdg +aaU +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaU +bdg +cmd +beT +bGI +bXV +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bGI +beJ +beJ +bGI +aaU +aaU +aaU +aaU +aaU +aTV +aUo +aVW +cDH +bbS +aUk +bVL +cEc +bXr +bWW +bXh +bXB +bXU +bpz +aaa +aaU +bXU +bKs +bKv +bYv +cgr +bYy +crf +bBQ +bFx +bIf +bIM +csZ +bIM +cvQ +bJE +bJH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(94,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +cpB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aas +aaA +abk +abo +abw +abP +acy +aaA +adb +anU +aeQ +aeM +ani +aew +aeJ +aeJ +aeJ +aew +aeJ +aeJ +aeJ +avF +aeJ +aeJ +aeJ +aew +aCH +aew +aIn +aew +aJV +aew +aew +ayT +aRO +aBI +aDs +bfw +aYo +aKo +anU +aaS +aMP +abS +aOv +aPH +bcQ +aUC +aNL +aVJ +aYX +baD +bIV +bKg +cwa +bdr +beJ +bfd +beJ +bdg +aaU +aaa +aWZ +aWZ +aWZ +aWZ +aWZ +aWZ +aWZ +aaa +aaU +bdg +beJ +bfd +bdg +bXV +aaa +aaa +ceD +aaa +aaa +aaa +aaU +bdg +beJ +coR +bdg +aaa +aaa +aaa +aaa +aaU +aUi +aUp +aWm +cDH +bcB +aTV +bVM +cEd +bWs +bWs +bXh +bXJ +bXU +bpz +aaa +aaU +bXU +bKs +bLG +bYv +bzA +cwb +bYv +bBQ +csV +bIe +bYB +cqz +bIM +cvt +cmS +bJH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cpB +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(95,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aan +aaA +aaA +aaA +aaA +aaA +aaA +aaA +ada +anU +aeQ +aeM +adD +aew +afn +agI +aid +aew +ajG +alU +aew +awH +aew +axj +ayQ +aew +aDY +aew +aew +aew +aQf +aSX +aew +ayU +aSQ +aAB +aDt +asL +aYr +asL +anU +abS +abS +abS +aNL +aPq +bdx +aYO +aNL +aVL +aYT +baG +bbM +bcz +aYT +bdy +beM +bfd +beJ +bdg +aaU +aaU +aWZ +aXC +aYg +aYz +aZf +aZr +aWZ +aaU +aaU +bdg +beJ +bfd +bdg +bXV +aaa +bdg +buB +bdg +aaa +aaa +aaU +bdg +beJ +beJ +bdg +aaa +aaa +aaa +aaa +aaU +aUi +aUu +cnu +cDI +cDT +aTV +bQZ +cEd +csO +cEu +bXh +bXK +bWa +bYc +bXU +bXU +bWa +bKt +bLU +bRM +bRO +bRR +bRT +bRV +bSd +bTC +bYI +cgf +bKe +czH +bKO +bJH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(96,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aay +aaz +bPo +bPo +bPo +bPo +bPo +aaz +aeg +anU +aeV +aeM +adE +aew +afG +agP +agP +aiL +ajT +anu +ask +ayF +aCX +aEE +aEE +aES +aGT +aHT +aJt +aJN +aQg +akv +aeJ +ayU +aSQ +aTg +aDu +asL +aYq +aXu +aZU +aZV +beb +aNO +aNL +aPq +bex +aNL +aTO +bhh +aYT +aYT +bbP +aYT +aYT +bdg +bdg +bJy +caW +bdg +aaU +aaa +aWZ +aXD +aYk +aYk +aYk +aZs +aWZ +aaa +aaU +bdg +caW +bJy +bdg +bXV +aaU +bdg +bjg +bdg +aaU +aaU +aaU +bdg +beJ +beJ +bdg +aaa +aaa +aaa +aaa +aaU +aUi +aUu +aWm +cDH +bOt +aTV +bIg +cEe +cEs +cEv +cEx +cEA +cEJ +cEM +cEJ +cEJ +cEJ +bKu +bQv +bRN +cEs +bRS +cEN +cEO +cEP +bTD +bYJ +cka +cmR +cFV +bKP +bJH +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(97,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +anU +agv +aeN +abS +aew +afJ +agP +agP +ajB +akv +anw +aym +azN +aDe +aDe +aDe +aET +aHg +aHS +aLf +aJO +aQi +alU +aeJ +ayW +aSQ +aAB +aDB +asL +aYq +aXu +aZV +aZV +beb +aNS +aOw +aPq +bcQ +aNL +aTY +aWk +aXR +azd +aTS +aRW +bcR +bdN +beJ +bfd +beJ +bdg +bdg +aaU +aWZ +aXE +aYk +aYA +aYk +beg +aWZ +aaU +bdg +bdg +beJ +bfd +bGI +bYd +bGI +bGI +bzb +bGI +bdg +bdg +bdg +bGI +beJ +bbK +bGI +aaU +aaU +aaU +aaU +aaU +aTV +aVh +biP +cDH +bcC +aTV +bIn +bIN +bIO +bIQ +bIR +bIQ +bIQ +bIR +bIQ +bIS +bIQ +bIQ +bQP +cfZ +bWX +bWX +ckf +bCf +bFB +bIh +bYK +bJC +bKf +cFW +bKQ +bCg +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(98,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +akE +akE +ans +apg +aqE +aew +afY +agP +agP +aiL +akv +anw +akv +akv +akv +akv +aAh +aew +aEW +alU +akv +aKa +aKw +alU +aeJ +azc +aSQ +aAB +aDL +asL +aYq +aXu +aZW +aZV +beb +beb +beb +aPM +bcQ +aNL +aNL +aWl +aXR +aRI +aTS +aRW +bcR +bcR +cmd +bfd +bgz +bgx +bdg +bdg +aWZ +aZf +aYk +aYk +aYk +aYg +aWZ +bdg +bdg +beJ +beJ +bfd +blc +bYP +coS +aXc +aXc +aXc +aXc +aXc +aXc +aXc +aXc +aXc +bGI +aaU +aaU +aaU +aaU +aaU +aTV +aTV +aTV +bAc +brw +aTV +bVM +cEf +bWx +aab +bXo +bXQ +bXZ +bYi +bYk +bWa +bWa +bXU +bXU +bXU +bXU +bXU +bWa +bCg +bFC +bIi +caj +bJD +bCg +cFX +bJH +bCg +cOI +cOI +cOI +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(99,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aak +aak +aak +aak +aak +aaa +aaa +aaa +aaa +aaa +aak +aak +aak +aaa +aaa +aaa +aaa +aaa +aaa +akN +alq +alq +apn +aqF +aeJ +agD +ahr +aiH +aew +akw +aoB +akw +aqD +aew +ayh +aew +aew +aUy +alU +akv +aym +aQg +akv +aew +azf +aCb +aFT +bjV +bpW +aZO +aXu +aZX +bcr +beO +beO +beb +cDp +beL +aRm +aNL +aXw +aXR +aRW +aTS +aRW +bcR +bdU +beJ +bfd +beJ +bii +coP +bdg +aWZ +aVG +bnu +bnV +aYl +aZu +aWZ +bdg +byV +bzB +bgA +bWf +bXm +bZQ +ccN +ccN +cei +ccN +ccN +ccN +ccN +ccN +coZ +blO +bGI +aaa +aaa +aaa +aaa +aaU +aTV +aVk +bfu +csu +cAS +cDV +cDX +cEg +bWx +bSE +ckR +bSE +bSG +bTc +bSE +bSE +aaU +aaU +aaU +aaU +aaU +aaU +aaU +bCg +clv +bIi +caH +bJE +bCg +cOx +cOA +cOE +cOJ +cOP +cOT +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cPf +cPf +cPf +cPf +cPo +abp +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(100,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +abM +abR +abR +abM +aZG +aaU +aaU +aaU +aaU +aaU +aTd +aaU +aaU +aaU +aaU +aaU +aaU +aTx +akE +akE +anC +app +aqH +aew +aew +aew +aew +aew +aew +aew +aew +aew +aew +axk +asz +aew +aGV +akv +aLv +alU +aQA +aSZ +aew +aAP +aEc +bjB +asL +asL +bfm +aXA +aZY +bct +beP +beP +bjv +cDq +bhz +ccQ +ccS +aXB +aYY +aSc +aTT +aUH +bcX +bel +cpl +bfi +bgA +bLH +bji +bli +aWZ +aWZ +aWZ +boe +aWZ +aWZ +aWZ +beJ +bSW +bUy +bJG +aZy +aZy +aZy +aZy +beJ +bfd +bjg +bUt +bai +baV +cKF +bbn +cKG +bGI +aaa +aaa +aaa +aaa +aaU +aTV +aVq +bfx +cuQ +cpP +aTV +bVR +cEh +bWy +buf +bJu +bSQ +bSY +bTd +bTj +bSE +aaU +aaa +aaa +aaa +aaa +aaa +aaU +bCg +bZT +bIi +cbK +ckb +coH +cOy +cOB +cOF +cOK +cOI +cOI +aZG +aaU +aaU +aaU +aTd +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aTx +abM +abR +abM +abM +cPo +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(101,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +abM +aca +acG +acG +aaa +aaa +aaa +aaa +aaa +aWj +aWj +aWj +aaa +aaa +aaa +aaa +aaa +aaa +akP +als +anW +apr +aqJ +arR +ajC +agH +akC +amb +amk +auH +ape +civ +avG +axl +aCu +aew +aFG +aIz +aew +aPZ +aQY +aTa +aew +aDi +bGY +aDX +aIq +atc +aYq +aXu +baa +bcL +beS +bgm +bjC +cDr +bhW +ccR +aNL +aXG +aXR +awO +aUc +cjq +bcR +bcR +bcR +bcR +bgE +bLJ +bLV +bfi +blE +bBW +bgA +aww +awL +aGC +aON +aGC +bTu +bUC +bVQ +aZy +bTp +bRe +baw +bZA +cfQ +bZA +bZA +bqB +bZS +bZS +bZS +bZS +bZS +aaa +aaa +aaa +aaa +aaU +aUi +ciC +bzz +cvM +cts +aTV +bVM +cEf +bWz +bSE +bSK +bSR +bSL +bTe +bTM +bSE +aaU +aaU +aaU +aaU +aaU +aaU +aaU +bCg +cum +bIj +ccd +cvS +bCg +cOz +cOC +cOG +cOL +cOL +cOU +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cPg +cPi +cPj +abR +cPo +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(102,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +abM +ace +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +abp +aWj +aaU +aaU +aaU +aaU +aaU +aaU +akE +akE +akE +akE +akE +akE +ahm +ako +alx +bfa +aaj +bNM +civ +cix +avG +axm +aCC +aCK +aFZ +aew +aew +awQ +ayO +aBx +aoF +aHR +ccM +aDX +aJU +atc +aYq +aXu +baj +bcP +bfg +bgy +bjD +aNO +bcQ +aNL +aUD +aXR +aXR +cjy +aTS +aQL +aUX +aZE +aVS +bcR +bgF +bcR +bLX +bLY +bLY +aVd +bLY +bQg +bQw +bLY +bLY +bLY +bTy +aZy +bVU +aZy +bJm +bbm +baw +aXe +chU +cjw +cjw +cke +clu +cmP +clw +bZZ +bZH +aaU +aaU +aaU +aaU +aaU +aTV +aYf +beo +cuQ +cwe +aTV +bVS +cEi +cEt +cEw +cEy +cEB +cEK +bSS +bTl +bSE +brU +brU +brU +brU +cdZ +brU +brU +bCg +bFG +bIk +ccB +bJH +bCg +cGb +bRI +cOH +bRI +bRI +bRI +bCh +aaU +aaU +aaU +cpz +cpz +cpz +cpz +cpz +cpz +cpz +aaa +aaa +aaa +aaa +cPk +abR +cPo +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(103,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +abR +ace +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aWj +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bUo +aaU +acL +afs +aiT +aco +alG +cjo +aaj +aGc +bNT +ciy +cnF +bGU +bHl +aoF +asW +atz +avJ +awS +azB +aBC +atc +aIF +aJv +aJZ +aLY +aNA +bkF +aXu +aXu +bcU +aXu +aXu +bjD +aQn +bcQ +aNL +aUE +aXR +aQG +aRW +bsb +aUI +aUY +bew +aUY +aWb +aRW +bcR +cpc +bjj +bjj +bmh +bnv +bou +bQx +bqj +bjj +bjj +bjj +aZy +bVV +bWg +aWg +bbo +baw +bZC +cjv +aYc +bZF +bay +bZU +cnW +bbq +bcp +bZH +aaU +aaU +aaU +aaU +aaU +aTV +bHH +aWp +czf +coI +aTV +bVT +cEj +bWA +bSG +bSL +bSS +bUJ +bSS +bSL +bSC +brZ +btf +btU +cec +brU +ced +cej +bCh +bRL +bIs +ccC +bRZ +cFn +cGc +bMj +bMj +bMj +cfb +cFP +bCh +aaa +aaa +aaU +cpz +bNr +bQU +cuv +cLC +cCQ +cwT +aaa +aaa +aaa +aaa +cPk +abM +cPp +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(104,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +abM +acf +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bUo +aaU +acL +afF +aip +beV +aco +amd +aaj +cit +ciw +ciz +ciB +bGV +bHm +aLu +ata +ata +ata +awT +aAk +cjN +atc +aIG +aRU +aDX +aYI +atc +aVQ +aWa +aWa +cCV +aYt +aBY +aOB +aNO +bcQ +aNL +aUL +aXR +aQK +aRW +bzT +cnq +aVe +aRH +aVe +aWc +aRW +bcR +bcR +bcR +bcR +bmi +bnx +bpn +bQx +bqA +aZy +aZy +aZy +aZy +bav +bWh +csG +bQA +aZy +aXf +bZJ +bZF +cpu +bax +bZV +bZX +ccY +cab +bZH +aaa +aaa +aaa +aaa +aUk +aUk +aUk +cnm +czz +aUk +aUk +bWa +cEk +bWa +bSE +bSM +bST +bSZ +bTf +bTm +bSC +bsa +buA +bJK +ceg +bqT +cee +cef +coc +bTz +bTE +ccD +bTE +bTE +cGd +cvT +cFA +ckh +cFK +cFQ +bCh +aaa +aaa +aaU +cpz +bNv +cAC +cCk +cCv +cCS +cpz +aaa +aaa +aaa +aaa +aaa +aRv +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(105,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +acM +aWj +aWj +aaa +aaa +aaa +adj +adj +adj +adj +adj +adj +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaj +aaj +aaj +aaj +aaj +aaj +aaj +aaj +aaj +avi +aal +aal +aal +bGW +aco +apH +aoF +auP +bGf +bHh +cqd +cBb +aFP +aKi +aMN +aQw +coU +atc +aVV +aSg +aXM +aYq +aYt +baB +aOB +aQo +bix +bcS +aQo +aXR +aQL +cjq +aQL +aQL +cjq +aQL +aQL +aTS +aRW +bcR +bjG +blk +blF +bmn +bnz +bpw +bQx +bll +aZz +cpm +bad +bah +baR +bWi +aWh +cmN +aZy +aXg +bZK +bZF +csH +bay +bKw +bZH +bZH +bZH +bZH +aaa +aaa +aaa +aaa +aUk +bnl +bAz +aWr +cDN +bmG +aUk +bWr +cEl +bWB +bSE +bSN +bSU +bTa +bTg +bTn +bSC +bRH +bth +cOd +ceg +brl +cef +cnZ +bRI +bTA +bVO +cfN +ckd +ckd +cGe +bMj +bLI +ckj +cFL +cnX +bCh +aaa +aaa +cpz +cpz +cpz +cAD +cCl +cCw +cpz +cpz +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(106,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +adj +aeC +afv +adF +agM +adj +aaa +aaU +aaU +aaj +aaj +aaj +aaj +aaj +aaj +aau +ahn +ajH +ajY +alB +amj +ape +aal +ciu +aal +ape +amj +aCM +bHd +afX +atc +auW +avL +axw +cqH +bhN +aIC +aDP +aPs +aGh +csn +atc +aVZ +aXL +cqN +aYq +aYt +baH +bcR +aPr +biC +beJ +bft +bdg +aaa +aaa +aaa +aaa +aaa +aaa +aQL +aTS +aRW +bcR +bjX +cpn +blJ +bmZ +bnA +bpy +bQI +bll +aZA +aZI +bae +chP +baS +bWj +baS +bbr +aZy +bKR +bZF +bZF +cjx +bay +baX +bZH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aUk +bwK +bAF +aXm +cDN +bmG +aUk +bWc +bWo +bWC +bSE +bYV +cEC +cEL +bTh +bSC +bSC +bRJ +bth +bTB +cek +cAo +cKk +cKl +cKm +cKn +cKo +bRX +crW +bIq +cqZ +bMj +bLW +cFF +cFM +cnY +bCh +aaa +aaa +cpz +cvU +ctO +cAE +bNs +cLF +bNA +cpz +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(107,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +adj +aeR +afx +aga +afI +adj +aaa +aaa +aaU +aaj +aaE +acn +acn +acn +acn +afw +acn +ajN +amS +amS +aoX +amS +amS +aDE +amS +amS +aKR +apY +bRa +cjO +atc +aVr +avM +avL +csw +aBK +aID +aLX +aSJ +aHZ +atc +atc +ayd +ayd +ayd +chJ +aOo +baM +bcR +aPr +biC +beJ +bft +bdg +aaU +aaU +aaU +aaU +aaU +aaU +aQL +aTS +aRW +bcR +bku +bll +blK +bmn +bnD +bpC +bQx +bll +aZC +aZN +bCS +bak +bAI +bWk +cdE +bbs +aZy +cry +crA +bZF +cCJ +baE +bZS +bZS +bGI +aaa +aaa +aaa +aaa +aaa +aaa +aUk +bwM +bAN +aXs +cDN +bmG +aUk +bWb +cEm +bWL +bSE +bSP +cED +bTb +bTi +bSC +brk +bsp +bth +bth +ceg +brU +bSX +cel +bCh +cEQ +bXn +bRY +bSa +bSc +bSg +bMj +cFB +cFG +cFN +cvw +bRI +aaU +aaU +cpz +bMN +bMJ +cAG +bMJ +cLG +bNB +cpz +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(108,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +add +adC +adC +adC +aeS +adj +adj +agN +ahL +ahL +ahL +ahL +afD +afQ +age +age +agy +age +age +afC +akK +akG +alC +aal +ape +aal +aDU +aal +bGH +aal +aOH +aal +arb +atc +atc +atc +atc +csA +aCa +aCa +aId +aIx +aJx +aVc +ayd +cfR +aLl +ayd +cDk +ayd +ayd +bGI +aPw +bmC +aYP +bft +bcR +bdg +bdg +bdg +bdg +bdg +bdg +bcR +bgN +bgF +bcR +bcR +bcR +bcR +bna +bnP +bpF +bQY +bqK +aZy +aZy +aZy +bak +baw +bWw +aZy +aZy +aZy +bZH +bZH +bZA +cCK +bZH +bZS +bSB +bTT +bTW +bTW +bTW +bTW +bTW +bTW +bmE +bUu +aUk +aXt +cDK +aXt +bwm +bWa +cEn +bWR +bSH +bSG +cij +bSG +bSC +bSC +bhx +bqv +bti +btY +cod +cdZ +bss +cem +bRI +cER +cEU +bCh +bCh +bCh +bSh +bMj +cFC +cFH +bCh +bCh +cpz +bMl +bMl +cpz +bMO +bMJ +cAH +cvy +cLH +bNC +ctD +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(109,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adf +aad +aad +aad +aad +aad +aad +aad +aad +aad +aad +adM +aaj +aaI +ami +akX +akX +akX +akX +aqV +arS +akX +akX +akX +akX +avN +awy +avN +avN +avN +aBk +avN +aDa +aDS +aDS +aDS +aBy +cwf +cBc +cBu +cBE +cKD +cBo +cBZ +cCb +cCe +cCe +cCe +cDl +cCn +cCp +cCq +aRb +bjU +aYQ +bgc +bgd +bgd +bgG +bgd +bgd +bgd +bgd +boo +bTw +bgE +coO +bkx +blo +blo +bnc +bnR +bpG +bQx +bqY +brM +bwr +bkx +brI +blo +bWE +blo +bGr +bIZ +bVI +blo +aYH +cCL +aYH +bGI +bTt +bGI +but +but +but +but +but +but +bUq +bUv +bUq +baL +cDO +bbl +bbA +bbW +cEo +bbl +coB +bbl +cEF +buD +bCX +bqc +brm +bst +bst +bst +csj +bst +bst +coV +bCh +cES +cEV +cFj +cFj +cFo +cFr +cFt +cFD +cFI +cFO +cFR +ctD +bMo +cob +cpz +bMP +bMJ +cAK +bMJ +cLI +bND +cDe +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(110,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adf +aad +aad +aad +aad +aad +aad +aad +aad +aad +aad +aiM +aaj +aaI +aco +akX +alA +aoe +apA +aqX +arU +apA +atN +auv +akX +avO +awz +ayp +azb +avN +aBl +aBP +aDc +aBQ +aEJ +aFM +azP +aFf +aIu +aKJ +aKJ +cKE +aKJ +aKJ +aKJ +aKJ +aKJ +aKJ +aXK +aYw +aYV +baJ +bcf +bke +bmq +bmL +bgu +beJ +beJ +beJ +beJ +beJ +beJ +beJ +biS +bjR +cCG +bUw +cCG +cCG +bpx +cCG +cCH +bRf +cCG +cCH +cCG +bUw +bVJ +cCG +bWF +cCG +cfz +cCG +cCG +cCH +cCG +cCM +cCG +cCN +coM +cpr +cpx +cpx +cpx +cpx +cpx +cpx +crV +crY +crZ +csJ +cDP +bUI +bUI +bVB +cEp +bUI +cqe +cqg +cEG +bdv +bDd +bqe +brq +bst +bst +bVP +cKh +btj +btj +bAo +cuW +cET +cEW +bQk +bQk +bQk +bQu +cFu +cFE +cFJ +bQL +cFS +cFT +cFU +bNg +bNh +bNj +bNw +cPc +cCm +cCx +cDb +cDf +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(111,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adf +aad +aad +aad +aad +aad +aad +aad +aad +aad +aad +aiM +aam +aaI +acw +akX +alE +aoi +apD +arf +arZ +atp +atT +aux +akX +avR +awC +ayq +azp +avN +aBo +aBQ +aDd +aBQ +aEK +aFM +azQ +aFi +cBe +aEv +aEv +aEv +aEv +aEv +aEv +aEv +aEv +aEv +aMH +aMS +aNI +aOS +aQD +bkP +aZJ +beJ +beJ +beJ +beJ +beJ +btG +beJ +beJ +beJ +biW +bqd +bcf +bwU +bcf +bcf +bCi +bcf +bCp +bcf +bcf +bCs +bcf +bwU +bCD +bcf +bcf +bcf +bGt +bJB +blB +cCI +blB +blB +bRg +bWH +bWM +bZr +cde +cmF +crk +cmF +cmF +cwU +cAT +cBA +cCT +cCU +cCY +cCU +cCU +cCZ +cDQ +cEq +cID +bZm +cEH +bdv +bDd +cyy +cyA +bst +cyE +cyK +buJ +bst +bst +bAq +cuX +bFJ +cEX +cqW +bWD +cqb +bKy +cFv +bJI +bJI +bLL +bMa +ctF +coJ +cpb +cpz +bMR +bNx +cBD +cLA +cCy +cLP +cLT +cLU +aaa +aaa +aaa +aaa +aTd +aaa +abp +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(112,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adf +aad +aad +aad +aad +aad +aad +aad +aad +aad +aad +aiM +aap +abd +abT +akX +alO +aok +akX +arh +asb +akX +atY +auB +akX +avS +awC +ayr +azA +aAf +aBr +aBR +aDf +aDZ +aEN +aFM +aAe +aFC +cAW +aHk +aIi +aHQ +aHQ +aHQ +aJT +aHQ +aHQ +aHQ +aHQ +aOz +aHt +bGI +bGI +bkU +aZJ +bGI +bGI +bGI +crr +bjj +bjj +bjj +bjj +bIP +bje +bqn +bjj +bkx +blC +blO +bnr +blO +blO +blO +baf +bRs +bxk +bkx +bjj +bFA +bjj +bIP +bGA +bGE +bLg +bMG +bPR +bGE +bRy +bSA +bTw +cwW +bTY +bTY +bTY +bTY +bTY +bTY +cwX +cqY +bUE +baO +cDR +bFc +bFc +cDa +cEr +bPQ +cIE +cEz +cEI +bXi +bXq +caQ +bXC +bXL +cyF +bst +buK +bst +bst +bKi +bPP +bQa +cEY +bvn +bJg +bQl +bYG +cFw +bpa +bQn +bQC +cmZ +cpz +cvs +cwg +cpz +bMl +bNy +cBG +cpz +cCz +cpz +cpz +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(113,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adf +aad +aad +aad +aad +aad +aad +aad +aad +aad +aad +adM +aaq +aaI +acF +akX +akX +akX +akX +arj +ase +akX +akX +akX +akX +avX +awF +ayt +azC +avN +aBt +aBZ +aDd +aEd +aEO +aFM +aAj +aIk +cBf +cBv +aIj +aHs +aHs +aHs +aHs +aHs +aHs +aHs +aHt +aNp +aHt +aPb +bGI +blm +baq +bGI +aPb +bGI +bgL +bGI +bdg +bdg +bdg +bGI +bjh +bqF +bGI +aWB +bsl +cjJ +aXH +cbA +cbH +ckZ +aZv +bRP +aWB +aWB +bDN +cpv +bDN +bGI +bdg +bdg +bGI +bGI +bGI +bGI +bRB +bGI +bTt +bGI +but +but +but +but +but +but +bUq +bUv +bUq +baQ +cuR +cvl +cvl +cKe +cNh +cNw +cIF +ccp +bqo +buF +bDm +bqe +ceY +bst +cyG +bst +cDE +cDG +cEa +buS +buS +bFX +cEZ +bAs +ayY +baT +baT +cFx +bpb +bqO +bru +coY +cpz +bMr +cwh +cwl +bNm +bNz +cBT +cpz +cCD +cDc +cpz +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(114,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +adh +adC +adC +adC +afb +adj +adj +agO +adj +adj +adj +adM +aat +abf +acF +acI +aem +aex +aht +aRz +brB +ank +arJ +amo +acF +avN +avN +avN +avN +avN +aBw +aBZ +aDo +aDo +aEP +aFM +aAj +aFC +cBg +aIj +aHs +aHs +aaU +aaU +aaU +aaU +aaU +aaU +aHY +aHY +aHY +aHY +aHY +bln +bmy +aNT +aNT +aNT +aNT +aNT +aaa +aaa +aaU +aSt +bjk +bqG +aWB +aWB +aWK +aXo +aXI +aYn +cda +aZj +aZw +bRQ +aZQ +aWB +aWB +bGI +bGI +bGI +aaU +aaU +aaU +bGI +aSV +bGI +bRW +bgY +cgC +bTT +bTZ +bTZ +bTZ +bTZ +bTZ +bTZ +bUr +bUz +bUq +bbh +cuR +cvm +cDn +cKf +cNi +cvl +cIF +ccp +bqr +bbh +bbh +bqm +bqm +cdW +cyG +bst +cDF +cDJ +cKC +cDh +cPR +bFJ +cFa +cFk +cFl +cFp +cFp +cFy +bbt +bqP +brO +bQB +ctD +bMs +bMA +cwm +bMT +bNG +cCa +cCo +cLL +cDd +cwg +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(115,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +adj +adY +afc +afy +agb +adF +ahM +ahM +aie +adM +bHX +abY +acF +acV +adi +aeT +afq +aij +cdI +adi +adi +anl +acF +aVD +axP +aCA +bGM +avN +avN +aCh +aDp +aDp +avN +aDS +aAU +aFC +cBh +aHs +aHs +aaU +aaU +aaa +aaa +aaa +aaa +aaU +aHY +aTL +aVA +aWi +aWo +blr +aXq +bbj +bda +bol +aSl +aNT +aaa +aaa +aaU +aSt +bjk +bqG +aWB +aWG +aWM +aXr +aXJ +aXr +cjG +aXr +aXr +bRU +aZR +aWI +aWB +aaa +aaa +aaa +aaa +aaa +aaa +bGI +bGI +aRy +bSk +aRy +bGI +bGI +aaa +aaa +aaa +aaa +aaa +aaa +bUq +bUq +bUq +aaa +cuR +cvn +cDo +cLB +cNj +cvl +cIF +ccp +cpH +bbh +bpA +bXz +bqm +cmU +cyG +bst +buS +cDZ +czg +czt +cPS +czD +cFb +bEl +bJn +bQm +cbf +bop +bpe +bQz +bXD +cna +cvo +cvO +cwi +cwn +cwu +cAB +cCc +cCr +cLD +cuv +cCr +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(116,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +aaU +aWj +aaU +aaU +aaU +adj +adY +aeR +adF +adF +adF +adF +adF +aig +adM +aiZ +ajL +acF +adg +adi +aeU +aeU +agr +alD +anj +ajJ +ajJ +auM +ayD +ayD +ayD +aIe +aLg +aEo +bnJ +bHo +bHq +bHf +arw +aBg +aGg +cBh +aHs +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aHY +aVg +aQF +bba +bcK +bmg +bmD +bmR +bnK +bnL +aSm +aNT +aaa +aaa +aaU +aSt +bjk +bqG +aWB +aWI +aWO +bPz +bQf +aYs +cjZ +aYs +aYs +bSV +aZS +aWG +aWB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bqX +bSr +bqX +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +cuR +cvp +cFY +cLE +cNk +cuR +cIF +ccp +cJe +bbh +bpB +bPw +bqm +bsG +cyG +bsG +buS +bAJ +czh +czu +cPT +czE +cFc +bEl +aJD +bbx +bbZ +boq +bpg +bpg +bAy +bQJ +cpz +bMu +bMC +cwo +bMU +bNc +cCg +cCr +cLD +cuv +cCr +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(117,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +abp +aar +aTd +aWj +abp +aaa +aaU +adj +adY +afc +afz +agk +agR +afz +ahR +afz +aiW +ajp +ajR +agj +agq +agq +agq +acH +ags +alK +agq +anR +apf +auQ +azz +azz +azz +azz +azz +aUA +boH +bDZ +bEF +bHx +bHk +aBh +aGx +cBh +aHs +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aHY +aIv +aIv +aJW +aHY +aRQ +aYe +aNT +aUO +aQU +aSn +aNT +aaa +aaa +aaU +aSt +bjk +bqG +aWB +aWI +aWP +aXy +aXN +aXy +ckg +aXy +aXy +aXy +aZZ +bag +aWB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bqX +bSs +bqX +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +cuR +cuR +cFZ +cLJ +cNl +cuR +cIG +ccw +csM +cyo +cyt +bPw +bqm +bqm +cyH +bqm +buS +caR +czi +cKj +buS +bFY +cEX +bIU +aJE +bbz +bjx +bot +bot +bjx +bAH +bQQ +cpz +cvs +cwj +cwp +cwT +cpz +cCi +cCr +cLM +cvf +cCr +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(118,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +aaU +aWj +aaU +aaU +aaU +adj +adY +aeR +afB +agp +agS +agp +agp +agp +aiX +ajr +ajW +agn +agw +ajJ +ahw +anQ +aUS +ckG +cwk +aBm +aoh +acF +arl +ayX +aDj +bGN +bGR +bHb +bvd +bHq +bHf +bHf +arw +aBi +aGx +cBh +aHs +aaU +aaa +aaa +aEQ +aEQ +aEQ +aEQ +aEQ +aHY +aHY +aHY +aHY +aHY +aTb +aWv +aNT +aNT +aNT +aNT +aNT +aSt +aSt +aSt +aSt +bjk +bqG +aWB +aWB +aWQ +aXz +aXU +aYu +ckY +aZn +aZx +bEs +bac +aWB +aWB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bqX +bSs +bqX +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +cuR +cGa +cuR +cNm +cuR +cIH +cgv +coE +bxM +cyu +cNJ +cyB +cyC +cyI +cyL +buS +buS +buS +buS +buS +bFZ +cEZ +bJa +aKZ +bbB +blv +czK +bph +bqR +bAM +cvx +bMk +bMw +bMD +bMv +bMv +cvs +cCj +cCu +cLN +cLS +cCr +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(119,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +adj +adY +aeR +afI +agt +agV +adF +adF +aih +adM +adm +aeH +acF +adJ +adi +afq +agY +aij +brB +adi +amf +aoc +asJ +asJ +asJ +asJ +asJ +asJ +asJ +bvt +aDv +bHu +bHy +bHB +aAj +aGx +cBh +aHs +aaU +aaa +aaa +aEQ +aFw +aDR +aDM +aLV +aDN +aDN +aDN +aDN +aDg +aUM +bfl +aOa +aPI +aPI +aPI +aPI +aPI +aTn +aPI +aPI +bjp +bqW +aUh +aWB +aWB +aWB +aXV +aYv +aYN +aWB +aWB +aWB +aWB +aWB +aye +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bqX +bSs +bqX +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +cuR +cGf +cLK +cNn +cuR +cIF +cgB +bqr +bbh +ciQ +bpD +bpD +cmB +bpD +cyM +cyB +cyB +cyB +cyB +czB +czF +cFd +bEl +aMm +bbC +blw +blw +blw +blw +bAT +cez +bMl +bMv +bMv +bMw +bMv +cpz +cuc +cpz +cvs +cCl +cCu +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(120,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +aaa +adj +adM +adM +afe +afL +adM +adM +ahQ +ahV +aiI +adM +adt +aeO +acF +aek +aes +afr +ahi +ail +ckH +alr +avn +apb +asJ +atB +aBU +aDk +bGO +bGS +asJ +aDz +ark +bHv +aPF +aPF +aJA +aGx +cBh +aHs +aaU +aaa +aaa +aEV +aFy +aGd +aDM +aMg +aIa +aGE +aGE +aGE +aLi +aUT +baI +aOb +aPK +aPK +aPK +aPK +aPK +aVm +btR +aPK +bjH +brc +bkV +aVv +bkR +aWB +aXW +aWB +aZd +aWB +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +bqX +bSs +bqX +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +cuR +cGg +cLO +cuR +cuR +cIF +cgB +bqx +bbh +bPw +bqq +bqq +bqq +bqq +bqq +bqq +bqq +bqq +bqq +bqq +bHC +cFe +cFk +cFm +cFq +cFs +cFz +bqt +blx +bBn +ceA +bMl +bMw +bMv +bNi +bMv +coK +bMv +bNu +bMl +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(121,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adj +adP +aep +aeR +afI +agF +adM +adM +adM +adM +adM +adt +aeO +acF +ale +ale +ale +ale +aru +asf +ale +ale +ale +ale +azL +aCj +aDl +aIh +aLB +aVE +byR +bHr +bHv +aPF +bGp +aAj +aGS +cBh +aHs +aaU +aaa +aaa +aEV +aFz +aGe +aDM +aUK +aGe +alZ +alZ +alZ +alZ +aHU +aHU +alZ +alZ +alZ +aSt +aSt +aSt +bjA +aVv +cho +aWq +bro +bwa +bwY +bwY +bwY +bCl +bCn +aWd +aSt +aaU +bun +bxl +awq +awq +awq +awq +awq +awq +awq +aOe +aQv +aaU +bqX +bSt +bqX +aaU +cgI +cgN +cgN +cgN +cgN +aPg +aPg +cgP +aaU +aaU +aaU +aaU +cuR +cGh +cLO +cuR +cvL +cII +cgB +bqr +bbh +bPw +bqq +brz +bsL +bSe +bJd +bQp +byw +bzG +bAC +bCY +bHD +cFf +bEl +aOF +bbE +coX +bbE +bbE +bqS +bQy +ceB +bMn +bMv +bMv +bML +bMv +bMv +bMv +bML +bMl +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(122,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adF +adF +aeq +afj +afN +adF +adF +adj +aaU +aaU +act +abQ +aeX +abU +ale +alQ +aol +ale +arz +ash +ale +aua +auF +ale +aAL +aCw +aPi +aPi +bGT +asJ +bHj +bHs +bHw +aPF +bGs +aAj +aGx +cBh +aHs +aaU +aaa +aaa +aEQ +aHn +aWt +aWz +aWW +aIc +alZ +alZ +aog +aog +axV +axV +aog +aog +alZ +bvv +aUh +cjM +aVv +aVv +bue +bue +bxf +bBY +bue +bue +bue +aXY +bCo +aWd +cho +aaU +bup +ajO +ajO +ajO +ajO +ajO +ajO +ajO +ajO +aQa +ajO +ajO +aRy +bSO +aRy +bfh +cgJ +bye +cmI +bXa +bfh +bfh +bfh +cgJ +aaU +aaa +aaa +aaa +cuR +cHZ +cLQ +cuR +bdC +cIJ +cgB +bqr +bbh +bPw +bqq +cHW +bsM +btn +buj +bvK +bts +bts +bAD +bCY +bHD +cFf +bJb +bJJ +bKh +bKz +bKS +bLq +bKz +bLM +bKz +bKz +bMw +bMv +bMv +bMv +bMl +bMl +bMl +bMl +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(123,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adF +adX +aeu +afk +afP +agK +adF +adj +aaa +aaU +act +adv +aeO +afW +ale +alT +aom +apN +arA +asn +atr +aud +auG +ale +aAO +asJ +asJ +asJ +asJ +asJ +bHk +bHk +bHk +aPF +aHt +aKc +aGx +cBi +aHt +aDM +aDM +aDM +aEQ +aDM +aDM +aDM +aXa +bdb +alZ +aog +apB +aFc +bfj +axV +axV +apB +aog +alZ +aUh +aUP +bCC +aZb +bue +bvc +bys +bCc +bGZ +bNN +bue +aXZ +aXX +aWd +aZo +aaU +avv +ajO +aGi +axI +axI +aGi +ajO +bFf +aPE +baW +aYZ +beu +beK +bTX +bWI +bWN +cbj +cdf +cny +bXk +cgL +cvD +cvF +cgJ +aaU +aaa +aaa +aaa +aRv +aaa +aaa +bbh +bdD +cIK +cgB +bqr +bcT +bPw +bqq +ccm +bsM +bto +buj +bwf +byD +bts +bAE +bCY +bHE +cAm +cAt +cAv +cFg +bKz +bKT +bLr +bKT +bLN +bMb +bKz +bMv +bMw +bMv +bMV +bMl +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(124,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adF +adX +aey +adM +adY +agK +adF +adj +aaa +aac +acE +adU +aeO +afW +ale +alV +aon +apO +arC +aso +apO +aon +auJ +ale +aBz +aEU +aGD +aJF +aJF +aJF +aJF +bEr +bEK +bEK +bGu +bHi +aHa +cBj +cBw +cBF +cBF +cBF +cBF +cBF +cCf +aHG +aXb +aVC +alZ +aog +apG +aFN +axV +aLO +axV +aRL +aog +alZ +aUh +aUQ +aVM +aVN +bue +bvg +byE +bCu +bHa +bOB +bue +aYd +aYx +aWd +aZo +aaU +avv +ajO +bCv +axI +aNh +aNz +bDw +bFv +bHp +bLm +ajO +ajO +aRy +bUi +aRy +bfh +bfh +cdh +bzN +bYT +bYS +cvE +bYS +cgJ +bfh +aaU +aaU +aaU +aaU +aaU +aaU +bbh +bdF +cIL +ciF +bqz +bdu +caO +cov +ceb +bsN +btp +buj +cup +bts +bts +ckp +bqq +bHG +cFf +bJc +bJL +cHO +bKz +bKU +bKT +cIg +cIj +bMc +bKz +bMv +bME +bMv +bMv +bMl +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(125,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adF +adX +aez +afu +afT +agK +adF +adj +aaU +abv +acP +aef +afg +agf +ale +ale +ale +ale +arD +asq +ale +ale +ale +ale +aBH +bGz +ayu +aim +aim +aim +aim +aim +aim +aim +aEh +aEq +aHp +aIJ +aLc +aQS +aQS +aQS +aQS +aQS +aWu +aWA +aXd +bre +alZ +apB +axV +aGp +axV +csC +axV +axV +apB +alZ +aSt +aSt +cho +aSt +bue +bue +byF +bCw +bue +bOC +bue +cho +aSt +ckI +aSt +brs +avv +ajO +avY +ajO +ajO +aOI +bDU +bGg +bIF +bLz +bNe +ajO +bQb +bUj +aTh +bfh +brb +bzN +bzN +bYU +cgM +bYY +bZb +cgJ +bfh +bfh +bfh +bfh +bfh +brs +brs +bcT +bdD +cIM +ciW +bqC +bdu +bXt +bqs +brF +bsP +cnk +csi +cvu +cxf +cxh +ckD +bqq +cPx +cFh +bJe +cRb +cHP +bKA +bKV +bLs +czL +cIk +bMd +bKz +bMl +bMl +bMl +bMl +bMl +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(126,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adF +adF +aeA +aeA +aeA +adF +adF +adj +aaa +chH +acS +aen +afi +agg +ahj +ajf +ajf +ajf +aAx +alN +ano +ano +ano +auZ +aBL +bnH +axh +anq +anq +anq +anq +anq +anq +anq +anq +bID +aHu +aGr +aOJ +aOT +aOT +aOT +aOU +aOU +aOT +aXP +aOT +aOT +aOJ +aog +axV +bfj +axV +axV +axV +axV +aog +aSG +aRh +aRq +aRq +aRq +aRq +bvz +byZ +bCy +bvz +bOV +aRq +cjD +bnU +btw +bns +aya +avy +alo +awn +aIS +aNo +aJp +bDW +bGB +aHq +bki +bPp +bPU +bQi +bUU +bWJ +bWP +cbV +bzR +cvB +bOz +cwd +bYZ +bZc +cgQ +bZe +bZe +bZe +bZe +cjr +brL +brL +bVW +bVW +cIN +cjV +bdu +bdu +bXu +bqq +brH +bsQ +col +bul +cws +cxg +czM +bBs +bCY +bHI +cFf +bJc +bJN +cHO +bKz +bKW +bLt +cso +cIl +bMe +bKz +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(127,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaU +adj +adj +adF +adF +adF +adF +adF +adj +adj +aaa +abz +acX +agh +agB +aim +aim +aim +aim +aim +aqs +aqu +aim +aim +awc +axx +ayN +aAA +aBM +aCq +aDx +apy +arV +apy +axg +ceu +anq +bID +aHu +aGr +aOT +aPS +aSb +aTi +aUd +aTi +aWs +aYb +ban +bdd +aOJ +aog +ayK +bfk +axV +axV +bfj +axV +apB +aSH +aSt +aSt +aTs +cho +aSt +bue +bzD +bCE +bue +aSt +aSt +aSt +aSt +cpG +aSt +brs +avv +ajO +axZ +ajO +ajO +aPf +bEZ +bGD +bJk +bLC +cRf +bPV +bQT +bVq +cRh +bfh +cbY +cdn +cpf +bYU +cgM +bYY +bRx +cgJ +bfh +bfh +bfh +bfh +bfh +brs +brs +bcT +cIv +cIO +cgB +bTv +bcT +bQE +bqq +bqq +bqq +com +bqq +cws +byD +czP +cxf +czW +cAc +cFi +bMF +bNF +cHQ +bKz +bKT +bLr +bLt +cIm +bMf +bKz +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(128,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaU +adj +adj +adj +adj +adj +adj +adj +aaU +aaa +acb +aft +agz +adt +abB +afE +afE +afE +afE +aFu +aeO +aeY +aeY +aeY +aeY +aBN +awN +awN +anq +anT +anT +anT +anT +anT +anT +cex +bNp +aFC +aFF +aOU +aQt +aSf +aTj +aTv +aTv +aTv +aYi +baU +bdh +aOJ +aog +aog +axV +aHV +aRr +axV +aog +aog +aSH +beG +aaU +aaU +aaU +aaU +aRv +aaU +aaU +aRv +aaU +aaU +aaU +aWj +aSq +aWj +aaU +avv +ajO +aze +azJ +aNr +bCF +bDw +bPK +bKx +bmv +ajO +ajO +aRy +bVC +aRy +bfh +bfh +bBR +cqf +bYX +bYS +cvE +bYS +cgJ +bfh +aaU +aaU +aaU +aaU +aaU +aaU +bbh +cIw +bjm +cgB +bYW +bcT +bQE +bqq +cox +cNV +cpI +csK +cKi +cvR +cPP +bts +bCY +bHJ +bIt +bJf +bJO +cKp +cHS +cHU +cIb +cvv +cIn +bMg +bKz +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(129,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +abz +acP +aef +acS +abC +ahY +ajg +abI +acQ +aHr +aeO +aeY +ahB +aiY +aeY +aCk +aeY +aeY +anq +aof +cpq +asa +aoL +anT +anT +cey +bRF +aFC +aFF +aOU +aQu +aSf +aTv +aTv +aTv +aTv +aYj +ban +bdl +aOJ +alZ +apB +aog +aog +aog +aog +apB +alZ +aSH +aaa +aaa +aaa +aaa +aaa +aWR +aaa +aaa +aWR +aaa +aaa +aaa +aaU +aSq +aaU +aaa +avv +ajO +aGi +axI +aIX +aGi +ajO +cRe +aZP +bmH +aYZ +bht +bcY +bVD +beC +cgF +bfh +bBS +cqh +bXk +cvC +cvD +cvF +cgJ +aaU +aaa +aaa +aaa +aWR +aaa +aaa +bbh +cIx +bjm +cgB +bbh +bbh +bQE +bqq +brJ +bsU +crg +bqq +cyN +bqq +bzJ +czv +bqq +bHK +bIu +bJh +byQ +cHR +bKC +bKY +bKY +bKY +cIo +bKz +bKz +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(130,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aai +ade +aev +act +acQ +aiy +ajk +aqR +ats +aLb +aeB +aeY +ams +ahC +akS +aCo +aor +aeY +anI +aoL +anT +asa +bEz +bES +bES +bGv +ccg +aFC +ago +aOT +aQz +aSf +aTw +aTv +aTv +aTv +aYM +bbi +aOT +aOT +aOJ +aOJ +aOJ +bmF +bnT +aRJ +aRJ +aRJ +chm +aaU +aaU +aaU +aaU +aaa +btT +bzE +btZ +btT +aaa +aaa +aaa +aaU +aSq +aaU +aaa +buv +ajO +ajO +ajO +ajO +ajO +ajO +ajO +ajO +aQa +ajO +bmM +bcZ +bVF +bTS +cgG +bfh +bEo +cqm +bZa +bfh +bfh +bfh +cgJ +aaU +aaa +aaa +aaa +ctG +cIh +ctJ +ctG +cIy +bjm +cgB +bbh +bpm +bQE +bqq +brK +bua +btv +bqq +cyO +byN +bzK +czw +bDa +coe +bIv +bJi +bDa +czw +byQ +cPQ +cIc +cIc +cIp +bxj +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(131,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +acQ +aiD +ajq +arc +atJ +bmp +bGi +aeY +ahF +apx +akU +aCp +aor +aeY +anL +aoU +anT +anT +anT +anT +anT +cex +bRF +aFC +aFF +aOU +aQB +aSf +aTv +aTv +aUU +aTv +aYj +ban +bdO +bfv +bfv +bfv +bkW +bmJ +bof +aQJ +aQJ +aQJ +aQJ +aQJ +aQJ +aRZ +aaU +aaa +bvB +bzF +bCR +btT +btT +bvB +btT +btT +cjE +aaU +aaa +bux +bxl +azq +aCU +aCU +aCU +aCU +aCU +bbu +aQj +ajO +ajO +bdi +bWm +cjI +cgH +cgN +cgO +cgN +cgN +cgN +aPg +aPg +cgK +aaU +aTx +ctG +ctG +ctG +cIi +cLR +ctG +cIy +bjm +cmn +bWZ +bXj +bXv +bqq +bqq +bqq +bqq +bqq +cyP +byQ +bzS +czw +bDb +bBu +crX +czI +bBu +cKq +cHT +cPy +cId +bLD +coA +bxj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(132,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ajw +acQ +acQ +acQ +acQ +acQ +ahD +asr +aeY +ahG +apM +akV +aqv +aor +aeY +anP +aqP +apz +asK +apz +btk +cev +anq +ccq +aFC +aFF +aOU +aQI +aSf +aTv +aTv +aTv +aTv +aZa +bbi +aOT +bfy +bgJ +bjL +blD +bmK +boi +aaU +aaU +aaU +aaU +aaU +aaU +aSq +aaU +aaa +btT +bzM +bCT +bHc +bQt +bUg +cch +ccy +aSq +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +cjH +aaa +aaU +bWv +aaU +aaa +aaU +aZB +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +ctJ +cuS +cvq +cIq +cMU +cvr +cIw +bjm +cgB +bbh +coC +bpO +bpE +bpE +bpE +bpE +bpE +cyQ +byQ +cCO +czx +czC +czG +bIw +czJ +bBu +bKm +byQ +cHX +cKP +cOM +cOM +cOM +cOM +cOM +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(133,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ajw +ajw +aki +alg +alY +aoo +ajw +bAt +aeO +aeY +aeY +apZ +aeY +aeY +aeY +aeY +anq +anq +anq +anq +anq +anq +anq +anq +ccz +aHv +aFF +aOT +aQP +aSf +aTv +aTv +aTv +aTv +aZc +bbH +bdP +bdP +bgR +bdP +aOJ +aPN +bes +aaU +aye +aye +bQe +aye +aaU +aSq +aaU +btT +btT +bzP +bCZ +bKl +bQW +bUp +cci +btZ +aSq +bgh +bIY +bIY +bRo +bIY +bRo +bIY +bIY +bIY +bIY +bIY +bIY +bRp +aaa +aaU +bWv +aaU +aaa +aaU +aZB +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +ctK +cuT +cuT +cuT +cMV +cNo +cIz +bWO +cIX +bZh +bZh +bZh +bZh +bZh +bsV +bze +bpD +cyR +byQ +crq +csp +bPS +bQc +bQj +bQo +bJP +bKn +byQ +cHY +cyS +cOM +cOQ +cOV +cOZ +cOM +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(134,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +cpB +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +apv +apv +crP +ajw +ajX +akk +ali +amn +aop +aqb +bEI +bGj +aff +ahH +aqG +akW +any +aos +apk +atQ +atL +atk +bBd +bFN +atM +bFR +aff +cfe +aIk +aIU +aOX +aQQ +aSf +aTv +aTv +aUW +aTv +aZc +aVf +bdP +bfF +bha +bdP +abp +aPN +bes +aaU +aye +aaU +aaU +aaU +aWj +aSu +aRZ +btT +bwh +bAe +bDD +bKr +bRl +bUL +btT +btT +cjE +bsz +aaU +aaU +cdV +cdV +cdV +cdV +cdV +cdV +cdV +cdV +cdV +cgi +cgD +cdV +chy +chN +bWQ +bWQ +cdo +aPg +aPg +cet +bpL +bBO +bBO +bBO +bBO +ctG +ctG +cvr +ctG +ctG +ctG +cIy +bjW +cKO +bZh +bZk +bZn +bZq +bZh +cEE +bpD +cmL +cyS +byQ +byQ +byQ +byQ +byQ +byQ +bKk +byQ +byQ +byQ +cOD +cIe +cON +cOR +cOW +cPa +cOM +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(135,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aYp +cdc +crQ +ajF +akc +akm +alk +amH +aoz +ajw +agA +alP +anA +aot +aqK +avo +aCs +aFo +aot +aot +aot +aot +bCO +ahJ +ahJ +ahJ +ahz +bRF +aEu +aJc +aPa +aQR +aSz +aTz +aTz +aVb +aTz +aZg +aVf +bdW +bfJ +bhc +bdP +abp +aPN +bes +aaU +aye +aaU +aWj +aWj +aWj +aSv +aSu +buk +bwz +bAi +bEe +bKL +bRE +bUY +ccj +aSw +aaW +bsz +aaa +aaa +aaa +aye +aaU +ceR +cfa +cfo +cfp +cfC +cdV +cgl +cgR +chr +chz +chX +cdV +cdV +ckJ +cdV +cdV +cdV +bpN +bCa +bSo +bSv +cfl +ctX +cuU +cwr +cIr +cMW +ctG +cIA +cIP +cIY +cJf +cJg +cNC +bZo +bZs +bXN +bJp +bJp +cyT +bPs +bYC +bPN +bPN +bPN +bPN +cAu +cCh +cCh +cCh +cIa +cIf +cOO +cOS +cOX +cPb +cOY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(136,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +agd +cdc +crR +ajF +akf +akh +ali +amR +ajw +ajw +bGc +aeO +aff +ahS +ajQ +axO +anX +aoC +apl +ahJ +cpd +ahJ +aqG +bED +bET +bET +bGw +chQ +cAV +aJc +aOT +aQX +aSE +aTC +aUe +aVf +aVf +aSE +bcd +bdY +bfM +bhg +bdP +abp +aPN +bey +aaU +aye +aaU +aaU +aaU +aWj +aWj +aWj +btT +bwB +bAm +bEh +bLo +bSz +bVa +btT +aaU +aby +bsz +aaa +aaa +aaa +aye +aaU +ceR +cff +cfo +cfA +cfH +cfW +cgo +cgS +chr +chA +chY +ciY +ckt +clY +cnx +cpK +cdV +bBE +bCa +bSp +bSw +cfl +cuu +cuV +cwE +cuV +cMX +ctG +bdG +cIM +coa +cwH +cyq +cyw +cJh +bZh +bsY +btx +bum +cyU +czd +czj +blp +blp +bme +bxj +bxj +bxj +bxj +bxj +bxj +bxj +cOM +cOM +cOY +cOY +cOY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(137,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aYp +cdc +crR +ajF +akh +akh +alp +amT +ajw +awN +bGc +ahI +aff +ahW +ajQ +ayi +anX +aoC +aqh +ahJ +ahJ +ahJ +aqG +bEE +bFQ +bFS +ahz +aAj +cAW +aJC +aOT +aRc +aOT +aOT +aOT +aOU +aOU +aOT +aOT +bdP +bdP +bhl +bdP +abp +aPN +bes +aaU +bQe +aye +aye +aye +aaU +aWj +bnS +buq +bwC +bAr +bEx +bMz +bSD +bVu +bvB +aaU +aby +bsz +aaa +aaa +aaa +aye +aaU +ceR +cfa +cfo +cfB +cfH +cfW +cgo +cgU +chs +chs +chZ +ciZ +cku +cmf +cnK +cnK +cdV +bBO +bUB +bSq +bVf +cfm +cuw +cuV +cuV +cuV +cMY +ctG +bdH +cIM +coi +bZh +bZh +bZh +bZh +bZh +bsZ +bsZ +bsZ +bxj +byU +czk +blp +coy +cdd +aYp +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(138,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aax +aax +aax +aax +aax +apv +crS +ajw +ajw +akx +ajw +anc +ajw +axe +bGc +aeO +ahz +aiw +ajQ +alL +anX +aoC +aqi +ahJ +ahJ +azK +bDo +bFK +bFK +bFT +aff +aAj +cAW +aJQ +aHO +aRB +aIO +aTG +aUj +aVi +aWD +aZh +aTG +aaU +aaU +cuA +cuy +bcc +bcO +bes +aaU +aaa +aaa +aaU +aaa +aaU +aTy +btT +btT +bwL +bwL +bEY +bMB +bSF +bVA +btT +aaU +aby +bsz +aaa +aaa +aaa +aye +aaU +ceR +cff +cfp +cfC +cfI +cdV +cgp +chb +cht +cht +cia +cjh +ckw +cmg +cof +cof +cpY +cwq +cwV +cAU +cfh +cos +cuF +cva +cyp +cuV +cMZ +cvr +bdG +cIM +cgB +coF +bcT +aaU +aaa +aaa +aaa +aaa +aaU +bxj +byU +czk +blp +ctH +cdd +csc +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(139,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aar +aTd +aWj +aaU +aaU +aaU +aaU +aaU +aaU +aax +aaX +abs +abs +abu +cqV +csa +acs +adu +adQ +ajw +anf +ajw +awN +bGc +aeO +ahz +aiw +ara +ays +anX +aoC +arm +ahJ +atM +aAl +bDO +bFL +bFL +bFU +ahz +aAj +cAW +aKD +aLT +aSo +aSP +aTI +aUl +aVn +aWL +aWL +bce +aaa +aaa +aaa +aaU +brs +aPR +cux +aaU +aaa +aaa +aaa +aaa +aaU +aWj +btZ +bus +bwQ +bBk +bFa +bMI +bSI +bXp +btT +aaU +abH +bAA +bMK +aZp +ceq +cet +cet +cet +cet +cfr +cfE +cfJ +cdV +cgu +chg +chs +chB +cib +cjs +cky +cmE +cok +cok +cdV +bBO +bPv +cBd +cfi +cfm +cuH +cvb +cvd +cvd +cNa +cNp +ber +cIQ +cgB +bqN +bcT +aaU +aaa +aaa +aaa +aaa +aaU +bxj +byU +czk +blp +cqT +cdd +aYp +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(140,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aax +aaZ +abt +abt +abK +cqV +abN +abL +adQ +adQ +ajw +ajw +ajw +awN +bGc +bGl +ahA +aiQ +ard +alI +anX +aoC +aqh +ahJ +apP +aAl +bFL +cqi +bEU +bFV +bGx +chW +cAX +cBo +aMw +aSp +aTA +aTK +aUm +aVo +aWN +aZk +bcg +aaa +aaa +aaa +aaU +brs +aQp +cux +aaU +aaa +aaa +aaa +aaa +aaU +aWj +bud +buE +bwS +bBv +bFb +bMS +bBv +bXM +bvB +bWq +acY +adz +bsz +aaa +aaU +cdt +ceK +ceK +cdV +cft +cfF +cfK +cgb +cgw +chj +aXF +chD +cid +cju +ckz +cmG +coT +cpL +cpZ +bBO +cxd +cBd +cfj +cfl +cuI +cuV +cyv +cuV +cNb +cNq +beW +cIM +cgB +bqV +bcT +aaU +aaa +aaa +aaU +aaU +aaU +blp +btK +czl +blp +cqU +bBZ +bme +bme +bme +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(141,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaU +aaU +aax +aba +aax +aax +aax +aax +aax +acR +abL +adQ +aQO +aei +atZ +aFv +bGd +bGm +aff +aiR +arg +amu +amu +api +ahJ +ahJ +ahJ +aAl +bFL +bFL +bFO +bFU +ahz +aCm +aEx +aGJ +aNm +cBK +aJr +aTG +aUn +aVp +aWT +aZl +aTG +aaU +aaU +aaU +aaU +abp +aQq +bes +aaU +aaa +aaa +aaa +aaa +aaU +aTy +btT +btT +bwT +bBB +bGb +bMW +bTF +bXM +btT +btT +btT +cjF +bMX +cdt +cdt +cdt +ceL +ceT +cdV +cfu +cdV +cdV +cdV +cdV +chk +chu +cdV +cdV +cdV +ckA +cmY +cdV +cdV +cdV +bBO +bSm +cBk +cfk +cfl +cuJ +cvc +cyz +cuV +cNc +cNr +byT +cIR +coj +byT +bzY +aaU +aaa +aaa +blp +bme +bme +blp +btL +czm +bzq +bui +clZ +buo +buo +bme +bme +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(142,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aax +aax +aea +adQ +adQ +aer +auc +apv +agJ +amp +aff +aiS +art +amv +akR +apj +atA +atK +aqg +aCO +bFM +bFP +bFM +bFW +aff +azP +azP +aGQ +aNv +cBL +bhR +aTM +aTM +aTG +aTG +aTG +aTG +aaa +aaa +aaa +aaU +abp +aQr +bes +aaU +aaa +aaa +aaa +aaa +aaU +aWj +bnS +buq +bwZ +bBC +bGk +bNf +bBv +bXM +ccn +ccA +ccy +aTl +bsz +cdG +cer +cew +ceM +ceV +asU +arB +asw +atb +avl +aMa +crv +aOE +aQc +clz +aMa +aQd +cks +crv +crx +aeI +bBO +bSn +cBl +bSn +cfl +cuK +cuV +cyz +cuV +cNd +cNs +beY +cIM +cgB +btl +bBl +aaU +aaa +aaa +bme +bnY +bpT +bqL +btL +czn +czy +bui +bui +bui +bui +bui +bme +bme +bme +bme +bme +bme +bme +bOn +bme +bOo +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(143,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aax +afO +ala +abL +aet +aeK +afU +ahe +aiJ +ahz +ahz +arI +ahz +ahz +aff +aff +aff +aff +aff +ahz +ahz +ahz +aff +aff +aka +aka +aCe +aNB +aDh +aka +aql +aql +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +abp +aQr +beD +cuy +cuy +cuz +aaa +aaa +aaU +aWj +aaU +btT +bxa +bBF +bGy +bNk +bUc +bXM +cco +ccE +btZ +aTl +bsz +cdU +ces +ces +ceN +ceW +cJv +mkx +cJw +cJN +asR +awe +asS +asS +asS +asS +avC +aQe +ckx +cqP +crl +csQ +cqs +cqG +crt +cdm +ctl +cuL +cvd +cAp +cvd +cNe +cNt +beZ +cIS +coz +bty +bBl +aaU +aaU +aaU +bme +bog +bpT +bqM +btL +czm +bui +cOw +bui +bui +bui +bui +bui +bui +bui +bNW +bOa +bOe +bOi +cnd +bOl +bOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(144,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +adn +ahZ +amP +aea +adQ +ayk +aGZ +aKn +bEG +bEX +bEX +asg +bEX +bEX +aXv +bEM +bEO +bEP +amE +asp +auh +ayG +aNX +aEA +bvi +bvF +bvL +aXn +cBM +bDS +bER +aql +aaa +aaa +aaa +aaa +aaa +aaa +aVs +aVs +aUq +bmO +aUq +aVs +aVs +cuA +cuz +aaa +aaU +aWj +aaU +btT +btT +bBH +btT +bNl +bvB +bXM +btT +btT +btT +cjF +bMX +cdt +cdt +cdt +ceO +ceX +aeI +aQx +asD +asR +asR +avE +avQ +avQ +avQ +avQ +bem +aQe +asR +aSK +aSr +aeI +bxz +bwP +cBn +cBH +ctE +cuM +cvg +cBa +cJk +cNf +cNu +bSy +cIT +coD +bub +bIo +aaU +cNK +aaU +bme +bom +bpT +bqU +btL +czo +bPO +bPT +bQd +bQd +bQr +bJo +bNQ +bNQ +bNQ +bNX +bOa +bOe +bOg +bui +cnf +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(145,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aae +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +adq +aib +asy +aea +ann +azG +aag +ael +agQ +aje +akM +anz +akM +akM +apq +aqZ +avT +avT +aCN +avT +avT +aAb +avT +aCN +avT +avT +aHl +aNY +cBN +cbZ +bEa +amy +aaa +aaa +aaa +aaa +aaa +aVs +aVs +bjO +bmk +bmU +bok +bpr +aVs +aVs +cuA +cuy +cuz +aWj +aaU +aaa +btT +bBV +btT +bNn +btT +bYf +btT +aaU +aVt +adN +bsz +aaa +aaU +cdt +ceP +ceK +aeI +arN +arF +asS +auC +avH +axM +axM +axM +axM +aPh +aQk +asS +aSK +aTW +aVB +cqu +bwR +cBx +cBI +ctG +ctG +cvh +cBm +cJy +cNg +cNs +cIB +cIM +bXX +bty +bBl +aaU +bIm +aaU +blp +bme +bme +brv +btL +czp +bAW +bBm +bui +bui +bQs +bNH +bme +bme +bme +bme +bOb +bme +bOh +cne +bOm +bOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(146,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +adn +ajh +amP +aea +adQ +ayk +aGZ +aKn +alR +bqQ +aox +anD +aox +aox +aFp +aHh +aJS +aMy +axG +aJS +aHh +aHh +aHh +aCz +aHh +aHh +cBq +aRT +cBO +cca +bEa +amy +aaU +aaU +aaU +aaU +aaU +aVs +bhq +bjY +bka +bmV +bka +bps +ang +ang +ang +ang +cuB +aWj +aaU +aaa +btT +bBX +btT +btZ +btT +aaa +aaU +aaU +aTl +qeq +bPh +guK +hXk +hXk +cJp +hXk +hXk +tjb +asx +asS +auD +awX +axQ +beH +axQ +aZt +avI +beI +asS +aSL +aTZ +aWV +cqv +bwV +cBy +cBJ +cdy +cuN +cvi +cBB +cvi +cuN +cNv +bhT +cIM +bXX +bty +bzr +byT +cfc +bcT +bmf +bon +bpU +brN +btL +czq +bme +bBm +bui +bui +ctV +blp +bme +aaU +aaU +aaU +aaU +bme +bme +bme +bme +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(147,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aax +ajm +aoQ +ach +adQ +aFr +aKg +ahO +aml +abX +akd +aoA +awt +aDb +aqL +anB +alS +aMC +apR +atP +aji +azm +azm +aCB +azm +aRM +bar +aSD +cBP +bDV +bEb +aUq +aVs +aVs +aVs +aVs +aVs +aUq +bhv +bka +bka +bnb +boV +bpt +aRF +cog +bnt +ang +cuC +cuD +cuD +cuy +cuE +cuD +cuy +cuy +cuE +cuy +cuy +cuD +cuG +eUF +bsz +aej +agc +agT +cJq +apm +aqS +arP +cph +asS +auN +avK +axR +aAy +aOk +aOR +aPm +aPm +bBo +aTm +aUb +bAR +bnf +bwR +cBx +cCR +cdz +cPI +cdJ +cdM +cdJ +cdO +cPK +bbY +cIM +bZl +cwO +cyr +cyx +cyr +cyr +cyD +cyJ +cyJ +cyV +cze +czr +bme +bBm +bui +bui +bJq +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(148,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aax +aax +aea +adQ +adQ +adQ +aFt +apv +aiF +amr +aqL +aoy +aoD +aoj +aDm +aqL +aji +aKs +aNl +apU +atP +aji +aBT +buP +aCD +bvl +bvZ +bas +aSD +cBQ +ccb +cBV +aUw +aVx +aWU +aZm +aWU +aVx +bfO +aVx +aWU +bms +bnd +boX +bpH +ang +coh +cfy +clO +aRu +aSv +aSy +aSw +aTk +aQJ +aQJ +aQJ +aQJ +aQJ +aQJ +aRZ +aVK +cxa +bPr +sVC +aNH +bbQ +cJA +aqO +anE +anE +anE +aQT +ayb +axt +aCZ +aRG +aOl +aOV +avQ +cmX +aRp +bkJ +aUf +aeI +bnp +cmO +cfU +cmm +cri +cdH +cdK +cPu +cdr +bqw +cdS +bUs +cIU +coL +cyk +cys +baN +baN +baN +coq +box +box +cyW +cpy +bPD +bAY +bBw +bCA +cql +bJq +bNI +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(149,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaU +aaU +aax +aba +aax +aax +aax +aax +aax +adr +ach +adQ +acT +afR +apv +apv +ajb +amt +anH +aAQ +aoG +bvp +aDF +aFk +aHh +aKB +aNu +aou +aou +aji +aBW +aBX +aCF +buX +bAh +bat +aSD +cBP +bDX +cBW +aUq +aVs +aVs +aVs +aVs +aVs +aUq +bhO +bka +bka +bno +boZ +bpJ +apd +bfI +clH +ang +aRX +aSw +aSM +aaU +aTl +aaU +aaU +aaU +aaU +aaU +aaU +aSu +aYU +cxb +bsz +aej +agC +aoJ +cJB +apm +aqT +arQ +cpi +asS +aTQ +avU +ayn +aFU +aOq +aOY +aPO +aPO +bCW +bvY +asB +bAR +bnq +bEW +bQF +cah +cdA +cPJ +cdL +cmv +cdL +cdQ +cPL +bUD +cIV +coN +cyl +bzI +bHn +bzI +bzI +cor +boy +boy +cyX +btO +bPE +bme +bBm +ccx +bui +bJq +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(150,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aax +abb +abs +abs +abu +cqV +acg +ach +adQ +adQ +adS +adS +adS +adV +ajd +ajj +aqL +azr +bwl +bEn +anJ +aqL +awh +amx +aNU +aqj +aji +aji +aFV +aiv +aMj +amA +bDu +bat +aSD +cBR +cbZ +cBX +amy +aaU +aaU +aaU +aaU +aaU +aVs +bid +bkv +bka +bnw +bka +brA +ang +ang +ang +ang +aaU +aaU +aaU +aaU +aTl +aaU +aaa +aaa +aaa +aaa +aaa +bgh +bGQ +bIT +bPX +aaU +atF +atF +cJC +atF +atF +arO +asC +asS +auY +azE +ayo +bCb +ayo +bei +avV +aQs +asS +bwJ +bfn +aXh +cqw +bSx +bQG +cbd +cdB +biL +bkD +cop +bkD +biL +boa +bhT +cIW +cIZ +cym +bzU +bzV +cuo +bcT +bnO +boz +bqp +cyY +btL +bPF +bme +bBm +ccx +bui +crj +blp +bme +aaU +aaU +aaU +aaU +bme +bme +bme +bme +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(151,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +aTd +aWj +aaU +aaU +aaU +aaU +aaU +aaU +aax +abg +abt +abt +abK +cqV +csb +ads +ajK +adQ +adS +aeG +adS +afd +ajI +afK +aqL +aqL +aqL +aqL +aqL +aqL +afK +amy +aOD +aql +awB +boO +aAp +aCn +amA +bvD +amy +bas +aSD +cBN +cca +cBX +amy +aaa +aaa +aaa +aaa +aaa +aVs +aVs +bkw +bmt +bnB +bmt +bpZ +aVs +aVs +aaa +aaa +aaa +aaa +aaa +aaU +aTl +aaU +aaa +aaa +aaa +aaa +aaa +bsz +aTl +cxc +aaa +aaa +aRD +ciT +cJD +cmu +atF +arY +awW +asS +avc +awa +clA +aLF +axM +axM +aPP +crs +asS +cpj +aUr +bmT +cqx +bwP +bQH +cdj +cdC +biQ +cjY +cot +blt +cse +bob +cjz +bjm +cIM +cym +bIp +aaU +bIx +aaU +blp +bme +bme +cyZ +btL +bPG +bBa +bBm +ccx +bui +bJR +bNJ +bme +bme +bme +bme +bOb +bme +bOi +bOj +bOl +bOp +cnE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(152,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aax +aax +aax +aax +aax +apv +crS +adS +adS +aeW +adS +apo +adS +axL +agZ +aeZ +agm +aqW +ahX +aiU +afZ +agl +apW +amz +amz +aqm +amz +amz +aAq +bGa +bGG +bGG +cAY +cBq +aRT +cBS +cBU +cBY +aqn +acK +acK +acK +aqn +aaa +aaa +aVs +aVs +aVs +bnB +aVs +aVs +aVs +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aTl +aaU +aaa +aaa +aaa +aaa +aaa +bsz +aTl +cxc +aaa +aaa +atF +ciU +cJE +cJG +cJI +cJK +cJL +cJO +asR +aOQ +bev +cbJ +aOx +aPc +beq +aQe +asR +crw +aUt +bpK +cqy +bEW +bQF +cdk +bmQ +biR +bjy +cou +csd +byr +bob +bhY +bXW +cJa +cyn +bQR +aaU +cNL +aaU +bme +bpi +bpT +cza +btL +bPH +bBc +bBM +ccx +bui +bui +bJR +bNR +bNR +bNR +bNY +bOa +bOe +bOg +bui +cnf +bme +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(153,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aYp +cdc +crR +adT +aeo +afm +aiA +apt +bve +afS +ahK +aix +ajM +akH +akH +asP +akH +akH +bhj +bEJ +cfS +bEJ +cml +amA +amA +amA +aMl +bcW +bvH +bvL +aXn +cBM +bDY +bEd +aqn +cCd +aRE +aSY +acK +aaa +aaa +aaa +aaU +anK +cAL +anK +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aTl +aaU +aaU +aaa +aWR +aaa +aaU +bsz +aTl +cxc +atF +atF +atF +cmh +cmp +atF +atF +asi +asi +cJP +asR +awe +clB +asS +asS +aPd +avC +aQe +aRR +cpj +aSr +aeI +bQq +cqI +bQM +cdl +cdu +cdN +ciK +ctd +cwC +bmw +bob +bia +bXX +cIM +bty +bIp +aaU +aaU +aaU +bme +bog +bpT +czb +btL +bPI +bUx +bUx +ccK +cOw +bui +bui +bui +bui +bui +bNZ +bOa +bOe +bOh +cnc +bOm +bOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(154,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +agd +cdc +crR +adT +aeE +afm +afm +apT +adS +bEu +ahN +afa +aha +ahx +ahx +asT +ahx +ahs +afK +aGR +aAa +are +cmo +avP +aAW +aDq +aNn +bvh +aql +aCe +aYK +aDr +aci +aqn +aqn +aRj +aND +aVX +anK +anK +aHA +aHA +anK +anK +cAM +bCM +anK +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aTl +aWj +aMI +cgd +bwW +beE +bwW +bsz +aTl +cxc +atF +aus +aus +aus +aus +cmw +atF +asv +asN +cJQ +avA +azh +aOd +aOM +aOC +aPe +clC +aQC +aRV +cJl +cko +aeI +bpv +cqJ +cdg +cds +cdv +biQ +bXf +bkG +cwP +ctn +bob +bib +bXX +cIM +bty +bIp +aaU +aaa +aaa +bme +bpj +bpT +czc +cze +czs +czy +bui +bui +bui +bui +bui +bme +bme +bme +bme +bme +bme +bme +bOn +bme +bOo +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(155,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aYp +cdc +crT +adT +aeF +afp +aiV +anv +aec +axS +ahN +afK +ahb +ahx +aia +atm +alX +ahx +arx +amF +afK +aka +cmA +aka +aka +aka +aka +aka +aka +aLU +aNE +aRd +acK +aHL +aIN +aMK +aOc +aSA +aTo +aTt +aTJ +bsR +bCG +bCK +cAN +bCN +anK +aaa +aaa +aaa +aaa +arE +arE +arE +arE +bxP +arE +aMI +cgX +chC +cik +bwW +bsT +bGQ +bHe +bHA +aus +bcM +cmi +cmq +aus +atF +aqU +asG +cJR +aws +aqU +aqU +aMz +chE +cie +cjK +ckm +cnh +ckm +ckm +ckm +ckm +cqK +cru +csz +cdw +biQ +biQ +biQ +biQ +biQ +boc +bzV +bYm +cJb +bzV +bUn +aaU +aaa +aaa +blp +bme +bme +blp +btL +bPH +bBe +bui +cma +bHt +bHt +bme +bme +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(156,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +adq +adq +adq +aec +afM +agx +aja +aoM +aec +agi +ahN +afK +ahc +ahx +ahx +ajs +atO +ayl +bml +ary +afK +atR +cmC +aSU +aka +aER +aFO +aGF +aKf +aMb +aPl +aRf +adR +arX +aKj +aVy +aRx +aSF +aTr +arH +aVa +aIK +aKk +aTU +cAO +cCA +anK +aaU +aaU +aaU +aaU +arE +bGJ +bFe +atf +bxS +bzo +aMI +cgY +bwW +cil +bwW +bwW +bCj +anr +bHO +aOP +biu +cmj +cmr +cmx +atF +cfv +asI +cJS +clx +awA +chl +aNx +chF +cir +cjL +ckB +cno +cpa +cpR +cqa +ckm +ckm +csq +ckm +bUN +biV +cKg +cLn +cLz +bmz +biV +cdP +bXX +cIM +bqE +bcT +aaU +aaa +aaa +aaU +aaU +aaU +blp +cmy +cmz +blp +cqU +blp +bme +bme +bme +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(157,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +aaU +aWj +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aec +aec +bEp +bEp +bEp +bEp +bEp +ahN +afK +ahd +ahx +ahx +ajD +atC +ahx +bmr +bPu +ciN +cly +aCv +cwZ +aka +aEX +aFQ +aGI +aKf +aMb +aPx +aLj +anh +azo +aKp +aND +aND +aWH +aHx +asc +aWn +bvG +aKl +bCQ +cAP +anK +anK +arE +atf +aKT +arE +arE +att +cqr +arE +byt +bzo +aMI +cgZ +cif +cim +cmD +ciS +bCj +anr +bHO +aus +blX +cmk +cms +aus +atF +ast +asI +cJT +cJZ +cKa +cKb +cKc +chG +ciD +cjU +ckC +cnr +cpk +cpS +cqc +cqA +cqL +css +ckm +bUO +cdR +ciL +cLr +cwQ +bPx +bod +beW +bXX +cIM +bqD +bcT +aaU +aaU +aaU +aaU +aaU +aaU +bxw +bza +bMQ +blp +cnf +cdd +aYp +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(158,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +abp +aav +aTd +aWj +abp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aee +aeP +aeP +aqA +aeP +agX +ajS +aHj +bvm +ahP +ahN +afK +afK +ahT +ahx +ahx +ahx +ahx +bvo +amM +apW +ars +cwN +azR +aBG +aEY +aFR +aGU +aKm +aMc +aPx +aRg +aGH +aIf +aLs +aRA +bkT +aWJ +aHz +btb +aWn +bvR +bCI +bDJ +cAM +bCP +boA +aYC +brf +att +att +att +btP +bwo +arE +byu +arE +aMI +cha +cig +cck +bwW +ciV +bCj +anr +bHO +aus +aus +aus +aus +aus +atF +asI +asI +cJU +avw +bRd +azg +aNQ +chI +ciH +cjX +ckF +cns +cpo +cpT +cqn +cqC +cqM +cst +ckm +bUG +cfn +con +coo +cwR +bPy +bVY +bWn +bYO +cJc +bXb +bcT +bpP +bpP +bpP +bpP +bpP +bpP +cro +bza +bMQ +blp +ctH +cdd +csc +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(159,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +aaU +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +adx +aaU +aaU +aaU +aaV +ahP +ahP +ahP +bzp +ahP +ahN +aiB +afK +ahU +ait +ajE +amC +ahx +bvo +aIm +apW +arv +aub +azS +aBG +aEZ +aFS +aHd +aKr +aMf +aPy +aRi +aqc +aqn +aci +aci +aci +aXQ +aHy +bDc +aWw +aWy +aYm +aYD +aYE +aYF +beQ +bjw +bwu +bAd +aMo +aMG +bVt +bwp +bvb +byv +ceQ +cgT +chc +bmY +ccI +bmY +anm +asu +anr +bHO +atF +atF +atF +atF +atF +atF +aqU +asM +cfL +aqU +aqU +aqU +aqU +chK +chK +ckm +ckm +ckm +cpA +cpU +cqo +cqD +cqO +ckm +ckm +bjZ +blq +bCz +bCz +cgc +cxi +cAA +cAI +cAZ +cJd +cBp +ccV +cIt +cIu +bMq +bJl +bLK +bYe +bHL +bYt +bYD +blp +crU +cdd +aYp +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(160,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +adx +aaU +aaa +aaa +aaU +ahP +akn +aJR +bEg +ahP +aif +ass +afK +afK +afK +afa +afa +anF +bvq +afK +aAa +aka +atS +aka +aql +aFa +aFW +aHm +aKf +aMr +aPA +aLj +aPx +aTN +avm +aVH +aWX +aZF +anK +aHz +aWx +aTr +boA +cAF +bCL +boA +anK +bqb +avm +brj +bsO +avm +bVz +bVK +bGX +cbR +ceS +bmW +chv +bwW +cin +aMD +arp +bCk +aqk +bRn +qlJ +qlJ +bcG +cmt +auR +aYL +cfw +bap +cJW +bcI +bbF +bbN +bbN +bbO +bbL +bcb +aaU +ckm +cpF +cpV +cqp +cqE +crb +ckm +bgl +bgl +bjb +bjb +bkI +cic +cxj +biV +bie +bZl +cqQ +bqD +cBr +aRY +bcE +aRY +aRY +btz +cOe +btB +btB +btA +blp +blp +blp +blp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(161,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +abe +aaU +aaa +aaa +aaU +aio +akZ +biO +bEt +bEA +aik +ajl +ajP +alh +aqN +ato +aut +ayw +bDB +bSu +cjm +asm +aqo +aAo +bDi +aFb +aGf +aHw +aKu +aME +aPC +aRk +aSI +aSI +aUJ +aVU +aVU +aZH +bch +bea +bfS +biX +bkK +bmA +bnE +bch +aSI +bqk +brg +bry +btq +avm +aMI +aMI +bwW +bwW +bwW +aMI +chw +bwW +ciq +bwW +ciV +bwW +aaU +bsT +bRo +bRp +anr +bcI +bgw +bgw +bgw +bdk +cJX +bcI +bbJ +bbF +bbN +bbN +bbN +bbO +bbV +ckm +cie +ckm +cqq +ckm +crm +ckm +bgn +bhn +cuO +bhn +bhn +cic +cDi +biV +bdH +bWO +cqR +bqE +cBr +aST +bcF +ckc +bnQ +btA +bMQ +bta +bta +bta +bta +bta +aaa +aaa +aaa +bNK +bNS +bNU +aaa +bNK +bNS +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(162,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaU +aio +alb +aKe +bEw +ahP +bEB +bGo +afA +ahN +aiC +alz +avt +azx +bEv +bZM +avt +avd +bDp +bDv +aiC +aFd +aGj +aHB +aKz +aMM +aPG +aRn +aSO +aUa +aUN +aWf +aWY +aZL +bcq +bcq +bgb +aSO +bkQ +bmB +bnF +bpc +bqa +bnF +brh +brE +btt +btJ +bmS +bwq +bwX +bwX +bzL +bwX +bBp +bwW +ciq +bwW +ciV +bwW +aaU +aaa +aaa +bsz +cJx +cJF +bRA +cJJ +bsX +cJM +cJY +bcI +bbJ +bbL +bbN +bbN +bbN +bcb +ciI +bjI +bkB +bmP +bKj +bbV +bfG +bge +bgB +bho +bjc +bjK +bkI +csm +cxk +biV +cvN +bjm +bXX +bqD +cBs +aTc +bdL +biE +bpV +bLZ +bNt +bta +btQ +bxN +bDh +bHM +aaa +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(163,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaU +ahP +alf +afh +bEy +ahP +aiz +aiz +aiz +ahN +aiC +ake +avt +aDD +aqp +aui +aAm +bvw +bDq +aul +bDA +bDA +bDA +bDA +avm +aMO +aLr +aRs +aSS +and +amY +amY +amY +amY +amY +amY +bvu +aJd +aKQ +aJd +aKQ +aJd +aJd +bql +bri +brW +btu +bsO +aMI +aMI +aMI +bAk +aMI +aMI +bzn +aMD +ciq +bwW +ciV +bwW +aaU +aaa +aaa +bsz +anr +bcI +sdp +bUX +bgw +uwK +bhm +bcI +bbL +bbN +bbN +bbN +bbN +bbO +bcl +bAa +bkM +bja +bKB +bcl +bfG +bge +bge +bge +bge +bge +bge +cwS +cxl +biV +bdI +cNx +bXX +bqD +cBr +bcu +csS +biH +bnQ +btB +bNV +bta +bzd +ceh +bzd +bHM +aaa +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(164,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaU +ahP +ahP +ahP +ahP +ahP +aaU +aaU +aiz +ahN +aiC +alc +avu +aDD +aqx +awv +bvr +bDn +bDr +bDx +bDC +bDF +bDE +bDK +avm +aMT +aLr +aRt +aTe +amY +aBq +aCQ +aFe +aCJ +bFn +bFn +aJd +aJi +aKU +cCs +aLD +aLR +aJd +aZD +bwE +bIX +csB +bwj +bmW +bEQ +bxb +aNW +cCF +bmW +bzn +bwW +ciq +bwW +ciV +bwW +aaU +aaa +aaa +bsz +anr +bcI +aXp +bVb +cfx +bhs +bmm +bcI +aaU +aaa +aaa +aaa +bbV +bbV +bbV +bhk +bwi +blN +bKX +ciI +bfG +bbV +bgH +bhp +bjd +bZi +boG +cxe +cxm +bgf +cIC +bjm +bXX +bqD +cBC +bcv +bdL +bkf +bWY +btC +bPm +bta +btV +cfG +btV +bta +aaa +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(165,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aiz +amw +aiC +ald +avZ +aGY +aqQ +ayc +bvA +bZN +bDs +aaB +aEg +bDG +bDI +bDK +avm +aMW +aLr +aRK +amY +amY +aBs +ane +anp +aCJ +bFn +bFn +aJd +bfH +bdq +bet +bmu +aUs +buQ +bvk +bwF +bVi +cvJ +bwn +bmW +bws +aNW +bxd +bBK +bAS +bCq +bwW +ciq +bwW +ciV +bwW +aaU +aaa +aaa +bsz +anr +bcI +bcI +cwy +bcI +jMO +bcI +bcI +aaU +aaa +aaa +aaa +bbV +bfN +bhk +bhk +bwt +bja +bLn +bbV +bfG +bbV +bgI +bDl +cuP +bjM +ccW +cgs +cxn +bgf +bBU +bnN +crc +buw +aRY +bcD +bcF +bkz +bnQ +btD +bPm +bxH +bzc +bBg +coW +bxH +bxH +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(166,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aiz +amD +aiC +afV +amK +aHc +bEH +azV +bvC +cbQ +bDs +bDz +aNe +bDH +bDA +bDA +avm +aNs +aLr +aRN +aSe +aAC +aAD +anp +ane +aCJ +bGe +bFn +aJd +aJl +aKV +bfz +bmx +aLp +aML +aZe +bhF +bXc +bhG +bhH +bhL +bio +biD +cAq +bkE +bmW +bBq +bwW +ciq +aMD +ciV +bwW +aaU +aaa +aaa +bsz +anr +aaU +aaa +cwz +aaa +jyu +aaa +aaa +aaU +aaa +aaa +aaa +bbV +bgg +bgK +bhk +bwG +bja +bLv +bbV +bfG +bbV +bjf +bkh +blu +ciI +ccZ +cgs +cxo +bgf +bgf +bez +cxB +bhf +aRY +aRY +aRY +aRY +aRY +btz +bPn +btE +bzk +crp +bBf +bDf +bHM +aaa +aaa +aaU +cnM +aaU +aaa +aaU +cnM +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(167,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +adx +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +asd +ahN +aiC +alH +amK +aDD +aqp +aAg +bCJ +cjn +bDt +bDA +bDA +bDA +bDA +aHC +aKW +aNt +aLr +aRN +amG +aAD +aBs +awP +anp +aCJ +bFn +bFn +aJd +bDe +aKX +bet +bmX +aLS +aML +baY +bwO +bEi +cwt +czQ +czX +cAd +cAn +cAr +bkL +bmW +bBr +bwW +ciq +bwW +ciV +bwW +aMD +bwW +aaa +bsT +bHe +bRo +bRp +aaa +cwD +jyu +aaa +aaa +aaU +aaa +aaa +aaa +ciI +bgv +bhk +bhk +bxe +bja +bLA +bbV +bfG +ciJ +bUk +bUH +bVg +bVn +cfd +cgs +cxp +ckq +bgf +beB +cxC +bgq +cjA +biy +bjN +bkO +biZ +bXY +bPm +bxH +bFF +csU +bBg +bDg +bHM +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(168,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aaa +aaa +aaa +aaa +cjj +cjj +cjj +cjj +cjj +ahN +aiC +aiC +amL +aQZ +aqx +bvw +bvw +bvw +ant +aoN +aJH +anS +amc +aHX +aLd +aNE +aPJ +aRN +amG +ane +anp +csy +aBs +aCJ +aCJ +amY +bvu +aJd +aKQ +bfB +brt +aJd +bvu +bAO +bxc +bFd +czN +czR +buh +bwv +bxh +byP +bkN +bmN +bng +bnM +boh +bpI +bqg +bqu +bra +bwW +bwW +aaU +bdR +cJr +bTJ +aaa +aaa +cPz +aaa +aaa +aaU +aaa +aaa +aaa +bbV +bbV +bbV +bhk +bwt +bBi +bLO +bbV +bTV +bgf +bTk +bUR +cfO +cja +cja +boj +cxq +cxv +bgf +brQ +cxC +bgq +bhX +biz +bjP +cJi +biZ +btz +bPm +clW +bPM +bzd +bBg +bDh +bHM +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(169,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aao +aaO +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +aaO +ado +aaa +cjj +cjk +anb +ajo +ajV +anG +aro +avb +awb +awI +amc +agU +air +aZK +anN +awD +aoO +azT +bso +aIb +aLe +aNP +aPL +aRP +aKq +aLM +aMu +aNy +aSd +aTq +aVY +aJj +aJd +btm +bdo +bet +bse +aMd +aJd +bdA +bxg +bvs +aMA +czS +buW +bwx +aMA +aMA +aMA +aWE +bzn +bwW +ciq +bwW +ciV +bwW +brr +bCr +cwv +bAQ +bAQ +cJs +bUV +caf +bam +cPA +bam +bYl +bam +bam +bam +bam +bbX +bbX +bcn +cnv +bxL +cpW +bLP +buH +bBz +bPY +bUd +cdx +cga +cgq +cgq +bzw +cxr +cxw +cxx +cxz +cxD +cxF +bhX +biJ +bjQ +ccF +biZ +btz +bPm +bxH +bSf +bzd +bQD +bxH +bxH +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(170,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aWj +aaU +aaa +aaa +aaa +aao +aaP +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +aaP +ado +aaa +cjj +agG +aiu +ajv +akb +anZ +arG +avf +awf +awU +amc +awV +aoO +aqq +aqq +avh +azX +aCV +cra +aIp +aLh +aOf +aPQ +aRS +amY +aAF +aMv +aDI +aBs +aAD +aBs +aGB +bsS +bvT +bdp +cAJ +cAR +buZ +aJd +bhe +bxp +bvx +aMA +czT +bva +bwy +bxi +cCE +cAw +aWF +bBD +bmS +ciM +bmS +ciX +bmY +brP +brX +bsh +bsu +bsx +cJt +sVC +cdp +sVC +cPB +sVC +bZp +sVC +sVC +sVC +frb +bvM +bvW +bvX +bwd +bxU +bBT +bLQ +bLT +bQh +bLT +bLT +cdF +bVl +bZd +cfX +ciP +cjB +cgt +bcl +bfc +bgs +cxG +bif +cnA +csg +btW +biZ +bUW +bRr +bxH +bzj +bzW +bBx +bxH +aaU +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(171,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +ahv +aWj +aaU +aaa +aaa +aaa +aao +aaP +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +aaP +ado +aaU +cjj +amO +afo +cjl +cjj +bGq +bEf +avm +awb +awI +amN +anM +aoO +aoO +aoO +aoO +aoO +aFI +amc +aIt +aLj +aOg +and +aoE +amY +aAG +ane +aEi +aAD +aBs +aAD +aMV +aNq +aOi +bdp +bfK +bsW +cCB +aJd +bhi +byM +blP +aMA +czU +czY +cAe +bFz +cAs +cAx +bhU +biN +biY +bne +cAz +bqf +bqH +brY +bsi +bsv +bsy +bsy +bsD +bsI +bRv +bsD +bww +bsD +cPE +cPF +cPF +cPF +cPG +bBL +bBL +bCm +bwg +bzC +boC +bLR +bTx +bUb +bUh +bUm +bUZ +bVm +cbM +cfY +cJz +cjC +bhr +ckv +bdV +bgt +cxC +bhX +biJ +bjQ +ctu +biZ +btz +bPm +bxH +bxH +bxH +bxH +bxH +aaU +aaa +aaa +bNK +bYQ +bNU +aaa +bNK +bYQ +bNU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(172,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +abM +acj +aaU +aaa +aaa +aaa +aao +aaP +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +aaP +ado +aaa +cjj +cjj +cjp +cjp +cjp +aoK +aoK +aoK +awb +awI +amN +aii +aoO +aqr +aSR +awE +aoO +brx +amc +aIw +aLj +aOj +amY +aoZ +anp +ane +anp +aDI +aBs +aAD +aBs +aHe +aJd +bmI +aZi +bfL +btM +bvf +aJd +bhw +byO +bBb +aMA +btc +czZ +cAf +bVH +bwA +bAj +aMB +bzn +bwW +cgY +bwW +cil +bmW +bCt +aMI +aMI +aaa +aaa +aaa +bfW +bJv +aaa +cwI +aaa +cbG +aaU +aaa +aaa +aaa +aaa +bbV +bhu +bhr +bbT +bdZ +brR +bbT +bUf +bbT +bbT +bbT +bUP +bbT +bbT +cJV +bbT +bbT +bbT +brQ +bgt +cxH +cxN +cxP +cxQ +cxU +cxW +cxX +cPN +clX +bZu +cmM +bYn +bZt +bHN +bHN +bHN +bNL +cnM +aaU +aaU +aaU +cnM +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(173,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +abR +acj +aaU +aaa +aaa +aaa +aao +aaP +ado +aaa +aaa +aaU +adx +aaU +aaa +aaa +aao +aaP +ado +aaa +aaa +aaU +aoK +asA +atu +aue +auO +arM +awb +axa +amc +anO +arn +aqt +atX +ayV +aJJ +brC +bsq +aIy +aLo +aOm +amY +aqd +ane +aBS +aBV +aEk +aBV +aBS +aAD +aHf +aJd +aJd +bco +aJd +aJd +aJd +bvu +bdA +bxp +bvs +aMA +aNc +bvQ +cAg +bxr +byY +cvP +aMB +bzn +bjz +cgZ +bzH +bJS +bmW +bmW +aMI +aaU +aaU +aaU +aaU +bfW +opd +aaU +cwJ +aaU +cbG +aaU +aaU +aaU +bbT +bbT +bbT +bbT +bbT +bbT +bkm +brV +cPH +bfU +bFD +bgO +cqt +bUQ +cvj +cDg +cKd +ben +bor +bcV +bfe +bgt +cxI +ctv +biM +bjS +bkS +cpJ +btF +cxY +bZt +bZv +bYn +bYn +bZy +bHN +bHz +ckn +cnL +cnN +bOk +bOk +bOk +cnP +cnR +bOk +bOk +bOq +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(174,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaD +abM +acm +aaU +aaU +aaU +aaU +aao +aaP +ado +aaa +aaa +aaU +adx +aaU +aaa +aaa +aao +aaP +ado +aaU +aoK +aoK +aoK +asE +atw +atw +atw +arM +awg +axb +amc +amc +amc +amc +amc +azF +aJY +brD +bsr +aIB +aLj +aOy +amY +apw +anp +aBS +ayy +aEj +ayy +aBS +aBs +aHi +aJk +aJd +bdm +aLA +aJd +aMk +aMk +bdA +bxp +bvI +aMB +aMA +aMA +cAh +aMA +bzf +bAp +aMB +bzn +bxG +bxF +bxG +bXs +cii +cjg +cji +aaa +aaa +aaa +aaa +bgi +fui +aaa +cwK +aaa +cbG +aaa +aaa +aaa +cmH +crh +bVx +bVw +bVy +bVw +cwc +buz +bAu +bCx +bPZ +bUl +bVc +cte +cvk +cDm +cvk +ctp +ctq +bkX +ctr +bZw +cxJ +bez +biZ +biZ +biZ +biZ +btz +cxY +bZt +bZt +bZx +bZt +bZt +bHN +bHP +bHN +bNL +aaU +aaU +aaU +aaU +cnQ +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(175,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaY +abV +acq +acJ +adk +adG +aaU +aaU +aaT +aaU +aaU +aaU +aaU +aaT +aaU +aaU +aaU +aaU +aaT +aaU +aaU +aoS +aqe +aqe +asQ +atx +auf +auU +avp +awi +axd +ayv +azD +ayv +aBD +aCx +aDw +aEl +aFg +aGk +aIW +aLq +aOG +amY +apa +ane +aBS +ayy +bvE +ayy +aBS +aAD +aHJ +amY +aJd +bds +bfQ +bug +buL +buL +bhC +byS +aMn +aMD +bEj +bvU +cAi +aMA +bzg +aMA +aMB +bzn +bwW +bxF +aMD +bEL +bAK +bjz +aMI +aZG +aaa +aaa +aaa +bgi +fui +aaa +cwI +aaa +cbG +aaa +aaa +aTx +bbT +bbT +bbT +bbU +bcV +crd +bej +bej +bfs +bfY +bej +bla +bVh +ctf +bkc +bcV +bcV +bnh +bnh +bcV +bcA +bgZ +cxK +ctw +bjl +bGC +bpQ +bpQ +cOa +cPO +cya +cya +cya +cya +cye +bHN +bIy +bHN +bJQ +bJQ +aaa +aaa +bNK +bYR +bNU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(176,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +cpB +aaa +aaa +aaa +aaU +abr +abM +abr +abM +adl +abM +aZG +aaU +abc +aeP +aeP +aeP +aeP +ajc +aeP +aeP +aeP +aeP +avr +aaU +aTx +aoK +aoK +arK +asZ +aty +auj +auX +avq +awj +axn +ayx +azH +aAr +aAr +aCI +aDy +aEn +aFs +aAr +aIY +aLr +amG +amG +apL +anp +aBS +aBu +aEj +aBu +aBS +aBs +aGB +aJf +aJd +bdw +bfT +aJd +aMk +aMk +bdA +bzQ +ccl +czO +czV +czV +cAj +bxs +bzl +bkg +bPq +bzn +bwW +byW +bCB +bIC +bVj +cip +cpE +aaa +aaa +aaa +aaa +bgi +fui +aaa +cwK +aaa +cbG +aaa +aaa +aaa +cpp +cgj +cgk +cgj +bcj +cgj +ben +bej +cqF +bfZ +bej +bAB +bVk +ctg +cjd +ctm +blQ +bbw +bci +bci +bfP +cqj +cxL +bir +biZ +cjt +bXE +bLZ +bLZ +bYh +bYn +bYn +bYE +cni +cyf +cgy +bIz +cmc +ceJ +bJQ +aaa +aaa +bNK +bYR +bNU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(177,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abD +abW +acr +acW +adw +adH +aaU +aaU +abe +aaU +aaU +aaU +aaU +abe +aaU +aaU +aaU +aaU +abe +aaU +aaU +aoT +aqy +arL +asZ +atD +auk +atD +avs +awl +axq +ayB +avb +aAs +aBJ +awp +awx +aEr +aFx +aGl +aIZ +aLr +amG +ane +anp +ane +azt +aBv +aEj +aFh +aKN +aAD +aGN +aJg +amY +aOt +bfV +amY +aMs +aMs +bhD +aOA +bvN +aMs +bmo +cAa +cAk +bxy +bzi +cAy +bTU +bzn +aMD +bzh +bwW +cih +aMI +aMI +aMI +bLw +bMM +bMM +bMM +ifC +bJv +aaU +cwJ +aaU +cbG +aaU +aaU +aaU +bbT +bbT +bbT +bbT +bbT +bdT +beX +beU +beU +beU +beU +bLu +bVr +cth +cje +csv +bcV +bby +bck +bdM +bdM +bhb +bhM +bis +bjn +bjn +bXF +bjn +bjn +bjn +bjn +bjn +bjn +bjn +cyg +bGF +bIA +bIB +bNO +bHN +aaa +aaa +bNK +bYR +bNU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +abp +aaa +aTd +aaa +abp +aaa +aaa +aaa +cpB +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(178,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abE +abM +acx +aaU +aaU +aaU +aaU +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaU +aoK +aoK +aoK +atd +atE +aum +ava +avs +awp +axD +ayE +awp +awp +awp +awp +aDA +aEt +aFA +aGm +aIZ +aLr +amG +anp +aBS +aBS +aBS +ayy +aEj +ayy +aBS +aBS +aLG +aJh +aLN +aOu +cCt +beA +aMt +aNw +bhE +btg +bvO +bwb +aMs +cAb +cAl +bhA +bgP +bzO +caD +bzn +bjz +ciG +bAK +ciV +aMI +aaa +bJj +bLS +kxw +kxw +kxw +bPA +wPS +aaa +cwI +aaa +cbI +mIT +cJr +aaa +aaU +aaU +aaU +aaU +bbT +bbT +bbT +bfE +bih +bkb +bkj +bkY +bVs +cti +cje +cto +bcV +bcV +bcm +bdV +bdM +cqk +bhP +biv +ciR +bjT +bXG +clV +bjT +cjf +btH +btX +ckE +bjn +cyf +bHN +cnS +bKZ +bNP +bHN +aaa +aaa +bNK +bYR +bNU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(179,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +abR +acj +aaU +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaU +aaa +aoK +ate +atG +auq +atG +avx +awp +axE +ayH +azM +aAt +awp +aFl +aDC +axU +aFB +awx +aIZ +aLr +amG +ane +azt +azu +aAH +aBv +aEk +ayz +azu +azu +aKN +aJm +amY +aQy +bgo +amY +amY +amY +bfX +btr +bvP +bwc +bmo +bwk +bwH +bxG +bzm +bAx +bBh +bBG +bAK +ciO +bAK +ciV +bAS +aaa +bJv +bMp +cwA +cwA +cwA +bgM +cwA +cwA +cwL +cww +cbL +cww +bdR +mIT +mIT +mIT +mIT +cJr +aaa +aaU +bbT +bgk +bbT +bkd +bbT +cea +bVG +cgn +cje +blb +blR +bni +bcA +bdM +bdM +cNA +bhb +ciE +cmT +cnB +csh +cHV +cPM +bjn +btI +buc +cme +bjn +cyf +bHN +bHN +bHN +bHN +bHN +aaa +aaa +bNK +bOd +bNU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(180,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aav +abM +acz +aaU +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aaa +aoK +atg +atG +aur +atG +avz +awx +axU +ayL +azO +aAu +awp +aCP +aDG +cPr +aFD +awp +aJa +aLr +amG +anp +aBS +ayy +ayy +aBS +bAZ +aFn +aFY +aFY +aFn +aJo +aLP +aMJ +bgp +buT +cCC +buN +bDj +bur +bvS +bwe +aMs +bmW +bwI +aMI +ceG +bAK +aMI +aMI +aMI +cjc +aMI +cnt +aMI +aaa +bJv +bMp +cww +bMY +bMY +bPB +xoj +cwx +cPC +cww +cbN +cww +aaU +aaa +aaa +aaa +aaa +anr +aaa +aaU +bbT +bEk +bfD +bVd +bkX +bUT +bXw +chd +cki +ctt +blS +bnn +bcA +bdM +bdM +bdM +bhP +biv +cDz +cDA +cDD +bnX +bjn +bjn +bjn +bjn +bjn +bjn +cyh +boI +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(181,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aRv +aaa +aaU +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aaa +aoK +ath +atG +auu +atG +avB +awx +axU +ayP +azU +aAE +awp +aCR +aDH +aEz +aFH +aGw +aJb +aLt +amY +anY +azt +azu +azu +aBv +aEk +ayz +azu +azu +aKN +aAD +aMe +bdB +bgr +buU +byo +apV +bgj +buu +bvV +aMs +aMs +aaU +bCU +aMI +ceG +bAK +bAS +aaa +aaU +aaa +aRv +aaa +aaU +aaa +bJv +bMp +cww +bMZ +bMZ +bPC +uAY +cwF +cwM +cww +cge +cww +aaU +cak +cam +cak +aaa +anr +aaa +aaU +bff +bgQ +bff +bgQ +bff +bfC +bYM +bjo +bkk +ctx +blV +bny +bdK +bma +bfR +bhd +bhQ +bpl +bjn +bjn +bjn +bjn +bjn +bRt +bxO +bzs +bzZ +bBy +cyi +boI +boK +boK +boK +boK +boK +boK +boI +aaU +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(182,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aaa +arM +ati +arM +atG +atG +avD +awx +axY +ayZ +azW +aAT +aBO +aCS +aDJ +aEB +aFJ +awp +aJs +aLz +amY +anp +aBS +aBS +aBS +ayy +aEI +ayy +aNa +aSC +aSC +aTB +aUx +bdX +bhV +buY +bMm +amY +aMs +buI +aMs +aMs +aaU +aaU +bCV +aMI +ceH +aMI +aMI +aaa +aaU +aaa +aaU +aaa +aaU +aaa +bJv +bMp +cww +cpM +bNa +bPJ +bRC +cwG +cPD +bVE +cbT +cww +bhI +bhI +can +bhI +aaa +anr +aaa +aaU +bfC +bfb +cmW +bic +cbk +bfC +bYN +bgT +bgT +ctA +bgV +bgV +bgT +bgV +boM +boS +ccv +boS +boI +bqZ +cxT +bMH +btN +buy +bRw +bRz +cmJ +bRG +cyj +cmb +bHQ +bHQ +bHQ +bHQ +bHQ +bLa +boK +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(183,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aao +acv +ado +aaa +aaa +aao +abj +ado +aaa +aaa +aao +acv +ado +aaa +aaa +aaa +arM +atl +arM +arM +arM +avs +awp +ayg +aza +azY +aBc +awp +aCT +aDK +aEG +aFK +awp +aJP +aLC +amY +aoa +ayA +azv +aBp +aCy +aEM +aFq +aNb +aGA +aBs +aAD +aMF +bdn +bdn +bdn +bdn +aCJ +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aVT +aaa +bAL +aaU +aaa +aaU +aaa +aaU +aaa +aaU +aaa +bJv +bMp +cww +bNb +bNb +bPL +cwB +cwB +cwB +bVX +eKM +cww +bhI +bhI +cao +bhI +bhI +anr +aaa +aaU +bfC +bgS +bGL +bip +ctz +bfC +cbO +cgE +bkl +ctB +blW +cxs +bos +bgV +boN +boT +bpd +bpp +bqy +cxR +cxV +cxV +cxV +cjb +cxV +cyb +cyc +cyd +bFg +bHR +bHR +bHR +bJU +bHR +bHR +bLb +boK +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(184,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaT +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +arM +atn +arM +aaU +aaU +aaU +awp +awp +awp +awp +awp +awp +aCY +aDQ +aEH +aFL +awp +aKb +aKb +amY +amY +amY +azw +amY +aHK +aMR +aMU +aQV +amY +aCJ +aCJ +aCJ +aCJ +aCJ +aCJ +aCJ +aCJ +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaU +aaa +bJv +bMp +cww +bjE +bNq +bQK +qgO +chO +cpN +bWG +cRg +jiZ +bhI +cLY +cap +cMt +cau +anr +aaa +aaU +bfC +bgU +cng +bCH +bRu +bUK +ccu +che +ckr +ctC +bVo +cxt +bVZ +bgV +boI +boU +cty +bpf +bpf +cxS +bpY +btd +btd +bDy +bxR +cxZ +boI +bBA +bFh +boI +boK +boK +boK +bKo +bKD +boK +boI +aaU +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(185,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +adx +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaU +apC +aqC +axr +aAM +aqC +apC +aaU +aaa +aaa +aaU +amY +azZ +amY +aKI +aKM +aBS +aBS +aCJ +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaU +aaa +bJv +bMp +cww +bkH +blz +bNd +bNE +cww +cpO +bWG +cJo +cMH +bhI +cLZ +caq +cLZ +bhI +anr +aaa +aaU +bfC +bUS +bAv +bPW +cBz +bUM +ccX +chf +ckO +ckO +ckO +cxu +chf +cxy +cxA +cxE +cxM +cxO +cND +bpf +brS +bte +cdT +ceZ +bte +bzu +boI +cJj +bzt +boK +aaU +aaa +aaa +aaa +cgW +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(186,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +abe +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaa +aaa +aaU +apC +aug +axs +aAN +bsc +apC +aaU +aaa +aaa +aaU +amY +aAw +amY +aCJ +amY +aCJ +aCJ +aCJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaU +aaa +bJv +bMp +cww +cww +cww +cww +cww +cww +cww +cIs +tyI +cMJ +cLX +cMa +cMj +cMu +cMG +anr +aaU +aaU +bff +bfC +bff +bfC +bff +bfC +bij +bhK +bkn +cnw +bkn +bhK +bov +bgV +boI +boW +bpf +bpu +bpf +cty +brS +boI +btS +ccT +boI +bzu +boI +bBI +bFi +boK +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(187,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +adx +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +apC +aun +axs +aAN +bsd +apC +aaU +aaU +aaU +aaU +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +rTW +tpQ +wPS +bMt +pgu +pgu +pgu +gGG +vsO +chS +cpQ +cfM +cbU +jXo +cLm +cMb +cas +cMb +cMH +anr +aaa +aaa +aaU +aaa +aaU +aaa +aaU +bgT +bhZ +bhK +bkn +bkn +bkn +bhK +bow +bgT +boP +boY +bpk +bpf +bpY +brd +brT +boI +btS +ccU +boI +bzv +boI +boI +boI +boI +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(188,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ady +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ahu +ahu +ahu +apC +apC +auo +axy +aBd +aJI +apC +apC +ahu +ahu +ahu +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +aXx +aXx +aXx +aXx +bfW +tuF +lRy +fti +cfP +mEa +cLV +chn +eCy +chL +cMv +cMI +anr +aaa +aaa +aaU +aaa +aaU +aaU +aaU +bgV +bhZ +bhK +bkp +bhK +blZ +bhK +boB +bgV +boI +boI +ckK +ckL +ckM +boI +boI +boI +cre +cow +boI +cRa +boI +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(189,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ahu +amU +aov +apE +aqB +aup +axs +aBn +bbR +aqB +apE +aov +amU +ahu +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bca +bca +cat +cKX +bQN +nLV +cLd +fti +cfT +cgg +cgx +chp +chx +chM +gDY +jiZ +hlV +aaa +aaa +aaU +aaa +aaU +aaa +aaU +bgT +bil +bjq +bkq +bld +biw +bld +boB +bgV +aaU +boI +boK +boK +boK +boI +aaU +cNW +cNX +cOf +cNX +cOm +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(190,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +ahu +amV +amV +apF +aqC +adI +axH +aBB +bsg +aqC +bsB +amV +amV +ahu +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bRK +bca +bZI +bZR +bfW +qHL +eTZ +vcb +uVD +mqB +dpO +tZC +qWY +rUl +cMw +cfs +cMP +aaa +aaa +aaU +aaa +aaU +aaa +aaU +bgT +bgT +bjr +bkr +ble +xxP +bnC +boD +bgT +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cNX +cOf +cNX +cOm +aaU +aaa +aaa +aaa +aaU +aaU +aaU +aaU +blj +aaU +aaU +aaU +aaU +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(191,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +all +amV +amV +apI +bsw +auw +axJ +aBE +auy +bsw +bsm +amV +amV +bsJ +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bca +bca +cKQ +cKY +bQO +ony +xcO +hKC +cVO +sRD +cMe +cai +rdF +cMk +ceU +cMJ +cxc +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +bgT +bks +blg +bgT +cgm +boE +bgT +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(192,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +alm +amV +amV +apI +bsA +auy +azs +aBE +auy +bsA +bsm +amV +amV +bsK +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaU +aXx +aXx +aXx +aXx +aXx +bfW +cww +bUa +cMr +sRD +cMo +cgz +cai +fkx +cMl +cMx +cMJ +cxc +aXx +aXx +aXx +aXx +aXx +aaa +aaU +aaa +aaa +bgT +bkt +blh +bgT +blh +boF +bgT +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(193,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +aln +amV +amV +apJ +aqC +auz +azs +aBE +bsj +aqC +bsC +amV +amV +aln +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bSb +bSb +cKR +cKX +bQN +cLb +cLe +cMo +hMZ +nAF +lcD +cai +fkx +mNN +cLo +nBM +cfD +cKX +cLt +bkZ +bkZ +aXx +aaa +aaU +aaa +aaa +aaa +aaa +cqX +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(194,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +aln +amV +amV +apK +aqB +aqB +azI +brn +aqB +aqB +bsE +amV +amV +aln +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bSi +bWp +bZL +bZR +bfW +cwA +cLf +cMo +iAW +fIw +wWH +ntC +nEX +hDz +cLp +oMB +mxW +bZR +cay +caK +caM +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(195,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +alm +amV +amV +amV +aqI +aqB +aGO +auy +aqB +aqI +amV +amV +amV +bsK +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bSb +bSb +cKS +cKY +bQO +cLc +eIh +car +tXV +tZj +jml +cVq +cMc +cMm +cMy +cML +cLa +cKY +cLu +bkZ +bkZ +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(196,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +alJ +amV +aow +amV +amV +auA +auy +auy +bsk +amV +amV +amV +amV +alJ +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaU +aXx +aXx +aXx +aXx +aXx +bfW +cww +bhJ +cMo +iAW +cJu +iAW +cJH +cMd +cMn +cMz +cMJ +aaU +aXx +aXx +aXx +aXx +aXx +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(197,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ahu +ahu +amV +amV +amV +aqI +ave +auy +bXH +bsm +aqI +amV +amV +amV +ahu +ahu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTH +bTH +cKT +cKX +bQN +cLb +cLh +cMo +iAW +cJu +hlo +cJH +cMe +cMo +cLq +nBM +cKZ +cKX +cLv +blL +blL +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(198,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ahu +amW +aoI +amV +amV +ave +aIR +auy +bsm +amV +amV +aoI +bsH +ahu +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTI +bXe +bZO +bZR +fuE +bWK +cLi +xKr +nvn +cJu +iAW +cJH +cMe +cMo +cMA +cMN +aaU +bZR +caF +caL +caN +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(199,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +ahu +ahu +ahu +apX +aqI +avk +aJq +brp +bsn +aqI +bsF +ahu +ahu +ahu +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTH +bTH +cKU +cKY +cLa +cLc +fgS +car +iAW +jon +xjk +cai +cMg +cMq +cMB +cML +cMQ +cKY +cLw +blL +blL +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(200,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +ahu +ahu +apC +apC +ahu +ahu +apC +apC +ahu +ahu +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaU +aXx +aXx +aXx +aXx +aXx +rTW +wbu +cLg +kOG +dVR +xCy +sHB +xkC +cMe +cMr +cMC +cML +cMR +aXx +aXx +aXx +aXx +aXx +aaU +aaU +aaU +aaU +aaU +aaU +blj +abp +blj +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(201,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +amJ +aaU +aaU +aaU +aaU +amJ +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTK +bTK +cKV +cKX +bQS +cLb +cLj +cMo +qvB +cgh +cgA +chq +cMh +cMq +cMD +cMM +cMS +cMT +cLx +cpX +blM +aXx +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaU +aaU +aaa +aaa +aaU +cNX +cOf +cOh +cOm +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(202,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTL +bXR +bZP +bZR +opd +cwA +cal +cLl +cLs +cLs +cLs +cLs +cLs +cMs +cME +cMN +aaU +bZR +caJ +bpq +caS +aXx +aaa +aaU +aaa +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +cNy +cNy +cNz +cNz +cNy +cNX +cOf +cOi +cOm +cOr +cOl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(203,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaa +aXx +bTK +bTK +cKW +cKY +bQV +cLc +cLk +ctk +prx +vxU +cLW +ccG +cMi +iQY +cMF +cMO +cMS +cMT +cLy +blM +blM +aXx +aaa +aaU +aaU +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNy +cNz +cNz +cNy +cNE +cNM +cNO +cNy +cNX +cOf +cOj +cOn +cOj +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(204,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +opd +aaU +aXx +aXx +aXx +aXx +aXx +opd +cww +cww +cww +cfV +cww +cww +cww +cww +cww +cww +cww +aaU +aXx +aXx +aXx +aXx +aXx +aaa +bal +aaa +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNz +cNB +cNB +cNB +cNF +cNN +cNR +cNY +cOb +cOg +cOj +cOj +cOj +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(205,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +bGh +bHg +bHg +bHg +tpQ +bHg +bHg +wPS +aaU +aWj +cww +cJm +cww +aaU +aaa +aaa +aaa +aaa +aaU +aaU +aaa +aaa +aaU +aaa +aaa +aaa +bal +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNz +cNB +cNB +cNB +cNG +cNN +cNS +cNy +cNX +cNX +cOj +cOj +cOs +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(206,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aWR +aaa +aaU +aaa +bal +bal +aaU +bal +bal +bal +aaU +aWj +cww +cJn +cww +aaU +bal +bal +bal +bal +aaU +bal +bal +bal +aaU +aaU +bal +bal +bal +aaa +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNz +cNB +cNB +cNB +cNG +cNN +cNT +cNy +cNX +cNX +cOj +cOj +cOt +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(207,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aWR +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cbS +abM +ccH +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aWj +aWj +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNz +cNB +cNB +cNB +cNG +cNO +cNO +cNZ +cNX +cNX +cOj +cOj +cOu +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aWR +aaa +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(208,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abF +abM +acA +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cbS +abR +ccJ +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +bal +bal +bal +aaU +bal +bal +bal +aaU +bal +bal +bal +aaU +bal +bal +bal +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNy +cNz +cNz +cNy +cNH +cNP +cNU +cNy +cOc +cNX +cOk +cOo +cOv +cOp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +cPl +abM +cPq +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(209,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abJ +abR +acA +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +cbW +abM +aaD +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +abp +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNy +cNy +cNz +cNz +cNy +cNX +cNX +cOl +cOp +cOp +cOl +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +cPm +abR +cPq +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(210,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abJ +abR +acB +adc +adc +adL +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +bGK +bGK +bUe +ccc +abR +aaY +cdb +bGK +cdq +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaU +aWj +aWj +aaU +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cPd +cPd +cPd +cPn +abM +cPq +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(211,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +abJ +abM +abR +abM +abR +abM +aZG +aaU +aaU +aaU +aaU +aaU +aaU +aTd +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aTd +aaU +aaU +aaU +aTx +abM +abR +abM +adl +ccr +ccO +abM +abR +abM +aZG +aaU +aaU +aaU +aTd +aaU +aaU +aTd +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +cNQ +cNI +aWj +aWj +aWj +aWj +aaU +aTd +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aTd +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aTx +abM +abR +abM +abR +abM +cPq +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(212,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +abp +abJ +abZ +abZ +abZ +abZ +abZ +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +bGP +bNo +bNo +ccf +ccs +ccP +cdi +bNo +bNo +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cNI +cNI +cNI +aWj +aWj +aWj +aWj +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cPe +cPh +cPh +cPh +cPh +cPh +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(213,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abM +abM +abM +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +abp +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaU +abM +cNI +aWj +abp +abp +aWj +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU +abp +aaU +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(214,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU +aaa +aWj +brs +brs +aWj +aaa +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(215,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aWj +aWj +aWj +aWj +aWj +cfq +cfq +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(216,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(217,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +cpB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cpB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cpB +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(218,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cpB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(219,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(220,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(221,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +cpC +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +cpC +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(222,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(223,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(224,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(225,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(226,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(227,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(228,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(229,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aWj +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(230,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(231,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(232,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(233,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(234,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(235,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(236,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(237,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(238,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(239,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(240,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(241,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(242,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(243,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(244,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(245,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(246,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(247,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(248,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(249,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(250,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(251,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(252,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(253,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(254,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} +(255,1,1) = {" +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +ckl +"} diff --git a/_maps/map_files/CogStation/job_changes.dm b/_maps/map_files/CogStation/job_changes.dm new file mode 100644 index 0000000000..8b1e3e9172 --- /dev/null +++ b/_maps/map_files/CogStation/job_changes.dm @@ -0,0 +1,29 @@ +#define JOB_MODIFICATION_MAP_NAME "CogStation" + +//Medical +/datum/job/scientist/New() + ..() + MAP_JOB_CHECK + access += ACCESS_CHEMISTRY + minimal_access += ACCESS_CHEMISTRY + +//Science + +/datum/job/roboticist/New() + ..() + MAP_JOB_CHECK + access += list(ACCESS_MEDICAL, ACCESS_MORGUE) + minimal_access += list(ACCESS_MEDICAL, ACCESS_MORGUE) + +//Civilian +/datum/job/clown/New() + ..() + MAP_JOB_CHECK + access += ACCESS_MAINT_TUNNELS + minimal_access += ACCESS_MAINT_TUNNELS + +/datum/job/mime/New() + ..() + MAP_JOB_CHECK + access += ACCESS_MAINT_TUNNELS + minimal_access += ACCESS_MAINT_TUNNELS \ No newline at end of file diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 54b5a9c221..8a4b5f8130 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -124,33 +124,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"aaq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"aar" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -170,265 +143,10 @@ /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/starboard/fore) -"aav" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"aaw" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"aax" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aay" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aaz" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aaA" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"aaB" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aaC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"aaD" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engpa"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) "aaE" = ( /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) -"aaF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) -"aaG" = ( -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) -"aaH" = ( -/obj/structure/cable/white{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) -"aaI" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sign/poster/contraband/scum{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/cafeteria, -/area/maintenance/port/fore) -"aaJ" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/sign/poster/official/nt_storm_officer{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/security/main) -"aaK" = ( -/obj/machinery/flasher/portable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/poster/official/nt_storm{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aaL" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/clothing/suit/armor/laserproof, -/obj/item/gun/energy/temperature/security, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/poster/official/ion_rifle{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"aaM" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/poster/official/medical_green_cross{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/medical/storage) -"aaN" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/sign/poster/official/medical_green_cross{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -436,37 +154,12 @@ "aaP" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) -"aaQ" = ( -/obj/structure/sign/poster/official/medical_green_cross, -/turf/closed/wall, -/area/medical/medbay/central) -"aaR" = ( -/obj/structure/table/wood, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/scum{ - pixel_x = 32 - }, -/obj/structure/sign/poster/contraband/scum{ - pixel_x = 32 - }, -/obj/structure/sign/poster/contraband/scum{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "aaS" = ( /turf/closed/wall/mineral/plastitanium, /area/construction/mining/aux_base) "abe" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/end{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -499,7 +192,7 @@ dir = 4 }, /obj/effect/turf_decal/stripes/line{ - dir = 5 + dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -1195,6 +888,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/construction/mining/aux_base) +"adY" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window{ + req_one_access_txt = "48,50" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "aea" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -9374,6 +9080,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) +"avk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) "avl" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ @@ -10531,6 +10248,20 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) +"axv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "axw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -10588,6 +10319,19 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"axD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "axE" = ( /obj/structure/cable{ icon_state = "2-8" @@ -10699,6 +10443,15 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/fore) +"axN" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/cafeteria, +/area/maintenance/port/fore) "axO" = ( /obj/structure/table/wood, /obj/item/camera, @@ -11245,6 +10998,20 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) +"ayM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "ayN" = ( /obj/structure/cable{ icon_state = "2-8" @@ -11356,7 +11123,7 @@ "ayW" = ( /obj/machinery/light/small, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -11839,6 +11606,19 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) +"azS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "azT" = ( /obj/machinery/power/rad_collector/anchored, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -12043,7 +11823,7 @@ "aAm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -12054,7 +11834,7 @@ /area/crew_quarters/toilet/auxiliary) "aAn" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -12066,7 +11846,7 @@ /area/crew_quarters/toilet/auxiliary) "aAo" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -14145,10 +13925,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aEh" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/quartermaster/storage) "aEi" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -15896,9 +15672,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "aGU" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -15913,9 +15686,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "aGV" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, /obj/structure/cable/white{ icon_state = "2-4" }, @@ -16802,17 +16572,18 @@ /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aIu" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aIv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -16823,6 +16594,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aIw" = ( @@ -16916,6 +16690,24 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/engine/atmospherics_engine) +"aID" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) "aIE" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -16935,6 +16727,18 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) +"aIF" = ( +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) "aIG" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/bot, @@ -18418,10 +18222,10 @@ /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark/corner, /area/maintenance/disposal/incinerator) "aLi" = ( @@ -18435,26 +18239,15 @@ "aLj" = ( /obj/machinery/meter, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/general/visible, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner, /area/maintenance/disposal/incinerator) "aLk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Turbine" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner, -/area/maintenance/disposal/incinerator) -"aLl" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, @@ -19676,7 +19469,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aNx" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ dir = 4 }, /obj/machinery/light/small{ @@ -19956,13 +19749,15 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ pixel_y = 27 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "aNV" = ( @@ -20017,7 +19812,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -20028,6 +19822,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aOa" = ( @@ -20048,7 +19843,6 @@ /area/engine/atmos) "aOb" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -20091,9 +19885,6 @@ name = "Station Intercom"; pixel_y = 26 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -20106,29 +19897,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"aOe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aOf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/atmos) "aOh" = ( /obj/machinery/status_display/evac{ pixel_y = 32 @@ -20136,9 +19904,6 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -20152,9 +19917,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "aOj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -20172,16 +19934,10 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/atmos) "aOl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -20199,9 +19955,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -21030,9 +20783,6 @@ /turf/open/floor/plasteel/dark/corner, /area/maintenance/disposal/incinerator) "aPD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -21043,6 +20793,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aPE" = ( @@ -21056,15 +20809,15 @@ /obj/structure/table/reinforced, /obj/item/paper_bin, /obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -21075,10 +20828,11 @@ pixel_y = 1 }, /obj/structure/tank_dispenser, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark/corner{ @@ -21091,10 +20845,10 @@ pixel_y = 1 }, /obj/machinery/computer/atmos_control, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark/corner{ @@ -21107,11 +20861,10 @@ pixel_y = 1 }, /obj/machinery/computer/atmos_alert, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark/corner{ @@ -21127,10 +20880,10 @@ /obj/item/crowbar/red, /obj/item/wrench, /obj/item/clothing/mask/gas, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark/corner{ @@ -21154,10 +20907,10 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/checker, @@ -21179,15 +20932,15 @@ /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, /obj/item/electronics/firealarm, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -21260,7 +21013,6 @@ dir = 8 }, /obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/item/stack/rods{ amount = 23 }, @@ -22125,9 +21877,6 @@ /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "aRq" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -22138,6 +21887,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aRr" = ( @@ -22168,6 +21920,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "aRt" = ( @@ -22181,17 +21934,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aRu" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aRv" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -22201,16 +21943,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aRw" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aRx" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -22260,7 +21992,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -22283,9 +22014,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "aRD" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -22296,6 +22024,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aRE" = ( @@ -23217,7 +22948,6 @@ /turf/open/space, /area/space/nearstation) "aST" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -23228,6 +22958,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aSU" = ( @@ -23241,15 +22972,19 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/checker, -/area/engine/atmos) -"aSV" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 6 }, +/turf/open/floor/plasteel/checker, +/area/engine/atmos) +"aSV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "aSW" = ( @@ -23273,30 +23008,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Port to Turbine" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aSY" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Port to Filter" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -23373,7 +23084,6 @@ /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -23387,13 +23097,12 @@ /turf/open/floor/plasteel, /area/engine/atmos) "aTd" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 1 - }, -/obj/machinery/meter, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aTe" = ( @@ -23404,17 +23113,16 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Pure" - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 + }, +/obj/machinery/meter, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "aTf" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -23425,6 +23133,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Pure" + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aTg" = ( @@ -23685,7 +23397,10 @@ /area/crew_quarters/bar/atrium) "aTH" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/coffee, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -4; + pixel_y = 2 + }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -24562,7 +24277,6 @@ /turf/open/floor/plating, /area/security/prison) "aUL" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/light/small{ dir = 8 }, @@ -24576,12 +24290,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"aUM" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"aUM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -24593,16 +24310,20 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aUN" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "aUO" = ( @@ -24621,23 +24342,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aUP" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aUQ" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -24646,6 +24350,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "aUR" = ( @@ -24710,7 +24415,6 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -24724,7 +24428,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "aUW" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, @@ -24741,12 +24444,13 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "aUY" = ( @@ -25860,16 +25564,13 @@ /area/engine/atmos) "aWy" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"aWz" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"aWz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -25881,6 +25582,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "CO2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aWA" = ( @@ -25891,11 +25597,6 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "CO2 to Pure" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -25906,73 +25607,19 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aWB" = ( -/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "aWC" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aWD" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aWE" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aWF" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "aWG" = ( @@ -26021,49 +25668,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aWM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aWN" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aWO" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aWP" = ( @@ -26071,7 +25682,6 @@ dir = 4 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, @@ -26081,6 +25691,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "aWR" = ( @@ -26177,7 +25788,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) "aWX" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /obj/machinery/airalarm{ @@ -26848,7 +26459,6 @@ /turf/open/floor/engine/co2, /area/engine/atmos) "aXY" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -26860,6 +26470,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aXZ" = ( @@ -26869,7 +26480,6 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -26880,81 +26490,23 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aYa" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYb" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYc" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aYe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Port to Turbine" }, /turf/open/floor/plasteel, /area/engine/atmos) "aYf" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/lightreplacer, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "aYg" = ( @@ -26992,27 +26544,23 @@ /turf/open/floor/plasteel, /area/engine/atmos) "aYj" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, /obj/machinery/newscaster{ pixel_x = 32 }, /obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/atmos, /turf/open/floor/plasteel, /area/engine/atmos) "aYk" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/mask/gas, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/mask/gas, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aYl" = ( @@ -27030,13 +26578,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aYm" = ( /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, @@ -27052,35 +26602,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aYn" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aYo" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "aYp" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "O2 to Pure" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -27091,12 +26620,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aYq" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 10 - }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/securearea{ pixel_x = 32 @@ -27119,6 +26648,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "O2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aYr" = ( @@ -28131,10 +27665,6 @@ /turf/open/floor/plating, /area/engine/atmos) "aZT" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -28145,6 +27675,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2, /turf/open/floor/plasteel/dark, /area/engine/atmos) "aZU" = ( @@ -28152,7 +27683,6 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -28163,33 +27693,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"aZV" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aZW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aZX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -28204,34 +27711,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aZY" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/meter, -/obj/item/wrench, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"aZZ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "baa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -28265,8 +27744,8 @@ "bac" = ( /obj/structure/closet/secure_closet/atmospherics, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/end{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -28295,23 +27774,6 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bag" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -28332,11 +27794,6 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "O2 to Airmix" - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -28344,10 +27801,13 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bai" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -28358,6 +27818,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "O2 to Airmix" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "baj" = ( @@ -29011,7 +28476,6 @@ /turf/open/space, /area/space/nearstation) "bbA" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/structure/sign/warning/securearea{ pixel_x = -32 }, @@ -29033,10 +28497,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bbB" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -29047,58 +28511,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"bbC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bbD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/atmospheric_technician, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bbE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bbF" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -29152,7 +28567,6 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/landmark/start/atmospheric_technician, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -29166,13 +28580,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bbK" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bbL" = ( /obj/machinery/computer/atmos_control/tank/oxygen_tank{ dir = 8 @@ -29180,11 +28587,11 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bbM" = ( @@ -29200,6 +28607,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bbN" = ( @@ -29865,10 +29273,6 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bda" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -29879,6 +29283,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Plasma to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bdb" = ( @@ -29889,11 +29298,6 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Plasma to Pure" - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -29903,25 +29307,17 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bdc" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bdd" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bde" = ( @@ -29937,23 +29333,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bdf" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bdg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/yellow{ @@ -29995,9 +29374,6 @@ dir = 4 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -30005,12 +29381,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bdl" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30021,6 +29395,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bdm" = ( @@ -30706,7 +30083,6 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -30714,6 +30090,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bey" = ( @@ -30730,28 +30107,9 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bez" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "beA" = ( -/obj/structure/table/reinforced, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -30762,10 +30120,12 @@ dir = 4; pixel_x = -24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -30790,44 +30150,15 @@ /turf/closed/wall, /area/engine/atmos) "beF" = ( -/obj/structure/table/reinforced, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"beG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"beH" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "beI" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2 to Pure" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30838,6 +30169,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "beJ" = ( @@ -30847,12 +30181,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -30860,6 +30188,14 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "N2 to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "beK" = ( @@ -31521,10 +30857,6 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bfU" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -31536,6 +30868,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bfV" = ( @@ -31543,7 +30876,6 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -31551,23 +30883,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bfW" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Port Mix to Port Ports" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/structure/closet/crate, /turf/open/floor/plasteel, /area/engine/atmos) "bfX" = ( @@ -31585,26 +30902,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bfY" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Port Mix to Starboard Ports" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bfZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -31625,29 +30922,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bgb" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bgc" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bgd" = ( @@ -31658,11 +30939,6 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "N2 to Airmix" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -31670,11 +30946,13 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bge" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -31685,6 +30963,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "N2 to Airmix" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bgf" = ( @@ -32179,7 +31462,6 @@ /turf/open/floor/plating, /area/security/main) "bhf" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/securearea{ pixel_x = -32 @@ -32197,50 +31479,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"bhg" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bhh" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bhi" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) "bhj" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/engine/atmos"; @@ -32342,7 +31583,6 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -32390,27 +31630,12 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bhu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) "bhv" = ( /obj/machinery/air_sensor/atmos/nitrogen_tank, /turf/open/floor/engine/n2, @@ -33351,34 +32576,29 @@ dir = 1; pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2O to Pure" - }, /obj/effect/turf_decal/tile/red{ dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, /area/engine/atmos) "biX" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "biY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -33389,75 +32609,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "biZ" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bja" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bjb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Air to Ports" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bjc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to Engine" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -33468,15 +32625,14 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/engine/atmos) "bjd" = ( /obj/structure/cable/white{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -33493,7 +32649,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -33504,6 +32659,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bjf" = ( @@ -33591,8 +32749,6 @@ /obj/structure/cable/white{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/meter, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -33631,9 +32787,6 @@ dir = 4 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 1 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -34541,42 +33694,49 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, /area/engine/atmos) "bkK" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Pure to Port" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bkL" = ( /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bkM" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/meter, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bkN" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/meter, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bkO" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -34587,13 +33747,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bkQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bkR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -34634,14 +33787,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bkU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bkV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -34662,11 +33807,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bkX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "SM Coolant Loop" - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -34677,6 +33817,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bkY" = ( @@ -34686,9 +33829,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -34699,10 +33839,17 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bkZ" = ( /obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, /turf/open/space, /area/engine/atmos) "bla" = ( @@ -35678,43 +34825,41 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) -"bmK" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 5 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/atmos) "bmL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 1 - }, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Mix" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bmM" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 9 - }, /obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bmN" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Port" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bmO" = ( /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bmP" = ( @@ -35722,47 +34867,53 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bmQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "bmR" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Air to Ports" + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "bmS" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "bmT" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, /turf/open/floor/plasteel/checker, /area/engine/atmos) "bmU" = ( @@ -35809,7 +34960,9 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/rods/fifty, /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bmY" = ( @@ -35845,9 +34998,6 @@ dir = 8 }, /obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -35858,12 +35008,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bnb" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -35874,14 +35024,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"bnc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bnd" = ( /obj/structure/lattice/catwalk, @@ -36574,28 +35720,10 @@ /area/space/nearstation) "bok" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 }, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"bol" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"bom" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/atmos) "bon" = ( @@ -36614,11 +35742,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"boo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, -/turf/open/floor/plating, -/area/engine/atmos) "bop" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -36631,9 +35754,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "boq" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -36644,6 +35764,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bor" = ( @@ -36665,7 +35788,6 @@ /obj/item/clipboard, /obj/effect/decal/cleanable/dirt, /obj/item/toy/figure/atmos, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) @@ -37590,7 +36712,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/tile/green{ dir = 1 }, @@ -37600,10 +36721,10 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bpR" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; name = "Unfiltered & Air to Mix" @@ -37628,13 +36749,11 @@ }, /area/engine/atmos) "bpT" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Pure to Mix" - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -37657,6 +36776,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/meter, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -37729,7 +36849,6 @@ /obj/item/clothing/head/welding, /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -38942,22 +38061,27 @@ /obj/machinery/computer/atmos_control/tank/mix_tank{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/tile/green{ dir = 1 }, /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "brW" = ( -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "brX" = ( @@ -39012,17 +38136,11 @@ /obj/item/wrench, /obj/item/clothing/mask/gas, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) "bsd" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -39033,13 +38151,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bse" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility, /obj/item/t_scanner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) @@ -40221,13 +39339,14 @@ dir = 4; pixel_x = -22 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "btU" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -40238,11 +39357,16 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "btV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "btW" = ( @@ -40321,47 +39445,53 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bub" = ( /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "buc" = ( /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bud" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bue" = ( -/obj/machinery/portable_atmospherics/canister/air, /obj/machinery/camera{ c_tag = "Atmospherics - Desk"; dir = 8; name = "atmospherics camera" }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "buf" = ( @@ -41019,9 +40149,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bvn" = ( @@ -41031,9 +40158,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bvo" = ( @@ -41044,9 +40168,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bvp" = ( @@ -41054,9 +40175,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bvq" = ( @@ -41508,6 +40626,17 @@ }, /turf/open/floor/plasteel, /area/security/main) +"bwj" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/poster/official/nt_storm_officer{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/main) "bwk" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -43150,7 +42279,9 @@ /obj/structure/cable/white{ icon_state = "0-2" }, -/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!interrogation_room" + }, /turf/open/floor/plating, /area/security/main) "byP" = ( @@ -44224,7 +43355,9 @@ /obj/structure/cable/white{ icon_state = "0-4" }, -/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!interrogation_room" + }, /turf/open/floor/plating, /area/security/main) "bAt" = ( @@ -45531,10 +44664,12 @@ /area/security/main) "bCm" = ( /obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced/tinted, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!interrogation_room" + }, /turf/open/floor/plating, /area/security/main) "bCn" = ( @@ -45554,6 +44689,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/button/electrochromatic{ + id = "!interrogation_room"; + pixel_y = -26 + }, /turf/open/floor/plasteel/dark, /area/security/main) "bCo" = ( @@ -52235,6 +51374,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLJ" = ( @@ -52252,6 +51394,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLK" = ( @@ -53541,9 +52686,6 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bND" = ( -/obj/structure/cable/white{ - icon_state = "0-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -53557,6 +52699,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, /turf/open/floor/plasteel/dark, /area/aisat) "bNE" = ( @@ -56006,27 +55151,33 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bRB" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bRC" = ( -/obj/machinery/cell_charger, -/obj/structure/table/reinforced, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) @@ -57103,10 +56254,16 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bTr" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bTs" = ( @@ -57118,6 +56275,9 @@ start_active = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "bTt" = ( @@ -59853,6 +59013,7 @@ /area/crew_quarters/heads/captain) "bXh" = ( /obj/structure/toilet{ + contents = newlist(/obj/item/toy/snappop/phoenix); dir = 4 }, /obj/machinery/light{ @@ -60475,6 +59636,26 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"bXR" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle, +/obj/item/clothing/suit/armor/laserproof, +/obj/item/gun/energy/temperature/security, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/ion_rifle{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "bXS" = ( /obj/structure/window/reinforced{ dir = 8 @@ -61216,10 +60397,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -61234,10 +60411,6 @@ dir = 4 }, /obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -63287,43 +62460,36 @@ /turf/open/floor/plasteel/dark, /area/library) "cct" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 +/obj/structure/table/wood/fancy, +/obj/machinery/door/window{ + name = "Secure Art Exhibition" }, -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_y = 26 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"ccu" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/folder, -/obj/item/pen, -/obj/machinery/newscaster{ +/obj/structure/sign/painting/library_secure{ pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/carpet, +/area/library) +"ccu" = ( +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/window/reinforced, +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/carpet, /area/library) "ccv" = ( -/obj/machinery/computer/libraryconsole, -/obj/structure/table/wood, -/turf/open/floor/plasteel/dark, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Library - Aft"; + dir = 2; + name = "library camera" + }, +/turf/open/floor/wood, /area/library) "ccw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -64465,7 +63631,7 @@ /obj/structure/chair/office/dark{ dir = 8 }, -/obj/effect/landmark/start/librarian, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/dark, /area/library) "ceg" = ( @@ -64478,71 +63644,21 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"cei" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/camera{ - c_tag = "Library - Fore"; - dir = 8; - name = "library camera" - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/grimy, /area/library) "cej" = ( -/obj/machinery/photocopier, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) -"cek" = ( -/obj/structure/chair/office/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark, +/obj/effect/landmark/start/librarian, +/turf/open/floor/plasteel/grimy, /area/library) "cel" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair/sofa/right{ + icon_state = "sofaend_right"; dir = 8 }, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/turf/open/floor/wood, /area/library) "cem" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -65719,34 +64835,17 @@ }, /turf/open/floor/plasteel/grimy, /area/library) -"cfY" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/light/small{ - dir = 4 +"cfZ" = ( +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -26 + }, +/obj/structure/sign/painting/library{ + pixel_x = 0; + pixel_y = -32 }, /turf/open/floor/wood, /area/library) -"cfZ" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/library) -"cga" = ( -/obj/machinery/door/morgue{ - name = "Private Study" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/library) "cgb" = ( /obj/structure/sign/plaques/kiddie/library{ pixel_x = -32 @@ -66684,6 +65783,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) +"chv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "chw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66894,61 +66003,28 @@ /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, /area/library) -"chQ" = ( -/obj/machinery/bookbinder, -/turf/open/floor/wood, -/area/library) -"chR" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/library) -"chS" = ( -/obj/structure/chair/comfy/brown, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/library) -"chT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/library) -"chU" = ( -/obj/machinery/photocopier, -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/library) "chV" = ( -/obj/machinery/light{ - dir = 1 - }, /obj/machinery/newscaster{ - pixel_y = 32 + pixel_x = -32 }, -/obj/structure/bookcase/manuals/research_and_development, -/obj/machinery/camera{ - c_tag = "Library"; - name = "library camera" - }, -/turf/open/floor/wood, +/turf/open/floor/plasteel/dark, /area/library) "chW" = ( -/obj/structure/chair/comfy/brown, -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_y = 26 - }, -/turf/open/floor/wood, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/grimy, /area/library) "chX" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, +/obj/structure/table/wood, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, /area/library) "chY" = ( /obj/machinery/door/poddoor/shutters/preopen{ @@ -67705,6 +66781,19 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"cjf" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -67837,10 +66926,6 @@ }, /turf/open/floor/plasteel/grimy, /area/library) -"cju" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel/grimy, -/area/library) "cjv" = ( /obj/machinery/door/airlock/public/glass{ name = "Library Access" @@ -68475,6 +67560,26 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"ckA" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "ckB" = ( /obj/structure/cable{ icon_state = "4-8" @@ -69243,6 +68348,19 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"clV" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -69463,10 +68581,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/library) -"cmv" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/library) "cmw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/extinguisher_cabinet{ @@ -70261,6 +69375,20 @@ /obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/engineering) +"cnE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "cnF" = ( /obj/machinery/requests_console{ department = "Chapel Office"; @@ -70343,7 +69471,7 @@ /turf/open/floor/wood, /area/library) "cnP" = ( -/obj/structure/bookcase/manuals/medical, +/obj/structure/bookcase/random, /turf/open/floor/wood, /area/library) "cnQ" = ( @@ -71694,6 +70822,22 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"cqw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "cqx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -75111,8 +74255,6 @@ /area/library) "cwr" = ( /obj/structure/easel, -/obj/item/canvas/twentythreeXnineteen, -/obj/item/canvas/twentythreeXtwentythree, /obj/item/canvas/twentythreeXtwentythree, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -76945,6 +76087,25 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, /area/space/nearstation) +"czs" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "czt" = ( /obj/structure/cable{ icon_state = "1-8" @@ -77626,7 +76787,6 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -78200,8 +77360,8 @@ "cBx" = ( /obj/structure/rack, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = -3; pixel_y = 3 @@ -79044,7 +78204,10 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/newspaper, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, /obj/machinery/status_display/evac{ pixel_x = -32 }, @@ -80757,7 +79920,10 @@ pixel_x = 7; pixel_y = 11 }, -/obj/item/newspaper, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, /obj/item/pen/red, /turf/open/floor/wood{ icon_state = "wood-broken2" @@ -81484,7 +80650,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "cGO" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -82136,7 +81302,7 @@ "cIa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -82147,7 +81313,7 @@ /area/crew_quarters/toilet/restrooms) "cIb" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -82159,7 +81325,7 @@ /area/crew_quarters/toilet/restrooms) "cIc" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/newscaster{ @@ -82746,19 +81912,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"cJl" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "cJm" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -84072,9 +83225,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cLa" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -84085,6 +83235,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "cLb" = ( @@ -85569,6 +84722,17 @@ }, /turf/open/floor/plasteel, /area/medical/storage) +"cNO" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "cNP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -86331,8 +85495,8 @@ "cPs" = ( /obj/structure/table, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -87350,6 +86514,20 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"cRa" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "cRb" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -89648,7 +88826,7 @@ }, /area/medical/storage) "cUP" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -92549,8 +91727,8 @@ "cZH" = ( /obj/structure/table/glass, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/machinery/camera{ c_tag = "Medbay - Sleepers"; name = "medbay camera"; @@ -94848,8 +94026,8 @@ "ddp" = ( /obj/structure/table/glass, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, @@ -98515,17 +97693,17 @@ /obj/structure/sign/poster/official/science{ pixel_x = -32 }, +/obj/item/clothing/mask/gas, /turf/open/floor/plasteel, /area/science/explab) "djC" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/rnd/bepis, /turf/open/floor/plasteel, /area/science/explab) "djD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/light{ dir = 1 }, @@ -98536,7 +97714,6 @@ /turf/open/floor/plasteel, /area/science/explab) "djE" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -99520,34 +98697,20 @@ /obj/machinery/newscaster{ pixel_x = -32 }, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/clothing/mask/gas, /obj/effect/turf_decal/bot, +/obj/item/storage/bag/money, /turf/open/floor/plasteel, /area/science/explab) "dlp" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/structure/chair/office/light{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/science/explab) "dlq" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"dlr" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -101981,8 +101144,8 @@ "dqj" = ( /obj/structure/table, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, @@ -104058,6 +103221,26 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) +"duk" = ( +/obj/structure/table/wood, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "dul" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -108608,7 +107791,7 @@ /obj/structure/sign/poster/contraband/random{ pixel_y = -32 }, -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) "dBS" = ( @@ -110660,7 +109843,10 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/newspaper, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, /turf/open/floor/plating, /area/security/detectives_office/private_investigators_office) "dFu" = ( @@ -111523,7 +110709,10 @@ /area/crew_quarters/theatre/abandoned) "dGH" = ( /obj/structure/table/wood, -/obj/item/newspaper, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, /obj/item/clothing/head/bowler, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -112677,18 +111866,6 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/science/storage) -"dIC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plasteel, /area/science/storage) "dID" = ( @@ -112697,6 +111874,7 @@ icon_state = "4-8" }, /obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/scrubber/huge, /turf/open/floor/plasteel, /area/science/storage) "dIE" = ( @@ -112704,6 +111882,7 @@ icon_state = "2-8" }, /obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/scrubber/huge, /turf/open/floor/plasteel, /area/science/storage) "dIF" = ( @@ -113446,18 +112625,17 @@ /turf/open/floor/plasteel, /area/science/mixing) "dJT" = ( -/obj/structure/tank_dispenser, /obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/clothing/head/hardhat/red, +/obj/item/clothing/suit/fire/firefighter, /turf/open/floor/plasteel, /area/science/mixing) "dJU" = ( -/obj/structure/rack, /obj/structure/extinguisher_cabinet{ pixel_y = -32 }, -/obj/item/clothing/suit/fire/firefighter, -/obj/item/clothing/head/hardhat/red, -/obj/item/clothing/mask/gas, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, @@ -113516,9 +112694,6 @@ /turf/closed/wall/r_wall, /area/science/mixing) "dJZ" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -113528,30 +112703,29 @@ name = "science camera"; network = list("ss13","rd") }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/storage) "dKa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/storage) "dKb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/storage) "dKc" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/storage) "dKd" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc{ areastring = "/area/science/storage"; @@ -113560,7 +112734,7 @@ pixel_x = 26 }, /obj/structure/cable/white, -/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/storage) "dKe" = ( @@ -113866,8 +113040,8 @@ /turf/open/floor/plasteel, /area/science/mixing) "dKF" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/bot, +/obj/structure/tank_dispenser, /turf/open/floor/plasteel, /area/science/storage) "dKG" = ( @@ -115308,7 +114482,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/piano, +/obj/structure/musician/piano, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/crew_quarters/theatre/abandoned) @@ -115523,6 +114697,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/storage) "dNC" = ( @@ -115932,6 +115109,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/storage) "dOq" = ( @@ -116751,7 +115931,7 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "dPN" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -125549,10 +124729,6 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/aft) -"egC" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/chapel/office) "egD" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -125737,22 +124913,24 @@ }, /turf/open/floor/plasteel/dark, /area/library) +"eoB" = ( +/obj/machinery/seed_extractor, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) +"etO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/atmos) "exE" = ( /obj/machinery/air_sensor/atmos/toxins_mixing_tank, /turf/open/floor/engine/vacuum, /area/science/mixing) -"eCJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "eCM" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -125763,6 +124941,16 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab) +"eGi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/storage) "eJc" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/closed/wall/r_wall, @@ -125778,7 +124966,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/chem_dispenser, +/obj/machinery/chem_dispenser/apothecary, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "eMD" = ( @@ -125804,13 +124992,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"ePi" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "eTv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -125827,6 +125008,14 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"eWr" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grape, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "faI" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -125863,27 +125052,12 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"fiK" = ( -/obj/structure/cable/white{ - icon_state = "1-2" +"fmW" = ( +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - name = "Mining Junction"; - sortType = 22 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/turf/open/floor/wood, +/area/library) "fno" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -125909,16 +125083,6 @@ /obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, /turf/open/floor/engine, /area/science/mixing) -"fCs" = ( -/obj/machinery/door/window/northright{ - name = "Coffin Storage" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/chapel/office) "fFK" = ( /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral{ @@ -125937,44 +125101,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/science/circuit) -"fLh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) "fLR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"fRT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"fXF" = ( -/obj/machinery/button/crematorium{ - id = "cremawheat"; - pixel_x = -26; - req_access_txt = "27" - }, +"fRK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -125985,15 +125118,21 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/table, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 1 + }, /turf/open/floor/plasteel/dark, -/area/chapel/office) +/area/engine/atmos) +"fRT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) "gbV" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1 @@ -126006,56 +125145,31 @@ }, /turf/open/floor/engine, /area/science/mixing) -"giN" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/chapel/office) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) -"gut" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"gqA" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/cable/white{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable/white{ + icon_state = "2-8" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"gBd" = ( -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/security/prison) -"gKo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) +"gKn" = ( +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/circuit/green, /area/science/research/abandoned) -"gLe" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/grape, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) "gNw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/table/glass, @@ -126107,19 +125221,23 @@ dir = 1 }, /area/science/circuit) +"gVM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Library - Aft"; + dir = 2; + name = "library camera" + }, +/turf/open/floor/plasteel/grimy, +/area/library) "gVS" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/costume/maid, /obj/item/clothing/mask/muzzle, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"gVZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "gXn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -126147,10 +125265,12 @@ dir = 10 }, /area/science/circuit) -"hix" = ( -/obj/structure/sign/warning/vacuum, +"hnq" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/closed/wall/r_wall, -/area/chapel/office) +/area/engine/atmos) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -126170,13 +125290,37 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"hsy" = ( -/obj/machinery/vr_sleeper, +"hrQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"hAf" = ( /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/security/prison) +/area/maintenance/port/aft) +"hCj" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/maintenance/starboard/fore) "hFo" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -126227,34 +125371,38 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/medbay/central) -"hTX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +"hZh" = ( +/turf/open/space/basic, +/area/space/station_ruins) "iaF" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) -"iho" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/medical/surgery) +"iem" = ( +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/chapel/office) "ijB" = ( /obj/structure/reagent_dispensers/keg/aphro/strong, /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"ioW" = ( -/obj/effect/decal/cleanable/dirt, +"imI" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"irh" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -126265,11 +125413,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/arcade{ - dir = 1 - }, +/obj/structure/closet/crate/coffin, /turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) +/area/chapel/office) "iwL" = ( /obj/machinery/status_display/evac{ pixel_x = 32 @@ -126288,6 +125434,33 @@ }, /turf/open/floor/engine/vacuum, /area/science/mixing) +"iBf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"iIl" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"iNK" = ( +/obj/structure/sign/painting/library{ + pixel_x = 0; + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/library) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -126308,6 +125481,24 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/medical/medbay/central) +"iRs" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/security/prison) +"iRY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) "iTj" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6 @@ -126328,6 +125519,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"jdx" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "jdO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -126352,6 +125548,16 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"jiQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/sign/plaques/kiddie/library{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/library) "jjN" = ( /obj/structure/table/reinforced, /obj/machinery/camera{ @@ -126417,7 +125623,8 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"jwo" = ( +"jvU" = ( +/obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -126428,9 +125635,27 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/mob/living/simple_animal/pet/bumbles, -/turf/open/floor/plasteel, -/area/hydroponics) +/obj/structure/sign/poster/official/nt_storm{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"jyT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/computer/arcade{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) "jBE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -126445,10 +125670,19 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) -"jOB" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/maintenance/starboard/fore) +"jGT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"jNQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plating, +/area/engine/atmos) "jOE" = ( /obj/machinery/newscaster{ pixel_x = 32 @@ -126486,6 +125720,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) +"jYx" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plasteel, +/area/science/storage) "kam" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -126494,7 +125733,7 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"kiJ" = ( +"kbU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -126505,35 +125744,34 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/arcade{ - dir = 4 - }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o, /turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) -"kqa" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/cable/white{ - icon_state = "4-8" +/area/engine/atmos) +"klP" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) -"krb" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"kmj" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/space, +/area/engine/atmos) +"ktK" = ( /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ dir = 8 }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel/dark, /area/chapel/office) "kvf" = ( @@ -126561,19 +125799,19 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) -"kKn" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ +"kBV" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/door/window{ - req_one_access_txt = "48,50" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "kLu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -126589,11 +125827,85 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"kND" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"kPJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "lak" = ( /turf/open/floor/plasteel/white/side{ dir = 10 }, /area/science/circuit) +"lbN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"lge" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"lkk" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/lime{ + pixel_x = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) +"loH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -126611,6 +125923,27 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"lpu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/simple_animal/pet/bumbles, +/turf/open/floor/plasteel, +/area/hydroponics) +"lsa" = ( +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "lti" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped, /obj/effect/turf_decal/tile/neutral{ @@ -126647,17 +125980,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) -"lDl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -126691,20 +126013,22 @@ }, /turf/open/floor/plasteel, /area/science/circuit) -"lLY" = ( -/obj/effect/turf_decal/tile/neutral{ +"lKF" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/brown{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/obj/machinery/keycard_auth{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) "lOY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -126763,16 +126087,6 @@ dir = 1 }, /area/science/circuit) -"mbd" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -126791,21 +126105,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"mpP" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -126823,50 +126122,29 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"mvx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "mxm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"mAL" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"mEP" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "mIi" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"mLI" = ( -/obj/machinery/door/airlock/external{ - name = "External Docking Port" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"mPj" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/chapel/office) -"mPH" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/security/prison) "mQE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -126879,6 +126157,14 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"mUH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Ports to Engine" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "mWZ" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -126890,53 +126176,50 @@ }, /turf/open/floor/engine, /area/science/mixing) -"nbW" = ( -/obj/structure/grille, +"nbi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/r_wall, +/area/chapel/office) +"nph" = ( /turf/open/space, -/area/space/nearstation) +/area/space) +"nuw" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "nyN" = ( /obj/machinery/vending/kink, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"nFW" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/chapel/office) -"nNX" = ( -/obj/structure/reagent_dispensers/watertank, +"nOz" = ( /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 1 }, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) -"nQR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /obj/effect/turf_decal/delivery, -/obj/machinery/computer/shuttle/mining/common, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"nSh" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"nSS" = ( -/obj/machinery/door/airlock/external{ - name = "External Docking Port" +/area/maintenance/port/aft) +"nQB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"oHk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -126947,11 +126230,56 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/computer/arcade{ +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"nSh" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"nSA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"odz" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain/private) +"ohn" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/open/space, +/area/engine/atmos) +"omN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"osD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/turf/open/space, +/area/engine/atmos) +"oDY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "oIl" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -127001,6 +126329,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oNF" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/security/prison) "oSD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -127038,9 +126370,6 @@ /obj/machinery/igniter/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing) -"oZp" = ( -/turf/open/space/basic, -/area/space/station_ruins) "oZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -127053,39 +126382,32 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"oZY" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +"pcK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 }, -/turf/open/floor/plasteel, /area/maintenance/port/aft) -"pfC" = ( -/obj/machinery/seed_extractor, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) -"pgU" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/lime{ - pixel_x = 6 +"pmK" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 }, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/security/prison) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -127096,22 +126418,6 @@ dir = 1 }, /area/science/circuit) -"pnK" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/keycard_auth{ - pixel_x = -25 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) "poI" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -127136,6 +126442,10 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"ptB" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/chapel/office) "ptI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -127143,6 +126453,22 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) +"pxR" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/storage) "pQm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127160,21 +126486,28 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"qeN" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"pWb" = ( +/obj/structure/table/wood/fancy, +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/structure/window/reinforced, +/obj/structure/sign/painting/library_secure{ + pixel_y = 32 + }, +/turf/open/floor/carpet, +/area/library) +"pZB" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"qgU" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "qhc" = ( /obj/structure/table/reinforced, /obj/item/integrated_electronics/analyzer, @@ -127188,83 +126521,16 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, /turf/open/floor/engine/vacuum, /area/science/mixing) -"qoc" = ( -/obj/machinery/door/window/northleft{ - name = "Mass Driver" - }, -/obj/machinery/mass_driver{ - id = "chapelgun"; - name = "Holy Driver" - }, -/turf/open/floor/plating, -/area/chapel/office) "qpq" = ( /turf/open/floor/plasteel/white/side{ dir = 5 }, /area/science/circuit) -"qAV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "qBG" = ( /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"qYM" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space, -/area/space/station_ruins) -"ray" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/computer/pod/old{ - density = 0; - icon = 'icons/obj/airlock_machines.dmi'; - icon_state = "airlock_control_standby"; - id = "chapelgun"; - name = "Mass Driver Controller"; - pixel_x = -24 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"rhO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/circuit) -"rjr" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain/private) -"rqh" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"rCv" = ( -/turf/open/floor/plasteel/white/side{ - dir = 6 - }, -/area/science/circuit) -"rIi" = ( +"qUn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -127278,19 +126544,57 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"rKU" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +"rhO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/structure/cable/white{ - icon_state = "2-4" +/turf/open/floor/plasteel/white/side{ + dir = 9 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/area/science/circuit) +"rCv" = ( +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/science/circuit) +"rEo" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/open/space, +/area/engine/atmos) +"rGq" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/maintenance/port/aft) +/area/engine/atmos) +"rPK" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"rSz" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/chapel/office) "rUD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -127332,50 +126636,76 @@ /obj/effect/decal/remains/xeno, /turf/open/floor/engine/vacuum, /area/science/mixing) -"sfL" = ( -/turf/open/space, -/area/space) "svv" = ( /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing) -"sww" = ( +"sAr" = ( /obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/chapel/office) -"sCQ" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"sFU" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall, +/area/medical/surgery) +"sPd" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"sVX" = ( +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"sPy" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/library) +"sRE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"sSh" = ( +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/airalarm{ - pixel_y = 22 +/obj/machinery/computer/arcade{ + dir = 1 }, /turf/open/floor/plasteel/dark, -/area/chapel/office) +/area/maintenance/starboard/fore) +"tgB" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) "tmi" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -127389,21 +126719,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"tBE" = ( -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "tCh" = ( /turf/closed/wall, /area/science/misc_lab) @@ -127412,6 +126727,29 @@ dir = 10 }, /area/science/misc_lab) +"tMy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/library) +"tNT" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space, +/area/space/station_ruins) +"tOY" = ( +/obj/machinery/door/window/northright{ + name = "Coffin Storage" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/chapel/office) "tRT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -127422,21 +126760,24 @@ /obj/machinery/chem_heater, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"tVN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"tYG" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"ucF" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall/r_wall, /area/chapel/office) "upk" = ( /obj/machinery/door/airlock/public/glass{ @@ -127470,31 +126811,49 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab) -"usi" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 +"uqp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/vr_sleeper, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/security/prison) -"uuP" = ( +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 8 }, -/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/chapel/office) +"uqW" = ( +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/science/storage) +"uDs" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + name = "Mining Junction"; + sortType = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "uNP" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/turf_decal/stripes/line{ @@ -127512,6 +126871,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"uXf" = ( +/obj/structure/sign/poster/official/medical_green_cross, +/turf/closed/wall, +/area/medical/medbay/central) "uYS" = ( /obj/machinery/door/airlock/atmos/glass/critical{ heat_proof = 1; @@ -127523,10 +126886,74 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"vcs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"vcP" = ( +/obj/machinery/door/window/northleft{ + name = "Mass Driver" + }, +/obj/machinery/mass_driver{ + id = "chapelgun"; + name = "Holy Driver" + }, +/turf/open/floor/plating, +/area/chapel/office) "vhA" = ( /obj/item/clothing/under/color/grey, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"voA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"vrD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"vwo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "vAb" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -127536,30 +126963,106 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"vAW" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/security/prison) -"vEq" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +"vFi" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/plasteel/white, -/area/medical/storage) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2O to Pure" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"vHN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vRf" = ( +/turf/open/floor/plasteel, +/area/security/prison) +"vRV" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/circuit) +"wmL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/computer/pod/old{ + density = 0; + icon = 'icons/obj/airlock_machines.dmi'; + icon_state = "airlock_control_standby"; + id = "chapelgun"; + name = "Mass Driver Controller"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"wum" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"wzu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/computer/arcade{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) "wAA" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -127575,10 +127078,25 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/misc_lab) -"wIf" = ( -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/security/prison) +"wZT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "xaf" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -127597,31 +127115,13 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"xdp" = ( -/obj/docking_port/stationary{ - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +"xcU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 }, -/turf/open/space/basic, -/area/space) -"xdZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/maintenance/port/aft) +/turf/open/floor/plating, +/area/engine/atmos) "xmt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -127631,8 +127131,10 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"xuu" = ( -/obj/effect/landmark/barthpot, +"xok" = ( +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/wood, /area/library) "xwK" = ( @@ -127660,23 +127162,6 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"xCB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "xDZ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -127695,6 +127180,46 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"xER" = ( +/obj/structure/chair/sofa/left{ + icon_state = "sofaend_left"; + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"xFI" = ( +/obj/machinery/button/crematorium{ + id = "cremawheat"; + pixel_x = -26; + req_access_txt = "27" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"xGC" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Port to Waste" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "xJl" = ( /obj/structure/table, /obj/item/folder/white, @@ -127752,6 +127277,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"yiP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) "yjc" = ( /obj/machinery/power/apc{ areastring = "/area/science/research/abandoned"; @@ -127766,3717 +127298,3717 @@ /area/science/research/abandoned) (1,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (2,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (3,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (4,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (5,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (6,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (7,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (8,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (9,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (10,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (11,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (12,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (13,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (14,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (15,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -131500,240 +131032,240 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (16,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -131757,240 +131289,240 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (17,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -132014,240 +131546,240 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (18,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -132271,227 +131803,227 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (19,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -132528,227 +132060,227 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (20,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -132785,227 +132317,227 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (21,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -133051,218 +132583,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (22,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -133308,218 +132840,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (23,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -133565,218 +133097,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (24,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -133822,218 +133354,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (25,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -134079,218 +133611,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (26,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -134336,218 +133868,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (27,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -134593,218 +134125,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (28,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -134850,218 +134382,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (29,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -135107,218 +134639,218 @@ ajr ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (30,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -135364,218 +134896,218 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (31,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -135621,218 +135153,218 @@ brM ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (32,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -135878,218 +135410,218 @@ brN ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (33,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -136135,218 +135667,218 @@ brM aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (34,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -136392,218 +135924,218 @@ brN ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (35,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -136649,218 +136181,218 @@ brM ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (36,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -136906,218 +136438,218 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (37,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -137163,218 +136695,218 @@ ajr ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (38,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -137420,218 +136952,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (39,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -137658,7 +137190,7 @@ bPC bRK bTC bVK -qeN +vwo cal bPC aaa @@ -137677,218 +137209,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (40,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -137915,7 +137447,7 @@ bPC bRL bTC bVx -xCB +hrQ cam bPC bRO @@ -137934,218 +137466,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (41,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -138172,7 +137704,7 @@ bPC bRM bTD bVL -xCB +hrQ can bPC bkE @@ -138191,218 +137723,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (42,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -138448,218 +137980,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (43,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -138705,218 +138237,218 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (44,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -138962,38 +138494,38 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139015,165 +138547,165 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (45,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139219,38 +138751,38 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139272,165 +138804,165 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (46,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139469,45 +139001,45 @@ aaa aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139529,170 +139061,170 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (47,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139726,45 +139258,45 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139786,176 +139318,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (48,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -139983,45 +139515,45 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140043,176 +139575,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (49,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140240,45 +139772,45 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140300,176 +139832,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (50,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140497,41 +140029,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140557,176 +140089,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (51,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140754,41 +140286,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -140814,176 +140346,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (52,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141011,41 +140543,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141071,176 +140603,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (53,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141268,41 +140800,41 @@ aaa aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141328,176 +140860,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (54,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141525,41 +141057,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141585,176 +141117,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (55,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141782,41 +141314,41 @@ aaa ajr aaa aaa -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -141842,176 +141374,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (56,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142039,41 +141571,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142099,176 +141631,176 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (57,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142296,41 +141828,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142356,140 +141888,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (58,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142498,34 +142030,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142553,41 +142085,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142613,140 +142145,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (59,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142755,34 +142287,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142810,41 +142342,41 @@ aaa aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -142870,126 +142402,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (60,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143012,34 +142544,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143067,41 +142599,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143127,126 +142659,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (61,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143269,34 +142801,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143324,41 +142856,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143384,126 +142916,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (62,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143526,34 +143058,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143581,41 +143113,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143641,126 +143173,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (63,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143783,34 +143315,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143838,41 +143370,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -143898,126 +143430,126 @@ aaa aab aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (64,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144040,34 +143572,34 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144095,41 +143627,41 @@ aaa aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144155,126 +143687,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (65,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144297,28 +143829,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144352,41 +143884,41 @@ aaa ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144412,126 +143944,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (66,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144554,28 +144086,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144609,41 +144141,41 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144669,126 +144201,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (67,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144811,28 +144343,28 @@ aad aac aac aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -144926,126 +144458,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (68,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145069,27 +144601,27 @@ aaa aac aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145183,126 +144715,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (69,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145326,27 +144858,27 @@ aaa aad aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145440,126 +144972,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (70,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145583,27 +145115,27 @@ aaa aac aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145697,126 +145229,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (71,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145852,15 +145384,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -145954,126 +145486,126 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (72,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -146109,15 +145641,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -146211,124 +145743,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (73,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -146468,124 +146000,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (74,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -146725,124 +146257,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (75,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -146982,124 +146514,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (76,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -147239,124 +146771,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (77,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -147496,124 +147028,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (78,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -147753,124 +147285,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (79,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -148010,124 +147542,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (80,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -148267,124 +147799,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (81,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -148524,124 +148056,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (82,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -148781,124 +148313,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (83,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -149038,124 +148570,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (84,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -149295,124 +148827,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (85,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -149552,124 +149084,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (86,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -149809,124 +149341,124 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (87,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -149962,22 +149494,22 @@ aNY aMB aMG aMG -aMG +iBf aWy -aMB -aZS -aMG +jNQ +jGT +jNQ aWy -aMB -aZS -aMG -aWy -aMB -aZS -aMG -aZS -aMB +jNQ +jGT +jNQ aWy +jNQ +jGT +tgB +jGT +xcU +yiP aMG aMG bxE @@ -150101,89 +149633,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (88,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -150225,12 +149757,12 @@ aXY aZT bbA bda -aST +iRY bfU bhf -bda -aST -aZT +vFi +iRY +kbU bok bpQ brV @@ -150358,89 +149890,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (89,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -150488,7 +150020,7 @@ bbB biW bkJ bmJ -bol +aTg bpR brW btN @@ -150615,89 +150147,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (90,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -150728,23 +150260,23 @@ aGV aIv aJO aLj -aMB -aOa +aME +vrD aPF aRs aSV aUN aWB -aYa -aYa -aYa +aWB +aWB +aWB bdc -aYa -aYa +aWB +aWB aYa biX bkK -bmK +bmP aTg bpS brX @@ -150872,89 +150404,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (91,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -150992,17 +150524,17 @@ aRt aSW aUO aWC -aYb -aZV -aZV -bdd -bey -bae -bae +aWC +aWC +aWC +aWC +aWC +aWC +bde biY bkL bmL -bom +bok bpT brY btP @@ -151129,89 +150661,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (92,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -151241,21 +150773,21 @@ alT aFr aIx aJQ -aLl -aME +aLk +aMB aOb aPH -aRu +aRy aSX -aUP -aWD -aYc -aZW -bbC -aYc -bez -bfW -aWD +aUO +aWC +aWC +aWC +aWC +aWC +aWC +aWC +aWC biZ bkM bmM @@ -151386,89 +150918,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (93,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -151505,16 +151037,16 @@ aPI aRv aSW aUO -aWE -aYd -aZX -bbD -bde -bde +aWC +aWC +aWC +aWC +aWC +aWC bfX -bhg -bja -bkM +aWC +biZ +bkL bmN bon bpV @@ -151541,10 +151073,10 @@ car cbV cdJ car -aax -aay -aaz -aaA +chv +cjf +ckA +clV cnC cpa cqs @@ -151552,10 +151084,10 @@ cqr ctq cuR cnC -aay -aaD -aaA -aax +cjf +czs +clV +chv car cFO cbV @@ -151643,89 +151175,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (94,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -151759,21 +151291,21 @@ aFr aMG aOd aPJ -aRw -aSY -aUP -aWF -aYe -aZY -bbE -bdf -bez -bfY -bhh -bjb +aRv +aSW +aUO +aWC +aWC +aWC +aWC +aWC +aWC +aWC +aWC +bde bkN bmO -boo +aTg bpW bsb btS @@ -151900,89 +151432,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (95,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -152014,22 +151546,22 @@ ayR aJT aLn aMG -aOe -aOo +aOn +rPK aRv aSW aUQ -aWG +aWC aYf -aZZ -aZZ -aZZ +aWC +aWC +aWC beA -aWK -bhi -bjc +aWC +aWC +aWC bkO -bmP +xGC aTg bpX aMB @@ -152059,13 +151591,13 @@ chx cjh ckC clX -aaB +cnE cpc cqu cqr cts cuT -aaB +cnE clX czt cAL @@ -152097,7 +151629,7 @@ dof dmi dry dta -aaR +duk dvY dod dmi @@ -152157,89 +151689,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (96,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -152271,8 +151803,8 @@ aIz aJU aLo aMH -aOf aPL +rGq aRv aSW aUR @@ -152281,11 +151813,11 @@ aYg aMB aWH aMB -aWH +etO aWH bhj bjd -bkP +bkO bmQ bop bpY @@ -152414,89 +151946,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (97,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -152515,9 +152047,9 @@ asq atO auX awf -aaq -aaq -aaw +axv +axv +azS awi aCk aDn @@ -152528,8 +152060,8 @@ aBf aJV aLp aMG -aOe -aOo +aOn +rPK aRv aSW aUS @@ -152542,12 +152074,12 @@ beB bfZ bhk bje -bkQ +bkN bmR boq bpZ bsd -aYn +boq bvf aMG bxL @@ -152575,9 +152107,9 @@ cjn clZ cnF car -aaC +cqw car -aaC +cqw car car cxF @@ -152671,89 +152203,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (98,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -152799,7 +152331,7 @@ beC bga bhl bjf -bkP +mUH bmS bor bqa @@ -152928,89 +152460,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (99,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -153042,7 +152574,7 @@ alT aJW aLq aMG -aOe +aOn aPN aRv aSW @@ -153185,89 +152717,89 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (100,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -153442,60 +152974,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (101,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -153699,60 +153231,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (102,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -153823,7 +153355,7 @@ aYl bae bae bae -bae +vHN aWL bhp bji @@ -153956,60 +153488,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (103,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -154075,7 +153607,7 @@ aPR aRB aTc aUV -aWM +bxS aYm baf bbJ @@ -154084,7 +153616,7 @@ baf baf bhq bjj -bkU +bkP bmX bow bqf @@ -154213,60 +153745,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (104,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -154332,13 +153864,13 @@ aPS aRv aSW aUO -aWN -aYn -bag -aYn -aYn -beG -bgb +bxR +bde +bde +bde +bde +aZX +bde bhr bjk bkV @@ -154470,60 +154002,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (105,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -154571,16 +154103,16 @@ asy atW avf awi -aar -aav -aar +axD +ayM +axD awf aCp aDs aEv aFE aHh -aaG +aID aKb aLv aMG @@ -154591,10 +154123,10 @@ aTd aUW aWO aYo -aWO -bbK -bbK -beH +omN +aYo +aYo +aYo bgc bhs bjl @@ -154727,60 +154259,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (106,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -154984,60 +154516,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (107,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -155094,7 +154626,7 @@ aDt aEx aFG aHj -aaH +aIF aKd aLx aMG @@ -155102,16 +154634,16 @@ aOo aOn aRD aTf -aOn -aRC +loH +nQB aYq bai bbM bdl beJ bge -bhu -bdl +aXY +fRK bkY bnb aMG @@ -155241,60 +154773,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (108,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -155357,20 +154889,20 @@ alT aML aMG aMG -aMG -aTg +hnq +yiP aMB aTg -aMG -aWy +wum +yiP aMB aZS -aMG -aWy +wum +yiP aMB aZS -aMG -bnc +klP +aMB aMG bqk bsn @@ -155498,60 +155030,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (109,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -155614,20 +155146,20 @@ aLy alT aad aad +rEo +ohn aRE aTh -aRE -aTh -aRE -aWx +kmj +osD aRE aZR -aRE -aWx +kmj +osD aRE aZR bkZ -aMN +aMM aMG bql bso @@ -155755,60 +155287,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (110,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -155854,8 +155386,8 @@ aad alT alT alT -aaF -aaF +avk +avk alT alT azZ @@ -156012,60 +155544,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (111,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -156269,60 +155801,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (112,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aab aaa @@ -156526,60 +156058,60 @@ aab aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (113,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -156636,7 +156168,7 @@ arB aug alg alg -eCJ +kND aKg alf aMO @@ -156783,60 +156315,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (114,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -156893,7 +156425,7 @@ aAb aAb aAb aAb -gKo +nSA aKh alf aMN @@ -157040,60 +156572,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (115,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -157151,7 +156683,7 @@ aCv aFJ aAb aIH -nNX +kPJ alf aMP aDw @@ -157231,7 +156763,7 @@ cOM dgs cMY djE -dlr +dlq dmE dow dqm @@ -157297,60 +156829,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (116,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -157554,60 +157086,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (117,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -157665,7 +157197,7 @@ aEB aFL aAb aIH -ePi +sPd avm arB arB @@ -157811,60 +157343,60 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (118,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -157917,7 +157449,7 @@ alf aAb aBj aCv -pfC +eoB aEC aFM aAb @@ -158048,7 +157580,7 @@ edL eep eff aad -rqh +qgU aaa ajr aaa @@ -158060,68 +157592,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (119,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -158174,7 +157706,7 @@ alg aAb aBk aCv -gLe +eWr aEC aFN aAb @@ -158305,7 +157837,7 @@ edM eeq dLY aad -nbW +gKn aaa aad aaa @@ -158317,68 +157849,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (120,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -158436,7 +157968,7 @@ aED aFO aHm aII -qAV +oDY aLz aMR aOq @@ -158574,68 +158106,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (121,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -158693,7 +158225,7 @@ aEE aFP aHn aIJ -gVZ +pZB aLz aMS aOr @@ -158738,7 +158270,7 @@ ccq ceg ccq chO -ceg +jiQ ckQ cmr ccq @@ -158831,68 +158363,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (122,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -158945,12 +158477,12 @@ ayX aAb aBn aCx -pgU +lkk aCv aFQ aAb -mpP -gVZ +tYG +pZB aLz aMT aOs @@ -158991,11 +158523,11 @@ bUt bWD bYM caH -ccr +cwq ceh -cfY -chP -cjt +caG +caG +gVM ckR cms cnO @@ -159088,68 +158620,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (123,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -159197,7 +158729,7 @@ asL aue avt aws -aaI +axN ayY aAc aBo @@ -159246,12 +158778,12 @@ bDl bDl bUu bWE -bYO +imI caG -ccs -cei +xok +cxV cfZ -chQ +caG cjt ckR cms @@ -159323,7 +158855,7 @@ dXz dYt dON dOl -rKU +nuw eaX dYu ect @@ -159345,68 +158877,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (124,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -159505,11 +159037,11 @@ bUv bWC bYR caG +fmW +cxV +iNK caG -caG -caG -chR -cjt +tMy ckR cmt cmt @@ -159579,8 +159111,8 @@ dON dON dON dON -xdZ -mbd +pcK +hAf ebc ebQ ecu @@ -159602,75 +159134,75 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (125,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa aaa aaa -rqh -rqh +aaa +qgU aad aad aaa @@ -159721,7 +159253,7 @@ aAb aAb aAb aIL -ePi +sPd aLz aLz aLz @@ -159762,10 +159294,10 @@ bUq bWI bYM caG -cct -cej +fmW +cxV +iNK caG -chS cjt ckR cms @@ -159842,12 +159374,12 @@ dZN dZN dZN dZN -hix +ucF dZN dZN dLY aad -rqh +qgU aad aad aaa @@ -159859,74 +159391,74 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (126,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +aaa +aaa aaa aaa aaa aaa -aaO -aaO aaO aaO abf @@ -159978,7 +159510,7 @@ aEG aFS aHp aIM -tBE +lge aLB aFS aEG @@ -160019,11 +159551,11 @@ bUq bWD bYM caG -ccu -cek -cga -chT -cju +fmW +cxV +iNK +caG +cjt ckR cms cnQ @@ -160093,20 +159625,20 @@ dWJ dLW dYu dZg -fLh -oZY +nOz +vRV dZN -gut -krb -ray -qoc -mPj -nFW +lbN +voA +wmL +vcP +ptB +iem aaa -sfL +nph aaa aaa -sfL +nph aaa aaa aaa @@ -160116,75 +159648,75 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (127,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa -xdp -mLI -mvx -nSS +aaa +aaa +aaa +aaO abe abp abC @@ -160277,12 +159809,12 @@ bWD bYM caG ccv -cel +cxV +sPy caG -chU cjt ckR -xuu +mEP cnR cpv cqQ @@ -160352,12 +159884,12 @@ dTw dTw dZN dZN -sww -sVX -hTX -hTX -fCs -giN +nbi +wZT +kBV +kBV +tOY +rSz dTw aad aad @@ -160373,76 +159905,76 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (128,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +aaa +aaa aaa aaa aaa aaa aaO -aaO -aaO -nQR +vcs abq abD abD @@ -160533,9 +160065,9 @@ bUq bWD bYS caG -caG -caG -caG +pWb +cxV +cmt chV cjt ckT @@ -160591,7 +160123,7 @@ dHl dIA dJZ dKF -dLZ +jYx dLZ dOo dOT @@ -160601,17 +160133,17 @@ dRB dSz dTx dUi -lLY +irh dVN -lLY +irh dXB dYv dTw dZO -fXF -sCQ -tVN -uuP +xFI +ktK +uqp +iIl dTw dTw dTw @@ -160630,74 +160162,74 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (129,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +aaa aaa aaa aaa aaa aaa -rqh aaO aaO abf @@ -160769,7 +160301,7 @@ bjt bli bnk boB -jwo +lpu bnj bnh bvB @@ -160792,7 +160324,7 @@ bYM caG cct cej -caG +cxV chW cjt ckR @@ -160847,8 +160379,8 @@ dFN dHm dIB dKa -dKF -dLZ +uqW +jYx dLZ dOo dOT @@ -160864,7 +160396,7 @@ dUj dXC dYw dZh -rIi +qUn eau edr ebS @@ -160887,75 +160419,75 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (130,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa aaa aaa -rqh -rqh +aaa +qgU aad aad aaa @@ -161048,12 +160580,12 @@ bWD bYM caG ccu -cek -cga -chT -cju +cmt +cmt +ccr +cjt ckR -cmv +cmt cnU cpy cqT @@ -161102,10 +160634,10 @@ drP dEx dFO dHn -dIC -dKb -dKb +dIB dKb +eGi +eGi dNB dOp dOT @@ -161144,68 +160676,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (131,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -161302,11 +160834,11 @@ bQu bQv bUr bWD -bYM +sRE caG -ccv +chP cel -caG +xER chX cjt ckR @@ -161401,68 +160933,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (132,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -161658,68 +161190,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (133,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -161915,68 +161447,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (134,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -162172,68 +161704,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (135,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -162429,68 +161961,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (136,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -162686,68 +162218,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (137,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -162931,7 +162463,7 @@ edT eeC efp egd -egC +efg aaa aad aaa @@ -162943,68 +162475,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (138,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -163188,7 +162720,7 @@ edU eeD efq ege -egC +efg aaa aad aaa @@ -163200,68 +162732,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (139,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -163445,7 +162977,7 @@ edV eeE efr ege -egC +efg aad ajr aaa @@ -163457,68 +162989,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (140,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -163714,68 +163246,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (141,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -163971,68 +163503,68 @@ aaa aaa aaa aaa -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (142,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh aaa aaa aaa @@ -164228,68 +163760,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (143,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -164485,68 +164017,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (144,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -164742,68 +164274,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (145,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -164999,68 +164531,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (146,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -165256,68 +164788,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (147,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -165513,68 +165045,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (148,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -165770,68 +165302,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (149,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -166027,68 +165559,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (150,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -166284,68 +165816,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (151,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -166541,68 +166073,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (152,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -166798,68 +166330,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (153,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -167055,68 +166587,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (154,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -167312,68 +166844,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (155,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -167569,68 +167101,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (156,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -167686,7 +167218,7 @@ aCP avQ aFe aGp -kKn +adY aJg aKF aLP @@ -167826,68 +167358,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (157,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -168083,68 +167615,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (158,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -168340,68 +167872,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (159,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -168597,68 +168129,68 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (160,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -168854,59 +168386,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (161,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -169111,59 +168643,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (162,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -169368,59 +168900,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (163,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -169528,7 +169060,7 @@ bUO bXf bUQ cbe -rjr +odz ceH cgu cij @@ -169625,59 +169157,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (164,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -169882,59 +169414,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (165,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -170139,59 +169671,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (166,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -170243,7 +169775,7 @@ aox apu aqy arb -ioW +sSh aig auA avU @@ -170396,59 +169928,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (167,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -170591,7 +170123,7 @@ cNz dbm dcX dev -aaQ +uXf dhe diz dkp @@ -170653,59 +170185,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (168,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -170910,59 +170442,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (169,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -171010,7 +170542,7 @@ akU alI amE anz -kiJ +jyT apw aqA apy @@ -171167,59 +170699,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (170,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -171307,7 +170839,7 @@ blS baQ boV bra -fiK +uDs bus bvM bwZ @@ -171353,7 +170885,7 @@ cKE bsE cNE cPy -aaN +cRa cSK cUE cQX @@ -171424,59 +170956,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (171,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -171528,7 +171060,7 @@ aiC apy apy apu -oHk +wzu atw auD avW @@ -171681,59 +171213,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (172,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -171938,59 +171470,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (173,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -172195,59 +171727,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (174,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -172452,59 +171984,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (175,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -172590,7 +172122,7 @@ bio bjZ blW aig -lDl +sAr aig aad but @@ -172709,59 +172241,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (176,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -172966,59 +172498,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (177,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -173103,7 +172635,7 @@ bgP biq bjZ blX -jOB +hCj bpa aig aaa @@ -173223,59 +172755,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (178,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -173480,59 +173012,59 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (179,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -173594,7 +173126,7 @@ azG aAI aCb aDf -aEh +avW aFk aGD aHW @@ -173726,70 +173258,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (180,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -173983,70 +173515,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (181,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -174240,70 +173772,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (182,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -174453,7 +173985,7 @@ dkv dma dma dma -iho +sFU dsI dro dvz @@ -174497,70 +174029,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (183,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -174754,70 +174286,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (184,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -174889,7 +174421,7 @@ aaa aaa aad aQR -pnK +lKF aUq aVR aXF @@ -174949,8 +174481,8 @@ cIc cAm cKO cMm -aaM -vEq +cNO +pxR cRi cSV cUN @@ -175011,70 +174543,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (185,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -175268,70 +174800,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (186,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -175525,70 +175057,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (187,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -175782,70 +175314,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (188,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176039,70 +175571,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (189,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176296,70 +175828,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (190,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176389,19 +175921,19 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176553,70 +176085,70 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (191,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176646,19 +176178,19 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176810,70 +176342,70 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (192,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -176903,19 +176435,19 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177067,70 +176599,70 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (193,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177157,22 +176689,22 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177324,70 +176856,70 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (194,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177414,22 +176946,22 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177581,70 +177113,70 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (195,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177671,29 +177203,29 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177838,84 +177370,84 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (196,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -177928,29 +177460,29 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178095,84 +177627,84 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (197,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178185,29 +177717,29 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178352,119 +177884,119 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (198,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178544,7 +178076,7 @@ cDD cFx cGU cAw -cJl +cJk cLa cMx cIi @@ -178609,125 +178141,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (199,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178866,125 +178398,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (200,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -178992,7 +178524,7 @@ aaa aaa aaa aaa -rqh +qgU aFm aIc aFm @@ -179123,125 +178655,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (201,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -179249,9 +178781,9 @@ aaa aaa aaa aaa -rqh +qgU aFm -kqa +mAL bbt aFm aMc @@ -179380,125 +178912,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (202,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -179506,10 +179038,10 @@ aaa aaa aaa aaa -rqh +qgU aFm -hsy -vAW +lsa +iRs aFm aKV aNy @@ -179637,125 +179169,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (203,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -179765,10 +179297,10 @@ ajr ajr aad aFm -usi -gBd -wIf -gBd +pmK +vRf +oNF +vRf aNz aPh aQZ @@ -179894,125 +179426,125 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (204,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -180022,7 +179554,7 @@ ajr aad aad aFn -mPH +gqA aJA aJA aMe @@ -180136,140 +179668,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (205,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -180393,140 +179925,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (206,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -180650,140 +180182,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (207,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -180828,7 +180360,7 @@ bFP bHI bJC bLs -aaK +jvU bNp bNp bTi @@ -180907,140 +180439,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (208,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -181075,7 +180607,7 @@ bpp bru btt buQ -aaJ +bwj bhd byO bAs @@ -181164,140 +180696,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (209,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -181421,140 +180953,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (210,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -181678,140 +181210,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (211,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -181861,7 +181393,7 @@ bPA bRw bTk bVr -aaL +bXR bZY cbL bLs @@ -181935,140 +181467,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (212,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -182192,140 +181724,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (213,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -182449,140 +181981,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (214,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -182620,7 +182152,7 @@ buU biQ aad ajr -ajr +jdx aad ajr ajr @@ -182706,140 +182238,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (215,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh aaa aaa aaa @@ -182963,140 +182495,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (216,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -183188,12 +182720,12 @@ aad aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -183220,140 +182752,140 @@ aaa aaa aaa aaa -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (217,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh agO -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -183445,12 +182977,12 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -183477,140 +183009,140 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (218,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -183702,12 +183234,12 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -183734,140 +183266,140 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (219,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -183959,12 +183491,12 @@ aad aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aad @@ -183991,140 +183523,140 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (220,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184216,12 +183748,12 @@ aad ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -184248,144 +183780,144 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (221,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184473,12 +184005,12 @@ ajr ajr aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -184505,144 +184037,144 @@ aad aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (222,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184681,23 +184213,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184730,12 +184262,12 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa ajr @@ -184762,144 +184294,144 @@ ajr aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (223,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184938,23 +184470,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -184987,12 +184519,12 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185019,144 +184551,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (224,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185195,23 +184727,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185244,12 +184776,12 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185276,144 +184808,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (225,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185452,23 +184984,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185501,12 +185033,12 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185533,144 +185065,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (226,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185709,23 +185241,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185758,12 +185290,12 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185790,144 +185322,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (227,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -185966,23 +185498,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186015,12 +185547,12 @@ aaa aaa aab aaa -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186047,144 +185579,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (228,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186223,23 +185755,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186270,15 +185802,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186304,144 +185836,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (229,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186480,23 +186012,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aab aaa aaa @@ -186527,15 +186059,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186561,144 +186093,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (230,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186737,23 +186269,23 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186784,15 +186316,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186818,144 +186350,144 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (231,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -186992,28 +186524,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187041,15 +186573,15 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187075,152 +186607,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (232,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT aaa aaa aaa @@ -187249,28 +186781,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187295,21 +186827,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187332,152 +186864,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (233,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187506,28 +187038,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187552,21 +187084,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187589,152 +187121,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (234,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187763,28 +187295,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187809,21 +187341,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -187846,152 +187378,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (235,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188020,28 +187552,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188066,21 +187598,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188103,152 +187635,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (236,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188277,28 +187809,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188323,21 +187855,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188360,152 +187892,152 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (237,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188534,28 +188066,28 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188580,21 +188112,21 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh aaa aaa aaa @@ -188617,4686 +188149,4686 @@ aaa aaa aaa aaa -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (238,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (239,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -qYM -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +tNT +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (240,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (241,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (242,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (243,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (244,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (245,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (246,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (247,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (248,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (249,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (250,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (251,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (252,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (253,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (254,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} (255,1,1) = {" -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp -oZp +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh +hZh "} diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 446fe3e519..b205e7c324 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -39,10 +39,6 @@ /obj/structure/table, /obj/item/paper_bin, /obj/item/pen, -/obj/item/mmi/posibrain{ - pixel_x = 5; - pixel_y = 8 - }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "aae" = ( @@ -57,7 +53,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" @@ -165,6 +160,10 @@ /obj/structure/cable{ icon_state = "0-8" }, +/mob/living/simple_animal/bot/cleanbot{ + auto_patrol = 1; + name = "Sir Cleansworth" + }, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai) "aau" = ( @@ -263,17 +262,6 @@ /area/ai_monitored/turret_protected/ai) "aaE" = ( /obj/structure/chair, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aaF" = ( @@ -287,7 +275,6 @@ dir = 5 }, /obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai) "aaG" = ( @@ -593,9 +580,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "abd" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -636,10 +620,6 @@ /turf/open/floor/plasteel/dark, /area/lawoffice) "abg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -733,6 +713,9 @@ name = "Station Intercom (Command)"; pixel_y = -28 }, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "abr" = ( @@ -873,7 +856,6 @@ pixel_x = 24 }, /obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai) "abD" = ( @@ -953,9 +935,6 @@ /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai) "abM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -1132,7 +1111,6 @@ /turf/open/floor/plasteel, /area/security/warden) "acg" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/engine, @@ -1352,7 +1330,6 @@ /turf/open/space, /area/space/nearstation) "acz" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, @@ -1363,7 +1340,9 @@ /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "acB" = ( -/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "acC" = ( @@ -1642,7 +1621,6 @@ /obj/machinery/light_switch{ pixel_y = -24 }, -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, @@ -1661,7 +1639,7 @@ dir = 4 }, /turf/open/floor/engine, -/area/ai_monitored/turret_protected/aisat_interior) +/area/space) "acY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1828,26 +1806,18 @@ id = "prisonblast"; name = "Prison Blast Door" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/security/prison) "adm" = ( /obj/structure/chair/office{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "adn" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -1890,7 +1860,7 @@ /turf/open/floor/circuit/green{ luminosity = 2 }, -/area/ai_monitored/turret_protected/ai) +/area/space) "adr" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -1912,7 +1882,6 @@ id = "xeno_blastdoor"; name = "Xenobiology Containment Blast Door" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "adt" = ( @@ -1943,10 +1912,6 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "adv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -1999,6 +1964,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "adA" = ( @@ -2086,10 +2054,10 @@ pixel_y = 26 }, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "4-8" }, /turf/open/floor/engine, /area/ai_monitored/turret_protected/aisat/foyer) @@ -2186,6 +2154,9 @@ /obj/structure/cable{ icon_state = "2-8" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "adO" = ( @@ -2212,9 +2183,12 @@ /turf/open/floor/engine, /area/ai_monitored/turret_protected/aisat/foyer) "adT" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/rust, -/area/ai_monitored/turret_protected/aisat_interior) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/science/xenobiology) "adU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -2236,7 +2210,6 @@ pixel_y = 24; req_one_access_txt = "2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/security/warden) "adW" = ( @@ -2348,7 +2321,6 @@ pixel_y = -24; req_one_access_txt = "2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/security/prison) "aed" = ( @@ -2395,16 +2367,6 @@ /turf/open/floor/plating, /area/security/warden) "aej" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -2441,7 +2403,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/cryo) "aeo" = ( @@ -2687,7 +2648,6 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/cryo) "aeQ" = ( @@ -2800,16 +2760,6 @@ /turf/open/floor/plating, /area/security/warden) "aeY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -3012,16 +2962,6 @@ /turf/closed/wall, /area/maintenance/port/aft) "afn" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -3510,13 +3450,16 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "afX" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/area/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/heads/cmo) "afY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -3626,6 +3569,9 @@ name = "xenobiology camera"; network = list("ss13","rd","xeno") }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/circuit/telecomms, /area/science/xenobiology) "agg" = ( @@ -3650,6 +3596,9 @@ external_pressure_bound = 120; name = "server vent" }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/circuit/telecomms, /area/science/xenobiology) "agi" = ( @@ -3666,6 +3615,9 @@ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/science/xenobiology) "agj" = ( @@ -3943,10 +3895,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "agF" = ( -/obj/structure/grille, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/medbay/central) "agG" = ( /obj/docking_port/stationary{ dir = 2; @@ -4581,7 +4534,6 @@ pixel_x = -26 }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ahI" = ( @@ -4662,16 +4614,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -4680,16 +4622,6 @@ "ahQ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -4803,7 +4735,6 @@ /turf/open/floor/plating, /area/security/brig) "ahY" = ( -/obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -4816,37 +4747,21 @@ /turf/open/floor/plasteel, /area/security/main) "ahZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /turf/open/floor/plasteel, /area/security/main) "aia" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plasteel, /area/security/main) "aib" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/main) "aic" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/bot, /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -4939,16 +4854,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -4958,9 +4863,7 @@ /turf/open/floor/plasteel, /area/security/brig) "aij" = ( -/obj/structure/flora/grass/jungle, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/machinery/light{ dir = 1 }, @@ -5127,10 +5030,6 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "aix" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/security/main) @@ -5159,16 +5058,6 @@ /area/security/main) "aiz" = ( /obj/machinery/computer/secure_data, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/main) "aiA" = ( @@ -5322,16 +5211,6 @@ /obj/structure/chair{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/landmark/start/security_officer, /turf/open/floor/plasteel, /area/security/main) @@ -5399,16 +5278,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/brig) "aiR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aiS" = ( @@ -5436,28 +5305,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/brig) -"aiU" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/fore) -"aiV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) -"aiW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) "aiX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -5471,12 +5318,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "aiY" = ( /obj/structure/chair, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -5541,12 +5382,6 @@ /area/ai_monitored/turret_protected/aisat/foyer) "ajc" = ( /obj/structure/chair, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -5582,22 +5417,11 @@ /turf/open/floor/plasteel, /area/security/main) "ajg" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) -"ajh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) "aji" = ( /obj/structure/chair{ dir = 8 @@ -5607,13 +5431,13 @@ }, /area/maintenance/port/fore) "ajj" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/box, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/maintenance/fore) +/turf/open/floor/plasteel, +/area/hallway/primary/fore) "ajk" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -5690,16 +5514,6 @@ color = "#c45c57"; dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/landmark/start/head_of_security, /turf/open/floor/plasteel, /area/security/main) @@ -5746,17 +5560,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/science/xenobiology) -"ajs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) "ajt" = ( /turf/closed/wall, /area/crew_quarters/kitchen) @@ -5915,16 +5718,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "ajJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -5942,15 +5735,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"ajL" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Biohazard"; - name = "Emergency Research Blast Door" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/plasteel/dark, -/area/science/research) "ajM" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard, @@ -6061,7 +5845,6 @@ /area/hallway/primary/fore) "ajX" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ajY" = ( @@ -6114,10 +5897,10 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "akd" = ( -/obj/structure/flora/tree/jungle/small, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass, /area/medical/genetics) "ake" = ( @@ -6323,7 +6106,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/surgery) "akz" = ( @@ -6379,7 +6161,6 @@ "akF" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/surgery) "akG" = ( @@ -6405,12 +6186,6 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "akI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -6613,6 +6388,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, +/obj/machinery/shieldwallgen/xenobiologyaccess, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -6766,7 +6542,6 @@ pixel_x = 28 }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "all" = ( @@ -6961,9 +6736,6 @@ "alw" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) "alx" = ( @@ -7031,29 +6803,12 @@ /obj/machinery/status_display/evac{ pixel_y = 32 }, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) -"alA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) "alB" = ( /turf/closed/wall/r_wall, /area/science/xenobiology) "alC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, @@ -7113,13 +6868,6 @@ /obj/vehicle/ridden/secway, /turf/open/floor/plasteel/showroomfloor, /area/security/brig) -"alH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/fore) "alI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ @@ -7281,8 +7029,22 @@ }, /area/maintenance/fore) "alV" = ( -/turf/closed/wall/r_wall/rust, -/area/ai_monitored/turret_protected/aisat_interior) +/obj/structure/closet/crate/wooden/toy, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/newscaster{ + pixel_y = 30 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/theatre) "alW" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -8493,31 +8255,12 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "anX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1, /turf/open/floor/plasteel, /area/hallway/primary/fore) "anY" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -9079,7 +8822,6 @@ /turf/open/floor/wood, /area/lawoffice) "aoT" = ( -/obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/box/corners{ dir = 4 @@ -9537,7 +9279,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) "apI" = ( @@ -9713,28 +9454,22 @@ /turf/closed/wall/rust, /area/maintenance/central) "apY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/table/wood, +/obj/structure/mirror{ + pixel_x = -26 }, +/obj/item/reagent_containers/food/snacks/pie/cream, +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/lobsterhat, +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8; - icon_state = "intact" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) +/turf/open/floor/plasteel/dark, +/area/crew_quarters/theatre) "apZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -10276,18 +10011,18 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) "aqQ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/item/bikehorn/rubberducky, +/obj/structure/sign/poster/contraband/clown{ + pixel_x = -30 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/bridge) +/turf/open/floor/plasteel/dark, +/area/crew_quarters/theatre) "aqR" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -10726,7 +10461,6 @@ /obj/structure/sign/warning/electricshock{ pixel_x = -32 }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/engine, /area/science/xenobiology) @@ -10773,10 +10507,16 @@ /turf/open/floor/plasteel/dark, /area/bridge) "arD" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/sign/departments/science{ + pixel_x = 32 + }, /turf/open/floor/plasteel, -/area/crew_quarters/heads/hop) +/area/hallway/primary/starboard) "arE" = ( /obj/structure/table, /obj/item/clipboard, @@ -11104,28 +10844,17 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "arW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/bridge) "arX" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, -/area/bridge) +/area/hallway/primary/starboard) "arY" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -11191,16 +10920,6 @@ }, /area/maintenance/port/fore) "asd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -11226,7 +10945,7 @@ icon_state = "4-8" }, /turf/open/floor/engine, -/area/ai_monitored/turret_protected/aisat/foyer) +/area/space) "asg" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-22" @@ -11404,7 +11123,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) "asw" = ( @@ -11977,6 +11695,7 @@ dir = 4; name = "chapel camera" }, +/obj/structure/chair/stool, /turf/open/floor/plasteel/chapel{ dir = 8 }, @@ -12075,16 +11794,9 @@ /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "atF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/plaque{ icon_state = "L14" }, @@ -12344,18 +12056,7 @@ }, /area/maintenance/starboard/fore) "aua" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1, -/obj/effect/turf_decal/box, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aub" = ( @@ -12538,16 +12239,6 @@ /turf/open/floor/plasteel/dark, /area/teleporter) "auo" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -12634,9 +12325,20 @@ /turf/closed/wall/r_wall, /area/bridge) "auz" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/rust, -/area/maintenance/starboard) +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "auA" = ( /obj/structure/cable{ icon_state = "2-8" @@ -12738,12 +12440,12 @@ }, /area/maintenance/solars/starboard/fore) "auK" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 8 + dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/security/courtroom) +/area/hallway/primary/port) "auL" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box/corners{ @@ -12757,16 +12459,6 @@ /turf/open/floor/plasteel/dark, /area/science/mixing) "auM" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 8 }, @@ -12910,11 +12602,21 @@ /obj/item/folder/blue, /obj/item/melee/chainofcommand, /obj/item/toy/figure/captain, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/card/id/captains_spare, /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "ave" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "avf" = ( @@ -12982,7 +12684,6 @@ "avj" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, -/obj/item/card/id/captains_spare, /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "avk" = ( @@ -13023,10 +12724,6 @@ /turf/open/floor/plasteel, /area/security/courtroom) "avo" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -13055,9 +12752,6 @@ /turf/closed/wall, /area/maintenance/aft) "avr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/box/corners, /turf/open/floor/plasteel, /area/security/courtroom) @@ -13411,12 +13105,6 @@ /turf/open/floor/plasteel/dark, /area/medical/virology) "avQ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -13426,12 +13114,6 @@ /turf/open/floor/plasteel, /area/bridge) "avR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -13490,35 +13172,16 @@ /obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel, /area/security/courtroom) "avX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -13677,7 +13340,6 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) "awl" = ( @@ -13734,10 +13396,6 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -13764,16 +13422,6 @@ /turf/open/floor/plating, /area/storage/primary) "awr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-8" }, @@ -13784,10 +13432,6 @@ pixel_x = -32; pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -13915,9 +13559,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -14015,9 +13656,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -14037,20 +13675,6 @@ pixel_x = 32; pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine{ - initial_gas_mix = "n2=100;TEMP=80"; - name = "mainframe floor" - }, -/area/tcommsat/server) -"awM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -14227,6 +13851,7 @@ /obj/item/lighter, /obj/item/clothing/mask/cigarette/cigar/cohiba, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/suit_storage_unit/ce, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "axi" = ( @@ -14692,7 +14317,6 @@ name = "Containment Chamber Blast Door" }, /obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/engine, /area/science/xenobiology) @@ -14832,7 +14456,6 @@ /area/medical/morgue) "ayi" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/security/brig) "ayj" = ( @@ -14844,16 +14467,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "ayk" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -14917,7 +14530,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/bridge) "ayr" = ( @@ -15156,7 +14768,6 @@ /obj/structure/sign/warning/biohazard{ pixel_x = 32 }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/engine, /area/science/xenobiology) @@ -15217,7 +14828,6 @@ dir = 1; pixel_y = 32 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "ayP" = ( @@ -15447,7 +15057,6 @@ /obj/structure/sign/departments/evac{ pixel_y = 32 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "azc" = ( @@ -15639,9 +15248,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "azp" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /obj/effect/turf_decal/tile/neutral, /obj/machinery/airalarm{ dir = 4; @@ -15842,11 +15448,10 @@ }, /area/maintenance/starboard) "azE" = ( -/obj/effect/turf_decal/loading_area, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 6 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/engine/engineering) "azF" = ( /obj/structure/flora/junglebush/c, @@ -16179,9 +15784,6 @@ /turf/open/floor/plating, /area/medical/chemistry) "aAd" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, /obj/machinery/atmospherics/components/binary/pump{ dir = 1; name = "External Gas to Loop" @@ -16190,7 +15792,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/engine/engineering) "aAe" = ( /obj/machinery/door/firedoor, @@ -16211,10 +15813,6 @@ dir = 4; pixel_x = -22 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -16227,7 +15825,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -16249,7 +15846,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -16259,10 +15855,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -16278,10 +15870,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -16407,7 +15995,6 @@ /turf/open/floor/grass, /area/chapel/main) "aAz" = ( -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "1-2" }, @@ -16430,9 +16017,11 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/robotics/lab) "aAD" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/floor/grass, -/area/chapel/main) +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "aAE" = ( /obj/machinery/light/small{ dir = 8 @@ -16553,16 +16142,6 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "aAO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -16638,7 +16217,6 @@ /obj/machinery/door/airlock/public/glass{ name = "Docking Hallway" }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "aAV" = ( @@ -17012,7 +16590,6 @@ /area/engine/engineering) "aBw" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "aBx" = ( @@ -17022,10 +16599,6 @@ /turf/open/floor/engine, /area/engine/engineering) "aBy" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/fernybush, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 5 @@ -17160,20 +16733,9 @@ /obj/structure/sign/departments/security{ pixel_x = -32 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "aBN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, @@ -17187,7 +16749,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aBP" = ( @@ -17324,10 +16885,6 @@ /obj/item/radio/intercom{ pixel_x = -28 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -17335,7 +16892,6 @@ /area/tcommsat/server) "aCe" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -17408,10 +16964,6 @@ name = "telecomms camera"; network = list("ss13","tcomms") }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -17490,7 +17042,6 @@ /obj/machinery/door/airlock/public/glass{ name = "Security Hallway" }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "aCr" = ( @@ -17563,16 +17114,6 @@ /turf/open/floor/plasteel/dark, /area/engine/break_room) "aCy" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -17827,10 +17368,7 @@ /area/medical/cryo) "aCN" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/extinguisher_cabinet{ pixel_x = 24 @@ -18126,7 +17664,6 @@ "aDh" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/grass, /area/chapel/main) @@ -18191,7 +17728,6 @@ /turf/open/floor/plating, /area/engine/atmos) "aDs" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/engine, /area/security/nuke_storage) @@ -18305,6 +17841,7 @@ /obj/machinery/atmospherics/miner/nitrogen{ max_ext_kpa = 2500 }, +/obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/engine/n2{ initial_gas_mix = "n2=1000;TEMP=293.15" }, @@ -18321,6 +17858,7 @@ /obj/machinery/atmospherics/miner/oxygen{ max_ext_kpa = 2500 }, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/engine/o2{ initial_gas_mix = "o2=1000;TEMP=293.15" }, @@ -18799,18 +18337,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/turf/open/floor/plasteel/dark/corner{ + dir = 8 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) +/area/hallway/primary/port) "aEv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -18951,7 +18484,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "aEG" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -18981,7 +18513,6 @@ /turf/open/floor/engine, /area/security/nuke_storage) "aEI" = ( -/obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19002,7 +18533,7 @@ "aEK" = ( /obj/structure/sign/poster/contraband/random, /turf/closed/wall/rust, -/area/hallway/secondary/entry) +/area/security/vacantoffice) "aEL" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -19343,6 +18874,7 @@ /obj/machinery/atmospherics/miner/carbon_dioxide{ max_ext_kpa = 2500 }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/engine/co2{ initial_gas_mix = "co2=1000;TEMP=293.15" }, @@ -19351,6 +18883,7 @@ /obj/machinery/atmospherics/miner/toxins{ max_ext_kpa = 2500 }, +/obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/engine/plasma{ initial_gas_mix = "plasma=1000;TEMP=293.15" }, @@ -19359,6 +18892,7 @@ /obj/machinery/atmospherics/miner/n2o{ max_ext_kpa = 2500 }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/engine/n2o{ initial_gas_mix = "n2o=1000;TEMP=293.15" }, @@ -19682,15 +19216,19 @@ }, /area/maintenance/port/fore) "aFY" = ( +/obj/machinery/air_sensor{ + pixel_x = -32; + pixel_y = -32 + }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, /obj/machinery/igniter{ id = "Incinerator" }, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) "aFZ" = ( @@ -19719,16 +19257,17 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/heads/hor) "aGb" = ( -/obj/machinery/power/turbine{ - luminosity = 2 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) -"aGc" = ( /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"aGc" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Captain's Desk"; + req_access_txt = "20" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) "aGd" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -20096,7 +19635,6 @@ /area/medical/genetics/cloning) "aGG" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/bridge) "aGH" = ( @@ -20419,7 +19957,6 @@ /area/security/brig) "aHq" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aHr" = ( @@ -20866,7 +20403,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/bridge) "aHV" = ( @@ -21126,9 +20662,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16" - }, /obj/effect/turf_decal/box/corners{ dir = 1 }, @@ -21265,9 +20798,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, /obj/machinery/button/door{ id = "transittube_ai"; name = "Transit Tube Lockdown Toggle"; @@ -21525,16 +21055,6 @@ /turf/open/floor/plating, /area/maintenance/aft) "aIY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ dir = 8 @@ -21544,6 +21064,9 @@ pixel_x = -26 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "aIZ" = ( @@ -21725,7 +21248,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/security/brig) "aJs" = ( @@ -21752,7 +21274,6 @@ /area/engine/atmos) "aJu" = ( /obj/machinery/computer/med_data, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -21765,20 +21286,11 @@ /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aJv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/showroomfloor, -/area/medical/medbay/central) +/obj/structure/bed, +/obj/item/bedsheet/black, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/locker) "aJw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, @@ -22133,9 +21645,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush" - }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -22662,16 +22171,6 @@ }, /area/maintenance/port) "aKN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 4 @@ -22961,9 +22460,6 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, /turf/open/floor/plasteel, /area/medical/medbay/central) "aLk" = ( @@ -22985,13 +22481,6 @@ /obj/structure/chair{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aLn" = ( @@ -23013,16 +22502,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "aLo" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -23393,11 +22872,10 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/mixing) "aMa" = ( -/obj/effect/turf_decal/loading_area, /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/engine/engineering) "aMb" = ( /obj/effect/turf_decal/tile/neutral, @@ -23619,7 +23097,6 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple, /obj/machinery/power/apc{ areastring = "/area/science/mixing/chamber"; dir = 4; @@ -23818,9 +23295,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, /turf/open/floor/plasteel, /area/medical/medbay/central) "aME" = ( @@ -24177,21 +23651,10 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "aNi" = ( -/obj/machinery/power/compressor{ - comp_id = "incineratorturbine"; - dir = 1; +/obj/machinery/power/turbine{ luminosity = 2 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/structure/cable, -/obj/machinery/camera{ - c_tag = "Turbine Chamber"; - dir = 4; - name = "turbine camera"; - network = list("turbine") - }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) "aNj" = ( @@ -24292,7 +23755,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aNr" = ( @@ -24692,12 +24154,7 @@ }, /turf/open/floor/plasteel/dark, /area/medical/chemistry) -"aOa" = ( -/obj/structure/flora/junglebush/b, -/turf/open/floor/grass, -/area/medical/genetics) "aOb" = ( -/obj/structure/flora/junglebush/large, /turf/open/floor/grass, /area/medical/genetics) "aOc" = ( @@ -24754,10 +24211,6 @@ /area/maintenance/port/fore) "aOh" = ( /obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 }, @@ -24819,10 +24272,6 @@ /area/medical/genetics) "aOn" = ( /obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/components/binary/valve{ dir = 8 }, @@ -24830,14 +24279,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/mixing/chamber) "aOo" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 }, @@ -25263,22 +24704,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/cmo) -"aOS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aOT" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -25297,16 +24722,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "aOU" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1, /obj/effect/turf_decal/box, /obj/structure/disposalpipe/sorting/mail{ @@ -25350,16 +24765,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/heads/cmo) "aOY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail{ dir = 4; name = "bar sorting disposal pipe"; @@ -25487,19 +24892,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/research) "aPk" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -25526,7 +24918,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 9 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/mixing/chamber) "aPn" = ( @@ -25636,16 +25027,6 @@ /turf/open/floor/plasteel/dark, /area/medical/genetics) "aPv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -25675,18 +25056,10 @@ /turf/open/floor/plating, /area/medical/storage) "aPz" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/box, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -25789,16 +25162,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/mixing) "aPH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -25880,7 +25243,7 @@ pixel_y = 4 }, /obj/item/lighter, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/plasteel/dark, /area/maintenance/port) "aPO" = ( @@ -25995,13 +25358,9 @@ /area/medical/storage) "aPV" = ( /obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue, /obj/item/paper_bin{ pixel_x = -4; @@ -26212,23 +25571,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) -"aQm" = ( -/obj/structure/closet/crate/wooden/toy, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/newscaster{ - pixel_y = 30 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) "aQn" = ( /obj/structure/closet/secure_closet/medical3, /obj/item/storage/belt/medical, @@ -26365,10 +25707,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) "aQy" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) "aQz" = ( @@ -26626,9 +25964,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment{ @@ -26639,16 +25974,14 @@ }, /area/maintenance/central) "aRc" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/door/airlock/maintenance{ + name = "backstage maintenance"; + req_access_txt = "46" }, -/obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, +/turf/open/floor/plasteel/dark, /area/maintenance/central) "aRd" = ( /obj/machinery/computer/med_data{ @@ -26697,16 +26030,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/storage) "aRh" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -26723,6 +26046,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -27096,16 +26422,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/checkpoint/science/research) "aRB" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -27148,16 +26464,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/storage) "aRE" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-8" }, @@ -27417,7 +26723,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aRZ" = ( @@ -27626,7 +26931,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) "aSm" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -27638,23 +26942,6 @@ }, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai_upload) -"aSn" = ( -/obj/structure/table/wood, -/obj/structure/mirror{ - pixel_x = -26 - }, -/obj/item/reagent_containers/food/snacks/pie/cream, -/obj/item/clothing/under/costume/lobster, -/obj/item/clothing/head/lobsterhat, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) "aSo" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -27808,25 +27095,21 @@ /turf/open/floor/plasteel/dark, /area/medical/chemistry) "aSx" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/chair, +/obj/machinery/light{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/clipboard, -/obj/item/storage/firstaid/regular, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aSy" = ( /obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture{ pixel_x = 4 }, +/obj/item/storage/firstaid/regular, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "aSz" = ( @@ -27907,10 +27190,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/lab) "aSE" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/showroomfloor, /area/medical/medbay/central) @@ -28095,16 +27374,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/science/mixing) "aST" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -28143,11 +27412,12 @@ }, /area/maintenance/starboard) "aSW" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/item/crowbar/red, -/obj/item/healthanalyzer, -/turf/open/floor/plasteel/dark, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmoprivacy"; + name = "Office Privacy Shutters" + }, +/turf/open/floor/plating, /area/medical/medbay/central) "aSX" = ( /obj/machinery/status_display/evac, @@ -28264,7 +27534,6 @@ /turf/open/floor/grass, /area/medical/virology) "aTi" = ( -/obj/structure/flora/junglebush/large, /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, /area/medical/virology) @@ -28722,9 +27991,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, /obj/effect/turf_decal/tile/purple, /obj/structure/disposalpipe/segment{ dir = 4 @@ -28901,7 +28167,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) "aUc" = ( -/obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/tile/purple{ dir = 1 }, @@ -29327,9 +28592,6 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18" - }, /turf/open/floor/plasteel/showroomfloor, /area/medical/storage) "aUG" = ( @@ -29708,7 +28970,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aVc" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -29748,9 +29009,6 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18" - }, /obj/machinery/light_switch{ pixel_x = -24; pixel_y = -6 @@ -29869,16 +29127,12 @@ dir = 1 }, /obj/effect/turf_decal/tile/purple, -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, /area/science/storage) "aVm" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -29953,9 +29207,7 @@ /area/crew_quarters/kitchen) "aVr" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -30139,7 +29391,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "1-8" }, @@ -30151,7 +29402,6 @@ pixel_x = -6; pixel_y = 8 }, -/obj/item/restraints/handcuffs, /obj/item/pen, /turf/open/floor/plasteel/dark, /area/medical/virology) @@ -30223,7 +29473,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/closed/wall/rust, +/turf/closed/wall, /area/janitor) "aVN" = ( /obj/structure/chair{ @@ -30288,6 +29538,14 @@ /obj/machinery/light/small{ dir = 8 }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the test chamber."; + dir = 4; + layer = 4; + name = "Test Chamber Telescreen"; + network = list("toxins"); + pixel_x = -32 + }, /turf/open/floor/plasteel/dark, /area/science/mixing) "aVT" = ( @@ -30646,10 +29904,7 @@ /area/security/checkpoint/medical) "aWs" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 8 }, @@ -30663,10 +29918,6 @@ /turf/open/floor/grass, /area/hallway/secondary/exit/departure_lounge) "aWt" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, @@ -30890,22 +30141,18 @@ "aWQ" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/quartermaster/storage) "aWR" = ( /turf/closed/wall, /area/science/xenobiology) "aWS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/newscaster{ + pixel_x = 30 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) +/turf/open/floor/wood, +/area/crew_quarters/locker) "aWT" = ( /obj/structure/closet/secure_closet/chemical, /obj/structure/window/reinforced{ @@ -31058,6 +30305,7 @@ /obj/item/radio/intercom{ pixel_y = 22 }, +/obj/item/mmi/posibrain, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "aXh" = ( @@ -31067,7 +30315,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/quartermaster/storage) "aXi" = ( @@ -31119,6 +30366,8 @@ pixel_y = 4 }, /obj/item/stock_parts/cell/high, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, /turf/open/floor/plasteel/dark, /area/science/lab) "aXo" = ( @@ -31223,19 +30472,12 @@ /turf/open/floor/plasteel/dark, /area/maintenance/central) "aXw" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/folder, -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote, /obj/machinery/light{ - dir = 4 + dir = 1 }, /turf/open/floor/plasteel/dark, /area/science/research) @@ -31300,7 +30542,6 @@ /turf/open/floor/mech_bay_recharge_floor, /area/science/robotics/mechbay) "aXD" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -31322,17 +30563,18 @@ /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai_upload) "aXE" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Cabin_4Privacy"; + name = "Cabin 4 Privacy Shutter" }, -/turf/open/floor/plasteel/dark, -/area/science/research) +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/locker) "aXF" = ( /obj/effect/turf_decal/bot, -/obj/machinery/computer/nanite_chamber_control, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -31348,6 +30590,8 @@ name = "science camera"; network = list("ss13","rd") }, +/obj/structure/table/reinforced, +/obj/item/storage/bag/money, /turf/open/floor/plasteel/dark, /area/science/research) "aXG" = ( @@ -31425,11 +30669,6 @@ /area/tcommsat/server) "aXN" = ( /obj/machinery/igniter/incinerator_toxmix, -/mob/living/simple_animal/chicken{ - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0); - desc = "A timeless classic."; - name = "Kentucky" - }, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) "aXO" = ( @@ -31528,13 +30767,9 @@ /area/maintenance/starboard/fore) "aXX" = ( /obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/box/red, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -31883,7 +31118,6 @@ id = "emmd"; name = "Emergency Medical Lockdown Shutters" }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) @@ -32010,20 +31244,9 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/chemistry) "aYM" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/port) "aYN" = ( -/obj/machinery/nanite_program_hub, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -32035,6 +31258,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/table/reinforced, /turf/open/floor/plasteel/dark, /area/science/research) "aYO" = ( @@ -32061,14 +31285,16 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/bar) "aYR" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Cabin_3Privacy"; + name = "Cabin 3 Privacy Shutter" }, -/turf/open/floor/plasteel/dark, -/area/science/research) +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/locker) "aYS" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -32083,7 +31309,6 @@ /turf/open/floor/plasteel/dark, /area/science/research) "aYT" = ( -/obj/machinery/nanite_programmer, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -32095,6 +31320,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/science/research) "aYV" = ( @@ -32134,10 +31362,20 @@ /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai_upload) "aYZ" = ( -/obj/effect/turf_decal/box, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine, -/area/ai_monitored/turret_protected/ai_upload) +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/airless{ + initial_gas_mix = "o2=14;n2=23;TEMP=300" + }, +/area/maintenance/port/aft) "aZa" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -32201,24 +31439,31 @@ /turf/open/floor/plasteel/dark, /area/science/lab) "aZf" = ( -/obj/machinery/door/airlock/maintenance{ - name = "backstage maintenance"; - req_access_txt = "46" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/maintenance/central) +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/theatre) "aZg" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/lab) +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aZh" = ( /obj/machinery/porta_turret/ai, /obj/machinery/light/small{ @@ -32235,25 +31480,10 @@ /turf/closed/wall, /area/science/lab) "aZj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/clipboard, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -6 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 6 - }, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/turf/open/floor/plasteel/dark, -/area/science/lab) +/obj/effect/turf_decal/bot, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "aZk" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -32265,9 +31495,6 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/stack/sheet/glass/fifty, /obj/item/clothing/glasses/welding, -/obj/item/radio/intercom{ - pixel_x = 28 - }, /turf/open/floor/plasteel/dark, /area/science/lab) "aZl" = ( @@ -32646,7 +31873,6 @@ dir = 8 }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "aZP" = ( @@ -32998,7 +32224,6 @@ /obj/structure/sign/warning/vacuum{ pixel_x = 32 }, -/obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) "bar" = ( @@ -33114,9 +32339,6 @@ /turf/open/floor/plasteel/dark, /area/medical/surgery) "baz" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -33343,16 +32565,6 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/server) "baQ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -33719,7 +32931,6 @@ /area/science/mixing) "bbt" = ( /obj/machinery/air_sensor/atmos/toxins_mixing_tank, -/obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) "bbv" = ( @@ -33759,16 +32970,6 @@ /turf/closed/wall/r_wall, /area/science/mixing/chamber) "bbz" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, @@ -33849,8 +33050,6 @@ /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai_upload) "bbH" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple, /obj/structure/cable{ icon_state = "1-2" }, @@ -33916,16 +33115,9 @@ dir = 4 }, /obj/item/clipboard, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/nanite_scanner{ - pixel_x = 4 - }, /obj/machinery/light{ dir = 1 }, @@ -34069,7 +33261,6 @@ /turf/closed/wall/r_wall, /area/science/mixing/chamber) "bbY" = ( -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "1-4" }, @@ -34099,14 +33290,6 @@ /obj/structure/chair{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -34429,8 +33612,12 @@ }, /area/maintenance/port) "bcD" = ( -/turf/closed/wall/r_wall/rust, -/area/science/mixing) +/obj/effect/turf_decal/box, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "bcE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -34604,14 +33791,6 @@ pixel_x = 24; pixel_y = -24 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -34764,7 +33943,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "bcY" = ( /obj/structure/grille/broken, @@ -34802,7 +33981,6 @@ /area/crew_quarters/kitchen) "bda" = ( /obj/machinery/door/firedoor/heavy, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/science/mixing/chamber) "bdb" = ( @@ -34852,7 +34030,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "bdg" = ( @@ -35357,12 +34534,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bdO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -35479,7 +34650,6 @@ pixel_x = 32; pixel_y = -8 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "bdV" = ( @@ -35852,7 +35022,6 @@ pixel_x = -32; pixel_y = -8 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/fore) "bev" = ( @@ -35931,7 +35100,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "beC" = ( @@ -35974,7 +35142,6 @@ "beF" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) "beG" = ( @@ -36395,6 +35562,7 @@ /obj/machinery/light{ dir = 1 }, +/obj/machinery/shieldwallgen/xenobiologyaccess, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -36744,7 +35912,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "bfT" = ( @@ -36799,7 +35966,6 @@ "bfX" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "bfY" = ( @@ -36822,6 +35988,9 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ name = "euthanization chamber freezer" }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bga" = ( @@ -36923,7 +36092,6 @@ pixel_x = 32; pixel_y = -8 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "bgi" = ( @@ -37302,16 +36470,6 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bgK" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -37390,10 +36548,6 @@ /turf/open/floor/grass, /area/medical/virology) "bgP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -37409,7 +36563,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark/corner, +/turf/open/floor/plasteel, /area/hallway/primary/starboard) "bgQ" = ( /obj/structure/cable{ @@ -38087,16 +37241,6 @@ /turf/open/floor/plating, /area/quartermaster/office) "bhY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bhZ" = ( @@ -38150,16 +37294,6 @@ }, /area/maintenance/port) "bie" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -38455,16 +37589,6 @@ /turf/open/floor/plasteel/dark, /area/security/checkpoint/science/research) "biC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/junction, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -38779,16 +37903,6 @@ /turf/open/floor/plasteel, /area/security/checkpoint/supply) "biX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -38847,7 +37961,6 @@ dir = 1 }, /obj/effect/turf_decal/loading_area, -/obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/quartermaster/storage) @@ -38863,7 +37976,6 @@ }, /obj/effect/turf_decal/loading_area, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel, /area/quartermaster/storage) "bjd" = ( @@ -39027,16 +38139,6 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "bjp" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -39081,16 +38183,6 @@ /turf/open/floor/plasteel/dark, /area/medical/surgery) "bjt" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -39110,7 +38202,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/tank/internals/oxygen/yellow, /turf/open/floor/plasteel/dark, /area/quartermaster/miningoffice) "bjv" = ( @@ -39121,7 +38212,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/tank/internals/oxygen/yellow, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -39173,7 +38263,6 @@ dir = 1; pixel_y = 3 }, -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "1-4" }, @@ -39194,7 +38283,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 5 }, -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "4-8" }, @@ -39366,16 +38454,6 @@ /turf/open/floor/plating, /area/maintenance/central) "bjN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -39421,22 +38499,12 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, /turf/open/floor/plasteel, /area/quartermaster/storage) "bjS" = ( @@ -39676,16 +38744,6 @@ /turf/open/floor/plasteel/dark, /area/quartermaster/office) "bks" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/quartermaster/storage) "bkt" = ( @@ -39784,16 +38842,6 @@ /area/quartermaster/sorting) "bkA" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -39818,7 +38866,6 @@ /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/arrows, -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, @@ -39927,7 +38974,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/tank/internals/oxygen/yellow, /obj/machinery/light, /obj/machinery/requests_console{ department = "Mining"; @@ -40122,16 +39168,6 @@ /turf/open/floor/plating, /area/maintenance/port) "blb" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -40205,16 +39241,6 @@ /turf/open/floor/plasteel/dark, /area/quartermaster/miningoffice) "bli" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -40224,16 +39250,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "blj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -40328,16 +39344,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/virology) "blq" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, @@ -40345,16 +39351,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "blr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, @@ -40432,16 +39428,6 @@ /area/quartermaster/storage) "blz" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 8 }, @@ -40471,36 +39457,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/showroomfloor, /area/library) -"blC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "blD" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -40579,16 +39536,6 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "blK" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, @@ -40597,16 +39544,6 @@ /area/quartermaster/storage) "blL" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -40837,7 +39774,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "bmf" = ( /obj/effect/turf_decal/tile/brown{ @@ -41211,7 +40148,6 @@ }, /obj/effect/turf_decal/arrows, /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -41228,7 +40164,7 @@ dir = 8 }, /obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "bmF" = ( /obj/machinery/status_display/evac, @@ -41243,7 +40179,7 @@ /obj/machinery/plantgenes{ pixel_y = 5 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "bmH" = ( /obj/effect/turf_decal/tile/red{ @@ -41271,16 +40207,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "bmJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -41400,7 +40326,7 @@ /area/crew_quarters/kitchen) "bmU" = ( /obj/structure/lattice, -/turf/closed/wall/r_wall/rust, +/turf/closed/wall/r_wall, /area/security/prison) "bmV" = ( /obj/effect/turf_decal/tile/neutral, @@ -41505,7 +40431,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 6 }, -/obj/effect/decal/cleanable/blood/old, /obj/structure/cable{ icon_state = "4-8" }, @@ -41664,10 +40589,6 @@ /area/crew_quarters/locker) "bnq" = ( /obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -41763,17 +40684,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/library) -"bny" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/hydroponics) "bnz" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -41829,31 +40739,7 @@ }, /turf/open/floor/plasteel/dark, /area/hydroponics) -"bnD" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) "bnE" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail{ name = "kitchen sorting disposal pipe"; sortType = 20 @@ -41895,9 +40781,7 @@ /area/bridge) "bnH" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -41970,20 +40854,6 @@ /obj/item/toy/figure/chef, /turf/open/floor/plating, /area/crew_quarters/kitchen) -"bnM" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/sign/departments/science{ - pixel_x = 32 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bnN" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -42032,11 +40902,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bnR" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -42045,17 +40911,6 @@ }, /turf/open/floor/grass, /area/hydroponics) -"bnS" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) "bnT" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/ppflowers, @@ -42149,10 +41004,7 @@ /area/security/courtroom) "boa" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 8 }, @@ -42162,25 +41014,13 @@ /turf/open/floor/grass, /area/hydroponics) "bob" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/window/reinforced, /turf/open/floor/grass, /area/hydroponics) -"boc" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/hydroponics) "bod" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -42264,10 +41104,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "boh" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced{ dir = 8 }, @@ -42938,12 +41775,9 @@ /area/crew_quarters/kitchen) "bpi" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/junglebush/b, /obj/item/radio/intercom{ pixel_y = -28 }, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, /turf/open/floor/grass, /area/hydroponics) "bpj" = ( @@ -43156,10 +41990,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -43178,10 +42008,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -43220,10 +42046,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -43231,9 +42053,6 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, /turf/open/floor/plasteel, /area/quartermaster/storage) "bpE" = ( @@ -43269,7 +42088,7 @@ /area/quartermaster/storage) "bpF" = ( /obj/structure/sign/departments/cargo, -/turf/closed/wall/rust, +/turf/closed/wall, /area/hallway/primary/starboard) "bpG" = ( /obj/effect/turf_decal/tile/neutral, @@ -43363,16 +42182,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "bpN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 8 }, @@ -43451,24 +42260,6 @@ /obj/structure/sign/departments/botany, /turf/closed/wall, /area/hallway/primary/starboard) -"bpW" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bpX" = ( /obj/machinery/door/poddoor/preopen{ id = "brigfrontdoor"; @@ -43477,7 +42268,6 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 28 }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -43525,7 +42315,7 @@ /area/bridge) "bqb" = ( /obj/structure/sign/departments/custodian, -/turf/closed/wall/rust, +/turf/closed/wall, /area/maintenance/central) "bqc" = ( /obj/effect/turf_decal/bot, @@ -43548,10 +42338,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/kitchen) "bqe" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -43574,9 +42360,6 @@ /turf/open/floor/plasteel/dark, /area/teleporter) "bqg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-8" }, @@ -43598,7 +42381,7 @@ /obj/item/radio/intercom{ pixel_y = 22 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "bqj" = ( /obj/effect/turf_decal/tile/red, @@ -43649,8 +42432,13 @@ /area/crew_quarters/kitchen) "bqm" = ( /obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, -/area/bridge) +/area/security/warden) "bqn" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -43673,16 +42461,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) "bqp" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -43704,17 +42482,15 @@ }, /area/maintenance/central) "bqs" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plasteel, -/area/bridge) +/area/security/main) "bqt" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, @@ -43805,8 +42581,6 @@ "bqA" = ( /obj/structure/table, /obj/item/folder/white, -/obj/item/restraints/handcuffs, -/obj/item/wirerod, /obj/item/pen, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -43978,16 +42752,6 @@ /turf/open/floor/plasteel, /area/hydroponics) "bqN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 4 }, @@ -44088,16 +42852,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bqT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -44108,18 +42862,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bqU" = ( -/obj/structure/table/wood, -/obj/item/clothing/gloves/color/rainbow/clown, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/item/bikehorn/rubberducky, -/obj/structure/sign/poster/contraband/clown{ - pixel_x = -30 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/theatre) "bqV" = ( /obj/effect/turf_decal/bot, @@ -44297,16 +43050,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "bri" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -44358,7 +43101,9 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/box, +/obj/effect/turf_decal/bot{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "bro" = ( @@ -44367,7 +43112,9 @@ }, /obj/machinery/portable_atmospherics/canister, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/box, +/obj/effect/turf_decal/bot{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "brp" = ( @@ -44484,7 +43231,6 @@ dir = 4; pixel_x = -26 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "brA" = ( @@ -44662,22 +43408,7 @@ /area/crew_quarters/bar/atrium) "brN" = ( /obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "brO" = ( /obj/machinery/hydroponics/constructable, @@ -44686,7 +43417,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hydroponics) "brP" = ( /obj/structure/table, @@ -44950,19 +43681,10 @@ }, /area/maintenance/central/secondary) "bsm" = ( -/turf/closed/wall/rust, -/area/chapel/office) +/obj/machinery/status_display/evac, +/turf/open/floor/plasteel, +/area/engine/supermatter) "bsn" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -45020,9 +43742,6 @@ /turf/open/floor/carpet, /area/lawoffice) "bss" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -45046,16 +43765,6 @@ }, /area/hallway/primary/port) "bst" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -45080,16 +43789,6 @@ /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/port) "bsv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail/flip{ dir = 2; name = "cargo sorting disposal pipe"; @@ -45183,12 +43882,6 @@ /turf/open/floor/plasteel, /area/security/courtroom) "bsC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -45204,13 +43897,6 @@ "bsE" = ( /turf/open/floor/plasteel, /area/bridge) -"bsF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/bridge) "bsG" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -45331,10 +44017,7 @@ /area/library) "bsN" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 8 }, @@ -45345,10 +44028,7 @@ /turf/open/floor/grass, /area/crew_quarters/heads/hop) "bsO" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 @@ -45356,11 +44036,7 @@ /turf/open/floor/grass, /area/crew_quarters/heads/hop) "bsP" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -45532,12 +44208,6 @@ name = "off ramp"; pixel_y = 5 }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, /turf/open/floor/plasteel, /area/quartermaster/storage) "btc" = ( @@ -45752,7 +44422,6 @@ "btt" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "btu" = ( @@ -45893,8 +44562,6 @@ "btH" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 @@ -45910,10 +44577,7 @@ /area/crew_quarters/bar) "btI" = ( /obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 @@ -46035,17 +44699,7 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood, /area/crew_quarters/bar) -"btU" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "btV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -46109,11 +44763,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-17"; - pixel_x = 8; - pixel_y = 3 - }, /obj/machinery/light_switch{ pixel_x = 24; pixel_y = 40 @@ -46127,17 +44776,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) -"bub" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-02"; - pixel_y = 3 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "buc" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -46252,12 +44890,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "buk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -46328,10 +44960,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "bur" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, @@ -47066,7 +45694,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "bvC" = ( @@ -47181,7 +45808,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bvL" = ( @@ -47252,16 +45878,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/toilet/restrooms) "bvQ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -47310,10 +45926,6 @@ /turf/open/floor/plasteel/dark, /area/library) "bvV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-16" }, @@ -47382,7 +45994,6 @@ /area/crew_quarters/heads/captain) "bwc" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bwd" = ( @@ -47407,9 +46018,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-16" - }, /obj/structure/extinguisher_cabinet{ pixel_x = 24 }, @@ -47685,16 +46293,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "bwF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, @@ -47876,10 +46474,6 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, /area/chapel/main) -"bwU" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/grass, -/area/chapel/main) "bwV" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -47914,11 +46508,13 @@ /turf/open/floor/plasteel/dark, /area/security/checkpoint/supply) "bwY" = ( +/obj/structure/chair/stool, /turf/open/floor/plasteel/chapel{ dir = 8 }, /area/chapel/main) "bwZ" = ( +/obj/structure/chair/stool, /turf/open/floor/plasteel/chapel, /area/chapel/main) "bxa" = ( @@ -48013,10 +46609,7 @@ /area/chapel/main) "bxh" = ( /obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -48138,10 +46731,7 @@ /area/quartermaster/storage) "bxt" = ( /obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -48476,10 +47066,6 @@ /turf/open/floor/plasteel/dark, /area/medical/virology) "bxW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -48547,9 +47133,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, /obj/machinery/light, /obj/machinery/airalarm{ dir = 1; @@ -48826,16 +47409,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "byv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -48916,7 +47489,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -49756,6 +48328,9 @@ /obj/machinery/newscaster/security_unit{ pixel_x = 28 }, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "bzQ" = ( @@ -50496,12 +49071,6 @@ name = "on ramp"; pixel_y = 6 }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, /turf/open/floor/plasteel, /area/quartermaster/storage) "bAV" = ( @@ -50557,7 +49126,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/airalarm{ pixel_y = 22 @@ -50595,14 +49163,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "bBc" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark/corner, +/turf/open/floor/plasteel, /area/hallway/primary/starboard) "bBd" = ( /obj/machinery/vending/tool, @@ -50630,19 +49194,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bBf" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bBg" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -50694,7 +49245,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bBk" = ( @@ -51117,16 +49667,6 @@ /turf/open/floor/plasteel/dark, /area/storage/primary) "bBS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "2-8" }, @@ -51189,16 +49729,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bBV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 8 }, @@ -51206,16 +49736,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bBW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -51264,16 +49784,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bCa" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -51614,14 +50124,11 @@ /turf/open/floor/plasteel/dark, /area/hydroponics) "bCG" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, /obj/machinery/atmospherics/components/binary/pump{ dir = 1; name = "External Gas to Loop" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/engine/engineering) "bCH" = ( /obj/effect/turf_decal/tile/blue{ @@ -52511,19 +51018,6 @@ luminosity = 2 }, /area/storage/tech) -"bEa" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset/anchored, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel/dark, -/area/maintenance/port/aft) "bEb" = ( /obj/structure/cable{ icon_state = "0-4" @@ -52835,16 +51329,6 @@ }, /area/maintenance/port/aft) "bEA" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -52854,16 +51338,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ dir = 8 @@ -52871,32 +51345,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bEC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bED" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 8 @@ -52919,16 +51373,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bEG" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -53199,7 +51643,9 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/box, +/obj/effect/turf_decal/bot{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "bFi" = ( @@ -53305,6 +51751,9 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -54284,10 +52733,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "bGS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/bot, /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -54318,15 +52763,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bGW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bGX" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -54622,21 +53058,6 @@ /obj/item/bedsheet/brown, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"bHv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bHw" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red{ @@ -54675,16 +53096,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bHy" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/box, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 1 @@ -54949,16 +53360,6 @@ }, /area/hallway/primary/central) "bHP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/effect/decal/cleanable/dirt, @@ -54971,9 +53372,6 @@ "bHS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/processing) "bHT" = ( @@ -55507,16 +53905,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bIO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/machinery/holopad, /turf/open/floor/plasteel, @@ -55528,12 +53916,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /turf/open/floor/plasteel, /area/security/processing) "bIQ" = ( @@ -55636,7 +54018,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) @@ -55805,13 +54187,7 @@ pixel_x = 6 }, /obj/item/pen, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -55824,12 +54200,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/item/storage/toolbox/mechanical{ pixel_x = 2; pixel_y = 4 @@ -55888,16 +54258,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "bJs" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 1 }, @@ -56246,13 +54606,6 @@ /turf/open/floor/wood, /area/crew_quarters/locker) "bJT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -56273,7 +54626,7 @@ dir = 1 }, /turf/open/floor/wood{ - icon_state = "wood-broken6" + icon_state = "wood-broken5" }, /area/crew_quarters/locker) "bJV" = ( @@ -56309,9 +54662,9 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bJY" = ( -/obj/structure/bed, -/obj/item/bedsheet/black, -/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/lighter, /obj/machinery/button/door{ id = "Cabin_2"; name = "Cabin 2 Privacy Lock"; @@ -56319,14 +54672,7 @@ pixel_y = 24; specialfunctions = 4 }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, +/turf/open/floor/wood, /area/crew_quarters/locker) "bJZ" = ( /obj/machinery/light/small{ @@ -56335,9 +54681,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, +/turf/open/floor/wood, /area/crew_quarters/locker) "bKa" = ( /obj/effect/turf_decal/tile/neutral{ @@ -56366,56 +54710,32 @@ }, /turf/open/floor/wood, /area/crew_quarters/locker) -"bKc" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/machinery/button/door{ - id = "Cabin_4Privacy"; - name = "Cabin 4 Privacy Toggle"; - pixel_x = -24; - pixel_y = -24 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/crew_quarters/locker) "bKd" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/machinery/button/door{ - id = "Cabin_3Privacy"; - name = "Cabin 3 Privacy Toggle"; - pixel_x = -24; - pixel_y = -24 - }, /turf/open/floor/wood{ - icon_state = "wood-broken5" + icon_state = "wood-broken6" }, /area/crew_quarters/locker) -"bKe" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/crew_quarters/locker) "bKf" = ( /obj/structure/sign/poster/contraband/revolver, /turf/closed/wall, /area/crew_quarters/locker) "bKg" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/lighter, -/turf/open/floor/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken3" + }, /area/crew_quarters/locker) "bKh" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/machinery/newscaster{ - pixel_x = 30 +/obj/structure/bed, +/obj/item/bedsheet/black, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood{ + icon_state = "wood-broken3" }, -/turf/open/floor/wood, /area/crew_quarters/locker) "bKi" = ( /obj/effect/turf_decal/tile/blue{ @@ -56435,12 +54755,19 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/locker) "bKk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "Cabin_4Privacy"; - name = "Cabin 4 Privacy Shutter" +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/button/door{ + id = "Cabin_4Privacy"; + name = "Cabin 4 Privacy Toggle"; + pixel_x = -24; + pixel_y = -24 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" }, -/turf/open/floor/plating, /area/crew_quarters/locker) "bKl" = ( /obj/structure/flora/rock/pile, @@ -56558,7 +54885,7 @@ pixel_x = -12; pixel_y = 2 }, -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ pixel_y = 16 }, /obj/effect/turf_decal/tile/neutral{ @@ -56842,9 +55169,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bKP" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -56908,7 +55232,7 @@ /area/hallway/primary/central) "bKT" = ( /obj/effect/turf_decal/box, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/structure/mirror{ @@ -56941,9 +55265,6 @@ /area/crew_quarters/toilet/restrooms) "bKU" = ( /obj/effect/turf_decal/box, -/obj/structure/toilet{ - dir = 8 - }, /obj/structure/mirror{ pixel_x = -28 }, @@ -57233,10 +55554,10 @@ /obj/structure/table, /obj/item/storage/firstaid/regular, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/ointment{ +/obj/item/stack/medical/mesh{ pixel_y = 4 }, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -57279,18 +55600,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bLr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/storage/primary) "bLs" = ( /obj/structure/table, /obj/effect/decal/cleanable/cobweb, @@ -57331,16 +55640,6 @@ /turf/open/floor/plasteel/dark, /area/janitor) "bLt" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -57348,7 +55647,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bLu" = ( -/turf/closed/wall/rust, +/obj/structure/dresser, +/turf/open/floor/wood, /area/crew_quarters/locker) "bLv" = ( /obj/effect/turf_decal/tile/purple{ @@ -57539,16 +55839,6 @@ /turf/open/floor/grass, /area/security/prison) "bLI" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ dir = 4 @@ -57606,11 +55896,6 @@ pixel_y = 22; prison_radio = 1 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-17"; - pixel_x = -8; - pixel_y = 3 - }, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bLO" = ( @@ -57670,16 +55955,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bLS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, @@ -57758,16 +56033,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bLY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ dir = 4 @@ -57775,16 +56040,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bLZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -57944,16 +56199,6 @@ /turf/open/floor/plasteel, /area/security/warden) "bMm" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -58042,7 +56287,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, /obj/structure/cable{ icon_state = "2-4" }, @@ -58054,12 +56298,6 @@ }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/storage/primary) @@ -58463,10 +56701,6 @@ /turf/open/floor/mech_bay_recharge_floor, /area/maintenance/port/aft) "bMY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/security/warden) "bMZ" = ( @@ -58567,9 +56801,7 @@ "bNi" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/cable{ icon_state = "4-8" }, @@ -58611,9 +56843,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -58755,7 +56984,6 @@ dir = 8; pixel_y = -24 }, -/obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -58833,8 +57061,6 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "bNH" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/ppflowers, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 5 @@ -59193,10 +57419,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -59212,9 +57434,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1, /turf/open/floor/plasteel, /area/storage/primary) @@ -59277,7 +57496,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/storage/primary) @@ -59451,16 +57669,6 @@ /turf/closed/wall/rust, /area/maintenance/starboard/aft) "bOD" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ dir = 4 @@ -59468,48 +57676,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bOE" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bOF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bOG" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/landmark/event_spawn, /obj/structure/cable{ icon_state = "1-2" @@ -59521,17 +57699,6 @@ /turf/closed/wall, /area/janitor) "bOI" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -59539,16 +57706,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "bOJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ dir = 4 @@ -59556,16 +57713,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bOK" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -59589,16 +57736,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "bOM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/effect/decal/cleanable/dirt, @@ -59624,16 +57761,6 @@ /turf/open/floor/plasteel/dark, /area/security/main) "bOP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bOQ" = ( @@ -59666,16 +57793,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bOS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -59752,22 +57869,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bOY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bOZ" = ( @@ -59854,10 +57961,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bPh" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/fernybush, /turf/open/floor/grass, /area/security/prison) "bPi" = ( @@ -59908,7 +58011,7 @@ pixel_x = -12; pixel_y = 2 }, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 16 }, /obj/effect/turf_decal/tile/neutral{ @@ -59981,7 +58084,7 @@ /area/hallway/primary/central) "bPp" = ( /obj/machinery/status_display/shuttle, -/turf/closed/wall/rust, +/turf/closed/wall, /area/security/courtroom) "bPq" = ( /obj/machinery/door/airlock/maintenance{ @@ -60130,7 +58233,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/closed/wall/rust, +/turf/closed/wall, /area/maintenance/starboard/aft) "bPA" = ( /obj/effect/turf_decal/tile/red, @@ -60154,16 +58257,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bPB" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -60266,16 +58359,6 @@ }, /area/hallway/secondary/entry) "bPL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail{ dir = 8; name = "HoP sorting disposal pipe"; @@ -60366,10 +58449,6 @@ }, /area/maintenance/port/aft) "bPR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -60513,16 +58592,6 @@ }, /area/space/nearstation) "bQd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/disposalpipe/segment{ @@ -60569,15 +58638,6 @@ /area/hallway/primary/starboard) "bQh" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/junction/flip{ dir = 8 }, @@ -60613,7 +58673,6 @@ /obj/machinery/door/airlock/public/glass{ name = "Engineering Hallway" }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bQl" = ( @@ -60747,16 +58806,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) "bQv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, @@ -60817,10 +58866,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -60838,9 +58883,6 @@ }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -60866,9 +58908,6 @@ }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, @@ -61302,10 +59341,6 @@ "bRf" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-02"; - pixel_y = 3 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -61358,16 +59393,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bRj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -61517,19 +59542,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bRt" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bRu" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -61846,16 +59858,6 @@ }, /area/maintenance/aft) "bRU" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -61868,16 +59870,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bRV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -61923,16 +59915,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bRZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -61952,16 +59934,6 @@ /turf/open/floor/engine, /area/storage/tech) "bSb" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -61972,16 +59944,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bSc" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, @@ -61993,9 +59955,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bSd" = ( -/turf/closed/wall/rust, -/area/hallway/secondary/entry) "bSe" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -62101,9 +60060,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -62117,17 +60073,11 @@ }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/disposalpipe/junction/flip, /turf/open/floor/plasteel, /area/storage/primary) "bSn" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/leafybush, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 @@ -62405,7 +60355,7 @@ name = "EMERGENCY STORAGE" }, /turf/closed/wall, -/area/hallway/secondary/entry) +/area/security/vacantoffice) "bSM" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/external{ @@ -62447,19 +60397,9 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) -"bSQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/closed/wall, -/area/hallway/secondary/exit/departure_lounge) "bSR" = ( /obj/machinery/shower{ dir = 8; @@ -62588,7 +60528,6 @@ /obj/structure/sign/departments/engineering{ pixel_x = 32 }, -/obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) @@ -62653,22 +60592,15 @@ /turf/open/floor/engine, /area/storage/tech) "bTe" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bTf" = ( @@ -62781,12 +60713,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bTr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/power/apc{ areastring = "/area/hallway/secondary/entry"; dir = 0; @@ -62869,17 +60795,13 @@ /turf/closed/wall/rust, /area/hallway/secondary/exit/departure_lounge) "bTy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "bTz" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral, @@ -62892,9 +60814,6 @@ dir = 4; pixel_x = -22 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /turf/open/floor/plasteel/dark, /area/security/prison) "bTA" = ( @@ -62934,6 +60853,9 @@ /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTE" = ( @@ -62988,7 +60910,7 @@ pixel_x = -12; pixel_y = 2 }, -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 16 }, /obj/effect/turf_decal/tile/neutral{ @@ -63096,6 +61018,9 @@ c_tag = "Arrivals Dock"; name = "shuttle camera" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 10 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTO" = ( @@ -63168,17 +61093,17 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) "bTS" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "bTT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -63254,9 +61179,6 @@ /turf/closed/wall, /area/hallway/secondary/entry) "bUa" = ( -/obj/structure/bed, -/obj/item/bedsheet/black, -/obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/crew_quarters/locker) "bUb" = ( @@ -63287,8 +61209,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -63319,15 +61244,6 @@ /area/hallway/secondary/entry) "bUg" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -63397,13 +61313,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"bUl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) "bUm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -63449,7 +61358,7 @@ dir = 10 }, /turf/open/floor/plasteel, -/area/security/warden) +/area/space) "bUs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -63464,9 +61373,8 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) "bUt" = ( -/obj/structure/sign/warning/electricshock, /turf/closed/wall/rust, -/area/hallway/secondary/entry) +/area/security/vacantoffice) "bUu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -63682,6 +61590,7 @@ /area/security/processing) "bUQ" = ( /obj/machinery/light/floor, +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/engine/air, /area/engine/atmos) "bUR" = ( @@ -63761,16 +61670,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bVa" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/junction/flip{ dir = 8 }, @@ -64274,13 +62173,6 @@ }, /area/maintenance/central/secondary) "bVL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -64293,10 +62185,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8; - icon_state = "intact" - }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bVM" = ( @@ -64674,11 +62562,21 @@ }, /area/maintenance/starboard/aft) "bWn" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" +/obj/machinery/door/airlock/maintenance{ + name = "Vacant Office" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/area/security/vacantoffice) "bWo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -64718,6 +62616,15 @@ /area/security/warden) "bWq" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bWr" = ( @@ -64799,17 +62706,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bWx" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/secondary/entry) +/turf/closed/wall, +/area/security/vacantoffice) "bWy" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -64997,6 +62895,11 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 24 }, +/obj/machinery/button/electrochromatic{ + pixel_x = 38; + pixel_y = -5; + id = "!interrogation_room" + }, /turf/open/floor/plasteel, /area/security/warden) "bWO" = ( @@ -65052,15 +62955,18 @@ dir = 4; pixel_x = -23 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bWV" = ( @@ -65105,6 +63011,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bWY" = ( @@ -65133,6 +63042,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bXa" = ( @@ -65289,10 +63201,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bXo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bXp" = ( @@ -65350,16 +63261,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bXu" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/box/corners{ dir = 1 }, @@ -65367,6 +63268,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bXv" = ( @@ -65400,20 +63304,6 @@ /obj/structure/sign/departments/evac, /turf/closed/wall, /area/hallway/secondary/exit/departure_lounge) -"bXy" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bXz" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -65443,16 +63333,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "bXC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -65477,16 +63357,6 @@ /area/hallway/secondary/exit/departure_lounge) "bXE" = ( /obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -65570,7 +63440,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/caution/stand_clear, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) @@ -65786,6 +63655,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bXY" = ( @@ -66094,12 +63966,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bYw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -66441,31 +64307,6 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) -"bYS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/brig) "bYT" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/security/prison"; @@ -66541,13 +64382,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bYZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bZa" = ( @@ -66680,13 +64514,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bZk" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bZl" = ( @@ -66788,16 +64621,6 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "bZr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "2-4" }, @@ -66909,20 +64732,8 @@ dir = 1 }, /area/hallway/primary/starboard) -"bZA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bZB" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -66937,16 +64748,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) "bZD" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -67031,25 +64832,15 @@ }, /area/hallway/primary/starboard) "bZJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ - dir = 4 - }, /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bZK" = ( @@ -67096,24 +64887,14 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bZN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/structure/cable{ + icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) @@ -67154,16 +64935,6 @@ /turf/open/floor/plasteel/dark, /area/janitor) "bZR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 5 }, @@ -67322,16 +65093,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cad" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 4 }, @@ -67407,16 +65168,9 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cak" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, @@ -67429,19 +65183,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cal" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -67514,16 +65261,6 @@ /turf/open/floor/plasteel/dark, /area/storage/primary) "car" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "2-8" }, @@ -67572,10 +65309,6 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cau" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -67587,7 +65320,7 @@ "cav" = ( /obj/structure/sign/poster/contraband/random, /turf/closed/wall, -/area/hallway/secondary/entry) +/area/security/vacantoffice) "caw" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -67696,7 +65429,6 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "caE" = ( @@ -67848,6 +65580,10 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "caP" = ( @@ -67855,6 +65591,9 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 5 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "caQ" = ( @@ -67965,10 +65704,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/central) "cbb" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable{ @@ -68179,9 +65914,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 10 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /turf/open/floor/plasteel, /area/hallway/primary/port) "cbw" = ( @@ -68247,7 +65979,6 @@ /area/maintenance/starboard) "cbA" = ( /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cbB" = ( @@ -68349,16 +66080,6 @@ }, /area/hallway/primary/port) "cbH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ dir = 1 }, @@ -68374,24 +66095,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/port) -"cbJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 8 - }, -/area/hallway/primary/port) "cbM" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -68491,10 +66194,6 @@ }, /area/maintenance/port/aft) "cbT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -68666,10 +66365,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cci" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -68685,10 +66380,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8; - icon_state = "intact" - }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "ccj" = ( @@ -68935,10 +66626,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "ccM" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -68985,9 +66672,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/brig) "ccR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -69044,7 +66728,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "ccX" = ( @@ -69160,28 +66843,14 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cdg" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/turf_decal/plaque{ icon_state = "L6" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ - dir = 8; - icon_state = "intact" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ + dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -69197,20 +66866,9 @@ /area/maintenance/aft) "cdi" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, /area/security/prison) "cdj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/item/beacon, /turf/open/floor/plasteel, /area/hallway/primary/aft) @@ -69607,9 +67265,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/brig) -"cdY" = ( -/turf/closed/wall/r_wall/rust, -/area/maintenance/central) "cdZ" = ( /turf/closed/wall/r_wall, /area/maintenance/central) @@ -69649,7 +67304,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "ced" = ( @@ -69741,6 +67395,7 @@ pixel_x = 4; req_access_txt = "16" }, +/obj/item/toy/talking/AI, /turf/open/floor/circuit/red, /area/ai_monitored/turret_protected/ai) "ceg" = ( @@ -69895,6 +67550,7 @@ pixel_x = -3; req_access_txt = "16" }, +/obj/item/toy/talking/AI, /turf/open/floor/circuit/red, /area/ai_monitored/turret_protected/ai) "cep" = ( @@ -69974,12 +67630,6 @@ /turf/open/floor/plasteel, /area/engine/break_room) "ceu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{ dir = 8 }, @@ -70009,12 +67659,6 @@ /turf/open/floor/circuit/red/telecomms, /area/tcommsat/server) "cex" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1{ dir = 8 }, @@ -70031,12 +67675,6 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cey" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -70139,9 +67777,6 @@ "ceF" = ( /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat/atmos) -"ceG" = ( -/turf/closed/wall/r_wall/rust, -/area/ai_monitored/turret_protected/aisat/atmos) "ceH" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -70240,9 +67875,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "2-4" - }, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -70916,9 +68548,6 @@ "cfY" = ( /turf/closed/wall/r_wall, /area/ai_monitored/storage/satellite) -"cga" = ( -/turf/closed/wall/r_wall/rust, -/area/ai_monitored/storage/satellite) "cgb" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -70948,7 +68577,7 @@ "cgg" = ( /obj/structure/sign/warning/docking, /turf/closed/wall/rust, -/area/hallway/secondary/entry) +/area/hallway/secondary/exit/departure_lounge) "cgi" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -71137,9 +68766,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-05" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -71416,16 +69042,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "cgV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, @@ -71597,10 +69213,6 @@ /turf/closed/wall, /area/maintenance/fore) "chk" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -71646,10 +69258,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/brig) "chm" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -72118,9 +69726,6 @@ /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, /area/solar/port/aft) -"chV" = ( -/turf/closed/wall/rust, -/area/ai_monitored/turret_protected/aisat_interior) "chW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -72751,7 +70356,6 @@ name = "Engine Access Shutters" }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 8 }, @@ -73182,21 +70786,6 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall, /area/engine/gravity_generator) -"cjC" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "cjD" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -73216,33 +70805,6 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"cjF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"cjG" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "cjH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -73258,7 +70820,6 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "cjI" = ( -/obj/effect/turf_decal/box, /obj/machinery/shower{ dir = 4; name = "emergency shower" @@ -73481,7 +71042,6 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, -/obj/effect/turf_decal/box, /obj/machinery/shower{ dir = 4; name = "emergency shower" @@ -74035,16 +71595,6 @@ icon_state = "platingdmg1" }, /area/engine/engineering) -"clg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "clh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1, /turf/open/floor/plasteel, @@ -74359,14 +71909,6 @@ luminosity = 2 }, /area/engine/gravity_generator) -"clF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "clG" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -74479,37 +72021,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/maintenance/solars/port/aft) -"clP" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "clQ" = ( /obj/machinery/gravity_generator/main/station, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/greenglow, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "clR" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "clS" = ( @@ -74542,7 +72058,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/security/processing) "clY" = ( @@ -74611,9 +72126,6 @@ /area/engine/atmos) "cmc" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -74728,6 +72240,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/entry) "cmk" = ( @@ -74866,7 +72381,6 @@ dir = 8; pixel_x = 24 }, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "cmt" = ( @@ -75001,16 +72515,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cmD" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/plasteel, @@ -75030,7 +72534,6 @@ dir = 8 }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "cmF" = ( @@ -75130,7 +72633,6 @@ }, /obj/machinery/light/small, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "cmR" = ( @@ -75391,7 +72893,6 @@ dir = 4; pixel_x = -26 }, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) "cnn" = ( @@ -76003,6 +73504,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/mob/living/simple_animal/bot/cleanbot{ + auto_patrol = 1; + name = "\improper Cleaner Bot" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "coI" = ( @@ -76187,16 +73692,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cpd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/primary/aft) @@ -76496,16 +73991,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "cpu" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/item/beacon, @@ -76616,7 +74101,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/engine/engineering) "cpF" = ( /obj/structure/flora/rock/pile, @@ -76725,16 +74210,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "cpP" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -76742,16 +74217,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cpQ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/item/beacon, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -78323,16 +75788,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, @@ -79459,7 +76914,6 @@ id = "xeno_blastdoor"; name = "Xenobiology Containment Blast Door" }, -/obj/effect/turf_decal/caution/stand_clear, /obj/structure/disposalpipe/junction{ dir = 4 }, @@ -80856,7 +78310,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /obj/structure/noticeboard{ dir = 4; pixel_x = -27 @@ -81267,16 +78721,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/cable{ icon_state = "2-8" }, @@ -81480,8 +78924,18 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port) "cyG" = ( -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/vacant"; + name = "Vacant Office APC"; + pixel_y = 24 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/wood, +/area/security/vacantoffice) "cyI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/kitchen{ @@ -81595,10 +79049,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) "cyY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/maintenance/port/fore) @@ -82267,7 +79717,6 @@ name = "Emergency Research Blast Door" }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/science/research) "cAY" = ( @@ -82398,7 +79847,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/brig) "cBp" = ( @@ -82598,12 +80046,19 @@ /turf/open/floor/plasteel/dark, /area/maintenance/central) "cBW" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "Cabin_3Privacy"; - name = "Cabin 3 Privacy Shutter" +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/machinery/button/door{ + id = "Cabin_3Privacy"; + name = "Cabin 3 Privacy Toggle"; + pixel_x = -24; + pixel_y = -24 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken5" }, -/turf/open/floor/plating, /area/crew_quarters/locker) "cBX" = ( /obj/effect/spawner/structure/window/reinforced, @@ -82638,6 +80093,9 @@ }, /obj/structure/flora/grass/jungle/b, /obj/machinery/light, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plating/asteroid/airless{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, @@ -82651,6 +80109,9 @@ }, /obj/structure/flora/ausbushes/palebush, /obj/machinery/light/small, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plating/asteroid/airless{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, @@ -82866,7 +80327,6 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/barricade/wooden/crude, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -83083,9 +80543,6 @@ /turf/open/floor/plasteel/dark, /area/maintenance/fore) "cDr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-02"; pixel_y = 3 @@ -83505,16 +80962,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) -"cEl" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) "cEm" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped, /obj/machinery/button/ignition{ @@ -83998,7 +81445,6 @@ dir = 4 }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cFC" = ( @@ -84030,7 +81476,6 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/barricade/wooden/crude, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "cFJ" = ( @@ -84265,11 +81710,7 @@ /turf/open/floor/engine/vacuum, /area/science/test_area) "cGz" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/flora/ausbushes/genericbush, /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/sunnybush, /obj/structure/window/reinforced{ dir = 4 }, @@ -84627,20 +82068,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/security/brig) -"cHC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cHD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -84766,16 +82193,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "cHS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -84828,9 +82245,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -84855,15 +82269,6 @@ icon_state = "platingdmg3" }, /area/maintenance/aft) -"cIe" = ( -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0; - req_access_txt = "55" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) "cIf" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 @@ -85024,16 +82429,6 @@ /turf/open/floor/plasteel/dark, /area/storage/tcom) "cIw" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, @@ -85192,9 +82587,6 @@ dir = 1 }, /obj/machinery/light, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, /obj/structure/sign/warning/electricshock{ pixel_y = -32 }, @@ -85332,6 +82724,9 @@ "cJp" = ( /obj/effect/turf_decal/tile/red, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 10 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "cJq" = ( @@ -85611,16 +83006,6 @@ /turf/open/floor/plasteel/dark, /area/engine/break_room) "cKa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -85639,16 +83024,6 @@ /turf/open/floor/plasteel, /area/engine/break_room) "cKb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -86470,7 +83845,6 @@ /turf/open/floor/plating, /area/maintenance/department/electrical) "cMG" = ( -/obj/structure/girder, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating{ @@ -86966,15 +84340,6 @@ /area/science/mixing/chamber) "cOW" = ( /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/bridge) @@ -86996,12 +84361,6 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "cPb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/bridge) @@ -87185,9 +84544,19 @@ "cZm" = ( /turf/closed/wall/rust, /area/security/prison) -"dis" = ( -/turf/closed/wall/r_wall/rust, -/area/bridge) +"dbY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{ + dir = 1 + }, +/obj/structure/chair/stool, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/security/vacantoffice) +"dlg" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/security/vacantoffice) "dxq" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -87242,16 +84611,14 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/fore) -"elZ" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/rust, -/area/crew_quarters/bar) -"emD" = ( -/turf/closed/wall/rust, -/area/quartermaster/miningoffice) -"erN" = ( -/turf/closed/wall/rust, -/area/hallway/primary/starboard) +"eaJ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/airalarm/directional/west, +/obj/item/twohanded/required/kirbyplants/dead, +/turf/open/floor/wood, +/area/security/vacantoffice) "esR" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood{ @@ -87259,10 +84626,6 @@ }, /area/maintenance/port/fore) "evx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/engine{ initial_gas_mix = "n2=100;TEMP=80"; name = "mainframe floor" @@ -87285,9 +84648,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) -"ezp" = ( -/turf/closed/wall/rust, -/area/hydroponics) "eBN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -87328,9 +84688,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall/rust, /area/security/prison) -"eVT" = ( -/turf/closed/wall/rust, -/area/science/explab) "fcv" = ( /obj/structure/sign/warning/fire{ pixel_x = 32 @@ -87338,6 +84695,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"fkk" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/security/vacantoffice) "fyr" = ( /obj/machinery/light{ dir = 4 @@ -87345,9 +84707,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/closed/mineral/random/labormineral, /area/space/nearstation) -"fAH" = ( -/turf/closed/wall/r_wall/rust, -/area/security/main) "fXq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -87362,6 +84721,11 @@ dir = 8 }, /area/hallway/primary/fore) +"gmF" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/security/vacantoffice) "gnA" = ( /obj/machinery/airalarm{ dir = 1; @@ -87428,44 +84792,36 @@ /obj/structure/sign/departments/evac, /turf/closed/wall/rust, /area/hallway/secondary/exit/departure_lounge) -"gMU" = ( -/turf/closed/wall/r_wall/rust, -/area/ai_monitored/turret_protected/ai_upload) +"gKu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/security/vacantoffice) +"gPA" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken3" + }, +/area/security/vacantoffice) "hgW" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/chair/stool, /obj/effect/decal/cleanable/generic, /turf/open/floor/wood, /area/maintenance/port/fore) -"hqv" = ( -/turf/closed/wall/rust, -/area/crew_quarters/kitchen) -"hvb" = ( -/turf/closed/wall/r_wall/rust, -/area/tcommsat/computer) "hxn" = ( /turf/open/space/basic, /area/hallway/secondary/entry) -"hzY" = ( -/turf/closed/wall/rust, -/area/gateway) -"hAb" = ( -/turf/closed/wall/r_wall/rust, -/area/security/courtroom) +"hDh" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/cardboard, +/obj/effect/spawner/bundle/costume/maid, +/turf/open/floor/wood, +/area/security/vacantoffice) "hNk" = ( /turf/closed/wall/r_wall/rust, /area/security/prison) "ice" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -87477,26 +84833,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"ieA" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/cat_butcherer, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/fore) -"iiA" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine{ - initial_gas_mix = "n2=100;TEMP=80"; - name = "mainframe floor" - }, -/area/tcommsat/server) "ikw" = ( /obj/machinery/camera{ c_tag = "Xenobiology Cell 4"; @@ -87509,13 +84845,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"ivg" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space) -"iwR" = ( -/turf/closed/wall/r_wall/rust, -/area/science/server) "iBL" = ( /obj/machinery/camera{ c_tag = "Laser Room Starboard"; @@ -87526,7 +84855,7 @@ /turf/open/floor/engine, /area/engine/engineering) "iLn" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood, /area/maintenance/port/fore) "iMb" = ( @@ -87552,9 +84881,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"iRL" = ( -/turf/closed/wall/rust, -/area/hallway/primary/aft) "iSg" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -87564,9 +84890,6 @@ /mob/living/simple_animal/hostile/retaliate/ghost, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) -"iYW" = ( -/turf/closed/wall/r_wall/rust, -/area/crew_quarters/heads/captain) "iZo" = ( /turf/closed/wall/r_wall/rust, /area/medical/virology) @@ -87620,9 +84943,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"jxc" = ( -/turf/closed/wall/rust, -/area/hallway/primary/fore) "jAT" = ( /obj/structure/lattice/catwalk, /obj/machinery/light, @@ -87630,21 +84950,6 @@ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, /area/hallway/secondary/entry) -"jCp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine{ - initial_gas_mix = "n2=100;TEMP=80"; - name = "mainframe floor" - }, -/area/tcommsat/server) -"jDv" = ( -/turf/closed/wall/rust, -/area/quartermaster/storage) "jHJ" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 @@ -87660,17 +84965,12 @@ /turf/closed/mineral/random/labormineral, /area/space/nearstation) "jQY" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/table/wood, +/obj/item/paper_bin, +/turf/open/floor/wood{ + icon_state = "wood-broken4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/item/clothing/under/costume/maid, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/aft) +/area/security/vacantoffice) "jRw" = ( /obj/structure/sign/poster/official/high_class_martini, /turf/closed/wall/r_wall, @@ -87753,6 +85053,18 @@ }, /turf/open/floor/wood, /area/maintenance/port/fore) +"jUX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "jUZ" = ( /obj/item/poster/random_contraband, /obj/item/poster/random_contraband, @@ -87773,19 +85085,28 @@ "khA" = ( /turf/closed/wall/rust, /area/construction/mining/aux_base) +"koc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, +/turf/open/floor/wood, +/area/security/vacantoffice) "krJ" = ( /turf/closed/wall/rust, /area/hallway/secondary/exit/departure_lounge) "ktv" = ( -/obj/machinery/air_sensor{ - pixel_x = -32; - pixel_y = -32 +/obj/machinery/power/compressor{ + comp_id = "incineratorturbine"; + dir = 1; + luminosity = 2 }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 +/obj/structure/cable, +/obj/machinery/camera{ + c_tag = "Turbine Chamber"; + dir = 4; + name = "turbine camera"; + network = list("turbine") }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) @@ -87794,15 +85115,41 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/maintenance/port/fore) +"kzw" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "kIJ" = ( /turf/open/floor/wood{ icon_state = "wood-broken7" }, /area/maintenance/port/fore) +"kRh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/rnd/bepis, +/turf/open/floor/plasteel/dark, +/area/science/research) "kSc" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/maintenance/port/fore) +"kXo" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/security/vacantoffice) "leX" = ( /obj/structure/chair/stool, /turf/open/floor/wood{ @@ -87811,7 +85158,7 @@ /area/maintenance/port/fore) "llm" = ( /obj/structure/sign/poster/ripped, -/turf/closed/wall/rust, +/turf/closed/wall, /area/crew_quarters/fitness/recreation) "lKu" = ( /obj/structure/table/wood, @@ -87821,12 +85168,9 @@ icon_state = "wood-broken4" }, /area/maintenance/port/fore) -"lSJ" = ( -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) "lVk" = ( /obj/machinery/status_display/evac, -/turf/closed/wall/rust, +/turf/closed/wall, /area/security/warden) "mbs" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, @@ -87846,16 +85190,6 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "mIt" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=SE CPH"; @@ -87883,17 +85217,21 @@ }, /turf/open/floor/plasteel/dark, /area/science/research) +"mKp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/security/vacantoffice) "mLN" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/mineral/random/labormineral, /area/space/nearstation) -"mPm" = ( -/turf/closed/wall/rust, -/area/security/checkpoint/supply) -"nDw" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/rust, -/area/crew_quarters/heads/hor) "nJw" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -87906,15 +85244,6 @@ "nNA" = ( /turf/closed/wall/rust, /area/bridge) -"nNV" = ( -/turf/closed/wall/rust, -/area/science/lab) -"nSz" = ( -/turf/closed/wall/rust, -/area/medical/cryo) -"nVt" = ( -/turf/closed/wall/rust, -/area/storage/tech) "nXu" = ( /obj/structure/cable{ icon_state = "4-8" @@ -87953,6 +85282,19 @@ }, /turf/open/space/basic, /area/hallway/secondary/entry) +"oUc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/wood, +/obj/item/folder/paperwork, +/turf/open/floor/wood, +/area/security/vacantoffice) +"ppP" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/security/vacantoffice) "pCe" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/asteroid/airless, @@ -87970,9 +85312,6 @@ icon_state = "wood-broken4" }, /area/maintenance/port/fore) -"pQf" = ( -/turf/closed/wall/r_wall/rust, -/area/science/xenobiology) "qfZ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -87986,23 +85325,7 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) -"qtv" = ( -/turf/closed/wall/r_wall/rust, -/area/tcommsat/server) -"qtS" = ( -/turf/closed/wall/rust, -/area/medical/genetics/cloning) "qvS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=W CPH"; dir = 8; @@ -88111,35 +85434,12 @@ /obj/structure/sign/warning, /turf/closed/wall/rust, /area/space/nearstation) -"sPG" = ( -/turf/closed/wall/rust, -/area/crew_quarters/heads/hor) -"tgw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall/rust, -/area/security/prison) -"tqw" = ( -/turf/closed/wall/rust, -/area/lawoffice) -"tyb" = ( -/turf/closed/wall/rust, -/area/hallway/primary/central) "tCi" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/wood{ icon_state = "wood-broken3" }, /area/maintenance/port/fore) -"tEC" = ( -/turf/closed/wall/rust, -/area/crew_quarters/bar) -"tGU" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/rust, -/area/gateway) -"tYn" = ( -/turf/closed/wall/rust, -/area/janitor) "uda" = ( /turf/closed/wall/rust, /area/security/warden) @@ -88171,16 +85471,6 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "unX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=E CPH"; dir = 8; @@ -88190,12 +85480,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "uqy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/civilian/janitor/maid, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/obj/machinery/light{ + dir = 1 }, -/area/maintenance/starboard/aft) +/turf/open/floor/wood, +/area/security/vacantoffice) "uxQ" = ( /obj/effect/decal/cleanable/ash, /turf/closed/mineral/random/labormineral, @@ -88203,9 +85492,23 @@ "uzR" = ( /turf/closed/wall/rust, /area/storage/primary) -"uWo" = ( -/turf/closed/wall/rust, -/area/security/checkpoint/medical) +"uGi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/security/vacantoffice) +"uRM" = ( +/turf/open/floor/wood, +/area/security/vacantoffice) +"vjT" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!interrogation_room" + }, +/turf/open/floor/plating, +/area/security/warden) +"vle" = ( +/obj/structure/festivus, +/turf/open/floor/wood, +/area/security/vacantoffice) "vmu" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral{ @@ -88215,9 +85518,6 @@ /obj/item/instrument/guitar, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) -"whw" = ( -/turf/closed/wall/rust, -/area/medical/surgery) "whZ" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -88231,24 +85531,10 @@ /mob/living/simple_animal/pet/bumbles, /turf/open/floor/plasteel, /area/hydroponics) -"wmX" = ( -/turf/closed/wall/rust, -/area/quartermaster/qm) -"wvq" = ( -/turf/closed/wall/rust, -/area/security/courtroom) -"wCy" = ( -/turf/closed/wall/rust, -/area/hallway/primary/port) -"wDP" = ( -/turf/closed/wall/rust, -/area/crew_quarters/fitness/recreation) -"wQL" = ( -/turf/closed/wall/rust, -/area/security/execution/education) -"xei" = ( -/turf/closed/wall/r_wall/rust, -/area/teleporter) +"wiK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/security/vacantoffice) "xqv" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/drinkingglass{ @@ -88258,9 +85544,6 @@ /obj/item/reagent_containers/food/drinks/drinkingglass, /turf/open/floor/wood, /area/maintenance/port/fore) -"xqL" = ( -/turf/closed/wall/rust, -/area/quartermaster/office) "xse" = ( /obj/machinery/cryopod, /obj/effect/decal/cleanable/dirt, @@ -88269,10 +85552,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) -"xBI" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/rust, -/area/chapel/office) "xJY" = ( /obj/structure/rack, /obj/item/storage/backpack, @@ -88328,6 +85607,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/security/prison) +"ykB" = ( +/obj/structure/chair/stool, +/turf/open/floor/wood, +/area/security/vacantoffice) (1,1,1) = {" aaa @@ -98771,7 +96054,7 @@ bmU ruL ruL ruL -hNk +aav aeu aeu aap @@ -99024,11 +96307,11 @@ cqG cov cpx bLM -hNk +aav mmZ ewj qfZ -hNk +aav aeu aeu aeU @@ -99281,11 +96564,11 @@ cIA coD cqt aeu -hNk +aav xse nXu qPY -hNk +aav aeu aeu aUz @@ -99536,14 +96819,14 @@ cqI cqP afm bVx -hNk -hNk -hNk +aav +aav +aav cxV ydo eBN -tgw -hNk +asO +aav aeu aeu aeu @@ -99793,7 +97076,7 @@ bGl bGV bIi cpv -hNk +aav awn bTz czR @@ -99801,7 +97084,7 @@ cFN cIm cJC aav -hNk +aav aeu aeu aeU @@ -100058,7 +97341,7 @@ bNi bPa caX cJG -hNk +aav aeu aeU aUz @@ -100564,7 +97847,7 @@ ajd cof ajd ajd -hNk +aav btd bVV bMe @@ -100572,7 +97855,7 @@ bNH bTu ciF cIQ -hNk +aav aeu aUz aeU @@ -100821,7 +98104,7 @@ ajd bHc bIo ajd -hNk +aav bLN bMQ bPk @@ -100829,7 +98112,7 @@ bRa bSR bTF bVm -hNk +aav aeu aeu coy @@ -101591,7 +98874,7 @@ ajd ajd ajd ajd -hNk +aav bKv bLX eQS @@ -101849,7 +99132,7 @@ ajd aeu aeu aav -hNk +aav bJB abp abp @@ -102363,7 +99646,7 @@ coA bHj adf aeu -hNk +aav bJF bJN cuS @@ -102620,7 +99903,7 @@ coA bHo aeE agK -hNk +aav bLj bYc cDG @@ -102628,7 +99911,7 @@ aaG aez cIj aeB -wQL +cZm aez aez cko @@ -105199,13 +102482,13 @@ bSW bUd bVO aey -fAH -fAH +aey +aey aey aey byu aey -fAH +aey aey aey clr @@ -105429,7 +102712,7 @@ amA amR amA cFW -wDP +awD bKD bLg bLm @@ -105719,7 +103002,7 @@ ahZ aiL aiL aiL -cDB +bqs ajS bOO bBG @@ -106210,7 +103493,7 @@ bxE byS bGI bMg -wDP +awD bDt bDV bFn @@ -106457,7 +103740,7 @@ csG bid bjx csQ -wDP +awD bKn bLc bMi @@ -106467,7 +103750,7 @@ bLT bEK bGT bMx -wDP +awD afz adZ ajd @@ -106482,7 +103765,7 @@ aej aeY afn aeY -aeY +bqm ahg bXO bYO @@ -106685,7 +103968,7 @@ apF aqP asb aNG -aOa +aOb akd aOC aOm @@ -106714,8 +103997,8 @@ aqu bif bjz csR -wDP -wDP +awD +awD bLo bLp btz @@ -106951,7 +104234,7 @@ abo agk agI agL -abl +afX ahc aPx aPx @@ -107189,7 +104472,7 @@ aeu cwp cwq cyL -aiV +alw cyY adv alw @@ -107446,10 +104729,10 @@ aeu cwp abu cyM -aiW +cyY cyZ czl -alA +cyY czp bgN cwp @@ -107733,8 +105016,8 @@ aQJ aTc aUL aWr -uWo -whw +aQI +aQN bxr aQN aQN @@ -107960,10 +105243,10 @@ cwq cyE ahL cyO -ajh -ajs +cyY +alw akI -alH +cyY czr ans czK @@ -107990,7 +105273,7 @@ aQI aQJ aQf aQJ -uWo +aQI baB bcS bek @@ -108003,7 +105286,7 @@ aUJ aUJ afe brD -bLn +brD bvO bKF bza @@ -108237,8 +105520,8 @@ aCL aPh aGp aNW -aJv -aQk +aJC +agF aSE aQy aWt @@ -108273,7 +105556,7 @@ cBT aef aef lVk -uda +aef aef ani anm @@ -108521,11 +105804,11 @@ btD bvP bxQ bzg -bLu -bLu bIV bIV -csS +bIV +bIV +bIV bFp aah bHz @@ -108750,7 +106033,7 @@ aBq aCP aEo aGt -nSz +aNQ aJB aQo aTO @@ -108773,17 +106056,17 @@ aoV bxV aoV afe -bLu +bIV bFb akv bzZ bKL -bLu +bIV bJQ -bKc +bLu bKk -cBv -bFp +aXE +aYZ aah bHA aaA @@ -108798,7 +106081,7 @@ cqg ajw agV bXT -bYS +bYQ bYm ama aiQ @@ -109006,8 +106289,8 @@ aNH aVH aNO aso -qtS -qtS +aNL +aNL aQd aQC aNn @@ -109038,11 +106321,11 @@ bzh aoL bJU bUa -bKk -csS +aJv +aXE cCa -uda -uda +aef +aef bJC aef aef @@ -109053,7 +106336,7 @@ bWr coN cqh bVW -uda +aef ayi aJr ayi @@ -109295,8 +106578,8 @@ bzi bIV bIV bIV -bLu -cBI +bIV +bIV bFp aah bHC @@ -109553,8 +106836,8 @@ bIV bJS bKd cBW -cBv -bFp +aYR +aYZ aah bHA aff @@ -109808,14 +107091,14 @@ bAL bzh apV bJZ -bKe -cBW -cBy +bUa +bLu +aYR cCb -uda +aef aef lVk -uda +aef uda bXr bNq @@ -110063,11 +107346,11 @@ bGA bJp bAQ bIV -bLu +bIV bIV bKf bIV -csN +bIV bFq aah bHD @@ -110324,7 +107607,7 @@ arf bKb bKg bLu -cBw +bIV bFq aah bHu @@ -110580,15 +107863,15 @@ bzp bIV bJY bKh +aWS bIV -afz ayy agX agX agX agX aef -acH +vjT aBH aef aef @@ -110835,10 +108118,10 @@ bKC bAy bzu bIV -bLu bIV bIV -bEa +bIV +ajd bFr bBI bHH @@ -111045,7 +108328,7 @@ aeu aWG aWG aWG -bsm +aWG aWG aWG cAN @@ -111078,8 +108361,8 @@ aSg aAc aSg bAN -aPf -aPf +bAN +bAN bAN bAN bAN @@ -111299,7 +108582,7 @@ aaa aeu aeu aeu -bsm +aWG acE cgY cAi @@ -111582,7 +108865,7 @@ aJQ aLn aMN aOD -aiU +bdf aYx aSe aYx @@ -111602,7 +108885,7 @@ boU bfS bss btV -bZH +aEu bxW bzx bKq @@ -111813,7 +109096,7 @@ aeu aeu aeu aeu -bsm +aWG aWG czG cAk @@ -111838,7 +109121,7 @@ aMX aJR aOP aAO -anY +aNy aHq aYM aST @@ -111855,7 +109138,7 @@ bmJ bmJ bqp bri -bmJ +auK bfX bst bvQ @@ -112071,8 +109354,8 @@ aeu aeu aeu aeu -bsm -bsm +aWG +aWG aWG aWG aWG @@ -112083,7 +109366,7 @@ bsZ aWG aWG avY -bsm +aWG beG bwC bxe @@ -112093,7 +109376,7 @@ bwY aGM bxJ ahF -aOS +aPk aBN aOF bdU @@ -112139,7 +109422,7 @@ arq bEo bEF bGX -bBf +bYZ aKC all alX @@ -112340,7 +109623,7 @@ bta btC atL avK -xBI +btg aob azS aAu @@ -112350,7 +109633,7 @@ bwZ bxF bxJ ahF -aOS +aPk aJi aOG btE @@ -112360,7 +109643,7 @@ btE aPK aLU btE -cJc +buC buC aRF aSP @@ -112393,14 +109676,14 @@ ajd bRP bBr cdj -bBf +bYZ bEG -bBf -bBf +bYZ +bYZ bVa -cHC +bUZ cHS -cHC +bUZ aKN cfp baF @@ -112586,7 +109869,7 @@ aeu aeu aeu adH -ajj +alc ajz adQ cAF @@ -112597,7 +109880,7 @@ aWG aWG bvT avL -bsm +aWG btA cBh btA @@ -112607,12 +109890,12 @@ bxu bwP btA bsx -aOS +aPk aaJ -tEC -tEC +btE +btE bvi -bub +aTe buu bvf aTe @@ -112623,14 +109906,14 @@ bvn bfv bvU bvu -cJc +buC blx bnx boY buC bsy aoh -tqw +aoh bCn aoh aoA @@ -112640,8 +109923,8 @@ cbC cbH cbM cbP -aer -aer +ajd +ajd czw bWQ czU @@ -112653,7 +109936,7 @@ cCh cCh cCo bGY -bHv +bYw bVc cbc cch @@ -112866,7 +110149,7 @@ btA ahF aOT cfa -tEC +btE aTB btT buc @@ -112898,7 +110181,7 @@ aYM aYM cbM cbw -aer +ajd ajd ajd czW @@ -112910,7 +110193,7 @@ bBk aaY aaY bGZ -bBf +bYZ bVd bHU aMA @@ -113117,15 +110400,15 @@ azW bwR bye bxi -aEu +aEx bxH bxJ ahF -aOS +aPk cfa btF aqg -btU +aqg buy buJ bvq @@ -113141,7 +110424,7 @@ bjH blB bAS buC -cJc +buC bps aoh aok @@ -113155,7 +110438,7 @@ cbI cbN aYM cbR -cbJ +cbw ajd bKA bBG @@ -113167,7 +110450,7 @@ aci bWc aaY bHk -bBf +bYZ bVd bXV ccj @@ -113664,9 +110947,9 @@ aoS aoX adc aoh -wCy -wCy -wCy +boC +boC +boC bvJ bwc bBj @@ -113681,7 +110964,7 @@ ack bWe bBk bHk -bBf +bYZ cFA axF axF @@ -113874,7 +111157,7 @@ adQ cAr cAy cAC -adQ +adH bsf cCI cBc @@ -113885,14 +111168,14 @@ cBc btA bwK btB -bwU +btB bxD -aAD +btB aEx bxJ aIl ahF -aOS +aPk cfa btF aRM @@ -113923,7 +111206,7 @@ asF asF aos bEd -wvq +asF bGq bOP bIt @@ -113938,7 +111221,7 @@ acl bCd bBk bHk -bBf +bYZ cHk bFa bGf @@ -114135,7 +111418,7 @@ adH anb anU apG -adQ +adH aoc atO awh @@ -114170,7 +111453,7 @@ bpH bsh buC boW -wvq +asF adu bwk byi @@ -114406,7 +111689,7 @@ aEC bxJ aIo ahF -aOS +aPk cfa btE aXm @@ -114420,14 +111703,14 @@ btE btE bey btE -tEC -cJc -cJc +btE +buC +buC buC buC buC bpn -wvq +asF aow arB atc @@ -114452,7 +111735,7 @@ bws aaY aaY bHk -bBf +bYZ cac bFa cnz @@ -114663,7 +111946,7 @@ btA btA ago aaZ -aOS +aPk cfa btH aXp @@ -114671,7 +111954,7 @@ btY bvk bvE bvH -aWS +aTe buA bbk bcW @@ -114684,7 +111967,7 @@ bqr brs bsk btO -wvq +asF asY ask aaV @@ -114709,7 +111992,7 @@ bUz bWg axF bYn -bBf +bYZ cae bVo cck @@ -114908,7 +112191,7 @@ cCM cCR bsf ajv -adQ +adH cDc cCU cDh @@ -114920,7 +112203,7 @@ aaI aGN cDq aJS -aOS +aPk cfa btI aXr @@ -114939,14 +112222,14 @@ aLD bpn asF asF -wvq +asF asF asF asF asu auI atf -auK +byi avW ccR apa @@ -115138,7 +112421,7 @@ aeu ceF ceF ceF -ceG +ceF ceF ceF ceF @@ -115159,10 +112442,10 @@ aeU aUz aeu adH -adQ adH adH -adQ +adH +adH adH cCU cDy @@ -115179,7 +112462,7 @@ ago aBO aNq aRY -elZ +btK btE buf aSh @@ -115213,8 +112496,8 @@ auP bQx bOP bRh -tyb -iRL +bOU +axF cag cbh bRX @@ -115253,7 +112536,6 @@ aFH aFN cwz aaa -acm aaa aaa acm @@ -115313,6 +112595,7 @@ aaa aaa aaa aaa +aaa "} (106,1,1) = {" aaa @@ -115385,20 +112668,20 @@ aeu aeu asZ asZ -aAg asZ asZ -aAg -aAg asZ asZ -ceG +asZ +asZ +asZ +ceF ceF akN aac adr adA -ceG +ceF ceF ceF ceF @@ -115434,7 +112717,7 @@ cdD cdD ago aJT -aOS +aPk aMU aOI btE @@ -115442,8 +112725,8 @@ btE btE aOy btE -tEC -tEC +btE +btE bbr aTe aTe @@ -115511,7 +112794,6 @@ aIL aFI aFW aFI -aFI cko cko aaa @@ -115570,6 +112852,7 @@ aaa aaa aaa aaa +aaa "} (107,1,1) = {" aaa @@ -115639,16 +112922,16 @@ aUz aeu aeu aeu -aAg -asZ -asZ -asZ -aAg asZ asZ asZ asZ -aAg +asZ +asZ +asZ +asZ +asZ +asZ ceF axB acn @@ -115700,7 +112983,7 @@ aPQ aTu bpq aXa -tEC +btE btE aTL aOy @@ -115737,7 +113020,7 @@ bCe bVg bCe bHl -bBf +bYZ cHj bFa bFS @@ -115767,7 +113050,6 @@ aFO cwc aFO cwA -lSJ aFI aFI aFI @@ -115827,6 +113109,7 @@ aaa aaa aaa aaa +aaa "} (108,1,1) = {" aaa @@ -115897,14 +113180,14 @@ aeu aeu asZ asZ -aAg -aAg +asZ +asZ asZ asZ cef asZ asZ -aAg +asZ asZ ceF acJ @@ -115975,7 +113258,7 @@ asF asF arn arn -hAb +arn arn aur arn @@ -115987,14 +113270,14 @@ bOP bJy aCq cbA -bBf +bYZ byv -bBE -bBf -bBf -bBf -bBf -bBf +bcD +bYZ +bYZ +bYZ +bYZ +bYZ cHk bFa bFa @@ -116027,7 +113310,7 @@ aFY ktv aNi aGb -aGc +aaa aaa aaa aaa @@ -116205,14 +113488,14 @@ aEH ceZ aIs aiA -aOS +aPk cgq aXu aox aMi aMc aTz -apX +aox arA akM aox @@ -116281,7 +113564,6 @@ aFU cwd jHJ cwH -cwH aFI aFI aFI @@ -116341,6 +113623,7 @@ aaa aaa aaa aaa +aaa "} (110,1,1) = {" aaa @@ -116409,7 +113692,7 @@ aeu aeu aeu asZ -aAg +asZ asZ aam aaF @@ -116420,7 +113703,7 @@ ceD cel abR atB -adT +chX aHw ace acM @@ -116539,7 +113822,6 @@ aJl aFI aFI aFI -aFI cko cko aaa @@ -116598,6 +113880,7 @@ aaa aaa aaa aaa +aaa "} (111,1,1) = {" aaa @@ -116665,7 +113948,7 @@ aaa aeU ciQ aeu -aAg +asZ asZ aak aan @@ -116681,7 +113964,7 @@ adg ace acp acW -alV +adg adG adR adU @@ -116720,7 +114003,7 @@ ago aIz ajW ajJ -aOS +aPk fXq aIV aox @@ -116738,13 +114021,13 @@ cBV aox atT atT -dis -dis -dis -dis +atT +atT +atT +atT ajK atT -dis +atT atj apN awj @@ -117008,7 +114291,7 @@ asA apf atr auG -arD +ark bsP bQx bOF @@ -117180,7 +114463,7 @@ aeU anH aeu asZ -aAg +asZ aal aaw aaU @@ -117235,7 +114518,7 @@ aIB aba cgw aRk -apY +aNy oPf aLV aHz @@ -117244,8 +114527,8 @@ arl arl byV bzc -gMU -gMU +arl +arl bfJ abk aqb @@ -117254,8 +114537,8 @@ atT aqz aoW bqe -aqQ -aqQ +bsE +bsE avQ byn bzI @@ -117448,7 +114731,7 @@ cdH ceB abZ atB -adT +chX aZh acz ada @@ -117481,15 +114764,15 @@ ciZ ahh ahh ahh -qtv -qtv -qtv -qtv -qtv +ahh +ahh +ahh +ahh +ahh +cfM +cfM cfM cfM -hvb -hvb cfM aRl bVL @@ -117527,7 +114810,7 @@ atG bQx bOF bYW -nVt +bCM bDp bQn bSf @@ -117695,7 +114978,7 @@ aeu aeu aeu asZ -aAg +asZ apn ceE cfJ @@ -117705,10 +114988,10 @@ abC abL aca asZ -alV +adg azv chB -chV +azv adg ciN ciM @@ -117735,7 +115018,7 @@ aoM adH adH ahh -qtv +ahh awo cdn cdJ @@ -117751,7 +115034,7 @@ cfM aRm cci aKP -gMU +arl arl arl byN @@ -117777,7 +115060,7 @@ atj atj bHI atj -nNA +atj atT atT atT @@ -117951,15 +115234,15 @@ aeu aeu aeu aeu -aAg asZ asZ asZ -aAg +asZ +asZ asZ ceo asZ -aAg +asZ asZ asZ cfY @@ -118010,10 +115293,10 @@ cdg aQh bwp ciX -gMU +arl byq aXz -aYZ +aZc bbU bzm bzc @@ -118210,14 +115493,14 @@ aeu aeu aeu asZ -aAg -aAg asZ asZ -aAg asZ asZ -aAg +asZ +asZ +asZ +asZ asZ cfY acj @@ -118226,7 +115509,7 @@ adm adz adN ciB -cga +cfY acm aeo aaa @@ -118468,15 +115751,15 @@ aeu aeu aeu asZ -aAg -aAg asZ asZ -aAg asZ -aAg asZ -cga +asZ +asZ +asZ +asZ +cfY cfY cde chG @@ -118505,7 +115788,7 @@ adH adQ abX cBc -qtv +ahh cew awI cdq @@ -118734,11 +116017,11 @@ aeu aeu aeu cfY -cga cfY cfY cfY -cga +cfY +cfY cfY acm acm @@ -118755,21 +116038,21 @@ aeu adQ cCr cED -ieA +anJ ale alT cEW aoZ cFg agC -qtv +ahh atU -jCp +awJ awJ awJ aAj cff -iiA +awJ cfE cfR cge @@ -118781,7 +116064,7 @@ chm aLg arl arl -gMU +arl bAw aXH aZl @@ -118795,8 +116078,8 @@ awg blT bnI bpe -bqm -bsF +bsE +bsE bur atj aHU @@ -118804,9 +116087,9 @@ auc atj atj aug -nNA -nNA -nNA +atj +atj +atj atT atT bIz @@ -119038,7 +116321,7 @@ atF aLk aLV aLW -gMU +arl arl byM aZn @@ -119052,10 +116335,10 @@ aqh aqk att aqG -bqs +bsE arY auM -arX +bsE byt afT atj @@ -119067,7 +116350,7 @@ arw avF aus bIJ -bOY +aZg bKZ bmP bNZ @@ -119278,7 +116561,7 @@ cFh cFj ahh ahh -awM +evx cdC ceJ aAl @@ -119311,7 +116594,7 @@ atD aqG bqt cOW -cOW +cPb cPb byw ard @@ -119537,13 +116820,13 @@ cAF ahh ahh ahh -qtv ahh -qtv -qtv +ahh +ahh +ahh ahh cfM -hvb +cfM cfM cfM cgz @@ -119801,13 +117084,13 @@ cvM awE aEN aGQ -hzY -jxc +aUa +ago avw aRB aJi aLE -apX +aox aOk aox aox @@ -120070,8 +117353,8 @@ akw aox aox aox -apX -apX +aox +aox aox aox aox @@ -120095,7 +117378,7 @@ bqf cjy aus bIJ -bOY +aZg bLi bmc bmc @@ -120315,7 +117598,7 @@ cvO cvU aEQ aGS -tGU +cvW aJY awr aRX @@ -120348,8 +117631,8 @@ aui aui avb aui -xei -xei +aui +aui aui bCH bQd @@ -120577,10 +117860,10 @@ aKi cIw cKd aox -aox +aGh aRc -bzN -akM +aGh +aGh ajt ajt aZq @@ -120588,7 +117871,7 @@ aZq ajt ajt aQO -apX +aox cCk bka blW @@ -120613,11 +117896,11 @@ bOF bJy aCq cbA -bBf -bBf -bBf +bYZ +bYZ +bYZ bBE -bBf +bYZ bEN ane aBS @@ -120817,7 +118100,7 @@ cIX khA cDT iSg -cEl +cEb cJD atV cEg @@ -120831,13 +118114,13 @@ aES aHv aUa aKl -aPz +ajj aNl aGh -aGh +alV aZf -aGh -aGh +apY +aqQ ajt aBc bmH @@ -120846,10 +118129,10 @@ bcZ ajt bgf aox -apX aox aox -cdY +aox +cdZ cdZ ahy asx @@ -121091,9 +118374,9 @@ aHq aNq aZO aGh -aQm +bqU aRi -aSn +bqU bqU ajt aXV @@ -121109,7 +118392,7 @@ blZ bpq bpg aYO -iYW +asx bwb arz bDc @@ -121131,7 +118414,7 @@ bQy bBn axF bCr -bBf +bYZ cpW bYu aCc @@ -121359,7 +118642,7 @@ bqc bdo bqz bgo -apX +aox bqb cba aIN @@ -121370,10 +118653,10 @@ asx bwd bzA bLe -auT +aGc auT arF -iYW +asx bAb bQR aYO @@ -121630,7 +118913,7 @@ byE bzP arV brU -iYW +asx bAp bQS aox @@ -121645,7 +118928,7 @@ bBR bCl bCA bCr -bBf +bYZ csC bYw aIb @@ -121874,9 +119157,9 @@ bdy ajt ajt blc -hqv -ezp -ezp +ajt +aZd +aZd aZd auj aZd @@ -121884,10 +119167,10 @@ asx asx asx asx -iYW -iYW asx -iYW +asx +asx +asx bMu bRr aox @@ -122128,7 +119411,7 @@ ajt boI ajt bqy -hqv +ajt bgr bhd biJ @@ -122136,9 +119419,9 @@ bjn bmE bns bpk -bnD -bnS -boc +brN +brN +brN bwG bso bpi @@ -122649,11 +119932,11 @@ boV bjn bmG bnK -bny +brN bqH -bny +brN buB -bny +brN bzt bAs bBQ @@ -122673,7 +119956,7 @@ bQC bCx awq bUY -bBf +bYZ cud cyb btG @@ -122906,11 +120189,11 @@ bqP bmF bcX bnN -bny +brN bqH -bny +brN buB -bny +brN bzC boS bCF @@ -122923,7 +120206,7 @@ bZM bhY bIT bQI -bLr +bMt bMt bMt bMt @@ -123163,9 +120446,9 @@ bpb bjn bme bnK -bny +brN bqH -bny +brN buB bwM byG @@ -123173,7 +120456,7 @@ bof bFJ bFX bqQ -ezp +aZd aZd bBU bXv @@ -123420,7 +120703,7 @@ bhd bol bmg bnO -bny +brN bqI bsR buD @@ -123429,8 +120712,8 @@ bAl bAu bFV bGk -ezp -ezp +aZd +aZd bGh bZI bhY @@ -123668,7 +120951,7 @@ bsb brq brF brG -hqv +ajt boQ boH bqo @@ -123925,7 +121208,7 @@ brr aVd brJ brI -hqv +ajt ajt bmA bph @@ -123944,7 +121227,7 @@ bob bRc bZy bZp -bZA +bZD bZD bZJ bZN @@ -124146,14 +121429,14 @@ bfq iMq bbx alB -afX -agF +arx +arx +alB +alB +alB alB alB alB -pQf -pQf -pQf alB alB alB @@ -124403,7 +121686,7 @@ aWJ ayv aWJ alB -cIe +bdp bhl alB bfq @@ -124447,8 +121730,8 @@ bAX bnz bBZ bqS -bGW -bGW +bZD +aAD bqX brz buO @@ -124490,7 +121773,7 @@ clM axW cnk coo -axU +ayn aLH aLx aLz @@ -124655,7 +121938,7 @@ aeu aeu aeu aeu -pQf +alB bfs aWJ bft @@ -124911,8 +122194,8 @@ alB alB alB alB -pQf -pQf +alB +alB bfM bfM bfM @@ -124950,10 +122233,10 @@ bdf bpC bkG bbH -bnM -bpC -bpC -bpW +bBc +bBc +bBc +bBc bgP bBc bBp @@ -124967,7 +122250,7 @@ bqY bvB buR bPx -erN +bnv bjX bkz bOv @@ -125010,7 +122293,7 @@ aLF aag aag aag -aLF +bsm cuA cuW bYI @@ -125174,7 +122457,7 @@ aeV bfl bfV aWR -aWP +adT adx aWR bgC @@ -125200,17 +122483,17 @@ aXP bai aZS aZr -ajL -ajL +cAX +cAX cAX aJJ aRs aSB aTP -aYd -aYK -aYK -aYd +arD +arX +arX +auz bdO beO bpF @@ -125224,14 +122507,14 @@ blf blf blg blf -mPm +blf blQ bAC bBL bkQ bjW bAv -bOC +bEg bGM bHP bJc @@ -125441,7 +122724,7 @@ cqw bgM bgn bVA -pQf +alB ctJ cxP aWY @@ -125451,7 +122734,7 @@ ayx bdc bdR aAZ -eVT +aZv aEE aFp aHJ @@ -125465,12 +122748,12 @@ aYK aZL bch aYd -aZg -aZj +aYK +aYK aYd bhe cLt -xqL +bhI bhX bhs biM @@ -125727,7 +123010,7 @@ aZQ aYd bdP beP -xqL +bhI bhy ats bko @@ -125762,7 +123045,7 @@ bOl bSJ bSI ukP -uqy +bGr bEg bAT bOC @@ -125790,10 +123073,10 @@ ckk aEg cnu cnu -cnd +bOc cnd cnu -cnd +bOc cnu alm aaa @@ -126016,10 +123299,10 @@ bNw bTP bUu bWh -bTy +cax cxB ceN -jQY +chZ cxB cjE bXb @@ -126224,9 +123507,9 @@ bgk aBd aZv aXw -aXE +kRh +aXI aXI -aYR beD bbj aNF @@ -126248,7 +123531,7 @@ aKA bjh bjy bpw -mPm +blf bsV buS bxl @@ -126270,15 +123553,15 @@ bOA bOH bSH bNw -bSr +bWx aEK -bSd -bUl -bSd -bUl -bSr bUt -bSd +bWx +bUt +bWx +bWx +bUt +bUt bXj ckS bUu @@ -126302,13 +123585,13 @@ cmH cvE cmR cwe -cnd +krJ cwN cqQ csq cnu cuL -cnd +cnu acm aaa aaa @@ -126473,7 +123756,7 @@ alB cOb cps cMW -iwR +aZF aZF ami aZF @@ -126505,7 +123788,7 @@ bkr bmx bod bpx -mPm +blf blg bBo blg @@ -126524,18 +123807,18 @@ bNM bOo cgd bNM -tYn +bNM aVM bNx -bSr +bWx cyG -cyG -cyG -cyG -cyG -cyG -cyG -bSr +mKp +oUc +eaJ +uRM +uRM +vle +bWx bXz ccB cgb @@ -126554,7 +123837,7 @@ cms cmE cmQ cju -bOC +bEg cnV cmh bOb @@ -126773,7 +124056,7 @@ bIm bHR bNg bAF -bOC +bEg bQe bLZ bkE @@ -126785,14 +124068,14 @@ bZW bWw bTq bSL -cyG -cyG -cyG -cyG -cyG -cyG -cyG -bSr +jQY +kzw +gmF +gKu +uRM +uRM +uRM +bWx bEg bEg bEg @@ -126822,7 +124105,7 @@ cwZ cxi cnu cnu -cnd +cnu alm aaa aaa @@ -126967,7 +124250,7 @@ alB alB alB alB -pQf +alB alB bfQ bfQ @@ -126987,7 +124270,7 @@ alB cby cMP ajO -iwR +aZF aXf aeG aik @@ -127002,8 +124285,8 @@ beE mIG aNM bgW -nNV -nNV +aDI +aDI biB aYg aDI @@ -127041,15 +124324,15 @@ cad bhY car bTr -bSr -cyG -cyG -cyG -cyG -cyG -cyG -cyG -bSr +bWx +uqy +wiK +uGi +jUX +koc +dbY +dlg +bWx bYf ceU cgI @@ -127073,11 +124356,11 @@ bEg cvG cvL cwm -cnd +bOc cpb crf -cnd -cnd +cnu +cnu cko aeu aeu @@ -127268,7 +124551,7 @@ bbb bdz cby clA -wmX +aCb bjJ blJ biV @@ -127288,7 +124571,7 @@ bCc bOw bAT bOC -erN +bnv bHT bJh bJK @@ -127299,14 +124582,14 @@ bQQ bSN bTs cav -cyG -cyG -cyG -cyG -cyG -cyG -cyG -bSr +uRM +fkk +ppP +bTS +ykB +kXo +ykB +bWx bPJ bUN hxn @@ -127512,7 +124795,7 @@ aZY aJF aWX aVJ -nDw +anx bbM aNT aPo @@ -127525,7 +124808,7 @@ bbb bdE cbz cLt -wmX +aCb bhO aqH biI @@ -127538,7 +124821,7 @@ bkA bke blr bkY -blC +blD bls bPj bmo @@ -127555,15 +124838,15 @@ bTk bXL bXx bPe -bSd -cyG -cyG -cyG +bWx +hDh +uRM +uRM bTS -cyG -cyG -cyG -bSr +uRM +ykB +gPA +bWx bPJ bQa hxn @@ -127752,7 +125035,7 @@ alB alB alB alB -pQf +alB alB alB cng @@ -127769,7 +125052,7 @@ aGa aKu aMe bfB -sPG +amV bfr bex aTU @@ -127812,15 +125095,15 @@ bOG bQU bUs bTv -krJ -krJ -krJ -bPe +bOc +bOc +bOc +bOc bWn bWx -bSr +bWx bSL -bSr +bWx bSr cgx hxn @@ -128045,7 +125328,7 @@ big big bom aCb -jDv +bhQ bpB bkl bli @@ -128065,7 +125348,7 @@ bQo bJM bPe bMF -bRs +aZj bQV bPe bTw @@ -128091,9 +125374,9 @@ bUN cke aeu bzG -cjC -clg -clP +clR +clR +clR ctU bzG aeu @@ -128348,7 +125631,7 @@ jAT aeu aeu bzG -cjF +clR clE clQ ctW @@ -128605,8 +125888,8 @@ bUN aeu aeu bzG -cjG -clF +clR +clR clR ctX bzG @@ -128815,7 +126098,7 @@ bhH bhW bmN boK -emD +bhH bhH bjV bkh @@ -128838,7 +126121,7 @@ bLE bMN bON bQY -bSQ +bOc bPe bOc bWz @@ -129080,7 +126363,7 @@ bki bhQ bkN bIG -bki +bhQ bMB blH bhQ @@ -129096,7 +126379,7 @@ bMO bOR cak aIY -cmD +bTy bTe bXu bXn @@ -129356,7 +126639,7 @@ cmr aWs crl bXC -bXo +bON bYg bZk bTO @@ -129557,7 +126840,7 @@ cME cMr cLs bkd -ava +bkd bkd bkd azD @@ -129869,7 +127152,7 @@ bRV bNz bSn crl -bRt +bON bXw bWM bPe @@ -129877,7 +127160,7 @@ bZC bPe bOc bSr -bSd +krJ cgg hxn hxn @@ -130092,7 +127375,7 @@ aSM aUn baC aYp -bcD +awi bgi bkd bhH @@ -130126,7 +127409,7 @@ bRZ cmr bRA crl -bXy +bON bXA bXN bTG @@ -130383,7 +127666,7 @@ bSb cmr cGz cro -bRt +bON bXA cFE bTt @@ -130861,7 +128144,7 @@ awi awi baC baC -bcD +awi aYs cdc cna @@ -131372,7 +128655,7 @@ axO cOm cbj aio -auz +cbm aSZ cOo aVt @@ -131421,13 +128704,13 @@ aeu aeu aUz acm -cmJ -ivg -ivg -cmJ -ivg -ivg -cmJ +acm +acK +acK +acm +acK +acK +acm acm aeU aeU @@ -131622,14 +128905,14 @@ bkd aze aAG cbj -cLt +cbk aJn cLg aMq ava bkd bkd -ava +bkd avA avA bkd @@ -131879,7 +129162,7 @@ bkd ava ava bkd -ava +bkd avA crw avA @@ -132140,7 +129423,7 @@ bkd cLK cLK afJ -ava +bkd aeu alm acm @@ -132393,7 +129676,7 @@ aeu aeu aeu aeu -ava +bkd agy cLR agy @@ -132650,7 +129933,7 @@ aeu aeu aeu aeu -beK +bhq aaa aaa aaa diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index 808d2f5ccb..825bc3c2aa 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -267,7 +267,6 @@ /area/space) "aaT" = ( /obj/docking_port/stationary{ - dir = 1; dwidth = 1; height = 4; roundstart_template = /datum/map_template/shuttle/escape_pod/default; @@ -382,7 +381,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -538,7 +536,6 @@ dir = 4 }, /obj/structure/disposaloutlet{ - icon_state = "outlet"; dir = 8 }, /turf/open/floor/plating/asteroid/airless, @@ -630,9 +627,7 @@ /obj/machinery/button/door{ id = "permawindows"; name = "Emergency Shutters"; - normaldoorcontrol = 0; - pixel_y = 25; - specialfunctions = 1 + pixel_y = 25 }, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -700,7 +695,6 @@ /area/science/research) "acb" = ( /obj/machinery/doppler_array/research/science{ - icon_state = "tdoppler"; dir = 1 }, /obj/machinery/status_display/ai{ @@ -713,27 +707,11 @@ /turf/open/floor/plasteel, /area/science/mixing) "acc" = ( -/obj/machinery/computer/security/telescreen/toxins{ - layer = 4; - network = list("toxins"); - pixel_y = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/plasteel, /area/science/mixing) -"acd" = ( -/obj/machinery/computer/security/telescreen/toxins{ - layer = 4; - network = list("toxins"); - pixel_y = 30 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/mixing) "ace" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -745,7 +723,6 @@ dir = 5 }, /obj/machinery/button/massdriver{ - dir = 2; id = "toxinsdriver"; pixel_x = 24; pixel_y = 24 @@ -1023,15 +1000,13 @@ /obj/effect/decal/cleanable/tomato_smudge, /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plating, /area/medical/abandoned) "acK" = ( /obj/structure/sign/warning/vacuum/external{ - pixel_x = 30; - pixel_y = 0 + pixel_x = 30 }, /turf/open/floor/plating, /area/science/mixing) @@ -1069,7 +1044,6 @@ desc = "In Space, no one can hear you scream, especially if the microphone has been disabled."; name = "Prison Intercom"; pixel_x = 32; - pixel_y = 0; prison_radio = 1 }, /turf/open/floor/plasteel/dark, @@ -1193,6 +1167,10 @@ name = "Mass Driver Door"; req_access_txt = "7" }, +/obj/machinery/computer/security/telescreen/toxins{ + dir = 1; + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/science/mixing) "adg" = ( @@ -1243,14 +1221,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"adm" = ( -/obj/machinery/door/poddoor{ - density = 1; - id = "SecJusticeChamber"; - name = "Justice Vent" - }, -/turf/open/floor/plating, -/area/security/execution/education) "adn" = ( /obj/structure/cable{ icon_state = "2-4" @@ -1290,9 +1260,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"ads" = ( -/turf/closed/wall/r_wall, -/area/science/nanite) "adt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -1305,7 +1272,7 @@ icon_state = "1-2" }, /turf/open/floor/plasteel/white, -/area/science/nanite) +/area/science/circuit) "adu" = ( /turf/closed/wall/r_wall, /area/science/storage) @@ -1398,7 +1365,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -1476,9 +1442,9 @@ /area/science/research) "adR" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/fore"; dir = 1; name = "Fore Maintenance APC"; - areastring = "/area/maintenance/fore"; pixel_y = 24 }, /obj/structure/cable{ @@ -1499,8 +1465,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/table, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "adT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -1512,13 +1480,10 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "adU" = ( /turf/open/floor/plasteel, -/area/science/nanite) -"adV" = ( -/turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "adW" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -1541,7 +1506,7 @@ light_color = "#cee5d2" }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "adX" = ( /obj/effect/turf_decal/bot, /obj/structure/sign/poster/random{ @@ -1561,7 +1526,7 @@ /obj/item/integrated_electronics/analyzer, /obj/item/integrated_circuit_printer, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "adY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -1580,7 +1545,7 @@ /obj/item/stock_parts/cell/high, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "adZ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/portable_atmospherics/canister/toxins, @@ -1638,7 +1603,6 @@ "aeh" = ( /obj/structure/table, /obj/machinery/microwave{ - pixel_x = 0; pixel_y = 6 }, /turf/open/floor/plasteel, @@ -1656,10 +1620,8 @@ "aej" = ( /obj/machinery/door/window/westleft{ base_state = "right"; - dir = 8; icon_state = "right"; - name = "Unisex Showers"; - req_access_txt = "0" + name = "Unisex Showers" }, /turf/open/floor/plasteel/freezer, /area/security/prison) @@ -1672,7 +1634,6 @@ /area/security/prison) "ael" = ( /obj/machinery/sparker{ - dir = 2; id = "executionburn"; pixel_x = -25 }, @@ -1933,7 +1894,7 @@ pixel_x = -26 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aeM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ @@ -1947,20 +1908,19 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "aeN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "aeO" = ( /obj/structure/chair/office/light{ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aeP" = ( /obj/machinery/status_display/ai{ pixel_x = 32 @@ -1970,7 +1930,7 @@ /obj/item/stack/sheet/glass/fifty, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aeQ" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/delivery, @@ -1988,18 +1948,12 @@ }, /turf/open/floor/plasteel/white, /area/science/storage) -"aeT" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/science/storage) "aeU" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 }, /obj/machinery/status_display/ai{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/open/floor/plasteel/white, /area/science/mixing) @@ -2021,7 +1975,6 @@ pixel_x = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -2096,8 +2049,7 @@ /area/security/prison) "afj" = ( /obj/machinery/door/airlock{ - name = "Unisex Restroom"; - req_access_txt = "0" + name = "Unisex Restroom" }, /turf/open/floor/plasteel/freezer, /area/security/prison) @@ -2117,7 +2069,6 @@ /area/security/execution/education) "afm" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 2; name = "justice injector" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -2228,7 +2179,6 @@ /area/security/processing) "aft" = ( /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 8 }, /obj/effect/turf_decal/tile/neutral, @@ -2306,7 +2256,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/structure/table/reinforced, @@ -2380,25 +2329,9 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "afH" = ( /obj/structure/table/reinforced, -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/nanite_scanner{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote{ - pixel_x = 4; - pixel_y = 4 - }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -2410,22 +2343,11 @@ dir = 8 }, /obj/effect/turf_decal/bot, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, /turf/open/floor/plasteel/dark, -/area/science/nanite) -"afI" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "afJ" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -2492,7 +2414,6 @@ light_color = "#e8eaff" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -2574,7 +2495,6 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/door/window/brigdoor{ - dir = 2; name = "Justice Chamber"; req_access_txt = "3" }, @@ -2634,7 +2554,6 @@ "agg" = ( /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -2730,7 +2649,7 @@ icon_state = "2-4" }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "agp" = ( /obj/effect/landmark/start/scientist, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -2745,29 +2664,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/nanite) -"agq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "agr" = ( /obj/machinery/door/airlock/research{ name = "Toxins Secure Storage"; @@ -2838,7 +2735,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -2960,6 +2856,8 @@ /obj/structure/table/optable{ name = "Robotics Operating Table" }, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "agH" = ( @@ -3037,7 +2935,7 @@ /turf/open/floor/plasteel, /area/security/prison) "agR" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -3115,7 +3013,6 @@ req_access_txt = "1" }, /obj/machinery/button/door{ - dir = 2; id = "SecJusticeChamber"; layer = 4; name = "Justice Vent Control"; @@ -3143,7 +3040,6 @@ /obj/item/assembly/flash/handheld, /obj/item/reagent_containers/spray/pepper, /obj/item/radio/intercom{ - pixel_x = 0; pixel_y = 28 }, /obj/machinery/light/small{ @@ -3269,7 +3165,6 @@ /turf/open/floor/plating, /area/science/xenobiology) "ahj" = ( -/obj/machinery/nanite_program_hub, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3288,7 +3183,7 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "ahk" = ( /obj/structure/disposalpipe/junction{ dir = 1 @@ -3302,13 +3197,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "ahl" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "ahm" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -3325,16 +3220,11 @@ dir = 8 }, /obj/structure/table/reinforced, -/obj/item/storage/box/disks_nanite{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/storage/box/disks_nanite{ - pixel_x = 4; - pixel_y = 2 +/obj/machinery/cell_charger{ + pixel_y = 5 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "ahn" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -3355,7 +3245,7 @@ pixel_x = 24 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aho" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/delivery, @@ -3386,7 +3276,6 @@ }, /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/science/storage"; - dir = 2; name = "Toxins Storage APC"; pixel_y = -25 }, @@ -3410,7 +3299,6 @@ /area/maintenance/fore/secondary) "aht" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -3438,7 +3326,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -3489,7 +3376,6 @@ /obj/item/radio/intercom{ desc = "In Space, no one can hear you scream, especially if the microphone has been disabled."; name = "Prison Intercom"; - pixel_x = 0; pixel_y = -32; prison_radio = 1 }, @@ -3508,7 +3394,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -3606,7 +3491,6 @@ /area/security/processing) "ahN" = ( /obj/machinery/computer/shuttle/labor{ - icon_state = "computer"; dir = 8 }, /obj/structure/cable{ @@ -3643,7 +3527,6 @@ dir = 10 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -3657,14 +3540,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"ahU" = ( -/obj/structure/disposaloutlet{ - icon_state = "outlet"; - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/engine, -/area/science/xenobiology) "ahV" = ( /turf/closed/wall, /area/science/xenobiology) @@ -3674,9 +3549,8 @@ /area/science/xenobiology) "ahX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - name = "euthanization chamber freezer"; - icon_state = "freezer_1"; - dir = 4 + dir = 4; + name = "euthanization chamber freezer" }, /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -3729,8 +3603,9 @@ /area/science/xenobiology) "aid" = ( /obj/machinery/airalarm/directional/north, +/obj/machinery/vending/assist, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aie" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3744,29 +3619,30 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "aif" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "aig" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aih" = ( /obj/structure/chair/office/light, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aii" = ( /obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/loading_area, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aij" = ( /obj/machinery/door/airlock/research{ name = "Toxins Secure Storage"; @@ -3879,7 +3755,6 @@ /area/maintenance/fore/secondary) "ait" = ( /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -4143,7 +4018,6 @@ /turf/open/floor/plating, /area/science/xenobiology) "aiY" = ( -/obj/machinery/computer/nanite_cloud_controller, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/neutral{ @@ -4156,8 +4030,17 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/closet/crate, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/alien, +/obj/item/target/alien, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aiZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -4169,23 +4052,22 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "aja" = ( /obj/machinery/firealarm{ dir = 1; pixel_y = -24 }, /turf/open/floor/plasteel, -/area/science/nanite) +/area/science/circuit) "ajb" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/machinery/disposal/bin, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "ajc" = ( -/obj/machinery/nanite_programmer, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -4198,13 +4080,14 @@ dir = 8 }, /obj/machinery/light, +/obj/structure/table, +/obj/item/screwdriver, +/obj/item/multitool, +/obj/item/pen, +/obj/item/paper_bin, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "ajd" = ( -/obj/machinery/computer/nanite_chamber_control{ - icon_state = "computer"; - dir = 1 - }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -4216,10 +4099,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/table, +/obj/item/integrated_circuit_printer, +/obj/item/integrated_electronics/analyzer, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aje" = ( -/obj/machinery/nanite_chamber, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -4230,8 +4115,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/table, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/item/integrated_electronics/wirer, +/obj/item/integrated_electronics/debugger, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "ajf" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -4240,9 +4130,9 @@ dir = 4 }, /obj/machinery/power/apc{ + areastring = "/area/science/mixing"; dir = 8; name = "Toxins Lab APC"; - areastring = "/area/science/mixing"; pixel_x = -26; pixel_y = 3 }, @@ -4326,7 +4216,6 @@ }, /obj/machinery/camera{ c_tag = "Toxins - Lab"; - dir = 2; network = list("ss13","rd") }, /obj/effect/turf_decal/delivery, @@ -4496,7 +4385,6 @@ department = "Robotics"; departmentType = 2; name = "Robotics RC"; - pixel_x = 0; pixel_y = 31; receive_ore_updates = 1 }, @@ -4506,8 +4394,6 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/mecha_part_fabricator, /obj/item/radio/intercom{ - dir = 2; - pixel_x = 0; pixel_y = 28 }, /turf/open/floor/plasteel, @@ -4583,7 +4469,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -4613,7 +4498,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -4655,7 +4539,6 @@ name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_y = 25; - req_access_txt = "0"; specialfunctions = 4 }, /obj/structure/chair, @@ -4670,7 +4553,6 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_y = 24; prison_radio = 1 @@ -4690,7 +4572,6 @@ name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_y = 25; - req_access_txt = "0"; specialfunctions = 4 }, /obj/structure/chair, @@ -4720,9 +4601,7 @@ }, /obj/machinery/meter, /obj/machinery/door/window/westleft{ - base_state = "left"; dir = 4; - icon_state = "left"; name = "gas ports" }, /obj/effect/turf_decal/tile/neutral{ @@ -4742,7 +4621,6 @@ /area/security/execution/education) "ajT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -4754,10 +4632,8 @@ /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; dir = 8; - icon_state = "sink_alt"; name = "old sink"; - pixel_x = 15; - pixel_y = 0 + pixel_x = 15 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -4856,7 +4732,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -4921,7 +4796,6 @@ /area/science/xenobiology) "akj" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - icon_state = "manifoldlayer"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -4959,9 +4833,6 @@ }, /turf/open/floor/circuit, /area/science/xenobiology) -"akp" = ( -/turf/closed/wall, -/area/science/nanite) "akq" = ( /obj/structure/cable{ icon_state = "1-2" @@ -4984,13 +4855,12 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, -/area/science/nanite) +/area/science/circuit) "akr" = ( /turf/closed/wall, /area/science/misc_lab/range) "aks" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/item/radio/intercom{ @@ -5078,7 +4948,6 @@ /area/science/mixing) "akA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -5130,7 +4999,6 @@ /obj/item/storage/box/monkeycubes, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -5159,7 +5027,6 @@ }, /obj/item/reagent_containers/dropper, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/ai{ @@ -5181,16 +5048,6 @@ }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) -"akL" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) "akM" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -5203,7 +5060,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -5281,7 +5137,6 @@ "akU" = ( /obj/machinery/power/apc{ areastring = "/area/security/execution/education"; - dir = 2; name = "Prisoner Education Chamber APC"; pixel_y = -24 }, @@ -5333,14 +5188,12 @@ "ala" = ( /obj/effect/turf_decal/stripes/corner, /obj/machinery/computer/security/labor{ - icon_state = "computer"; dir = 1 }, /obj/effect/turf_decal/tile/red, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -5590,12 +5443,10 @@ pixel_x = -4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ c_tag = "Xenobiology Lab - Fore"; - dir = 2; network = list("ss13","rd") }, /turf/open/floor/plasteel/white, @@ -5646,7 +5497,6 @@ receive_ore_updates = 1 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -5660,29 +5510,10 @@ }, /turf/open/floor/circuit, /area/science/xenobiology) -"alB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"alC" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) "alD" = ( /obj/structure/bodycontainer/morgue, /obj/structure/window/reinforced, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -5792,7 +5623,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -5836,7 +5666,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -5857,7 +5686,6 @@ /area/science/robotics/lab) "alY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -5947,7 +5775,6 @@ "amf" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -6019,9 +5846,7 @@ dir = 8 }, /obj/item/radio/intercom{ - dir = 2; - pixel_x = -29; - pixel_y = 0 + pixel_x = -29 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -6104,7 +5929,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -6120,7 +5944,6 @@ pixel_y = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -6130,7 +5953,6 @@ /obj/structure/table, /obj/item/stack/cable_coil/random, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -6139,7 +5961,6 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/mecha_part_fabricator, /obj/effect/turf_decal/trimline/white/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -6256,7 +6077,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -6412,8 +6232,7 @@ pixel_y = -3 }, /obj/machinery/camera/motion{ - c_tag = "Armory Motion Sensor"; - dir = 2 + c_tag = "Armory Motion Sensor" }, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -6486,8 +6305,7 @@ pixel_y = 1 }, /obj/item/grenade/barrier{ - pixel_x = 6; - pixel_y = 0 + pixel_x = 6 }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -6721,7 +6539,6 @@ /area/science/robotics/lab) "anE" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -6832,7 +6649,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -6871,7 +6687,6 @@ /area/science/robotics/lab) "anU" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -6879,7 +6694,6 @@ "anV" = ( /obj/machinery/turnstile{ dir = 1; - icon_state = "turnstile_map"; name = "Genpop Exit Turnstile"; req_access_txt = "70" }, @@ -6901,7 +6715,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -6930,7 +6743,6 @@ /area/security/prison) "anY" = ( /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -6953,7 +6765,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -6980,7 +6791,7 @@ }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "aob" = ( /obj/structure/cable{ icon_state = "2-4" @@ -7261,7 +7072,6 @@ /area/security/armory) "aoo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -7384,7 +7194,6 @@ /area/science/xenobiology) "aoy" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/status_display/ai{ @@ -7403,7 +7212,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -7459,7 +7267,6 @@ "aoE" = ( /obj/machinery/processor/slime, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/stripes/corner{ @@ -7469,7 +7276,6 @@ /area/science/xenobiology) "aoF" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -7498,7 +7304,6 @@ /area/science/xenobiology) "aoI" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/stripes/line{ @@ -7569,7 +7374,6 @@ idDoor = "xeno_airlock_exterior"; idSelf = "xeno_airlock_control"; name = "Access Button"; - pixel_x = 0; pixel_y = 25 }, /obj/machinery/door/firedoor, @@ -7642,13 +7446,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/research) -"aoQ" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "aoR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7659,7 +7456,6 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -7679,7 +7475,6 @@ /area/maintenance/fore) "aoU" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -7726,11 +7521,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -7788,7 +7581,6 @@ /area/security/prison) "api" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -7837,6 +7629,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/prison) "apo" = ( @@ -7888,7 +7683,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -7954,7 +7748,6 @@ /area/security/prison) "apu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -8016,7 +7809,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -8030,14 +7822,12 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, /area/security/prison) "apB" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, @@ -8124,7 +7914,6 @@ icon_state = "secbot1"; idcheck = 1; name = "Sergeant-at-Armsky"; - on = 1; weaponscheck = 1 }, /turf/open/floor/plasteel/dark, @@ -8176,7 +7965,6 @@ /area/science/xenobiology) "apK" = ( /obj/structure/disposaloutlet{ - icon_state = "outlet"; dir = 8 }, /obj/structure/disposalpipe/trunk{ @@ -8285,7 +8073,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -8300,11 +8087,9 @@ areastring = "/area/science/xenobiology"; dir = 4; name = "Xenobiology APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -8369,11 +8154,9 @@ /area/science/misc_lab/range) "aqe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -8446,7 +8229,6 @@ /area/science/robotics/lab) "aqm" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -8477,7 +8259,6 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -8520,7 +8301,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -8549,7 +8329,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/white/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -8574,16 +8353,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aqx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "aqy" = ( /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, @@ -8604,7 +8373,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -8731,7 +8499,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -8742,7 +8509,6 @@ "aqN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/camera/autoname{ @@ -9013,7 +8779,6 @@ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -9047,14 +8812,12 @@ pixel_x = 32 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, /area/science/research) "ark" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -9071,7 +8834,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -9091,7 +8853,6 @@ /area/science/mixing) "arq" = ( /obj/machinery/sparker/toxmix{ - dir = 2; pixel_x = 25 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -9169,7 +8930,6 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/stack/sheet/glass/fifty, /obj/effect/turf_decal/trimline/white/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -9270,24 +9030,20 @@ "arF" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, /area/security/prison) "arG" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -9496,7 +9252,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel/dark, @@ -9527,7 +9282,6 @@ "arW" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -10080,7 +9834,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -10109,19 +9862,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/research) -"asQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "asR" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -10150,7 +9890,6 @@ /area/science/misc_lab/range) "asS" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -10178,7 +9917,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -10196,9 +9934,7 @@ /turf/open/floor/engine, /area/science/mixing) "asY" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix, /obj/effect/landmark/blobstart, /turf/open/floor/engine, /area/science/mixing) @@ -10215,7 +9951,6 @@ /area/science/mixing) "atb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -10370,7 +10105,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -10447,7 +10181,6 @@ /area/security/armory) "aty" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -10488,7 +10221,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -10519,7 +10251,6 @@ dir = 10 }, /obj/machinery/computer/camera_advanced/xenobio{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel, @@ -10552,7 +10283,6 @@ dir = 6 }, /obj/machinery/computer/camera_advanced/xenobio{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel, @@ -10585,14 +10315,6 @@ "atH" = ( /turf/closed/wall/r_wall, /area/science/server) -"atI" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) "atJ" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -10633,14 +10355,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/security/prison) "atM" = ( /obj/machinery/sparker/toxmix{ - dir = 2; pixel_x = 25 }, /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{ @@ -10771,14 +10491,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/security/prison) "atW" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -10789,7 +10507,6 @@ sortType = 14 }, /obj/effect/turf_decal/trimline/white/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -10797,9 +10514,9 @@ "atY" = ( /obj/effect/turf_decal/bot, /obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/science/robotics/mechbay"; dir = 1; name = "Mech Bay APC"; - areastring = "/area/science/robotics/mechbay"; pixel_y = 28 }, /obj/structure/cable{ @@ -10832,7 +10549,6 @@ /area/science/robotics/mechbay) "auc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/light_switch{ @@ -10873,7 +10589,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -10928,11 +10643,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -11043,21 +10756,10 @@ "aut" = ( /obj/item/radio/intercom{ name = "Station Intercom"; - pixel_x = 0; pixel_y = 26 }, /turf/open/floor/plasteel, -/area/science/nanite) -"auu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/area/science/circuit) "auv" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -11256,7 +10958,6 @@ /area/science/server) "auM" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - icon_state = "manifoldlayer"; dir = 4 }, /turf/open/floor/plating/asteroid/airless, @@ -11265,16 +10966,6 @@ /obj/structure/table, /turf/open/floor/plasteel/dark, /area/science/server) -"auO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) "auP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -11345,7 +11036,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel/white, @@ -11395,7 +11085,6 @@ /area/science/robotics/mechbay) "ava" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -11422,7 +11111,6 @@ /area/hallway/primary/fore) "avc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner, @@ -11448,7 +11136,6 @@ pixel_y = 3 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/item/paper/guides/jobs/security/range{ @@ -11481,7 +11168,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -11554,7 +11240,6 @@ icon_state = "0-8" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/rack, @@ -11562,8 +11247,7 @@ areastring = "/area/science/misc_lab/range"; dir = 4; name = "Research Firing Range APC"; - pixel_x = 28; - pixel_y = 0 + pixel_x = 28 }, /obj/item/target, /obj/item/target, @@ -11624,7 +11308,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -11748,7 +11431,6 @@ "avB" = ( /obj/machinery/camera{ c_tag = "Server Room"; - dir = 2; network = list("ss13","rd"); pixel_x = 22 }, @@ -11771,7 +11453,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -11814,11 +11495,9 @@ dir = 4 }, /obj/machinery/status_display/ai{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -11826,19 +11505,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"avH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "avI" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -11868,11 +11534,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -11888,7 +11552,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -11899,7 +11562,6 @@ pixel_y = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/light_switch{ @@ -11908,41 +11570,27 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"avM" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "avN" = ( /obj/machinery/light{ dir = 8; light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/science/research) "avO" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/science/research) "avP" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -12256,7 +11904,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/disposalpipe/segment{ @@ -12274,7 +11921,6 @@ /area/science/server) "aws" = ( /obj/machinery/computer/rdservercontrol{ - icon_state = "computer"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -12283,7 +11929,6 @@ /obj/structure/cable, /obj/machinery/power/apc{ areastring = "/area/science/server"; - dir = 2; name = "Server Room APC"; pixel_y = -23 }, @@ -12295,7 +11940,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -12688,7 +12332,6 @@ /area/science/robotics/mechbay) "awP" = ( /obj/effect/turf_decal/trimline/white/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -12736,7 +12379,6 @@ }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 8 }, /turf/open/floor/plasteel, @@ -12748,7 +12390,6 @@ }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/red/line{ - icon_state = "warningline_red"; dir = 1 }, /obj/effect/turf_decal/arrows/red, @@ -12766,7 +12407,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 4 }, /turf/open/floor/plasteel, @@ -12778,8 +12418,7 @@ }, /obj/item/reagent_containers/syringe, /obj/machinery/newscaster{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/open/floor/plasteel/freezer, /area/security/prison) @@ -12838,7 +12477,6 @@ }, /obj/machinery/turnstile{ dir = 1; - icon_state = "turnstile_map"; name = "Genpop Exit Turnstile"; req_access_txt = "70" }, @@ -12905,7 +12543,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -12943,9 +12580,9 @@ dir = 8 }, /obj/machinery/power/apc{ + areastring = "/area/security/warden"; dir = 4; name = "Warden's Office APC"; - areastring = "/area/security/warden"; pixel_x = 26 }, /obj/structure/cable{ @@ -12954,7 +12591,6 @@ /obj/machinery/requests_console{ department = "Security"; name = "Security RC"; - pixel_x = 0; pixel_y = -32 }, /turf/open/floor/plasteel, @@ -12977,7 +12613,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -12997,7 +12632,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -13052,11 +12686,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -13076,11 +12708,9 @@ /area/science/research) "axo" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -13088,20 +12718,6 @@ "axp" = ( /turf/open/floor/circuit/green, /area/science/robotics/mechbay) -"axq" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "axr" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -13182,7 +12798,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 1 }, /turf/open/floor/plasteel, @@ -13201,7 +12816,6 @@ /obj/structure/bed, /obj/machinery/flasher{ id = "insaneflash"; - pixel_x = 0; pixel_y = -26 }, /turf/open/floor/plasteel/freezer, @@ -13230,7 +12844,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -13240,7 +12853,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/button/door{ @@ -13252,22 +12864,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"axE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "axF" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/hos) @@ -13291,7 +12887,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -13306,7 +12901,6 @@ layer = 2.9 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel/dark, @@ -13322,14 +12916,12 @@ pixel_y = -32 }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -13409,11 +13001,9 @@ /area/crew_quarters/heads/hor) "axS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -13462,7 +13052,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -13492,7 +13081,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -13578,9 +13166,9 @@ "ayd" = ( /obj/effect/turf_decal/tile/red, /obj/machinery/power/apc{ + areastring = "/area/security/range"; dir = 4; name = "Shooting Range APC"; - areastring = "/area/security/range"; pixel_x = 24 }, /obj/structure/cable{ @@ -13674,7 +13262,6 @@ }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /obj/structure/cable{ @@ -13696,7 +13283,6 @@ areastring = "/area/crew_quarters/heads/hos"; dir = 1; name = "Head of Security's Office APC"; - pixel_x = 0; pixel_y = 25 }, /obj/structure/cable{ @@ -13712,7 +13298,6 @@ }, /obj/machinery/recharger, /obj/structure/reagent_dispensers/peppertank{ - pixel_x = 0; pixel_y = 30 }, /turf/open/floor/plasteel/dark, @@ -13752,8 +13337,7 @@ "ayq" = ( /obj/structure/bed, /obj/machinery/camera{ - c_tag = "Security - Head of Security's Quarters"; - dir = 2 + c_tag = "Security - Head of Security's Quarters" }, /obj/item/bedsheet/hos, /obj/machinery/status_display{ @@ -13778,11 +13362,9 @@ /obj/machinery/button/door{ id = "hosspace"; name = "Space Shutters Control"; - pixel_x = 25; - pixel_y = 0 + pixel_x = 25 }, /obj/machinery/status_display/evac{ - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/plasteel/dark, @@ -13792,14 +13374,12 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "ayu" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - icon_state = "manifoldlayer"; dir = 4 }, /turf/open/floor/plating, @@ -13881,7 +13461,6 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/research{ - id_tag = null; name = "Break Room"; req_one_access_txt = "47" }, @@ -13911,7 +13490,6 @@ /obj/machinery/computer/security/research, /obj/machinery/camera{ c_tag = "Research Director's Office Fore"; - dir = 2; name = "science camera"; network = list("ss13","rd") }, @@ -13963,11 +13541,9 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -13990,7 +13566,6 @@ /area/science/research) "ayR" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -14066,7 +13641,6 @@ /area/security/range) "ayZ" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ - icon_state = "inje_map-2"; dir = 4 }, /turf/open/floor/plating, @@ -14178,14 +13752,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/research) -"azk" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "azl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -14262,7 +13828,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -14532,7 +14097,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -14563,7 +14127,6 @@ "azS" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -14613,7 +14176,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -14865,9 +14427,9 @@ /area/security/brig) "aAo" = ( /obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/science/research"; dir = 1; name = "Research Division APC"; - areastring = "/area/science/research"; pixel_y = 25 }, /obj/structure/cable{ @@ -15000,7 +14562,6 @@ /area/crew_quarters/heads/hos) "aAy" = ( /obj/machinery/computer/prisoner{ - icon_state = "computer"; dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -15047,7 +14608,6 @@ /area/security/checkpoint/science) "aAB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -15061,7 +14621,6 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -15169,7 +14728,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -15226,7 +14784,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -15234,11 +14791,9 @@ /area/science/research) "aAV" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -15317,17 +14872,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aBe" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aBf" = ( /obj/machinery/computer/secure_data, /turf/open/floor/carpet, @@ -15378,26 +14922,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/security/brig) -"aBm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aBn" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -15416,29 +14945,10 @@ dir = 10 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, /area/science/research) -"aBp" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/robotics/mechbay) -"aBq" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aBr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -15454,7 +14964,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -15465,13 +14974,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"aBs" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "aBt" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -15499,7 +15001,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -15509,7 +15010,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -15541,7 +15041,6 @@ /area/crew_quarters/heads/hos) "aBz" = ( /obj/machinery/computer/security/hos{ - icon_state = "computer"; dir = 8 }, /obj/structure/cable{ @@ -15582,9 +15081,8 @@ /area/security/checkpoint/science) "aBC" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Science Security APC"; areastring = "/area/security/checkpoint/science"; + name = "Science Security APC"; pixel_y = -24 }, /obj/structure/cable, @@ -15653,17 +15151,14 @@ "aBH" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -15691,8 +15186,6 @@ }, /obj/structure/chair/stool, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29 }, @@ -15706,9 +15199,8 @@ icon_state = "4-8" }, /obj/machinery/power/apc{ - dir = 2; - name = "RD Office APC"; areastring = "/area/crew_quarters/heads/hor"; + name = "RD Office APC"; pixel_y = -27 }, /obj/structure/cable{ @@ -15732,7 +15224,6 @@ /area/crew_quarters/heads/hor) "aBO" = ( /obj/item/storage/secure/safe{ - pixel_x = 0; pixel_y = -32 }, /obj/structure/table, @@ -15749,7 +15240,6 @@ /area/crew_quarters/heads/hor) "aBP" = ( /obj/machinery/computer/aifixer{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel/cafeteria, @@ -15773,7 +15263,6 @@ /area/crew_quarters/heads/hor) "aBS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -15801,7 +15290,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -15830,14 +15318,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) -"aBZ" = ( -/obj/machinery/light, -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "aCa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ @@ -15862,7 +15342,6 @@ "aCb" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -15873,9 +15352,9 @@ /area/maintenance/fore/secondary) "aCd" = ( /obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; dir = 8; name = "Detective APC"; - areastring = "/area/security/detectives_office"; pixel_x = -24 }, /obj/structure/cable{ @@ -15930,7 +15409,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/camera{ c_tag = "Science Hallway Fore"; - dir = 2; name = "science camera"; network = list("ss13","rd") }, @@ -15966,7 +15444,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -16153,7 +15630,6 @@ }, /obj/structure/noticeboard{ dir = 1; - icon_state = "nboard00"; pixel_y = -30 }, /turf/open/floor/plasteel/white, @@ -16206,7 +15682,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -16467,8 +15942,7 @@ /obj/item/bedsheet/medical, /obj/machinery/iv_drip, /obj/structure/sign/poster/official/cleanliness{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/open/floor/plasteel/white, /area/security/brig) @@ -16599,22 +16073,14 @@ pixel_y = -1 }, /obj/item/reagent_containers/dropper, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ pixel_x = -2; pixel_y = 6 }, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/mesh, /obj/item/healthanalyzer, /turf/open/floor/plasteel/white, /area/science/explab) -"aDq" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "aDr" = ( /turf/closed/wall/r_wall, /area/science/explab) @@ -16625,11 +16091,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/status_display/evac{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -16643,32 +16107,26 @@ }, /obj/structure/chair/stool, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, /area/science/research) "aDu" = ( /obj/machinery/button/door{ - dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 26; pixel_y = 6; req_one_access_txt = "29" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/science/robotics/mechbay) "aDv" = ( /obj/machinery/button/door{ - dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = -26; @@ -16679,11 +16137,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -16713,11 +16169,9 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -16788,14 +16242,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -16863,7 +16315,6 @@ /area/security/brig) "aDN" = ( /obj/machinery/turnstile{ - icon_state = "turnstile_map"; dir = 4 }, /obj/machinery/door/firedoor, @@ -16890,11 +16341,9 @@ dir = 4 }, /obj/machinery/status_display/evac{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -16911,7 +16360,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner, @@ -17066,11 +16514,9 @@ "aEf" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel, @@ -17096,11 +16542,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -17120,16 +16564,15 @@ dir = 8 }, /obj/machinery/power/apc{ + areastring = "/area/hallway/primary/fore"; dir = 8; name = "Fore Primary Hallway APC"; - areastring = "/area/hallway/primary/fore"; pixel_x = -24 }, /obj/structure/cable{ icon_state = "0-4" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -17277,7 +16720,6 @@ }, /obj/effect/turf_decal/tile/purple, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -17334,7 +16776,6 @@ dir = 9 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/grimy, @@ -17450,7 +16891,6 @@ dir = 4 }, /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 8 }, /turf/open/floor/plasteel, @@ -17463,7 +16903,6 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -17578,7 +17017,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -17688,9 +17126,8 @@ /area/science/explab) "aFe" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Experimentation Lab APC"; areastring = "/area/science/explab"; + name = "Experimentation Lab APC"; pixel_y = -24 }, /obj/structure/cable, @@ -17709,9 +17146,9 @@ dir = 1 }, /obj/machinery/power/apc{ + areastring = "/area/security/brig"; dir = 1; name = "Brig APC"; - areastring = "/area/security/brig"; pixel_y = 24 }, /obj/structure/cable{ @@ -17748,7 +17185,6 @@ /area/science/lab) "aFk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -17769,7 +17205,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -17853,7 +17288,6 @@ /area/security/brig) "aFv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -17961,14 +17395,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/office) -"aFH" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aFI" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -17993,22 +17419,13 @@ "aFL" = ( /turf/open/floor/plating/asteroid/basalt, /area/asteroid/nearstation) -"aFM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 10 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aFN" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel/white, @@ -18038,7 +17455,6 @@ "aFR" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -18055,7 +17471,6 @@ /area/science/research) "aFT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/grimy, @@ -18102,11 +17517,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -18139,12 +17552,10 @@ /area/hallway/primary/fore) "aFZ" = ( /obj/structure/chair/sofa{ - icon_state = "sofamiddle"; dir = 8 }, /obj/machinery/status_display/evac{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/open/floor/plasteel/grimy, /area/hallway/primary/fore) @@ -18330,11 +17741,9 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -18453,11 +17862,9 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -18468,7 +17875,6 @@ }, /obj/effect/landmark/start/security_officer, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -18556,7 +17962,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -18610,7 +18015,6 @@ light_color = "#c1caff" }, /obj/structure/chair/sofa{ - icon_state = "sofamiddle"; dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -18746,7 +18150,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -18925,11 +18328,9 @@ "aHr" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -18941,11 +18342,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -18967,14 +18366,12 @@ /area/science/lab) "aHu" = ( /obj/structure/chair/sofa/left{ - icon_state = "sofaend_left"; dir = 1 }, /turf/open/floor/plasteel/grimy, /area/hallway/primary/fore) "aHv" = ( /obj/structure/chair/sofa/corner{ - icon_state = "sofacorner"; dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -18982,9 +18379,9 @@ "aHw" = ( /obj/structure/table, /obj/machinery/power/apc{ + areastring = "/area/storage/art"; dir = 8; name = "Art Storage APC"; - areastring = "/area/storage/art"; pixel_x = -25 }, /obj/item/paper_bin, @@ -19017,60 +18414,28 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aHB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, /area/security/brig) -"aHC" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aHD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, /area/security/brig) -"aHE" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aHF" = ( /obj/structure/chair{ name = "Judge" }, /turf/open/floor/plasteel, /area/security/courtroom) -"aHG" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aHH" = ( /obj/structure/cable{ icon_state = "4-8" @@ -19122,7 +18487,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -19131,7 +18495,6 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -19148,7 +18511,6 @@ light_color = "#e8eaff" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -19187,14 +18549,13 @@ /area/security/courtroom) "aHS" = ( /obj/docking_port/stationary{ - name = "mining shuttle bay"; - icon_state = "pinonalert"; - dir = 1; - id = "mining_home"; - width = 7; - height = 5; dwidth = 3; - roundstart_template = /datum/map_template/shuttle/mining/box + height = 5; + icon_state = "pinonalert"; + id = "mining_home"; + name = "mining shuttle bay"; + roundstart_template = /datum/map_template/shuttle/mining/box; + width = 7 }, /turf/open/space, /area/space) @@ -19211,7 +18572,6 @@ /area/hallway/primary/fore) "aHW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -19248,7 +18608,6 @@ /area/hallway/primary/fore) "aIc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -19359,7 +18718,6 @@ }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 4 }, /turf/open/floor/plasteel, @@ -19664,11 +19022,9 @@ dir = 4 }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/tile/red{ @@ -19686,9 +19042,9 @@ /area/security/brig) "aIy" = ( /obj/machinery/power/apc{ + areastring = "/area/lawoffice"; dir = 1; name = "Law Office APC"; - areastring = "/area/lawoffice"; pixel_y = 24 }, /obj/structure/cable{ @@ -19784,7 +19140,6 @@ icon_state = "2-4" }, /obj/effect/turf_decal/stripes/red/line{ - icon_state = "warningline_red"; dir = 1 }, /obj/effect/turf_decal/arrows/red, @@ -19815,7 +19170,6 @@ /area/crew_quarters/heads/hor) "aIK" = ( /obj/docking_port/stationary{ - dir = 1; dwidth = 5; height = 7; id = "supply_home"; @@ -19881,7 +19235,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -19908,22 +19261,11 @@ }, /turf/open/floor/plasteel, /area/storage/art) -"aIT" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aIU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -19931,7 +19273,6 @@ "aIV" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -19941,7 +19282,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -19992,7 +19332,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -20026,11 +19365,9 @@ dir = 4 }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/effect/turf_decal/tile/red{ @@ -20040,7 +19377,6 @@ /area/security/brig) "aJe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -20048,7 +19384,6 @@ "aJf" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -20063,7 +19398,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -20085,7 +19419,6 @@ /area/lawoffice) "aJj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -20093,8 +19426,7 @@ "aJk" = ( /obj/machinery/requests_console{ department = "Law office"; - pixel_x = 31; - pixel_y = 0 + pixel_x = 31 }, /turf/open/floor/plasteel/grimy, /area/lawoffice) @@ -20160,7 +19492,6 @@ /area/security/courtroom) "aJr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -20179,18 +19510,6 @@ /obj/structure/sign/warning/vacuum/external, /turf/closed/wall/r_wall, /area/quartermaster/storage) -"aJu" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/obj/machinery/door/poddoor{ - density = 1; - id = "QMLoaddoor"; - name = "Supply Dock Loading Door" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "aJv" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -20204,17 +19523,6 @@ /obj/structure/sign/warning/vacuum/external, /turf/open/floor/plating, /area/quartermaster/storage) -"aJx" = ( -/obj/machinery/door/poddoor{ - density = 1; - id = "QMLoaddoor2"; - name = "Supply Dock Loading Door" - }, -/obj/machinery/conveyor{ - id = "QMLoad2" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "aJy" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20277,7 +19585,6 @@ /area/hallway/primary/fore) "aJG" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -20303,7 +19610,6 @@ /area/hallway/primary/fore) "aJI" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -20321,7 +19627,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -20364,17 +19669,6 @@ /obj/item/storage/box/lights, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aJO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aJP" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -20385,11 +19679,9 @@ "aJQ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/camera{ @@ -20409,7 +19701,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner, @@ -20465,7 +19756,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -20512,7 +19802,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -20551,7 +19840,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -20666,11 +19954,9 @@ /area/maintenance/fore) "aKu" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -20703,7 +19989,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -20711,7 +19996,6 @@ "aKx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -20719,11 +20003,9 @@ /area/hallway/primary/fore) "aKy" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -20742,15 +20024,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -20767,7 +20046,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -20777,7 +20055,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -20787,7 +20064,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -20800,11 +20076,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/corner{ - icon_state = "trimline_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -20817,11 +20091,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -20841,15 +20113,12 @@ icon_state = "1-4" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/corner{ - icon_state = "trimline_corner"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -20868,40 +20137,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"aKH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/floor/plasteel, @@ -20918,7 +20156,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -20935,7 +20172,6 @@ /area/hallway/primary/fore) "aKJ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -20955,11 +20191,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -21012,21 +20246,12 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) -"aKP" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/brig) "aKQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/tile/red{ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/red, @@ -21062,7 +20287,6 @@ /area/security/brig) "aKU" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ @@ -21111,7 +20335,6 @@ pixel_y = -32 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/red, @@ -21153,7 +20376,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -21254,30 +20476,27 @@ "aLn" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/tile/purple, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aLo" = ( /obj/machinery/power/apc{ + areastring = "/area/quartermaster/miningoffice"; dir = 1; name = "Mining APC"; - areastring = "/area/quartermaster/miningoffice"; pixel_y = 24 }, /obj/structure/cable{ icon_state = "0-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/item/radio/intercom{ @@ -21319,11 +20538,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -21345,7 +20562,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -21370,7 +20586,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -21393,7 +20608,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/navbeacon{ @@ -21550,7 +20764,6 @@ /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 8 }, /turf/open/floor/plasteel, @@ -21562,7 +20775,6 @@ }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/red/line{ - icon_state = "warningline_red"; dir = 1 }, /obj/effect/turf_decal/arrows/red, @@ -21576,7 +20788,6 @@ /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 4 }, /turf/open/floor/plasteel, @@ -21590,7 +20801,6 @@ }, /obj/machinery/door/window/westleft{ base_state = "right"; - dir = 8; icon_state = "right"; name = "Outer Window" }, @@ -21734,7 +20944,6 @@ req_access_txt = "31" }, /obj/machinery/button/door{ - dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; @@ -21743,14 +20952,12 @@ req_access_txt = "31" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aLZ" = ( /obj/machinery/conveyor/inverted{ - icon_state = "conveyor_map_inverted"; dir = 9; id = "QMLoad2" }, @@ -21777,7 +20984,6 @@ "aMc" = ( /obj/machinery/conveyor{ dir = 6; - icon_state = "conveyor_map"; id = "QMLoad2" }, /turf/open/floor/plating, @@ -21855,7 +21061,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -21920,14 +21125,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/security/brig) "aMr" = ( /obj/machinery/atmospherics/components/unary/portables_connector/layer1{ - icon_state = "connector_map-1"; dir = 8 }, /turf/open/floor/plating, @@ -21938,7 +21141,6 @@ }, /obj/machinery/computer/security/telescreen/interrogation{ dir = 4; - icon_state = "telescreen"; layer = 4; pixel_x = -28 }, @@ -21954,14 +21156,12 @@ }, /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_x = -25; pixel_y = -2; prison_radio = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -21975,20 +21175,9 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"aMw" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) "aMx" = ( /obj/item/radio/intercom{ desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; name = "Prison Intercom (General)"; pixel_x = -25; pixel_y = -2; @@ -21998,22 +21187,10 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, /area/security/brig) -"aMy" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/brig) "aMz" = ( /obj/effect/turf_decal/tile/red, /obj/structure/disposalpipe/segment, @@ -22026,9 +21203,6 @@ icon_state = "1-2" }, /obj/machinery/door/window/westleft{ - base_state = "left"; - dir = 8; - icon_state = "left"; name = "Outer Window" }, /obj/machinery/door/window/brigdoor{ @@ -22102,14 +21276,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/light_switch{ - pixel_x = -28; - pixel_y = 0 + pixel_x = -28 }, /turf/open/floor/plasteel/grimy, /area/lawoffice) "aME" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -22126,9 +21298,8 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 2; - name = "Courtroom APC"; areastring = "/area/security/courtroom"; + name = "Courtroom APC"; pixel_x = 1; pixel_y = -24 }, @@ -22198,7 +21369,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -22252,7 +21422,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -22264,7 +21433,6 @@ pixel_x = -32 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -22323,34 +21491,24 @@ /area/quartermaster/storage) "aMX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aMY" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/structure/rack, /obj/item/flashlight/seclite, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) -"aMZ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningoffice) "aNa" = ( /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "aNb" = ( /obj/machinery/computer/shuttle/mining, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -22358,7 +21516,6 @@ "aNc" = ( /obj/machinery/computer/security/mining, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -22377,7 +21534,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/door/airlock/security/glass{ @@ -22459,11 +21615,9 @@ "aNn" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/machinery/light{ @@ -22576,8 +21730,7 @@ "aNy" = ( /obj/structure/filingcabinet/chestdrawer, /obj/structure/sign/poster/official/enlist{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/neutral{ @@ -22695,24 +21848,20 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aNK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -22726,11 +21875,9 @@ areastring = "/area/quartermaster/qm"; dir = 8; name = "Quartermaster's Office APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -22874,7 +22021,6 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -22897,7 +22043,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -22923,7 +22068,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -22977,11 +22121,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/structure/cable{ @@ -22989,35 +22131,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"aOn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aOo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -23025,9 +22138,9 @@ dir = 5 }, /obj/machinery/power/apc{ + areastring = "/area/science/lab"; dir = 8; name = "Research and Development Lab APC"; - areastring = "/area/science/lab"; pixel_x = -26; pixel_y = 3 }, @@ -23035,7 +22148,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -23189,8 +22301,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/door/airlock/grunge{ - name = "Courtroom"; - opacity = 1 + name = "Courtroom" }, /turf/open/floor/plasteel/dark, /area/security/courtroom) @@ -23205,7 +22316,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23230,7 +22340,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -23244,7 +22353,6 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23303,7 +22411,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -23314,7 +22421,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23327,7 +22433,6 @@ /area/quartermaster/miningoffice) "aOP" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -23436,7 +22541,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -23450,14 +22554,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/science/lab) "aPe" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/light{ @@ -23478,14 +22580,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aPh" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -23506,7 +22606,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23533,7 +22632,6 @@ /area/security/brig) "aPl" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -23541,7 +22639,6 @@ "aPm" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -23556,7 +22653,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -23615,7 +22711,6 @@ /area/quartermaster/qm) "aPt" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23649,7 +22744,6 @@ "aPv" = ( /obj/effect/landmark/start/shaft_miner, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -23660,7 +22754,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23676,7 +22769,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -23693,7 +22785,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -23710,7 +22801,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -23721,7 +22811,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -23729,7 +22818,6 @@ "aPF" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -23783,23 +22871,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) -"aPN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 4; - pixel_x = 27 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aPO" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/radio/intercom{ @@ -23866,7 +22937,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -23875,7 +22945,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple, @@ -24239,7 +23308,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/navbeacon{ @@ -24280,7 +23348,6 @@ pixel_x = -5 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -24290,7 +23357,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -24388,11 +23454,9 @@ /area/crew_quarters/heads/captain/private) "aQG" = ( /obj/structure/chair/sofa{ - icon_state = "sofamiddle"; dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /obj/item/radio/intercom{ @@ -24406,14 +23470,11 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/closet/l3closet/scientist{ - pixel_x = -2 - }, +/obj/structure/closet/l3closet/scientist, /turf/open/floor/plasteel/white, /area/science/explab) "aQI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -24421,7 +23482,6 @@ "aQJ" = ( /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/crew_quarters/heads/hor/private"; - dir = 2; name = "Research Director's Quarters APC"; pixel_y = -24 }, @@ -24482,8 +23542,7 @@ req_access_txt = "63" }, /obj/structure/sign/nanotrasen{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/open/floor/plasteel, /area/security/brig) @@ -24492,7 +23551,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -24500,7 +23558,6 @@ "aQR" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -24553,12 +23610,9 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/item/radio/intercom{ - freerange = 0; - frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29 }, @@ -24577,7 +23631,6 @@ /obj/effect/turf_decal/tile/red, /obj/machinery/vending/cigarette, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -24592,14 +23645,6 @@ }, /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"aRa" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -24610,12 +23655,10 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/closet/secure_closet/quartermaster, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -24623,7 +23666,6 @@ "aRc" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -24639,7 +23681,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -24650,7 +23691,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -24727,11 +23767,9 @@ }, /obj/machinery/computer/med_data/laptop, /obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 0; pixel_y = 29 }, /obj/machinery/light/small{ @@ -24745,9 +23783,8 @@ icon_state = "4-8" }, /obj/machinery/power/apc/highcap/ten_k{ - dir = 2; - name = "Captain's Quarters APC"; areastring = "/area/crew_quarters/heads/captain/private"; + name = "Captain's Quarters APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -24774,7 +23811,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple, @@ -24786,7 +23822,6 @@ /area/hallway/primary/fore) "aRt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -24828,9 +23863,7 @@ /obj/item/aiModule/core/freeformcore, /obj/structure/window/reinforced, /obj/machinery/door/window{ - base_state = "left"; dir = 4; - icon_state = "left"; name = "Core Modules"; req_access_txt = "20" }, @@ -24853,9 +23886,7 @@ dir = 1 }, /obj/machinery/door/window/westleft{ - base_state = "left"; dir = 2; - icon_state = "left"; layer = 3.1; name = "Cyborg Upload Console Window"; req_access_txt = "16" @@ -25151,7 +24182,6 @@ "aSa" = ( /obj/structure/noticeboard/qm{ dir = 1; - icon_state = "nboard00"; pixel_y = -30 }, /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -25159,11 +24189,9 @@ /area/quartermaster/qm) "aSb" = ( /obj/machinery/computer/security/qm{ - icon_state = "computer"; dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/light_switch{ @@ -25172,14 +24200,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) -"aSc" = ( -/obj/structure/closet/wardrobe/cargotech, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "aSd" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 8 @@ -25328,8 +24348,6 @@ "aSs" = ( /obj/structure/dresser, /obj/item/radio/intercom{ - dir = 2; - pixel_x = 0; pixel_y = 28 }, /turf/open/floor/carpet/blue, @@ -25366,11 +24384,9 @@ "aSw" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -25409,11 +24425,9 @@ "aSA" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -25545,8 +24559,7 @@ }, /obj/item/lighter, /obj/machinery/camera{ - c_tag = "Bar"; - dir = 2 + c_tag = "Bar" }, /turf/open/floor/plasteel, /area/crew_quarters/bar) @@ -25585,9 +24598,9 @@ dir = 1 }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/crew_quarters/bar"; dir = 1; name = "Bar APC"; - areastring = "/area/crew_quarters/bar"; pixel_y = 25 }, /obj/structure/cable{ @@ -25602,7 +24615,6 @@ dir = 1 }, /obj/machinery/chem_dispenser/drinks{ - icon_state = "soda_dispenser"; dir = 8 }, /obj/structure/table, @@ -25649,7 +24661,6 @@ "aSU" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -25677,7 +24688,6 @@ /area/hydroponics) "aSY" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -25760,7 +24770,6 @@ "aTg" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -25771,7 +24780,6 @@ "aTi" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -25779,7 +24787,6 @@ "aTj" = ( /obj/machinery/vending/snack/random, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -25815,7 +24822,6 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow{ @@ -25828,28 +24834,24 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aTp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aTq" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 1 }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aTr" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -25857,7 +24859,6 @@ /area/quartermaster/storage) "aTs" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -26069,11 +25070,9 @@ /area/ai_monitored/turret_protected/ai_upload) "aTS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/item/radio/intercom{ @@ -26162,7 +25161,6 @@ icon_state = "1-4" }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -26206,7 +25204,6 @@ dir = 4 }, /obj/machinery/chem_dispenser/drinks/beer{ - icon_state = "booze_dispenser"; dir = 8 }, /obj/structure/table, @@ -26215,7 +25212,6 @@ "aUd" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -26229,27 +25225,10 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"aUf" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) "aUg" = ( /obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aUh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) "aUi" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/machinery/camera/autoname{ @@ -26264,7 +25243,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -26374,7 +25352,6 @@ /area/hallway/primary/central) "aUx" = ( /obj/vehicle/ridden/scooter{ - icon_state = "scooter"; dir = 8 }, /obj/machinery/firealarm{ @@ -26382,7 +25359,6 @@ pixel_x = -24 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -26445,11 +25421,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -26522,8 +25496,7 @@ areastring = "/area/crew_quarters/heads/captain"; dir = 8; name = "Captain's Office APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -26562,7 +25535,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -26650,7 +25622,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -26666,13 +25637,11 @@ /area/crew_quarters/bar/atrium) "aVg" = ( /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 1 }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -26767,7 +25736,6 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/green{ @@ -26777,7 +25745,6 @@ dir = 1 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -26807,7 +25774,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -26818,7 +25784,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -26870,11 +25835,9 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /obj/machinery/computer/bounty{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel, @@ -26893,9 +25856,8 @@ /area/hallway/primary/central) "aVz" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Cargo Bay APC"; areastring = "/area/quartermaster/storage"; + name = "Cargo Bay APC"; pixel_x = 1; pixel_y = -24 }, @@ -26927,11 +25889,9 @@ /area/quartermaster/office) "aVB" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -26987,7 +25947,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -27016,12 +25975,10 @@ /obj/structure/table, /obj/item/export_scanner, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ c_tag = "Quartermaster's Office"; - dir = 2; name = "cargo camera" }, /turf/open/floor/plasteel, @@ -27039,11 +25996,9 @@ "aVO" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -27188,7 +26143,6 @@ /area/crew_quarters/bar) "aWh" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -27199,7 +26153,6 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -27213,7 +26166,6 @@ light_color = "#cee5d2" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -27225,7 +26177,6 @@ /obj/structure/table/glass, /obj/item/book/manual/hydroponics_pod_people, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -27236,7 +26187,6 @@ light_color = "#cee5d2" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/status_display/ai{ @@ -27268,7 +26218,6 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -27283,7 +26232,6 @@ /area/hydroponics) "aWq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/light{ @@ -27312,7 +26260,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -27332,7 +26279,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -27354,7 +26300,6 @@ pixel_x = -24 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -27381,7 +26326,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -27400,7 +26344,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -27427,7 +26370,6 @@ /area/quartermaster/office) "aWD" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 8 }, /turf/open/floor/plasteel, @@ -27435,20 +26377,12 @@ "aWE" = ( /obj/effect/turf_decal/stripes/full, /turf/open/floor/plasteel{ - icon_state = "yellowsiding"; - dir = 1 + dir = 1; + icon_state = "yellowsiding" }, /area/quartermaster/office) -"aWF" = ( -/obj/effect/turf_decal/caution{ - icon_state = "caution"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) "aWG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -27471,7 +26405,6 @@ pixel_x = -22 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -27488,7 +26421,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -27510,7 +26442,6 @@ /area/maintenance/fore) "aWO" = ( /obj/structure/chair/sofa/corp/left{ - icon_state = "corp_sofaend_left"; dir = 4 }, /turf/open/floor/wood, @@ -27580,7 +26511,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light, @@ -27626,7 +26556,6 @@ /area/hallway/primary/central) "aXa" = ( /obj/machinery/computer/security/telescreen/aiupload{ - icon_state = "telescreen"; dir = 4 }, /turf/closed/wall/r_wall, @@ -27647,9 +26576,8 @@ }, /obj/effect/landmark/start/cyborg, /obj/machinery/power/apc{ - dir = 2; - name = "AI Upload Access APC"; areastring = "/area/ai_monitored/turret_protected/ai_upload_foyer"; + name = "AI Upload Access APC"; pixel_y = -27 }, /obj/item/radio/intercom{ @@ -27694,11 +26622,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -27740,7 +26666,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 5 }, /turf/open/floor/plasteel, @@ -27753,29 +26678,6 @@ /mob/living/carbon/monkey/punpun, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"aXi" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aXj" = ( /obj/item/reagent_containers/glass/bucket, /turf/open/floor/plasteel, @@ -27825,11 +26727,9 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Hydroponics APC"; - pixel_x = 0; pixel_y = 23 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -27849,9 +26749,9 @@ /area/hydroponics) "aXr" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/central/secondary"; dir = 8; name = "Central Maintenance APC"; - areastring = "/area/maintenance/central/secondary"; pixel_x = -24 }, /obj/structure/cable{ @@ -27896,8 +26796,7 @@ id = "commissaryshutter"; name = "Commissary Shutter Control"; pixel_x = 3; - pixel_y = -25; - req_access_txt = "0" + pixel_y = -25 }, /obj/structure/chair/stool, /obj/effect/decal/cleanable/dirt, @@ -27935,7 +26834,6 @@ /obj/structure/chair/comfy/brown, /obj/effect/landmark/start/captain, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/wood, @@ -27948,7 +26846,6 @@ /area/maintenance/fore) "aXz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -27976,7 +26873,6 @@ "aXB" = ( /obj/effect/turf_decal/caution, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -27990,7 +26886,6 @@ /area/hallway/primary/central) "aXD" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -28034,7 +26929,6 @@ /area/quartermaster/warehouse) "aXL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -28138,7 +27032,6 @@ dir = 8 }, /obj/structure/chair/sofa/corp/right{ - icon_state = "corp_sofaend_right"; dir = 4 }, /turf/open/floor/wood, @@ -28148,7 +27041,6 @@ /area/crew_quarters/heads/captain) "aXX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -28208,7 +27100,6 @@ "aYc" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/wood, @@ -28352,7 +27243,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -28368,7 +27258,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -28410,7 +27299,6 @@ /area/crew_quarters/bar) "aYp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sink{ @@ -28444,7 +27332,6 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/structure/extinguisher_cabinet{ @@ -28461,7 +27348,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/sink{ @@ -28474,7 +27360,6 @@ /obj/machinery/airalarm/directional/west, /obj/machinery/seed_extractor, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -28516,14 +27401,12 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "aYB" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -28547,7 +27430,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -28558,11 +27440,9 @@ /area/hallway/primary/central) "aYF" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -28607,11 +27487,9 @@ /area/quartermaster/warehouse) "aYL" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -28681,7 +27559,6 @@ /area/crew_quarters/heads/captain) "aYS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/carpet/red, @@ -28707,19 +27584,9 @@ /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, /area/crew_quarters/heads/captain) -"aYW" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aYX" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -28728,43 +27595,18 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aYY" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aYZ" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, /area/security/brig) -"aZa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "aZb" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, @@ -28772,7 +27614,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple, @@ -28783,7 +27624,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /mob/living/simple_animal/bot/medbot{ @@ -28801,7 +27641,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/tile/purple{ @@ -28856,7 +27695,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -28953,16 +27791,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"aZv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "aZw" = ( /obj/structure/cable{ icon_state = "1-2" @@ -28986,9 +27814,9 @@ /area/hallway/primary/central) "aZx" = ( /obj/machinery/power/apc{ + areastring = "/area/quartermaster/warehouse"; dir = 4; name = "Cargo Warehouse APC"; - areastring = "/area/quartermaster/warehouse"; pixel_x = 26 }, /obj/structure/cable{ @@ -28996,7 +27824,6 @@ pixel_y = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29015,7 +27842,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -29027,14 +27853,12 @@ sortType = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aZA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -29062,7 +27886,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -29084,7 +27907,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29132,7 +27954,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -29167,12 +27988,10 @@ /obj/item/folder/red, /obj/item/taperecorder, /obj/item/radio/intercom{ - anyai = 1; broadcasting = 1; frequency = 1423; listening = 0; name = "Interrogation Intercom"; - pixel_x = 0; pixel_y = -24 }, /obj/effect/turf_decal/tile/neutral{ @@ -29204,7 +28023,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -29250,7 +28068,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -29273,7 +28090,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -29288,9 +28104,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/item/clothing/head/that{ - throwforce = 1 - }, +/obj/item/clothing/head/that, /turf/open/floor/plasteel, /area/crew_quarters/bar) "aZW" = ( @@ -29312,8 +28126,7 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/open/floor/plasteel, /area/crew_quarters/bar) @@ -29321,7 +28134,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -29337,7 +28149,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -29355,7 +28166,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -29367,25 +28177,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/fore) -"bad" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bae" = ( /obj/structure/cable{ icon_state = "4-8" @@ -29400,7 +28191,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -29444,9 +28234,9 @@ icon_state = "4-8" }, /obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/hallway/secondary/command"; dir = 1; name = "Command Hallway APC"; - areastring = "/area/hallway/secondary/command"; pixel_y = 25 }, /obj/structure/cable{ @@ -29462,7 +28252,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -29487,7 +28276,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -29506,11 +28294,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29539,7 +28325,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -29710,9 +28495,9 @@ pixel_x = 32 }, /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre"; dir = 1; name = "Theatre APC"; - areastring = "/area/crew_quarters/theatre"; pixel_y = 25 }, /obj/structure/cable{ @@ -29737,9 +28522,6 @@ /area/crew_quarters/bar) "baB" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25" }, @@ -29751,7 +28533,6 @@ /area/crew_quarters/bar) "baC" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/camera{ @@ -29779,7 +28560,6 @@ "baG" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29820,7 +28600,6 @@ "baK" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29830,14 +28609,12 @@ /obj/item/folder/yellow, /obj/structure/disposalpipe/junction/flip, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/quartermaster/office) "baM" = ( /obj/machinery/door/window/westleft{ - dir = 8; name = "Cargo Desk"; req_access_txt = "50" }, @@ -29852,7 +28629,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29861,14 +28637,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "baP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -29876,7 +28650,6 @@ "baQ" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -29887,14 +28660,12 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/quartermaster/office) "baS" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -29905,14 +28676,12 @@ /area/quartermaster/office) "baT" = ( /obj/effect/turf_decal/caution{ - icon_state = "caution"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -29925,7 +28694,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29938,7 +28706,6 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -29948,7 +28715,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -29960,7 +28726,6 @@ /obj/effect/landmark/start/cargo_technician, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -30048,14 +28813,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/bridge) "bbf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -30198,7 +28961,6 @@ /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/window/reinforced{ @@ -30234,7 +28996,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -30326,7 +29087,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 8 }, /obj/structure/disposalpipe/segment, @@ -30336,7 +29096,6 @@ "bbz" = ( /obj/effect/turf_decal/arrows/red, /obj/effect/turf_decal/stripes/red/line{ - icon_state = "warningline_red"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -30392,7 +29151,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar/atrium) "bbF" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/structure/window/reinforced{ dir = 8 }, @@ -30508,7 +29267,6 @@ pixel_y = -36 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/wood, @@ -30520,7 +29278,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -30536,7 +29293,6 @@ /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/delivery, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -30546,7 +29302,6 @@ /area/hallway/secondary/service) "bbW" = ( /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 4 }, /obj/structure/disposalpipe/segment, @@ -30622,7 +29377,6 @@ /area/quartermaster/office) "bcf" = ( /obj/machinery/computer/card{ - icon_state = "computer"; dir = 4 }, /turf/open/floor/carpet, @@ -30642,7 +29396,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -30689,11 +29442,9 @@ /area/bridge/meeting_room) "bcp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -30840,7 +29591,6 @@ "bcK" = ( /obj/structure/closet/crate/hydroponics, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -30871,7 +29621,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/camera{ @@ -30885,7 +29634,6 @@ /area/security/prison) "bcQ" = ( /obj/effect/turf_decal/arrows/red{ - icon_state = "arrows_red"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -30936,34 +29684,31 @@ /area/maintenance/department/cargo) "bcV" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bcW" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, /area/quartermaster/sorting) "bcX" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -30979,11 +29724,9 @@ /area/quartermaster/sorting) "bcY" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/item/hand_labeler_refill, @@ -30997,11 +29740,9 @@ /area/quartermaster/sorting) "bcZ" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile, @@ -31057,7 +29798,6 @@ /area/maintenance/department/cargo) "bdg" = ( /obj/machinery/computer/communications{ - icon_state = "computer"; dir = 4 }, /obj/machinery/light/small{ @@ -31173,7 +29913,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/door/airlock/security/glass{ @@ -31205,9 +29944,9 @@ dir = 6 }, /obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/teleporter"; dir = 1; name = "Teleporter APC"; - areastring = "/area/teleporter"; pixel_y = 28 }, /obj/effect/turf_decal/tile/neutral{ @@ -31413,7 +30152,6 @@ "bdK" = ( /obj/machinery/requests_console{ department = "EVA"; - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/plasteel, @@ -31441,8 +30179,7 @@ dir = 8 }, /obj/machinery/camera/motion{ - c_tag = "E.V.A. Storage"; - dir = 2 + c_tag = "E.V.A. Storage" }, /obj/machinery/cell_charger, /obj/structure/table, @@ -31467,7 +30204,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -31553,7 +30289,6 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -31581,7 +30316,6 @@ /area/crew_quarters/bar) "bdZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -31612,7 +30346,6 @@ "bed" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -31691,11 +30424,9 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/disposalpipe/trunk{ @@ -31704,7 +30435,6 @@ /obj/structure/disposaloutlet, /obj/machinery/conveyor{ backwards = 1; - dir = 2; forwards = 2; id = "trashsort" }, @@ -31721,14 +30451,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -31749,31 +30477,17 @@ /area/quartermaster/sorting) "bep" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, /area/hydroponics) "beq" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"ber" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/conveyor{ - backwards = 1; - dir = 2; - forwards = 2; - id = "trashsort" - }, -/turf/open/floor/plating, -/area/quartermaster/sorting) "bes" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -31800,7 +30514,6 @@ /area/maintenance/department/cargo) "bev" = ( /obj/machinery/modular_computer/console/preset/command{ - icon_state = "console"; dir = 4 }, /turf/open/floor/carpet, @@ -31867,11 +30580,9 @@ /area/bridge) "beA" = ( /obj/machinery/computer/cargo/request{ - icon_state = "computer"; dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -31901,7 +30612,6 @@ /area/teleporter) "beD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -31918,8 +30628,7 @@ areastring = "/area/bridge/meeting_room"; dir = 8; name = "Council Chambers APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /turf/open/floor/carpet, /area/bridge/meeting_room) @@ -31933,7 +30642,6 @@ /area/bridge/meeting_room) "beG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/carpet, @@ -31948,7 +30656,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -32026,9 +30733,9 @@ }, /obj/effect/turf_decal/stripes/corner, /obj/machinery/power/apc{ + areastring = "/area/ai_monitored/storage/eva"; dir = 8; name = "E.V.A. Storage APC"; - areastring = "/area/ai_monitored/storage/eva"; pixel_x = -24 }, /turf/open/floor/plasteel, @@ -32092,7 +30799,6 @@ "beX" = ( /obj/effect/landmark/start/bartender, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/wood, @@ -32207,7 +30913,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -32220,22 +30925,13 @@ "bfp" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, /area/hydroponics) -"bfq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/break_room) "bfr" = ( /obj/machinery/computer/scan_consolenew, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -32243,7 +30939,6 @@ "bfs" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/sign/warning/nosmoking{ @@ -32294,8 +30989,7 @@ areastring = "/area/security/checkpoint/supply"; dir = 8; name = "Cargo Security APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/machinery/camera{ c_tag = "Security Post - Cargo"; @@ -32305,7 +30999,6 @@ /area/security/checkpoint/supply) "bfy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -32333,7 +31026,6 @@ /area/maintenance/department/cargo) "bfC" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -32344,11 +31036,9 @@ /area/quartermaster/sorting) "bfD" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -32517,7 +31207,6 @@ "bfT" = ( /obj/effect/landmark/start/cargo_technician, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -32570,7 +31259,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -32639,9 +31327,9 @@ icon_state = "0-8" }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/bridge/showroom/corporate"; dir = 4; name = "Nanotrasen Corporate Showroom APC"; - areastring = "/area/bridge/showroom/corporate"; pixel_x = 28 }, /turf/open/floor/plasteel/dark, @@ -32732,7 +31420,6 @@ /area/crew_quarters/cafeteria) "bgq" = ( /obj/machinery/computer/arcade/battle{ - icon_state = "arcade"; dir = 4 }, /turf/open/floor/plasteel, @@ -32774,7 +31461,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -32783,7 +31469,6 @@ pixel_x = -28 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -32815,11 +31500,9 @@ /area/crew_quarters/kitchen/backroom) "bgB" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/structure/closet/secure_closet/freezer/kitchen, @@ -32837,11 +31520,9 @@ /area/crew_quarters/kitchen) "bgD" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /obj/item/radio/intercom{ @@ -32882,7 +31563,6 @@ "bgH" = ( /obj/machinery/conveyor/inverted{ dir = 9; - icon_state = "conveyor_map_inverted"; id = "trashsort" }, /turf/open/floor/plating, @@ -32901,7 +31581,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -32981,7 +31660,6 @@ dir = 4 }, /obj/machinery/conveyor{ - icon_state = "conveyor_map"; dir = 6; id = "garbage" }, @@ -33044,7 +31722,6 @@ /area/bridge) "bgV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -33054,7 +31731,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/carpet, @@ -33090,7 +31766,6 @@ /area/teleporter) "bgZ" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -33112,7 +31787,6 @@ /area/maintenance/fore) "bhc" = ( /obj/machinery/door/window/westleft{ - dir = 8; name = "Bridge Deliveries"; req_access_txt = "19" }, @@ -33156,7 +31830,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -33213,11 +31886,9 @@ "bhn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -33266,7 +31937,6 @@ }, /obj/structure/rack, /obj/machinery/door/window/northleft{ - dir = 1; name = "Jetpack Storage"; pixel_x = -1; req_access_txt = "19" @@ -33301,7 +31971,6 @@ pixel_y = -3 }, /obj/machinery/door/window/northleft{ - dir = 1; name = "Magboot Storage"; pixel_x = -1; req_access_txt = "19" @@ -33401,7 +32070,6 @@ /area/crew_quarters/cafeteria) "bhD" = ( /obj/machinery/newscaster{ - pixel_x = 0; pixel_y = 30 }, /turf/open/floor/plasteel, @@ -33418,63 +32086,35 @@ dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/item/storage/box/donkpockets, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"bhG" = ( -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "bhH" = ( /obj/structure/sink/kitchen{ pixel_y = 28 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"bhI" = ( -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "bhJ" = ( /obj/machinery/light{ dir = 1; light_color = "#cee5d2" }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, @@ -33482,22 +32122,18 @@ "bhK" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bhL" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/structure/closet/secure_closet/freezer/fridge, @@ -33571,7 +32207,6 @@ "bhU" = ( /obj/machinery/conveyor/inverted{ dir = 5; - icon_state = "conveyor_map_inverted"; id = "garbage" }, /turf/open/floor/plating, @@ -33582,7 +32217,6 @@ }, /obj/structure/window/reinforced, /obj/machinery/conveyor{ - icon_state = "conveyor_map"; dir = 10; id = "garbage" }, @@ -33605,7 +32239,6 @@ }, /obj/machinery/power/apc{ areastring = "/area/security/armory"; - dir = 2; name = "Armoury APC"; pixel_y = -26 }, @@ -33658,7 +32291,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, @@ -33676,7 +32308,6 @@ }, /obj/item/storage/box/zipties, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -33739,7 +32370,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -33804,22 +32434,18 @@ /obj/machinery/holopad, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bir" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -33968,7 +32594,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -34026,7 +32651,6 @@ "biO" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/light{ @@ -34040,7 +32664,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -34099,61 +32722,41 @@ "biW" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "biX" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"biY" = ( -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "biZ" = ( /obj/structure/table, /obj/item/hand_labeler, /obj/item/hand_labeler_refill, /obj/item/stack/packageWrap, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bja" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, @@ -34164,22 +32767,18 @@ /obj/structure/table, /obj/item/book/manual/chef_recipes, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bjc" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ @@ -34195,11 +32794,9 @@ /area/crew_quarters/kitchen) "bjd" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ @@ -34244,11 +32841,9 @@ "bjh" = ( /obj/structure/table, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/item/storage/bag/tray, @@ -34292,7 +32887,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -34336,7 +32930,6 @@ }, /obj/machinery/conveyor{ backwards = 1; - dir = 2; forwards = 2; id = "garbage" }, @@ -34488,7 +33081,6 @@ /area/crew_quarters/cafeteria) "bjK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/rack, @@ -34518,7 +33110,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -34549,7 +33140,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -34567,11 +33157,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/landmark/start/cook, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -34580,11 +33168,9 @@ /obj/structure/table, /obj/item/storage/box/donkpockets, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -34598,11 +33184,9 @@ layer = 5 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -34610,11 +33194,9 @@ "bjU" = ( /obj/structure/table, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/reagentgrinder, @@ -34623,11 +33205,9 @@ "bjV" = ( /obj/effect/landmark/start/cook, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -34637,11 +33217,9 @@ "bjW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ @@ -34651,11 +33229,9 @@ /area/crew_quarters/kitchen) "bjX" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/vending/dinnerware, @@ -34725,7 +33301,6 @@ /mob/living/simple_animal/bot/cleanbot{ auto_patrol = 1; icon_state = "cleanbot1"; - mode = 0; name = "Mopficcer Sweepsky" }, /turf/open/floor/plasteel, @@ -34795,11 +33370,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/camera{ @@ -34898,39 +33471,18 @@ dir = 6 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"bkr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "bks" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -34940,11 +33492,9 @@ "bkt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ @@ -34957,7 +33507,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple{ @@ -35024,7 +33573,6 @@ "bkA" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -35069,14 +33617,12 @@ }, /obj/machinery/door/window/eastright{ base_state = "left"; - dir = 4; icon_state = "left"; name = "Danger: Conveyor Access"; req_access_txt = "12" }, /obj/machinery/conveyor{ backwards = 1; - dir = 2; forwards = 2; id = "garbage" }, @@ -35095,13 +33641,11 @@ /area/maintenance/disposal) "bkG" = ( /obj/machinery/door/window/eastright{ - dir = 4; name = "Danger: Conveyor Access"; req_access_txt = "12" }, /obj/machinery/conveyor{ backwards = 1; - dir = 2; forwards = 2; id = "garbage" }, @@ -35110,7 +33654,6 @@ "bkH" = ( /obj/machinery/conveyor/inverted{ dir = 9; - icon_state = "conveyor_map_inverted"; id = "garbage" }, /turf/open/floor/plating, @@ -35231,11 +33774,9 @@ dir = 6 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -35249,36 +33790,19 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bkU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "bkV" = ( /obj/effect/landmark/start/cook, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -35289,11 +33813,9 @@ dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -35311,11 +33833,9 @@ /area/crew_quarters/cafeteria) "bkY" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/table, @@ -35396,15 +33916,6 @@ }, /turf/open/floor/plasteel, /area/janitor) -"blg" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "blh" = ( /obj/structure/cable{ icon_state = "1-2" @@ -35587,7 +34098,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sign/directions/security{ @@ -35597,7 +34107,6 @@ }, /obj/structure/sign/directions/science{ dir = 1; - icon_state = "direction_sci"; pixel_x = 32 }, /turf/open/floor/plasteel, @@ -35687,11 +34196,9 @@ dir = 9 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel/cafeteria, @@ -35722,11 +34229,9 @@ /area/crew_quarters/kitchen) "blE" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, @@ -35737,11 +34242,9 @@ /area/crew_quarters/kitchen) "blF" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/processor, @@ -35749,11 +34252,9 @@ /area/crew_quarters/kitchen) "blG" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ @@ -35878,11 +34379,9 @@ /area/crew_quarters/kitchen) "blX" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/table, @@ -36018,8 +34517,8 @@ /area/gateway) "bmm" = ( /obj/structure/rack, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, /obj/item/reagent_containers/syringe/charcoal, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = -1; @@ -36045,8 +34544,7 @@ "bmo" = ( /obj/structure/table, /obj/machinery/camera{ - c_tag = "Gateway - Atrium"; - dir = 2 + c_tag = "Gateway - Atrium" }, /obj/effect/turf_decal/bot{ dir = 1 @@ -36061,14 +34559,6 @@ }, /turf/open/floor/plasteel/grimy, /area/bridge) -"bmq" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bmr" = ( /obj/structure/cable{ icon_state = "1-2" @@ -36090,19 +34580,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bms" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bmt" = ( /obj/effect/turf_decal/tile/bar, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -36113,7 +34594,6 @@ }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -36124,11 +34604,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -36142,7 +34620,6 @@ /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -36150,15 +34627,6 @@ "bmy" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bmz" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -36172,7 +34640,6 @@ pixel_x = -25 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -36228,18 +34695,15 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bmJ" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -36275,11 +34739,9 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/disposal/bin, @@ -36292,7 +34754,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -36303,7 +34764,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/status_display/ai{ @@ -36316,7 +34776,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/airalarm/directional/north, @@ -36327,16 +34786,15 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/cable{ icon_state = "0-2" }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/secondary/exit/departure_lounge"; dir = 1; name = "Departure Lounge APC"; - areastring = "/area/hallway/secondary/exit/departure_lounge"; pixel_y = 24 }, /turf/open/floor/plasteel, @@ -36347,7 +34805,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/light{ @@ -36355,17 +34812,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bmU" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bmV" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -36373,7 +34819,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -36383,7 +34828,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/item/twohanded/required/kirbyplants/random, @@ -36394,7 +34838,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red, @@ -36458,8 +34901,7 @@ areastring = "/area/gateway"; dir = 8; name = "Gateway APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/effect/turf_decal/stripes/end{ dir = 8 @@ -36507,7 +34949,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -36583,16 +35024,6 @@ }, /turf/open/floor/plasteel, /area/gateway) -"bnl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bnm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -36766,12 +35197,10 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/sign/directions/supply{ dir = 4; - icon_state = "direction_supply"; pixel_y = 40 }, /obj/structure/sign/directions/evac{ dir = 4; - icon_state = "direction_evac"; pixel_y = 32 }, /obj/structure/sign/directions/medical{ @@ -37002,7 +35431,6 @@ }, /obj/machinery/camera{ c_tag = "Chapel Port"; - dir = 2; name = "chapel camera" }, /turf/open/floor/plasteel/chapel{ @@ -37034,13 +35462,6 @@ "bnL" = ( /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bnM" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bnN" = ( /obj/structure/chair/stool, /obj/machinery/camera{ @@ -37052,19 +35473,6 @@ dir = 8 }, /area/chapel/main) -"bnO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bnP" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -37118,7 +35526,6 @@ "bnU" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/carpet, @@ -37138,8 +35545,8 @@ /obj/structure/closet/crate/goldcrate, /obj/machinery/camera/motion{ c_tag = "Vault"; - network = list("vault"); - dir = 1 + dir = 1; + network = list("vault") }, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) @@ -37233,24 +35640,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"bog" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "boh" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -37264,7 +35659,6 @@ pixel_x = 24 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/grimy, @@ -37274,7 +35668,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -37317,7 +35710,6 @@ /area/storage/emergency/starboard) "bop" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -37359,7 +35751,6 @@ /area/hallway/secondary/exit/departure_lounge) "bou" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -37446,7 +35837,6 @@ "boE" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -37456,7 +35846,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -37472,7 +35861,6 @@ /area/science/xenobiology) "boH" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -37491,7 +35879,6 @@ /area/hallway/secondary/exit/departure_lounge) "boJ" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -37499,25 +35886,12 @@ dir = 1 }, /obj/item/radio/intercom{ - pixel_x = 0; pixel_y = -29 }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"boK" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "boL" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /turf/open/floor/plasteel, @@ -37526,24 +35900,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"boN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "boO" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "boP" = ( /obj/docking_port/stationary{ - dheight = 0; dir = 4; dwidth = 9; height = 25; @@ -37582,16 +35944,6 @@ "boU" = ( /turf/closed/wall, /area/hallway/primary/aft) -"boV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "boW" = ( /obj/structure/cable{ icon_state = "1-2" @@ -37611,17 +35963,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"boX" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "boY" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -37662,15 +36003,6 @@ "bpe" = ( /turf/closed/wall, /area/hallway/primary/starboard) -"bpf" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bpg" = ( /obj/structure/cable{ icon_state = "1-4" @@ -37686,20 +36018,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"bph" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bpi" = ( /turf/closed/wall, /area/hallway/secondary/exit) @@ -37715,7 +36033,6 @@ /area/hallway/secondary/exit/departure_lounge) "bpk" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red, @@ -37746,28 +36063,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"bpn" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) -"bpo" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bpp" = ( /obj/structure/cable{ icon_state = "1-4" @@ -37803,7 +36098,6 @@ /area/maintenance/port/fore) "bpu" = ( /obj/machinery/mineral/stacking_unit_console{ - dir = 2; machinedir = 8; pixel_x = 32 }, @@ -37811,7 +36105,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plating, @@ -37872,16 +36165,6 @@ "bpC" = ( /turf/closed/wall, /area/medical/morgue) -"bpD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bpE" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -37891,7 +36174,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -37900,17 +36182,8 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"bpF" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bpG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -37976,7 +36249,6 @@ req_access_txt = "55" }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -38001,7 +36273,6 @@ /area/hallway/secondary/exit/departure_lounge) "bpN" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red, @@ -38025,7 +36296,6 @@ "bpP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "Fuel Pipe to Incinerator" }, /obj/structure/cable/yellow{ @@ -38058,16 +36328,6 @@ /obj/structure/filingcabinet/security, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bpS" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bpT" = ( /obj/machinery/door/window/brigdoor/westright{ name = "Holding Area"; @@ -38114,28 +36374,20 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"bpZ" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bqa" = ( /obj/structure/cable{ icon_state = "0-2" }, /obj/machinery/power/apc{ + areastring = "/area/medical/genetics"; dir = 1; name = "Genetics Lab APC"; - areastring = "/area/medical/genetics"; pixel_y = 24 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, +/obj/structure/closet/secure_closet/medical1, /turf/open/floor/plasteel/white, /area/medical/genetics) "bqb" = ( @@ -38151,9 +36403,9 @@ light_color = "#cee5d2" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, +/obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/white, /area/medical/genetics) "bqd" = ( @@ -38163,13 +36415,10 @@ }, /obj/machinery/requests_console{ department = "Genetics"; - departmentType = 0; name = "Genetics Requests Console"; - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/table/glass, @@ -38181,17 +36430,9 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) -"bqe" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) "bqf" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/table/glass, @@ -38210,7 +36451,6 @@ "bqg" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/structure/noticeboard{ @@ -38291,7 +36531,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -38307,7 +36546,6 @@ /area/medical/abandoned) "bqt" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -38381,7 +36619,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -38403,15 +36640,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -38435,7 +36669,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -38571,14 +36804,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bqK" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bqL" = ( /obj/structure/window/reinforced{ dir = 8 @@ -38597,7 +36822,6 @@ /area/hallway/secondary/exit/departure_lounge) "bqN" = ( /obj/machinery/computer/scan_consolenew{ - icon_state = "computer"; dir = 1 }, /obj/item/radio/intercom{ @@ -38624,7 +36848,6 @@ /area/medical/genetics) "bqQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -38650,11 +36873,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -38720,22 +36941,18 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "brb" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -38766,7 +36983,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -38783,7 +36999,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -38821,7 +37036,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple, @@ -38839,7 +37053,6 @@ }, /obj/machinery/camera{ c_tag = "Creamatorium"; - dir = 2; name = "chapel camera" }, /turf/open/floor/plasteel/dark, @@ -38972,18 +37185,10 @@ /obj/effect/landmark/start/geneticist, /obj/structure/chair/office/light, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/genetics) -"bru" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) "brv" = ( /obj/machinery/door/window/westleft{ name = "Monkey Enclosure"; @@ -39009,29 +37214,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"brz" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "brA" = ( /turf/closed/wall, /area/library) @@ -39061,7 +37243,6 @@ /area/library) "brE" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/light{ @@ -39124,7 +37305,6 @@ /area/medical/genetics) "brL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/structure/table/glass, @@ -39163,7 +37343,6 @@ "brN" = ( /obj/machinery/door/airlock/grunge{ name = "Morgue"; - opacity = 1; req_access_txt = "5" }, /obj/structure/cable{ @@ -39194,7 +37373,6 @@ "brO" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -39202,7 +37380,6 @@ "brP" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -39225,7 +37402,6 @@ /area/medical/morgue) "brT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -39262,7 +37438,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -39341,7 +37516,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/structure/sign/directions/evac{ @@ -39356,7 +37530,6 @@ /area/library) "bsh" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -39370,7 +37543,6 @@ /area/hallway/secondary/exit/departure_lounge) "bsi" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red{ @@ -39378,25 +37550,12 @@ }, /obj/structure/chair, /obj/item/radio/intercom{ - pixel_x = 0; pixel_y = 26 }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"bsj" = ( -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/chair, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit/departure_lounge) "bsk" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red{ @@ -39440,7 +37599,6 @@ /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -39462,15 +37620,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -39483,7 +37638,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -39518,7 +37672,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39553,7 +37706,6 @@ pixel_x = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -39563,7 +37715,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -39594,18 +37745,10 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bsC" = ( -/obj/structure/chair/comfy/teal{ - icon_state = "comfychair"; - dir = 4 - }, -/turf/open/floor/wood, -/area/library) "bsD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -39644,9 +37787,9 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ + areastring = "/area/library"; dir = 4; name = "Library APC"; - areastring = "/area/library"; pixel_x = 24 }, /turf/open/floor/carpet, @@ -39681,7 +37824,6 @@ /obj/effect/turf_decal/bot_white/right, /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -39714,14 +37856,12 @@ "bsT" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "bsU" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/computer/cloning, @@ -39750,7 +37890,6 @@ }, /obj/structure/window/reinforced, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -39773,7 +37912,6 @@ req_access_txt = "5" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39804,7 +37942,6 @@ req_access_txt = "5" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39853,17 +37990,16 @@ }, /obj/structure/window/reinforced, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/storage) "btd" = ( -/obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, +/obj/machinery/bloodbankgen, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/storage) "bte" = ( @@ -39871,18 +38007,20 @@ icon_state = "4-8" }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/medical/virology"; dir = 1; name = "Virology APC"; - areastring = "/area/medical/virology"; pixel_y = 24 }, /obj/structure/cable{ icon_state = "0-4" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, +/obj/structure/table/glass, +/obj/item/radio/headset/headset_med, +/obj/item/hand_labeler, /turf/open/floor/plasteel/white, /area/medical/virology) "btf" = ( @@ -39890,7 +38028,6 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39900,7 +38037,6 @@ /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39908,7 +38044,6 @@ "bth" = ( /obj/machinery/smartfridge/chemistry/virology/preloaded, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -39923,9 +38058,8 @@ "btj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc{ - dir = 2; - name = "Abandoned Medical Lab APC"; areastring = "/area/medical/abandoned"; + name = "Abandoned Medical Lab APC"; pixel_x = 1; pixel_y = -24 }, @@ -39979,7 +38113,6 @@ location = "9.2-Escape-2" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -40047,7 +38180,6 @@ }, /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 6 }, /turf/open/floor/plasteel, @@ -40055,7 +38187,6 @@ "btu" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/camera{ @@ -40092,52 +38223,45 @@ }, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/syringe/antiviral, /turf/open/floor/plasteel/white, /area/medical/virology) "btA" = ( /obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/folder/white, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, +/obj/item/book/manual/wiki/infections, /turf/open/floor/plasteel/white, /area/medical/virology) "btB" = ( /obj/machinery/vending/wardrobe/chem_wardrobe, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "btC" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "btD" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, +/obj/machinery/chem_dispenser/apothecary, /turf/open/floor/plasteel/white, /area/medical/chemistry) "btE" = ( @@ -40164,7 +38288,6 @@ /obj/effect/turf_decal/bot, /obj/machinery/holopad, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -40181,18 +38304,15 @@ /obj/item/stack/packageWrap, /obj/item/hand_labeler, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "btI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -40207,28 +38327,24 @@ /area/crew_quarters/kitchen/backroom) "btK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "btL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "btM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "btN" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -40276,9 +38392,11 @@ /area/medical/storage) "btT" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/folder/white, /turf/open/floor/plasteel/white, /area/medical/virology) "btU" = ( @@ -40298,20 +38416,6 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood, /area/library) -"btX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "btY" = ( /obj/structure/cable{ icon_state = "1-4" @@ -40330,7 +38434,6 @@ /area/library) "bua" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40342,7 +38445,6 @@ /area/hallway/secondary/exit/departure_lounge) "bub" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40351,7 +38453,6 @@ /area/hallway/secondary/exit/departure_lounge) "buc" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40365,7 +38466,6 @@ /area/hallway/secondary/exit/departure_lounge) "bud" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40374,7 +38474,6 @@ /area/hallway/secondary/exit/departure_lounge) "bue" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40385,7 +38484,6 @@ /area/hallway/secondary/exit/departure_lounge) "buf" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40398,7 +38496,6 @@ /area/hallway/secondary/exit/departure_lounge) "bug" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40407,12 +38504,10 @@ /area/hallway/secondary/exit/departure_lounge) "buh" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/computer/arcade, @@ -40420,7 +38515,6 @@ /area/hallway/secondary/exit/departure_lounge) "bui" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -40451,9 +38545,12 @@ receive_ore_updates = 1 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, +/obj/item/storage/box/syringes{ + pixel_x = 5; + pixel_y = 5 + }, /turf/open/floor/plasteel/white, /area/medical/virology) "bum" = ( @@ -40546,11 +38643,9 @@ /obj/structure/table, /obj/machinery/reagentgrinder, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -40572,11 +38667,9 @@ pixel_x = 3 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -40585,7 +38678,6 @@ /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -40615,12 +38707,10 @@ /obj/structure/table/reinforced, /obj/structure/window/reinforced, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ c_tag = "Medbay Storage"; - dir = 2; name = "medbay camera"; network = list("ss13","medbay") }, @@ -40643,7 +38733,6 @@ "buC" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -40651,7 +38740,6 @@ "buD" = ( /obj/effect/landmark/start/geneticist, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -40694,7 +38782,6 @@ pixel_y = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -40712,11 +38799,9 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -40727,9 +38812,9 @@ }, /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/storage) "buJ" = ( @@ -40778,11 +38863,9 @@ departmentType = 2; name = "Science Requests Console"; pixel_x = -32; - pixel_y = 0; receive_ore_updates = 1 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -40850,15 +38933,16 @@ "buX" = ( /obj/structure/disposalpipe/segment, /obj/structure/table/glass, -/obj/item/book/manual/wiki/infections, /obj/machinery/light{ dir = 4; light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, +/obj/item/clothing/glasses/hud/health, +/obj/item/healthanalyzer, +/obj/item/clothing/gloves/color/latex, /turf/open/floor/plasteel/white, /area/medical/virology) "buY" = ( @@ -40871,11 +38955,9 @@ /obj/item/book/manual/wiki/chemistry, /obj/item/book/manual/wiki/grenades, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -40884,11 +38966,9 @@ /obj/structure/table/glass, /obj/item/storage/box/syringes, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -40908,7 +38988,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -40930,11 +39009,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -40971,7 +39048,6 @@ }, /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -40979,7 +39055,6 @@ "bvg" = ( /obj/machinery/vending/wardrobe/medi_wardrobe, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -41007,9 +39082,8 @@ /area/medical/storage) "bvk" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Medbay Storage APC"; areastring = "/area/medical/storage"; + name = "Medbay Storage APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -41071,22 +39145,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"bvr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bvs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, @@ -41112,9 +39170,7 @@ dir = 4 }, /obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bvw" = ( /obj/structure/table/wood, @@ -41125,9 +39181,7 @@ pixel_x = 1; pixel_y = 5 }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bvx" = ( /obj/effect/landmark/carpspawn, @@ -41148,9 +39202,8 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 2; - name = "Head of Personnel APC"; areastring = "/area/crew_quarters/heads/hop"; + name = "Head of Personnel APC"; pixel_y = -24 }, /turf/open/floor/wood, @@ -41188,7 +39241,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -41199,7 +39251,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -41211,9 +39262,9 @@ "bvE" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/storage) "bvF" = ( @@ -41234,7 +39285,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/navbeacon{ @@ -41255,7 +39305,6 @@ }, /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -41271,13 +39320,13 @@ network = list("ss13","medbay") }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, +/obj/item/radio/headset/headset_med, +/obj/item/folder/white, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bvJ" = ( @@ -41287,11 +39336,9 @@ "bvK" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41337,7 +39384,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; dir = 1 }, /obj/effect/turf_decal/tile/blue, @@ -41357,7 +39403,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/item/radio/intercom{ @@ -41393,32 +39438,16 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 10 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bvS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bvT" = ( /obj/machinery/light, /turf/open/floor/carpet, @@ -41455,26 +39484,16 @@ /obj/machinery/door/morgue{ name = "Study" }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, -/area/library) -"bvZ" = ( -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bwa" = ( /obj/structure/table/wood, /obj/machinery/newscaster{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/item/folder, /obj/item/folder, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bwb" = ( /obj/machinery/light/small{ @@ -41490,13 +39509,19 @@ "bwd" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bwe" = ( @@ -41525,7 +39550,6 @@ "bwf" = ( /obj/machinery/door/airlock/grunge{ name = "Morgue"; - opacity = 1; req_access_txt = "5" }, /obj/structure/cable{ @@ -41556,26 +39580,12 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"bwg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bwh" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/port/fore) "bwi" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -41627,13 +39637,6 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/plasteel/white, /area/medical/virology) -"bwr" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) "bws" = ( /obj/machinery/chem_heater, /obj/machinery/light{ @@ -41641,11 +39644,9 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -41664,18 +39665,15 @@ /obj/item/stack/cable_coil, /obj/item/stack/cable_coil, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bwu" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -41690,7 +39688,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41701,7 +39698,6 @@ }, /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41712,7 +39708,6 @@ }, /obj/structure/chair/sofa/right, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41724,7 +39719,6 @@ }, /obj/structure/chair/sofa, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41767,14 +39761,6 @@ /obj/structure/table, /obj/item/storage/box/cups, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bwC" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -41805,18 +39791,6 @@ }, /turf/open/floor/plasteel, /area/medical/cryo) -"bwG" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bwH" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -41915,17 +39889,6 @@ "bwR" = ( /turf/closed/wall, /area/medical/virology) -"bwS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bwT" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/green/filled/line, @@ -41962,7 +39925,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/line{ - icon_state = "trimline"; dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -41996,7 +39958,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -42004,7 +39965,6 @@ "bwY" = ( /obj/machinery/sleeper, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -42015,7 +39975,6 @@ location = "9.3-Escape-3" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -42035,7 +39994,6 @@ "bxd" = ( /obj/machinery/sleeper, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -42046,11 +40004,9 @@ /area/medical/chemistry) "bxf" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ @@ -42102,49 +40058,10 @@ /area/medical/medbay/central) "bxm" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/cryo) -"bxn" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) -"bxo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bxp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42190,22 +40107,18 @@ "bxt" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bxu" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -42361,32 +40274,10 @@ layer = 2.9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, /area/aisat) -"bxP" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1"; - pixel_y = -5 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bxQ" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bxR" = ( /obj/structure/window/reinforced/spawner/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, @@ -42396,7 +40287,6 @@ pixel_y = -5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -42410,7 +40300,6 @@ layer = 2.9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, @@ -42442,7 +40331,6 @@ /area/medical/virology) "bxX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -42455,7 +40343,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -42465,7 +40352,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -42479,7 +40365,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -42497,7 +40382,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -42507,14 +40391,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/cryo) "bye" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, @@ -42533,7 +40415,6 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; dir = 8 }, /obj/effect/turf_decal/tile/blue{ @@ -42550,7 +40431,6 @@ /area/medical/cryo) "byh" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -42583,7 +40463,6 @@ /area/hallway/primary/starboard) "byj" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -42593,7 +40472,6 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -42607,7 +40485,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -42626,7 +40503,6 @@ /obj/structure/chair/comfy/black, /obj/effect/landmark/start/virologist, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -42637,7 +40513,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -42824,7 +40699,6 @@ /area/medical/cryo) "byH" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -42844,7 +40718,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -42897,7 +40770,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -42928,11 +40800,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -42964,19 +40834,10 @@ layer = 2.9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, /area/aisat) -"byW" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/plasteel/dark, -/area/aisat) "byX" = ( /obj/structure/window/reinforced/spawner, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -43014,11 +40875,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -43055,11 +40914,9 @@ "bzf" = ( /obj/machinery/chem_dispenser, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -43308,7 +41165,6 @@ }, /obj/machinery/power/apc{ areastring = "/area/medical/chemistry"; - dir = 2; name = "Chemistry Lab APC"; pixel_y = -25 }, @@ -43333,25 +41189,13 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"bzH" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bzI" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/vault{ @@ -43483,28 +41327,10 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, /area/aisat) -"bzU" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1"; - pixel_y = -5 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bzV" = ( /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced{ @@ -43529,43 +41355,6 @@ }, /turf/open/space/basic, /area/space) -"bzZ" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bAa" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bAb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bAc" = ( /obj/structure/window/reinforced/spawner, /obj/structure/window/reinforced{ @@ -43579,7 +41368,6 @@ dir = 6 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -43597,7 +41385,6 @@ /area/maintenance/disposal) "bAf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -43616,7 +41403,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -43632,7 +41418,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -43645,7 +41430,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -43668,7 +41452,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -43698,7 +41481,6 @@ pixel_y = -32 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ @@ -43709,7 +41491,6 @@ "bAp" = ( /obj/machinery/vending/wardrobe/viro_wardrobe, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -43728,7 +41509,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/structure/disposalpipe/junction/yjunction{ - icon_state = "pipe-y"; dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -43783,7 +41563,6 @@ "bAu" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -43796,11 +41575,9 @@ areastring = "/area/medical/genetics/cloning"; dir = 8; name = "Cloning Lab APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -43826,7 +41603,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -43845,7 +41621,6 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -43863,19 +41638,9 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/cryo) -"bAy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/virology) "bAz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -43911,7 +41676,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ @@ -43922,22 +41686,13 @@ "bAD" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"bAE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "bAF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -43950,11 +41705,9 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -43964,7 +41717,6 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -43972,7 +41724,6 @@ "bAI" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -44029,9 +41780,7 @@ name = "Private Study"; req_access_txt = "37" }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bAO" = ( /obj/machinery/airalarm/directional/west, @@ -44051,46 +41800,13 @@ "bAQ" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bAR" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1"; - pixel_y = -5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bAS" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bAT" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -44165,6 +41881,10 @@ /obj/item/storage/box/masks, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bBd" = ( @@ -44207,7 +41927,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -44217,7 +41936,6 @@ /obj/machinery/door/airlock/virology{ autoclose = 0; frequency = 1449; - icon_state = "closed"; id_tag = "virology_airlock_interior"; name = "Virology Interior Airlock"; req_access_txt = "39" @@ -44306,6 +42024,7 @@ "bBm" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/reagent_containers/spray/cleaner, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bBn" = ( @@ -44388,7 +42107,6 @@ "bBu" = ( /obj/machinery/power/apc{ areastring = "/area/medical/cryo"; - dir = 2; name = "Cryogenics APC"; pixel_y = -24 }, @@ -44406,7 +42124,6 @@ pixel_y = 32 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -44437,7 +42154,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -44476,7 +42192,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44490,7 +42205,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44541,7 +42255,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44559,7 +42272,6 @@ /area/medical/medbay/lobby) "bBG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44593,7 +42305,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -44606,7 +42317,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -44616,7 +42326,6 @@ /area/medical/medbay/central) "bBM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -44642,9 +42351,7 @@ pixel_x = -30 }, /obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bBQ" = ( /obj/structure/chair/comfy/brown{ @@ -44652,12 +42359,9 @@ dir = 4 }, /obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = 0; pixel_y = 30 }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bBR" = ( /obj/structure/rack{ @@ -44670,9 +42374,7 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bBS" = ( /obj/structure/chair/office/dark{ @@ -44740,7 +42442,6 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -44763,7 +42464,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -44783,7 +42483,6 @@ /area/medical/medbay/central) "bCd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44828,7 +42527,6 @@ "bCj" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44862,7 +42560,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -44881,7 +42578,6 @@ }, /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -44891,7 +42587,6 @@ /area/medical/medbay/front_office) "bCr" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -44899,7 +42594,6 @@ light_color = "#e8eaff" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -44913,14 +42607,12 @@ /area/security/checkpoint/medical) "bCu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bCv" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -44931,7 +42623,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile, @@ -44943,7 +42634,6 @@ id = "cmoshutter"; name = "CMO Office Shutters"; pixel_x = -25; - pixel_y = 0; req_access_txt = "40" }, /turf/open/floor/plasteel/white, @@ -44957,7 +42647,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, @@ -44975,7 +42664,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -44989,7 +42677,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /mob/living/simple_animal/pet/penguin/emperor{ @@ -45000,7 +42687,6 @@ /area/crew_quarters/heads/cmo) "bCA" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile, @@ -45021,7 +42707,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/computer/security/telescreen/cmo{ @@ -45061,25 +42746,19 @@ /area/maintenance/department/medical) "bCF" = ( /obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bCG" = ( /obj/structure/destructible/cult/tome, /obj/item/clothing/under/suit/red, /obj/item/book/codex_gigas, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bCH" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bCI" = ( /obj/structure/table/wood, @@ -45091,18 +42770,14 @@ /obj/item/radio/intercom{ pixel_y = -29 }, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bCJ" = ( /obj/structure/table/wood, /obj/item/taperecorder, /obj/item/storage/photo_album, /obj/item/camera, -/turf/open/floor/plasteel/cult{ - dir = 2 - }, +/turf/open/floor/plasteel/cult, /area/library) "bCK" = ( /obj/machinery/firealarm{ @@ -45194,19 +42869,10 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"bCV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "bCW" = ( /obj/structure/window/reinforced{ dir = 1; @@ -45242,7 +42908,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -45253,7 +42918,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -45266,7 +42930,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -45280,16 +42943,13 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -45321,21 +42981,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bDg" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "bDh" = ( /turf/closed/wall/r_wall, /area/medical/medbay/front_office) @@ -45457,7 +43106,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/cable{ @@ -45486,7 +43134,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -45512,7 +43159,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/table/glass, @@ -45532,7 +43178,6 @@ dir = 6 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/carpet, @@ -45542,7 +43187,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile, @@ -45563,14 +43207,12 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/keycard_auth{ pixel_x = 30 }, /obj/machinery/computer/med_data{ - icon_state = "computer"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -45663,7 +43305,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -45689,7 +43330,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -45701,7 +43341,6 @@ }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile, @@ -45729,20 +43368,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/cmo) -"bDJ" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bDK" = ( /turf/closed/wall, /area/maintenance/bar) @@ -45778,7 +43403,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -45806,7 +43430,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -45819,14 +43442,12 @@ }, /obj/item/pen, /obj/machinery/camera{ - c_tag = "Security Post - Engineering"; - dir = 2 + c_tag = "Security Post - Engineering" }, /obj/machinery/newscaster{ pixel_y = 32 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -45837,7 +43458,6 @@ /area/hallway/secondary/command) "bDU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -45847,7 +43467,6 @@ /area/crew_quarters/heads/hop/private) "bDV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -45867,7 +43486,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -45881,14 +43499,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/virology) "bDZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -45897,7 +43513,6 @@ /obj/structure/chair, /obj/effect/landmark/start/virologist, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -45907,7 +43522,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -46001,7 +43615,6 @@ /area/medical/medbay/front_office) "bEi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/freezer, @@ -46039,7 +43652,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/cable, @@ -46060,7 +43672,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/holopad, @@ -46079,7 +43690,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/table/glass, @@ -46100,7 +43710,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/landmark/start/chief_medical_officer, @@ -46124,7 +43733,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/airalarm/directional/east, @@ -46255,7 +43863,6 @@ }, /obj/machinery/camera{ c_tag = "AI Chamber Fore"; - dir = 2; network = list("aicore") }, /obj/effect/turf_decal/tile/blue{ @@ -46341,17 +43948,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) -"bEK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/plasteel/dark, -/area/aisat) "bEL" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, @@ -46380,7 +43976,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -46390,7 +43985,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -46405,6 +43999,7 @@ /area/medical/virology) "bER" = ( /obj/structure/table, +/obj/item/storage/box/gloves, /turf/open/floor/plasteel/white, /area/medical/virology) "bES" = ( @@ -46415,7 +44010,6 @@ pixel_x = 27 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -46432,7 +44026,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -46456,7 +44049,6 @@ /area/medical/cryo) "bEV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -46476,14 +44068,15 @@ /area/medical/virology) "bEY" = ( /obj/structure/table, -/obj/item/storage/box/gloves, /obj/machinery/light{ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, /turf/open/floor/plasteel/white, /area/medical/virology) "bEZ" = ( @@ -46491,16 +44084,15 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "bFa" = ( /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/medical"; dir = 8; name = "Medbay Security APC"; - areastring = "/area/security/checkpoint/medical"; pixel_x = -25 }, /obj/structure/cable, @@ -46530,11 +44122,9 @@ /area/security/checkpoint/medical) "bFc" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -46565,7 +44155,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/suit_storage_unit/cmo, @@ -46573,7 +44162,6 @@ /area/crew_quarters/heads/cmo) "bFf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow{ @@ -46593,7 +44181,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/light, @@ -46613,11 +44200,9 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/computer/card/minor/cmo{ - icon_state = "computer"; dir = 1 }, /obj/machinery/requests_console{ @@ -46792,7 +44377,6 @@ /area/ai_monitored/turret_protected/ai) "bFA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -46820,13 +44404,12 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/engineering"; dir = 8; name = "Engineering Security APC"; - areastring = "/area/security/checkpoint/engineering"; pixel_x = -24 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -46845,7 +44428,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -46869,7 +44451,6 @@ "bFL" = ( /obj/machinery/power/apc{ areastring = "/area/medical/medbay/lobby"; - dir = 2; name = "Medbay Lobby APC"; pixel_y = -24 }, @@ -46887,7 +44468,6 @@ pixel_y = -22 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -46900,7 +44480,6 @@ }, /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/quartermaster/qm/private"; - dir = 2; name = "Quartermaster's Quarters APC"; pixel_y = -24 }, @@ -46979,11 +44558,9 @@ "bFX" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -47006,11 +44583,9 @@ /obj/machinery/requests_console{ department = "Security"; departmentType = 5; - pixel_x = -30; - pixel_y = 0 + pixel_x = -30 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -47059,7 +44634,6 @@ }, /obj/item/radio/off, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -47084,7 +44658,6 @@ /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Central Hall APC"; - pixel_x = 0; pixel_y = 25 }, /obj/structure/cable{ @@ -47110,7 +44683,6 @@ "bGi" = ( /obj/machinery/power/apc{ areastring = "/area/medical/medbay/front_office"; - dir = 2; name = "Medbay Front Office APC"; pixel_y = -24 }, @@ -47151,14 +44723,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bGm" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -47172,7 +44742,6 @@ pixel_y = 15 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/item/radio/intercom{ @@ -47220,6 +44789,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bGq" = ( @@ -47236,6 +44806,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bGr" = ( @@ -47243,7 +44814,6 @@ /obj/machinery/light, /obj/item/storage/box/donkpockets, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -47265,11 +44835,9 @@ /area/storage/emergency/starboard) "bGu" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -47279,7 +44847,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light_switch{ @@ -47291,7 +44858,6 @@ "bGw" = ( /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/crew_quarters/heads/hop/private"; - dir = 2; name = "Head of Personnel's Quarters APC"; pixel_y = -24 }, @@ -47439,7 +45005,7 @@ /turf/open/floor/wood, /area/maintenance/bar) "bGM" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood, /area/maintenance/bar) "bGN" = ( @@ -47644,7 +45210,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light, @@ -47664,7 +45229,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -47755,7 +45319,6 @@ "bHn" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; @@ -47768,7 +45331,6 @@ pixel_x = -27 }, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -47778,10 +45340,10 @@ /obj/machinery/door/window{ base_state = "rightsecure"; dir = 4; - obj_integrity = 300; icon_state = "rightsecure"; layer = 4.1; name = "Secondary AI Core Access"; + obj_integrity = 300; pixel_x = 4; req_access_txt = "16" }, @@ -47822,14 +45384,12 @@ pixel_y = 7 }, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_y = 27 }, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -47856,7 +45416,6 @@ "bHs" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; @@ -47869,7 +45428,6 @@ pixel_x = 27 }, /obj/item/radio/intercom{ - anyai = 1; freerange = 1; frequency = 1447; name = "Private Channel"; @@ -47879,10 +45437,10 @@ /obj/machinery/door/window{ base_state = "leftsecure"; dir = 8; - obj_integrity = 300; icon_state = "leftsecure"; layer = 4.1; name = "Tertiary AI Core Access"; + obj_integrity = 300; pixel_x = -3; req_access_txt = "16" }, @@ -47911,10 +45469,8 @@ /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; dir = 8; - icon_state = "sink_alt"; name = "old sink"; - pixel_x = 15; - pixel_y = 0 + pixel_x = 15 }, /turf/open/floor/wood, /area/maintenance/bar) @@ -47942,7 +45498,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -47951,7 +45506,6 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -47959,7 +45513,6 @@ "bHD" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -47971,7 +45524,6 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -47979,7 +45531,6 @@ "bHF" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -47999,7 +45550,6 @@ light_color = "#cee5d2" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -48017,7 +45567,6 @@ "bHI" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -48028,7 +45577,6 @@ light_color = "#706891" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -48036,16 +45584,19 @@ "bHK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bHL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, +/obj/structure/table, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/mask/muzzle, +/obj/item/soap/nanotrasen, +/obj/item/gun/syringe/dart, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bHM" = ( @@ -48063,7 +45614,6 @@ /obj/item/wrench, /obj/item/multitool, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -48163,9 +45713,9 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/starboard/aft"; dir = 8; name = "Starboard Quarter Solar APC"; - areastring = "/area/maintenance/solars/starboard/aft"; pixel_x = -26; pixel_y = 3 }, @@ -48209,7 +45759,6 @@ dir = 1 }, /obj/machinery/turnstile{ - icon_state = "turnstile_map"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -48218,7 +45767,6 @@ /obj/machinery/requests_console{ department = "AI"; departmentType = 5; - dir = 2; pixel_x = -30; pixel_y = -30 }, @@ -48253,9 +45801,9 @@ /obj/machinery/door/window{ base_state = "leftsecure"; dir = 8; - obj_integrity = 300; icon_state = "leftsecure"; name = "Primary AI Core Access"; + obj_integrity = 300; req_access_txt = "16" }, /obj/machinery/newscaster/security_unit{ @@ -48278,14 +45826,13 @@ /obj/machinery/door/window{ base_state = "rightsecure"; dir = 4; - obj_integrity = 300; icon_state = "rightsecure"; name = "Primary AI Core Access"; + obj_integrity = 300; req_access_txt = "16" }, /obj/machinery/camera{ c_tag = "AI Chamber - Core"; - dir = 2; network = list("aicore") }, /obj/effect/turf_decal/tile/neutral{ @@ -48374,7 +45921,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname, @@ -48415,7 +45961,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -48435,7 +45980,6 @@ /obj/structure/table, /obj/structure/bedsheetbin, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -48454,7 +45998,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -48463,7 +46006,6 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -48519,9 +46061,9 @@ /area/maintenance/department/cargo) "bII" = ( /obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard"; dir = 4; name = "Starboard Maintenance APC"; - areastring = "/area/maintenance/starboard"; pixel_x = 26 }, /obj/structure/cable, @@ -48781,7 +46323,6 @@ /area/maintenance/bar) "bJn" = ( /obj/effect/turf_decal/box/white/corners{ - icon_state = "box_corners_white"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -48905,9 +46446,8 @@ /area/medical/medbay/central) "bJz" = ( /obj/machinery/power/apc{ - dir = 2; - name = "Surgery APC"; areastring = "/area/medical/surgery"; + name = "Surgery APC"; pixel_y = -26 }, /obj/machinery/light, @@ -48932,7 +46472,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -48993,7 +46532,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/firealarm{ @@ -49016,7 +46554,6 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -49029,30 +46566,10 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/patients_rooms/room_a) -"bJH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/command) "bJI" = ( /obj/structure/extinguisher_cabinet{ dir = 4; @@ -49062,7 +46579,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/white, @@ -49072,7 +46588,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/landmark/xeno_spawn, @@ -49093,7 +46608,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49106,7 +46620,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49120,7 +46633,6 @@ pixel_y = 15 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -49129,7 +46641,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49142,7 +46653,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49158,7 +46668,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49249,7 +46758,6 @@ /area/maintenance/solars/starboard/aft) "bJW" = ( /obj/machinery/power/terminal{ - icon_state = "term"; dir = 8 }, /obj/structure/cable{ @@ -49262,8 +46770,7 @@ /obj/machinery/power/solar_control{ dir = 8; id = "aftstarboard"; - name = "Starboard Quarter Solar Control"; - track = 0 + name = "Starboard Quarter Solar Control" }, /obj/structure/cable, /obj/structure/cable{ @@ -49287,7 +46794,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -49304,7 +46810,6 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -49409,7 +46914,6 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49429,7 +46933,6 @@ pixel_y = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49462,7 +46965,6 @@ }, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49477,7 +46979,6 @@ /obj/machinery/microwave, /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -49493,14 +46994,12 @@ pixel_y = 22 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical) "bKu" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/white, @@ -49525,11 +47024,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -49540,7 +47037,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49574,7 +47070,6 @@ "bKD" = ( /obj/structure/curtain, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -49616,11 +47111,9 @@ layer = 2.9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -49639,7 +47132,6 @@ pixel_x = 30 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -49651,7 +47143,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -49678,9 +47169,8 @@ /area/maintenance/port) "bKO" = ( /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "Port Maintenance APC"; areastring = "/area/maintenance/port"; + name = "Port Maintenance APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -49716,7 +47206,6 @@ pixel_x = 5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49724,21 +47213,18 @@ "bKS" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/power/apc{ - dir = 2; - name = "Abandoned Garden APC"; areastring = "/area/hydroponics/garden/abandoned"; + name = "Abandoned Garden APC"; pixel_y = -26 }, /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plating, /area/hydroponics/garden/abandoned) "bKT" = ( /obj/item/poster/random_contraband, -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -49750,20 +47236,6 @@ "bKV" = ( /turf/open/floor/plasteel/white, /area/medical/surgery) -"bKW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bKX" = ( /obj/structure/extinguisher_cabinet{ dir = 4; @@ -49771,7 +47243,6 @@ }, /obj/machinery/vending/cigarette, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -49785,26 +47256,11 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/plasteel/dark, /area/aisat) -"bKZ" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bLa" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -49854,14 +47310,13 @@ /area/medical) "bLf" = ( /obj/machinery/power/apc{ + areastring = "/area/medical/patients_rooms/room_a"; dir = 8; name = "Patient Room A APC"; - areastring = "/area/medical/patients_rooms/room_a"; pixel_x = -26 }, /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49877,7 +47332,6 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -49888,7 +47342,6 @@ light_color = "#d8b1b1" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/wood, @@ -49934,7 +47387,6 @@ /area/maintenance/central) "bLo" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -49944,7 +47396,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49962,7 +47413,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -49979,7 +47429,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -49990,7 +47439,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -50006,7 +47454,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/white, @@ -50019,7 +47466,6 @@ }, /obj/machinery/vending/cola/random, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -50048,11 +47494,9 @@ "bLw" = ( /obj/machinery/light/small, /obj/machinery/vending/wallmed{ - pixel_x = -28; - pixel_y = 0 + pixel_x = -28 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -50065,7 +47509,6 @@ }, /obj/item/clothing/neck/stethoscope, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -50073,7 +47516,6 @@ "bLy" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -50112,7 +47554,6 @@ /obj/item/book/manual/wiki/surgery, /obj/item/surgical_drapes, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -50122,7 +47563,6 @@ /obj/item/book/manual/wiki/surgery, /obj/item/surgical_drapes, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -50148,7 +47588,6 @@ "bLG" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -50157,17 +47596,6 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"bLI" = ( -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bLJ" = ( /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat/foyer) @@ -50180,23 +47608,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) -"bLL" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bLM" = ( /turf/open/floor/carpet/orange, /area/quartermaster/qm/private) "bLN" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/airalarm{ @@ -50224,7 +47640,6 @@ pixel_y = -24 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -50238,7 +47653,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -50373,9 +47787,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "bMa" = ( -/obj/machinery/porta_turret/ai{ - dir = 2 - }, +/obj/machinery/porta_turret/ai, /obj/machinery/computer/security/telescreen{ desc = "Used for watching the RD's goons from the safety of his office."; dir = 4; @@ -50394,7 +47806,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -50473,9 +47884,7 @@ /turf/open/floor/plasteel/white, /area/medical) "bMi" = ( -/obj/machinery/porta_turret/ai{ - dir = 2 - }, +/obj/machinery/porta_turret/ai, /obj/machinery/computer/security/telescreen/minisat{ dir = 8; pixel_x = 28 @@ -50488,7 +47897,6 @@ "bMj" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/white, @@ -50547,11 +47955,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -50641,7 +48047,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -50741,11 +48146,9 @@ layer = 2.9 }, /obj/machinery/atmospherics/pipe/layer_manifold{ - icon_state = "manifoldlayer"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -50759,14 +48162,12 @@ areastring = "/area/ai_monitored/turret_protected/aisat_interior"; dir = 1; name = "MiniSat Antechamber APC"; - pixel_x = 0; pixel_y = 29 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -50776,7 +48177,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -50813,15 +48213,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bMM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -50846,25 +48237,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"bMQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) -"bMR" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bMS" = ( /obj/structure/window/reinforced{ dir = 8; @@ -50912,7 +48284,6 @@ }, /obj/machinery/power/apc{ areastring = "/area/medical"; - dir = 2; name = "Breakroom APC"; pixel_y = -24 }, @@ -50976,18 +48347,6 @@ /obj/structure/window/reinforced/spawner, /turf/open/space, /area/space) -"bNg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "bNh" = ( /obj/machinery/airalarm{ dir = 4; @@ -51000,7 +48359,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "bNi" = ( /obj/structure/showcase/cyborg/old{ - dir = 2; pixel_y = 20 }, /obj/effect/turf_decal/tile/blue{ @@ -51017,7 +48375,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -51041,11 +48398,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/machinery/navbeacon{ @@ -51080,15 +48435,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 8 }, /obj/machinery/navbeacon{ @@ -51110,7 +48462,6 @@ "bNp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -51239,7 +48590,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -51293,7 +48643,6 @@ /area/ai_monitored/turret_protected/aisat/foyer) "bNE" = ( /obj/structure/transit_tube/diagonal{ - icon_state = "diagonal"; dir = 8 }, /turf/open/space, @@ -51305,7 +48654,6 @@ "bNG" = ( /obj/machinery/vending/hydroseeds, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -51321,11 +48669,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -51338,28 +48684,12 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bNK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"bNL" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bNM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -51373,7 +48703,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -51381,11 +48710,9 @@ "bNP" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -51394,7 +48721,6 @@ /obj/effect/turf_decal/tile/neutral, /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -51405,7 +48731,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -51414,7 +48739,6 @@ /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -51422,33 +48746,13 @@ "bNT" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"bNU" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"bNV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bNW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -51481,7 +48785,6 @@ /area/hallway/secondary/exit) "bNX" = ( /obj/structure/showcase/cyborg/old{ - dir = 2; pixel_y = 20 }, /obj/effect/turf_decal/tile/blue{ @@ -51495,14 +48798,12 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, /area/aisat) "bNZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -51511,7 +48812,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -51734,9 +49034,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "bOm" = ( -/obj/machinery/porta_turret/ai{ - dir = 2 - }, +/obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -51906,7 +49204,6 @@ }, /obj/machinery/turretid{ control_area = "/area/ai_monitored/turret_protected/aisat/foyer"; - enabled = 1; icon_state = "control_stun"; name = "Antechamber Turret Control"; pixel_x = -32; @@ -51991,7 +49288,6 @@ "bOA" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/junction{ - icon_state = "junction0"; dir = 4 }, /obj/structure/cable{ @@ -52081,7 +49377,6 @@ /area/space/nearstation) "bOI" = ( /obj/structure/transit_tube/junction{ - icon_state = "junction0"; dir = 8 }, /obj/structure/lattice/catwalk, @@ -52268,7 +49563,6 @@ /area/hallway/primary/aft) "bOW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -52402,7 +49696,6 @@ /area/hallway/primary/aft) "bPc" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -52572,39 +49865,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bPk" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"bPl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bPm" = ( /obj/structure/rack, /obj/item/circuitboard/machine/telecomms/bus{ @@ -52720,7 +49980,6 @@ }, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -52750,11 +50009,9 @@ sortType = 10 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -52783,11 +50040,9 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -52918,7 +50173,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -52931,10 +50185,8 @@ /obj/structure/cable, /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/ai_monitored/turret_protected/aisat/foyer"; - dir = 2; name = "MiniSat Foyer APC"; - pixel_x = -29; - pixel_y = 0 + pixel_x = -29 }, /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -52943,7 +50195,6 @@ /area/ai_monitored/turret_protected/aisat_interior) "bPK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -52952,7 +50203,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -52967,7 +50217,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -52980,14 +50229,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "bPP" = ( /obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -53001,11 +50248,9 @@ areastring = "/area/aisat"; dir = 8; name = "MiniSat Exterior APC"; - pixel_x = -24; - pixel_y = 0 + pixel_x = -24 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -53016,7 +50261,6 @@ /area/space/nearstation) "bPS" = ( /obj/structure/transit_tube/diagonal{ - icon_state = "diagonal"; dir = 4 }, /turf/open/space/basic, @@ -53048,19 +50292,8 @@ }, /turf/open/floor/plasteel, /area/engine/transit_tube) -"bPV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bPW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/wood, @@ -53154,14 +50387,11 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera{ c_tag = "Arrivals Hallway Port"; - dir = 4; - name = "security camera"; - network = list("ss13") + dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) @@ -53179,7 +50409,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ @@ -53205,7 +50434,6 @@ /area/ai_monitored/storage/satellite) "bQm" = ( /obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -53237,7 +50465,6 @@ }, /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -53247,14 +50474,12 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/end{ - icon_state = "trimline_end_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bQq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -53268,7 +50493,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -53380,7 +50604,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -53419,38 +50642,19 @@ /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer1{ dir = 1; - icon_state = "connector_map-1"; name = "Auxiliary MiniSat Distribution Port" }, /turf/open/floor/plasteel, /area/ai_monitored/storage/satellite) "bQL" = ( -/obj/machinery/porta_turret/ai{ - dir = 2 - }, +/obj/machinery/porta_turret/ai, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/foyer) -"bQM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bQN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -53475,24 +50679,6 @@ }, /turf/open/floor/carpet, /area/bridge) -"bQP" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bQQ" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -53508,7 +50694,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/tile/neutral{ @@ -53524,7 +50709,6 @@ }, /obj/effect/turf_decal/tile/red, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -53535,7 +50719,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "N2O to Pure" }, /obj/effect/turf_decal/tile/red, @@ -53554,7 +50737,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -53568,7 +50750,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, @@ -53663,8 +50844,6 @@ /obj/structure/table, /obj/machinery/requests_console{ department = "Tool Storage"; - departmentType = 0; - pixel_x = 0; pixel_y = 30 }, /obj/item/folder/yellow, @@ -53728,7 +50907,6 @@ /obj/structure/table/wood, /obj/item/instrument/violin, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/carpet, @@ -53745,7 +50923,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -53778,11 +50955,9 @@ /area/crew_quarters/dorms) "bRo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/carpet, @@ -53796,36 +50971,20 @@ "bRq" = ( /obj/structure/showcase/mecha/ripley, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel/dark, /area/bridge/showroom/corporate) -"bRr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bRs" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bRt" = ( -/obj/machinery/cryopod{ - icon_state = "cryopod-open"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) "bRu" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral, /obj/machinery/newscaster{ - pixel_x = 0; pixel_y = 32 }, /obj/effect/turf_decal/loading_area{ @@ -53838,7 +50997,6 @@ pixel_y = 32 }, /obj/effect/turf_decal/trimline/green/filled/end{ - icon_state = "trimline_end_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -53965,34 +51123,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/cafeteria) -"bRM" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -29 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bRN" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bRO" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "bRP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 @@ -54007,14 +51143,12 @@ dir = 10 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/white, /area/medical) "bRR" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -54034,7 +51168,6 @@ }, /obj/structure/sign/directions/science{ dir = 1; - icon_state = "direction_sci"; pixel_y = 32 }, /obj/structure/sign/directions/command{ @@ -54049,18 +51182,15 @@ pixel_x = -22 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/aisat) "bRU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -54080,13 +51210,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bRW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bRX" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -54100,11 +51223,9 @@ "bRY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54112,11 +51233,9 @@ "bRZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54164,13 +51283,6 @@ }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) -"bSh" = ( -/obj/structure/showcase/cyborg/old{ - dir = 2; - pixel_y = 20 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "bSi" = ( /obj/machinery/light/small{ dir = 1 @@ -54228,7 +51340,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -54281,22 +51392,9 @@ }, /turf/open/floor/plasteel, /area/storage/primary) -"bSu" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bSv" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -54320,7 +51418,6 @@ "bSx" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54350,7 +51447,6 @@ icon_state = "1-2" }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -54365,24 +51461,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/wood, /area/crew_quarters/dorms) -"bSC" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "bSD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54396,24 +51479,10 @@ pixel_x = 29 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"bSF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "bSG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -54426,7 +51495,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/end{ - icon_state = "trimline_end_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54511,11 +51579,9 @@ /area/tcommsat/computer) "bSW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -54591,9 +51657,9 @@ icon_state = "0-8" }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/tcommsat/computer"; dir = 4; name = "Telecomms Control Room APC"; - areastring = "/area/tcommsat/computer"; pixel_x = 26 }, /turf/open/floor/plasteel/grimy, @@ -54742,7 +51808,6 @@ /area/storage/primary) "bTp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -54776,11 +51841,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -54793,11 +51856,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -54814,11 +51875,9 @@ /area/crew_quarters/fitness/recreation) "bTv" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -54878,7 +51937,6 @@ }, /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -54894,15 +51952,12 @@ }, /obj/effect/turf_decal/trimline/green/filled/corner, /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -54910,14 +51965,12 @@ "bTC" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "bTD" = ( /obj/effect/turf_decal/trimline/green/filled/end{ - icon_state = "trimline_end_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -54958,9 +52011,9 @@ /area/storage/tech) "bTI" = ( /obj/machinery/power/apc{ + areastring = "/area/storage/tech"; dir = 8; name = "Tech Storage APC"; - areastring = "/area/storage/tech"; pixel_x = -27 }, /obj/structure/cable{ @@ -55052,38 +52105,10 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bTQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "bTR" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-21" @@ -55173,8 +52198,7 @@ areastring = "/area/storage/primary"; dir = 8; name = "Tool Storage APC"; - pixel_x = -25; - pixel_y = 0 + pixel_x = -25 }, /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -55340,7 +52364,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -55369,11 +52392,9 @@ "bUo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -55404,16 +52425,13 @@ /area/crew_quarters/fitness/recreation) "bUr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark/corner{ - icon_state = "darkcorner"; dir = 8 }, /area/hallway/primary/aft) @@ -55428,7 +52446,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -55480,7 +52497,6 @@ /area/crew_quarters/fitness/recreation) "bUx" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera{ @@ -55494,7 +52510,6 @@ "bUy" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -55519,11 +52534,9 @@ "bUA" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -55599,20 +52612,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"bUN" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bUO" = ( /obj/structure/cable{ icon_state = "0-8" @@ -55621,8 +52620,7 @@ areastring = "/area/maintenance/fore"; dir = 4; name = "Fore Maintenance APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /turf/open/floor/plating, /area/maintenance/fore) @@ -55704,18 +52702,16 @@ "bUY" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, +/obj/machinery/iv_drip, /turf/open/floor/plasteel/white, /area/medical/storage) "bUZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/wood, @@ -55744,7 +52740,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sign/directions/supply{ @@ -55855,7 +52850,6 @@ "bVk" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/navbeacon{ @@ -55863,7 +52857,6 @@ location = "aft1" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -55874,11 +52867,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -55899,16 +52890,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"bVn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) "bVo" = ( /obj/machinery/light{ dir = 1; @@ -55920,7 +52901,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/sign/directions/medical{ dir = 4; - icon_state = "direction_med"; pixel_y = 40 }, /obj/structure/sign/directions/engineering{ @@ -55929,18 +52909,15 @@ }, /obj/structure/sign/directions/evac{ dir = 4; - pixel_x = 0; pixel_y = 24 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bVp" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -55954,7 +52931,6 @@ uses = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -55979,7 +52955,6 @@ }, /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Port"; - dir = 2; network = list("ss13","tcomms") }, /turf/open/floor/plasteel/dark/telecomms, @@ -55989,7 +52964,6 @@ dir = 4 }, /obj/machinery/computer/arcade/orion_trail{ - icon_state = "arcade"; dir = 4 }, /turf/open/floor/plasteel, @@ -56041,7 +53015,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -56056,8 +53029,7 @@ }, /obj/machinery/announcement_system, /obj/machinery/status_display/ai{ - pixel_x = 31; - pixel_y = 0 + pixel_x = 31 }, /turf/open/floor/carpet, /area/tcommsat/computer) @@ -56144,18 +53116,15 @@ /area/medical/morgue) "bVI" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -56166,14 +53135,12 @@ dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel/white, /area/medical/virology) "bVK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/navbeacon{ @@ -56181,7 +53148,6 @@ location = "starboard3" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -56280,11 +53246,9 @@ /area/library) "bVQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light_switch{ @@ -56325,7 +53289,6 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/light_switch{ @@ -56351,7 +53314,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/structure/sign/directions/evac{ @@ -56373,26 +53335,21 @@ "bVX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "bVY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -56483,7 +53440,6 @@ /area/tcommsat/computer) "bWm" = ( /obj/machinery/computer/message_monitor{ - icon_state = "computer"; dir = 8 }, /turf/open/floor/carpet, @@ -56564,11 +53520,9 @@ /area/crew_quarters/fitness/recreation) "bWs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -56584,7 +53538,6 @@ /area/crew_quarters/dorms) "bWu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -56603,7 +53556,6 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -56617,24 +53569,8 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"bWx" = ( -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" - }, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) "bWy" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -56657,7 +53593,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/carpet, @@ -56685,11 +53620,9 @@ "bWF" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/status_display/ai{ @@ -56744,7 +53677,6 @@ /obj/machinery/telecomms/processor/preset_three, /obj/machinery/camera{ c_tag = "Telecomms - Server Room - Fore-Starboard"; - dir = 2; network = list("ss13","tcomms") }, /turf/open/floor/circuit/telecomms/mainframe, @@ -56770,7 +53702,6 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -56853,7 +53784,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -56909,11 +53839,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -56931,7 +53859,6 @@ "bXb" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -56962,18 +53889,6 @@ /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) -"bXh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "bXi" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -57038,18 +53953,15 @@ "bXr" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel/white, /area/medical/virology) "bXs" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -57109,7 +54021,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -57158,11 +54069,9 @@ pixel_y = 32 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -57175,11 +54084,9 @@ pixel_y = 32 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -57189,11 +54096,9 @@ pixel_y = 24 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile, @@ -57317,7 +54222,6 @@ }, /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -57336,7 +54240,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -57390,14 +54293,12 @@ pixel_x = 3 }, /obj/machinery/status_display/evac{ - pixel_x = 31; - pixel_y = 0 + pixel_x = 31 }, /turf/open/floor/carpet, /area/tcommsat/computer) "bXT" = ( /obj/structure/transit_tube/station{ - icon_state = "closed_station0"; dir = 8 }, /obj/structure/cable{ @@ -57410,7 +54311,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -57418,11 +54318,9 @@ "bXU" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /obj/machinery/camera/autoname, @@ -57430,7 +54328,6 @@ /area/medical/virology) "bXV" = ( /obj/structure/chair/sofa/left{ - icon_state = "sofaend_left"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -57438,7 +54335,6 @@ "bXW" = ( /obj/machinery/airalarm/directional/south, /obj/structure/chair/sofa/right{ - icon_state = "sofaend_right"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -57528,24 +54424,20 @@ "bYe" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bYf" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -57577,7 +54469,6 @@ id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -38; - pixel_y = 0; req_access_txt = "24" }, /turf/open/floor/plasteel, @@ -57607,7 +54498,6 @@ "bYk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile, @@ -57661,7 +54551,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -57701,7 +54590,6 @@ /area/engine/break_room) "bYs" = ( /obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -57732,9 +54620,8 @@ /area/maintenance/starboard/aft) "bYw" = ( /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "Starboard Quarter Maintenance APC"; areastring = "/area/maintenance/starboard/aft"; + name = "Starboard Quarter Maintenance APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -57764,7 +54651,6 @@ /area/maintenance/starboard/aft) "bYA" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -57799,9 +54685,9 @@ /area/tcommsat/server) "bYF" = ( /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/tcommsat/server"; dir = 4; name = "Telecomms Server Room APC"; - areastring = "/area/tcommsat/server"; pixel_x = 25 }, /obj/machinery/light/small{ @@ -57822,12 +54708,10 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -57846,8 +54730,7 @@ dir = 4; freerange = 1; name = "Station Intercom (Telecomms)"; - pixel_x = 30; - pixel_y = 0 + pixel_x = 30 }, /turf/open/floor/carpet, /area/tcommsat/computer) @@ -57918,7 +54801,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -57972,7 +54854,6 @@ "bYU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile, @@ -57987,7 +54868,6 @@ }, /obj/structure/chair/stool, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -58107,7 +54987,6 @@ "bZk" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/item/flashlight, @@ -58146,16 +55025,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bZn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bZo" = ( /turf/open/floor/plasteel/dark, /area/science/robotics/lab) @@ -58278,11 +55147,9 @@ "bZA" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/computer/card/minor/ce{ - icon_state = "computer"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -58290,7 +55157,6 @@ /area/crew_quarters/heads/chief) "bZB" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -58299,11 +55165,9 @@ "bZC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -58322,7 +55186,6 @@ dir = 8 }, /obj/machinery/modular_computer/console/preset/engineering{ - icon_state = "console"; dir = 8 }, /obj/structure/cable{ @@ -58367,7 +55230,6 @@ /area/engine/break_room) "bZG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/grimy, @@ -58396,25 +55258,14 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/closet/secure_closet/CMO, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/cmo) -"bZJ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel, -/area/engine/break_room) "bZK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -58458,7 +55309,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -58483,11 +55333,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -58508,7 +55356,6 @@ /area/crew_quarters/fitness/recreation) "bZT" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/camera{ @@ -58523,7 +55370,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/item/radio/intercom{ @@ -58553,7 +55399,6 @@ "bZY" = ( /obj/machinery/power/apc{ areastring = "/area/crew_quarters/toilet"; - dir = 2; name = "Restrooms APC"; pixel_y = -26 }, @@ -58565,7 +55410,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -58578,7 +55422,6 @@ dir = 8 }, /obj/machinery/computer/station_alert{ - icon_state = "computer"; dir = 4 }, /obj/effect/turf_decal/tile/neutral, @@ -58656,8 +55499,7 @@ areastring = "/area/crew_quarters/heads/chief"; dir = 4; name = "Chief Engineer's APC"; - pixel_x = 26; - pixel_y = 0 + pixel_x = 26 }, /obj/structure/cable{ icon_state = "0-2"; @@ -58694,14 +55536,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"cah" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/break_room) "cai" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -58719,7 +55553,6 @@ }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow, @@ -58749,7 +55582,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -58781,8 +55613,7 @@ areastring = "/area/crew_quarters/locker"; dir = 8; name = "Locker Room APC"; - pixel_x = -28; - pixel_y = 0 + pixel_x = -28 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) @@ -58799,13 +55630,6 @@ /obj/structure/table, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"cav" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "caw" = ( /obj/machinery/light{ dir = 1 @@ -58878,17 +55702,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) -"caB" = ( -/obj/structure/urinal{ - dir = 8; - icon_state = "urinal"; - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) "caC" = ( /obj/machinery/computer/apc_control{ - icon_state = "computer"; dir = 4 }, /obj/effect/turf_decal/tile/neutral, @@ -58948,7 +55763,6 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/cable{ @@ -59131,9 +55945,9 @@ "caP" = ( /obj/structure/table, /obj/machinery/power/apc{ + areastring = "/area/storage/tcom"; dir = 8; name = "Telecomms Storage APC"; - areastring = "/area/storage/tcom"; pixel_x = -28 }, /obj/structure/cable, @@ -59208,7 +56022,6 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -59256,7 +56069,6 @@ }, /obj/structure/fans/tiny, /obj/effect/turf_decal/trimline/blue/filled/end{ - icon_state = "trimline_end_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -59266,7 +56078,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ @@ -59281,7 +56092,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -59295,7 +56105,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -59329,14 +56138,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cbh" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cbi" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -59359,17 +56160,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cbk" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cbl" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -59392,14 +56182,12 @@ areastring = "/area/crew_quarters/dorms"; dir = 4; name = "Dormitories APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/structure/cable{ icon_state = "0-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -59513,7 +56301,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -59544,7 +56331,6 @@ "cbx" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light, @@ -59594,7 +56380,6 @@ /area/space) "cbD" = ( /obj/structure/transit_tube/curved/flipped{ - icon_state = "curved1"; dir = 1 }, /obj/structure/window/reinforced{ @@ -59602,7 +56387,6 @@ }, /obj/structure/window/reinforced, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel/dark, @@ -59637,29 +56421,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cbI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cbJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -59674,7 +56435,6 @@ /area/medical/patients_rooms/room_a) "cbK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -59737,7 +56497,6 @@ /area/crew_quarters/fitness/recreation) "cbO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plating, @@ -59745,7 +56504,6 @@ "cbP" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -59761,7 +56519,6 @@ pixel_x = -26 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -59790,7 +56547,6 @@ /area/science/robotics/lab) "cbU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plating, @@ -59809,7 +56565,6 @@ /obj/structure/table/reinforced, /obj/machinery/recharger, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -59913,7 +56668,6 @@ "cch" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plating, @@ -59921,7 +56675,6 @@ "cci" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ @@ -59978,19 +56731,17 @@ /area/crew_quarters/fitness/recreation) "ccn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cco" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, /obj/machinery/computer/holodeck{ dir = 4 }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "ccp" = ( @@ -60016,14 +56767,12 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/carpet/black, /area/crew_quarters/dorms) "ccr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/camera{ @@ -60039,7 +56788,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -60050,7 +56798,6 @@ light_color = "#d8b1b1" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/carpet/black, @@ -60070,13 +56817,12 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "ccw" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/machinery/light/small{ @@ -60165,7 +56911,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -60186,7 +56931,6 @@ /area/asteroid/nearstation) "ccI" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -60231,26 +56975,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/break_room) -"ccP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/break_room) "ccQ" = ( /obj/machinery/light, /obj/effect/turf_decal/tile/red{ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/yellow{ @@ -60289,7 +57019,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -60332,8 +57061,7 @@ areastring = "/area/crew_quarters/heads/cmo/private"; dir = 4; name = "Chief Medical Officer's Quarters APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/structure/cable{ icon_state = "0-8" @@ -60350,7 +57078,6 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/wood, @@ -60363,7 +57090,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -60374,7 +57100,6 @@ light_color = "#d8b1b1" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/wood, @@ -60401,7 +57126,6 @@ /obj/machinery/recharger, /obj/structure/table, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -60517,7 +57241,6 @@ }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow, @@ -60612,7 +57335,7 @@ /turf/open/floor/plating, /area/maintenance/fore) "cdE" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/effect/landmark/blobstart, @@ -60646,7 +57369,7 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) "cdH" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/light/small{ @@ -60658,7 +57381,6 @@ name = "Lock Control"; normaldoorcontrol = 1; pixel_x = 25; - pixel_y = 0; specialfunctions = 4 }, /obj/machinery/newscaster{ @@ -60669,7 +57391,6 @@ "cdI" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/dormitory"; - dir = 2; name = "Dormitory Maintenance APC"; pixel_y = -28 }, @@ -60704,7 +57425,6 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/carpet, @@ -60718,7 +57438,6 @@ pixel_x = 27 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -60727,7 +57446,6 @@ /obj/machinery/microwave, /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -60769,7 +57487,6 @@ }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow, @@ -60780,7 +57497,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -60842,7 +57558,6 @@ }, /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -60880,7 +57595,6 @@ /area/crew_quarters/toilet) "ceh" = ( /obj/machinery/requests_console{ - announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC" @@ -61047,7 +57761,6 @@ /area/maintenance/aft) "ceH" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/camera/autoname, @@ -61064,7 +57777,6 @@ }, /obj/structure/bedsheetbin, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -61078,7 +57790,6 @@ /area/maintenance/department/crew_quarters/dorms) "ceK" = ( /obj/structure/sign/warning/radiation/rad_area{ - pixel_x = 0; pixel_y = -32 }, /turf/open/floor/plating, @@ -61095,7 +57806,6 @@ /area/engine/break_room) "ceM" = ( /obj/machinery/door/window/southright{ - dir = 2; name = "Engineering Deliveries"; req_access_txt = "10" }, @@ -61111,11 +57821,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -61125,15 +57833,13 @@ /obj/item/bedsheet/cmo, /obj/structure/bed, /obj/machinery/status_display/ai{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo/private) "ceP" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61141,7 +57847,6 @@ "ceQ" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61149,7 +57854,6 @@ "ceR" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61170,7 +57874,6 @@ /area/hallway/primary/aft) "ceU" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61183,7 +57886,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61292,7 +57994,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -61302,7 +58003,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -61345,7 +58045,6 @@ /area/maintenance/aft) "cfq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -61367,7 +58066,6 @@ /area/crew_quarters/locker) "cfs" = ( /obj/effect/turf_decal/trimline/neutral/filled/end{ - icon_state = "trimline_end_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61377,7 +58075,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -61387,7 +58084,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61408,7 +58104,6 @@ /area/engine/gravity_generator) "cfx" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -61429,7 +58124,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -61516,7 +58210,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -61530,7 +58223,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -61559,7 +58251,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -61570,7 +58261,6 @@ light_color = "#d8b1b1" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/carpet, @@ -61599,7 +58289,6 @@ areastring = "/area/chapel/main"; dir = 1; name = "Chapel APC"; - pixel_x = 0; pixel_y = 24 }, /obj/structure/cable{ @@ -61703,7 +58392,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61716,7 +58404,6 @@ "cgl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/grimy, @@ -61773,7 +58460,6 @@ /area/engine/gravity_generator) "cgs" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -61834,7 +58520,6 @@ }, /obj/structure/closet/radiation, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -61896,7 +58581,7 @@ /turf/open/space, /area/space/nearstation) "cgJ" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/maintenance/aft) "cgK" = ( @@ -61946,7 +58631,6 @@ /area/chapel/main) "cgP" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -62038,9 +58722,9 @@ /area/crew_quarters/heads/chief) "chd" = ( /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/engine/gravity_generator"; dir = 1; name = "Gravity Generator APC"; - areastring = "/area/engine/gravity_generator"; pixel_y = 24 }, /obj/structure/cable/yellow{ @@ -62063,7 +58747,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -62100,7 +58783,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/ai{ @@ -62173,7 +58855,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -62222,7 +58903,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ - icon_state = "inje_map-2"; dir = 4 }, /turf/open/floor/plating/airless, @@ -62271,7 +58951,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -62332,7 +59011,6 @@ "chK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -62402,29 +59080,24 @@ "chR" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "chS" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "chT" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/light{ @@ -62524,7 +59197,6 @@ }, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -62553,18 +59225,15 @@ /area/engine/break_room) "cif" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/dark, /area/security/execution/education) "cig" = ( /obj/structure/sign/warning/radiation/rad_area{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -62574,11 +59243,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -62695,7 +59362,6 @@ "cis" = ( /obj/structure/window/reinforced/spawner/north, /obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - icon_state = "filter_on"; dir = 8 }, /obj/effect/turf_decal/tile/red, @@ -62732,7 +59398,6 @@ "civ" = ( /obj/structure/window/reinforced/spawner/north, /obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ - icon_state = "filter_on"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -62826,7 +59491,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ - icon_state = "filter_on"; dir = 8 }, /turf/open/floor/plasteel, @@ -62859,7 +59523,6 @@ /area/maintenance/port) "ciE" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3{ - icon_state = "inje_map-2"; dir = 4 }, /turf/open/floor/plating/airless, @@ -62888,12 +59551,10 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/camera{ c_tag = "Arrivals Hallway Stern"; - dir = 2; name = "arrivals camera" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -62922,7 +59583,7 @@ }, /area/maintenance/aft) "ciL" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -62947,7 +59608,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -62984,7 +59644,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -63031,18 +59690,10 @@ }, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/engine/break_room) -"ciZ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/break_room) "cja" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics"; @@ -63113,7 +59764,6 @@ "cjg" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -63248,7 +59898,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -63261,7 +59910,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -63274,7 +59922,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -63311,7 +59958,6 @@ /area/maintenance/aft) "cjC" = ( /obj/structure/mirror{ - pixel_x = 0; pixel_y = -28 }, /obj/item/lipstick/black, @@ -63356,7 +60002,6 @@ "cjG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -63372,7 +60017,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -63563,7 +60207,6 @@ /area/engine/atmos) "ckg" = ( /obj/machinery/atmospherics/components/binary/pump{ - dir = 2; name = "Pure to Fuel Pipe" }, /turf/open/floor/plasteel, @@ -63615,7 +60258,6 @@ /area/chapel/main) "cko" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/camera{ @@ -63649,8 +60291,7 @@ "ckr" = ( /obj/machinery/vending/coffee, /obj/machinery/newscaster{ - pixel_x = 30; - pixel_y = 0 + pixel_x = 30 }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) @@ -63837,7 +60478,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -63946,8 +60586,7 @@ dir = 4 }, /obj/machinery/newscaster{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) @@ -64079,7 +60718,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -64089,8 +60727,7 @@ areastring = "/area/engine/engine_smes"; dir = 1; name = "SMES room APC"; - pixel_x = -26; - pixel_y = 0 + pixel_x = -26 }, /obj/structure/cable{ icon_state = "0-2"; @@ -64216,7 +60853,6 @@ /area/engine/atmos) "clA" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos{ - icon_state = "filter_on"; dir = 4 }, /turf/open/floor/plasteel, @@ -64226,11 +60862,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -64269,7 +60903,6 @@ /obj/item/storage/crayons, /obj/item/storage/crayons, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -64277,7 +60910,6 @@ "clG" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/engine/break_room"; - dir = 2; name = "Engineering Foyer APC"; pixel_y = -24 }, @@ -64323,7 +60955,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -64331,7 +60962,6 @@ "clL" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -64349,12 +60979,10 @@ "clO" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -64375,11 +61003,9 @@ pixel_y = -5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -64416,7 +61042,6 @@ broadcasting = 1; frequency = 1481; name = "Confessional Intercom"; - pixel_x = 0; pixel_y = -30 }, /obj/machinery/light/small{ @@ -64437,7 +61062,6 @@ broadcasting = 1; frequency = 1481; name = "Confessional Intercom"; - pixel_x = 0; pixel_y = 30 }, /obj/machinery/light/small{ @@ -64497,7 +61121,6 @@ /area/crew_quarters/heads/chief) "cmf" = ( /obj/effect/turf_decal/box/white/corners{ - icon_state = "box_corners_white"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -64531,14 +61154,12 @@ "cmi" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -64577,7 +61198,6 @@ "cmm" = ( /obj/machinery/door/window/westleft{ base_state = "right"; - dir = 8; icon_state = "right" }, /obj/effect/spawner/lootdrop/maintenance, @@ -64591,7 +61211,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -64643,7 +61262,6 @@ }, /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -64690,7 +61308,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -64705,7 +61322,6 @@ /obj/item/wrench, /obj/item/clothing/glasses/meson/engine, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -64726,7 +61342,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -64735,7 +61350,6 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ name = "Vacant Office"; - opacity = 1; req_access_txt = "32" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -64778,7 +61392,6 @@ /area/security/vacantoffice/a) "cmJ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -64797,14 +61410,12 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -64820,14 +61431,12 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ dir = 1 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -64948,11 +61557,9 @@ areastring = "/area/engine/atmos"; dir = 1; name = "Atmospherics APC"; - pixel_x = -27; - pixel_y = 0 + pixel_x = -27 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -64998,7 +61605,6 @@ pixel_x = -28 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -65030,7 +61636,6 @@ /area/engine/atmos) "cnj" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/structure/extinguisher_cabinet{ @@ -65103,7 +61708,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -65138,7 +61742,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -65167,7 +61770,6 @@ /area/security/vacantoffice/a) "cnz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/grimy, @@ -65190,7 +61792,6 @@ /area/chapel/office) "cnC" = ( /obj/machinery/computer/arcade{ - icon_state = "arcade"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -65198,14 +61799,12 @@ "cnD" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ @@ -65260,11 +61859,9 @@ "cnH" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/camera{ @@ -65342,11 +61939,9 @@ pixel_y = -5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -65359,15 +61954,12 @@ /area/hydroponics/garden) "cnQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -65382,7 +61974,6 @@ /obj/item/weldingtool, /obj/item/clothing/head/welding, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -65412,7 +62003,6 @@ products = list(/obj/item/clothing/under/rank/engineering/engineer = 4, /obj/item/clothing/shoes/sneakers/orange = 4, /obj/item/clothing/head/hardhat = 4, /obj/item/storage/belt/utility = 4, /obj/item/clothing/glasses/meson/engine = 4, /obj/item/clothing/gloves/color/yellow = 2, /obj/item/screwdriver = 12, /obj/item/crowbar = 12, /obj/item/wirecutters = 12, /obj/item/multitool = 12, /obj/item/wrench = 12, /obj/item/t_scanner = 12, /obj/item/stock_parts/cell = 8, /obj/item/weldingtool = 8, /obj/item/clothing/head/welding = 8, /obj/item/light/tube = 10, /obj/item/clothing/suit/fire = 4, /obj/item/stock_parts/scanning_module = 5, /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/matter_bin = 5, /obj/item/stock_parts/manipulator = 5) }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -65508,7 +62098,7 @@ pixel_x = 32 }, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "cod" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -65551,7 +62141,6 @@ /obj/structure/cable{ icon_state = "0-4" }, -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -65568,7 +62157,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -65578,14 +62166,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/engine/engineering) "col" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -65593,7 +62179,6 @@ "com" = ( /obj/machinery/rnd/production/protolathe/department/engineering, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -65636,7 +62221,6 @@ /area/crew_quarters/locker) "cos" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -65658,11 +62242,9 @@ /area/chapel/office) "cou" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -65673,7 +62255,6 @@ pixel_x = -24 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -65730,11 +62311,9 @@ /area/crew_quarters/dorms) "coE" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -65757,11 +62336,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ @@ -65871,7 +62448,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -65884,7 +62460,6 @@ }, /obj/machinery/meter, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -65929,7 +62504,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -66181,7 +62755,6 @@ /obj/structure/window/reinforced/spawner, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -66260,10 +62833,8 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 2; - lighting = 3; - name = "Chapel Office APC"; areastring = "/area/chapel/office"; + name = "Chapel Office APC"; pixel_y = -25 }, /turf/open/floor/plasteel/grimy, @@ -66285,8 +62856,8 @@ /area/chapel/office) "cpB" = ( /obj/structure/bodycontainer/crematorium{ - id = "crematoriumChapel"; - dir = 1 + dir = 1; + id = "crematoriumChapel" }, /obj/machinery/light, /obj/item/radio/intercom{ @@ -66323,7 +62894,6 @@ /area/hydroponics/garden) "cpG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -66342,7 +62912,6 @@ /obj/effect/landmark/start/depsec/engineering, /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -66353,7 +62922,6 @@ }, /obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -66376,7 +62944,6 @@ /area/maintenance/port/fore) "cpM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/machinery/camera/autoname, @@ -66415,7 +62982,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -66458,7 +63024,6 @@ "cpT" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -66484,7 +63049,6 @@ }, /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -66561,7 +63125,6 @@ /area/hallway/secondary/entry) "cqh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -66602,7 +63165,6 @@ /area/hallway/secondary/entry) "cql" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -66610,7 +63172,6 @@ "cqm" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ @@ -66743,7 +63304,6 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/stack/sheet/glass/fifty, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -66777,7 +63337,6 @@ dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /obj/machinery/light{ @@ -66831,7 +63390,6 @@ "cqF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/vending/wardrobe/atmos_wardrobe, @@ -66856,7 +63414,6 @@ pixel_y = 10 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/power/apc{ @@ -67044,7 +63601,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -67061,11 +63617,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, @@ -67103,18 +63657,15 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "crl" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -67156,7 +63707,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -67358,7 +63908,6 @@ /area/hallway/primary/fore) "crL" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/chair{ @@ -67374,7 +63923,6 @@ /area/hallway/secondary/entry) "crM" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -67426,7 +63974,6 @@ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -67588,7 +64135,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -67611,7 +64157,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -67627,7 +64172,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -67642,8 +64186,8 @@ pixel_y = -32 }, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/structure/table/glass, /turf/open/floor/plating, /area/medical/abandoned) @@ -67756,7 +64300,6 @@ pixel_y = 23 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -67929,7 +64472,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/chair{ @@ -67952,7 +64494,6 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -67965,15 +64506,12 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /turf/open/floor/plasteel, @@ -67988,15 +64526,12 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /turf/open/floor/plasteel, @@ -68004,7 +64539,6 @@ "ctc" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -68015,7 +64549,6 @@ "ctd" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -68023,7 +64556,6 @@ /area/hallway/secondary/entry) "cte" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -68039,7 +64571,6 @@ icon_state = "2-4" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -68055,7 +64586,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -68144,7 +64674,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -68160,7 +64689,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -68180,7 +64708,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -68196,7 +64723,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -68218,7 +64744,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -68256,14 +64781,12 @@ /area/engine/engine_smes) "ctw" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, /area/engine/engineering) "ctx" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/airalarm/directional/north, @@ -68277,7 +64800,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -68295,7 +64817,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -68314,7 +64835,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -68323,6 +64843,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "ctD" = ( @@ -68333,6 +64856,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/engine/engineering) "ctE" = ( @@ -68371,7 +64895,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -68408,7 +64931,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -68431,7 +64953,6 @@ "ctP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/valve{ - dir = 2; name = "output gas to space" }, /turf/open/floor/plasteel, @@ -68496,7 +65017,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -68581,7 +65101,6 @@ dir = 9 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -68608,9 +65127,7 @@ "cuk" = ( /obj/machinery/power/apc{ areastring = "/area/hydroponics/garden"; - dir = 2; name = "Garden APC"; - pixel_x = 0; pixel_y = -26 }, /obj/structure/cable{ @@ -68638,7 +65155,6 @@ /obj/item/t_scanner, /obj/item/t_scanner, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -68708,7 +65224,6 @@ /area/engine/atmos) "cuA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/grimy, @@ -68742,7 +65257,6 @@ dir = 10 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -68756,7 +65270,6 @@ dir = 6 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -68774,7 +65287,6 @@ /area/engine/atmos) "cuH" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -68797,11 +65309,12 @@ /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cuL" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 +/obj/machinery/door/poddoor{ + id = "SecJusticeChamber"; + name = "Justice Vent" }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) +/turf/open/floor/plating, +/area/security/execution/education) "cuM" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, @@ -68838,7 +65351,6 @@ "cuS" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -68847,7 +65359,6 @@ /obj/machinery/light, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -68859,7 +65370,6 @@ }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -68871,7 +65381,6 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -68881,7 +65390,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -68960,7 +65468,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -68974,7 +65481,6 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -69053,7 +65559,6 @@ /area/engine/atmos) "cvr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - icon_state = "pipe11-2"; dir = 5 }, /turf/closed/wall/r_wall, @@ -69070,7 +65575,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2; name = "Incinerator Output Pump" }, /turf/open/space, @@ -69118,9 +65622,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 2 - }, +/obj/machinery/atmospherics/components/binary/pump/on, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -69145,7 +65647,6 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -69241,7 +65742,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/cable{ @@ -69268,7 +65768,6 @@ "cvR" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -69312,13 +65811,11 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /obj/machinery/camera/autoname{ @@ -69368,8 +65865,7 @@ areastring = "/area/construction/mining/aux_base"; dir = 4; name = "Auxillary Base Construction APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/structure/cable{ icon_state = "0-2" @@ -69382,7 +65878,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile, @@ -69437,9 +65932,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; dir = 4; name = "Entry Hall APC"; - areastring = "/area/hallway/secondary/entry"; pixel_x = 24 }, /obj/structure/cable, @@ -69503,31 +65998,14 @@ /turf/open/floor/plating/airless, /area/engine/engineering) "cws" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /obj/machinery/power/emitter/anchored{ dir = 4; state = 2 }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cwt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cwu" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/structure/cable, /turf/open/floor/plating/airless, /area/engine/engineering) "cwv" = ( @@ -69607,7 +66085,6 @@ /area/construction/mining/aux_base) "cwE" = ( /obj/docking_port/stationary/public_mining_dock{ - icon_state = "pinonfar"; dir = 8 }, /turf/open/floor/plating, @@ -69706,7 +66183,6 @@ }, /obj/machinery/camera{ c_tag = "Cargobay Fore"; - dir = 2; name = "cargo camera" }, /turf/open/floor/plating, @@ -69759,7 +66235,6 @@ }, /obj/effect/turf_decal/tile/red, /obj/machinery/turnstile{ - icon_state = "turnstile_map"; dir = 1 }, /turf/open/floor/plasteel, @@ -69789,7 +66264,6 @@ "cwZ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -69797,7 +66271,6 @@ /area/hallway/secondary/entry) "cxa" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/stripes/corner{ @@ -69868,11 +66341,9 @@ /area/hallway/secondary/entry) "cxi" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -69901,7 +66372,6 @@ "cxl" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel/chapel{ @@ -69926,11 +66396,6 @@ /turf/open/floor/plating, /area/maintenance/aft) "cxo" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/nanite"; - name = "Nanite Lab APC"; - pixel_x = -24 - }, /obj/structure/cable{ icon_state = "0-4" }, @@ -69940,8 +66405,14 @@ name = "science camera"; network = list("ss13","rd") }, +/obj/machinery/power/apc{ + areastring = "/area/science/circuit"; + name = "Circuitry Lab APC"; + pixel_x = -24 + }, +/obj/structure/target_stake, /turf/open/floor/plasteel/dark, -/area/science/nanite) +/area/science/circuit) "cxp" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -69949,9 +66420,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, /turf/open/floor/plating/airless, /area/engine/engineering) "cxq" = ( @@ -69998,13 +66466,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cxv" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, /obj/machinery/power/emitter/anchored{ dir = 8; state = 2 }, +/obj/structure/cable, /turf/open/floor/plating/airless, /area/engine/engineering) "cxw" = ( @@ -70012,6 +66478,9 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cxx" = ( @@ -70045,7 +66514,6 @@ /area/space/nearstation) "cxC" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -70144,9 +66612,7 @@ /turf/open/space/basic, /area/space/nearstation) "cxN" = ( -/obj/structure/disposaloutlet{ - dir = 2 - }, +/obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -70169,7 +66635,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -70268,7 +66733,6 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/light, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -70277,7 +66741,6 @@ "cyc" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -70309,7 +66772,6 @@ "cyh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -70318,7 +66780,6 @@ "cyi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/blue, @@ -70346,7 +66807,6 @@ "cym" = ( /obj/structure/closet/wardrobe/cargotech, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -70370,8 +66830,7 @@ pixel_y = 26 }, /obj/item/radio/intercom{ - pixel_x = -26; - pixel_y = 0 + pixel_x = -26 }, /obj/item/stack/cable_coil/white{ pixel_x = 3; @@ -70554,11 +67013,9 @@ /area/engine/storage_shared) "cyF" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -70586,7 +67043,6 @@ "cyJ" = ( /obj/machinery/rnd/production/protolathe/department/cargo, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera{ @@ -70748,12 +67204,12 @@ /area/space) "cze" = ( /obj/docking_port/stationary{ - icon_state = "pinonalert"; dir = 8; - width = 3; - height = 4; dwidth = 1; - roundstart_template = /datum/map_template/shuttle/escape_pod/default + height = 4; + icon_state = "pinonalert"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 }, /obj/structure/fans/tiny/invisible, /turf/open/space/basic, @@ -70843,6 +67299,7 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, +/obj/machinery/power/rad_collector/anchored, /turf/open/floor/plating/airless, /area/engine/engineering) "czp" = ( @@ -70891,15 +67348,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"czu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/hallway/secondary/entry) "czv" = ( @@ -70961,15 +67410,12 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/components/binary/pump{ @@ -71016,7 +67462,6 @@ /area/gateway) "czF" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/structure/sign/departments/science{ @@ -71110,7 +67555,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -71146,7 +67590,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -71170,11 +67613,9 @@ /area/bridge) "czV" = ( /obj/effect/turf_decal/box/white/corners{ - icon_state = "box_corners_white"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -71212,7 +67653,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /obj/machinery/camera/autoname{ @@ -71259,21 +67699,18 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/bridge) "cAb" = ( /obj/machinery/modular_computer/console/preset/engineering{ - icon_state = "console"; dir = 4 }, /obj/structure/cable{ icon_state = "0-4" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -71292,7 +67729,6 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, @@ -71300,7 +67736,6 @@ "cAd" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -71311,7 +67746,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -71327,11 +67761,9 @@ "cAh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -71372,22 +67804,6 @@ }, /turf/open/floor/plasteel/white, /area/hallway/primary/aft) -"cAn" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1"; - pixel_y = -5 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cAo" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/arrows/red, @@ -71444,6 +67860,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cAu" = ( @@ -71467,11 +67886,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71484,7 +67901,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -71523,7 +67939,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -71548,11 +67963,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71577,7 +67990,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71601,11 +68013,9 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71613,30 +68023,13 @@ "cAD" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cAE" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cAF" = ( /obj/structure/cable{ icon_state = "1-2" @@ -71660,29 +68053,13 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cAG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cAH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -71703,11 +68080,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71731,11 +68106,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71761,38 +68134,9 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"cAK" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71817,11 +68161,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71846,26 +68188,13 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cAN" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cAO" = ( /obj/structure/cable{ icon_state = "1-2" @@ -71885,11 +68214,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -71919,11 +68246,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -72003,7 +68328,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -72011,7 +68335,6 @@ "cBb" = ( /obj/machinery/computer/arcade, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -72036,7 +68359,6 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, @@ -72046,7 +68368,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -72082,11 +68403,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -72099,7 +68418,6 @@ "cBj" = ( /obj/machinery/computer/slot_machine, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -72110,7 +68428,6 @@ pixel_x = 12 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -72120,8 +68437,7 @@ dir = 8 }, /obj/item/radio/intercom{ - pixel_x = 26; - pixel_y = 0 + pixel_x = 26 }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) @@ -72131,14 +68447,12 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /turf/open/floor/plasteel, @@ -72148,7 +68462,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -72157,7 +68470,6 @@ "cBo" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -72167,28 +68479,15 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/engine/storage) -"cBq" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cBr" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -72205,7 +68504,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -72215,57 +68513,22 @@ uses = 10 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) -"cBv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"cBw" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "cBx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel/grimy, /area/chapel/office) -"cBy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cBz" = ( /obj/machinery/power/apc{ areastring = "/area/hallway/primary/starboard"; dir = 4; name = "Starboard Hallway APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/structure/cable{ icon_state = "0-8" @@ -72274,18 +68537,10 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cBA" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "cBB" = ( /obj/structure/cable{ icon_state = "4-8" @@ -72294,7 +68549,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -72302,7 +68556,6 @@ "cBC" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -72316,7 +68569,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -72327,7 +68579,6 @@ pixel_x = 24 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -72338,40 +68589,24 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cBG" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cBH" = ( /obj/structure/cable{ icon_state = "0-8" }, /obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/primary/aft"; dir = 4; name = "Aft Hallway APC"; - areastring = "/area/hallway/primary/aft"; pixel_x = 24 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -72388,11 +68623,9 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -72458,7 +68691,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/navbeacon{ @@ -72472,7 +68704,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -72542,14 +68773,12 @@ /area/hallway/primary/aft) "cBZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "cCa" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/machinery/navbeacon{ @@ -72558,41 +68787,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cCb" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"cCc" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cCd" = ( /obj/structure/chair{ dir = 4 }, /obj/effect/landmark/start/chaplain, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -72611,61 +68811,25 @@ light_color = "#fff4bc" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/carpet/royalblack, /area/crew_quarters/dorms) -"cCf" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 5 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cCg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cCh" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"cCi" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cCj" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/engine/storage) -"cCk" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cCl" = ( /obj/machinery/light, /obj/structure/extinguisher_cabinet{ @@ -72674,7 +68838,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -72717,8 +68880,7 @@ dir = 8; name = "Auxillary Base Monitor"; network = list("auxbase"); - pixel_x = 25; - pixel_y = 0 + pixel_x = 25 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/cable{ @@ -72729,7 +68891,6 @@ "cCp" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -72745,7 +68906,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/disposalpipe/junction/yjunction{ - icon_state = "pipe-y"; dir = 1 }, /obj/effect/turf_decal/tile/neutral, @@ -72760,28 +68920,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cCr" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) -"cCs" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cCt" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ @@ -72801,7 +68939,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -72826,18 +68963,15 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "cCx" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -72851,7 +68985,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -72896,11 +69029,9 @@ /area/hallway/primary/aft) "cCD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -72912,7 +69043,6 @@ }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -72962,7 +69092,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -72987,7 +69116,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -73007,7 +69135,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -73044,7 +69171,6 @@ /area/crew_quarters/fitness/recreation) "cCQ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -73060,7 +69186,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/structure/fans/tiny, /turf/open/floor/plating, /area/engine/engineering) "cCS" = ( @@ -73084,22 +69209,10 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, /area/aisat) -"cCU" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "cCV" = ( /obj/structure/window/reinforced/spawner/north, /obj/machinery/light/small{ @@ -73111,7 +69224,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73121,7 +69233,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73135,11 +69246,9 @@ /area/aisat) "cCY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -73170,18 +69279,10 @@ /area/ai_monitored/turret_protected/ai) "cDc" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) -"cDd" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "cDe" = ( /obj/machinery/firealarm{ dir = 8; @@ -73189,7 +69290,6 @@ }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73199,7 +69299,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -73208,27 +69307,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/hallway) -"cDg" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/hallway) -"cDh" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/hallway) "cDi" = ( /obj/machinery/camera/motion{ c_tag = "MiniSat Foyer Starboard"; @@ -73243,7 +69321,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73254,14 +69331,12 @@ icon_state = "2-4" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "cDl" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73273,7 +69348,6 @@ }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73283,25 +69357,16 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) -"cDo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "cDp" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -73309,7 +69374,6 @@ "cDq" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -73319,7 +69383,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -73327,7 +69390,6 @@ "cDs" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, @@ -73420,7 +69482,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -73428,7 +69489,6 @@ /area/hallway/secondary/command) "cDA" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -73544,7 +69604,6 @@ /area/maintenance/fore/secondary) "cDP" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -73559,7 +69618,6 @@ "cDR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -73580,7 +69638,6 @@ /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/item/radio/intercom{ - pixel_x = 0; pixel_y = 23 }, /turf/open/floor/plasteel/dark, @@ -73702,7 +69759,6 @@ /area/medical/morgue) "cEf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output{ - icon_state = "vent_map_siphon_on-2"; dir = 1 }, /turf/open/floor/engine/air, @@ -73726,9 +69782,9 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; dir = 4; name = "Morgue APC"; - areastring = "/area/medical/morgue"; pixel_x = 26 }, /turf/open/floor/plasteel/dark, @@ -73842,7 +69898,6 @@ "cEm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -74003,7 +70058,6 @@ /area/medical/morgue) "cEy" = ( /obj/machinery/firealarm{ - dir = 2; pixel_y = 24 }, /obj/effect/turf_decal/bot, @@ -74011,11 +70065,9 @@ /area/science/mixing) "cEz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -74023,18 +70075,16 @@ light_color = "#cee5d2" }, /obj/machinery/status_display/evac{ - pixel_x = 0; pixel_y = 32 }, +/obj/structure/closet/wardrobe/chemistry_white, /turf/open/floor/plasteel/white, /area/medical/chemistry) "cEA" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/closet/secure_closet/chemical, @@ -74048,17 +70098,19 @@ /obj/item/wrench/medical, /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/ai{ pixel_y = 32 }, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, /turf/open/floor/plasteel/white, /area/medical/cryo) "cEC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/computer/pandemic, @@ -74159,14 +70211,12 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -74193,7 +70243,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -74206,7 +70255,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -74240,11 +70288,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /turf/open/floor/plasteel, @@ -74257,7 +70303,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/navbeacon{ @@ -74268,7 +70313,6 @@ /area/hallway/primary/starboard) "cER" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -74281,14 +70325,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "cET" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -74319,25 +70361,10 @@ /area/crew_quarters/locker) "cEW" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"cEX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/machinery/camera/autoname{ - icon_state = "camera"; - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "cEY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -74407,7 +70434,6 @@ pixel_x = 24 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/carpet/royalblack, @@ -74430,7 +70456,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -74440,11 +70465,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 8 }, /turf/open/floor/plasteel, @@ -74452,7 +70475,6 @@ "cFg" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -74502,7 +70524,6 @@ }, /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/disposalpipe/trunk{ @@ -74518,7 +70539,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/monkey_recycler, @@ -74592,11 +70612,9 @@ "cFv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/fireaxecabinet{ - pixel_x = -31; - pixel_y = 0 + pixel_x = -31 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -74622,24 +70640,6 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/engine/air, /area/engine/atmos) -"cFA" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"cFB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cFC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ @@ -74659,7 +70659,6 @@ /area/crew_quarters/fitness/recreation) "cFD" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/closet/crate, @@ -74680,11 +70679,9 @@ "cFG" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -74709,7 +70706,6 @@ /area/crew_quarters/fitness/recreation) "cFK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -74975,16 +70971,17 @@ "cFX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cFY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, +/obj/machinery/vr_sleeper{ + dir = 8 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cFZ" = ( @@ -75060,7 +71057,6 @@ "cGe" = ( /obj/machinery/vending/clothing, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -75073,12 +71069,9 @@ c_tag = "Locker Room Aft"; dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /obj/machinery/vending/kink, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -75096,7 +71089,6 @@ }, /obj/machinery/camera{ c_tag = "Dorms - Port Fore"; - dir = 2; name = "dormitories camera" }, /obj/structure/sign/poster/official/no_erp{ @@ -75120,13 +71112,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cGi" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "cGj" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral, @@ -75151,7 +71136,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -75162,7 +71146,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -75214,7 +71197,6 @@ "cGp" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -75237,7 +71219,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -75262,11 +71243,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/structure/cable{ @@ -75337,7 +71316,6 @@ "cGy" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -75357,26 +71335,10 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"cGB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "cGC" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -75387,17 +71349,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"cGD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "cGE" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/green, @@ -75434,24 +71385,15 @@ /area/medical/virology) "cGG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"cGH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cGI" = ( /obj/machinery/button/door{ id = "aux_base_shutters"; name = "Public Shutters Control"; pixel_x = 24; - pixel_y = 0; req_one_access_txt = "32;47;48" }, /obj/machinery/camera{ @@ -75473,7 +71415,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /turf/open/floor/plasteel, @@ -75496,7 +71437,6 @@ /area/engine/atmos) "cGL" = ( /obj/machinery/computer/camera_advanced/base_construction{ - icon_state = "computer"; dir = 1 }, /obj/machinery/light, @@ -75504,7 +71444,6 @@ /area/construction/mining/aux_base) "cGM" = ( /obj/machinery/computer/shuttle/mining{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel, @@ -75541,7 +71480,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/yellow{ @@ -75554,7 +71492,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/dark, @@ -75578,7 +71515,6 @@ "cGT" = ( /obj/machinery/light/small, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -75601,7 +71537,6 @@ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plasteel, @@ -75610,21 +71545,18 @@ /obj/structure/table, /obj/item/storage/fancy/donut_box, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, /area/security/courtroom) "cGX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel/dark, /area/security/courtroom) "cGY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel/dark, @@ -75666,7 +71598,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -75682,7 +71613,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -75707,7 +71637,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -75728,7 +71657,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/button/door{ @@ -75745,6 +71673,9 @@ icon_state = "1-2" }, /obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/space/basic, /area/engine/engineering) "cHi" = ( @@ -75752,7 +71683,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/reagent_dispensers/watertank, @@ -75768,7 +71698,6 @@ pixel_x = -32 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel/white, @@ -75843,7 +71772,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/navbeacon{ @@ -75854,7 +71782,6 @@ /area/hallway/primary/aft) "cHs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/navbeacon{ @@ -75868,7 +71795,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/navbeacon{ @@ -75877,34 +71803,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cHu" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cHv" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/navbeacon{ @@ -75915,7 +71816,6 @@ /area/hallway/primary/aft) "cHw" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/navbeacon{ @@ -75945,7 +71845,6 @@ /area/hallway/secondary/entry) "cHy" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/navbeacon{ @@ -75993,16 +71892,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/engine/engineering) -"cHC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/storage_shared) "cHD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -76023,11 +71912,9 @@ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/line{ - icon_state = "trimline"; dir = 4 }, /obj/effect/turf_decal/trimline/red/line{ - icon_state = "trimline"; dir = 4 }, /obj/structure/cable{ @@ -76043,7 +71930,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -76056,7 +71942,6 @@ dir = 6 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -76076,7 +71961,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -76087,7 +71971,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -76098,7 +71981,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -76110,7 +71992,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 10 }, /turf/open/floor/plasteel, @@ -76132,7 +72013,6 @@ /area/engine/break_room) "cHM" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -76220,7 +72100,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -76230,7 +72109,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -76242,7 +72120,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -76253,7 +72130,6 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -76263,7 +72139,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -76294,7 +72169,6 @@ }, /obj/structure/rack, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/item/screwdriver, @@ -76411,7 +72285,6 @@ /area/maintenance/starboard/aft) "cIi" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/light{ @@ -76426,14 +72299,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, /area/chapel/main) "cIk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -76443,7 +72314,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -76458,11 +72328,9 @@ icon_state = "0-4" }, /obj/machinery/power/solar_control{ - name = "Port Bow Solar Control"; - icon_state = "computer"; dir = 4; id = "foreport"; - track = 0 + name = "Port Bow Solar Control" }, /obj/structure/cable, /obj/structure/sign/warning/vacuum/external{ @@ -76486,13 +72354,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) -"cIo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) "cIp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -76508,15 +72369,13 @@ /obj/structure/disposalpipe/segment, /obj/machinery/flasher{ id = "brigflashdoor"; - pixel_x = -26; - pixel_y = 0 + pixel_x = -26 }, /turf/open/floor/plasteel, /area/security/brig) "cIq" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/stripes/red/corner{ - icon_state = "warninglinecorner_red"; dir = 1 }, /obj/structure/disposalpipe/segment, @@ -76527,17 +72386,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"cIr" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cIs" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -76576,7 +72424,6 @@ "cIw" = ( /obj/structure/closet/wardrobe/white, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -76585,7 +72432,6 @@ "cIx" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -76633,42 +72479,18 @@ /area/gateway) "cID" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/gateway) -"cIE" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/gateway) -"cIF" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel/dark, /area/gateway) "cIG" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel/dark, /area/gateway) -"cIH" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/gateway) "cII" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -76679,7 +72501,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/status_display/ai{ @@ -76702,7 +72523,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/effect/turf_decal/tile/blue{ @@ -76710,26 +72530,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cIM" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) "cIN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/effect/turf_decal/tile/blue{ @@ -76748,7 +72554,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/ai{ @@ -76771,7 +72576,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -76784,11 +72588,9 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue, @@ -76800,12 +72602,10 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /turf/open/floor/plasteel, @@ -76839,7 +72639,7 @@ /turf/open/floor/plasteel/grimy, /area/bridge) "cIV" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/machinery/status_display/evac{ pixel_y = 32 }, @@ -76900,7 +72700,6 @@ }, /obj/structure/chair/sofa/left, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -76913,7 +72712,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/status_display/evac{ @@ -76954,7 +72752,6 @@ dir = 10 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -76972,7 +72769,6 @@ "cJi" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/ai{ @@ -76982,7 +72778,6 @@ /area/medical/medbay/central) "cJj" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -77047,7 +72842,6 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -77072,8 +72866,7 @@ dir = 4 }, /obj/machinery/camera{ - c_tag = "Security - Head of Security's Office"; - dir = 2 + c_tag = "Security - Head of Security's Office" }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) @@ -77127,8 +72920,7 @@ /obj/structure/closet/secure_closet/hos, /obj/effect/turf_decal/tile/red, /obj/item/storage/secure/safe/HoS{ - pixel_x = 36; - pixel_y = 0 + pixel_x = 36 }, /obj/machinery/status_display/ai{ pixel_y = -32 @@ -77154,7 +72946,6 @@ /obj/machinery/light, /obj/structure/closet/wardrobe/green, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -77171,7 +72962,6 @@ /area/crew_quarters/locker) "cJC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/chair/stool, @@ -77198,7 +72988,6 @@ "cJG" = ( /obj/structure/chair/stool, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -77253,7 +73042,6 @@ /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, @@ -77315,21 +73103,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cJS" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cJT" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/line{ @@ -77416,7 +73189,6 @@ light_color = "#e8eaff" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -77437,7 +73209,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -77449,18 +73220,15 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, /area/engine/engineering) "cKd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -77474,7 +73242,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/landmark/xeno_spawn, @@ -77513,9 +73280,6 @@ /turf/open/floor/plating/airless, /area/engine/engineering) "cKh" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -77693,11 +73457,9 @@ "cKA" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -77708,7 +73470,6 @@ /area/crew_quarters/fitness/recreation) "cKC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/light{ @@ -77771,8 +73532,8 @@ /area/construction) "cKI" = ( /obj/machinery/power/apc{ - name = "Construction Area APC"; areastring = "/area/construction"; + name = "Construction Area APC"; pixel_y = -24 }, /obj/structure/cable{ @@ -78042,7 +73803,6 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -78051,80 +73811,37 @@ "cLa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "cLb" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cLc" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "cLd" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 5 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/engine/atmos) -"cLe" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cLf" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"cLg" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "cLh" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -78137,7 +73854,6 @@ "cLj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -78146,7 +73862,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -78154,7 +73869,6 @@ "cLl" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -78165,12 +73879,9 @@ /turf/open/floor/carpet, /area/crew_quarters/dorms) "cLn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 2 - }, +/obj/effect/turf_decal/tile/neutral, /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -78216,6 +73927,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/engine/engineering) "cLs" = ( @@ -78248,7 +73962,6 @@ /area/engine/storage_shared) "cLv" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/effect/decal/cleanable/dirt, @@ -78257,7 +73970,6 @@ "cLw" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/door/airlock/security/glass{ @@ -78274,7 +73986,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/door/airlock/security/glass{ @@ -78315,7 +74026,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/door/airlock/security/glass{ @@ -78325,13 +74035,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"cLA" = ( -/obj/machinery/turnstile{ - icon_state = "turnstile_map"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "cLB" = ( /obj/structure/cable{ icon_state = "1-2" @@ -78417,33 +74120,18 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/dark/corner{ - icon_state = "darkcorner"; - dir = 8 - }, -/area/hallway/primary/aft) -"cLK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/dark/corner{ - icon_state = "darkcorner"; dir = 8 }, /area/hallway/primary/aft) "cLL" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -78451,40 +74139,25 @@ "cLM" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/dark/corner{ - icon_state = "darkcorner"; dir = 8 }, /area/hallway/primary/aft) "cLN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark/corner{ - icon_state = "darkcorner"; dir = 8 }, /area/hallway/primary/aft) -"cLO" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cLP" = ( /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera{ @@ -78532,7 +74205,6 @@ network = list("minisat") }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel/dark, @@ -78551,15 +74223,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /turf/open/floor/plasteel, /area/engine/transit_tube) -"cLW" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "cLX" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -78574,21 +74237,6 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/fore) -"cLZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cMa" = ( /obj/structure/cable{ icon_state = "4-8" @@ -78601,15 +74249,12 @@ "cMb" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -78620,7 +74265,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -78646,15 +74290,13 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/item/radio/intercom{ dir = 4; freerange = 1; name = "Station Intercom (Telecomms)"; - pixel_x = 30; - pixel_y = 0 + pixel_x = 30 }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -78665,7 +74307,6 @@ /obj/item/radio/intercom{ dir = 1; name = "Station Intercom"; - pixel_x = 0; pixel_y = -28 }, /turf/open/floor/plasteel/dark, @@ -78723,7 +74364,6 @@ /area/security/range) "cMi" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /obj/machinery/camera{ @@ -78741,7 +74381,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -78767,12 +74406,10 @@ /area/crew_quarters/heads/captain/private) "cMl" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera{ c_tag = "Science Entrance"; - dir = 2; name = "science camera"; network = list("ss13","rd") }, @@ -78782,7 +74419,6 @@ /obj/machinery/light, /obj/structure/closet/secure_closet/personal, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -78881,22 +74517,18 @@ /area/crew_quarters/fitness/recreation) "cMy" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cMz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -79005,7 +74637,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -79041,14 +74672,12 @@ dir = 6 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 9 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cMM" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /turf/open/floor/plating, @@ -79067,35 +74696,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cMP" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "cMQ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -79118,7 +74718,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -79149,7 +74748,6 @@ /obj/machinery/plantgenes, /obj/structure/table, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera{ @@ -79160,7 +74758,6 @@ /area/hydroponics) "cMU" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/red{ @@ -79178,15 +74775,13 @@ /area/hallway/secondary/exit/departure_lounge) "cMV" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/machinery/camera{ - c_tag = "Departure Lounge - Starboard Fore"; - dir = 2 + c_tag = "Departure Lounge - Starboard Fore" }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) @@ -79197,7 +74792,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/camera{ c_tag = "Escape Hallway"; - dir = 2; name = "departures camera" }, /turf/open/floor/plasteel, @@ -79208,7 +74802,6 @@ }, /obj/machinery/camera{ c_tag = "Library"; - dir = 2; name = "library camera" }, /turf/open/floor/wood, @@ -79234,14 +74827,6 @@ }, /turf/open/floor/carpet, /area/library/lounge) -"cNa" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cNb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ dir = 4 @@ -79276,11 +74861,9 @@ "cNd" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 1 }, /turf/open/floor/plasteel, @@ -79288,7 +74871,6 @@ "cNe" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -79312,7 +74894,6 @@ /obj/structure/table, /obj/item/storage/box/donkpockets, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -79323,7 +74904,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname, @@ -79359,7 +74939,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -79377,7 +74956,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera{ @@ -79388,7 +74966,6 @@ /area/engine/atmos) "cNm" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -79407,7 +74984,6 @@ /area/engine/atmos) "cNo" = ( /obj/machinery/computer/arcade{ - icon_state = "arcade"; dir = 8 }, /turf/open/floor/plating, @@ -79424,7 +75000,6 @@ /area/security/vacantoffice/a) "cNr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/wood, @@ -79432,11 +75007,9 @@ "cNs" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 6 }, /turf/open/floor/plasteel, @@ -79446,7 +75019,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -79473,7 +75045,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -79493,7 +75064,6 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/camera/autoname{ @@ -79503,7 +75073,6 @@ /area/engine/storage) "cNz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -79513,7 +75082,6 @@ id = "ewradiation"; name = "Shutters Control"; pixel_x = 33; - pixel_y = 0; req_access_txt = "11" }, /turf/open/floor/plasteel, @@ -79529,7 +75097,6 @@ "cNB" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/navbeacon{ @@ -79546,7 +75113,6 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/purple, @@ -79573,11 +75139,9 @@ }, /obj/effect/landmark/start/botanist, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79585,9 +75149,8 @@ "cNF" = ( /obj/structure/cable, /obj/machinery/power/apc/highcap/five_k{ - dir = 2; - name = "Upload APC"; areastring = "/area/ai_monitored/turret_protected/ai_upload"; + name = "Upload APC"; pixel_y = -24 }, /obj/machinery/camera/motion{ @@ -79671,7 +75234,6 @@ /area/teleporter) "cNM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/camera/autoname{ @@ -79696,7 +75258,6 @@ icon_state = "1-2" }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79704,7 +75265,6 @@ "cNO" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname, @@ -79735,7 +75295,6 @@ /area/medical/virology) "cNS" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel/freezer, @@ -79754,7 +75313,6 @@ }, /obj/effect/turf_decal/delivery, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79775,14 +75333,12 @@ /area/crew_quarters/toilet) "cNV" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel/grimy, /area/hallway/secondary/entry) "cNW" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79795,7 +75351,6 @@ icon_state = "1-2" }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79818,7 +75373,6 @@ dir = 1 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 6 }, /turf/open/floor/plasteel, @@ -79831,14 +75385,12 @@ pixel_x = 30 }, /obj/machinery/modular_computer/console/preset/engineering{ - icon_state = "console"; dir = 8 }, /obj/structure/cable{ icon_state = "0-8" }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel/dark/corner, @@ -79847,7 +75399,6 @@ /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 9 }, /turf/open/floor/plasteel, @@ -79867,7 +75418,6 @@ "cOd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/camera/autoname, @@ -79896,7 +75446,6 @@ "cOg" = ( /obj/structure/disposalpipe/trunk, /obj/structure/disposaloutlet{ - icon_state = "outlet"; dir = 8 }, /turf/open/floor/plating/asteroid/airless, @@ -80054,7 +75603,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -80093,7 +75641,6 @@ dir = 5 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -80131,12 +75678,14 @@ /area/engine/engineering) "cOJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/engine/engineering) "cOK" = ( @@ -80169,12 +75718,8 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cOO" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plasteel, /area/engine/engineering) @@ -80183,6 +75728,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "cOQ" = ( @@ -80274,11 +75822,11 @@ /obj/item/folder, /obj/item/folder, /obj/structure/table/reinforced, -/obj/item/stack/medical/ointment{ +/obj/item/stack/medical/mesh{ pixel_x = 3; pixel_y = -2 }, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ pixel_x = -3; pixel_y = 2 }, @@ -80294,7 +75842,6 @@ "cPe" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plating, @@ -80360,7 +75907,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ @@ -80391,7 +75937,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1{ @@ -80406,7 +75951,6 @@ }, /area/maintenance/department/medical) "cPo" = ( -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -80509,7 +76053,6 @@ }, /area/maintenance/fore/secondary) "cPB" = ( -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -80534,17 +76077,10 @@ }, /area/maintenance/department/crew_quarters/dorms) "cPE" = ( -/turf/open/floor/plating, /turf/open/floor/plating{ icon_state = "platingdmg2" }, /area/maintenance/department/crew_quarters/dorms) -"cPF" = ( -/turf/open/floor/plating, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/aft) "cPG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -80558,11 +76094,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, @@ -80666,7 +76200,6 @@ /area/maintenance/fore/secondary) "cPW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /turf/open/floor/plating, @@ -80793,9 +76326,8 @@ "cQo" = ( /obj/structure/table, /obj/machinery/power/apc{ - dir = 2; - name = "Cargo Office APC"; areastring = "/area/quartermaster/office"; + name = "Cargo Office APC"; pixel_x = 1; pixel_y = -24 }, @@ -80803,7 +76335,6 @@ icon_state = "0-8" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/structure/extinguisher_cabinet{ @@ -80865,7 +76396,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/light{ @@ -80914,7 +76444,6 @@ "cQE" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -80970,7 +76499,6 @@ dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 10 }, /turf/open/floor/plasteel, @@ -81014,7 +76542,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -81025,14 +76552,12 @@ /area/hallway/primary/central) "cQP" = ( /obj/structure/chair/sofa/corp{ - icon_state = "corp_sofamiddle"; dir = 8 }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "cQQ" = ( /obj/structure/chair/sofa/corp/left{ - icon_state = "corp_sofaend_left"; dir = 8 }, /turf/open/floor/plating, @@ -81090,7 +76615,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -81147,16 +76671,13 @@ "cRe" = ( /obj/structure/cable, /obj/machinery/power/apc/highcap/five_k{ - dir = 2; name = "Kitchen APC"; pixel_y = -24 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/machinery/food_cart, @@ -81215,12 +76736,10 @@ /area/engine/transit_tube) "cRl" = ( /obj/structure/chair/sofa/right{ - icon_state = "sofaend_right"; dir = 1 }, /obj/machinery/power/apc{ areastring = "/area/engine/transit_tube"; - dir = 2; name = "Transit Tube APC"; pixel_y = -26 }, @@ -81357,7 +76876,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -81399,7 +76917,6 @@ icon_state = "2-8" }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 1 }, /turf/open/floor/plasteel, @@ -81411,7 +76928,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer1, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /obj/structure/disposalpipe/junction/yjunction{ - icon_state = "pipe-y"; dir = 1 }, /obj/structure/cable{ @@ -81428,63 +76944,16 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/corner{ - icon_state = "trimline_corner"; dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"cRJ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cRK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"cRL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cRM" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Door" @@ -81540,7 +77009,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81573,7 +77041,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81606,7 +77073,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81636,7 +77102,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81670,7 +77135,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81697,7 +77161,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81721,7 +77184,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81749,7 +77211,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/white/line{ - icon_state = "trimline"; dir = 8 }, /turf/open/floor/plasteel, @@ -81784,7 +77245,6 @@ icon_state = "2-4" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -81823,8 +77283,6 @@ "cSi" = ( /obj/structure/bed/dogbed/ian, /obj/item/radio/intercom{ - dir = 2; - pixel_x = 0; pixel_y = 28 }, /turf/open/floor/wood, @@ -81881,48 +77339,32 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"cSo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cSp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cSq" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - icon_state = "trimline_corner_fill"; + dir = 4 + }, +/obj/machinery/vr_sleeper{ dir = 4 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cSr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 4 }, /obj/structure/cable{ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /turf/open/floor/plasteel, @@ -81930,7 +77372,6 @@ "cSs" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -81938,7 +77379,6 @@ "cSt" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/light{ @@ -81950,7 +77390,6 @@ "cSu" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -81963,7 +77402,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/machinery/door/poddoor/preopen{ @@ -81986,6 +77424,9 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/engine/engineering) "cSx" = ( @@ -81995,7 +77436,6 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/structure/sign/warning/nosmoking{ @@ -82003,24 +77443,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"cSy" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "cSz" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/red/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /turf/open/floor/plasteel, @@ -82028,11 +77458,9 @@ "cSA" = ( /obj/structure/table, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/item/reagent_containers/food/snacks/mint, @@ -82042,13 +77470,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"cSB" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) "cSC" = ( /obj/machinery/vending/coffee, /turf/open/floor/plasteel, @@ -82058,7 +77479,6 @@ /area/maintenance/port/aft) "cSE" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -82068,19 +77488,16 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cSG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/structure/extinguisher_cabinet{ @@ -82116,7 +77533,6 @@ /area/hallway/primary/central) "cSK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -82134,7 +77550,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sign/directions/engineering{ @@ -82147,7 +77562,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/item/radio/intercom{ @@ -82442,7 +77856,6 @@ /area/engine/atmos) "cTA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 1 }, /obj/effect/decal/cleanable/dirt, @@ -82453,7 +77866,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/decal/cleanable/dirt, @@ -82568,7 +77980,6 @@ "cTP" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/structure/sign/departments/restroom{ @@ -82578,7 +77989,6 @@ /area/crew_quarters/fitness/recreation) "cTQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 6 }, /obj/structure/sign/departments/restroom{ @@ -82604,12 +78014,10 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sign/directions/evac{ dir = 8; - icon_state = "direction_evac"; pixel_x = 32 }, /obj/structure/sign/directions/engineering{ @@ -82649,7 +78057,6 @@ }, /obj/structure/sign/directions/medical{ dir = 1; - icon_state = "direction_med"; pixel_y = 40 }, /turf/open/floor/plasteel, @@ -82659,16 +78066,13 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /obj/structure/sign/directions/medical{ dir = 1; - icon_state = "direction_med"; pixel_x = 32; pixel_y = 40 }, @@ -82679,7 +78083,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/sign/departments/engineering{ @@ -82692,7 +78095,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/sign/departments/engineering{ @@ -82708,7 +78110,6 @@ /area/maintenance/department/cargo) "cUb" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/cable{ @@ -82729,7 +78130,6 @@ "cUc" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/sign/departments/holy{ @@ -82774,7 +78174,6 @@ "cUi" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 9 }, /obj/effect/turf_decal/tile/blue, @@ -82818,7 +78217,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/extinguisher_cabinet{ @@ -82829,7 +78227,6 @@ /area/medical/virology) "cUp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel/white, @@ -82845,13 +78242,12 @@ dir = 4 }, /obj/effect/turf_decal/trimline/green/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/doorButtons/airlock_controller{ idExterior = "virology_airlock_exterior"; - idSelf = "virology_airlock_control"; idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; name = "Virology Access Console"; pixel_x = 26; pixel_y = 26; @@ -82966,7 +78362,6 @@ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/extinguisher_cabinet{ @@ -83036,7 +78431,6 @@ /area/maintenance/department/crew_quarters/dorms) "cUR" = ( /obj/structure/chair/sofa/corp/right{ - icon_state = "corp_sofaend_right"; dir = 8 }, /obj/item/storage/daki, @@ -83080,29 +78474,12 @@ /obj/item/storage/belt/utility, /turf/open/floor/plating, /area/maintenance/aft) -"cUZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cVa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1, /obj/structure/reagent_dispensers/peppertank{ pixel_y = 30 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/structure/cable{ @@ -83120,7 +78497,6 @@ pixel_y = 30 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/structure/cable{ @@ -83173,7 +78549,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /turf/open/floor/plasteel, @@ -83200,7 +78575,6 @@ }, /obj/structure/closet/secure_closet/security, /obj/effect/turf_decal/trimline/red/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/machinery/airalarm/directional/west, @@ -83592,7 +78966,6 @@ "cWo" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/crowbar, @@ -83610,15 +78983,12 @@ /area/crew_quarters/fitness/recreation) "cWr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 8 }, /obj/structure/pool/Rboard, @@ -83675,7 +79045,6 @@ /area/maintenance/solars/starboard/aft) "cWx" = ( /obj/machinery/power/terminal{ - icon_state = "term"; dir = 8 }, /obj/structure/cable{ @@ -83701,7 +79070,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/machinery/airalarm/directional/west, @@ -83720,7 +79088,6 @@ /area/engine/break_room) "cWB" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 4 }, /obj/structure/sign/warning/enginesafety{ @@ -83804,7 +79171,6 @@ dir = 1 }, /obj/structure/sign/warning/securearea{ - pixel_x = 0; pixel_y = 32 }, /turf/open/floor/plasteel, @@ -83820,9 +79186,7 @@ "cWL" = ( /obj/machinery/power/apc{ areastring = "/area/engine/storage"; - dir = 2; name = "Engineering Storage APC"; - pixel_x = 0; pixel_y = -26 }, /obj/structure/cable, @@ -83917,7 +79281,6 @@ /area/crew_quarters/locker) "cWV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/machinery/status_display/evac{ @@ -83945,7 +79308,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -83967,7 +79329,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -83986,7 +79347,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -84002,7 +79362,6 @@ dir = 4 }, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -84043,7 +79402,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "cXf" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/light/small{ @@ -84208,8 +79567,7 @@ areastring = "/area/maintenance/department/electrical"; dir = 4; name = "Electrical Maintenance APC"; - pixel_x = 24; - pixel_y = 0 + pixel_x = 24 }, /obj/structure/cable{ icon_state = "0-8" @@ -84309,7 +79667,6 @@ pixel_x = 24 }, /obj/effect/turf_decal/trimline/blue/filled/line{ - icon_state = "trimline_fill"; dir = 5 }, /obj/machinery/vending/medical{ @@ -84326,14 +79683,12 @@ }, /obj/effect/turf_decal/tile, /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 1 }, /obj/structure/cable{ icon_state = "4-8" }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ - icon_state = "vent_map_on-1"; dir = 8 }, /obj/effect/landmark/event_spawn, @@ -84367,7 +79722,6 @@ /area/medical/medbay/central) "cXL" = ( /obj/effect/turf_decal/tile{ - icon_state = "tile_corner"; dir = 8 }, /obj/effect/turf_decal/tile, @@ -84390,12 +79744,10 @@ /area/crew_quarters/heads/chief/private) "cXO" = ( /obj/machinery/status_display/ai{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/crew_quarters/heads/chief/private"; - dir = 2; name = "Chief Engineer's Quarters APC"; pixel_y = -24 }, @@ -84428,9 +79780,6 @@ /turf/open/floor/plasteel, /area/quartermaster/qm/private) "cXU" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -84449,18 +79798,17 @@ /obj/machinery/power/grounding_rod, /turf/open/floor/plating/airless, /area/engine/engineering) -"cXW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) "cXX" = ( -/obj/structure/cable/yellow, /obj/machinery/power/emitter/anchored{ dir = 1; state = 2 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating/airless, /area/engine/engineering) "cXY" = ( @@ -84468,7 +79816,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ - icon_state = "scrub_map_on-3"; dir = 8 }, /turf/open/floor/plasteel, @@ -84483,23 +79830,19 @@ /obj/machinery/camera/autoname, /obj/item/radio/intercom{ name = "Station Intercom"; - pixel_x = 0; pixel_y = 26 }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/cafeteria) "cYa" = ( /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 4 }, /obj/effect/turf_decal/tile/bar{ - icon_state = "tile_corner"; dir = 8 }, /obj/machinery/camera{ - c_tag = "Kitchen Starboard"; - dir = 2 + c_tag = "Kitchen Starboard" }, /obj/machinery/light{ dir = 1; @@ -84507,7 +79850,6 @@ }, /obj/item/radio/intercom{ name = "Station Intercom"; - pixel_x = 0; pixel_y = 26 }, /turf/open/floor/plasteel/cafeteria, @@ -84517,7 +79859,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ @@ -84532,7 +79873,6 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /obj/item/radio/intercom{ @@ -84576,7 +79916,6 @@ icon_state = "4-8" }, /obj/effect/turf_decal/trimline/yellow/filled/line{ - icon_state = "trimline_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -84592,7 +79931,6 @@ icon_state = "1-8" }, /obj/effect/turf_decal/trimline/yellow/filled/corner{ - icon_state = "trimline_corner_fill"; dir = 1 }, /turf/open/floor/plasteel, @@ -84620,6 +79958,2377 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/aft) +"ddh" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1"; + pixel_y = -5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"dgb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"diH" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"doD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"dsE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"duB" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"dwu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dEp" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dFe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"dFG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dGX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"dIv" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dPK" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/brig) +"dQa" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"dQT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"dRM" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"dSS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dWj" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"dWs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"dZP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"ean" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ebs" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"ect" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eec" = ( +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"ehl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"eia" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/plasteel/dark, +/area/aisat) +"ely" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"eqe" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"eqk" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"eqX" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1"; + pixel_y = -5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"etb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"evX" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"ezo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/engine/engineering) +"eDP" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"eFp" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"eFG" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"eGt" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eHx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"eIr" = ( +/turf/open/floor/plasteel/cult, +/area/library) +"eJn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"eNI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"ePb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/engine/engineering) +"ePe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eTx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"eVg" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"eXk" = ( +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fjH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"fjJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fow" = ( +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fqL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fsj" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"fwg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"fDN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"fEH" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"fKc" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fMb" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"fOO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"fQN" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"fSW" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fXq" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/engine, +/area/science/xenobiology) +"fZL" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"fZN" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ggi" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"gqj" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"gra" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/hallway) +"guj" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"gyY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/science/circuit) +"gIA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"gMF" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"gMV" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"gTB" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gVl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"gVP" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"haK" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hcn" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hof" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hwC" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"hBS" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"hIv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"hMI" = ( +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"hST" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hVN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/tesla_coil, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"ihw" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ikz" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/conveyor{ + backwards = 1; + forwards = 2; + id = "trashsort" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"ipL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"iqD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iup" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"iyH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"iAi" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"iJE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/engine/engineering) +"iPN" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"iVC" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"joZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jqb" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"juo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jCQ" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jLE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"jNI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"jSU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage_shared) +"kcN" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"kdD" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"khi" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"kkw" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kuT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"kDs" = ( +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"kNb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"kXQ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lik" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"lkU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lpx" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lqd" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/brig) +"lCX" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"lLo" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + id = "QMLoad2" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"lNj" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "Supply Dock Loading Door" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"lRt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"lTj" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/circuit) +"lWO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/engine/engineering) +"mdU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/engine/engineering) +"mfy" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"mks" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mqh" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) +"msN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mtV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"mNk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/break_room) +"neT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ngt" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nkH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"nmx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nnp" = ( +/obj/machinery/turnstile{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ntW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"nuO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"nFt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) +"nRc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"nUG" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"nXH" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ofD" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"ojZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"onU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"oxP" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"oCd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oKO" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"phO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"pqo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pza" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"pHw" = ( +/obj/effect/turf_decal/tile{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"pWd" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"qae" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qax" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) +"qUA" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"reY" = ( +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"rqY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"rIV" = ( +/obj/structure/closet/wardrobe/cargotech, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"rUI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"rYm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"spX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"sDf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"sZf" = ( +/obj/machinery/rnd/bepis, +/turf/open/floor/engine, +/area/science/explab) +"tbT" = ( +/obj/machinery/power/emitter/anchored{ + dir = 1; + state = 2 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"tfI" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"thv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"tjc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"tjO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"tkv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"tkG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"tln" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"tlP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/gateway) +"tnV" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"tpJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"tsA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"tvc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"txO" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uaq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"ubl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/engine/engineering) +"ucq" = ( +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"ufs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/hallway) +"ulq" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"umI" = ( +/obj/structure/urinal{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"unn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"upC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"urx" = ( +/obj/structure/chair/comfy/teal{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) +"utM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uwg" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"uFf" = ( +/turf/closed/wall/r_wall, +/area/science/circuit) +"uIi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uJe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"uKJ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uKM" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1"; + pixel_y = -5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"uLi" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uLH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"uLR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"uMl" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"uNK" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark/corner{ + dir = 8 + }, +/area/hallway/primary/aft) +"uPt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"uQf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uRi" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"uRw" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uSM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uVs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"uWN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uWS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"uYv" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uZH" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"vhh" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/plasteel/dark, +/area/aisat) +"voR" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"voS" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"vrE" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vtT" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vwv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"vxz" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1"; + pixel_y = -5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"vBE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"vDt" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"vDW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/command) +"vFo" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vFP" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"vGr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"vJb" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vKZ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"vLQ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vPQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"vTO" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"vWi" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"wsH" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wtQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"wwa" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"wEY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"wNs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/circuit) +"wOj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/grounding_rod, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"wUP" = ( +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"wZC" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/item/radio/intercom{ + dir = 1; + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xag" = ( +/turf/closed/wall, +/area/science/circuit) +"xfQ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/end{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"xjG" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"xmV" = ( +/turf/open/floor/plasteel/dark, +/area/science/circuit) +"xyH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer1{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) +"xGE" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"xGR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xQx" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) +"xYx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"yfq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) (1,1,1) = {" aaa @@ -94810,9 +92519,9 @@ bIY bIY bIY byU -bAS +uRi bVp -bAa +tnV bKd bIY bIY @@ -95060,23 +92769,23 @@ aaa aaa aaa bxN -bAS -bLI -bLI -bLI -bLI -bLI -bLI +uRi +ucq +ucq +ucq +ucq +ucq +ucq bPK bRU bYA -bLI -bLI -bLI -bLI -bLI -bLI -bAa +ucq +ucq +ucq +ucq +ucq +ucq +tnV bzY aab aab @@ -95316,25 +93025,25 @@ aab aab aab bzS -bAS -bEK -bLL -bLL -bLL -bMM -bNg +uRi +eia +dQa +dQa +dQa +dZP +vwv bOa bPL bVq caW -bMM -bNg -bMM -bLL -bLL -bLL +dZP +vwv +dZP +dQa +dQa +dQa cAh -cAE +vTO bzY aab aav @@ -95572,9 +93281,9 @@ aab aab aab bzS -bzU -bEK -bKZ +ddh +eia +tln bBW bJg bJg @@ -95590,9 +93299,9 @@ bBX bSd bSS bAc -cAn -cAG -cAE +eqX +xyH +vTO bzY aav aab @@ -95828,9 +93537,9 @@ aav aab aab bzS -bAS -bEK -bKZ +uRi +eia +tln bzV aav aaa @@ -95848,9 +93557,9 @@ aab aav aab bAc -cAN -cAG -cAE +diH +xyH +vTO bBY aab aab @@ -96084,9 +93793,9 @@ aab aav aab bzS -bAS -bEK -bKZ +uRi +eia +tln bzV aab aav @@ -96106,9 +93815,9 @@ aav aab aab bAc -cAN -cAG -cAE +diH +xyH +vTO bzY aab aab @@ -96340,9 +94049,9 @@ aab aab aav bzS -bzU -bEK -bKZ +ddh +eia +tln bzV aab aab @@ -96364,9 +94073,9 @@ aab aab aab bAc -cAn -cAG -cAE +eqX +xyH +vTO bzY aab aab @@ -96596,8 +94305,8 @@ aab aab aab bDC -bAS -bEK +uRi +eia bKY bzV aab @@ -96622,9 +94331,9 @@ aab aab aab bAc -cAN -cAG -cAE +diH +xyH +vTO bzY aab aaa @@ -96852,8 +94561,8 @@ aab aab aab bzS -bAS -bEK +uRi +eia bJF bBW aab @@ -96882,7 +94591,7 @@ aab bAc cBd cBh -bAa +tnV bzY aaa aaa @@ -97108,8 +94817,8 @@ aac aab aab bzS -bzU -byW +ddh +vhh bKy bzV aav @@ -97139,8 +94848,8 @@ aab aab bAc clQ -cBq -bAa +eDP +tnV bzY aaa aaa @@ -97364,9 +95073,9 @@ aaa aac aab bzS -bAS -byW -bzZ +uRi +vhh +iVC bzV aab aav @@ -97396,9 +95105,9 @@ aab aab aab bYB -cAN -cBq -bAa +diH +eDP +tnV bJf aaa aac @@ -97620,9 +95329,9 @@ aaa aaa aac bzS -bAS -byW -bzZ +uRi +vhh +iVC bBW aav aav @@ -97654,9 +95363,9 @@ aav aav aav bYB -cAN -cBq -bAa +diH +eDP +tnV bJf aac aaa @@ -97876,9 +95585,9 @@ aaa aab aaa byU -bzU -byW -bzZ +ddh +vhh +iVC bBW aab aab @@ -97912,9 +95621,9 @@ aab aav aab bAc -cAn -cBq -bAa +eqX +eDP +tnV bKd aaa aab @@ -98133,8 +95842,8 @@ aaa aab bxN byV -byW -bzZ +vhh +iVC bBW aav aav @@ -98170,9 +95879,9 @@ bST bST aav bYB -cAN -cBq -bAa +diH +eDP +tnV bJf aab aab @@ -98389,8 +96098,8 @@ aaa aaa bwP bxO -byW -bzZ +vhh +iVC bzV aab aav @@ -98428,9 +96137,9 @@ bBX bBX bST bAc -cAN -cBq -bAa +diH +eDP +tnV bzX aab aaa @@ -98645,7 +96354,7 @@ aaa aaa aaa bwP -bxP +uKM byX bzV aab @@ -98686,7 +96395,7 @@ bUP bST aab bAc -bxQ +vFP byX cdz aab @@ -98902,7 +96611,7 @@ aaa aaa aaa bwP -bxQ +vFP byX bzW aav @@ -98943,7 +96652,7 @@ bUP bST aab cbC -bxP +uKM byX cdz aab @@ -99159,7 +96868,7 @@ aaa aaa aaa bwP -bxQ +vFP byX bzX aab @@ -99200,7 +96909,7 @@ bUP bST aab cbC -bxQ +vFP byX cdz aab @@ -99416,7 +97125,7 @@ aaa aaa aaa bwP -bxQ +vFP byX bzX aab @@ -99457,7 +97166,7 @@ bUP bST aab cbC -bxQ +vFP byX cdz aab @@ -99673,7 +97382,7 @@ aaa aaa aaa bwP -bxQ +vFP byX bzX aab @@ -99696,10 +97405,10 @@ bNj bNq bOk bPD -cDo +nFt ccT bLJ -bSh +oxP bSY bTU bUR @@ -99714,7 +97423,7 @@ bUP bST aab cbC -bxQ +vFP byX cdz aab @@ -99930,7 +97639,7 @@ aaa aaa aaa bwP -bxQ +vFP byX bzX aab @@ -99971,7 +97680,7 @@ bUP bST aab cbC -bxP +uKM byX cdz aab @@ -100444,7 +98153,7 @@ aaa aaa aaa bwP -bxQ +vFP byZ bzX aab @@ -100467,7 +98176,7 @@ bNp bNt bQm bOj -cDd +dRM cDs bLJ bSi @@ -100485,7 +98194,7 @@ bUP bST aab cbC -cCU +wUP byX cdz aab @@ -100701,7 +98410,7 @@ aaa aaa aaa bwP -bxQ +vFP byZ bzX aab @@ -100724,10 +98433,10 @@ bNj bNu bOn bPG -cDo +nFt cvc bLJ -bSh +oxP bTb bSV bUP @@ -100742,7 +98451,7 @@ bUP bST aab cbC -cCU +wUP byX cdz aab @@ -100958,7 +98667,7 @@ aaa aaa aaa bwP -bxQ +vFP byZ bzX aab @@ -100980,7 +98689,7 @@ bNX bNw bPc bOj -cDd +dRM cDq cvd bLJ @@ -101215,7 +98924,7 @@ aaa aaa aaa bwP -bxQ +vFP byZ bzX aab @@ -101256,7 +98965,7 @@ bSU bST bSc bzS -cCU +wUP byX cdz aab @@ -101472,7 +99181,7 @@ aaa aaa aaa bwP -bxQ +vFP byZ bzW aav @@ -101511,8 +99220,8 @@ bUS bSV bZP bZO -bLI -bLI +ucq +ucq cCW byX cdz @@ -101729,7 +99438,7 @@ aaa aaa aaa bwP -bxP +uKM byZ bzY aab @@ -101751,7 +99460,7 @@ bBX bME bPv bOt -cDh +ufs bBX aab bBX @@ -101988,7 +99697,7 @@ aaa bwP bxS bzb -bAa +tnV bzY aab aav @@ -102008,7 +99717,7 @@ bBX bBX bPv bOo -cDg +gra bBX aab aab @@ -102026,9 +99735,9 @@ bBX bBX bST caY -bxQ +vFP cCX -bzZ +iVC bzX aab aaa @@ -102245,8 +99954,8 @@ aaa aab bxT bzT -bAb -bAa +uLR +tnV bBY aav aav @@ -102265,7 +99974,7 @@ aab bBX bPv bOp -cDh +ufs bBX aab aab @@ -102282,9 +99991,9 @@ bST bST aav cap -bAS -bEK -bKZ +uRi +eia +tln cbE aab aab @@ -102502,9 +100211,9 @@ aaa aab aaa bxT -bAR -bAb -bAa +vxz +uLR +tnV bBY aab aab @@ -102538,9 +100247,9 @@ aab aav aab bzS -bzU -bEK -bKZ +ddh +eia +tln cbE aaa aab @@ -102760,9 +100469,9 @@ aab aaa aaa bAc -bDJ -bAb -bAa +fsj +uLR +tnV bBY aav aav @@ -102794,9 +100503,9 @@ aav aav aav bDC -bAS -bEK -bKZ +uRi +eia +tln cbE aaa aaa @@ -103018,9 +100727,9 @@ aaa aaa aab bAc -bDJ -bAb -bAa +fsj +uLR +tnV bzY aab aav @@ -103036,7 +100745,7 @@ aab bBX bPv bOo -cDh +ufs bBX aab aab @@ -103050,9 +100759,9 @@ aab aab aab bDC -bAS -bEK -bKZ +uRi +eia +tln caZ aac aac @@ -103276,8 +100985,8 @@ aaa aab aab bAc -bAR -bAb +vxz +uLR bKH bzY aav @@ -103293,7 +101002,7 @@ aab bBX bPv bOo -cDg +gra bBX aab aab @@ -103307,8 +101016,8 @@ aab aab bzS cnO -bEK -bKZ +eia +tln bzV aaa aaa @@ -103450,7 +101159,7 @@ cMv cOq abY ahd -ahU +fXq aiN aiN alm @@ -103534,7 +101243,7 @@ aab aab aab bAc -bDJ +fsj bFX bKa bBY @@ -103550,7 +101259,7 @@ bBX bBX bPv bOo -cDh +ufs bBX bBX bBX @@ -103564,7 +101273,7 @@ aaa bzS cCT cBn -bKZ +tln bzV aab aaa @@ -103792,9 +101501,9 @@ aab aab aab bAc -bDJ -bAb -bAa +fsj +uLR +tnV bzY aab aab @@ -103818,9 +101527,9 @@ aaa aaa aaa bxN -bAS -bEK -bKZ +uRi +eia +tln bzV aab aab @@ -104050,9 +101759,9 @@ aab aab aab bAc -bAR -bAb -bAa +vxz +uLR +tnV bzY aab aaa @@ -104074,9 +101783,9 @@ aaa aaa aaa bxN -bzU -bEK -bKZ +ddh +eia +tln bzV aab aab @@ -104308,9 +102017,9 @@ aab aab aab bAc -bDJ -bAb -bAa +fsj +uLR +tnV bzY aaa aac @@ -104330,9 +102039,9 @@ aac aaa aaa bxN -bAS -bEK -bKZ +uRi +eia +tln bzV aab aab @@ -104478,7 +102187,7 @@ aeG acw abY ahd -ahU +fXq aiN aiN alp @@ -104566,9 +102275,9 @@ aab aab aab bAc -bDJ -bAb -bAa +fsj +uLR +tnV bJf aac aaa @@ -104586,9 +102295,9 @@ aab aac aaa bxN -bAS -bEK -bKZ +uRi +eia +tln bzV aab aaa @@ -104824,9 +102533,9 @@ aab aab aab bAc -bAR -bAb -bAa +vxz +uLR +tnV bKd bIY chv @@ -104842,9 +102551,9 @@ bBX bSc bTe bzS -bzU -bEK -bKZ +ddh +eia +tln bBW aav aac @@ -105082,25 +102791,25 @@ aaa aaa aaa bxT -bDJ -bAb -bLI -bLI +fsj +uLR +ucq +ucq bMG -bMQ +iyH bNY bRT bPQ bXM cuV -bMQ +iyH cve -bMQ -bLI -bLI -bLI -bEK -bKZ +iyH +ucq +ucq +ucq +eia +tln bzV aav aab @@ -105340,23 +103049,23 @@ aaa aaa aaa bxT -bDJ -bLL -bLL +fsj +dQa +dQa bML -bMR -bMR +vWi +vWi bPH bQT bOw caX -bMR +vWi cvf -bLL -bLL -bLL -bLL -bKZ +dQa +dQa +dQa +dQa +tln bzV aab aav @@ -105506,7 +103215,7 @@ aeG acw abY ahd -ahU +fXq aiN aiN als @@ -106534,7 +104243,7 @@ acw aeJ abY ahd -ahU +fXq aiN aiN alv @@ -110383,15 +108092,15 @@ aaQ aaQ acy aaQ -ads -ads -ads -ads -ads -ads -ads -ads -ads +uFf +uFf +uFf +uFf +uFf +uFf +uFf +uFf +uFf aaQ aaQ any @@ -110640,15 +108349,15 @@ abH agn acz abe -ads +uFf adS aeL afG cxo ahj -adS +lTj aiY -akp +xag anE aoj anz @@ -110917,7 +108626,7 @@ aqc aqc avE awv -aBs +dWs axl aaQ azx @@ -111154,7 +108863,7 @@ aaQ aaQ acB aaQ -ads +uFf aut aeN adU @@ -111162,9 +108871,9 @@ agp ahl aif aja -akp +xag anU -aoQ +nUG apa arj atb @@ -111174,7 +108883,7 @@ avO atW ayR aPu -aBs +dWs aCU aaV azy @@ -111411,11 +109120,11 @@ aaA abp acC acY -ads +uFf aid -adV +xmV afH -agq +wNs ahm aig ajb @@ -111668,13 +109377,13 @@ aaA abp acD boY -ads +uFf adW -adV -afI +xmV +gyY aoa -afI -adV +gyY +xmV ajc abd alE @@ -111689,7 +109398,7 @@ aqd azd awy axS -aoQ +nUG aaV azA aAO @@ -111925,12 +109634,12 @@ aaA abp acD abc -ads +uFf adX aeO -adV -agq -adV +xmV +wNs +xmV aih ajd abd @@ -111945,7 +109654,7 @@ avU aqd azd aww -aBs +dWs abt aaV azB @@ -112182,11 +109891,11 @@ aaA abp acD cOv -ads +uFf adY aeP coc -agq +wNs ahn aii aje @@ -112202,7 +109911,7 @@ avL aqd azd aww -aBs +dWs aUi aaQ aaQ @@ -112459,7 +110168,7 @@ abJ abJ azf aww -aBs +dWs abt any azC @@ -112716,7 +110425,7 @@ arn bJo azd awz -aBs +dWs aCU any azD @@ -113106,12 +110815,12 @@ cvC cvC cwK cqk -cFB +ipL cqk cqk cqk cyK -cGH +iup cqk cza cvG @@ -113230,7 +110939,7 @@ aro abJ azd aww -aBs +dWs aFN any azF @@ -113487,7 +111196,7 @@ asV abJ aCi awB -aBs +dWs axl any azG @@ -113726,7 +111435,7 @@ acD ais adu aed -aeT +aed arg agw afO @@ -113744,7 +111453,7 @@ atM abJ bdT aww -aBs +dWs axL axL axL @@ -114001,7 +111710,7 @@ arr abJ azd aww -aBZ +pza axM aIJ azH @@ -114258,7 +111967,7 @@ atN auP azh awC -aBs +dWs axN ayE azI @@ -114290,7 +111999,7 @@ aVS aWR aYS aYT -bad +ntW bbq bcu bcu @@ -114515,7 +112224,7 @@ arr abJ azd awz -aBs +dWs axO ayF azJ @@ -114772,7 +112481,7 @@ atO abJ azi awz -aBs +dWs axL ayG ayN @@ -115263,7 +112972,7 @@ aAY aAY aAY abK -acd +ace acH ajC abJ @@ -115286,7 +112995,7 @@ apY abJ azd awz -aBs +dWs axL ayI azK @@ -115543,7 +113252,7 @@ abJ abJ azd awz -aBs +dWs axP ayJ azL @@ -116055,9 +113764,9 @@ arx akt atS auQ -azk +duB awz -aBZ +pza axL ayL azM @@ -116070,7 +113779,7 @@ aFb aFO aGD aHo -aGD +aHp aDr aaA aaA @@ -116143,7 +113852,7 @@ bMp bQx cLB bOS -cLK +uNK boU bQY bRG @@ -116314,7 +114023,7 @@ atT auR azQ awE -aBs +dWs axQ ayM azN @@ -116326,7 +114035,7 @@ aEj aFc aFO aGD -aHp +aGD aGD aDr apk @@ -116346,7 +114055,7 @@ aVY aTF aTF aSt -bad +ntW cGw cGy cGA @@ -116571,7 +114280,7 @@ atS auS azS awz -aBs +dWs axN ayN azO @@ -116657,7 +114366,7 @@ bMq boU cLD bOU -cLK +uNK boU bRa bRI @@ -116675,25 +114384,25 @@ cKF cKH boU cCz -bNU -bNU -cCr -bZn -bZn -bZn -bZn -bZn +uIi +uIi +uYv +dgb +dgb +dgb +dgb +dgb bkT bQg -bZn -bZn -bZn -bZn +dgb +dgb +dgb +dgb cCK -bZn +dgb cHc -bZn -cCr +dgb +uYv cEM cHw cER @@ -116828,7 +114537,7 @@ avA auQ azZ awF -aBs +dWs axR aTE azO @@ -116839,9 +114548,9 @@ aJP aKA aFe aDr -aGD aHq aGD +sZf aDr aJI aKB @@ -116861,7 +114570,7 @@ aTH aTH boB bam -bvr +tpJ bcs bdz beK @@ -116914,7 +114623,7 @@ bMr boU cLE bOU -cLK +uNK boU bRb bRJ @@ -116934,22 +114643,22 @@ boU cCA cML cfS -cHu -cRJ -cRL -cRJ -cRL +lCX +upC +etb +upC +etb cRP -cRL +etb cRR -cRL +etb cRT -cRL -cRJ +etb +upC cRV cRX cRY -cRJ +upC cRZ cSa cHx @@ -117085,7 +114794,7 @@ afU afU aAo awG -aBs +dWs axL axL azP @@ -117189,9 +114898,9 @@ cKt cKI boU cBI -cMP +thv cCg -cCs +uKJ cfj cfO cfj @@ -117207,7 +114916,7 @@ cSN cHb cfj cfj -cCs +uKJ cEO cHy cET @@ -117340,15 +115049,15 @@ avo atf awJ auT -azk +duB awH aCb -aDq +qax aDz aFW aHr -aDq -aDq +qax +qax aJQ aKK aNn @@ -117375,7 +115084,7 @@ aTJ aTJ brk bao -bvr +tpJ bcs bdB beK @@ -117428,7 +115137,7 @@ bJs boU cJk bOU -cLK +uNK boU bRd bRJ @@ -117447,7 +115156,7 @@ cKJ boU cWR cMQ -cCh +uRw boU cqg cqg @@ -117608,7 +115317,7 @@ aBU axn aEs aEn -aBs +dWs aPf aaQ cMl @@ -117703,10 +115412,10 @@ cKt cKK boU cgm -cMP -cCh +thv +uRw boU -cPF +cfm chI cqg cWW @@ -117889,7 +115598,7 @@ aTL aTJ brk bam -bvr +tpJ bct bdD beK @@ -117942,7 +115651,7 @@ cVB boU cLG bOU -cLO +ely boU bRf bSo @@ -117961,7 +115670,7 @@ cKL boU cCC cQV -cCh +uRw boU bYa ced @@ -118146,7 +115855,7 @@ aTL aTJ brk bam -bJH +eNI bcl bcl bcl @@ -118199,7 +115908,7 @@ bJs boU cLH bOU -cLO +ely boU bRg bRK @@ -118403,7 +116112,7 @@ aTL aTJ brl bbi -bxn +ofD bcl bdp bhl @@ -118456,7 +116165,7 @@ bJs boU cLI bOV -cLO +ely boU bDb boU @@ -118642,9 +116351,9 @@ aGH aCL cXq aJF -aFH -aKH -aYW +ngt +nmx +vFo apg aab aab @@ -118660,7 +116369,7 @@ aTK aTJ brr bam -bvr +tpJ bcl bdq beC @@ -118713,26 +116422,26 @@ bJs boU cWN bOU -cCf -cCr -bNU +qUA +uYv +uIi bSp bTl bUk bZm cCx -bNU -bNU -btX -bNU -bNU +uIi +uIi +nkH +uIi +uIi cMK cfP -bNU -cCr +uIi +uYv cHr -cMP -cCi +thv +voS boU cdB cRW @@ -118899,9 +116608,9 @@ aGI aBX cXq aJF -aFH -aKH -aYW +ngt +nmx +vFo bym aab aab @@ -118917,7 +116626,7 @@ aSt aSt bdC bbj -bxo +vDW beN bdr bij @@ -118970,23 +116679,23 @@ bLS boU bVo cCm -cbI +dFe cfi -cbI +dFe cfS cju czN cCL cfS -cbI +dFe cfS cEL cfS -cbI +dFe cEN -cbI +dFe cHd -cHu +lCX cfS cRI cCE @@ -119156,7 +116865,7 @@ aPi aHt aHV aJF -aFH +ngt bwV aYX bBZ @@ -119228,22 +116937,22 @@ boU cBI bOX cCa -cCs -cBy -cBy +uKJ +ean +ean bWZ -cBy -cBy -cBy -cBy -cBy -cBy -cBG +ean +ean +ean +ean +ean +ean +ulq cUG -cBy +ean cFf -bKW -cCs +sDf +uKJ cBR bOX cHv @@ -119397,8 +117106,8 @@ ati auG auY aBc -aBp -aBp +uMl +uMl aDu ayS azY @@ -119413,9 +117122,9 @@ aGK aBX aIb aJF -aFH -aKH -aYW +ngt +nmx +vFo cye aab aab @@ -119530,7 +117239,7 @@ cyh cvK cvK cue -cFB +ipL cqk cqk cqk @@ -119672,7 +117381,7 @@ aIc aJG aKx aKI -aYY +vrE apg aab aab @@ -119741,16 +117450,16 @@ cTt boU cBN bOX -cCi +voS bQz cUy bRh cFn -cIr +wtQ cKA -cIr -cIr -cIr +wtQ +wtQ +wtQ cLb cLL bQz @@ -119760,7 +117469,7 @@ bZQ car cFF cFO -cFY +evX bYJ cdB bYa @@ -119791,11 +117500,11 @@ cxm cvK cvK cvK -cGH +iup cqk cza czi -czu +cwl czw aab aab @@ -119907,28 +117616,28 @@ anR arG auk bXs -avM -avM +dEp +dEp axC -aBe -aBq -aBq +gVP +fKc +fKc aDv aEk aGJ aHA aXd -avM -avM -avM -avM +dEp +dEp +dEp +dEp aPg aPj -aBe -aBq -aBq +gVP +fKc +fKc aKy -aKH +nmx cNB apg aab @@ -119945,7 +117654,7 @@ aXa aWY btl bam -bvr +tpJ bcw bdK beT @@ -119954,8 +117663,8 @@ bgk bcw cIA cNM -cIE -cIE +dWj +dWj cIG bjC bmj @@ -119998,7 +117707,7 @@ cRh boU cBI bOX -cCh +uRw bQA cmx bRh @@ -120009,7 +117718,7 @@ cWp cJx cJx cJx -cLZ +xQx bQz cWQ bZg @@ -120017,7 +117726,7 @@ bZg bZg cJI cNb -cFY +evX bYJ cdB bYa @@ -120186,7 +117895,7 @@ aCM aJH aJM aPW -aYW +vFo apg aab aab @@ -120202,7 +117911,7 @@ aXb aWY brk bpH -bxo +vDW bcx bdL beU @@ -120213,7 +117922,7 @@ cIB bjz bkk bkL -cIH +tlP biQ bmk bne @@ -120230,14 +117939,14 @@ cPo bsN bte btT -btT +fZN bwi bwR byh bAi -bAy +uLH bWT -bAy +uLH bDa bsN aaA @@ -120255,7 +117964,7 @@ cPB boU cBI bOX -cCh +uRw bQA cUz bRh @@ -120423,27 +118132,27 @@ aWv avG aYm axi -axE -aBm +pqo +ect aJX -aBm -aBm -aBm -aPN +ect +ect +ect +lkU aDQ aDF bku -axE -aPN -aBm -aBm -aBm -aBm -aBm -aBm +pqo +lkU +ect +ect +ect +ect +ect +ect aLw -aOn -aYW +uWN +vFo apg aab aab @@ -120459,7 +118168,7 @@ aXc aYf btE cGt -bvr +tpJ bcw bdM beV @@ -120470,7 +118179,7 @@ cIC bjA bkl bkM -cIH +tlP blP bml bnf @@ -120495,7 +118204,7 @@ bAl bAz bBx bCr -bwr +iPN bsN aaA aaA @@ -120512,7 +118221,7 @@ bFI boU cIy bOX -cCh +uRw bQA cmx bRh @@ -120699,8 +118408,8 @@ apk aHX apk bPB -aOn -aYW +uWN +vFo apg aab aab @@ -120727,7 +118436,7 @@ cIB bjB bkm bkN -cIH +tlP biQ bmm bre @@ -120769,7 +118478,7 @@ boU cFZ cBI bOX -cCh +uRw bQA bRh bRh @@ -120780,7 +118489,7 @@ cJx cJx cJx cWs -cLZ +xQx bQz bZj cJB @@ -120808,7 +118517,7 @@ aaA ceG cqt bYa -cPF +cfm ceG aaA aaA @@ -120956,8 +118665,8 @@ aEv aHY aFl aJD -aOn -aYW +uWN +vFo apg aab aab @@ -120973,7 +118682,7 @@ aWY aWY brk bam -bJH +eNI bcw bdO biG @@ -120981,9 +118690,9 @@ bfa bhs bcw cID -cIF -cIF -cIF +iAi +iAi +iAi cII bjC bmn @@ -121006,7 +118715,7 @@ bwT bwR byk bAp -btT +fZN bBz bFc bwR @@ -121037,7 +118746,7 @@ cJx cWq cJx cJx -cLZ +xQx bQz cjU cJA @@ -121213,8 +118922,8 @@ aHu aHY aFl aJD -aOn -aYW +uWN +vFo apg aab aab @@ -121230,7 +118939,7 @@ aWY aWY buq bam -bvr +tpJ bcw bdQ cJK @@ -121283,17 +118992,17 @@ boU cGb cBI bOX -cCh +uRw bQz cUB bRh cFG -cJS -cJS -cJS +fZL +fZL +fZL cWr -cJS -cJS +fZL +fZL cMy cFI cfq @@ -121470,8 +119179,8 @@ aHv aHY aFl aJD -aOn -aYW +uWN +vFo apg aab aab @@ -121487,7 +119196,7 @@ cEU aWY buu ban -bvr +tpJ bcw bht beY @@ -121540,7 +119249,7 @@ bMs boU cIz bOX -cCh +uRw bQA cUC bRh @@ -121566,7 +119275,7 @@ cQK bYa bYa cRQ -cPF +cfm chI cRv bYa @@ -121727,8 +119436,8 @@ aGO aGO aGO aKv -aOn -aYY +uWN +vrE apg aab aab @@ -121744,7 +119453,7 @@ aOW aSt brk bam -bvr +tpJ bcw bdR bfa @@ -121797,26 +119506,26 @@ cVD boU cgm bOX -cCh +uRw bQA cUC bRh bXb bSw bVM -bRW -cbk -cbk +xfQ +kdD +kdD chS ccm cFI cfs -cFA +fwg cnQ -cFA +fwg cFM cFV -cLW +fQN bYJ cVK chI @@ -121985,7 +119694,7 @@ aHZ aIR aLt aPc -aYW +vFo apg aOl aPa @@ -122001,7 +119710,7 @@ aPV aSt brl bbi -bxn +ofD bcw bdS bfb @@ -122036,7 +119745,7 @@ byo cUo cUp cUq -bwr +iPN bsN bEa bEY @@ -122054,7 +119763,7 @@ bFI boU cBI bOX -cCh +uRw bQA cUC bRh @@ -122073,7 +119782,7 @@ cEV cEV cEV cFW -cLW +fQN bYJ cdB chI @@ -122243,34 +119952,34 @@ aIS aTf aTY aKJ -aZa -aZa +ojZ +ojZ aZd -aZv +uSM aQm bvQ -boX -aZv -aZv +joZ +uSM +uSM bEb -aZv +uSM biP -aZv +uSM brX bbm bvB bNH -bvS -bvS -bwg -aZv -aZv +utM +utM +iqD +uSM +uSM cQx -bvS -bvS -bwg -boX -aZv +utM +utM +iqD +joZ +uSM bqS bMu bNJ @@ -122311,7 +120020,7 @@ bKj bNb cBO bOZ -cCh +uRw bQz cUC bRN @@ -122325,10 +120034,10 @@ cbP cMz cFI cEW -cGi +eJn cQH cSp -cGi +eJn cQH cMm bYJ @@ -122499,9 +120208,9 @@ aIQ aIR aJD aXg -aXi -aXi -aXi +oCd +oCd +oCd aZT aZU bkc @@ -122530,7 +120239,7 @@ blq aQO bmr bAr -bNK +kXQ bTr aRZ cRb @@ -122568,7 +120277,7 @@ bIt boU cBI bOX -cCi +voS bQB bQB bQB @@ -122582,12 +120291,12 @@ bQB bQB bQB cIv -cJI +kcN cQH cFY -cJI +kcN cQH -cLW +fQN bYJ cVL bYN @@ -122763,31 +120472,31 @@ brh aZY aRY bkA -bpf +xGR aVO biO -bpF -bpF -bpF -bpF +uLi +uLi +uLi +uLi bsp blr -bpF -bpF -bpF -bpF +uLi +uLi +uLi +uLi bmv cQE -bpF -bpF -bpF -bpF +uLi +uLi +uLi +uLi bSv -bpf -bpF +xGR +uLi bDV bnn -bNK +kXQ bON aRZ boR @@ -122825,7 +120534,7 @@ bFI boU cBI bOX -cCh +uRw bQB bRl bWv @@ -123019,7 +120728,7 @@ axa axa bap aPY -blg +vtT aRH aRH aRH @@ -123044,7 +120753,7 @@ bgp bgp bRS aPY -bNK +kXQ aOz aRZ boR @@ -123082,7 +120791,7 @@ bFI boU cWO bOX -cCh +uRw bQB coD bRP @@ -123244,12 +120953,12 @@ adx adx ama aNh -aqx +vBE asO aFn -aqx -aqx -aqx +vBE +vBE +vBE axI awa awS @@ -123257,16 +120966,16 @@ axw aye aIw aWt -aHC +uVs aMq -auu -auu -axq -auu +dwu +dwu +pWd +dwu aZj -aHC -aHC -aHC +uVs +uVs +uVs aQX aqG aKL @@ -123276,7 +120985,7 @@ aMn axa bap aPY -bwS +vLQ aRH bBv cck @@ -123301,7 +121010,7 @@ bPX bgp cJa aPY -bNK +kXQ aOy aRZ boR @@ -123339,10 +121048,10 @@ bFH boU cBM bPa -cCh +uRw bQB bRn -bWx +gqj bQB bUw bWW @@ -123524,7 +121233,7 @@ aBl aGT aBl aWQ -aHE +xjG aqG aKM aKO @@ -123533,7 +121242,7 @@ aKO axa cHZ aPY -bms +kkw aRI aSF aTT @@ -123558,7 +121267,7 @@ bgr bii bgn aPY -bnl +dFG aRZ aRZ bpt @@ -123596,7 +121305,7 @@ aaA boU cBK bOX -cCh +uRw bQB bQB bQB @@ -123759,10 +121468,10 @@ afi abA aWS aob -asQ -asQ -asQ -asQ +gVl +gVl +gVl +gVl axj axK awc @@ -123774,14 +121483,14 @@ aAe aHD aEi bpE -auO -auO -auO +dGX +dGX +dGX bZZ -auO -aFM +dGX +kuT aIe -aHG +fqL aJT aKN aKN @@ -123790,7 +121499,7 @@ cND axa bap aPY -bms +kkw aRJ aSG aSG @@ -123815,7 +121524,7 @@ bko blT bDW bno -bnl +dFG aRZ cAs bpr @@ -124038,7 +121747,7 @@ aqG aqG aPp aIe -aIT +mtV aqG aKO aLy @@ -124072,7 +121781,7 @@ bls blU bFm bnp -cGD +xYx aRZ boR bpr @@ -124110,7 +121819,7 @@ aaA boU cBL bOX -cCh +uRw bQB cpR cEZ @@ -124285,7 +121994,7 @@ axz aqG aEu aAe -aHE +xjG aqG aCV aDI @@ -124329,7 +122038,7 @@ blt blV bFJ bnq -bSF +qae aRZ boR bps @@ -124367,7 +122076,7 @@ aaA boU cBI bOX -cCh +uRw bQB cpX cFc @@ -124542,7 +122251,7 @@ axA aqG cDE aAe -aHG +fqL aCl aqJ aDJ @@ -124555,13 +122264,13 @@ aIf aKX aqG aNv -cIo -cIo -cIo +rUI +rUI +rUI axa btt aPY -bms +kkw aRI aSG aTW @@ -124586,7 +122295,7 @@ bjH bii bgn aPY -bnl +dFG aRZ boU boU @@ -124624,7 +122333,7 @@ boU boU cBP bPb -cCk +uZH bQB bQB bQB @@ -124637,14 +122346,14 @@ bQB bQB bQB cGm -bRr +unn bXu cQH cco cor cQH bXu -bRr +unn cSq bQz cdB @@ -124809,7 +122518,7 @@ aGb aGV aPr aIg -aMy +lqd aJU aQY aXQ @@ -124843,45 +122552,45 @@ bqu bgp bnu bAs -bNL -boX -bNU +vJb +joZ +uIi bTt -bNU -bNU +uIi +uIi cec cfP cPl -bNU -bNU -bNU -bNU +uIi +uIi +uIi +uIi bVI -bUN +neT cBm -cCb +hST cEv bNv bBr byf -cCb -bUN -bUN -bUN -bNU +hST +neT +neT +neT +uIi bZR cfP -bNU +uIi cjv -bNU -btX +uIi +nkH cBF -bNU -bNU -bNU +uIi +uIi +uIi cBQ bOX -cCh +uRw bQB bRl bWN @@ -125056,7 +122765,7 @@ axA aqG aFf aAg -aHE +xjG aqG aCX aDL @@ -125075,7 +122784,7 @@ aZN axa bbt aPY -bmq +txO aRH aSK aTX @@ -125102,20 +122811,20 @@ bgn bqv bqx bqz -brz +wEY bsB -brz -bPk -brz -bPk +wEY +dQT +wEY +dQT cPm -bPk -brz +dQT +wEY cAB -brz -bPk -brz -bPk +wEY +dQT +wEY +dQT bQQ cAm cuX @@ -125323,7 +123032,7 @@ aCV aqG aQn aIh -aIT +mtV aqG aXP aXQ @@ -125332,7 +123041,7 @@ aYP axa cCB aPY -bmq +txO aRM aSL aZV @@ -125358,47 +123067,47 @@ bii cGC bns bNM -bpf -bNV -bNV -bSu -bNV -bNV +xGR +eFp +eFp +khi +eFp +eFp bUo clK -bNV -bSu +eFp +khi bAQ -bNV -bXh +eFp +eTx cSG -bXh -cCc +eTx +ihw cEw byf bBC cGd -cCc -bXh -bXh +ihw +eTx +eTx cIR -bKW -cBy -cBy -cBy +sDf +ean +ean +ean cBB -cBy -cBy -cBG +ean +ean +ulq clB cBH -cBy +ean bVV bOY bVk bQB bRn -bWx +gqj bQB bSw bXX @@ -125409,12 +123118,12 @@ bWV bQB cWP bSw -cNa +gMV cbS ckT cTK cMx -cSy +fEH bSw cSu bQz @@ -125580,7 +123289,7 @@ aqG aqG cDV aIe -aKP +dPK aqG aqG aLA @@ -125589,7 +123298,7 @@ aLA axa bap aPY -bmq +txO aRN aSM aTZ @@ -125614,7 +123323,7 @@ blx bii bgn bns -bnl +dFG aRZ boU boU @@ -125652,7 +123361,7 @@ boU boU cTW bOX -cCh +uRw bQB bQB bQB @@ -125666,12 +123375,12 @@ bQB bQB bTw bSw -cNa +gMV cSn cSn cSn cSn -cSy +fEH bSw cSE bQz @@ -125827,7 +123536,7 @@ axB ayh aFi aAj -aKP +dPK aCn aCY aDM @@ -125837,7 +123546,7 @@ aGc aGW aEq aIe -aMy +lqd aJV aKR aKR @@ -125846,7 +123555,7 @@ aNo axa bap aPY -bmq +txO aRN aSN aUa @@ -125871,7 +123580,7 @@ blv bii bgn bns -bnl +dFG aRZ czI bpw @@ -125889,11 +123598,11 @@ bws bxt bzf bsV -bAE +doD bBE bCU -bDg -bDg +mqh +mqh bEZ bFK bHC @@ -125909,32 +123618,32 @@ bMv boU cBS bOX -cCf +qUA bQC -bRr -bSC +vKZ +ggi bZT bSw bWQ -cav -bRr -bSC +eqk +vKZ +ggi cbQ bZU ccV cGh cPH -cSo +jNI cSr -cSo -cSo +jNI +jNI cSz cGh cSF cUb cSK cUc -bRr +vKZ chT czC bSw @@ -126094,7 +123803,7 @@ aGd aGX cDE aIe -aIT +mtV aqG aKS aLB @@ -126103,7 +123812,7 @@ aKR axa bap aPY -bRM +wZC aRN aSO aUb @@ -126128,7 +123837,7 @@ bkX bii bGO bnt -bnl +dFG aRZ boZ cAg @@ -126146,7 +123855,7 @@ btG btG bzg bzq -bAE +doD bBw bCm bCm @@ -126195,9 +123904,9 @@ bSw csZ czC bSw -cav -bRr -bRr +eqk +vKZ +vKZ cmb cmW brT @@ -126341,7 +124050,7 @@ aqG aqG cXc aAl -aIT +mtV aqG aDa aEJ @@ -126351,7 +124060,7 @@ aGe aGY cDF aIi -aHE +xjG aqG aqG aqG @@ -126360,7 +124069,7 @@ aqG axa bap aPY -blg +vtT aRN aSP aUc @@ -126385,7 +124094,7 @@ blx bii bgn bns -bSF +qae aRZ boZ cOS @@ -126405,8 +124114,8 @@ bzh bzr bAF bBF -bCV -bCV +kNb +kNb bGu bFN bFK @@ -126425,7 +124134,7 @@ cBT bPe bYs bQC -bRW +xfQ bSD bUq bVc @@ -126608,7 +124317,7 @@ aGf aqG aPp aIj -aRa +fMb aJW bRj aLC @@ -126642,7 +124351,7 @@ blv bii bgn bns -cGD +xYx aRZ boZ bDx @@ -126657,10 +124366,10 @@ bux bva btG bwk -btG +lpx bzl bsV -bAE +doD bBH bCo bDm @@ -126687,22 +124396,22 @@ bSw bYo bVc bYO -cbh -cbh -cbh -cbh -cbh +fDN +fDN +fDN +fDN +fDN cFg ccv cEY bZS cTP cSt -cbh +fDN cGk -cbh +fDN cGl -cbh +fDN bUy cay cft @@ -126855,7 +124564,7 @@ aqG aqG aFh aAl -aIT +mtV aqG aqG aDH @@ -126899,7 +124608,7 @@ bly bii bgn bns -bnl +dFG aRZ boZ bDx @@ -126917,7 +124626,7 @@ bwl bxa bzp bsQ -bAE +doD bBH bCW bDo @@ -127102,23 +124811,23 @@ apj aoC asS aNf -avH -auu -auu -axq -auu -auu +yfq +dwu +dwu +pWd +dwu +dwu aCk -avH +yfq aFk aAl aIU aYZ -auu -auu -auu -auu -auu +dwu +dwu +dwu +dwu +dwu cLx aQQ aIl @@ -127126,7 +124835,7 @@ aKu aqJ aBk aLE -aMw +jLE aNq aOr bap @@ -127156,7 +124865,7 @@ blx bii bgn bns -bnl +dFG aRZ czK bpx @@ -127194,7 +124903,7 @@ bCD boU cBS bOU -cCh +uRw boU bQB bQB @@ -127344,7 +125053,7 @@ aab aab aab acS -adm +cuL adF ael afk @@ -127379,7 +125088,7 @@ ayi cLy cdt cEt -aRa +fMb aqJ cDx aqG @@ -127431,14 +125140,14 @@ bwn bxc bzF bsQ -bwC +dIv bCc bCX bDE bEk bGk bCq -bwC +dIv bGU bJe bIy @@ -127451,15 +125160,15 @@ bMx boU cBV bOU -cCh +uRw boU -bRt -bRt -bRt +eVg +eVg +eVg bSH -bRt -bRt -bRt +eVg +eVg +eVg bWB bWY bWY @@ -127601,7 +125310,7 @@ aab aab aab acS -adm +cuL adG aem afl @@ -127616,27 +125325,27 @@ apj aoe aqe bdo -auO -auO -auO -auO -auO -auO +dGX +dGX +dGX +dGX +dGX +dGX aCF -auO -aFM +dGX +kuT aAn aIV aJf -aJO +hIv aKa aGo -aJO -aJO +hIv +hIv cLz aQR aIn -aRa +fMb aqJ aBk aLF @@ -127645,7 +125354,7 @@ aNr aOs bbv aPY -bmz +eGt aRQ cnj aUj @@ -127670,7 +125379,7 @@ bjH bgp bFQ bns -bnl +dFG aRZ boZ bpx @@ -127695,7 +125404,7 @@ bDh bEE bDh bCq -bwC +dIv cOi bJy bJC @@ -127708,7 +125417,7 @@ cPC boU cBW bOV -cCi +voS boU bRu bRX @@ -127858,7 +125567,7 @@ aab aab aab acS -adm +cuL cif aen afm @@ -127904,7 +125613,7 @@ bbv aQb aSA aRR -aUf +ebs cAw aVm aWk @@ -127927,13 +125636,13 @@ blz bgw bGg bHj -bnl +dFG aRZ boZ bpx bfs bqP -bru +voR bqT bpx bsV @@ -127958,14 +125667,14 @@ bJe bIy bJL bKp -bRO +uWS bLB bIx bCD boU cBX bPf -cCk +uZH boU bRv bRY @@ -128128,7 +125837,7 @@ akV abA apl aEI -atI +wwa aqK arY atq @@ -128150,21 +125859,21 @@ aGg aqG cDW aIp -aRa +fMb azm aKV aLE -aMw +jLE aNs aOr bbw aPY -bmz +eGt aRR -aUf +ebs czO aVm -aUf +ebs aXl aYq aYq @@ -128184,13 +125893,13 @@ blA blW bJT bnv -bnl +dFG aRZ boZ bpx cNO buC -bru +voR brs bsu brP @@ -128385,7 +126094,7 @@ akW amd apn aof -atI +wwa aqK arZ atr @@ -128418,10 +126127,10 @@ btR aQd bmI aRT -aUh +lRt cAy aUA -aUh +lRt aXm aYs aYs @@ -128431,11 +126140,11 @@ aYs aZo bfn aVo -bhG -bhG -bhG -bhG -bkr +gMF +gMF +gMF +gMF +ehl bki bgw bgw @@ -128479,7 +126188,7 @@ bCD boU cBS bPg -cCh +uRw boU bRx bRx @@ -128494,9 +126203,9 @@ bXz bXz bWB bZw -caB -caB -caB +umI +umI +umI bWB cXf bWB @@ -128673,12 +126382,12 @@ aNt aOt bby aQe -bmz +eGt aRU -aUf +ebs cAw aVn -aUf +ebs aXn aSX aSX @@ -128689,16 +126398,16 @@ cNJ aRO bgw bhH -bhG -bhG -bhG -bkr -bkU +gMF +gMF +gMF +ehl +nRc blB aPb bmB bnw -bog +juo aRZ bpa bpy @@ -128723,7 +126432,7 @@ bDl bEg bFd bCs -bwC +dIv bGZ bJe bIy @@ -128736,7 +126445,7 @@ cVC boU cBU bPg -cCh +uRw boU bQB bQB @@ -128889,14 +126598,14 @@ aby bsn adI acT -akL -akL -akL +uaq +uaq +uaq aqM -akL -akL +uaq +uaq aqt -akL +uaq apz aoh att @@ -128923,19 +126632,19 @@ bdE bwH aJZ cAo -cLA +nnp aLI aEG aNu -cLA +nnp bbz aQf -bmz +eGt aRR -aUf +ebs cAx aVm -aUf +ebs aXn aYq aYq @@ -128945,23 +126654,23 @@ aYq bfo aRR bgB -bhG -bhG +gMF +gMF biX -bhG -bkr -cGB +gMF +ehl +tjc blB aPb bmC bnx -bnl +dFG aRZ boZ bpx bqc -bqe -bqe +onU +onU brL bsu bsU @@ -128986,14 +126695,14 @@ bJe bIy bJO bKp -bRO +uWS bLE bIx bCD boU cBY bPg -cCh +uRw boU bRy bRy @@ -129187,12 +126896,12 @@ cIq aOu bbW aQg -bmz +eGt aRR -aUf +ebs cAw aVm -aUf +ebs aXo aYt aZk @@ -129201,13 +126910,13 @@ aSX aSX cAw bft -bhI -bhG +vDt +gMF blF -biY -biY -bkr -bkU +hBS +hBS +ehl +nRc blC aTh bmD @@ -129237,7 +126946,7 @@ bDF bET bGl bGp -bwG +msN bHa bJA bJD @@ -129295,9 +127004,9 @@ cCj cHg cNy cCj -cHC +jSU cHE -cHC +jSU cHF cHG cHH @@ -129404,14 +127113,14 @@ ado ayv acT akM -alB +fjH aSU -alC -alC +xGE +xGE amO -alB +fjH anZ -alC +xGE aqA atV aqL @@ -129444,7 +127153,7 @@ aNw axa cIs aPY -bmz +eGt aSQ cNE cAz @@ -129459,17 +127168,17 @@ aSX cAw bfu bhJ -bhG +gMF biq biZ bjS -bkr +ehl bkV blD aTh bmE bnz -bwS +vLQ aRZ boZ bpx @@ -129494,7 +127203,7 @@ bDn bEj bCl bFM -bwC +dIv bHb bJe bIy @@ -129507,7 +127216,7 @@ bMx boU cBS bPg -cCi +voS boU bRA bRA @@ -129692,7 +127401,7 @@ aGm arX aFh aIv -aHE +xjG aKc aLa aLL @@ -129715,18 +127424,18 @@ aYq aYq cAw bgy -bhI -bhG -bhG +vDt +gMF +gMF bjh bjT -bkr -bkU +ehl +nRc blD aTh bmF bnA -bRM +wZC aRZ boZ bpx @@ -129764,7 +127473,7 @@ bCD boU cBS bPg -cCh +uRw boU aaA aaA @@ -129803,7 +127512,7 @@ coJ cyd cyd cAr -cUZ +fjJ cnR col col @@ -129958,7 +127667,7 @@ aNy axa bcy aPY -bnl +dFG aRO aSS cAS @@ -129973,17 +127682,17 @@ aSX cAw aRR bhK -bhG -bhG +gMF +gMF bjb bjU -bkr -cGB +ehl +tjc blB aPo bmG bnB -bmq +txO aRZ boZ bpx @@ -129997,7 +127706,7 @@ cEu btS bvh bvM -bwC +dIv bxk byy bzw @@ -130008,7 +127717,7 @@ bDI bBI bBI bBI -bwC +dIv bHb bCl bIx @@ -130021,7 +127730,7 @@ bCD boU cBS bPg -cCh +uRw boU bRB bRB @@ -130060,7 +127769,7 @@ coJ cAr cAr cAr -cUZ +fjJ cxt cmZ cmZ @@ -130215,7 +127924,7 @@ aHL aHM cWH aQh -bnl +dFG aRO aSW aUk @@ -130230,7 +127939,7 @@ bbR bfp aRO bhL -bhG +gMF bir bjV bks @@ -130240,7 +127949,7 @@ blB aPo bmH bnC -bmq +txO aRZ boZ bpx @@ -130254,7 +127963,7 @@ btS buG bvi bwe -bwG +msN bxl byz bzx @@ -130278,7 +127987,7 @@ bCD boU cBU bPg -cCh +uRw boU bRB aaA @@ -130320,8 +128029,8 @@ cAr cYg cxu cmZ -cwT -cwT +cwU +cwU cwU cwT cwT @@ -130535,7 +128244,7 @@ bCD boU cBS bPg -cCh +uRw boU bRB aaA @@ -130562,13 +128271,13 @@ ceM cfz che cig -ciZ -ciZ -ciZ +tkG +tkG +tkG cmJ cNm -ciZ -ciZ +tkG +tkG cgs cty cBe @@ -130577,17 +128286,17 @@ cKc cYh cxt cmZ -cwU -cwU +iJE +ePb cws cxw -cwS +tsA cxw -cwS +tsA cxw -cwS -cwT -cwT +rqY +cwU +cwU cwU cwT cmZ @@ -130729,7 +128438,7 @@ aNA aOx bgn aPY -bog +juo aRO aSV aUe @@ -130754,7 +128463,7 @@ aTa aRZ bgn bns -bmq +txO aRZ cOQ bpx @@ -130792,7 +128501,7 @@ bMy boU cBV bPg -cCh +uRw boU bRB bRB @@ -130834,18 +128543,18 @@ cru cnR cyc cmZ -cwT +ubl cHA -cwt +cwS cyu cwS czy cwS cyu -cwS -cHA -cHA -cHA +guj +ePb +ePb +mdU cwU cmZ cmZ @@ -131049,7 +128758,7 @@ bCD boU cBW bPi -cCi +voS boU ccG bRB @@ -131091,18 +128800,18 @@ crv cmZ cmZ cmZ -cwU +ubl cvS -cwu +cCS cyz -cwu -cyz -cwu +cCS +lik +cCS cyz cCS cKg cwT -cwU +ubl cwU cmZ cmZ @@ -131268,7 +128977,7 @@ aTa aRZ bgn bns -bmq +txO aRZ czP bpA @@ -131306,7 +129015,7 @@ bCD boU cod bPg -cCh +uRw bDb ccK bRB @@ -131348,7 +129057,7 @@ crw cLq ctA cuq -cwT +ubl cvT cwR cwS @@ -131358,7 +129067,7 @@ cwS cwS cwR cKh -cXW +cwS cXX cwU cmZ @@ -131500,7 +129209,7 @@ aHM aHM bih aPY -bnl +dFG aRV aRZ aUp @@ -131525,7 +129234,7 @@ cKk blY cKm cKn -bmq +txO aRZ bpc bpA @@ -131563,7 +129272,7 @@ cVC boU cBS bPg -cCh +uRw bDb cdj bRB @@ -131605,7 +129314,7 @@ cLr cOJ cON cuq -cwT +ubl cwp cwS cwT @@ -131616,7 +129325,7 @@ cwT cwS cWG cwT -cwS +tjO cwU cmZ cmZ @@ -131757,7 +129466,7 @@ aND aOy bgn aPY -bnl +dFG aRW aRZ aUq @@ -131782,7 +129491,7 @@ bit bit bvp bns -bmq +txO aRZ bpc bpA @@ -131820,7 +129529,7 @@ bCD boU cBU bPg -cCh +uRw bDb cep bRB @@ -131860,9 +129569,9 @@ csz czb cNu cOK -cOO +hof cuq -cwT +ubl cwp cwS cwT @@ -131873,7 +129582,7 @@ cwT cwS cWG cwT -cwS +tjO cwT cmZ cmZ @@ -132014,7 +129723,7 @@ aND aOz bgn aPY -bnl +dFG cla cla aZu @@ -132039,7 +129748,7 @@ blH bit cWM bnt -bmq +txO aRZ bpc bpA @@ -132077,7 +129786,7 @@ bCD boU cGq bPg -cCh +uRw bDb ceX bRB @@ -132117,10 +129826,10 @@ csA cDy cOG cOL -cOO +hof cuq -cwT -cwp +ubl +eFG cwS cwU cwS @@ -132128,9 +129837,9 @@ cYj cwS cwU cwS -cWG +wOj cwT -cwS +tjO cwT cmZ cmZ @@ -132271,7 +129980,7 @@ aND aOy bgn aPY -bog +juo cla aTc aUt @@ -132296,7 +130005,7 @@ bka bit cIt bns -bmq +txO aRZ bpc bpA @@ -132334,7 +130043,7 @@ bCE boU cBS bPg -cCh +uRw bDb cBs bRB @@ -132374,9 +130083,9 @@ csz cFu cOH cOM -cOO +hof cuq -cwT +ubl cwp cwS cwT @@ -132387,7 +130096,7 @@ cwT cwS cWG cwT -cwS +tjO cwT cmZ cmZ @@ -132528,7 +130237,7 @@ aND aND cMA aPY -bnl +dFG cla aTd aUu @@ -132553,7 +130262,7 @@ blI bit bgn bns -blg +vtT aRZ bpd bpB @@ -132591,7 +130300,7 @@ bpc boU cBS bPg -cCh +uRw bDb ccK bRB @@ -132608,7 +130317,7 @@ cEG cEH cbv caJ -ccP +spX cbY bES bFG @@ -132633,7 +130342,7 @@ cOI crw cOP cuq -cwT +ubl cwp cwS cwT @@ -132644,7 +130353,7 @@ cwT cwS cWG cwT -cwS +tjO cwU cmZ cmZ @@ -132785,7 +130494,7 @@ cGW aND bgn aPY -bnl +dFG cla aTe aVu @@ -132810,7 +130519,7 @@ blJ bit bgn bns -bmq +txO aRZ czR bpA @@ -132889,8 +130598,8 @@ cqI crA coO ctC -cuq -cwT +fSW +lWO cwq cwR cwS @@ -132900,8 +130609,8 @@ cwS cwS cwR cXU -cXW -cXX +cwS +tbT cwU cmZ cmZ @@ -133105,7 +130814,7 @@ cED bpe cBX bPf -cCk +uZH boU bpe bSb @@ -133122,7 +130831,7 @@ cAT cAT cbv caL -ccP +spX bYn cNf cdi @@ -133147,18 +130856,18 @@ crB cmZ cmZ cmZ -cwU +ubl cwr cxp czc cxp -czc +mfy cxp cAt -czc +cxp cXV cwT -cwU +cHA cwU cmZ cmZ @@ -133300,88 +131009,88 @@ aOA biu aQl boF -bph -bpD -bpD -bpD -bpZ -bpZ +nXH +ePe +ePe +ePe +jCQ +jCQ bBK bsr -bpD +ePe bvC -bpD -bpD -bph -cSB -cSB -bpD +ePe +ePe +nXH +rYm +rYm +ePe bya byJ bsA bCb -bph -bpD +nXH +ePe bLo bns -bNL -aZv -bPl -bPl -bPl -bPl -bPl -bPl +vJb +uSM +tvc +tvc +tvc +tvc +tvc +tvc cmE bUt cWz -bQM -bQP -bQM +uPt +oKO +uPt cAD abN bVw bxv cIL -bQP -bQM +oKO +uPt cIN -bQM +uPt cBt -cBv +uwg cBa -bPl -bPl -cBA -cBA -bPl +tvc +tvc +haK +haK +tvc ceN -bPl -bPl -bPl +tvc +tvc +tvc cOC cBZ bPj cHs -cBv +uwg cTY -bPl -bPl +tvc +tvc cCw -bPl -bPl -bPl +tvc +tvc +tvc cHt bXe -bfq +nuO bYW -cah -cah +tfI +tfI ccI caL cdT coE -bfq +nuO cCN cdP cem @@ -133406,13 +131115,13 @@ ctD cCR cHh cHB -cwt +cwS czn cwS czn cwS +hVN cwS -czn cHA cHA cHA @@ -133587,48 +131296,48 @@ bsq bNn bvR bNl -bTQ -bTQ +vGr +vGr cAu cAA -bTQ -bTQ -bTQ -bTQ +vGr +vGr +vGr +vGr cAC bPA cAF bPz -bTQ -bTQ -bTQ -bTQ -bTQ +vGr +vGr +vGr +vGr +vGr cAH cAI -bTQ +vGr cAJ -cAK -cAK +eHx +eHx cAL -cAK -cAK -cAK -cAK -cAK -cAK +eHx +eHx +eHx +eHx +eHx +eHx cAM cEP -cAK +eHx cAO -cAK -cAK +eHx +eHx coF cAP cHD -cAK -cAK -cAK +eHx +eHx +eHx cIc bXJ bYr @@ -133661,17 +131370,17 @@ cnR csD ctE csD -cwU -cwU +ezo +ePb cxv czo cwS czo cwS -cwS czo -cwT -cwT +cwS +cwU +cwU cwU cwT cmZ @@ -133813,31 +131522,31 @@ bLO aND bjm aZc -boV -boV +uQf +uQf aTn -bzH +mks bFf brb brd bcp -bzH -bzH +mks +mks cGQ -boV +uQf bRk -boV -boV +uQf +uQf cQO bxY -boV -boV +uQf +uQf bBg -boV -boV -boV -boV -boV +uQf +uQf +uQf +uQf +uQf bxY bTs bVb @@ -133846,9 +131555,9 @@ byi bTp cSM chC -bPV +gIA byR -bPV +gIA bQN bwJ bwJ @@ -133856,45 +131565,45 @@ cUi cBJ bDc bVK -cIM -cIM -cIM -cIM +fOO +fOO +fOO +fOO cIQ -cEX -cBw -bPV +dsE +hwC +gIA cBz -bPV +gIA chC bMo cBD -bPV -bPV -bPV -bPV +gIA +gIA +gIA +gIA cTT cTX cEQ chC -cBw +hwC cTZ -bPV +gIA bYG -cEX +dsE cvO cCy -bPV -bPV +gIA +gIA bXe -bZJ +mNk clO cak cbu cHJ cHN cHS -bZJ +mNk cdq cdS cdR @@ -133918,8 +131627,8 @@ ctw cjS ctF cmZ -cwT -cwT +cwU +cwU cwU cwT cwT @@ -134360,9 +132069,9 @@ bzJ bUl brA brY -bsC -bsC -bsC +urx +urx +urx buL bsg bsg @@ -134871,7 +132580,7 @@ cAf bpi bQc bHi -bVn +tkv brB bsa bsE @@ -134940,7 +132649,7 @@ cTH coS cnd cKO -cLc +dSS cqO crF csG @@ -135128,7 +132837,7 @@ aRj bpi bQb bFn -bVn +tkv brB bsa bsF @@ -135355,8 +133064,8 @@ aOc aOP aPD cym -aSc -aSc +rIV +rIV aUx aUB aWz @@ -135367,8 +133076,8 @@ baR baX bcb bel -ber -ber +ikz +ikz bgH bda cmq @@ -135454,7 +133163,7 @@ cng coY cpU cKQ -cLe +gTB cqP crI csG @@ -135656,7 +133365,7 @@ bxC bsE bzK brA -bvZ +eIr bCG brA bEt @@ -135711,7 +133420,7 @@ cdy cnf cdy cKQ -cLf +hcn coU crO csI @@ -135899,7 +133608,7 @@ aRj bpi cMW bHi -bVn +tkv brA bsc bsE @@ -135913,7 +133622,7 @@ bxD bDt bzL brA -bvZ +eIr bCH brA bEq @@ -135968,7 +133677,7 @@ cni cnf cof cKQ -cLg +wsH chu crJ csJ @@ -136225,7 +133934,7 @@ cNp cnf cof cKQ -cLe +gTB coW ciw csH @@ -136374,9 +134083,9 @@ aaa aaa aab aab -aJu +lNj aKl -aJu +lNj aLW aMT aNR @@ -136413,7 +134122,7 @@ bix bpi bQb bHi -bVn +tkv brB bsa bsH @@ -136482,7 +134191,7 @@ cnY cnf cpV cKQ -cLe +gTB coW cix csG @@ -136670,7 +134379,7 @@ aRj bpi bQb bFn -bVn +tkv brB bsa bsH @@ -136739,7 +134448,7 @@ cmu cnf csx cKQ -cLe +gTB coX crG csI @@ -136890,7 +134599,7 @@ aab aab aJw aKk -aKk +aPB aLY aMU aNT @@ -136927,7 +134636,7 @@ aQz bpi bQf bJS -bVn +tkv brB bsa bsH @@ -136996,7 +134705,7 @@ cmu cnf csx cKQ -cLg +wsH cpS crN csJ @@ -137160,8 +134869,8 @@ aVz aUH aXz aYL -aWF -aWF +eqe +eqe baT bpG aUH @@ -137184,7 +134893,7 @@ ccA bpi bQb bFn -bVn +tkv brA bse bsH @@ -137253,7 +134962,7 @@ cdy cnf cdy cNY -cLf +hcn cqQ cta csK @@ -137402,9 +135111,9 @@ aab aab aab aab -aJx +lLo aKn -aJx +lLo aLZ aMT aNR @@ -137510,7 +135219,7 @@ cnZ cpa cuo cKQ -cLf +hcn cqP ctb csG @@ -138281,7 +135990,7 @@ cdx cdx cvj cKQ -cLc +dSS cgB crR ctH @@ -138472,12 +136181,12 @@ bqB bnL brE bsh -bpS -bpS +pHw +pHw bua blZ bvv -bvZ +eIr brA aaA aaA @@ -138538,7 +136247,7 @@ cdy cdy cdy cKQ -cLc +dSS cqV crS csN @@ -139052,7 +136761,7 @@ cXh cpc cpc cKQ -cLc +dSS cqV crU cdy @@ -139309,7 +137018,7 @@ cMg cpd cpc cKT -cLc +dSS cqV crV cdy @@ -139497,9 +137206,9 @@ boI bpk bpN bqF -bqK -bpo -bnM +reY +hMI +eXk bsL bnL bue @@ -139566,7 +137275,7 @@ coe cpc cpc cKT -cLc +dSS cqV cOf cdy @@ -139823,7 +137532,7 @@ cXi cpc cpc cKQ -cLc +dSS cqV crU ccS @@ -140004,19 +137713,19 @@ aac aaa aab bma -bmU +jqb bnL bot -boK +eec bpl bip bqH brn brG -bsj +fow bsL bnL -boK +eec bma aaa aaa @@ -140080,7 +137789,7 @@ coH cpQ cdy cKU -cLc +dSS cqV crV cgF @@ -140261,19 +137970,19 @@ aac aaa aab bma -bmU +jqb bnL bot -boK +eec bpm bpQ bnL bro bpm -bsj +fow bsL bnL -boK +eec bma aaa aaa @@ -140337,7 +138046,7 @@ cdy cdy cdy cKQ -cLc +dSS cqX crU cgF @@ -140490,7 +138199,7 @@ aJy aKo aNa aMf -aMZ +vPQ aPy aNa aQq @@ -140530,7 +138239,7 @@ blZ bsk bsL bnL -boK +eec bma aaa aaa @@ -140747,7 +138456,7 @@ aJz aKp aLm aMe -aMZ +vPQ aOb aNa aQq @@ -140779,11 +138488,11 @@ bmW bnL bot boL -bpn -bpS -bpS -bpS -bpn +kDs +pHw +pHw +pHw +kDs bsl bsL bnL @@ -141033,7 +138742,7 @@ aac aav bma bmX -bnM +eXk btm bnL bnL @@ -141108,7 +138817,7 @@ cdx cdx cvj cKX -cLc +dSS cra crX csP @@ -141293,12 +139002,12 @@ bmY cMV bnL boM -bpo +hMI bnL -bqK +reY bnL -bpo -bnM +hMI +eXk bnL btu bui @@ -141547,17 +139256,17 @@ aaa aab aab bma -bnO +uJe bov -boN +phO cHm bpT bqL brq cHm -bnO +uJe bov -boN +phO bma aab aaa @@ -142655,9 +140364,9 @@ cre csb csT ctR -cuL +cuN cvv -cuL +cuN cwz cnp cnp diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 375b841141..c08670c2c0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1028,7 +1028,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -2291,6 +2291,10 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) +"aeD" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/hallway/primary/port) "aeE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -3112,6 +3116,9 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"afQ" = ( +/turf/open/floor/plating, +/area/hallway/primary/port) "afR" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -3180,6 +3187,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"afZ" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/hallway/primary/port) "aga" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -3658,6 +3669,10 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) +"agQ" = ( +/obj/item/electronics/airlock, +/turf/open/floor/plating, +/area/hallway/primary/port) "agR" = ( /obj/machinery/airalarm{ dir = 4; @@ -3792,7 +3807,8 @@ movement_type = 1; name = "Sergeant Araneus"; real_name = "Sergeant Araneus"; - response_help = "pets"; + response_help_continuous = "pets"; + response_help_simple = "pet"; turns_per_move = 10 }, /turf/open/floor/carpet, @@ -4264,6 +4280,11 @@ icon_state = "platingdmg1" }, /area/maintenance/fore) +"ahT" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hallway/primary/port) "ahU" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/table, @@ -4780,6 +4801,14 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) +"aiT" = ( +/obj/effect/decal/cleanable/oil{ + icon_state = "floor5" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hallway/primary/port) "aiU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral{ @@ -4800,6 +4829,11 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) +"aiW" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/hallway/primary/port) "aiX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, @@ -4885,11 +4919,11 @@ /area/maintenance/solars/port/fore) "ajj" = ( /obj/structure/table, -/obj/item/stack/medical/ointment{ +/obj/item/stack/medical/mesh{ pixel_x = 3; pixel_y = -2 }, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ pixel_x = -3; pixel_y = 2 }, @@ -4901,6 +4935,14 @@ /obj/item/restraints/handcuffs/cable/pink, /turf/open/floor/plating, /area/maintenance/port/fore) +"ajk" = ( +/obj/structure/shuttle/engine/propulsion/right{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/hallway/primary/port) "ajl" = ( /obj/item/soap/deluxe, /obj/item/storage/secure/safe{ @@ -4992,6 +5034,10 @@ }, /turf/open/floor/plasteel/dark, /area/security/warden) +"ajs" = ( +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plating, +/area/hallway/primary/port) "ajt" = ( /obj/structure/closet{ name = "Evidence Closet 5" @@ -5012,6 +5058,10 @@ }, /turf/open/floor/plasteel/dark, /area/security/warden) +"aju" = ( +/obj/item/stack/sheet/mineral/wood/twenty, +/turf/open/floor/plating, +/area/hallway/primary/port) "ajv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -6611,9 +6661,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "amc" = ( @@ -6872,6 +6920,11 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/fore) +"amv" = ( +/obj/item/stack/sheet/metal/ten, +/obj/item/wrench, +/turf/open/floor/plating, +/area/hallway/primary/port) "amw" = ( /obj/structure/window/reinforced, /obj/machinery/door/window/eastright{ @@ -6908,6 +6961,10 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) +"amB" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/hallway/primary/port) "amC" = ( /obj/structure/chair{ dir = 4 @@ -7720,9 +7777,6 @@ "aop" = ( /obj/structure/bed, /obj/item/bedsheet, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7734,6 +7788,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/security/brig) "aoq" = ( @@ -8210,6 +8267,9 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "apf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -9086,6 +9146,7 @@ /area/maintenance/port/fore) "aqY" = ( /obj/machinery/computer/security/labor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/brig) "aqZ" = ( @@ -10083,14 +10144,6 @@ /obj/structure/chair, /turf/open/floor/plasteel/grimy, /area/security/main) -"asN" = ( -/obj/structure/chair, -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 1; - pixel_y = -30 - }, -/turf/open/floor/plasteel/grimy, -/area/security/main) "asO" = ( /obj/item/paper_bin{ pixel_x = -3; @@ -10647,7 +10700,9 @@ /turf/open/floor/plating, /area/security/main) "atZ" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!interrogation_room" + }, /turf/open/floor/plating, /area/security/main) "aua" = ( @@ -11863,9 +11918,6 @@ /turf/open/floor/plating, /area/maintenance/fore) "awC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/machinery/light/small{ dir = 1 }, @@ -14762,6 +14814,9 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/security/brig) "aCr" = ( @@ -14769,6 +14824,9 @@ name = "Court Cell"; req_access_txt = "63" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/security/brig) "aCs" = ( @@ -15438,7 +15496,7 @@ }, /area/maintenance/fore) "aDP" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -16832,7 +16890,7 @@ /turf/open/floor/plating, /area/maintenance/fore) "aGz" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -18115,7 +18173,7 @@ /turf/open/floor/plating, /area/maintenance/fore) "aJa" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -18142,7 +18200,7 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aJc" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/machinery/light/small{ @@ -32222,7 +32280,7 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/captain/private) "bkL" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 13 }, /obj/machinery/light, @@ -33789,16 +33847,6 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) -"bnM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/primary/port) -"bnP" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" - }, -/turf/open/floor/plating, -/area/hallway/primary/port) "bnR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -34933,25 +34981,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bqf" = ( -/turf/open/floor/plating, -/area/hallway/primary/port) -"bqg" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 - }, -/turf/open/floor/plating, -/area/hallway/primary/port) -"bqi" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/hallway/primary/port) "bqj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, @@ -37483,12 +37512,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bvb" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/starboard) "bvc" = ( @@ -37552,10 +37581,10 @@ /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai) "bvg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bvh" = ( @@ -38415,33 +38444,36 @@ dir = 4; pixel_x = -23 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/hallway/primary/starboard) "bxa" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bxb" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /obj/machinery/light{ dir = 4 }, @@ -38469,8 +38501,8 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bxf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/closed/wall, /area/engine/atmos) @@ -39161,6 +39193,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -39169,6 +39204,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/starboard) "byR" = ( @@ -39176,21 +39214,19 @@ name = "Station Intercom (General)"; pixel_x = -30 }, -/obj/item/crowbar/red, -/obj/item/wrench, -/obj/item/clothing/mask/gas, /obj/machinery/airalarm{ pixel_y = 23 }, -/obj/structure/table, -/obj/item/storage/box, -/obj/item/storage/box, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/computer/atmos_alert, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -39202,10 +39238,13 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/computer/station_alert, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -39219,10 +39258,13 @@ /obj/machinery/camera{ c_tag = "Atmospherics - Control Room" }, -/obj/machinery/computer/station_alert, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -39236,54 +39278,44 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "byV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/computer/atmos_control, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/engine/atmos) +"byW" = ( /obj/structure/sign/plaques/atmos{ pixel_y = 32 }, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/structure/table, /obj/machinery/light_switch{ pixel_x = 26 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/computer/atmos_control, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /turf/open/floor/plasteel/checker, /area/engine/atmos) -"byW" = ( -/obj/structure/table, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/head/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/light_switch{ - pixel_x = -26 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) "byX" = ( /obj/machinery/power/apc/highcap/ten_k{ areastring = "/area/engine/atmos"; @@ -39294,8 +39326,15 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Entrance" +/obj/machinery/light_switch{ + pixel_x = -26 + }, +/obj/machinery/pipedispenser/disposal/transit_tube, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -39304,16 +39343,27 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "byZ" = ( -/obj/machinery/space_heater, /obj/machinery/firealarm{ pixel_y = 24 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/pipedispenser, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera{ + c_tag = "Atmospherics - Entrance"; + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bza" = ( @@ -40048,42 +40098,24 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bAE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner, +/area/engine/atmos) +"bAF" = ( /obj/structure/chair/office/dark{ dir = 4 }, /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) -"bAF" = ( -/obj/machinery/computer/atmos_control{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 4; - name = "Atmos RC"; - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner, -/area/engine/atmos) "bAG" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Monitoring"; + req_access_txt = "24" }, +/turf/open/floor/plasteel, /area/engine/atmos) "bAH" = ( /obj/structure/cable/yellow{ @@ -40092,6 +40124,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/machinery/light/small, /turf/open/floor/plasteel, /area/engine/atmos) "bAI" = ( @@ -40102,10 +40135,11 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bAJ" = ( -/obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/pipedispenser/disposal, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/atmos) "bAK" = ( @@ -40143,9 +40177,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bAQ" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bAR" = ( @@ -40332,7 +40364,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bBp" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -40812,12 +40844,12 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bCj" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bCk" = ( @@ -40827,39 +40859,50 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bCl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/computer/atmos_control{ +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/open/floor/plasteel/dark/corner, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = 26; + pixel_y = -26; + req_access_txt = "24" + }, +/turf/open/floor/plasteel, /area/engine/atmos) "bCm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) -"bCn" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/t_scanner, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ - dir = 8 + dir = 4 }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 +/obj/machinery/requests_console{ + department = "Atmospherics"; + departmentType = 4; + name = "Atmos RC"; + pixel_x = 30 }, +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/turf/open/floor/plasteel/dark/corner, +/area/engine/atmos) +"bCn" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/atmos, +/turf/open/floor/plasteel, /area/engine/atmos) "bCo" = ( /obj/structure/cable/yellow{ @@ -40868,25 +40911,27 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bCp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Monitoring"; + req_access_txt = "24" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bCq" = ( -/obj/machinery/space_heater, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, /area/engine/atmos) "bCr" = ( /obj/machinery/atmospherics/components/binary/pump/on{ @@ -40936,7 +40981,8 @@ /area/engine/atmos) "bCy" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, /turf/open/floor/plating, @@ -41579,35 +41625,22 @@ /area/engine/atmos) "bDP" = ( /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ icon_state = "1-4" }, /turf/open/floor/plasteel, /area/engine/atmos) "bDQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/corner, -/area/engine/atmos) -"bDR" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring"; - req_access_txt = "24" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bDS" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -41629,6 +41662,9 @@ "bDV" = ( /obj/structure/closet/crate, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera{ + c_tag = "Atmospherics - Entrance" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bDW" = ( @@ -41803,7 +41839,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bEv" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -42593,6 +42629,9 @@ name = "Atmospherics Blast Door" }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/window/westleft{ + req_access_txt = "24" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bFG" = ( @@ -42611,51 +42650,17 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bFI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, /area/engine/atmos) "bFJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/dark/corner, -/area/engine/atmos) -"bFK" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/button/door{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = 26; - pixel_y = -26; - req_access_txt = "24" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner, -/area/engine/atmos) -"bFL" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/turf/open/floor/plasteel, /area/engine/atmos) "bFM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -42688,6 +42693,7 @@ name = "Distribution Loop"; req_access_txt = "24" }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bFQ" = ( @@ -42697,15 +42703,13 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bFR" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bFS" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bFT" = ( @@ -42748,6 +42752,7 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) "bFY" = ( @@ -43291,52 +43296,33 @@ /turf/open/floor/plasteel/dark/corner, /area/hallway/primary/starboard) "bHp" = ( -/obj/machinery/portable_atmospherics/canister/air, /obj/machinery/light/small{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) "bHq" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) "bHr" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/hallway/primary/starboard) "bHs" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bHt" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, +/turf/closed/wall/r_wall, /area/engine/atmos) "bHu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, @@ -43358,9 +43344,8 @@ /area/engine/atmos) "bHx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 }, /turf/open/floor/plating, /area/engine/atmos) @@ -43389,8 +43374,8 @@ /area/engine/atmos) "bHB" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 }, /turf/open/floor/plating, /area/engine/atmos) @@ -43508,7 +43493,7 @@ /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) "bHQ" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -43962,13 +43947,13 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bIH" = ( @@ -44005,8 +43990,10 @@ /area/engine/atmos) "bIK" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bIL" = ( @@ -44017,53 +44004,27 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmos) -"bIM" = ( +"bIN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/turf/closed/wall/r_wall, +/obj/machinery/suit_storage_unit/atmos, +/turf/open/floor/plasteel, /area/engine/atmos) -"bIN" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/rods/fifty, +"bIO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel{ - dir = 1 - }, -/area/engine/atmos) -"bIO" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to External Air Ports" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, +/turf/closed/wall, /area/engine/atmos) "bIP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bIQ" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to External Air Ports" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -44071,37 +44032,42 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bIS" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/item/beacon, /turf/open/floor/plasteel, /area/engine/atmos) "bIT" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, /obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bIU" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/obj/machinery/meter, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Ports" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bIV" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Ports" }, -/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bIW" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall, /area/engine/atmos) "bIX" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ @@ -44126,20 +44092,12 @@ /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "bIZ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; name = "N2O to Pure" }, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"bJa" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) "bJb" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ @@ -44817,7 +44775,6 @@ /area/storage/tcom) "bKt" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/engineering{ name = "Telecomms Storage"; req_access_txt = "61" @@ -44829,69 +44786,47 @@ /turf/open/floor/plasteel, /area/storage/tcom) "bKu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/atmos) -"bKv" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "External Waste Ports to Filter" - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, -/area/engine/atmos) -"bKw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"bKw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bKx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bKy" = ( -/obj/item/beacon, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bKz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bKA" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Ports" - }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/closed/wall, /area/engine/atmos) "bKB" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Ports" +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 }, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/engine/atmos) "bKC" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Pure to Ports" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/atmos) "bKD" = ( @@ -44899,24 +44834,30 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bKE" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bKF" = ( /obj/machinery/computer/atmos_control/tank/nitrous_tank{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/structure/window/reinforced{ dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "bKG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bKH" = ( @@ -45110,7 +45051,7 @@ /turf/open/floor/plating, /area/maintenance/port) "bLe" = ( -/obj/machinery/vending/autodrobe/all_access, +/obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/maintenance/port) "bLf" = ( @@ -45527,6 +45468,9 @@ /area/crew_quarters/theatre) "bLS" = ( /obj/machinery/vending/autodrobe, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/open/floor/wood, /area/crew_quarters/theatre) "bLT" = ( @@ -45544,14 +45488,19 @@ c_tag = "Telecomms - Storage"; dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/storage/tcom) "bLV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/holopad, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/storage/tcom) "bLW" = ( @@ -45579,9 +45528,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bMa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -45592,82 +45538,62 @@ /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "bMb" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 0; + name = "External to Filter" + }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, /area/engine/atmos) -"bMc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bMd" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/atmos) "bMe" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -26 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Central"; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating, /area/engine/atmos) "bMf" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Port to External" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bMg" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bMh" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/atmos) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/theatre) "bMi" = ( -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/storage/tcom) "bMj" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, /area/engine/atmos) "bMk" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - dir = 1 - }, /obj/structure/window/reinforced{ dir = 4 }, @@ -45678,13 +45604,16 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "bMl" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bMm" = ( @@ -46160,7 +46089,7 @@ /area/bridge/showroom/corporate) "bNg" = ( /obj/machinery/light_switch{ - pixel_y = 24 + pixel_y = 25 }, /obj/machinery/light/small{ dir = 1 @@ -46509,57 +46438,46 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, /area/maintenance/starboard) -"bNP" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +"bNQ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNR" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bNS" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, /turf/open/floor/plasteel/white/corner{ dir = 1 }, /area/engine/atmos) -"bNQ" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bNR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/engine/atmos) -"bNS" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to West Ports" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bNU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port Mix to East Ports" - }, -/obj/item/crowbar, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bNV" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/door/window/northleft{ dir = 8; name = "Inner Pipe Access"; req_access_txt = "24" }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bNW" = ( @@ -46886,8 +46804,8 @@ /area/bridge/showroom/corporate) "bOG" = ( /obj/structure/rack, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, /obj/item/reagent_containers/syringe/charcoal, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = -1; @@ -47198,9 +47116,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bPo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -47215,12 +47130,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bPp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -47229,57 +47139,42 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPr" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 1 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bPs" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel{ - dir = 1 - }, -/area/engine/atmos) +/turf/closed/wall, +/area/maintenance/starboard) "bPt" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 1 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bPu" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, /area/engine/atmos) "bPv" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "O2 to Airmix" }, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bPw" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/structure/window/reinforced{ dir = 4 }, @@ -47297,8 +47192,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -47892,33 +47787,40 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bQS" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/engine/atmos) "bQT" = ( -/obj/structure/sign/warning/nosmoking, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, /area/engine/atmos) "bQU" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/r_wall, /area/engine/atmos) "bQV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 }, -/obj/machinery/meter, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bQW" = ( /obj/machinery/computer/atmos_control/tank/toxin_tank{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/structure/window/reinforced{ dir = 4 }, @@ -47932,6 +47834,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bQX" = ( @@ -48542,38 +48445,24 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "bSh" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/plasteel{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 }, +/turf/open/floor/plating, /area/engine/atmos) "bSi" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/item/wrench, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, /area/engine/atmos) "bSj" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ - dir = 1 - }, /obj/structure/window/reinforced{ dir = 4 }, @@ -48588,6 +48477,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/space_heater, /turf/open/floor/plasteel, /area/engine/atmos) "bSk" = ( @@ -48605,15 +48496,15 @@ /area/engine/atmos) "bSn" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/structure/cable/yellow{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/port) "bSo" = ( @@ -48997,6 +48888,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bTe" = ( @@ -49030,41 +48924,18 @@ /obj/machinery/vending/wardrobe/atmos_wardrobe, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"bTj" = ( -/obj/machinery/requests_console{ - department = "Atmospherics"; - departmentType = 4; - name = "Atmos RC"; - pixel_x = 30 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bTk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Filter" - }, -/obj/machinery/light/small{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Atmospherics - Starboard"; - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bTl" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/engine/atmos) "bTm" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -49691,61 +49562,19 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "bUA" = ( -/obj/machinery/pipedispenser, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 }, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/engine/atmos) "bUB" = ( -/obj/machinery/light{ +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ dir = 1 }, -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/pipedispenser/disposal, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUC" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 28 - }, -/obj/machinery/pipedispenser/disposal/transit_tube, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUD" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUE" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUF" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUG" = ( -/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, -/turf/open/floor/plasteel, +/obj/structure/lattice/catwalk, +/turf/open/space, /area/engine/atmos) "bUH" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/structure/window/reinforced{ dir = 4 }, @@ -49763,8 +49592,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) @@ -50198,7 +50027,6 @@ /turf/closed/wall, /area/hallway/secondary/service) "bVA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock{ name = "Service Hall"; req_access_txt = "null"; @@ -50261,17 +50089,20 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) "bVG" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -50290,37 +50121,16 @@ /area/engine/atmos) "bVI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 + dir = 9 }, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) -"bVJ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bVK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bVL" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Fuel Pipe" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bVM" = ( /obj/machinery/computer/atmos_control/tank/carbon_tank{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/structure/window/reinforced{ dir = 4 }, @@ -50334,6 +50144,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bVN" = ( @@ -51001,6 +50812,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard) "bXe" = ( @@ -51047,9 +50859,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bXh" = ( @@ -51059,19 +50868,6 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Fuel Pipe to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/dark/visible{ - dir = 1 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bXj" = ( @@ -51079,56 +50875,11 @@ icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXk" = ( -/obj/effect/landmark/start/atmospheric_technician, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXm" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXn" = ( -/obj/machinery/atmospherics/pipe/manifold/dark/visible, -/obj/machinery/meter{ - color = "" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXo" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Fuel Pipe" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXp" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 + dir = 9 }, /turf/open/floor/plasteel, /area/engine/atmos) "bXq" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ - dir = 1 - }, /obj/structure/window/reinforced{ dir = 4 }, @@ -51143,6 +50894,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/space_heater, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bXr" = ( @@ -51597,8 +51350,8 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bYt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plating, /area/maintenance/starboard) @@ -51609,6 +51362,9 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard) "bYv" = ( @@ -51635,36 +51391,11 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/floor/plasteel, /area/engine/atmos) -"bYx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bYy" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "N2 to Airmix" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bYz" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bYA" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bYB" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/light{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "bYC" = ( @@ -52170,9 +51901,6 @@ /turf/closed/wall, /area/maintenance/disposal/incinerator) "bZF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 5 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = -30 @@ -52180,20 +51908,14 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, /area/engine/atmos) -"bZG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bZH" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2 to Pure" +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -52203,13 +51925,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bZJ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bZK" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 1 @@ -52218,7 +51933,7 @@ /area/engine/atmos) "bZL" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 4 + dir = 1 }, /obj/machinery/meter, /turf/open/floor/plasteel, @@ -52228,7 +51943,6 @@ dir = 4 }, /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/item/paper_bin{ pixel_x = -2; pixel_y = 8 @@ -52240,6 +51954,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 + }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bZN" = ( @@ -52534,8 +52251,8 @@ "cap" = ( /obj/structure/table, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -52971,7 +52688,9 @@ /area/maintenance/starboard) "caX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light_switch, +/obj/machinery/light_switch{ + pixel_y = 25 + }, /turf/closed/wall, /area/maintenance/disposal/incinerator) "caY" = ( @@ -53010,6 +52729,9 @@ name = "Inner Pipe Access"; req_access_txt = "24" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "cbc" = ( @@ -53019,15 +52741,12 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "cbd" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, /obj/structure/window/reinforced, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -53039,6 +52758,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/engine/atmos) "cbe" = ( @@ -53046,9 +52766,6 @@ /obj/machinery/computer/atmos_control/tank/nitrogen_tank{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/dark/visible, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -53064,13 +52781,6 @@ /area/engine/atmos) "cbf" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Nitrogen Outlet" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -53081,6 +52791,10 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/engine/atmos) "cbg" = ( @@ -53094,16 +52808,14 @@ name = "Inner Pipe Access"; req_access_txt = "24" }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "cbh" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -53114,6 +52826,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/atmos) "cbi" = ( @@ -53121,9 +52837,6 @@ /obj/machinery/computer/atmos_control/tank/oxygen_tank{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -53134,17 +52847,13 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cbj" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 to Airmix" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -53155,6 +52864,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cbk" = ( @@ -53168,41 +52880,35 @@ name = "Inner Pipe Access"; req_access_txt = "24" }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "cbl" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "cbn" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Air to Pure" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "cbo" = ( @@ -53210,15 +52916,21 @@ dir = 4 }, /obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 9 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) "cbp" = ( @@ -53976,64 +53688,79 @@ /area/maintenance/disposal/incinerator) "ccL" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 + dir = 10 }, /turf/closed/wall/r_wall, /area/engine/atmos) "ccM" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "ccN" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "ccO" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "ccP" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ccQ" = ( -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ccR" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ccS" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ccT" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Nitrogen Outlet" }, -/turf/open/floor/plasteel/dark, -/area/engine/atmos) -"ccU" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ +/obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"ccV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 +"ccQ" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "N2 to Pure" + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ccR" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ccS" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ccT" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Air to Pure" + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) +"ccV" = ( /obj/machinery/camera{ c_tag = "Atmospherics - Starboard Aft"; dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "ccW" = ( @@ -54043,6 +53770,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) "ccX" = ( @@ -55310,11 +55038,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/space, /area/space/nearstation) -"cfv" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/space, -/area/space/nearstation) "cfw" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ @@ -57220,21 +56943,12 @@ }, /area/science/research) "ciS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/mob/living/simple_animal/pet/dog/pug{ - desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; - name = "Pugley IV"; - real_name = "Pugley IV" - }, +/obj/machinery/rnd/bepis, /turf/open/floor/engine, /area/science/explab) "ciT" = ( /obj/item/beacon, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/science/explab) "ciU" = ( @@ -57353,7 +57067,7 @@ /turf/open/floor/plating/airless, /area/engine/atmos) "cjp" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/wood, /area/maintenance/port/aft) "cjq" = ( @@ -59115,11 +58829,11 @@ pixel_y = -1 }, /obj/item/reagent_containers/dropper, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ pixel_x = -2; pixel_y = 6 }, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/mesh, /obj/item/healthanalyzer, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -59833,6 +59547,11 @@ /obj/structure/chair/office/light{ dir = 4 }, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" + }, /turf/open/floor/plasteel/white, /area/science/explab) "com" = ( @@ -60700,9 +60419,9 @@ /obj/effect/decal/cleanable/blood/gibs/limb, /obj/structure/rack, /obj/item/storage/firstaid/regular, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/item/clothing/glasses/hud/health, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -62681,7 +62400,7 @@ dir = 10 }, /obj/machinery/light_switch{ - pixel_y = 24 + pixel_y = 25 }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -64196,7 +63915,7 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_y = 24 + pixel_y = 25 }, /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -64204,9 +63923,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser/apothecary, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cwp" = ( @@ -66588,6 +66305,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/sign/warning/biohazard, /turf/closed/wall, /area/science/mixing) "cAM" = ( @@ -66613,14 +66331,6 @@ /obj/structure/chair{ dir = 4 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -67044,14 +66754,6 @@ pixel_x = 24; pixel_y = -24 }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the test chamber."; - dir = 8; - layer = 4; - name = "Test Chamber Telescreen"; - network = list("toxins"); - pixel_x = 30 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -67464,6 +67166,15 @@ req_access_txt = "7" }, /obj/effect/turf_decal/loading_area, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching the test chamber."; + dir = 4; + layer = 4; + name = "Test Chamber Telescreen"; + network = list("toxins"); + pixel_x = -32; + pixel_y = 0 + }, /turf/open/floor/plasteel, /area/science/mixing) "cCH" = ( @@ -74819,7 +74530,7 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = -23 + pixel_y = 25 }, /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -76280,11 +75991,8 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "cUR" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) @@ -76395,16 +76103,11 @@ /turf/open/space/basic, /area/space) "cVy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/atmos) -"cVz" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 }, -/obj/structure/lattice/catwalk, -/turf/open/space, +/turf/open/floor/plating, /area/engine/atmos) "cVC" = ( /mob/living/simple_animal/sloth/citrus, @@ -76420,9 +76123,6 @@ /obj/machinery/computer/atmos_control/tank/air_tank{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -79087,43 +78787,23 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/space, /area/space/nearstation) -"dhe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhg" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"dhh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Mix to Engine" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "dhi" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/door/window/northleft{ dir = 8; name = "Inner Pipe Access"; req_access_txt = "24" }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "dhj" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "dhk" = ( @@ -79131,6 +78811,7 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) "dhl" = ( @@ -79545,7 +79226,7 @@ /turf/closed/wall, /area/crew_quarters/bar) "dhU" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /obj/structure/window/reinforced{ dir = 8 }, @@ -79708,12 +79389,12 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/sign/poster/contraband/clown{ pixel_x = 32 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/wood, /area/crew_quarters/theatre) "din" = ( @@ -80167,13 +79848,13 @@ c_tag = "Chapel - Funeral Parlour"; dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/chapel/main) "djk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/closed/wall, /area/chapel/main) "djr" = ( @@ -80916,10 +80597,12 @@ /area/security/brig) "dBH" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/yellow{ icon_state = "0-4" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plating, /area/security/brig) "dBI" = ( @@ -80943,15 +80626,14 @@ /turf/open/floor/plating, /area/engine/atmos) "dBM" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Monitoring"; + req_access_txt = "24" + }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/corner{ - dir = 1 - }, +/turf/open/floor/plasteel, /area/engine/atmos) "dBN" = ( /obj/effect/spawner/structure/window/reinforced, @@ -81400,13 +81082,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"dDm" = ( -/obj/machinery/atmospherics/pipe/simple/dark/visible{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/engine/atmos) "dDo" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/white, @@ -81625,6 +81300,15 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"dLd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "dLK" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -81634,6 +81318,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"dOR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -81708,26 +81398,13 @@ /turf/open/floor/plating, /area/crew_quarters/cryopod) "eJq" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; - name = "CO2 to Pure" + name = "CO2 Outlet Pump" }, /turf/open/floor/plasteel/dark, /area/engine/atmos) -"eQf" = ( -/obj/machinery/computer/shuttle/mining/common{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/hallway/primary/port) "eZe" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -81874,6 +81551,12 @@ /obj/item/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) +"gRX" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "gXY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -81943,6 +81626,13 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"izM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Pure to Ports" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "iCn" = ( /obj/machinery/vr_sleeper, /turf/open/floor/plasteel, @@ -81951,6 +81641,13 @@ /obj/structure/table, /turf/open/floor/plating, /area/maintenance/port/aft) +"iRL" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "Mix to Engine" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "iSt" = ( /obj/machinery/door/airlock/grunge, /obj/structure/cable/yellow{ @@ -81982,6 +81679,14 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"jsc" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/camera{ + c_tag = "Atmospherics - Aft"; + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmos) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -82007,6 +81712,15 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jAj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "jBe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -82120,6 +81834,9 @@ dir = 1; name = "O2 to Pure" }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/atmos) "kOt" = ( @@ -82144,6 +81861,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"kRi" = ( +/obj/structure/chair, +/obj/machinery/button/electrochromatic{ + id = "!interrogation_room"; + pixel_x = -25 + }, +/turf/open/floor/plasteel/grimy, +/area/security/main) "kVo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -82346,11 +82071,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "njd" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; name = "Plasma to Pure" }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) "nnK" = ( @@ -82391,6 +82116,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"nBn" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "nIb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining{ @@ -82403,6 +82134,15 @@ }, /turf/open/floor/plasteel, /area/construction/storage/wing) +"nLT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "nWb" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -82419,6 +82159,12 @@ /obj/item/storage/fancy/candle_box, /turf/open/floor/engine/cult, /area/library) +"oaM" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/main) "obb" = ( /obj/structure/target_stake, /obj/effect/turf_decal/stripes/line{ @@ -82461,10 +82207,21 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel/white, /area/science/circuit) +"oms" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) "omz" = ( /obj/machinery/status_display/supply, /turf/closed/wall, /area/quartermaster/sorting) +"orJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/security/brig) "oub" = ( /obj/structure/sign/poster/official/random, /turf/closed/wall, @@ -82536,12 +82293,25 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/aft) +"pbF" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "pmc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"pvk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/detectives_office) "pvA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -82721,6 +82491,12 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"rpR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -82734,6 +82510,12 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"rAc" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "rLV" = ( /obj/structure/table, /obj/item/folder, @@ -82801,6 +82583,13 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) +"siI" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Port to Filter" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "soe" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -82819,6 +82608,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"stP" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Fuel Pipe" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "syk" = ( /obj/machinery/door/airlock{ id_tag = "AuxShower"; @@ -82967,6 +82762,10 @@ /obj/machinery/cryopod, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"uku" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) "upN" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -83185,6 +82984,12 @@ /obj/machinery/vending/cola/random, /turf/open/floor/plasteel, /area/hallway/primary/port) +"xgC" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "xkG" = ( /obj/item/integrated_electronics/wirer, /obj/structure/table/reinforced, @@ -97336,9 +97141,9 @@ bjX blU baE baE -bnM -bnM -bnM +baE +baE +baE baE baE jPu @@ -97591,13 +97396,13 @@ bgw bix bjY blV -bqi -bqf -bqf -bqf -bqf -bqf -bqi +baE +afQ +afQ +afQ +afZ +afQ +baE djW bNd alK @@ -97848,13 +97653,13 @@ bgx biy bjZ blW -bnM -bqf -bqf -bqf -bqf -bqf -bnM +baE +afZ +afQ +ajs +afQ +afQ +baE bBf kQP bzx @@ -98105,13 +97910,13 @@ bgy biz bka blX -bnM -bqf -bqf -bqf -bqf -bqf -bnM +baE +afQ +afQ +afQ +afQ +afQ +baE bBf bCL bEq @@ -98362,13 +98167,13 @@ bgz biA bnR blY -bnP -bqg -bqf -bqf -bqf -bqf -bnM +aeD +agQ +afQ +afQ +afQ +afQ +baE rNX jBe bzx @@ -98619,13 +98424,13 @@ bgA biz bkb blZ -eQf -bqf -bqf -bqf -bqf -bqf -bnM +baE +ahT +afQ +afQ +aju +afQ +baE bBh xmb iSt @@ -98876,13 +98681,13 @@ bpt bcW bkc bma -bnM -bqf -bqf -bqf -bqf -bqf -bnM +baE +ahT +aiW +afQ +amv +afQ +baE bBf bCM bzx @@ -99133,13 +98938,13 @@ bbK bcW dhP bqd -bqi -bqf -bqf -bqf -bqf -bqf -bqi +baE +aiT +ajk +afQ +amB +afQ +baE djW bsx xfI @@ -99392,9 +99197,9 @@ bkd bmb baE baE -bnM baE -bnM +baE +baE baE baE bBf @@ -100144,7 +99949,7 @@ aIg aIg aKN dIs -aIg +aUe dIs aQg aIg @@ -104598,7 +104403,7 @@ cLa cPF cQb djj -djr +cQb cRq cPA aaa @@ -107578,7 +107383,7 @@ akv alO anf aop -ahx +orJ aqY asn atK @@ -112985,7 +112790,7 @@ axp dBF azO aBi -ajm +axw ajm ajm ajm @@ -113499,7 +113304,7 @@ axr ayF ayF ayF -ayF +pvk ayJ ayJ aGt @@ -115547,7 +115352,7 @@ aiJ aoK aqa arv -asM +kRi atZ avk aww @@ -115803,8 +115608,8 @@ amr anD aoL ajD -arv -asN +oaM +asM atZ avk awx @@ -118715,7 +118520,7 @@ krD czD cAL cBG -cyy +czD czD czD cFu @@ -121505,7 +121310,7 @@ bFA byN byN byN -byN +bMh byN bPf byN @@ -121753,7 +121558,7 @@ bpc dhQ btw buX -bwY +nLT bGp btw dCV @@ -122010,7 +121815,7 @@ alq alq alq buY -alq +dOR alq alq alq @@ -122019,7 +121824,7 @@ alq alq alq bKr -bKr +bMi bKr bKr bKr @@ -122525,7 +122330,7 @@ bry bry bva bxa -bry +bHr bAy bAy bDN @@ -123039,7 +122844,7 @@ bhT bhT bvc bxc -bxc +bHs bAA bCg dBK @@ -123295,7 +123100,7 @@ bpg brA bep bvd -bxd +bxc byR bAB bCh @@ -123313,7 +123118,7 @@ bTh bUx aut bXc -apc +bZz bZE caZ ccJ @@ -123552,7 +123357,7 @@ bpg brB bep bve -bxd +bxc byS bAC dBJ @@ -123568,7 +123373,7 @@ apc aqq apc bUy -alq +bPs bXd apf bZE @@ -123809,13 +123614,13 @@ bpg brC bep bCK -bxd +bxc byT bAD bCj bDP -bFI -bHr +bFH +bHq bIK bBt atm @@ -123825,13 +123630,13 @@ apc bSf apc bxc -bxc +bxg bXe bxc bxc bxc ccL -bxl +bQT cft pOP pOP @@ -124066,13 +123871,13 @@ bph brD bep bvg -bxd +bFI byU -bAE -bCk -dBJ +bDU +bKC +bMd bFJ -bHs +bHq bIL cVD atm @@ -124088,8 +123893,8 @@ bYv bZF cbb ccM -bxc -aaf +bQU +bUB aaf aaf aaf @@ -124323,15 +124128,15 @@ bpi brE btz bvh -bxd +bxc byV bAF -bCl -bDQ -bFK -bxk -bIM -bKu +bCk +dBJ +bFH +bHq +bCk +bxd bxc bxc bxc @@ -124342,11 +124147,11 @@ bxc bVG bXg bAO -bZG +bCi cbc cUR cVy -cVz +aaf bAR bAR bAR @@ -124581,14 +124386,14 @@ brF bep bvi bxc -bxc -bxc +byW +bAE bCm -bDR -bza -bxl +dBJ +bCl +bCn bIN -bxg +bDQ bMa bMa bPo @@ -124602,7 +124407,7 @@ bCi bCi cbd ccN -ceg +bQV cfu cgA chN @@ -124838,28 +124643,28 @@ brG bep bep bxc -byW +bKy bAG -bCn +bFR dBM -bFL -bHt +bza +bIW bIO -bKv +bMg bMb -bNP +bNS bPp bPp bSg bDS bDS bVI -bXi +jAj bYw bYw cbe ccO -bza +bSh aaf gJs chO @@ -125102,22 +124907,22 @@ bDT bFM bHu bIP +dLd bKw -bMc bNQ bPq bPq -bHu -bTj -bHu -bVJ +bPq +bPq +bPq +bPq bXj -bYx -bMg +bCi +bCi cbf ccP ceh -cfv +cfw cgA chP cje @@ -125358,23 +125163,23 @@ bCp bDU bFN bAO -bIQ -bKx -bMd -bxd -bPr -bQS -bPr -bxd -bUA -bVK -bXk -bYy +bIS +siI +bCi +rAc +bCi +bCi +bCi +bCi +bCi +bCi +bKD +bCi bZH cbg ccQ -bza -aaf +bSi +cfx bAR bAR bAR @@ -125616,17 +125421,17 @@ bDV bFO bHv bIR -bKy -bMe -bNR -bNR -bQT -bNR -bNR -bUB -bFO -bXl -bIS +nBn +stP +xgC +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi bZI cbh ccR @@ -125866,24 +125671,24 @@ bhT bhT bvm bxg -bza -bza -bza -bza -bFP -bza -bIS bKz +bKA +bKA +bMe +bFP +bMe bMf -bxd -bPs -bPs -bSh -bxd -bUC -bVK -bXm -bIS +uku +pbF +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi bZI cbi ccS @@ -126130,20 +125935,20 @@ bDW bFQ bHw bIT -bKA -bMg -bNS -bPt -bQU -bSi -bTk -bDW -bFQ -bXm -bYz -bZJ +oms +pbF +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bZI cbj -ccP +bPv ceh cfw cgA @@ -126384,24 +126189,24 @@ bzc bAL ddF bDX -bFR +bCi bHx bIU -bKB -bMh +uku +pbF bCi bCi bKD bCi bCi -bUD bCi -dDm -bIS +bCi +dCY +bCi bZK cbk kJW -ceh +bSi cfx bAR bAR @@ -126642,22 +126447,22 @@ bAM bCt bDY bFS -bHy +bKu bIV -bKC -bMi -bNU -bMg -bQV -bMg -bMg -bUE -bVL -bXn -bYA -bZJ +uku +iRL +rpR +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bZI cbl -bKG +bQS cei cfy cgB @@ -126900,21 +126705,21 @@ bCu bDZ bFT bHz -bIW +bNR +izM bKD -dhe -dhg -bPu -bPu -bPu -bTl -bUF +gRX +bCi +bCi +bCi +bCi +bCi bKD -bXo +bCi bMj bZI cVJ -ccQ +ccS bza aaf gJs @@ -127159,20 +126964,20 @@ bFU bHy bIX bKE -bKE -dhh -bPv -bKE -bKE -bKE -bUG -bKE -bXp -bKE +bNR +gRX +bCi +bCi +bCi +bCi +bCi +bCi +bCi +bCi bZL cbn ccT -cei +bTk cfy cgC chV @@ -127428,8 +127233,8 @@ bXq bNV bZM cbo -ccU -bxc +ccS +bTl aaf bAR bAR @@ -127676,17 +127481,17 @@ bKG bMl dhj njd -bKG -bMl -bKG +jsc +bPr +bNU eJq -bKG -bMl +bNU +bPt bYB -bKG -bKG +bNU +bNU ccV -bxc +bTl aaf aaf aaf @@ -127923,27 +127728,27 @@ aaa aaf bxc bxc -bxc +bKB bCy -bza +cei bFX -bza -bJa -bza +cei +bCy +cei bFX dhk -bJa -bza +bCy +cei bFX -bza -bJa -bza +cei +bCy +cei bFX -bxc -bxc -bxc +bPu +bPu +bPu ccW -bxc +bUA aaf aaa aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 97984fa656..d3a1012177 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1486,9 +1486,7 @@ /obj/structure/stone_tile/cracked{ dir = 8 }, -/obj/item/malf_upgrade, -/obj/item/disk/tech_disk/illegal, -/obj/structure/safe, +/obj/item/storage/firstaid/ancient, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "pc" = ( @@ -2367,9 +2365,7 @@ /obj/item/seeds/cotton{ yield = 5 }, -/obj/item/seeds/cotton{ - yield = 5 - }, +/obj/item/seeds/cotton/durathread, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "Vj" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 2ca3c3deee..ebdda21c5e 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1240,20 +1240,19 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hop) "abL" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/structure/sign/warning/securearea, +/turf/closed/wall, /area/maintenance/starboard/fore) "abM" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "abN" = ( @@ -1301,28 +1300,19 @@ /turf/closed/wall, /area/asteroid/nearstation) "abU" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"abV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ id = "detectivewindows"; - name = "Detective Privacy Blast door" + name = "HoS Privacy Blast door" + }, +/obj/structure/cable/white{ + icon_state = "0-2" }, /turf/open/floor/plating, -/area/security/detectives_office) -"abV" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/shower{ - pixel_y = 16 - }, -/obj/structure/curtain, -/obj/machinery/door/window/brigdoor/southleft{ - name = "Shower" - }, -/obj/item/soap/deluxe, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "abW" = ( /obj/structure/closet/firecloset, /obj/machinery/light/small{ @@ -1606,10 +1596,14 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hop) "acu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/structure/sign/warning/vacuum{ + pixel_x = 32; + pixel_y = 32 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, /area/maintenance/starboard/fore) "acv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1731,26 +1725,54 @@ /turf/open/floor/plating, /area/asteroid/nearstation) "acG" = ( -/obj/structure/door_assembly/door_assembly_mhatch, +/obj/structure/bed, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/bedsheet/hos, +/obj/effect/landmark/start/head_of_security, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hos) +"acH" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/asteroid/nearstation) +"acI" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/structure/curtain, +/obj/machinery/door/window/brigdoor/southleft{ + name = "Shower" + }, +/obj/item/soap/deluxe, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hos) +"acJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, /turf/open/floor/plasteel, /area/asteroid/nearstation) -"acH" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/asteroid/nearstation) -"acI" = ( +"acK" = ( /obj/structure/dresser, /obj/structure/sign/warning/vacuum{ pixel_y = 32 }, /obj/machinery/camera{ - c_tag = "Detective's Office - Quarters" + c_tag = "Head of Security's Office - Quarters" }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -1763,15 +1785,17 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/detectives_office) -"acJ" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/start/detective, -/obj/item/bedsheet/brown, +/area/crew_quarters/heads/hos) +"acL" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/wood, -/area/security/detectives_office) -"acK" = ( +/area/crew_quarters/heads/hos) +"acM" = ( /obj/structure/closet/crate/bin, /obj/machinery/light{ dir = 4 @@ -1781,25 +1805,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/wood, -/area/security/detectives_office) -"acL" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/security/detectives_office) -"acM" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/start/detective, -/turf/open/floor/plasteel/white, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "acN" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -2151,10 +2157,15 @@ /turf/closed/wall, /area/quartermaster/storage) "adq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum, -/turf/open/floor/plating, -/area/quartermaster/storage) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) "adr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2182,6 +2193,24 @@ }, /turf/open/floor/plating, /area/engine/supermatter) +"adt" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"adu" = ( +/turf/closed/wall, +/area/quartermaster/qm) "adv" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -2200,12 +2229,42 @@ /obj/item/clothing/head/helmet/space/orange, /turf/open/floor/plating, /area/asteroid/nearstation) +"ady" = ( +/turf/closed/wall/rust, +/area/quartermaster/qm) "adz" = ( /obj/structure/sign/warning/vacuum, /turf/closed/wall, /area/asteroid/nearstation) "adA" = ( -/obj/structure/closet/secure_closet/detective, +/obj/machinery/status_display, +/turf/closed/wall, +/area/crew_quarters/heads/hos) +"adB" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hos) +"adC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"adD" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -2216,43 +2275,31 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/closet/secure_closet/hos, /turf/open/floor/plasteel/dark, -/area/security/detectives_office) -"adB" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/wood, -/area/security/detectives_office) -"adC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/wood, -/area/security/detectives_office) -"adD" = ( -/obj/machinery/door/airlock/silver{ - name = "Bathroom" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "adE" = ( -/obj/structure/mirror{ - pixel_x = 26 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/sink{ - dir = 4; - pixel_x = 12 +/obj/structure/cable/white{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/white, -/area/security/detectives_office) +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hos) "adF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/landmark/xeno_spawn, @@ -2345,6 +2392,14 @@ /obj/structure/closet/crate/bin, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) +"adM" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "adN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/item/radio/intercom{ @@ -2444,32 +2499,67 @@ "adX" = ( /turf/closed/wall, /area/crew_quarters/heads/hop) +"adY" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/ripped{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) "adZ" = ( -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_x = -28 +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/secure_closet/quartermaster, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, /obj/machinery/camera{ - c_tag = "Cargo Bay North" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/conveyor/inverted{ - dir = 5; - id = "cargounload" + c_tag = "Quartermaster's Office"; + dir = 4 }, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/quartermaster/qm) "aea" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "cargounload" +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/item/stamp/qm, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_y = 24 }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/effect/turf_decal/tile/brown{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/quartermaster/qm) +"aeb" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) "aec" = ( /obj/machinery/conveyor{ dir = 8; @@ -2506,6 +2596,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/quartermaster/storage) +"aef" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aeg" = ( /obj/machinery/conveyor{ dir = 8; @@ -2527,6 +2623,40 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/quartermaster/storage) +"aei" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) +"aej" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/qm) +"aek" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) "ael" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -2540,46 +2670,61 @@ icon_state = "platingdmg3" }, /area/asteroid/nearstation) -"aeo" = ( -/obj/structure/table, -/obj/item/extinguisher/mini, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/breath, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"aen" = ( +/obj/structure/cable/white{ + icon_state = "4-8" }, +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/landmark/start/quartermaster, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/asteroid/nearstation) +/area/quartermaster/qm) +"aeo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/heads/hos) "aep" = ( /turf/open/floor/plating{ icon_state = "platingdmg2" }, /area/asteroid/nearstation) "aeq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/nanotrasen{ - pixel_x = -32 +/obj/machinery/door/airlock/silver{ + name = "Bathroom" }, -/turf/open/floor/plating, -/area/security/detectives_office) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hos) "aer" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Detective's Office"; - req_access_txt = "4" +/obj/structure/mirror{ + pixel_x = 26 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/sink{ + dir = 4; + pixel_x = 12 }, -/turf/open/floor/plasteel, -/area/security/detectives_office) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hos) "aes" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "0-8" + }, /turf/open/floor/plating, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "aet" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/power/apc{ @@ -2908,16 +3053,49 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "aeP" = ( -/obj/machinery/status_display/supply{ - pixel_x = -32 +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/qm"; + dir = 4; + name = "Quartermaster's Office APC"; + pixel_x = 26 + }, +/obj/machinery/computer/card/minor/qm{ + icon_state = "computer"; + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/keycard_auth{ + pixel_x = 24; + pixel_y = 24 }, -/obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/quartermaster/qm) "aeQ" = ( -/obj/effect/turf_decal/loading_area, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Quartermaster"; + req_access_txt = "41" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/quartermaster/qm) +"aeR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/quartermaster/qm) "aeS" = ( /obj/structure/closet/crate, /obj/effect/turf_decal/delivery, @@ -2935,11 +3113,57 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"aeV" = ( +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -28 + }, +/obj/machinery/camera{ + c_tag = "Cargo Bay North" + }, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aeW" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aeX" = ( /obj/machinery/light/small, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/quartermaster/storage) +"aeY" = ( +/obj/machinery/conveyor/inverted{ + dir = 5; + id = "cargounload" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "aeZ" = ( /obj/docking_port/stationary{ dir = 4; @@ -2951,80 +3175,98 @@ }, /turf/open/space/basic, /area/space) -"afb" = ( -/obj/structure/door_assembly/door_assembly_mhatch, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ +"afa" = ( +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ dir = 1 }, -/turf/open/floor/plating, -/area/asteroid/nearstation) -"afd" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/restraints/handcuffs, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"afb" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/suit_storage_unit/hos, /turf/open/floor/plasteel/dark, -/area/security/detectives_office) -"afe" = ( +/area/crew_quarters/heads/hos) +"afc" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"afd" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /obj/structure/cable/white{ icon_state = "2-4" }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/wood, -/area/security/detectives_office) -"aff" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/area/crew_quarters/heads/hos) +"afe" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/security/detectives_office) +/turf/open/floor/plasteel, +/area/security/brig) +"aff" = ( +/turf/closed/wall, +/area/crew_quarters/heads/hos) "afg" = ( -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"afh" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/plating, +/area/asteroid/nearstation) +"afi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /obj/structure/cable/white{ icon_state = "4-8" }, -/turf/open/floor/wood, -/area/security/detectives_office) -"afh" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/security/detectives_office"; - dir = 1; - name = "Detective's Office APC"; - pixel_y = 25 - }, -/obj/structure/cable/white{ - icon_state = "0-8" +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 }, /turf/open/floor/wood, -/area/security/detectives_office) -"afi" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Detective's Office Maintenance"; - req_access_txt = "4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) +/area/crew_quarters/heads/hos) "afj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -3335,7 +3577,9 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "afD" = ( -/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -3346,6 +3590,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "afE" = ( @@ -3421,6 +3668,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/storage) +"afJ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"afK" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay"; + req_one_access_txt = "48;50" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "afL" = ( /obj/structure/girder/reinforced, /turf/open/floor/plating, @@ -3432,65 +3701,89 @@ /turf/open/floor/plating, /area/asteroid/nearstation) "afN" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/asteroid/nearstation) -"afP" = ( /obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/camera/detective, -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_x = -26 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/taperecorder, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"afO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/brown{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/detectives_office) -"afQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"afR" = ( -/obj/structure/table/wood, -/obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 3 +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"afP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = -3 +/obj/item/poster/random_contraband{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/poster/random_contraband{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/poster/random_contraband, +/turf/open/floor/plasteel, +/area/asteroid/nearstation) +"afQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/item/clothing/mask/cigarette/cigar, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/clothing/glasses/sunglasses, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hos) +"afR" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Head of Security's Office Maintenance"; + req_access_txt = "4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "afS" = ( -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/crew_quarters/heads/hos"; + dir = 1; + name = "Head of Security's Office APC"; + pixel_y = 25 + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/hos) "afT" = ( -/obj/machinery/computer/med_data{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/requests_console{ - department = "Detective's Office"; - name = "Detective RC"; - pixel_x = 30 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/camera{ - c_tag = "Detective's Office - Desk"; - dir = 8 +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Security Maintenance"; + req_access_txt = "63" }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/turf/open/floor/plasteel, +/area/security/brig) "afU" = ( -/turf/closed/wall/r_wall, -/area/security/detectives_office) +/turf/open/floor/plasteel/dark, +/area/security/brig) "afV" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -3705,6 +3998,26 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"agm" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel, +/area/security/brig) "agn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/white, @@ -3820,9 +4133,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "agw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -3833,6 +4143,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "agx" = ( @@ -3851,6 +4164,23 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"agy" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "agz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -3901,6 +4231,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/quartermaster/storage) +"agD" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "agE" = ( /obj/item/stack/ore/silver, /obj/item/stack/ore/iron, @@ -3911,75 +4251,80 @@ /turf/closed/wall/r_wall, /area/security/brig) "agG" = ( -/obj/effect/decal/cleanable/oil, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"agH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"agI" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/item/pen/fountain, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"agJ" = ( +/obj/machinery/camera{ + c_tag = "Head of Security's Office - Desk"; + dir = 8 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security RC"; + pixel_x = 30; + pixel_y = 0 + }, +/obj/machinery/computer/security/hos{ + icon_state = "computer"; + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"agK" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/ore/iron, /turf/open/floor/plating, /area/asteroid/nearstation) -"agH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/asteroid/nearstation) -"agI" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/secure/briefcase, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/light{ - dir = 8 +"agL" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/camera/detective, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -26 }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/security/detectives_office) -"agJ" = ( -/obj/machinery/holopad, +/area/crew_quarters/heads/hos) +"agM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, /turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"agK" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 2 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"agL" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/effect/landmark/start/detective, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"agM" = ( -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/status_display{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "agN" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -4336,31 +4681,41 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "ahl" = ( +/obj/structure/closet/crate, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/quartermaster/storage) "ahm" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Cargo Bay South"; +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/loading_area{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/quartermaster/storage) "ahn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/conveyor{ - dir = 5; - id = "cargoload" - }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/quartermaster/storage) "aho" = ( /obj/machinery/conveyor{ @@ -4412,85 +4767,100 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"ahs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aht" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "ahu" = ( /turf/closed/wall/r_wall, /area/asteroid/nearstation) "ahv" = ( -/obj/machinery/suit_storage_unit/security, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 +/obj/machinery/door/firedoor, +/obj/structure/cable/white{ + icon_state = "2-8" }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage"; + req_access_txt = "63" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"ahw" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"ahx" = ( -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/obj/machinery/light/small{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/turf/open/floor/plasteel, +/area/security/brig) +"ahw" = ( +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"ahx" = ( +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = -23 }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light{ dir = 8 }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/computer/card/minor/hos{ + icon_state = "computer"; + dir = 4 + }, /turf/open/floor/plasteel/dark, -/area/security/brig) +/area/crew_quarters/heads/hos) "ahy" = ( -/obj/machinery/suit_storage_unit/security, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/brig) -"ahz" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" }, /turf/open/floor/plasteel, -/area/asteroid/nearstation) +/area/crew_quarters/heads/hos) +"ahz" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = -32 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "ahA" = ( /obj/structure/rack, /obj/item/clothing/suit/fire/firefighter, @@ -4502,78 +4872,40 @@ /turf/open/floor/plasteel, /area/asteroid/nearstation) "ahB" = ( -/obj/machinery/photocopier, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/detectives_office) +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/iron, +/turf/open/floor/plating, +/area/asteroid/nearstation) "ahC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"ahD" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"ahE" = ( -/obj/structure/table/wood, -/obj/machinery/button/door{ - id = "detectivewindows"; - name = "Privacy Shutters"; - pixel_x = 26; - pixel_y = -26; - req_access_txt = "4" - }, -/obj/machinery/light_switch{ - pixel_x = 38; - pixel_y = -26 - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/item/folder/red, -/obj/item/hand_labeler, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"ahF" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/item/storage/secure/safe{ +/obj/machinery/status_display/ai{ pixel_x = 32 }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 24; - pixel_y = -26 +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ahD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/asteroid/nearstation) +"ahE" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/item/folder/red, +/obj/item/stamp/hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"ahF" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" }, /turf/open/floor/plasteel/grimy, -/area/security/detectives_office) +/area/crew_quarters/heads/hos) "ahG" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -4749,6 +5081,26 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) +"ahW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "ahX" = ( /obj/machinery/airalarm{ dir = 8; @@ -4802,17 +5154,24 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard/fore) "aid" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay"; - req_one_access_txt = "48;50" +/obj/structure/table/wood, +/obj/machinery/button/door{ + id = "detectivewindows"; + name = "Privacy Shutters"; + pixel_x = 26; + pixel_y = -26; + req_access_txt = "4" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light_switch{ + pixel_x = 38; + pixel_y = -26 }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/machinery/recharger, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) "aie" = ( /obj/machinery/conveyor{ dir = 1; @@ -4833,29 +5192,100 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/quartermaster/storage) +"aig" = ( +/obj/machinery/button/door{ + desc = "A remote control switch for the medbay foyer."; + id = "secexterior"; + name = "Security Exterior Doors Control"; + normaldoorcontrol = 1; + pixel_x = 38; + pixel_y = 24 + }, +/obj/machinery/button/door{ + desc = "A remote control switch for the medbay foyer."; + id = "secinterior"; + name = "Security Interior Doors Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = 24 + }, +/obj/machinery/button/door{ + id = "brigfront"; + name = "Brig Access Control"; + pixel_x = 24; + pixel_y = 38; + req_access_txt = "63" + }, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 38; + pixel_y = 38 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/landmark/start/warden, +/turf/open/floor/plasteel, +/area/security/brig) +"aih" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aii" = ( +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Cargo Bay South"; + dir = 1 + }, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aij" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/chemist, +/turf/open/floor/plasteel, +/area/medical/chemistry) "aik" = ( /obj/structure/barricade/wooden, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/asteroid/nearstation) -"aim" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/gun/ballistic/shotgun/riot, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red{ +"ail" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/chief_medical_officer, /turf/open/floor/plasteel/dark, -/area/security/brig) +/area/medical/morgue) +"aim" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) "ain" = ( /obj/machinery/firealarm{ pixel_y = 26 @@ -4921,24 +5351,17 @@ /turf/open/floor/plasteel, /area/security/brig) "ais" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/white{ - icon_state = "2-8" +/obj/machinery/computer/secure_data{ + dir = 8 }, -/obj/structure/cable/white{ - icon_state = "2-4" +/obj/machinery/light{ + dir = 4 }, -/obj/machinery/door/airlock/security/glass{ - name = "Security E.V.A. Storage"; - req_access_txt = "63" +/obj/machinery/status_display{ + pixel_x = 32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) "ait" = ( /obj/structure/cable/white{ icon_state = "0-8" @@ -4947,40 +5370,44 @@ /turf/open/floor/plating, /area/security/brig) "aiu" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "detectivewindows"; - name = "Detective Privacy Blast door" +/obj/machinery/suit_storage_unit/security, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 }, -/turf/open/floor/plating, -/area/security/detectives_office) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "aiv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Detective's Office"; - req_access_txt = "4" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "1-2" +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/detectives_office) +/turf/open/floor/plasteel/dark, +/area/security/brig) "aiw" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "detectivewindows"; - name = "Detective Privacy Blast door" +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/item/stack/cable_coil/white, +/obj/item/stack/cable_coil/white, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/circuitboard/machine/microwave, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/security/detectives_office) +/area/maintenance/starboard/central) "aix" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -5124,14 +5551,22 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "aiJ" = ( -/obj/effect/turf_decal/tile/brown{ +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/brown{ +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/start/chemist, /turf/open/floor/plasteel, -/area/quartermaster/storage) +/area/medical/chemistry) "aiK" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/brown{ @@ -5198,35 +5633,69 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aiR" = ( -/obj/structure/rack, -/obj/item/gun/energy/e_gun/advtaser{ - pixel_x = -3; - pixel_y = 3 +"aiP" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" }, -/obj/item/gun/energy/e_gun/advtaser, -/obj/machinery/light{ +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/landmark/start/research_director, +/turf/open/floor/plasteel/white, +/area/science/research) +"aiQ" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/status_display{ - pixel_x = -32 +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel, +/area/medical/medbay/zone3) +"aiR" = ( +/obj/machinery/suit_storage_unit/security, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/security/brig) "aiS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 10 }, +/obj/structure/table, +/obj/item/extinguisher/mini, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/breath, /turf/open/floor/plasteel, -/area/security/brig) +/area/asteroid/nearstation) "aiT" = ( /obj/structure/rack, /obj/item/gun/energy/ionrifle, @@ -5718,6 +6187,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard/fore) +"ajG" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/start/chief_medical_officer, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) "ajH" = ( /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/delivery, @@ -5780,28 +6265,74 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"ajN" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel, +/area/medical/medbay/zone3) +"ajO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel, +/area/medical/medbay/zone3) +"ajP" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/research_director, +/turf/open/floor/plasteel, +/area/science/mixing) "ajQ" = ( /obj/item/stack/ore/iron, /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/asteroid/nearstation) "ajR" = ( -/obj/structure/rack, -/obj/item/gun/energy/e_gun{ - pixel_x = -3; - pixel_y = 3 +/obj/machinery/photocopier, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 }, -/obj/item/gun/energy/e_gun, -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_x = -26 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, /turf/open/floor/plasteel/dark, -/area/security/brig) +/area/crew_quarters/heads/hos) "ajS" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -5876,24 +6407,10 @@ /turf/open/floor/plasteel, /area/security/brig) "ajX" = ( -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/asteroid/nearstation) "ajY" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -6487,32 +7004,20 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "akM" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/obj/item/stack/ore/silver, +/obj/item/stack/ore/iron, +/turf/open/floor/plating/asteroid, +/area/asteroid/nearstation) "akN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 8 }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) "akO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) "akP" = ( /obj/machinery/photocopier, /obj/effect/turf_decal/tile/brown{ @@ -6524,6 +7029,42 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"akQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/conveyor{ + dir = 5; + id = "cargoload" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"akR" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"akS" = ( +/turf/closed/wall/r_wall/rust, +/area/crew_quarters/heads/chief) "akT" = ( /obj/structure/sign/warning/electricshock{ pixel_x = -32 @@ -6932,9 +7473,9 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "alE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "2-4" +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -6943,11 +7484,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/camera{ + c_tag = "Chief Engineer's Office" }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) +/mob/living/simple_animal/parrot/Poly, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) "alF" = ( /obj/machinery/power/apc{ areastring = "/area/quartermaster/storage"; @@ -6970,47 +7512,21 @@ /turf/open/floor/plating, /area/asteroid/nearstation) "alH" = ( -/obj/item/grenade/barrier{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/item/grenade/barrier{ - pixel_x = 6; - pixel_y = -2 - }, -/obj/structure/table/reinforced, -/obj/machinery/newscaster/security_unit{ - pixel_x = -32 - }, -/obj/machinery/camera{ - c_tag = "Brig Control Room"; - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) -"alI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/structure/cable/white{ + icon_state = "2-4" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/cable/white{ + icon_state = "1-8" }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) +"alI" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) "alJ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -7560,6 +8076,32 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/miningdock) +"amE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"amF" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/stamp/ce, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) "amG" = ( /obj/structure/table, /obj/item/clothing/mask/gas, @@ -7576,27 +8118,11 @@ /turf/open/floor/plating, /area/asteroid/nearstation) "amH" = ( -/obj/item/storage/box/chemimp{ - pixel_x = 6 +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 }, -/obj/item/storage/box/trackimp{ - pixel_x = -3 - }, -/obj/item/storage/lockbox/loyalty, -/obj/structure/table/reinforced, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/camera{ - c_tag = "Security - Office"; - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/plasteel/dark, +/area/library) "amI" = ( /obj/machinery/holopad, /obj/structure/cable/white{ @@ -7753,6 +8279,24 @@ }, /turf/open/floor/plasteel/dark, /area/teleporter) +"amU" = ( +/obj/machinery/computer/card/minor/ce, +/obj/machinery/keycard_auth{ + pixel_x = 24; + pixel_y = -8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) "amV" = ( /obj/structure/table/reinforced, /obj/item/storage/belt/utility, @@ -7992,29 +8536,58 @@ /obj/structure/sign/warning/vacuum, /turf/open/floor/plating, /area/quartermaster/miningdock) +"anu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Chief Engineer"; + req_access_txt = "56" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"anv" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"anw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) "anx" = ( /obj/structure/grille, /turf/closed/wall/r_wall, /area/engine/atmos) "any" = ( -/obj/item/storage/box/firingpins, -/obj/item/storage/box/firingpins, -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_y = 32 }, -/obj/machinery/requests_console{ - department = "Security"; - name = "Security RC"; - pixel_x = -32 - }, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/gun/energy/e_gun/dragnet, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/obj/item/clipboard, +/obj/item/folder/red, +/obj/item/hand_labeler, +/turf/open/floor/wood, +/area/security/detectives_office) "anz" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -8033,44 +8606,26 @@ /turf/open/floor/plasteel, /area/security/brig) "anA" = ( -/obj/machinery/button/door{ - desc = "A remote control switch for the medbay foyer."; - id = "secexterior"; - name = "Security Exterior Doors Control"; - normaldoorcontrol = 1; - pixel_x = 38; - pixel_y = 24 - }, -/obj/machinery/button/door{ - desc = "A remote control switch for the medbay foyer."; - id = "secinterior"; - name = "Security Interior Doors Control"; - normaldoorcontrol = 1; - pixel_x = 24; - pixel_y = 24 - }, -/obj/machinery/button/door{ - id = "brigfront"; - name = "Brig Access Control"; - pixel_x = 24; - pixel_y = 38; - req_access_txt = "63" - }, /obj/structure/chair/office/dark{ - dir = 4 + dir = 1 }, -/obj/machinery/light_switch{ - pixel_x = 38; - pixel_y = 38 +/obj/effect/landmark/start/chief_engineer, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/effect/landmark/start/security_officer, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Engineer's Desk"; + departmentType = 3; + name = "Chief Engineer RC"; + pixel_x = 32 }, /turf/open/floor/plasteel, -/area/security/brig) +/area/crew_quarters/heads/chief) "anB" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -8181,6 +8736,25 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) +"anK" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -26 + }, +/obj/item/twohanded/rcl/pre_loaded, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) "anL" = ( /obj/machinery/door/window/northleft{ dir = 4; @@ -8213,6 +8787,18 @@ /obj/item/beacon, /turf/open/floor/plasteel, /area/teleporter) +"anO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) "anP" = ( /obj/machinery/teleport/station, /obj/machinery/light{ @@ -8510,6 +9096,68 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"aon" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21" + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/chief"; + dir = 4; + name = "Chief Engineer's Office APC"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"aoo" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) +"aop" = ( +/obj/effect/landmark/start/chief_engineer, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = -32; + pixel_y = -26 + }, +/obj/machinery/computer/security/telescreen/ce{ + dir = 1; + icon_state = "telescreen"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) "aoq" = ( /turf/open/floor/engine/vacuum, /area/engine/atmos) @@ -8520,25 +9168,18 @@ /turf/open/floor/engine/vacuum, /area/engine/atmos) "aos" = ( -/obj/item/storage/box/teargas{ - pixel_x = 3; - pixel_y = 3 +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/item/storage/secure/safe{ + pixel_x = 32 }, -/obj/item/storage/box/handcuffs, -/obj/item/storage/box/flashbangs{ - pixel_x = -3; - pixel_y = -3 +/obj/structure/extinguisher_cabinet{ + pixel_x = 24; + pixel_y = -26 }, -/obj/structure/table/reinforced, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/brig) +/obj/item/toy/figure/hos, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/heads/hos) "aot" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -9142,6 +9783,22 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"apo" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) "app" = ( /obj/docking_port/stationary{ dir = 4; @@ -9154,10 +9811,127 @@ }, /turf/open/space/basic, /area/space) +"apq" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/chief) +"apr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Chief Engineer"; + req_access_txt = "56" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"aps" = ( +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/machinery/button/door{ + id = "engstorage"; + name = "Engineering Secure Storage Control"; + pixel_y = 24; + req_access_txt = "10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"apt" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"apu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/departments/custodian{ + pixel_x = 32; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/aft) "apv" = ( /obj/machinery/air_sensor/atmos/mix_tank, /turf/open/floor/engine/vacuum, /area/engine/atmos) +"apw" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/storage/box/firingpins, +/obj/item/storage/box/firingpins, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet, +/turf/open/floor/plasteel/dark, +/area/security/brig) "apx" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -9442,6 +10216,21 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/maintenance/port/central) +"apR" = ( +/obj/structure/rack, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/ballistic/shotgun/riot, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "apS" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -9723,6 +10512,22 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hallway/primary/starboard/fore) +"aqo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) "aqp" = ( /obj/machinery/autolathe, /obj/structure/extinguisher_cabinet{ @@ -9800,6 +10605,37 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"aqw" = ( +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "detectivewindows"; + name = "HoS Privacy Blast door" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"aqx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/obj/structure/sign/warning/vacuum{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/maintenance/port) +"aqy" = ( +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "detectivewindows"; + name = "HoS Privacy Blast door" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) "aqz" = ( /turf/closed/wall/r_wall, /area/engine/atmos) @@ -9807,6 +10643,19 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"aqB" = ( +/obj/machinery/status_display{ + pixel_x = -32 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/security/brig) "aqC" = ( /obj/machinery/meter, /obj/structure/grille, @@ -9815,6 +10664,13 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) +"aqD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) "aqE" = ( /obj/machinery/meter, /obj/structure/grille, @@ -9831,10 +10687,35 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "aqG" = ( -/obj/structure/door_assembly/door_assembly_mhatch, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) +"aqH" = ( +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun/advtaser, +/turf/open/floor/plasteel/dark, +/area/security/brig) "aqI" = ( /obj/structure/closet/secure_closet/security/sec, /obj/item/radio/intercom{ @@ -9952,22 +10833,15 @@ /turf/open/floor/plasteel, /area/security/brig) "aqQ" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/toy/figure/hos, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/closet/secure_closet/warden, +/obj/item/toy/figure/warden, /turf/open/floor/plasteel, /area/security/brig) "aqR" = ( @@ -10226,6 +11100,36 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"arn" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aro" = ( +/turf/closed/wall, +/area/maintenance/port/fore) +"arp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"arq" = ( +/turf/closed/wall/r_wall, +/area/maintenance/port/fore) "arr" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ dir = 8 @@ -10243,6 +11147,45 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"ars" = ( +/turf/open/floor/plating, +/area/maintenance/port/fore) +"art" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"aru" = ( +/obj/machinery/newscaster/security_unit{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/grenade/barrier{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/grenade/barrier, +/obj/item/grenade/barrier{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/grenade/barrier{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/machinery/camera{ + c_tag = "Brig Control Room"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) "arv" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 9 @@ -10344,9 +11287,11 @@ /turf/open/floor/plasteel, /area/engine/atmos) "arB" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) "arC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -10739,6 +11684,21 @@ icon_state = "platingdmg3" }, /area/maintenance/port/central) +"asa" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "asb" = ( /obj/structure/cable/white{ icon_state = "2-8" @@ -10884,6 +11844,47 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/central) +"asm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"asn" = ( +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/camera{ + c_tag = "Security - Office"; + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/chemimp{ + pixel_x = 6 + }, +/obj/item/storage/box/trackimp{ + pixel_x = -3 + }, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/plasteel/dark, +/area/security/brig) "aso" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -10904,6 +11905,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/central) +"asq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/warden, +/turf/open/floor/plasteel, +/area/security/brig) "asr" = ( /obj/effect/turf_decal/loading_area{ dir = 4 @@ -10940,6 +11948,10 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard) +"asu" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/maintenance/port/fore) "asv" = ( /turf/open/floor/engine/n2, /area/engine/atmos) @@ -10959,6 +11971,60 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"asy" = ( +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"asz" = ( +/obj/machinery/requests_console{ + department = "Security"; + name = "Security RC"; + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box/teargas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/handcuffs, +/obj/item/storage/box/flashbangs{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"asA" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"asB" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/folder/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/toy/figure/secofficer, +/turf/open/floor/plasteel, +/area/security/brig) "asC" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 @@ -10972,6 +12038,26 @@ dir = 1 }, /area/engine/atmos) +"asD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"asE" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "asF" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 5 @@ -11327,6 +12413,11 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/storage/primary) +"ata" = ( +/obj/structure/window/reinforced/tinted/fulltile, +/obj/structure/grille, +/turf/open/floor/plating, +/area/security/detectives_office) "atb" = ( /obj/structure/cable/white{ icon_state = "1-8" @@ -11419,6 +12510,10 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) +"atk" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/security/detectives_office) "atl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -11475,6 +12570,89 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard) +"atr" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase, +/obj/item/restraints/handcuffs, +/obj/item/grenade/smokebomb, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/detectives_office) +"ats" = ( +/obj/item/clothing/suit/jacket{ + desc = "All the class of a trenchcoat without the security fibers."; + icon_state = "greydet"; + name = "trenchcoat" + }, +/obj/item/clothing/suit/jacket{ + desc = "All the class of a trenchcoat without the security fibers."; + icon_state = "detective"; + name = "trenchcoat" + }, +/obj/item/clothing/head/fedora, +/obj/item/clothing/head/fedora{ + icon_state = "detective" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/secure_closet/detective, +/turf/open/floor/wood, +/area/security/detectives_office) +"att" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/security/detectives_office) +"atu" = ( +/obj/structure/table/wood, +/obj/item/crowbar/red, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/detective, +/obj/item/camera/detective, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/detectives_office) +"atv" = ( +/obj/effect/landmark/start/detective, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/light_switch{ + pixel_x = 8; + pixel_y = -24 + }, +/obj/machinery/camera{ + c_tag = "Detective's Office - Quarters"; + dir = 1 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"atw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/security/detectives_office) "atx" = ( /obj/machinery/air_sensor/atmos/nitrogen_tank, /turf/open/floor/engine/n2, @@ -11489,6 +12667,109 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"atz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/detectives_office) +"atA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/turf/open/floor/plasteel, +/area/security/detectives_office) +"atB" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/poster/ripped{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) +"atC" = ( +/obj/machinery/photocopier, +/obj/item/newspaper{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/newspaper, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_x = -32 + }, +/obj/machinery/light_switch{ + pixel_x = 8; + pixel_y = 24 + }, +/obj/machinery/camera{ + c_tag = "Detective's Office - Desk" + }, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -6; + pixel_y = 22 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"atD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/security/detectives_office) +"atE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) +"atF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/detectives_office) +"atG" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/computer/med_data/laptop{ + icon_state = "laptop"; + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Detective's Office"; + name = "Detective RC"; + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"atH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/detective, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/detectives_office) "atI" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -11516,6 +12797,9 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) +"atJ" = ( +/turf/open/floor/wood, +/area/security/detectives_office) "atK" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = 32 @@ -11768,7 +13052,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/theatre) "atY" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /obj/machinery/light{ @@ -11885,6 +13169,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) +"auh" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/science/research) "aui" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -11999,6 +13289,51 @@ /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) +"aur" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/sign/departments/security{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"aus" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/security/detectives_office) +"aut" = ( +/obj/structure/table/wood, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 0; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"auu" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/computer/secure_data/laptop{ + dir = 1; + icon_state = "laptop"; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/security/detectives_office) "auv" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 10 @@ -12017,6 +13352,44 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"aux" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"auy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"auz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/detectives_office) "auA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -12480,6 +13853,15 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) +"avm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/security/detectives_office) "avn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -12626,12 +14008,66 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"avz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/security/detectives_office) +"avA" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/wood, +/area/security/detectives_office) +"avB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"avC" = ( +/obj/structure/sign/poster/ripped, +/turf/closed/wall/rust, +/area/security/detectives_office) +"avD" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/turf/open/floor/wood, +/area/security/detectives_office) "avE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 10 }, /turf/open/floor/plasteel, /area/engine/atmos) +"avF" = ( +/obj/structure/table/wood, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/item/clothing/mask/cigarette/cigar/cohiba{ + pixel_x = 3 + }, +/obj/item/clothing/mask/cigarette/cigar/havana{ + pixel_x = -3 + }, +/obj/item/clothing/mask/cigarette/cigar, +/obj/item/clothing/glasses/sunglasses, +/turf/open/floor/wood, +/area/security/detectives_office) "avG" = ( /obj/machinery/light{ dir = 4 @@ -12650,6 +14086,22 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) +"avH" = ( +/obj/structure/table/wood, +/obj/structure/cable/white, +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + name = "Detective's Office APC"; + pixel_y = -26 + }, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/secure/briefcase, +/obj/item/taperecorder, +/turf/open/floor/wood, +/area/security/detectives_office) "avI" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -13237,6 +14689,12 @@ "awA" = ( /turf/open/floor/engine/o2, /area/engine/atmos) +"awB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) "awC" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -13260,11 +14718,39 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"awD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/item/cigbutt, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/aft) +"awE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/port) "awF" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/atmos) +"awG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/port) +"awH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plasteel, +/area/maintenance/port) "awI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 5 @@ -13291,6 +14777,12 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) +"awL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/port) "awM" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -13552,14 +15044,70 @@ /obj/item/wirecutters, /turf/open/floor/plasteel, /area/maintenance/starboard) +"axh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/maintenance/port) "axi" = ( /obj/machinery/air_sensor/atmos/oxygen_tank, /turf/open/floor/engine/o2, /area/engine/atmos) +"axj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) +"axk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/pickaxe/emergency, +/turf/open/floor/plasteel, +/area/maintenance/port) +"axl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) "axm" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/plasteel, /area/engine/atmos) +"axn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/port) "axo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/stripes/line{ @@ -13835,6 +15383,23 @@ }, /turf/open/floor/carpet, /area/crew_quarters/dorms) +"axL" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) "axM" = ( /obj/structure/table/wood, /obj/item/lipstick/random{ @@ -13983,6 +15548,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) +"axU" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/maintenance/port) "axV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/newscaster{ @@ -13998,6 +15570,20 @@ "axW" = ( /turf/closed/wall, /area/hallway/secondary/exit) +"axX" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/port) +"axY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/cigbutt, +/turf/open/floor/plating, +/area/maintenance/port) "ayh" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 8 @@ -14860,12 +16446,6 @@ icon_state = "platingdmg1" }, /area/maintenance/starboard/central) -"azQ" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/central) "azR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -15096,25 +16676,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aAw" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aAx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/neutral{ @@ -18344,12 +19905,6 @@ "aGe" = ( /turf/closed/wall/r_wall, /area/engine/gravity_generator) -"aGf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) "aGg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -18912,27 +20467,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/engine/engineering) -"aHi" = ( -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/machinery/button/door{ - id = "engstorage"; - name = "Engineering Secure Storage Control"; - pixel_y = 24; - req_access_txt = "10" - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) "aHj" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -20950,25 +22484,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aKJ" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aKK" = ( /obj/structure/table/reinforced, /obj/structure/cable/white{ @@ -22626,10 +24141,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"aOe" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/janitor) "aOf" = ( /obj/machinery/door/airlock{ name = "Custodial Closet"; @@ -22973,19 +24484,6 @@ heat_capacity = 1e+006 }, /area/hallway/primary/port/aft) -"aOQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port/aft) "aOR" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -23456,43 +24954,6 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) -"aPz" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aPA" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/briefcase, -/obj/item/restraints/handcuffs, -/obj/item/grenade/smokebomb, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aPB" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket{ - desc = "All the class of a trenchcoat without the security fibers."; - icon_state = "greydet"; - name = "trenchcoat" - }, -/obj/item/clothing/suit/jacket{ - desc = "All the class of a trenchcoat without the security fibers."; - icon_state = "detective"; - name = "trenchcoat" - }, -/obj/item/clothing/head/fedora, -/obj/item/clothing/head/fedora{ - icon_state = "detective" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aPC" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) "aPG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23973,41 +25434,6 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) -"aQB" = ( -/obj/structure/table/wood, -/obj/item/crowbar/red, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/detective, -/obj/item/camera/detective, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"aQC" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aQD" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/starboard/aft) "aQG" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6 @@ -24332,19 +25758,6 @@ "aRz" = ( /turf/closed/wall, /area/maintenance/starboard) -"aRA" = ( -/obj/structure/barricade/wooden, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/aft) "aRB" = ( /obj/effect/turf_decal/bot, /obj/structure/table, @@ -24536,13 +25949,6 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"aRV" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/machinery/vending/games, -/turf/open/floor/plasteel/dark, -/area/library) "aRW" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -24731,13 +26137,6 @@ /obj/item/storage/pill_bottle/mutadone, /turf/open/floor/plasteel, /area/medical/chemistry) -"aSm" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/medical/chemistry) "aSn" = ( /obj/machinery/chem_dispenser, /obj/machinery/button/door{ @@ -24884,44 +26283,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) -"aSG" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/aft) "aSH" = ( /obj/structure/sign/poster/contraband/random, /turf/closed/wall, /area/maintenance/starboard) -"aSI" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/photocopier, -/obj/item/newspaper{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/newspaper, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aSJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood{ - icon_state = "wood-broken2" - }, -/area/maintenance/starboard/aft) -"aSK" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes/cigpack_uplift{ - pixel_x = 6 - }, -/obj/item/storage/fancy/cigarettes/cigpack_carp{ - pixel_x = -3 - }, -/obj/item/lighter, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aSM" = ( /obj/machinery/door/airlock/command{ name = "Telecomms Server Room"; @@ -25516,31 +26881,6 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"aTU" = ( -/obj/structure/table/wood, -/obj/item/poster/random_contraband{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/poster/random_contraband{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/poster/random_contraband, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aTV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/starboard/aft) -"aTW" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) "aTX" = ( /obj/machinery/light{ dir = 8 @@ -25691,16 +27031,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"aUm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "aUn" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -25763,22 +27093,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"aUu" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/chemistry) "aUv" = ( /obj/machinery/holopad, /obj/structure/cable/white{ @@ -25930,48 +27244,6 @@ }, /turf/closed/wall/r_wall, /area/science/research) -"aUJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/science/research) -"aUK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) -"aUL" = ( -/obj/structure/table/wood, -/obj/item/electronics/firelock, -/obj/item/electronics/airlock, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aUM" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aUN" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/maintenance/starboard/aft) "aUO" = ( /obj/structure/cable{ icon_state = "4-8" @@ -26429,50 +27701,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/research) -"aVF" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aVG" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, -/obj/structure/barricade/wooden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"aVH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken" - }, -/area/maintenance/starboard/aft) -"aVI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aVJ" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aVK" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -26921,28 +28149,6 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/science/research) -"aWw" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/electronics/airalarm, -/obj/item/electronics/airlock, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aWx" = ( -/obj/structure/table/wood, -/obj/item/stack/cable_coil/white, -/obj/item/stack/cable_coil/white, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/circuitboard/machine/microwave, -/turf/open/floor/wood, -/area/maintenance/starboard/aft) -"aWy" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase, -/obj/item/taperecorder, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aWz" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -27503,22 +28709,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"aXD" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "aXE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -27788,23 +28978,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) -"aXY" = ( -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone3) "aXZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/closet/crate/bin, @@ -28715,21 +29888,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) -"aZE" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone3) "aZF" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -28790,31 +29948,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) -"aZJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone3) "aZK" = ( /obj/machinery/holopad, /obj/structure/cable/white{ @@ -29166,50 +30299,12 @@ "baj" = ( /turf/closed/wall, /area/maintenance/port) -"bak" = ( -/turf/open/floor/plasteel/dark, -/area/maintenance/port) -"bal" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) "bam" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/maintenance/port) -"ban" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, -/obj/structure/barricade/wooden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/port) "bao" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -29428,20 +30523,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/zone3) -"baE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/zone3) "baF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue, @@ -29724,12 +30805,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/plating, /area/maintenance/port) -"bbd" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) "bbe" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -35801,11 +36876,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"bte" = ( -/obj/structure/window/reinforced/tinted/fulltile, -/obj/structure/grille, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "btk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -36084,12 +37154,6 @@ }, /turf/closed/wall/r_wall/rust, /area/tcommsat/server) -"bwX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) "bwY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -36443,70 +37507,6 @@ "bye" = ( /turf/closed/wall/rust, /area/maintenance/fore) -"byf" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall, -/area/maintenance/starboard/fore) -"byg" = ( -/obj/structure/closet/emcloset/anchored, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) -"byi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/fore) -"byj" = ( -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) -"byk" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) -"byl" = ( -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) "bym" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -36739,17 +37739,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"cKy" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/structure/cable/white, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/ai_monitored/nuke_storage) "cRz" = ( /obj/machinery/button/door{ id = "supplybridge"; @@ -37688,6 +38677,10 @@ /obj/machinery/atmospherics/miner/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) +"hQH" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall, +/area/quartermaster/storage) "hTn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/research/glass{ @@ -38292,14 +39285,6 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, /area/hallway/secondary/entry) -"lvt" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "lvw" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/effect/decal/cleanable/dirt, @@ -39045,10 +40030,6 @@ /obj/structure/flora/ausbushes/grassybush, /turf/open/floor/grass, /area/hallway/secondary/entry) -"pEH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/asteroid/nearstation) "pHH" = ( /obj/machinery/light, /obj/machinery/atmospherics/components/binary/valve{ @@ -39472,9 +40453,6 @@ "swz" = ( /turf/closed/wall/r_wall/rust, /area/crew_quarters/heads/hop) -"swA" = ( -/turf/closed/wall/rust, -/area/maintenance/starboard/fore) "swC" = ( /turf/closed/wall/r_wall/rust, /area/crew_quarters/heads/captain/private) @@ -39526,9 +40504,6 @@ "swZ" = ( /turf/closed/wall/r_wall/rust, /area/security/brig) -"sxc" = ( -/turf/closed/wall/r_wall/rust, -/area/asteroid/nearstation) "sxC" = ( /turf/closed/wall/r_wall/rust, /area/ai_monitored/turret_protected/ai) @@ -40221,12 +41196,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"sIA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/barricade/wooden, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/engine/engineering) "sIB" = ( /turf/closed/wall/rust, /area/hydroponics) @@ -40517,10 +41486,6 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/server) -"sJR" = ( -/obj/structure/sign/poster/contraband/random, -/turf/closed/wall/rust, -/area/maintenance/starboard/aft) "sJS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -70948,8 +71913,8 @@ tgp dgV fYx aCG -pEH -pEH +ajX +ajX qpG uBJ aIb @@ -70969,7 +71934,7 @@ aac aad aad aad -aac +bvg aac aaa aaa @@ -71205,8 +72170,8 @@ oCy orI xyo hNO -aad -acF +aaW +abu aGe aId aIc @@ -71225,10 +72190,10 @@ aad aad aad aad -aad -aad -aac -aac +baj +aqo +baj +baj aaa aaa aaa @@ -71462,8 +72427,8 @@ anx anx anx uok -aad -aad +akM +abu aGe aHg aId @@ -71483,9 +72448,9 @@ aMJ aMJ sJV aMJ -abu -aad -aad +aqx +awH +baj aaa aaa aaa @@ -71718,9 +72683,9 @@ uSs xIm rVj aAg -uok -aad -aad +akN +akO +anu aGe aGe sIu @@ -71740,9 +72705,9 @@ buJ buO sKn aMJ -acG -sxc -aad +atE +sKx +baj aac aaa aaa @@ -71975,11 +72940,11 @@ eva aqA qsc lUu -uok -aad -aad -afL -afM +akN +alE +anv +anK +aoo aGe aJk aKt @@ -71997,8 +72962,8 @@ buK sKj buR aMJ -afM -afL +avB +aOH aad aac aaa @@ -72232,12 +73197,12 @@ uSs xIm mgs aAg -uok -abi -aad -abT -agE -bwX +akN +amF +anw +anO +aop +aGe aJl aKu aLI @@ -72254,8 +73219,8 @@ buL buP buS aMJ -afM -aad +awB +baj aad aad aaa @@ -72489,11 +73454,11 @@ vVA anx anx anx -uok -aad -aad -abu -afL +akN +amU +anA +aon +apo sII aJm aKv @@ -72511,8 +73476,8 @@ buK sKj buR aMJ -aad -aad +awB +baj aad aad aaa @@ -72746,11 +73711,11 @@ dFV aAh aBp awA -uok -sHV -aEt -aEt -abu +akN +akS +alI +alI +apq bwY aJn aKw @@ -72768,8 +73733,8 @@ buN buQ buU sJV -agE -afL +awB +aOH aad aaa aaa @@ -73006,8 +73971,8 @@ aCs uok aEn aFq -aGf -sIA +amE +apr aIe abQ aKx @@ -73025,9 +73990,9 @@ sJV aMJ aMJ sJV -abi -ahu -sxc +awB +aOH +sKx aac aaa aaa @@ -73264,7 +74229,7 @@ uok aEo aFr aGg -aHi +aps aIf aJp aKy @@ -73281,10 +74246,10 @@ bvo aad bvo aad -abi -aad -aad -aac +baj +awE +awL +baj aac aac aac @@ -73538,10 +74503,10 @@ aUQ aVK aUQ aXc -aad -ahu -aad -aad +baj +aOH +axY +awG aac aac aac @@ -73796,10 +74761,10 @@ aVL aUR aUQ bvo -sxc -aad +sKx +awB +baj aac -bvI aad aac aad @@ -74053,9 +75018,9 @@ aUU aWz aVL bvo -ahu -bvg -bvg +aOH +axh +baj aad aad aad @@ -74266,7 +75231,7 @@ aad aad aad abi -abu +agK abu aad aad @@ -74310,10 +75275,10 @@ aUU aWz aUQ bvg -bvo -aad -aad -aad +baj +awB +baj +baj aad aad aad @@ -74567,10 +75532,10 @@ aUU aWz aVL bvg -bvg -aad -aad -aad +awG +awB +axj +baj aad aad aad @@ -74781,9 +75746,9 @@ aad aad aad adv +aaW abj -abj -abu +ahB abu acF pNE @@ -74824,10 +75789,10 @@ aUU aUU aUQ bvg -bvo -aad -aad -aad +baj +awB +axk +baj aad aad aad @@ -75081,10 +76046,10 @@ aUU aWz aVL bvg -aad -aad -aad -aad +baj +awB +aZo +baj aad aad aad @@ -75297,9 +76262,9 @@ abT abi aaV ajQ -abi -abT -acG +aro +aro +asm bko cWv cWv @@ -75338,10 +76303,10 @@ aUU aWz aUQ bvo -aad -aad -aad -aad +baj +awE +awL +baj aad aad aad @@ -75550,16 +76515,16 @@ aad aad aad aad -aad -aad -aad -aad -aad -aad -agE -abi -aad -abi +aaW +abj +abj +abu +arp +ars +ars +asu +asA +asD sAx arA asH @@ -75596,8 +76561,8 @@ aWz aVL bvo aOH -aZo baj +axl sKE baj aZo @@ -75807,16 +76772,16 @@ aad aad abi agE -aad -aad -aad -aad -afL -aad +abj abi aad aad -aaV +arq +art +ars +asy +ars +ars aqz aqz aqz @@ -75854,7 +76819,7 @@ aUQ aad sKx aZp -bak +bam bbc bbQ dEa @@ -76063,19 +77028,19 @@ aad aad aad aad -aad -aad -afL -aaV -ajQ -aik -afL -aad -aad -abi -afM -aqG -arB +abj +agF +agF +agF +agF +agF +agF +agF +agF +agF +ars +asE +ars asI atK auD @@ -76111,9 +77076,9 @@ aVL aad aOH aZq -bal -bbd -bbR +axn +axU +axX bcG bdE bev @@ -76320,15 +77285,15 @@ aad aad aad aad -afL -ahu +abu agF +apw +aqB +aqH agF -swZ -agF -agF -agF -swZ +aru +asn +asz agF agF agF @@ -76578,15 +77543,15 @@ aad aad abT agE -sxc -aim -aiR -ajR +swZ +apR +aqD +arn akT -alH -amH -any -aos +arB +asq +anC +aqQ akT aqI arD @@ -76625,7 +77590,7 @@ sJH aQU aQU aZs -ban +axL bap bbT bcI @@ -76832,15 +77797,15 @@ aad aad aad aad -aad +ahu afL -abj -sxc +aaW +swZ ain -aiS +aqG ajS akU -alI +asa amI anz aot @@ -77089,17 +78054,17 @@ aad aad aad aad -aad -afM -aaV ahu +abu +abj +agF aio aiT ajT akV alJ amJ -anA +aig aou akV aqK @@ -77112,7 +78077,7 @@ aqz axv ayn azu -aAw +akR aBE aCI aDx @@ -77122,7 +78087,7 @@ aGq aHx aIt aJC -aKJ +apt aLZ aNb aEt @@ -77346,8 +78311,8 @@ abi abi swN abi -abT -acG +agF +afT agF agF aip @@ -77603,10 +78568,10 @@ aaW abj adv ael -swN -abu agF -ahv +afU +ahz +aiu aiq aiV ajV @@ -77860,10 +78825,10 @@ abj abS abu acF -abi -afN -swZ -ahw +agF +agG +afU +aiv air aiW ajW @@ -77900,7 +78865,7 @@ aEt aYA aPT aQW -aRV +amH aTd aUe aUW @@ -78117,13 +79082,13 @@ abS acD acF aem -afb -adw -agF -ahx -ais +afg +afU +afU +agH +ahv aiX -ajX +agm akY alN amM @@ -78374,10 +79339,10 @@ abu acE adx acF -adz -adw agF -ahy +afU +ahC +aiR ait aiY ajY @@ -78434,11 +79399,11 @@ baj aad aad aad -abT -abT -swN -abT -abT +bfu +bfu +sLf +bfu +bfu aad aad aad @@ -78630,10 +79595,10 @@ aaW abu acF acF -aeo -abi acF agF +afe +agF swZ agF aiZ @@ -78885,13 +79850,13 @@ aad aad abi abi -acG +acJ adz swN -abi +abT acF -agG -ahz +ahD +aiS agF aja aka @@ -78901,7 +79866,7 @@ aka ala aoy apD -aqQ +asB arM asR agF @@ -79145,9 +80110,9 @@ abT acH adw aep -acF +afh aem -agH +afP ahA swZ ajb @@ -79182,7 +80147,7 @@ bxP geZ aNi anH -aOQ +apu aPY aQY aSa @@ -79398,15 +80363,15 @@ aad aad aad aad -abT -abT -abT -swN -swN -abT -abT -swN -agF +abU +abU +abU +abU +abU +abU +abU +abU +abU ajc ajc aip @@ -79438,7 +80403,7 @@ aIB aIB aIB aIB -aOe +aIB aOR aPZ aQZ @@ -79655,15 +80620,15 @@ aac aac aac aad -abv -acI -adA -aeq -afd -afP -agI -ahB -aiu +abU +acK +adD +adC +afb +agL +ahx +ajR +aqw ajd iaa alb @@ -79912,15 +80877,15 @@ aaa aaa aaa aaa -abU -acJ -adB -aer -afe -afQ -agJ -ahC -aiv +abV +acG +acL +adE +afd +agM +ahF +alH +ahy aje akd alc @@ -80169,15 +81134,15 @@ aac aac aad aad -swG -acK -adC +abU +acM +aeo aes -aff -afR -agK -ahD -aiw +afQ +afN +ahE +agI +aqy ajf ake ald @@ -80425,16 +81390,16 @@ aad aad aad aad -abv -abv -acL -adD -abv -afg -afS -agL -ahE -aiu +abU +abU +adA +aeq +aff +afi +ahw +aim +aid +aqw ajg akf oyD @@ -80682,16 +81647,16 @@ aad aad aad aad -abv -abV -acM -adE -abv -afh -afT -agM -ahF -afU +abU +acI +adB +aer +aff +afS +agJ +ais +aos +abU ajh akg ale @@ -80939,16 +81904,16 @@ aad aad aad aad -abv -abv -abv -abv -swG -afi -afU -afU -afU -afU +abU +abU +abU +abU +abU +afR +abU +abU +abU +abU aji akh alf @@ -80986,14 +81951,14 @@ aQe aRe aSg aTl -aUm +ail aVe aWa aWJ aSh aXQ aYI -aZE +ajG bav aSh bce @@ -82278,7 +83243,7 @@ aRf aXp aXU aYN -aZJ +ajN baA bbq bbq @@ -83042,7 +84007,7 @@ aQg aRh aSl aTs -aUu +aiJ aVl aWh aRh @@ -83297,17 +84262,17 @@ aOj aPf aQj aRi -aSm +aij aTt aUv aVm aWi aWN aXt -aXY +aiQ aYR aZN -baE +ajO bbt bcj bdb @@ -85568,7 +86533,7 @@ swy abF ack adc -cKy +adP aeE afr afr @@ -87905,7 +88870,7 @@ aww aum sDM ayT -azQ +aiw aAW aCf aCf @@ -88186,7 +89151,7 @@ aUF aVy aWq aWq -aXD +aiP aYo aZg aZZ @@ -88645,9 +89610,9 @@ aaa aae aaa aaa -aad -aah -aad +aac +abL +bxZ swz abs abs @@ -88901,13 +89866,13 @@ aaa aaa aae aad -aad -aad -aad -aad -swA -abL +aac +bvg +abM acu +adt +adM +aef adm bxw bym @@ -89160,11 +90125,11 @@ aah aad aad aad -aad -aad bxZ -abM -byi +adq +bxZ +adY +aei adn adn adn @@ -89417,14 +90382,14 @@ aad aad aad aad -aad -aad bxZ -byf -byj -adn -adZ -aeP +bxZ +adu +adu +aej +adu +aeV +afa afC agv ahk @@ -89676,19 +90641,19 @@ aac aad aad aad -swA -byg -byk -adn -aea +ady +adZ +aek aeQ +aeW +aeW +afc +afD +afJ +afK +afO afD agw -ajI -aid -aiJ -agw -afE afE amw anm @@ -89724,7 +90689,7 @@ aae aRy aSF aTS -aUJ +auh aVE sKh aVE @@ -89933,19 +90898,19 @@ aad aad aad aad -bxZ -byf -byl -swL -aed -aeT -afE -agx +adu +aea +aen +aeR +aeY ahl +ahm +ahn +aih ado aiK agx -afF +agy alB amx ado @@ -89975,16 +90940,16 @@ aRz sJd sJq aaa -bte -aPz -aPz -sOM -aSG +ata +atk +atk +abv +atB aTT -aUK -aVF +aur +auy sOZ -sPa +awD sOT sPk aZl @@ -90190,19 +91155,19 @@ aaa aad aad aad -bvg -bvg -bvg -adn +adu +aeb +aeP +adu aec aeS afF agx -ahm +aii adp aiL ajJ -akM +agD alC amy adn @@ -90232,16 +91197,16 @@ sIU sJe sIU aae -bte -aPA -aQB -sOM -sJR -sON -sOY -aVG -sJR -sOM +ata +atr +atu +abv +swG +swG +aus +auz +avC +abv sOY sOV aZm @@ -90447,19 +91412,19 @@ aaa aaa aac aac -aac -bvg -aad -adn +adu +adu +adu +adu aed aeT afG agz -ahn +akQ aie aiM ajK -akN +ahs alD amz ann @@ -90489,16 +91454,16 @@ sIU sJe sIU aaa -bte -aPB -aQC -sOM -aSI -aTU -aUL -aVH -aWw -sOM +ata +ats +atv +atz +atC +atG +aut +avm +avD +abv sPi aYv die @@ -90716,8 +91681,8 @@ aho aif aiN ajL -akO -alE +aht +ahW amA ano aog @@ -90746,16 +91711,16 @@ sIU sJg sIU aae -bte -aPC -aQD -aRA -aSJ -aTV -aUM -aVI -aWx -sOM +ata +att +atw +atA +atD +atH +auu +avz +avF +abv sON tms hXc @@ -91003,16 +91968,16 @@ sJN cRz abN aaa -bte -aPz -aPz -sOM -aSK -aTW -aUN -aVJ -aWy -sOM +ata +atk +atk +abv +any +atJ +aux +avA +avH +abv aad orV iio @@ -91224,7 +92189,7 @@ aac swM aeh agB -ado +adn agB ahq adp @@ -91263,13 +92228,13 @@ aae aae aae aae -sON -aRy -aRy -aRy -aRy -aRy -sON +swG +atF +atF +atF +atF +atF +swG aad hns iXB @@ -91478,13 +92443,13 @@ aaa aaa aaa aaa -adq +ado aeg aeX -adp +hQH agC ahr -lvt +ado aae aae aae @@ -91531,7 +92496,7 @@ aad hns xLe hVE -sPq +ajP hVE pXH sVt diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index fc5f6e9778..18d1b115a4 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -46,13 +46,13 @@ /area/engine/engineering) "aag" = ( /obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plating, /area/engine/engineering) "aah" = ( @@ -2285,7 +2285,7 @@ /turf/open/floor/plasteel, /area/security/prison) "ahb" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/prison{ dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -4058,6 +4058,7 @@ pixel_y = -3 }, /obj/item/gun/energy/e_gun/advtaser, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/dark, /area/security/armory) "akM" = ( @@ -4719,9 +4720,13 @@ /area/security/warden) "aml" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-8" }, -/turf/closed/wall/r_wall, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, /area/security/warden) "amm" = ( /obj/structure/cable{ @@ -5124,14 +5129,25 @@ dir = 8; pixel_x = 28 }, -/turf/open/floor/plasteel/showroomfloor, -/area/security/warden) -"ana" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"ana" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/brig) "anb" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5333,19 +5349,19 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/brig) -"anB" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, +/turf/open/floor/plasteel, +/area/security/brig) +"anB" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plating, /area/security/warden) "anC" = ( @@ -5394,17 +5410,22 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "anK" = ( /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/security/warden) "anL" = ( @@ -5671,6 +5692,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "aop" = ( @@ -5896,11 +5920,10 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "aoQ" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/security/warden) "aoR" = ( @@ -5958,6 +5981,9 @@ /obj/item/crowbar, /obj/item/wrench, /obj/item/laser_pointer/red, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aoY" = ( @@ -5965,14 +5991,17 @@ /obj/machinery/light_switch{ pixel_y = -22 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "aoZ" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/security/warden) "apa" = ( @@ -6266,32 +6295,22 @@ /turf/open/floor/plasteel, /area/security/brig) "apI" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-2" }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/closed/wall/r_wall, +/obj/structure/cable, +/turf/open/floor/plating, /area/security/warden) "apJ" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/warden) "apK" = ( /obj/structure/table/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/door/window/brigdoor{ dir = 1; name = "Armory Desk"; @@ -6311,14 +6330,11 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apL" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/warden) "apM" = ( @@ -6326,26 +6342,44 @@ name = "Brig Control"; req_access_txt = "3" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall/r_wall, -/area/security/warden) -"apO" = ( /obj/structure/cable{ icon_state = "1-8" }, -/turf/closed/wall/r_wall, -/area/security/warden) +/turf/open/floor/plasteel, +/area/security/brig) +"apO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "apP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -6501,12 +6535,12 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/security/brig) "aqo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -6519,6 +6553,12 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqp" = ( @@ -6546,12 +6586,21 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqr" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqs" = ( @@ -6562,6 +6611,12 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqt" = ( @@ -6574,6 +6629,12 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqu" = ( @@ -6582,6 +6643,9 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "aqv" = ( @@ -7533,6 +7597,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "asx" = ( @@ -7552,6 +7619,12 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/security/brig) "asy" = ( @@ -7577,10 +7650,16 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "asA" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "asB" = ( @@ -7597,6 +7676,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "asC" = ( @@ -7994,31 +8076,34 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/brig) "aty" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "2-8" }, -/turf/closed/wall, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, /area/security/brig) "atz" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable, /turf/open/floor/plating, /area/security/brig) "atA" = ( @@ -8026,9 +8111,6 @@ id = "Cell 2"; name = "Cell 2" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -8036,19 +8118,19 @@ /turf/open/floor/plasteel, /area/security/brig) "atB" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall, +/turf/open/floor/plasteel, /area/security/brig) "atC" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 3"; name = "Cell 3" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -8056,14 +8138,12 @@ /turf/open/floor/plasteel, /area/security/brig) "atD" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/brig) "atE" = ( @@ -8073,9 +8153,6 @@ name = "Brig"; req_access_txt = "63" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/red{ @@ -8087,13 +8164,11 @@ /turf/open/floor/plasteel, /area/security/brig) "atF" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/structure/cable{ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, /turf/open/floor/plating, /area/security/brig) "atG" = ( @@ -8507,6 +8582,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "auA" = ( @@ -8964,6 +9042,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "avv" = ( @@ -8995,6 +9076,9 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "avy" = ( @@ -9026,6 +9110,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "avB" = ( @@ -9106,7 +9193,7 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/heads/captain) "avK" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /turf/open/floor/plasteel/freezer, @@ -9605,18 +9692,21 @@ /turf/open/floor/plating, /area/security/brig) "awK" = ( -/obj/structure/cable{ - icon_state = "0-4" +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "2-4" }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/brig) "awL" = ( /obj/machinery/door/firedoor, @@ -9628,9 +9718,6 @@ name = "Brig"; req_access_txt = "63" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -9641,9 +9728,6 @@ /turf/open/floor/plasteel, /area/security/brig) "awM" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; @@ -14667,7 +14751,7 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "aIl" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 8 }, /obj/machinery/light/small{ @@ -16490,7 +16574,7 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/cafeteria/lunchroom) "aNc" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /obj/effect/landmark/start/assistant, @@ -20032,20 +20116,6 @@ /obj/machinery/conveyor_switch/oneway{ id = "QMLoad" }, -/obj/machinery/button/door{ - id = "QMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_x = 24; - pixel_y = -8 - }, -/obj/machinery/button/door{ - id = "QMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_x = 24; - pixel_y = 8 - }, /obj/machinery/camera{ c_tag = "Cargo Supply Dock"; dir = 8 @@ -21324,7 +21394,7 @@ "aYm" = ( /obj/structure/closet/crate/wooden/toy, /obj/item/lipstick/random, -/obj/item/clothing/gloves/color/rainbow/clown, +/obj/item/clothing/gloves/color/rainbow, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -21484,6 +21554,20 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/button/door{ + id = "QMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = -8 + }, +/obj/machinery/button/door{ + id = "QMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = 8 + }, /turf/open/floor/plasteel, /area/quartermaster/storage) "aYC" = ( @@ -23111,7 +23195,7 @@ name = "Hydroponics Desk"; req_access_txt = "35" }, -/obj/item/reagent_containers/food/snacks/monkeycube, +/obj/item/reagent_containers/food/snacks/cube/monkey, /turf/open/floor/plasteel/dark, /area/hydroponics) "bce" = ( @@ -34230,6 +34314,10 @@ "bBC" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, /turf/open/floor/engine, /area/science/storage) "bBD" = ( @@ -34239,25 +34327,25 @@ /turf/open/floor/engine, /area/science/storage) "bBE" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/delivery, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/sign/poster/random{ + pixel_y = 32 }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) "bBF" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/machinery/airalarm{ - pixel_y = 22 - }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) "bBG" = ( /obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, /turf/open/floor/engine, /area/science/storage) "bBH" = ( @@ -34437,8 +34525,8 @@ /area/maintenance/department/engine) "bBY" = ( /obj/structure/closet/crate/medical, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, /turf/open/floor/plating, /area/maintenance/department/engine) "bBZ" = ( @@ -34967,11 +35055,9 @@ /turf/open/floor/plating, /area/science/storage) "bCQ" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) "bCR" = ( @@ -35392,22 +35478,19 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bDL" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, /turf/open/floor/engine, /area/science/storage) "bDM" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/storage) "bDN" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/science/storage) "bDO" = ( @@ -36191,20 +36274,18 @@ /area/hallway/primary/aft) "bFa" = ( /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/engine, /area/science/storage) "bFb" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/bot, -/turf/open/floor/engine, -/area/science/storage) -"bFc" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 5 }, /turf/open/floor/engine, /area/science/storage) @@ -36264,7 +36345,6 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bFl" = ( -/obj/machinery/portable_atmospherics/pump, /turf/open/floor/plasteel/white, /area/science/mixing) "bFm" = ( @@ -36305,6 +36385,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 + }, /turf/open/floor/plasteel/dark, /area/science/mixing) "bFr" = ( @@ -36646,25 +36729,24 @@ /area/hallway/primary/aft) "bGf" = ( /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/engine, /area/science/storage) "bGg" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/bot, -/turf/open/floor/engine, -/area/science/storage) -"bGh" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /turf/open/floor/engine, /area/science/storage) +"bGh" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/storage) "bGi" = ( /obj/structure/cable{ icon_state = "1-2" @@ -36696,11 +36778,11 @@ /turf/open/floor/plasteel/dark, /area/science/explab) "bGl" = ( -/obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/structure/closet/firecloset, /turf/open/floor/plasteel/dark, /area/science/explab) "bGm" = ( @@ -36809,7 +36891,6 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bGr" = ( -/obj/structure/tank_dispenser, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -36817,6 +36898,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/portable_atmospherics/pump, /turf/open/floor/plasteel/white, /area/science/mixing) "bGs" = ( @@ -37352,8 +37434,9 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/sign/poster/random{ - pixel_x = 32 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, /turf/open/floor/engine, /area/science/storage) @@ -37906,51 +37989,56 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "bIF" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "Toxins Storage APC"; - pixel_x = -25 +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/machinery/light, /turf/open/floor/engine, /area/science/storage) "bIG" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/engine, /area/science/storage) "bIH" = ( -/obj/machinery/light, /obj/structure/cable{ icon_state = "4-8" }, /obj/effect/turf_decal/stripes/line, +/obj/machinery/power/apc{ + name = "Toxins Storage APC"; + pixel_y = -25 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/engine, /area/science/storage) "bII" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = -32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, +/obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) "bIJ" = ( /obj/structure/cable{ icon_state = "1-8" }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light, /turf/open/floor/engine, /area/science/storage) "bIK" = ( @@ -38904,6 +38992,8 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/atmos) "bKT" = ( @@ -38922,6 +39012,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bKU" = ( @@ -38969,9 +39063,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bKW" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-8" }, @@ -38984,11 +39075,15 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bKX" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 0; + name = "Mix to Engine" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -39007,10 +39102,10 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bKZ" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) "bLa" = ( @@ -39393,6 +39488,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bLZ" = ( @@ -39464,6 +39562,7 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 4 }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bMf" = ( @@ -39473,6 +39572,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bMh" = ( @@ -39487,6 +39589,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bMi" = ( @@ -39927,53 +40032,49 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bNd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bNe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 }, /turf/open/floor/plasteel, /area/engine/atmos) "bNf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/item/beacon, /turf/open/floor/plasteel, /area/engine/atmos) "bNg" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Air to Distro" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 }, /turf/open/floor/plasteel, /area/engine/atmos) "bNh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Ports" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bNi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bNj" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Ports" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bNk" = ( @@ -39983,13 +40084,13 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bNl" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bNm" = ( @@ -40137,7 +40238,7 @@ }, /area/maintenance/department/chapel/monastery) "bNF" = ( -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/plasteel/dark, /area/maintenance/department/engine) "bNG" = ( @@ -40380,81 +40481,75 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bOj" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring"; - req_access_txt = "24" - }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bOk" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bOl" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 + dir = 10 + }, +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bOm" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/atmos) "bOn" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bOo" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Port" - }, +/obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bOp" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Pure to Mix" - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bOq" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ +/obj/machinery/atmospherics/components/binary/pump{ dir = 1; - name = "Unfiltered to Mix" + name = "Pure to Mix" }, /turf/open/floor/plasteel, /area/engine/atmos) "bOr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/engine/atmos) "bOs" = ( /obj/structure/sign/warning/fire, @@ -40657,133 +40752,65 @@ /area/engine/atmos) "bOQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 10 }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bOR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plating, /area/engine/atmos) "bOS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics Monitoring"; - dir = 1 - }, -/obj/machinery/space_heater, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/vg_decals/atmos/mix, +/turf/open/floor/engine/vacuum, /area/engine/atmos) "bOT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bOU" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Filter" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "bOV" = ( -/obj/structure/table, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/head/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/multitool{ - layer = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bOW" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/storage/belt/utility, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to External" }, /turf/open/floor/plasteel, /area/engine/atmos) "bOX" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/sheet/glass, -/obj/item/stack/rods/fifty, -/obj/item/pipe_dispenser, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bOY" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "bOZ" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 }, /turf/open/floor/plasteel, /area/engine/atmos) "bPa" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bPb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Port" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bPc" = ( -/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bPd" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -40796,14 +40823,15 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPf" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) "bPg" = ( @@ -41021,60 +41049,76 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPO" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPP" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPQ" = ( /turf/closed/wall, /area/engine/atmos) "bPR" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste In" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/atmos) "bPS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics Central"; + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bPT" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Port" - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" }, /turf/open/floor/plasteel, /area/engine/atmos) "bPU" = ( /obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Port" + name = "Air to Ports" }, /turf/open/floor/plasteel, /area/engine/atmos) "bPV" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPW" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPX" = ( @@ -41089,6 +41133,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bPY" = ( @@ -41103,14 +41148,14 @@ /turf/open/floor/engine/n2o, /area/engine/atmos) "bQa" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/atmospherics/miner/n2o, +/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, /turf/open/floor/engine/n2o, /area/engine/atmos) "bQb" = ( /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/n2o, /turf/open/floor/engine/n2o, /area/engine/atmos) "bQc" = ( @@ -41413,10 +41458,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bQF" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/effect/landmark/start/atmospheric_technician, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, @@ -41426,54 +41467,48 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bQG" = ( -/obj/machinery/computer/atmos_control{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/atmos) "bQH" = ( -/obj/machinery/pipedispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engine/atmos) "bQI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, /area/engine/atmos) "bQJ" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Ports to Filter" }, /turf/open/floor/plasteel, /area/engine/atmos) "bQK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bQL" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bQM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bQN" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - dir = 1 +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Unfiltered to Mix" }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -41747,105 +41782,88 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bRr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/window/northleft{ - dir = 4; - name = "Atmospherics Desk"; - req_access_txt = "24" - }, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "atmospherics security door" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/turf/closed/wall/r_wall, /area/engine/atmos) "bRs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/effect/landmark/start/atmospheric_technician, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/tank_dispenser, /turf/open/floor/plasteel, /area/engine/atmos) "bRt" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) "bRu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bRw" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bRx" = ( +/obj/machinery/computer/atmos_control, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bRy" = ( +/obj/structure/closet/secure_closet/atmospherics, /obj/machinery/requests_console{ department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30 }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRv" = ( -/obj/machinery/pipedispenser/disposal, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Atmospherics Central"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRx" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bRy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/atmos) "bRz" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/holopad, /turf/open/floor/plasteel, /area/engine/atmos) "bRA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/chair/office/dark{ + dir = 1 }, -/obj/machinery/meter, +/obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) "bRB" = ( @@ -41856,6 +41874,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bRC" = ( @@ -42094,6 +42113,11 @@ id = "atmos"; name = "atmospherics security door" }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Atmospherics Desk"; + req_access_txt = "24" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSb" = ( @@ -42106,76 +42130,70 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/conveyor_switch{ + id = "atmosdeliver" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSc" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2; - sortType = 6 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/engine/atmos) "bSd" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bSe" = ( +/obj/machinery/suit_storage_unit/atmos, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSe" = ( -/obj/machinery/pipedispenser/disposal/transit_tube, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSf" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/item/wrench, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bSg" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/engine/atmos) "bSh" = ( -/obj/machinery/camera{ - c_tag = "Atmospherics Starboard"; - dir = 8 - }, /obj/machinery/atmospherics/components/binary/pump{ dir = 8; name = "Plasma Outlet Pump" }, /obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bSi" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/atmos) "bSj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ dir = 8; @@ -42447,31 +42465,42 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bSR" = ( -/obj/machinery/light{ - dir = 8 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Filter" - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) "bSS" = ( -/obj/item/beacon, +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/atmospheric_technician, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bST" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bSU" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 8 + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -42487,6 +42516,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bSW" = ( @@ -42496,14 +42526,14 @@ /turf/open/floor/engine/plasma, /area/engine/atmos) "bSX" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/machinery/atmospherics/miner/toxins, +/obj/effect/turf_decal/vg_decals/atmos/plasma, /turf/open/floor/engine/plasma, /area/engine/atmos) "bSY" = ( /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos) "bSZ" = ( @@ -42839,19 +42869,22 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bTI" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bTJ" = ( @@ -42864,6 +42897,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bTK" = ( @@ -42885,6 +42921,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/pipedispenser, /turf/open/floor/plasteel, /area/engine/atmos) "bTL" = ( @@ -42900,90 +42937,76 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/pipedispenser/disposal, /turf/open/floor/plasteel, /area/engine/atmos) "bTM" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = 30; - pixel_y = 26 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank/high, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/fireaxecabinet{ - pixel_y = 32 + pixel_x = -32 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/camera{ - c_tag = "Atmospherics Mixing" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTR" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTS" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bTT" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bTU" = ( +"bTN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bTO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/atmos) +"bTP" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ dir = 1 }, +/obj/machinery/camera{ + c_tag = "Atmospherics Starboard"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bTQ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "atmospherics security door" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bTR" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bTS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bTT" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bTV" = ( @@ -43015,7 +43038,7 @@ /area/maintenance/department/engine) "bUb" = ( /obj/structure/grille/broken, -/obj/structure/piano, +/obj/structure/musician/piano, /turf/open/floor/plating, /area/maintenance/department/engine) "bUc" = ( @@ -43130,9 +43153,6 @@ /obj/machinery/camera{ c_tag = "Engineering Access" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_y = 24 @@ -43156,89 +43176,86 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bUp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bUq" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bUr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bUs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "O2 to Pure" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bUt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bUu" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUv" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "incinerator mix pump" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bUw" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 + dir = 5 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bUx" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ +"bUv" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bUw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) "bUy" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bUz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/engine/atmos) "bUA" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 10 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "bUC" = ( /obj/structure/flora/ausbushes/fernybush, /turf/open/floor/plating/asteroid, @@ -43530,12 +43547,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bVc" = ( @@ -43547,10 +43564,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel, /area/engine/atmos) "bVd" = ( @@ -43580,35 +43595,42 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bVg" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engine/atmos) "bVh" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 6 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bVi" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/engine/atmos) "bVj" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/obj/machinery/atmospherics/components/binary/pump{ + name = "incinerator mix pump" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bVk" = ( @@ -43620,24 +43642,25 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bVl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) "bVm" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/atmos) "bVn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{ dir = 8 @@ -43925,44 +43948,21 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"bVV" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Waste to Space" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bVW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bVX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) "bVY" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "O2 to Pure" +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) "bVZ" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWa" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2 to Pure" +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -43974,6 +43974,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bWc" = ( @@ -43981,24 +43982,19 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) -"bWd" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/turf/open/space, -/area/space/nearstation) "bWe" = ( /obj/machinery/air_sensor/atmos/carbon_tank, /turf/open/floor/engine/co2, /area/engine/atmos) "bWf" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/miner/carbon_dioxide, +/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "bWg" = ( /obj/machinery/light/small{ dir = 4 }, +/obj/machinery/atmospherics/miner/carbon_dioxide, /turf/open/floor/engine/co2, /area/engine/atmos) "bWh" = ( @@ -44315,43 +44311,34 @@ /area/engine/break_room) "bWI" = ( /obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bWJ" = ( /obj/machinery/portable_atmospherics/pump, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/plasteel, /area/engine/atmos) -"bWK" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWL" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "bWM" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bWN" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) "bWO" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bWP" = ( @@ -44362,8 +44349,8 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bWQ" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 10 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -44375,14 +44362,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plating, /area/engine/atmos) -"bWS" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/turf/open/space, -/area/space/nearstation) "bWT" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{ dir = 8 @@ -44561,11 +44540,13 @@ /area/engine/engineering) "bXr" = ( /obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Waste to Space" + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXs" = ( @@ -44574,14 +44555,22 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXt" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXu" = ( @@ -44592,6 +44581,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXv" = ( @@ -44600,6 +44592,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXw" = ( @@ -44608,7 +44603,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plasteel, /area/engine/atmos) "bXx" = ( @@ -44619,6 +44617,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "bXy" = ( @@ -44629,17 +44630,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/atmos) -"bXz" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos) "bXA" = ( @@ -44670,6 +44661,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bXD" = ( @@ -44686,7 +44678,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bXE" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, @@ -44697,6 +44688,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bXF" = ( @@ -44710,15 +44702,13 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel, /area/engine/atmos) "bXG" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 6 - }, /turf/closed/wall/r_wall, /area/engine/atmos) "bXI" = ( @@ -44915,17 +44905,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) -"bYq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/plating, -/area/engine/atmos) "bYs" = ( /obj/machinery/atmospherics/pipe/simple/green/hidden{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "bYt" = ( @@ -44936,9 +44920,6 @@ /turf/closed/wall, /area/maintenance/disposal/incinerator) "bYu" = ( -/obj/machinery/atmospherics/pipe/simple/green/hidden{ - dir = 9 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -44946,9 +44927,16 @@ name = "Incinerator"; req_access_txt = "24" }, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "bYv" = ( +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + dir = 9 + }, /turf/closed/wall, /area/maintenance/disposal/incinerator) "bYw" = ( @@ -45347,16 +45335,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"bZd" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/space, -/area/space/nearstation) -"bZe" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/space, -/area/space/nearstation) "bZf" = ( /obj/machinery/power/apc{ dir = 8; @@ -45396,6 +45374,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/purple/visible, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "bZh" = ( @@ -45414,7 +45393,6 @@ /area/maintenance/disposal/incinerator) "bZi" = ( /obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/purple/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -45563,10 +45541,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "bZK" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ dir = 1 }, -/turf/open/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/open/space, /area/engine/atmos) "bZL" = ( /obj/machinery/atmospherics/pipe/simple, @@ -45607,6 +45587,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "bZQ" = ( @@ -45626,11 +45609,14 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/purple/visible{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "bZR" = ( /obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 5 + dir = 4 }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) @@ -46083,16 +46069,14 @@ /turf/open/floor/engine/n2, /area/engine/atmos) "cbt" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/miner/nitrogen, +/obj/effect/turf_decal/vg_decals/atmos/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "cbu" = ( /turf/open/floor/engine/o2, /area/engine/atmos) "cbv" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/atmospherics/miner/oxygen, +/obj/effect/turf_decal/vg_decals/atmos/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "cbw" = ( @@ -46100,8 +46084,8 @@ /turf/open/floor/engine/air, /area/engine/atmos) "cbx" = ( -/obj/machinery/portable_atmospherics/canister/air, /obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/vg_decals/atmos/air, /turf/open/floor/engine/air, /area/engine/atmos) "cby" = ( @@ -46302,10 +46286,12 @@ /area/engine/engineering) "ccm" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/miner/nitrogen, /turf/open/floor/engine/n2, /area/engine/atmos) "ccn" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/miner/oxygen, /turf/open/floor/engine/o2, /area/engine/atmos) "cco" = ( @@ -47393,7 +47379,7 @@ /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "cgO" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /obj/machinery/light/small{ @@ -47734,7 +47720,7 @@ /turf/open/floor/plasteel/grimy, /area/chapel/main/monastery) "ciq" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ pixel_y = 8 }, /turf/open/floor/plasteel/showroomfloor, @@ -50010,15 +49996,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqG" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cqH" = ( @@ -52427,6 +52413,23 @@ }, /turf/open/floor/plasteel/dark, /area/library) +"cBi" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/armory) "cBk" = ( /obj/machinery/vending/boozeomat/pubby_maint, /turf/closed/wall, @@ -52603,12 +52606,6 @@ /obj/machinery/status_display/ai, /turf/closed/wall/r_wall, /area/engine/supermatter) -"cCO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/security/brig) "cCP" = ( /obj/effect/turf_decal/bot/right, /turf/open/floor/plasteel/white, @@ -53150,6 +53147,9 @@ dir = 1; pixel_y = -22 }, +/obj/structure/reflector/double/anchored{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "dFJ" = ( @@ -53190,7 +53190,9 @@ /area/medical/chemistry) "dJk" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, /turf/open/floor/plating, /area/engine/atmos) "dJm" = ( @@ -53893,12 +53895,6 @@ }, /turf/open/floor/wood, /area/lawoffice) -"fuR" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "fvb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -54715,10 +54711,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "hjk" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/plasteel, /area/engine/atmos) "hjD" = ( @@ -54732,6 +54727,17 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) +"hka" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera{ + c_tag = "Atmospherics Console"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "hkQ" = ( /obj/machinery/light{ dir = 4 @@ -55284,6 +55290,9 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ivO" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /mob/living/simple_animal/bot/secbot{ arrest_type = 1; health = 45; @@ -55547,6 +55556,23 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"jen" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "jeq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55660,6 +55686,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"juw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/armory) "jvi" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55700,6 +55733,20 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"jxK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "jzz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -55790,10 +55837,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"jLW" = ( -/obj/machinery/atmospherics/pipe/simple/purple/visible, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) "jOB" = ( /turf/open/floor/plating, /area/storage/emergency/starboard) @@ -55915,6 +55958,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/chemistry) +"kas" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/atmos) "kaR" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 8 @@ -55939,7 +55992,7 @@ /turf/open/floor/carpet, /area/chapel/office) "kgR" = ( -/obj/structure/toilet{ +/obj/structure/toilet/secret/low_loot{ dir = 4 }, /turf/open/floor/plating, @@ -56442,12 +56495,6 @@ /obj/machinery/atmospherics/pipe/manifold/general/visible, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"lhP" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "liR" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -56462,12 +56509,6 @@ /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/plating, /area/maintenance/department/cargo) -"ljG" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "lms" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -56503,6 +56544,16 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"loL" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 4; + filter_type = "n2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) "lqc" = ( /obj/item/toy/gun, /obj/effect/decal/cleanable/oil, @@ -57039,6 +57090,13 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plating, /area/security/execution/transfer) +"mzE" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/science/storage) "mzU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -57668,6 +57726,7 @@ /area/maintenance/department/science) "odM" = ( /obj/effect/landmark/barthpot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, /area/library/lounge) "oep" = ( @@ -58219,6 +58278,15 @@ }, /turf/open/floor/plating, /area/security/execution/transfer) +"pfB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/armory) "pfP" = ( /obj/structure/table, /obj/item/storage/box/syringes, @@ -58271,14 +58339,17 @@ /turf/open/floor/plating, /area/chapel/office) "plA" = ( -/obj/structure/piano, +/obj/structure/musician/piano, /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) "pmB" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible{ +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "N2 to Pure" + }, /turf/open/floor/plasteel, /area/engine/atmos) "pnU" = ( @@ -58403,9 +58474,6 @@ /turf/open/space/basic, /area/space/nearstation) "pCo" = ( -/obj/structure/reflector/single/anchored{ - dir = 6 - }, /obj/machinery/light/small{ dir = 1 }, @@ -59072,6 +59140,22 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"rdB" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "reH" = ( /obj/item/reagent_containers/food/drinks/bottle/vodka, /obj/structure/disposalpipe/segment{ @@ -59138,6 +59222,18 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"rjF" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/brig) "rmC" = ( /turf/open/space/basic, /area/space/station_ruins) @@ -59345,6 +59441,13 @@ }, /turf/open/floor/plating/airless, /area/maintenance/department/engine) +"rNi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/pipedispenser/disposal/transit_tube, +/turf/open/floor/plasteel, +/area/engine/atmos) "rNB" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -59772,13 +59875,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"tbw" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/space, -/area/space/nearstation) "tbF" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -59921,10 +60017,10 @@ /turf/open/floor/engine, /area/engine/engineering) "tlV" = ( -/obj/structure/reflector/double/anchored{ - dir = 9 +/obj/structure/reflector/single/anchored{ + dir = 6 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "tnP" = ( /obj/machinery/seed_extractor, @@ -60070,13 +60166,6 @@ /obj/item/wrench, /turf/open/floor/plating, /area/maintenance/department/cargo) -"tDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Engine" - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "tHk" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -60127,6 +60216,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"tTZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/brig) "tXn" = ( /obj/structure/sink{ dir = 4; @@ -60772,19 +60874,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"vsG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Research Lab Maintenance"; - req_one_access_txt = "7;29" - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "vsJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -61345,13 +61434,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"wJP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/purple/visible{ - dir = 9 - }, -/turf/open/space, -/area/space/nearstation) "wKa" = ( /obj/machinery/light/small, /turf/open/floor/plating, @@ -61367,12 +61449,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/cmo) -"wLK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "wMF" = ( /obj/effect/spawner/lootdrop/three_course_meal, /obj/effect/spawner/lootdrop/three_course_meal, @@ -61841,6 +61917,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"xEx" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/storage) "xFl" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/tcommsat/server"; @@ -83189,7 +83271,7 @@ amf amR anA aoo -aoo +ana aoo aqn arl @@ -83197,7 +83279,7 @@ asw atx auz avu -awJ +rjF axG ayH aAe @@ -83445,16 +83527,16 @@ alx amg amg anB -ana +amg aoQ -apI +amg aqo alv asx -aty ajM ajM -atB +ajM +akA axH ayI aAf @@ -83705,13 +83787,13 @@ anC aop aoR apJ -aqp +apN aon -asy +aty atz aux avv -awK +awI axG ayL aAi @@ -83964,7 +84046,7 @@ aoS apJ aqq aon -asv +atB atA auA avw @@ -84221,11 +84303,11 @@ aoT apK aqr arl -asw -atx +awK +atD auz avx -awJ +rjF axG ayJ aAg @@ -84469,7 +84551,7 @@ aiL ajg ajP akL -alA +cBi amh amV anF @@ -84479,10 +84561,10 @@ apL aqs aon asz -atB ajM ajM -atB +ajM +akA axI ayL aAh @@ -84726,7 +84808,7 @@ aiM aiM ajQ akM -akM +juw ami amW anG @@ -84735,11 +84817,11 @@ aoV apJ aqt arm -asy +rdB atz aux avy -awK +awI axG ayL aAi @@ -85240,20 +85322,20 @@ aiN aji ajS akO -akO +pfB amk amY anI aor aoX -apJ -aqt +apI +apO aro -asw +jen atD auz avA -awJ +rjF axG ayL aAi @@ -85498,19 +85580,19 @@ ajj ajT akP alA -amj +aml amZ anJ amX aoY -apN +amg sBA arp asB -atB ajM ajM -atB +ajM +akA axJ ayL aAi @@ -85755,15 +85837,15 @@ ahL ahL ahL ahL -aml -ana +amg +amg anK aos aoZ -apO +amg aqv aro -asw +jxK atE auB avB @@ -86020,7 +86102,7 @@ apa agP aqw arp -asC +tTZ atF alv alv @@ -86538,7 +86620,7 @@ asE ajM auD avC -ajM +akA axJ axG aAm @@ -87566,7 +87648,7 @@ asG ajM auH avG -auH +awR axM ayR aAo @@ -89104,7 +89186,7 @@ apj ajM ajM ajM -cCO +ajM ajM ajM avL @@ -94044,7 +94126,7 @@ jZG bpY bpY bpY -vsG +bNZ bva bva bva @@ -94076,7 +94158,7 @@ bXk pCo wcs wcs -tlV +wcs eyj qkM miw @@ -94330,7 +94412,7 @@ bZA cam mgz aac -cbX +tlV wcs wcs dEy @@ -94592,7 +94674,7 @@ oHa eWi cbX aac -vlC +loL cgx qeY fyO @@ -96118,7 +96200,7 @@ bRq bCC bSP bTG -bUo +bTQ bVc bUo bWH @@ -96634,7 +96716,7 @@ bLW bTH bUp bVe -bVV +bUp bWI bXr bKQ @@ -96884,14 +96966,14 @@ bMZ bOh bOP bPO -bPO +bRz bRt bSc bSQ bTI bUq bVf -bQI +bMf bWJ bXs bJN @@ -97144,12 +97226,12 @@ bPP bQG bRu bSd -bLW +bTO bTJ bMf -bUs bMf -fuR +bMf +bMf bXt bYp eAZ @@ -97396,17 +97478,17 @@ bJN bJN bNb bOj -bOR -bJN -bJN -bJN -bJN +bPQ +bRx +bRA +bSS +bST bJN bTK -bUr -bVg -bVW -bWL +bMf +bMf +bMf +bMf bXu bLW cui @@ -97653,19 +97735,19 @@ bJN bLY bNc bOk -bOS bPQ +bRy +hka bQH -bRv bSe bPQ bTL -bUs bMf -bVX +bMf +bMf bWM bXv -bWc +bVh poP bZL caB @@ -97912,18 +97994,18 @@ bNd bOl bOT bPR +bPQ +bPQ bQI -bQI -bQI -bQI -bTM -bUs -ljG +bPQ +rNi +bMf +bMf hjk pmB bXw dJk -tbw +cui bJP bJP bJP @@ -98169,18 +98251,18 @@ bNe bOm bOU bPS -bPS -bRw -bMf -bMf +bSf +bUp +bTM +bUp bTN -bUt -wLK -bOk -bWK -bXt +bMf +bMf +bVZ +bOX +bUA bYp -bZd +eAZ bZL caC cbu @@ -98423,21 +98505,21 @@ bJL bKR bMb bNf -bOk +bQJ bOV -bPQ -bQJ -bRx -bQJ -bPQ -bTO -ljG -lhP -bOk -bWL +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bVZ +bOX bXx -bLW -abI +bVi +cui bMi caD cbv @@ -98681,20 +98763,20 @@ bJN bMc bNg bOn -bOW -bPQ -bPQ -bPQ -bPQ -bPQ -bTP -wLK -bVh +bOX +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bMf bVY -bWM -bXy -bWc -bZe +bUs +bVg +bVm +poP bZL caE cbu @@ -98936,22 +99018,22 @@ bIE bJN bJN bMd -bNf -bOk +bPT +bOn bOX -bPQ -bQK -bQK -bQK -bPQ -bTQ -wLK -bKX -bOk -bWN -bXz -bYq -abI +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bVZ +bOX +kas +bNm +cui bJP bJP bJP @@ -99195,20 +99277,20 @@ bKS bMe bNh bOo -bOY -bPT -bQL -bRy -bSf -bSR -bTM -wLK -bKX +bOX +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bMf bVZ bWO bXA bQO -bZe +poP bZM caF cbw @@ -99449,23 +99531,23 @@ aht aaa bJN bKT -bMf +bWM bNi -bOk +bQK bOZ bMf bMf -bRz bMf -bSS -bTR -tDE -bKX -bWa +bMf +bMf +bMf +bMf +bMf +bVZ bMf bXB bNm -abI +cui bMi caG cbx @@ -99706,23 +99788,23 @@ bCP bAA bHw bKU -bMf -bMf -bOk -bPa +bOr bPU -bOY -bRA -bOY -bST -bTS -bUu -bVi -bMe +bRw +bPa +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bMf +bVY bWP bXy bQO -bZe +poP bZN caH cby @@ -99955,7 +100037,7 @@ bxt byS bAA bBC -bBC +bDN bDL bFa bGf @@ -99963,23 +100045,23 @@ bCR bIF bHw bKV +bOX +bUv +bQL +bPa +bMf bMf bMf -bOk -bPb bMf -bQM -bQM -bQM bSU bTT bUv bKX -bMf -bMf +bTR +bUt bXC bYs -bYw +bVW bYw bYw cBT @@ -100212,7 +100294,7 @@ bxu byT bAB bBD -bBD +mzE bDM bFb bGg @@ -100223,17 +100305,17 @@ bKW bMg bNj bOp -bPc bPV bPV bPV -bSg bPV bPV bUw +bUw +bUw bVj -bMg -bMg +bTS +bUu bXD bYt bZf @@ -100470,26 +100552,26 @@ byU bAA bBE bCQ -bDN -bFc +bCR +bGh bGh bCR bIH bHw cqG -bMf +bOX bNk bOq bPd bPW -bQN +bPW bPW bPd bPW -bTU -bUx -bPd bPW +bPW +bPd +bUr bWQ bXE bYu @@ -100726,7 +100808,7 @@ bxw byV bAA bBF -bCR +bCQ bDO bCR bCR @@ -100736,18 +100818,18 @@ bHw bKY bMh bNl -bOi +bQM bPe bPX -bNl +bSR bRB bSh bSV -bNl +bTP bUy bVk bWb -bNl +bUz bXF bYv bZh @@ -100983,7 +101065,7 @@ bxx byW bAA bBG -bCR +xEx bDP bFd bGi @@ -100991,22 +101073,22 @@ bHv bIJ bHw bKZ -bLW -bNm -bOr +bOR +bWR +bWc bPf bPY bQO bPY -bSi +bPf bPY bQO -bUz +bWc bVl bWc bWR bXG -jLW +bYw bZi bZR caL @@ -101258,11 +101340,11 @@ abI bLa abI bNn -bUA -bVm -bWd -bWS -wJP +abI +bLa +abI +bNn +abI aht bZj bZS @@ -102019,7 +102101,7 @@ buz abI bJP bLd -bLe +bOS bLe bJP bPh diff --git a/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm b/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm new file mode 100644 index 0000000000..403f155854 --- /dev/null +++ b/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm @@ -0,0 +1,68088 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"ah" = ( +/turf/closed/mineral/random/snow, +/area/icemoon/underground/unexplored/rivers) +"ak" = ( +/turf/closed/mineral/random/high_chance/snow, +/area/icemoon/underground/unexplored/rivers) +"dW" = ( +/turf/closed/wall, +/area/mine/eva) +"dX" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/eva) +"ei" = ( +/obj/structure/table, +/obj/item/pickaxe, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/item/gps/mining, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"ej" = ( +/obj/machinery/suit_storage_unit/mining, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"ek" = ( +/obj/machinery/suit_storage_unit/mining, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"eq" = ( +/turf/closed/wall, +/area/mine/production) +"er" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/production) +"es" = ( +/obj/machinery/camera{ + c_tag = "EVA"; + dir = 4; + network = list("mine") + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"et" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/eva) +"eu" = ( +/turf/open/floor/plasteel, +/area/mine/eva) +"ew" = ( +/obj/machinery/light_switch{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"ex" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/closed/mineral/random/snow, +/area/icemoon/underground/unexplored/rivers) +"eH" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"eI" = ( +/obj/structure/closet/crate, +/obj/item/dice/d4, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"eJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/mine/production) +"eK" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/mine/eva) +"eL" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"eM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/eva) +"eN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/mine/eva) +"eO" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/mine/eva) +"eP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/eva) +"eQ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"eR" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/mine/eva) +"eZ" = ( +/obj/structure/sign/warning/docking, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/production) +"fa" = ( +/obj/item/beacon, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fe" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station EVA"; + req_access_txt = "54" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"ff" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fi" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fj" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "54" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fk" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fm" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "54" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fB" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining Shuttle Airlock"; + opacity = 0 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fC" = ( +/turf/open/floor/plasteel, +/area/mine/production) +"fD" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining Shuttle Airlock"; + opacity = 0 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fE" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fG" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"fH" = ( +/obj/machinery/power/apc{ + name = "Mining EVA APC"; + pixel_x = 1; + pixel_y = -23 + }, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/mine/eva) +"fI" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/eva) +"fJ" = ( +/turf/open/floor/mech_bay_recharge_floor, +/area/mine/eva) +"fK" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"fM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/eva) +"fN" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"gS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"gW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"hv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"hz" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"hY" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/mine/eva) +"je" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"jk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"jo" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"jr" = ( +/obj/machinery/door/airlock{ + name = "Closet" + }, +/turf/open/floor/plating, +/area/mine/production) +"ju" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/mine/production) +"jy" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/mine/production) +"jL" = ( +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/mine/eva) +"jU" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0; + req_access_txt = "54" + }, +/turf/open/floor/plasteel, +/area/mine/eva) +"jV" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/mine/eva) +"kb" = ( +/obj/structure/ore_box, +/turf/open/floor/plasteel, +/area/mine/eva) +"nd" = ( +/turf/closed/wall, +/area/mine/living_quarters) +"nm" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"nq" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"nE" = ( +/obj/item/bikehorn{ + color = "#000"; + desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks."; + name = "charred bike horn" + }, +/turf/closed/mineral/random/snow, +/area/icemoon/underground/unexplored/rivers) +"nN" = ( +/turf/closed/wall/r_wall, +/area/mine/living_quarters) +"nV" = ( +/turf/closed/wall/r_wall, +/area/mine/maintenance) +"op" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/living_quarters) +"oB" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"oL" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/crate/secure/loot, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"oO" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"oQ" = ( +/turf/open/floor/plating, +/area/mine/living_quarters) +"oU" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/mine/living_quarters) +"oW" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "Mining Station Starboard Wing APC"; + pixel_x = -25; + pixel_y = 2 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"pf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"pi" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"pu" = ( +/obj/machinery/mineral/mint, +/turf/open/floor/plasteel, +/area/mine/production) +"pJ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"pV" = ( +/obj/structure/closet/crate, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/production) +"qa" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/structure/table, +/obj/item/paper/fluff/stations/lavaland/orm_notice, +/turf/open/floor/plasteel, +/area/mine/production) +"qb" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/production) +"qt" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/production) +"qN" = ( +/obj/structure/table, +/obj/item/cigbutt, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"rj" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"ry" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"sa" = ( +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"sj" = ( +/turf/open/floor/circuit, +/area/mine/maintenance) +"so" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Communications APC"; + pixel_x = 1; + pixel_y = 23 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/mine/maintenance) +"sp" = ( +/obj/machinery/telecomms/relay/preset/mining, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/mine/maintenance) +"ss" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/mine/maintenance) +"st" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/circuit, +/area/mine/maintenance) +"su" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"sA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"sH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"sM" = ( +/obj/structure/table, +/obj/item/storage/firstaid/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"sY" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"tn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/meter, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"tI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"tL" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"uG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"uJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"vb" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"vq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/production) +"vw" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel, +/area/mine/production) +"vG" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"vH" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/mine/production) +"vW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"wj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/mine/maintenance) +"wq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/bluespace_beacon, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/mine/maintenance) +"wN" = ( +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/circuit, +/area/mine/maintenance) +"wX" = ( +/obj/machinery/camera{ + c_tag = "Communications Relay"; + dir = 8; + network = list("mine") + }, +/turf/open/floor/circuit, +/area/mine/maintenance) +"wZ" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood/AMinus, +/obj/item/reagent_containers/blood/BMinus{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/blood/BPlus{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/item/reagent_containers/blood/OPlus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/machinery/camera{ + c_tag = "Sleeper Room"; + dir = 1; + network = list("mine") + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"xi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"xU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"yf" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"yk" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/living_quarters) +"yq" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"yr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"yy" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"yD" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Shuttle Docking Foyer"; + dir = 8; + network = list("mine") + }, +/obj/machinery/newscaster{ + pixel_x = 30; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"yX" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/production) +"zk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/mine/production) +"zn" = ( +/obj/machinery/camera{ + c_tag = "Processing Area Room"; + dir = 8; + network = list("mine") + }, +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"zQ" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/mine/production) +"zU" = ( +/obj/item/clothing/under/color/jumpskirt/random, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"zX" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ac" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Al" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Aw" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Communications"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/maintenance) +"AB" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/mine/living_quarters) +"AW" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel/white, +/area/mine/living_quarters) +"Bd" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance"; + req_access_txt = "48" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/living_quarters) +"Be" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/mine/production) +"Bl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/mine/production) +"Bz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable, +/obj/machinery/door/airlock/mining/glass{ + name = "Processing Area"; + req_access_txt = "48" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"BL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/mine/production) +"Cd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/production) +"Cf" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "mining_internal"; + name = "mining conveyor" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Cr" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/mine/production) +"CK" = ( +/obj/machinery/conveyor{ + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/production) +"Dh" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Dn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Du" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"DB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"DR" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway"; + network = list("mine") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ee" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"El" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Es" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Mining Station Port Wing APC"; + pixel_x = 1; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ez" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"EB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"EG" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway East"; + network = list("mine") + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"EL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"ET" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Fd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Fy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"FB" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"FF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"FQ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"FU" = ( +/obj/machinery/mineral/processing_unit_console, +/turf/closed/wall, +/area/mine/production) +"Gn" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/mine/production) +"Gp" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 4; + piping_layer = 3 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/mine/living_quarters) +"Gv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/mine/living_quarters) +"Gw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/living_quarters) +"GI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"GN" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"GY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Hd" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ho" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Hx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HO" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"HY" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Iq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Iv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"IB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"IF" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"IK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Mining Station Bridge" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"IM" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Jo" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/mine/production) +"JM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/production) +"JU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Kb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Kk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"KE" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Lg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Lu" = ( +/obj/machinery/camera{ + c_tag = "Crew Area Hallway West"; + dir = 1; + network = list("mine") + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"LE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"LI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"LL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"LU" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Mt" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"MG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"MH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Nj" = ( +/obj/machinery/door/airlock/glass{ + name = "Break Room" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Nt" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/mineral/equipment_vendor, +/turf/open/floor/plasteel, +/area/mine/production) +"Ny" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"NI" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"NK" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/mine/production) +"NP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/mine/production) +"NY" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Of" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/structure/plasticflaps, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating, +/area/mine/production) +"Ol" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/mine/production) +"Ou" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "mining_internal" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/mine/production) +"Ow" = ( +/obj/item/clothing/under/color/jumpskirt/random, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Pa" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Pl" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Pp" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ps" = ( +/obj/machinery/camera{ + c_tag = "Public Shuttle Lobby"; + network = list("mine") + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table, +/obj/item/gps/mining, +/obj/item/gps/mining, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Pt" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/carpet, +/area/mine/living_quarters) +"PE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/mine/living_quarters) +"PL" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm1"; + name = "Room 1" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"PY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Qx" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"QN" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"QQ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"QW" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"QX" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Rb" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Rf" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/mine/production) +"Rx" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"RE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"RO" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"SE" = ( +/obj/structure/table, +/turf/open/floor/carpet, +/area/mine/living_quarters) +"SJ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "miningdorm1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/mine/living_quarters) +"SV" = ( +/obj/machinery/camera{ + c_tag = "Dormitories"; + dir = 4; + network = list("mine") + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"SX" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ti" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Tk" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Tn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"To" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"Tv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/closed/wall, +/area/mine/living_quarters) +"TA" = ( +/obj/structure/table, +/obj/item/clothing/glasses/meson, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/mining_scanner, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"TC" = ( +/obj/structure/table, +/obj/item/gps/mining, +/obj/item/gps/mining, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"TP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"TT" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Uh" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Ur" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UE" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UH" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UJ" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"UM" = ( +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UP" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm2"; + name = "Room 2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UQ" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"US" = ( +/obj/machinery/camera{ + c_tag = "Crew Area"; + dir = 1; + network = list("mine") + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"UW" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Vo" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"VC" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Mining External Airlock"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/production) +"VP" = ( +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"VX" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "miningdorm2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/mine/living_quarters) +"Wi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"WA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"WD" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/closed/mineral/random/snow, +/area/icemoon/underground/unexplored/rivers) +"WE" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"WM" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Lavaland Shuttle Airlock" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"WO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Xf" = ( +/obj/structure/statue{ + desc = "A lifelike statue of a horrifying monster."; + dir = 8; + icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; + icon_state = "goliath"; + name = "goliath" + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Xl" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/displaycase, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"Xx" = ( +/obj/machinery/door/window/southleft, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"XU" = ( +/obj/machinery/door/window/southright, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Ym" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Yv" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Yy" = ( +/obj/machinery/door/airlock{ + id_tag = "miningdorm3"; + name = "Room 3" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"YA" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/living_quarters) +"YB" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"YP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"YW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Zd" = ( +/obj/machinery/door/airlock{ + id_tag = "miningbathroom"; + name = "Restroom" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Zf" = ( +/obj/machinery/button/door{ + id = "miningbathroom"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Zk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/living_quarters) +"Zm" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "miningdorm3"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/mine/living_quarters) + +(1,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(2,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(3,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(4,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(5,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(6,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(7,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(8,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(9,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(10,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(11,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(12,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(13,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(14,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +"} +(15,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(16,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(17,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(18,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(19,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(20,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(21,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(22,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(23,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(24,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(25,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(26,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(27,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(28,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(29,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(30,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ak +ak +ak +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(31,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(32,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(33,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(34,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(35,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(36,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(37,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(38,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(39,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(40,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(41,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(42,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(43,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(44,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(45,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(46,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(47,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(48,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(49,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(50,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(51,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(52,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(53,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(54,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(55,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(56,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(57,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(58,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(59,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(60,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(61,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(62,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(63,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(64,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(65,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(66,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(67,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(68,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(69,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(70,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +"} +(71,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(72,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(73,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(74,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(75,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(76,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(77,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(78,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(79,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(80,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(81,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(82,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(83,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(84,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(85,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(86,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(87,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(88,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(89,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(90,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(91,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(92,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(93,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(94,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(95,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(96,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(97,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(98,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(99,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(100,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(101,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(102,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(103,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(104,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(105,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(106,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(107,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(108,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(109,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(110,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nE +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(111,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(112,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +op +op +op +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(113,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +qN +sa +zU +nd +Gp +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(114,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +rj +sa +zX +nd +Gv +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(115,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +ET +aa +Du +nd +Gw +op +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(116,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +ry +vW +Ac +sa +GI +Lg +nd +ah +ah +ah +ah +op +WE +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(117,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +sa +sa +sa +sa +GN +Lu +nd +ah +ah +ah +ah +op +sa +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(118,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nN +sa +sa +Al +Dh +GY +sa +nd +nd +nd +Tv +nd +op +WM +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(119,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +nV +nV +nV +Dn +GY +sa +nd +Ow +Rx +sa +Rx +ry +WO +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(120,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +sj +sj +nV +sa +GY +sa +nd +Pa +sa +sa +sa +sa +sa +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(121,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +so +wj +nV +Du +GY +ET +nd +Pl +sa +TA +TA +sa +Xf +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(122,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +sp +wq +Aw +DB +Hd +LE +MH +El +RE +TA +TA +sa +sa +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(123,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +ss +wN +nV +Ac +Ho +ry +nd +Pp +GI +sa +sa +sa +zX +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(124,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +st +wX +nV +DR +Hx +zX +nd +Ps +RO +TC +UM +VP +Xl +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(125,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nV +nV +nV +nV +Ee +Ho +sa +nd +nd +nd +nd +nd +nd +nd +nd +nd +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(126,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +su +wZ +nd +sa +HF +LI +nd +Pt +SE +nd +Pt +SE +nd +Pt +SE +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(127,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +sA +xi +AB +Du +Ho +sa +nd +PE +SJ +nd +PE +VX +nd +PE +Zm +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(128,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +sH +xU +AW +El +HM +sa +nd +PL +nd +nd +UP +nd +nd +Yy +nd +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(129,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +sM +yf +AB +Ac +Ho +sa +ry +PY +SV +ry +PY +Wi +ry +PY +Ac +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +"} +(130,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +nd +nd +nd +nd +Es +HO +LL +LL +Qx +LL +LL +Qx +WA +LL +YA +LI +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(131,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +oB +sY +yk +nd +Ez +HF +LI +nd +nd +AB +AB +nd +nd +nd +YB +nd +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(132,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +oL +oQ +oQ +nd +Du +Ho +zX +nd +QN +QQ +TP +UQ +nd +Xx +YP +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(133,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +oO +tn +yq +Bd +EB +HW +ET +AB +QQ +QQ +TT +QQ +nd +XU +YW +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(134,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +oQ +tI +yr +nd +EG +HX +LU +Nj +QW +SX +Uh +US +nd +nd +Zd +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(135,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +oU +tL +tL +nd +EL +Hx +ry +AB +QQ +QQ +Ur +UW +nd +Ym +Zf +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(136,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +nd +nd +nd +nd +nd +sa +Ho +sa +nd +QX +QQ +UE +QQ +nd +Yv +Zk +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(137,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +sa +Ho +sa +nd +Rb +Ti +UH +Vo +nd +nd +nd +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(138,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +ET +HY +Mt +nd +op +op +op +op +nd +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(139,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +op +Iq +op +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(140,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +Iv +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(141,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +Ho +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(142,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +Ho +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(143,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +op +Ho +op +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(144,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +IB +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(145,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +IB +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(146,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +eZ +fB +er +ah +ah +ah +ah +ah +ah +er +IB +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(147,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +fC +er +ah +ah +ah +ah +ah +ah +er +IF +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(148,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +er +fD +er +er +ah +ah +ah +ah +Be +er +IK +er +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(149,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +eq +er +fa +fE +gS +er +eq +eq +eq +eq +Bl +je +IM +gS +er +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(150,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +eq +eH +fb +fC +gW +je +nm +oW +fE +yy +Bl +fG +IB +fC +Nt +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(151,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +eI +fc +fF +hv +jk +jk +pf +uG +jk +Bz +Fd +Jo +MG +Ny +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(152,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +er +eJ +fd +fG +hz +jo +nq +fG +uJ +fC +BL +Fy +JM +fC +NI +eq +eq +eq +eq +WD +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(153,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +dW +dW +eK +fe +eK +dW +jr +eq +pi +vb +yD +BL +fC +JU +fC +NK +er +Tk +NK +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(154,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +ei +es +eL +ff +fH +dW +ju +eq +eq +vq +eq +vq +fC +JU +fC +NP +Rf +Tn +NP +VC +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(155,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dX +ej +et +eM +fg +fI +dW +jy +eq +pu +vw +yX +je +FB +JU +fC +je +er +To +UJ +er +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(156,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dX +ej +eu +eN +fh +fJ +dW +eq +eq +pJ +fC +fC +fC +fC +Kb +hz +NY +eq +eq +eq +eq +WD +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(157,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +ek +ew +eO +fi +fK +dW +jL +eq +pV +fC +zk +Cd +FF +Kk +eq +Of +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(158,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +dW +dW +eP +fj +fM +dW +jU +eq +qa +fC +zn +Cf +FQ +KE +Cr +Ol +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(159,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +eQ +fk +fN +eu +jV +eq +qb +vG +eq +Cr +FU +Cr +Cr +Ol +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(160,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +eR +fi +eu +hY +kb +eq +qt +vH +zQ +CK +Gn +CK +CK +Ou +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(161,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +dW +eP +fm +fM +dW +dW +eq +eq +eq +eq +eq +eq +eq +eq +eq +eq +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(162,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ex +ah +ah +ah +ex +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(163,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(164,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(165,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(166,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(167,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(168,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(169,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(170,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(171,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(172,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(173,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(174,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(175,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(176,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(177,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(178,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(179,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(180,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(181,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(182,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(183,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(184,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(185,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(186,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(187,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(188,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(189,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(190,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(191,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(192,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(193,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(194,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(195,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(196,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(197,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(198,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(199,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(200,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(201,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(202,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(203,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(204,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(205,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(206,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(207,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(208,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(209,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(210,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(211,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(212,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(213,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(214,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(215,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(216,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(217,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(218,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(219,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(220,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(221,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(222,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(223,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(224,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ak +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(225,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(226,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(227,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(228,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(229,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(230,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(231,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(232,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(233,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(234,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(235,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(236,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(237,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(238,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(239,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(240,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(241,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(242,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(243,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(244,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(245,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(246,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(247,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(248,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(249,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(250,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(251,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(252,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(253,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(254,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} +(255,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +ah +"} diff --git a/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm b/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm new file mode 100644 index 0000000000..42971e4315 --- /dev/null +++ b/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm @@ -0,0 +1,65571 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/mineral/random/snow/underground, +/area/icemoon/underground/unexplored/rivers) +"b" = ( +/turf/closed/mineral/random/high_chance/snow, +/area/icemoon/underground/unexplored/rivers) +"d" = ( +/turf/closed/wall, +/area/icemoon/underground/explored) +"e" = ( +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"h" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"i" = ( +/obj/item/gps/mining, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"N" = ( +/obj/item/flashlight/lantern{ + on = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"O" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"T" = ( +/obj/structure/ladder, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/underground/explored) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(13,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(14,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(22,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(24,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(28,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(29,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(30,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(31,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(32,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(33,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(34,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(35,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(36,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(37,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(38,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(39,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(40,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(41,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(42,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(43,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(44,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(45,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(46,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(47,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(48,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(49,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(50,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(51,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(52,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(53,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(54,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(55,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(56,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(57,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(58,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(59,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(60,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(61,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(62,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(63,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(64,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(65,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +"} +(66,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(67,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(68,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(69,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(70,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(71,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(72,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(73,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(74,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(75,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(76,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(77,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(78,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(79,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(80,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(81,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(82,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(83,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(84,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(85,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(86,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(87,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(88,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(89,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(90,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(91,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(92,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(93,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(94,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(95,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(96,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(97,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(98,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(99,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(100,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(101,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(102,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(103,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(104,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(105,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(106,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(107,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(108,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(109,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(110,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(111,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(112,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(113,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(114,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(115,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(116,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(117,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(118,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(119,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(120,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(121,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(122,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(123,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(124,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(125,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(126,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(127,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(128,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(129,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(130,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(131,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(132,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(133,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +"} +(134,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(135,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(136,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(137,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(138,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(139,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(140,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(141,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(142,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(143,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(144,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(145,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(146,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(147,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(148,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(149,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(150,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(151,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(152,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(153,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(154,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(155,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +e +h +e +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(156,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +e +i +h +h +e +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(157,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +h +h +T +h +h +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(158,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +e +N +h +h +e +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(159,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +d +O +h +e +d +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(160,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(161,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(162,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(163,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(164,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(165,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(166,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(167,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(168,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(169,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(170,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(171,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(172,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(173,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(174,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(175,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(176,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(177,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(178,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(179,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(180,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(181,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(182,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(183,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(184,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(185,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(186,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(187,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(188,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(189,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(190,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(191,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(192,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(193,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(194,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(195,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(196,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(197,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(198,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(199,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(200,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(201,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(202,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(203,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(204,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(205,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(206,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(207,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(208,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(209,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(210,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(211,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(212,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(213,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(214,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(215,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(216,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(217,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(218,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(219,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(220,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(221,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(222,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(223,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(224,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(225,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(226,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(227,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(228,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(229,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(230,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +"} +(231,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(232,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(233,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(234,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(235,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(236,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(237,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(238,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(239,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(240,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(241,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(242,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(243,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(244,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(245,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(246,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(247,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(248,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(249,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(250,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(251,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(252,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(253,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(254,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(255,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm new file mode 100644 index 0000000000..37576ef011 --- /dev/null +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -0,0 +1,110284 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aaw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"aaH" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall, +/area/medical/chemistry) +"aaM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aaO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaP" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aaS" = ( +/turf/closed/wall/r_wall, +/area/medical/surgery) +"aba" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/surgery) +"abe" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"abk" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"abs" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"abG" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"abQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"abU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"abX" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/stack/sheet/cardboard, +/obj/item/stack/rods/fifty, +/obj/item/electronics/apc, +/obj/item/stock_parts/cell{ + maxcharge = 2000 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"abZ" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"ace" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"acj" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"acq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/arrows/red, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"acu" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"acv" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/quartermaster, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"acx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/button/door{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -1; + pixel_y = -24; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"acy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"acQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"acV" = ( +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"ads" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adt" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/sorting"; + dir = 1; + name = "Delivery Office APC"; + pixel_x = 1; + pixel_y = 24 + }, +/obj/structure/table/reinforced, +/obj/item/destTagger{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/destTagger, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adu" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer, +/area/medical/medbay/central) +"adw" = ( +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"adx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ady" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"adz" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"adA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"adT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adW" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"adX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"adY" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"adZ" = ( +/obj/structure/table, +/obj/item/clothing/neck/stethoscope, +/obj/item/folder/white, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aet" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/camera{ + c_tag = "Toxins Launch Hall 3"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"aez" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aeG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"aeH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/clothing/shoes/magboots, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"afn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"afp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/library) +"afU" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"ahe" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/storage) +"ahn" = ( +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"ahC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 13 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ahU" = ( +/obj/machinery/space_heater, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"aiS" = ( +/obj/structure/closet/secure_closet/CMO, +/obj/machinery/keycard_auth{ + pixel_y = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"aiU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/engine/engineering) +"ajg" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/maintenance/central) +"ajl" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/fore) +"ajq" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ajV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/storage/box/masks, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"akg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"akB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"akQ" = ( +/obj/machinery/computer/arcade/minesweeper, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"alh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ali" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/chemical, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"alE" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"alF" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/britcup{ + desc = "Kingston's personal cup." + }, +/obj/machinery/door/window/eastright{ + dir = 2; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"alG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) +"alR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"alS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"alU" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"amy" = ( +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"amA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"amD" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"amF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"anh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ani" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"anm" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ann" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"anw" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"anA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"anH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"anI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"anJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"anK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"anL" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"anO" = ( +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"anR" = ( +/obj/structure/cable, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"aoj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/central) +"aok" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aol" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aom" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aon" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"aoo" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"aow" = ( +/obj/machinery/suit_storage_unit/captain, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"aoR" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/gun/syringe/dart, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aoT" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aoU" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aoX" = ( +/turf/closed/wall/r_wall, +/area/medical/chemistry) +"apt" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -31 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"apJ" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/server) +"apK" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"apN" = ( +/obj/machinery/telecomms/bus/preset_three, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"apO" = ( +/obj/machinery/door/window/eastleft{ + name = "Medical Delivery"; + req_access_txt = "5" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"apP" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall, +/area/medical/medbay/central) +"aqP" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arl" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arE" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"arG" = ( +/turf/open/floor/plating, +/area/medical/medbay/central) +"arH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arI" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"arP" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"arV" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"asc" = ( +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ash" = ( +/turf/closed/wall, +/area/medical/medbay/central) +"asn" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/storage/fancy/donut_box{ + pixel_y = 10 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"asr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"asE" = ( +/obj/machinery/status_display, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"asF" = ( +/obj/machinery/shieldwallgen, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"asJ" = ( +/obj/machinery/shieldwallgen, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"asO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"asQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/construction/storage) +"atb" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"atp" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"atq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"atr" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"atI" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Telecomms Admin"; + departmentType = 5; + name = "Telecomms RC"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"atJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/teleporter) +"atM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 14 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"atO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"atU" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/hallway/primary/port) +"atX" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"auc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aue" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"auO" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"auP" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"auR" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/obj/item/book/manual/wiki/security_space_law, +/obj/structure/extinguisher_cabinet{ + pixel_y = -31 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"auT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"auV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"auX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"auY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 12 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ava" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"avp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"avP" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"avS" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/port"; + name = "Port Hall APC"; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"avT" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"avU" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/hallway/primary/port) +"avV" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/wood, +/area/hallway/primary/port) +"avX" = ( +/obj/structure/table, +/turf/open/floor/wood, +/area/hallway/primary/port) +"avY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"awb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"awo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"awB" = ( +/obj/structure/chair/stool, +/obj/machinery/camera{ + c_tag = "Aft Starboard Solar Control"; + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"awW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"awZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Upload Access"; + req_access_txt = "16" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"axc" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/paper/pamphlet/gateway, +/obj/item/paper/pamphlet/gateway, +/obj/item/paper/pamphlet/gateway, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"axg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -31 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"axi" = ( +/turf/open/floor/wood, +/area/hallway/primary/port) +"axj" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"axk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"axl" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"axn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/science/robotics/lab) +"axo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"axr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/construction/storage) +"axu" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/storage/belt/utility, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plating, +/area/construction/storage) +"axG" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "Research Division" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel/dark, +/area/science/lab) +"axL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"axN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"ayk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"ayl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"aym" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/loading_area, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ayo" = ( +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"ayp" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Research Director's Desk"; + departmentType = 5; + name = "Research Director RC"; + pixel_x = -2; + pixel_y = 30; + receive_ore_updates = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"ayq" = ( +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"ayr" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ays" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/power/apc{ + areastring = "/area/science/lab"; + dir = 1; + name = "Research Lab APC"; + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ayt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ayu" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ayy" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ayA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "robo2" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"ayC" = ( +/obj/machinery/mecha_part_fabricator, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"ayD" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/space_heater, +/obj/machinery/power/apc{ + areastring = "/area/construction/storage"; + dir = 8; + name = "Engineering Medical"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/construction/storage) +"ayE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal, +/turf/open/floor/plasteel, +/area/construction/storage) +"ayG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction/storage) +"ayH" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/construction/storage) +"ayP" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"azc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/maintenance/department/electrical) +"azq" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"azz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Cyborg Charging Station"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"azA" = ( +/obj/machinery/computer/mecha{ + dir = 4 + }, +/obj/machinery/keycard_auth{ + pixel_x = -24 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"azB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"azC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Research Director"; + req_access_txt = "30" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"azD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"azG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"azH" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "robo2" + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass{ + amount = 20; + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"aAe" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aAh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aAw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aAx" = ( +/obj/machinery/light, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/primary/port) +"aAC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"aAD" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"aAE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"aAF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"aAG" = ( +/obj/structure/table, +/obj/item/paicard{ + pixel_x = 4 + }, +/obj/item/taperecorder{ + pixel_x = -3 + }, +/obj/item/aicard, +/obj/item/circuitboard/aicore{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"aAI" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aAJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aAK" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aAL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aAO" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aAP" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"aAQ" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aAS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"aAT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"aAU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"aAV" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aAY" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"aBw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"aBG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"aBH" = ( +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aBI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aBK" = ( +/turf/open/floor/plasteel/white, +/area/science/lab) +"aBR" = ( +/obj/structure/table, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"aCr" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/healthanalyzer, +/obj/item/healthanalyzer, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"aCV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/conveyor{ + id = "packageSort2"; + dir = 1 + }, +/obj/machinery/disposal/deliveryChute, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"aCX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aDa" = ( +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/vending/autodrobe, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDb" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aDc" = ( +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aDd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aDe" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; + dir = 4; + name = "Entry Hall APC"; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDf" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/science/lab) +"aDg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/closet/cabinet, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aDk" = ( +/obj/machinery/space_heater, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/status_display{ + layer = 4; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDm" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/structure/closet/cabinet, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"aDo" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aDJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aDL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/maintenance/department/electrical) +"aDM" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"aDQ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aDX" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/effect/landmark/start/depsec/medical, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aEE" = ( +/obj/machinery/rnd/destructive_analyzer, +/turf/open/floor/circuit, +/area/science/lab) +"aEF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aEG" = ( +/turf/open/floor/circuit, +/area/science/lab) +"aEH" = ( +/obj/machinery/computer/rdconsole/core{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/circuit, +/area/science/lab) +"aEI" = ( +/obj/machinery/rnd/production/protolathe/department/science, +/turf/open/floor/circuit, +/area/science/lab) +"aEJ" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"aEK" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/item/reagent_containers/glass/beaker/sulphuric, +/turf/open/floor/circuit, +/area/science/lab) +"aEL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/science{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"aEO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"aFa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"aFA" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/janitorialcart, +/turf/open/floor/plasteel, +/area/janitor) +"aFI" = ( +/turf/closed/wall/r_wall, +/area/science/lab) +"aFJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aFO" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFU" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"aFZ" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + id = "Skynet_launch2"; + name = "mech bay" + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aGl" = ( +/obj/structure/closet/secure_closet/miner, +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"aGD" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"aHc" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"aHe" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"aHt" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"aHu" = ( +/turf/closed/wall/r_wall, +/area/science/server) +"aHA" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"aHD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"aHE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/research{ + name = "Mech Bay"; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aHG" = ( +/obj/machinery/recharge_station, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"aHK" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/obj/item/multitool{ + pixel_x = 3 + }, +/obj/item/multitool{ + pixel_x = 3 + }, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"aHU" = ( +/obj/machinery/rnd/production/techfab/department/service, +/turf/open/floor/plating, +/area/maintenance/disposal) +"aIf" = ( +/obj/item/target, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aIt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"aIK" = ( +/obj/machinery/computer/aifixer{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"aIN" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aIP" = ( +/turf/closed/wall, +/area/hallway/secondary/entry) +"aIS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"aJb" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aJe" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/recharge_station, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"aJt" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/quartermaster/miningdock) +"aJC" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "AI Chamber - Fore"; + network = list("aicore") + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"aJP" = ( +/obj/machinery/vending/assist, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"aJZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aKa" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/storage/atmos) +"aKf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"aKm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aKn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aKp" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aKs" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aKu" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/mechbay"; + dir = 8; + name = "Mech Bay APC"; + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aKw" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"aKP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"aLk" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aLp" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/box/firingpins{ + pixel_x = -3 + }, +/obj/item/storage/box/firingpins{ + pixel_x = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aLu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aLD" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/chair/sofa/corner{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/medical"; + dir = 8; + name = "Medbay Security APC"; + pixel_x = -25 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aLE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aLF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/sofa/left, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aLG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aLL" = ( +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aLM" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aLN" = ( +/obj/machinery/button/door{ + id = "Skynet_launch"; + name = "Mech Bay Door Control"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "29" + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aLP" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"aLQ" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/item/storage/box, +/obj/item/hand_labeler{ + pixel_y = 8 + }, +/obj/item/hand_labeler{ + pixel_y = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"aMu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/depsec, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"aMx" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"aMF" = ( +/obj/machinery/button/door{ + id = "kanyewest"; + name = "Privacy Shutters"; + pixel_y = 24 + }, +/obj/machinery/computer/med_data, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"aMR" = ( +/obj/structure/table/wood, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"aNe" = ( +/obj/machinery/camera{ + c_tag = "Brig Genpop South" + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"aNg" = ( +/obj/machinery/light, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/fore) +"aNj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aNk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aNl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aNm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"aNo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aNr" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"aNw" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"aNL" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"aNS" = ( +/obj/machinery/turnstile{ + name = "Genpop Entrance Turnstile"; + req_access_txt = "69"; + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "permacell1"; + name = "genpop blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"aNT" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airlock_sensor/incinerator_toxmix{ + pixel_y = 24 + }, +/turf/open/floor/engine, +/area/science/mixing) +"aNU" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"aOl" = ( +/obj/structure/closet/secure_closet/security/med, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Security Post - Medbay"; + dir = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aOm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"aOo" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"aOp" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/atmos"; + dir = 8; + name = "Atmospherics APC"; + pixel_x = -24 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/atmos) +"aOq" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/storage/atmos) +"aOr" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aOJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"aOP" = ( +/obj/structure/table/wood, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"aPw" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aPA" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/medical) +"aPB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"aPC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/atmos) +"aPD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/storage/atmos) +"aPE" = ( +/turf/closed/wall/r_wall, +/area/storage/atmos) +"aPY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"aPZ" = ( +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"aQd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"aQe" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"aQA" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aQK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aQT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aQV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aQX" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aRp" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"aRq" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aRt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"aSl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aSE" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aSI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"aSN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"aTc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aTY" = ( +/obj/machinery/camera{ + c_tag = "Secure Tech Storage" + }, +/turf/open/floor/plating, +/area/storage/tech) +"aUb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"aUd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"aUg" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/structure/light_construct/small, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/bar) +"aUC" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aUG" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aVt" = ( +/obj/structure/closet/emcloset, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/department/electrical"; + dir = 4; + name = "Southern Atmos Post APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"aVv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"aVC" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 30 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"aWr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/storage) +"aWK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door_timer{ + id = "Cell 1"; + name = "Cell 1"; + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"aWM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=HOP2"; + location = "Stbd" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"aXh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"aYe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aYf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=QM"; + location = "CHW" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"aZz" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/computer/communications{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Bridge Center"; + dir = 1 + }, +/obj/machinery/keycard_auth{ + pixel_x = 29; + pixel_y = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"aZY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"aZZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"baa" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"bbq" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Access"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"bcc" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 2"; + name = "Cell 2"; + dir = 1 + }, +/obj/effect/turf_decal/vg_decals/numbers/two, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bcp" = ( +/turf/open/floor/engine, +/area/science/misc_lab) +"bcq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"bcu" = ( +/obj/effect/turf_decal/vg_decals/atmos/plasma, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"bcR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/primary/port) +"bdd" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bdm" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"bdM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bei" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/camera{ + c_tag = "Atmospherics North West"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"beo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"beq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"beD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/medical/virology) +"bff" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"bfg" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"bfk" = ( +/obj/structure/plasticflaps, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "supply dock loading door" + }, +/obj/machinery/conveyor{ + id = "QMLoad2"; + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"bfB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bfT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bhe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"bhC" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #2"; + dir = 8; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bii" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"bjU" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"bkz" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + desc = "Used to grind things up into raw materials and liquids."; + pixel_y = 5 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/science, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bkQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"blg" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 5; + height = 7; + id = "supply_home"; + name = "Cargo Bay"; + width = 12 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bly" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"blD" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"blI" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/ambrosia, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"blR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bmA" = ( +/turf/closed/wall, +/area/hallway/secondary/exit/departure_lounge) +"bmP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bmW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bmX" = ( +/obj/effect/landmark/loneopspawn, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bna" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48"; + shuttledocked = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"bnE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bnU" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"bok" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/exit/departure_lounge) +"bom" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bow" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"bpB" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bpD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bpI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bpM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bpO" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restroom" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/fitness/recreation) +"bpT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bqx" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"bqN" = ( +/turf/closed/indestructible/rock/snow/ice, +/area/icemoon/surface/outdoors) +"bqO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bqW" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bqX" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/stool, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"bra" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"bri" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"brq" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"brE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/window/southleft{ + name = "Court Cell"; + req_access_txt = "2"; + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"brJ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"brX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/lawoffice) +"bsk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"bsm" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/security/courtroom) +"bsn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"bsq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/chair/stool, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"bsx" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/recreation) +"bsL" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"bsU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bsX" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/camera, +/obj/item/taperecorder, +/turf/open/floor/wood, +/area/library) +"btf" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/lawoffice"; + dir = 8; + name = "Law Office APC"; + pixel_x = -25; + pixel_y = 1 + }, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"btu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/security/courtroom) +"btI" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/wood, +/area/chapel/office) +"btZ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/fans/tiny, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"bum" = ( +/turf/open/openspace/icemoon, +/area/icemoon/surface/outdoors) +"buF" = ( +/obj/machinery/light, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"buI" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"buJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"buO" = ( +/obj/machinery/quantumpad{ + map_pad_id = "3"; + map_pad_link_id = "4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"buX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/security/courtroom) +"buZ" = ( +/turf/open/floor/wood, +/area/security/courtroom) +"bvl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "lawyer_blast"; + name = "privacy door" + }, +/turf/open/floor/plating, +/area/lawoffice) +"bvo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bvq" = ( +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bvw" = ( +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"bvW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door_timer{ + id = "Cell 2"; + name = "Cell 2"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bwa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bwb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/turnstile{ + name = "Genpop Entrance Turnstile"; + req_access_txt = "69"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bwh" = ( +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/chapel/main) +"bwm" = ( +/obj/structure/table, +/obj/item/storage/firstaid/toxin, +/obj/item/storage/firstaid/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bwr" = ( +/obj/machinery/camera{ + c_tag = "Toxins Launch hall 1"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"bwt" = ( +/turf/closed/wall/r_wall, +/area/security/courtroom) +"bwu" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Southern Hall 1"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bwx" = ( +/turf/closed/wall, +/area/lawoffice) +"bwG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bwL" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/miningoffice"; + dir = 8; + name = "Mining APC"; + pixel_x = -26 + }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bwZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bxa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bxb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bxc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bxf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bxh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/machinery/camera{ + c_tag = "AI Chamber - Starboard"; + dir = 8; + network = list("aicore") + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"bxk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"bxG" = ( +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bxK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bxL" = ( +/turf/closed/indestructible/rock/glacierrock/blue, +/area/icemoon/surface/outdoors) +"bxM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/lab) +"bxN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/fitness/recreation) +"bxR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bxU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"bxX" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"byu" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/medical/virology) +"byL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"byO" = ( +/obj/structure/fence, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"byP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "permacell2"; + name = "garden blast door" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plating, +/area/security/prison) +"byR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "PCell 1"; + pixel_y = -25 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"byT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"byU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"byW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"byY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"byZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bzd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bze" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bzi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Mining Dock"; + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Mining"; + pixel_x = -30 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bzj" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bzk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bzl" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bzn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bzq" = ( +/turf/closed/wall, +/area/quartermaster/miningoffice) +"bzs" = ( +/turf/closed/wall, +/area/maintenance/aft) +"bzS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzU" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzV" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bzW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bAh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bAj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAt" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bAL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bAM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig Infirmary"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"bAN" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bAO" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/warden"; + dir = 8; + name = "Brig Control APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bAP" = ( +/obj/structure/musician/piano{ + icon_state = "piano" + }, +/obj/machinery/camera{ + c_tag = "Bar South"; + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"bBd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/science/misc_lab) +"bBh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bBk" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/vending/sustenance, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bBl" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Gen-Pop Access"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bBp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/warden) +"bBq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/warden) +"bBr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/security/warden) +"bBs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/warden) +"bBt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bBy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"bBz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Security Lobby" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"bBA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"bBB" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bBH" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bBJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bBL" = ( +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) +"bBN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bBP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bBQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"bCt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bCv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/warden) +"bCz" = ( +/obj/structure/chair, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/wood, +/area/hallway/primary/central) +"bCA" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"bCC" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"bCD" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCG" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bCL" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCM" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCO" = ( +/turf/closed/wall, +/area/quartermaster/miningdock) +"bCQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bCT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 24 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bCW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio3"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bCY" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bDe" = ( +/obj/machinery/door/poddoor/shutters{ + id = "Skynet_launch"; + name = "mech bay" + }, +/obj/structure/fans/tiny, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"bDf" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"bDg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "10" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bDo" = ( +/obj/machinery/jukebox{ + req_one_access = null + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"bDr" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/main) +"bDv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bDA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bDB" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"bDE" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bDI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bDR" = ( +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"bDT" = ( +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bDU" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bDW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab) +"bEa" = ( +/turf/closed/wall/r_wall, +/area/science/misc_lab) +"bEb" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"bEe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/fitness/recreation) +"bEi" = ( +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bEl" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bEJ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"bES" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bEX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/item/toy/plush/nukeplushie, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bEZ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/item/toy/plush/lizardplushie, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bFb" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/item/toy/plush/carpplushie{ + color = "red"; + name = "Nanotrasen wildlife department space carp plushie" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bFc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bFd" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/closet/secure_closet/warden, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/clothing/suit/hooded/wintercoat/security, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bFf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bFj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bFk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bFl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bFn" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bFq" = ( +/obj/machinery/computer/crew, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bFs" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/item/clothing/suit/hooded/wintercoat/security, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bFw" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/closet/l3closet/scientist{ + pixel_x = -2 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bFx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bFA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bFD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/pen/red, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bFK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/tank_dispenser, +/obj/machinery/power/apc{ + areastring = "/area/science/misc_lab"; + dir = 8; + name = "Testing Lab APC"; + pixel_x = -29 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bFL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bFO" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bFT" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bGo" = ( +/obj/structure/fence/corner{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bGq" = ( +/obj/structure/fence/cut/large{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bGt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bGu" = ( +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bGv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/item/toy/plush/beeplushie, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"bGy" = ( +/turf/open/floor/plasteel/white, +/area/security/brig) +"bGB" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bGD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bGE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bGN" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bGO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/computer/prisoner/management{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bGR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 28 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bGT" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bGV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bGW" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bHc" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"bHh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bHj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"bHk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"bHl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"bHt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bHD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bHE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bHR" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/hos"; + dir = 8; + name = "Head of Security's Office APC"; + pixel_x = -24 + }, +/obj/machinery/computer/card/minor/hos{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bHS" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "HoS Office"; + req_access_txt = "58" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bHX" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/vending/security, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bIc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bIf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio2"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bIj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bIm" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"bIn" = ( +/obj/structure/closet/crate/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bIq" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"bIK" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/window/southleft{ + name = "Test Chamber"; + req_access_txt = "55"; + dir = 8 + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bIL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/door/window/southleft{ + name = "Test Chamber"; + req_access_txt = "55"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bJf" = ( +/obj/structure/cable, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bJl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bJn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bJp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bJq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/warden) +"bJs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bJt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bJu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bJw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bJy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor{ + name = "Reception Desk"; + req_access_txt = "63"; + dir = 1 + }, +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Reception Desk"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bJz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"bJC" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/science/mixing) +"bJF" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bJG" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bJQ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Arrivals Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"bKl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"bKo" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/wood, +/area/security/courtroom) +"bKs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"bKw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"bKI" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"bKL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"bKO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bKR" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bLc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering East" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bLv" = ( +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"bLI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen/fountain, +/obj/item/stamp/hos, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bLO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kanyewest"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"bLQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"bLS" = ( +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"bLT" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningdock) +"bLW" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera{ + c_tag = "Medbay Morgue"; + dir = 8; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"bLX" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"bMj" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bMs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bMN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/landmark/start/detective, +/turf/open/floor/carpet, +/area/security/detectives_office) +"bMP" = ( +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"bMT" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bMZ" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "misclab"; + name = "test chamber blast door" + }, +/obj/machinery/door/window/southleft{ + name = "Test Chamber"; + req_access_txt = "55" + }, +/obj/machinery/door/window/southleft{ + dir = 1; + name = "Test Chamber"; + req_access_txt = "55" + }, +/turf/open/floor/engine, +/area/science/misc_lab) +"bNb" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + pixel_x = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"bNf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bNk" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bNn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Southern Hall 2"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bNF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"bNN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bNR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/closet{ + name = "Evidence Closet" + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bNS" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bNT" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + name = "Detective's Office APC"; + pixel_y = -26 + }, +/turf/open/floor/carpet, +/area/security/detectives_office) +"bNV" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/security/detectives_office) +"bOb" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bOc" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"bOp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bOT" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_y = 4; + pixel_x = -7 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bOX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Evidence Storage"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bPa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 17 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bPf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 16 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"bPh" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/photocopier, +/obj/machinery/power/apc{ + areastring = "/area/library"; + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/turf/open/floor/wood, +/area/library) +"bPk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"bPm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"bPn" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/aft) +"bPq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bPW" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"bQf" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"bQg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"bQj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/central"; + dir = 1; + name = "Security Maint APC"; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"bQk" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"bQm" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"bQn" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"bQs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"bQx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/library) +"bQC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Toxins Storage"; + req_access_txt = "8" + }, +/turf/open/floor/plating, +/area/science/storage) +"bQP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"bRy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"bRD" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bRH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"bRL" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"bRN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bRQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen"; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"bSd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/chapel/main) +"bSu" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bSC" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 1; + height = 4; + name = "escape pod loader"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bSF" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/chapel/main) +"bSO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 3 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"bSS" = ( +/turf/closed/wall, +/area/maintenance/aft/secondary) +"bSX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"bTw" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"bTC" = ( +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bTE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bTH" = ( +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"bTM" = ( +/obj/machinery/door/poddoor/shutters/window{ + id = "armory2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bTR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"bTU" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/library) +"bTV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/library) +"bUm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"bUB" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bUD" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bUH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/central) +"bUJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood, +/obj/item/storage/book/bible, +/turf/open/floor/carpet, +/area/chapel/main) +"bUL" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bUP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/zone2) +"bVa" = ( +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"bVu" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"bVv" = ( +/obj/item/clothing/glasses/hud/health, +/obj/structure/closet/secure_closet/medical3, +/obj/machinery/camera{ + c_tag = "Northeast Paramedic Post"; + dir = 8; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"bVI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bVM" = ( +/obj/structure/grille, +/obj/structure/cable, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"bVQ" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bVR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/chapel/main) +"bVS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/chapel/main) +"bVT" = ( +/obj/item/cultivator, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bVW" = ( +/turf/open/floor/carpet, +/area/security/detectives_office) +"bVX" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bVZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/library) +"bWd" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/obj/machinery/camera{ + c_tag = "Toxins Storage"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel, +/area/science/storage) +"bWe" = ( +/turf/open/floor/engine/airless, +/area/science/mixing) +"bWf" = ( +/turf/closed/wall/r_wall, +/area/maintenance/aft/secondary) +"bWj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio3"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"bWM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/closet{ + name = "Evidence Closet" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"bWN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Chapel"; + departmentType = 2; + pixel_y = 30 + }, +/obj/machinery/camera{ + c_tag = "Chapel Office" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bWO" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/chapel/office"; + dir = 1; + name = "Chapel Office APC"; + pixel_y = 24 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"bWQ" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bWR" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security RC"; + pixel_x = 30 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"bXO" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/main) +"bXU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"bXV" = ( +/obj/machinery/door/morgue{ + name = "Private Study"; + req_access_txt = "37" + }, +/turf/open/floor/plating, +/area/library) +"bXW" = ( +/turf/open/floor/plasteel, +/area/science/storage) +"bYL" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/chair, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"bYU" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/dragnet{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet{ + pixel_x = -2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"bYY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"bYZ" = ( +/turf/open/floor/engine/airless, +/area/engine/atmos) +"bZa" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"bZt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"bZx" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/office) +"bZF" = ( +/turf/closed/wall, +/area/chapel/main) +"bZI" = ( +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"bZU" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cav" = ( +/obj/docking_port/stationary/random{ + dir = 8; + id = "pod_lavaland2"; + name = "lavaland" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"caA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"caJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"caS" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"cbt" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/wood, +/area/chapel/office) +"cbz" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/camera{ + c_tag = "Brig Evidence Storage" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"cbL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"cbO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cbQ" = ( +/turf/open/floor/engine, +/area/science/xenobiology) +"cci" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/chair/sofa/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"ccl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters{ + id = "capshut" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"ccD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"ccF" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"ccG" = ( +/turf/open/floor/engine/air, +/area/engine/atmos) +"ccI" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"ccN" = ( +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"cdj" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"cdk" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"cdt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"cdD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "heads_meeting"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/bridge/meeting_room) +"cdE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"cep" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cer" = ( +/turf/closed/wall/r_wall, +/area/chapel/office) +"ces" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cew" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/chapel/office) +"cex" = ( +/obj/machinery/nuclearbomb/selfdestruct, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"cey" = ( +/obj/machinery/computer/bank_machine, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"ceA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ceZ" = ( +/mob/living/simple_animal/bot/medbot, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"cfh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/item/pen/fountain/captain, +/obj/item/storage/box/matches, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"cfn" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"cfp" = ( +/turf/closed/wall, +/area/maintenance/disposal) +"cfs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"cfB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cfN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/tank_dispenser, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cgp" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/warden, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"cgH" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"cgY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cgZ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cha" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output, +/turf/open/floor/engine/airless, +/area/engine/atmos) +"chb" = ( +/turf/closed/wall/r_wall, +/area/bridge/meeting_room) +"chc" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"chd" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"chk" = ( +/obj/machinery/camera{ + c_tag = "Telecomms - Control Room"; + dir = 1; + network = list("ss13","tcomms") + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"chp" = ( +/turf/open/floor/plating, +/area/maintenance/aft) +"chN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"chZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"cio" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters{ + id = "capshut" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"civ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ciG" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input, +/turf/open/floor/engine/airless, +/area/engine/atmos) +"ciO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/light, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"cjA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"cjE" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cjH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"cjN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cjP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cjS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cjX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cjY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/poddoor/shutters{ + id = "capshut" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/captain) +"ckb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ckm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output, +/turf/open/floor/engine/air, +/area/engine/atmos) +"ckT" = ( +/obj/structure/cable, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/captain"; + name = "Captain's Office APC"; + pixel_y = -26 + }, +/mob/living/simple_animal/pet/fox/Renault, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"ckV" = ( +/obj/machinery/computer/cargo{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"ckW" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ckX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/bridge) +"ckY" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"clc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel/dark, +/area/bridge) +"clf" = ( +/obj/structure/table/wood, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/toy/dummy, +/obj/item/reagent_containers/food/snacks/baguette, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"clq" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cly" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"clB" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hor) +"clR" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"clV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/bridge) +"cmk" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"cmC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cmK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cmU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cmV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/carpet, +/area/bridge) +"cng" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"cni" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cnI" = ( +/obj/docking_port/stationary{ + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; + id = "syndicate_ne"; + name = "northeast of station"; + width = 23 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"coa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/central"; + dir = 4; + name = "Central Primary Hall APC"; + pixel_x = 25; + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"con" = ( +/obj/structure/window/reinforced, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cpe" = ( +/turf/closed/wall, +/area/ai_monitored/turret_protected/ai) +"cph" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Bridge Southeast" + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Bridge"; + departmentType = 5; + name = "Bridge RC"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cpC" = ( +/obj/machinery/quantumpad{ + map_pad_id = "2"; + map_pad_link_id = "1" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"cqa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"cqd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cqo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cqp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/modular_computer/console/preset/command{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cqq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"cqr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"cqt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"cqC" = ( +/obj/machinery/biogenerator, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"cqG" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 8 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"cqM" = ( +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"crg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cry" = ( +/obj/machinery/computer/robotics{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"crz" = ( +/obj/structure/table, +/obj/item/stamp/rd{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/pen/fountain, +/obj/item/folder/white, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/hor"; + dir = 1; + name = "RD Office APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"cuO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cuY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"cvH" = ( +/obj/machinery/computer/arcade, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"cwm" = ( +/obj/machinery/vending/boozeomat, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"cwo" = ( +/obj/machinery/space_heater, +/obj/machinery/camera{ + c_tag = "Arrivals Airlock" + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"cwH" = ( +/obj/machinery/autolathe, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"cwT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"cwW" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cxX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/medical{ + name = "Patient Room"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cya" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/construction/storage) +"cyb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Chamber"; + req_access_txt = "16" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Chamber entrance shutters"; + name = "AI Chamber entrance shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"cyu" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/barricade/wooden/crude/snow{ + max_integrity = 15; + obj_integrity = 15 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"cyH" = ( +/obj/structure/closet/wardrobe/engineering_yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cyI" = ( +/obj/machinery/seed_extractor, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"cyM" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"czu" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"czA" = ( +/obj/structure/sign/directions/engineering{ + pixel_x = 32; + pixel_y = -40 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"czF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Medbay West"; + network = list("ss13","medbay"); + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"czN" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/dark, +/area/bridge) +"czY" = ( +/turf/closed/wall/r_wall, +/area/maintenance/aft) +"cAa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/science/misc_lab) +"cAe" = ( +/turf/open/floor/plasteel, +/area/maintenance/aft) +"cAo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cAq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/command/glass{ + name = "EVA Storage"; + req_access_txt = "18" + }, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"cAL" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/rnd/production/techfab/department/security, +/turf/open/floor/plasteel/dark, +/area/security/main) +"cBt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"cBv" = ( +/obj/structure/fence, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"cBy" = ( +/turf/open/floor/plasteel/dark, +/area/security/main) +"cBD" = ( +/turf/closed/wall/r_wall, +/area/security/main) +"cBF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cBI" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/chapel/main) +"cBJ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input, +/obj/machinery/air_sensor/atmos/air_tank{ + pixel_x = 25 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"cCb" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"cCd" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"cCg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/door/window/northright{ + name = "Engineering Delivery"; + req_access_txt = "10" + }, +/obj/machinery/door/window/northright{ + name = "Engineering Delivery"; + req_access_txt = "10"; + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"cCp" = ( +/obj/structure/table, +/obj/item/integrated_electronics/wirer, +/obj/item/integrated_electronics/debugger, +/obj/item/integrated_electronics/analyzer, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"cCA" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -31 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cCH" = ( +/turf/closed/wall/r_wall, +/area/library) +"cCT" = ( +/obj/structure/table/wood, +/obj/item/storage/lockbox/medal, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Captain's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"cDm" = ( +/turf/open/floor/plasteel/dark, +/area/bridge) +"cDL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cDN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"cDO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cDS" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"cEb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"cEq" = ( +/obj/structure/reflector/single, +/turf/open/floor/plating, +/area/engine/storage) +"cFm" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -30 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"cFO" = ( +/obj/machinery/light/small, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"cFP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"cGu" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"cGz" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction/storage) +"cGF" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/belt/utility, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cGQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cGZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology South"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cHu" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"cIg" = ( +/obj/machinery/modular_computer/console/preset/research{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"cIh" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"cIP" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"cJc" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tower, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"cJp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"cJH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"cJL" = ( +/turf/open/floor/plasteel, +/area/storage/primary) +"cKk" = ( +/turf/closed/wall, +/area/crew_quarters/bar) +"cKD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"cKK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/atmos) +"cKQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cLq" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dormitory" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cLC" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/autolathe/secure{ + name = "public autolathe" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cLO" = ( +/turf/open/floor/engine, +/area/engine/engineering) +"cLX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Bridge Northwest"; + dir = 1 + }, +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"cMc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cNm" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"cNE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/engine/engineering) +"cNI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/mixing) +"cOl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cOn" = ( +/obj/machinery/door/poddoor/shutters{ + id = "qm_warehouse2"; + name = "warehouse shutters" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"cOq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"cOR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"cPn" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"cPI" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"cQa" = ( +/obj/machinery/quantumpad{ + map_pad_id = "6"; + map_pad_link_id = "5" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"cQp" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cQr" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/northleft{ + name = "Telecomms Access"; + req_access_txt = "61" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"cQu" = ( +/obj/structure/table, +/obj/item/clothing/head/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/clothing/head/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/multitool, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cQv" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"cRa" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/janitor) +"cRJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"cRX" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/medical/virology"; + dir = 8; + name = "Virology APC"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"cSd" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/storage/tech) +"cSg" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cSi" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"cSv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cSC" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"cSG" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cSQ" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/science/xenobiology) +"cSY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"cTh" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"cTp" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"cTD" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/courtroom) +"cTE" = ( +/obj/structure/closet/l3closet/scientist, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"cTG" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"cTL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"cTO" = ( +/turf/closed/wall/r_wall, +/area/quartermaster/miningoffice) +"cUd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"cUm" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"cUC" = ( +/obj/structure/chair, +/obj/effect/landmark/start/geneticist, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"cUN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"cUP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"cUS" = ( +/obj/structure/closet/emcloset, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"cUV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"cVu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cVG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/storage/primary) +"cVL" = ( +/obj/machinery/light, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/fore) +"cWG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/clipboard, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen/red, +/obj/item/stamp{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"cWO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"cXi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"cXr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"cXI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"cXO" = ( +/obj/structure/cable, +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + base_state = "rightsecure"; + dir = 1; + icon_state = "rightsecure"; + layer = 4.1; + name = "Secondary AI Core Access"; + obj_integrity = 300; + pixel_y = 4; + req_access_txt = "16" + }, +/obj/item/radio/intercom{ + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_x = -25; + pixel_y = -10 + }, +/obj/item/radio/intercom{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = -25; + pixel_y = 5 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Common Channel"; + pixel_x = -25 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"cYb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"cYj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + name = "Kitchen cold room"; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"cYq" = ( +/obj/machinery/suit_storage_unit/atmos, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cYw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Supermatter East"; + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"cYK" = ( +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"cYU" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"cZk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"cZq" = ( +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'BOMB RANGE"; + name = "BOMB RANGE" + }, +/turf/closed/wall, +/area/icemoon/surface/outdoors) +"cZr" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/effect/landmark/start/captain, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"cZI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"cZN" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"cZO" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"daj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/obj/item/wrench, +/obj/item/assembly/timer, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel/dark, +/area/bridge) +"daP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"daX" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"dbb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"dbc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"dbl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dbB" = ( +/obj/structure/table/optable, +/obj/machinery/camera{ + c_tag = "Brig Infirmary"; + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"dbN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dbR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "MiniSat External West"; + dir = 8; + network = list("minisat"); + start_active = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"dcg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/mirror{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/shower{ + pixel_y = 20; + pixel_x = 11 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"ddh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ddi" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dfa" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/welding, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"dfd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"dfx" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/solar{ + id = "portsolar"; + name = "Port Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"dfy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"dfV" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dgI" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel, +/area/science/storage) +"dhX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dij" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/carpet, +/area/bridge) +"diD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"diH" = ( +/turf/closed/wall, +/area/chapel/office) +"djL" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Genetics Maintenance"; + req_access_txt = "5; 9; 68" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/genetics) +"dks" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"dkB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dkD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"dkQ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera{ + c_tag = "Engineering South"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dlJ" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/oxygen, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"dlZ" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 3"; + name = "Cell 3 Locker" + }, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dmc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"dml" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/security/brig) +"dmy" = ( +/obj/machinery/door/airlock/engineering{ + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"dmE" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/port/aft) +"dnm" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"dnn" = ( +/obj/machinery/button/door{ + id = "permacell1"; + name = "Genpop Lockdown"; + pixel_x = -4; + pixel_y = 25; + req_access_txt = "2" + }, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dns" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 4; + id = "snaxi_ne"; + name = "Northeast Taxi Port"; + width = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"doD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/closet/emcloset, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"doI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/telecomms/hub/preset, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"doN" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/wood, +/area/library) +"doV" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"dpp" = ( +/turf/open/floor/plating, +/area/maintenance/disposal) +"dpZ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"dqE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Reception Desk"; + req_access_txt = "63" + }, +/obj/machinery/button/door{ + id = "innerbrig"; + name = "Brig Doors Control"; + normaldoorcontrol = 1; + pixel_x = -4; + pixel_y = 6; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"dqO" = ( +/obj/machinery/teleport/station, +/obj/machinery/button/door{ + id = "teledoor"; + name = "Teleport Shutters Control"; + pixel_x = 25; + req_access_txt = "17;65" + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"dri" = ( +/turf/closed/indestructible/rock/glacierrock/blue, +/area/engine/secure_construction) +"drK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/flashlight/lamp/green{ + pixel_y = 1; + pixel_x = -7 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"dsk" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/hallway/primary/port) +"dsn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) +"dsX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/crate, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dtc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/storage) +"dtm" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"dtt" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/wood, +/area/security/courtroom) +"dtQ" = ( +/obj/structure/chair/comfy/black, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"duu" = ( +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"duB" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"duI" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"duJ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"duX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"dvc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dvh" = ( +/obj/structure/table/reinforced, +/mob/living/carbon/monkey/punpun, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"dvs" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"dvw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"dvO" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"dwF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dwS" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/plating, +/area/maintenance/starboard) +"dxF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dxL" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"dxO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dxV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dxZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dyW" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/secure_closet/lethalshots, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"dzS" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "QM #4" + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"dAi" = ( +/obj/structure/sign/warning/pods{ + pixel_x = -32 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"dAs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dAM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"dAV" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"dBL" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"dBP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"dBR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/sorting) +"dCs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"dCI" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"dCM" = ( +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dDf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dDC" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/closet/crate/engineering{ + name = "Antimatter Engine Crate" + }, +/obj/machinery/power/am_control_unit, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_containment, +/obj/item/am_containment, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"dDK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"dEk" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"dED" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"dEX" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"dFa" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"dFb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dFp" = ( +/obj/machinery/processor/slime, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"dFt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/turnstile{ + name = "Genpop Exit Turnstile"; + req_access_txt = "70"; + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dFC" = ( +/obj/machinery/vending/wardrobe/curator_wardrobe, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/library) +"dFF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/quartermaster/qm) +"dFJ" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/science/lab) +"dGb" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"dGB" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"dGO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"dGP" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Mining Office"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"dGV" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"dHe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"dHw" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/science/mixing) +"dHP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dIj" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/mineral_door/woodrustic, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"dJb" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm3"; + name = "Room Two" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"dJc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"dJB" = ( +/obj/machinery/telecomms/bus/preset_four, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"dJZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dKn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"dKw" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"dKF" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/engine/engineering) +"dKQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"dLj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"dLv" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dMj" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/nuke_storage) +"dMI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"dML" = ( +/obj/structure/table, +/obj/item/surgicaldrill, +/obj/item/surgical_drapes, +/obj/item/razor, +/obj/machinery/camera{ + c_tag = "Surgery A"; + network = list("ss13","medbay"); + pixel_x = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"dMR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"dNB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"dOP" = ( +/obj/machinery/button/door{ + id = "Skynet_launch"; + name = "Mech Bay Door Control"; + pixel_x = 6; + pixel_y = 24; + req_access_txt = "29" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/science/robotics/mechbay) +"dOR" = ( +/obj/machinery/recharger{ + name = "wall-mounted recharger"; + pixel_x = 25 + }, +/obj/machinery/recharger{ + name = "wall-mounted recharger"; + pixel_x = 39 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"dPn" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"dPx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"dPA" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/gibber, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"dPL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/main) +"dPM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 29 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"dQz" = ( +/turf/closed/wall, +/area/storage/eva) +"dQT" = ( +/obj/machinery/smartfridge/extract/preloaded, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"dQW" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dRF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"dRI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/service) +"dSp" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "/area/engine/storage"; + dir = 1; + name = "Engineering Secure Storage APC"; + pixel_y = 25 + }, +/turf/open/floor/plating, +/area/engine/storage) +"dSQ" = ( +/turf/closed/wall, +/area/maintenance/starboard) +"dTo" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"dTy" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/starboard/fore) +"dTE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"dTL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "GeneticsDoor"; + name = "Genetics"; + req_access_txt = "5; 68" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"dTS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"dTU" = ( +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "TEG Engine Room"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"dTV" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"dUH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"dUI" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/engine/break_room"; + name = "Engineering Foyer APC"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"dUM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"dUV" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dVr" = ( +/obj/structure/chair/comfy/brown, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dVG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"dVJ" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"dVV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dWt" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/vehicle/ridden/janicart, +/turf/open/floor/plasteel, +/area/janitor) +"dWF" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/security/courtroom) +"dWI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"dWU" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/turf/open/floor/wood, +/area/library) +"dXa" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"dXF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"dXR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"dYa" = ( +/obj/machinery/requests_console{ + department = "Genetics"; + name = "Genetics Requests Console"; + pixel_y = 30 + }, +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"dYl" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"dYS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/break_room) +"dYZ" = ( +/obj/docking_port/stationary{ + dwidth = 1; + height = 4; + name = "escape pod loader"; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"dZa" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"dZg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2; + sortType = 25 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"dZV" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"ebq" = ( +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"ebF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/medical/medbay/central) +"ebK" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ebM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/auxiliary) +"ebX" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"ect" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"ecD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ecI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ecN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"edH" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"edM" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"edW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eed" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Robotics Desk"; + req_access_txt = "29" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"eeh" = ( +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Escape Arm Southwest"; + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"eex" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/meter, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ + pixel_x = -9; + pixel_y = -25 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"eeE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eeM" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"efk" = ( +/obj/machinery/vending/games, +/obj/machinery/camera{ + c_tag = "Rec Room" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"efn" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"efp" = ( +/obj/machinery/iv_drip, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"efE" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"efF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel, +/area/janitor) +"efT" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"egg" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"egj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"egk" = ( +/turf/closed/wall, +/area/engine/atmos) +"ego" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"egJ" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"egM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"eha" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ehh" = ( +/obj/effect/spawner/lootdrop/bedsheet, +/obj/structure/bed, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"ehL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"ehX" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"ehZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"eih" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door_timer{ + id = "Cell 3"; + name = "Cell 3"; + pixel_y = 32 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/brig"; + dir = 4; + name = "Brig APC"; + pixel_x = 26 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"eik" = ( +/obj/docking_port/stationary/random{ + id = "pod_lavaland2"; + name = "lavaland" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"eiz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -26 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"eiR" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/westleft{ + dir = 2; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"eiW" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/button/flasher{ + id = "PCell 1"; + pixel_y = 9; + pixel_x = -37 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ejw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ekw" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"emh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"emH" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/disposal) +"eng" = ( +/obj/structure/table, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"enq" = ( +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"enN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/sofa/left, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"enP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"eoL" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = 6; + pixel_y = -29 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/main) +"eoT" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"eoW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"epc" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/landmark/start/librarian, +/turf/open/floor/wood, +/area/library) +"epU" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/central) +"eqP" = ( +/turf/open/floor/plasteel, +/area/construction/storage) +"eqZ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plasteel, +/area/science/storage) +"erc" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/machinery/door/window/northleft{ + name = "Engineering Production"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ery" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"erG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel, +/area/engine/break_room) +"erO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"esi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/turnstile{ + name = "Genpop Exit Turnstile"; + req_access_txt = "70"; + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"esq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"esE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"esY" = ( +/turf/open/openspace/icemoon, +/area/engine/atmos) +"ets" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"etz" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/telecomms/bus/preset_one, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"etB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"etM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"eua" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/janitor) +"eue" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-04" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"eus" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"eut" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"euS" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"euW" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"evr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"evI" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"evJ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"evO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/disposal) +"evU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Telecommunications"; + req_access_txt = "61" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"evY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"ewI" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 29 + }, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"ewK" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/security/courtroom) +"ewY" = ( +/obj/machinery/light, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"exi" = ( +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"exq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"exs" = ( +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"eyP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"eyS" = ( +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"ezO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"ezY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eAJ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"eAR" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/starboard) +"eBf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"eBj" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "MiniSat External South"; + network = list("minisat"); + start_active = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"eBl" = ( +/obj/structure/cable, +/obj/machinery/suit_storage_unit/ce, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/crew_quarters/heads/chief"; + name = "CE Office APC"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"eBm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"eBq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"eCd" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"eDr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"eDt" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/fans/tiny/invisible, +/obj/structure/barricade/wooden/crude/snow{ + max_integrity = 15; + obj_integrity = 15 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"eDu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/aft) +"eDE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Power Storage"; + req_access_txt = "11" + }, +/turf/open/floor/plating, +/area/engine/storage) +"eEa" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"eEy" = ( +/obj/machinery/doorButtons/access_button{ + idDoor = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_y = 28; + req_access_txt = "39" + }, +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Virology Airlock"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"eEB" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"eFn" = ( +/obj/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"eFy" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/arcade/minesweeper{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"eFB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/rag, +/turf/open/floor/wood, +/area/maintenance/bar) +"eFC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"eFG" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"eFU" = ( +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"eGi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"eGF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light/small, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/camera{ + c_tag = "Captain's Quarters"; + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"eGL" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/wood, +/area/library) +"eGO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/research{ + name = "Research and Development Lab"; + req_one_access_txt = "7;29" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/science/lab) +"eHn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"eHK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"eIa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"eIc" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"eIN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"eJh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"eJu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"eJY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"eKc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"eKe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Reception Desk"; + req_access_txt = "3" + }, +/obj/machinery/door/window/southright{ + dir = 4; + name = "Reception Desk"; + req_access_txt = "63" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Brig Control"; + name = "brig shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"eKO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"eKZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"eLf" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"eLl" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"eLm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"eLQ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/secure_construction"; + dir = 8; + name = "Secure Construction"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"eLX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"eMi" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eMl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"eMJ" = ( +/obj/machinery/door/window/eastleft{ + dir = 1; + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/chapel/office) +"eMQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"eMU" = ( +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"eNu" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 4; + id = "snaxi_nw"; + name = "Northwest Taxi Port"; + width = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"eNG" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"eNK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"eNX" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"eOd" = ( +/obj/structure/closet/wardrobe/green, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"eOn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/item/clothing/suit/hooded/wintercoat/security, +/turf/open/floor/plasteel/dark, +/area/security/main) +"eOr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/event_spawn, +/obj/machinery/camera{ + c_tag = "Supermatter South"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"eOt" = ( +/obj/machinery/computer/arcade/orion_trail{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Bar East"; + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"eOK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"eOO" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"eOZ" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ePa" = ( +/obj/machinery/gateway/centerstation, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"eQd" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/secure_construction) +"eQC" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"eRt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"eRu" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"eRv" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/engine{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"eRW" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/wood, +/area/library) +"eSJ" = ( +/obj/structure/table/glass, +/obj/item/clothing/glasses/hud/health, +/obj/item/healthanalyzer, +/obj/item/clothing/gloves/color/latex, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"eSK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"eSP" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera{ + c_tag = "Medbay Treatment Center"; + dir = 8; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"eSQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Genetics Research"; + req_access_txt = "5; 9; 68" + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"eTg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"eTu" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/structure/fans/tiny, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"eTv" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/ore_silo, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"eTJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"eTR" = ( +/obj/machinery/telecomms/bus/preset_two, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"eTX" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"eUB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"eVp" = ( +/obj/machinery/portable_atmospherics/canister/bz, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"eVW" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/secure_closet{ + name = "nonlethal ammunition"; + req_access = "list(3)" + }, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/obj/item/storage/box/rubbershot, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"eWg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eWw" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"eWH" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"eWW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"eXd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/mineral/wood, +/area/maintenance/bar) +"eYe" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/recycler, +/turf/open/floor/plating, +/area/maintenance/disposal) +"eYu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"eZe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/motion{ + c_tag = "AI Upload Foyer"; + network = list("aiupload") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"eZi" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"eZn" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor North" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"eZA" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/bridge/meeting_room"; + dir = 1; + name = "Conference Room APC"; + pixel_y = 26 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"eZU" = ( +/obj/machinery/conveyor{ + id = "QMLoad2"; + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"fad" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/monkey_recycler, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"faJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"faR" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/storage/atmos) +"faV" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"faZ" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fbb" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"fbq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"fch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"fcj" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/courtroom"; + dir = 8; + name = "Courtroom APC"; + pixel_x = -24 + }, +/obj/structure/closet/secure_closet/courtroom, +/obj/item/gavelhammer, +/turf/open/floor/wood, +/area/security/courtroom) +"fcl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 1"; + name = "Cell 1"; + dir = 8 + }, +/obj/effect/turf_decal/vg_decals/numbers/one, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fcu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"fcz" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/secure_closet/miner, +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"fcJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/hallway/primary/central) +"fcU" = ( +/obj/machinery/vending/kink, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fdu" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/box/trackimp{ + pixel_x = -3 + }, +/obj/item/storage/box/chemimp{ + pixel_x = 6 + }, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fdJ" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"fen" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"fet" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat/service) +"feM" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/maintenance/solars/starboard/fore) +"ffm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ffJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"fga" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"fgj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"fgp" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"fgM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"fhi" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"fho" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/landmark/start/ai/secondary, +/obj/machinery/door/window{ + base_state = "rightsecure"; + icon_state = "rightsecure"; + layer = 4.1; + name = "Secondary AI Core Access"; + obj_integrity = 300; + pixel_y = -4; + req_access_txt = "16" + }, +/obj/item/radio/intercom{ + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_x = -25; + pixel_y = -10 + }, +/obj/item/radio/intercom{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = -25; + pixel_y = 5 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Common Channel"; + pixel_x = -25 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"fhz" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fhC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"fhM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fiw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"fiG" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"fiI" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"fiN" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"fjc" = ( +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/computer/crew{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fjw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fjL" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"fjS" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"fjU" = ( +/turf/open/floor/plasteel/white, +/area/science/mixing) +"fkr" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"fkC" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"fkN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L14" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"flh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera/motion{ + c_tag = "Armory - External 1"; + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"flw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fmk" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fmt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Equipment Room"; + req_access_txt = "1" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fmw" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fmW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/computer/cargo/request, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fnc" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/box/flashbangs{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/box/flashbangs{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/storage/box/flashbangs, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fne" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"fni" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{ + dir = 8 + }, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"fnu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/quantumpad{ + map_pad_id = "1"; + map_pad_link_id = "2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"fnx" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"fnQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/engine/storage) +"foi" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plating, +/area/engine/storage) +"fok" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"foy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/secequipment, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fpt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"fpI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"fpJ" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"fpS" = ( +/obj/structure/table, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/surgical_drapes, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/camera{ + c_tag = "Robotics Lab"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"fpW" = ( +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "QM #2" + }, +/obj/machinery/camera{ + c_tag = "Cargo Garage"; + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"fqj" = ( +/obj/machinery/field/generator, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/storage) +"fqE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fqM" = ( +/obj/structure/table, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"frh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/bridge) +"frn" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"frB" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"frL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fsh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fsA" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"fsJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fsQ" = ( +/obj/machinery/ntnet_relay, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"ftH" = ( +/obj/machinery/mineral/ore_redemption{ + input_dir = 2; + output_dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"ftM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ftV" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"fuj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/storage/eva) +"fuy" = ( +/obj/machinery/light, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fuB" = ( +/obj/machinery/camera{ + c_tag = "Auxiliary Bridge North"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"fuG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"fuX" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/chair/sofa{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"fuZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fva" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fve" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fvz" = ( +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"fwn" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/machinery/requests_console{ + department = "Robotics"; + departmentType = 2; + name = "Robotics RC"; + pixel_y = 30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"fww" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"fwU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"fwX" = ( +/obj/structure/table, +/obj/item/surgical_drapes, +/obj/item/surgicaldrill, +/obj/item/razor, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"fxY" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{ + dir = 8 + }, +/obj/machinery/air_sensor/atmos/toxin_tank{ + pixel_y = -25 + }, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"fyr" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table, +/obj/item/key/janitor, +/obj/machinery/power/apc{ + areastring = "/area/janitor"; + dir = 4; + name = "Custodial Closet APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/janitor) +"fyz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"fyV" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fze" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fzg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"fzG" = ( +/obj/structure/sign/barsign, +/turf/closed/wall, +/area/crew_quarters/bar) +"fzQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/main) +"fzT" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"fzU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/radio/off, +/obj/item/radio/off{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"fAj" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"fBc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/nuke_storage) +"fBf" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"fBk" = ( +/obj/machinery/camera{ + c_tag = "Northwestern Hall 10" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"fBs" = ( +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Bathrooms"; + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"fBG" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"fBS" = ( +/turf/open/floor/plating, +/area/engine/storage) +"fCh" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "TEG Chamber"; + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"fCQ" = ( +/obj/structure/toilet/secret/low_loot{ + pixel_y = 14 + }, +/obj/machinery/button/door{ + id = "Bath2"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + specialfunctions = 4; + pixel_y = -5 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"fDi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"fDo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"fDt" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fDJ" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"fET" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera{ + c_tag = "Southeastern Hall 1"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fFG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/camera{ + c_tag = "Engineering Access" + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 20 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/break_room) +"fFM" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Tech Storage"; + req_access_txt = "19;23" + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"fGi" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"fGl" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fHa" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/box/ids, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"fHh" = ( +/obj/machinery/light, +/obj/machinery/computer/security/hos{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = -32 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"fHF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/atmos) +"fIu" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fII" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"fIS" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/potato, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"fIU" = ( +/obj/machinery/light, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"fIY" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/starboard/fore"; + dir = 8; + name = "Starboard Bow Solar APC"; + pixel_x = -25; + pixel_y = 3 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"fJc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 21 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"fJg" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"fJs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 11 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fJO" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"fJW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"fJZ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"fKc" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48"; + shuttledocked = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"fKl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fKC" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hos) +"fKE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fKM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_exterior"; + name = "Virology Exterior Airlock"; + req_access_txt = "39" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "virology_airlock_exterior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_x = -24; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"fLv" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/power/apc{ + areastring = "/area/security/main"; + name = "Security Office APC"; + pixel_y = -26 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fLB" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/gun/energy/temperature/security, +/obj/item/clothing/suit/armor/laserproof, +/obj/item/gun/energy/ionrifle, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"fLK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"fLL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"fLW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24; + pixel_y = -28 + }, +/turf/open/floor/plating, +/area/storage/atmos) +"fNd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fNh" = ( +/obj/structure/cable, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fNC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/bridge) +"fNO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Genetics Cloning"; + network = list("ss13","medbay") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"fNR" = ( +/obj/machinery/camera{ + c_tag = "South Paramedic Post"; + dir = 8; + network = list("ss13","medbay") + }, +/obj/structure/table, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"fNU" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/camera{ + c_tag = "Cargo Bay South"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fOA" = ( +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"fOC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"fOG" = ( +/obj/machinery/light, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/aft) +"fOW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"fPd" = ( +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/machinery/camera{ + c_tag = "Primary Tool Storage" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"fPp" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"fPD" = ( +/turf/open/floor/wood, +/area/crew_quarters/bar) +"fPF" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"fPM" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"fPN" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/flashlight/lamp/green{ + pixel_y = 1; + pixel_x = -7 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"fQc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fQe" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Auxiliary Tool Storage"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"fQi" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"fQs" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"fQx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fQI" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"fQM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"fQU" = ( +/obj/machinery/light, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"fRS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fSw" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fSR" = ( +/obj/machinery/camera{ + c_tag = "Server Room"; + network = list("ss13","rd"); + pixel_x = 22 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"fTg" = ( +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"fTn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"fTu" = ( +/obj/machinery/door/firedoor/border_only, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 2"; + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"fTy" = ( +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"fTM" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"fUm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"fUX" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"fVm" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/bar) +"fVQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"fVT" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"fWc" = ( +/obj/structure/rack, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"fWB" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"fWE" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"fXd" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"fXU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2; + sortType = 29 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"fYa" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"fYl" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/structure/windoor_assembly{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"fYx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/primary/port) +"fYH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 29 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"fYQ" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"fYU" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"fZn" = ( +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"fZA" = ( +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/engine/storage) +"gaf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gar" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"gbt" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gcp" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Bar"; + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"gct" = ( +/obj/machinery/quantumpad{ + map_pad_id = "4"; + map_pad_link_id = "3" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"gcw" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"gcY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock{ + name = "Bar"; + req_access_txt = "25" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"gdg" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/kitchen"; + dir = 1; + name = "Kitchen APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"gdi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gdj" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"gdL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gel" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gev" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"geO" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"gfC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gfF" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"gfN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"gfQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"gfY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/library) +"ggl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"ggD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ghq" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"giv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 28 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"giT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"giZ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"gjA" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"gjW" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/engineering) +"gkl" = ( +/obj/machinery/jukebox, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gkt" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/aft) +"gkv" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gkx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gky" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"gkJ" = ( +/obj/machinery/power/emitter, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plating, +/area/engine/storage) +"gkX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio8"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"glg" = ( +/obj/structure/closet/crate/solarpanel_small, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gls" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/door/window/westright{ + name = "Red Corner" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"gmf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"gmn" = ( +/obj/effect/landmark/loneopspawn, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 7 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"gmr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gmH" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"gnf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 7 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"gnm" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/bot_white, +/obj/vehicle/ridden/atv/snowmobile/snowcurity, +/obj/item/key/security, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"gnv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"gop" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Brig Gen-Pop Access" + }, +/obj/machinery/button/door{ + id = "Secure Gate"; + name = "Cell Shutters"; + pixel_y = 24; + req_access_txt = "2"; + pixel_x = 3 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"got" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"goC" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"goK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"goM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"goW" = ( +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gpe" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"gph" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"gpp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"grs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"grz" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"grM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"grV" = ( +/turf/closed/wall, +/area/security/courtroom) +"grZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/aiModule/core/full/custom, +/obj/item/aiModule/core/freeformcore, +/obj/item/aiModule/core/full/asimov, +/obj/effect/spawner/lootdrop/aimodule_harmless, +/obj/effect/spawner/lootdrop/aimodule_neutral, +/obj/machinery/camera/motion{ + c_tag = "AI Upload Chamber - Starboard"; + dir = 1; + network = list("aiupload") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"gsr" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"gsK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"gsM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gsQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gto" = ( +/obj/structure/sink{ + pixel_y = 20 + }, +/mob/living/simple_animal/pet/bumbles, +/turf/open/floor/plasteel, +/area/hydroponics) +"gtG" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/aft) +"gtR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"gtS" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"guv" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/toilet/secret/low_loot{ + pixel_y = 14 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/fitness/recreation) +"guD" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/aft) +"guE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"guI" = ( +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"guR" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"guV" = ( +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gvm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"gvp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"gvP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gwY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"gxi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gxq" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_x = -30 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"gxF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"gxL" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"gxY" = ( +/obj/machinery/door/airlock{ + name = "Service Hall"; + req_one_access_txt = "25;26;35;28" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"gyk" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/vending/security, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"gyE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gzk" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"gzt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gzH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"gzW" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gzZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/scrubber, +/obj/item/storage/firstaid/toxin, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"gAt" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/port/fore"; + dir = 8; + name = "Port Bow Solar APC"; + pixel_x = -25; + pixel_y = 3 + }, +/obj/machinery/camera{ + c_tag = "Fore Port Solar Control"; + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"gAu" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/chapel/main) +"gAG" = ( +/obj/structure/table/wood, +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"gAY" = ( +/mob/living/simple_animal/bot/secbot{ + arrest_type = 1; + health = 45; + icon_state = "secbot1"; + idcheck = 1; + name = "Sergeant-at-Armsky"; + weaponscheck = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"gBk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gBF" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/chapel/main) +"gCd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gCs" = ( +/obj/item/reagent_containers/food/snacks/spidereggsham, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/library) +"gCC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/atmos) +"gCG" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/central) +"gCJ" = ( +/obj/item/beacon, +/turf/open/floor/plasteel/dark, +/area/bridge) +"gCM" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/computer/atmos_control/tank/mix_tank, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gCO" = ( +/obj/machinery/light, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"gCS" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"gEd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"gEh" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/engine/storage) +"gEz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"gFb" = ( +/obj/machinery/vending/wardrobe/law_wardrobe, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/requests_console{ + department = "Law office"; + pixel_x = 32 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"gFq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"gFM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"gFP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"gGs" = ( +/obj/machinery/turretid{ + control_area = "/area/ai_monitored/turret_protected/ai_upload"; + icon_state = "control_stun"; + name = "AI Upload turret control"; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"gGQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"gHe" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"gHG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"gHQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 2 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"gId" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"gIm" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/cmo) +"gIE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/virology) +"gIG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gJi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"gJx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"gJP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"gJQ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gKo" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"gKt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gKB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"gKR" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"gLk" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"gLH" = ( +/turf/closed/wall/r_wall, +/area/teleporter) +"gLO" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/door/poddoor{ + id = "trash"; + name = "disposal bay door" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"gMD" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"gML" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plasteel, +/area/science/storage) +"gMR" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/research_director, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/holopad, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"gNb" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"gNq" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"gNy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gNI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"gNM" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"gOd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"gOi" = ( +/obj/structure/chair, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"gOp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gOr" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"gOM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gOW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"gPb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/storage/atmos) +"gPE" = ( +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"gPF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/plating, +/area/engine/storage) +"gPS" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"gQj" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"gQw" = ( +/turf/open/floor/carpet, +/area/hallway/primary/central) +"gQU" = ( +/obj/structure/table, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"gQV" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"gQZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gRh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"gRE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"gRP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"gRS" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gSh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"gSu" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"gSY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"gSZ" = ( +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"gTb" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"gTc" = ( +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Research Division Delivery"; + req_access_txt = "47" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/white, +/area/science/lab) +"gTh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"gTH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main) +"gUa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/light, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/storage/primary) +"gUb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"gUc" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"gUw" = ( +/obj/structure/plasticflaps, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "supply dock loading door" + }, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"gUA" = ( +/obj/machinery/sparker{ + id = "testigniter"; + pixel_x = -25 + }, +/turf/open/floor/engine, +/area/science/misc_lab) +"gUL" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"gVo" = ( +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"gWc" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"gWj" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"gWn" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"gWZ" = ( +/obj/machinery/computer/telecomms/monitor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"gXD" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"gXE" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/medical_cloning{ + pixel_y = 6 + }, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"gXM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"gYw" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/chapel/main) +"gYC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"gZb" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/zone3"; + dir = 4; + name = "Northeast Paramedic Station APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"gZG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"gZQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/central) +"gZS" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"gZX" = ( +/turf/closed/wall, +/area/medical/morgue) +"hah" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"haj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hap" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"haU" = ( +/obj/machinery/button/door{ + id = "kitchen"; + name = "Kitchen Shutters Control"; + req_access_txt = "28"; + pixel_x = 24; + pixel_y = -4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"hbb" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/bar) +"hch" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/wood, +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/item/paper_bin, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/chapel/office) +"hcu" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hcz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"hcV" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"hdn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"hez" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"hfk" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"hfp" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hfX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"hfZ" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"hgb" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"hge" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hgg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/genpop, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hgp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/main) +"hgJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"hgM" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hgO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"hhb" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/soup/coldchili, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"hho" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"hhx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"hhz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hhI" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/door/window/westleft{ + dir = 1; + name = "Monkey Pen"; + req_access_txt = "9" + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"hik" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"hiO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hjv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"hjw" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hjF" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/plasteel, +/area/science/storage) +"hkw" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/monitor{ + name = "bridge power monitoring console"; + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hlx" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"hlT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"hmC" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"hmM" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"hmX" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"hnc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"hnB" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/machinery/light_switch{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/mob/living/simple_animal/pet/cat/Runtime, +/obj/machinery/camera{ + c_tag = "Chief Medical Office"; + dir = 8; + network = list("ss13","medbay"); + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"hnO" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"hnP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"hom" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hop" = ( +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hoq" = ( +/turf/closed/wall, +/area/engine/break_room) +"hoV" = ( +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/obj/machinery/computer/card/minor/qm, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"hoX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hpa" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/science/xenobiology) +"hpg" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hpw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/stamp/law, +/obj/item/flashlight/lamp/green{ + pixel_y = 1; + pixel_x = -7 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"hpC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"hpN" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"hpV" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/structure/table/wood, +/obj/item/stack/sheet/mineral/wood/fifty{ + amount = 20 + }, +/obj/item/reagent_containers/food/drinks/flask/gold, +/obj/item/razor{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/clothing/mask/cigarette/cigar, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"hqD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"hrc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"hru" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hrN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"hrS" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hse" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"hsl" = ( +/turf/open/floor/plating, +/area/maintenance/starboard) +"hso" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hsu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"hsv" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"hsC" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 15; + id = "arrivals_stationary"; + name = "arrivals"; + roundstart_template = /datum/map_template/shuttle/arrival/snaxi; + width = 7 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"hsP" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/window/eastright{ + dir = 1; + name = "Bridge Delivery"; + req_access_txt = "19" + }, +/obj/machinery/door/window/eastright{ + name = "Bridge Delivery"; + req_access_txt = "19" + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"hsQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hta" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"htA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hui" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 9"; + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/primary/port) +"huA" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input{ + dir = 8 + }, +/obj/machinery/air_sensor/atmos/carbon_tank{ + pixel_y = -25 + }, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"huF" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 4 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"huQ" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"hva" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"hvr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hwg" = ( +/obj/machinery/computer/teleporter{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Teleporter"; + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"hwG" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hwV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/computer/apc_control, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"hxf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"hxr" = ( +/obj/machinery/computer/scan_consolenew, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"hxx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/window/northleft{ + dir = 8; + name = "Atmos Monitoring"; + req_access_txt = "12; 24" + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Digital Valve" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/atmos) +"hxP" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hyq" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"hyz" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hyK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hzh" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "qm_warehouse2"; + name = "Warehouse Door Control"; + pixel_x = -1; + pixel_y = 24; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"hAa" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/fore) +"hAb" = ( +/obj/machinery/light/small, +/mob/living/simple_animal/slime, +/turf/open/floor/engine, +/area/science/xenobiology) +"hAf" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 2"; + name = "Cell 2 Locker" + }, +/obj/machinery/flasher{ + id = "Cell 2"; + pixel_x = -24; + pixel_y = -36 + }, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hAq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/telecomms/receiver/preset_left, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"hAw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hAx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"hBb" = ( +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"hBq" = ( +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"hBy" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/closet/secure_closet/engineering_chief, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"hBH" = ( +/obj/machinery/vending/medical, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hBQ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"hCD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/machinery/camera{ + c_tag = "Engineering Secure Storage" + }, +/turf/open/floor/plating, +/area/engine/storage) +"hCI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hCL" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/qm"; + dir = 1; + name = "Quartermaster APC"; + pixel_y = 24 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/keycard_auth{ + pixel_y = 40 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"hDj" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hDk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hEf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"hEQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/central) +"hFj" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hFv" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/atmos) +"hFG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"hGr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"hGy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"hGK" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"hGM" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"hGU" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + pixel_x = -8 + }, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"hHu" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/fore) +"hHy" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"hHC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"hHR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"hHW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"hIa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/assembly/flash/handheld, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"hIe" = ( +/obj/structure/table, +/obj/item/hemostat, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/retractor, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"hIl" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hIG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/hallway/primary/aft) +"hIH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"hIS" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"hJw" = ( +/obj/structure/chair/comfy/black, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"hJE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"hKc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hKm" = ( +/obj/machinery/computer/aifixer{ + dir = 8 + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"hKs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"hKt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hLg" = ( +/obj/machinery/bloodbankgen, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hLo" = ( +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = -30 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"hLQ" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hLZ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"hMy" = ( +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"hMD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"hMM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"hMQ" = ( +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"hNg" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hNi" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/chair/sofa{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"hNt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"hNv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"hNT" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"hNZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/communications, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"hOb" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"hOc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/atmos) +"hOw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"hOA" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"hOY" = ( +/obj/machinery/door/window/southleft{ + name = "Mass Driver Door"; + req_access_txt = "7" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"hPe" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 17 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"hPh" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"hPp" = ( +/obj/structure/sign/plaques/deempisi{ + pixel_x = -28; + pixel_y = -4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hPt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"hPC" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/engine/secure_construction) +"hPK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hPO" = ( +/obj/machinery/processor, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"hQb" = ( +/obj/structure/closet/wardrobe/pjs, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hQs" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{ + dir = 1 + }, +/obj/machinery/sparker/toxmix{ + pixel_x = 25 + }, +/turf/open/floor/engine/airless, +/area/science/mixing) +"hQL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"hQY" = ( +/turf/closed/wall, +/area/library) +"hRe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"hRt" = ( +/turf/closed/wall, +/area/quartermaster/qm) +"hRH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"hSl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Brig Control"; + req_access_txt = "3" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"hSv" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"hSD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"hSV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"hTa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"hTk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/status_display{ + layer = 4; + pixel_y = 32 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"hTy" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"hTB" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "toxinsdriver" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"hTK" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light/small, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, +/area/security/detectives_office) +"hTL" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/science/mixing) +"hTO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"hUo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"hUs" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"hUF" = ( +/obj/structure/closet/wardrobe/black, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hUL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/chapel/office) +"hVh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hVk" = ( +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"hVm" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Virology Break Room"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"hVt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"hVH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + external_pressure_bound = 120; + name = "killroom vent"; + dir = 1 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"hVN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"hVO" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/carpet, +/area/security/detectives_office) +"hVX" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Surgery Observation"; + network = list("ss13","medbay"); + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"hWb" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"hWn" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/mirror{ + pixel_x = 25 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hWW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/landmark/start/mime, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"hXB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"hXF" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/security/courtroom) +"hXO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"hYi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"hYD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/fireaxecabinet{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"hYN" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/table/wood, +/obj/item/instrument/trumpet, +/obj/item/instrument/piano_synth, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"hZy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plasteel, +/area/engine/break_room) +"hZz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Quartermaster"; + req_access_txt = "41" + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"hZU" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + dir = 8; + freerange = 1; + name = "Station Intercom (Command)" + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"iad" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/security/main) +"iam" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2; + pixel_x = -7 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"iaq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"ias" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iat" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/construction/storage) +"iau" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/bridge) +"iax" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"iaD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft/secondary"; + dir = 1; + name = "Science Maint APC"; + pixel_y = 24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"iaM" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"iaO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"iaY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"icb" = ( +/obj/structure/closet/secure_closet/captains, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"idb" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/atmos) +"idl" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"idG" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/button/door{ + id = "QMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"idQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"iek" = ( +/obj/structure/table/glass, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 29 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"ieI" = ( +/obj/machinery/telecomms/server/presets/service, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"ifl" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/wood, +/area/chapel/office) +"ifQ" = ( +/mob/living/simple_animal/mouse/brown/Tom, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"ifT" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/exit/departure_lounge"; + dir = 8; + name = "Escape Hallway APC"; + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"igi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/engine/atmos) +"igK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/door/window/eastleft{ + name = "Blue Corner" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"igO" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/bar) +"igQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"igR" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/window{ + name = "Captain's Desk"; + req_access_txt = "20" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"ihn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -26; + pixel_y = 3 + }, +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = -25; + pixel_y = -3 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"ihE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel, +/area/science/mixing) +"ihJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"ihX" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"iiM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel, +/area/storage/primary) +"iiY" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"ijz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"ijK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"ijL" = ( +/obj/structure/reflector/double, +/turf/open/floor/plating, +/area/engine/storage) +"ijV" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"ijZ" = ( +/turf/open/floor/plating, +/area/engine/engineering) +"ikh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ikk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"ikA" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ikY" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"ilb" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table/wood, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"ilo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"ilF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ilL" = ( +/obj/machinery/newscaster/security_unit{ + pixel_y = -32 + }, +/obj/machinery/camera{ + c_tag = "Head of Personnel's Office"; + dir = 1 + }, +/obj/structure/bed/dogbed/ian, +/mob/living/simple_animal/pet/dog/corgi/Ian{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"imn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"imM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"ina" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"inq" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/construction/storage) +"inw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=AIW"; + location = "QM" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"inA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"inU" = ( +/obj/machinery/chem_dispenser, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iob" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Hot Loop Exit" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"ioe" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"iog" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"iop" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"ioG" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ioJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"ipi" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/closed/wall/mineral/wood, +/area/maintenance/bar) +"ipL" = ( +/obj/item/plant_analyzer, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"ipV" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id = "toxinsdriver"; + name = "toxins launcher bay door" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"ipY" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"iqH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"iqJ" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"iqT" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/hydroponics) +"iqZ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=Stbd"; + location = "HOP" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"irg" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"iro" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"irr" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"irt" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"irN" = ( +/obj/machinery/requests_console{ + department = "AI"; + departmentType = 5; + pixel_x = 30; + pixel_y = 30 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"irQ" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"isp" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/item/multitool, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"isu" = ( +/turf/open/floor/plasteel/dark, +/area/science/server) +"itb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"itp" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Engineering Post"; + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plating, +/area/storage/atmos) +"itw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 18 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"itN" = ( +/obj/machinery/vending/coffee, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"itU" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ius" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"iux" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/janitor) +"iuy" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"iuC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"iuP" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"ivM" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"ivQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/chemistry) +"iwc" = ( +/obj/machinery/computer/upload/ai, +/obj/machinery/camera/motion{ + c_tag = "AI Upload Chamber - Port"; + network = list("aiupload") + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"iwd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Bridge Exterior"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iwk" = ( +/obj/structure/closet/crate, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ixf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ixu" = ( +/obj/structure/table, +/obj/item/hand_tele, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"ixZ" = ( +/obj/structure/chair/office/dark, +/mob/living/simple_animal/pet/cat/Runtime{ + desc = "Meow."; + gender = "male"; + name = "Salem" + }, +/turf/open/floor/wood, +/area/library) +"iyq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/closet/crate/bin, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"iyL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"iyP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"iyV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"iza" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"izV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"iAb" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/machinery/camera{ + c_tag = "Kitchen" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"iAt" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/bridge"; + dir = 1; + name = "Bridge APC"; + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"iAv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"iAG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"iAO" = ( +/turf/closed/wall, +/area/teleporter) +"iAR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"iBl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"iBm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_x = -5 + }, +/obj/item/hand_tele, +/obj/structure/window/reinforced, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"iBo" = ( +/obj/machinery/cryopod, +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/effect/turf_decal/trimline/red/filled, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"iBF" = ( +/obj/structure/table/glass, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/plasteel/white, +/area/science/lab) +"iBL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/break_room) +"iBW" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"iCq" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/engine, +/area/engine/supermatter) +"iCO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iEa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"iEj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"iEz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"iEJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"iEQ" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp/hop, +/obj/item/pen/fourcolor, +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"iET" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"iFc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"iFl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"iFq" = ( +/obj/structure/table, +/obj/item/cartridge/signal/toxins, +/obj/item/paicard{ + pixel_x = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"iFK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"iGb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"iGd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"iGB" = ( +/obj/machinery/keycard_auth{ + pixel_x = 8; + pixel_y = -26 + }, +/obj/machinery/button/door{ + id = "hos"; + name = "HoS Office Shutters"; + pixel_y = -26; + pixel_x = -6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"iGJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/hallway/primary/central) +"iGS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"iGV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"iHg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iHM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"iHO" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iIg" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"iIK" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/dark, +/area/bridge) +"iIN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"iIQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/eva) +"iIS" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"iJc" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"iJl" = ( +/turf/open/floor/plating, +/area/maintenance/port/fore) +"iJs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"iJK" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"iKM" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"iKV" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"iLi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iLA" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"iML" = ( +/obj/machinery/light, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Personnel's Desk"; + departmentType = 5; + name = "Head of Personnel RC"; + pixel_y = -30 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"iMX" = ( +/obj/structure/cable, +/obj/machinery/power/terminal, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"iNi" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/computer/rdconsole/production{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iNE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Filter" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iNK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"iNV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iOe" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/starboard) +"iOp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/rnd/production/protolathe/department/engineering, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Engineering Storage"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iOG" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"iOH" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"iOR" = ( +/obj/machinery/computer/rdconsole/robotics, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"iOW" = ( +/obj/effect/landmark/observer_start, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"iPC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/genpop, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iPO" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"iPX" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"iQv" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "42" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/wood, +/area/security/courtroom) +"iQD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos/abandoned{ + name = "Atmospherics Maintenance"; + req_access_txt = "12;24" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"iRy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/table, +/obj/structure/bedsheetbin{ + pixel_x = 2 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"iRF" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"iRO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"iRQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/security/telescreen/prison{ + pixel_y = 30 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"iSg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"iSo" = ( +/obj/machinery/photocopier, +/obj/machinery/camera{ + c_tag = "Law Office" + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"iSB" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"iTP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/chapel/main) +"iTS" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"iTY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel/white, +/area/hallway/primary/port) +"iVB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iVY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"iWf" = ( +/turf/open/floor/plating, +/area/hallway/primary/aft) +"iWu" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"iWG" = ( +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"iWY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 2 + }, +/turf/open/floor/plasteel/white, +/area/hallway/primary/port) +"iXG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"iXH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/recharger{ + name = "wall-mounted recharger"; + pixel_y = 34 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"iXZ" = ( +/obj/machinery/computer/security/telescreen/toxins{ + dir = 1; + network = list("toxins"); + pixel_y = -28 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"iYb" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iYh" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/science/xenobiology"; + dir = 8; + name = "Xenobiology APC"; + pixel_x = -25 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"iYF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"iYI" = ( +/obj/machinery/camera{ + c_tag = "Cargo Office"; + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"iZc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"iZu" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/secure_closet/medical3, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"iZH" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/central) +"iZZ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"jab" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"jae" = ( +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"jap" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"jbc" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"jbg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"jbE" = ( +/obj/machinery/vending/wardrobe/gene_wardrobe, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"jcr" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"jcR" = ( +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/item/cartridge/lawyer, +/obj/item/clothing/glasses/sunglasses/big{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/sunglasses/big, +/obj/machinery/button/door{ + id = "lawyer_blast"; + name = "Privacy Shutters"; + pixel_x = 25; + pixel_y = 8 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"jcS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"jcT" = ( +/turf/closed/wall, +/area/hallway/primary/central) +"jcU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main) +"jdw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"jdS" = ( +/obj/effect/turf_decal/vg_decals/atmos/mix, +/turf/open/floor/engine/airless, +/area/engine/atmos) +"jed" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"jen" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"jeo" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jes" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"jex" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"jeJ" = ( +/obj/machinery/door/poddoor{ + id = "tegvent"; + name = "TEG Vent" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"jfi" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "packageSort2" + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"jfH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/icemoon/surface/outdoors) +"jga" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jgj" = ( +/obj/machinery/telecomms/server/presets/common, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"jgz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jhe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=AIE"; + location = "AftH" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jhF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/maintenance/solars/port/aft) +"jih" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jil" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"jin" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"jix" = ( +/obj/machinery/camera{ + c_tag = "Brig Genpop Exterior"; + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jiV" = ( +/obj/structure/table, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jiY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/autolathe, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jji" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"jjn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/computer/bounty, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jjB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"jjC" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 + }, +/turf/open/floor/plating, +/area/engine/storage) +"jkw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jkJ" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"jkL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"jlf" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jll" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"jls" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jlL" = ( +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"jmd" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jmf" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/atmos) +"jmU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"jnh" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"job" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/dark, +/area/bridge) +"joq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"joT" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/surgery"; + dir = 1; + name = "Surgical Center APC"; + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"joU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jpd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel"; + req_access_txt = "57" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"jph" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jpr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jro" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"jrq" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/engine/secure_construction) +"jrH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"jrR" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/gateway, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"jsl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"jso" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"jsu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/telecomms/receiver/preset_right, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"jsz" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/flour, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"juI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jvb" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"jvy" = ( +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"jvA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"jvV" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 8 + }, +/turf/closed/wall, +/area/maintenance/disposal) +"jwc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"jwj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/bridge) +"jwo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"jwN" = ( +/obj/machinery/air_sensor/atmos/toxins_mixing_tank, +/turf/open/floor/engine/airless, +/area/science/mixing) +"jwP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"jxw" = ( +/obj/machinery/computer/security/telescreen/cmo{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"jxB" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar{ + id = "starboardsolar"; + name = "Starboard Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"jxS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"jxZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jyj" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jyA" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"jzc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jzx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"jAb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jAq" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jAv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"jAy" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"jAL" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jAT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jBk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Maintenance"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/chapel/main) +"jBl" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jBr" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jBP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"jCw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"jCF" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"jCL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet/crate/wooden/toy, +/obj/item/megaphone/clown, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"jCW" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Server Room"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/server) +"jDr" = ( +/turf/open/floor/carpet, +/area/chapel/office) +"jDD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"jDG" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/button/door{ + id = "capshut"; + name = "Privacy Shutters"; + pixel_x = -26; + pixel_y = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"jDH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"jDK" = ( +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"jEb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"jER" = ( +/obj/machinery/vending/kink, +/turf/open/floor/plating, +/area/maintenance/bar) +"jFl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jFv" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/engine/secure_construction) +"jFy" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/mixing"; + name = "Toxins Lab APC"; + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"jFG" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"jFS" = ( +/obj/effect/spawner/structure/window/ice, +/turf/open/floor/plating, +/area/maintenance/bar) +"jFY" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"jFZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/mob/living/simple_animal/bot/medbot, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"jGd" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"jGi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"jGp" = ( +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"jGF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"jHC" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"jHD" = ( +/obj/machinery/computer/cargo{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"jHF" = ( +/obj/machinery/food_cart, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"jHT" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"jIc" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jIj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"jIk" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plating, +/area/engine/storage) +"jIt" = ( +/turf/closed/wall/r_wall, +/area/security/checkpoint/supply) +"jIu" = ( +/obj/machinery/clonepod, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"jJb" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"jJd" = ( +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"jJu" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/zone3) +"jKb" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/storage/primary) +"jKF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"jKT" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/button/ignition/incinerator/toxmix{ + pixel_x = -8; + pixel_y = -22 + }, +/obj/machinery/button/door/incinerator_vent_toxmix{ + pixel_y = -22; + pixel_x = 9 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"jKV" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod One" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/primary/port) +"jLp" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"jLF" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"jLG" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/mineral/stacking_machine{ + input_dir = 1; + stack_amt = 10 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/disposal) +"jMk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/structure/table/wood, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"jNp" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"jNw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jNK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/landmark/start/janitor, +/turf/open/floor/plasteel, +/area/janitor) +"jNZ" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/closet/secure_closet/hos, +/obj/item/clothing/suit/hooded/wintercoat/security, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"jOj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"jOl" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"jOo" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"jOy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/storage/atmos) +"jOB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"jOE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jOJ" = ( +/obj/structure/chair/comfy/brown, +/obj/effect/landmark/start/captain, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"jPb" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Hot Loop Entrance" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"jPh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jPj" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jPm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"jPz" = ( +/obj/machinery/door/window/eastright{ + dir = 8; + name = "Research and Development Desk"; + req_one_access_txt = "7;29" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/lab) +"jPI" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"jPP" = ( +/obj/machinery/gateway{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"jQj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"jQp" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jQB" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/bridge) +"jQN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/oxygen_output{ + dir = 8 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"jRD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"jRU" = ( +/obj/structure/table/glass, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/matter_bin, +/obj/item/stock_parts/matter_bin, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/item/stack/sheet/glass, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/lab) +"jSq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"jTl" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/computer/cargo{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"jTo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced, +/obj/vehicle/ridden/atv/snowmobile/snowcurity, +/obj/item/key/security, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"jTs" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"jTP" = ( +/obj/machinery/light, +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/plasteel/white, +/area/security/brig) +"jTY" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"jUf" = ( +/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible, +/obj/machinery/computer/atmos_control/tank/nitrogen_tank{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"jUn" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"jUu" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jUB" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Filter" + }, +/obj/machinery/airalarm/engine{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"jVc" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas to Chamber" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"jVx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = 32 + }, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/plasteel/dark, +/area/security/main) +"jWl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"jWr" = ( +/turf/closed/wall/r_wall, +/area/storage/tech) +"jWx" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"jWy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"jXa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"jXh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"jXL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"jYS" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"jYT" = ( +/obj/machinery/power/solar_control{ + dir = 4; + id = "portsolar"; + name = "Port Quarter Solar Control" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"jZg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"jZl" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"jZy" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/misc_lab) +"jZW" = ( +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"kag" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"kaK" = ( +/obj/effect/turf_decal/vg_decals/atmos/air, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/engine/atmos) +"kaM" = ( +/obj/machinery/smartfridge, +/turf/open/floor/plasteel, +/area/hydroponics) +"kbR" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"kcn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"kcw" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"kcM" = ( +/obj/structure/plasticflaps, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "supply dock loading door" + }, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"kcX" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"kdm" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Cargo Delivery Office" + }, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"kds" = ( +/obj/structure/cable, +/obj/structure/closet/toolcloset, +/obj/machinery/power/apc{ + areastring = "/area/storage/auxiliary"; + name = "Auxiliary Tool Storage APC"; + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"kdA" = ( +/obj/structure/table/glass, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"kdM" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/conveyor{ + id = "QMLoad2"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kdR" = ( +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"keq" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/camera{ + c_tag = "Atmospherics South West"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ker" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"keu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/security{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"keC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"keI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"kfv" = ( +/turf/closed/wall/r_wall, +/area/security/prison) +"kfJ" = ( +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/storage/book/bible, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/chapel/office) +"kge" = ( +/obj/structure/window{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"kgx" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + desc = "Used to grind things up into raw materials and liquids."; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kgM" = ( +/obj/machinery/telecomms/server/presets/engineering, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"kgR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"khf" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/machinery/flasher{ + id = "Cell 3"; + pixel_x = -24; + pixel_y = -36 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"khw" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"khy" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/quartermaster/sorting) +"kii" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/glowshroom, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"kij" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kin" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/suit/armor/riot, +/obj/item/clothing/suit/armor/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/head/helmet/riot, +/obj/item/clothing/head/helmet/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"kis" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kiB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"kjh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"kkn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/yjunction, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"kkt" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/syringe/antiviral, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kkB" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/soup/hotchili, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"kkG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"kkJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"kkY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"klc" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"klh" = ( +/obj/structure/table, +/obj/item/radio/headset/headset_med, +/obj/item/hand_labeler, +/obj/structure/reagent_dispensers/virusfood{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"klo" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps, +/obj/item/storage/box/mousetraps, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/turf/open/floor/plasteel, +/area/janitor) +"klQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/courtroom) +"kms" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/theatre) +"kmA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"kmH" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"knn" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Security Lobby" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"knx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/brig) +"knI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"knR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"kol" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "tegvent"; + name = "TEG Vent"; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"kop" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"kox" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/plasteel, +/area/hydroponics) +"kpO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"kpX" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/layer1{ + name = "injector valve" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"kqo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"kqV" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"krq" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"krB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/quartermaster/sorting) +"krH" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/qm) +"krT" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 4; + id = "snaxi_s"; + name = "South Taxi Port"; + roundstart_template = /datum/map_template/shuttle/snow_taxi; + width = 6 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"krV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/start/chief_engineer, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"ksq" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Holding Area"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"ksM" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/power/apc{ + areastring = "/area/engine/atmos"; + name = "Atmospherics APC"; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ktd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/medical/genetics) +"kti" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ktt" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"ktw" = ( +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"ktT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"ktW" = ( +/obj/machinery/vending/wallmed{ + pixel_y = 28 + }, +/obj/structure/table, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/clothing/neck/stethoscope, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kuy" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/camera{ + c_tag = "Medbay Patient Room"; + dir = 4; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kvG" = ( +/obj/effect/turf_decal/trimline/red/filled, +/obj/machinery/suit_storage_unit/security, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"kwl" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"kwY" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/computer/security/mining{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"kxf" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"kxj" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/camera{ + c_tag = "Testing Lab East"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"kxI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"kxP" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 28 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"kxU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"kyc" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"kyf" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kyo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"kyV" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"kzf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"kzS" = ( +/obj/machinery/computer/upload/borg, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"kAv" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"kAO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"kBb" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"kBe" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"kBK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"kCi" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kCI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/paper/fluff{ + info = "Renovation Notice

The bar layout for the station is very old. We've decided to give it a facelift after our partnership with IKEA Intergalactic?.
  • We added some sweet retro arcade machines and much more seating area. We removed the stage since it hasn't ever been used.
  • You can run this place like a restaurant now that you have tables. Go whip up a menu with the Chef. You have a condiments table and your Requests Console has been moved so a noticeboard can be placed there. Take tickets from customers and pin them on the noticeboard for the Chef.
  • We hope you like the new bar!"; + name = "Renovation Notice - Bar"; + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/stack/spacecash/c100, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + pixel_x = -30; + pixel_y = 26; + receive_ore_updates = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"kDy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"kEd" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"kEf" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kEz" = ( +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"kEW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Office Maintenance"; + req_access_txt = "22" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"kFr" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/hop) +"kFF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"kGo" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"kGS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"kHd" = ( +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"kHm" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kHr" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #1"; + dir = 8; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"kHD" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/holodeck/rec_center) +"kHI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"kHP" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kHX" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kIp" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kIG" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"kJk" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"kJs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kJE" = ( +/turf/open/floor/carpet, +/area/chapel/main) +"kJO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Escape Arm Holding Area"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"kKk" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grass, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"kKY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"kLh" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"kLo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/vending/cart, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"kLQ" = ( +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 4; + network = list("vault") + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"kMc" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kMt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"kMy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"kMK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"kMT" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/table/glass, +/obj/item/cartridge/chemistry{ + pixel_y = 2 + }, +/obj/item/cartridge/medical, +/obj/item/cartridge/medical{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/cartridge/medical{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"kNQ" = ( +/obj/machinery/suit_storage_unit/hos, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"kOi" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/oxygen_input{ + dir = 8 + }, +/obj/machinery/air_sensor/atmos/oxygen_tank{ + pixel_y = -25 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"kPi" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"kPj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"kPn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"kPu" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"kPA" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/disposal/deliveryChute{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"kPQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kQn" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/tcomms, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"kQr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"kQG" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/aft/secondary) +"kRk" = ( +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"kRz" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/construction/storage) +"kRI" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lantern{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"kRK" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/wood, +/area/hallway/primary/port) +"kRX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/closet/secure_closet/hydroponics, +/turf/open/floor/plasteel, +/area/hydroponics) +"kSk" = ( +/obj/machinery/libraryscanner, +/turf/open/floor/wood, +/area/library) +"kSR" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"kTj" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/meson, +/turf/open/floor/plating, +/area/construction/storage) +"kTI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"kTN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"kTY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"kUo" = ( +/obj/machinery/door/airlock/virology{ + name = "Break Room"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kUy" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"kVo" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"kVx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"kVD" = ( +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"kVO" = ( +/turf/closed/wall, +/area/hallway/primary/aft) +"kWC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"kXG" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"kXY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"kYg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"kYs" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"kYF" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"kZL" = ( +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"lac" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"lam" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"las" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 30 + }, +/obj/structure/light_construct/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"lat" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"laE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/medical/virology) +"laL" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"lbp" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/central) +"lbu" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar{ + id = "auxsolareast"; + name = "Port Auxiliary Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"lbv" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"ldt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Teleport and Gateway Access"; + req_access_txt = "17" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"ldE" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"lek" = ( +/obj/effect/turf_decal/vg_decals/atmos/oxygen, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"lel" = ( +/obj/effect/landmark/start/botanist, +/turf/open/floor/plasteel, +/area/hydroponics) +"lep" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/shieldwallgen/xenobiologyaccess, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"leq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 27 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"leT" = ( +/turf/open/floor/engine, +/area/engine/supermatter) +"leZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"lfd" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lfl" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"lfs" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"lfy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"lfD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"lfG" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lfV" = ( +/obj/structure/closet/cardboard, +/turf/open/floor/plating, +/area/maintenance/starboard) +"lgn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lgq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lgJ" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"lgX" = ( +/obj/machinery/camera{ + c_tag = "Fore Starboard Solars"; + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"lhi" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/aft"; + dir = 8; + name = "Toxins Launch APC"; + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"lhr" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"lhB" = ( +/obj/machinery/camera{ + c_tag = "Northwestern Hall 7"; + dir = 8 + }, +/obj/machinery/computer/shuttle/snow_taxi{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lhQ" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"lhR" = ( +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"lia" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"liL" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/ai_monitored/turret_protected/ai"; + dir = 4; + name = "AI Chamber APC"; + pixel_x = 24 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"ljh" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"ljL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"ljT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"lki" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lkP" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"lkQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"llu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"lmm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"lmu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lmy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hydroponics) +"lmC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/hallway/primary/port) +"lng" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"lnx" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"lnH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/storage) +"lnW" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lob" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"loe" = ( +/obj/machinery/teleport/hub, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/teleporter) +"lom" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/miningoffice) +"loM" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"loO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"loT" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/genetics"; + dir = 4; + name = "Genetics APC"; + pixel_x = 24 + }, +/obj/structure/table/glass, +/obj/item/storage/pill_bottle/mannitol, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = 3 + }, +/obj/item/radio/headset/headset_medsci, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"loV" = ( +/obj/machinery/flasher{ + id = "Cell 1"; + pixel_x = -24; + pixel_y = -36 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"lpb" = ( +/obj/structure/table/wood, +/obj/effect/landmark/xeno_spawn, +/obj/item/gavelblock, +/turf/open/floor/wood, +/area/security/courtroom) +"lpl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lpT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"lpW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/item/wrench/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lqg" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"lqt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/atmos) +"lqW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"lrK" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"lrV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"lsh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"lsA" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Medbay Break Room"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ltk" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/eva"; + dir = 1; + name = "EVA Storage APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"ltF" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/hallway/primary/port) +"ltY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hydroponics) +"lud" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"luf" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) +"lul" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"luo" = ( +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"lwH" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"lxz" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"lxF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lxL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"lxV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"lyt" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/doppler_array/research/science{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"lyu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"lyv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lzh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"lzi" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/fans/tiny/invisible, +/obj/structure/barricade/wooden/crude/snow{ + max_integrity = 15; + obj_integrity = 15 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"lzw" = ( +/obj/machinery/firealarm{ + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lzB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"lzW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/crate/hydroponics, +/obj/item/wirecutters, +/obj/item/shovel/spade, +/obj/item/reagent_containers/glass/bucket, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/hydroponics) +"lAp" = ( +/obj/machinery/button/door{ + desc = "A remote control-switch for secure storage."; + id = "Secure Storage"; + name = "Engineering Secure Storage"; + pixel_x = -24; + req_access_txt = "10" + }, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lAv" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/corner{ + dir = 1 + }, +/area/engine/break_room) +"lAL" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"lAS" = ( +/obj/item/storage/secure/safe{ + pixel_x = 5; + pixel_y = 29 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lBe" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lBF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/icecream_vat, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"lBH" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lBT" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"lCi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"lCQ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"lCW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lDj" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lDV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"lEy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"lEU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"lFu" = ( +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "TEG Engine Room"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"lFv" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"lFK" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"lFN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"lGp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"lGy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/camera{ + c_tag = "MiniSat External North"; + dir = 1; + network = list("minisat"); + start_active = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"lGB" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"lHa" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"lHl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lHn" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"lHH" = ( +/turf/open/floor/mech_bay_recharge_floor, +/area/science/robotics/mechbay) +"lHZ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/engine/storage) +"lIm" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lIn" = ( +/obj/structure/sink{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"lIJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/weightmachine/stacklifter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"lJi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"lJp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/engine/atmos) +"lJA" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"lJC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"lJN" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"lKT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"lLa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"lLv" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"lLD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) +"lMx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"lMF" = ( +/obj/machinery/camera{ + c_tag = "Virology Module"; + network = list("ss13","medbay"); + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"lNm" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/shieldwallgen/xenobiologyaccess, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"lNK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"lNU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"lOs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"lOF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"lOO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"lOX" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/mirror{ + pixel_x = 25 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lPB" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"lQp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"lQs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"lQJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"lRx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"lSt" = ( +/obj/effect/landmark/start/janitor, +/turf/open/floor/plasteel, +/area/janitor) +"lSN" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/rnd/production/techfab/department/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lTh" = ( +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/bodybags, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"lTs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"lTB" = ( +/obj/structure/table/glass, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/clothing/glasses/hud/health, +/obj/item/stamp/cmo, +/obj/item/clothing/neck/stethoscope, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"lTJ" = ( +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"lTT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/command{ + name = "Captain's Office"; + req_access_txt = "20" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"lUd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lVd" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/machinery/camera{ + c_tag = "Kitchen Cold Room" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"lVK" = ( +/obj/machinery/blackbox_recorder, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"lVN" = ( +/obj/structure/closet/crate/secure/engineering{ + name = "Supermatter Shard Crate" + }, +/obj/machinery/power/supermatter_crystal/shard, +/turf/open/floor/plating, +/area/engine/storage) +"lVS" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lWb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/science/lab) +"lWf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/aisat/service) +"lWi" = ( +/obj/machinery/suit_storage_unit/engine, +/turf/open/floor/plating, +/area/construction/storage) +"lWo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"lWy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lWP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lWR" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"lXk" = ( +/obj/structure/mineral_door/woodrustic, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"lXR" = ( +/obj/machinery/camera{ + c_tag = "Northwest Paramedic Post Garage"; + network = list("ss13","medbay") + }, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"lXT" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"lYk" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"lYy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"lYM" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/computer/med_data{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"lYN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"lYS" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "Security" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"lZi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/secequipment, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"lZj" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/grenade/barrier{ + pixel_x = -4 + }, +/obj/item/grenade/barrier, +/obj/item/grenade/barrier{ + pixel_x = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"lZn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"lZs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"lZL" = ( +/turf/open/floor/carpet, +/area/hallway/primary/port) +"mai" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/camera{ + c_tag = "Escape Arm Central"; + dir = 1 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"maj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"mao" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"maG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"maL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"maR" = ( +/obj/structure/fans/tiny, +/obj/structure/mineral_door/woodrustic, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"mbm" = ( +/turf/closed/wall, +/area/maintenance/port/fore) +"mbt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mbE" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hydroponics) +"mbM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mcs" = ( +/obj/structure/displaycase/captain, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"mcy" = ( +/obj/machinery/camera{ + c_tag = "Mining Dock External"; + dir = 8 + }, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"mcU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mdq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mdG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mek" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/quartermaster/miningoffice) +"meG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mfi" = ( +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"mfm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mfC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mfF" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/cmo"; + dir = 1; + name = "CM Office APC"; + pixel_x = -32; + pixel_y = 4 + }, +/obj/effect/landmark/start/chief_medical_officer, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"mgo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Cargo Bay Warehouse"; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mgC" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mgM" = ( +/turf/open/floor/plating, +/area/storage/tech) +"mgV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"mhq" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Cargo Bay North" + }, +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mhv" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mhz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/research{ + name = "Toxins Lab"; + req_access_txt = "7" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/science/mixing) +"mhG" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"mhH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/courtroom) +"mia" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"mjH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mjX" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/starboard/aft) +"mkd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mkm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/fore"; + dir = 1; + name = "Fore Primary Hallway APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mkr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes/engineering, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mky" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mkY" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"mlM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"mmJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"mmK" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"mmM" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"mmO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mmQ" = ( +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mmY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"mnj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mnL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"moD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"moX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"mpj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/virology) +"mps" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"mqb" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"mqc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"mqm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/carpet, +/area/bridge) +"mqT" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"mrM" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"mrW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mse" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"msg" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plasteel, +/area/science/storage) +"msi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"msm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"msA" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/security/courtroom) +"msK" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"msN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"mtz" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"mtP" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"mtY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"muk" = ( +/obj/machinery/rnd/bepis, +/turf/open/floor/engine, +/area/science/misc_lab) +"muN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"mvA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/quartermaster/storage) +"mvQ" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"mwQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"mwV" = ( +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mwW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"mxo" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"mxt" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/server) +"mxF" = ( +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"myh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/robotics/lab) +"myq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"myZ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"mzj" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/modular_computer/console/preset/engineering, +/turf/open/floor/plasteel, +/area/engine/break_room) +"mzs" = ( +/obj/machinery/power/emitter, +/turf/open/floor/plating, +/area/engine/storage) +"mzx" = ( +/obj/machinery/telecomms/processor/preset_four, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"mzB" = ( +/obj/structure/table, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/mmi, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"mAk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mAn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"mAx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"mAK" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"mBK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"mDm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"mDp" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen/red, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"mDB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"mDO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plating, +/area/security/brig) +"mDW" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mDX" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"mEE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"mEI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"mFg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mGa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"mGb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"mGl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -26; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"mGp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/hydroponics) +"mGE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"mGL" = ( +/obj/structure/closet/secure_closet/RD, +/obj/machinery/light_switch{ + pixel_y = -23 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"mGT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"mHT" = ( +/obj/structure/closet/l3closet/scientist, +/obj/item/extinguisher, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"mHU" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mIe" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mIl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"mIu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mIz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"mIO" = ( +/obj/machinery/camera{ + c_tag = "Mech Bay"; + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24; + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"mJd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"mJr" = ( +/obj/structure/chair/sofa{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/science, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"mKk" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/zipties{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/storage/box/zipties{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/storage/fancy/donut_box, +/obj/machinery/camera{ + c_tag = "Brig Control"; + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"mKv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"mKD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mKL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 15 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"mKO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters Control"; + req_access_txt = "10"; + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mLu" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 + }, +/obj/machinery/computer/atmos_control/tank/oxygen_tank{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mLB" = ( +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Toxins Launch Hall 2"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"mLD" = ( +/obj/structure/closet/wardrobe/chemistry_white, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"mLK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/color, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"mLO" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -9 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -9; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/sharpener{ + pixel_x = 10 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"mLP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/storage/eva) +"mMs" = ( +/turf/closed/wall/r_wall, +/area/engine/break_room) +"mMP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mNo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"mNq" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/water_vapor, +/turf/open/floor/plasteel, +/area/janitor) +"mNG" = ( +/obj/item/target, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"mNP" = ( +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"mNS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/turnstile{ + name = "Genpop Exit Turnstile"; + req_access_txt = "70"; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "permacell1"; + name = "genpop blast door" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"mOe" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"mOv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"mOx" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"mOE" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mOG" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/chapel/main) +"mPm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mPM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/hallway/primary/central) +"mPR" = ( +/obj/machinery/door/airlock{ + desc = "A small bathroom with a sink, toilet and shower."; + id_tag = "Bath2"; + name = "Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"mQo" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Hydroponics North" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"mQC" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/disposal) +"mQD" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/wood, +/area/library) +"mQJ" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"mQK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"mQV" = ( +/obj/machinery/button/door{ + id = "trash"; + name = "Disposal Vent Control"; + pixel_x = -8; + pixel_y = -25; + req_access_txt = "12" + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "garbage"; + name = "disposal conveyor" + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"mRz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"mRZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/storage/primary) +"mSs" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"mSt" = ( +/turf/closed/wall, +/area/janitor) +"mSN" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/department/electrical) +"mTl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"mTw" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_y = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"mVb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "armory2"; + name = "Armory Shutters"; + pixel_y = 26; + req_access_txt = "3" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"mVe" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/port/aft"; + dir = 4; + name = "Port Quarter Solar APC"; + pixel_x = 23; + pixel_y = 2 + }, +/obj/machinery/camera{ + c_tag = "Aft Port Solar Control"; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"mVf" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 + }, +/obj/machinery/computer/atmos_control/tank/carbon_tank{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"mVh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + req_access_txt = "6;5" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"mVi" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"mVo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Auxiliary Bridge South" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"mVr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mVN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"mWc" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"mWm" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"mWy" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"mWD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"mWJ" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"mXj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"mXC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"mYd" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"mYx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"mYB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"mYE" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 8 + }, +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"mYT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"mZk" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard) +"mZp" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"naj" = ( +/turf/open/floor/wood, +/area/maintenance/bar) +"naE" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 30 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"nbr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"nbC" = ( +/turf/closed/mineral/random/snow/more_caves, +/area/icemoon/surface/outdoors) +"nbU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ncg" = ( +/obj/machinery/door/airlock/atmos/abandoned{ + name = "Atmospherics Maintenance"; + req_access_txt = "12;24" + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"ncH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"nde" = ( +/obj/structure/light_construct/small, +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/bar) +"ndg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ndm" = ( +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ndn" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/main) +"ndL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Brig Equipment Room" + }, +/obj/machinery/recharger{ + name = "wall-mounted recharger"; + pixel_y = 34 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"ndM" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/paramedic"; + dir = 8; + name = "Paramedic Post"; + pixel_x = -26 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"ndQ" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/storage"; + dir = 4; + name = "Cargo Bay APC"; + pixel_x = 24; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ndX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"nea" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/bar) +"nez" = ( +/obj/structure/cable, +/obj/machinery/power/smes, +/turf/open/floor/plasteel, +/area/construction/storage) +"nft" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 5 + }, +/obj/machinery/computer/atmos_control/tank/toxin_tank{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nfB" = ( +/obj/structure/closet/secure_closet/detective, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/item/clothing/glasses/sunglasses, +/obj/item/taperecorder, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"nfI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ngj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/janitor) +"ngB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"nhe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"nhn" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"nhr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"nht" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nhv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nhz" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"nhK" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"nhO" = ( +/obj/machinery/airalarm/server{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"nij" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/watertank, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 13; + pixel_y = 5 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 13; + pixel_y = 5 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 13; + pixel_y = 5 + }, +/obj/item/book/manual/hydroponics_pod_people{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/paper/guides/jobs/hydroponics{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"njd" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -27; + pixel_y = -29 + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"njr" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool, +/obj/machinery/camera{ + c_tag = "Mining Office Kitchen"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"nlk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"nlF" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"nlM" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"nmc" = ( +/obj/machinery/rnd/production/techfab/department/cargo, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"nmL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"nmM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/atmos_alert, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"nmN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/bridge) +"nmR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/medical/genetics) +"nmY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nnj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/genetics) +"nnV" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nok" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/station_alert, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"now" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"noB" = ( +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/sloth/paperwork, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"noQ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"npl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"npp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"npv" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/door/airlock/public/glass{ + name = "Diner" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"nqc" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nqx" = ( +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"nrd" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"nre" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/crew_quarters/heads/hos) +"nrg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nrJ" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"nrY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"nsf" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nsi" = ( +/obj/structure/table, +/obj/item/soap/nanotrasen, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/suit/straight_jacket, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nsv" = ( +/obj/machinery/requests_console{ + department = "Kitchen"; + departmentType = 2; + pixel_y = 32 + }, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/book/manual/chef_recipes, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"nsw" = ( +/obj/machinery/button/door{ + id = "QMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_x = 24; + pixel_y = -8 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nsB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"ntd" = ( +/obj/machinery/door/airlock/medical{ + name = "Medbay Break Room"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/central) +"ntO" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/machinery/light_switch{ + pixel_y = -23 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"ntV" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Port"; + dir = 4; + network = list("aicore") + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"ntX" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine/airless, +/area/engine/atmos) +"nuu" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/tracker, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"nuJ" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/lab) +"nuS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Lobby"; + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"nvj" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/construction/storage) +"nwq" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nwz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/station_alert, +/turf/open/floor/plasteel, +/area/engine/break_room) +"nwR" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/janitor) +"nxv" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"nya" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Medbay Foyer"; + dir = 1; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nyd" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"nyp" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/AI, +/turf/open/floor/plating, +/area/storage/tech) +"nyq" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"nyT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) +"nzn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main) +"nzt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"nzD" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"nzH" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nzK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"nzM" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/library) +"nAx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/tcommsat/server) +"nAS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"nBd" = ( +/obj/machinery/button/door{ + id = "Dorm2"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -24; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"nBk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"nBI" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/table/glass, +/obj/item/storage/box/syringes, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nBU" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window{ + dir = 1; + name = "High-Risk Modules"; + req_access_txt = "20" + }, +/obj/structure/table, +/obj/item/aiModule/reset/purge, +/obj/item/aiModule/zeroth/oneHuman, +/obj/item/aiModule/supplied/protectStation, +/obj/item/aiModule/supplied/oxygen, +/obj/effect/spawner/lootdrop/aimodule_harmful, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"nCc" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/science/storage) +"nCf" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"nCq" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible/layer1, +/obj/machinery/door/poddoor{ + id = "tegheat"; + name = "TEG Heatshield" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/engine/atmospherics_engine) +"nCA" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"nCL" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/carrot, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"nCU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nDa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nDd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/light/floor, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"nDl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"nDu" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/grille, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"nEa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"nEi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/science/lab) +"nEl" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"nEs" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 12; + height = 18; + id = "emergency_home"; + name = "BoxStation emergency evac bay"; + width = 32 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"nEt" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"nEv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/hallway/primary/port) +"nEI" = ( +/obj/structure/dresser, +/obj/machinery/camera{ + c_tag = "Theatre" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"nEJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/bridge) +"nFw" = ( +/obj/machinery/button/door{ + id = "bridge blast"; + name = "Bridge Blast Door Control"; + pixel_x = -3; + pixel_y = -35; + req_access_txt = "19" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nFG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nFM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port Mix to Engine"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nGa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/bot/mulebot{ + beacon_freq = 1400; + home_destination = "QM #1"; + suffix = "#1" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "QM #1" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard"; + dir = 4; + name = "Starboard Maintenance APC"; + pixel_x = 26 + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"nGd" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"nGf" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"nGh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"nGi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"nGx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"nHe" = ( +/obj/structure/chair/stool, +/turf/open/floor/wood, +/area/maintenance/bar) +"nHi" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"nHQ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel, +/area/science/storage) +"nHX" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nIu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"nIM" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/obj/item/storage/pill_bottle/dice{ + pixel_x = 8 + }, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"nIR" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/camera{ + c_tag = "Medbay South"; + network = list("ss13","medbay") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nIU" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"nJq" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics South East"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nJr" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"nJI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Reception Desk"; + req_access_txt = "63"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nKO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nKU" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -1; + pixel_y = 24; + req_access_txt = "31" + }, +/obj/structure/closet/wardrobe/cargotech, +/obj/item/radio/headset/headset_cargo, +/obj/item/radio/headset/headset_cargo, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nLF" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"nMw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"nNj" = ( +/obj/machinery/chem_master/condimaster{ + name = "HoochMaster 2000" + }, +/obj/machinery/camera{ + c_tag = "Bar Storage" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"nNV" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"nOe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"nOj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"nOk" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"nOn" = ( +/obj/machinery/telecomms/server/presets/science, +/obj/machinery/camera{ + c_tag = "Telecomms Server Room"; + network = list("tcomms") + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"nOG" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/landmark/start/cyborg, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat/service"; + dir = 8; + name = "MiniSat Service Bay APC"; + pixel_x = -27 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"nOK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"nOY" = ( +/obj/machinery/camera{ + c_tag = "Dorms West"; + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"nPd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + id_tag = "permahydro"; + name = "Hydroponics Module" + }, +/obj/machinery/door/poddoor/preopen{ + id = "permacell2"; + name = "garden blast door" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/security/prison) +"nPs" = ( +/obj/structure/chair/stool, +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"nPF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/break_room) +"nQd" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"nQp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"nQr" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "Medbay" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel/dark, +/area/medical/medbay/central) +"nQM" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/secequipment, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"nRn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "hos" + }, +/turf/open/floor/plating, +/area/ai_monitored/security/armory) +"nRt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nRu" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/science/mixing) +"nRS" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nRX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"nSf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nSX" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Gas to Cooling Loop"; + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"nTz" = ( +/obj/machinery/light, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"nTQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"nUm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"nUN" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nVp" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"nVv" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, +/obj/structure/table/glass, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nVI" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"nVP" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"nVY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"nWJ" = ( +/obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"nWO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nWP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"nXn" = ( +/obj/structure/closet/firecloset, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"nXs" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"nXy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"nYv" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"nYN" = ( +/obj/machinery/computer/security, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"nYZ" = ( +/turf/closed/wall/r_wall, +/area/medical/genetics) +"nZE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"nZU" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oai" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oaC" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"oaF" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"oaS" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/construction/storage) +"oba" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"obb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"obd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"obB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"obL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command{ + name = "Conference Room"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/wood, +/area/bridge) +"obR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ocG" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"ocN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Kill Chamber"; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"ocY" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"odg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"odD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/construction/storage) +"odF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "Dorm5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/structure/table/wood, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"odK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"odR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"oeh" = ( +/obj/machinery/door/airlock/engineering/abandoned{ + name = "Electrical Maintenance"; + req_access_txt = "11" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/construction/storage) +"oez" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"oeC" = ( +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oeS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oeV" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"ofm" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ofy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hor) +"ofF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ofP" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oge" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ogX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/closed/wall, +/area/quartermaster/sorting) +"ohf" = ( +/obj/machinery/gateway{ + dir = 5 + }, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"ohk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"ohm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"oho" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/wood, +/area/hallway/primary/central) +"ohq" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ohr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/auxiliary) +"ohv" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/hallway/primary/aft"; + dir = 1; + name = "Aft Hall APC"; + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ohF" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"ohK" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"oib" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"oiC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oiM" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor{ + id = "tegheat"; + name = "TEG Heatshield" + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/engine/atmospherics_engine) +"oiX" = ( +/turf/closed/wall, +/area/crew_quarters/heads/hop) +"oje" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitory" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ojs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"ojv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ojP" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Gas" + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"ojY" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"okm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/crowbar, +/obj/item/clothing/neck/stethoscope, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"okq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=Dorm"; + location = "HOP2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"okt" = ( +/obj/machinery/light/small, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"old" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/wood, +/area/security/courtroom) +"oln" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"olx" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"olz" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"olW" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/smes/engineering, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"omh" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/barricade/wooden/crude/snow{ + max_integrity = 15; + obj_integrity = 15 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"oml" = ( +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"omC" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"omO" = ( +/obj/structure/closet/crate/wooden, +/obj/item/storage/box/lights/mixed, +/obj/item/stack/sheet/mineral/wood/twenty, +/obj/item/circuitboard/machine/chem_dispenser/drinks, +/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, +/obj/item/storage/toolbox/mechanical/old, +/obj/item/electronics/airlock, +/turf/open/floor/plating, +/area/maintenance/bar) +"omQ" = ( +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"ont" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrogen_output{ + dir = 8 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"onY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ooa" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"oob" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"ooR" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/landmark/start/ai, +/obj/item/radio/intercom{ + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_x = -25; + pixel_y = -10 + }, +/obj/item/radio/intercom{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_y = 27 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Common Channel"; + pixel_x = -25 + }, +/obj/machinery/button/door{ + id = "AI Chamber entrance shutters"; + name = "AI Chamber entrance shutters control"; + pixel_x = 8; + pixel_y = 23; + req_access_txt = "16" + }, +/obj/machinery/door/window{ + base_state = "rightsecure"; + dir = 4; + icon_state = "rightsecure"; + name = "Primary AI Core Access"; + obj_integrity = 300; + req_access_txt = "16" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) +"opq" = ( +/obj/machinery/computer/rdservercontrol{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"opC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/secure_closet/engineering_personal, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/construction/storage) +"opT" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"opY" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"oql" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"oqw" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/westleft{ + name = "Cargo Desk"; + req_access_txt = "50" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"oqF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"oqL" = ( +/obj/structure/closet/secure_closet/security/science, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"orN" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"osa" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main) +"osc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"oto" = ( +/turf/closed/wall, +/area/medical/surgery) +"ots" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/tcommsat/server) +"oty" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/engine/engineering) +"otZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"ouB" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"ouE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/bar) +"ouH" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ouQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"ouX" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"ovb" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ovq" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ovI" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"ovP" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"owj" = ( +/obj/structure/loot_pile/maint, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"owk" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"owv" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"owV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"oxh" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"oxs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Bridge Southwest" + }, +/obj/machinery/button/door{ + id = "bridge blast"; + name = "Bridge Blast Door Control"; + pixel_x = 8; + pixel_y = 27; + req_access_txt = "19" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oyf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "QM #3" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"oym" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"oyz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"oAX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"oBj" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"oBl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"oBs" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"oBD" = ( +/obj/structure/closet/emcloset, +/obj/machinery/camera{ + c_tag = "Dorms South"; + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"oBF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oBG" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/obj/item/toy/plush/mammal/fox, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"oCZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"oDm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oDn" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/smes/engineering, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "TEG West"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"oDw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oEa" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"oEf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/machinery/camera{ + c_tag = "Custodial Closet" + }, +/turf/open/floor/plasteel, +/area/janitor) +"oEs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/turf/open/floor/plating, +/area/security/brig) +"oEz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"oEO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/computer/card, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"oGU" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/wood, +/area/hallway/primary/central) +"oHl" = ( +/obj/structure/closet/crate/secure/engineering{ + name = "TEG crate" + }, +/obj/item/circuitboard/machine/circulator, +/obj/item/circuitboard/machine/circulator, +/obj/item/circuitboard/machine/generator, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/cable_coil, +/turf/open/floor/plating, +/area/engine/storage) +"oHS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"oHU" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"oIb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"oIq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/engine/atmos) +"oIA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Toxins Launch Room"; + req_access_txt = "7" + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"oIJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"oJa" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/radiation, +/turf/open/floor/engine, +/area/engine/engineering) +"oJp" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oJF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"oJX" = ( +/obj/structure/closet/secure_closet/quartermaster, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/item/cartridge/quartermaster{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/cartridge/quartermaster{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/cartridge/quartermaster{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"oKr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"oKD" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Brig Cell Blocks"; + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"oKG" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/maintenance/disposal) +"oKN" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/signaler{ + pixel_y = 8 + }, +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/assembly/signaler{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"oLe" = ( +/obj/machinery/computer/shuttle/snow_taxi{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"oLo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"oLB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"oLT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"oME" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"oNv" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"oNz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"oNR" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oNT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oOe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"oOu" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/plasteel/dark, +/area/bridge) +"oOR" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "hop"; + name = "Privacy Shutters Control"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "57" + }, +/obj/effect/landmark/start/head_of_personnel, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"oPP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"oPS" = ( +/turf/closed/wall, +/area/storage/primary) +"oQa" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oQg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"oQs" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 + }, +/obj/item/reagent_containers/food/snacks/mint, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"oQy" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"oQE" = ( +/obj/machinery/telecomms/processor/preset_one, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"oRc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"oRh" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"oSt" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"oTu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"oTv" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"oTF" = ( +/turf/closed/wall/r_wall, +/area/medical/morgue) +"oTT" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"oUs" = ( +/obj/machinery/suit_storage_unit/engine, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oUQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/poddoor{ + id = "Secure Storage"; + name = "secure storage" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/storage) +"oUV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"oUX" = ( +/obj/structure/table/wood, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"oVN" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall/r_wall, +/area/science/misc_lab) +"oWw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"oWy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"oWT" = ( +/obj/machinery/vending/cigarette, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/hallway/primary/port) +"oWW" = ( +/obj/machinery/computer/atmos_control/tank/air_tank, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/camera{ + c_tag = "Atmospherics North East" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"oXi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oXl" = ( +/obj/machinery/camera{ + c_tag = "Hydroponics South"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"oXn" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"oYn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"oYr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + id_tag = "Dorm5"; + name = "Room Four" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"oYU" = ( +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"oZe" = ( +/obj/machinery/camera{ + c_tag = "Escape Arm Airlocks"; + dir = 8 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"oZf" = ( +/obj/machinery/camera{ + c_tag = "Testing Chamber"; + dir = 1; + network = list("test","rd") + }, +/turf/open/floor/engine, +/area/science/misc_lab) +"oZq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Surgery Observation" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/medbay/central) +"oZC" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"oZL" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"par" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/medbay/zone3) +"pax" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall, +/area/janitor) +"paF" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"paY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pbc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"pbf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pbg" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pbk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pbs" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 2; + height = 13; + id = "ferry_home"; + name = "port bay 2"; + width = 5 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"pbw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/camera{ + c_tag = "Surgery B"; + network = list("ss13","medbay"); + pixel_x = 22 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"pbP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/obj/item/paper/guides/jobs/medical/morgue{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"pbS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"pbV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/bridge) +"pcd" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"pce" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Airlock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"pcl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output{ + dir = 1 + }, +/obj/machinery/sparker/toxmix{ + pixel_x = -25 + }, +/turf/open/floor/engine/airless, +/area/science/mixing) +"pcs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet, +/obj/item/clothing/shoes/winterboots/ice_boots, +/obj/item/clothing/shoes/winterboots/ice_boots, +/obj/item/clothing/shoes/winterboots/ice_boots, +/obj/item/hatchet, +/obj/item/hatchet, +/obj/item/hatchet, +/obj/item/pickaxe/drill, +/obj/item/pickaxe/drill, +/obj/item/pickaxe/drill, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"pcT" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 23 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pdj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"pdo" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"pdv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"pdD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/cargo, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"pdL" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"peq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pfb" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Gas to Cooling Loop"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pfB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/misc_lab) +"pfN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"pfY" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"pfZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"pgk" = ( +/obj/structure/window{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pgp" = ( +/turf/closed/wall, +/area/crew_quarters/dorms) +"pgG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/camera/motion{ + c_tag = "EVA Motion Sensor" + }, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"phf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"phq" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/janitor) +"phs" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"phu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"phI" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"phS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"phU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"pig" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"piu" = ( +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"piv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"piR" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/engine/engineering) +"piX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"piY" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"pjg" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"pjn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Southern Hall 3"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pjD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pkh" = ( +/mob/living/simple_animal/hostile/retaliate/goat{ + name = "Pete" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"pkJ" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/bar) +"plg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"pmE" = ( +/obj/machinery/camera{ + c_tag = "Courtroom East"; + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/wood, +/area/security/courtroom) +"pmK" = ( +/obj/machinery/computer/operating, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"pnr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"pnz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main) +"pnS" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plasteel, +/area/engine/atmos) +"poj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"por" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"poR" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"poT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"poU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/chair/comfy/black, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"ppj" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"ppl" = ( +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"ppI" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"pqe" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"pqj" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pqs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pqL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/computer/arcade/minesweeper{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"pqX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"prf" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"prl" = ( +/obj/structure/closet/l3closet/virology, +/obj/machinery/light_switch{ + pixel_x = 25 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"pry" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main) +"prD" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"prL" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"prP" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pss" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"psS" = ( +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + pixel_x = -30 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Quartermaster's Office"; + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"ptd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + id_tag = "Dorm6"; + name = "Room Five" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"ptl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"ptv" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/yellow/visible/layer3, +/obj/machinery/igniter{ + id = "Incinerator" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"ptU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"ptY" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"puf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/pipedispenser/disposal, +/obj/structure/fireaxecabinet{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"puk" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1; + initialize_directions = 1 + }, +/turf/open/floor/circuit, +/area/science/server) +"puo" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"puA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/landmark/xeno_spawn, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"puE" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/pen/fountain, +/obj/machinery/camera{ + c_tag = "Chief Engineer's Office"; + dir = 8 + }, +/obj/machinery/button/door{ + desc = "A remote control-switch for secure storage."; + id = "Secure Storage"; + name = "Engineering Secure Storage"; + pixel_x = 24; + req_access_txt = "11" + }, +/obj/item/paper/monitorkey, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"puS" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/requests_console{ + department = "Virology"; + name = "Virology Requests Console"; + pixel_x = 32 + }, +/obj/machinery/light_switch{ + pixel_y = 26 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"puY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"pvj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pvl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/genpop, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pvo" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/eastleft{ + name = "Coffin Storage"; + req_access_txt = "22" + }, +/turf/open/floor/wood, +/area/chapel/office) +"pvr" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pvw" = ( +/obj/machinery/telecomms/processor/preset_three, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"pvx" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/tcommsat/server"; + name = "Telecomms Server APC"; + pixel_y = -25 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"pvV" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/drone{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2; + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"pvY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + external_pressure_bound = 140; + name = "killroom vent"; + pressure_checks = 0; + dir = 1 + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"pwC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/storage) +"pwE" = ( +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"pwL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"pxh" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Supermatter Interior"; + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"pxp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48"; + shuttledocked = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"pxv" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"pxE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pxS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"pxX" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pxZ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pyw" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/fore"; + dir = 4; + name = "Port Bow Maintenance APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"pyD" = ( +/obj/machinery/chem_heater, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"pyF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/disposal) +"pyI" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/science/storage"; + dir = 4; + name = "Toxins Storage APC"; + pixel_x = 25 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"pyW" = ( +/obj/structure/closet/crate/medical, +/turf/open/floor/plating, +/area/maintenance/starboard) +"pyY" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/toilet/secret/prison{ + dir = 8 + }, +/obj/structure/mirror{ + pixel_x = 25 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"pze" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Airlock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"pzk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pzI" = ( +/obj/machinery/telecomms/broadcaster/preset_left, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"pzZ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"pAC" = ( +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/rnd, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"pAN" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"pBh" = ( +/obj/machinery/door/airlock{ + desc = "A small bathroom with a sink, toilet and shower."; + id_tag = "Bath1"; + name = "Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"pBU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pCj" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"pCo" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"pCv" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"pCU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"pCY" = ( +/obj/machinery/computer/communications, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"pDh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"pDu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 5 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"pDF" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/flasher/portable, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"pDS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/portables_connector, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"pEm" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"pED" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"pEF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable, +/obj/machinery/power/terminal, +/turf/open/floor/plasteel, +/area/construction/storage) +"pEK" = ( +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"pFf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/pipedispenser/disposal/transit_tube, +/turf/open/floor/plasteel, +/area/engine/atmos) +"pFo" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"pFu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"pFI" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"pFM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"pFR" = ( +/turf/closed/wall, +/area/hallway/primary/fore) +"pGe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"pGs" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pGL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"pHi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/meter, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pHl" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"pHH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"pIf" = ( +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"pIz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"pIH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pIP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"pJS" = ( +/turf/closed/wall, +/area/quartermaster/storage) +"pJT" = ( +/obj/machinery/computer/arcade{ + dir = 4 + }, +/obj/structure/light_construct/small, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"pKp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"pKr" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + desc = "A remote control switch for the medbay foyer."; + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + normaldoorcontrol = 1; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pKN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pLd" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pLP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/turnstile{ + name = "Genpop Exit Turnstile"; + req_access_txt = "70"; + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"pLX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pMf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"pMp" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"pMD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pMU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"pNo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/announcement_system, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"pNv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/command{ + name = "Server Room"; + req_access_txt = "30" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/checker, +/area/science/server) +"pNB" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/RnD_secure, +/turf/open/floor/plating, +/area/storage/tech) +"pNO" = ( +/obj/machinery/suit_storage_unit/cmo, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Medical Officer's Desk"; + departmentType = 5; + name = "Chief Medical Officer RC"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"pNQ" = ( +/obj/machinery/bookbinder, +/obj/machinery/camera{ + c_tag = "Library South"; + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/library) +"pNU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/main) +"pOg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen{ + desc = "Writes upside down!"; + name = "astronaut pen" + }, +/obj/machinery/door/window{ + name = "Captain's Desk"; + req_access_txt = "20" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/item/card/id/captains_spare, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"pPw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"pPx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pPz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/westright{ + dir = 1; + name = "Hydroponics Desk"; + req_access_txt = "35" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hydroponics) +"pPL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"pQd" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"pQg" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"pQN" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"pRV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"pSm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kanyewest"; + name = "privacy shutters" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"pSO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pST" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Evidence Storage"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"pTq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/power/smes/engineering, +/turf/open/floor/plasteel, +/area/engine/engineering) +"pTw" = ( +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"pUf" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"pUz" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"pUP" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/wood, +/area/chapel/main) +"pVz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "lawyer_blast"; + name = "privacy door" + }, +/turf/open/floor/plating, +/area/lawoffice) +"pVW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"pVZ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/that, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"pWa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"pWc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/disposal) +"pWz" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"pWS" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/fore) +"pXb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"pXl" = ( +/obj/machinery/computer/cloning{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"pXp" = ( +/obj/structure/window/reinforced, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"pXW" = ( +/obj/structure/chair/comfy/black, +/obj/machinery/button/door{ + id = "heads_meeting"; + name = "Security Shutters"; + pixel_y = 24 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"pYh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 3"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"pYM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"pZl" = ( +/obj/machinery/light, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"pZD" = ( +/turf/closed/wall/r_wall, +/area/medical/virology) +"pZJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/medical/genetics) +"qal" = ( +/obj/structure/chair, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qaO" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"qaX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qbg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qbh" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"qbr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"qbv" = ( +/obj/structure/chair/comfy/black, +/obj/machinery/camera{ + c_tag = "Conference Room" + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"qbJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"qbY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"qbZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qck" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"qeo" = ( +/obj/machinery/holopad, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"qeH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/janitor) +"qeL" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qeP" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"qeY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"qfd" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"qfJ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"qfT" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"qfX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"qgm" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"qgC" = ( +/obj/structure/light_construct/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"qgZ" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qha" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"qhf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qhu" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"qhU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"qib" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Atmos to Gas" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qip" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"qiF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"qjc" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/pie/cream, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"qjA" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/primary"; + dir = 4; + name = "Primary Tool Storage APC"; + pixel_x = 24; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"qkg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qkO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qkT" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/chapel/main) +"qlj" = ( +/turf/closed/wall, +/area/crew_quarters/theatre) +"qlH" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/aft) +"qlW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qlY" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"qmo" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrogen_input{ + dir = 8 + }, +/obj/machinery/air_sensor/atmos/nitrogen_tank{ + pixel_y = -25 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"qmD" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"qnk" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"qnr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"qnx" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qnC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/terminal{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"qnL" = ( +/obj/machinery/power/solar_control{ + id = "auxsolareast"; + name = "Starboard Bow Solar Control" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"qoh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"qpb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"qpo" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"qpW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/stack/packageWrap{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/item/stack/wrapping_paper{ + pixel_x = 3; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"qqb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma, +/turf/open/floor/plating, +/area/storage/atmos) +"qqo" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"qqR" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"qqZ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"qrq" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/teleporter"; + name = "Teleporter APC"; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"qrv" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/integrated_circuit_printer, +/obj/machinery/camera{ + c_tag = "Testing Lab West"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"qrA" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qrR" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"qrS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/janitor) +"qsf" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"qsm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"qss" = ( +/turf/open/floor/plasteel, +/area/hydroponics) +"qsz" = ( +/obj/structure/closet/secure_closet/medical1{ + anchored = 1; + pixel_x = -3 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/shower{ + dir = 4; + pixel_x = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qsD" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/electrical) +"qtH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"qtK" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/library) +"quh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"quj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"qur" = ( +/turf/open/floor/plating, +/area/quartermaster/storage) +"quE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"quH" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/flasher/portable, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"qva" = ( +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"qvG" = ( +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"qwq" = ( +/obj/machinery/power/apc{ + areastring = "/area/science/server"; + dir = 1; + name = "Server Room APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"qxk" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/washing_machine, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"qxw" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"qxT" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qxX" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "packageSort2" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"qyc" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qyt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "misclab"; + name = "Test Chamber Blast Doors"; + pixel_y = -22; + req_access_txt = "55" + }, +/obj/machinery/button/ignition{ + id = "testigniter"; + pixel_y = -30; + pixel_x = -1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"qyK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"qzz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"qzO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Construction Area"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"qzP" = ( +/obj/machinery/vending/dinnerware{ + contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4) + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"qzX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"qAi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"qAq" = ( +/obj/machinery/quantumpad{ + map_pad_id = "5"; + map_pad_link_id = "6" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"qAx" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"qAF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/atmos) +"qAI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"qBb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/primary/central) +"qBu" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qBG" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"qBO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Toxins Launch Hall 4"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"qCo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"qCK" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qDg" = ( +/obj/structure/chair/comfy/brown, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"qDO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"qEs" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/chair/sofa/left{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"qEz" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 3"; + name = "Cell 3"; + dir = 1 + }, +/obj/effect/turf_decal/vg_decals/numbers/three, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"qED" = ( +/obj/effect/turf_decal/vg_decals/atmos/nitrogen, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine/n2, +/area/engine/atmos) +"qFa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/hallway/primary/port) +"qFf" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"qFH" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_y = 29 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qFZ" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"qGn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"qGt" = ( +/obj/structure/bodycontainer/crematorium{ + id = "crematoriumChapel"; + dir = 8 + }, +/obj/machinery/button/crematorium{ + id = "crematoriumChapel"; + pixel_x = 25 + }, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"qGL" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"qGM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Crematorium Maintenance"; + req_access_txt = "27" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plating, +/area/chapel/office) +"qHc" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"qHe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"qHi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main) +"qHq" = ( +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qHC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating, +/area/engine/atmos) +"qHL" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qHO" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-21" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"qIm" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"qIx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/reinforced, +/obj/item/storage/box/ids, +/obj/item/storage/box/PDAs{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/secure/briefcase, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qIP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/camera{ + c_tag = "Dorms Central" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qIR" = ( +/obj/machinery/button/massdriver{ + id = "toxinsdriver"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"qIT" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"qIU" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"qJs" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"qJw" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/maintenance/solars/starboard/aft) +"qJy" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"qJM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qJV" = ( +/turf/closed/wall/r_wall, +/area/science/mixing) +"qKk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qKA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qKP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"qLm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"qLp" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"qLt" = ( +/obj/structure/rack, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"qLG" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qMn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"qMB" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"qMN" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"qNB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"qOb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/wood, +/area/chapel/main) +"qOs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"qOA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"qOL" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/chapel/office) +"qQb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qQp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) +"qQt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"qQC" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"qQH" = ( +/turf/open/floor/plasteel/dark, +/area/teleporter) +"qRe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering"; + req_access_txt = "32" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"qRy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/clown, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"qRF" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/engine/storage) +"qRH" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/atmospherics_engine"; + dir = 1; + name = "Atmospherics Engine APC"; + pixel_y = 25 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas waste pump" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"qRK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"qSh" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qSi" = ( +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"qSy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"qSJ" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/structure/closet/secure_closet/miner, +/obj/item/clothing/shoes/winterboots/ice_boots, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"qSP" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"qSR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qSS" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"qTb" = ( +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"qTo" = ( +/obj/machinery/computer/shuttle/snow_taxi, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"qTG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"qTO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"qUe" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"qUF" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/item/aiModule/reset, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/clothing/gloves/color/yellow, +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"qVf" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"qVi" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/wood, +/area/chapel/office) +"qVD" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"qWa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"qWg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"qWs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qWH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"qWL" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/chemistry, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"qWM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/medical{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"qXN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Escape Arm Northwest" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"qYD" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) +"qYN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qZO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rai" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"ral" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"ram" = ( +/obj/machinery/computer/card/minor/rd{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Research Director's Office"; + dir = 1; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"raq" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"raA" = ( +/turf/closed/wall/r_wall, +/area/maintenance/starboard) +"raM" = ( +/obj/machinery/door/airlock/external, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/crew_quarters/dorms) +"rbg" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 25 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"rbm" = ( +/obj/machinery/rnd/server, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8; + external_pressure_bound = 140; + name = "server vent"; + pressure_checks = 0 + }, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) +"rbo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rbA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio2"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"rbC" = ( +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rbW" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/gun/syringe/dart, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rck" = ( +/obj/machinery/door/airlock{ + name = "Kitchen cold room"; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"rco" = ( +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"rcH" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"rdn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"rem" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/chief) +"rep" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"reS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L6" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=CHE"; + location = "AIE" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rfj" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"rfk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/storage/primary) +"rgh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"rgm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/hydroponics) +"rgC" = ( +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"rgH" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "External to Filter" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/maintenance/department/electrical) +"rgQ" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Test Chamber"; + network = list("xeno","rd"); + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"rhg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"rhU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/twohanded/required/kirbyplants, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rhX" = ( +/turf/closed/wall, +/area/medical/paramedic) +"rik" = ( +/obj/structure/closet/toolcloset, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"rio" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance"; + req_access_txt = "6" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/morgue) +"riC" = ( +/turf/closed/wall, +/area/maintenance/department/electrical) +"riE" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"rjx" = ( +/turf/closed/wall/r_wall, +/area/maintenance/central) +"rjB" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/ai_monitored/turret_protected/ai_upload"; + dir = 8; + name = "Upload APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload) +"rjO" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"rjP" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"rjQ" = ( +/obj/structure/light_construct/small{ + dir = 1 + }, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"rkd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rke" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/hallway/primary/port) +"rkp" = ( +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"rkL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rkP" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"rle" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Southeastern Hall 2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rlo" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rlA" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"rlC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"rlG" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "permahydro"; + name = "Recreation Module" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"rlM" = ( +/obj/machinery/power/solar_control{ + id = "auxsolareast"; + name = "Port Bow Solar Control" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"rlS" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"rlW" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/rd, +/obj/item/cartridge/signal/toxins{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/cartridge/signal/toxins{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/cartridge/signal/toxins, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"rmo" = ( +/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine/co2, +/area/engine/atmos) +"rmB" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rmL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/tcommsat/server) +"rmN" = ( +/turf/closed/wall, +/area/medical/medbay/zone2) +"rmQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"rmV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rnk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"rnA" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"rnK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"rnO" = ( +/obj/structure/table/reinforced, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"rom" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rot" = ( +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "starboardsolar"; + name = "Starboard Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"roS" = ( +/obj/machinery/computer/card/minor/cmo{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"roW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rpf" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/mixing) +"rqn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood, +/obj/item/nullrod, +/obj/item/reagent_containers/food/drinks/bottle/holywater, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/chapel/office) +"rqw" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Outer Medbay Lobby" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rqx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"rqE" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"rqG" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"rqJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"rqQ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"rqS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/engine/break_room) +"rqW" = ( +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"rrm" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"rsp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"rsy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rsD" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/wood, +/area/maintenance/bar) +"rsW" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restroom" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"rtm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"rtq" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/shield/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"rtD" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/maintenance/solars/port/fore) +"rtJ" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rum" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"ruo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"ruD" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/vending/wardrobe/cap_wardrobe, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"rvf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rvl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"rwa" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/circuit, +/area/science/server) +"rwm" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/maintenance/solars/port/aft) +"rww" = ( +/turf/closed/wall, +/area/engine/secure_construction) +"rwW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/medical/morgue) +"rxc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"rxf" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rxl" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"rxt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"rxu" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/library) +"rxI" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/solar{ + id = "portsolar"; + name = "Port Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"rxJ" = ( +/obj/item/stack/cable_coil/random, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"rxM" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001 + }, +/obj/item/clothing/head/helmet/alt{ + layer = 3.00001; + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"ryE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"rAa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rAe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"rAj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera{ + c_tag = "Bridge Northeast"; + dir = 1 + }, +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/plasteel/dark, +/area/bridge) +"rAW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"rBb" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/aft) +"rBc" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rBA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "AI Chamber - Core"; + network = list("aicore"); + dir = 4 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"rBG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Robotics Lab"; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"rDv" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"rDA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel, +/area/science/mixing) +"rDE" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"rDG" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rEi" = ( +/turf/open/floor/plating, +/area/maintenance/bar) +"rEx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"rFk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"rFB" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rFQ" = ( +/obj/structure/table/reinforced, +/mob/living/simple_animal/parrot/Poly, +/obj/item/clothing/glasses/meson{ + pixel_y = 4 + }, +/obj/item/cartridge/atmos, +/obj/item/cartridge/engineering{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/cartridge/engineering{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/cartridge/engineering{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/obj/machinery/keycard_auth{ + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"rGc" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rGy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"rGP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/turnstile{ + name = "Genpop Exit Turnstile"; + req_access_txt = "70"; + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"rHa" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/security/main) +"rHS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"rIl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/status_display/supply{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"rIB" = ( +/obj/structure/closet{ + name = "Evidence Closet" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"rJh" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rJk" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/purple, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"rJw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rJM" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"rJO" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"rKd" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"rLb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"rLk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/bridge) +"rLn" = ( +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/misc_lab) +"rMv" = ( +/obj/machinery/shieldwallgen, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"rMS" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/energy/laser{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"rNn" = ( +/obj/item/beacon, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rNP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"rNS" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rOd" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"rOD" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Server Room"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/tcommsat/server) +"rPs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard) +"rPD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 8"; + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rPU" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "robo1" + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass{ + amount = 20; + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"rQs" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"rQu" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"rQz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rQH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/disposal) +"rQJ" = ( +/turf/closed/wall, +/area/science/robotics/lab) +"rQN" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"rRk" = ( +/obj/structure/chair/comfy/beige, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"rRV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"rSn" = ( +/obj/structure/table/optable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"rSF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/engine/atmos) +"rSN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"rTj" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"rTs" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"rTv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"rTz" = ( +/obj/structure/fireplace{ + pixel_y = -6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"rTA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"rTG" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rTW" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rUd" = ( +/turf/open/openspace/icemoon, +/area/science/mixing) +"rUl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"rUq" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rUu" = ( +/obj/machinery/computer/message_monitor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"rUK" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness/recreation"; + dir = 8; + name = "Rec Room APC"; + pixel_x = -25; + pixel_y = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"rVy" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"rVA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"rVB" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/engine/storage) +"rVN" = ( +/turf/closed/wall, +/area/maintenance/central) +"rWN" = ( +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel/dark, +/area/bridge) +"rXn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"rXo" = ( +/obj/machinery/power/emitter, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"rXp" = ( +/obj/item/target/alien/anchored, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/preset/toxins{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"rXw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rYc" = ( +/obj/machinery/computer/arcade/battle{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rYi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"rYn" = ( +/obj/machinery/telecomms/message_server, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"rYD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"rYN" = ( +/obj/structure/chair/stool, +/turf/open/floor/carpet, +/area/chapel/main) +"rYQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/chair/sofa/corner, +/turf/open/floor/wood, +/area/maintenance/bar) +"rZJ" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"rZL" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"sat" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"sax" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"saN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"saP" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/pew/left{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Chapel" + }, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main) +"sbo" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sbN" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"sbS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sco" = ( +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/port) +"scu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"scF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"scH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"scY" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sda" = ( +/turf/closed/wall, +/area/storage/tech) +"sdc" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/aft) +"sde" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/security, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"sdq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/closet/l3closet/janitor, +/turf/open/floor/plasteel, +/area/janitor) +"sdr" = ( +/turf/open/floor/plasteel, +/area/engine/atmos) +"sdw" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sdH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"sdN" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/central) +"sem" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"seo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"seG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"seR" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"seZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/medical/morgue) +"sfm" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"sfn" = ( +/obj/machinery/computer/secure_data, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"sgB" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Monkey Pen"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"sgL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"shM" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"shN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"shR" = ( +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"shX" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes/engineering, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 20 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"siO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Chief Engineer"; + req_access_txt = "56" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"siX" = ( +/obj/effect/turf_decal/trimline/red/filled, +/obj/machinery/suit_storage_unit/security, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"sjE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/vending/tool, +/turf/open/floor/plasteel, +/area/storage/primary) +"sjW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"skB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"skE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"skK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"skZ" = ( +/turf/closed/wall/r_wall, +/area/janitor) +"slc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"slJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/door{ + id = "Skynet_launch2"; + name = "Mech Bay Door Control"; + pixel_x = 6; + pixel_y = -24; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"slO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"sma" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"smP" = ( +/turf/closed/wall/r_wall, +/area/security/detectives_office) +"smY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"snb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/computer/card, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"soN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"spa" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"spy" = ( +/obj/machinery/power/solar_control{ + dir = 1; + id = "starboardsolar"; + name = "Starboard Quarter Solar Control" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"spE" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/visible{ + dir = 8 + }, +/obj/machinery/computer/atmos_control/tank/nitrous_tank{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sqg" = ( +/turf/closed/wall, +/area/construction/storage) +"sqx" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"srk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/hallway/primary/fore) +"srm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"srq" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"srB" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"srJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"srL" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"srU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/cabinet, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"ssF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ssH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nitrous_output{ + dir = 8 + }, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"stW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"sub" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2, +/turf/open/floor/plating, +/area/storage/atmos) +"sup" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/kitchen) +"suK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_interior"; + name = "Virology Interior Airlock"; + req_access_txt = "39" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"suL" = ( +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"sve" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"svp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"svY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"swQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"sxa" = ( +/obj/machinery/requests_console{ + department = "Medbay"; + departmentType = 1; + name = "Medbay RC"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sxb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sxl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"sxB" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/medical, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"sxJ" = ( +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sxN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"syy" = ( +/obj/machinery/camera{ + c_tag = "Toxins Lab East"; + dir = 8; + network = list("ss13","rd"); + pixel_y = -22 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"syN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 1"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"sza" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"szG" = ( +/obj/machinery/computer/mech_bay_power_console, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"szK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/security/checkpoint/medical) +"szX" = ( +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"szZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/item/aicard, +/obj/item/multitool, +/obj/item/assembly/flash/handheld, +/turf/open/floor/plasteel/dark, +/area/bridge) +"sAh" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"sAw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sBs" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"sBy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"sBB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"sDu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"sDD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"sDW" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"sFh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/security/brig) +"sFp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"sFw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"sGC" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sGE" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"sGL" = ( +/obj/machinery/camera{ + c_tag = "Brig Lobby" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"sHl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/vending/assist, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"sHv" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"sHJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/fans/tiny, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"sHK" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"sIk" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/engine/engineering) +"sIn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + req_one_access_txt = "13,8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"sIT" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"sJs" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"sJD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sKh" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/fans/tiny, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"sKN" = ( +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/rnd/production/circuit_imprinter, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"sLg" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"sLj" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/zone2) +"sLn" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen/fountain, +/obj/item/clipboard, +/obj/item/stamp/qm, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"sLq" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"sLr" = ( +/obj/machinery/gateway{ + dir = 6 + }, +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"sLv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"sLN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"sMa" = ( +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"sMi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"sMA" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sMX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"sNb" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"sNg" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/hallway/secondary/exit/departure_lounge) +"sNs" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"sNK" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; + dir = 4; + name = "Robotics Lab APC"; + pixel_x = 25 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"sOi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/main) +"sOz" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sOE" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/obj/machinery/door/window/brigdoor{ + base_state = "rightsecure"; + dir = 8; + icon_state = "rightsecure"; + name = "Head of Personnel's Desk"; + req_access_txt = "57" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Reception Window" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/hop) +"sPq" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/main) +"sPt" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel, +/area/engine/break_room) +"sPA" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"sPF" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"sQb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"sRh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"sRm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/sign/warning/biohazard, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"sRM" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/maintenance/department/bridge"; + dir = 4; + name = "Bridge APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"sSj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sSy" = ( +/obj/effect/turf_decal/stripes, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sSP" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/turf/open/floor/plasteel/dark, +/area/security/main) +"sSS" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"sTe" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sTq" = ( +/turf/open/openspace/icemoon, +/area/engine/atmospherics_engine) +"sTz" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/box/teargas{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/storage/box/teargas, +/obj/item/storage/box/teargas{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"sTI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"sTR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sUn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"sUE" = ( +/obj/structure/table/glass, +/obj/item/disk/design_disk, +/obj/item/disk/design_disk, +/obj/item/disk/tech_disk, +/obj/item/disk/tech_disk, +/obj/item/folder/white, +/turf/open/floor/plasteel/white, +/area/science/lab) +"sUF" = ( +/obj/machinery/atmospherics/components/unary/cryo_cell, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"sVh" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/machinery/camera{ + c_tag = "TEG East"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"sVL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"sWD" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/hand_labeler, +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"sWF" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/hallway/secondary/exit/departure_lounge) +"sWN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + name = "Brig"; + req_access_txt = "63; 42" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/wood, +/area/security/brig) +"sWT" = ( +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"sXl" = ( +/obj/structure/table/glass, +/obj/item/storage/box/disks{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"sXs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"sXy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"sXJ" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/cmo) +"sXV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/medical/virology) +"sYm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/science/storage) +"sYo" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/secure_construction) +"sYv" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"sZq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Courtroom West"; + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"sZJ" = ( +/obj/machinery/newscaster/security_unit{ + pixel_x = -28; + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"sZT" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"tag" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"taj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"tat" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"taP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/firealarm{ + pixel_y = 29 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"tbg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"tcj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/construction/storage) +"tcq" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"tcN" = ( +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"tcP" = ( +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Chemistry" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"tcU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"tcW" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tdE" = ( +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"tdK" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tdL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/janitor) +"tdX" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"teh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/prison"; + dir = 8; + name = "Prison Wing APC"; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/closet/secure_closet/genpop, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tey" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"teC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"teL" = ( +/obj/machinery/light, +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/storage/box/syringes{ + pixel_y = 5 + }, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"tfm" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"tfq" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Engineering" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"tfx" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/head/soft, +/obj/item/clothing/head/soft, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tfP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"tgd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tht" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"thu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/fitness) +"thy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"thF" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #4"; + dir = 8; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"thN" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"thV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"tif" = ( +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"tio" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tiG" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tiN" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tjA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tkq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/table, +/obj/item/multitool{ + pixel_x = 4 + }, +/obj/item/multitool, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler, +/turf/open/floor/plasteel, +/area/storage/primary) +"tkr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"tkG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"tkH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"tlc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/disposalpipe/junction/yjunction, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tlg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Starboard Bow Solar Access"; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"tlk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Telecomms and AI Access"; + req_access_txt = "32; 19" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"tlu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"tmo" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Mining Dock Airlock"; + req_access_txt = "48"; + shuttledocked = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/miningdock) +"tmt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tmx" = ( +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/science/lab) +"tmy" = ( +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"tmI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/storage) +"tmO" = ( +/turf/closed/wall, +/area/hallway/primary/port) +"tmU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tnL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"tnX" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"toa" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tod" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/chapel/main) +"tos" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"toH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/chapel/office) +"toL" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"tpf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tpg" = ( +/obj/machinery/light, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/carpet, +/area/chapel/office) +"tpl" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/security/prison) +"tpD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tpN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tqa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"tqg" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tqp" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"trn" = ( +/obj/machinery/telecomms/broadcaster/preset_right, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"trB" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/table/reinforced, +/obj/machinery/door/window/eastleft{ + name = "Hydroponics Desk"; + req_access_txt = "35"; + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/kitchen) +"trO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"trU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tsi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"tsq" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tsK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"ttl" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"tty" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ttG" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/wood, +/area/library) +"ttH" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/zone2"; + dir = 4; + name = "Southern Paramedic Station APC"; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"ttK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/chair/sofa, +/turf/open/floor/wood, +/area/maintenance/bar) +"ttQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"ttU" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"tuu" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating, +/area/maintenance/bar) +"tuv" = ( +/obj/machinery/vending/wardrobe/chap_wardrobe, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/carpet, +/area/chapel/office) +"tuP" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"tuZ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input{ + dir = 8 + }, +/obj/machinery/air_sensor/atmos/nitrous_tank{ + pixel_y = -25 + }, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"tvF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"twG" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"twU" = ( +/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/open/floor/wood, +/area/maintenance/bar) +"txk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/machinery/camera{ + c_tag = "Brig North" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"txz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"txL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"tys" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tyF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"tyH" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"tyQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"tzB" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"tzL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"tzP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tAa" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"tAm" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tAv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"tAG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"tAQ" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/window/northleft{ + dir = 4; + name = "Containment Pen"; + req_access_txt = "55" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"tAX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"tAY" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/bombcloset/security, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"tBl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/pipedispenser, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tBm" = ( +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"tBW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/vending/security, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tCa" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_x = -30 + }, +/obj/item/restraints/handcuffs, +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = 3 + }, +/obj/item/lighter, +/obj/item/storage/fancy/cigarettes, +/obj/machinery/camera{ + c_tag = "Detective's Office" + }, +/turf/open/floor/carpet, +/area/security/detectives_office) +"tCj" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"tCN" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"tDO" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/computer/security/telescreen{ + name = "Test Chamber Monitor"; + network = list("test"); + pixel_x = -30 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"tDY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"tEl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/light_switch{ + name = "Bar Lights"; + pixel_x = -6; + pixel_y = 28 + }, +/obj/machinery/reagentgrinder, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"tEt" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/turf/open/floor/plasteel, +/area/engine/atmos) +"tEQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"tFc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"tFr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"tFu" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"tFN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"tFY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"tGc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"tGJ" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"tGK" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/medical/virology) +"tGQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/carpet, +/area/hallway/primary/port) +"tHr" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/storage/box/rxglasses, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Genetics Research"; + network = list("ss13","medbay"); + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"tHC" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"tHH" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/pen/fourcolor, +/turf/open/floor/wood, +/area/library) +"tHU" = ( +/obj/machinery/camera{ + c_tag = "Escape Arm Southeast"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"tIz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"tJi" = ( +/obj/machinery/vending/wardrobe/robo_wardrobe, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"tJA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"tJL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"tKa" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tKD" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/miningdock"; + dir = 4; + name = "Mining Dock APC"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"tKN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio6"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"tKU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"tLA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/brig) +"tLF" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"tLI" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "Secure Gate"; + name = "Cell Shutters"; + pixel_x = 6; + pixel_y = -3; + req_access_txt = "2" + }, +/obj/machinery/button/door{ + id = "Secure Brig Control"; + name = "Brig Control Shutters"; + pixel_y = -3; + req_access_txt = "2"; + pixel_x = -6 + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"tLV" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/vehicle/ridden/secway, +/obj/item/key/security, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"tMk" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/light_construct/small{ + dir = 1 + }, +/obj/structure/barricade/wooden/snowed{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"tMn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/space_heater, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"tML" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/crew_quarters/kitchen) +"tMR" = ( +/obj/machinery/vending/hydronutrients, +/obj/machinery/requests_console{ + department = "Hydroponics"; + departmentType = 2; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"tNf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tNp" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"tNq" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tNX" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/engine/storage) +"tOs" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/APlus, +/obj/item/reagent_containers/blood/OPlus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/item/reagent_containers/blood/BPlus{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/reagent_containers/blood/BMinus{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_containers/blood/AMinus, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/blood, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"tOz" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"tOE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/maintenance/starboard) +"tOP" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/layer3{ + name = "scrubbers valve" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"tOY" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness"; + name = "Fitness Room APC"; + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tPB" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 4; + name = "euthanization chamber freezer" + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"tPQ" = ( +/obj/machinery/camera{ + c_tag = "Escape Arm Northeast"; + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"tQd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/closet/secure_closet/security/engine, +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/obj/machinery/camera{ + c_tag = "Security Post - Cargo"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"tQv" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/turf/open/floor/plasteel, +/area/janitor) +"tQy" = ( +/obj/structure/table, +/obj/machinery/light/small, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel, +/area/construction/storage) +"tQG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/poddoor/shutters{ + id = "qm_warehouse"; + name = "warehouse shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"tQI" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet{ + name = "Evidence Closet" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"tRe" = ( +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"tRv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"tRC" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tRI" = ( +/obj/structure/table/glass, +/obj/item/slime_scanner, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"tSd" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) +"tSB" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 4 + }, +/obj/structure/chair/office/light, +/turf/open/floor/plasteel/dark, +/area/science/server) +"tTo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/janitor) +"tTK" = ( +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science Requests Console"; + pixel_y = 32; + receive_ore_updates = 1 + }, +/obj/structure/table/reinforced, +/obj/item/analyzer, +/obj/item/wrench, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"tTO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/engine/storage) +"tTQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tTW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plating, +/area/security/detectives_office) +"tUi" = ( +/obj/machinery/computer/arcade/orion_trail{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tUF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"tVh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/barricade/wooden, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"tVp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"tVS" = ( +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_y = 30 + }, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay Storage"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tVV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + sortType = 27 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tWj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"tWx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tXn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"tXN" = ( +/turf/closed/wall/r_wall, +/area/science/robotics/lab) +"tYo" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/button/door{ + id = "Dorm3"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -24; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"tYT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"tZe" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"tZO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"uan" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/central"; + dir = 4; + name = "Medbay APC"; + pixel_x = 24 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uap" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/window/northright{ + name = "Engineering Production"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"uat" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"uaG" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) +"uaJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"uba" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ubd" = ( +/obj/machinery/space_heater, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"ubL" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/central) +"ubQ" = ( +/obj/machinery/field/generator, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 20 + }, +/turf/open/floor/plating, +/area/engine/storage) +"ucm" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ucC" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"ucO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ucZ" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/safe, +/obj/item/gun/ballistic/revolver/nagant, +/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/clothing/head/bearpelt, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/nuke_storage"; + name = "Vault APC"; + pixel_y = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"udB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_access_txt = "3" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/warden) +"udE" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/misc_lab) +"udI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"udO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"udT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"ueq" = ( +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"ueK" = ( +/obj/structure/closet/l3closet, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"ueO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"ueR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"ufA" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"ufJ" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ugk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"ugr" = ( +/obj/machinery/button/door{ + id = "Bath1"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + pixel_y = -5; + specialfunctions = 4 + }, +/obj/machinery/shower{ + pixel_y = 20 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"uha" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"uhD" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"uhN" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uiO" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ujD" = ( +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"ujE" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"ujF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ukI" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm4"; + name = "Room Three" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"ukJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"ulh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ulr" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uma" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/storage/primary) +"umg" = ( +/obj/machinery/airalarm{ + pixel_y = 25 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/plating, +/area/engine/storage) +"umx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"umC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"umD" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"umX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/vending/wallmed{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"unt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/closet/wardrobe/white, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"unA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"unF" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmospherics_engine) +"unX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"uoc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"uot" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"uoV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"upH" = ( +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor South"; + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"uqa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"uqy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"urI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hydroponics) +"urV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 24 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"usn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/turf/open/floor/plating, +/area/storage/tech) +"ust" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"usE" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port) +"usM" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/library) +"utj" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"utp" = ( +/obj/structure/cable, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/storage/atmos) +"utS" = ( +/obj/structure/table, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/gloves/color/latex, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"uup" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/storage/atmos) +"uut" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"uuu" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"uuD" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uuU" = ( +/obj/structure/closet/emcloset, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"uuY" = ( +/obj/machinery/camera{ + c_tag = "Toxins Lab West"; + network = list("ss13","rd"); + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/assembly/prox_sensor{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 9; + pixel_y = -2 + }, +/obj/item/assembly/prox_sensor{ + pixel_y = 2 + }, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"uvB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"uvO" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Brig South"; + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"uwn" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera/motion{ + c_tag = "Armory - External 2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/ai_monitored/security/armory) +"uwV" = ( +/obj/machinery/camera{ + c_tag = "Northwestern Hall 4"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uxq" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"uxx" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uxF" = ( +/obj/machinery/space_heater, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"uxO" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/engine/storage) +"uyK" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/exit/departure_lounge) +"uyM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"uyW" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/pdapainter, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/heads/hop"; + dir = 1; + name = "Head of Personnel APC"; + pixel_y = 24 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"uze" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"uzf" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uzI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/secure_construction) +"uzT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"uAh" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/wood, +/area/library) +"uAj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uAs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"uAu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uBa" = ( +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"uBc" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/science/xenobiology) +"uBh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"uBi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uBy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"uBG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"uCi" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"uCo" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uCr" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/plating, +/area/maintenance/bar) +"uCE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uDK" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"uDO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uEd" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/space_heater, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"uEg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"uEz" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"uEB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"uEG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/dorms"; + dir = 1; + name = "Dormitory APC"; + pixel_y = 24 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"uFq" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Arrivals Airlock" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"uGQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"uGY" = ( +/obj/structure/chair/comfy/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"uHc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"uHl" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + shuttledocked = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/maintenance/central) +"uHy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"uHM" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"uIs" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"uIv" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/bar"; + dir = 1; + name = "Bar APC"; + pixel_y = 23 + }, +/obj/machinery/door/window/southright{ + name = "Bar Door"; + req_one_access_txt = "25;28"; + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"uIU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"uIZ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uJx" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/science/robotics/mechbay) +"uJF" = ( +/obj/structure/table/glass, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/capacitor, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research and Development"; + network = list("ss13","rd"); + pixel_x = 22 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"uJL" = ( +/obj/structure/displaycase/labcage, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"uJV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"uKb" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/structure/table/wood, +/obj/item/storage/box/deputy, +/obj/item/storage/box/seccarts{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"uKr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"uKy" = ( +/obj/machinery/biogenerator, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"uKE" = ( +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uKG" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/camera{ + c_tag = "MiniSat Service Bay"; + dir = 8; + network = list("minisat"); + start_active = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"uKH" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"uKI" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"uKM" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/prison{ + pixel_x = 29; + dir = 8 + }, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"uLa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"uLd" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"uLV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uLX" = ( +/obj/structure/cable, +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Supermatter North"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"uMk" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Kill Room"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"uMF" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"uNd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"uOy" = ( +/obj/machinery/atmospherics/pipe/simple, +/obj/machinery/door/airlock/command/glass{ + name = "Server Room"; + req_access_txt = "30" + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"uPa" = ( +/obj/machinery/light, +/obj/structure/reflector/box, +/turf/open/floor/plating, +/area/engine/storage) +"uPe" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre"; + dir = 1; + name = "Theatre APC"; + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"uPn" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Vehicles Airlock"; + req_access_txt = "31" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"uPI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"uPJ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"uQc" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"uQG" = ( +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"uQR" = ( +/turf/open/floor/wood, +/area/bridge/meeting_room) +"uRc" = ( +/obj/structure/cable, +/obj/machinery/power/tracker, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"uRg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/bombcloset, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"uRi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"uSe" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hop"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/hop) +"uSv" = ( +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"uSH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"uSV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uTu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"uTK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plasteel, +/area/engine/atmos) +"uUi" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"uUk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uUl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uUr" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"uUC" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uUJ" = ( +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"uUZ" = ( +/obj/effect/turf_decal/arrows/red, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"uVe" = ( +/obj/structure/table/wood, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/item/radio/off{ + pixel_y = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"uVt" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"uVD" = ( +/obj/structure/table, +/obj/item/aiModule/reset, +/obj/item/aiModule/supplied/quarantine, +/obj/item/aiModule/supplied/freeform, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"uWb" = ( +/obj/structure/plasticflaps, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "supply dock loading door" + }, +/obj/machinery/conveyor{ + id = "QMLoad2"; + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/storage) +"uWn" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"uWo" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology North"; + dir = 4; + network = list("ss13","rd") + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"uWC" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"uWS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"uWW" = ( +/obj/structure/closet/crate/internals, +/turf/open/floor/plating, +/area/maintenance/starboard) +"uWY" = ( +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"uXi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/crew_quarters/heads/hor) +"uXs" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"uXy" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "AI Chamber - Aft"; + dir = 1; + network = list("aicore") + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"uXF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/chair{ + name = "Judge"; + dir = 4 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"uXL" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/primary/fore) +"uXO" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/storage/tech"; + dir = 1; + name = "Tech Storage APC"; + pixel_y = 24 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/engineering, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"uYa" = ( +/turf/open/floor/plasteel/white, +/area/medical/virology) +"uYf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"uYl" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) +"uYm" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teledoor"; + name = "Teleporter Access Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/teleporter) +"uZd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uZf" = ( +/obj/machinery/door/poddoor/incinerator_toxmix, +/turf/open/floor/engine/airless, +/area/science/mixing) +"uZz" = ( +/turf/closed/wall, +/area/quartermaster/sorting) +"vaj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vam" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"vax" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vaB" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"vaO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/dark, +/area/bridge) +"vaQ" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vaR" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/plating, +/area/maintenance/bar) +"vbx" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/tcommsat/computer"; + dir = 1; + name = "Telecomms Monitoring APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"vbz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vcF" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) +"vcG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vcH" = ( +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #3"; + dir = 8; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"vcN" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"vcY" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1480; + name = "Confessional Intercom"; + pixel_x = -4; + pixel_y = -29 + }, +/turf/open/floor/plasteel/grimy, +/area/chapel/main) +"vdw" = ( +/turf/open/floor/circuit, +/area/science/robotics/mechbay) +"vdW" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"vem" = ( +/obj/structure/table/wood, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/obj/item/pinpointer/nuke, +/obj/item/disk/nuclear, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"veC" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=CHW"; + location = "Dorm" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"veF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/bottle/whiskey, +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 3; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"veJ" = ( +/obj/structure/cable, +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"vfd" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"vfi" = ( +/obj/machinery/computer/telecomms/server, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"vfp" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"vfx" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"vgb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/security/courtroom) +"vgm" = ( +/obj/machinery/air_sensor/atmos/mix_tank, +/turf/open/floor/engine/airless, +/area/engine/atmos) +"vgo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"vgH" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"vgI" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vgW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"vgX" = ( +/obj/machinery/conveyor{ + id = "QMLoad2"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vgZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio8"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"vhb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vhf" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"vhT" = ( +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vir" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 16 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"viF" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plasteel, +/area/construction/storage) +"vju" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"vjQ" = ( +/obj/structure/closet/secure_closet/exile, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 25 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"vjV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vjX" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/command, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/storage/tech) +"vjY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"vkk" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vkw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"vkD" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"vkR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"vlz" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/dorms) +"vlC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vme" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/radio/off, +/obj/item/radio/off{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"vmr" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"vmD" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"vmJ" = ( +/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine/n2o, +/area/engine/atmos) +"vmM" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"vmN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vmO" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall/r_wall, +/area/medical/chemistry) +"vnl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Lab"; + req_access_txt = "55" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"vnn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/closet/secure_closet/hydroponics, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vnM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/hydroponics) +"vob" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vow" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"voD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 25 + }, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"vpz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/public/glass{ + name = "Security Lobby" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/security/courtroom) +"vpR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/security/prison) +"vqv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"vqF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vqP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"vqQ" = ( +/obj/effect/landmark/start/virologist, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vqS" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + dir = 1; + freq = 1400; + location = "Bridge" + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plasteel, +/area/bridge/meeting_room) +"vqY" = ( +/obj/machinery/button/door{ + id = "Dorm4"; + name = "Dorm Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -24; + specialfunctions = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vqZ" = ( +/obj/structure/window/plasma/reinforced{ + dir = 1 + }, +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, +/obj/machinery/door/poddoor{ + id = "tegheat"; + name = "TEG Heatshield" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/engine/atmospherics_engine) +"vra" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/disposal"; + name = "Disposal APC"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"vrd" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/port/fore) +"vrg" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o, +/turf/open/floor/plating, +/area/storage/atmos) +"vrx" = ( +/turf/closed/wall/r_wall, +/area/crew_quarters/dorms) +"vrI" = ( +/obj/machinery/button/door{ + id = "tegheat"; + name = "TEG Heatshield"; + pixel_y = 25 + }, +/obj/machinery/button/ignition{ + id = "Incinerator"; + pixel_y = 35; + pixel_x = -1 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"vrJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -35 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vse" = ( +/obj/machinery/gateway{ + dir = 10 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"vsK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/entry) +"vsM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vsN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"vtO" = ( +/obj/machinery/atmospherics/pipe/manifold, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/server) +"vuh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vuk" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "misclab"; + name = "test chamber blast door" + }, +/turf/open/floor/plating, +/area/science/misc_lab) +"vun" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vuJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vuO" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vvH" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"vvM" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 6 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) +"vwf" = ( +/obj/structure/bookcase/random/fiction, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/wood, +/area/library) +"vwV" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/machinery/power/apc{ + areastring = "/area/hydroponics"; + dir = 1; + name = "Hydroponics APC"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vwW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/stamp/captain, +/obj/item/storage/secure/safe{ + pixel_x = 35; + pixel_y = 5 + }, +/obj/item/melee/chainofcommand, +/obj/structure/window/reinforced, +/obj/machinery/camera{ + c_tag = "Captain's Office"; + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"vxi" = ( +/turf/open/floor/carpet, +/area/bridge) +"vxI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"vxX" = ( +/obj/structure/table, +/obj/item/multitool, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/camera{ + c_tag = "Auxiliary Tool Storage" + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"vyb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vyf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/storage) +"vyH" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/ai_upload_foyer"; + dir = 1; + name = "AI Upload Access APC"; + pixel_y = 27 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"vyJ" = ( +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vyM" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vzj" = ( +/obj/machinery/light/small, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/wood, +/area/library) +"vzn" = ( +/obj/structure/closet/secure_closet/miner, +/obj/item/clothing/shoes/winterboots/ice_boots, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"vzR" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vzS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vAh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"vAp" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vAs" = ( +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"vAy" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/chemistry"; + dir = 1; + name = "Chemistry APC"; + pixel_y = 24 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"vAF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vAI" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/plasteel/dark, +/area/bridge) +"vBa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown, +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"vBe" = ( +/obj/machinery/light/floor, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vBg" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"vBo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/command{ + name = "Conference Room"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"vBx" = ( +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"vBS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"vBV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Crematorium"; + req_access_txt = "27" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"vCr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vCv" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"vCE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"vDb" = ( +/obj/machinery/vending/cola/random, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"vDy" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"vDI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vEd" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"vEe" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vEi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"vEm" = ( +/obj/machinery/recharge_station, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat/service) +"vEo" = ( +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/wood, +/area/maintenance/bar) +"vEr" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"vEA" = ( +/obj/structure/cable, +/obj/structure/closet/secure_closet/contraband/armory, +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/spawner/lootdrop/armory_contraband{ + loot = list(/obj/item/gun/ballistic/automatic/pistol = 5, /obj/item/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/storage/box/syndie_kit/throwing_weapons = 3) + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/ai_monitored/security/armory"; + name = "Armory APC"; + pixel_y = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"vEG" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell 1 Locker" + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/item/radio/headset{ + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; + name = "prisoner headset"; + prison_radio = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vER" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"vFd" = ( +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/camera{ + c_tag = "Northwest Paramedic Post"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"vFe" = ( +/obj/item/beacon, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"vFM" = ( +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"vGi" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vGn" = ( +/obj/machinery/light, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"vHU" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"vIf" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Gen-Pop Access"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "permacell1"; + name = "genpop blast door" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"vIl" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/wood, +/area/hallway/primary/central) +"vIA" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"vJs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"vJt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Chapel Crematorium"; + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"vJG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/hallway/primary/port) +"vKa" = ( +/turf/closed/wall, +/area/crew_quarters/kitchen) +"vKc" = ( +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Toxins Storage"; + req_access_txt = "8" + }, +/turf/open/floor/plasteel, +/area/science/storage) +"vKm" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vKo" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fourcolor, +/obj/item/paper_bin/bundlenatural{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vKO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"vKP" = ( +/obj/structure/weightmachine/stacklifter, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vKT" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/storage/atmos) +"vLa" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command/glass{ + name = "Chief Medical Officer"; + req_access_txt = "40" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"vLt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/maintenance/disposal) +"vLE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/obj/structure/reagent_dispensers/foamtank, +/obj/item/radio/intercom{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"vLP" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/kitchen) +"vMf" = ( +/obj/machinery/computer/operating, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"vMg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) +"vMh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"vMl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hop) +"vMB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side, +/area/hallway/primary/port) +"vNu" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; + dir = 8; + name = "Morgue APC"; + pixel_x = -26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"vNF" = ( +/obj/machinery/light, +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"vNY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vOo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Rec Room" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/fitness/recreation) +"vOB" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vOS" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"vOU" = ( +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vOV" = ( +/turf/closed/wall/r_wall, +/area/science/storage) +"vPB" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hydroponics) +"vPQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vQf" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/chapel/main) +"vQk" = ( +/obj/machinery/computer/holodeck{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/dorms) +"vQo" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"vQW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"vRa" = ( +/obj/structure/table, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/retractor, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/item/hemostat, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"vSb" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"vSc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vSg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"vSJ" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/icemoon/surface/outdoors) +"vST" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vSX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/wood, +/area/hallway/primary/central) +"vTh" = ( +/obj/machinery/computer/med_data, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/cmo) +"vTk" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"vTs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"vTF" = ( +/obj/item/radio/intercom{ + pixel_y = -26 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"vTP" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"vUj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Cooling Loop Bypass" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vUq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vUs" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"vUu" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/disposal) +"vUB" = ( +/obj/machinery/computer/pandemic, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vUE" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/techstorage/service, +/turf/open/floor/plasteel/dark, +/area/storage/tech) +"vUN" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/circuitry, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) +"vVs" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vVz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"vVN" = ( +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vVZ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"vWg" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vWt" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"vWV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/bridge) +"vXs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/medical{ + name = "Medbay Break Room"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"vYc" = ( +/obj/effect/landmark/blobstart, +/obj/item/pickaxe, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"vYL" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"vYP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"vZl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vZq" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/dark, +/area/bridge) +"vZv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"vZH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"vZR" = ( +/obj/effect/landmark/start/bartender, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"vZY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"waa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"was" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + pixel_x = -4 + }, +/turf/open/floor/wood, +/area/hallway/primary/port) +"wav" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Brig Genpop North"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"wax" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"waC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenic Storage" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"waP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wbe" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"wbE" = ( +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"wbF" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) +"wbJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/cheesynachos{ + pixel_y = 5 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"wbO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wbT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"wck" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/camera, +/obj/item/storage/photo_album{ + pixel_y = -10 + }, +/obj/structure/window/reinforced, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"wcn" = ( +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs, +/turf/open/floor/plasteel/dark, +/area/security/main) +"wcy" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wcB" = ( +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"wcS" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"wdb" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 10 + }, +/obj/structure/table, +/obj/item/folder/white, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/science/server) +"wdk" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"wdt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wdu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/break_room) +"wdv" = ( +/turf/closed/wall, +/area/icemoon/surface/outdoors) +"wdR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"wen" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + desc = "A remote control switch for the medbay foyer."; + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + normaldoorcontrol = 1; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"weS" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"wfN" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Toxins Chamber"; + network = list("ss13","rd") + }, +/turf/open/floor/engine, +/area/science/mixing) +"wfS" = ( +/obj/machinery/door/airlock{ + id_tag = "Dorm2"; + name = "Room One" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"wgu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"wgH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wha" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"whB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"whW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wie" = ( +/obj/machinery/gateway{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"wje" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wji" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wju" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/computer/security{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"wjK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"wjL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wjW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wkg" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wku" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"wkM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wkS" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/chair/sofa/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/checkpoint/supply"; + dir = 8; + name = "Cargo Security APC"; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"wlo" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/plasteel/cult, +/area/lawoffice) +"wlD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/virology) +"wlG" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Two" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/primary/port) +"wlZ" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) +"wmf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"wmx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3 + }, +/obj/item/pen{ + pixel_x = -3 + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"wmB" = ( +/turf/closed/indestructible/rock/glacierrock/blue, +/area/engine/atmos) +"wmG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"wmH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Auxiliary Tool Storage"; + req_access_txt = "12" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/auxiliary) +"wnM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/beacon, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"wnO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wnX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/mineral_door/woodrustic, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"won" = ( +/obj/machinery/telecomms/server/presets/command, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"wop" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_access_txt = "63" + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"woM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"wph" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/tcommsat/computer) +"wpN" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plasteel, +/area/science/storage) +"wqc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "xenobio6"; + name = "Containment Blast Doors"; + pixel_y = 4; + req_access_txt = "55" + }, +/turf/open/floor/plasteel, +/area/science/xenobiology) +"wqd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/machinery/requests_console{ + department = "Tool Storage"; + pixel_x = 30 + }, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/plasteel, +/area/storage/primary) +"wqe" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wql" = ( +/turf/closed/wall/r_wall, +/area/security/brig) +"wrh" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/machinery/computer/cryopod{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"wrN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"wsc" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"wsj" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/atmospherics_engine) +"wtp" = ( +/obj/structure/closet/wardrobe/grey, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wtt" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 13; + pixel_x = -7 + }, +/obj/item/camera/detective, +/obj/item/hand_labeler{ + pixel_x = 5 + }, +/obj/item/storage/briefcase, +/obj/item/storage/secure/safe{ + pixel_y = 36; + pixel_x = 6 + }, +/turf/open/floor/carpet, +/area/security/detectives_office) +"wtY" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"wuf" = ( +/obj/structure/grille, +/obj/structure/lattice, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"wuj" = ( +/obj/structure/table, +/obj/item/storage/firstaid/o2, +/obj/item/storage/firstaid/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wut" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wuB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/storage) +"wuC" = ( +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "auxsolareast"; + name = "Port Auxiliary Solar Array" + }, +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel, +/area/icemoon/surface/outdoors) +"wuQ" = ( +/obj/structure/table, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, +/obj/machinery/camera{ + c_tag = "Hydroponics Storage" + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"wuS" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/central) +"wvg" = ( +/turf/open/floor/wood, +/area/library) +"wvj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/checkpoint/supply) +"wwx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"wwO" = ( +/obj/structure/chair/stool, +/obj/structure/light_construct/small, +/turf/open/floor/wood, +/area/maintenance/bar) +"wxf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"wxw" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 24 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) +"wxT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/zone2) +"wxZ" = ( +/obj/structure/table, +/obj/machinery/smartfridge/disks{ + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"wyg" = ( +/turf/closed/wall/mineral/wood, +/area/maintenance/bar) +"wzf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"wzl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"wzF" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wzH" = ( +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wAx" = ( +/turf/closed/wall, +/area/hydroponics) +"wAM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/nuclearbomb/beer, +/turf/open/floor/wood, +/area/maintenance/bar) +"wAQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"wAW" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"wBg" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/maintenance/solars/port/fore) +"wDd" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"wDk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wDt" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/chapel/main) +"wDI" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"wDJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Digital Valve" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/electrical) +"wDR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/atmos/abandoned{ + name = "Atmospherics Maintenance"; + req_access_txt = "12;24" + }, +/turf/open/floor/plasteel, +/area/storage/atmos) +"wEm" = ( +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/bar) +"wEP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wFc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/closet/radiation, +/obj/machinery/requests_console{ + department = "Engineering"; + departmentType = 4; + name = "Engineering RC"; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wFt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"wFv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/chapel/office) +"wFB" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"wFD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"wFO" = ( +/obj/machinery/shieldgen, +/turf/open/floor/plating, +/area/engine/storage) +"wFR" = ( +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wFU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"wGe" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wGq" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"wGB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wGD" = ( +/obj/structure/barricade/wooden{ + max_integrity = 10; + obj_integrity = 10 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"wHQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"wIx" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/l3closet/security, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"wIA" = ( +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"wIH" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"wIT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"wJf" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/engine/secure_construction) +"wJy" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/aft) +"wJH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/construction/storage) +"wJN" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"wJO" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai_upload) +"wKL" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/plasteel, +/area/engine/atmos) +"wKN" = ( +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"wKU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"wLs" = ( +/obj/structure/sign/departments/medbay/alt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/medical/medbay/central) +"wLG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/mineral/wood, +/area/icemoon/surface/outdoors) +"wMr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"wMw" = ( +/obj/machinery/chem_master/condimaster, +/turf/open/floor/plasteel, +/area/hydroponics) +"wMJ" = ( +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" + }, +/obj/item/gun/ballistic/revolver/doublebarrel, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/under/suit/waiter, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"wMT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/obj/machinery/door/poddoor/preopen{ + id = "xenobio2"; + name = "containment blast door" + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"wNf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"wOn" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/pod/dark, +/area/medical/paramedic) +"wOK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/misc_lab) +"wPD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"wPT" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/main) +"wQG" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/wood, +/area/maintenance/bar) +"wRa" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "packageSort2" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"wRb" = ( +/obj/machinery/telecomms/processor/preset_two, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"wRc" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Cooling to Unfiltered" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wRm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/maintenance/aft) +"wRv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table, +/obj/item/lightreplacer, +/turf/open/floor/plasteel, +/area/engine/break_room) +"wRz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/lab) +"wRN" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wRY" = ( +/turf/closed/wall/r_wall, +/area/maintenance/solars/starboard/aft) +"wSb" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"wSc" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/carpet, +/area/hallway/primary/port) +"wSy" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wSI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"wTe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/station_engineer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"wTf" = ( +/turf/closed/wall/r_wall, +/area/security/warden) +"wTx" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/dark, +/area/security/main) +"wTK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/chair/stool, +/obj/effect/landmark/start/scientist, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"wUj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/fore) +"wUr" = ( +/turf/closed/wall, +/area/science/robotics/mechbay) +"wVg" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"wVO" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"wWd" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/table, +/obj/item/flashlight/lamp{ + pixel_x = -2; + pixel_y = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"wWF" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical{ + filter_type = "n2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wWL" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 5"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"wXj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"wXk" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"wXZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/carpet/orange, +/area/engine/secure_construction) +"wYe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/construction/storage) +"wYk" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"wZl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/floor/plasteel/chapel, +/area/chapel/main) +"wZJ" = ( +/obj/structure/chair/sofa{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/start/depsec/engineering, +/turf/open/floor/plasteel, +/area/security/checkpoint/supply) +"wZV" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/power/terminal, +/obj/machinery/camera{ + c_tag = "Southern Engineering Post" + }, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"xac" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/disposal) +"xal" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"xas" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"xaI" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xaS" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xaW" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"xbm" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"xbp" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xcd" = ( +/obj/machinery/gateway{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"xcA" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"xcL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xcY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xdc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xdr" = ( +/obj/machinery/camera{ + c_tag = "Head of Security's Office"; + dir = 8 + }, +/obj/structure/bed/dogbed{ + desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off."; + name = "pet bed" + }, +/mob/living/simple_animal/hostile/retaliate/bat/secbat{ + desc = "An adorable fruit bat with a cute little hat, may or may not have a reputation for biting out eyeballs, or at least that's what the HoS'd tell you."; + name = "Colonel Chomps" + }, +/obj/item/storage/secure/safe/HoS{ + pixel_x = 35 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"xdD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xeI" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "robo1" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"xeV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/reagent_dispensers/foamtank, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xfs" = ( +/obj/structure/table, +/obj/item/paicard, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"xfD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/storage/primary) +"xfH" = ( +/obj/machinery/computer/station_alert, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"xgh" = ( +/obj/item/stack/rods, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"xgi" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Cooling to Unfiltered" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"xgq" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/freezer, +/area/medical/surgery) +"xgu" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 28 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"xgB" = ( +/mob/living/carbon/monkey, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xgM" = ( +/obj/machinery/light/small, +/turf/open/floor/circuit/telecomms, +/area/science/xenobiology) +"xhb" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xhg" = ( +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, +/area/engine/atmos) +"xhD" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xhH" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"xhV" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/energy/e_gun{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/energy/e_gun, +/obj/item/gun/energy/e_gun{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"xiw" = ( +/turf/closed/wall/r_wall, +/area/icemoon/surface/outdoors) +"xiB" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "packageSort2" + }, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"xiL" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/engine/storage) +"xjZ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Escape Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/exit/departure_lounge) +"xka" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/hallway/primary/aft) +"xkR" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xkT" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/power/apc{ + areastring = "/area/chapel/main"; + dir = 1; + name = "Chapel APC"; + pixel_y = 24 + }, +/turf/open/floor/wood, +/area/chapel/main) +"xkW" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xlg" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Medbay Cryogenics"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xlm" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xls" = ( +/obj/structure/fireplace{ + pixel_y = -6 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/bar) +"xlX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xmo" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"xmr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"xmB" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xmC" = ( +/obj/structure/closet/jcloset, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/turf/open/floor/plasteel, +/area/janitor) +"xnb" = ( +/obj/machinery/airalarm{ + pixel_y = 26 + }, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"xnm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xnP" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"xol" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 20 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"xop" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"xou" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/computer/shuttle/snow_taxi, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"xow" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xoH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"xoS" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) +"xoY" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"xpl" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining{ + req_access_txt = "48" + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) +"xpU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"xqN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xrU" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xrW" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"xsE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/science/storage) +"xsJ" = ( +/obj/machinery/vending/cola/random, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/hallway/primary/port) +"xsZ" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/nukeplushie, +/obj/item/disk/nuclear/fake/obvious{ + pixel_y = -10 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/bar) +"xtq" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/xenobiology) +"xtP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"xtV" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xui" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"xur" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab"; + req_access_txt = "5; 33" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"xuB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/medbay/zone3) +"xuN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"xve" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"xvj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xvR" = ( +/obj/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/engine, +/area/engine/atmospherics_engine) +"xwg" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xwh" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xwA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) +"xwO" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xxi" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction/storage) +"xyA" = ( +/obj/machinery/door/window/northright{ + name = "Library Desk Door"; + req_access_txt = "37" + }, +/turf/open/floor/wood, +/area/library) +"xyT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/disposal) +"xzn" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=HOP"; + location = "CHE" + }, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"xzL" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec, +/obj/item/clothing/suit/hooded/wintercoat/security, +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"xzM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"xAi" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xAm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{ + dir = 8 + }, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"xAv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"xBi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/main) +"xBk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xBv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"xBV" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible/layer3{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/atmospherics_engine) +"xCe" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/engine/atmospherics_engine) +"xCf" = ( +/obj/structure/table, +/obj/item/radio/off, +/obj/item/radio/off{ + pixel_y = 6 + }, +/obj/item/radio/off{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"xCn" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xCr" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/medical/medbay/central) +"xCC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xCU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xDQ" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"xDS" = ( +/obj/machinery/status_display, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"xEf" = ( +/obj/machinery/computer/bounty{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/plasteel, +/area/quartermaster/qm) +"xEt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xFQ" = ( +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "virology_airlock_exterior"; + idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Console"; + pixel_x = 8; + pixel_y = -22; + req_access_txt = "39" + }, +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xFZ" = ( +/turf/closed/wall/r_wall, +/area/engine/secure_construction) +"xGh" = ( +/obj/machinery/space_heater, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) +"xGj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xGo" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/maintenance/bar"; + dir = 8; + name = "Maintenance Bar APC"; + pixel_x = -25 + }, +/turf/open/floor/plating, +/area/maintenance/bar) +"xGx" = ( +/obj/machinery/atmospherics/miner/toxins, +/turf/open/floor/engine/plasma, +/area/engine/atmos) +"xGy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xGE" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/flasher/portable, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"xGN" = ( +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) +"xGP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xGX" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/engine/atmos) +"xHk" = ( +/obj/machinery/gateway{ + dir = 9 + }, +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"xHt" = ( +/obj/machinery/light/small, +/turf/open/floor/carpet, +/area/quartermaster/miningoffice) +"xHE" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xHU" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xIJ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"xIT" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_x = -30 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xJn" = ( +/obj/machinery/computer/card/minor/ce, +/obj/machinery/computer/security/telescreen/ce{ + pixel_y = 24 + }, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Engineer's Desk"; + departmentType = 3; + name = "Chief Engineer RC"; + pixel_x = 32; + pixel_y = 27 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) +"xJr" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xJB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xJD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"xKn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/camera{ + c_tag = "Atmospherics Central"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xKu" = ( +/obj/structure/table, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/storage/box/donkpockets{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel/white, +/area/medical/virology) +"xKv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/engine/secure_construction) +"xKN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/crew_quarters/heads/chief) +"xLF" = ( +/obj/structure/closet/secure_closet/bar{ + pixel_x = -3; + pixel_y = -1; + req_access_txt = "25" + }, +/obj/structure/light_construct/small{ + dir = 1 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/tile/carpet/fifty, +/turf/open/floor/plating, +/area/maintenance/bar) +"xMG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/break_room) +"xMV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) +"xNs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"xOj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"xOq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4; + name = "east facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"xOY" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -26 + }, +/obj/machinery/camera{ + c_tag = "Northwestern Hall 6"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xPK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable, +/obj/machinery/power/apc/highcap/fifteen_k{ + areastring = "/area/engine/engineering"; + dir = 8; + name = "Engineering APC"; + pixel_y = -1; + pixel_x = -27 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/closet/radiation, +/obj/machinery/camera{ + c_tag = "Supermatter West"; + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"xQF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/paramedic) +"xQH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"xRy" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/chapel/office) +"xRH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"xRL" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"xRZ" = ( +/obj/machinery/telecomms/server/presets/medical, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) +"xSd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"xSN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xSP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xSZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xTI" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/carpet, +/area/chapel/office) +"xTL" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/wood, +/area/security/courtroom) +"xUe" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Snow Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xUm" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -28 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"xUy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Bar North" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"xUD" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/atmos) +"xUL" = ( +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"xUU" = ( +/turf/open/floor/plasteel/dark, +/area/maintenance/department/bridge) +"xVe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/teleporter) +"xVl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 19 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) +"xVn" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/medical/virology) +"xWi" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/circuit/off, +/area/ai_monitored/turret_protected/ai) +"xWq" = ( +/turf/closed/wall, +/area/storage/auxiliary) +"xWx" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/atmos) +"xWD" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"xXS" = ( +/obj/machinery/rnd/server, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) +"xXV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"xXX" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/central) +"xYD" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/carpet, +/area/hallway/secondary/exit/departure_lounge) +"xYE" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating, +/area/icemoon/surface/outdoors) +"xYJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/sorting) +"xYN" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/surgery) +"xZg" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/hallway/secondary/exit/departure_lounge) +"xZp" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/camera{ + c_tag = "Bar West"; + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"xZx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/storage/eva) +"xZL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"yae" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ybp" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ybQ" = ( +/obj/machinery/button/door{ + id = "permacell2"; + name = "Garden Lockdown"; + pixel_x = -25; + pixel_y = 7; + req_access_txt = "2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"ybT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/light/floor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ycl" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" + }, +/obj/structure/fans/tiny, +/turf/open/floor/pod/dark, +/area/maintenance/starboard) +"ycQ" = ( +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ydo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) +"ydp" = ( +/turf/closed/mineral/random/snow/no_caves, +/area/icemoon/surface/outdoors) +"yds" = ( +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"ydQ" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/solars/starboard/aft"; + dir = 8; + name = "Starboard Quarter Solar APC"; + pixel_x = -26; + pixel_y = 3 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) +"ydV" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"yeg" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad2" + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"yes" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"yeA" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/security/detectives_office) +"yeF" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"yfp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) +"yfA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"yfN" = ( +/turf/closed/indestructible{ + desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; + icon_state = "riveted"; + name = "hyper-reinforced wall" + }, +/area/icemoon/surface/outdoors) +"yfQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/computer/prisoner/management{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) +"yge" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/surface/outdoors) +"ygB" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"yhj" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"yhx" = ( +/turf/closed/mineral/random/snow/more_caves, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"yhz" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/brig) +"yij" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"yiy" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/quartermaster/qm) +"yiz" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/carpet, +/area/crew_quarters/heads/hos) +"yiT" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/service) +"yiZ" = ( +/obj/machinery/door/airlock/command{ + name = "Conference Room"; + req_access_txt = "19" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"yjh" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, +/turf/open/floor/plasteel/grimy, +/area/crew_quarters/bar) +"yjp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ykb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ykk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/obj/machinery/door/airlock/research{ + name = "Toxins Lab"; + req_access_txt = "7" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"ykr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"ykt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"yky" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"ykN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"yld" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/circuit/telecomms/mainframe, +/area/tcommsat/server) +"ylW" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/hydroponics) + +(1,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(2,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(3,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(4,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(5,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(6,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(7,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(8,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(9,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(10,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(11,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(12,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(13,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(14,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(15,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(16,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(17,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(18,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(19,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(20,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(21,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(22,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(23,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +fBG +wuf +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bTC +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(24,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +bTC +avT +avT +avT +avT +avT +avT +avT +rxJ +avT +avT +avT +xgh +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bTC +bBH +tFc +pEm +pEm +pEm +dbR +pEm +pEm +pEm +nBk +bJf +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(25,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +bTC +avT +lbu +aQK +wuC +avT +lbu +aQK +wuC +avT +lbu +aQK +wuC +avT +wuf +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bTC +buI +qqR +phs +ghq +ghq +ghq +ghq +ghq +ghq +ghq +bMj +tCN +bJf +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(26,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +bTC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +hnP +swQ +ghq +ghq +ghq +ghq +ghq +ghq +ghq +ghq +ghq +bMj +tCN +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(27,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +bTC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +cXI +ghq +hfZ +shR +ntV +jso +shR +shR +hfZ +ghq +ghq +bHE +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(28,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +avT +avT +avT +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bTC +buI +buJ +cXI +ghq +shR +shR +shR +liL +scF +hse +shR +ghq +ghq +bHE +bJf +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(29,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +wuf +wuf +avT +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +lbu +qfJ +wuC +avT +wBg +avT +chZ +vrd +vrd +vrd +vrd +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +fJZ +phs +cXI +ghq +shR +shR +cpe +cpe +cpe +xIJ +shR +ghq +ghq +bMj +tCN +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(30,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +aNg +chZ +chZ +chZ +rlM +rZJ +gAt +vrd +avT +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ydp +buI +lGy +ghq +cXI +aJC +shR +qVf +cXO +cpe +fho +lfD +shR +uXy +ghq +ghq +eBj +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(31,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +nuu +sXy +sXy +fNh +xUL +nyq +sXy +fNh +xUL +nyq +sXy +fNh +xUL +nyq +sXy +eWw +tnL +iaq +qeY +uaG +cbL +bbq +sXy +sXy +sXy +sXy +ikA +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +buI +gJx +ghq +cXI +irN +irr +xIJ +cpe +ooR +cpe +xIJ +irr +sZJ +ghq +ghq +wXk +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(32,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +clq +avT +avT +avT +clq +avT +avT +avT +clq +avT +aNg +chZ +chZ +chZ +kIG +sbN +jin +rtD +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +buI +phs +ghq +cXI +irr +tFu +hmC +rBA +dfy +ihn +xWi +irr +irr +ghq +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(33,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +fBG +wuf +avT +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +ajl +avT +chZ +vrd +vrd +vrd +vrd +yhx +yhx +yhx +yhx +bBh +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +bmX +avT +avT +avT +apJ +ayq +ghq +ghq +ghq +tSd +lQp +rQu +rKd +gHG +cqq +bxh +rKd +nyd +vmr +ghq +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +qrR +qrR +qrR +wuf +wuf +wuf +wuf +wuf +qrR +qrR +qrR +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(34,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +avT +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +rUq +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +ikA +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +ayq +ayq +ayq +ayq +ayq +cIh +cIh +cIh +asE +cyb +xDS +cIh +cIh +cIh +cIh +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +qrR +qrR +qrR +wuf +avT +avT +avT +wuf +qrR +qrR +qrR +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(35,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +bBh +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +vvM +hIS +fiG +kSR +gKo +cIh +kzS +rjB +auO +auP +cwT +aAC +mGl +grZ +vdW +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +qrR +qrR +qrR +wuf +avT +bLv +avT +wuf +qrR +qrR +qrR +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(36,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +lbu +mmM +wuC +avT +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +avT +avT +avT +apJ +apJ +oQE +vmD +pvw +yld +etz +kcw +apN +apJ +qTb +qTb +jdw +qTb +qTb +cIh +uVD +wJO +avP +iEJ +hva +vZH +lac +iMX +lhr +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +wuf +wuf +wuf +wuf +avT +avT +avT +bBh +avT +avT +avT +wuf +wuf +fBG +wuf +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(37,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +lbu +gTh +wuC +avT +lbu +gTh +wuC +avT +lbu +gTh +wuC +avT +wuf +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +rUq +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +ikA +apJ +apJ +wRb +pTw +mzx +tFY +eTR +tFY +dJB +apJ +uVe +qlY +jGi +tcN +jlL +cIh +iwc +nlM +fpI +ayk +awW +aAD +faV +nBU +cIh +ghq +bUB +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(38,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +wuf +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +bBh +apJ +apJ +ieI +pTw +pTw +ygB +pFI +tFY +pTw +apJ +ayq +ayq +dmy +ayq +ayq +cIh +cIh +cIh +awZ +ayl +cIh +cIh +cIh +cIh +cIh +bTC +nDu +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +rxI +rxI +rxI +rxI +rxI +avT +hGK +avT +rxI +rxI +rxI +rxI +rxI +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(39,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +avT +wuf +wuf +wuf +wuf +wuf +avT +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +apJ +apJ +xRZ +pTw +pTw +pzI +pdj +hAq +pTw +apJ +gWZ +nhn +eBf +qnk +ayq +vyH +lyu +gGs +iFc +ery +lWf +oEz +nOG +vEm +fet +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +yge +pjD +pjD +pjD +pjD +fNh +xUL +nyq +fsh +fsh +fsh +fsh +toa +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(40,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +apJ +apJ +nOn +pTw +pTw +vBx +doI +sUn +pTw +nAx +rUu +ekw +wph +rkp +ayq +nzD +cHu +oLB +qHe +cqr +azz +aAF +yiT +pwE +fet +avT +avT +bmX +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +dfx +dfx +dfx +dfx +dfx +avT +clq +avT +dfx +dfx +dfx +dfx +dfx +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(41,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +apJ +apJ +jgj +pTw +pTw +trn +pdj +jsu +pTw +rmL +vfi +ekw +mGb +chk +ayq +eZe +vJs +eKZ +iAv +aIK +dRI +aAE +uKG +vEm +fet +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +avT +fBG +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(42,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +apJ +apJ +vBg +pTw +pTw +pTw +tFY +sLg +nOe +ots +pNo +gzH +pdv +cQr +nyT +uQc +qDO +jll +clB +clB +clB +clB +clB +aHu +aHu +aHu +aHu +aHu +aHu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +rxI +rxI +rxI +rxI +rxI +avT +hGK +avT +rxI +rxI +rxI +rxI +rxI +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(43,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +apJ +apJ +mOe +pTw +lVK +pTw +pvx +apJ +apJ +apJ +nIu +vFe +gQj +leZ +evU +woM +jSq +lOF +clB +cry +azA +aAG +mGL +aHu +qwq +pGL +rwa +xXS +aHu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +yge +pjD +pjD +pjD +pjD +fNh +xUL +nyq +fsh +fsh +fsh +fsh +toa +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(44,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +ktw +ktw +ktw +ktw +ydp +ydp +avT +bBh +apJ +apJ +kgM +pTw +rYn +pTw +pTw +jCW +mxt +rOD +nIu +rkp +lCi +ikY +ayq +mmJ +tIz +udO +clB +crz +gMR +jDH +jDH +pNv +iJc +tzB +uOy +vtO +aHu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +dfx +dfx +dfx +dfx +dfx +avT +clq +avT +dfx +dfx +dfx +dfx +dfx +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(45,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +kRI +fdJ +hGU +ktw +ydp +ydp +avT +bBh +apJ +apJ +won +evJ +fsQ +mxo +nhO +apJ +apJ +apJ +ayq +vbx +atp +lTJ +ayq +dAV +tlk +ykr +clB +hKm +pYM +cYb +ram +aHu +fSR +fPF +rwa +rbm +aHu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +fBG +avT +avT +avT +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(46,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +vSJ +kZL +kZL +maR +ydp +ydp +avT +bBh +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +apJ +ayq +atI +qqo +arE +ayq +gYC +auc +avp +clB +ayp +azB +iRO +rlW +aHu +tNp +fPF +aHu +aHu +aHu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +rxI +rxI +rxI +rxI +rxI +avT +hGK +avT +rxI +rxI +rxI +rxI +rxI +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(47,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +ehh +kZL +hap +ktw +ydp +ydp +ydp +bBh +avT +apJ +gLH +gLH +gLH +gLH +gLH +asF +rMv +asF +gLH +ayq +ayq +ayq +ayq +ikh +tkr +aLu +clB +ayo +uXi +iRO +uJL +aHu +isu +fPF +cIg +aHu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +yge +pjD +pjD +pjD +pjD +fNh +xUL +nyq +fsh +fsh +fsh +fsh +toa +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(48,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +ktw +ktw +ktw +ktw +ydp +ydp +ydp +bBh +avT +avT +gLH +xHk +jPP +vse +mSs +qQH +qQH +qQH +asJ +cTE +cTE +axc +gLH +atb +tkr +jwo +clB +dKQ +azC +ofy +dKQ +aHu +wxw +tSB +opq +aHu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +dfx +dfx +dfx +dfx +dfx +avT +clq +avT +dfx +dfx +dfx +dfx +dfx +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(49,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +avT +avT +gLH +wie +ePa +jrR +nTQ +nTQ +xVe +wnM +nTQ +nTQ +sMX +lat +ldt +qSy +wGB +jwo +axG +gTc +aym +aAI +aBH +aHu +iFq +wdb +puk +aHu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +avT +avT +bBh +avT +avT +avT +avT +avT +avT +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(50,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +bmX +avT +gLH +ohf +xcd +sLr +muN +uDK +qQH +qQH +qQH +qQH +wmf +qrq +atJ +oiC +aBI +bEJ +aFI +ayr +azD +aAJ +tmx +aHu +aHu +aHu +aHu +aHu +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +wuf +wuf +avT +avT +avT +avT +qlH +bBh +qlH +avT +avT +avT +avT +wuf +wuf +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(51,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +avT +avT +gLH +aHc +pzZ +pzZ +eFn +loe +dqO +hwg +dlJ +ixu +vjQ +xCf +gLH +aCX +tkr +pYh +aFI +iek +wRz +erO +aBK +dFJ +kdA +aFI +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +fOG +jhF +cRJ +jhF +sdc +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(52,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +usE +usE +iAO +gLH +gLH +gLH +gLH +uYm +gLH +gLH +gLH +gLH +gLH +gLH +gLH +aCX +tkr +cYU +aFI +cwH +lam +erO +aBK +aDf +aEG +aFI +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +jhF +xMV +jhF +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(53,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +bBh +wSc +lZL +lmC +aCX +aCX +rZL +gYC +ssF +gYC +aCX +aCX +aCX +wje +efn +asc +wje +tqa +aue +lWb +dfa +obB +aAe +aBK +aDf +aEE +bxM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +jhF +jhF +gRP +jhF +jhF +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(54,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +rUq +tGQ +nEv +qFa +atq +atq +dJc +gdi +aDd +lWy +atq +atq +atq +atq +atq +igQ +oba +vMh +bsU +aFI +ays +mQK +auT +aBK +aDf +aEI +bxM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +dmE +oml +nsB +jYT +dmE +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(55,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +usE +xSN +usE +dxL +wje +uwV +etM +oQa +xJr +mWm +xJr +xJr +xJr +xJr +fTu +oQa +auX +avS +aFI +uJF +lam +jcS +aBK +aDc +aEH +bxM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +dmE +wbe +eCd +oml +dmE +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(56,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +oto +oto +oto +oto +oto +oto +avT +avT +avT +avT +avT +avT +avT +sXJ +sXJ +sXJ +iZH +ash +ash +ash +ntd +ash +ash +ash +ash +nQr +ash +ash +ash +wje +ahC +nOK +nEi +jRU +uzT +gWn +aBK +aDf +aEK +bxM +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +dmE +wax +wNf +mVe +dmE +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(57,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +oto +fwX +vRa +pFM +cGu +ash +aoj +ash +ash +ash +ash +sXJ +sXJ +sXJ +aiS +roS +iZH +qrA +fqM +xIT +vuJ +ash +ktW +rbW +aoR +apO +ash +arG +ash +qbh +auY +hEf +eGO +ayt +nuJ +aAw +aBK +aEJ +aEJ +aIP +avT +avT +bmX +avT +avT +avT +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +dmE +rwm +xDQ +dmE +dmE +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(58,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +oto +fGi +acV +nOj +acV +ash +adZ +kuy +gxq +jyj +hQb +sXJ +rxl +mfF +imM +jxw +iZH +lsA +xHE +cVu +hKt +hso +adx +rRV +aoT +pWz +ash +xCr +ash +lxF +rbo +ioG +bxM +ayu +aBK +iBF +sUE +aEJ +vYc +aIP +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +xUL +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(59,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +oto +vMf +abs +eut +rFk +adu +fva +xQH +kHX +anm +tsq +sXJ +vTh +lTB +kMT +rAW +ebF +uba +pPx +qJM +tUi +ash +tVS +anm +jiV +ash +ash +ash +ash +dXR +hOA +irg +aFI +bxM +jPz +bxM +aFI +aEJ +aIP +aIP +aIP +aIP +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +xUL +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(60,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +oto +pbw +qOA +acV +mNP +ash +mAk +pxZ +jmd +xHU +exq +sXJ +pNO +rVA +eFC +ooa +iZH +hEQ +vXs +gZQ +aoj +ash +lSN +anm +lYk +ash +wje +arI +syN +atr +rbo +jwo +azq +azq +azq +aAK +aIP +aDa +gfQ +rsp +qFZ +aPA +aPA +aPA +aPA +aPA +aPA +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +xUL +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(61,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +mpj +mpj +mpj +aaS +oto +oto +wKN +oto +oto +ash +aoj +hEQ +aoj +ash +cxX +sXJ +sXJ +hnB +qhU +vCE +gIm +mwV +nKO +kJs +anH +lUd +kqV +jPh +wFR +ash +ujD +arH +auV +auV +azG +aAL +wje +wje +wje +aAx +aIP +aAQ +eZi +iza +aHA +iqJ +hLo +aLD +mJr +aDX +aPA +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +xUL +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(62,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +hVm +sVL +dfV +aaS +dML +utS +fDi +tOs +ash +kMc +iRy +nsi +eue +eLX +iEa +hLg +sXJ +sXJ +vLa +gIm +gIm +rAa +ykN +alR +vVs +aoj +olz +wuj +bwm +ash +aqP +waP +aDh +aDh +lmu +mNo +xJr +xJr +xJr +aAT +aBw +aDg +hgJ +aFO +aHA +aIS +aKn +aLF +vUN +lkP +aIS +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +euS +sXy +jAq +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(63,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +efp +vWt +xKu +aaS +hIe +oKr +nOj +ntO +ash +adw +anm +anJ +anm +anm +prP +anH +dVV +czF +oqF +okm +ajV +aok +sJD +alR +amy +ash +ash +aoj +hEQ +apP +tUF +jGF +uBi +iKM +bNb +bNb +dsk +gsQ +kkG +ilo +bxk +ovq +aFO +aFO +aHA +rJM +aKm +aLE +aNj +fzU +mYx +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +xUL +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(64,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +lAS +pfN +kgx +aaS +pED +rSn +abZ +xgq +ash +ady +anm +anJ +anm +pbk +jga +kij +cKQ +kij +dZa +ajq +kij +cMc +alh +uDO +amA +ani +anI +aol +akB +ecD +esE +oDm +wje +avU +avX +avX +pdo +wje +rBc +vsN +aBG +aDk +aFO +aFO +aHA +hUo +sMi +oWw +aNl +aOm +aPB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +xUL +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(65,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +puS +iIg +lCW +aaS +lIn +fgp +poT +rFk +sTe +adx +jih +wkM +fUX +qsz +wut +anm +uUk +anm +anm +hXB +anm +anJ +xCn +alS +anH +anh +anH +rQz +aok +loO +aFJ +arK +asO +avU +avX +avX +pdo +wnO +jil +kzf +bxk +bxk +bxk +aFO +aHA +aPB +oqL +aLG +aNk +aOl +aPA +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +xUL +xUL +xUL +xUL +avT +avT +yhx +xUL +xUL +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(66,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +pZD +pZD +pZD +sXV +laE +kUo +aaS +aba +xYN +aba +aba +ash +adz +anm +uuD +gvp +egj +eoW +jih +dFb +fze +tVV +fze +pcT +poR +mIu +pKr +mhv +oge +jih +pig +aom +wLs +dXF +arN +wje +axi +axi +axi +kTI +wje +ava +mGa +wje +aUC +aEL +aFO +ldE +aPA +nlk +szK +aNm +aPA +aPA +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +euS +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(67,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +nnV +cni +qbY +fYU +uYa +vST +aaS +joT +kGS +vAh +vAh +oZq +kMy +nbU +lgq +rsy +pxE +fRS +rkL +tNq +rkL +mdq +anH +qWg +anH +kyf +anm +alU +alF +anm +anJ +aoU +aoj +oDw +oDm +wje +axi +ltF +avV +kTI +wje +etM +oNR +sxN +sxN +aDo +aFQ +aHe +aIN +aKp +odR +dPx +sPA +sKh +irt +irt +guI +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +euS +sXy +sXy +jAq +xUL +xUL +xUL +avT +yhx +xUL +xUL +xUL +xUL +xUL +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(68,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +tAa +xkR +pfY +wlD +gkx +xwh +aaS +gWj +nYv +hVX +nhz +ash +duu +dJZ +nwq +hWn +eSP +lOX +uUC +uan +ykb +lpW +sMA +mPm +anm +iEa +lDj +gzk +eiR +anm +anJ +aoU +aoj +oDw +uAj +xJr +mfi +xsJ +oWT +qAx +wje +ouH +ndX +gKt +gKt +uBy +aFR +vMg +vsK +aJZ +aLk +aNo +aOo +sKh +irt +srB +bzc +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +avT +avT +avT +avT +euS +sXy +sXy +jAq +xUL +xUL +xUL +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(69,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ktw +ktw +ktw +ktw +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +mpj +mpj +mpj +gIE +hBH +vST +pZD +pZD +pZD +pZD +pZD +pZD +ady +ofF +gZX +gZX +gZX +gZX +gZX +gZX +gZX +sUF +jUu +mPm +anm +iEa +wen +vyM +pdL +anm +fQx +nya +apP +rqw +tkr +wje +kTI +axi +axi +axi +wje +tkr +aAL +wje +aDb +qWM +hIH +nuS +aPE +wDR +fHF +aPC +aPE +aPE +hmM +bzc +bzc +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +euS +jAq +xUL +xUL +xUL +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(70,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +kRI +fdJ +hGU +ktw +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +qFf +hDj +pfY +wlD +jBP +xwO +cRX +suK +vGi +xcY +iFK +fKM +adA +hom +gZX +oaC +vvH +vvH +vvH +fsA +gZX +xlg +jUu +xGP +anm +iEa +anm +anm +amD +anm +anm +anm +fyV +hfX +aBI +asO +uGY +avX +avX +axj +wnO +aBI +aAY +bxk +bxk +bxk +hIH +iFl +aPC +gCC +qAF +hOc +aOp +aPE +hmM +bzc +bzc +avT +avT +ydp +ktw +ktw +ktw +ktw +ktw +ydp +avT +avT +avT +avT +avT +avT +avT +euS +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(71,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +vSJ +kZL +kZL +maR +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +qIU +tlu +wAW +xhb +uCi +uYa +xFQ +pZD +eEy +gzW +ueK +pZD +lIm +ycQ +rwW +tfm +ets +tmy +tmy +jDK +gZX +sUF +wzH +uUk +anm +iEa +anm +sxa +amD +anm +anm +cwW +jXh +tUF +tkr +wje +uGY +avX +avX +axj +wje +gIG +aAU +aBG +hTk +vHU +qTO +aHD +aPC +jOy +lqt +gPb +hFv +aPC +hmM +bzc +bzc +avT +ydp +ydp +ktw +kRI +fdJ +hGU +ktw +ydp +avT +avT +avT +avT +avT +avT +euS +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(72,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ehh +kZL +hap +ktw +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +xVn +byu +byu +byu +lzw +uYa +lMF +pZD +pZD +pZD +pZD +pZD +pZD +gZX +seZ +iTS +qfd +qfd +rHS +rqQ +mVh +kEf +amA +mVN +amA +dkB +xAi +aoX +aoX +ann +ivQ +aoX +aoX +tUF +gIG +uBi +atU +was +was +kRK +gsQ +eDr +aAS +bxk +srU +aFO +aFY +aHD +aPC +hxx +vKT +faR +aOq +aPD +aQT +omC +bzc +avT +ydp +ydp +ktw +vSJ +kZL +kZL +maR +ydp +avT +avT +avT +avT +avT +euS +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(73,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ktw +ktw +ktw +ktw +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +qip +tGK +beD +kkt +cAo +uYa +kWC +itU +sWT +sgB +nVP +xgB +pZD +tyH +vNu +gCS +bTw +bTw +tmy +pbP +gZX +tnX +dAs +uUl +itb +wXj +anm +vmO +hik +mAx +ndm +rQN +aoX +soN +ojv +oTu +oTu +oTu +rTj +oTu +oTu +nhe +vMB +uBG +aDm +hLZ +aFY +aHD +aPC +cKK +sub +vrg +qqb +uup +pqs +gUb +uWS +avT +ydp +ydp +ktw +ehh +kZL +hap +ktw +ydp +avT +avT +avT +avT +euS +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(74,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +mpj +gNb +uYa +uYa +mgC +fjS +uUr +mpj +uYa +xgB +pZD +jFY +vIA +rYD +rYD +rYD +rYD +gId +oTF +dTL +nnj +nnj +nYZ +fJs +jBr +mYT +amF +yds +jap +frn +oPP +tqp +kkn +iIN +iIN +iIN +atM +axl +iIN +uCE +sco +aIP +aDp +eZi +aFU +aHD +aPE +jmf +fLW +utp +itp +aPE +aQV +vcG +wgu +avT +avT +ydp +ktw +ktw +ktw +ktw +ktw +ydp +avT +avT +avT +euS +jAq +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(75,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +mpj +eSJ +uYa +vqQ +uYa +uYa +uYa +mpj +xgB +xgB +pZD +ueq +gEd +mYd +bLW +cDS +wJN +mQJ +oTF +fNO +rjO +gXE +nnj +nIR +xhD +xur +lqg +qVD +pyD +guR +aaH +rJw +tqa +wje +wWL +xSZ +atO +axk +ayy +xSZ +aAO +aIP +aDe +rJk +aFT +jOj +aPE +aKa +aPE +aPE +aPE +aPE +aQV +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +euS +jAq +xUL +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(76,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +mpj +lBe +mDp +klh +vUB +prl +dBL +mpj +ofm +xgB +pZD +gZX +rio +nYZ +nYZ +nYZ +nYZ +nYZ +nYZ +dcg +fLL +jNp +nnj +uUk +anm +aoX +vAy +yds +anK +gTb +mEI +xGj +eDr +fYQ +rQJ +rQJ +rBG +axn +myh +eed +myh +tXN +rQJ +rQJ +aFZ +aHE +wUr +aKs +aOr +aOr +aOr +aOr +aQX +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(77,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +pZD +pZD +pZD +pZD +pZD +pZD +pZD +pZD +pZD +pZD +pZD +mbm +eJu +nYZ +shM +nXs +nRX +jbE +nmR +sjW +cUC +pXl +nnj +uUk +anm +aoX +tcP +yds +inU +iWu +aoX +rJw +tkr +fYQ +rQJ +iOR +eTg +axo +dGV +dPn +qLt +aBR +fQU +myh +qLm +slJ +wUr +wUr +wUr +wUr +xUL +xUL +xUL +vcG +lzB +bmX +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(78,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +vBe +mbm +iJl +iJl +mbm +iJl +eJu +nYZ +hxr +uKI +vAp +ouB +eSQ +gNq +dCI +jIu +nYZ +uUk +anm +aoX +ali +yds +yds +aon +aoX +rJw +tkr +fYQ +rQJ +ewI +avY +gRh +xeI +rqW +rqW +aGD +tJi +myh +qLm +qTG +hta +aKu +aLM +bDe +xUL +xUL +xUL +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(79,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xUL +rTG +sIn +kxU +sdH +sIn +kxU +pyw +nYZ +sXl +eFU +jyA +goK +nYZ +nYZ +pZJ +nYZ +nnj +uUk +anm +aoX +mLD +yds +yds +gev +aoX +gsM +tkr +fYQ +rQJ +fwn +awb +rqW +ayC +rPU +fne +rqW +rqW +fOA +tWj +oyz +ebX +aLL +aLL +bDe +xUL +xUL +xUL +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(80,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bmX +avT +xUL +ace +mbm +mvQ +mvQ +mbm +mbm +mbm +nYZ +hxr +uKI +fBf +vqF +vax +lMx +keC +vEr +nnj +uUk +xAi +aoX +nVv +yds +yds +qWL +aoX +gsM +tkr +iPX +rQJ +fpS +wPD +rqW +pIf +pIf +pIf +rqW +aHK +myh +uJx +ikk +gnv +qsf +aLN +wUr +dOP +xUL +xUL +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(81,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +mbm +qIm +qIm +mbm +avT +avT +nYZ +dYa +iaM +tHr +loT +wlZ +hhI +vyJ +fgM +nnj +uUk +anm +aoX +jWx +nBI +anL +aoo +aoX +gsM +tkr +wje +rQJ +fvz +awb +rqW +ayC +azH +fne +rqW +aCr +myh +lHH +oYn +vdw +lHH +mIO +wUr +avT +avT +avT +vcG +wgu +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +xUL +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(82,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +bGt +avT +avT +avT +avT +avT +avT +nYZ +nYZ +nYZ +nYZ +nYZ +djL +nYZ +nYZ +ktd +nYZ +hxP +uWY +aoX +aoX +aoX +aoX +aoX +aoX +gsM +tkr +xOY +rQJ +uUi +gXD +xtP +ayA +sNK +xmo +rqW +mzB +rQJ +szG +aHG +aJe +aKw +aLP +wUr +avT +avT +avT +vcG +lzB +avT +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +bBh +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(83,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +xUL +xUL +xUL +xUL +tdK +tmO +hui +hBQ +gKt +xrU +yij +iWY +iTY +yij +gKt +rPD +srq +cXi +gKt +vqP +inw +xWD +rQJ +myh +myh +myh +rQJ +rQJ +rQJ +myh +myh +rQJ +wUr +wUr +wUr +wUr +wUr +wUr +avT +avT +avT +vcG +lzB +avT +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +bBh +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(84,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +eik +xUL +xUL +xUL +dYZ +jKV +fYx +aYf +xSN +wje +jrH +rke +vJG +quj +aDh +aDh +nDl +wbO +aDh +uCo +tkr +wje +sqg +nvj +kTj +xxi +ayD +cGz +sqg +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +vcG +lzB +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +bBh +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(85,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +tmO +fYx +oDm +tmO +rhX +rhX +eLm +qBG +rhX +rhX +ebM +wmH +ohr +xWq +aAL +tkr +pjg +sqg +inq +oaS +eqP +tcj +viF +ayG +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +aSl +bFk +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +sXy +jAq +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(86,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +tmO +tmO +tmO +tmO +bcR +oDm +tmO +ndM +umX +fbb +jRD +uHM +rhX +nrJ +iAR +rik +xWq +aAL +gxi +wEP +wJH +opC +wYe +iat +pEF +nez +sqg +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(87,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +cnI +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +xUL +xUL +xUL +xUL +tdK +tmO +fYx +oDm +tmO +hnO +por +jEb +tvF +nEt +rhX +anO +nVp +kds +xWq +aAV +nZU +hnc +asQ +odD +kRz +axr +ayE +nez +sqg +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(88,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bGt +avT +avT +avT +avT +avT +eik +xUL +xUL +xUL +dYZ +wlG +fYx +oDm +tmO +vFd +iop +cSC +xQF +vNF +rhX +vxX +evY +tGc +fQe +lZs +jFG +fhi +oeh +cya +lWi +axu +ayH +tQy +sqg +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +wgu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(89,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +tmO +fYx +oDm +tmO +mTw +lgJ +hlT +fXd +eTX +rhX +ujE +grz +arP +xWq +wje +nrd +wje +sqg +sqg +ayG +sqg +ayG +sqg +sqg +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(90,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +tmO +tmO +tmO +tmO +qJy +xUe +tmO +rhX +vTP +prD +rhX +rhX +rhX +xWq +xWq +xWq +xWq +tmO +wje +wje +tmO +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(91,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +tmO +fBk +oDm +wje +rhX +kHd +ljT +ahU +ubd +rhX +xUL +xUL +xUL +xUL +tmO +uxx +wje +tmO +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bTC +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bBH +bTC +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(92,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +bmX +avT +avT +avT +avT +avT +avT +tmO +lki +kMt +tmO +rhX +kHd +ljT +kHd +gVo +rhX +xUL +xUL +xUL +xUL +tmO +wje +iPX +tmO +tmO +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +sQb +byL +byL +byL +byL +byT +bTE +bTE +bTE +bTE +bHD +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(93,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vBe +xnm +xUL +rhX +lXR +hah +kHd +vGn +rhX +xUL +xUL +xUL +xUL +usE +buO +wje +cpC +tmO +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +hlx +cBv +cBv +cBv +byO +cBv +cBv +cBv +bGo +bHE +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(94,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xUL +xnm +xUL +eTu +kHd +ljT +kHd +gVo +rhX +xUL +xUL +xUL +eNu +arl +rJh +lhB +uUZ +tmO +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +fAj +anw +xUL +xUL +bBh +xUL +xUL +nCL +fAj +bHE +bJf +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(95,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +bGt +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xUL +xnm +xUL +eTu +kHd +apK +wOn +sIT +rhX +xUL +xUL +xUL +xUL +usE +usE +usE +tmO +tmO +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +wgu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +fAj +kKk +xUL +cqC +bBh +ipL +xUL +anw +fAj +bHE +bJf +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(96,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vBe +xnm +xUL +rhX +rhX +rhX +rhX +rhX +rhX +xUL +xUL +xUL +xUL +wdv +avT +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +fAj +anw +xUL +avT +svY +avT +xUL +anw +bGq +bHE +bJf +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(97,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xUL +xnm +avT +hmM +hmM +ydp +ydp +ydp +wdv +ydp +ydp +ydp +ydp +wdv +avT +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +buJ +xGN +fIS +bVT +fQi +bBh +avT +xUL +cJc +fAj +bHE +bJf +bES +bES +bES +bES +bES +bES +bES +bES +bTC +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(98,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xUL +xnm +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +buI +phs +fAj +kii +tpl +jix +bBh +xUL +tpl +blI +fAj +bMj +veJ +rhg +sSS +rhg +rhg +rhg +flh +dKw +duI +bVM +bTC +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(99,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ace +xUL +vBe +xUL +xUL +xUL +xUL +vBe +xUL +xUL +xUL +vBe +xUL +xnm +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +kfv +kfv +kfv +kfv +kfv +byP +nPd +byP +kfv +kfv +kfv +kfv +kfv +pEK +nxv +nxv +nxv +nxv +nxv +nxv +nCA +mse +bVM +bTC +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(100,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +pQd +kLh +kQr +lZn +lZn +lZn +lZn +lZn +lZn +lZn +lZn +lZn +lZn +akg +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +kfv +kfv +tZe +rsW +ybQ +cXr +oOe +bBk +lFK +jro +yeF +kfv +kfv +kfv +nxv +nxv +nxv +nxv +nxv +nxv +nxv +nCA +mse +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(101,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +bmX +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +kfv +kfv +kfv +brq +kfv +arV +bGu +vEi +bGu +bGu +bGu +bGu +rsW +pMp +kfv +xhV +xoY +rMS +dyW +rxM +kin +nxv +nxv +rOd +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(102,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +qZO +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +avT +vcG +wgu +xUL +xUL +xUL +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +kfv +kfv +kfv +kfv +kfv +iBo +bGu +bGu +mRz +bGu +bGu +bGu +bGu +kfv +pyY +kfv +eoT +cCd +cCd +cCd +cCd +abk +nxv +nxv +kYF +bVM +avT +bmX +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(103,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bmX +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +xUL +xUL +xUL +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +kfv +kfv +oBG +bGu +kfv +bGu +iGd +iVY +mrM +bDv +fOC +bEX +bFb +kfv +kfv +kfv +fLB +oZC +eVW +cCd +bYU +rtq +nxv +nxv +kYF +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(104,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +kfv +kfv +ilb +ifQ +rlG +wSb +wav +vpR +vIf +kfv +aNe +yfA +aOP +nxv +nxv +pvV +aLp +lZj +fdu +cCd +fnc +sTz +nxv +nxv +uwn +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(105,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ktw +ktw +ktw +ktw +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +kfv +kfv +akQ +bGu +kfv +aNS +mNS +vpR +qLp +kfv +bGu +bEZ +bGv +nxv +kvG +cCd +cCd +kEd +cCd +cCd +cCd +upH +nxv +nxv +kYF +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(106,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +kRI +fdJ +hGU +ktw +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bmX +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +wql +wql +wql +wql +kfv +bxG +byR +vpR +bBl +kfv +wql +wql +wql +nxv +siX +cCd +cCd +jGp +gAY +cCd +xGE +quH +nxv +nxv +kYF +bVM +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(107,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +vSJ +kZL +kZL +maR +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +wql +wql +vEG +uUJ +wql +bwb +dFt +tLA +dnn +teh +wDk +pmK +dbB +nxv +eZn +xBv +nQM +lZi +nQM +cCd +pDF +pDF +nxv +nxv +kYF +bVM +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(108,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ehh +kZL +hap +ktw +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +wql +wql +wql +wql +vOU +loV +wql +iRQ +dVG +eiW +hRH +eSK +bAM +eJh +jTP +nxv +vYL +bJn +nQM +foy +nQM +cCd +cCd +abk +nxv +nxv +kYF +bVM +avT +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(109,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +ktw +ktw +ktw +ktw +ktw +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +wgu +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bmX +avT +wql +wql +wql +wql +wql +mDO +fcl +wql +wql +gop +dxO +byU +hgg +bAL +sFh +bGy +bTM +bJl +bHh +ryE +aaO +cCd +cCd +wIx +tAY +nxv +nxv +rOd +bVM +avT +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(110,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +wql +wql +hAf +vOU +dml +yhz +ouQ +aWK +xow +lul +bAg +iPC +pvl +wDk +hUs +lTh +nxv +mVb +dOR +tLV +gnm +jTo +bJu +vEA +nxv +nxv +wFB +bUD +bVM +avT +avT +bmX +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(111,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +nbC +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +wql +wql +uUJ +vOU +bcc +vOU +pzk +oKD +wql +esi +iHg +wTf +wTf +wTf +wTf +wTf +wTf +udB +wTf +aKP +nRn +kkJ +nxv +nxv +nxv +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(112,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +qZO +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +wql +wql +wql +wql +wql +bvW +vSg +wWd +knx +bwa +bAg +bBq +bFq +bAO +bFd +mKk +bFj +bJp +bHk +bHR +xal +jNZ +bJz +xUL +cav +xUL +avT +avT +cer +bZx +bZx +bZx +bZx +bZx +bZx +cer +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(113,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +wql +wql +khf +vOU +qEz +vOU +pzk +xRL +knx +xCC +ndg +bBp +nYN +bAN +bQg +bQg +pMU +bGN +bHj +bNN +yiz +iGB +fKC +xUL +xUL +xUL +avT +avT +cer +bWQ +xRy +bWQ +cbt +qVi +qVi +cer +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(114,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +vcG +lzB +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +hsC +avT +wql +wql +dlZ +tVp +dml +rTA +oNz +wSy +bxK +fcu +bAh +bBs +sfn +cgp +tLI +cdk +bFc +bGO +bHl +bHS +bLI +fHh +fKC +xUL +xUL +xUL +epU +avT +cer +jDr +jDr +jDr +ifl +pvo +btI +cer +avT +avT +avT +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(115,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +wql +wql +wql +wql +wql +eih +pQN +tBW +oEs +kTN +wdt +bBr +bCv +eKe +bCv +bCv +hSl +bJq +bKw +kMK +eEB +kNQ +fKC +xUL +xUL +xUL +rjx +ajg +cer +rvl +jDr +sem +tuv +jDr +tpg +cer +avT +avT +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(116,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +wyg +wyg +wyg +wyg +jFS +jFS +jFS +jFS +jFS +jFS +wyg +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +wgu +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +avT +wql +wql +wql +wql +wql +sWN +wql +wql +txk +xEt +nXy +pNU +pNU +pNU +pNU +wPT +dPL +qNB +hpC +yhj +bOT +fKC +xUL +bSC +xUL +rVN +wuS +diH +bWO +qOL +bUm +eMJ +jDr +kAv +cer +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(117,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +jER +xGo +uCr +wyg +igO +nea +abe +wGD +iam +pJT +wyg +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +xUL +xUL +xUL +avT +avT +xUL +xUL +xUL +avT +avT +vcG +lzB +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +avT +bwt +fcj +sZq +uXF +vgb +eFG +bwt +tjA +cBy +xBi +bBt +bFf +eUB +bFf +bGB +oJF +piv +nre +bWR +xdr +uKb +fKC +rVN +uHl +rVN +rVN +ioe +diH +bWN +jDr +uEg +kfJ +jDr +pPw +cer +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(118,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +xLF +qWH +uCr +wyg +xls +naj +eFB +naj +nPs +nHe +wyg +ydp +ydp +avT +avT +avT +avT +avT +avT +tqg +nGx +nGx +nGx +nGx +nGx +nGx +nGx +nGx +nGx +nGx +nGx +xtV +lzB +avT +avT +avT +avT +avT +bok +unA +bJQ +bJQ +unA +avT +avT +avT +avT +bwt +sfm +buZ +lpb +oym +brE +bwt +bFl +cBy +nhv +gnf +paF +sPq +fTn +bGE +mwW +uvO +fKC +fKC +fKC +fKC +fKC +bQk +bUH +bUH +bUH +bUH +kEW +bVQ +cew +bYL +rqn +toH +cdt +cer +clR +clR +clR +clR +ccl +cio +cio +cjY +clR +clR +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(119,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +omO +qWH +uCr +wyg +qgC +naj +gAG +naj +wGD +nVI +wyg +ydp +ydp +avT +avT +avT +avT +avT +avT +tFr +dvc +sLv +sLv +sLv +sLv +sLv +ybT +sLv +sLv +sLv +sLv +sLv +asr +avT +avT +avT +krq +avT +bok +sLq +wcB +wcB +unA +avT +avT +avT +avT +bwt +sPF +bsk +dWF +rgh +uoc +bwt +tpN +eRu +sOi +pLP +tKa +cBD +bCt +bGD +qbr +bJs +cBD +rIB +tQI +rIB +cBD +bQj +gCG +sdN +xXX +ubL +diH +uPJ +xTI +aEO +hch +uut +bUm +cer +cfh +aow +icb +clR +cCT +mcs +wck +phS +jDG +clR +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(120,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +xZL +qZO +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +vaR +gHe +hcz +cyu +jAv +hpN +veF +naj +naj +nde +wyg +ydp +avT +avT +ktw +ktw +ktw +ktw +ktw +vcG +lzB +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bmX +avT +avT +bok +xjZ +bok +cwo +wcB +wcB +unA +avT +avT +avT +avT +bwt +ewK +drK +msA +fPN +btu +bwt +mVi +lWR +bfT +trO +iad +cBD +bDr +bDr +alG +fmt +cBD +cbz +jae +bNS +pST +bQm +bZF +bZF +bZF +bZF +diH +xOq +diH +mkY +diH +hUL +vBV +cer +hpV +cqa +kyo +tkG +qiF +qiF +igR +cjX +ruD +clR +avT +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(121,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +rjQ +rEi +rEi +wyg +twU +wAM +xsZ +pkJ +naj +tCj +wyg +ydp +rfj +wMr +wFt +wxf +jxS +mGT +tey +fhM +lzB +avT +avT +avT +avT +avT +avT +bHt +nZE +nZE +nZE +nZE +aUd +avT +avT +avT +bok +acj +bok +uxF +wcB +wcB +unA +avT +avT +avT +avT +bwt +aNw +hRe +buZ +dtt +idQ +bwt +bFn +hWb +dqE +puY +cBy +cBD +cAL +bFs +eOn +bJt +bOX +mOx +bWM +bNR +cBD +giT +bZF +xkT +bVR +rYN +qOb +bSd +bXO +eoL +bZF +vJt +caA +cer +rTz +bZt +eGF +ydo +snb +owV +iBm +cep +ces +clR +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(122,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +cYK +cYK +bDo +wyg +fYl +sDW +oUX +mJd +mJd +awo +eDt +wMr +phs +ydp +ktw +xYE +gky +vmM +jOo +azc +lzB +avT +avT +avT +avT +avT +avT +qAi +qsD +qsD +qsD +qsD +mSN +qsD +bok +bok +bok +wcB +bok +sLq +wcB +wcB +unA +avT +avT +bmX +avT +bwt +cTD +mhH +iQv +cTD +klQ +bwt +sGL +nJI +qQp +rGP +xaW +cBD +iXH +wTx +qeo +fLv +smP +smP +smP +smP +smP +bQn +jBk +gYw +mOG +bUJ +bVS +fzQ +bZF +cBI +bZF +wFv +whB +cer +xnb +uat +cZr +clR +pCY +jOJ +pOg +cyM +ckT +clR +iIS +iIS +iIS +iIS +cjN +vKO +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(123,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +ydp +avT +avT +avT +avT +avT +avT +ydp +wyg +wyg +wyg +wyg +wyg +tMk +naj +naj +naj +naj +jvy +wyg +ydp +ydp +ydp +ktw +bKs +bxU +iSg +wLG +ker +lzB +avT +avT +avT +avT +avT +avT +qAi +qsD +wZV +ihX +pDS +lwH +ncg +aXh +jHC +bok +ivM +bok +unA +uFq +uFq +unA +unA +unA +bmA +bmA +grV +xTL +bff +bsk +lHn +ciO +cTD +bCz +vSX +lGp +byW +oho +cBD +jVx +rHa +wcn +unX +smP +tCa +hVO +bNT +smP +giT +bZF +bSF +vQf +kJE +bwh +qHi +ndn +vcY +bZF +qGt +bTH +cer +dMj +dMj +dMj +dMj +dMj +vem +vwW +fiw +auR +iIS +cfB +cjS +fjc +lYM +vAI +ueR +vKO +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(124,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +xZL +xBk +avT +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +lzi +ahn +naj +naj +naj +naj +wwO +wyg +ydp +ydp +ydp +ktw +dDK +urV +etB +wnX +aAh +utj +vsM +vsM +vsM +vsM +vsM +vsM +rgH +xuN +sxl +wha +wsc +iGb +aVv +aXh +rqE +ifT +rqE +fPp +rqE +wbE +wbE +fPp +rqE +rqE +wcS +cUS +cTD +lHn +bff +bsn +lHn +lHn +cTD +bCz +qfT +qBb +bBA +vIl +cBD +ndL +dpZ +dpZ +bJw +smP +wtt +bMN +bNV +tTW +ius +bZF +saP +pry +qkT +wDt +gTH +bZF +bZF +bZF +diH +qGM +cer +dMj +cey +kLQ +eTv +dMj +dMj +sFp +lTT +clR +iIS +ofP +cDm +imn +brJ +hgM +yfQ +cDL +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(125,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +xZL +xBk +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +wyg +oZL +hjv +fVm +wEm +tuu +nIM +wyg +ydp +ydp +ydp +ktw +xYE +aVC +cgH +lXk +mDB +aDL +ujF +ujF +ujF +ujF +ujF +ujF +hqD +lob +mDm +vVz +hQL +wDJ +aVv +aXh +uBa +aZY +uBa +uBa +uBa +wbE +wbE +uBa +uBa +uBa +uBa +dGB +cTD +buZ +mBK +bsm +buX +dmc +vpz +iGJ +gmf +qAI +bBy +ewY +cBD +bFl +hgp +cBy +cBy +bMP +bVW +yeA +hTK +smP +giT +bZF +gBF +osa +kJE +gBF +nzn +bZF +bZF +bZF +lhQ +lhQ +lhQ +dMj +cex +dEX +orN +bQt +bLQ +fsJ +duJ +pqL +iIS +mVr +gCJ +cDm +cDm +job +keu +cDL +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(126,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bHt +nZE +nZE +nZE +aez +xBk +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +wyg +wyg +wyg +wyg +wyg +las +wQG +wGD +wGD +naj +nHe +wyg +ydp +ydp +ydp +ktw +kxI +dPM +xNs +wwx +nDd +aDQ +avT +avT +avT +avT +avT +avT +avT +aVv +iGV +gFq +cEb +uBh +aVv +aXh +uBa +ohm +got +got +uBa +lRx +wbE +got +got +xui +uBa +dGB +cTD +buZ +pmE +buZ +old +hXF +cTD +oGU +gQw +mTl +bBA +oGU +cBD +sSP +bHX +xzL +bJy +smP +aMF +lqW +nfB +smP +giT +bZF +wDt +wZl +iTP +jcU +pnz +bZF +ucm +lhQ +lhQ +lhQ +lhQ +dMj +riE +hGy +ucZ +fBc +fBc +tkH +ckb +cLX +iIS +oxs +cDm +cDm +jQB +bSu +nGf +cDL +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(127,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +mps +xAv +ruo +ruo +acQ +aUb +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +cci +fuX +mYE +ipi +eXd +eXd +jZg +naj +qmD +kcX +nVI +wyg +ydp +ydp +ydp +ktw +ktw +rbg +cgH +ktw +xZL +lzB +avT +avT +avT +avT +avT +avT +avT +qsD +aVt +doD +bOc +iET +aVv +aXh +uIs +gGQ +iog +aSN +lQs +xYD +wbE +xZg +xZg +xZg +uBa +eeh +grV +cTD +cTD +bKo +cTD +cTD +grV +lbp +knn +eOK +bBz +lbp +cBD +cBD +cBD +cBD +lYS +smP +bLO +gfN +pSm +smP +jbg +bZF +gAu +gAu +pUP +gAu +tod +bZF +tNf +sRh +lhQ +vNY +lhQ +dMj +dMj +dMj +dMj +dMj +iIS +tAX +ckb +ckW +clV +cmU +cDm +quE +cDm +cDm +srm +cDL +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(128,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +axL +aaM +nZE +nZE +abU +vBe +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +ttK +rsD +cWO +vEo +naj +omh +naj +qDg +ect +ect +aUg +wyg +ydp +ydp +ydp +ktw +gky +ptY +cgH +ktw +xZL +lzB +avT +avT +avT +avT +avT +avT +nTz +qsD +riC +rEx +aVv +iQD +riC +qXN +srJ +aZY +uBa +uBa +uBa +thy +wbE +uBa +uBa +uBa +uBa +qHO +lbp +vPQ +hhz +vPQ +vPQ +vPQ +bwu +lhQ +yae +kPj +bBB +lhQ +lhQ +vPQ +cGQ +vPQ +vPQ +bNn +vPQ +qQt +vPQ +bJF +bVX +cGQ +hhz +vPQ +vPQ +vPQ +haj +pjn +tNf +sAw +vPQ +mdG +vPQ +iwd +ykt +jIj +jIj +cgY +iIS +bVu +ckb +mXC +clV +dij +vxi +nmN +cDm +cDm +qIx +cDL +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(129,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +iHM +tOz +iHM +gCO +iHM +axN +ruo +ruo +aAh +vzS +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +rYQ +hNi +qEs +wyg +wyg +wyg +jFS +jFS +jFS +jFS +jFS +wyg +ydp +ydp +ydp +ktw +cPI +gmn +xSd +lXk +xZL +paY +mxF +irt +irt +mxF +irt +irt +mxF +btZ +uyK +pqX +enP +lCQ +lEy +ggl +wFU +gSh +beo +beo +beo +qyK +tJA +tJA +tJA +tJA +tJA +tJA +rmQ +tmU +xdc +iNV +bAk +hxf +hxf +hxf +hxf +bAj +ezY +tmU +tmU +tmU +tmU +tmU +tmU +tmU +tmU +uZd +tmU +bPa +hvr +tmU +msm +tmU +tmU +tmU +xdc +tmU +xXV +xdc +tmU +ilF +tmU +tmU +tmU +hvr +tmU +tmU +iau +hKc +olx +grs +guE +jwj +fNC +mqm +dbb +nFG +cqp +cDN +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(130,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +iHM +kRk +iHM +kRk +iHM +avT +avT +avT +xZL +xBk +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +wyg +wyg +wyg +wyg +wyg +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ktw +cPI +cqG +spa +dIj +pIH +bpT +irt +irt +irt +irt +irt +irt +irt +gZS +uyK +aRt +iyP +qGn +lud +ngB +joq +xzn +wdk +iOW +wdk +beq +ngB +ngB +ngB +ngB +ngB +ngB +bnE +fqE +cBF +mfC +udI +fqE +fqE +fqE +fqE +nRt +xmB +bmS +bmS +bmS +bmS +bmS +bmS +bmS +bmS +bmS +bmS +tXn +tys +bmS +iVB +bmS +bmS +bmS +bmS +bmS +bmS +bmS +bmS +bPd +bmS +bmS +bmS +jhe +bmS +bmS +civ +fJW +ina +ckY +mMP +frh +rLk +nEJ +cDm +job +aZz +jQj +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(131,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +iHM +iHM +iHM +iHM +iHM +vow +iHM +vow +iHM +iHM +iHM +iHM +xZL +xBk +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ktw +cPI +kxP +vAs +ktw +xZL +lzB +avT +avT +avT +avT +xUL +xUL +nTz +sLj +rmN +wxT +bUP +fLK +rmN +oLT +ljL +uBa +uBa +uBa +uBa +ljL +uBa +daX +uBa +uBa +uBa +qHO +lbp +ceA +jAb +coa +fXU +ffm +jBl +fmw +tWx +pBU +reS +lhQ +lhQ +ceA +vun +ceA +ceA +ceA +seR +ceA +ceA +bmP +bQs +vun +vZv +ceA +ceA +ceA +ceA +vun +lhQ +lhQ +ceA +bPc +ceA +bUL +rmB +tNf +bUL +cgZ +iIS +nCU +oeS +ckX +clV +cmV +vxi +pbV +cDm +nFw +vaO +jQj +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(132,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +iHM +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +iHM +xZL +xBk +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +ktw +cPI +hPe +vAs +ktw +xZL +lzB +avT +avT +avT +avT +xUL +xUL +hmM +sLj +aPZ +kAO +phf +uRi +wxT +pqe +hgO +baa +bcq +bcq +bcq +mai +pcd +piX +hJw +kop +uBa +fuy +bwx +bwx +bwx +bwx +brX +bwx +bwx +bwx +lhQ +bxa +byZ +lhQ +bEa +bEa +bEa +bEa +bEa +bEa +bEa +bEa +bEa +mXj +hQY +hQY +afp +bVZ +eGL +bVZ +bVZ +hQY +hQY +hQY +cAe +cdE +cAe +chb +chb +yiZ +chb +vqS +iIS +hYD +oeS +cqo +clV +oBF +cDm +dHe +cDm +cDm +srm +jQj +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(133,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +iHM +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +iHM +xZL +xBk +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +ktw +spa +vir +fkr +ktw +oME +lzB +avT +avT +avT +avT +xUL +xUL +hmM +wxT +aPY +kAO +jFZ +kiB +wxT +pqe +uBa +dCs +xZg +rkP +xZg +aZZ +vDb +wbE +vkD +pXp +uBa +rcH +bwx +cTG +bpD +bqO +bLX +btf +bJG +bvl +ceA +bwZ +byY +fET +bEa +qrv +tDO +fjL +lNm +oVN +jZy +gUA +bEa +udT +hQY +vwf +gfY +iPO +wvg +bsX +kSk +hQY +gCs +hQY +cAe +cdE +cAe +chb +vam +gsr +rnA +hsP +iIS +kxf +oeS +iIK +iIS +iAt +cDm +cDm +cDm +odK +hkw +maj +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(134,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +iHM +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +iHM +xZL +xBk +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ktw +ktw +hSD +ktw +ktw +xZL +lzB +avT +avT +avT +avT +xUL +xUL +hmM +wxT +moD +aQd +jUn +kiB +wxT +pqe +uBa +uBa +uBa +daX +uBa +uBa +wbE +fWE +wbE +wbE +uBa +rcH +bwx +iSo +bpM +ouX +bFD +hpw +iaY +pVz +hoX +bxc +bzb +bCD +bBd +cCp +wGq +luo +qzX +vuk +rLn +oZf +bEa +udT +hQY +mQD +qtK +nzM +uAh +usM +epc +hQY +hQY +hQY +cAe +cdE +bwr +chb +eZA +uLd +gSY +uAs +obL +bMs +oeS +rAj +iIS +cph +jQB +cDm +cDm +job +lng +jQj +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(135,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +iHM +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +iHM +xZL +xBk +vBe +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +atX +nGx +nGx +nGx +nGx +nGx +nGx +dwF +nGx +nGx +uYf +ujF +ujF +aSE +lzB +avT +avT +avT +avT +xUL +xUL +hmM +wxT +ufA +qHc +vcN +pnr +wxT +pqe +uBa +unA +unA +unA +unA +uBa +wbE +bPW +wbE +wbE +uBa +rcH +bwx +gFb +hcV +uKM +voD +wlo +jcR +bvl +ceA +bxb +fkN +bCD +bBd +aJP +qhu +bIc +tHC +bMZ +bcp +udE +bEa +bPf +bQx +bRH +bRH +bTU +ixZ +usM +wvg +hQY +dFC +hQY +bdm +bXU +cjA +vBo +gMD +pIz +vfd +chc +iIS +oOu +oeS +mbM +iIS +kmA +efT +tuP +rWN +czN +dTS +jQj +avT +avT +avT +bmX +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(136,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +cav +xUL +iHM +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +kHD +iHM +xZL +xBk +xUL +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +dvc +sLv +sLv +sLv +sLv +sLv +sLv +sLv +sLv +sLv +sLv +sLv +sLv +asr +avT +avT +avT +avT +xUL +xUL +hmM +sLj +lhR +fNR +iZu +ttH +jTY +sNg +uBa +uBa +uBa +uBa +uBa +uBa +wbE +wbE +wbE +wbE +uBa +faZ +bBL +bBL +bBL +bBL +bEe +bBL +bBL +bBL +ceA +mIz +cSG +bzS +bBd +bCJ +gZG +dRF +lep +bEa +muk +bcp +bEa +udT +hQY +rxu +wvg +bTV +wvg +xyA +wvg +bXV +vzj +hQY +cAe +cdE +cAe +chb +pXW +hZU +phI +vSb +iIS +vZq +qMB +clc +iIS +daj +kwY +jCw +hCI +szZ +uHy +dAM +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(137,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +iHM +iHM +iHM +iHM +iHM +nlF +iHM +nlF +iHM +iHM +iHM +iHM +xZL +xBk +avT +wdv +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bok +bok +bok +sLj +sLj +sLj +rmN +rmN +rmN +ffJ +uBa +xui +got +got +got +uBa +uxq +wbE +vkD +pXp +uBa +fhz +bBL +efk +bDR +edM +bsq +bDR +rUK +vOo +eHn +oxh +osc +bCD +bBd +eng +bFA +qyt +bEa +bEa +bEa +bEa +bEa +iaD +hQY +doN +ttG +bPh +pNQ +tHH +dWU +hQY +eRW +hQY +kYs +cdE +cAe +chb +qbv +ayP +hZU +eIc +iIS +iIS +iIS +iIS +iIS +iIS +iIS +iIS +iIS +vWV +dAM +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(138,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +avT +avT +avT +avT +iHM +lJN +vQk +gUc +iHM +avT +avT +avT +xZL +xBk +avT +wdv +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +dTE +poU +kJO +oIJ +tMn +dTE +xGh +rqE +tPQ +bhe +uBa +xZg +xZg +xZg +xZg +uBa +opY +sma +dtQ +oeV +uBa +rqE +bBL +cvH +bDR +gfF +uWn +gfF +emh +bxN +bze +bAp +dvw +bCG +bBd +bFw +aaw +oHS +bEa +tTK +uuY +oKN +qJV +udT +vOV +vOV +vOV +vOV +vOV +cCH +cCH +cCH +hQY +hQY +cAe +cdE +cAe +cdD +eyS +vfd +dVJ +eyS +cdD +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(139,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +pgp +xUL +xUL +xUL +pgp +avT +avT +avT +iHM +kRk +kRk +kRk +iHM +avT +avT +avT +xZL +xBk +avT +wdv +xUL +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +avT +ydp +avT +avT +avT +avT +avT +ydp +avT +avT +avT +eBm +aMu +kBK +ehL +kBK +ksq +fuZ +fuZ +fuZ +sHv +uBa +uBa +uBa +uBa +uBa +uBa +uBa +uBa +uBa +uBa +uBa +qvG +bBL +bBL +bBL +bqX +qMN +gfF +fga +bBL +jcT +bAr +teC +jcT +bEa +bEa +jex +pfB +bEa +rnO +ljh +exs +qJV +udT +vOV +bRL +nGd +bWd +nHQ +gML +hjF +vOV +eLf +lhi +rqJ +ttl +cAe +cdD +uQR +bDB +edH +mAK +cdD +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(140,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +pgp +xUL +bSC +xUL +pgp +avT +avT +avT +iHM +vow +iHM +vow +iHM +avT +avT +avT +xZL +xBk +iSB +wdv +xUL +xUL +wdv +ydp +ydp +xUL +xUL +wdv +wdv +ydp +avT +avT +avT +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +avT +avT +avT +vQW +aMx +aQe +sBy +tif +vQW +rqE +eAJ +rqE +rqE +rqE +eAJ +rqE +oZe +rqE +eAJ +rqE +rqE +rqE +bjU +rqE +tHU +bBL +guv +bpO +bDR +gfF +bDR +jOl +bBL +tiG +daP +kis +bzU +bDW +bEl +bDE +bFK +bJC +prL +fiN +hmX +qJV +udT +vOV +msg +msg +nHQ +nHQ +gML +hjF +vOV +cAe +cng +uSH +cAe +cAe +cdD +ebq +fZn +hTy +oQy +cdD +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(141,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +iHM +iHM +pgp +raM +iHM +pgp +iHM +iHM +iHM +iHM +rRk +xfs +qHL +iHM +iHM +avT +avT +xZL +xBk +avT +xUL +xUL +xUL +xUL +avT +wdv +xUL +xUL +wdv +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +eyP +uTu +uTu +iaO +dnm +hHC +dnm +unA +unA +unA +unA +unA +dnm +unA +dnm +unA +unA +waC +unA +bok +rqE +rqE +bok +bsx +bsx +bsx +bsx +bLT +bLT +bLT +xhH +rle +cSG +bCQ +bDW +bIn +bQP +wOK +bJC +gzZ +gSu +ipY +qJV +bPk +sYm +dgI +xsE +nCc +bXW +bXW +bXW +vKc +cAe +cng +uSH +cAe +czY +chb +chb +chb +chb +chb +chb +avT +avT +avT +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(142,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +xUL +aNL +mtP +dvs +mtP +mtP +dAi +mtP +mtP +mtP +mtP +mtP +lLv +mtP +oBD +iHM +lJC +lJC +xZL +xBk +avT +xUL +xUL +xUL +xUL +avT +wdv +xUL +xUL +wdv +avT +avT +avT +avT +avT +avT +avT +avT +avT +tFr +lzB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +unA +wcB +unA +wcB +unA +avT +avT +avT +unA +wcB +unA +wcB +unA +rqE +rqE +rqE +bok +rqE +faZ +bok +vAs +vAs +vAs +vAs +bLT +fnu +bxR +mPM +ohK +tlc +bzW +quh +bCT +bGR +bIj +ykk +dZg +uNd +lJA +mhz +bPm +bQC +gsK +wuB +pyI +bXW +eqZ +wpN +vOV +cAe +cng +uSH +cAe +bPn +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(143,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +xUL +xUL +xUL +xUL +aNL +fTM +dvs +mtP +naE +mtP +mtP +nOY +mtP +naE +duB +tsK +tsK +tsK +iuC +tsK +pXb +aSE +xBk +xUL +xUL +xUL +vBe +xUL +xUL +xUL +xUL +vBe +xUL +xUL +xUL +xUL +xUL +vBe +xUL +xUL +xUL +xUL +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +krq +avT +avT +avT +avT +avT +avT +unA +wcB +unA +wcB +unA +avT +avT +avT +unA +wcB +unA +wcB +unA +jPI +wrh +jPI +bok +rqE +rqE +bok +vAs +vAs +vAs +vAs +bLT +xou +jkL +fcJ +cqd +qlW +bzV +cAa +anA +wbT +rTs +hTL +uRg +jab +jFy +qJV +fuG +vOV +dtc +vOV +vOV +vOV +vOV +vOV +vOV +czY +scu +uSH +cAe +bPn +bPn +bPn +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(144,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +ydp +ydp +avT +avT +iHM +iHM +pgp +pgp +pgp +fPM +pgp +pgp +pgp +pgp +vhb +mtP +vDI +ugk +hAx +ugk +nrY +vsM +aUb +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +vcG +lzB +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +nTz +xiw +xUL +xUL +xUL +xUL +xUL +pZl +unA +qqZ +unA +qqZ +unA +rJO +xUL +pZl +unA +qqZ +unA +qqZ +unA +bok +bok +bok +bok +rqE +rqE +unA +vAs +vAs +vAs +vAs +dUM +cQa +jLp +bDT +bAt +mmO +bCM +bDW +mOv +jOB +lYy +bJC +ihE +fJO +eex +nRu +fiI +nRu +aNT +nRu +pcl +bWe +uZf +rUd +rUd +qJV +xwA +caJ +cAe +oBj +cAe +opT +pbs +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(145,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +ydp +ydp +ydp +avT +bmX +avT +pgp +pCj +dZV +gLk +pgp +qFH +nBd +wfS +iJs +mtP +sgL +qxk +pgp +kmH +pgp +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +nEs +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +unA +rqE +rqE +pce +vAs +vAs +vAs +krT +pze +bEi +bEi +lbp +bAs +nmY +bCL +bDW +gpp +wbT +nHi +bJC +rDA +fjU +dvO +bJC +fuG +dHw +rpf +hPh +jwN +bWe +uZf +rUd +rUd +qJV +cng +cdE +cAe +bPn +bPn +bPn +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(146,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +ydp +ydp +ydp +ydp +avT +avT +pgp +hGM +gLk +gLk +pgp +vVZ +mWy +pgp +iJs +mtP +inA +qMn +pgp +wdv +wdv +vBe +xUL +xUL +xUL +xUL +xUL +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +unA +rqE +oLe +unA +vAs +vAs +vAs +vAs +bLT +bCO +bFT +bCO +gRE +thV +bCO +bEa +kxj +aaw +rqx +qJV +bKL +fJO +jKT +nRu +fiI +nRu +wfN +nRu +hQs +bWe +uZf +rUd +rUd +qJV +hNt +cdE +mLB +bPn +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(147,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +avT +avT +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +ydp +ydp +ydp +ydp +ydp +avT +pgp +vlz +gLk +fBs +pgp +pgp +pgp +pgp +vhb +hNT +mLK +raA +raA +raA +raA +raA +uPn +iOe +iOe +ycl +ycl +iOe +iOe +dSQ +avT +ydp +ydp +avT +avT +avT +ydp +ydp +avT +avT +avT +avT +vcG +lzB +avT +avT +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bok +bok +bok +bok +vAs +vAs +vAs +vAs +bLT +nmc +bEi +bzi +tcU +jWy +aGl +bEa +pHl +aaw +gKB +qJV +fjU +fjU +fjU +qJV +fuG +qJV +cNI +qJV +qJV +qJV +qJV +qJV +qJV +qJV +cAe +cdE +cAe +bPn +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(148,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +xUL +ydp +ydp +ydp +ydp +avT +avT +pgp +pgp +pgp +gLk +pgp +qFH +tYo +dJb +iJs +veC +unt +raA +lfV +eAR +eAR +raA +hzh +wDI +wrN +jJd +jJd +jJd +jJd +dSQ +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +oql +bqW +cTO +cTO +cTO +bLT +bLT +bLT +bwG +mEE +eeM +uha +uuu +vzn +tRe +tRe +vnl +cBt +tRe +gPE +syy +gPE +qJV +goM +gxF +ijK +bSS +nXn +nXn +bWf +avT +avT +bPn +cAe +cdE +cAe +bPn +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(149,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +avT +yhx +yhx +avT +avT +avT +avT +avT +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +avT +avT +avT +ydp +avT +ydp +pgp +ugr +pBh +gLk +pgp +vVZ +mWy +pgp +qIP +iZc +pfZ +raA +qxw +mZk +hsl +cOn +klc +ocY +ijz +cUV +omQ +jJd +njd +dSQ +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bmX +avT +tFr +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +lAL +bqW +rlA +oql +twG +bCO +qSJ +suL +hez +jkL +jes +qfX +cZN +gKR +tRe +iYh +bGT +uWo +tRe +tRe +tRe +tRe +tRe +tRe +bWf +bVa +kXG +sqx +owj +bWf +avT +avT +bPn +cAe +cdE +cAe +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(150,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +ydp +ydp +avT +avT +avT +ydp +pgp +pgp +pgp +eEa +pgp +pgp +pgp +pgp +vKo +vEe +jXL +tOE +uWW +pyW +dwS +cOn +klc +exi +yfp +wAQ +vfp +vfp +vfp +dSQ +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +oql +bqW +bqW +oql +hhb +bCO +fcz +bEi +bIm +bEi +xRH +tKD +bBN +ppI +tRe +tRI +bGV +tDY +oXn +cSg +tRe +cbQ +rgQ +cbQ +bWf +bVa +bSS +uuU +uuU +bWf +avT +avT +bPn +cAe +cdE +cAe +bPn +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(151,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +lbu +aQK +wuC +avT +lbu +aQK +wuC +avT +lbu +aQK +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +ydp +ydp +ydp +avT +avT +ydp +pgp +fCQ +mPR +gLk +pgp +qFH +vqY +ukI +vuh +jjB +cNm +qeH +skZ +skZ +skZ +skZ +mSt +geO +cQv +nGa +fpW +oyf +dzS +dSQ +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +bqW +bqW +bqW +njr +kkB +bCO +bzq +bzq +bzq +xpl +phU +qnr +cqt +hfk +tRe +fad +qKk +tAv +fTg +teL +tRe +xtq +hpa +cFO +bWf +bVa +bSS +bWf +bWf +bWf +avT +avT +czY +jCF +cdE +cAe +bPn +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(152,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +qrR +qrR +wuf +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +ydp +ydp +iOG +kyV +jWl +iOG +vrx +vrx +vrx +vrx +pgp +vVZ +mWy +pgp +uEG +dKn +gEz +pax +sdq +iux +aFA +mNq +mSt +dSQ +seo +rPs +dSQ +dSQ +dSQ +dSQ +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTO +wtY +wtY +thN +bzq +bzq +bzq +bzq +bxX +bwL +xnP +tKU +lYN +bBJ +wmG +tRe +dFp +wTK +tDY +oXn +cSg +tRe +egg +cbQ +iXG +bWf +bVa +bVa +bWf +ftV +bWf +kQG +avT +czY +cAe +cdE +cAe +bPn +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(153,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +avT +avT +wuf +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +avT +ydp +avT +ydp +avT +xUL +iOG +iOG +iOG +wju +pKp +bii +iOG +fHa +hIa +iOG +vrx +vrx +vrx +vrx +vrx +ptl +hKs +tTo +oEf +efF +lSt +klo +mSt +xgu +rtm +aCV +xiB +xYJ +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +jwP +bkQ +bmW +bom +bIq +bri +bvo +tyQ +cZk +poj +bzl +ftH +bzd +hGr +tRe +bkz +bGV +uHc +fTg +dQT +tRe +ptU +bIK +bPq +bWf +bVa +bVa +mtz +pxv +eNG +avT +avT +czY +kYs +cdE +cAe +bPn +avT +avT +ydp +ydp +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(154,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +avT +avT +avT +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bmX +avT +avT +avT +avT +avT +avT +avT +xUL +iOG +hNZ +sTI +hHW +tzL +oRh +iOG +taP +xUU +iOG +uyW +iEQ +gcw +qva +kFr +cLq +oje +tdL +mSt +cRa +eua +phq +nwR +xoS +rnk +skE +wRa +xYJ +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +bvq +bzn +bvq +oCZ +lxV +dGP +evr +lxV +hJE +cmC +aIt +bCO +bBN +vTF +tRe +eVp +bGV +tDY +fTg +cUN +lbv +bIf +bIL +eNX +bWf +bWf +bWf +bWf +bWf +bWf +kQG +avT +bPn +cAe +hSV +cAe +bPn +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(155,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +wuf +wuf +avT +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +lbu +fVQ +wuC +avT +avT +avT +avT +hAa +avT +lpT +dTy +dTy +dTy +dTy +ydp +ydp +ydp +ydp +ydp +ydp +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +qYD +nmM +cPn +bly +pIP +fuB +iOG +mVo +xJD +iOG +kLo +vEd +fII +ilL +kFr +trU +xvj +eha +qrS +ngj +jNK +xmC +mSt +ads +qoh +aeG +qxX +xYJ +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +bmX +avT +avT +ydp +ydp +ydp +avT +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTL +cTL +cTO +bzq +bzq +ptd +lom +bzq +oYr +lom +bzq +bzq +bCO +hrN +vER +tRe +qRK +bDI +bFL +bKO +bKO +nzt +bNf +bOp +fTg +cGZ +iWG +tPB +fTg +sat +tRe +avT +avT +bPn +cAe +cdE +cAe +bPn +avT +avT +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(156,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +avT +avT +avT +cVL +lpT +lpT +lpT +qnL +uYl +fIY +dTy +avT +avT +avT +ydp +ydp +avT +avT +xUL +ydp +ydp +ydp +ydp +ydp +qaO +qaO +weS +weS +qYD +nok +xas +rNP +kXY +slO +gOd +tRv +dED +iOG +qbJ +ktT +vMl +iML +kFr +vuO +vaj +rTv +mSt +dWt +fyr +tQv +mSt +qpo +adT +tos +qxX +xYJ +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +tFr +lzB +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +avT +ydp +nTz +xiw +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +cTO +sWF +cTO +bvw +bzq +bra +jMk +bzq +bra +odF +bzq +bzq +kEz +bBN +bEi +tRe +mHT +bDU +bFO +bSX +bKR +ncH +bSX +qLG +rYi +bSX +bKR +rUl +bSX +bNk +tRe +avT +avT +bPn +cAe +cdE +cAe +czY +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(157,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +nuu +sXy +sXy +fNh +xUL +nyq +sXy +fNh +xUL +nyq +sXy +fNh +xUL +nyq +sXy +sXy +sXy +sXy +sDD +eNK +jwc +iAG +mia +bHc +tlg +sXy +sXy +ikA +avT +ydp +avT +avT +xUL +ydp +ydp +ydp +ydp +ydp +qaO +xka +iWf +iBW +qYD +gyk +xUU +asn +sRM +kDy +nVY +ueO +pPL +jpd +eMl +fch +oEO +oOR +kFr +trU +vaj +rTv +mSt +mSt +mSt +mSt +mSt +kdm +ecN +vBa +jfi +uZz +wdv +wdv +wdv +avT +avT +avT +avT +ydp +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +avT +ydp +avT +hho +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +hho +avT +avT +avT +avT +avT +avT +avT +avT +avT +hho +avT +cTO +mek +bzq +bsL +xHt +bzq +bsL +okt +bzq +bzq +uhD +aFa +bCY +tRe +bCW +bRQ +dMI +gkX +bRQ +dMI +rbA +bRQ +dMI +wqc +bRQ +cdj +sRm +ocN +tRe +avT +avT +bPn +bdm +cdE +cAe +czY +bPn +bPn +bPn +czY +bPn +bPn +bPn +bPn +czY +czY +czY +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(158,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +avT +avT +avT +avT +clq +avT +avT +avT +clq +avT +avT +avT +clq +avT +avT +avT +avT +cVL +lpT +lpT +lpT +isp +jed +lgX +feM +avT +avT +bBh +avT +avT +avT +avT +xUL +xiw +xUL +xUL +xUL +xUL +kVO +kVO +vOS +vOS +qYD +iOG +iOG +iOG +iOG +iOG +iOG +rxt +ojs +iOG +uSe +eIa +umx +sOE +kFr +jQp +vCr +eiz +mvA +vyb +eWW +vyb +ogX +wmx +xoH +bSO +yiy +yiy +psS +bDf +hRt +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTO +bvw +bzq +hyq +raq +bzq +hyq +raq +bzq +bzq +mcy +bBP +ojY +tRe +bRN +bWj +dMI +vgZ +blR +dMI +wMT +tAQ +dMI +tKN +dTo +aDM +pvY +tBm +tRe +avT +avT +bPn +cAe +cdE +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +cAe +czY +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(159,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +wuf +avT +wuf +rxJ +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +avT +avT +avT +hHu +avT +lpT +dTy +dTy +dTy +dTy +ydp +avT +bBh +avT +avT +avT +avT +xUL +xUL +xUL +xUL +xUL +xUL +kVO +bQf +qgm +qgm +qgm +iLA +qgm +rai +qgm +qgm +jen +vOB +ddh +vZY +xJB +hyK +vVN +qeL +oiX +trU +knI +oIb +mgo +jpr +vob +gHQ +krB +aLQ +skB +eTJ +hRt +hoV +jmU +jHD +krH +avT +xiw +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +cTO +cTO +cTO +cTO +cTO +cTO +cTO +cTO +cTO +bzq +bLT +pxp +fKc +tRe +iXG +cbQ +dMI +cbQ +cbQ +dMI +cbQ +cbQ +dMI +cbQ +cbQ +cdj +tBm +tBm +tRe +avT +avT +bPn +lfs +jbc +aet +cjA +xmr +cjA +cjA +cjA +cjA +cjA +cjA +iyV +mGE +fDo +qBO +czY +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(160,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +qrR +avT +avT +avT +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +avT +rUq +sXy +sXy +sXy +sXy +ikA +xUL +xUL +xUL +xUL +xUL +qaO +gct +sGE +tJL +ixf +ixf +giv +ixf +ixf +ixf +pss +mWD +xCU +cmK +cmK +cmK +mKL +cmK +qSh +egJ +vSc +rTv +pJS +iwk +dsX +xbm +dBR +qpW +adV +rDE +dFF +sLn +acv +xEf +krH +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +bmX +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bLT +bBQ +bLS +tRe +iXG +hAb +dMI +cbQ +hAb +dMI +cbQ +hAb +dMI +uBc +hAb +cdj +tBm +xgM +tRe +cSQ +avT +czY +bPn +bPn +bPn +bPn +czY +bPn +bPn +bPn +bPn +czY +bzs +wJy +czY +bzs +oIA +bzs +bzs +bzs +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(161,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +wuf +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +bBh +xUL +xUL +xUL +xUL +xUL +qaO +qTo +xzM +pFu +mGp +mGp +mGp +iqT +mGp +mGp +iqT +mGp +rgm +wAx +wAx +wAx +uEz +uEz +wzf +uEz +vaj +rTv +pJS +pJS +abX +acx +khy +adt +adU +vFM +hRt +hCL +jmU +oJX +krH +avT +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bLT +bBQ +sJs +tRe +iXG +cbQ +dMI +cbQ +cbQ +dMI +cbQ +cbQ +dMI +cbQ +cbQ +cdj +tBm +tBm +tRe +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +czY +chp +eDu +czY +cmk +cng +cAe +hOY +hTB +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(162,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +wuf +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +lbu +knR +wuC +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +bBh +xUL +xUL +xUL +xUL +dns +iRF +qgm +gNI +mqc +wAx +vwV +qss +kRX +wAx +tMR +uGQ +lel +aRq +qss +qss +urI +uEz +uEz +iqZ +seG +tYT +qKA +cSv +pJS +pJS +tQG +dBR +uZz +adX +uZz +hRt +hZz +krH +krH +krH +vyf +vyf +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +avT +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +bLT +bBQ +bLS +tRe +wIH +kHr +owv +gtS +bhC +owv +gtS +vcH +owv +gtS +thF +vcF +hVH +uMk +tRe +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +czY +chp +tAG +czY +qIR +obd +cAe +rBb +chp +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(163,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +wuf +avT +lbu +gTh +wuC +avT +lbu +gTh +wuC +avT +lbu +gTh +wuC +avT +wuf +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +xUL +xUL +xUL +xUL +xUL +kVO +nqx +gNI +axg +wAx +lzW +qss +vnn +wAx +ijV +now +mKv +sAh +sAh +sAh +urI +uEz +uEz +hrS +lQJ +lia +uvB +tOY +pJS +nKU +acy +uEB +vCv +adW +rIl +peq +fIu +vgX +kdM +bfk +eZU +uWb +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +tFr +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +bmX +avT +avT +avT +bLT +bna +tmo +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +tRe +avT +avT +avT +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +czY +czY +wRm +czY +lyt +dYl +iXZ +czY +chp +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(164,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +qrR +qrR +wuf +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xgh +avT +wuf +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +xUL +xUL +xUL +xUL +xUL +kVO +qAq +acq +fJc +lfy +fWB +srL +wAx +wAx +gto +qss +mKv +sAh +sAh +sAh +urI +qkO +uEz +blD +kge +gls +tgd +tRC +pJS +tfx +lrV +iLi +hTO +lrV +wIA +wIA +wIA +yeg +sSy +gpe +qur +ahe +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ktw +ktw +ktw +ktw +ktw +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +aJt +bBh +xUL +aJt +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +bmX +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +gtG +bzk +czY +bPn +bPn +bPn +czY +ipV +czY +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(165,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +qrR +qrR +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +fBG +wuf +wuf +bmX +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +cfp +cfp +xac +xac +xac +cfp +cfp +gNI +skK +wAx +nij +fzT +ltY +duX +lmy +ezO +vPB +qss +qss +qss +ylW +uoV +uEz +blD +pgk +bKl +iNK +chN +pJS +sWD +bNF +rrm +dWI +sSj +kPn +tzP +juI +wIA +jTl +vyf +vyf +vyf +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ktw +kRI +fdJ +hGU +ktw +ydp +ydp +ydp +ydp +bmX +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +bBh +xUL +xUL +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +avT +hOb +avT +avT +avT +avT +gtG +avT +gtG +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(166,1,1) = {" +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +yhx +yhx +yhx +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +avT +xac +fpJ +cfp +dpp +evO +cfp +gNI +skK +wAx +wuQ +vnM +wAx +mQo +mbE +qss +sYv +sAh +sAh +sAh +urI +uoV +uEz +blD +pgk +qnx +pbf +sFw +pJS +cjE +bNF +nrg +hTO +dUV +wIA +adY +iLi +wIA +sSy +gpe +qur +ahe +blg +xUL +xUL +xUL +xUL +xUL +xUL +xUL +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ktw +vSJ +kZL +kZL +maR +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +bmX +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +rUq +sXy +ikA +avT +avT +bmX +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(167,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +avT +aDn +gph +cfp +aHU +dpp +gxY +gNI +skK +wAx +wxZ +vPB +wAx +cyI +ydV +qss +sYv +sAh +sAh +sAh +urI +uoV +uEz +blD +eLl +igK +xcL +hop +pJS +mhq +bNF +wIA +hTO +noB +wIA +kti +nrg +goW +pUf +kcM +tdE +gUw +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ktw +ehh +kZL +hap +ktw +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +avT +avT +avT +avT +avT +avT +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(168,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bmX +avT +avT +bBh +avT +aKf +irQ +huF +cfp +gxY +cfp +gNI +moX +wAx +wMw +kox +wAx +uKy +uVt +qss +lel +txz +qss +oXl +pPz +uoV +uEz +hsQ +cDO +jAT +nmL +vKP +pJS +hNg +bNF +wIA +hTO +dUV +wIA +pvr +wIA +sdw +fNU +vyf +vyf +vyf +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ktw +ktw +ktw +ktw +ktw +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(169,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +bBh +avT +aKf +irQ +jLG +piu +piu +xac +gNI +mqc +vKa +vKa +vKa +vKa +vKa +urI +kaM +trB +wAx +wAx +wAx +wAx +hru +uEz +uEz +uEz +ejw +rTv +eOO +pJS +hNg +bNF +wIA +hTO +bNF +wIA +wIA +wIA +wIA +sSy +vyf +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(170,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +bBh +avT +aKf +irQ +irQ +vLt +nGi +rQH +wFD +lNK +vKa +lVd +gSZ +qzP +vKa +nIU +fTy +fTy +xUm +aSI +uSv +sup +pbg +uEz +uEz +uEz +ejw +rTv +eOO +pJS +jiY +bNF +wIA +frL +ndQ +dCM +tiN +nzH +nsw +idG +vyf +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +tFr +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bmX +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(171,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +ydp +bBh +avT +aKf +eYe +irQ +mQV +cfp +cfp +hAw +skK +vKa +gdg +pkh +loM +vKa +nsv +jnh +mLO +rlS +fTy +uSv +sup +xkW +qkg +rhU +tio +umC +hiO +lIJ +pJS +leq +qxT +wIA +iCO +pJS +pJS +pJS +pJS +pJS +pJS +pWS +pWS +pWS +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(172,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +bBh +avT +aKf +irQ +irQ +piu +xac +jZl +gNI +xol +cYj +lBT +dfd +vLP +vKa +iAb +jnh +jsz +oQs +apt +cKk +cKk +cKk +cKk +cKk +cKk +bxf +jeo +thu +mvA +cWG +gdL +wIA +iCO +pJS +wYk +pqj +pqj +roW +pFR +oeC +uEd +pWS +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xiw +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(173,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +aKf +irQ +irQ +bEb +xac +aMR +msN +pFu +tML +ukJ +puA +jcr +rck +vgo +fTy +lBF +jHF +fTy +jvb +xZp +dVr +gRS +msK +cKk +dNB +rmV +dDf +gaf +pMD +shN +qOs +ocG +pJS +wji +pqj +pqj +roW +pFR +oeC +uEd +jIt +jIt +jIt +jIt +jIt +jIt +xiw +xiw +xiw +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(174,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +aKf +irQ +irQ +emH +cfp +gmH +okq +skK +vKa +vgH +dPA +hPO +vKa +vxI +haU +keI +fTy +fTy +stW +iKV +hFj +oNv +guV +cKk +meG +mcU +pLd +pJS +jjn +aNr +ckV +oEa +pJS +fnx +qgZ +pFR +pFR +pFR +pqj +uXL +wop +cFm +wkS +wZJ +rqG +jIt +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(175,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +aKf +irQ +irQ +cCA +cfp +cqM +gNI +skK +vKa +vKa +vKa +vKa +vKa +hFG +vKa +ohk +pWa +eJY +iJK +iKV +fPD +fPD +fPD +cKk +mjH +mcU +qHq +vyf +vyf +oqw +vyf +iHO +vyf +aAP +pqj +acu +gOi +qal +pqj +uXL +izV +fwU +enN +eRv +gdj +izV +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(176,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +bBh +avT +cUP +cTh +con +mQC +cfp +rDv +hDk +cjP +qlj +jji +clf +mHU +hYN +jCL +qlj +fYH +oln +gFP +stW +iKV +hFj +oNv +wqe +hbb +rkd +nWO +gBk +vyf +fmW +uWC +iYI +bNF +vyf +hyz +pqj +oYU +gbt +pqj +pqj +uXL +wvj +vgW +sDu +kpO +vme +mlM +avT +avT +avT +avT +vcG +lzB +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(177,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +bBh +avT +aKf +gLO +jvV +evO +cfp +kBe +gNI +itw +lLD +wVg +hWW +mKD +qRy +oTv +kms +wjK +wbJ +bqx +bpI +iKV +hFj +oNv +guV +hbb +jxZ +nWP +rlo +vyf +cLC +mmK +nWJ +qxT +pJS +fcU +pqj +oYU +oYU +pqj +pqj +uXL +dGO +crg +nhr +hsu +lmm +gwY +avT +avT +avT +avT +tFr +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +euS +jAq +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(178,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +mnL +hSv +esq +kPA +dpp +vra +cfp +qgm +msN +pFu +kms +uPe +abQ +jzx +lLa +mrW +qlj +tpf +iKV +iKV +iKV +fPD +fPD +fPD +fPD +jHT +rkd +mcU +rNS +vyf +vyf +hLQ +nsf +vyf +pJS +ddi +pqj +oNT +pqj +oNT +vWg +uXL +gwY +pdD +hMM +qKP +tQd +jIt +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(179,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +aJb +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +irt +oBs +wzl +wzl +wzl +bfB +sXy +lTs +lDV +pyF +kqo +nUm +eKc +pwL +oWy +qlj +nEI +ego +ohF +rjP +wHQ +vqv +gOp +nGh +fPD +fPD +fPD +qQC +fPD +fPD +jHT +rkd +dhX +vkk +vkk +vkk +vkk +qSi +vkk +vkk +pUz +pqj +mcU +pqj +mcU +vWg +uXL +jIt +dMR +sve +vhf +jIt +jIt +avT +avT +avT +avT +vcG +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(180,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +bzc +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +xUL +xUL +avT +avT +avT +avT +avT +cfp +oKG +vUu +pWc +xyT +saN +uPI +lNK +kVO +kVO +kVO +kVO +kVO +hIG +cKk +xUy +rXw +smY +fQs +fPD +fPD +fPD +bAP +fzG +rkd +pSO +fjw +fjw +fjw +mqb +fjw +fjw +fjw +jkw +gmr +sBB +gmr +sBB +gmr +kYg +pVW +sBs +uMF +jsl +gFM +cuY +nGx +nGx +nGx +nGx +xtV +lzB +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(181,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +bzc +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +avT +avT +avT +avT +xUL +xUL +avT +avT +avT +bqN +avT +bqN +cfp +cfp +cfp +cfp +vfx +fQI +mWc +pCU +ixf +kcn +llu +xve +gJP +eGi +mIe +qWa +cZI +kHI +fPD +fPD +fPD +fIU +cKk +jxZ +tTQ +jgz +jgz +jgz +jFl +lVS +jgz +jgz +mbt +qaX +khw +qaX +khw +qaX +lnx +jXa +vYP +dks +nEl +ust +sHJ +sLv +sLv +sLv +sLv +ybT +asr +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +bBh +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(182,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +bzc +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +avT +xUL +xUL +avT +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +cfp +rgC +wKU +czA +qgm +qgm +qgm +qgm +qgm +obR +npv +uJV +wgH +iKV +iKV +fPD +fPD +fPD +fPD +jHT +eeE +mky +iqH +iqH +iqH +uqy +yes +iqH +iqH +iqH +iqH +yes +iqH +yes +lgn +euW +jJu +cJp +par +xuB +jJu +jJu +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(183,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +bzc +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +xUL +xUL +avT +bqN +bqN +bqN +bxL +bxL +bxL +dri +xFZ +xFZ +xFZ +dsn +xFZ +xFZ +xFZ +xFZ +xFZ +qgm +obR +cKk +uIv +yjh +pVZ +qjc +iKV +fPD +fPD +fPD +jHT +vUq +kjh +jTs +srk +srk +tVh +phu +srk +pFR +xaI +pqj +gvP +pqj +gvP +vWg +oaF +xuB +dbc +rlC +fDJ +lGB +jJu +avT +avT +bmX +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(184,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +bzc +xUL +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +avT +xUL +xUL +bmX +avT +bxL +bxL +bxL +xUL +bxL +dri +dri +dDC +nQp +kVx +eLQ +hYi +qzO +cCg +tfq +qgm +txL +cKk +dFa +myq +vZR +fYa +iKV +fPD +fPD +fPD +hbb +jxZ +ulh +rlo +srk +plg +wUj +hTa +lOO +hVk +pqj +pqj +oYU +oYU +pqj +nHX +oaF +xuB +tat +ceZ +fDJ +vjY +xuB +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(185,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +bzc +xUL +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +xUL +xUL +avT +avT +bxL +bxL +bum +xUL +xUL +dri +dri +uot +kag +wIT +grM +grM +wXZ +msi +xFZ +qgm +xVl +gcY +xop +fbq +lFv +dvh +gkl +eOt +eFy +rYc +hbb +rkd +pSO +gzt +srk +gvm +fww +jvA +fOW +srk +hUF +pqj +gbt +oYU +pqj +pqj +oaF +xuB +kFF +bow +fDJ +fWc +xuB +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(186,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +bzh +xUL +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +avT +xUL +xUL +avT +bxL +bxL +bum +bum +xUL +xUL +rww +rww +rww +ttQ +lNU +bZI +bZI +nNV +dBP +jFv +kwl +kTY +cKk +fpt +hMy +jkJ +laL +cKk +cKk +cKk +cKk +cKk +mkm +lpl +xcA +srk +pGe +fww +npl +nMw +srk +wtp +eOd +hwG +oYU +czu +pqj +oaF +xuB +xpU +fDJ +nhK +kbR +xuB +avT +avT +avT +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(187,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +avT +bmX +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +xUL +xUL +bxL +bxL +bum +bum +bum +xUL +xUL +jrq +wJf +eQd +ttQ +lNU +bZI +bZI +bZI +xKv +uzI +lOs +mYB +cKk +kCI +hMy +hMy +hMy +sHK +hPp +tAm +fPD +cKk +meG +ggD +uzf +pFR +hgb +fzg +kyc +tfP +dQz +pFR +rQs +rQs +rQs +pFR +pqj +oaF +hHy +gZb +bVv +gQU +enq +jJu +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +euS +sXy +sXy +jAq +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +jfH +xSP +jfH +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(188,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bqN +bKI +bCA +bCA +bKI +bum +bum +bum +bum +xUL +xUL +rww +rww +rww +pAN +lNU +ttU +cKD +cKD +qnC +xFZ +uKE +rnK +cKk +tEl +gcp +cwm +jGd +cKk +nNj +wMJ +hfp +cKk +nfI +tmt +goC +pFR +qck +dEk +eRt +iyq +mLP +gOr +mwQ +jDD +jDD +cAq +pqj +oaF +jJu +jJu +jJu +jJu +jJu +jJu +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +avT +avT +cZq +jfH +lJi +jfH +cZq +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(189,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bqN +bKI +aRp +aRp +bKI +bum +bum +bum +bum +xUL +xUL +dri +dri +dri +lzh +vTk +iEj +hNv +qsm +olW +xFZ +qgm +txL +cKk +ouE +cKk +cKk +cKk +cKk +cKk +cKk +oPS +oPS +ihJ +hVN +rfk +pFR +oUV +mWJ +mWJ +nMw +dQz +ltk +qCo +iBl +egM +dQz +itN +oRc +pFR +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +jfH +jfH +ucO +xSP +wSI +jfH +jfH +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(190,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bqN +bKI +mqT +aRp +bKI +bum +bum +bum +bum +xUL +xUL +wmB +wmB +wmB +xFZ +xFZ +hPC +sYo +xFZ +xFZ +xFZ +ohv +gjA +cFP +hPt +ixf +ixf +ixf +pDu +ixf +oLo +mRZ +xfD +dxZ +hhx +iiM +pFR +iGS +cOq +cOq +rGy +fuj +hOw +pcs +eIN +vBS +dQz +pFR +pFR +pFR +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +wdv +wdv +bzj +xUL +xUL +xUL +xaS +wdv +wdv +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(191,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bqN +bKI +bCC +bCC +bKI +bum +bum +bum +bum +xUL +xUL +fen +cQu +dXa +bei +hIl +sdr +cQp +wKL +hjw +bKI +hpg +gNI +fyz +qgm +qgm +iuy +qgm +maG +qgm +hcu +vju +eYu +aWM +vUs +gUa +sda +sda +sda +sda +sda +sda +sda +pgG +jDD +jDD +jDD +qzz +uqa +iIQ +avT +bmX +avT +avT +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +avT +avT +avT +jfH +mNG +jph +xUL +rNn +xUL +eWH +aIf +jfH +avT +avT +avT +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(192,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bxL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +fen +mao +sdr +pDh +sdr +sdr +cQp +wKL +hjw +bKI +bKI +lEU +dxF +bKI +mMs +mMs +mMs +qRe +mMs +mMs +fPd +eYu +xOj +jKF +jKb +wdR +sda +pAC +sxB +sde +vUE +sda +kdR +jDD +xZx +jDD +jDD +jDD +iIQ +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +avT +avT +wdv +wdv +qJs +xUL +xUL +xUL +jYS +wdv +wdv +avT +avT +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(193,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +fen +cYq +sdr +xlX +gOW +uAu +uAu +lHl +lHl +rSF +oIq +tBl +eBq +vhT +iBL +nwz +fQM +nzK +hZy +iBL +tkq +hrc +edW +jKF +cJL +cGF +sda +rAe +rAe +taj +hBb +sda +mmY +jDD +aeH +jDD +jDD +jDD +iIQ +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +avT +avT +jfH +jfH +vaQ +rXp +ybp +lJC +lJC +avT +avT +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(194,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +bKI +bKI +bKI +bKI +bKI +xUL +fen +cYq +sdr +maL +ufJ +sdr +sdr +sbo +sbo +idb +egk +puf +sLN +igi +nPF +mzj +giZ +oQg +erG +nPF +sjE +pMf +pbc +cVG +iZZ +uma +usn +myZ +lWo +lWo +nEa +sda +mmY +otZ +aeH +gar +waa +uqa +iIQ +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +avT +avT +cZq +jfH +yfN +jfH +cZq +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(195,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +bum +xUL +xUL +bKI +bYZ +bYZ +vgm +ccI +xUL +bKI +bKI +bKI +puo +idl +kHm +sdr +sdr +sdr +hXO +egk +pFf +sdr +xlm +bKI +mMs +nbr +ehZ +sPt +iBL +wqd +pHH +xOj +jKF +qjA +sHl +sda +uXO +kQn +qUF +vTs +sda +mZp +mZp +mZp +mZp +mZp +mZp +mZp +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +jfH +wdv +jfH +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(196,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +bKI +ntX +jdS +cha +luf +gNM +qHC +gCM +mOE +kHP +pnS +sLN +sLN +sLN +sLN +xdD +xKn +rxf +tEt +xeV +vLE +mMs +fFG +wTe +sPt +iBL +bnU +fNd +bDg +fKE +bnU +bnU +jWr +jWr +jWr +jWr +fFM +jWr +mZp +gPF +foi +fBS +oHl +gPF +mZp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(197,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +bKI +bYZ +bYZ +ciG +caS +bZU +fgj +nOk +wzF +sdr +gyE +sdr +sdr +sdr +sdr +sdr +sdr +mFg +sdr +sdr +rtJ +hMD +lAv +oob +wdu +pxS +ecI +wRN +qyc +aPw +fGl +hVh +iOp +iNi +sKN +jWr +aTY +nyp +jWr +jIk +fBS +tTO +ijL +ijL +mZp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(198,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +xUL +xUL +xUL +xUL +bKI +bKI +bKI +bKI +bKI +bMT +fgj +nOk +lfG +sdr +gyE +sdr +sdr +sdr +sdr +sdr +wGe +sdr +sdr +sdr +ksM +mMs +dYS +tZO +dUI +hoq +oUs +oXi +gQZ +cOl +dxV +uSV +erc +rLb +kUy +jWr +cSd +vjX +jWr +umg +fBS +diD +cEq +cEq +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(199,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +xUL +xUL +xUL +xUL +bMT +bZU +bZU +bZU +bZU +kJk +uze +qBu +xUD +nOk +oai +jIc +sdr +sdr +sdr +sdr +sdr +sdr +sxJ +wGe +aDJ +mMs +wRv +xMG +rqS +hoq +cfN +tht +nRS +wjW +dbl +sxb +uap +rxc +efE +jWr +mgM +pNB +jWr +uxO +fBS +diD +cEq +cEq +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(200,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +xUL +bOb +bKI +bKI +bKI +bKI +vzR +fhC +oWW +ohq +nFM +oai +jlf +sdr +sdr +sdr +sdr +sdr +sdr +sdr +lJp +keq +iiY +lKT +siO +mgV +iiY +oUs +sOz +gJQ +gCd +qbZ +rom +uKr +kPu +buF +jWr +jWr +jWr +mZp +dSp +fBS +vaB +fBS +uPa +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(201,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +bum +bum +xUL +bOb +bKI +ccG +ckm +iro +fDt +pRV +tEt +fJg +iYF +uIZ +chd +mOE +jlf +sdr +wGe +sdr +sdr +sdr +sdr +uTK +xKN +oez +oTT +eBl +iiY +bnU +oib +bnU +wFc +gQZ +qbg +nDa +glg +rTW +cyH +rbC +lAp +mZp +hCD +fBS +jAy +fBS +wFO +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(202,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +bum +bum +xUL +bOb +bKI +kaK +cBJ +iro +fDt +pRV +iYF +fJg +xwg +iYF +iYF +kVo +yky +sdr +sdr +sdr +sdr +kHm +sdr +vmN +rep +hwV +nAS +hBy +iiY +szX +rSN +bnU +mkr +uhN +kIp +dLv +bdM +bdM +bdM +bdM +kCi +oUQ +qRF +lnH +pwC +fBS +wFO +mZp +avT +avT +bmX +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(203,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +bum +bum +xUL +bOb +bKI +bKI +bKI +bKI +xbp +mIl +mVf +mOE +oai +mLu +mOE +oai +jUf +mOE +mOE +spE +mOE +mOE +nft +scY +rem +xJn +krV +doV +iiY +aUG +rSN +bnU +pTq +aQA +tcW +vjV +cuO +cuO +cuO +aaP +vAF +mZp +ubQ +lVN +fBS +fBS +fBS +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(204,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bum +bum +bum +xUL +bOb +xUL +xUL +xUL +xUL +xbp +onY +gNy +hge +ovb +gNy +qCK +ovb +nJq +evI +rDG +vKm +qGL +rDG +gNy +ulr +jJb +xfH +puE +rFQ +iiY +piR +tty +bnU +shX +fmk +vbz +lyv +fok +oJp +mmQ +gfC +fve +aWr +fqj +fqj +rXo +mzs +xiL +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(205,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +xUL +bOb +bum +bum +bum +bum +xbp +fen +eHK +mIl +dkD +eHK +mIl +dkD +eHK +mIl +fen +eHK +mIl +fen +eHK +mIl +rem +tEQ +iiY +iiY +iiY +oty +ijZ +bnU +gWc +gWc +npp +pKN +bnU +bnU +bnU +mDW +scH +mZp +tNX +fZA +gkJ +mzs +lHZ +mZp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(206,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bDA +bGW +bYY +bYY +bYY +bYY +eus +bYY +cSi +bGW +tpD +cSi +bGW +tpD +cSi +bGW +bYY +cSi +bGW +bYY +cSi +xGX +qtH +xUL +xUL +xUL +dKF +ijZ +ijZ +bnU +oJa +cNE +tcq +sTR +xPK +bnU +bnU +mDW +scH +mZp +mZp +mZp +mZp +mZp +mZp +mZp +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(207,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bFx +bOb +bKI +ccI +ccI +bKI +xbp +bKI +cZO +bRy +xWx +iOH +bRy +xWx +iOH +bRy +bKI +cZO +bRy +bKI +cZO +bRy +bKI +xUL +xUL +xUL +bnU +szX +aiU +lxL +cjH +hVt +fVT +vlC +fQc +bnU +bnU +mDW +dbN +qWs +yjp +mZp +jjC +gEh +mZp +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(208,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bum +bum +bFx +bRD +caS +ccN +esY +ccI +xbp +bKI +fni +huA +bKI +jQN +kOi +bKI +ont +qmo +bKI +ssH +tuZ +bKI +xAm +fxY +bKI +xUL +xUL +bnU +bnU +bnU +uQG +bnU +dLj +cLO +qQb +qhf +uIU +bnU +bnU +eMi +dkQ +lnW +eWg +mZp +rVB +fnQ +mZp +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(209,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +aEF +bYY +ccD +ccN +esY +ccI +xbp +bKI +eMU +rmo +bKI +xhg +lek +bKI +piY +qED +bKI +sNb +vmJ +bKI +xGx +bcu +bKI +rGc +cly +lFN +pfb +ovI +oAX +tyF +qSR +cLO +cLO +cLO +lfd +vgI +bnU +bnU +bnU +pxX +jNw +eDE +tmI +pFo +mZp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(210,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +bKI +ccI +ccI +bKI +xbp +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +bKI +dQW +jls +ucC +cfs +vUj +cLO +nqc +cLO +cLO +cLO +cLO +jOE +nUN +sza +owk +bnU +mDW +rFB +mZp +mZp +mZp +mZp +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(211,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +xUL +xUL +xUL +xUL +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +rGc +jPj +ucC +wcy +sIk +aTc +sax +bdd +bdd +bdd +whW +ebK +gel +rXn +sGC +bnU +mDW +jzc +ucC +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(212,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +xUL +xUL +xUL +xUL +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +dQW +jls +ucC +wcy +mtY +rco +vQo +wbF +wbF +wbF +vQo +dTV +sNs +nht +svp +bnU +pGs +jzc +ucC +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(213,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +xUL +xUL +xUL +xUL +nLF +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +pHi +nJr +hsv +qib +ktt +uLX +vQo +qeP +nCf +pxh +qha +vQo +bnU +lWP +svp +bnU +kPQ +jzc +ucC +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(214,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +xUL +xUL +xUL +xUL +xUL +xUL +xbp +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +rGc +jls +odg +ucC +gUL +aNU +kVD +vQo +kgR +kgR +kgR +oHU +jUB +fkC +obb +svp +uXs +aYe +pLX +ucC +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(215,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +rGc +tdX +tdX +jPj +ucC +gUL +aNU +kVD +noQ +leT +leT +leT +iCq +leT +gkv +iNE +eOr +wku +xGy +lBH +bnU +bmX +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(216,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +dQW +tdX +tdX +jls +ucC +gUL +aNU +kVD +vQo +aOJ +aOJ +aOJ +prf +jVc +wVO +mKO +svp +uXs +mfm +uLV +bnU +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(217,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +rGc +tdX +tdX +jPj +ucC +cfs +jLF +anR +vQo +lxz +gQV +gQV +tag +vQo +bnU +mnj +svp +bnU +wjL +jzc +ucC +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(218,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +dQW +tdX +tdX +jls +ucC +cfs +tsi +rco +vQo +tLF +tLF +tLF +vQo +afU +eOZ +gOM +fKl +bnU +mDW +jzc +ucC +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(219,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +dQW +flw +flw +lFN +wRc +gxL +ftM +tbg +dGb +iYb +dGb +slc +qYN +sbS +iyL +aHt +bnU +pGs +jzc +ucC +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(220,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +xUL +dQW +jPj +bnU +ias +oSt +lfl +wWF +rum +wWF +rum +wWF +rum +wWF +uLa +qSS +bnU +bLc +jzc +ucC +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(221,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bDA +bYY +bYY +bYY +rVy +vkR +bpB +hPK +nSf +nSf +cYw +nSf +fSw +joU +eKO +wkg +vZl +bnU +mDW +jzc +ucC +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(222,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +gjW +xUL +xUL +xUL +bnU +bnU +bnU +bnU +bnU +bnU +bnU +dtm +pvj +bnU +bnU +bnU +bnU +bnU +mkd +jzc +ucC +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(223,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +hBq +pCv +iuP +xCe +cfn +oDn +mDX +cJH +abG +cTp +sXs +dTU +xqN +bVI +vrJ +bnU +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(224,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +xbp +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +xUL +sTq +hBq +hBq +hBq +ral +hBq +kol +jZW +ovP +hHR +vkw +lkQ +kKY +iEz +lFu +htA +dHP +uiO +bnU +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(225,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +xUL +xUL +xUL +xUL +xUL +xUL +wDd +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +alE +jAL +sTq +jeJ +uaJ +fCh +xvR +vqZ +iob +jZW +ppl +afn +ppl +jZW +eMQ +rdn +hBq +bnU +bnU +bnU +bnU +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(226,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bxL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xbp +sTq +jeJ +qSP +ptv +qUe +nCq +kpX +jZW +ppl +afn +ppl +jZW +eMQ +cOR +ioJ +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(227,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +xbp +sTq +jeJ +pbS +mhG +kPi +oiM +jPb +jZW +ppl +lsh +ppl +jZW +eMQ +qpb +ioJ +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(228,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +xbp +sTq +hBq +xBV +hBq +hBq +hBq +vrI +jZW +ppl +toL +eQC +kGo +eMQ +jPm +hBq +avT +avT +avT +avT +avT +bmX +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bmX +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +avT +wuf +wuf +wuf +wuf +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(229,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +rGc +rvf +umD +nQd +unF +gPS +ppj +uKH +tOP +jZW +ppl +sMa +ppl +jZW +eMQ +hdn +hBq +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +wuf +avT +avT +avT +rxJ +avT +avT +avT +avT +avT +avT +avT +avT +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(230,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +odg +xbp +bZa +frB +bZa +frB +bZa +sZT +nSX +jZW +ppl +ppl +ppl +jZW +eMQ +cSY +hBq +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +wuf +avT +jxB +faJ +rot +avT +jxB +faJ +rot +avT +jxB +aQK +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(231,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +odg +xbp +sTq +sTq +lHa +nQd +umD +hBq +hMQ +jZW +ppl +ppl +ppl +jZW +eMQ +bTR +ioJ +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +vDy +rot +avT +jxB +vDy +rot +avT +jxB +qfJ +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(232,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +odg +xbp +sTq +sTq +pQg +tFN +tFN +ehX +qRH +lkQ +lkQ +lkQ +lkQ +lkQ +cUd +lXT +hBq +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +vDy +rot +avT +jxB +vDy +rot +avT +jxB +qfJ +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(233,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +bqN +bqN +bxL +bxL +bum +bum +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +dQW +rvf +cly +cly +cbO +jPj +dQW +sZT +xgi +qIT +jZW +jZW +ojP +jZW +eMQ +wsj +hBq +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +vDy +rot +avT +jxB +vDy +rot +avT +jxB +qfJ +rot +avT +avT +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(234,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +wDd +alE +alE +gJi +alE +alE +lrK +cCb +cCb +lPB +lPB +pCo +sVh +mAn +iax +hBq +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +wRY +wRY +wRY +wRY +gXM +avT +gkt +avT +avT +avT +avT +avT +avT +avT +jxB +vDy +rot +avT +jxB +vDy +rot +avT +jxB +qfJ +rot +avT +avT +wuf +wuf +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(235,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bqN +bqN +bxL +bxL +bKI +bKI +bKI +bKI +xUL +xUL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +xUL +bOb +xUL +bxL +hBq +hBq +hBq +hBq +hBq +hBq +hBq +hBq +hBq +hBq +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bBh +avT +avT +wRY +ydQ +awB +spy +gXM +gXM +gXM +guD +avT +avT +avT +avT +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +avT +avT +hGK +avT +avT +avT +avT +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(236,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +avT +ccF +aRp +aRp +kBb +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +bOb +bxL +bxL +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +rUq +sXy +sXy +cUm +kkY +bfg +oBl +uyM +dUH +fUm +sXy +sXy +sXy +sXy +sXy +sXy +sXy +fNh +xUL +xUL +xUL +xUL +xUL +nyq +sXy +fNh +xUL +nyq +sXy +sXy +uRc +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(237,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +avT +avT +avT +ccF +cIP +aRp +kBb +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +xUL +gtR +bxL +bqN +bqN +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +qJw +tGJ +huQ +xrW +gXM +gXM +gXM +guD +avT +avT +avT +avT +avT +avT +avT +clq +avT +avT +avT +clq +avT +avT +avT +clq +avT +avT +avT +avT +avT +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(238,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +bqN +bqN +bqN +bKI +bKI +bKI +bKI +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bxL +bqN +bqN +bqN +bqN +avT +avT +avT +bmX +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +wRY +wRY +wRY +wRY +gXM +avT +mjX +avT +avT +avT +avT +avT +avT +avT +jxB +mmM +rot +avT +jxB +mmM +rot +avT +jxB +knR +rot +avT +avT +wuf +wuf +wuf +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(239,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bxL +bqN +bqN +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +mmM +rot +avT +jxB +mmM +rot +avT +jxB +knR +rot +avT +avT +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(240,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bxL +bqN +bqN +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +mmM +rot +avT +jxB +mmM +rot +avT +jxB +knR +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(241,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bxL +bxL +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bum +bxL +bxL +bxL +bqN +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +mmM +rot +avT +jxB +mmM +rot +avT +jxB +knR +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(242,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bqN +bqN +bqN +avT +avT +avT +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +avT +avT +jxB +gTh +rot +avT +jxB +gTh +rot +avT +jxB +gTh +rot +avT +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(243,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bqN +avT +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +wuf +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +avT +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(244,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +yhx +yhx +yhx +yhx +bqN +bqN +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bxL +bqN +bqN +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +avT +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +wuf +qrR +qrR +qrR +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(245,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +bqN +yhx +yhx +bqN +bqN +yhx +yhx +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +bqN +avT +avT +avT +avT +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(246,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +bqN +yhx +yhx +bqN +bqN +bqN +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(247,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(248,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(249,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(250,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +ydp +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(251,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(252,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(253,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(254,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} +(255,1,1) = {" +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +yhx +"} diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index 085a64bf97..3f7cacd1a8 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -473,12 +473,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"bs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) "bt" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -654,7 +648,9 @@ pixel_x = -25 }, /obj/structure/closet/firecloset/full, -/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plasteel{ dir = 9 }, @@ -793,7 +789,9 @@ }, /area/hallway/primary/central) "cl" = ( -/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel{ dir = 8 }, @@ -3614,8 +3612,8 @@ ak aT ak ak -bs -bL +ak +bE bE bE cc @@ -3669,7 +3667,7 @@ aU bg bq ak -bL +bE bE bE cd @@ -3723,7 +3721,7 @@ bh bh br ak -bL +bE bE bE cc diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index feb8fc8cc0..0a73818ab3 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2526,7 +2526,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "gR" = ( @@ -2806,7 +2805,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "vP" = ( @@ -2832,7 +2830,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "wf" = ( -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "wS" = ( @@ -2854,7 +2851,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "xh" = ( @@ -2869,7 +2865,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "yt" = ( @@ -3002,7 +2997,7 @@ /turf/open/floor/grass, /area/hydroponics) "Ga" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -3041,7 +3036,6 @@ /area/bridge) "IB" = ( /obj/structure/chair/stool/bar, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "JF" = ( @@ -3086,7 +3080,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "Ly" = ( @@ -3115,7 +3108,6 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) "MS" = ( @@ -3334,7 +3326,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/space/basic, /turf/open/floor/carpet/blackred, /area/crew_quarters/bar) @@ -9446,7 +9437,7 @@ fh fh eY eR -fh +et eR fc fh diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index daff5e51ad..f82ba2d735 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -49,7 +49,7 @@ /area/holodeck/rec_center/bunker) "ak" = ( /obj/structure/table, -/obj/item/stack/medical/ointment{ +/obj/item/stack/medical/mesh{ heal_burn = 10 }, /turf/open/floor/holofloor/asteroid, @@ -355,7 +355,7 @@ /area/holodeck/rec_center/lounge) "bc" = ( /obj/structure/table, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ heal_brute = 10 }, /turf/open/floor/holofloor/asteroid, @@ -7639,7 +7639,7 @@ /obj/item/clothing/suit/space/hardsuit/deathsquad{ pixel_y = 5 }, -/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/shoes/combat/swat, /obj/item/clothing/mask/gas/sechailer/swat, /obj/effect/turf_decal/stripes/line, @@ -10568,8 +10568,8 @@ /area/wizard_station) "yD" = ( /obj/structure/table/wood, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /turf/open/floor/engine/cult, /area/wizard_station) "yE" = ( @@ -13278,7 +13278,7 @@ /turf/open/floor/engine/cult, /area/wizard_station) "ED" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/closed/indestructible{ icon = 'icons/turf/walls/wood_wall.dmi'; icon_state = "wood"; @@ -14420,7 +14420,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/piano, +/obj/structure/musician/piano, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Hk" = ( @@ -16752,7 +16752,7 @@ }, /area/centcom/holding) "Nf" = ( -/obj/machinery/autoylathe, +/obj/machinery/autolathe/toy, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Ni" = ( @@ -17650,7 +17650,7 @@ /turf/open/floor/wood, /area/syndicate_mothership) "Sj" = ( -/obj/machinery/vending/autodrobe/all_access{ +/obj/machinery/vending/autodrobe{ extended_inventory = 1 }, /obj/machinery/light, @@ -58771,7 +58771,7 @@ iX iX jm jr -iX +iF jr jK iX diff --git a/_maps/shuttles/arrival_snaxi.dmm b/_maps/shuttles/arrival_snaxi.dmm new file mode 100644 index 0000000000..95d4ae973d --- /dev/null +++ b/_maps/shuttles/arrival_snaxi.dmm @@ -0,0 +1,224 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/arrival) +"c" = ( +/obj/machinery/door/airlock/titanium{ + name = "Arrivals Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"d" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/arrival) +"e" = ( +/obj/structure/closet/wardrobe/black, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"f" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"g" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"h" = ( +/obj/structure/closet/wardrobe/grey, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"i" = ( +/obj/structure/closet/wardrobe/green, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"j" = ( +/obj/machinery/requests_console{ + department = "Arrival shuttle"; + name = "Arrivals Shuttle console"; + pixel_y = 30 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"k" = ( +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"m" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"n" = ( +/obj/docking_port/mobile/arrivals{ + name = "Snaxi Arrivals Shuttle" + }, +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"o" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"p" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"q" = ( +/obj/machinery/light, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"r" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/arrival) +"s" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/obj/machinery/light, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"x" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/arrival) +"z" = ( +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) + +(1,1,1) = {" +a +b +d +d +d +b +a +"} +(2,1,1) = {" +b +b +r +r +r +b +b +"} +(3,1,1) = {" +b +h +f +f +f +o +b +"} +(4,1,1) = {" +b +i +r +r +r +p +b +"} +(5,1,1) = {" +b +e +f +f +f +x +b +"} +(6,1,1) = {" +b +m +r +r +r +q +b +"} +(7,1,1) = {" +d +g +f +f +f +f +d +"} +(8,1,1) = {" +c +f +r +r +r +f +c +"} +(9,1,1) = {" +c +f +f +f +f +f +c +"} +(10,1,1) = {" +b +j +r +r +r +s +b +"} +(11,1,1) = {" +b +k +k +k +k +k +b +"} +(12,1,1) = {" +b +z +z +n +z +z +b +"} diff --git a/_maps/shuttles/cargo_kilo.dmm b/_maps/shuttles/cargo_kilo.dmm index 6d9d543842..86660a4dc7 100644 --- a/_maps/shuttles/cargo_kilo.dmm +++ b/_maps/shuttles/cargo_kilo.dmm @@ -3,50 +3,30 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/supply) "b" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "c" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "d" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "e" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "f" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -55,18 +35,7 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) -"g" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/supply) "h" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -91,20 +60,10 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) "k" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "l" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -126,10 +85,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) "n" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -140,20 +95,12 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "o" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "p" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -176,10 +123,6 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "q" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -196,19 +139,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) -"s" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/supply) "t" = ( /obj/machinery/door/poddoor{ id = "QMLoaddoor2"; @@ -228,28 +158,15 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) "v" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/end{ dir = 8 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "w" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) "x" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -260,10 +177,6 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/supply) "z" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/supply) @@ -290,6 +203,27 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/supply) +"K" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/supply) +"Q" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/supply) +"Z" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/shuttle/supply) (1,1,1) = {" a @@ -323,12 +257,12 @@ C a c o -g -k -g +K +Z +w o -g -s +K +Q e A D @@ -336,13 +270,13 @@ D (4,1,1) = {" a c -g -g -g -g -g -g -g +w +w +w +w +w +w +w z A D @@ -350,13 +284,13 @@ D (5,1,1) = {" a c -g -g -g -g -g -g w +w +w +w +w +w +k x A D diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 7c14d9ebd0..7bc7de9bf1 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -197,7 +197,7 @@ /turf/open/floor/plasteel, /area/shuttle/escape) "aF" = ( -/obj/structure/piano{ +/obj/structure/musician/piano{ icon_state = "piano" }, /turf/open/floor/plasteel/grimy, diff --git a/_maps/shuttles/emergency_gorilla.dmm b/_maps/shuttles/emergency_gorilla.dmm index 0c75cd8b7e..cc2e67ee3e 100644 --- a/_maps/shuttles/emergency_gorilla.dmm +++ b/_maps/shuttles/emergency_gorilla.dmm @@ -326,10 +326,6 @@ /mob/living/simple_animal/hostile/gorilla, /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) -"bn" = ( -/obj/structure/reagent_dispensers/keg/semen, -/turf/open/floor/plating, -/area/shuttle/escape) "bo" = ( /obj/structure/closet/crate/freezer/surplus_limbs, /turf/open/floor/plasteel/shuttle, @@ -539,7 +535,7 @@ aD fV Pi bm -bn +ax bs bu "} @@ -610,7 +606,7 @@ aX aD fV bi -bn +ax bl fV ab diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 3c2da5ae85..c7aa1f28ce 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -144,7 +144,6 @@ pixel_y = 4 }, /obj/item/folder/blue, -/obj/item/gun/energy/e_gun/mini, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "av" = ( @@ -172,10 +171,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "ax" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, @@ -288,10 +283,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "aM" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -301,10 +292,6 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "aN" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -725,10 +712,6 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "bB" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -791,14 +774,6 @@ /obj/machinery/recharge_station, /turf/open/floor/plasteel/dark, /area/shuttle/escape) -"bG" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/escape) "bH" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/bot, @@ -1057,20 +1032,12 @@ /turf/open/floor/plasteel/dark, /area/shuttle/escape) "cj" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "ck" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "cm" = ( @@ -1079,27 +1046,15 @@ /area/shuttle/escape) "cr" = ( /obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "cs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "cA" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -1159,10 +1114,6 @@ /turf/open/floor/plating/airless, /area/shuttle/escape) "Xo" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -1543,7 +1494,7 @@ bn bi ac cj -bG +cr bR cK cT diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 2834f0c93f..a7faface75 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -422,7 +422,7 @@ /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "bD" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /turf/open/floor/carpet/red, /area/shuttle/escape/luxury) "bE" = ( diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 8df487714e..cae3139c41 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -333,8 +333,8 @@ "aT" = ( /obj/structure/table, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/machinery/light{ dir = 4 }, diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index 65fc7e30a2..206ebc4687 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -365,11 +365,11 @@ /area/shuttle/escape) "bi" = ( /obj/structure/table, -/obj/item/stack/medical/bruise_pack{ +/obj/item/stack/medical/suture{ pixel_x = 5; pixel_y = 5 }, -/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/suture, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bj" = ( diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry_kilo.dmm index 744d09d373..a905f8a0de 100644 --- a/_maps/shuttles/ferry_kilo.dmm +++ b/_maps/shuttles/ferry_kilo.dmm @@ -70,10 +70,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "m" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -115,10 +111,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "r" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -126,10 +118,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/transport) "s" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ dir = 1 diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm new file mode 100644 index 0000000000..034747f85d --- /dev/null +++ b/_maps/shuttles/hunter_bounty.dmm @@ -0,0 +1,490 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/hunter) +"c" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/shuttle/hunter) +"d" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"e" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/hunter) +"f" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/hunter) +"g" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/hunter) +"h" = ( +/turf/open/floor/plating, +/area/shuttle/hunter) +"i" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/hunter) +"j" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/shuttle/hunter) +"k" = ( +/obj/structure/sign/poster/contraband/bountyhunters, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/hunter) +"l" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/shuttle/hunter) +"m" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"n" = ( +/obj/structure/table, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"o" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"p" = ( +/obj/effect/mob_spawn/human/fugitive/bounty/hook{ + short_desc = null + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"q" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/hunter) +"r" = ( +/obj/machinery/computer/launchpad{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"s" = ( +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"t" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"v" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"w" = ( +/obj/structure/table, +/obj/item/phone, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"x" = ( +/obj/structure/table, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"y" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"z" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"A" = ( +/obj/machinery/computer/shuttle/hunter{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"B" = ( +/obj/machinery/launchpad, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"C" = ( +/obj/item/multitool, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"D" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"E" = ( +/obj/structure/window/plastitanium, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/hunter) +"F" = ( +/obj/machinery/power/smes, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"G" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"H" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"I" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/hunter) +"J" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"K" = ( +/obj/machinery/suit_storage_unit/standard_unit{ + storage_type = /obj/item/tank/internals/oxygen/yellow + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"L" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external, +/obj/docking_port/stationary{ + dwidth = 11; + height = 16; + id = "pirateship_home"; + name = "Deep Space"; + width = 17 + }, +/obj/docking_port/mobile{ + dheight = 3; + dwidth = 3; + height = 13; + id = "huntership"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "hunter shuttle"; + width = 15 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/hunter) +"M" = ( +/obj/effect/mob_spawn/human/fugitive/bounty/armor{ + dir = 1; + short_desc = null + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"P" = ( +/obj/structure/fluff/empty_sleeper{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) +"U" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/structure/window/plastitanium, +/turf/open/floor/plating, +/area/shuttle/hunter) +"Z" = ( +/obj/effect/mob_spawn/human/fugitive/bounty/synth{ + short_desc = null + }, +/turf/open/floor/pod/light, +/area/shuttle/hunter) + +(1,1,1) = {" +a +a +a +b +a +a +a +a +a +b +a +a +a +"} +(2,1,1) = {" +a +a +a +b +a +a +a +a +a +b +a +a +a +"} +(3,1,1) = {" +b +a +a +b +a +e +a +e +a +b +a +a +b +"} +(4,1,1) = {" +b +a +e +b +b +q +i +q +b +b +e +a +b +"} +(5,1,1) = {" +b +b +q +b +b +r +B +F +b +b +q +b +b +"} +(6,1,1) = {" +b +b +g +b +b +s +C +G +b +b +g +b +b +"} +(7,1,1) = {" +f +d +h +j +l +t +D +H +c +d +h +j +L +"} +(8,1,1) = {" +b +b +i +b +b +s +s +s +b +b +i +b +b +"} +(9,1,1) = {" +a +b +i +b +m +v +s +s +K +b +i +b +a +"} +(10,1,1) = {" +a +a +i +k +n +w +x +s +K +b +i +a +a +"} +(11,1,1) = {" +a +a +a +b +J +x +x +s +K +b +a +a +a +"} +(12,1,1) = {" +a +a +a +E +o +y +s +s +K +b +a +a +a +"} +(13,1,1) = {" +a +a +a +i +b +s +s +s +b +i +a +a +a +"} +(14,1,1) = {" +a +a +a +U +p +s +s +s +P +i +a +a +a +"} +(15,1,1) = {" +a +a +a +i +Z +z +s +z +M +i +a +a +a +"} +(16,1,1) = {" +a +a +a +E +i +A +n +I +i +b +a +a +a +"} +(17,1,1) = {" +a +a +a +a +i +i +i +i +i +a +a +a +a +"} diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm new file mode 100644 index 0000000000..a053d952ef --- /dev/null +++ b/_maps/shuttles/hunter_russian.dmm @@ -0,0 +1,501 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall, +/area/shuttle/hunter) +"c" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/hunter) +"d" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/hunter) +"e" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plating, +/area/shuttle/hunter) +"f" = ( +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/shuttle/hunter) +"g" = ( +/turf/open/floor/plating, +/area/shuttle/hunter) +"h" = ( +/obj/machinery/door/airlock/security/glass, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"i" = ( +/obj/machinery/door/airlock/security/glass, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"j" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/hunter) +"k" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"m" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool/largetank, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"n" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/item/storage/bag/trash{ + pixel_x = 6 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"o" = ( +/obj/effect/mob_spawn/human/fugitive/russian{ + dir = 4; + short_desc = null + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"p" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"q" = ( +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"r" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"s" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes/cigars/cohiba{ + pixel_y = 6 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"t" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/large{ + icon_state = "crittercrate" + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"u" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"v" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/shuttle/hunter) +"w" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"x" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/shuttle/hunter) +"y" = ( +/turf/template_noop, +/area/shuttle/hunter) +"z" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"A" = ( +/obj/machinery/computer/shuttle/hunter{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"B" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"C" = ( +/obj/machinery/computer/camera_advanced{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"D" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"E" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + dir = 8; + x_offset = 0; + y_offset = 3 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"F" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/engineering{ + icon_state = "engi_crateopen" + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"G" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"H" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/coffin{ + icon_state = "coffinopen" + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"I" = ( +/obj/effect/turf_decal/bot, +/obj/structure/mecha_wreckage/ripley, +/turf/open/floor/plating, +/area/shuttle/hunter) +"J" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"K" = ( +/obj/machinery/door/airlock/security/glass, +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dwidth = 11; + height = 16; + id = "pirateship_home"; + name = "Deep Space"; + width = 17 + }, +/obj/docking_port/mobile{ + dheight = 3; + dwidth = 3; + height = 13; + id = "huntership"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "hunter shuttle"; + width = 15 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"L" = ( +/obj/effect/mob_spawn/human/fugitive/russian{ + dir = 1; + short_desc = null + }, +/turf/open/floor/plating, +/area/shuttle/hunter) +"N" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"Q" = ( +/obj/item/book/manual/ripley_build_and_repair, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"Y" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +b +c +c +b +a +a +a +a +a +a +"} +(3,1,1) = {" +a +c +c +a +b +b +b +d +d +b +b +b +a +c +c +a +"} +(4,1,1) = {" +b +d +d +b +b +p +t +x +B +B +F +b +b +d +d +b +"} +(5,1,1) = {" +b +e +g +b +j +q +u +q +q +u +u +H +b +g +L +b +"} +(6,1,1) = {" +b +e +g +h +k +k +k +k +k +D +k +k +h +g +L +b +"} +(7,1,1) = {" +b +f +g +b +x +k +Y +Y +Y +Y +Q +I +b +g +L +b +"} +(8,1,1) = {" +b +b +b +b +b +h +b +b +b +b +h +b +b +b +b +b +"} +(9,1,1) = {" +a +b +b +b +m +k +b +y +y +b +k +N +b +b +b +a +"} +(10,1,1) = {" +a +a +a +i +k +k +v +y +y +v +k +k +K +a +a +a +"} +(11,1,1) = {" +a +a +a +b +n +r +b +y +y +b +r +J +b +a +a +a +"} +(12,1,1) = {" +a +a +a +b +b +h +b +b +b +b +h +b +b +a +a +a +"} +(13,1,1) = {" +a +a +a +b +o +k +r +z +z +k +k +o +b +a +a +a +"} +(14,1,1) = {" +a +a +a +b +b +s +w +A +C +E +G +b +b +a +a +a +"} +(15,1,1) = {" +a +a +a +a +b +b +v +v +v +v +b +b +a +a +a +a +"} diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm new file mode 100644 index 0000000000..44eb5052b2 --- /dev/null +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -0,0 +1,250 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + dir = 8; + view_range = 7; + x_offset = 6 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ab" = ( +/obj/machinery/computer/shuttle/hunter{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ac" = ( +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 12; + id = "huntership_home"; + name = "Deep Space"; + width = 7 + }, +/obj/docking_port/mobile{ + dir = 4; + dwidth = 3; + height = 12; + id = "huntership"; + name = "hunter shuttle"; + width = 7 + }, +/obj/machinery/door/poddoor/shutters{ + id = "Interpolship" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ae" = ( +/obj/machinery/button/door{ + id = "Interpolship"; + pixel_y = 26 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"af" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ag" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ah" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"aj" = ( +/obj/structure/closet/crate/eva, +/obj/effect/turf_decal/box, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ak" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/mob_spawn/human/fugitive/spacepol{ + dir = 1; + short_desc = null + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"al" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"bY" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"gi" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"hB" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/hunter) +"hJ" = ( +/obj/structure/window/shuttle, +/obj/structure/grille, +/turf/open/floor/plating, +/area/shuttle/hunter) +"ku" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/hunter) +"lp" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"rR" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"te" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/shutters{ + id = "Interpolship" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"An" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/hunter) +"Pq" = ( +/turf/template_noop, +/area/template_noop) +"Rz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"RO" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) + +(1,1,1) = {" +Pq +ku +te +ac +te +ku +Pq +"} +(2,1,1) = {" +Pq +ku +ae +al +af +ku +Pq +"} +(3,1,1) = {" +Pq +ku +bY +RO +ak +ku +Pq +"} +(4,1,1) = {" +hB +ku +bY +RO +ak +ku +hB +"} +(5,1,1) = {" +ku +ku +bY +RO +ak +ku +ku +"} +(6,1,1) = {" +Pq +hJ +ag +RO +RO +hJ +Pq +"} +(7,1,1) = {" +Pq +hJ +ah +RO +aj +hJ +Pq +"} +(8,1,1) = {" +Pq +ku +lp +RO +aj +ku +Pq +"} +(9,1,1) = {" +hB +ku +ku +rR +ku +ku +hB +"} +(10,1,1) = {" +ku +ku +RO +Rz +RO +ku +ku +"} +(11,1,1) = {" +Pq +An +aa +gi +ab +An +Pq +"} +(12,1,1) = {" +Pq +ku +An +An +An +ku +Pq +"} diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 1dffe12884..42fe684e05 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -342,11 +342,6 @@ }, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) -"aN" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/eva) "aO" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -385,8 +380,9 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/eva) "aS" = ( -/obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/bot_white, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) "aT" = ( @@ -505,9 +501,7 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/airlock) "bd" = ( -/obj/structure/sign/warning/vacuum/external{ - layer = 4 - }, +/obj/structure/sign/warning/vacuum/external, /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/airlock) "be" = ( @@ -614,8 +608,8 @@ "bu" = ( /obj/structure/table/reinforced, /obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/medical) @@ -808,6 +802,10 @@ "bQ" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/bot_white, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/gun/energy/plasmacutter, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/armory) "bR" = ( @@ -848,6 +846,10 @@ "bX" = ( /obj/structure/closet/syndicate/nuclear, /obj/effect/turf_decal/bot_white, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/gun/energy/plasmacutter, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/armory) "bY" = ( @@ -1166,15 +1168,37 @@ }, /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/armory) +"gZ" = ( +/obj/effect/turf_decal/bot_white, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) "pd" = ( /obj/machinery/porta_turret/syndicate/shuttle{ dir = 5 }, /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) -"vv" = ( -/obj/structure/reagent_dispensers/fueltank, +"qk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/effect/turf_decal/bot_white, +/obj/vehicle/ridden/atv/snowmobile, +/obj/item/key, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) +"vv" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/tank_dispenser/oxygen, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/eva) "In" = ( @@ -1189,6 +1213,14 @@ }, /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/medical) +"Sz" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/armory) (1,1,1) = {" aa @@ -1324,7 +1356,7 @@ ac ad aa ax -aN +aS aS aU aZ @@ -1474,7 +1506,7 @@ ac In aa aB -aO +gZ aO aX bc @@ -1499,7 +1531,7 @@ ac aa aa aB -aP +qk aP aP aP @@ -1524,7 +1556,7 @@ aa aa aa aB -aP +qk aP aP aP @@ -1581,7 +1613,7 @@ bd aB bm bB -bG +Sz bQ bX ci diff --git a/_maps/shuttles/labour_kilo.dmm b/_maps/shuttles/labour_kilo.dmm index 9ee9a38f07..6b70922475 100644 --- a/_maps/shuttles/labour_kilo.dmm +++ b/_maps/shuttles/labour_kilo.dmm @@ -29,10 +29,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/labor) "f" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -47,10 +43,6 @@ req_access_txt = "1" }, /obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -63,10 +55,6 @@ pixel_x = 30; pixel_y = 30 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -111,10 +99,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/labor) "l" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -127,10 +111,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -141,17 +121,12 @@ machinedir = 1; pixel_x = 30 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/labor) "o" = ( -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -164,10 +139,6 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/labor) "p" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/labor) @@ -177,9 +148,6 @@ pixel_x = 25 }, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/structure/chair/comfy/shuttle{ dir = 8 }, @@ -189,31 +157,12 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/labor) "r" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/structure/closet/crate, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/labor) -"s" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/labor) "t" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/labor) @@ -284,7 +233,7 @@ g a m p -s +t w y "} diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm deleted file mode 100644 index f04f8e1a3b..0000000000 --- a/_maps/shuttles/mining_common_meta.dmm +++ /dev/null @@ -1,124 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"b" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/mining) -"c" = ( -/obj/structure/table, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"d" = ( -/obj/machinery/computer/shuttle/mining/common, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"e" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) -"f" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"g" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) -"h" = ( -/obj/machinery/door/airlock/titanium{ - name = "Lavaland Shuttle Airlock" - }, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_common"; - name = "lavaland shuttle"; - port_direction = 4; - width = 7 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"i" = ( -/obj/structure/closet/crate, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"j" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"k" = ( -/obj/structure/ore_box, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"l" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/open/floor/plating/airless, -/area/shuttle/mining) -"Q" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) - -(1,1,1) = {" -a -a -b -a -b -a -a -"} -(2,1,1) = {" -a -c -e -g -f -i -a -"} -(3,1,1) = {" -b -d -Q -e -f -j -l -"} -(4,1,1) = {" -a -c -e -e -f -k -a -"} -(5,1,1) = {" -a -a -b -h -b -a -a -"} diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index 1de45c713c..5609ecfc06 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -15,7 +15,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) "d" = ( -/obj/effect/turf_decal/bot, /obj/machinery/computer/shuttle/mining, /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) @@ -31,10 +30,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) "f" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -48,10 +43,6 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/mining) "h" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -61,20 +52,12 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining) "i" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining) "j" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/machinery/status_display/evac{ pixel_x = -32 }, @@ -114,10 +97,6 @@ /turf/open/floor/plating, /area/shuttle/mining) "m" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -134,10 +113,6 @@ /turf/open/floor/plating/airless, /area/shuttle/mining) "p" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/general/hidden{ icon_state = "pipe11-2"; diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index c002e66d53..f664ea2c56 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -733,7 +733,7 @@ /turf/open/floor/plasteel, /area/shuttle/pirate) "bH" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -943,6 +943,9 @@ /obj/item/grenade/smokebomb{ pixel_x = 5 }, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, +/obj/item/pickaxe/drill/diamonddrill, /turf/open/floor/pod/light, /area/shuttle/pirate) "ep" = ( diff --git a/_maps/shuttles/snow_taxi.dmm b/_maps/shuttles/snow_taxi.dmm new file mode 100644 index 0000000000..55259fa1fe --- /dev/null +++ b/_maps/shuttles/snow_taxi.dmm @@ -0,0 +1,116 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/snowtaxi) +"b" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/shuttle/snowtaxi) +"c" = ( +/obj/machinery/door/airlock/titanium{ + name = "Mining Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/snowtaxi) +"e" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/shuttle/snowtaxi) +"f" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/snowtaxi) +"g" = ( +/obj/machinery/door/airlock/titanium{ + name = "Mining Shuttle Airlock" + }, +/obj/docking_port/mobile{ + dwidth = 3; + height = 4; + id = "snow_taxi"; + name = "snow taxi"; + port_direction = 8; + width = 6 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/snowtaxi) +"i" = ( +/obj/machinery/light, +/obj/machinery/computer/shuttle/snow_taxi{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/snowtaxi) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/snowtaxi) +"k" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/snowtaxi) +"l" = ( +/obj/effect/spawner/structure/window/shuttle, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating/airless, +/area/shuttle/snowtaxi) +"u" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium, +/area/shuttle/snowtaxi) + +(1,1,1) = {" +a +e +e +a +"} +(2,1,1) = {" +a +f +i +a +"} +(3,1,1) = {" +e +u +j +l +"} +(4,1,1) = {" +c +k +k +g +"} +(5,1,1) = {" +a +u +j +a +"} +(6,1,1) = {" +a +b +b +a +"} diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index 817f337503..84d2282c37 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -145,7 +145,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ap" = ( -/obj/machinery/vending/boozeomat/all_access, +/obj/machinery/vending/boozeomat, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; name = "dust" diff --git a/_maps/snaxi.dm b/_maps/snaxi.dm new file mode 100644 index 0000000000..9f6400a5e1 --- /dev/null +++ b/_maps/snaxi.dm @@ -0,0 +1 @@ +#define FORCE_MAP "_maps/snaxi.json" diff --git a/_maps/snaxi.json b/_maps/snaxi.json new file mode 100644 index 0000000000..cb1917b6f6 --- /dev/null +++ b/_maps/snaxi.json @@ -0,0 +1,49 @@ +{ + "map_name":"Snow Taxi", + "map_path":"map_files/Snaxi", + "map_file":[ + "IcemoonUnderground_Below.dmm", + "IcemoonUnderground_Above.dmm", + "Snaxi.dmm" + ], + "station_ruin_budget":0, + "space_ruin_levels":0, + "space_empty_levels":0, + "shuttles":{ + "cargo":"cargo_box", + "ferry":"ferry_fancy", + "whiteship":"whiteship_box", + "emergency":"emergency_box" + }, + "traits":[ + { + "Up":1, + "Station":0, + "Mining":true, + "Linkage":null, + "Gravity":true, + "Ice Ruins Underground":true, + "Baseturf":"/turf/open/lava/plasma/ice_moon" + }, + { + "Down":-1, + "Up":1, + "Station":0, + "Mining":true, + "Linkage":null, + "Gravity":true, + "Ice Ruins Underground":true, + "Baseturf":"/turf/open/openspace/icemoon" + }, + { + "Down":-1, + "Mining":true, + "Linkage":null, + "Gravity":true, + "Ice Ruins":true, + "Weather_Snowstorm":true, + "Baseturf":"/turf/open/floor/plating/asteroid/snow/icemoon" + } + ], + "minetype":"none" +} diff --git a/byond-extools.dll b/byond-extools.dll new file mode 100644 index 0000000000..a83ea1e543 Binary files /dev/null and b/byond-extools.dll differ diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 6604811d34..c9e03389f1 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -71,6 +71,11 @@ #define MUT_EXTRA 2 #define MUT_OTHER 3 +//species use_skintones defines +#define NO_SKINTONES 0 +#define USE_SKINTONES 1 +#define USE_SKINTONES_GRAYSCALE_CUSTOM 2 //adds a "_g" suffix to limb overlays icon states if the skin_tone is a custom one. + //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 @@ -132,8 +137,9 @@ #define NOGENITALS 21 //Cannot create, use, or otherwise have genitals #define MATRIXED 22 //if icon is color matrix'd #define SKINTONE 23 //uses skin tones -#define HORNCOLOR 24 -#define WINGCOLOR 25 +#define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used. +#define HORNCOLOR 25 +#define WINGCOLOR 26 //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 65be8258a1..bad64846d6 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -25,35 +25,38 @@ //SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) //subsystem does not initialize. -#define SS_NO_INIT 1 +#define SS_NO_INIT (1<<0) //subsystem does not fire. // (like can_fire = 0, but keeps it from getting added to the processing subsystems list) // (Requires a MC restart to change) -#define SS_NO_FIRE 2 +#define SS_NO_FIRE (1<<1) //subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) // SS_BACKGROUND has its own priority bracket -#define SS_BACKGROUND 4 +#define SS_BACKGROUND (1<<2) //subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) -#define SS_NO_TICK_CHECK 8 +#define SS_NO_TICK_CHECK (1<<3) //Treat wait as a tick count, not DS, run every wait ticks. // (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems) // (implies all runlevels because of how it works) // (overrides SS_BACKGROUND) // This is designed for basically anything that works as a mini-mc (like SStimer) -#define SS_TICKER 16 +#define SS_TICKER (1<<4) //keep the subsystem's timing on point by firing early if it fired late last fire because of lag // ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. -#define SS_KEEP_TIMING 32 +#define SS_KEEP_TIMING (1<<5) //Calculate its next fire after its fired. // (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) // This flag overrides SS_KEEP_TIMING -#define SS_POST_FIRE_TIMING 64 +#define SS_POST_FIRE_TIMING (1<<6) + +/// Show in stat() by default even if SS_NO_FIRE +#define SS_ALWAYS_SHOW_STAT (1<<7) //SUBSYSTEM STATES #define SS_IDLE 0 //aint doing shit. diff --git a/code/__DEFINES/__513_compatibility.dm b/code/__DEFINES/__513_compatibility.dm deleted file mode 100644 index 12577fb68b..0000000000 --- a/code/__DEFINES/__513_compatibility.dm +++ /dev/null @@ -1,32 +0,0 @@ - -#if DM_VERSION < 513 - -#define ismovableatom(A) (istype(A, /atom/movable)) - -#define islist(L) (istype(L, /list)) - -#define CLAMP01(x) (CLAMP(x, 0, 1)) - -#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) - -#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) - -#define TAN(x) (sin(x) / cos(x)) - -#define arctan(x) (arcsin(x/sqrt(1+x*x))) - -////////////////////////////////////////////////// - -#else - -#define ismovableatom(A) ismovable(A) - -#define CLAMP01(x) clamp(x, 0, 1) - -#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX) - -#define TAN(x) tan(x) - -#define ATAN2(x, y) arctan(x, y) - -#endif diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/_flags/_flags.dm similarity index 58% rename from code/__DEFINES/flags.dm rename to code/__DEFINES/_flags/_flags.dm index 396cf25be1..b1324000b8 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -20,26 +20,41 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define DF_ISPROCESSING (1<<2) //FLAGS BITMASK - -#define HEAR_1 (1<<3) // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not. -#define CHECK_RICOCHET_1 (1<<4) // Projectiels will check ricochet on things impacted that have this. -#define CONDUCT_1 (1<<5) // conducts electricity (metal etc.) -#define NODECONSTRUCT_1 (1<<7) // For machines and structures that should not break into parts, eg, holodeck stuff -#define OVERLAY_QUEUED_1 (1<<8) // atom queued to SSoverlay -#define ON_BORDER_1 (1<<9) // item has priority to check when entering or leaving -#define PREVENT_CLICK_UNDER_1 (1<<11) //Prevent clicking things below it on the same turf eg. doors/ fulltile windows +///This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not. +#define HEAR_1 (1<<3) +///Projectiles will use default chance-based ricochet handling on things with this. +#define DEFAULT_RICOCHET_1 (1<<4) +///Conducts electricity (metal etc.). +#define CONDUCT_1 (1<<5) +///For machines and structures that should not break into parts, eg, holodeck stuff. +#define NODECONSTRUCT_1 (1<<7) +///Atom queued to SSoverlay. +#define OVERLAY_QUEUED_1 (1<<8) +///Item has priority to check when entering or leaving. +#define ON_BORDER_1 (1<<9) +///Prevent clicking things below it on the same turf eg. doors/ fulltile windows. +#define PREVENT_CLICK_UNDER_1 (1<<11) #define HOLOGRAM_1 (1<<12) -#define TESLA_IGNORE_1 (1<<13) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity -#define INITIALIZED_1 (1<<14) //Whether /atom/Initialize() has already run for the object -#define ADMIN_SPAWNED_1 (1<<15) //was this spawned by an admin? used for stat tracking stuff. -#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16) /// should not get harmed if this gets caught by an explosion? +///Prevents mobs from getting chainshocked by teslas and the supermatter. +#define SHOCKED_1 (1<<13) +///Whether /atom/Initialize() has already run for the object. +#define INITIALIZED_1 (1<<14) +///was this spawned by an admin? used for stat tracking stuff. +#define ADMIN_SPAWNED_1 (1<<15) +/// should not get harmed if this gets caught by an explosion? +#define PREVENT_CONTENTS_EXPLOSION_1 (1<<16) +/// Early returns mob.face_atom() +#define BLOCK_FACE_ATOM_1 (1<<17) //turf-only flags #define NOJAUNT_1 (1<<0) #define UNUSED_RESERVATION_TURF_1 (1<<1) -#define CAN_BE_DIRTY_1 (1<<2) // If a turf can be made dirty at roundstart. This is also used in areas. -#define NO_LAVA_GEN_1 (1<<6) //Blocks lava rivers being generated on the turf -#define NO_RUINS_1 (1<<10) //Blocks ruins spawning on the turf +///If a turf can be made dirty at roundstart. This is also used in areas. +#define CAN_BE_DIRTY_1 (1<<2) +///Blocks lava rivers being generated on the turf. +#define NO_LAVA_GEN_1 (1<<6) +///Blocks ruins spawning on the turf. +#define NO_RUINS_1 (1<<10) /* These defines are used specifically with the atom/pass_flags bitmask @@ -59,8 +74,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define FLYING (1<<1) #define VENTCRAWLING (1<<2) #define FLOATING (1<<3) -#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. -#define CRAWLING (1<<5) //Applied if you're crawling around on the ground/resting. +///When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. +#define UNSTOPPABLE (1<<4) +///Applied if you're crawling around on the ground/resting. +#define CRAWLING (1<<5) //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) @@ -75,14 +92,15 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define GOLIATH_WEAKNESS (1<<9) //CIT CHANGE //tesla_zap -#define TESLA_MACHINE_EXPLOSIVE (1<<0) -#define TESLA_ALLOW_DUPLICATES (1<<1) -#define TESLA_OBJ_DAMAGE (1<<2) -#define TESLA_MOB_DAMAGE (1<<3) -#define TESLA_MOB_STUN (1<<4) +#define ZAP_MACHINE_EXPLOSIVE (1<<0) +#define ZAP_ALLOW_DUPLICATES (1<<1) +#define ZAP_OBJ_DAMAGE (1<<2) +#define ZAP_MOB_DAMAGE (1<<3) +#define ZAP_MOB_STUN (1<<4) -#define TESLA_DEFAULT_FLAGS ALL -#define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN +#define ZAP_DEFAULT_FLAGS ALL +#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN +#define ZAP_SUPERMATTER_FLAGS NONE //EMP protection #define EMP_PROTECT_SELF (1<<0) @@ -119,3 +137,12 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST) #define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE) + +// melee_attack_chain() attackchain_flags +/// The attack is from a parry counterattack. +#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0) + +/// If the thing can reflect light (lasers/energy) +#define RICOCHET_SHINY (1<<0) +/// If the thing can reflect matter (bullets/bomb shrapnel) +#define RICOCHET_HARD (1<<1) \ No newline at end of file diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm new file mode 100644 index 0000000000..c6a3886ed3 --- /dev/null +++ b/code/__DEFINES/_flags/item_flags.dm @@ -0,0 +1,54 @@ +// Flags for the item_flags var on /obj/item + +#define BEING_REMOVED (1<<0) +///is this item equipped into an inventory slot or hand of a mob? used for tooltips +#define IN_INVENTORY (1<<1) +///used for tooltips +#define FORCE_STRING_OVERRIDE (1<<2) +///Used by security bots to determine if this item is safe for public use. +#define NEEDS_PERMIT (1<<3) +#define SLOWS_WHILE_IN_HAND (1<<4) +///Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. +#define NO_MAT_REDEMPTION (1<<5) +///When dropped, it calls qdel on itself +#define DROPDEL (1<<6) +///when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() +#define NOBLUDGEON (1<<7) +///for all things that are technically items but used for various different stuff +#define ABSTRACT (1<<8) +///When players should not be able to change the slowdown of the item (Speed potions, ect) +#define IMMUTABLE_SLOW (1<<9) +///Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define SURGICAL_TOOL (1<<10) +///Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. +#define NO_UNIFORM_REQUIRED (1<<11) +///Damage when attacking people is not affected by combat mode. +#define NO_COMBAT_MODE_FORCE_MODIFIER (1<<12) +/// This item can be used to parry. Only a basic check used to determine if we should proceed with parry chain at all. +#define ITEM_CAN_PARRY (1<<13) +/// This item can be used in the directional blocking system. Only a basic check used to determine if we should proceed with directional block handling at all. +#define ITEM_CAN_BLOCK (1<<14) + +// Flags for the clothing_flags var on /obj/item/clothing + +#define LAVAPROTECT (1<<0) +#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag. +#define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! +#define ALLOWINTERNALS (1<<3) //mask allows internals +#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc +#define NOSLIP_ICE (1<<5) //prevents from slipping on frozen floors +#define THICKMATERIAL (1<<6) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. +#define VOICEBOX_TOGGLABLE (1<<7) //The voicebox in this clothing can be toggled. +#define VOICEBOX_DISABLED (1<<8) //The voicebox is currently turned off. +#define IGNORE_HAT_TOSS (1<<9) //Hats with negative effects when worn (i.e the tinfoil hat). +#define SCAN_REAGENTS (1<<10) // Allows helmets and glasses to scan reagents. + +// Flags for the organ_flags var on /obj/item/organ + +#define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal +#define ORGAN_FROZEN (1<<1) //Frozen organs, don't deteriorate +#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed +#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. +#define ORGAN_VITAL (1<<4) //Currently only the brain +#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances +#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment. diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm new file mode 100644 index 0000000000..ebb9b4bda0 --- /dev/null +++ b/code/__DEFINES/_flags/obj_flags.dm @@ -0,0 +1,15 @@ +// Flags for the obj_flags var on /obj + +#define EMAGGED (1<<0) +#define IN_USE (1<<1) //If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! +#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? +#define BEING_SHOCKED (1<<3) //Whether this thing is currently (already) being shocked by a tesla +#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no +#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? +#define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing? +#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. +#define FROZEN (1<<8) +#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. +#define BLOCK_Z_FALL (1<<10) + +// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/_tick.dm b/code/__DEFINES/_tick.dm index 10b815e547..fc6147c430 100644 --- a/code/__DEFINES/_tick.dm +++ b/code/__DEFINES/_tick.dm @@ -1,13 +1,28 @@ -#define TICK_LIMIT_RUNNING 80 +/// Percentage of tick to leave for master controller to run +#define MAPTICK_MC_MIN_RESERVE 70 +/// internal_tick_usage is updated every tick by extools +#define MAPTICK_LAST_INTERNAL_TICK_USAGE ((GLOB.internal_tick_usage / world.tick_lag) * 100) +/// Tick limit while running normally +#define TICK_BYOND_RESERVE 2 +#define TICK_LIMIT_RUNNING (max(100 - TICK_BYOND_RESERVE - MAPTICK_LAST_INTERNAL_TICK_USAGE, MAPTICK_MC_MIN_RESERVE)) +/// Tick limit used to resume things in stoplag #define TICK_LIMIT_TO_RUN 70 +/// Tick limit for MC while running #define TICK_LIMIT_MC 70 -#define TICK_LIMIT_MC_INIT_DEFAULT 98 +/// Tick limit while initializing +#define TICK_LIMIT_MC_INIT_DEFAULT (100 - TICK_BYOND_RESERVE) -#define TICK_USAGE world.tick_usage //for general usage -#define TICK_USAGE_REAL world.tick_usage //to be used where the result isn't checked +/// for general usage of tick_usage +#define TICK_USAGE world.tick_usage +/// to be used where the result isn't checked +#define TICK_USAGE_REAL world.tick_usage +/// Returns true if tick_usage is above the limit #define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit ) +/// runs stoplag if tick_usage is above the limit #define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 ) +/// Returns true if tick usage is above 95, for high priority usage #define TICK_CHECK_HIGH_PRIORITY ( TICK_USAGE > 95 ) +/// runs stoplag if tick_usage is above 95, for high priority usage #define CHECK_TICK_HIGH_PRIORITY ( TICK_CHECK_HIGH_PRIORITY? stoplag() : 0 ) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 0b46f21a97..e8e75c132a 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -83,10 +83,3 @@ #define SPAM_TRIGGER_WARNING 5 //Number of identical messages required before the spam-prevention will warn you to stfu #define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you - -///Max length of a keypress command before it's considered to be a forged packet/bogus command -#define MAX_KEYPRESS_COMMANDLENGTH 16 -///Max amount of keypress messages per second over two seconds before client is autokicked -#define MAX_KEYPRESS_AUTOKICK 100 -///Length of max held keys -#define MAX_HELD_KEYS 15 diff --git a/code/__DEFINES/admin/keybindings.dm b/code/__DEFINES/admin/keybindings.dm new file mode 100644 index 0000000000..3efc26c7d5 --- /dev/null +++ b/code/__DEFINES/admin/keybindings.dm @@ -0,0 +1,18 @@ +// Defines for managed input/keybinding system. +/// Max length of a keypress command before it's considered to be a forged packet/bogus command +#define MAX_KEYPRESS_COMMANDLENGTH 16 +/// Maximum keys that can be bound to one button +#define MAX_COMMANDS_PER_KEY 5 +/// Maximum keys per keybind +#define MAX_KEYS_PER_KEYBIND 3 +/// Max amount of keypress messages per second over two seconds before client is autokicked +#define MAX_KEYPRESS_AUTOKICK 100 +/// Max keys that can be held down at once by a client +#define MAX_HELD_KEYS 15 + +/// Macroset name of hotkeys/keybind only/modern mode +#define SKIN_MACROSET_HOTKEYS "hotkeys" +/// Macroset name of classic hotkey mode +#define SKIN_MACROSET_CLASSIC_HOTKEYS "oldhotkeys" +/// Macroset name of classic input mode +#define SKIN_MACROSET_CLASSIC_INPUT "oldinput" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index ea380cf49b..b883a54209 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -11,6 +11,17 @@ #define NUKE_RESULT_WRONG_STATION 7 #define NUKE_RESULT_WRONG_STATION_DEAD 8 +//fugitive end results +#define FUGITIVE_RESULT_BADASS_HUNTER 0 +#define FUGITIVE_RESULT_POSTMORTEM_HUNTER 1 +#define FUGITIVE_RESULT_MAJOR_HUNTER 2 +#define FUGITIVE_RESULT_HUNTER_VICTORY 3 +#define FUGITIVE_RESULT_MINOR_HUNTER 4 +#define FUGITIVE_RESULT_STALEMATE 5 +#define FUGITIVE_RESULT_MINOR_FUGITIVE 6 +#define FUGITIVE_RESULT_FUGITIVE_VICTORY 7 +#define FUGITIVE_RESULT_MAJOR_FUGITIVE 8 + #define APPRENTICE_DESTRUCTION "destruction" #define APPRENTICE_BLUESPACE "bluespace" #define APPRENTICE_ROBELESS "robeless" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index e728d49956..2b19b557b2 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -161,10 +161,14 @@ #define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" #define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" #define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" + //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland #define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300" +//SNOSTATION +#define ICEMOON_DEFAULT_ATMOS "o2=17;n2=63;TEMP=180" + //ATMOSIA GAS MONITOR TAGS #define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in" #define ATMOS_GAS_MONITOR_OUTPUT_O2 "o2_out" @@ -255,10 +259,10 @@ //HELPERS #define PIPING_LAYER_SHIFT(T, PipingLayer) \ - if(T.dir & NORTH || T.dir & SOUTH) { \ + if(T.dir & (NORTH|SOUTH)) { \ T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\ } \ - if(T.dir & WEST || T.dir & EAST) { \ + if(T.dir & (WEST|EAST)) { \ T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;\ } @@ -294,6 +298,8 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) #define ARCHIVE_TEMPERATURE(gas) gas.temperature_archived = gas.temperature +#define ARCHIVE(gas) gas.temperature_archived = gas.temperature; gas.gas_archive = gas.gases.Copy(); + GLOBAL_LIST_INIT(pipe_paint_colors, list( "amethyst" = rgb(130,43,255), //supplymain "blue" = rgb(0,0,255), diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 322a150617..01f14c748e 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -59,6 +59,7 @@ #define ANTAG_HUD_CLOCKWORK 22 #define ANTAG_HUD_BROTHER 23 #define ANTAG_HUD_BLOODSUCKER 24 +#define ANTAG_HUD_FUGITIVE 25 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 52a2d56697..bba5b5c5ed 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -32,4 +32,8 @@ list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ list("", "", "")\ -) \ No newline at end of file +) + +#define PACK_GOODY_NONE 0 +#define PACK_GOODY_PUBLIC 1 //can be bought by both privates and cargo +#define PACK_GOODY_PRIVATE 2 //can be bought only by privates \ No newline at end of file diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 578255d086..07f24fd8a3 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -99,10 +99,7 @@ #define NO_ASS_SLAP (1<<10) #define BIMBOFICATION (1<<11) -#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT) - -//component stuff -#define COMSIG_VORE_TOGGLED "voremode_toggled" // totally not copypasta +#define TOGGLES_CITADEL 0 //belly sound pref things #define NORMIE_HEARCHECK 4 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index cc2cd8834a..3d15412efe 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -43,6 +43,7 @@ #define COLOR_RED_GRAY "#B4696A" #define COLOR_PALE_BLUE_GRAY "#98C5DF" #define COLOR_PALE_GREEN_GRAY "#B7D993" +#define COLOR_PALE_ORANGE "#FFC066" #define COLOR_PALE_RED_GRAY "#D59998" #define COLOR_PALE_PURPLE_GRAY "#CBB1CA" #define COLOR_PURPLE_GRAY "#AE8CA8" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index be0a4d0f59..3cb60b1143 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -29,34 +29,38 @@ #define EFFECT_DROWSY "drowsy" #define EFFECT_JITTER "jitter" -// /mob/living/combat_flags -#define CAN_TOGGLE_COMBAT_MODE(mob) FORCE_BOOLEAN((mob.stat == CONSCIOUS) && !(mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) +// mob/living/var/combat_flags variable. +/// Default combat flags for those affected by sprinting (combat mode has been made into its own component) +#define COMBAT_FLAGS_DEFAULT (COMBAT_FLAG_PARRY_CAPABLE | COMBAT_FLAG_BLOCK_CAPABLE) +/// Default combat flags for everyone else (so literally everyone but humans). +#define COMBAT_FLAGS_SPRINT_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_SPRINT_FORCED | COMBAT_FLAG_PARRY_CAPABLE | COMBAT_FLAG_BLOCK_CAPABLE) -/// Default combat flags for those affected by ((stamina combat)) -#define COMBAT_FLAGS_DEFAULT NONE -/// Default combat flags for everyone else (so literally everyone but humans) -#define COMBAT_FLAGS_STAMSYSTEM_EXEMPT (COMBAT_FLAG_SPRINT_ACTIVE | COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_SPRINT_TOGGLED | COMBAT_FLAG_COMBAT_TOGGLED) -/// Default combat flags for those only affected by sprint (so just silicons) -#define COMBAT_FLAGS_STAMEXEMPT_YESSPRINT (COMBAT_FLAG_COMBAT_ACTIVE | COMBAT_FLAG_COMBAT_TOGGLED) - -/// The user wants combat mode on -#define COMBAT_FLAG_COMBAT_TOGGLED (1<<0) /// The user wants sprint mode on -#define COMBAT_FLAG_SPRINT_TOGGLED (1<<1) -/// Combat mode is currently active -#define COMBAT_FLAG_COMBAT_ACTIVE (1<<2) +#define COMBAT_FLAG_SPRINT_TOGGLED (1<<0) /// Sprint is currently active -#define COMBAT_FLAG_SPRINT_ACTIVE (1<<3) +#define COMBAT_FLAG_SPRINT_ACTIVE (1<<1) /// Currently attempting to crawl under someone -#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<4) +#define COMBAT_FLAG_ATTEMPTING_CRAWL (1<<2) /// Currently stamcritted -#define COMBAT_FLAG_HARD_STAMCRIT (1<<5) +#define COMBAT_FLAG_HARD_STAMCRIT (1<<3) /// Currently attempting to resist up from the ground -#define COMBAT_FLAG_RESISTING_REST (1<<6) +#define COMBAT_FLAG_RESISTING_REST (1<<4) /// Intentionally resting -#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<7) +#define COMBAT_FLAG_INTENTIONALLY_RESTING (1<<5) /// Currently stamcritted but not as violently -#define COMBAT_FLAG_SOFT_STAMCRIT (1<<8) +#define COMBAT_FLAG_SOFT_STAMCRIT (1<<6) +/// Force sprint mode on at all times, overrides everything including sprint disable traits. +#define COMBAT_FLAG_SPRINT_FORCED (1<<7) +/// This mob is capable of using the active parrying system. +#define COMBAT_FLAG_PARRY_CAPABLE (1<<8) +/// This mob is capable of using the active blocking system. +#define COMBAT_FLAG_BLOCK_CAPABLE (1<<9) +/// This mob is capable of unarmed parrying +#define COMBAT_FLAG_UNARMED_PARRY (1<<10) +/// This mob is currently actively blocking +#define COMBAT_FLAG_ACTIVE_BLOCKING (1<<11) +/// This mob is currently starting an active block +#define COMBAT_FLAG_ACTIVE_BLOCK_STARTING (1<<12) // Helpers for getting someone's stamcrit state. Cast to living. #define NOT_STAMCRIT 0 @@ -68,10 +72,18 @@ #define CHECK_STAMCRIT(mob) ((mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)? HARD_STAMCRIT : ((mob.combat_flags & COMBAT_FLAG_SOFT_STAMCRIT)? SOFT_STAMCRIT : NOT_STAMCRIT)) //stamina stuff -#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement -#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit -#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations -#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT +///Threshold over which attacks start being hindered. +#define STAMINA_NEAR_SOFTCRIT 90 +///softcrit for stamina damage. prevents standing up, some actions that cost stamina, etc, but doesn't force a rest or stop movement +#define STAMINA_SOFTCRIT 100 +///sanity cap to prevent stamina actions (that are still performable) from sending you into crit. +#define STAMINA_NEAR_CRIT 130 +///crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit +#define STAMINA_CRIT 140 +///same as STAMINA_SOFTCRIT except for the more traditional health calculations +#define STAMINA_SOFTCRIT_TRADITIONAL 0 +///ditto, but for STAMINA_CRIT +#define STAMINA_CRIT_TRADITIONAL -40 #define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob @@ -111,16 +123,6 @@ #define GRAB_NECK 2 #define GRAB_KILL 3 -//slowdown when in softcrit -#define SOFTCRIT_ADD_SLOWDOWN 6 - -//Attack types for checking shields/hit reactions -#define MELEE_ATTACK 1 -#define UNARMED_ATTACK 2 -#define PROJECTILE_ATTACK 3 -#define THROWN_PROJECTILE_ATTACK 4 -#define LEAP_ATTACK 5 - //attack visual effects #define ATTACK_EFFECT_PUNCH "punch" #define ATTACK_EFFECT_KICK "kick" @@ -161,9 +163,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( /obj/item/gun))) -//Combat object defines - //Embedded objects + #define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) #define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) #define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) @@ -172,7 +173,16 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) #define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) #define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) -#define EMBEDDED_UNSAFE_REMOVAL_TIME 150 //A Time in ticks, total removal time = (this/item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) +#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle) +#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while +#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1) +#define EMBED_CHANCE_TURF_MOD -15 //You are this many percentage points less likely to embed into a turf (good for things glass shards and spears vs walls) + +#define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) +#define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1) +#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) +#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) //Gun weapon weight #define WEAPON_LIGHT 1 @@ -187,6 +197,17 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define EGUN_SELFCHARGE 1 #define EGUN_SELFCHARGE_BORG 2 +//Gun suppression +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + +//Nice shot bonus +#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle + +///Time to spend without clicking on other things required for your shots to become accurate. +#define GUN_AIMING_TIME (2 SECONDS) + //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -246,10 +267,25 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds. #define TOTAL_MASS_TOY_SWORD 1.5 -//bullet_act() return values -#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. -#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs. +//stamina cost defines. +#define STAM_COST_ATTACK_OBJ_MULT 1.2 +#define STAM_COST_ATTACK_MOB_MULT 0.8 +#define STAM_COST_BATON_MOB_MULT 1 +#define STAM_COST_NO_COMBAT_MULT 1.25 +#define STAM_COST_W_CLASS_MULT 1.25 +#define STAM_COST_THROW_MULT 2 +///Multiplier of the (STAMINA_NEAR_CRIT - user current stamina loss) : (STAMINA_NEAR_CRIT - STAMINA_SOFTCRIT) ratio used in damage penalties when stam soft-critted. +#define STAM_CRIT_ITEM_ATTACK_PENALTY 0.66 +/// changeNext_move penalty multiplier of the above. +#define STAM_CRIT_ITEM_ATTACK_DELAY 1.75 +/// Damage penalty when fighting prone. +#define LYING_DAMAGE_PENALTY 0.5 +/// Added delay when firing guns stam-softcritted. Summed with a hardset CLICK_CD_RANGE delay, similar to STAM_CRIT_DAMAGE_DELAY otherwise. +#define STAM_CRIT_GUN_DELAY 2.75 +/** + * should the current-attack-damage be lower than the item force multiplied by this value, + * a "inefficiently" prefix will be added to the message. + */ +#define FEEBLE_ATTACK_MSG_THRESHOLD 0.5 diff --git a/code/__DEFINES/combat/attack_types.dm b/code/__DEFINES/combat/attack_types.dm new file mode 100644 index 0000000000..a401c0f2ee --- /dev/null +++ b/code/__DEFINES/combat/attack_types.dm @@ -0,0 +1,32 @@ +// Attack types for check_block()/run_block(). Flags, combinable. +/// Attack was melee, whether or not armed. +#define ATTACK_TYPE_MELEE (1<<0) +/// Attack was with a gun or something that should count as a gun (but not if a gun shouldn't count for a gun, crazy right?) +#define ATTACK_TYPE_PROJECTILE (1<<1) +/// Attack was unarmed.. this usually means hand to hand combat. +#define ATTACK_TYPE_UNARMED (1<<2) +/// Attack was a thrown atom hitting the victim. +#define ATTACK_TYPE_THROWN (1<<3) +/// Attack was a bodyslam/leap/tackle. See: Xenomorph leap tackles. +#define ATTACK_TYPE_TACKLE (1<<4) +/// Attack was from a parry counterattack. Do not attempt to parry-this! +#define ATTACK_TYPE_PARRY_COUNTERATTACK (1<<5) + +// Requires for datum definitions to not error with must be a constant statement when used in lists as text associative keys. +// KEEP IN SYNC WITH ABOVE! + +#define TEXT_ATTACK_TYPE_MELEE "1" +#define TEXT_ATTACK_TYPE_PROJECTILE "2" +#define TEXT_ATTACK_TYPE_UNARMED "4" +#define TEXT_ATTACK_TYPE_THROWN "8" +#define TEXT_ATTACK_TYPE_TACKLE "16" +#define TEXT_ATTACK_TYPE_PARRY_COUNTERATTACK "32" + +GLOBAL_LIST_INIT(attack_type_names, list( + TEXT_ATTACK_TYPE_MELEE = "Melee", + TEXT_ATTACK_TYPE_PROJECTILE = "Projectile", + TEXT_ATTACK_TYPE_UNARMED = "Unarmed", + TEXT_ATTACK_TYPE_THROWN = "Thrown", + TEXT_ATTACK_TYPE_TACKLE = "Tackle", + TEXT_ATTACK_TYPE_PARRY_COUNTERATTACK = "Parry Counterattack" +)) diff --git a/code/__DEFINES/combat/block.dm b/code/__DEFINES/combat/block.dm new file mode 100644 index 0000000000..bc85947d71 --- /dev/null +++ b/code/__DEFINES/combat/block.dm @@ -0,0 +1,80 @@ +/// Check whether or not we can block, without "triggering" a block. Basically run checks without effects like depleting shields. +/// Wrapper for do_run_block(). The arguments on that means the same as for this. +#define mob_check_block(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list)\ + do_run_block(FALSE, object, damage, attack_text, attack_type, armour_penetration, attacker, check_zone(def_zone), return_list) + +/// Runs a block "sequence", effectively checking and then doing effects if necessary. +/// Wrapper for do_run_block(). The arguments on that means the same as for this. +#define mob_run_block(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list)\ + do_run_block(TRUE, object, damage, attack_text, attack_type, armour_penetration, attacker, check_zone(def_zone), return_list) + +// Don't ask why there's block_parry.dm and this. This is for the run_block() system, which is the "parent" system of the directional block and parry systems. + +/// Bitflags for check_block() and handle_block(). Meant to be combined. You can be hit and still reflect, for example, if you do not use BLOCK_SUCCESS. +/// Attack was not blocked +#define BLOCK_NONE NONE +/// Attack was blocked, do not do damage. THIS FLAG MUST BE THERE FOR DAMAGE/EFFECT PREVENTION! +#define BLOCK_SUCCESS (1<<1) + +/// The below are for "metadata" on "how" the attack was blocked. + +/// Attack was and should be redirected according to list argument REDIRECT_METHOD (NOTE: the SHOULD here is important, as it says "the thing blocking isn't handling the reflecting for you so do it yourself"!) +#define BLOCK_SHOULD_REDIRECT (1<<2) +/// Attack was redirected (whether by us or by SHOULD_REDIRECT flagging for automatic handling) +#define BLOCK_REDIRECTED (1<<3) +/// Attack was blocked by something like a shield. +#define BLOCK_PHYSICAL_EXTERNAL (1<<4) +/// Attack was blocked by something worn on you. +#define BLOCK_PHYSICAL_INTERNAL (1<<5) +/// Attack outright missed because the target dodged. Should usually be combined with redirection passthrough or something (see martial arts) +#define BLOCK_TARGET_DODGED (1<<7) +/// Meta-flag for run_block/do_run_block : By default, BLOCK_SUCCESS tells do_run_block() to assume the attack is completely blocked and not continue the block chain. If this is present, it will continue to check other items in the chain rather than stopping. +#define BLOCK_CONTINUE_CHAIN (1<<8) +/// Attack should change the amount of damage incurred. This means something calling run_block() has to handle it! +#define BLOCK_SHOULD_CHANGE_DAMAGE (1<<9) +/// Attack should scale by this percent, 0 for no block and 100 for full blocked +#define BLOCK_SHOULD_PARTIAL_MITIGATE (1<<10) + +/// For keys in associative list/block_return as we don't want to saturate our (somewhat) limited flags. +#define BLOCK_RETURN_REDIRECT_METHOD "REDIRECT_METHOD" + /// Pass through victim + #define REDIRECT_METHOD_PASSTHROUGH "passthrough" + /// Deflect at randomish angle + #define REDIRECT_METHOD_DEFLECT "deflect" + /// reverse 180 angle, basically (as opposed to "realistic" wall reflections) + #define REDIRECT_METHOD_REFLECT "reflect" + /// "do not taser the bad man with the desword" - actually aims at the firer/attacker rather than just reversing + #define REDIRECT_METHOD_RETURN_TO_SENDER "no_you" + +/// These keys are generally only applied to the list if real_attack is FALSE. Used incase we want to make "smarter" mob AI in the future or something. +/// Tells the caller how likely from 0 (none) to 100 (always) we are to reflect energy projectiles +#define BLOCK_RETURN_REFLECT_PROJECTILE_CHANCE "reflect_projectile_chance" +/// Tells the caller how likely we are to block attacks from 0 to 100 in general +#define BLOCK_RETURN_NORMAL_BLOCK_CHANCE "normal_block_chance" +/// Tells the caller about how many hits we can soak on average before our blocking fails. +#define BLOCK_RETURN_BLOCK_CAPACITY "block_capacity" +/// Tells the caller we got blocked by active directional block. +#define BLOCK_RETURN_ACTIVE_BLOCK "active_block" +/// Tells the caller our damage mitigation for their attack. +#define BLOCK_RETURN_ACTIVE_BLOCK_DAMAGE_MITIGATED "damage_mitigated" +/// For [BLOCK_CHANGE_DAMAGE]. Set damage to this. +#define BLOCK_RETURN_SET_DAMAGE_TO "set_damage_to" +/// For [BLOCK_SHOULD_PARTIAL_MITIGATE]. Percentage mitigation. +#define BLOCK_RETURN_MITIGATION_PERCENT "partial_mitigation" +/// Used internally by run_parry proc, use on an on_active_parry() proc to override parrying efficiency. +#define BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY "override_parry_efficiency" +/// Always set to 100 by run_block() if BLOCK_SUCCESS is in return value. Otherwise, defaults to mitigation percent if not set. Used by projectile/proc/on_hit(). +#define BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE "projectile_block_percentage" + +/// Default if the above isn't set in the list. +#define DEFAULT_REDIRECT_METHOD_PROJECTILE REDIRECT_METHOD_DEFLECT + +/// Block priorities. Higher means it's checked sooner. +// THESE MUST NEVER BE 0! Block code uses ! instead of isnull for the speed boost. +#define BLOCK_PRIORITY_ACTIVE_BLOCK 200 +#define BLOCK_PRIORITY_HELD_ITEM 100 +#define BLOCK_PRIORITY_CLOTHING 50 +#define BLOCK_PRIORITY_WEAR_SUIT 75 +#define BLOCK_PRIORITY_UNIFORM 25 + +#define BLOCK_PRIORITY_DEFAULT BLOCK_PRIORITY_HELD_ITEM diff --git a/code/__DEFINES/combat/block_parry.dm b/code/__DEFINES/combat/block_parry.dm new file mode 100644 index 0000000000..d48d7c8713 --- /dev/null +++ b/code/__DEFINES/combat/block_parry.dm @@ -0,0 +1,72 @@ +// We can't determine things like NORTHEAST vs NORTH *and* EAST without making our own flags :( +#define BLOCK_DIR_NORTH (1<<0) +#define BLOCK_DIR_NORTHEAST (1<<1) +#define BLOCK_DIR_NORTHWEST (1<<2) +#define BLOCK_DIR_WEST (1<<3) +#define BLOCK_DIR_EAST (1<<4) +#define BLOCK_DIR_SOUTH (1<<5) +#define BLOCK_DIR_SOUTHEAST (1<<6) +#define BLOCK_DIR_SOUTHWEST (1<<7) +#define BLOCK_DIR_ONTOP (1<<8) + +GLOBAL_LIST_INIT(dir2blockdir, list( + "[NORTH]" = BLOCK_DIR_NORTH, + "[NORTHEAST]" = BLOCK_DIR_NORTHEAST, + "[NORTHWEST]" = BLOCK_DIR_NORTHWEST, + "[WEST]" = BLOCK_DIR_WEST, + "[EAST]" = BLOCK_DIR_EAST, + "[SOUTH]" = BLOCK_DIR_SOUTH, + "[SOUTHEAST]" = BLOCK_DIR_SOUTHEAST, + "[SOUTHWEST]" = BLOCK_DIR_SOUTHWEST, + "[NONE]" = BLOCK_DIR_ONTOP + )) + +#define DIR2BLOCKDIR(d) (GLOB.dir2blockdir["[d]"]) + +GLOBAL_LIST_INIT(block_direction_names, list( + "[BLOCK_DIR_NORTH]" = "Front", + "[BLOCK_DIR_NORTHEAST]" = "Front Right", + "[BLOCK_DIR_NORTHWEST]" = "Front Left", + "[BLOCK_DIR_WEST]" = "Left", + "[BLOCK_DIR_EAST]" = "Right", + "[BLOCK_DIR_SOUTH]" = "Behind", + "[BLOCK_DIR_SOUTHEAST]" = "Behind Right", + "[BLOCK_DIR_SOUTHWEST]" = "Behind Left", + "[BLOCK_DIR_ONTOP]" = "Ontop" +)) + +/// If this is the value of active_block_starting it signals we want to interrupt the start +#define ACTIVE_BLOCK_STARTING_INTERRUPT "INTERRUPT" + +/// ""types"" of parry "items" +#define UNARMED_PARRY "unarmed" +#define MARTIAL_PARRY "martial" +#define ITEM_PARRY "item" + +/// Parry phase we're in +#define NOT_PARRYING 0 +#define PARRY_WINDUP 1 +#define PARRY_ACTIVE 2 +#define PARRY_SPINDOWN 3 + +// /datum/block_parry_data/var/parry_flags +/// Default handling for audio/visual feedback +#define PARRY_DEFAULT_HANDLE_FEEDBACK (1<<0) +/// Lock sprinting while parrying +#define PARRY_LOCK_SPRINTING (1<<1) +/// Lock attacking while parrying +#define PARRY_LOCK_ATTACKING (1<<2) + +/// Parry effects. +/// Automatically melee attacks back normally, LMB equivalent action of an harm intent attack. List association should be defaulting to 1, being the attack damage multiplier for said counterattack +#define PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN "melee_counterattack_chain" +/// List association should be TRUE. +#define PARRY_DISARM_ATTACKER "disarm_attacker" +/// List association should be duration or null for just plain knockdown. +#define PARRY_KNOCKDOWN_ATTACKER "knockdown_attacker" +/// List association should be duration. +#define PARRY_STAGGER_ATTACKER "stagger_attacker" +/// List association should be amount of time to daze attacker. +#define PARRY_DAZE_ATTACKER "daze_attacker" +/// Set to TRUE in list association to ignore adjacency checks +#define PARRY_COUNTERATTACK_IGNORE_ADJACENCY "ignore_adjacency" diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 5a2096d862..683681a9a6 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -59,8 +59,6 @@ //let's just pretend fulltile windows being children of border windows is fine #define FULLTILE_WINDOW_DIR NORTHEAST -//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc -#define MINERAL_MATERIAL_AMOUNT 2000 //The maximum size of a stack object. #define MAX_STACK_SIZE 50 //maximum amount of cable in a coil @@ -69,10 +67,16 @@ //tablecrafting defines #define CAT_NONE "" #define CAT_WEAPONRY "Weaponry" -#define CAT_WEAPON "Weapons" +#define CAT_WEAPON "Ranged Weapons" +#define CAT_MELEE "Melee Weapons" +#define CAT_OTHER "Misc" #define CAT_AMMO "Ammunition" +#define CAT_PARTS "Weapon Parts" #define CAT_ROBOT "Robots" #define CAT_MISC "Misc" +#define CAT_MISCELLANEOUS "Miscellaneous" +#define CAT_TOOL "Tools & Storage" +#define CAT_FURNITURE "Furniture" #define CAT_PRIMAL "Tribal" #define CAT_CLOTHING "Clothing" #define CAT_FOOD "Foods" @@ -102,4 +106,9 @@ #define RCD_COMPUTER 16 #define RCD_UPGRADE_FRAMES 1 -#define RCD_UPGRADE_SIMPLE_CIRCUITS 2 \ No newline at end of file +#define RCD_UPGRADE_SIMPLE_CIRCUITS 2 + +//Electrochromatic window defines. +#define NOT_ELECTROCHROMATIC 0 +#define ELECTROCHROMATIC_OFF 1 +#define ELECTROCHROMATIC_DIMMED 2 diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 3210341cc3..2dbd4874d9 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -40,6 +40,7 @@ #define CALTROP_BYPASS_SHOES 1 #define CALTROP_IGNORE_WALKERS 2 +// Spellcasting #define SPELL_SKIP_ALL_REQS (1<<0) #define SPELL_SKIP_CENTCOM (1<<1) #define SPELL_SKIP_STAT (1<<2) @@ -53,3 +54,32 @@ #define SPELL_CULT_ARMOR (1<<10) #define SPELL_WIZARD_GARB (SPELL_WIZARD_HAT|SPELL_WIZARD_ROBE) #define SPELL_CULT_GARB (SPELL_CULT_HELMET|SPELL_CULT_ARMOR) + +//// Identification //// +// /datum/component/identification/identification_flags +/// Delete on successful broad identification (so the main way we "uncover" how an object works, since this won't be on it to obfuscate it) +#define ID_COMPONENT_DEL_ON_IDENTIFY (1<<0) +/// We've already been successfully deepscanned by a deconstructive analyzer +#define ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED (1<<1) + +// /datum/component/identification/identification_effect_flags +/// Block user from getting actions if they don't know how to use this. Triggered on equip. +#define ID_COMPONENT_EFFECT_NO_ACTIONS (1<<0) + +// /datum/component/identification/identification_method_flags +/// Can be identified in a deconstructive analyzer +#define ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR (1<<0) + +// Return values for /datum/component/deitnfication/check_knowledge() +/// Has no knowledge, default +#define ID_COMPONENT_KNOWLEDGE_NONE 0 +/// Has full knowledge +#define ID_COMPONENT_KNOWLEDGE_FULL 1 + +// Combat mode flags. +/// The user wants combat mode on +#define COMBAT_MODE_TOGGLED (1<<0) +/// combat mode is active. +#define COMBAT_MODE_ACTIVE (1<<1) +/// combat mode is not active +#define COMBAT_MODE_INACTIVE (1<<2) \ No newline at end of file diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1ef8b9bb66..8a88f2dbb6 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -26,11 +26,16 @@ #define COMPONENT_ADD_TRAIT (1<<0) #define COMPONENT_REMOVE_TRAIT (1<<1) +/// fires on the target datum when an element is attached to it (/datum/element) +#define COMSIG_ELEMENT_ATTACH "element_attach" +/// fires on the target datum when an element is attached to it (/datum/element) +#define COMSIG_ELEMENT_DETACH "element_detach" + // /atom signals #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) //Positions for overrides list #define EXAMINE_POSITION_ARTICLE 1 @@ -89,7 +94,7 @@ #define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) #define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) +#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob), return flags also used by other signals. #define COMPONENT_ALLOW_EXAMINATE 1 #define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one @@ -110,7 +115,8 @@ #define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) // /atom/movable signals -#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) +#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" ///from base of atom/movable/Moved(): (/atom) + #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 #define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) #define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) #define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) @@ -119,6 +125,8 @@ #define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) #define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) #define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) + #define COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH 1 ///if true, flip if the impact will push what it hits + #define COMPONENT_MOVABLE_IMPACT_NEVERMIND 2 ///return true if you destroyed whatever it was you're impacting and there won't be anything for hitby() to run on #define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) #define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) #define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) @@ -145,9 +153,15 @@ #define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to() when it's done: (new_character, old_character) // /mob signals -#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) +#define COMSIG_MOB_CLICKED_SHIFT_ON "mob_shift_click_on" //from base of /atom/ShiftClick(): (atom/A), for return values, see COMSIG_CLICK_SHIFT +#define COMSIG_MOB_FOV_VIEW "mob_visible_atoms" //from base of /mob/fov_view(): (list/visible_atoms) +#define COMSIG_MOB_POINTED "mob_pointed" //from base of /mob/verb/pointed(): (atom/A) +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A), for return values, see COMSIG_CLICK_SHIFT + #define COMPONENT_EXAMINATE_BLIND 3 //outputs the "something is there but you can't see it" message. #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) #define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat. +#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) + #define COMSIG_MOB_CANCEL_CLICKON 1 #define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize) #define COMPONENT_BLOCK_GHOSTING (1<<0) #define COMPONENT_DO_NOT_PENALIZE_GHOSTING (1<<1) @@ -177,9 +191,19 @@ #define SPEECH_LANGUAGE 5 // #define SPEECH_IGNORE_SPAM 6 // #define SPEECH_FORCED 7 +#define COMSIG_MOB_FOV_VIEWER "mob_is_viewer" //from base of /fov_viewers(): (atom/center, depth, viewers_list) +#define COMSIG_MOB_GET_VISIBLE_MESSAGE "mob_get_visible_message" //from base of atom/visible_message(): (atom/A, msg, range, ignored_mobs) + #define COMPONENT_NO_VISIBLE_MESSAGE 1 //exactly what's said on the tin. #define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum) -#define COMSIG_MOB_SPELL_CAST_CHECK "mob_spell_cast_check" //called from base of /obj/effect/proc_holder/spell/cast_check(): (spell) +#define COMSIG_MOB_SPELL_CAN_CAST "mob_spell_can_cast" //from base of /obj/effect/proc_holder/spell/can_cast(): (spell) + +// /client signals +#define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_MOB_CLIENT_LOGOUT "mob_client_logout" //sent when a mob/logout() starts: (client) +#define COMSIG_MOB_CLIENT_MOVE "mob_client_move" //sent when client/Move() finishes with no early returns: (client, direction, n, oldloc) +#define COMSIG_MOB_CLIENT_CHANGE_VIEW "mob_client_change_view" //from base of /client/change_view(): (client, old_view, view) +#define COMSIG_MOB_CLIENT_MOUSEMOVE "mob_client_mousemove" //from base of /client/MouseMove(): (object, location, control, params) // /mob/living signals #define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) @@ -187,13 +211,15 @@ #define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) +#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) -#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) -#define COMSIG_MOB_CLIENT_MOVE "comsig_mob_client_move" //sent when client/Move() finishes with no early returns: (client, direction, n, oldloc) + +#define COMSIG_MOB_RESET_PERSPECTIVE "mob_reset_perspective" //from base of /mob/reset_perspective(): (atom/target) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) -#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced) -#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced) +// This returns flags as defined for block in __DEFINES/combat.dm! +#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone) +#define COMSIG_LIVING_GET_BLOCKING_ITEMS "get_blocking_items" //from base of mob/living/get_blocking_items(): (list/items) //ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! #define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) @@ -206,9 +232,19 @@ #define COMSIG_LIVING_STATUS_STAGGER "living_stagger" //from base of mob/living/Stagger() (amount, update, ignore) #define COMPONENT_NO_STUN 1 //For all of them +#define COMSIG_LIVING_LIFE "life_tick" //from base of mob/living/Life() (seconds, times_fired) + #define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes + #define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling + // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) #define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE) +#define COMSIG_CARBON_TACKLED "carbon_tackled" //sends from tackle.dm on tackle completion +#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip" // defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L) +#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe" // called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item) + +// /mob/living/silicon signals +#define COMSIG_ROBOT_UPDATE_ICONS "robot_update_icons" //from base of robot/update_icons(): () // /mob/living/simple_animal/hostile signals #define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" @@ -234,15 +270,36 @@ #define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) #define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params) #define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) + // Do not grant actions on equip. + #define COMPONENT_NO_GRANT_ACTIONS 1 #define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) + // relocated, tell inventory procs if those called this that the item isn't available anymore. + #define COMPONENT_DROPPED_RELOCATION 1 #define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) #define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable) +#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) +// THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm! +#define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) +#define COMSIG_ITEM_RUN_BLOCK "run_block" //from base of obj/item/run_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) +// Item mouse siganls +#define COMSIG_ITEM_MOUSE_EXIT "item_mouse_exit" //from base of obj/item/MouseExited(): (location, control, params) +#define COMSIG_ITEM_MOUSE_ENTER "item_mouse_enter" //from base of obj/item/MouseEntered(): (location, control, params) +#define COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN "deconstructor_deepscan" //Called by deconstructive analyzers deepscanning an item: (obj/machinery/rnd/destructive_analyzer/analyzer_machine, mob/user, list/information_list) +#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]: +#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]: + // Uncovered information + #define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1 + +// /obj/item/grenade signals +#define COMSIG_GRENADE_PRIME "grenade_prime" //called in /obj/item/gun/process_fire (user, target, params, zone_override) +#define COMSIG_GRENADE_ARMED "grenade_armed" //called in /obj/item/gun/process_fire (user, target, params, zone_override) // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () +#define COMSIG_SUIT_MADE_HELMET "suit_made_helmet" //from base of obj/item/clothing/suit/MakeHelmet(): (helmet) // /obj/item/implant signals #define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () @@ -267,8 +324,15 @@ #define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) // /obj/item/projectile signals (sent to the firer) +#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target) +#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/projectile/proc/fire(): () +#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles +#define COMSIG_EMBED_TRY_FORCE "item_try_embed" // sent when trying to force an embed (mainly for projectiles, only used in the embed element) +#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" ///sent to targets during the process_hit proc of projectiles + +#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init" // sent to targets during the process_hit proc of projectiles // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) @@ -282,6 +346,9 @@ #define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) #define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) +// /datum/mutation signals +#define COMSIG_HUMAN_MUTATION_LOSS "human_mutation_loss" //from datum/mutation/human/on_losing(): (datum/mutation/human/lost_mutation) + /*******Component Specific Signals*******/ //Janitor #define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. @@ -302,6 +369,14 @@ //NTnet #define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) +//Combat mode +#define COMSIG_TOGGLE_COMBAT_MODE "toggle_combat_mode" //safely toggles combat mode. +#define COMSIG_DISABLE_COMBAT_MODE "disable_combat_mode" //safely disables combat mode. +#define COMSIG_ENABLE_COMBAT_MODE "enable_combat_mode" //safely enables combat mode. +#define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of datum/component/combat_mode/enable_combat_mode() (was_forced) +#define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of datum/component/combat_mode/disable_combat_mode() (was_forced) +#define COMSIG_COMBAT_MODE_CHECK "combatmode_check" //called when checking the combat mode flags (enabled/disabled/forced) + //Nanites #define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found #define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm new file mode 100644 index 0000000000..133f9c47d3 --- /dev/null +++ b/code/__DEFINES/dye_keys.dm @@ -0,0 +1,28 @@ +#define DYE_REGISTRY_UNDER "under" +#define DYE_REGISTRY_JUMPSKIRT "jumpskirt" +#define DYE_REGISTRY_GLOVES "gloves" +#define DYE_REGISTRY_SNEAKERS "sneakers" +#define DYE_REGISTRY_FANNYPACK "fannypack" +#define DYE_REGISTRY_BEDSHEET "bedsheet" + +#define DYE_RED "red" +#define DYE_ORANGE "orange" +#define DYE_YELLOW "yellow" +#define DYE_GREEN "green" +#define DYE_BLUE "blue" +#define DYE_PURPLE "purple" +#define DYE_BLACK "black" +#define DYE_WHITE "white" +#define DYE_RAINBOW "rainbow" +#define DYE_MIME "mime" +#define DYE_COSMIC "cosmic" +#define DYE_QM "qm" +#define DYE_LAW "law" +#define DYE_CAPTAIN "captain" +#define DYE_HOP "hop" +#define DYE_HOS "hos" +#define DYE_CE "ce" +#define DYE_RD "rd" +#define DYE_CMO "cmo" +#define DYE_REDCOAT "redcoat" +#define DYE_CLOWN "clown" diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index ae5b031c8b..da8a76e71e 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -7,6 +7,7 @@ #define WAROPS_ALWAYS_ALLOWED (1<<1) #define USE_PREF_WEIGHTS (1<<2) #define FORCE_IF_WON (1<<3) +#define USE_PREV_ROUND_WEIGHTS (1<<4) #define ONLY_RULESET (1<<0) #define HIGHLANDER_RULESET (1<<1) diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm new file mode 100644 index 0000000000..746267c15b --- /dev/null +++ b/code/__DEFINES/economy.dm @@ -0,0 +1,51 @@ +#define STARTING_PAYCHECKS 5 + +#define PAYCHECK_ASSISTANT 25 +#define PAYCHECK_MINIMAL 75 +#define PAYCHECK_EASY 125 +#define PAYCHECK_MEDIUM 175 +#define PAYCHECK_HARD 200 +#define PAYCHECK_COMMAND 250 + +#define MAX_GRANT_CIV 2500 +#define MAX_GRANT_ENG 3000 +#define MAX_GRANT_SCI 5000 +#define MAX_GRANT_SECMEDSRV 3000 + +#define ACCOUNT_CIV "CIV" +#define ACCOUNT_CIV_NAME "Civil Budget" +#define ACCOUNT_ENG "ENG" +#define ACCOUNT_ENG_NAME "Engineering Budget" +#define ACCOUNT_SCI "SCI" +#define ACCOUNT_SCI_NAME "Scientific Budget" +#define ACCOUNT_MED "MED" +#define ACCOUNT_MED_NAME "Medical Budget" +#define ACCOUNT_SRV "SRV" +#define ACCOUNT_SRV_NAME "Service Budget" +#define ACCOUNT_CAR "CAR" +#define ACCOUNT_CAR_NAME "Cargo Budget" +#define ACCOUNT_SEC "SEC" +#define ACCOUNT_SEC_NAME "Defense Budget" + +#define NO_FREEBIES "commies go home" + +//ID bank account support defines. +#define ID_NO_BANK_ACCOUNT 0 +#define ID_FREE_BANK_ACCOUNT 1 +#define ID_LOCKED_BANK_ACCOUNT 2 + +//Some price defines to help standarize the intended vending value of items. Do not bother adding too many examples. +#define PRICE_FREE 0 // Sustainance/soviet vendor stuff. +#define PRICE_CHEAP_AS_FREE 10 // Cheap lighters, syringes, soft drinks etc. +#define PRICE_REALLY_CHEAP 20 // Snacks, hot drinks, tools. +#define PRICE_PRETTY_CHEAP 30 // Some snacks, beer. +#define PRICE_CHEAP 40 // Clothings. some electronics +#define PRICE_ALMOST_CHEAP 60 // Fancy clothing, cig packs, booze-o-mat, seeds, medical. +#define PRICE_BELOW_NORMAL 80 // Clothesmate and kinkmate premium stuff. +#define PRICE_NORMAL 100 // Kitchen knife, other stuff. +#define PRICE_ABOVE_NORMAL 150 // Liberation (capitalism ahoy) and donksoft vendors. +#define PRICE_ALMOST_EXPENSIVE 200 // Butcher knife, cartridges, some premium stuff. +#define PRICE_EXPENSIVE 325 // Premium stuff. +#define PRICE_ABOVE_EXPENSIVE 500 // RCD, Crew pinpointer/monitor, galoshes +#define PRICE_REALLY_EXPENSIVE 700 // More premium stuff. +#define PRICE_ALMOST_ONE_GRAND 900 // $$$ Insulated gloves, backpack water-tank spray $$$ diff --git a/code/__DEFINES/flags/do_after.dm b/code/__DEFINES/flags/do_after.dm new file mode 100644 index 0000000000..26802736cf --- /dev/null +++ b/code/__DEFINES/flags/do_after.dm @@ -0,0 +1,32 @@ +/// Requires absolute stillness from the user +#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER (1<<0) +/// Requires absolute stillness from the target +#define DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET (1<<1) +/// Requires that the user is on a turf. +#define DO_AFTER_REQUIRES_USER_ON_TURF (1<<2) +/// Requires relative stillness to our target via dx and dy coordinate difference but only if both are spacedrifting. Specify DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY to say otherwise. +#define DO_AFTER_DISALLOW_MOVING_RELATIVE (1<<3) +/// Breaks if active hand item changes. Requires a tool be specified, otherwise defaults to active item +#define DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE (1<<4) +/// Breaks if the user has no free hands. If a tool is specified, allows that as well. +#define DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL (1<<5) +/// Do not display progressbar. +#define DO_AFTER_NO_PROGRESSBAR (1<<6) +/// Do not check do_after_coefficient() +#define DO_AFTER_NO_COEFFICIENT (1<<7) +/// For relative stillness, allow non spacedrift relative movement +#define DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY (1<<8) + +/// Ignores checks. +#define DO_AFTER_PROCEED "PROCEED" +/// Uses all other checks +#define DO_AFTER_CONTINUE "CONTINUE" +/// Breaks +#define DO_AFTER_STOP "STOP" + +/// Stage - initiating a do_after +#define DO_AFTER_STARTING 1 +/// Stage - main loop of a do_after +#define DO_AFTER_PROGRESSING 2 +/// Stage - Last check of a do_after +#define DO_AFTER_FINISHING 3 diff --git a/code/__DEFINES/flags/shields.dm b/code/__DEFINES/flags/shields.dm new file mode 100644 index 0000000000..f6de4226e8 --- /dev/null +++ b/code/__DEFINES/flags/shields.dm @@ -0,0 +1,18 @@ +/// Transparent, let beams pass +#define SHIELD_TRANSPARENT (1<<0) +/// Can shield bash +#define SHIELD_CAN_BASH (1<<1) +/// Shield bash knockdown on wall hit +#define SHIELD_BASH_WALL_KNOCKDOWN (1<<2) +/// Shield bash always knockdown +#define SHIELD_BASH_ALWAYS_KNOCKDOWN (1<<3) +/// Shield bash disarm on wall hit +#define SHIELD_BASH_WALL_DISARM (1<<4) +/// Shield bash always disarm +#define SHIELD_BASH_ALWAYS_DISARM (1<<5) +/// You can shieldbash target someone on the ground for ground slam +#define SHIELD_BASH_GROUND_SLAM (1<<6) +/// Shield bashing someone on the ground will disarm +#define SHIELD_BASH_GROUND_SLAM_DISARM (1<<7) + +#define SHIELD_FLAGS_DEFAULT (SHIELD_CAN_BASH | SHIELD_BASH_WALL_KNOCKDOWN | SHIELD_BASH_WALL_DISARM | SHIELD_BASH_GROUND_SLAM) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 72e6a12f84..a347fd7327 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -18,3 +18,4 @@ #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 #define FOOD_AMAZING 5 +#define RACE_DRINK 6 \ No newline at end of file diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 16d763606b..5acda2274c 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -24,6 +24,15 @@ #define FOOTPRINT_SNAKE "snake" #define FOOTPRINT_DRAG "drag" +//footstep mob defines +#define FOOTSTEP_MOB_CLAW 1 +#define FOOTSTEP_MOB_BAREFOOT 2 +#define FOOTSTEP_MOB_HEAVY 3 +#define FOOTSTEP_MOB_SHOE 4 +#define FOOTSTEP_MOB_HUMAN 5 //Warning: Only works on /mob/living/carbon/human +#define FOOTSTEP_MOB_SLIME 6 +#define FOOTSTEP_MOB_CRAWL 7 + /* id = list( diff --git a/code/__DEFINES/instruments.dm b/code/__DEFINES/instruments.dm new file mode 100644 index 0000000000..3c414f87f4 --- /dev/null +++ b/code/__DEFINES/instruments.dm @@ -0,0 +1,29 @@ +#define INSTRUMENT_MIN_OCTAVE 1 +#define INSTRUMENT_MAX_OCTAVE 9 +#define INSTRUMENT_MIN_KEY 0 +#define INSTRUMENT_MAX_KEY 127 + +/// Max number of playing notes per instrument. +#define CHANNELS_PER_INSTRUMENT 128 + +/// Distance multiplier that makes us not be impacted by 3d sound as much. This is a multiplier so lower it is the closer we will pretend to be to people. +#define INSTRUMENT_DISTANCE_FALLOFF_BUFF 0.2 +/// How many tiles instruments have no falloff for +#define INSTRUMENT_DISTANCE_NO_FALLOFF 3 + +/// Maximum length a note should ever go for +#define INSTRUMENT_MAX_TOTAL_SUSTAIN (5 SECONDS) + +/// These are per decisecond. +#define INSTRUMENT_EXP_FALLOFF_MIN 1.025 //100/(1.025^50) calculated for [INSTRUMENT_MIN_SUSTAIN_DROPOFF] to be 30. +#define INSTRUMENT_EXP_FALLOFF_MAX 10 + +/// Minimum volume for when the sound is considered dead. +#define INSTRUMENT_MIN_SUSTAIN_DROPOFF 0 + +#define SUSTAIN_LINEAR 1 +#define SUSTAIN_EXPONENTIAL 2 + +// /datum/instrument instrument_flags +#define INSTRUMENT_LEGACY (1<<0) //Legacy instrument. Implies INSTRUMENT_DO_NOT_AUTOSAMPLE +#define INSTRUMENT_DO_NOT_AUTOSAMPLE (1<<1) //Do not automatically sample diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f4954f8f05..649e0a029b 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -1,13 +1,5 @@ /*ALL DEFINES RELATED TO INVENTORY OBJECTS, MANAGEMENT, ETC, GO HERE*/ -//ITEM INVENTORY WEIGHT, FOR w_class -#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money -#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device -#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets -#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits -#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh -#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh - //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc #define INVENTORY_DEPTH 3 @@ -140,13 +132,17 @@ #define FEMALE_UNIFORM_FULL 1 #define FEMALE_UNIFORM_TOP 2 -//flags for outfits that have mutantrace variants: These are hard sprited too. +//flags for outfits that have mutant race variants: Most of these require additional sprites to work. #define STYLE_DIGITIGRADE (1<<0) //jumpsuits, suits and shoes #define STYLE_MUZZLE (1<<1) //hats or masks #define STYLE_SNEK_TAURIC (1<<2) //taur-friendly suits #define STYLE_PAW_TAURIC (1<<3) #define STYLE_HOOF_TAURIC (1<<4) #define STYLE_ALL_TAURIC (STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC|STYLE_HOOF_TAURIC) +#define STYLE_NO_ANTHRO_ICON (1<<5) //When digis fit the default sprite fine and need no copypasted states. This is the case of skirts and winter coats, for example. +#define USE_SNEK_CLIP_MASK (1<<6) +#define USE_QUADRUPED_CLIP_MASK (1<<7) +#define USE_TAUR_CLIP_MASK (USE_SNEK_CLIP_MASK|USE_QUADRUPED_CLIP_MASK) //digitigrade legs settings. #define NOT_DIGITIGRADE 0 @@ -155,7 +151,7 @@ //flags for covering body parts #define GLASSESCOVERSEYES (1<<0) -#define MASKCOVERSEYES (1<<1) // get rid of some of the other retardation in these flags +#define MASKCOVERSEYES (1<<1) // get rid of some of the other stupidity in these flags #define HEADCOVERSEYES (1<<2) // feel free to realloc these numbers for other purposes #define MASKCOVERSMOUTH (1<<3) // on other items, these are just for mask/head #define HEADCOVERSMOUTH (1<<4) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55bfcaff79..de9ada7560 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,3 +1,6 @@ +/// Checks if something is a BYOND object datatype rather than a primitive, or whatever's closest to one. +#define is_object_datatype(object) (object && !ispath(object) && !istext(object) && !isnum(object)) + // simple is_type and similar inline helpers #define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z)) @@ -67,9 +70,15 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) +#define isangel(A) (is_species(A, /datum/species/angel)) +#define isvampire(A) (is_species(A, /datum/species/vampire)) +#define ismush(A) (is_species(A, /datum/species/mush)) +#define isshadow(A) (is_species(A, /datum/species/shadow)) +#define isskeleton(A) (is_species(A, /datum/species/skeleton)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) +#define issynthliz(A) (is_species(A, /datum/species/synthliz)) #define ismammal(A) (is_species(A, /datum/species/mammal)) #define isavian(A) (is_species(A, /datum/species/avian)) #define isaquatic(A) (is_species(A, /datum/species/aquatic)) @@ -142,47 +151,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) -GLOBAL_LIST_INIT(shoefootmob, typecacheof(list( - /mob/living/carbon/human/, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/cat_butcherer, - /mob/living/simple_animal/hostile/faithless, - /mob/living/simple_animal/hostile/nanotrasen, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/wizard, - /mob/living/simple_animal/hostile/zombie, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/retaliate/spaceman, - /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/carbon/true_devil, - ))) - -GLOBAL_LIST_INIT(clawfootmob, typecacheof(list( - /mob/living/carbon/alien/humanoid, - /mob/living/simple_animal/hostile/alien, - /mob/living/simple_animal/pet/cat, - /mob/living/simple_animal/pet/dog, - /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/jungle/mega_arachnid - ))) - -GLOBAL_LIST_INIT(barefootmob, typecacheof(list( - /mob/living/carbon/monkey, - /mob/living/simple_animal/pet/penguin, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/hostile/jungle/mook - ))) - -GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( - /mob/living/simple_animal/hostile/megafauna, - /mob/living/simple_animal/hostile/jungle/leaper - ))) - //Misc mobs #define isobserver(A) (istype(A, /mob/dead/observer)) @@ -212,6 +180,12 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define isitem(A) (istype(A, /obj/item)) +#define isgrenade(A) (istype(A, /obj/item/grenade)) + +#define islandmine(A) (istype(A, /obj/effect/mine)) + +#define isammocasing(A) (istype(A, /obj/item/ammo_casing)) + #define isidcard(I) (istype(I, /obj/item/card/id)) #define isstructure(A) (istype(A, /obj/structure)) @@ -240,6 +214,8 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define isgun(A) (istype(A, /obj/item/gun)) +#define isfood(A) (istype(A, /obj/item/reagent_containers/food)) + //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) @@ -263,4 +239,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) -#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) \ No newline at end of file +#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index dc2ac19e65..add4a8e277 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -3,5 +3,24 @@ #define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4 #define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 -#define LANGUAGE_KNOWN "language_known" -#define LANGUAGE_SHADOWED "language_shadowed" +// LANGUAGE SOURCE DEFINES +#define LANGUAGE_ALL "all" // For use in full removal only. +#define LANGUAGE_ATOM "atom" +#define LANGUAGE_MIND "mind" + +#define LANGUAGE_ABSORB "absorb" +#define LANGUAGE_APHASIA "aphasia" +#define LANGUAGE_BLOODSUCKER "bloodsucker" +#define LANGUAGE_CLOCKIE "clockie" +#define LANGUAGE_CULTIST "cultist" +#define LANGUAGE_CURATOR "curator" +#define LANGUAGE_DEVIL "devil" +#define LANGUAGE_GLAND "gland" +#define LANGUAGE_HAT "hat" +#define LANGUAGE_HIGH "high" +#define LANGUAGE_MALF "malf" +#define LANGUAGE_MASTER "master" +#define LANGUAGE_SOFTWARE "software" +#define LANGUAGE_STONER "stoner" +#define LANGUAGE_VASSAL "vassal" +#define LANGUAGE_VOICECHANGE "voicechange" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers_planes.dm similarity index 66% rename from code/__DEFINES/layers.dm rename to code/__DEFINES/layers_planes.dm index 35947b320e..6f33bb1a0e 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers_planes.dm @@ -1,6 +1,8 @@ //Defines for atom layers and planes //KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE +#define PLANE_VOID -100 + #define CLICKCATCHER_PLANE -99 #define PLANE_SPACE -95 @@ -8,13 +10,39 @@ #define PLANE_SPACE_PARALLAX -90 #define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX" -#define FLOOR_PLANE -2 +#define OPENSPACE_LAYER 17 //Openspace layer over all +#define OPENSPACE_PLANE -10 //Openspace plane below all turfs +#define OPENSPACE_BACKDROP_PLANE -9 //Black square just over openspace plane to guaranteed cover all in openspace turf + +#define FLOOR_PLANE -8 #define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE" -#define GAME_PLANE -1 + +#define WALL_PLANE -7 +#define WALL_PLANE_RENDER_TARGET "WALL_PLANE" + +#define ABOVE_WALL_PLANE -6 +#define ABOVE_WALL_PLANE_RENDER_TARGET "ABOVE_WALL_PLANE" + +#define FIELD_OF_VISION_BLOCKER_PLANE -5 +#define FIELD_OF_VISION_BLOCKER_RENDER_TARGET "*FIELD_OF_VISION_BLOCKER_PLANE" + +#define FIELD_OF_VISION_PLANE -4 +#define FIELD_OF_VISION_RENDER_TARGET "*FIELD_OF_VISION_PLANE" +#define FIELD_OF_VISION_LAYER 17 //used to place the visual (not the mask) shadow cone above any other floor plane stuff. + +#define GAME_PLANE -3 #define GAME_PLANE_RENDER_TARGET "GAME_PLANE" + +#define FIELD_OF_VISION_VISUAL_PLANE -2 //Yea, FoV does require quite a few planes to work with 513 filters to a decent degree. +#define FIELD_OF_VISION_VISUAL_RENDER_TARGET "FIELD_OF_VISION_VISUAL_PLANE" + +#define CHAT_PLANE -1 //We don't want heard messages to be hidden by FoV. +#define CHAT_LAYER 12.1 //Legacy, it doesn't matter that much because we are displayed above the game plane anyway. + #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" +///Layers most often used by atoms of plane lower than GAME_PLANE #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 @@ -34,11 +62,12 @@ #define GAS_PIPE_VISIBLE_LAYER 2.47 #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 + #define LOW_OBJ_LAYER 2.5 #define LOW_SIGIL_LAYER 2.52 #define SIGIL_LAYER 2.54 #define HIGH_SIGIL_LAYER 2.56 - +///Layers most often used by atoms of plane equal or higher than GAME_PLANE #define BELOW_OPEN_DOOR_LAYER 2.6 #define BLASTDOOR_LAYER 2.65 #define OPEN_DOOR_LAYER 2.7 @@ -61,7 +90,9 @@ #define BELOW_MOB_LAYER 3.7 #define LYING_MOB_LAYER 3.8 +#define MOB_LOWER_LAYER 3.95 //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define +#define MOB_UPPER_LAYER 4.05 #define ABOVE_MOB_LAYER 4.1 #define WALL_OBJ_LAYER 4.25 #define EDGED_TURF_LAYER 4.3 @@ -72,8 +103,9 @@ #define SPACEVINE_LAYER 4.8 #define SPACEVINE_MOB_LAYER 4.9 //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define -#define GASFIRE_LAYER 5.05 -#define RIPPLE_LAYER 5.1 +#define ABOVE_FLY_LAYER 5.1 +#define GASFIRE_LAYER 5.2 +#define RIPPLE_LAYER 5.3 #define GHOST_LAYER 6 #define LOW_LANDMARK_LAYER 9 @@ -103,10 +135,6 @@ #define ABOVE_LIGHTING_LAYER 16 #define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE" -#define FLOOR_OPENSPACE_PLANE 17 -#define OPENSPACE_LAYER 17 -#define OPENSPACE_RENDER_TARGET "OPENSPACE_PLANE" - #define BYOND_LIGHTING_PLANE 18 #define BYOND_LIGHTING_LAYER 18 #define BYOND_LIGHTING_RENDER_TARGET "BYOND_LIGHTING_PLANE" @@ -129,11 +157,21 @@ #define HUD_PLANE 21 #define HUD_LAYER 21 #define HUD_RENDER_TARGET "HUD_PLANE" -#define ABOVE_HUD_PLANE 22 -#define ABOVE_HUD_LAYER 22 + +#define VOLUMETRIC_STORAGE_BOX_PLANE 22 +#define VOLUMETRIC_STORAGE_BOX_LAYER 22 +#define VOLUMETRIC_STORAGE_BOX_RENDER_TARGET "VOLUME_STORAGE_BOX_PLANE" + +#define VOLUMETRIC_STORAGE_ITEM_PLANE 23 +#define VOLUMETRIC_STORAGE_ITEM_LAYER 23 +#define VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER 25 +#define VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE 25 +#define VOLUMETRIC_STORAGE_ITEM_RENDER_TARGET "VOLUME_STORAGE_ITEM_PLANE" + +#define ABOVE_HUD_PLANE 30 +#define ABOVE_HUD_LAYER 30 #define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" -#define SPLASHSCREEN_LAYER 23 -#define SPLASHSCREEN_PLANE 23 +#define SPLASHSCREEN_LAYER 90 +#define SPLASHSCREEN_PLANE 90 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" - diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 5ba696b274..3fba27ba52 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -88,3 +88,28 @@ #define EMISSIVE_BLOCK_GENERIC 1 /// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. #define EMISSIVE_BLOCK_UNIQUE 2 + + +/// Returns the red part of a #RRGGBB hex sequence as number +#define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) + +/// Returns the green part of a #RRGGBB hex sequence as number +#define GETGREENPART(hexa) hex2num(copytext(hexa, 4, 6)) + +/// Returns the blue part of a #RRGGBB hex sequence as number +#define GETBLUEPART(hexa) hex2num(copytext(hexa, 6, 8)) + +/// Parse the hexadecimal color into lumcounts of each perspective. +#define PARSE_LIGHT_COLOR(source) \ +do { \ + if (source.light_color) { \ + var/__light_color = source.light_color; \ + source.lum_r = GETREDPART(__light_color) / 255; \ + source.lum_g = GETGREENPART(__light_color) / 255; \ + source.lum_b = GETBLUEPART(__light_color) / 255; \ + } else { \ + source.lum_r = 1; \ + source.lum_g = 1; \ + source.lum_b = 1; \ + }; \ +} while (FALSE) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 9693d46d00..7e1559cede 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -18,6 +18,7 @@ #define INVESTIGATE_CIRCUIT "circuit" #define INVESTIGATE_FERMICHEM "fermichem" #define INVESTIGATE_RCD "rcd" +#define INVESTIGATE_CRYOGENICS "cryogenics" // Logging types for log_message() #define LOG_ATTACK (1 << 0) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index eee0676dec..5a26feb624 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -22,14 +22,14 @@ //used in design to specify which machine can build it #define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals. -#define PROTOLATHE (1<<1) //New stuff. Uses glass/metal/chemicals -#define AUTOLATHE (1<<2) //Uses glass/metal only. -#define CRAFTLATHE (1<<3) //Uses fuck if I know. For use eventually. -#define MECHFAB (1<<4) //Remember, objects utilising this flag should have construction_time and construction_cost vars. -#define BIOGENERATOR (1<<5) //Uses biomass -#define LIMBGROWER (1<<6) //Uses synthetic flesh -#define SMELTER (1<<7) //uses various minerals -#define AUTOYLATHE (1<<8) // CITADEL ADD +#define PROTOLATHE (1<<1) //New stuff. Uses materials/chemicals +#define AUTOLATHE (1<<2) //Uses materials only. +#define TOYLATHE (1<<3) //Glass/metal/plastic. Meant for toys. +#define NO_PUBLIC_LATHE (1<<4) //prevents the design from being auto-unlocked by public auto(y)lathes. +#define MECHFAB (1<<5) //Remember, objects utilising this flag should have construction_time and construction_cost vars. +#define BIOGENERATOR (1<<6) //Uses biomass +#define LIMBGROWER (1<<7) //Uses synthetic flesh +#define SMELTER (1<<8) //uses various minerals #define NANITE_COMPILER (1<<9) //Prints nanite disks #define AUTOBOTTLER (1<<10) //Uses booze, for printing //Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. diff --git a/code/__DEFINES/mapping/maploader.dm b/code/__DEFINES/mapping/maploader.dm new file mode 100644 index 0000000000..e225e68867 --- /dev/null +++ b/code/__DEFINES/mapping/maploader.dm @@ -0,0 +1,3 @@ +//map template annihilate_bounds +#define MAP_TEMPLATE_ANNIHILATE_PRELOAD 1 //annihilate bounds before starting loading +#define MAP_TEMPLATE_ANNIHILATE_LOADING 2 //"sweeping" delete during loading diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 73e900226e..c5c2dd58c2 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -35,9 +35,18 @@ require only minor tweaks. #define ZTRAIT_REEBE "Reebe" #define ZTRAIT_RESERVED "Transit/Reserved" #define ZTRAIT_AWAY "Away Mission" +#define ZTRAIT_VR "Virtual Reality" #define ZTRAIT_SPACE_RUINS "Space Ruins" #define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_ICE_RUINS "Ice Ruins" +#define ZTRAIT_ICE_RUINS_UNDERGROUND "Ice Ruins Underground" #define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. +#define ZTRAIT_VIRTUAL_REALITY "Virtual Reality" + +//boolean - weather types that occur on the level +#define ZTRAIT_SNOWSTORM "Weather_Snowstorm" +#define ZTRAIT_ASHSTORM "Weather_Ashstorm" +#define ZTRAIT_ACIDRAIN "Weather_Acidrain" // number - bombcap is multiplied by this before being applied to bombs #define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier" @@ -67,10 +76,12 @@ require only minor tweaks. #define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) #define ZTRAITS_LAVALAND list(\ ZTRAIT_MINING = TRUE, \ + ZTRAIT_ASHSTORM = TRUE, \ ZTRAIT_LAVA_RUINS = TRUE, \ ZTRAIT_BOMBCAP_MULTIPLIER = 5, \ ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface) #define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5) +#define ZTRAITS_VR list(ZTRAIT_VIRTUAL_REALITY = TRUE, ZTRAIT_AWAY = TRUE) #define DL_NAME "name" #define DL_TRAITS "traits" @@ -101,4 +112,8 @@ require only minor tweaks. #define PLACE_BELOW "below" //On z levl below - centered on same tile #define PLACE_ISOLATED "isolated" //On isolated ruin z level //Map type stuff. -#define MAP_TYPE_STATION "station" \ No newline at end of file +#define MAP_TYPE_STATION "station" + +//Random z-levels name defines. +#define AWAY_MISSION_NAME "Away Mission" +#define VIRT_REALITY_NAME "Virtual Reality" diff --git a/code/__DEFINES/material/worth.dm b/code/__DEFINES/material/worth.dm new file mode 100644 index 0000000000..db79d7317b --- /dev/null +++ b/code/__DEFINES/material/worth.dm @@ -0,0 +1,2 @@ +/// cm3 of material matter per sheet +#define MINERAL_MATERIAL_AMOUNT 2000 diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 89553d9c6c..e2ae22345f 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -7,5 +7,5 @@ /// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes. #define MATERIAL_COLOR (1<<0) #define MATERIAL_ADD_PREFIX (1<<1) -#define MATERIAL_NO_EFFECTS (1<<2) +#define MATERIAL_EFFECTS (1<<2) #define MATERIAL_AFFECT_STATISTICS (1<<3) \ No newline at end of file diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index f37efd694c..24726b8058 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -17,6 +17,8 @@ #define PERCENT(val) (round((val)*100, 0.1)) +#define CLAMP01(x) clamp(x, 0, 1) + //time of day but automatically adjusts to the server going into the next day within the same round. //for when you need a reliable time number that doesn't depend on byond time. #define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) @@ -30,13 +32,13 @@ #define FLOOR(x, y) ( round((x) / (y)) * (y) ) // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive -#define WRAP(val, min, max) CLAMP(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max-1) +#define WRAP(val, min, max) clamp(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max-1) // Real modulus that handles decimals #define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) // Cotangent -#define COT(x) (1 / TAN(x)) +#define COT(x) (1 / tan(x)) // Secant #define SEC(x) (1 / cos(x)) @@ -169,8 +171,8 @@ while(pixel_y < -16) pixel_y += 32 new_y-- - new_x = CLAMP(new_x, 0, world.maxx) - new_y = CLAMP(new_y, 0, world.maxy) + new_x = clamp(new_x, 0, world.maxx) + new_y = clamp(new_y, 0, world.maxy) return locate(new_x, new_y, starting.z) // Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles @@ -195,7 +197,7 @@ #define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) ) -#define LORENTZ_DISTRIBUTION(x, s) ( s*TAN(TODEGREES(PI*(rand()-0.5))) + x ) +#define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x ) #define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) #define RULE_OF_THREE(a, b, x) ((a*x)/b) @@ -207,3 +209,5 @@ /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) + +#define TILES_TO_PIXELS(tiles) (tiles * PIXELS) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9efffefce5..a39ebf36ba 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -9,6 +9,9 @@ #define TEXT_EAST "[EAST]" #define TEXT_WEST "[WEST]" +/// world.icon_size +#define PIXELS 32 + //These get to go at the top, because they're special //You can use these defines to get the typepath of the currently running proc/verb (yes procs + verbs are objects) /* eg: @@ -27,14 +30,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS -#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc -#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer -#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts? -#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. -#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) +#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc +#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts? +#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be. +#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup) +#define BODY_ADJ_UPPER_LAYER 25 #define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #define DAMAGE_LAYER 23 //damage indicators (cuts and burns) #define UNIFORM_LAYER 22 @@ -43,15 +47,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define SHOES_LAYER 19 #define GLOVES_LAYER 18 #define EARS_LAYER 17 -#define BODY_TAUR_LAYER 16 -#define SUIT_LAYER 15 -#define GENITALS_EXPOSED_LAYER 14 -#define GLASSES_LAYER 13 -#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 11 -#define NECK_LAYER 10 -#define BACK_LAYER 9 -#define HAIR_LAYER 8 //TODO: make part of head layer? +#define SUIT_LAYER 16 +#define GENITALS_EXPOSED_LAYER 15 +#define GLASSES_LAYER 14 +#define BELT_LAYER 13 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 12 +#define NECK_LAYER 11 +#define BACK_LAYER 10 +#define HAIR_LAYER 9 //TODO: make part of head layer? +#define HORNS_LAYER 8 #define FACEMASK_LAYER 7 #define HEAD_LAYER 6 #define HANDCUFF_LAYER 5 @@ -59,7 +63,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" @@ -71,14 +75,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define ABOVE_SHOES_LAYER (SHOES_LAYER-1) #define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1) - -//Security levels -#define SEC_LEVEL_GREEN 0 -#define SEC_LEVEL_BLUE 1 -#define SEC_LEVEL_AMBER 2 -#define SEC_LEVEL_RED 3 -#define SEC_LEVEL_DELTA 4 - //some arbitrary defines to be used by self-pruning global lists. (see master_controller) #define PROCESS_KILL 26 //Used to trigger removal from a processing list @@ -465,13 +461,13 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") // list of all null rod weapons -#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/twohanded/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/melee/baseball_bat/chaplain +#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/twohanded/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/clothing/gloves/fingerless/pugilist/chaplain, /obj/item/melee/baseball_bat/chaplain // Used by PDA and cartridge code to reduce repetitiveness of spritesheets #define PDAIMG(what) {""} //Filters -#define AMBIENT_OCCLUSION list("type"="drop_shadow","x"=0,"y"=-2,"size"=4,"color"="#04080FAA") +#define AMBIENT_OCCLUSION(_size, _color) list("type"="drop_shadow","x"=0,"y"=-2,"size"=_size,"color"=_color) #define EYE_BLUR(size) list("type"="blur", "size"=size) #define GRAVITY_MOTION_BLUR list("type"="motion_blur","x"=0,"y"=0) @@ -523,3 +519,17 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define NIGHTSHIFT_AREA_NONE 4 //default/highest. #define UNTIL(X) while(!(X)) stoplag() + + +//Scavenging element defines for special loot "events". +#define SCAVENGING_FOUND_NOTHING "found_nothing" +#define SCAVENGING_SPAWN_MOUSE "spawn_mouse" +#define SCAVENGING_SPAWN_MICE "spawn_mice" +#define SCAVENGING_SPAWN_TOM "spawn_tom_the_mouse" + +//Scavenging element defines for ckey/mind restrictions. +#define NO_LOOT_RESTRICTION 0 +#define LOOT_RESTRICTION_MIND 1 +#define LOOT_RESTRICTION_CKEY 2 +#define LOOT_RESTRICTION_MIND_PILE 3 //limited to the current pile. +#define LOOT_RESTRICTION_CKEY_PILE 4 //Idem diff --git a/code/__DEFINES/misc/return_values.dm b/code/__DEFINES/misc/return_values.dm new file mode 100644 index 0000000000..d55f603de9 --- /dev/null +++ b/code/__DEFINES/misc/return_values.dm @@ -0,0 +1,3 @@ +// obj/item/dropped +/// dropped() relocated this item, return FALSE for doUnEquip. +#define ITEM_RELOCATED_BY_DROPPED "relocated_by_dropped" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b4735cd0d8..8d8b9f47ae 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -36,16 +36,16 @@ #define BLOODCRAWL_EAT 2 //Mob bio-types flags -#define MOB_ORGANIC 1 << 0 -#define MOB_MINERAL 1 << 1 -#define MOB_ROBOTIC 1 << 2 -#define MOB_UNDEAD 1 << 3 -#define MOB_HUMANOID 1 << 4 -#define MOB_BUG 1 << 5 -#define MOB_BEAST 1 << 6 -#define MOB_EPIC 1 << 7 //megafauna -#define MOB_REPTILE 1 << 8 -#define MOB_SPIRIT 1 << 9 +#define MOB_ORGANIC (1 << 0) +#define MOB_MINERAL (1 << 1) +#define MOB_ROBOTIC (1 << 2) +#define MOB_UNDEAD (1 << 3) +#define MOB_HUMANOID (1 << 4) +#define MOB_BUG (1 << 5) +#define MOB_BEAST (1 << 6) +#define MOB_EPIC (1 << 7) //megafauna +#define MOB_REPTILE (1 << 8) +#define MOB_SPIRIT (1 << 9) //Organ defines for carbon mobs #define ORGAN_ORGANIC 1 @@ -126,6 +126,13 @@ #define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 +//Threshold levels for beauty for humans +#define BEAUTY_LEVEL_HORRID -66 +#define BEAUTY_LEVEL_BAD -33 +#define BEAUTY_LEVEL_DECENT 33 +#define BEAUTY_LEVEL_GOOD 66 +#define BEAUTY_LEVEL_GREAT 100 + //Moods levels for humans #define MOOD_LEVEL_HAPPY4 15 #define MOOD_LEVEL_HAPPY3 10 @@ -138,6 +145,7 @@ #define MOOD_LEVEL_SAD4 -25 //Sanity levels for humans +#define SANITY_AMAZING 150 #define SANITY_GREAT 125 #define SANITY_NEUTRAL 100 #define SANITY_DISTURBED 75 @@ -265,6 +273,7 @@ #define WIZARD_AGE_MIN 30 //youngest a wizard can be #define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be #define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up +#define SHOES_SPEED_SLIGHT SHOES_SLOWDOWN - 1 // slightest speed boost to movement #define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets #define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you @@ -288,6 +297,15 @@ #define HUMAN_FIRE_STACK_ICON_NUM 3 -#define PULL_PRONE_SLOWDOWN 0.6 -#define FIREMAN_CARRY_SLOWDOWN 0 -#define PIGGYBACK_CARRY_SLOWDOWN 1 +#define TYPING_INDICATOR_TIMEOUT 5 MINUTES + +#define GRAB_PIXEL_SHIFT_PASSIVE 6 +#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 +#define GRAB_PIXEL_SHIFT_NECK 16 + +#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; + +/// Field of vision defines. +#define FOV_90_DEGREES 90 +#define FOV_180_DEGREES 180 +#define FOV_270_DEGREES 270 diff --git a/code/__DEFINES/mobs/slowdowns.dm b/code/__DEFINES/mobs/slowdowns.dm new file mode 100644 index 0000000000..2d858e9509 --- /dev/null +++ b/code/__DEFINES/mobs/slowdowns.dm @@ -0,0 +1,10 @@ +/// How much someone is slowed from pulling a prone human +#define PULL_PRONE_SLOWDOWN 0.6 +/// How much someone is slowed from fireman carrying a human +#define FIREMAN_CARRY_SLOWDOWN 0 +/// How much someone is slowed by piggybacking a human +#define PIGGYBACK_CARRY_SLOWDOWN 1 +/// slowdown when in softcrit. Note that crawling slowdown will also apply at the same time! +#define SOFTCRIT_ADD_SLOWDOWN 2 +/// slowdown when crawling +#define CRAWLING_ADD_SLOWDOWN 4 diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 76c326cec0..699f39e79f 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -1,12 +1,3 @@ -#define MOVESPEED_DATA_INDEX_PRIORITY 1 -#define MOVESPEED_DATA_INDEX_FLAGS 2 -#define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3 -#define MOVESPEED_DATA_INDEX_MOVETYPE 4 -#define MOVESPEED_DATA_INDEX_BL_MOVETYPE 5 -#define MOVESPEED_DATA_INDEX_CONFLICT 6 - -#define MOVESPEED_DATA_INDEX_MAX 6 - //flags #define IGNORE_NOSLOW (1 << 0) @@ -15,6 +6,7 @@ #define MOVE_CONFLICT_JETPACK "JETPACK" //ids +#define MOVESPEED_ID_SANITY "mood_sanity" #define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN" #define MOVESPEED_ID_MOB_GRAB_STATE "MOB_GRAB_STATE" @@ -55,8 +47,6 @@ #define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER" -#define MOVESPEED_ID_SANITY "MOOD_SANITY" - #define MOVESPEED_ID_SPECIES "SPECIES_SPEED_MOD" #define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG" @@ -78,4 +68,8 @@ #define MOVESPEED_ID_COLD "COLD" #define MOVESPEED_ID_HUNGRY "HUNGRY" #define MOVESPEED_ID_DAMAGE_SLOWDOWN "DAMAGE" -#define MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING "FLYING" \ No newline at end of file +#define MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING "FLYING" + +#define MOVESPEED_ID_ACTIVE_BLOCK "ACTIVE_BLOCK" + +#define MOVESPEED_ID_MOB_WALK_RUN "mob_walk_run" diff --git a/code/__DEFINES/nanites.dm b/code/__DEFINES/nanites.dm index ed15e972ab..05c3501609 100644 --- a/code/__DEFINES/nanites.dm +++ b/code/__DEFINES/nanites.dm @@ -12,6 +12,10 @@ #define NANITE_CLOUD_DISABLE 2 #define NANITE_CLOUD_ENABLE 3 +///Nanite Protocol types +#define NANITE_PROTOCOL_REPLICATION "nanite_replication" +#define NANITE_PROTOCOL_STORAGE "nanite_storage" + ///Nanite extra settings types: used to help uis know what type an extra setting is #define NESTYPE_TEXT "text" #define NESTYPE_NUMBER "number" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm deleted file mode 100644 index d78de86d25..0000000000 --- a/code/__DEFINES/obj_flags.dm +++ /dev/null @@ -1,54 +0,0 @@ -// Flags for the obj_flags var on /obj - - -#define EMAGGED (1<<0) -#define IN_USE (1<<1) //If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! -#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? -#define BEING_SHOCKED (1<<3) //Whether this thing is currently (already) being shocked by a tesla -#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no -#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? -#define UNIQUE_RENAME (1<<6) //can you customize the description/name of the thing? -#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. -#define FROZEN (1<<8) -#define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. -#define BLOCK_Z_FALL (1<<10) - -// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support - -// Flags for the item_flags var on /obj/item - -#define BEING_REMOVED (1<<0) -#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips -#define FORCE_STRING_OVERRIDE (1<<2) //used for tooltips -#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. -#define SLOWS_WHILE_IN_HAND (1<<4) -#define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. -#define DROPDEL (1<<6) //When dropped, it calls qdel on itself -#define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() -#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff -#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) -#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) -#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. -#define NO_ATTACK_CHAIN_SOFT_STAMCRIT (1<<12) //Entirely blocks melee_attack_chain() if user is soft stamcritted. Uses getStaminaLoss() to check at this point in time. THIS DOES NOT BLOCK RANGED AFTERATTACK()S, ONLY MELEE RANGE AFTERATTACK()S. - -// Flags for the clothing_flags var on /obj/item/clothing - -#define LAVAPROTECT (1<<0) -#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag. -#define BLOCK_GAS_SMOKE_EFFECT (1<<2) //blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! -#define ALLOWINTERNALS (1<<3) //mask allows internals -#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc -#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. -#define VOICEBOX_TOGGLABLE (1<<6) //The voicebox in this clothing can be toggled. -#define VOICEBOX_DISABLED (1<<7) //The voicebox is currently turned off. -#define IGNORE_HAT_TOSS (1<<8) //Hats with negative effects when worn (i.e the tinfoil hat). -#define SCAN_REAGENTS (1<<9) // Allows helmets and glasses to scan reagents. - -// Flags for the organ_flags var on /obj/item/organ - -#define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal -#define ORGAN_FROZEN (1<<1) //Frozen organs, don't deteriorate -#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed -#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. -#define ORGAN_VITAL (1<<4) //Currently only the brain -#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 06926317ee..84eed5483a 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -30,8 +30,9 @@ #define CHAT_GHOSTPDA (1<<8) #define CHAT_GHOSTRADIO (1<<9) #define CHAT_LOOC (1<<10) +#define CHAT_BANKCARD (1<<11) -#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC) +#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC|CHAT_BANKCARD) #define PARALLAX_INSANE -1 //for show offs #define PARALLAX_HIGH 0 //default. diff --git a/code/__DEFINES/profile.dm b/code/__DEFINES/profile.dm index 8929e0f05e..5fc8478901 100644 --- a/code/__DEFINES/profile.dm +++ b/code/__DEFINES/profile.dm @@ -26,4 +26,4 @@ #define PROFILE_ITEM_LEN 2 #define PROFILE_ITEM_TIME 1 -#define PROFILE_ITEM_COUNT 2 \ No newline at end of file +#define PROFILE_ITEM_COUNT 2 diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm new file mode 100644 index 0000000000..1bd67fbe02 --- /dev/null +++ b/code/__DEFINES/projectiles.dm @@ -0,0 +1,14 @@ +/// This atom should be ricocheted off of from its inherent properties using standard % chance handling. +#define PROJECTILE_RICOCHET_YES 1 +/// This atom should not be ricocheted off of from its inherent properties. +#define PROJECTILE_RICOCHET_NO 2 +/// This atom should prevent any kind of projectile ricochet from its inherent properties. +#define PROJECTILE_RICOCHET_PREVENT 3 +/// This atom should force a projectile ricochet from its inherent properties. +#define PROJECTILE_RICOCHET_FORCE 4 + +//bullet_act() return values +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. +#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs. diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index 596a6a0378..ece997a7fc 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -45,9 +45,9 @@ Ask ninjanomnom if they're around // WARNING: The deines below could have disastrous consequences if tweaked incorrectly. See: The great SM purge of Oct.6.2017 // contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1)) // contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT -#define RAD_MINIMUM_CONTAMINATION 350 // How strong does a radiation wave have to be to contaminate objects +#define RAD_MINIMUM_CONTAMINATION 300 // How strong does a radiation wave have to be to contaminate objects #define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.005 // Higher means higher strength scaling contamination chance -#define RAD_CONTAMINATION_STR_COEFFICIENT 0.3 // Higher means higher strength scaling contamination strength +#define RAD_CONTAMINATION_STR_COEFFICIENT 0.99 // Higher means higher strength scaling contamination strength #define RAD_DISTANCE_COEFFICIENT 1 // Lower means further rad spread -#define RAD_HALF_LIFE 90 // The half-life of contaminated objects \ No newline at end of file +#define RAD_HALF_LIFE 90 // The half-life of contaminated objects diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 928f364a81..a0db416fa6 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -65,6 +65,7 @@ #define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange #define FREQ_SECURITY 1359 // Security comms frequency, red +#define FREQ_HOLOGRID_SOLUTION 1433 #define FREQ_STATUS_DISPLAYS 1435 #define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers #define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 97ae7b8e95..f4beef7ee8 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -22,11 +22,23 @@ // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) -//reagents_value defines, for cargo stuff. +//reagents_value defines, basically a multiplier used in reagent containers cargo selling. #define DEFAULT_REAGENTS_VALUE 1 #define NO_REAGENTS_VALUE 0 #define HARVEST_REAGENTS_VALUE 0.3 +/// Standard reagents value defines. +/// Take a grain of salt, only "rare" reagents should have a decent value here, for balance reasons. +/// TL;DR Think of it also like general market request price more than rarity. +#define REAGENT_VALUE_NONE 0 //all the stuff pretty much available in potentially unlimited quantities. +#define REAGENT_VALUE_VERY_COMMON 0.1 //same as above, just not so unlimited. +#define REAGENT_VALUE_COMMON 0.5 +#define REAGENT_VALUE_UNCOMMON 1 +#define REAGENT_VALUE_RARE 2.5 +#define REAGENT_VALUE_VERY_RARE 5 +#define REAGENT_VALUE_EXCEPTIONAL 10 //extremely rare or tedious to craft, possibly unsynthetizable, reagents. +#define REAGENT_VALUE_AMAZING 30 //reserved ONLY for non-mass produceable, unsynthetizable reagents. +#define REAGENT_VALUE_GLORIOUS 300 //reagents that shouldn't be possible to get or farm under normal conditions. e.g. Romerol, fungal TB, adminordrazine... #define TOUCH 1 // splashing #define INGEST 2 // ingestion diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 9feb5f40c5..60effc7265 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -60,7 +60,8 @@ #define DESIGN_ID_IGNORE "IGNORE_THIS_DESIGN" -#define RESEARCH_MATERIAL_RECLAMATION_ID "__materials" +#define RESEARCH_MATERIAL_RECLAMATION_ID "__materials" +#define RESEARCH_DEEP_SCAN_ID "__deepscan" //When adding new types, update the list below! #define TECHWEB_POINT_TYPE_GENERIC "General Research" diff --git a/code/__DEFINES/research/stock_parts.dm b/code/__DEFINES/research/stock_parts.dm new file mode 100644 index 0000000000..457e3b632e --- /dev/null +++ b/code/__DEFINES/research/stock_parts.dm @@ -0,0 +1,5 @@ +// the clamps are just sanity checks. +/// Efficiency scaling for stock part level to material usage. All code concerning lathing and production from raw material sheet should be using this. +#define STANDARD_PART_LEVEL_LATHE_COEFFICIENT(level) clamp(1 - (level * 0.1), 0, 1) +/// Efficiency scaling for stock part level to ore factor. All code concerning lathing and production from raw ores to raw material sheets should be using this. +#define STANDARD_PART_LEVEL_ORE_COEFFICIENT(level) clamp(1 + (level * 0.125), 1, 10) diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index affa23d30a..a0fded3798 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -27,6 +27,7 @@ #define BOT_NAV 15 // computing navigation #define BOT_WAIT_FOR_NAV 16 // waiting for nav computation #define BOT_NO_ROUTE 17 // no destination beacon found (or no route) +#define BOT_TIPPED 18 // someone tipped a medibot over ;_; //Bot types #define SEC_BOT (1<<0) // Secutritrons (Beepsky) and ED-209s @@ -51,6 +52,19 @@ #define ASSEMBLY_FOURTH_STEP 3 #define ASSEMBLY_FIFTH_STEP 4 +//Bot Upgrade defines +#define UPGRADE_CLEANER_ADVANCED_MOP (1<<0) +#define UPGRADE_CLEANER_BROOM (1<<1) + +#define UPGRADE_MEDICAL_HYPOSPRAY (1<<0) +#define UPGRADE_MEDICAL_CHEM_BOARD (1<<1) +#define UPGRADE_MEDICAL_CRYO_BOARD (1<<2) +#define UPGRADE_MEDICAL_CHEM_MASTER (1<<3) +#define UPGRADE_MEDICAL_SLEEP_BOARD (1<<4) +#define UPGRADE_MEDICAL_PIERERCING (1<<5) + +#define UPGRADE_FLOOR_ARTBOX (1<<0) +#define UPGRADE_FLOOR_SYNDIBOX (1<<1) //Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta #define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert)) diff --git a/code/__DEFINES/rust_g.config.dm b/code/__DEFINES/rust_g.config.dm deleted file mode 100644 index 68a1b42fb1..0000000000 --- a/code/__DEFINES/rust_g.config.dm +++ /dev/null @@ -1 +0,0 @@ -#define RUSTG_OVERRIDE_BUILTINS \ No newline at end of file diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index ccd5b92c79..aeacdb7c51 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -1,10 +1,27 @@ // rust_g.dm - DM API for rust_g extension library #define RUST_G "rust_g" +#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" +#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" +#define RUSTG_JOB_ERROR "JOB PANICKED" + #define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname) +#define rustg_dmi_create_png(fname,width,height,data) call(RUST_G, "dmi_create_png")(fname,width,height,data) #define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev) #define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev) -#define rustg_log_write(fname, text) call(RUST_G, "log_write")(fname, text) +#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format) /proc/rustg_log_close_all() return call(RUST_G, "log_close_all")() + +// RUST-G defines & procs for HTTP component +#define RUSTG_HTTP_METHOD_GET "get" +#define RUSTG_HTTP_METHOD_POST "post" +#define RUSTG_HTTP_METHOD_PUT "put" +#define RUSTG_HTTP_METHOD_DELETE "delete" +#define RUSTG_HTTP_METHOD_PATCH "patch" +#define RUSTG_HTTP_METHOD_HEAD "head" + +#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers) +#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers) +#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) diff --git a/code/__DEFINES/security_levels.dm b/code/__DEFINES/security_levels.dm new file mode 100644 index 0000000000..19c66d9125 --- /dev/null +++ b/code/__DEFINES/security_levels.dm @@ -0,0 +1,10 @@ +//Security levels +#define SEC_LEVEL_GREEN 1 +#define SEC_LEVEL_BLUE 2 +#define SEC_LEVEL_AMBER 3 +#define SEC_LEVEL_RED 4 +#define SEC_LEVEL_DELTA 5 + +//Macro helpers. +#define SECLEVEL2NUM(text) (GLOB.all_security_levels.Find(text)) +#define NUM2SECLEVEL(num) (ISINRANGE(num, 1, length(GLOB.all_security_levels)) ? GLOB.all_security_levels[num] : null) diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 36ecebb699..80983b34be 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -7,6 +7,8 @@ #define SHUTTLE_STRANDED "stranded" #define SHUTTLE_ESCAPE "escape" #define SHUTTLE_ENDGAME "endgame: game over" +#define SHUTTLE_RECHARGING "recharging" +#define SHUTTLE_PREARRIVAL "landing" #define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL))) #define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME))) diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm new file mode 100644 index 0000000000..659c0fe11b --- /dev/null +++ b/code/__DEFINES/skills/defines.dm @@ -0,0 +1,103 @@ + +/// true/false +#define SKILL_PROGRESSION_BINARY 1 +/// numerical +#define SKILL_PROGRESSION_NUMERICAL 2 +/// Enum +#define SKILL_PROGRESSION_ENUM 3 +/// Levels +#define SKILL_PROGRESSION_LEVEL 4 + + +/// Max value of skill for numerical skills +#define SKILL_NUMERICAL_MAX 100 +/// Min value of skill for numerical skills +#define SKILL_NUMERICAL_MIN 0 + +// Standard values for job starting skills + +#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX + +// Standard values for job starting skill affinities + +#define STARTING_SKILL_AFFINITY_DEF_JOB 1.2 + +// Standard values for skill gain (this is multiplied by affinity) + +#define DEF_SKILL_GAIN 1 +#define SKILL_GAIN_SURGERY_PER_STEP 0.25 + +//An extra point for each few seconds of delay when using a tool. Before the multiplier. +#define SKILL_GAIN_DELAY_DIVISOR 3 SECONDS + +///Items skill_traits and other defines +#define SKILL_USE_TOOL "use_tool" +#define SKILL_TRAINING_TOOL "training_tool" +#define SKILL_ATTACK_MOB "attack_mob" +#define SKILL_TRAIN_ATTACK_MOB "train_attack_mob" +#define SKILL_ATTACK_OBJ "attack_obj" +#define SKILL_TRAIN_ATTACK_OBJ "train_attack_obj" +#define SKILL_STAMINA_COST "stamina_cost" //Influences the stamina cost from weapon usage. +#define SKILL_THROW_STAM_COST "throw_stam_cost" +#define SKILL_COMBAT_MODE "combat_mode" //The user must have combat mode on. +#define SKILL_SANITY "sanity" //Is the skill affected by (in)sanity. +#define SKILL_INTELLIGENCE "intelligence" //Is the skill affected by brain damage? + +///competency_threshold defines +#define THRESHOLD_UNTRAINED "untrained" +#define THRESHOLD_COMPETENT "competent" +#define THRESHOLD_EXPERT "expert" +#define THRESHOLD_MASTER "master" + +/// Level/Experience skills defines. +#define STD_XP_LVL_UP 100 +#define STD_XP_LVL_MULTI 2 +#define STD_MAX_LVL 4 + +#define RPG_MAX_LVL 100 + +#define DORF_XP_LVL_UP 400 +#define DORF_XP_LVL_MULTI 100 +#define DORF_MAX_LVL 20 // Dabbling, novice, adequate, [...], legendary +3, legendary +4, legendary +5 + +//level up methods defines +#define STANDARD_LEVEL_UP "standard_level_up" +#define DWARFY_LEVEL_UP "dwarfy_level_up" + +//job skill level defines +#define JOB_SKILL_UNTRAINED 0 +#define JOB_SKILL_BASIC 1 +#define JOB_SKILL_TRAINED 2 +#define JOB_SKILL_EXPERT 3 +#define JOB_SKILL_MASTER 4 + +//other skill level defines, not an exhaustive catalogue, only contains be most relevant ones. +#define DORF_SKILL_COMPETENT 3 +#define DORF_SKILL_EXPERT 8 +#define DORF_SKILL_MASTER 12 + +/// Skill modifier defines and flags. +#define MODIFIER_SKILL_VALUE (1<<0) +#define MODIFIER_SKILL_AFFINITY (1<<1) +#define MODIFIER_SKILL_LEVEL (1<<2) +///makes the skill modifier a multiplier, not an addendum. +#define MODIFIER_SKILL_MULT (1<<3) +///Sets the skill to the defined value if lower than that. Highly reccomended you don't use it with MODIFIER_SKILL_MULT. +#define MODIFIER_SKILL_VIRTUE (1<<4) +///Does the opposite of the above. combining both effectively results in the skill being locked to the specified value. +#define MODIFIER_SKILL_HANDICAP (1<<5) +///Makes it untransferred by mind.transfer_to() +#define MODIFIER_SKILL_BODYBOUND (1<<6) +///Adds the difference of the current value and the value stored at the time the modifier was added to the result. +#define MODIFIER_SKILL_ORIGIN_DIFF (1<<7) +///Will this skill use competency thresholds instead of preset values +#define MODIFIER_USE_THRESHOLDS (1<<8) + +#define MODIFIER_TARGET_VALUE "value" +#define MODIFIER_TARGET_LEVEL "level" +#define MODIFIER_TARGET_AFFINITY "affinity" + +///Ascending priority defines. +#define MODIFIER_SKILL_PRIORITY_LOW 100 +#define MODIFIER_SKILL_PRIORITY_DEF 50 +#define MODIFIER_SKILL_PRIORITY_MAX 1 //max priority, meant for job/antag modifiers so they don't null out other (de)buffs \ No newline at end of file diff --git a/code/__DEFINES/skills/helpers.dm b/code/__DEFINES/skills/helpers.dm new file mode 100644 index 0000000000..dde412fd7d --- /dev/null +++ b/code/__DEFINES/skills/helpers.dm @@ -0,0 +1,48 @@ + +//How experience levels are calculated. +#define XP_LEVEL(std, multi, lvl) (std*((multi**lvl)/(multi-1))-std/(multi-1)) //don't use 1 as multi, you'll get division by zero errors +#define DORF_XP_LEVEL(std, extra, lvl) (std*lvl+extra*(lvl*(lvl/2+0.5))) + +//More experience value getter macros +#define GET_STANDARD_LVL(lvl) XP_LEVEL(STD_XP_LVL_UP, STD_XP_LVL_MULTI, lvl) +#define GET_DORF_LVL(lvl) DORF_XP_LEVEL(DORF_XP_LVL_UP, DORF_XP_LVL_MULTI, lvl) + +#define IS_SKILL_VALUE_GREATER(path, existing, new_value) GLOB.skill_datums[path].is_value_greater(existing, new_value) + +#define SANITIZE_SKILL_VALUE(path, value) GLOB.skill_datums[path].sanitize_value(value) + +///Doesn't automatically round the value. +#define SANITIZE_SKILL_LEVEL(path, lvl) clamp(lvl, 0, GLOB.skill_datums[path].max_levels) + +/// Simple generic identifier macro. +#define GET_SKILL_MOD_ID(path, id) (id ? "[path]&[id]" : path) + +/** + * A simple universal comsig for body bound skill modifiers. + * Technically they are still bound to the mind, but other signal procs will take care of adding and removing the modifier + * from/to new/old minds. + */ +#define ADD_SKILL_MODIFIER_BODY(path, id, body, prototype) \ + prototype = GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)] || new path(id, TRUE);\ + if(body.mind){\ + body.mind.add_skill_modifier(prototype.identifier)\ + } else {\ + prototype.RegisterSignal(body, COMSIG_MOB_ON_NEW_MIND, /datum/skill_modifier.proc/on_mob_new_mind, TRUE)\ + } + +/// Same as above but to remove the skill modifier. +#define REMOVE_SKILL_MODIFIER_BODY(path, id, body) \ + if(GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)]){\ + if(body.mind){\ + body.mind.remove_skill_modifier(GET_SKILL_MOD_ID(path, id))\ + } else {\ + GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)].UnregisterSignal(body, COMSIG_MOB_ON_NEW_MIND)\ + }\ + } + +///Macro used when adding generic singleton skill modifiers. +#define ADD_SINGLETON_SKILL_MODIFIER(mind, path, id) \ + if(!GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)]){\ + new path(id, TRUE)\ + };\ + mind.add_skill_modifier(GET_SKILL_MOD_ID(path, id)) diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 581bb2bc29..73781154c5 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -20,6 +20,7 @@ #define CHANNEL_HIGHEST_AVAILABLE 1008 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS +#define MAX_INSTRUMENT_CHANNELS (128 * 6) #define SOUND_MINIMUM_PRESSURE 10 #define FALLOFF_SOUNDS 1 diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index b9c0544bc1..3d4207c5c9 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -6,10 +6,26 @@ #define RETURN_TYPE(X) set SpacemanDMM_return_type = X #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X #define UNLINT(X) SpacemanDMM_unlint(X) + #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X + #define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X + #define SHOULD_BE_PURE(X) set SpacemanDMM_should_be_pure = X + #define PRIVATE_PROC(X) set SpacemanDMM_private_proc = X + #define PROTECTED_PROC(X) set SpacemanDMM_protected_proc = X + #define VAR_FINAL var/SpacemanDMM_final + #define VAR_PRIVATE var/SpacemanDMM_private + #define VAR_PROTECTED var/SpacemanDMM_protected #else #define RETURN_TYPE(X) #define SHOULD_CALL_PARENT(X) #define UNLINT(X) X + #define SHOULD_NOT_OVERRIDE(X) + #define SHOULD_NOT_SLEEP(X) + #define SHOULD_BE_PURE(X) + #define PRIVATE_PROC(X) + #define PROTECTED_PROC(X) + #define VAR_FINAL var + #define VAR_PRIVATE var + #define VAR_PROTECTED var #endif /world/proc/enable_debugger() diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index a7ffd1c543..4225581018 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -34,6 +34,8 @@ #define STATUS_EFFECT_HIPPOCRATIC_OATH /datum/status_effect/hippocraticOath //Gives you an aura of healing as well as regrowing the Rod of Asclepius if lost +#define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core //removes damage slowdown while giving a slow regenerating effect + ///////////// // DEBUFFS // ///////////// @@ -78,7 +80,7 @@ #define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage -#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage +#define STATUS_EFFECT_SAWBLEED /datum/status_effect/stacking/saw_bleed //if the bleed builds up enough, takes a ton of damage #define STATUS_EFFECT_NECKSLICE /datum/status_effect/neck_slice //Creates the flavor messages for the neck-slice @@ -94,12 +96,14 @@ #define STATUS_EFFECT_SPASMS /datum/status_effect/spasms //causes random muscle spasms +#define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus + #define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk. #define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above. #define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it -#define STATUS_EFFECT_MESMERIZE /datum/status_effect/no_combat_mode/mesmerize //Just reskinned no_combat_mode +#define STATUS_EFFECT_MESMERIZE /datum/status_effect/mesmerize //Just reskinned no_combat_mode #define STATUS_EFFECT_ELECTROSTAFF /datum/status_effect/electrostaff //slows down victim diff --git a/code/__DEFINES/storage/_storage.dm b/code/__DEFINES/storage/_storage.dm new file mode 100644 index 0000000000..3a05293d2d --- /dev/null +++ b/code/__DEFINES/storage/_storage.dm @@ -0,0 +1,42 @@ +// storage_flags variable on /datum/component/storage + +// Storage limits. These can be combined (and usually are combined). +/// Check max_items and contents.len when trying to insert +#define STORAGE_LIMIT_MAX_ITEMS (1<<0) +/// Check max_combined_w_class. +#define STORAGE_LIMIT_COMBINED_W_CLASS (1<<1) +/// Use the new volume system. Will automatically force rendering to use the new volume/baystation scaling UI so this is kind of incompatible with stuff like stack storage etc etc. +#define STORAGE_LIMIT_VOLUME (1<<2) +/// Use max_w_class +#define STORAGE_LIMIT_MAX_W_CLASS (1<<3) + +#define STORAGE_FLAGS_LEGACY_DEFAULT (STORAGE_LIMIT_MAX_ITEMS | STORAGE_LIMIT_COMBINED_W_CLASS | STORAGE_LIMIT_MAX_W_CLASS) +#define STORAGE_FLAGS_VOLUME_DEFAULT (STORAGE_LIMIT_VOLUME | STORAGE_LIMIT_MAX_W_CLASS) + +// UI defines +/// Size of volumetric box icon +#define VOLUMETRIC_STORAGE_BOX_ICON_SIZE 32 +/// Size of EACH left/right border icon for volumetric boxes +#define VOLUMETRIC_STORAGE_BOX_BORDER_SIZE 1 +/// Minimum pixels an item must have in volumetric scaled storage UI +#define MINIMUM_PIXELS_PER_ITEM 8 +/// Maximum number of objects that will be allowed to be displayed using the volumetric display system. Arbitrary number to prevent server lockups. +#define MAXIMUM_VOLUMETRIC_ITEMS 256 +/// How much padding to give between items +#define VOLUMETRIC_STORAGE_ITEM_PADDING 4 +/// How much padding to give to edges +#define VOLUMETRIC_STORAGE_EDGE_PADDING 1 + +//ITEM INVENTORY WEIGHT, FOR w_class +/// Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money +#define WEIGHT_CLASS_TINY 1 +/// Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device +#define WEIGHT_CLASS_SMALL 2 +/// Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets +#define WEIGHT_CLASS_NORMAL 3 +/// Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits +#define WEIGHT_CLASS_BULKY 4 +/// Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh +#define WEIGHT_CLASS_HUGE 5 +/// Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh +#define WEIGHT_CLASS_GIGANTIC 6 diff --git a/code/__DEFINES/storage/volumetrics.dm b/code/__DEFINES/storage/volumetrics.dm new file mode 100644 index 0000000000..c3f45976ce --- /dev/null +++ b/code/__DEFINES/storage/volumetrics.dm @@ -0,0 +1,40 @@ +// PLEASE KEEP ALL VOLUME DEFINES IN THIS FILE, it's going to be hell to keep track of them later. + +#define DEFAULT_VOLUME_TINY 2 +#define DEFAULT_VOLUME_SMALL 3 +#define DEFAULT_VOLUME_NORMAL 4 +#define DEFAULT_VOLUME_BULKY 8 +#define DEFAULT_VOLUME_HUGE 16 +#define DEFAULT_VOLUME_GIGANTIC 32 + +GLOBAL_LIST_INIT(default_weight_class_to_volume, list( + "[WEIGHT_CLASS_TINY]" = DEFAULT_VOLUME_TINY, + "[WEIGHT_CLASS_SMALL]" = DEFAULT_VOLUME_SMALL, + "[WEIGHT_CLASS_NORMAL]" = DEFAULT_VOLUME_NORMAL, + "[WEIGHT_CLASS_BULKY]" = DEFAULT_VOLUME_BULKY, + "[WEIGHT_CLASS_HUGE]" = DEFAULT_VOLUME_HUGE, + "[WEIGHT_CLASS_GIGANTIC]" = DEFAULT_VOLUME_GIGANTIC + )) + +/// Macro for automatically getting the volume of an item from its w_class. +#define AUTO_SCALE_VOLUME(w_class) (GLOB.default_weight_class_to_volume["[w_class]"]) +/// Macro for automatically getting the volume of a storage item from its max_w_class and max_combined_w_class. +#define AUTO_SCALE_STORAGE_VOLUME(w_class, max_combined_w_class) (AUTO_SCALE_VOLUME(w_class) * (max_combined_w_class / w_class)) + +// Let's keep all of this in one place. given what we put above anyways.. + +// volume amount for items +#define ITEM_VOLUME_DISK 1 + +// #define SAMPLE_VOLUME_AMOUNT 2 + +// max_weight_class for storages +#define MAX_WEIGHT_CLASS_BACKPACK WEIGHT_CLASS_NORMAL +#define MAX_WEIGHT_CLASS_BAG_OF_HOLDING WEIGHT_CLASS_BULKY + +// max_volume for storages +#define STORAGE_VOLUME_BACKPACK (DEFAULT_VOLUME_NORMAL * 7) +#define STORAGE_VOLUME_DUFFLEBAG (DEFAULT_VOLUME_NORMAL * 10) +#define STORAGE_VOLUME_BAG_OF_HOLDING (DEFAULT_VOLUME_NORMAL * 20) +#define STORAGE_VOLUME_CHEMISTRY_BAG (DEFAULT_VOLUME_TINY * 50) +#define STORAGE_VOLUME_PILL_BOTTLE (DEFAULT_VOLUME_TINY * 7) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index a693b26b20..8c423ad09c 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -50,19 +50,23 @@ #define INIT_ORDER_PROFILER 100 #define INIT_ORDER_FAIL2TOPIC 99 #define INIT_ORDER_TITLE 98 -#define INIT_ORDER_GARBAGE 97 -#define INIT_ORDER_DBCORE 95 -#define INIT_ORDER_BLACKBOX 94 -#define INIT_ORDER_SERVER_MAINT 93 -#define INIT_ORDER_INPUT 85 +#define INIT_ORDER_GARBAGE 95 +#define INIT_ORDER_DBCORE 93 +#define INIT_ORDER_BLACKBOX 92 +#define INIT_ORDER_SERVER_MAINT 91 +#define INIT_ORDER_INPUT 90 +#define INIT_ORDER_SOUNDS 85 #define INIT_ORDER_VIS 80 #define INIT_ORDER_RESEARCH 75 #define INIT_ORDER_EVENTS 70 #define INIT_ORDER_JOBS 65 #define INIT_ORDER_QUIRKS 60 #define INIT_ORDER_TICKER 55 +#define INIT_ORDER_INSTRUMENTS 53 #define INIT_ORDER_MAPPING 50 -#define INIT_ORDER_NETWORKS 45 +#define INIT_ORDER_ECONOMY 45 +#define INIT_ORDER_NETWORKS 40 +#define INIT_ORDER_HOLODECK 35 #define INIT_ORDER_ATOMS 30 #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 @@ -88,18 +92,19 @@ // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) +#define FIRE_PRIORITY_VORE 5 #define FIRE_PRIORITY_PING 10 #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_VIS 10 -#define FIRE_PRIORITY_VORE 10 #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_WET_FLOORS 20 #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 +#define FIRE_PRIORITY_INSTRUMENTS 30 #define FIRE_PRIORITY_FIELDS 30 #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_NETWORKS 40 @@ -112,6 +117,7 @@ #define FIRE_PRIORITY_NPC 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 +#define FIRE_PRIORITY_PROJECTILES 200 #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 @@ -128,8 +134,15 @@ #define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) - - +// SSair run section +#define SSAIR_PIPENETS 1 +#define SSAIR_ATMOSMACHINERY 2 +#define SSAIR_REACTQUEUE 3 +#define SSAIR_EXCITEDGROUPS 4 +#define SSAIR_HIGHPRESSURE 5 +#define SSAIR_HOTSPOTS 6 +#define SSAIR_SUPERCONDUCTIVITY 7 +#define SSAIR_REBUILD_PIPENETS 8 #define COMPILE_OVERLAYS(A)\ if (TRUE) {\ diff --git a/code/__DEFINES/tgs.config.dm b/code/__DEFINES/tgs.config.dm index 9f4f63a1fc..a2fcc7855a 100644 --- a/code/__DEFINES/tgs.config.dm +++ b/code/__DEFINES/tgs.config.dm @@ -4,8 +4,9 @@ #define TGS_READ_GLOBAL(Name) GLOB.##Name #define TGS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value #define TGS_WORLD_ANNOUNCE(message) to_chat(world, "[html_encode(##message)]") -#define TGS_INFO_LOG(message) log_world("TGS: Info: [##message]") -#define TGS_ERROR_LOG(message) log_world("TGS: Error: [##message]") +#define TGS_INFO_LOG(message) log_world("TGS Info: [##message]") +#define TGS_WARNING_LOG(message) log_world("TGS Warn: [##message]") +#define TGS_ERROR_LOG(message) log_world("TGS Error: [##message]") #define TGS_NOTIFY_ADMINS(event) message_admins(##event) #define TGS_CLIENT_COUNT GLOB.clients.len #define TGS_PROTECT_DATUM(Path) GENERAL_PROTECT_DATUM(##Path) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index dcccfc9295..7c0811ec59 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,235 +1,346 @@ -//tgstation-server DMAPI +// tgstation-server DMAPI -//All functions and datums outside this document are subject to change with any version and should not be relied on +#define TGS_DMAPI_VERSION "5.2.1" -//CONFIGURATION +// All functions and datums outside this document are subject to change with any version and should not be relied on. -//create this define if you want to do configuration outside of this file +// CONFIGURATION + +/// Create this define if you want to do TGS configuration outside of this file. #ifndef TGS_EXTERNAL_CONFIGURATION -//Comment this out once you've filled in the below +// Comment this out once you've filled in the below. #error TGS API unconfigured -//Uncomment this if you wish to allow the game to interact with TGS 3 -//This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() +// Uncomment this if you wish to allow the game to interact with TGS 3. +// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() //#define TGS_V3_API -//Required interfaces (fill in with your codebase equivalent): +// Required interfaces (fill in with your codebase equivalent): -//create a global variable named `Name` and set it to `Value` -//These globals must not be modifiable from anywhere outside of the server tools +/// Create a global variable named `Name` and set it to `Value`. #define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) -//Read the value in the global variable `Name` +/// Read the value in the global variable `Name`. #define TGS_READ_GLOBAL(Name) -//Set the value in the global variable `Name` to `Value` +/// Set the value in the global variable `Name` to `Value`. #define TGS_WRITE_GLOBAL(Name, Value) -//Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game priveledge escalation +/// Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game use of DD -> TGS capabilities. #define TGS_PROTECT_DATUM(Path) -//display an announcement `message` from the server to all players +/// Display an announcement `message` from the server to all players. #define TGS_WORLD_ANNOUNCE(message) -//Notify current in-game administrators of a string `event` +/// Notify current in-game administrators of a string `event`. #define TGS_NOTIFY_ADMINS(event) -//Write an info `message` to a server log +/// Write an info `message` to a server log. #define TGS_INFO_LOG(message) -//Write an error `message` to a server log +/// Write an warning `message` to a server log. +#define TGS_WARNING_LOG(message) + +/// Write an error `message` to a server log. #define TGS_ERROR_LOG(message) -//Get the number of connected /clients +/// Get the number of connected /clients. #define TGS_CLIENT_COUNT #endif -//EVENT CODES +// EVENT CODES -#define TGS_EVENT_PORT_SWAP -2 //before a port change is about to happen, extra parameter is new port -#define TGS_EVENT_REBOOT_MODE_CHANGE -1 //before a reboot mode change, extras parameters are the current and new reboot mode enums +/// Before a reboot mode change, extras parameters are the current and new reboot mode enums +#define TGS_EVENT_REBOOT_MODE_CHANGE -1 +/// Before a port change is about to happen, extra parameters is new port +#define TGS_EVENT_PORT_SWAP -2 +/// Before the instance is renamed, extra parameter is the new name +#define TGS_EVENT_INSTANCE_RENAMED -3 +/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server +#define TGS_EVENT_WATCHDOG_REATTACH -4 -//See the descriptions for these codes here: https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Host/Components/EventType.cs +/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA #define TGS_EVENT_REPO_RESET_ORIGIN 0 +/// When the repository performs a checkout. Parameters: Checkout git object #define TGS_EVENT_REPO_CHECKOUT 1 +/// When the repository performs a fetch operation. No parameters #define TGS_EVENT_REPO_FETCH 2 +/// When the repository merges a pull request. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 +/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 +/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND #define TGS_EVENT_BYOND_INSTALL_START 5 +/// When a BYOND install operation fails. Parameters: Error message #define TGS_EVENT_BYOND_INSTALL_FAIL 6 +/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND #define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 +/// When the compiler starts running. Parameters: Game directory path, origin commit SHA #define TGS_EVENT_COMPILE_START 8 +/// When a compile is cancelled. No parameters #define TGS_EVENT_COMPILE_CANCELLED 9 +/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation #define TGS_EVENT_COMPILE_FAILURE 10 +/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path #define TGS_EVENT_COMPILE_COMPLETE 11 +/// When an automatic update for the current instance begins. No parameters #define TGS_EVENT_INSTANCE_AUTO_UPDATE_START 12 +/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference #define TGS_EVENT_REPO_MERGE_CONFLICT 13 +/// When a deployment completes. No Parameters +#define TGS_EVENT_DEPLOYMENT_COMPLETE 14 +/// Before the watchdog shuts down. Not sent for graceful shutdowns. No parameters. +#define TGS_EVENT_WATCHDOG_SHUTDOWN 15 +/// Before the watchdog detaches for a TGS update/restart. No parameters. +#define TGS_EVENT_WATCHDOG_DETACH 16 -//OTHER ENUMS +// OTHER ENUMS +/// The server will reboot normally. #define TGS_REBOOT_MODE_NORMAL 0 +/// The server will stop running on reboot. #define TGS_REBOOT_MODE_SHUTDOWN 1 +/// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +/// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 +/// DreamDaemon Safe security level. #define TGS_SECURITY_SAFE 1 +/// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 //REQUIRED HOOKS -//Call this somewhere in /world/New() that is always run -//event_handler: optional user defined event handler. The default behaviour is to broadcast the event in english to all connected admin channels -//minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated +/** + * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * + * * event_handler - Optional user defined [/datum/tgs_event_handler]. + * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. + */ /world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) return -//Call this when your initializations are complete and your game is ready to play before any player interactions happen -//This may use world.sleep_offline to make this happen so ensure no changes are made to it while this call is running -//Most importantly, before this point, note that any static files or directories may be in use by another server. Your code should account for this -//This function should not be called before ..() in /world/New() +/** + * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * + * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. + * Before this point, note that any static files or directories may be in use by another server. Your code should account for this. + * This function should not be called before ..() in [/world/proc/New]. + */ /world/proc/TgsInitializationComplete() return -//Put this at the start of /world/Topic() +/// Put this at the start of [/world/proc/Topic]. #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return -//Call this at the beginning of world/Reboot(reason) +/** + * Call this at the beginning of [world/proc/Reboot]. + */ /world/proc/TgsReboot() return -//DATUM DEFINITIONS -//unless otherwise specified all datums defined here should be considered read-only, warranty void if written +// DATUM DEFINITIONS +// All datums defined here should be considered read-only -//represents git revision information about the current world build +/// Represents git revision information. /datum/tgs_revision_information - var/commit //full sha of compiled commit - var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch + /// Full SHA of the commit. + var/commit + /// Full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch. + var/origin_commit -//represents a version of tgstation-server +/// Represents a version. /datum/tgs_version - var/suite //The suite version, can be >=3 + /// The suite/major version number + var/suite - //this group of variables can be null to represent a wild card - var/major //The major version - var/minor //The minor version - var/patch //The patch version + // This group of variables can be null to represent a wild card + /// The minor version number. null for wildcards + var/minor + /// The patch version number. null for wildcards + var/patch - var/raw_parameter //The unparsed parameter - var/deprefixed_parameter //The version only bit of raw_parameter + /// Legacy version number. Generally null + var/deprecated_patch -//if the tgs_version is a wildcard version + /// Unparsed string value + var/raw_parameter + /// String value minus prefix + var/deprefixed_parameter + +/** + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. + */ /datum/tgs_version/proc/Wildcard() return -//represents a merge of a GitHub pull request +/** + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] equals some other version. + * + * other_version - The [/datum/tgs_version] to compare against. + */ +/datum/tgs_version/proc/Equals(datum/tgs_version/other_version) + return + +/// Represents a merge of a GitHub pull request. /datum/tgs_revision_information/test_merge - var/number //pull request number - var/title //pull request title - var/body //pull request body - var/author //pull request github author - var/url //link to pull request html - var/pull_request_commit //commit of the pull request when it was merged - var/time_merged //timestamp of when the merge commit for the pull request was created - var/comment //optional comment left by the one who initiated the test merge + /// The pull request number. + var/number + /// The pull request title when it was merged. + var/title + /// The pull request body when it was merged. + var/body + /// The GitHub username of the pull request's author. + var/author + /// An http URL to the pull request. + var/url + /// The SHA of the pull request when that was merged. + var/pull_request_commit + /// ISO 8601 timestamp of when the pull request was merged. + var/time_merged + /// (Nullable) Comment left by the TGS user who initiated the merge.. + var/comment -//represents a connected chat channel +/// Represents a connected chat channel. /datum/tgs_chat_channel - var/id //internal channel representation - var/friendly_name //user friendly channel name - var/connection_name //the name of the configured chat connection - var/is_admin_channel //if the server operator has marked this channel for game admins only - var/is_private_channel //if this is a private chat channel - var/custom_tag //user defined string associated with channel + /// TGS internal channel ID. + var/id + /// User friendly name of the channel. + var/friendly_name + /// Name of the chat connection. This is the IRC server address or the Discord guild. + var/connection_name + /// [TRUE]/[FALSE] based on if the server operator has marked this channel for game admins only. + var/is_admin_channel + /// [TRUE]/[FALSE] if the channel is a private message channel for a [/datum/tgs_chat_user]. + var/is_private_channel + /// Tag string associated with the channel in TGS + var/custom_tag -//represents a chat user +// Represents a chat user /datum/tgs_chat_user - var/id //Internal user representation, requires channel to be unique - var/friendly_name //The user's public name - var/mention //The text to use to ping this user in a message - var/datum/tgs_chat_channel/channel //The /datum/tgs_chat_channel this user was from + /// TGS internal user ID. + var/id + // The user's display name. + var/friendly_name + // The string to use to ping this user in a message. + var/mention + /// The [/datum/tgs_chat_channel] the user was from + var/datum/tgs_chat_channel/channel -//user definable callback for handling events -//extra parameters may be specified depending on the event +/** + * User definable callback for handling TGS events. + * + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return -//user definable chat command +/// User definable chat command /datum/tgs_chat_command - var/name = "" //the string to trigger this command on a chat bot. e.g. TGS3_BOT: do_this_command - var/help_text = "" //help text for this command - var/admin_only = FALSE //set to TRUE if this command should only be usable by registered chat admins + /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...` + var/name = "" + /// The help text displayed for this command + var/help_text = "" + /// If this command should be available to game administrators only + var/admin_only = FALSE -//override to implement command -//sender: The tgs_chat_user who send to command -//params: The trimmed string following the command name -//The return value will be stringified and sent to the appropriate chat +/** + * Process command activation. Should return a string to respond to the issuer with. + * + * sender - The [/datum/tgs_chat_user] who issued the command. + * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + */ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") -//FUNCTIONS +// API FUNCTIONS -//Returns the respective supported /datum/tgs_version of the API +/// Returns the maximum supported [/datum/tgs_version] of the DMAPI. /world/proc/TgsMaximumAPIVersion() return +/// Returns the minimum supported [/datum/tgs_version] of the DMAPI. /world/proc/TgsMinimumAPIVersion() return -//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise -//No function below this succeeds if it returns FALSE +/** + * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. + */ /world/proc/TgsAvailable() return -//Gets the current /datum/tgs_version of the server tools running the server -/world/proc/TgsVersion() - return +// No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. -/world/proc/TgsInstanceName() - return - -//Get the current `/datum/tgs_revision_information` -/world/proc/TgsRevision() - return - -//Get the current BYOND security level -/world/proc/TgsSecurityLevel() - return - -//Gets a list of active `/datum/tgs_revision_information/test_merge`s -/world/proc/TgsTestMerges() - return - -//Forces a hard reboot of BYOND by ending the process -//unlike del(world) clients will try to reconnect -//If the service has not requested a shutdown, the next server will take over +/** + * Forces a hard reboot of DreamDaemon by ending the process. + * + * Unlike del(world) clients will try to reconnect. + * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + */ /world/proc/TgsEndProcess() return -//Gets a list of connected tgs_chat_channel -/world/proc/TgsChatChannelInfo() +/** + * Send a message to connected chats. + * + * message - The string to send. + * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. + */ +/world/proc/TgsTargetedChatBroadcast(message, admin_only = FALSE) return -//Sends a message to connected game chats -//message: The message to send -//channels: optional channels to limit the broadcast to -/world/proc/TgsChatBroadcast(message, list/channels) - return - -//Send a message to non-admin connected chats -//message: The message to send -//admin_only: If TRUE, message will instead be sent to only admin connected chats -/world/proc/TgsTargetedChatBroadcast(message, admin_only) - return - -//Send a private message to a specific user -//message: The message to send -//user: The /datum/tgs_chat_user to send to +/** + * Send a private message to a specific user. + * + * message - The string to send. + * user: The [/datum/tgs_chat_user] to PM. + */ /world/proc/TgsChatPrivateMessage(message, datum/tgs_chat_user/user) return +// The following functions will sleep if a call to TgsNew() is sleeping + +/** + * Send a message to connected chats that are flagged as game-related in TGS. + * + * message - The string to send. + * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. + */ +/world/proc/TgsChatBroadcast(message, list/channels = null) + return + +/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. +/world/proc/TgsVersion() + return + +/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. +/world/proc/TgsApiVersion() + return + +/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. +/world/proc/TgsInstanceName() + return + +/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. +/world/proc/TgsRevision() + return + +/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. +/world/proc/TgsSecurityLevel() + return + +/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. +/world/proc/TgsTestMerges() + return + +/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. +/world/proc/TgsChatChannelInfo() + return + /* The MIT License @@ -255,4 +366,4 @@ 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. -*/ \ No newline at end of file +*/ diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index af618cf828..01990ddc17 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -18,6 +18,7 @@ #define VALENTINES "Valentine's Day" #define APRIL_FOOLS "April Fool's Day" #define EASTER "Easter" +#define PRIDE_MONTH "Pride Month" #define HALLOWEEN "Halloween" #define CHRISTMAS "Christmas" #define FESTIVE_SEASON "Festive Season" @@ -38,6 +39,8 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define SATURDAY "Sat" #define SUNDAY "Sun" +#define WEEKDAY2NUM(D) (D == SUNDAY ? 1 : D == MONDAY ? 2 : D == TUESDAY ? 3 : D == WEDNESDAY ? 4 : D == THURSDAY ? 5 : D == FRIDAY ? 6 : 7) //this looks ugly, but switch statements can't be used as vars, so *shrug + #define SECONDS *10 #define MINUTES SECONDS*60 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index a8c0353591..3977b3c085 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -67,6 +67,8 @@ #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" #define TRAIT_EMOTEMUTE "emotemute" +#define TRAIT_LOOC_MUTE "looc_mute" //Just like unconsciousness, it disables LOOC salt. +#define TRAIT_AOOC_MUTE "aooc_mute" //Same as above but for AOOC. #define TRAIT_DEAF "deaf" #define TRAIT_NEARSIGHT "nearsighted" #define TRAIT_FAT "fat" @@ -78,6 +80,7 @@ #define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE #define TRAIT_PACIFISM "pacifism" #define TRAIT_IGNORESLOWDOWN "ignoreslow" +#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" #define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness #define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination #define TRAIT_DISFIGURED "disfigured" @@ -87,6 +90,7 @@ #define TRAIT_SLEEPIMMUNE "sleep_immunity" #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" +#define TRAIT_TESLA_SHOCKIMMUNE "tesla_shock_immunity" #define TRAIT_STABLEHEART "stable_heart" #define TRAIT_STABLELIVER "stable_liver" #define TRAIT_RESISTHEAT "resist_heat" @@ -133,6 +137,7 @@ #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_QUICK_CARRY "quick-carry" #define TRAIT_QUICKER_CARRY "quicker-carry" +#define TRAIT_QUICK_BUILD "quick-build" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_MAGIC_CHOKE "magic_choke" @@ -145,8 +150,53 @@ #define TRAIT_NORUNNING "norunning" // You walk! #define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. +#define TRAIT_NOGUT "nogutting" //Your chest cant be gutted of organs +#define TRAIT_NODECAP "nodecapping" //Your head cant be cut off in combat #define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" #define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events +#define TRAIT_PUGILIST "pugilist" //This guy punches people for a living +#define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage +#define TRAIT_PASSTABLE "passtable" +#define TRAIT_GIANT "giant" +#define TRAIT_DWARF "dwarf" +#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" +#define TRAIT_AGEUSIA "ageusia" +#define TRAIT_HEAVY_SLEEPER "heavy_sleeper" +#define TRAIT_NIGHT_VISION "night_vision" +#define TRAIT_LIGHT_STEP "light_step" +#define TRAIT_SILENT_STEP "silent_step" +#define TRAIT_SPEEDY_STEP "speedy_step" +#define TRAIT_SPIRITUAL "spiritual" +#define TRAIT_VORACIOUS "voracious" +#define TRAIT_SELF_AWARE "self_aware" +#define TRAIT_FREERUNNING "freerunning" +#define TRAIT_SKITTISH "skittish" +#define TRAIT_POOR_AIM "poor_aim" +#define TRAIT_PROSOPAGNOSIA "prosopagnosia" +#define TRAIT_DRUNK_HEALING "drunk_healing" +#define TRAIT_TAGGER "tagger" +#define TRAIT_PHOTOGRAPHER "photographer" +#define TRAIT_MUSICIAN "musician" +#define TRAIT_PERMABONER "permanent_arousal" +#define TRAIT_NEVERBONER "never_aroused" +#define TRAIT_MASO "masochism" +#define TRAIT_HIGH_BLOOD "high_blood" +#define TRAIT_PARA "paraplegic" +#define TRAIT_EMPATH "empath" +#define TRAIT_FRIENDLY "friendly" +#define TRAIT_SNOB "snob" +#define TRAIT_CULT_EYES "cult_eyes" +#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" +#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. +#define TRAIT_FREESPRINT "free_sprinting" +#define TRAIT_XRAY_VISION "xray_vision" +#define TRAIT_THERMAL_VISION "thermal_vision" +#define TRAIT_NO_TELEPORT "no-teleport" //you just can't +#define TRAIT_NO_INTERNALS "no-internals" +#define TRAIT_NO_ALCOHOL "alcohol_intolerance" +#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing. +#define TRAIT_FAST_PUMP "fast_pump" +#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good.... // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) @@ -173,47 +223,13 @@ //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it +#define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles +#define INNATE_TRAIT "innate" + // item traits #define TRAIT_NODROP "nodrop" -#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" -#define TRAIT_AGEUSIA "ageusia" -#define TRAIT_HEAVY_SLEEPER "heavy_sleeper" -#define TRAIT_NIGHT_VISION "night_vision" -#define TRAIT_LIGHT_STEP "light_step" -#define TRAIT_SILENT_STEP "silent_step" -#define TRAIT_SPEEDY_STEP "speedy_step" -#define TRAIT_SPIRITUAL "spiritual" -#define TRAIT_VORACIOUS "voracious" -#define TRAIT_SELF_AWARE "self_aware" -#define TRAIT_FREERUNNING "freerunning" -#define TRAIT_SKITTISH "skittish" -#define TRAIT_POOR_AIM "poor_aim" -#define TRAIT_PROSOPAGNOSIA "prosopagnosia" -#define TRAIT_DRUNK_HEALING "drunk_healing" -#define TRAIT_TAGGER "tagger" -#define TRAIT_PHOTOGRAPHER "photographer" -#define TRAIT_MUSICIAN "musician" -#define TRAIT_PERMABONER "permanent_arousal" -#define TRAIT_NEVERBONER "never_aroused" -#define TRAIT_NYMPHO "nymphomania" -#define TRAIT_MASO "masochism" -#define TRAIT_HIGH_BLOOD "high_blood" -#define TRAIT_PARA "paraplegic" -#define TRAIT_EMPATH "empath" -#define TRAIT_FRIENDLY "friendly" -#define TRAIT_CULT_EYES "cult_eyes" -#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" -#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. -#define TRAIT_FREESPRINT "free_sprinting" -#define TRAIT_XRAY_VISION "xray_vision" -#define TRAIT_THERMAL_VISION "thermal_vision" -#define TRAIT_NO_TELEPORT "no-teleport" //you just can't -#define TRAIT_NO_INTERNALS "no-internals" -#define TRAIT_NO_ALCOHOL "alcohol_intolerance" -#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing. - // common trait sources #define TRAIT_GENERIC "generic" #define EYE_DAMAGE "eye_damage" @@ -236,11 +252,12 @@ #define GHOSTROLE_TRAIT "ghostrole" #define APHRO_TRAIT "aphro" #define BLOODSUCKER_TRAIT "bloodsucker" -#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves #define SHOES_TRAIT "shoes" //inherited from your sweet kicks +#define GLOVE_TRAIT "glove" //inherited by your cool gloves +#define BOOK_TRAIT "granter (book)" // knowledge is power // unique trait sources, still defines -#define STATUE_MUTE "statue" +#define STATUE_TRAIT "statue" #define CLONING_POD_TRAIT "cloning-pod" #define VIRTUAL_REALITY_TRAIT "vr_trait" #define CHANGELING_DRAIN "drain" @@ -271,6 +288,7 @@ #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" #define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" +#define MARTIAL_ARTIST_TRAIT "martial_artist" #define SLEEPING_CARP_TRAIT "sleeping_carp" #define RISING_BASS_TRAIT "rising_bass" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" @@ -280,3 +298,8 @@ #define CLOWNOP_TRAIT "clown-op" #define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" +/// This trait is added by the active directional block system. +#define ACTIVE_BLOCK_TRAIT "active_block" +/// This trait is added by the parry system. +#define ACTIVE_PARRY_TRAIT "active_parry" +#define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name \ No newline at end of file diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index 9c91de0be2..d2eb034813 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -7,6 +7,19 @@ #define DM_ABSORB "Absorb" #define DM_UNABSORB "Un-absorb" +#define DIGESTABLE (1<<0) +#define SHOW_VORE_PREFS (1<<1) +#define DEVOURABLE (1<<2) +#define FEEDING (1<<3) +#define NO_VORE (1<<4) +#define OPEN_PANEL (1<<5) +#define ABSORBED (1<<6) +#define VORE_INIT (1<<7) +#define VOREPREF_INIT (1<<8) +#define LICKABLE (1<<9) + +#define MAX_VORE_FLAG (1<<10)-1 // change this whenever you add a vore flag, must be largest vore flag*2-1 + #define isbelly(A) istype(A, /obj/belly) #define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 0617c5d345..889e1bb1c0 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -19,3 +19,109 @@ #define VV_RESTORE_DEFAULT "Restore to Default" #define VV_MARKED_DATUM "Marked Datum" #define VV_BITFIELD "Bitfield" +#define VV_TEXT_LOCATE "Custom Reference Locate" +#define VV_PROCCALL_RETVAL "Return Value of Proccall" + +#define VV_MSG_MARKED "
    Marked Object" +#define VV_MSG_EDITED "
    Var Edited" +#define VV_MSG_DELETED "
    Deleted" + +#define VV_NORMAL_LIST_NO_EXPAND_THRESHOLD 50 +#define VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD 150 + +//#define IS_VALID_ASSOC_KEY(V) (istext(V) || ispath(V) || isdatum(V) || islist(V)) +#define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm.. + +//General helpers +#define VV_HREF_TARGET_INTERNAL(target, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]" +#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]" +#define VV_HREF_TARGET(target, href_key, text) "[text]" +#define VV_HREF_TARGETREF(targetref, href_key, text) "[text]" +#define VV_HREF_TARGET_1V(target, href_key, text, varname) "[text]" //for stuff like basic varedits, one variable +#define VV_HREF_TARGETREF_1V(targetref, href_key, text, varname) "[text]" + +#define GET_VV_TARGET locate(href_list[VV_HK_TARGET]) +#define GET_VV_VAR_TARGET href_list[VV_HK_VARNAME] + +//Helper for getting something to vv_do_topic in general +#define VV_TOPIC_LINK(datum, href_key, text) "text" + +//Helpers for vv_get_dropdown() +#define VV_DROPDOWN_OPTION(href_key, name) . += "" + +// VV HREF KEYS +#define VV_HK_TARGET "target" +#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs. + +// vv_do_list() keys +#define VV_HK_LIST_ADD "listadd" +#define VV_HK_LIST_EDIT "listedit" +#define VV_HK_LIST_CHANGE "listchange" +#define VV_HK_LIST_REMOVE "listremove" +#define VV_HK_LIST_ERASE_NULLS "listnulls" +#define VV_HK_LIST_ERASE_DUPES "listdupes" +#define VV_HK_LIST_SHUFFLE "listshuffle" +#define VV_HK_LIST_SET_LENGTH "listlen" + +// vv_do_basic() keys +#define VV_HK_BASIC_EDIT "datumedit" +#define VV_HK_BASIC_CHANGE "datumchange" +#define VV_HK_BASIC_MASSEDIT "massedit" + +// /datum +#define VV_HK_DELETE "delete" +#define VV_HK_EXPOSE "expose" +#define VV_HK_CALLPROC "proc_call" +#define VV_HK_MARK "mark" +#define VV_HK_ADDCOMPONENT "addcomponent" +#define VV_HK_MODIFY_TRAITS "modtraits" + +// /atom +#define VV_HK_MODIFY_TRANSFORM "atom_transform" +#define VV_HK_ADD_REAGENT "addreagent" +#define VV_HK_TRIGGER_EMP "empulse" +#define VV_HK_TRIGGER_EXPLOSION "explode" +#define VV_HK_AUTO_RENAME "auto_rename" + +// /obj +#define VV_HK_OSAY "osay" +#define VV_HK_MASS_DEL_TYPE "mass_delete_type" +#define VV_HK_ARMOR_MOD "mod_obj_armor" + +// /mob +#define VV_HK_GIB "gib" +#define VV_HK_GIVE_SPELL "give_spell" +#define VV_HK_REMOVE_SPELL "remove_spell" +#define VV_HK_GIVE_DISEASE "give_disease" +#define VV_HK_GODMODE "godmode" +#define VV_HK_DROP_ALL "dropall" +#define VV_HK_REGEN_ICONS "regen_icons" +#define VV_HK_PLAYER_PANEL "player_panel" +#define VV_HK_BUILDMODE "buildmode" +#define VV_HK_DIRECT_CONTROL "direct_control" +#define VV_HK_OFFER_GHOSTS "offer_ghosts" + +// /mob/living/carbon +#define VV_HK_MAKE_AI "aiify" +#define VV_HK_MODIFY_BODYPART "mod_bodypart" +#define VV_HK_MODIFY_ORGANS "organs_modify" +#define VV_HK_HALLUCINATION "force_hallucinate" +#define VV_HK_MARTIAL_ART "give_martial_art" +#define VV_HK_GIVE_TRAUMA "give_trauma" +#define VV_HK_CURE_TRAUMA "cure_trauma" + +// /mob/living/carbon/human +#define VV_HK_COPY_OUTFIT "copy_outfit" +#define VV_HK_MOD_QUIRKS "quirkmod" +#define VV_HK_MAKE_MONKEY "human_monkify" +#define VV_HK_MAKE_CYBORG "human_cyborgify" +#define VV_HK_MAKE_SLIME "human_slimeify" +#define VV_HK_MAKE_ALIEN "human_alienify" +#define VV_HK_SET_SPECIES "setspecies" +#define VV_HK_PURRBATION "purrbation" + +// misc +#define VV_HK_SPACEVINE_PURGE "spacevine_purge" + +// paintings +#define VV_HK_REMOVE_PAINTING "remove_painting" diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index 9afae12c30..5e57dd5328 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -1,9 +1,6 @@ //THIS FILE CONTAINS CONSTANTS, PROCS, AND OTHER THINGS// ///////////////////////////////////////////////////////// -/mob/proc/setClickCooldown(var/timeout) - next_move = max(world.time + timeout, next_move) - /proc/get_matrix_largest() var/matrix/mtrx=new() return mtrx.Scale(2) @@ -105,16 +102,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) if(!src.holder) return message_admins("[key_name_admin(usr)] manually reloaded mentors") -//LOOC toggles -/client/verb/listen_looc() - set name = "Show/Hide LOOC" - set category = "Preferences" - set desc = "Toggles seeing LocalOutOfCharacter chat" - prefs.chat_toggles ^= CHAT_LOOC - prefs.save_preferences() - src << "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." - SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /mob/living/carbon/proc/has_penis() var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS) if(G && istype(G, /obj/item/organ/genital/penis)) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index f16b566b00..ba29205452 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -11,6 +11,7 @@ #define LAZYINITLIST(L) if (!L) L = list() #define UNSETEMPTY(L) if (L && !length(L)) L = null +#define LAZYCOPY(L) (L ? L.Copy() : list() ) #define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } } #define LAZYADD(L, I) if(!L) { L = list(); } L += I; #define LAZYOR(L, I) if(!L) { L = list(); } L |= I; @@ -21,34 +22,48 @@ #define LAZYCLEARLIST(L) if(L) L.Cut() #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) #define reverseList(L) reverseRange(L.Copy()) +#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V); +#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; } -// binary search sorted insert -// IN: Object to be inserted -// LIST: List to insert object into -// TYPECONT: The typepath of the contents of the list -// COMPARE: The variable on the objects to compare -#define BINARY_INSERT(IN, LIST, TYPECONT, COMPARE) \ - var/__BIN_CTTL = length(LIST);\ - if(!__BIN_CTTL) {\ - LIST += IN;\ - } else {\ - var/__BIN_LEFT = 1;\ - var/__BIN_RIGHT = __BIN_CTTL;\ - var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ - var/##TYPECONT/__BIN_ITEM;\ - while(__BIN_LEFT < __BIN_RIGHT) {\ - __BIN_ITEM = LIST[__BIN_MID];\ - if(__BIN_ITEM.##COMPARE <= IN.##COMPARE) {\ - __BIN_LEFT = __BIN_MID + 1;\ - } else {\ - __BIN_RIGHT = __BIN_MID;\ +/// Passed into BINARY_INSERT to compare keys +#define COMPARE_KEY __BIN_LIST[__BIN_MID] +/// Passed into BINARY_INSERT to compare values +#define COMPARE_VALUE __BIN_LIST[__BIN_LIST[__BIN_MID]] + +/**** + * Binary search sorted insert + * INPUT: Object to be inserted + * LIST: List to insert object into + * TYPECONT: The typepath of the contents of the list + * COMPARE: The object to compare against, usualy the same as INPUT + * COMPARISON: The variable on the objects to compare + * COMPTYPE: How the current bin item to compare against COMPARE is fetched. By key or value. + */ +#define BINARY_INSERT(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \ + do {\ + var/list/__BIN_LIST = LIST;\ + var/__BIN_CTTL = length(__BIN_LIST);\ + if(!__BIN_CTTL) {\ + __BIN_LIST += INPUT;\ + } else {\ + var/__BIN_LEFT = 1;\ + var/__BIN_RIGHT = __BIN_CTTL;\ + var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + var/##TYPECONT/__BIN_ITEM;\ + while(__BIN_LEFT < __BIN_RIGHT) {\ + __BIN_ITEM = COMPTYPE;\ + if(__BIN_ITEM.##COMPARISON <= COMPARE.##COMPARISON) {\ + __BIN_LEFT = __BIN_MID + 1;\ + } else {\ + __BIN_RIGHT = __BIN_MID;\ + };\ + __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ };\ - __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + __BIN_ITEM = COMPTYPE;\ + __BIN_MID = __BIN_ITEM.##COMPARISON > COMPARE.##COMPARISON ? __BIN_MID : __BIN_MID + 1;\ + __BIN_LIST.Insert(__BIN_MID, INPUT);\ };\ - __BIN_ITEM = LIST[__BIN_MID];\ - __BIN_MID = __BIN_ITEM.##COMPARE > IN.##COMPARE ? __BIN_MID : __BIN_MID + 1;\ - LIST.Insert(__BIN_MID, IN);\ - } + } while(FALSE) //Returns a list in plain english as a string /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) @@ -231,40 +246,77 @@ //Picks a random element from a list based on a weighting system: //1. Adds up the total of weights for each element -//2. Gets a number between 1 and that total +//2. Gets the total from 0% to 100% of previous total value. //3. For each element in the list, subtracts its weighting from that number //4. If that makes the number 0 or less, return that element. -/proc/pickweight(list/L) +/proc/pickweight(list/L, base_weight = 1) var/total = 0 var/item for (item in L) if (!L[item]) - L[item] = 1 + L[item] = base_weight total += L[item] - total = rand(1, total) + total = rand() * total for (item in L) - total -=L [item] + total -= L[item] if (total <= 0) return item - return null - -/proc/pickweightAllowZero(list/L) //The original pickweight proc will sometimes pick entries with zero weight. I'm not sure if changing the original will break anything, so I left it be. +//Picks a number of elements from a list based on weight. +//This is highly optimised and good for things like grabbing 200 items from a list of 40,000 +//Much more efficient than many pickweight calls +/proc/pickweight_mult(list/L, quantity, base_weight = 1) + //First we total the list as normal var/total = 0 var/item for (item in L) if (!L[item]) - L[item] = 0 + L[item] = base_weight total += L[item] - total = rand(0, total) - for (item in L) - total -=L [item] - if (total <= 0 && L[item]) - return item + //Next we will make a list of randomly generated numbers, called Requests + //It is critical that this list be sorted in ascending order, so we will build it in that order + //First one is free, so we start counting at 2 + var/list/requests = list(rand(1, total)) + for (var/i in 2 to quantity) + //Each time we generate the next request + var/newreq = rand()* total + //We will loop through all existing requests + for (var/j in 1 to requests.len) + //We keep going through the list until we find an element which is bigger than the one we want to add + if (requests[j] > newreq) + //And then we insert the newqreq at that point, pushing everything else forward + requests.Insert(j, newreq) + break - return null + + + //Now when we get here, we have a list of random numbers sorted in ascending order. + //The length of that list is equal to Quantity passed into this function + //Next we make a list to store results + var/list/results = list() + + //Zero the total, we'll reuse it + total = 0 + + //Now we will iterate forward through the items list, adding each weight to the total + for (item in L) + total += L[item] + + //After each item we do a while loop + while (requests.len && total >= requests[1]) + //If the total is higher than the value of the first request + results += item //We add this item to the results list + requests.Cut(1,2) //And we cut off the top of the requests list + + //This while loop will repeat until the next request is higher than the total. + //The current item might be added to the results list many times, in this process + + //By the time we get here: + //Requests will be empty + //Results will have a length of quality + return results //Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) @@ -274,6 +326,13 @@ . = L[picked] L.Cut(picked,picked+1) //Cut is far more efficient that Remove() +//Pick a random element from the list by weight and remove it from the list. +//Result is returned as a list in the format list(key, value) +/proc/pickweight_n_take(list/L, base_weight = 1) + if (L.len) + . = pickweight(L, base_weight) + L.Remove(.) + //Returns the top(last) element from the list and removes it from the list (typical stack function) /proc/pop(list/L) if(L.len) @@ -550,6 +609,29 @@ for(var/thing in flat_list) .[thing] = TRUE +/proc/deep_list2params(list/deep_list) + var/list/L = list() + for(var/i in deep_list) + var/key = i + if(isnum(key)) + L += "[key]" + continue + if(islist(key)) + key = deep_list2params(key) + else if(!istext(key)) + key = "[REF(key)]" + L += "[key]" + var/value = deep_list[key] + if(!isnull(value)) + if(islist(value)) + value = deep_list2params(value) + else if(!(istext(key) || isnum(key))) + value = "[REF(value)]" + L["[key]"] = "[value]" + return list2params(L) + +#define NUMLIST2TEXTLIST(list) splittext(list2params(list), "&") + //Picks from the list, with some safeties, and returns the "default" arg if it fails #define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) @@ -589,3 +671,13 @@ for(var/key in input) ret += key return ret + +/proc/is_type_in_ref_list(path, list/L) + if(!ispath(path))//not a path + return + for(var/i in L) + var/datum/D = i + if(!istype(D))//not an usable reference + continue + if(istype(D, path)) + return TRUE diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8ef924eea4..1935dcc8a5 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -4,7 +4,9 @@ #define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) #define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) #define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) -#define WRITE_LOG(log, text) rustg_log_write(log, text) +//This is an external call, "true" and "false" are how rust parses out booleans +#define WRITE_LOG(log, text) rustg_log_write(log, text, "true") +#define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") @@ -53,7 +55,7 @@ WRITE_LOG(GLOB.world_game_log, "ADMIN: DSAY: [text]") /proc/log_consent(text) - WRITE_LOG(GLOB.world_game_log,"CONSENT: [text]") + WRITE_LOG(GLOB.world_game_log, "CONSENT: [text]") /* All other items are public. */ /proc/log_game(text) @@ -64,6 +66,9 @@ if (CONFIG_GET(flag/log_virus)) WRITE_LOG(GLOB.world_virus_log, "VIRUS: [text]") +/proc/log_asset(text) + WRITE_LOG(GLOB.world_asset_log, "ASSET: [text]") + /proc/log_access(text) if (CONFIG_GET(flag/log_access)) WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]") @@ -152,6 +157,9 @@ /proc/log_subsystem(subsystem, text) WRITE_LOG(GLOB.subsystem_log, "[subsystem]: [text]") +/proc/log_click(atom/object, atom/location, control, params, client/C, event = "clicked", unexpected) + WRITE_LOG(GLOB.click_log, "[unexpected? "ERROR" :"CLICK"]: [C.ckey] - [event] : [istype(object)? "[object] ([COORD(object)])" : object] | [istype(location)? "[location] ([COORD(location)])" : location] | [control] | [params]") + /* Log to both DD and the logfile. */ /proc/log_world(text) #ifdef USE_CUSTOM_ERROR_HANDLER @@ -181,7 +189,7 @@ /proc/start_log(log) WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------") -/* ui logging */ +/* ui logging */ /proc/log_tgui(text) WRITE_LOG(GLOB.tgui_log, text) diff --git a/code/__HELPERS/angles.dm b/code/__HELPERS/angles.dm new file mode 100644 index 0000000000..a3fc2404bd --- /dev/null +++ b/code/__HELPERS/angles.dm @@ -0,0 +1,39 @@ +/proc/get_projectile_angle(atom/source, atom/target) + var/sx = source.x * world.icon_size + var/sy = source.y * world.icon_size + var/tx = target.x * world.icon_size + var/ty = target.y * world.icon_size + var/atom/movable/AM + if(ismovable(source)) + AM = source + sx += AM.step_x + sy += AM.step_y + if(ismovable(target)) + AM = target + tx += AM.step_x + ty += AM.step_y + return SIMPLIFY_DEGREES(arctan(ty - sy, tx - sx)) + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) + return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +/proc/Get_Pixel_Angle(var/y, var/x)//for getting the angle when animating something's pixel_x and pixel_y + if(!y) + return (x>=0)?90:270 + .=arctan(x/y) + if(y<0) + .+=180 + else if(x<0) + .+=360 diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 715f17af92..e2249dbb63 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -58,6 +58,11 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng else if(isarea(areatype)) var/area/areatemp = areatype areatype = areatemp.type + else if(islist(areatype)) + var/list/turfs = list() + for(var/A in areatype) + turfs += get_area_turfs(A) + return turfs else if(!ispath(areatype)) return null @@ -165,6 +170,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/eng newA.setup(str) newA.set_dynamic_lighting() newA.has_gravity = oldA.has_gravity + newA.noteleport = oldA.noteleport else newA = area_choice diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index c95896d853..5fb4d05d42 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -104,7 +104,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") var/a_sign = num2sign(initial(A.value) * -1) var/b_sign = num2sign(initial(B.value) * -1) - // Neutral traits go last. + // Neutral traits go last if(a_sign == 0) a_sign = 2 if(b_sign == 0) @@ -116,4 +116,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") if(a_sign != b_sign) return a_sign - b_sign else - return sorttext(b_name, a_name) \ No newline at end of file + return sorttext(b_name, a_name) + +/proc/cmp_item_block_priority_asc(obj/item/A, obj/item/B) + return A.block_priority - B.block_priority diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm new file mode 100644 index 0000000000..f1f483c345 --- /dev/null +++ b/code/__HELPERS/do_after.dm @@ -0,0 +1,323 @@ +/** + * Higher overhead "advanced" version of do_after. + * @params + * - atom/user is the atom doing the action or the "physical" user + * - delay is time in deciseconds + * - atom/target is the atom the action is being done to, defaults to user + * - do_after_flags see __DEFINES/flags/do_after.dm for details. + * - datum/callback/extra_checks - Every time this ticks, extra_checks() is invoked with (user, delay, target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool). + * Stage can be DO_AFTER_STARTING, DO_AFTER_PROGRESSING, DO_AFTER_FINISHING + * If it returns DO_AFTER_STOP, this breaks. + * If it returns nothing, all other checks are done. + * If it returns DO_AFTER_PROCEED, all other checks are ignored. + * - required_mobility_flags is checked with CHECK_ALL_MOBILITY. Will immediately fail if the user isn't a mob. + * - requried_combat_flags is checked with CHECK_MULTIPLE_BITFIELDS. Will immediately fail if the user isn't a mob. + * - mob/living/mob_redirect - advanced option: If this is specified, movement and mobility/combat flag checks will use this instead of user. Progressbars will also go to this. + * - obj/item/tool - The tool we're using. See do_after flags for details. + */ +#define INVOKE_CALLBACK cb_return = extra_checks?.Invoke(user, delay, target, world.time - starttime, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool) +#define CHECK_FLAG_FAILURE ((required_mobility_flags || required_combat_flags) && (!living_user || (required_mobility_flags && !CHECK_ALL_MOBILITY(living_user, required_mobility_flags)) || (required_combat_flags && !CHECK_MULTIPLE_BITFIELDS(living_user.combat_flags, required_combat_flags)))) +#define TIMELEFT (world.time - starttime) +/proc/do_after_advanced(atom/user, delay, atom/target, do_after_flags, datum/callback/extra_checks, required_mobility_flags, required_combat_flags, mob/living/mob_redirect, obj/item/tool) + // CHECK AND SET VARIABLES + if(!user) + return FALSE + if(!target) + target = user + if((user.loc == null) || (target.loc == null)) + return FALSE + var/mob/living/living_user = mob_redirect + if(!living_user && isliving(user)) + living_user = user + var/stage = DO_AFTER_STARTING + var/startlocuser = user.loc + var/startloctarget = target.loc + var/turf/userturf = get_turf(user) + var/turf/targetturf = get_turf(target) + if(!userturf || !targetturf) + return FALSE + if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) + return FALSE + var/starttime = world.time + var/endtime = world.time + delay + var/obj/item/initially_held_item = mob_redirect?.get_active_held_item() + if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user) + delay *= living_user.do_after_coefficent() + var/atom/movable/AM_user = ismovable(user) && user + var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir + var/initial_dx = targetturf.x - userturf.x + var/initial_dy = targetturf.y - userturf.y + var/dx = initial_dx + var/dy = initial_dy + // DO OUR STARTING CHECKS + var/cb_return + INVOKE_CALLBACK + if(cb_return == DO_AFTER_STOP) + return FALSE + else if(cb_return != DO_AFTER_PROCEED) + if(CHECK_FLAG_FAILURE) + return FALSE + // SETUP LOOP + var/datum/progressbar/progbar + if(living_user) + if(!(do_after_flags & DO_AFTER_NO_PROGRESSBAR)) + progbar = new(living_user, delay, target) + // MAIN LOOP + . = TRUE + if(!delay) + return + var/obj/item/held + var/locchanged + var/ctu + var/ctt + while(world.time < endtime) + stoplag(1) + progbar?.update(TIMELEFT) + if(QDELETED(user) || QDELETED(target) || (user.loc == null) || (target.loc == null)) + . = FALSE + break + INVOKE_CALLBACK + if(cb_return == DO_AFTER_STOP) + . = FALSE + break + else if(cb_return == DO_AFTER_PROCEED) + continue + // otherwise, go through our normal checks. + if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget))) + . = FALSE + break + else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE) + ctu = get_turf(user) + ctt = get_turf(target) + locchanged = (userturf != ctu) || (targetturf != ctt) + userturf = ctu + targetturf = ctt + dx = targetturf.x - userturf.x + dy = targetturf.y - userturf.y + if((dx != initial_dx) || (dy != initial_dy)) + . = FALSE + break + if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY)) + . = FALSE + break + if(!AM_user.inertia_dir) + drifting = FALSE + if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) + return FALSE + if(CHECK_FLAG_FAILURE) + . = FALSE + break + held = living_user?.get_active_held_item() + if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item))) + . = FALSE + break + if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes()))) + . = FALSE + break + + // CLEANUP + qdel(progbar) + // If we failed, just return. + if(!.) + return FALSE + // DO FINISHING CHECKS + if(QDELETED(user) || QDELETED(target)) + return FALSE + INVOKE_CALLBACK + if(cb_return == DO_AFTER_STOP) + return FALSE + else if(cb_return == DO_AFTER_PROCEED) + return TRUE + if(CHECK_FLAG_FAILURE) + return FALSE + if(((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER) && (user.loc != startlocuser)) || ((do_after_flags & DO_AFTER_DISALLOW_MOVING_ABSOLUTE_TARGET) && (target.loc != startloctarget))) + return FALSE + else if(do_after_flags & DO_AFTER_DISALLOW_MOVING_RELATIVE) + ctu = get_turf(user) + ctt = get_turf(target) + locchanged = (userturf != ctu) || (targetturf != ctt) + userturf = ctu + targetturf = ctt + dx = targetturf.x - userturf.x + dy = targetturf.y - userturf.y + if((dx != initial_dx) || (dy != initial_dy)) + return FALSE + if(locchanged && !drifting && !(do_after_flags & DO_AFTER_ALLOW_NONSPACEDRIFT_RELATIVITY)) + return FALSE + if((do_after_flags & DO_AFTER_REQUIRES_USER_ON_TURF) && !isturf(user.loc)) + return FALSE + held = living_user?.get_active_held_item() + if((do_after_flags & DO_AFTER_DISALLOW_ACTIVE_ITEM_CHANGE) && (held != (tool || initially_held_item))) + return FALSE + if((do_after_flags & DO_AFTER_REQUIRE_FREE_HAND_OR_TOOL) && (!living_user?.is_holding(tool) && !length(living_user?.get_empty_held_indexes()))) + return FALSE + +#undef INVOKE_CALLBACK +#undef CHECK_FLAG_FAILURE + +/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = FALSE, resume_time = 0 SECONDS) + if(!user || !target) + return 0 + var/user_loc = user.loc + + var/drifting = 0 + if(!user.Process_Spacemove(0) && user.inertia_dir) + drifting = 1 + + var/target_loc = target.loc + + var/holding = user.get_active_held_item() + var/datum/progressbar/progbar + if (progress) + progbar = new(user, time, target) + + var/endtime = world.time+time + var/starttime = world.time + . = 1 + while (world.time + resume_time < endtime) + stoplag(1) + if (progress) + progbar.update(world.time - starttime + resume_time) + if(QDELETED(user) || QDELETED(target)) + . = 0 + break + if(uninterruptible) + continue + + if(drifting && !user.inertia_dir) + drifting = 0 + user_loc = user.loc + + if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) + . = 0 + break + if (progress) + qdel(progbar) + + +//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action +/mob/proc/break_do_after_checks(list/checked_health, check_clicks) + if(check_clicks && next_move > world.time) + return FALSE + return TRUE + +//pass a list in the format list("health" = mob's health var) to check health during this +/mob/living/break_do_after_checks(list/checked_health, check_clicks) + if(islist(checked_health)) + if(health < checked_health["health"]) + return FALSE + checked_health["health"] = health + return ..() + +/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE), resume_time = 0 SECONDS) + if(!user) + return 0 + var/atom/Tloc = null + if(target && !isturf(target)) + Tloc = target.loc + + var/atom/Uloc = user.loc + + var/drifting = 0 + if(!user.Process_Spacemove(0) && user.inertia_dir) + drifting = 1 + + var/holding = user.get_active_held_item() + + var/holdingnull = 1 //User's hand started out empty, check for an empty hand + if(holding) + holdingnull = 0 //Users hand started holding something, check to see if it's still holding that + + delay *= user.do_after_coefficent() + + var/datum/progressbar/progbar + if (progress) + progbar = new(user, delay, target) + + var/endtime = world.time + delay + var/starttime = world.time + . = 1 + var/mob/living/L = isliving(user) && user //evals to last thing eval'd + while (world.time + resume_time < endtime) + stoplag(1) + if (progress) + progbar.update(world.time - starttime + resume_time) + + if(drifting && !user.inertia_dir) + drifting = 0 + Uloc = user.loc + + if(L && !CHECK_ALL_MOBILITY(L, required_mobility_flags)) + . = 0 + break + + if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) + . = 0 + break + + if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc)) + if((Uloc != Tloc || Tloc != user) && !drifting) + . = 0 + break + + if(needhand) + //This might seem like an odd check, but you can still need a hand even when it's empty + //i.e the hand is used to pull some item/tool out of the construction + if(!holdingnull) + if(!holding) + . = 0 + break + if(user.get_active_held_item() != holding) + . = 0 + break + if (progress) + qdel(progbar) + +/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1 + . = 1 + return + +/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks) + if(!user || !targets) + return 0 + if(!islist(targets)) + targets = list(targets) + var/user_loc = user.loc + + var/drifting = 0 + if(!user.Process_Spacemove(0) && user.inertia_dir) + drifting = 1 + + var/list/originalloc = list() + for(var/atom/target in targets) + originalloc[target] = target.loc + + var/holding = user.get_active_held_item() + var/datum/progressbar/progbar + if(progress) + progbar = new(user, time, targets[1]) + + var/endtime = world.time + time + var/starttime = world.time + . = 1 + mainloop: + while(world.time < endtime) + stoplag(1) + if(progress) + progbar.update(world.time - starttime) + if(QDELETED(user) || !targets) + . = 0 + break + if(uninterruptible) + continue + + if(drifting && !user.inertia_dir) + drifting = 0 + user_loc = user.loc + + for(var/atom/target in targets) + if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) + . = 0 + break mainloop + if(progbar) + qdel(progbar) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 7703b13018..8d7941fdf8 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -183,7 +183,7 @@ return -// Better recursive loop, technically sort of not actually recursive cause that shit is retarded, enjoy. +// Better recursive loop, technically sort of not actually recursive cause that shit is stupid, enjoy. //No need for a recursive limit either /proc/recursive_mob_check(atom/O,client_check=1,sight_check=1,include_radio=1) @@ -249,6 +249,15 @@ SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing, .) processing += A.contents +//viewers() but with a signal, for blacklisting. +/proc/fov_viewers(depth = world.view, atom/center) + if(!center) + return + . = viewers(depth, center) + for(var/k in .) + var/mob/M = k + SEND_SIGNAL(M, COMSIG_MOB_FOV_VIEWER, center, depth, .) + /proc/get_mobs_in_radio_ranges(list/obj/item/radio/radios) . = list() // Returns a list of mobs who can hear any of the radios given in @radios @@ -425,8 +434,7 @@ candidates -= M /proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE) - var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(list(/datum/element/ghost_role_eligibility)) - var/list/candidates = eligibility.get_all_ghost_role_eligible() + var/list/candidates = get_all_ghost_role_eligible() return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) /proc/pollCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null) @@ -507,6 +515,19 @@ return winset(C, "mainwindow", "flash=5") +//Recursively checks if an item is inside a given type, even through layers of storage. Returns the atom if it finds it. +/proc/recursive_loc_check(atom/movable/target, type) + var/atom/A = target + if(istype(A, type)) + return A + + while(!istype(A.loc, type)) + if(!A.loc) + return + A = A.loc + + return A.loc + /proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) if(!SSticker.IsRoundInProgress() || QDELETED(character)) return @@ -523,22 +544,6 @@ var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common -/proc/GetHexColors(const/hexa) - return list( - GetRedPart(hexa)/ 255, - GetGreenPart(hexa)/ 255, - GetBluePart(hexa)/ 255 - ) - -/proc/GetRedPart(const/hexa) - return hex2num(copytext(hexa, 2, 4)) - -/proc/GetGreenPart(const/hexa) - return hex2num(copytext(hexa, 4, 6)) - -/proc/GetBluePart(const/hexa) - return hex2num(copytext(hexa, 6, 8)) - /proc/lavaland_equipment_pressure_check(turf/T) . = FALSE if(!istype(T)) @@ -581,4 +586,4 @@ var/area/A = C.area if(GLOB.typecache_powerfailure_safe_areas[A.type]) continue - C.energy_fail(rand(duration_min,duration_max)) \ No newline at end of file + C.energy_fail(rand(duration_min,duration_max)) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 38e25b04c5..0b5c60a95a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -75,6 +75,8 @@ var/datum/emote/E = new path() E.emote_list[E.key] = E + init_keybindings() + //Uplink Items for(var/path in subtypesof(/datum/uplink_item)) var/datum/uplink_item/I = path @@ -88,6 +90,7 @@ init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes) INVOKE_ASYNC(GLOBAL_PROC, /proc/init_ref_coin_values) //so the current procedure doesn't sleep because of UNTIL() + INVOKE_ASYNC(GLOBAL_PROC, /proc/setupGenetics) //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. @@ -113,3 +116,25 @@ UNTIL(C.flags_1 & INITIALIZED_1) //we want to make sure the value is calculated and not null. GLOB.coin_values[path] = C.value qdel(C) + +/proc/setupGenetics() + var/list/mutations = subtypesof(/datum/mutation/human) + shuffle_inplace(mutations) + for(var/A in subtypesof(/datum/generecipe)) + var/datum/generecipe/GR = A + GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result) + for(var/i in 1 to LAZYLEN(mutations)) + var/path = mutations[i] //byond gets pissy when we do it in one line + var/datum/mutation/human/B = new path () + B.alias = "Mutation #[i]" + GLOB.all_mutations[B.type] = B + GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks) + if(B.locked) + continue + if(B.quality == POSITIVE) + GLOB.good_mutations |= B + else if(B.quality == NEGATIVE) + GLOB.bad_mutations |= B + else if(B.quality == MINOR_NEGATIVE) + GLOB.not_good_mutations |= B + CHECK_TICK \ No newline at end of file diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 7e52fbe273..801a2cd431 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -61,7 +61,7 @@ var/adjacencies = 0 var/atom/movable/AM - if(ismovableatom(A)) + if(ismovable(A)) AM = A if(AM.can_be_unanchored && !AM.anchored) return 0 diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index 3e6e88c8fa..030a324614 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -12,3 +12,5 @@ #define is_reserved_level(z) SSmapping.level_trait(z, ZTRAIT_RESERVED) #define is_away_level(z) SSmapping.level_trait(z, ZTRAIT_AWAY) + +#define is_vr_level(z) SSmapping.level_trait(z, ZTRAIT_VR) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7548c313fa..91826ee314 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -47,7 +47,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list) return pick(GLOB.socks_list) -/proc/random_features(intendedspecies) +/proc/random_features(intendedspecies, intended_gender) if(!GLOB.tails_list_human.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) if(!GLOB.tails_list_lizard.len) @@ -149,7 +149,13 @@ var/color2 = random_short_color() var/color3 = random_short_color() - //CIT CHANGE - changes this entire return to support cit's snowflake parts + var/body_model = MALE + switch(intended_gender) + if(MALE, FEMALE) + body_model = intended_gender + if(PLURAL) + body_model = pick(MALE,FEMALE) + return(list( "mcolor" = color1, "mcolor2" = color2, @@ -157,9 +163,11 @@ "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", + "wings_color" = "FFF", "deco_wings" = "None", "snout" = pick(GLOB.snouts_list), - "horns" = pick(GLOB.horns_list), + "horns" = "None", + "horns_color" = "85615a", "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), @@ -168,7 +176,7 @@ "caps" = pick(GLOB.caps_list), "insect_wings" = pick(GLOB.insect_wings_list), "insect_fluff" = "None", - "insect_markings" = pick(GLOB.insect_markings_list), + "insect_markings" = pick(GLOB.insect_markings_list), "taur" = "None", "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None", "mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None", @@ -208,8 +216,10 @@ "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_antenna" = "None", "flavor_text" = "", + "silicon_flavor_text" = "", "meat_type" = "Mammalian", - "body_model" = MALE + "body_model" = body_model, + "body_size" = RESIZE_DEFAULT_SIZE )) /proc/random_hair_style(gender) @@ -261,24 +271,30 @@ if(!findname(.)) break -/proc/random_skin_tone() - return pick(GLOB.skin_tones) +#define SKINTONE2HEX(skin_tone) GLOB.skin_tones[skin_tone] || skin_tone +/proc/random_skin_tone() + return pick(GLOB.skin_tones - GLOB.nonstandard_skin_tones) + +//ordered by amount of tan. Keep the nonstandard skin tones last. GLOBAL_LIST_INIT(skin_tones, list( - "albino", - "caucasian1", - "caucasian2", - "caucasian3", - "latino", - "mediterranean", - "asian1", - "asian2", - "arab", - "indian", - "african1", - "african2" + "albino" = "#fff4e6", + "caucasian1" = "#ffe0d1", + "caucasian2" = "#fcccb3", + "caucasian3" = "#e8b59b", + "latino" = "#d9ae96", + "mediterranean" = "#c79b8b", + "asian1" = "#ffdeb3", + "asian2" = "#e3ba84", + "arab" = "#c4915e", + "indian" = "#b87840", + "african1" = "#754523", + "african2" = "#471c18", + "orange" = "#ffc905" //Spray tan overdose. )) +GLOBAL_LIST_INIT(nonstandard_skin_tones, list("orange")) + GLOBAL_LIST_EMPTY(species_list) /proc/age2agedescription(age) @@ -304,173 +320,6 @@ GLOBAL_LIST_EMPTY(species_list) else return "unknown" -/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = 0) - if(!user || !target) - return 0 - var/user_loc = user.loc - - var/drifting = 0 - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 - - var/target_loc = target.loc - - var/holding = user.get_active_held_item() - var/datum/progressbar/progbar - if (progress) - progbar = new(user, time, target) - - var/endtime = world.time+time - var/starttime = world.time - . = 1 - while (world.time < endtime) - stoplag(1) - if (progress) - progbar.update(world.time - starttime) - if(QDELETED(user) || QDELETED(target)) - . = 0 - break - if(uninterruptible) - continue - - if(drifting && !user.inertia_dir) - drifting = 0 - user_loc = user.loc - - if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) - . = 0 - break - if (progress) - qdel(progbar) - - -//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action -/mob/proc/break_do_after_checks(list/checked_health, check_clicks) - if(check_clicks && next_move > world.time) - return FALSE - return TRUE - -//pass a list in the format list("health" = mob's health var) to check health during this -/mob/living/break_do_after_checks(list/checked_health, check_clicks) - if(islist(checked_health)) - if(health < checked_health["health"]) - return FALSE - checked_health["health"] = health - return ..() - -/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE)) - if(!user) - return 0 - var/atom/Tloc = null - if(target && !isturf(target)) - Tloc = target.loc - - var/atom/Uloc = user.loc - - var/drifting = 0 - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 - - var/holding = user.get_active_held_item() - - var/holdingnull = 1 //User's hand started out empty, check for an empty hand - if(holding) - holdingnull = 0 //Users hand started holding something, check to see if it's still holding that - - delay *= user.do_after_coefficent() - - var/datum/progressbar/progbar - if (progress) - progbar = new(user, delay, target) - - var/endtime = world.time + delay - var/starttime = world.time - . = 1 - var/mob/living/L = isliving(user) && user //evals to last thing eval'd - while (world.time < endtime) - stoplag(1) - if (progress) - progbar.update(world.time - starttime) - - if(drifting && !user.inertia_dir) - drifting = 0 - Uloc = user.loc - - if(L && !CHECK_ALL_MOBILITY(L, required_mobility_flags)) - . = 0 - break - - if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) - . = 0 - break - - if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc)) - if((Uloc != Tloc || Tloc != user) && !drifting) - . = 0 - break - - if(needhand) - //This might seem like an odd check, but you can still need a hand even when it's empty - //i.e the hand is used to pull some item/tool out of the construction - if(!holdingnull) - if(!holding) - . = 0 - break - if(user.get_active_held_item() != holding) - . = 0 - break - if (progress) - qdel(progbar) - -/mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1 - . = 1 - return - -/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks) - if(!user || !targets) - return 0 - if(!islist(targets)) - targets = list(targets) - var/user_loc = user.loc - - var/drifting = 0 - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 - - var/list/originalloc = list() - for(var/atom/target in targets) - originalloc[target] = target.loc - - var/holding = user.get_active_held_item() - var/datum/progressbar/progbar - if(progress) - progbar = new(user, time, targets[1]) - - var/endtime = world.time + time - var/starttime = world.time - . = 1 - mainloop: - while(world.time < endtime) - stoplag(1) - if(progress) - progbar.update(world.time - starttime) - if(QDELETED(user) || !targets) - . = 0 - break - if(uninterruptible) - continue - - if(drifting && !user.inertia_dir) - drifting = 0 - user_loc = user.loc - - for(var/atom/target in targets) - if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) - . = 0 - break mainloop - if(progbar) - qdel(progbar) - /proc/is_species(A, species_datum) . = FALSE if(ishuman(A)) @@ -580,3 +429,16 @@ GLOBAL_LIST_EMPTY(species_list) chosen = pick(mob_spawn_meancritters) var/mob/living/simple_animal/C = new chosen(spawn_location) return C + +/proc/passtable_on(target, source) + var/mob/living/L = target + if(!HAS_TRAIT(L, TRAIT_PASSTABLE) && L.pass_flags & PASSTABLE) + ADD_TRAIT(L, TRAIT_PASSTABLE, INNATE_TRAIT) + ADD_TRAIT(L, TRAIT_PASSTABLE, source) + L.pass_flags |= PASSTABLE + +/proc/passtable_off(target, source) + var/mob/living/L = target + REMOVE_TRAIT(L, TRAIT_PASSTABLE, source) + if(!HAS_TRAIT(L, TRAIT_PASSTABLE)) + L.pass_flags &= ~PASSTABLE diff --git a/code/__HELPERS/mouse_control.dm b/code/__HELPERS/mouse_control.dm index a69c139d80..10fe976c26 100644 --- a/code/__HELPERS/mouse_control.dm +++ b/code/__HELPERS/mouse_control.dm @@ -11,7 +11,7 @@ var/screenviewY = screenview[2] * world.icon_size var/ox = round(screenviewX/2) - client.pixel_x //"origin" x var/oy = round(screenviewY/2) - client.pixel_y //"origin" y - var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) + var/angle = SIMPLIFY_DEGREES(arctan(y - oy, x - ox)) return angle //Wow, specific name! diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index e082be7d1f..1570eededb 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -25,8 +25,22 @@ /proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE) if(!SSradiation.can_fire) return - for(var/dir in GLOB.cardinals) - new /datum/radiation_wave(source, dir, intensity, range_modifier, can_contaminate) + var/area/A = get_area(source) + var/atom/nested_loc = source.loc + var/spawn_waves = TRUE + while(nested_loc != A) + if(nested_loc.rad_flags & RAD_PROTECT_CONTENTS) + spawn_waves = FALSE + break + nested_loc = nested_loc.loc + if(spawn_waves) + for(var/dir in GLOB.cardinals) + new /datum/radiation_wave(source, dir, intensity, range_modifier, can_contaminate) + + var/static/last_huge_pulse = 0 + if(intensity > 3000 && world.time > last_huge_pulse + 200) + last_huge_pulse = world.time + log = TRUE var/list/things = get_rad_contents(source) //copypasta because I don't want to put special code in waves to handle their origin for(var/k in 1 to things.len) @@ -35,11 +49,7 @@ continue thing.rad_act(intensity) - var/static/last_huge_pulse = 0 - if(intensity > 3000 && world.time > last_huge_pulse + 200) - last_huge_pulse = world.time - log = TRUE if(log) - var/turf/_source_T = isturf(source) ? source : get_turf(source) - log_game("Radiation pulse with intensity: [intensity] and range modifier: [range_modifier] in [loc_name(_source_T)] ") + var/turf/_source_T = get_turf(source) + log_game("Radiation pulse with intensity: [intensity] and range modifier: [range_modifier] in [loc_name(_source_T)][spawn_waves ? "" : " (contained by [nested_loc.name])"]") return TRUE diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 5fe87bdf5b..dc52299025 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -2,9 +2,9 @@ /proc/sanitize_frequency(frequency, free = FALSE) frequency = round(frequency) if(free) - . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) + . = clamp(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) else - . = CLAMP(frequency, MIN_FREQ, MAX_FREQ) + . = clamp(frequency, MIN_FREQ, MAX_FREQ) if(!(. % 2)) // Ensure the last digit is an odd number . += 1 diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 0a4af736dd..aa388d7413 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -320,8 +320,10 @@ parts += "[FOURSPACES]Nobody died this shift!" if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode + mode.update_playercounts() parts += "[FOURSPACES]Final threat level: [mode.threat_level]" parts += "[FOURSPACES]Final threat: [mode.threat]" + parts += "[FOURSPACES]Average threat: [mode.threat_average]" parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" @@ -511,7 +513,7 @@ if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED) SSticker.show_roundend_report(owner.client, FALSE) -/datum/action/report/IsAvailable() +/datum/action/report/IsAvailable(silent = FALSE) return 1 /datum/action/report/Topic(href,href_list) @@ -561,7 +563,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + objective_parts += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) objective_parts += "Objective #[count]: [objective.explanation_text] Fail." else diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index faa8c22f38..cbe1817233 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -6,11 +6,24 @@ return number return default +/proc/sanitize_num_clamp(number, min=0, max=1, default=0, quantize=0) + if(!isnum(number)) + return default + . = clamp(number, min, max) + if(quantize) + . = round(number, quantize) + /proc/sanitize_text(text, default="") if(istext(text)) return text return default +/proc/sanitize_islist(value, default) + if(islist(value) && length(value)) + return value + if(default) + return default + /proc/sanitize_inlist(value, list/List, default) if(value in List) return value diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 09047d32bf..2c8497d5ed 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -629,3 +629,45 @@ return null r += ascii2text(c) return r + +/proc/slot_to_string(slot) + switch(slot) + if(SLOT_BACK) + return "Backpack" + if(SLOT_WEAR_MASK) + return "Mask" + if(SLOT_HANDS) + return "Hands" + if(SLOT_BELT) + return "Belt" + if(SLOT_EARS) + return "Ears" + if(SLOT_GLASSES) + return "Glasses" + if(SLOT_GLOVES) + return "Gloves" + if(SLOT_NECK) + return "Neck" + if(SLOT_HEAD) + return "Head" + if(SLOT_SHOES) + return "Shoes" + if(SLOT_WEAR_SUIT) + return "Suit" + if(SLOT_W_UNIFORM) + return "Uniform" + if(SLOT_IN_BACKPACK) + return "In backpack" + +/proc/tg_ui_icon_to_cit_ui(ui_style) + switch(ui_style) + if('icons/mob/screen_plasmafire.dmi') + return 'modular_citadel/icons/ui/screen_plasmafire.dmi' + if('icons/mob/screen_slimecore.dmi') + return 'modular_citadel/icons/ui/screen_slimecore.dmi' + if('icons/mob/screen_operative.dmi') + return 'modular_citadel/icons/ui/screen_operative.dmi' + if('icons/mob/screen_clockwork.dmi') + return 'modular_citadel/icons/ui/screen_clockwork.dmi' + else + return 'modular_citadel/icons/ui/screen_midnight.dmi' diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm new file mode 100644 index 0000000000..ac7e5cab45 --- /dev/null +++ b/code/__HELPERS/type_processing.dm @@ -0,0 +1,60 @@ + +/proc/make_types_fancy(var/list/types) + if (ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/item/radio/headset = "HEADSET", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/book/manual = "MANUAL", + /obj/item/reagent_containers/food/drinks = "DRINK", //longest paths comes first + /obj/item/reagent_containers/food = "FOOD", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/organ = "ORGAN", + /obj/item = "ITEM", + /obj/machinery = "MACHINERY", + /obj/effect = "EFFECT", + /obj = "O", + /datum = "D", + /turf/open = "OPEN", + /turf/closed = "CLOSED", + /turf = "T", + /mob/living/carbon = "CARBON", + /mob/living/simple_animal = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for (var/tn in TYPES_SHORTCUTS) + if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ac97966eef..337d44aa1e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,5 +1,3 @@ - - /* * A large number of misc global procs. */ @@ -8,10 +6,8 @@ /proc/invertHTML(HTMLstring) if(!istext(HTMLstring)) CRASH("Given non-text argument!") - return else if(length(HTMLstring) != 7) CRASH("Given non-HTML argument!") - return else if(length_char(HTMLstring) != 7) CRASH("Given non-hex symbols in argument!") var/textr = copytext(HTMLstring, 2, 4) @@ -19,30 +15,8 @@ var/textb = copytext(HTMLstring, 6, 8) return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb)) -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) - return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -/proc/Get_Pixel_Angle(var/y, var/x)//for getting the angle when animating something's pixel_x and pixel_y - if(!y) - return (x>=0)?90:270 - .=arctan(x/y) - if(y<0) - .+=180 - else if(x<0) - .+=360 - +//Better performant than an artisanal proc and more reliable than Turn(). From TGMC. +#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) /* @@ -393,6 +367,16 @@ Turf and target are separate in case you want to teleport some distance from a t break return loc +//Returns a list of all locations the target is within. +/proc/get_nested_locs(atom/movable/M, include_turf = FALSE) + . = list() + var/atom/A = M.loc + while(A && !isturf(A)) + . += A + A = A.loc + if(A && include_turf) //At this point, only the turf is left. + . += A + // returns the turf located at the map edge in the specified direction relative to A // used for mass driver /proc/get_edge_target_turf(atom/A, direction) @@ -436,6 +420,29 @@ Turf and target are separate in case you want to teleport some distance from a t return locate(x,y,A.z) +/** + * Get ranged target turf, but with direct targets as opposed to directions + * + * Starts at atom A and gets the exact angle between A and target + * Moves from A with that angle, Range amount of times, until it stops, bound to map size + * Arguments: + * * A - Initial Firer / Position + * * target - Target to aim towards + * * range - Distance of returned target turf from A + * * offset - Angle offset, 180 input would make the returned target turf be in the opposite direction + */ +/proc/get_ranged_target_turf_direct(atom/A, atom/target, range, offset) + var/angle = arctan(target.x - A.x, target.y - A.y) + if(offset) + angle += offset + var/turf/T = get_turf(A) + for(var/i in 1 to range) + var/turf/check = locate(A.x + cos(angle) * i, A.y + sin(angle) * i, A.z) + if(!check) + break + T = check + + return T // returns turf relative to A offset in dx and dy tiles // bound to map limits @@ -668,12 +675,6 @@ Turf and target are separate in case you want to teleport some distance from a t loc = loc.loc return null -//For objects that should embed, but make no sense being is_sharp or is_pointed() -//e.g: rods -GLOBAL_LIST_INIT(can_embed_types, typecacheof(list( - /obj/item/stack/rods, - /obj/item/pipe))) - /* Checks if that loc and dir has an item on the wall */ @@ -779,8 +780,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tX = splittext(tX[1], ":") tX = tX[1] var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = CLAMP(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) - tY = CLAMP(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) + tX = clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) + tY = clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) return locate(tX, tY, tZ) /proc/screen_loc2turf(text, turf/origin, client/C) @@ -793,8 +794,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tX = text2num(tX[2]) tZ = origin.z var/list/actual_view = getviewsize(C ? C.view : world.view) - tX = CLAMP(origin.x + round(actual_view[1] / 2) - tX, 1, world.maxx) - tY = CLAMP(origin.y + round(actual_view[2] / 2) - tY, 1, world.maxy) + tX = clamp(origin.x + round(actual_view[1] / 2) - tX, 1, world.maxx) + tY = clamp(origin.y + round(actual_view[2] / 2) - tY, 1, world.maxy) return locate(tX, tY, tZ) /proc/IsValidSrc(datum/D) @@ -1027,6 +1028,27 @@ B --><-- A /proc/get_random_station_turf() return safepick(get_area_turfs(pick(GLOB.the_station_areas))) +/proc/get_safe_random_station_turf() //excludes dense turfs (like walls) and areas that have valid_territory set to FALSE + for (var/i in 1 to 5) + var/list/L = get_area_turfs(pick(GLOB.the_station_areas)) + var/turf/target + while (L.len && !target) + var/I = rand(1, L.len) + var/turf/T = L[I] + var/area/X = get_area(T) + if(!T.density && X.valid_territory) + var/clear = TRUE + for(var/obj/O in T) + if(O.density) + clear = FALSE + break + if(clear) + target = T + if (!target) + L.Cut(I,I+1) + if (target) + return target + /proc/get_closest_atom(type, list, source) var/closest_atom var/closest_distance @@ -1550,8 +1572,13 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //empty string - use TgsTargetBroadcast with admin_only = FALSE //other string - use TgsChatBroadcast with the tag that matches config_setting, only works with TGS4, if using TGS3 the above method is used /proc/send2chat(message, config_setting) - if(config_setting == null || !world.TgsAvailable()) + if(config_setting == null) return + + UNTIL(GLOB.tgs_initialized) + if(!world.TgsAvailable()) + return + var/datum/tgs_version/version = world.TgsVersion() if(config_setting == "" || version.suite == 3) world.TgsTargetedChatBroadcast(message, FALSE) @@ -1565,3 +1592,16 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(channels_to_use.len) world.TgsChatBroadcast() + +//Checks to see if either the victim has a garlic necklace or garlic in their blood +/proc/blood_sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) + //Bypass this if the target isnt carbon. + if(!iscarbon(target)) + return TRUE + if(check_neck) + if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + return FALSE + if(check_blood) + if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) + return FALSE + return TRUE diff --git a/code/_compile_options.dm b/code/_compile_options.dm index fe4761ddcd..9a36c626ba 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -32,31 +32,12 @@ #endif //Update this whenever you need to take advantage of more recent byond features -#define MIN_COMPILER_VERSION 512 -#if DM_VERSION < MIN_COMPILER_VERSION +#define MIN_COMPILER_VERSION 513 +#define MIN_COMPILER_BUILD 1508 +#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 512 or higher -#endif - -//Compatability -- These procs were added in 513.1493, not 513.1490 -//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb -#if DM_BUILD < 1493 -#define length_char(args...) length(args) -#define text2ascii_char(args...) text2ascii(args) -#define copytext_char(args...) copytext(args) -#define splittext_char(args...) splittext(args) -#define spantext_char(args...) spantext(args) -#define nonspantext_char(args...) nonspantext(args) -#define findtext_char(args...) findtext(args) -#define findtextEx_char(args...) findtextEx(args) -#define findlasttext_char(args...) findlasttext(args) -#define findlasttextEx_char(args...) findlasttextEx(args) -#define replacetext_char(args...) replacetext(args) -#define replacetextEx_char(args...) replacetextEx(args) -// /regex procs -#define Find_char(args...) Find(args) -#define Replace_char(args...) Replace(args) +#error You need version 513.1508 or higher #endif //Additional code for the above flags. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 5367322d8e..85f5e4fd9b 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -49,6 +49,8 @@ GLOBAL_LIST_INIT(bitfields, list( "DROPDEL" = DROPDEL, "NOBLUDGEON" = NOBLUDGEON, "ABSTRACT" = ABSTRACT, + "ITEM_CAN_BLOCK" = ITEM_CAN_BLOCK, + "ITEM_CAN_PARRY" = ITEM_CAN_PARRY ), "admin_flags" = list( "BUILDMODE" = R_BUILDMODE, @@ -123,7 +125,7 @@ GLOBAL_LIST_INIT(bitfields, list( "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, "HEAR_1" = HEAR_1, - "CHECK_RICOCHET_1" = CHECK_RICOCHET_1, + "DEFAULT_RICOCHET_1" = DEFAULT_RICOCHET_1, "CONDUCT_1" = CONDUCT_1, "NO_LAVA_GEN_1" = NO_LAVA_GEN_1, "NODECONSTRUCT_1" = NODECONSTRUCT_1, @@ -132,9 +134,15 @@ GLOBAL_LIST_INIT(bitfields, list( "NO_RUINS_1" = NO_RUINS_1, "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, "HOLOGRAM_1" = HOLOGRAM_1, - "TESLA_IGNORE_1" = TESLA_IGNORE_1, + "SHOCKED_1" = SHOCKED_1, "INITIALIZED_1" = INITIALIZED_1, "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, + "BLOCK_FACE_ATOM_1" = BLOCK_FACE_ATOM_1, + "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1 + ), + "flags_ricochet" = list( + "RICOCHET_SHINY" = RICOCHET_SHINY, + "RICOCHET_HARD" = RICOCHET_HARD ), "clothing_flags" = list( "LAVAPROTECT" = LAVAPROTECT, @@ -148,12 +156,12 @@ GLOBAL_LIST_INIT(bitfields, list( "IGNORE_HAT_TOSS" = IGNORE_HAT_TOSS, "SCAN_REAGENTS" = SCAN_REAGENTS ), - "tesla_flags" = list( - "TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE, - "TESLA_OBJ_DAMAGE" = TESLA_OBJ_DAMAGE, - "TESLA_MOB_STUN" = TESLA_MOB_STUN, - "TESLA_ALLOW_DUPLICATES" = TESLA_ALLOW_DUPLICATES, - "TESLA_MACHINE_EXPLOSIVE" = TESLA_MACHINE_EXPLOSIVE, + "zap_flags" = list( + "ZAP_MOB_DAMAGE" = ZAP_MOB_DAMAGE, + "ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE, + "ZAP_MOB_STUN" = ZAP_MOB_STUN, + "ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES, + "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE, ), "smooth" = list( "SMOOTH_TRUE" = SMOOTH_TRUE, @@ -240,14 +248,49 @@ GLOBAL_LIST_INIT(bitfields, list( "MOBILITY_RESIST" = MOBILITY_RESIST ), "combat_flags" = list( - "COMBAT_FLAG_COMBAT_TOGGLED" = COMBAT_FLAG_COMBAT_TOGGLED, "COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED, - "COMBAT_FLAG_COMBAT_ACTIVE" = COMBAT_FLAG_COMBAT_ACTIVE, "COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE, "COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL, "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT, "COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT, "COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING, - "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST + "COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST, + "COMBAT_FLAG_SPRINT_FORCED" = COMBAT_FLAG_SPRINT_FORCED + ), + "shield_flags" = list( + "SHIELD_TRANSPARENT" = SHIELD_TRANSPARENT, + "SHIELD_CAN_BASH" = SHIELD_CAN_BASH, + "SHIELD_BASH_WALL_KNOCKDOWN" = SHIELD_BASH_WALL_KNOCKDOWN, + "SHIELD_BASH_ALWAYS_KNOCKDOWN" = SHIELD_BASH_ALWAYS_KNOCKDOWN, + "SHIELD_BASH_WALL_DISARM" = SHIELD_BASH_WALL_DISARM, + "SHIELD_BASH_ALWAYS_DISARM" = SHIELD_BASH_ALWAYS_DISARM, + "SHIELD_BASH_GROUND_SLAM" = SHIELD_BASH_GROUND_SLAM, + "SHIELD_BASH_GROUND_SLAM_DISARM" = SHIELD_BASH_GROUND_SLAM_DISARM + ), + "storage_flags" = list( + "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS, + "STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS, + "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS, + "STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME + ), + "mutantrace_variation" = list( + "STYLE_DIGITIGRADE" = STYLE_DIGITIGRADE, + "STYLE_MUZZLE" = STYLE_MUZZLE, + "STYLE_SNEK_TAURIC" = STYLE_SNEK_TAURIC, + "STYLE_PAW_TAURIC" = STYLE_PAW_TAURIC, + "STYLE_HOOF_TAURIC" = STYLE_HOOF_TAURIC, + "STYLE_NO_ANTHRO_ICON" = STYLE_NO_ANTHRO_ICON, + "USE_SNEK_CLIP_MASK" = USE_SNEK_CLIP_MASK, + "USE_QUADRUPED_CLIP_MASK" = USE_QUADRUPED_CLIP_MASK + ), + "vis_flags" = list( + "VIS_INHERIT_ICON" = VIS_INHERIT_ICON, + "VIS_INHERIT_ICON_STATE" = VIS_INHERIT_ICON_STATE, + "VIS_INHERIT_DIR" = VIS_INHERIT_DIR, + "VIS_INHERIT_LAYER" = VIS_INHERIT_LAYER, + "VIS_INHERIT_PLANE" = VIS_INHERIT_PLANE, + "VIS_INHERIT_ID" = VIS_INHERIT_ID, + "VIS_UNDERLAY" = VIS_UNDERLAY, + "VIS_HIDE" = VIS_HIDE ) )) diff --git a/code/_globalvars/lists/client.dm b/code/_globalvars/lists/client.dm new file mode 100644 index 0000000000..5181d870c4 --- /dev/null +++ b/code/_globalvars/lists/client.dm @@ -0,0 +1,21 @@ +GLOBAL_LIST_EMPTY(classic_keybinding_list_by_key) +GLOBAL_LIST_EMPTY(hotkey_keybinding_list_by_key) +GLOBAL_LIST_EMPTY(keybindings_by_name) + +// This is a mapping from JS keys to Byond - ref: https://keycode.info/ +GLOBAL_LIST_INIT(_kbMap, list( + "UP" = "North", + "RIGHT" = "East", + "DOWN" = "South", + "LEFT" = "West", + "INSERT" = "Insert", + "HOME" = "Northwest", + "PAGEUP" = "Northeast", + "DEL" = "Delete", + "END" = "Southwest", + "PAGEDOWN" = "Southeast", + "SPACEBAR" = "Space", + "ALT" = "Alt", + "SHIFT" = "Shift", + "CONTROL" = "Ctrl" + )) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 968995e81d..598fde2bc3 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -137,8 +137,8 @@ GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT)) #define UPLINK_PEN "Pen" //like a real spy! GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN)) - //Female Uniforms -GLOBAL_LIST_EMPTY(female_clothing_icons) +//List of cached alpha masked icons. +GLOBAL_LIST_EMPTY(alpha_masked_worn_icons) //radical shit GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")) @@ -221,3 +221,8 @@ GLOBAL_LIST_INIT(numbers_as_words, world.file2list("strings/numbers_as_words.txt GLOBAL_LIST_INIT(station_numerals, greek_letters + phonetic_alphabet + numbers_as_words + generate_number_strings()) GLOBAL_LIST_INIT(admiral_messages, list("Do you know how expensive these stations are?","Stop wasting my time.","I was sleeping, thanks a lot.","Stand and fight you cowards!","You knew the risks coming in.","Stop being paranoid.","Whatever's broken just build a new one.","No.", "null","Error: No comment given.", "It's a good day to die!")) + +GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARCHIVED\]", "\[EXPLETIVE DELETED\]", "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]", "\[ACCESS DENIED\]")) + + +GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) diff --git a/code/_globalvars/lists/keybindings.dm b/code/_globalvars/lists/keybindings.dm new file mode 100644 index 0000000000..7e5b016a95 --- /dev/null +++ b/code/_globalvars/lists/keybindings.dm @@ -0,0 +1,31 @@ +/// Creates and sorts all the keybinding datums +/proc/init_keybindings() + for(var/KB in subtypesof(/datum/keybinding)) + var/datum/keybinding/keybinding = KB + if(!initial(keybinding.hotkey_keys)) + continue + add_keybinding(new keybinding) + // init_emote_keybinds() - Disabled - I don't particularly want this. + +/// Adds an instanced keybinding to the global tracker +/proc/add_keybinding(datum/keybinding/instance) + GLOB.keybindings_by_name[instance.name] = instance + + // Classic + if(LAZYLEN(instance.classic_keys)) + for(var/bound_key in instance.classic_keys) + LAZYADD(GLOB.classic_keybinding_list_by_key[bound_key], list(instance.name)) + + // Hotkey + if(LAZYLEN(instance.hotkey_keys)) + for(var/bound_key in instance.hotkey_keys) + LAZYADD(GLOB.hotkey_keybinding_list_by_key[bound_key], list(instance.name)) + +/proc/init_emote_keybinds() + for(var/i in subtypesof(/datum/emote)) + var/datum/emote/faketype = i + if(!initial(faketype.key)) + continue + var/datum/keybinding/emote/emote_kb = new + emote_kb.link_to_emote(faketype) + add_keybinding(emote_kb) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index e825233bca..865f405442 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/clothing/head/that = 1, /obj/item/clothing/head/ushanka = 1, /obj/item/clothing/head/welding = 1, - /obj/item/clothing/mask/gas = 15, + /obj/effect/spawner/lootdrop/breathing_masks = 15, /obj/item/clothing/suit/hazardvest = 1, /obj/item/clothing/under/misc/vice_officer = 1, /obj/item/clothing/suit/hooded/flashsuit = 2, @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/airlock_painter = 1, /obj/item/stack/cable_coil/random = 4, /obj/item/stack/cable_coil/random/five = 6, - /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/medical/suture = 1, /obj/item/stack/rods/ten = 9, /obj/item/stack/rods/twentyfive = 1, /obj/item/stack/rods/fifty = 1, @@ -86,11 +86,10 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/screwdriver = 3, /obj/item/tank/internals/emergency_oxygen = 2, /obj/item/vending_refill/cola = 1, - /obj/item/weldingtool = 3, - /obj/item/wirecutters = 1, - /obj/item/wrench = 4, + /obj/effect/spawner/lootdrop/welder_tools = 3, + /obj/effect/spawner/lootdrop/low_tools = 5, /obj/item/relic = 3, - /obj/item/weaponcrafting/receiver = 2, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2, /obj/item/clothing/head/cone = 2, /obj/item/grenade/smokebomb = 2, /obj/item/geiger_counter = 3, @@ -116,5 +115,25 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/autosurgeon/penis = 1, /obj/item/autosurgeon/testicles = 1, /obj/item/storage/box/marshmallow = 2, + /obj/item/clothing/gloves/tackler/offbrand = 1, + /obj/item/stack/sticky_tape = 1, "" = 3 )) + +GLOBAL_LIST_INIT(ratking_trash, list(//Garbage: used by the regal rat mob when spawning garbage. + /obj/item/cigbutt, + /obj/item/trash/cheesie, + /obj/item/trash/candy, + /obj/item/trash/chips, + /obj/item/trash/pistachios, + /obj/item/trash/plate, + /obj/item/trash/popcorn, + /obj/item/trash/raisins, + /obj/item/trash/sosjerky, + /obj/item/trash/syndi_cakes)) + +GLOBAL_LIST_INIT(ratking_coins, list(//Coins: Used by the regal rat mob when spawning coins. + /obj/item/coin/iron, + /obj/item/coin/silver, + /obj/item/coin/plastic, + /obj/item/coin/titanium)) \ No newline at end of file diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index fb8863ebe7..d214ec94ef 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -50,3 +50,8 @@ GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area) GLOBAL_LIST_EMPTY(all_abstract_markers) GLOBAL_LIST_EMPTY(stationroom_landmarks) //List of all spawns for stationrooms + +///Away missions, VR, random z levels stuff. +GLOBAL_LIST_EMPTY(random_zlevels_generated) +GLOBAL_LIST_INIT(potential_away_levels, generateMapList(filename = "[global.config.directory]/awaymissionconfig.txt")) +GLOBAL_LIST_INIT(potential_vr_levels, generateMapList(filename = "[global.config.directory]/vr_config.txt")) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 04d4c2888a..959a62ebf8 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -43,15 +43,26 @@ GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup) GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes. /proc/update_config_movespeed_type_lookup(update_mobs = TRUE) - var/list/mob_types = list() + // NOTE: This is entirely based on the fact that byond typesof/subtypesof gets longer/deeper paths before shallower ones. + // If that ever breaks this entire proc breaks. + var/list/mob_types = typesof(/mob) var/list/entry_value = CONFIG_GET(keyed_list/multiplicative_movespeed) + var/list/configured_types = list() for(var/path in entry_value) var/value = entry_value[path] - if(!value) + if(isnull(value)) continue + // associative list sets for elements that already exist preserve order + mob_types[path] = value + // now go back up through it to set everything, making absolute sure that base paths are overridden by child paths all the way down the path tree. + for(var/i in length(mob_types) to 1 step -1) + var/path = mob_types[i] + if(isnull(mob_types[path])) + continue + // we're going from bottom to top so it should be safe to do this without further checks.. for(var/subpath in typesof(path)) - mob_types[subpath] = value - GLOB.mob_config_movespeed_type_lookup = mob_types + configured_types[subpath] = mob_types[path] + GLOB.mob_config_movespeed_type_lookup = configured_types if(update_mobs) update_mob_config_movespeeds() diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index f5f3adbcc0..d74238c06d 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -19,6 +19,7 @@ #define POLL_IGNORE_WIZARD "wizard" #define POLL_IGNORE_CLONE "clone" #define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" +#define POLL_IGNORE_FUGITIVE "fugitive" GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", @@ -39,7 +40,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_DEMON = "Demons", POLL_IGNORE_WIZARD = "Wizards", POLL_IGNORE_CLONE = "Defective/SDGF clones", - POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit" + POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit", + POLL_IGNORE_FUGITIVE = "Fugitive Hunter" )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index ba75fbfc9c..3bce9c560a 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -28,6 +28,8 @@ GLOBAL_VAR(world_job_debug_log) GLOBAL_PROTECT(world_job_debug_log) GLOBAL_VAR(world_virus_log) GLOBAL_PROTECT(world_virus_log) +GLOBAL_VAR(world_asset_log) +GLOBAL_PROTECT(world_asset_log) GLOBAL_VAR(world_map_error_log) GLOBAL_PROTECT(world_map_error_log) GLOBAL_VAR(subsystem_log) @@ -36,6 +38,8 @@ GLOBAL_VAR(reagent_log) GLOBAL_PROTECT(reagent_log) GLOBAL_VAR(world_crafting_log) GLOBAL_PROTECT(world_crafting_log) +GLOBAL_VAR(click_log) +GLOBAL_PROTECT(click_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 21e3663cca..b039e6d114 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -14,7 +14,7 @@ GLOBAL_VAR_INIT(fileaccess_timer, 0) GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) -GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule +GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule, dimensionless, kilojoules/watt-tick GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) GLOBAL_LIST_EMPTY(powernets) @@ -33,3 +33,5 @@ GLOBAL_VAR(bible_icon_state) GLOBAL_VAR(bible_item_state) GLOBAL_VAR(holy_weapon_type) GLOBAL_VAR(holy_armor_type) + +GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm new file mode 100644 index 0000000000..8d8b8820b2 --- /dev/null +++ b/code/_globalvars/traits.dm @@ -0,0 +1,141 @@ +/* + FUN ZONE OF ADMIN LISTINGS + Try to keep this in sync with __DEFINES/traits.dm + quirks have it's own panel so we don't need them here. +*/ + +GLOBAL_LIST_INIT(traits_by_type, list( + /mob = list( + "TRAIT_BLIND" = TRAIT_BLIND, + "TRAIT_MUTE" = TRAIT_MUTE, + "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_DEAF" = TRAIT_DEAF, + "TRAIT_NEARSIGHT" = TRAIT_NEARSIGHT, + "TRAIT_FAT" = TRAIT_FAT, + "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_NOCLONE" = TRAIT_NOCLONE, + "TRAIT_CLUMSY" = TRAIT_CLUMSY, + "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_DUMB" = TRAIT_DUMB, + "TRAIT_MONKEYLIKE" = TRAIT_MONKEYLIKE, + "TRAIT_PACIFISM" = TRAIT_PACIFISM, + "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, + "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, + "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, + "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, + "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_TASED_RESISTANCE" = TRAIT_TASED_RESISTANCE, + "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, + "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, + "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, + "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, + "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, + "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, + "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, + "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, + "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, + "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOGUNS" = TRAIT_NOGUNS, + "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, + "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, + "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_EASYLIMBDISABLE" = TRAIT_EASYLIMBDISABLE, + "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, + "TRAIT_NOBREATH" = TRAIT_NOBREATH, + "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_HOLY" = TRAIT_HOLY, + "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_JOLLY" = TRAIT_JOLLY, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NOSLIPWATER" = TRAIT_NOSLIPWATER, + "TRAIT_NOSLIPALL" = TRAIT_NOSLIPALL, + "TRAIT_NODEATH" = TRAIT_NODEATH, + "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, + "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_HIJACKER" = TRAIT_HIJACKER, + "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, + "TRAIT_FEARLESS" = TRAIT_FEARLESS, + "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, + "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, + "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, + "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, + "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, + "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, + "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, + "TRAIT_SURGEON" = TRAIT_SURGEON, + "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, + "TRAIT_MAGIC_CHOKE" = TRAIT_MAGIC_CHOKE, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, + "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, + "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, + "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, + "TRAIT_COLDBLOODED" = TRAIT_COLDBLOODED, + "TRAIT_NONATURALHEAL" = TRAIT_NONATURALHEAL, + "TRAIT_NORUNNING" = TRAIT_NORUNNING, + "TRAIT_NOMARROW" = TRAIT_NOMARROW, + "TRAIT_NOPULSE" = TRAIT_NOPULSE, + "TRAIT_EXEMPT_HEALTH_EVENTS" = TRAIT_EXEMPT_HEALTH_EVENTS, + "TRAIT_NO_MIDROUND_ANTAG" = TRAIT_NO_MIDROUND_ANTAG, + "TRAIT_PUGILIST" = TRAIT_PUGILIST, + "TRAIT_KI_VAMPIRE" = TRAIT_KI_VAMPIRE, + "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_GIANT" = TRAIT_GIANT, + "TRAIT_DWARF" = TRAIT_DWARF, + "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, + "TRAIT_COMBAT_MODE_LOCKED" = TRAIT_COMBAT_MODE_LOCKED, + "TRAIT_SPRINT_LOCKED" = TRAIT_SPRINT_LOCKED, + "TRAIT_AUTO_CATCH_ITEM" = TRAIT_AUTO_CATCH_ITEM, + "TRAIT_FREESPRINT" = TRAIT_FREESPRINT, + "TRAIT_NO_INTERNALS" = TRAIT_NO_INTERNALS, + "TRAIT_NO_ALCOHOL" = TRAIT_NO_ALCOHOL, + "TRAIT_MUTATION_STASIS" = TRAIT_MUTATION_STASIS, + "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, + "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, + "TRAIT_SILENT_STEP" = TRAIT_SILENT_STEP, + "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, + "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_SKITTISH" = TRAIT_SKITTISH, + "TRAIT_POOR_AIM" = TRAIT_POOR_AIM, + "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, + "TRAIT_DRUNK_HEALING" = TRAIT_DRUNK_HEALING, + "TRAIT_TAGGER" = TRAIT_TAGGER, + "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, + "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, + "TRAIT_MASO" = TRAIT_MASO, + "TRAIT_HIGH_BLOOD" = TRAIT_HIGH_BLOOD, + "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, + "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT + ), + /obj/item/bodypart = list( + "TRAIT_PARALYSIS" = TRAIT_PARALYSIS + ), + /obj/item = list( + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT + ) + )) + + +/// value -> trait name, generated on use from trait_by_type global +GLOBAL_LIST(trait_name_map) + +/proc/generate_trait_name_map() + . = list() + for(var/key in GLOB.traits_by_type) + for(var/tname in GLOB.traits_by_type[key]) + var/val = GLOB.traits_by_type[key][tname] + .[val] = tname diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index ec4784bd1f..02cbd6bea5 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -49,6 +49,7 @@ message_admins("[ADMIN_LOOKUPFLW(src)] might be running a modified client! (failed can_see on AI click of [A] (Turf Loc: [ADMIN_VERBOSEJMP(pixel_turf)]))") var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A] (Turf Loc: [AREACOORD(pixel_turf)]))" log_admin(message) + to_chat(src, "You're experiencing a bug. Reconnect immediately to fix it. Admins have been notified.") if(REALTIMEOFDAY >= chnotify + 9000) chnotify = REALTIMEOFDAY send2irc_adminless_only("NOCHEAT", message) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 46c2c919f4..01261677d9 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -17,10 +17,14 @@ // eg: 10*0.5 = 5 deciseconds of delay // DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK +/mob/proc/timeToNextMove() + return max(0, next_move - world.time) + /mob/proc/changeNext_move(num) next_move = world.time + ((num+next_move_adjust)*next_move_modifier) /mob/living/changeNext_move(num) + last_click_move = next_move var/mod = next_move_modifier var/adj = next_move_adjust for(var/i in status_effects) @@ -72,7 +76,10 @@ if(check_click_intercept(params,A)) return - if(notransform) + if(mob_transforming) + return + + if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON) return var/list/modifiers = params2list(params) @@ -321,10 +328,9 @@ return /atom/proc/ShiftClick(mob/user) - var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) + var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) | SEND_SIGNAL(user, COMSIG_MOB_CLICKED_SHIFT_ON, src) if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) - return /* Ctrl click @@ -421,32 +427,36 @@ LE.fire() // Simple helper to face what you clicked on, in case it should be needed in more than one place -/mob/proc/face_atom(atom/A) - if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) +/mob/proc/face_atom(atom/A, ismousemovement = FALSE) + if( buckled || stat != CONSCIOUS || !loc || !A || !A.x || !A.y ) return - var/dx = A.x - x - var/dy = A.y - y + var/atom/L = loc + if(L.flags_1 & BLOCK_FACE_ATOM_1) + return + var/turf/T = get_turf(src) + var/dx = A.x - T.x + var/dy = A.y - T.y if(!dx && !dy) // Wall items are graphically shifted but on the floor if(A.pixel_y > 16) - setDir(NORTH) + setDir(NORTH, ismousemovement) else if(A.pixel_y < -16) - setDir(SOUTH) + setDir(SOUTH, ismousemovement) else if(A.pixel_x > 16) - setDir(EAST) + setDir(EAST, ismousemovement) else if(A.pixel_x < -16) - setDir(WEST) + setDir(WEST, ismousemovement) return if(abs(dx) < abs(dy)) if(dy > 0) - setDir(NORTH) + setDir(NORTH, ismousemovement) else - setDir(SOUTH) + setDir(SOUTH, ismousemovement) else if(dx > 0) - setDir(EAST) + setDir(EAST, ismousemovement) else - setDir(WEST) + setDir(WEST, ismousemovement) //debug /obj/screen/proc/scale_to(x1,y1) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 9638b040f9..8e2e0c3fb5 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -24,16 +24,6 @@ return -/client - var/list/atom/selected_target[2] - var/obj/item/active_mousedown_item = null - var/mouseParams = "" - var/mouseLocation = null - var/mouseObject = null - var/mouseControlObject = null - var/middragtime = 0 - var/atom/middragatom - /client/MouseDown(object, location, control, params) if (mouse_down_icon) mouse_pointer_icon = mouse_down_icon @@ -84,12 +74,6 @@ /obj/item/proc/onMouseUp(object, location, params, mob) return -/obj/item - var/canMouseDown = FALSE - -/obj/item/gun - var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds - /obj/item/gun/CanItemAutoclick(object, location, params) . = automatic @@ -108,16 +92,10 @@ mouseLocation = location mouseObject = object mouseControlObject = control - if(mob && LAZYLEN(mob.mousemove_intercept_objects)) - for(var/datum/D in mob.mousemove_intercept_objects) - D.onMouseMove(object, location, control, params) - if(!show_popup_menus && mob) //CIT CHANGE - passes onmousemove() to mobs - mob.onMouseMove(object, location, control, params) //CIT CHANGE - ditto + if(mob) + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) ..() -/datum/proc/onMouseMove(object, location, control, params) - return - /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) var/list/L = params2list(params) if (L["middle"]) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 28fd7397b0..4b963c730d 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -162,7 +162,7 @@ #define ui_ghost_orbit "SOUTH:6,CENTER-1:24" #define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" #define ui_ghost_teleport "SOUTH:6,CENTER+1:24" -#define ui_ghost_pai "SOUTH: 6, CENTER+2:24" +#define ui_ghost_spawners "SOUTH: 6, CENTER+2:24" //UI position overrides for 1:1 screen layout. (default is 7:5) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index bdc6ea2980..11531a701e 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -242,7 +242,7 @@ If you're feeling frisky, examine yourself and click the underlined item to pull /obj/screen/alert/embeddedobject/Click() if(isliving(usr)) - var/mob/living/carbon/human/M = usr + var/mob/living/carbon/M = usr return M.help_shake_act(M) /obj/screen/alert/weightless @@ -334,7 +334,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!antag) + if(!antag?.cult_team) return var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives @@ -642,9 +642,6 @@ so as to remain in compliance with the most up-to-date laws." mymob.client.screen |= alert return 1 -/mob - var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly - /obj/screen/alert/Click(location, control, params) if(!usr || !usr.client) return diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 3cfa71e19d..d82f3e7cf5 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,7 +1,3 @@ - -/mob - var/list/screens = list() - /mob/proc/overlay_fullscreen(category, type, severity) var/obj/screen/fullscreen/screen = screens[category] if (!screen || screen.type != type) diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 14da637f18..0cdac111b0 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -36,13 +36,13 @@ var/mob/dead/observer/G = usr G.dead_tele() -/obj/screen/ghost/pai - name = "pAI Candidate" - icon_state = "pai" +/obj/screen/ghost/spawners + name = "Ghost role spawners" + icon_state = "spawners" -/obj/screen/ghost/pai/Click() +/obj/screen/ghost/spawners/Click() var/mob/dead/observer/G = usr - G.register_pai() + G.open_spawners_menu() /datum/hud/ghost/New(mob/owner) ..() @@ -68,8 +68,8 @@ using.hud = src static_inventory += using - using = new /obj/screen/ghost/pai() - using.screen_loc = ui_ghost_pai + using = new /obj/screen/ghost/spawners() + using.screen_loc = ui_ghost_spawners using.hud = src static_inventory += using diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f054cb0c8e..57335a966e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -114,8 +114,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return ..() -/mob - var/hud_type = /datum/hud /mob/proc/create_mob_hud() if(!client || hud_used) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 490f0aa0f0..9380cf98aa 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -241,18 +241,11 @@ using.hud = src hotkeybuttons += using - //CIT CHANGES - rest and combat mode buttons - using = new /obj/screen/restbutton() - using.icon = tg_ui_icon_to_cit_ui(ui_style) + using = new /obj/screen/rest() + using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src static_inventory += using - - using = new /obj/screen/combattoggle() - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.screen_loc = ui_combat_toggle - using.hud = src - static_inventory += using //END OF CIT CHANGES using = new /obj/screen/human/toggle() @@ -367,7 +360,7 @@ blood_display.hud = src infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank + vamprank_display = new /obj/screen/bloodsucker/rank_counter // Bloodsucker Rank vamprank_display.hud = src infodisplay += vamprank_display diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 25a49c8d6b..d8ef1c525a 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -1,16 +1,4 @@ -/client - var/list/parallax_layers - var/list/parallax_layers_cached - var/atom/movable/movingmob - var/turf/previous_turf - var/dont_animate_parallax //world.time of when we can state animate()ing parallax again - var/last_parallax_shift //world.time of last update - var/parallax_throttle = 0 //ds between updates - var/parallax_movedir = 0 - var/parallax_layers_max = 3 - var/parallax_animate_timer - /datum/hud/proc/create_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index e028212e96..5e474331f6 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -102,8 +102,8 @@ add_overlay(standard_background) /obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) - width = CLAMP(width, 0, max_dimensions) - height = CLAMP(height, 0, max_dimensions) + width = clamp(width, 0, max_dimensions) + height = clamp(height, 0, max_dimensions) src.width = width src.height = height diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 7a8cc20d76..7a8b0a1121 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -19,11 +19,15 @@ ///Things rendered on "openspace"; holes in multi-z /obj/screen/plane_master/openspace name = "open space plane master" - plane = FLOOR_OPENSPACE_PLANE + plane = OPENSPACE_BACKDROP_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_MULTIPLY alpha = 255 +/obj/screen/plane_master/openspace/Initialize() + . = ..() + filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) + /obj/screen/plane_master/openspace/backdrop(mob/mymob) filters = list() filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) @@ -46,6 +50,32 @@ appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY +/obj/screen/plane_master/wall + name = "wall plane master" + plane = WALL_PLANE + appearance_flags = PLANE_MASTER + +/obj/screen/plane_master/wall/backdrop(mob/mymob) + if(mymob?.client?.prefs.ambientocclusion) + add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) + else + remove_filter("ambient_occlusion") + +/obj/screen/plane_master/above_wall + name = "above wall plane master" + plane = ABOVE_WALL_PLANE + appearance_flags = PLANE_MASTER + +/obj/screen/plane_master/above_wall/Initialize() + . = ..() + add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) + +/obj/screen/plane_master/above_wall/backdrop(mob/mymob) + if(mymob?.client?.prefs.ambientocclusion) + add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(3, "#04080F64")) + else + remove_filter("ambient_occlusion") + ///Contains most things in the game world /obj/screen/plane_master/game_world name = "game world plane master" @@ -53,12 +83,50 @@ appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY +/obj/screen/plane_master/game_world/Initialize() + . = ..() + add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) + /obj/screen/plane_master/game_world/backdrop(mob/mymob) - if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion) - add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION) + if(mymob?.client?.prefs.ambientocclusion) + add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) else remove_filter("ambient_occlusion") - update_filters() + +//Reserved to chat messages, so they are still displayed above the field of vision masking. +/obj/screen/plane_master/chat_messages + name = "chat messages plane master" + plane = CHAT_PLANE + appearance_flags = PLANE_MASTER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +///Contains all shadow cone masks, whose image overrides are displayed only to their respective owners. +/obj/screen/plane_master/field_of_vision + name = "field of vision mask plane master" + plane = FIELD_OF_VISION_PLANE + render_target = FIELD_OF_VISION_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/plane_master/field_of_vision/Initialize() + . = ..() + filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) + +///Used to display the owner and its adjacent surroundings through the FoV plane mask. +/obj/screen/plane_master/field_of_vision_blocker + name = "field of vision blocker plane master" + plane = FIELD_OF_VISION_BLOCKER_PLANE + render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +///Stores the visible portion of the FoV shadow cone. +/obj/screen/plane_master/field_of_vision_visual + name = "field of vision visual plane master" + plane = FIELD_OF_VISION_VISUAL_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/plane_master/field_of_vision_visual/Initialize() + . = ..() + filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) ///Contains all lighting objects /obj/screen/plane_master/lighting @@ -87,11 +155,12 @@ /obj/screen/plane_master/emissive/Initialize() . = ..() filters += filter(type="alpha", render_source=EMISSIVE_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) + filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) /** * Things placed on this always mask the lighting plane. Doesn't render directly. * - * Always masks the light plane, isn't blocked by anything. Use for on mob glows, + * Always masks the light plane, isn't blocked by anything (except Field of Vision). Use for on mob glows, * magic stuff, etc. */ @@ -101,13 +170,17 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET +/obj/screen/plane_master/emissive_unblockable/Initialize() + . = ..() + filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) + /** * Things placed on this layer mask the emissive layer. Doesn't render directly * * You really shouldn't be directly using this, use atom helpers instead */ -/obj/screen/plane_master/emissive_unblockable - name = "emissive mob plane master" +/obj/screen/plane_master/emissive_blocker + name = "emissive blocker plane master" plane = EMISSIVE_BLOCKER_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_BLOCKER_RENDER_TARGET diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index df91223ed1..1ead41d513 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -238,6 +238,7 @@ GLOBAL_LIST_EMPTY(radial_menus) var/mutable_appearance/MA = new /mutable_appearance(E) if(MA) MA.layer = ABOVE_HUD_LAYER + MA.plane = ABOVE_HUD_PLANE MA.appearance_flags |= RESET_TRANSFORM return MA @@ -255,6 +256,7 @@ GLOBAL_LIST_EMPTY(radial_menus) current_user = M.client //Blank menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = ABOVE_HUD_LAYER) + menu_holder.plane = ABOVE_HUD_PLANE menu_holder.appearance_flags |= KEEP_APART menu_holder.vis_contents += elements + close_button current_user.images += menu_holder @@ -285,13 +287,16 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE) +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE) if(!user || !anchor || !length(choices)) return if(!uniqueid) uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" if(GLOB.radial_menus[uniqueid]) + if(!no_repeat_close) + var/datum/radial_menu/menu = GLOB.radial_menus[uniqueid] + menu.finished = TRUE return var/datum/radial_menu/menu = new @@ -308,4 +313,9 @@ GLOBAL_LIST_EMPTY(radial_menus) var/answer = menu.selected_choice qdel(menu) GLOB.radial_menus -= uniqueid + if(require_near && !in_range(anchor, user)) + return + if(istype(custom_check)) + if(!custom_check.Invoke()) + return return answer \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f5eb8535a5..4ed286eb08 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -210,20 +210,6 @@ user.swap_hand(held_index) return TRUE -/obj/screen/close - name = "close" - layer = ABOVE_HUD_LAYER - plane = ABOVE_HUD_PLANE - icon_state = "backpack_close" - -/obj/screen/close/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/close/Click() - var/datum/component/storage/S = master - S.hide_from(usr) - return TRUE /obj/screen/drop name = "drop" @@ -406,30 +392,6 @@ else icon_state = "act_rest0" -/obj/screen/storage - name = "storage" - icon_state = "block" - screen_loc = "7,7 to 10,8" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/storage/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/storage/Click(location, control, params) - if(world.time <= usr.next_move) - return TRUE - if(usr.incapacitated()) - return TRUE - if (ismecha(usr.loc)) // stops inventory actions in a mech - return TRUE - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - master.attackby(null, I, usr, params) - return TRUE - /obj/screen/throw_catch name = "throw/catch" icon = 'icons/mob/screen_midnight.dmi' diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm new file mode 100644 index 0000000000..7e8bfe12ab --- /dev/null +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -0,0 +1,162 @@ +/obj/screen/storage + name = "storage" + var/insertion_click = FALSE + +/obj/screen/storage/Initialize(mapload, new_master) + . = ..() + master = new_master + +/obj/screen/storage/Click(location, control, params) + if(!insertion_click) + return ..() + if(world.time <= usr.next_move) + return TRUE + if(usr.incapacitated()) + return TRUE + if (ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE + if(master) + var/obj/item/I = usr.get_active_held_item() + if(I) + master.attackby(null, I, usr, params) + return TRUE + +/obj/screen/storage/boxes + name = "storage" + icon_state = "block" + screen_loc = "7,7 to 10,8" + layer = HUD_LAYER + plane = HUD_PLANE + insertion_click = TRUE + +/obj/screen/storage/close + name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + icon_state = "backpack_close" + +/obj/screen/storage/close/Click() + var/datum/component/storage/S = master + S.close(usr) + return TRUE + +/obj/screen/storage/left + icon_state = "storage_start" + insertion_click = TRUE + +/obj/screen/storage/right + icon_state = "storage_end" + insertion_click = TRUE + +/obj/screen/storage/continuous + icon_state = "storage_continue" + insertion_click = TRUE + +/obj/screen/storage/volumetric_box + icon_state = "stored_continue" + layer = VOLUMETRIC_STORAGE_BOX_LAYER + plane = VOLUMETRIC_STORAGE_BOX_PLANE + var/obj/item/our_item + +/obj/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item) + src.our_item = our_item + RegisterSignal(our_item, COMSIG_ITEM_MOUSE_ENTER, .proc/on_item_mouse_enter) + RegisterSignal(our_item, COMSIG_ITEM_MOUSE_EXIT, .proc/on_item_mouse_exit) + return ..() + +/obj/screen/storage/volumetric_box/Destroy() + makeItemInactive() + our_item = null + return ..() + +/obj/screen/storage/volumetric_box/Click(location, control, params) + return our_item.Click(location, control, params) + +/obj/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + return our_item.MouseDrop(over, src_location, over_location, src_control, over_control, params) + +/obj/screen/storage/volumetric_box/MouseExited(location, control, params) + makeItemInactive() + +/obj/screen/storage/volumetric_box/MouseEntered(location, control, params) + makeItemActive() + +/obj/screen/storage/volumetric_box/proc/on_item_mouse_enter() + makeItemActive() + +/obj/screen/storage/volumetric_box/proc/on_item_mouse_exit() + makeItemInactive() + +/obj/screen/storage/volumetric_box/proc/makeItemInactive() + if(!our_item) + return + our_item.layer = VOLUMETRIC_STORAGE_ITEM_LAYER + our_item.plane = VOLUMETRIC_STORAGE_ITEM_PLANE + +/obj/screen/storage/volumetric_box/proc/makeItemActive() + if(!our_item) + return + our_item.layer = VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER //make sure we display infront of the others! + our_item.plane = VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE + +/obj/screen/storage/volumetric_box/center + icon_state = "stored_continue" + var/obj/screen/storage/volumetric_edge/stored_left/left + var/obj/screen/storage/volumetric_edge/stored_right/right + var/pixel_size + +/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) + left = new(null, src, our_item) + right = new(null, src, our_item) + return ..() + +/obj/screen/storage/volumetric_box/center/Destroy() + QDEL_NULL(left) + QDEL_NULL(right) + return ..() + +/obj/screen/storage/volumetric_box/center/proc/on_screen_objects() + return list(src) + +/** + * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! + */ +/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) + if(pixel_size == pixels) + return + pixel_size = pixels + cut_overlays(TRUE) + //our icon size is 32 pixels. + transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) + left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE + right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE + add_overlay(left, TRUE) + add_overlay(right, TRUE) + +/obj/screen/storage/volumetric_edge + layer = VOLUMETRIC_STORAGE_BOX_LAYER + plane = VOLUMETRIC_STORAGE_BOX_PLANE + +/obj/screen/storage/volumetric_edge/Initialize(mapload, master, our_item) + src.master = master + return ..() + +/obj/screen/storage/volumetric_edge/Click(location, control, params) + return master.Click(location, control, params) + +/obj/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + return master.MouseDrop(over, src_location, over_location, src_control, over_control, params) + +/obj/screen/storage/volumetric_edge/MouseExited(location, control, params) + return master.MouseExited(location, control, params) + +/obj/screen/storage/volumetric_edge/MouseEntered(location, control, params) + return master.MouseEntered(location, control, params) + +/obj/screen/storage/volumetric_edge/stored_left + icon_state = "stored_start" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it. + +/obj/screen/storage/volumetric_edge/stored_right + icon_state = "stored_end" + appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index f422e073b2..106db7f40a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -7,21 +7,17 @@ *and lastly *afterattack. The return value does not matter. */ -/obj/item/proc/melee_attack_chain(mob/user, atom/target, params) +/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, flags, damage_multiplier = 1) if(isliving(user)) var/mob/living/L = user - if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT) - if(IS_STAMCRIT(L)) - to_chat(L, "You are too exhausted to swing [src]!") - return - if(!CHECK_MOBILITY(L, MOBILITY_USE)) + if(!CHECK_MOBILITY(L, MOBILITY_USE) && !(flags & ATTACKCHAIN_PARRY_COUNTERATTACK)) to_chat(L, "You are unable to swing [src] right now!") return if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) return if(pre_attack(target, user, params)) return - if(target.attackby(src,user, params)) + if(target.attackby(src, user, params, flags, damage_multiplier)) return if(QDELETED(src) || QDELETED(target)) return @@ -56,23 +52,20 @@ /obj/attackby(obj/item/I, mob/living/user, params) return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user)) -/mob/living/attackby(obj/item/I, mob/living/user, params) +/mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier) if(..()) return TRUE - user.changeNext_move(CLICK_CD_MELEE) - return I.attack(src, user) + I.attack_delay_done = FALSE //Should be set TRUE in pre_attacked_by() + . = I.attack(src, user, attackchain_flags, damage_multiplier) + if(!I.attack_delay_done) //Otherwise, pre_attacked_by() should handle it. + user.changeNext_move(I.click_delay) -/obj/item/proc/attack(mob/living/M, mob/living/user) +/obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK) return SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) if(item_flags & NOBLUDGEON) return - - if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit - to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto - return // CIT CHANGE - ditto - if(force && damtype != STAMINA && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") return @@ -86,12 +79,14 @@ M.lastattackerckey = user.ckey user.do_attack_animation(M) - M.attacked_by(src, user) + M.attacked_by(src, user, attackchain_flags, damage_multiplier) log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) - user.adjustStaminaLossBuffered(getweight()*0.8)//CIT CHANGE - makes attacking things cause stamina loss + var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) //CIT CHANGE - makes attacking things cause stamina loss + if(weight) + user.adjustStaminaLossBuffered(weight) //the equivalent of the standard version of attack() but for object targets. /obj/item/proc/attack_obj(obj/O, mob/living/user) @@ -99,39 +94,57 @@ return if(item_flags & NOBLUDGEON) return - if(IS_STAMCRIT(user)) // CIT CHANGE - makes it impossible to attack in stamina softcrit - to_chat(user, "You're too exhausted.") // CIT CHANGE - ditto - return // CIT CHANGE - ditto - user.adjustStaminaLossBuffered(getweight()*1.2)//CIT CHANGE - makes attacking things cause stamina loss - user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(O) - O.attacked_by(src, user) + if(!O.attacked_by(src, user)) + user.changeNext_move(click_delay) + var/weight = getweight(user, STAM_COST_ATTACK_OBJ_MULT) + if(weight) + user.adjustStaminaLossBuffered(weight)//CIT CHANGE - makes attacking things cause stamina loss /atom/movable/proc/attacked_by() return -/obj/attacked_by(obj/item/I, mob/living/user) - if(I.force) +/obj/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + var/totitemdamage = I.force * damage_multiplier + var/bad_trait + + var/stamloss = user.getStaminaLoss() + var/next_move_mult = 1 + if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do. + var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY + totitemdamage *= 1 - penalty + next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY + user.changeNext_move(I.click_delay*next_move_mult) + + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + bad_trait = SKILL_COMBAT_MODE //blacklist combat skills. + + if(I.used_skills && user.mind) + if(totitemdamage) + totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_trait) + for(var/skill in I.used_skills) + if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_OBJ)) + continue + user.mind.auto_gain_experience(skill, I.skill_gain) + + if(totitemdamage) visible_message("[user] has hit [src] with [I]!", null, null, COMBAT_MESSAGE_RANGE) //only witnesses close by and the victim see a hit message. log_combat(user, src, "attacked", I) - take_damage(I.force, I.damtype, "melee", 1) + take_damage(totitemdamage, I.damtype, "melee", 1) + return TRUE -/mob/living/attacked_by(obj/item/I, mob/living/user) - //CIT CHANGES START HERE - combatmode and resting checks - var/totitemdamage = I.force - if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - totitemdamage *= 0.5 - if(!CHECK_MOBILITY(user, MOBILITY_STAND)) - totitemdamage *= 0.5 - //CIT CHANGES END HERE - if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) +/mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + var/list/block_return = list() + var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier + if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS) return FALSE - send_item_attack_message(I, user) - I.do_stagger_action(src, user) + totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return) + send_item_attack_message(I, user, null, totitemdamage) + I.do_stagger_action(src, user, totitemdamage) if(I.force) - apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage - if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) + apply_damage(totitemdamage, I.damtype) + if(I.damtype == BRUTE) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) @@ -140,12 +153,49 @@ user.add_mob_blood(src) return TRUE //successful attack -/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user) +/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(I.force < force_threshold || I.damtype == STAMINA) playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1) + user.changeNext_move(I.click_delay) //pre_attacked_by not called else return ..() +/mob/living/proc/pre_attacked_by(obj/item/I, mob/living/user) + . = I.force + if(!.) + return + + var/stamloss = user.getStaminaLoss() + var/stam_mobility_mult = 1 + var/next_move_mult = 1 + if(stamloss > STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do. + var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_ITEM_ATTACK_PENALTY + stam_mobility_mult -= penalty + next_move_mult += penalty*STAM_CRIT_ITEM_ATTACK_DELAY + if(stam_mobility_mult > LYING_DAMAGE_PENALTY && !CHECK_MOBILITY(user, MOBILITY_STAND)) //damage penalty for fighting prone, doesn't stack with the above. + stam_mobility_mult = LYING_DAMAGE_PENALTY + . *= stam_mobility_mult + user.changeNext_move(I.click_delay*next_move_mult) + I.attack_delay_done = TRUE + + var/bad_trait + if(!(I.item_flags & NO_COMBAT_MODE_FORCE_MODIFIER)) + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + bad_trait = SKILL_COMBAT_MODE //blacklist combat skills. + if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + . *= 0.5 + else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + . *= 1.5 + + if(!user.mind || !I.used_skills) + return + if(.) + . = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_trait) + for(var/skill in I.used_skills) + if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_MOB)) + continue + user.mind.auto_gain_experience(skill, I.skill_gain) + // Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. // Click parameters is the params string from byond Click() code, see that documentation. /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -155,14 +205,16 @@ /obj/item/proc/get_clamped_volume() if(w_class) if(force) - return CLAMP((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 + return clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 else - return CLAMP(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 + return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 -/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area) +/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area, current_force) var/message_verb = "attacked" if(I.attack_verb && I.attack_verb.len) message_verb = "[pick(I.attack_verb)]" + if(current_force < I.force * FEEBLE_ATTACK_MSG_THRESHOLD) + message_verb = "[pick("feebly", "limply", "saplessly")] [message_verb]" else if(!I.force) return var/message_hit_area = "" @@ -179,22 +231,32 @@ return 1 /// How much stamina this takes to swing this is not for realism purposes hecc off. -/obj/item/proc/getweight() - return total_mass || w_class * 1.25 +/obj/item/proc/getweight(mob/living/user, multiplier = 1, trait = SKILL_STAMINA_COST) + . = (total_mass || w_class * STAM_COST_W_CLASS_MULT) * multiplier + if(!user) + return + var/bad_trait + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + . *= STAM_COST_NO_COMBAT_MULT + bad_trait = SKILL_COMBAT_MODE + if(used_skills && user.mind) + . = user.mind.item_action_skills_mod(src, ., skill_difficulty, trait, bad_trait, FALSE) + var/total_health = user.getStaminaLoss() + . = clamp(., 0, STAMINA_NEAR_CRIT - total_health) /// How long this staggers for. 0 and negatives supported. -/obj/item/proc/melee_stagger_duration() +/obj/item/proc/melee_stagger_duration(force_override) if(!isnull(stagger_force)) return stagger_force /// totally not an untested, arbitrary equation. - return clamp((1.5 + (w_class/7.5)) * (force / 2), 0, 10 SECONDS) + return clamp((1.5 + (w_class/7.5)) * ((force_override || force) / 2), 0, 10 SECONDS) -/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user) +/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user, force_override) if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER)) return FALSE if(target.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) target.do_staggered_animation() - var/duration = melee_stagger_duration() + var/duration = melee_stagger_duration(force_override) if(!duration) //0 return FALSE else if(duration > 0) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index d596b5fabf..9f9870a9e5 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -5,7 +5,7 @@ return // seems legit. // Things you might plausibly want to follow - if(ismovableatom(A)) + if(ismovable(A)) ManualFollow(A) // Otherwise jump diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 19fef28597..28803f0979 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -3,9 +3,7 @@ name = "Initializing..." var/target -INITIALIZE_IMMEDIATE(/obj/effect/statclick) - -/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical +/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical . = ..() name = text src.target = target @@ -33,6 +31,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) usr.client.debug_variables(target) message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") +/obj/effect/statclick/misc_subsystems/Click() + if(!usr.client.holder) + return + var/subsystem = input(usr, "Debug which subsystem?", "Debug nonprocessing subsystem") as null|anything in (Master.subsystems - Master.statworthy_subsystems) + if(!subsystem) + return + usr.client.debug_variables(subsystem) + message_admins("Admin [key_name_admin(usr)] is debugging the [subsystem] subsystem.") // Debug verbs. /client/proc/restart_controller(controller in list("Master", "Failsafe")) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index d7323700e4..4647b83cd7 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -103,7 +103,7 @@ return FALSE var/temp = text2num(trim(str_val)) if(!isnull(temp)) - config_entry_value = CLAMP(integer ? round(temp) : temp, min_val, max_val) + config_entry_value = clamp(integer ? round(temp) : temp, min_val, max_val) if(config_entry_value != temp && !(datum_flags & DF_VAR_EDITED)) log_config("Changing [name] from [temp] to [config_entry_value]!") return TRUE diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index f253bc543d..435a35c05e 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -35,6 +35,13 @@ /datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value) return key_name in config.modes +/datum/config_entry/keyed_list/force_antag_count + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/force_antag_count/ValidateListEntry(key_name, key_value) + return key_name in config.modes + /datum/config_entry/keyed_list/policy key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_TEXT @@ -74,6 +81,8 @@ /datum/config_entry/flag/disable_peaceborg +/datum/config_entry/flag/economy //money money money money money money money money money money money money + /datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. config_entry_value = 3 @@ -217,7 +226,8 @@ config_entry_value = list( //DEFAULTS /mob/living/simple_animal = 1, /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/hunter = -1, + /mob/living/carbon/alien/humanoid/sentinel = 0.25, + /mob/living/carbon/alien/humanoid/drone = 0.5, /mob/living/carbon/alien/humanoid/royal/praetorian = 1, /mob/living/carbon/alien/humanoid/royal/queen = 3 ) @@ -248,8 +258,18 @@ /datum/config_entry/number/movedelay/run_delay +/datum/config_entry/number/movedelay/run_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run) + M.sync() + /datum/config_entry/number/movedelay/walk_delay +/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) + M.sync() + /datum/config_entry/number/movedelay/sprint_speed_increase config_entry_value = 1 @@ -288,6 +308,8 @@ /datum/config_entry/flag/roundstart_away //Will random away mission be loaded. +/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded? + /datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. config_entry_value = 18000 min_val = 0 @@ -335,6 +357,11 @@ config_entry_value = 16 min_val = 0 +/datum/config_entry/number/icemoon_budget + config_entry_value = 90 + integer = FALSE + min_val = 0 + /datum/config_entry/number/station_space_budget config_entry_value = 10 min_val = 0 @@ -408,6 +435,10 @@ config_entry_value = 64 min_val = 0 +/datum/config_entry/number/ratcap + config_entry_value = 64 + min_val = 0 + /datum/config_entry/flag/disable_stambuffer /datum/config_entry/keyed_list/box_random_engine @@ -449,3 +480,51 @@ key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_FLAG config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. + +//Body size configs, the feature will be disabled if both min and max have the same value. +/datum/config_entry/number/body_size_min + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = 0.1 //to avoid issues with zeros and negative values. + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +/datum/config_entry/number/body_size_max + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//Pun-Pun movement slowdown given to characters with a body size smaller than this value, +//to compensate for their smaller hitbox. +//To disable, just make sure the value is lower than 'body_size_min' +/datum/config_entry/number/threshold_body_size_slowdown + config_entry_value = RESIZE_DEFAULT_SIZE * 0.85 + min_val = 0 + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. +//doesn't apply to floating or crawling mobs +/datum/config_entry/number/body_size_slowdown_multiplier + config_entry_value = 0.25 + min_val = 0.1 //To encourage folks to disable the slowdown through the above config instead. + integer = FALSE + +//Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. +/datum/config_entry/flag/allow_custom_skintones + +///Initial loadout points +/datum/config_entry/number/initial_gear_points + config_entry_value = 10 + +/** + * Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. + * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. + */ +/datum/config_entry/flag/use_field_of_vision + +//Shuttle size limiter +/datum/config_entry/number/max_shuttle_count + config_entry_value = 6 + +/datum/config_entry/number/max_shuttle_size + config_entry_value = 250 diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm index f499a61ae7..fe6a49c854 100644 --- a/code/controllers/hooks.dm +++ b/code/controllers/hooks.dm @@ -27,13 +27,11 @@ var/hook_path = text2path("/hook/[hook]") if(!hook_path) CRASH("Invalid hook '/hook/[hook]' called.") - return 0 var/caller = new hook_path var/status = 1 for(var/P in typesof("[hook_path]/proc")) if(!call(caller, P)(arglist(args))) CRASH("Hook '[P]' failed or runtimed.") - status = 0 return status diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 8772fac5af..cdbea1de85 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -28,6 +28,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // List of subsystems to process(). var/list/subsystems + /// List of subsystems to include in the MC stat panel. + var/list/statworthy_subsystems // Vars for keeping track of tick drift. var/init_timeofday @@ -36,6 +38,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/sleep_delta = 1 + ///Only run ticker subsystems for the next n ticks. + var/skip_ticks = 0 + var/make_runtime = 0 var/initializations_finished_with_no_players_logged_in //I wonder what this could be? @@ -62,6 +67,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits var/static/current_ticklimit = TICK_LIMIT_RUNNING + /// Statclick for misc subsystems + var/obj/effect/statclick/misc_subsystems/misc_statclick + /datum/controller/master/New() if(!config) config = new @@ -84,6 +92,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new _subsystems += new I Master = src + // We want to see all subsystems during init. + statworthy_subsystems = subsystems.Copy() + + misc_statclick = new(null, "Debug") + if(!GLOB) new /datum/controller/global_vars @@ -254,10 +267,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/list/tickersubsystems = list() var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time + statworthy_subsystems = list() for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing if (SS.flags & SS_NO_FIRE) + if(SS.flags & SS_ALWAYS_SHOW_STAT) + statworthy_subsystems += SS continue + statworthy_subsystems += SS SS.queued_time = 0 SS.queue_next = null SS.queue_prev = null @@ -335,7 +352,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new new/datum/controller/failsafe() // (re)Start the failsafe. //now do the actual stuff - if (!queue_head || !(iteration % 3)) + if (!skip_ticks) var/checking_runlevel = current_runlevel if(cached_runlevel != checking_runlevel) //resechedule subsystems @@ -381,6 +398,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new iteration++ last_run = world.time + if (skip_ticks) + skip_ticks-- src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta) current_ticklimit = TICK_LIMIT_RUNNING if (processing * sleep_delta <= world.tick_lag) @@ -444,10 +463,12 @@ GLOBAL_REAL(Master, /datum/controller/master) = new while (queue_node) if (ran && TICK_USAGE > TICK_LIMIT_RUNNING) break - queue_node_flags = queue_node.flags queue_node_priority = queue_node.queued_priority + if (!(queue_node_flags & SS_TICKER) && skip_ticks) + queue_node = queue_node.queue_next + continue //super special case, subsystems where we can't make them pause mid way through //if we can't run them this tick (without going over a tick) //we bump up their priority and attempt to run them next tick @@ -455,14 +476,15 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // in those cases, so we just let them run) if (queue_node_flags & SS_NO_TICK_CHECK) if (queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker) - queue_node.queued_priority += queue_priority_count * 0.1 - queue_priority_count -= queue_node_priority - queue_priority_count += queue_node.queued_priority - current_tick_budget -= queue_node_priority - queue_node = queue_node.queue_next + if (!(queue_node_flags & SS_BACKGROUND)) + queue_node.queued_priority += queue_priority_count * 0.1 + queue_priority_count -= queue_node_priority + queue_priority_count += queue_node.queued_priority + current_tick_budget -= queue_node_priority + queue_node = queue_node.queue_next continue - if ((queue_node_flags & SS_BACKGROUND) && !bg_calc) + if (!bg_calc && (queue_node_flags & SS_BACKGROUND)) current_tick_budget = queue_priority_count_bg bg_calc = TRUE @@ -515,7 +537,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new queue_node.paused_ticks = 0 queue_node.paused_tick_usage = 0 - if (queue_node_flags & SS_BACKGROUND) //update our running total + if (bg_calc) //update our running total queue_priority_count_bg -= queue_node_priority else queue_priority_count -= queue_node_priority @@ -583,14 +605,19 @@ GLOBAL_REAL(Master, /datum/controller/master) = new log_world("MC: SoftReset: Finished.") . = 1 +/// Warns us that the end of tick byond map_update will be laggier then normal, so that we can just skip running subsystems this tick. +/datum/controller/master/proc/laggy_byond_map_update_incoming() + if (!skip_ticks) + skip_ticks = 1 /datum/controller/master/stat_entry() if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))") - stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) + stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)") + stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])")) + stat("Misc Subsystems", misc_statclick) /datum/controller/master/StartLoadingMap() //disallow more than one map to load at once, multithreading it will just cause race conditions diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 13facc7666..4d8bc3b1f6 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -1,11 +1,3 @@ -#define SSAIR_PIPENETS 1 -#define SSAIR_ATMOSMACHINERY 2 -#define SSAIR_REACTQUEUE 3 -#define SSAIR_EXCITEDGROUPS 4 -#define SSAIR_HIGHPRESSURE 5 -#define SSAIR_HOTSPOTS 6 -#define SSAIR_SUPERCONDUCTIVITY 7 - SUBSYSTEM_DEF(air) name = "Atmospherics" init_order = INIT_ORDER_AIR @@ -20,6 +12,7 @@ SUBSYSTEM_DEF(air) var/cost_hotspots = 0 var/cost_superconductivity = 0 var/cost_pipenets = 0 + var/cost_rebuilds = 0 var/cost_atmos_machinery = 0 var/list/excited_groups = list() @@ -27,6 +20,7 @@ SUBSYSTEM_DEF(air) var/list/turf_react_queue = list() var/list/hotspots = list() var/list/networks = list() + var/list/pipenets_needing_rebuilt = list() var/list/obj/machinery/atmos_machinery = list() var/list/pipe_init_dirs_cache = list() @@ -39,7 +33,7 @@ SUBSYSTEM_DEF(air) var/list/currentrun = list() - var/currentpart = SSAIR_PIPENETS + var/currentpart = SSAIR_REBUILD_PIPENETS var/map_loading = TRUE var/list/queued_for_activation @@ -52,6 +46,7 @@ SUBSYSTEM_DEF(air) msg += "HS:[round(cost_hotspots,1)]|" msg += "SC:[round(cost_superconductivity,1)]|" msg += "PN:[round(cost_pipenets,1)]|" + msg += "RB:[round(cost_rebuilds,1)]|" msg += "AM:[round(cost_atmos_machinery,1)]" msg += "} " msg += "AT:[active_turfs.len]|" @@ -77,6 +72,20 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/fire(resumed = 0) var/timer = TICK_USAGE_REAL + if(currentpart == SSAIR_REBUILD_PIPENETS) + var/list/pipenet_rebuilds = pipenets_needing_rebuilt + for(var/thing in pipenet_rebuilds) + var/obj/machinery/atmospherics/AT = thing + if(!istype(AT)) + continue + AT.build_network() + cost_rebuilds = MC_AVERAGE(cost_rebuilds, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + pipenets_needing_rebuilt.Cut() + if(state != SS_RUNNING) + return + resumed = FALSE + currentpart = SSAIR_PIPENETS + if(currentpart == SSAIR_PIPENETS || !resumed) process_pipenets(resumed) cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) @@ -137,9 +146,7 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_PIPENETS - - + currentpart = SSAIR_REBUILD_PIPENETS /datum/controller/subsystem/air/proc/process_pipenets(resumed = 0) if (!resumed) @@ -156,6 +163,9 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return +/datum/controller/subsystem/air/proc/add_to_rebuild_queue(atmos_machine) + if(istype(atmos_machine, /obj/machinery/atmospherics)) + pipenets_needing_rebuilt += atmos_machine /datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0) var/seconds = wait * 0.1 diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 7b6554bd3f..7285298283 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -6,17 +6,7 @@ SUBSYSTEM_DEF(assets) var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) - - var/list/priority_assets = list( - /datum/asset/simple/oui_theme_nano, - /datum/asset/simple/goonchat - ) - - for(var/type in priority_assets) - var/datum/asset/A = new type() - A.register() - - for(var/type in typesof(/datum/asset) - (priority_assets | list(/datum/asset, /datum/asset/simple))) + for(var/type in typesof(/datum/asset)) var/datum/asset/A = type if (type != initial(A._abstract)) get_asset_datum(type) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 35feab6648..c1644df9c9 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -16,7 +16,6 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR - setupGenetics() //to set the mutations' sequence. initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() return ..() @@ -107,28 +106,6 @@ SUBSYSTEM_DEF(atoms) old_initialized = SSatoms.old_initialized BadInitializeCalls = SSatoms.BadInitializeCalls -/datum/controller/subsystem/atoms/proc/setupGenetics() - var/list/mutations = subtypesof(/datum/mutation/human) - shuffle_inplace(mutations) - for(var/A in subtypesof(/datum/generecipe)) - var/datum/generecipe/GR = A - GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result) - for(var/i in 1 to LAZYLEN(mutations)) - var/path = mutations[i] //byond gets pissy when we do it in one line - var/datum/mutation/human/B = new path () - B.alias = "Mutation #[i]" - GLOB.all_mutations[B.type] = B - GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks) - if(B.locked) - continue - if(B.quality == POSITIVE) - GLOB.good_mutations |= B - else if(B.quality == NEGATIVE) - GLOB.bad_mutations |= B - else if(B.quality == MINOR_NEGATIVE) - GLOB.not_good_mutations |= B - CHECK_TICK - /datum/controller/subsystem/atoms/proc/InitLog() . = "" for(var/path in BadInitializeCalls) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 8b068e5d67..3243a8d8c8 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -38,11 +38,17 @@ PROCESSING_SUBSYSTEM_DEF(dcs) if(istext(key)) value = arguments[key] if(!(istext(key) || isnum(key))) - key = REF(key) + if(islist(key)) // CITADEL EDIT + key = deep_list2params(key) + else + key = REF(key) key = "[key]" // Key is stringified so numbers dont break things if(!isnull(value)) if(!(istext(value) || isnum(value))) - value = REF(value) + if(islist(value)) // CITADEL EDIT + value = deep_list2params(value) + else + value = REF(value) named_arguments["[key]"] = value else fullid += "[key]" diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm new file mode 100644 index 0000000000..078d122aa6 --- /dev/null +++ b/code/controllers/subsystem/economy.dm @@ -0,0 +1,139 @@ +SUBSYSTEM_DEF(economy) + name = "Economy" + wait = 5 MINUTES + init_order = INIT_ORDER_ECONOMY + runlevels = RUNLEVEL_GAME + var/roundstart_paychecks = 5 + var/budget_pool = 35000 + var/list/department_accounts = list(ACCOUNT_CIV = ACCOUNT_CIV_NAME, + ACCOUNT_ENG = ACCOUNT_ENG_NAME, + ACCOUNT_SCI = ACCOUNT_SCI_NAME, + ACCOUNT_MED = ACCOUNT_MED_NAME, + ACCOUNT_SRV = ACCOUNT_SRV_NAME, + ACCOUNT_CAR = ACCOUNT_CAR_NAME, + ACCOUNT_SEC = ACCOUNT_SEC_NAME) + var/list/generated_accounts = list() + var/full_ancap = FALSE // Enables extra money charges for things that normally would be free, such as sleepers/cryo/cloning. + //Take care when enabling, as players will NOT respond well if the economy is set up for low cash flows. + var/alive_humans_bounty = 100 + var/crew_safety_bounty = 1500 + var/monster_bounty = 150 + var/mood_bounty = 100 + var/techweb_bounty = 250 + var/slime_bounty = list("grey" = 10, + // tier 1 + "orange" = 100, + "metal" = 100, + "blue" = 100, + "purple" = 100, + // tier 2 + "dark purple" = 500, + "dark blue" = 500, + "green" = 500, + "silver" = 500, + "gold" = 500, + "yellow" = 500, + "red" = 500, + "pink" = 500, + // tier 3 + "cerulean" = 750, + "sepia" = 750, + "bluespace" = 750, + "pyrite" = 750, + "light pink" = 750, + "oil" = 750, + "adamantine" = 750, + // tier 4 + "rainbow" = 1000) + var/list/bank_accounts = list() //List of normal accounts (not department accounts) + var/list/dep_cards = list() + +/datum/controller/subsystem/economy/Initialize(timeofday) + var/budget_to_hand_out = round(budget_pool / department_accounts.len) + for(var/A in department_accounts) + new /datum/bank_account/department(A, budget_to_hand_out) + return ..() + +/datum/controller/subsystem/economy/fire(resumed = 0) + eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. + sci_payout() // Payout based on slimes. + secmedsrv_payout() // Payout based on crew safety, health, and mood. + civ_payout() // Payout based on ??? Profit + car_payout() // Cargo's natural gain in the cash moneys. + for(var/A in bank_accounts) + var/datum/bank_account/B = A + B.payday(1) + + +/datum/controller/subsystem/economy/proc/get_dep_account(dep_id) + for(var/datum/bank_account/department/D in generated_accounts) + if(D.department_id == dep_id) + return D + +/datum/controller/subsystem/economy/proc/eng_payout() + var/engineering_cash = 3000 + var/datum/bank_account/D = get_dep_account(ACCOUNT_ENG) + if(D) + D.adjust_money(engineering_cash) + + +/datum/controller/subsystem/economy/proc/car_payout() + var/cargo_cash = 500 + var/datum/bank_account/D = get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(cargo_cash) + +/datum/controller/subsystem/economy/proc/secmedsrv_payout() + var/crew + var/alive_crew + var/dead_monsters + var/cash_to_grant + for(var/mob/m in GLOB.mob_list) + if(isnewplayer(m)) + continue + if(m.mind) + if(isbrain(m) || iscameramob(m)) + continue + if(ishuman(m)) + var/mob/living/carbon/human/H = m + crew++ + if(H.stat != DEAD) + alive_crew++ + var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) + var/medical_cash = (H.health / H.maxHealth) * alive_humans_bounty + if(mood) + var/datum/bank_account/D = get_dep_account(ACCOUNT_SRV) + if(D) + var/mood_dosh = (mood.mood_level / 9) * mood_bounty + D.adjust_money(mood_dosh) + medical_cash *= (mood.sanity / 100) + + var/datum/bank_account/D = get_dep_account(ACCOUNT_MED) + if(D) + D.adjust_money(medical_cash) + if(ishostile(m)) + var/mob/living/simple_animal/hostile/H = m + if(H.stat == DEAD && (H.z in SSmapping.levels_by_trait(ZTRAIT_STATION))) + dead_monsters++ + CHECK_TICK + var/living_ratio = alive_crew / crew + cash_to_grant = (crew_safety_bounty * living_ratio) + (monster_bounty * dead_monsters) + var/datum/bank_account/D = get_dep_account(ACCOUNT_SEC) + if(D) + D.adjust_money(min(cash_to_grant, MAX_GRANT_SECMEDSRV)) + +/datum/controller/subsystem/economy/proc/sci_payout() + var/science_bounty = 0 + for(var/mob/living/simple_animal/slime/S in GLOB.mob_list) + if(S.stat == DEAD) + continue + science_bounty += slime_bounty[S.colour] + var/datum/bank_account/D = get_dep_account(ACCOUNT_SCI) + if(D) + D.adjust_money(min(science_bounty, MAX_GRANT_SCI)) + +/datum/controller/subsystem/economy/proc/civ_payout() + var/civ_cash = (rand(1,5) * 500) + var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV) + if(D) + D.adjust_money(min(civ_cash, MAX_GRANT_CIV)) diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index 02e7bc7aab..78c4807c3f 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -21,9 +21,6 @@ SUBSYSTEM_DEF(fail2topic) DropFirewallRule() // Clear the old bans if any still remain - if (world.system_type == UNIX && enabled) - enabled = FALSE - subsystem_log("DISABLED - UNIX systems are not supported.") if(!enabled) flags |= SS_NO_FIRE can_fire = FALSE @@ -90,7 +87,10 @@ SUBSYSTEM_DEF(fail2topic) fail_counts -= ip rate_limiting -= ip - . = shell("netsh advfirewall firewall add rule name=\"[rule_name]\" dir=in interface=any action=block remoteip=[ip]") + if (world.system_type == UNIX) + . = shell("iptables -A [rule_name] -s [ip] -j DROP") + else + . = shell("netsh advfirewall firewall add rule name=\"[rule_name]\" dir=in interface=any action=block remoteip=[ip]") if (.) subsystem_log("Failed to ban [ip]. Exit code: [.].") @@ -105,7 +105,10 @@ SUBSYSTEM_DEF(fail2topic) active_bans = list() - . = shell("netsh advfirewall firewall delete rule name=\"[rule_name]\"") + if (world.system_type == UNIX) + . = shell("iptables -F [rule_name]") //Let's just assume that folks running linux are smart enough to have a dedicated chain configured for this. + else + . = shell("netsh advfirewall firewall delete rule name=\"[rule_name]\"") if (.) subsystem_log("Failed to drop firewall rule. Exit code: [.].") diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 166f930e33..8a1c08bc35 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -451,3 +451,18 @@ SUBSYSTEM_DEF(garbage) #endif #endif + +#ifdef TESTING +/proc/writeDatumCount() + var/list/datums = list() + for(var/datum/D in world) + datums[D.type] += 1 + for(var/datum/D) + datums[D.type] += 1 + datums = sortTim(datums, /proc/cmp_numeric_dsc, associative = TRUE) + if(fexists("data/DATUMCOUNT.txt")) + fdel("data/DATUMCOUNT.txt") + var/outfile = file("data/DATUMCOUNT.txt") + for(var/path in datums) + outfile << "[datums[path]]\t\t\t\t\t[path]" +#endif diff --git a/code/controllers/subsystem/holodeck.dm b/code/controllers/subsystem/holodeck.dm new file mode 100644 index 0000000000..ecf8d67dbb --- /dev/null +++ b/code/controllers/subsystem/holodeck.dm @@ -0,0 +1,56 @@ +SUBSYSTEM_DEF(holodeck) + name = "Holodeck" + init_order = INIT_ORDER_HOLODECK + flags = SS_NO_FIRE + var/list/program_cache = list() //list of safe holodeck programs. + var/list/emag_program_cache = list() //like above, but dangerous. + var/list/offline_programs = list() //default when offline. + var/list/target_holodeck_area = list() + var/list/rejected_areas = list() + +/datum/controller/subsystem/holodeck/Initialize() + . = ..() + //generates the list of available holodeck programs. + for(var/path in subtypesof(/datum/holodeck_cache)) + new path + for(var/path in typesof(/obj/machinery/computer/holodeck)) //The istances will be handled by SSatoms. + var/obj/machinery/computer/holodeck/H = path + offline_programs[path] = pop(get_areas(initial(H.offline_program)), FALSE) + target_holodeck_area[path] = pop(get_areas(initial(H.holodeck_type)), FALSE) + + + /* + * The sole scope of this datum is to generate lists of holodeck programs caches per holodeck computer type. + */ + +/datum/holodeck_cache + var/area/holodeck/master_type //the /area/holodeck typepath we'll be using for typesof loop. + var/skip_types //Areas that won't be added to the global list category. + var/list/compatible_holodeck_comps //list of typepaths of holodeck computers that can access this category. + +/datum/holodeck_cache/New() + if(!master_type || !compatible_holodeck_comps) + return + var/list/to_add = typesof(master_type) - skip_types + var/list/programs + var/list/emag_programs + for(var/typekey in to_add) + var/area/holodeck/A = GLOB.areas_by_type[typekey] + if(!A || !A.contents.len) + LAZYOR(SSholodeck.rejected_areas[typekey], compatible_holodeck_comps) + continue + var/list/info_this = list("name" = A.name, "type" = A.type) + if(A.restricted) + LAZYADD(emag_programs, list(info_this)) + else + LAZYADD(programs, list(info_this)) + for(var/comp in compatible_holodeck_comps) + if(programs) + LAZYADD(SSholodeck.program_cache[comp], programs) + if(emag_programs) + LAZYADD(SSholodeck.emag_program_cache[comp], emag_programs) + +/datum/holodeck_cache/standard + master_type = /area/holodeck/rec_center + skip_types = /area/holodeck/rec_center + compatible_holodeck_comps = list(/obj/machinery/computer/holodeck) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 0970b23a16..7c51ba4506 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -6,13 +6,20 @@ SUBSYSTEM_DEF(input) priority = FIRE_PRIORITY_INPUT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - var/list/macro_sets - var/list/movement_keys + /// Classic mode input focused macro set. Manually set because we can't define ANY or ANY+UP for classic. + var/static/list/macroset_classic_input + /// Classic mode map focused macro set. Manually set because it needs to be clientside and go to macroset_classic_input. + var/static/list/macroset_classic_hotkey + /// New hotkey mode macro set. All input goes into map, game keeps incessently setting your focus to map, we can use ANY all we want here; we don't care about the input bar, the user has to force the input bar every time they want to type. + var/static/list/macroset_hotkey + + /// Macro set for hotkeys + var/list/hotkey_mode_macros + /// Macro set for classic. + var/list/input_mode_macros /datum/controller/subsystem/input/Initialize() - setup_default_macro_sets() - - setup_default_movement_keys() + setup_macrosets() initialized = TRUE @@ -20,90 +27,69 @@ SUBSYSTEM_DEF(input) return ..() -// This is for when macro sets are eventualy datumized -/datum/controller/subsystem/input/proc/setup_default_macro_sets() - var/list/static/default_macro_sets - - if(default_macro_sets) - macro_sets = default_macro_sets - return - - default_macro_sets = list( - "default" = list( - "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", - "O" = "ooc", - "Ctrl+O" = "looc", - "T" = "say", - "Ctrl+T" = "whisper", - "M" = "me", - "Ctrl+M" = "subtle", - "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs - "Any" = "\"KeyDown \[\[*\]\]\"", - "Any+UP" = "\"KeyUp \[\[*\]\]\"", - ), - "old_default" = list( - "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", - "Ctrl+T" = "say", - "Ctrl+O" = "ooc", - ), - "old_hotkeys" = list( - "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", - "O" = "ooc", - "L" = "looc", - "T" = "say", - "M" = "me", - "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs - "Any" = "\"KeyDown \[\[*\]\]\"", - "Any+UP" = "\"KeyUp \[\[*\]\]\"", - ), - ) - - // Because i'm lazy and don't want to type all these out twice - var/list/old_default = default_macro_sets["old_default"] - - var/list/static/oldmode_keys = list( +/// Sets up the key list for classic mode for when badmins screw up vv's. +/datum/controller/subsystem/input/proc/setup_macrosets() + // First, let's do the snowflake keyset! + macroset_classic_input = list() + var/list/classic_mode_keys = list( "North", "East", "South", "West", "Northeast", "Southeast", "Northwest", "Southwest", - "Insert", "Delete", "Ctrl", "Alt", + "Insert", "Delete", "Ctrl", "Alt", "Shift", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", ) + for(var/key in classic_mode_keys) + macroset_classic_input[key] = "\"KeyDown [key]\"" + macroset_classic_input["[key]+UP"] = "\"KeyUp [key]\"" + // LET'S PLAY THE BIND EVERY KEY GAME! + // oh except for Backspace and Enter; if you want to use those you shouldn't have used oldmode! + var/list/classic_ctrl_override_keys = list( + "\[", "\]", "\\\\", ";", "'", ",", ".", "/", "-", "=", "`" + ) + // i'm lazy let's play the list iteration game of numbers + for(var/i in 0 to 9) + classic_ctrl_override_keys += "[i]" + // let's play the ascii game of A to Z (UPPERCASE) + for(var/i in 65 to 90) + classic_ctrl_override_keys += ascii2text(i) + // let's play the game of clientside bind overrides! + classic_ctrl_override_keys -= list("T", "O", "M", "L") + macroset_classic_input["Ctrl+T"] = "say" + macroset_classic_input["Ctrl+O"] = "ooc" + macroset_classic_input["Ctrl+L"] = "looc" + // let's play the list iteration game x2 + for(var/key in classic_ctrl_override_keys) + // make sure to double double quote to ensure things are treated as a key combo instead of addition/semicolon logic. + macroset_classic_input["\"Ctrl+[key]\""] = "\"KeyDown [istext(classic_ctrl_override_keys[key])? classic_ctrl_override_keys[key] : key]\"" + macroset_classic_input["\"Ctrl+[key]+UP\""] = "\"KeyUp [istext(classic_ctrl_override_keys[key])? classic_ctrl_override_keys[key] : key]\"" + // Misc + macroset_classic_input["Tab"] = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_HOTKEYS] map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"" + macroset_classic_input["Escape"] = "\".winset \\\"input.text=\\\"\\\"\\\"\"" - for(var/i in 1 to oldmode_keys.len) - var/key = oldmode_keys[i] - old_default[key] = "\"KeyDown [key]\"" - old_default["[key]+UP"] = "\"KeyUp [key]\"" + // FINALLY, WE CAN DO SOMETHING MORE NORMAL FOR THE SNOWFLAKE-BUT-LESS KEYSET. + macroset_classic_hotkey = list( + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + "Tab" = "\".winset \\\"mainwindow.macro=[SKIN_MACROSET_CLASSIC_INPUT] input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", + "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", + "O" = "ooc", + "T" = "say", + "L" = "looc", + "M" = "me" + ) - var/list/static/oldmode_ctrl_override_keys = list( - "W" = "W", "A" = "A", "S" = "S", "D" = "D", // movement - "1" = "1", "2" = "2", "3" = "3", "4" = "4", // intent - "B" = "B", // resist - "E" = "E", // quick equip - "F" = "F", // intent left - "G" = "G", // intent right - "H" = "H", // stop pulling - "Q" = "Q", // drop - "R" = "R", // throw - "X" = "X", // switch hands - "Y" = "Y", // activate item - "Z" = "Z", // activate item - ) - - for(var/i in 1 to oldmode_ctrl_override_keys.len) - var/key = oldmode_ctrl_override_keys[i] - var/override = oldmode_ctrl_override_keys[key] - old_default["Ctrl+[key]"] = "\"KeyDown [override]\"" - old_default["Ctrl+[key]+UP"] = "\"KeyUp [override]\"" - - macro_sets = default_macro_sets - -// For initially setting up or resetting to default the movement keys -/datum/controller/subsystem/input/proc/setup_default_movement_keys() - var/static/list/default_movement_keys = list( - "W" = NORTH, "A" = WEST, "S" = SOUTH, "D" = EAST, // WASD - "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad - ) - - movement_keys = default_movement_keys.Copy() + // And finally, the modern set. + macroset_hotkey = list( + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "Escape" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", + "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", + "O" = "ooc", + "T" = "say", + "L" = "looc", + "M" = "me" + ) // Badmins just wanna have fun ♪ /datum/controller/subsystem/input/proc/refresh_client_macro_sets() @@ -111,9 +97,10 @@ SUBSYSTEM_DEF(input) for(var/i in 1 to clients.len) var/client/user = clients[i] user.set_macros() + user.update_movement_keys() /datum/controller/subsystem/input/fire() var/list/clients = GLOB.clients // Let's sing the list cache song - for(var/i in 1 to length(clients)) + for(var/i in 1 to clients.len) var/client/C = clients[i] C.keyLoop() diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 91d0db85d1..4b2cf24f1e 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -428,6 +428,8 @@ SUBSYSTEM_DEF(job) if(!joined_late) var/obj/S = null for(var/obj/effect/landmark/start/sloc in GLOB.start_landmarks_list) + if(!sloc.job_spawnpoint) + continue if(sloc.name != rank) S = sloc //so we can revert to spawning them on top of eachother if something goes wrong continue @@ -477,6 +479,10 @@ SUBSYSTEM_DEF(job) to_chat(M, "[job.custom_spawn_text]") if(CONFIG_GET(number/minimal_access_threshold)) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") + if(ishuman(H)) + var/mob/living/carbon/human/wageslave = H + to_chat(M, "Your account ID is [wageslave.account_id].") + H.add_memory("Your account ID is [wageslave.account_id].") if(job && H) if(job.dresscodecompliant)// CIT CHANGE - dress code compliance equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 12b467b624..c6e6a84bcf 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -6,7 +6,6 @@ SUBSYSTEM_DEF(lighting) name = "Lighting" wait = 2 init_order = INIT_ORDER_LIGHTING - flags = SS_TICKER /datum/controller/subsystem/lighting/stat_entry() ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]") @@ -85,4 +84,4 @@ SUBSYSTEM_DEF(lighting) /datum/controller/subsystem/lighting/Recover() initialized = SSlighting.initialized - ..() \ No newline at end of file + ..() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index f13d5a2779..b234c4c4f2 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -1,3 +1,5 @@ +#define INIT_ANNOUNCE(X) to_chat(world, "[X]"); log_world(X) + SUBSYSTEM_DEF(mapping) name = "Mapping" init_order = INIT_ORDER_MAPPING @@ -14,6 +16,8 @@ SUBSYSTEM_DEF(mapping) var/list/ruins_templates = list() var/list/space_ruins_templates = list() var/list/lava_ruins_templates = list() + var/list/ice_ruins_templates = list() + var/list/ice_ruins_underground_templates = list() var/list/station_ruins_templates = list() var/datum/space_level/isolated_ruins_z //Created on demand during ruin loading. @@ -40,6 +44,13 @@ SUBSYSTEM_DEF(mapping) var/stat_map_name = "Loading..." + /// Lookup list for random generated IDs. + var/list/random_generated_ids_by_original = list() + /// next id for separating obfuscated ids. + var/obfuscation_next_id = 1 + /// "secret" key + var/obfuscation_secret + //dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() if(!config) @@ -50,6 +61,10 @@ SUBSYSTEM_DEF(mapping) #endif stat_map_name = config.map_name +/datum/controller/subsystem/mapping/PreInit() + if(!obfuscation_secret) + obfuscation_secret = md5(GUID()) //HAH! Guess this! + /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() if(initialized) @@ -81,25 +96,40 @@ SUBSYSTEM_DEF(mapping) // Pick a random away mission. if(CONFIG_GET(flag/roundstart_away)) createRandomZlevel() - + // Pick a random VR level. + if(CONFIG_GET(flag/roundstart_vr)) + createRandomZlevel(VIRT_REALITY_NAME, list(ZTRAIT_AWAY = TRUE, ZTRAIT_VR = TRUE), GLOB.potential_vr_levels) // Generate mining ruins loading_ruins = TRUE var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS) if (lava_ruins.len) - seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) + seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), list(/area/lavaland/surface/outdoors/unexplored), lava_ruins_templates) for (var/lava_z in lava_ruins) spawn_rivers(lava_z) + var/list/ice_ruins = levels_by_trait(ZTRAIT_ICE_RUINS) + if (ice_ruins.len) + // needs to be whitelisted for underground too so place_below ruins work + seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), ice_ruins_templates) + for (var/ice_z in ice_ruins) + spawn_rivers(ice_z, 4, /turf/open/openspace/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers) + + var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND) + if (ice_ruins_underground.len) + seedRuins(ice_ruins_underground, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/underground/unexplored), ice_ruins_underground_templates) + for (var/ice_z in ice_ruins_underground) + spawn_rivers(ice_z, 4, level_trait(ice_z, ZTRAIT_BASETURF), /area/icemoon/underground/unexplored/rivers) + // Generate deep space ruins var/list/space_ruins = levels_by_trait(ZTRAIT_SPACE_RUINS) if (space_ruins.len) - seedRuins(space_ruins, CONFIG_GET(number/space_budget), /area/space, space_ruins_templates) + seedRuins(space_ruins, CONFIG_GET(number/space_budget), list(/area/space), space_ruins_templates) // Generate station space ruins var/list/station_ruins = levels_by_trait(ZTRAIT_STATION) if (station_ruins.len) - seedRuins(station_ruins, CONFIG_GET(number/station_space_budget), /area/space/station_ruins, station_ruins_templates) + seedRuins(station_ruins, (SSmapping.config.station_ruin_budget < 0) ? CONFIG_GET(number/station_space_budget) : SSmapping.config.station_ruin_budget, list(/area/space/station_ruins), station_ruins_templates) SSmapping.seedStation() loading_ruins = FALSE #endif @@ -167,6 +197,8 @@ SUBSYSTEM_DEF(mapping) ruins_templates = SSmapping.ruins_templates space_ruins_templates = SSmapping.space_ruins_templates lava_ruins_templates = SSmapping.lava_ruins_templates + ice_ruins_templates = SSmapping.ice_ruins_templates + ice_ruins_underground_templates = SSmapping.ice_ruins_underground_templates station_ruins_templates = SSmapping.station_ruins_templates shuttle_templates = SSmapping.shuttle_templates shelter_templates = SSmapping.shelter_templates @@ -181,8 +213,7 @@ SUBSYSTEM_DEF(mapping) z_list = SSmapping.z_list -#define INIT_ANNOUNCE(X) to_chat(world, "[X]"); log_world(X) -/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) +/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE, orientation = SOUTH) . = list() var/start_time = REALTIMEOFDAY @@ -222,7 +253,7 @@ SUBSYSTEM_DEF(mapping) // load the maps for (var/P in parsed_maps) var/datum/parsed_map/pm = P - if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE)) + if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE, orientation = orientation)) errorList |= pm.original_path if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") @@ -238,7 +269,7 @@ SUBSYSTEM_DEF(mapping) // load the station station_start = world.maxz + 1 INIT_ANNOUNCE("Loading [config.map_name]...") - LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION) + LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION, FALSE, config.orientation) if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") @@ -254,7 +285,7 @@ SUBSYSTEM_DEF(mapping) // load mining if(config.minetype == "lavaland") LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND) - else if (!isnull(config.minetype)) + else if (!isnull(config.minetype) && config.minetype != "none") INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!") #endif @@ -265,7 +296,6 @@ SUBSYSTEM_DEF(mapping) msg += ", [FailedZs[I]]" msg += ". Yell at your server host!" INIT_ANNOUNCE(msg) -#undef INIT_ANNOUNCE GLOBAL_LIST_EMPTY(the_station_areas) @@ -359,6 +389,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) // Still supporting bans by filename var/list/banned = generateMapList("[global.config.directory]/lavaruinblacklist.txt") banned += generateMapList("[global.config.directory]/spaceruinblacklist.txt") + banned += generateMapList("[global.config.directory]/iceruinblacklist.txt") banned += generateMapList("[global.config.directory]/stationruinblacklist.txt") for(var/item in sortList(subtypesof(/datum/map_template/ruin), /proc/cmp_ruincost_priority)) @@ -376,6 +407,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) if(istype(R, /datum/map_template/ruin/lavaland)) lava_ruins_templates[R.name] = R + else if(istype(R, /datum/map_template/ruin/icemoon/underground)) + ice_ruins_underground_templates[R.name] = R + else if(istype(R, /datum/map_template/ruin/icemoon)) + ice_ruins_templates[R.name] = R else if(istype(R, /datum/map_template/ruin/space)) space_ruins_templates[R.name] = R else if(istype(R, /datum/map_template/ruin/station)) @@ -410,52 +445,63 @@ GLOBAL_LIST_EMPTY(the_station_areas) //Manual loading of away missions. /client/proc/admin_away() - set name = "Load Away Mission" + set name = "Load Away Mission / Virtual Reality" set category = "Fun" if(!holder ||!check_rights(R_FUN)) return + var/choice = alert(src, "What kind of level would you like to load?", "Load Away/VR", AWAY_MISSION_NAME, VIRT_REALITY_NAME, "Cancel") - if(!GLOB.the_gateway) - if(alert("There's no home gateway on the station. You sure you want to continue ?", "Uh oh", "Yes", "No") != "Yes") + var/list/possible_options + var/list/ztraits + switch(choice) + if(VIRT_REALITY_NAME) + possible_options = GLOB.potential_vr_levels + ztraits = list(ZTRAIT_AWAY = TRUE, ZTRAIT_VR = TRUE) + if(AWAY_MISSION_NAME) + if(!GLOB.the_gateway) + if(alert("There's no home gateway on the station. You sure you want to continue ?", "Uh oh", "Yes", "No") != "Yes") + return + possible_options = GLOB.potential_away_levels + ztraits = list(ZTRAIT_AWAY = TRUE) + else return - var/list/possible_options = GLOB.potentialRandomZlevels + "Custom" - var/away_name - var/datum/space_level/away_level + possible_options += "Custom" + var/lvl_name + var/datum/space_level/level - var/answer = input("What kind ? ","Away") as null|anything in possible_options + var/answer = input("What kind ? ","Away/VR") as null|anything in possible_options switch(answer) + if(null) + return if("Custom") var/mapfile = input("Pick file:", "File") as null|file if(!mapfile) return - away_name = "[mapfile] custom" - to_chat(usr,"Loading [away_name]...") - var/datum/map_template/template = new(mapfile, "Away Mission") - away_level = template.load_new_z() + lvl_name = "[mapfile] custom" + to_chat(usr,"Loading [lvl_name]...") + var/datum/map_template/template = new(mapfile, choice, ztraits) + level = template.load_new_z(ztraits) else - if(answer in GLOB.potentialRandomZlevels) - away_name = answer - to_chat(usr,"Loading [away_name]...") - var/datum/map_template/template = new(away_name, "Away Mission") - away_level = template.load_new_z() - else - return + lvl_name = answer + to_chat(usr,"Loading [lvl_name]...") + var/datum/map_template/template = new(lvl_name, choice) + level = template.load_new_z(ztraits) - message_admins("Admin [key_name_admin(usr)] has loaded [away_name] away mission.") - log_admin("Admin [key_name(usr)] has loaded [away_name] away mission.") - if(!away_level) - message_admins("Loading [away_name] failed!") + message_admins("Admin [key_name_admin(usr)] has loaded [lvl_name] [choice].") + log_admin("Admin [key_name(usr)] has loaded [lvl_name] [choice].") + if(!level) + message_admins("Loading [lvl_name] failed!") return - if(GLOB.the_gateway) + if(choice == AWAY_MISSION_NAME && GLOB.the_gateway) //Link any found away gate with station gate var/obj/machinery/gateway/centeraway/new_gate for(var/obj/machinery/gateway/centeraway/G in GLOB.machines) - if(G.z == away_level.z_value) //I'll have to refactor gateway shitcode before multi-away support. + if(G.z == level.z_value) //I'll have to refactor gateway shitcode before multi-away support. new_gate = G break //Link station gate with away gate and remove wait time. @@ -555,3 +601,15 @@ GLOBAL_LIST_EMPTY(the_station_areas) LM.load() if(GLOB.stationroom_landmarks.len) seedStation() //I'm sure we can trust everyone not to insert a 1x1 rooms which loads a landmark which loads a landmark which loads a la... + +/** + * Generates an obfuscated but constant id for an original id for cases where you don't want players codediving for an id. + * WARNING: MAKE SURE PLAYERS ARE NOT ABLE TO ACCESS THIS. To save performance, it's just secret + an incrementing number. Very guessable if you know what the secret is. + */ +/datum/controller/subsystem/mapping/proc/get_obfuscated_id(original, id_type = "GENERAL") + if(!original) + return //no. + var/key = "[original]%[id_type]" + if(random_generated_ids_by_original[key]) + return random_generated_ids_by_original[key] + . = random_generated_ids_by_original[key] = "[obfuscation_secret]%[obfuscation_next_id++]" diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index cc07f8e963..96d733e8da 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -11,7 +11,11 @@ SUBSYSTEM_DEF(materials) ///Dictionary of category || list of material refs var/list/materials_by_category ///List of stackcrafting recipes for materials using rigid materials - var/list/rigid_stack_recipes = list(new/datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE)) + var/list/rigid_stack_recipes = list( + new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + ) ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() diff --git a/code/controllers/subsystem/minimaps.dm b/code/controllers/subsystem/minimaps.dm index 75de71ca96..c25036a47d 100644 --- a/code/controllers/subsystem/minimaps.dm +++ b/code/controllers/subsystem/minimaps.dm @@ -1,8 +1,8 @@ SUBSYSTEM_DEF(minimaps) name = "Minimaps" flags = SS_NO_FIRE - var/list/station_minimaps - var/datum/minimap_group/station_minimap + var/list/station_minimaps = list() + var/datum/minimap_group/station_minimap = null /datum/controller/subsystem/minimaps/Initialize() if(!CONFIG_GET(flag/minimaps_enabled)) @@ -12,9 +12,9 @@ SUBSYSTEM_DEF(minimaps) return ..() /datum/controller/subsystem/minimaps/proc/build_minimaps() - station_minimaps = list() for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) var/datum/space_level/SL = SSmapping.get_level(z) var/name = (SL.name == initial(SL.name))? "[z] - Station" : "[z] - [SL.name]" station_minimaps += new /datum/minimap(z, name = name) + station_minimap = new(station_minimaps, "Station") diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index 8caf2a4623..885587ff55 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -8,6 +8,7 @@ SUBSYSTEM_DEF(mobs) var/static/list/clients_by_zlevel[][] var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that. var/static/list/cubemonkeys = list() + var/static/list/cheeserats = list() /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_living_list.len]") diff --git a/code/controllers/subsystem/moods.dm b/code/controllers/subsystem/moods.dm deleted file mode 100644 index f6b6ffcb40..0000000000 --- a/code/controllers/subsystem/moods.dm +++ /dev/null @@ -1,4 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(mood) - name = "Mood" - flags = SS_NO_INIT | SS_BACKGROUND - priority = 20 diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 7fd3512448..2d2fbb0704 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(npcpool) var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if(!SA.ckey && !SA.notransform) + if(!SA.ckey && !SA.mob_transforming) if(SA.stat != DEAD) SA.handle_automated_movement() if(SA.stat != DEAD) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index de2ff17a97..cd577e4ac6 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -14,6 +14,7 @@ SUBSYSTEM_DEF(persistence) var/list/saved_modes = list(1,2,3) var/list/saved_dynamic_rules = list(list(),list(),list()) var/list/saved_storytellers = list("foo","bar","baz") + var/list/average_dynamic_threat = 50 var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() @@ -23,6 +24,8 @@ SUBSYSTEM_DEF(persistence) var/list/saved_votes = list() var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums + var/list/obj/structure/sign/painting/painting_frames = list() + var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() LoadSatchels() @@ -191,6 +194,8 @@ SUBSYSTEM_DEF(persistence) if(!json) return saved_storytellers = json["data"] + if(saved_storytellers.len > 3) + average_dynamic_threat = saved_storytellers[4] saved_storytellers.len = 3 /datum/controller/subsystem/persistence/proc/LoadRecentMaps() @@ -262,6 +267,7 @@ SUBSYSTEM_DEF(persistence) CollectAntagReputation() SaveRandomizedRecipes() SavePanicBunker() + SavePaintings() /datum/controller/subsystem/persistence/proc/LoadPanicBunker() var/bunker_path = file("data/bunker_passthrough.json") @@ -434,9 +440,10 @@ SUBSYSTEM_DEF(persistence) saved_storytellers[3] = saved_storytellers[2] saved_storytellers[2] = saved_storytellers[1] saved_storytellers[1] = mode.storyteller.name + average_dynamic_threat = (mode.threat_average + average_dynamic_threat) / 2 var/json_file = file("data/RecentStorytellers.json") var/list/file_data = list() - file_data["data"] = saved_storytellers + file_data["data"] = saved_storytellers + average_dynamic_threat fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) @@ -524,3 +531,19 @@ SUBSYSTEM_DEF(persistence) file_data["data"] = saved_votes[ckey] fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/LoadPaintings() + var/json_file = file("data/paintings.json") + if(fexists(json_file)) + paintings = json_decode(file2text(json_file)) + + for(var/obj/structure/sign/painting/P in painting_frames) + P.load_persistent() + +/datum/controller/subsystem/persistence/proc/SavePaintings() + for(var/obj/structure/sign/painting/P in painting_frames) + P.save_persistent() + + var/json_file = file("data/paintings.json") + fdel(json_file) + WRITE_FILE(json_file, json_encode(paintings)) diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm index da31d65fb3..64a780c1ad 100644 --- a/code/controllers/subsystem/processing/chemistry.dm +++ b/code/controllers/subsystem/processing/chemistry.dm @@ -1,5 +1,4 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) wait = 5 flags = SS_KEEP_TIMING - - + name = "Chemistry" diff --git a/code/controllers/subsystem/processing/flightpacks.dm b/code/controllers/subsystem/processing/flightpacks.dm deleted file mode 100644 index a462e2b645..0000000000 --- a/code/controllers/subsystem/processing/flightpacks.dm +++ /dev/null @@ -1,25 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(flightpacks) - name = "Flightpack Movement" - priority = FIRE_PRIORITY_FLIGHTPACKS - wait = 2 - stat_tag = "FM" - flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING - - var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL - -/datum/controller/subsystem/processing/flightpacks/Initialize() - sync_flightsuit_processing() - -/datum/controller/subsystem/processing/flightpacks/vv_edit_var(var_name, var_value) - ..() - switch(var_name) - if("flightsuit_processing") - sync_flightsuit_processing() - -/datum/controller/subsystem/processing/flightpacks/proc/sync_flightsuit_processing() - for(var/obj/item/flightpack/FP in processing) - FP.sync_processing(src) - if(flightsuit_processing == FLIGHTSUIT_PROCESSING_NONE) //Don't even bother firing. - can_fire = FALSE - else - can_fire = TRUE diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm new file mode 100644 index 0000000000..a4e0d7703f --- /dev/null +++ b/code/controllers/subsystem/processing/instruments.dm @@ -0,0 +1,43 @@ +PROCESSING_SUBSYSTEM_DEF(instruments) + name = "Instruments" + wait = 0.5 + init_order = INIT_ORDER_INSTRUMENTS + flags = SS_KEEP_TIMING + priority = FIRE_PRIORITY_INSTRUMENTS + var/static/list/datum/instrument/instrument_data = list() //id = datum + var/static/list/datum/song/songs = list() + var/static/musician_maxlines = 600 + var/static/musician_maxlinechars = 300 + var/static/musician_hearcheck_mindelay = 5 + var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS + var/static/current_instrument_channels = 0 + +/datum/controller/subsystem/processing/instruments/Initialize() + initialize_instrument_data() + return ..() + +/datum/controller/subsystem/processing/instruments/proc/on_song_new(datum/song/S) + songs += S + +/datum/controller/subsystem/processing/instruments/proc/on_song_del(datum/song/S) + songs -= S + +/datum/controller/subsystem/processing/instruments/proc/initialize_instrument_data() + for(var/path in subtypesof(/datum/instrument)) + var/datum/instrument/I = path + if(initial(I.abstract_type) == path) + continue + I = new path + I.Initialize() + instrument_data[I.id || "[I.type]"] = I + CHECK_TICK + +/datum/controller/subsystem/processing/instruments/proc/get_instrument(id_or_path) + return instrument_data["[id_or_path]"] + +/datum/controller/subsystem/processing/instruments/proc/reserve_instrument_channel(datum/instrument/I) + if(current_instrument_channels > max_instrument_channels) + return + . = SSsounds.reserve_sound_channel(I) + if(!isnull(.)) + current_instrument_channels++ diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm index 4171b5f8c1..b8d904c727 100644 --- a/code/controllers/subsystem/processing/projectiles.dm +++ b/code/controllers/subsystem/processing/projectiles.dm @@ -1,22 +1,22 @@ PROCESSING_SUBSYSTEM_DEF(projectiles) name = "Projectiles" + priority = FIRE_PRIORITY_PROJECTILES wait = 1 stat_tag = "PP" flags = SS_NO_INIT|SS_TICKER - var/global_max_tick_moves = 10 - var/global_pixel_speed = 2 - var/global_iterations_per_move = 16 + var/global_pixel_increment_amount = 4 + var/global_projectile_speed_multiplier = 1 /datum/controller/subsystem/processing/projectiles/proc/set_pixel_speed(new_speed) - global_pixel_speed = new_speed + global_pixel_increment_amount = new_speed for(var/i in processing) var/obj/item/projectile/P = i if(istype(P)) //there's non projectiles on this too. - P.set_pixel_speed(new_speed) + P.set_pixel_increment_amount(new_speed) /datum/controller/subsystem/processing/projectiles/vv_edit_var(var_name, var_value) switch(var_name) - if(NAMEOF(src, global_pixel_speed)) + if(NAMEOF(src, global_pixel_increment_amount)) set_pixel_speed(var_value) return TRUE else diff --git a/code/controllers/subsystem/processing/status_effects.dm b/code/controllers/subsystem/processing/status_effects.dm index e8984a44cb..57b340b2ce 100644 --- a/code/controllers/subsystem/processing/status_effects.dm +++ b/code/controllers/subsystem/processing/status_effects.dm @@ -1,3 +1,4 @@ PROCESSING_SUBSYSTEM_DEF(status_effects) wait = 1 flags = SS_TICKER + name = "Status Effects" diff --git a/code/controllers/subsystem/processing/weather.dm b/code/controllers/subsystem/processing/weather.dm index 0a1b4fc609..ca067953cc 100644 --- a/code/controllers/subsystem/processing/weather.dm +++ b/code/controllers/subsystem/processing/weather.dm @@ -47,7 +47,6 @@ PROCESSING_SUBSYSTEM_DEF(weather) break if (!ispath(weather_datum_type, /datum/weather)) CRASH("run_weather called with invalid weather_datum_type: [weather_datum_type || "null"]") - return if (isnull(z_levels)) z_levels = SSmapping.levels_by_trait(initial(weather_datum_type.target_trait)) @@ -55,7 +54,6 @@ PROCESSING_SUBSYSTEM_DEF(weather) z_levels = list(z_levels) else if (!islist(z_levels)) CRASH("run_weather called with invalid z_levels: [z_levels || "null"]") - return var/datum/weather/W = new weather_datum_type(z_levels) W.telegraph() diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index ec8b243073..ef10e0626c 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -5,7 +5,7 @@ SUBSYSTEM_DEF(profiler) init_order = INIT_ORDER_PROFILER runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY wait = 3000 - flags = SS_NO_TICK_CHECK + flags = SS_NO_TICK_CHECK var/fetch_cost = 0 var/write_cost = 0 @@ -31,23 +31,12 @@ SUBSYSTEM_DEF(profiler) return ..() /datum/controller/subsystem/profiler/proc/StartProfiling() -#if DM_BUILD < 1506 || DM_VERSION < 513 - stack_trace("Auto profiling unsupported on this byond version") - CONFIG_SET(flag/auto_profile, FALSE) -#else world.Profile(PROFILE_START) -#endif /datum/controller/subsystem/profiler/proc/StopProfiling() -#if DM_BUILD >= 1506 && DM_VERSION >= 513 world.Profile(PROFILE_STOP) -#endif /datum/controller/subsystem/profiler/proc/DumpFile() -#if DM_BUILD < 1506 || DM_VERSION < 513 - stack_trace("Auto profiling unsupported on this byond version") - CONFIG_SET(flag/auto_profile, FALSE) -#else var/timer = TICK_USAGE_REAL var/current_profile_data = world.Profile(PROFILE_REFRESH,format="json") fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) @@ -60,4 +49,3 @@ SUBSYSTEM_DEF(profiler) timer = TICK_USAGE_REAL WRITE_FILE(json_file, current_profile_data) write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) -#endif diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index f158574763..60c5dd5b99 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -24,6 +24,7 @@ SUBSYSTEM_DEF(research) var/list/techweb_categories = list() //category name = list(node.id = TRUE) var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) var/list/techweb_nodes_hidden = list() //Node ids that should be hidden by default. + var/list/techweb_nodes_experimental = list() //Node ids that are exclusive to the BEPIS. var/list/techweb_point_items = list( //path = list(point type = value) /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), @@ -306,7 +307,11 @@ SUBSYSTEM_DEF(research) for(var/A in subtypesof(/obj/item/seeds)) var/obj/item/seeds/S = A var/list/L = list() - L[TECHWEB_POINT_TYPE_GENERIC] = 50 + initial(S.rarity) * 2 + //First we get are yield and rarity and times it by two + //Then we subtract production and maturation, making it so faster growing plants are better for RnD + //Then we add in lifespan and potency, + //A basic seed can be worth 268 points if its the best it can be. + L[TECHWEB_POINT_TYPE_GENERIC] = 50 + initial(S.rarity) * 2 + initial(S.yield) * 2 - initial(S.maturation) - initial(S.production) + initial(S.lifespan) + initial(S.potency) techweb_point_items[S] = L return ..() @@ -508,6 +513,8 @@ SUBSYSTEM_DEF(research) D.unlocked_by += node.id if(node.hidden) techweb_nodes_hidden[node.id] = TRUE + if(node.experimental) + techweb_nodes_experimental[node.id] = TRUE CHECK_TICK generate_techweb_unlock_linking() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index e4a3ff1f9a..532eb19bc9 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -35,10 +35,8 @@ SUBSYSTEM_DEF(shuttle) //supply shuttle stuff var/obj/docking_port/mobile/supply/supply var/ordernum = 1 //order number given to next order - var/points = 5000 //number of trade-points we have var/centcom_message = "" //Remarks from CentCom on how well you checked the last order. var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies - var/passive_supply_points_per_minute = 125 var/list/supply_packs = list() var/list/shoppinglist = list() @@ -113,9 +111,6 @@ SUBSYSTEM_DEF(shuttle) qdel(T, force=TRUE) CheckAutoEvac() - if(!(times_fired % CEILING(600/wait, 1))) - points += passive_supply_points_per_minute - var/esETA = emergency?.getModeStr() emergency_shuttle_stat_text = "[esETA? "[esETA] [emergency.getTimerStr()]" : ""]" @@ -217,13 +212,13 @@ SUBSYSTEM_DEF(shuttle) call_reason = trim(html_encode(call_reason)) - if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && seclevel2num(get_security_level()) > SEC_LEVEL_GREEN) + if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && GLOB.security_level > SEC_LEVEL_GREEN) to_chat(user, "You must provide a reason.") return var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" - var/security_num = seclevel2num(get_security_level()) + var/security_num = GLOB.security_level switch(security_num) if(SEC_LEVEL_RED,SEC_LEVEL_DELTA) emergency.request(null, signal_origin, html_decode(emergency_reason), 1) //There is a serious threat we gotta move no time to give them five minutes. @@ -285,7 +280,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/canRecall() if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor") return - var/security_num = seclevel2num(get_security_level()) + var/security_num = GLOB.security_level switch(security_num) if(SEC_LEVEL_GREEN) if(emergency.timeLeft(1) < emergencyCallTime) @@ -559,7 +554,6 @@ SUBSYSTEM_DEF(shuttle) centcom_message = SSshuttle.centcom_message ordernum = SSshuttle.ordernum - points = SSshuttle.points emergencyNoEscape = SSshuttle.emergencyNoEscape emergencyCallAmount = SSshuttle.emergencyCallAmount shuttle_purchased = SSshuttle.shuttle_purchased @@ -642,7 +636,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end without being a proper shuttle call? if(EMERGENCY_IDLE_OR_RECALLED) SSshuttle.emergency.request(silent = TRUE) - priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority") + priority_announce("The shift has come to an end and the shuttle called. [GLOB.security_level == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority") log_game("Round end vote passed. Shuttle has been auto-called.") message_admins("Round end vote passed. Shuttle has been auto-called.") emergencyNoRecall = TRUE diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm new file mode 100644 index 0000000000..5e7c5e6545 --- /dev/null +++ b/code/controllers/subsystem/sounds.dm @@ -0,0 +1,91 @@ +#define DATUMLESS "NO_DATUM" + +SUBSYSTEM_DEF(sounds) + name = "Sounds" + flags = SS_NO_FIRE + init_order = INIT_ORDER_SOUNDS + var/static/using_channels_max = CHANNEL_HIGHEST_AVAILABLE //BYOND max channels + + // Hey uh these two needs to be initialized fast because the whole "things get deleted before init" thing. + /// Assoc list, "[channel]" = either the datum using it or TRUE for an unsafe-reserved (datumless reservation) channel + var/list/using_channels = list() + /// Assoc list datum = list(channel1, channel2, ...) for what channels something reserved. + var/list/using_channels_by_datum = list() + /// List of all available channels with associations set to TRUE for fast lookups/allocation. + var/list/available_channels + +/datum/controller/subsystem/sounds/Initialize() + setup_available_channels() + return ..() + +/datum/controller/subsystem/sounds/proc/setup_available_channels() + available_channels = list() + for(var/i in 1 to using_channels_max) + available_channels[num2text(i)] = TRUE + +/// Removes a channel from using list. +/datum/controller/subsystem/sounds/proc/free_sound_channel(channel) + channel = num2text(channel) + var/using = using_channels[channel] + using_channels -= channel + if(using) + using_channels_by_datum[using] -= channel + if(!length(using_channels_by_datum[using])) + using_channels_by_datum -= using + available_channels[channel] = TRUE + +/// Frees all the channels a datum is using. +/datum/controller/subsystem/sounds/proc/free_datum_channels(datum/D) + var/list/L = using_channels_by_datum[D] + if(!L) + return + for(var/channel in L) + using_channels -= channel + available_channels[channel] = TRUE + using_channels_by_datum -= D + +/// Frees all datumless channels +/datum/controller/subsystem/sounds/proc/free_datumless_channels() + free_datum_channels(DATUMLESS) + +/// NO AUTOMATIC CLEANUP - If you use this, you better manually free it later! Returns an integer for channel. +/datum/controller/subsystem/sounds/proc/reserve_sound_channel_datumless() + var/channel = random_available_channel_text() + if(!channel) //oh no.. + return FALSE + available_channels -= channel + using_channels[channel] = DATUMLESS + LAZYINITLIST(using_channels_by_datum[DATUMLESS]) + using_channels_by_datum[DATUMLESS] += channel + return text2num(channel) + +/// Reserves a channel for a datum. Automatic cleanup only when the datum is deleted. Returns an integer for channel. +/datum/controller/subsystem/sounds/proc/reserve_sound_channel(datum/D) + if(!D) //i don't like typechecks but someone will fuck it up + CRASH("Attempted to reserve sound channel without datum using the managed proc.") + var/channel = random_available_channel_text() + if(!channel) + return FALSE + available_channels -= channel + using_channels[channel] = D + LAZYINITLIST(using_channels_by_datum[D]) + using_channels_by_datum[D] += channel + return text2num(channel) + +/// Random available channel, returns text. +/datum/controller/subsystem/sounds/proc/random_available_channel_text() + return pick(available_channels) + +/// Random available channel, returns number +/datum/controller/subsystem/sounds/proc/random_available_channel() + return text2num(pick(available_channels)) + +/// If a channel is available +/datum/controller/subsystem/sounds/proc/is_channel_available(channel) + return available_channels[num2text(channel)] + +/// How many channels we have left. +/datum/controller/subsystem/sounds/proc/available_channels_left() + return length(available_channels) + +#undef DATUMLESS diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index a7be36abc2..765f0c8382 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -387,6 +387,9 @@ SUBSYSTEM_DEF(ticker) for(var/mob/dead/new_player/N in GLOB.player_list) var/mob/living/carbon/human/player = N.new_character if(istype(player) && player.mind && player.mind.assigned_role) + var/datum/job/J = SSjob.GetJob(player.mind.assigned_role) + if(J) + J.standard_assign_skills(player.mind) if(player.mind.assigned_role == "Captain") captainless=0 if(player.mind.assigned_role != player.mind.special_role) @@ -406,7 +409,7 @@ SUBSYSTEM_DEF(ticker) var/mob/living = player.transfer_character() if(living) qdel(player) - living.notransform = TRUE + living.mob_transforming = TRUE if(living.client) if (living.client.prefs && living.client.prefs.auto_ooc) if (living.client.prefs.chat_toggles & CHAT_OOC) @@ -420,7 +423,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/release_characters(list/livings) for(var/I in livings) var/mob/living/L = I - L.notransform = FALSE + L.mob_transforming = FALSE /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index cd53c8f0ba..2f4949fc1e 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(time_track) var/time_dilation_text /datum/controller/subsystem/time_track/fire() - stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [WORLDTIME2TEXT("hh:mm:ss")]\n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]\n\n[time_dilation_text]" + stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [DisplayTimeText(world.time - SSticker.round_start_time, 1)] \n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]\n\n[time_dilation_text]" if(++last_measurement == measurement_delay) last_measurement = 0 diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index bd2fb854af..36bf992cfb 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(timer) if(ctime_timer.flags & TIMER_LOOP) ctime_timer.spent = 0 ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait - BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun) + BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, ctime_timer, timeToRun, COMPARE_KEY) else qdel(ctime_timer) @@ -423,7 +423,7 @@ SUBSYSTEM_DEF(timer) L = SStimer.second_queue if(L) - BINARY_INSERT(src, L, datum/timedevent, timeToRun) + BINARY_INSERT(src, L, datum/timedevent, src, timeToRun, COMPARE_KEY) return //get the list of buckets diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 0d854371aa..87158f021e 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -172,7 +172,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate, /obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate, /obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited, - /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate, + /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate, /obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake, /obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor, /obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military, diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 7d72951278..97a5ec2c2b 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -352,7 +352,6 @@ SUBSYSTEM_DEF(vote) if("dynamic") if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") - GLOB.master_mode = "dynamic" var/list/runnable_storytellers = config.get_runnable_storytellers() var/datum/dynamic_storyteller/picked for(var/T in runnable_storytellers) @@ -361,7 +360,7 @@ SUBSYSTEM_DEF(vote) picked = S runnable_storytellers[S] *= round(stored_gamemode_votes[initial(S.name)]*100000,1) if(!picked) - picked = pickweightAllowZero(runnable_storytellers) + picked = pickweight(runnable_storytellers, 0) GLOB.dynamic_storyteller_type = picked if("map") var/datum/map_config/VM = config.maplist[.] @@ -489,6 +488,7 @@ SUBSYSTEM_DEF(vote) modes_to_add -= "traitor" // makes it so that traitor is always available choices.Add(modes_to_add) if("dynamic") + GLOB.master_mode = "dynamic" var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight) for(var/T in config.storyteller_cache) var/datum/dynamic_storyteller/S = T @@ -763,7 +763,7 @@ SUBSYSTEM_DEF(vote) remove_from_client() Remove(owner) -/datum/action/vote/IsAvailable() +/datum/action/vote/IsAvailable(silent = FALSE) return 1 /datum/action/vote/proc/remove_from_client() diff --git a/code/datums/action.dm b/code/datums/action.dm index 74df2bf9a1..0033df09d7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -6,13 +6,15 @@ /datum/action var/name = "Generic Action" var/desc = null - var/obj/target = null + var/atom/target = null var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE var/obj/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE + var/use_target_appearance = FALSE + var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist. var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon @@ -88,14 +90,14 @@ /datum/action/proc/Trigger() if(!IsAvailable()) return FALSE - if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) + if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, target) & COMPONENT_ACTION_BLOCK_TRIGGER) return FALSE return TRUE /datum/action/proc/Process() return -/datum/action/proc/IsAvailable() +/datum/action/proc/IsAvailable(silent = FALSE) if(!owner) return FALSE var/mob/living/L = owner @@ -116,29 +118,42 @@ return TRUE /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) - if(button) - if(!status_only) - button.name = name - button.desc = desc - if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) - var/list/settings = owner.hud_used.get_action_buttons_icons() - if(button.icon != settings["bg_icon"]) - button.icon = settings["bg_icon"] - if(button.icon_state != settings["bg_state"]) - button.icon_state = settings["bg_state"] - else - if(button.icon != button_icon) - button.icon = button_icon - if(button.icon_state != background_icon_state) - button.icon_state = background_icon_state + if(!button) + return + if(!status_only) + button.name = name + button.desc = desc + if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) + var/list/settings = owner.hud_used.get_action_buttons_icons() + if(button.icon != settings["bg_icon"]) + button.icon = settings["bg_icon"] + if(button.icon_state != settings["bg_state"]) + button.icon_state = settings["bg_state"] + else + if(button.icon != button_icon) + button.icon = button_icon + if(button.icon_state != background_icon_state) + button.icon_state = background_icon_state + if(!use_target_appearance) ApplyIcon(button, force) - if(!IsAvailable()) - button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) - else - button.color = rgb(255,255,255,255) - return 1 + else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. + var/mutable_appearance/M = new(target) + M.layer = FLOAT_LAYER + M.plane = FLOAT_PLANE + if(target_appearance_matrix) + var/list/L = target_appearance_matrix + M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) + button.cut_overlays() + button.add_overlay(M) + button.appearance_cache = target.appearance + + if(!IsAvailable(TRUE)) + button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) + else + button.color = rgb(255,255,255,255) + return 1 /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) @@ -156,7 +171,7 @@ if(!..()) return 0 var/mob/M = target - M.ghostize(1) + M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE) /datum/action/proc/OnUpdatedIcon() UpdateButtonIcon() @@ -165,11 +180,14 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS button_icon_state = null + use_target_appearance = TRUE // If you want to override the normal icon being the item // then change this to an icon state /datum/action/item_action/New(Target) ..() + if(button_icon_state) + use_target_appearance = FALSE var/obj/item/I = target LAZYINITLIST(I.actions) I.actions += src @@ -188,23 +206,6 @@ I.ui_action_click(owner, src) return 1 -/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button, force) - if(button_icon && button_icon_state) - // If set, use the custom icon that we set instead - // of the item appearence - ..() - else if(target && current_button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. - var/obj/item/I = target - var/old_layer = I.layer - var/old_plane = I.plane - I.layer = FLOAT_LAYER //AAAH - I.plane = FLOAT_PLANE //^ what that guy said - current_button.cut_overlays() - current_button.add_overlay(I) - I.layer = old_layer - I.plane = old_plane - current_button.appearance_cache = I.appearance - /datum/action/item_action/toggle_light name = "Toggle Light" @@ -302,23 +303,13 @@ name = "Toggle Friendly Fire \[ON\]" ..() -/datum/action/item_action/synthswitch - name = "Change Synthesizer Instrument" - desc = "Change the type of instrument your synthesizer is playing as." - -/datum/action/item_action/synthswitch/Trigger() - if(istype(target, /obj/item/instrument/piano_synth)) - var/obj/item/instrument/piano_synth/synth = target - return synth.selectInstrument() - return ..() - /datum/action/item_action/vortex_recall name = "Vortex Recall" desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time.
    If the beacon is still attached, will detach it." icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "vortex_recall" -/datum/action/item_action/vortex_recall/IsAvailable() +/datum/action/item_action/vortex_recall/IsAvailable(silent = FALSE) if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.teleporting) @@ -330,7 +321,7 @@ background_icon_state = "bg_clock" buttontooltipstyle = "clockcult" -/datum/action/item_action/clock/IsAvailable() +/datum/action/item_action/clock/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return 0 return ..() @@ -339,7 +330,7 @@ name = "Create Judicial Marker" desc = "Allows you to create a stunning Judicial Marker at any location in view. Click again to disable." -/datum/action/item_action/clock/toggle_visor/IsAvailable() +/datum/action/item_action/clock/toggle_visor/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return 0 if(istype(target, /obj/item/clothing/glasses/judicial_visor)) @@ -356,6 +347,7 @@ /datum/action/item_action/clock/quickbind name = "Quickbind" desc = "If you're seeing this, file a bug report." + use_target_appearance = FALSE var/scripture_index = 0 //the index of the scripture we're associated with /datum/action/item_action/toggle_helmet_flashlight @@ -418,7 +410,7 @@ /datum/action/item_action/jetpack_stabilization name = "Toggle Jetpack Stabilization" -/datum/action/item_action/jetpack_stabilization/IsAvailable() +/datum/action/item_action/jetpack_stabilization/IsAvailable(silent = FALSE) var/obj/item/tank/jetpack/J = target if(!istype(J) || !J.on) return 0 @@ -475,7 +467,7 @@ /datum/action/item_action/organ_action check_flags = AB_CHECK_CONSCIOUS -/datum/action/item_action/organ_action/IsAvailable() +/datum/action/item_action/organ_action/IsAvailable(silent = FALSE) var/obj/item/organ/I = target if(!I.owner) return 0 @@ -644,32 +636,32 @@ return FALSE if(target) var/obj/effect/proc_holder/S = target - S.Click() + S.Trigger(usr) return TRUE -/datum/action/spell_action/IsAvailable() +/datum/action/spell_action/IsAvailable(silent = FALSE) if(!target) return FALSE return TRUE /datum/action/spell_action/spell -/datum/action/spell_action/spell/IsAvailable() +/datum/action/spell_action/spell/IsAvailable(silent = FALSE) if(!target) return FALSE var/obj/effect/proc_holder/spell/S = target if(owner) - return S.can_cast(owner, FALSE, TRUE) + return S.can_cast(owner, FALSE, silent) return FALSE /datum/action/spell_action/alien -/datum/action/spell_action/alien/IsAvailable() +/datum/action/spell_action/alien/IsAvailable(silent = FALSE) if(!target) return FALSE var/obj/effect/proc_holder/alien/ab = target if(owner) - return ab.cost_check(ab.check_turf,owner,1) + return ab.cost_check(ab.check_turf,owner,silent) return FALSE @@ -711,7 +703,7 @@ button.maptext_width = 24 button.maptext_height = 12 -/datum/action/cooldown/IsAvailable() +/datum/action/cooldown/IsAvailable(silent = FALSE) return next_use_time <= world.time /datum/action/cooldown/proc/StartCooldown() @@ -739,14 +731,6 @@ if(next_use_time > world.time) START_PROCESSING(SSfastprocess, src) - -//Stickmemes -/datum/action/item_action/stickmen - name = "Summon Stick Minions" - desc = "Allows you to summon faithful stickmen allies to aide you in battle." - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - //surf_ss13 /datum/action/item_action/bhop name = "Activate Jump Boots" diff --git a/code/datums/actions/ninja.dm b/code/datums/actions/ninja.dm index b655078349..c0314b9c48 100644 --- a/code/datums/actions/ninja.dm +++ b/code/datums/actions/ninja.dm @@ -8,11 +8,11 @@ icon_icon = 'icons/mob/actions/actions_spells.dmi' /datum/action/item_action/ninjaboost - check_flags = NONE name = "Adrenaline Boost" desc = "Inject a secret chemical that will counteract all movement-impairing effect." button_icon_state = "repulse" icon_icon = 'icons/mob/actions/actions_spells.dmi' + required_mobility_flags = NONE /datum/action/item_action/ninjapulse name = "EM Burst (25E)" diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index ebddc187ae..9c6bb2ebfd 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -253,7 +253,7 @@ var/datum/ai_laws/lawtype var/list/law_weights = CONFIG_GET(keyed_list/law_weight) while(!lawtype && law_weights.len) - var/possible_id = pickweightAllowZero(law_weights) + var/possible_id = pickweight(law_weights, 0) lawtype = lawid_to_type(possible_id) if(!lawtype) law_weights -= possible_id diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 37aee6df7e..f4c4541db9 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -63,7 +63,7 @@ if(prob(2)) switch(rand(1,2)) if(1) - to_chat(owner, "...[lowertext(hypnotic_phrase)]...") + to_chat(owner, "...[lowertext(hypnotic_phrase)]...") if(2) new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase]") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 428f355c31..e5e1434ab8 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -91,7 +91,6 @@ trauma = _trauma owner = trauma.owner - copy_known_languages_from(owner, TRUE) setup_friend() @@ -150,6 +149,8 @@ friend_talk(message) /mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) + if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker))) + create_chat_message(speaker, message_language, raw_message, spans, message_mode) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)) /mob/camera/imaginary_friend/proc/friend_talk(message) diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm new file mode 100644 index 0000000000..249907a1b8 --- /dev/null +++ b/code/datums/brain_damage/magic.dm @@ -0,0 +1,60 @@ +//Magical traumas, caused by spells and curses. +//Blurs the line between the victim's imagination and reality +//Unlike regular traumas this can affect the victim's body and surroundings + +/datum/brain_trauma/magic + resilience = TRAUMA_RESILIENCE_LOBOTOMY + +/datum/brain_trauma/magic/stalker + name = "Stalking Phantom" + desc = "Patient is stalked by a phantom only they can see." + scan_desc = "extra-sensory paranoia" + gain_text = "You feel like something wants to kill you..." + lose_text = "You no longer feel eyes on your back." + var/obj/effect/hallucination/simple/stalker_phantom/stalker + var/close_stalker = FALSE //For heartbeat + +/datum/brain_trauma/magic/stalker/on_gain() + create_stalker() + ..() + +/datum/brain_trauma/magic/stalker/proc/create_stalker() + var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z) //random corner + stalker = new(stalker_source, owner) + +/datum/brain_trauma/magic/stalker/on_lose() + QDEL_NULL(stalker) + ..() + +/datum/brain_trauma/magic/stalker/on_life() + // Dead and unconscious people are not interesting to the psychic stalker. + if(owner.stat != CONSCIOUS) + return + + // Not even nullspace will keep it at bay. + if(!stalker || !stalker.loc || stalker.z != owner.z) + qdel(stalker) + create_stalker() + + if(get_dist(owner, stalker) <= 1) + playsound(owner, 'sound/magic/demon_attack1.ogg', 50) + owner.visible_message("[owner] is torn apart by invisible claws!", "Ghostly claws tear your body apart!") + owner.take_bodypart_damage(rand(20, 45)) + else if(prob(50)) + stalker.forceMove(get_step_towards(stalker, owner)) + if(get_dist(owner, stalker) <= 8) + if(!close_stalker) + var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) + owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT) + close_stalker = TRUE + else + if(close_stalker) + owner.stop_sound_channel(CHANNEL_HEARTBEAT) + close_stalker = FALSE + ..() + +/obj/effect/hallucination/simple/stalker_phantom + name = "???" + desc = "It's coming closer..." + image_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + image_state = "curseblob" diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 80a1bd2470..279118d877 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -44,7 +44,7 @@ return if(world.time > next_check && world.time > next_scare) next_check = world.time + 50 - var/list/seen_atoms = view(7, owner) + var/list/seen_atoms = owner.fov_view(7) if(LAZYLEN(trigger_objs)) for(var/obj/O in seen_atoms) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 0e08c4cd15..cd8612fd19 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -26,21 +26,15 @@ scan_desc = "extensive damage to the brain's language center" gain_text = "You have trouble forming words in your head..." lose_text = "You suddenly remember how languages work." - var/datum/language_holder/prev_language - var/datum/language_holder/mob_language /datum/brain_trauma/severe/aphasia/on_gain() - mob_language = owner.get_language_holder() - prev_language = mob_language.copy() - mob_language.remove_all_languages() - mob_language.grant_language(/datum/language/aphasia) + owner.add_blocked_language(subtypesof(/datum/language/) - /datum/language/aphasia, LANGUAGE_APHASIA) + owner.grant_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) ..() /datum/brain_trauma/severe/aphasia/on_lose() - mob_language.remove_language(/datum/language/aphasia) - mob_language.copy_known_languages_from(prev_language) //this will also preserve languages learned during the trauma - QDEL_NULL(prev_language) - mob_language = null + owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_APHASIA) + owner.remove_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) ..() /datum/brain_trauma/severe/blindness @@ -123,6 +117,11 @@ paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE +/datum/brain_trauma/severe/paralysis/spinesnapped + random_gain = FALSE + paralysis_type = "legs" + resilience = TRAUMA_RESILIENCE_LOBOTOMY + /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" desc = "Patient may involuntarily fall asleep during normal activities." @@ -271,3 +270,37 @@ ..() if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance)) owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) + +/datum/brain_trauma/severe/hypnotic_trigger + name = "Hypnotic Trigger" + desc = "Patient has a trigger phrase set in their subconscious that will trigger a suggestible trance-like state." + scan_desc = "oneiric feedback loop" + gain_text = "You feel odd, like you just forgot something important." + lose_text = "You feel like a weight was lifted from your mind." + random_gain = FALSE + var/trigger_phrase = "Nanotrasen" + +/datum/brain_trauma/severe/hypnotic_trigger/New(phrase) + ..() + if(phrase) + trigger_phrase = phrase + +/datum/brain_trauma/severe/hypnotic_trigger/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway + ..() + owner.remove_status_effect(/datum/status_effect/trance) + +/datum/brain_trauma/severe/hypnotic_trigger/handle_hearing(datum/source, list/hearing_args) + if(!owner.can_hear()) + return + if(owner == hearing_args[HEARING_SPEAKER]) + return + + var/regex/reg = new("(\\b[REGEX_QUOTE(trigger_phrase)]\\b)","ig") + + if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) + addtimer(CALLBACK(src, .proc/hypnotrigger), 10) //to react AFTER the chat message + hearing_args[HEARING_RAW_MESSAGE] = reg.Replace(hearing_args[HEARING_RAW_MESSAGE], "*********") + +/datum/brain_trauma/severe/hypnotic_trigger/proc/hypnotrigger() + to_chat(owner, "The words trigger something deep within you, and you feel your consciousness slipping away...") + owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index f5e00208c5..6b84e1362d 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -123,7 +123,9 @@ trauma = _trauma return ..() -/mob/living/split_personality/Life() +/mob/living/split_personality/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(QDELETED(body)) qdel(src) //in case trauma deletion doesn't already do it @@ -132,8 +134,6 @@ trauma.switch_personalities() qdel(trauma) - ..() - /mob/living/split_personality/Login() ..() to_chat(src, "As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.") diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 8b82c1812e..96b2a2a294 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -39,7 +39,7 @@ //title_image = ntitle_image /datum/browser/proc/add_stylesheet(name, file) - if (istype(name, /datum/asset/spritesheet)) + if(istype(name, /datum/asset/spritesheet)) var/datum/asset/spritesheet/sheet = name stylesheets["spritesheet_[sheet.name].css"] = "data/spritesheets/[sheet.name]" else @@ -97,20 +97,20 @@ [get_footer()] "} -/datum/browser/proc/open(use_onclose = 1) +/datum/browser/proc/open(use_onclose = TRUE) if(isnull(window_id)) //null check because this can potentially nuke goonchat WARNING("Browser [title] tried to open with a null ID") to_chat(user, "The [title] browser you tried to open failed a sanity check! Please report this on github!") return var/window_size = "" - if (width && height) + if(width && height) window_size = "size=[width]x[height];" - if (stylesheets.len) - send_asset_list(user, stylesheets, verify=FALSE) - if (scripts.len) - send_asset_list(user, scripts, verify=FALSE) + if(stylesheets.len) + send_asset_list(user, stylesheets) + if(scripts.len) + send_asset_list(user, scripts) user << browse(get_content(), "window=[window_id];[window_size][window_options]") - if (use_onclose) + if(use_onclose) setup_onclose() /datum/browser/proc/setup_onclose() @@ -157,7 +157,7 @@ close() //designed as a drop in replacement for alert(); functions the same. (outside of needing User specified) -/proc/tgalert(var/mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000) +/proc/tgalert(mob/User, Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1, Timeout = 6000) if (!User) User = usr switch(askuser(User, Message, Title, Button1, Button2, Button3, StealFocus, Timeout)) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm new file mode 100644 index 0000000000..73d3e69ac4 --- /dev/null +++ b/code/datums/chatmessage.dm @@ -0,0 +1,242 @@ +#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS +#define CHAT_MESSAGE_LIFESPAN 5 SECONDS +#define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS +#define CHAT_MESSAGE_EXP_DECAY 0.7 // Messages decay at pow(factor, idx in stack) +#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 // Increase message decay based on the height of the message +#define CHAT_MESSAGE_APPROX_LHEIGHT 11 // Approximate height in pixels of an 'average' line, used for height decay +#define CHAT_MESSAGE_WIDTH 96 // pixels +#define CHAT_MESSAGE_MAX_LENGTH 110 // characters +#define WXH_TO_HEIGHT(x) text2num(copytext((x), findtextEx((x), "x") + 1)) // thanks lummox + +/** + * # Chat Message Overlay + * + * Datum for generating a message overlay on the map + */ +/datum/chatmessage + /// The visual element of the chat messsage + var/image/message + /// The location in which the message is appearing + var/atom/message_loc + /// The client who heard this message + var/client/owned_by + /// Contains the scheduled destruction time + var/scheduled_destruction + /// Contains the approximate amount of lines for height decay + var/approx_lines + +/** + * Constructs a chat message overlay + * + * Arguments: + * * text - The text content of the overlay + * * target - The target atom to display the overlay at + * * owner - The mob that owns this overlay, only this mob will be able to view it + * * extra_classes - Extra classes to apply to the span that holds the text + * * lifespan - The lifespan of the message in deciseconds + */ +/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN) + . = ..() + if (!istype(target)) + CRASH("Invalid target given for chatmessage") + if(QDELETED(owner) || !istype(owner) || !owner.client) + stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner") + qdel(src) + return + INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, extra_classes, lifespan) + +/datum/chatmessage/Destroy() + if (owned_by) + if (owned_by.seen_messages) + LAZYREMOVEASSOC(owned_by.seen_messages, message_loc, src) + owned_by.images.Remove(message) + owned_by = null + message_loc = null + message = null + return ..() + +/** + * Calls qdel on the chatmessage when its parent is deleted, used to register qdel signal + */ +/datum/chatmessage/proc/on_parent_qdel() + qdel(src) + +/** + * Generates a chat message image representation + * + * Arguments: + * * text - The text content of the overlay + * * target - The target atom to display the overlay at + * * owner - The mob that owns this overlay, only this mob will be able to view it + * * extra_classes - Extra classes to apply to the span that holds the text + * * lifespan - The lifespan of the message in deciseconds + */ +/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan) + // Register client who owns this message + owned_by = owner.client + RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel) + + // Clip message + var/maxlen = owned_by.prefs.max_chat_length + if (length_char(text) > maxlen) + text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment + + // Calculate target color if not already present + if (!target.chat_color || target.chat_color_name != target.name) + target.chat_color = colorize_string(target.name) + target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85) + target.chat_color_name = target.name + + // Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag + var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g") + text = replacetext(text, url_scheme, "") + + // Reject whitespace + var/static/regex/whitespace = new(@"^\s*$") + if (whitespace.Find(text)) + qdel(src) + return + + // Non mobs speakers can be small + if (!ismob(target)) + extra_classes |= "small" + + // Append radio icon if from a virtual speaker + if (extra_classes.Find("virtual-speaker")) + var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio") + text = "\icon[r_icon] " + text + + // We dim italicized text to make it more distinguishable from regular text + var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color + + // Approximate text height + // Note we have to replace HTML encoded metacharacters otherwise MeasureText will return a zero height + // BYOND Bug #2563917 + // Construct text + var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g") + var/complete_text = "[owner.say_emphasis(text)]" + var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH)) + approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT) + + // Translate any existing messages upwards, apply exponential decay factors to timers + message_loc = target + if (owned_by.seen_messages) + var/idx = 1 + var/combined_height = approx_lines + for(var/msg in owned_by.seen_messages[message_loc]) + var/datum/chatmessage/m = msg + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME) + combined_height += m.approx_lines + var/sched_remaining = m.scheduled_destruction - world.time + if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME) + var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) + m.scheduled_destruction = world.time + remaining_time + addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE) + + // Build message image + message = image(loc = message_loc, layer = CHAT_LAYER) + message.plane = CHAT_PLANE + message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART + message.alpha = 0 + message.pixel_y = owner.bound_height * 0.95 + message.maptext_width = CHAT_MESSAGE_WIDTH + message.maptext_height = mheight + message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5 + message.maptext = complete_text + + // View the message + LAZYADDASSOC(owned_by.seen_messages, message_loc, src) + owned_by.images |= message + animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME) + + // Prepare for destruction + scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) + addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE) + +/** + * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion + */ +/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE) + animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL) + QDEL_IN(src, fadetime) + +/** + * Creates a message overlay at a defined location for a given speaker + * + * Arguments: + * * speaker - The atom who is saying this message + * * message_language - The language that the message is said in + * * raw_message - The text content of the message + * * spans - Additional classes to be added to the message + * * message_mode - Bitflags relating to the mode of the message + */ +/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, message_mode) + // Ensure the list we are using, if present, is a copy so we don't modify the list provided to us + spans = spans ? spans.Copy() : list() + + // Check for virtual speakers (aka hearing a message through a radio) + var/atom/movable/originalSpeaker = speaker + if (istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/v = speaker + speaker = v.source + spans |= "virtual-speaker" + + // Ignore virtual speaker (most often radio messages) from ourself + if (originalSpeaker != src && speaker == src) + return + + // Display visual above source + new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans) + + +// Tweak these defines to change the available color ranges +#define CM_COLOR_SAT_MIN 0.6 +#define CM_COLOR_SAT_MAX 0.7 +#define CM_COLOR_LUM_MIN 0.65 +#define CM_COLOR_LUM_MAX 0.75 + +/** + * Gets a color for a name, will return the same color for a given string consistently within a round.atom + * + * Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map. + * + * Arguments: + * * name - The name to generate a color for + * * sat_shift - A value between 0 and 1 that will be multiplied against the saturation + * * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence + */ +/datum/chatmessage/proc/colorize_string(name, sat_shift = 1, lum_shift = 1) + // seed to help randomness + var/static/rseed = rand(1,26) + + // get hsl using the selected 6 characters of the md5 hash + var/hash = copytext(md5(name + GLOB.round_id), rseed, rseed + 6) + var/h = hex2num(copytext(hash, 1, 3)) * (360 / 255) + var/s = (hex2num(copytext(hash, 3, 5)) >> 2) * ((CM_COLOR_SAT_MAX - CM_COLOR_SAT_MIN) / 63) + CM_COLOR_SAT_MIN + var/l = (hex2num(copytext(hash, 5, 7)) >> 2) * ((CM_COLOR_LUM_MAX - CM_COLOR_LUM_MIN) / 63) + CM_COLOR_LUM_MIN + + // adjust for shifts + s *= clamp(sat_shift, 0, 1) + l *= clamp(lum_shift, 0, 1) + + // convert to rgb + var/h_int = round(h/60) // mapping each section of H to 60 degree sections + var/c = (1 - abs(2 * l - 1)) * s + var/x = c * (1 - abs((h / 60) % 2 - 1)) + var/m = l - c * 0.5 + x = (x + m) * 255 + c = (c + m) * 255 + m *= 255 + switch(h_int) + if(0) + return "#[num2hex(c, 2)][num2hex(x, 2)][num2hex(m, 2)]" + if(1) + return "#[num2hex(x, 2)][num2hex(c, 2)][num2hex(m, 2)]" + if(2) + return "#[num2hex(m, 2)][num2hex(c, 2)][num2hex(x, 2)]" + if(3) + return "#[num2hex(m, 2)][num2hex(x, 2)][num2hex(c, 2)]" + if(4) + return "#[num2hex(x, 2)][num2hex(m, 2)][num2hex(c, 2)]" + if(5) + return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]" diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index e229b25258..df2c15e9c8 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(cinematics) /datum/cinematic var/id = CINEMATIC_DEFAULT var/list/watching = list() //List of clients watching this - var/list/locked = list() //Who had notransform set during the cinematic + var/list/locked = list() //Who had mob_transforming set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones var/obj/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) @@ -45,7 +45,7 @@ GLOBAL_LIST_EMPTY(cinematics) GLOB.cinematics -= src QDEL_NULL(screen) for(var/mob/M in locked) - M.notransform = FALSE + M.mob_transforming = FALSE return ..() /datum/cinematic/proc/play(watchers) @@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(cinematics) for(var/mob/M in GLOB.mob_list) if(M in watchers) - M.notransform = TRUE //Should this be done for non-global cinematics or even at all ? + M.mob_transforming = TRUE //Should this be done for non-global cinematics or even at all ? locked += M //Close watcher ui's SStgui.close_user_uis(M) @@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(cinematics) M.client.screen += screen else if(is_global) - M.notransform = TRUE + M.mob_transforming = TRUE locked += M //Actually play it @@ -254,4 +254,4 @@ Nuke.Explosion() Narsie() -> Cinematic(CULT,world) -*/ \ No newline at end of file +*/ diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 7f7440daf4..9e4e16f813 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -38,8 +38,9 @@ parent = raw_args[1] var/list/arguments = raw_args.Copy(2) if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE) + stack_trace("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") qdel(src, TRUE, TRUE) - CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") + return _JoinParent(parent) diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm deleted file mode 100644 index b5740650e9..0000000000 --- a/code/datums/components/archaeology.dm +++ /dev/null @@ -1,95 +0,0 @@ -/datum/component/archaeology - dupe_mode = COMPONENT_DUPE_UNIQUE - var/list/archdrops = list(/obj/item/bikehorn = list(ARCH_PROB = 100, ARCH_MAXDROP = 1)) // honk~ - var/prob2drop - var/dug - var/datum/callback/callback - -/datum/component/archaeology/Initialize(list/_archdrops = list(), datum/callback/_callback) - archdrops = _archdrops - for(var/i in archdrops) - if(isnull(archdrops[i][ARCH_MAXDROP])) - archdrops[i][ARCH_MAXDROP] = 1 - stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null max_drop value in [i].") - if(isnull(archdrops[i][ARCH_PROB])) - archdrops[i][ARCH_PROB] = 100 - stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null probability value in [i].") - callback = _callback - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/Dig) - RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/BombDig) - RegisterSignal(parent, COMSIG_ATOM_SING_PULL, .proc/SingDig) - -/datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original) - var/list/other_archdrops = A.archdrops - var/list/_archdrops = archdrops - for(var/I in other_archdrops) - _archdrops[I] += other_archdrops[I] - -/datum/component/archaeology/proc/Dig(datum/source, obj/item/I, mob/living/user) - if(dug) - to_chat(user, "Looks like someone has dug here already.") - return - - if(!isturf(user.loc)) - return - - if(I.tool_behaviour == TOOL_SHOVEL || I.tool_behaviour == TOOL_MINING) - to_chat(user, "You start digging...") - - if(I.use_tool(parent, user, 40, volume=50)) - to_chat(user, "You dig a hole.") - gets_dug() - dug = TRUE - SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) - return COMPONENT_NO_AFTERATTACK - -/datum/component/archaeology/proc/gets_dug() - if(dug) - return - else - var/turf/open/OT = get_turf(parent) - for(var/thing in archdrops) - var/maxtodrop = archdrops[thing][ARCH_MAXDROP] - for(var/i in 1 to maxtodrop) - if(prob(archdrops[thing][ARCH_PROB])) // can't win them all! - new thing(OT) - - if(isopenturf(OT)) - if(OT.postdig_icon_change) - if(istype(OT, /turf/open/floor/plating/asteroid/) && !OT.postdig_icon) - var/turf/open/floor/plating/asteroid/AOT = parent - AOT.icon_plating = "[AOT.environment_type]_dug" - AOT.icon_state = "[AOT.environment_type]_dug" - else - if(isplatingturf(OT)) - var/turf/open/floor/plating/POT = parent - POT.icon_plating = "[POT.postdig_icon]" - POT.icon_state = "[OT.postdig_icon]" - - if(OT.slowdown) //Things like snow slow you down until you dig them. - OT.slowdown = 0 - dug = TRUE - if(callback) - callback.Invoke() - -/datum/component/archaeology/proc/SingDig(datum/source, S, current_size) - switch(current_size) - if(STAGE_THREE) - if(prob(30)) - gets_dug() - if(STAGE_FOUR) - if(prob(50)) - gets_dug() - else - if(current_size >= STAGE_FIVE && prob(70)) - gets_dug() - -/datum/component/archaeology/proc/BombDig(datum/source, severity, target) - switch(severity) - if(3) - return - if(2) - if(prob(20)) - gets_dug() - if(1) - gets_dug() diff --git a/code/datums/components/bouncy.dm b/code/datums/components/bouncy.dm index c7ca85455b..fed603410e 100644 --- a/code/datums/components/bouncy.dm +++ b/code/datums/components/bouncy.dm @@ -4,7 +4,7 @@ var/list/bounce_signals = list(COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK) /datum/component/bouncy/Initialize(_bouncy_mod, list/_bounce_signals) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE if(_bouncy_mod) bouncy_mod = _bouncy_mod diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 06169f64bf..441a161428 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -55,7 +55,7 @@ log_combat(user, H, "starts slicing the throat of") playsound(H.loc, butcher_sound, 50, TRUE, -1) - if(do_mob(user, H, CLAMP(500 / source.force, 30, 100)) && H.Adjacent(source)) + if(do_mob(user, H, clamp(500 / source.force, 30, 100)) && H.Adjacent(source)) if(H.has_status_effect(/datum/status_effect/neck_slice)) user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", 1, \ "Their neck has already been already cut, you can't make the bleeding any worse!") @@ -65,13 +65,17 @@ "[user] slits your throat...") log_combat(user, H, "finishes slicing the throat of") H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD) - H.bleed_rate = CLAMP(H.bleed_rate + 20, 0, 30) + H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30) H.apply_status_effect(/datum/status_effect/neck_slice) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) + var/meat_quality = 50 + (bonus_modifier/10) //increases through quality of butchering tool, and through if it was butchered in the kitchen or not + if(istype(get_area(butcher), /area/crew_quarters/kitchen)) + meat_quality = meat_quality + 10 var/turf/T = meat.drop_location() var/final_effectiveness = effectiveness - meat.butcher_difficulty var/bonus_chance = max(0, (final_effectiveness - 100) + bonus_modifier) //so 125 total effectiveness = 25% extra chance + var/list/butchered_items = list() for(var/V in meat.butcher_results) var/obj/bones = V var/amount = meat.butcher_results[bones] @@ -83,16 +87,21 @@ if(butcher) to_chat(butcher, "You harvest some extra [initial(bones.name)] from [meat]!") for(var/i in 1 to 2) - new bones (T) + butchered_items += new bones (T) + else - new bones (T) + butchered_items += new bones (T) meat.butcher_results.Remove(bones) //in case you want to, say, have it drop its results on gib for(var/V in meat.guaranteed_butcher_results) var/obj/sinew = V var/amount = meat.guaranteed_butcher_results[sinew] for(var/i in 1 to amount) - new sinew (T) + butchered_items += new sinew (T) meat.guaranteed_butcher_results.Remove(sinew) + for(var/butchered_item in butchered_items) + if(isfood(butchered_item)) + var/obj/item/reagent_containers/food/butchered_meat = butchered_item + butchered_meat.food_quality = meat_quality if(butcher) meat.visible_message("[butcher] butchers [meat].") ButcherEffects(meat) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index c792cb4be9..0bb6c4a0af 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -109,7 +109,7 @@ AM.visible_message("[AM] falls into [parent]!", "[oblivion_message]") if (isliving(AM)) var/mob/living/L = AM - L.notransform = TRUE + L.mob_transforming = TRUE L.Paralyze(200) var/oldtransform = AM.transform diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm new file mode 100644 index 0000000000..b9952e9133 --- /dev/null +++ b/code/datums/components/combat_mode.dm @@ -0,0 +1,219 @@ +/** + * Combat mode component. It makes the user face whichever atom the mouse pointer is hovering, + * amongst other things designed outside of this file, namely PvP and PvE stuff, hence the name. + * Can be toggled on and off by clicking the screen hud object or by pressing the assigned hotkey (default 'C') + */ +/datum/component/combat_mode + var/mode_flags = COMBAT_MODE_INACTIVE + var/combatmessagecooldown + var/lastmousedir + var/obj/screen/combattoggle/hud_icon + var/hud_loc + +/datum/component/combat_mode/Initialize(hud_loc = ui_combat_toggle) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/living/L = parent + + src.hud_loc = hud_loc + + RegisterSignal(L, SIGNAL_TRAIT(TRAIT_COMBAT_MODE_LOCKED), .proc/update_combat_lock) + RegisterSignal(L, COMSIG_TOGGLE_COMBAT_MODE, .proc/user_toggle_intentional_combat_mode) + RegisterSignal(L, COMSIG_DISABLE_COMBAT_MODE, .proc/safe_disable_combat_mode) + RegisterSignal(L, COMSIG_ENABLE_COMBAT_MODE, .proc/safe_enable_combat_mode) + RegisterSignal(L, COMSIG_MOB_DEATH, .proc/on_death) + RegisterSignal(L, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout) + RegisterSignal(L, COMSIG_MOB_HUD_CREATED, .proc/on_mob_hud_created) + RegisterSignal(L, COMSIG_COMBAT_MODE_CHECK, .proc/check_flags) + + update_combat_lock() + + if(L.client) + on_mob_hud_created(L) + +/datum/component/combat_mode/Destroy() + if(parent) + safe_disable_combat_mode(parent) + if(hud_icon) + QDEL_NULL(hud_icon) + return ..() + +/// Creates the hud screen object. +/datum/component/combat_mode/proc/on_mob_hud_created(mob/source) + hud_icon = new + hud_icon.hud = source.hud_used + hud_icon.icon = tg_ui_icon_to_cit_ui(source.hud_used.ui_style) + hud_icon.screen_loc = hud_loc + source.hud_used.static_inventory += hud_icon + hud_icon.update_icon() + +/// Combat mode can be locked out, forcibly disabled by a status trait. +/datum/component/combat_mode/proc/update_combat_lock() + var/locked = HAS_TRAIT(parent, TRAIT_COMBAT_MODE_LOCKED) + var/desired = (mode_flags & COMBAT_MODE_TOGGLED) + var/actual = (mode_flags & COMBAT_MODE_ACTIVE) + if(actual) + if(locked) + disable_combat_mode(parent, FALSE, TRUE) + else if(!desired) + disable_combat_mode(parent, TRUE, TRUE) + else + if(desired && !locked) + enable_combat_mode(parent, FALSE, TRUE) + +/// Enables combat mode. Please use 'safe_enable_combat_mode' instead, if you wish to also enable the toggle flag. +/datum/component/combat_mode/proc/enable_combat_mode(mob/living/source, silent = TRUE, forced = TRUE, visible = FALSE, locked = FALSE, playsound = FALSE) + if(locked) + if(hud_icon) + hud_icon.combat_on = TRUE + hud_icon.update_icon() + return + if(mode_flags & COMBAT_MODE_ACTIVE) + return + mode_flags |= COMBAT_MODE_ACTIVE + mode_flags &= ~COMBAT_MODE_INACTIVE + SEND_SIGNAL(source, COMSIG_LIVING_COMBAT_ENABLED, forced) + if(!silent) + var/self_message = forced? "Your muscles reflexively tighten!" : "You drop into a combative stance!" + if(visible && (forced || world.time >= combatmessagecooldown)) + combatmessagecooldown = world.time + 10 SECONDS + if(!forced) + if(source.a_intent != INTENT_HELP) + source.visible_message("[source] [source.resting ? "tenses up" : "drops into a combative stance"].", self_message) + else + source.visible_message("[source] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].") + else + source.visible_message("[source] drops into a combative stance!", self_message) + else + to_chat(source, self_message) + if(playsound) + source.playsound_local(source, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! + RegisterSignal(source, COMSIG_MOB_CLIENT_MOUSEMOVE, .proc/onMouseMove) + RegisterSignal(source, COMSIG_MOVABLE_MOVED, .proc/on_move) + RegisterSignal(source, COMSIG_MOB_CLIENT_MOVE, .proc/on_client_move) + if(hud_icon) + hud_icon.combat_on = TRUE + hud_icon.update_icon() + +/// Disables combat mode. Please use 'safe_disable_combat_mode' instead, if you wish to also disable the toggle flag. +/datum/component/combat_mode/proc/disable_combat_mode(mob/living/source, silent = TRUE, forced = TRUE, visible = FALSE, locked = FALSE, playsound = FALSE) + if(locked) + if(hud_icon) + hud_icon.combat_on = FALSE + hud_icon.update_icon() + return + if(!(mode_flags & COMBAT_MODE_ACTIVE)) + return + mode_flags &= ~COMBAT_MODE_ACTIVE + mode_flags |= COMBAT_MODE_INACTIVE + SEND_SIGNAL(source, COMSIG_LIVING_COMBAT_DISABLED, forced) + if(!silent) + var/self_message = forced? "Your muscles are forcibly relaxed!" : "You relax your stance." + if(visible) + source.visible_message("[source] relaxes [source.p_their()] stance.", self_message) + else + to_chat(source, self_message) + if(playsound) + source.playsound_local(source, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the toggleon sound! + UnregisterSignal(source, list(COMSIG_MOB_CLIENT_MOUSEMOVE, COMSIG_MOVABLE_MOVED, COMSIG_MOB_CLIENT_MOVE)) + if(hud_icon) + hud_icon.combat_on = FALSE + hud_icon.update_icon() + source.stop_active_blocking() + source.end_parry_sequence() + +///Changes the user direction to (try) keep match the pointer. +/datum/component/combat_mode/proc/on_move(atom/movable/source, dir, atom/oldloc, forced) + var/mob/living/L = source + if(mode_flags & COMBAT_MODE_ACTIVE && L.client && lastmousedir && lastmousedir != dir) + L.setDir(lastmousedir, ismousemovement = TRUE) + +/// Added movement delay if moving backward. +/datum/component/combat_mode/proc/on_client_move(mob/source, client/client, direction, n, oldloc, added_delay) + if(oldloc != n && direction == REVERSE_DIR(source.dir)) + client.move_delay += added_delay*0.5 + +///Changes the user direction to (try) match the pointer. +/datum/component/combat_mode/proc/onMouseMove(mob/source, object, location, control, params) + if(source.client.show_popup_menus) + return + source.face_atom(object, TRUE) + lastmousedir = source.dir + +/// Toggles whether the user is intentionally in combat mode. THIS should be the proc you generally use! Has built in visual/to other player feedback, as well as an audible cue to ourselves. +/datum/component/combat_mode/proc/user_toggle_intentional_combat_mode(mob/living/source) + if(mode_flags & COMBAT_MODE_TOGGLED) + safe_disable_combat_mode(source) + else if(source.stat == CONSCIOUS && !(source.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) + safe_enable_combat_mode(source) + +/// Enables intentionally being in combat mode. Please try to use the COMSIG_COMBAT_MODE_CHECK signal for feedback when possible. +/datum/component/combat_mode/proc/safe_enable_combat_mode(mob/living/source, silent = FALSE, visible = TRUE) + if((mode_flags & COMBAT_MODE_TOGGLED) && (mode_flags & COMBAT_MODE_ACTIVE)) + return TRUE + mode_flags |= COMBAT_MODE_TOGGLED + enable_combat_mode(source, silent, FALSE, visible, HAS_TRAIT(source, TRAIT_COMBAT_MODE_LOCKED), TRUE) + if(source.client) + source.client.show_popup_menus = FALSE + if(iscarbon(source)) //I dislike this typecheck. It probably should be removed once that spoiled apple is componentized too. + var/mob/living/carbon/C = source + if(C.voremode) + C.disable_vore_mode() + return TRUE + +/// Disables intentionally being in combat mode. Please try to use the COMSIG_COMBAT_MODE_CHECK signal for feedback when possible. +/datum/component/combat_mode/proc/safe_disable_combat_mode(mob/living/source, silent = FALSE, visible = FALSE) + if(!(mode_flags & COMBAT_MODE_TOGGLED) && !(mode_flags & COMBAT_MODE_ACTIVE)) + return TRUE + mode_flags &= ~COMBAT_MODE_TOGGLED + disable_combat_mode(source, silent, FALSE, visible, !(mode_flags & COMBAT_MODE_ACTIVE), TRUE) + if(source.client) + source.client.show_popup_menus = TRUE + return TRUE + +/// Returns a field of flags that are contained in both the second arg and our bitfield variable. +/datum/component/combat_mode/proc/check_flags(mob/living/source, flags) + return mode_flags & (flags) + +/// Disables combat mode upon death. +/datum/component/combat_mode/proc/on_death(mob/living/source) + safe_disable_combat_mode(source) + +/// Disables combat mode upon logout +/datum/component/combat_mode/proc/on_logout(mob/living/source) + safe_disable_combat_mode(source) + +/// The screen button. +/obj/screen/combattoggle + name = "toggle combat mode" + icon = 'modular_citadel/icons/ui/screen_midnight.dmi' + icon_state = "combat_off" + var/mutable_appearance/flashy + var/combat_on = FALSE ///Wheter combat mode is enabled or not, so we don't have to store a reference. + +/obj/screen/combattoggle/Click() + if(hud && usr == hud.mymob) + SEND_SIGNAL(hud.mymob, COMSIG_TOGGLE_COMBAT_MODE) + +/obj/screen/combattoggle/update_icon_state() + var/mob/living/user = hud?.mymob + if(!user) + return + if(combat_on) + icon_state = "combat" + else if(HAS_TRAIT(user, TRAIT_COMBAT_MODE_LOCKED)) + icon_state = "combat_locked" + else + icon_state = "combat_off" + +/obj/screen/combattoggle/update_overlays() + . = ..() + var/mob/living/carbon/user = hud?.mymob + if(!(user?.client)) + return + + if(combat_on) + if(!flashy) + flashy = mutable_appearance('icons/mob/screen_gen.dmi', "togglefull_flash") + flashy.color = user.client.prefs.hud_toggle_color + . += flashy //TODO - beg lummox jr for the ability to force mutable appearances or images to be created rendering from their first frame of animation rather than being based entirely around the client's frame count diff --git a/code/datums/components/crafting/craft.dm b/code/datums/components/crafting/craft.dm index 9b19cd0106..3283c514b8 100644 --- a/code/datums/components/crafting/craft.dm +++ b/code/datums/components/crafting/craft.dm @@ -15,7 +15,7 @@ /datum/component/personal_crafting var/busy - var/viewing_category = 1 //typical powergamer starting on the Weapons tab + var/viewing_category = 1 var/viewing_subcategory = 1 var/list/categories = list( CAT_WEAPONRY = list( @@ -23,7 +23,11 @@ CAT_AMMO, ), CAT_ROBOT = CAT_NONE, - CAT_MISC = CAT_NONE, + CAT_MISC = list( + CAT_MISCELLANEOUS, + CAT_TOOL, + CAT_FURNITURE, + ), CAT_PRIMAL = CAT_NONE, CAT_FOOD = list( CAT_BREAD, @@ -188,7 +192,7 @@ /datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) var/list/contents = get_surroundings(user) - var/send_feedback = 1 + var/send_feedback = TRUE if(check_contents(user, R, contents)) if(check_tools(user, R, contents)) if(do_after(user, R.time, target = user)) @@ -201,11 +205,22 @@ var/atom/movable/I = new R.result (get_turf(user.loc)) I.CheckParts(parts, R) if(isitem(I)) + if(isfood(I)) + var/obj/item/reagent_containers/food/food_result = I + var/total_quality = 0 + var/total_items = 0 + for(var/obj/item/reagent_containers/food/ingredient in parts) + total_items += 1 + total_quality += ingredient.food_quality + if(total_items == 0) + food_result.adjust_food_quality(50) + else + food_result.adjust_food_quality(total_quality / total_items) user.put_in_hands(I) if(send_feedback) SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) log_craft("[I] crafted by [user] at [loc_name(I.loc)]") - return 0 + return FALSE return "." return ", missing tool." return ", missing component." @@ -408,8 +423,11 @@ switch(action) if("make") var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes - busy = TRUE ui_interact(usr) + if(busy) + to_chat(usr, "You are already making something!") + return + busy = TRUE var/fail_msg = construct_item(usr, TR) if(!fail_msg) to_chat(usr, "[TR.name] constructed.") diff --git a/code/datums/components/crafting/glassware.dm b/code/datums/components/crafting/glassware/glassware.dm similarity index 58% rename from code/datums/components/crafting/glassware.dm rename to code/datums/components/crafting/glassware/glassware.dm index 22d7e01f8a..6e1a3d47a0 100644 --- a/code/datums/components/crafting/glassware.dm +++ b/code/datums/components/crafting/glassware/glassware.dm @@ -14,26 +14,32 @@ name = "Glass working tools" desc = "A lovely belt of most the tools you will need to shape, mold, and refine glass into more advanced shapes." icon_state = "glass_tools" - tool_behaviour = TOOL_GLASS_CUT + tool_behaviour = TOOL_GLASS_CUT //Cutting takes 20 ticks /obj/item/glasswork/blowing_rod name = "Glass working blow rod" desc = "A hollow metal stick made for glass blowing." icon_state = "blowing_rods_unused" - tool_behaviour = TOOL_BLOW + tool_behaviour = TOOL_BLOW //Rods take 5 ticks -/obj/item/glasswork/glass_base +/obj/item/glasswork/glass_base //Welding takes 30 ticks name = "Glass fodder sheet" desc = "A sheet of glass set aside for glass working" icon_state = "glass_base" var/next_step = null var/rod = /obj/item/glasswork/blowing_rod -/obj/item/lens - name = "Optical lens" - desc = "Good for selling or crafting, by itself its useless" - icon = 'icons/obj/chemical.dmi' - icon_state = "glass_optics" +/obj/item/tea_plate + name = "Tea Plate" + desc = "A polished plate for a tea cup. How fancy!" + icon = 'icons/obj/glass_ware.dmi' + icon_state = "tea_plate" + +/obj/item/tea_cup + name = "Tea Cup" + desc = "A glass cup made for fake tea!" + icon = 'icons/obj/glass_ware.dmi' + icon_state = "tea_plate" //////////////////////Chem Disk///////////////////// //Two Steps // @@ -49,8 +55,9 @@ /obj/item/glasswork/glass_base/dish/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/dish_part1 name = "Half chem dish sheet" @@ -61,12 +68,13 @@ /obj/item/glasswork/glass_base/dish_part1/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + qdel(src) //////////////////////Lens////////////////////////// //Six Steps // -//Sells for 1800 cr, takes 15 glass shets // +//Sells for 1600 cr, takes 15 glass shets // //Usefull for selling and later crafting // //////////////////////////////////////////////////// @@ -78,8 +86,9 @@ /obj/item/glasswork/glass_base/glass_lens/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/glass_lens_part1 name = "Glass fodder sheet" @@ -90,8 +99,9 @@ /obj/item/glasswork/glass_base/glass_lens_part1/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/glass_lens_part2 name = "Glass fodder sheet" @@ -102,8 +112,9 @@ /obj/item/glasswork/glass_base/glass_lens_part2/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/glass_lens_part3 name = "Glass fodder sheet" @@ -114,9 +125,10 @@ /obj/item/glasswork/glass_base/glass_lens_part3/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_BLOW) - new next_step(user.loc, 1) - qdel(src) - qdel(I) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) /obj/item/glasswork/glass_base/glass_lens_part4 name = "Glass fodder sheet" @@ -127,29 +139,31 @@ /obj/item/glasswork/glass_base/glass_lens_part4/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - new rod(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/glass_lens_part5 name = "Unpolished glass lens" desc = "A small unpolished glass lens. Could be polished with some cloth." - icon = 'icons/obj/chemical.dmi' + icon = 'icons/obj/glass_ware.dmi' icon_state = "glass_optics" next_step = /obj/item/glasswork/glass_base/glass_lens_part6 /obj/item/glasswork/glass_base/glass_lens_part5/attackby(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/stack/sheet/cloth)) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,10, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/glass_lens_part6 name = "Unrefined glass lens" desc = "A small polished glass lens. Just needs to be refined with some sandstone." - icon = 'icons/obj/chemical.dmi' + icon = 'icons/obj/glass_ware.dmi' icon_state = "glass_optics" - next_step = /obj/item/lens + next_step = /obj/item/glasswork/glass_base/lens /obj/item/glasswork/glass_base/glass_lens_part6/attackby(obj/item/I, mob/user, params) ..() @@ -171,8 +185,9 @@ /obj/item/glasswork/glass_base/spouty/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/spouty_part2 name = "Glass fodder sheet" @@ -183,8 +198,9 @@ /obj/item/glasswork/glass_base/spouty_part2/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/spouty_part3 name = "Glass fodder sheet" @@ -195,9 +211,10 @@ /obj/item/glasswork/glass_base/spouty_part3/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_BLOW) - new next_step(user.loc, 1) - qdel(src) - qdel(I) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) /obj/item/glasswork/glass_base/spouty_part4 name = "Glass fodder sheet" @@ -208,9 +225,10 @@ /obj/item/glasswork/glass_base/spouty_part4/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - new rod(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) //////////////////////Small Bulb Flask////////////// //Two Steps // @@ -226,8 +244,9 @@ /obj/item/glasswork/glass_base/flask_small/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/flask_small_part1 name = "Metled glass" @@ -238,9 +257,10 @@ /obj/item/glasswork/glass_base/flask_small_part1/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_BLOW) - new next_step(user.loc, 1) - qdel(src) - qdel(I) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) /obj/item/glasswork/glass_base/flask_small_part2 name = "Metled glass" @@ -251,9 +271,10 @@ /obj/item/glasswork/glass_base/flask_small_part2/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - new rod(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) //////////////////////Large Bulb Flask////////////// //Two Steps // @@ -269,8 +290,9 @@ /obj/item/glasswork/glass_base/flask_large/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER) - new next_step(user.loc, 1) - qdel(src) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) /obj/item/glasswork/glass_base/flask_large_part1 name = "Metled glass" @@ -281,9 +303,10 @@ /obj/item/glasswork/glass_base/flask_large_part1/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_BLOW) - new next_step(user.loc, 1) - qdel(src) - qdel(I) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) /obj/item/glasswork/glass_base/flask_large_part2 name = "Metled glass" @@ -294,6 +317,138 @@ /obj/item/glasswork/glass_base/flask_large_part2/attackby(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_GLASS_CUT) - new next_step(user.loc, 1) - new rod(user.loc, 1) - qdel(src) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) + +//////////////////////Tea Plates//////////////////// +//Three Steps // +//Sells for 1000 cr, takes 5 glass shets // +//Usefull for selling and chemical things // +//////////////////////////////////////////////////// + +/obj/item/glasswork/glass_base/tea_plate + name = "Glass fodder sheet" + desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea plate, how fancy! Needs to be heated with some tools." + next_step = /obj/item/glasswork/glass_base/tea_plate1 + +/obj/item/glasswork/glass_base/tea_plate/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_WELDER) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/tea_plate1 + name = "Metled glass" + desc = "A blob of metled glass, this one is ideal for a tea plate. Needs to be blown with some tools." + icon_state = "glass_base_molding" + next_step = /obj/item/glasswork/glass_base/tea_plate2 + +/obj/item/glasswork/glass_base/tea_plate1/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_BLOW) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) + +/obj/item/glasswork/glass_base/tea_plate2 + name = "Metled glass" + desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + icon_state = "blowing_rods_inuse" + next_step = /obj/item/glasswork/glass_base/tea_plate3 + +/obj/item/glasswork/glass_base/tea_plate2/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_GLASS_CUT) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/tea_plate3 + name = "Disk of glass" + desc = "A disk of glass that can be cant be used for much. Needs to be polished with some cloth." + icon_state = "glass_base_half" + next_step = /obj/item/tea_plate + +/obj/item/glasswork/glass_base/tea_plate3/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stack/sheet/cloth)) + if(do_after(user,10, target = src)) + new next_step(user.loc, 1) + qdel(src) + +//////////////////////Tea Cup/////////////////////// +//Four Steps // +//Sells for 1600 cr, takes 6 glass shets // +//Usefull for selling and chemical things // +//////////////////////////////////////////////////// + +/obj/item/glasswork/glass_base/tea_cup + name = "Glass fodder sheet" + desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea cup, how fancy! Needs to be heated with some tools." + next_step = /obj/item/glasswork/glass_base/tea_cup1 + +/obj/item/glasswork/glass_base/tea_cup/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_WELDER) + if(do_after(user,30, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/tea_cup1 + name = "Metled glass" + desc = "A blob of metled glass, this one is ideal for a tea cup. Needs to be blown with some tools." + icon_state = "glass_base_molding" + next_step = /obj/item/glasswork/glass_base/tea_cup2 + +/obj/item/glasswork/glass_base/tea_cup1/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_BLOW) + if(do_after(user,5, target = src)) + new next_step(user.loc, 1) + qdel(src) + qdel(I) + +/obj/item/glasswork/glass_base/tea_cupe2 + name = "Metled glass" + desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + icon_state = "blowing_rods_inuse" + next_step = /obj/item/glasswork/glass_base/tea_cup3 + +/obj/item/glasswork/glass_base/tea_cup2/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_GLASS_CUT) + if(do_after(user,20, target = src)) + new next_step(user.loc, 1) + new rod(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/tea_cup3 + name = "Disk of glass" + desc = "A bowl of glass that can be cant be used for much. Needs to be polished with some cloth." + icon_state = "glass_base_half" + next_step = /obj/item/glasswork/glass_base/tea_cup4 + +/obj/item/glasswork/glass_base/cup3/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stack/sheet/cloth)) + if(do_after(user,10, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/tea_cup4 + name = "Disk of glass" + desc = "A bowl of polished glass that can be cant be used for much. Needs some more glass to make a handle." + icon_state = "glass_base_half" + next_step = /obj/item/tea_cup + +/obj/item/glasswork/glass_base/cup4/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stack/sheet/glass)) + if(do_after(user,10, target = src)) + new next_step(user.loc, 1) + qdel(src) \ No newline at end of file diff --git a/code/datums/components/crafting/glassware/lens_crafting.dm b/code/datums/components/crafting/glassware/lens_crafting.dm new file mode 100644 index 0000000000..117df25a30 --- /dev/null +++ b/code/datums/components/crafting/glassware/lens_crafting.dm @@ -0,0 +1,98 @@ +//This file is for crafting using a lens! + +/obj/item/glasswork/glass_base/lens + name = "Optical lens" + desc = "Good for selling or crafting, by itself its useless" + icon = 'icons/obj/glass_ware.dmi' + icon_state = "glass_optics" + +//Laser pointers - 2600 +/obj/item/glasswork/glass_base/laserpointer_shell + name = "Laser pointer assembly" + desc = "Good for selling or crafting, by itself its useless. Needs a power capactor." + icon_state = "laser_case" + icon = 'icons/obj/glass_ware.dmi' + next_step = /obj/item/glasswork/glass_base/laserpointer_shell_1 + +/obj/item/glasswork/glass_base/laserpointer_shell/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stock_parts/capacitor)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/laserpointer_shell_1 + name = "Laser pointer assembly" + desc = "Good for selling or crafting, by itself its useless. Needs a glass lens." + icon_state = "laser_wire" + icon_state = "laser_case" + next_step = /obj/item/glasswork/glass_base/laserpointer_shell_2 + +/obj/item/glasswork/glass_base/laserpointer_shell_1/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/glasswork/glass_base/lens)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/laserpointer_shell_2 + name = "Laser pointer assembly" + desc = "Good for selling or crafting, by itself its useless. Needs to be screwed together." + icon_state = "laser_wire" + icon_state = "laser_case" + next_step = /obj/item/laser_pointer/blue/handmade + +/obj/item/glasswork/glass_base/laserpointer_shell_2/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(do_after(user,260, target = src)) + new next_step(user.loc, 1) + qdel(src) + +//NERD SHIT - 5000 + +/obj/item/glasswork/glass_base/glasses_frame + name = "Glasses Frame" + desc = "Good for crafting a pare of glasses, by itself its useless. Just add a pare of lens." + icon = 'icons/obj/glass_ware.dmi' + icon_state = "frames" + next_step = /obj/item/glasswork/glass_base/glasses_frame_1 + +/obj/item/glasswork/glass_base/glasses_frame/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/glasswork/glass_base/lens)) + if(do_after(user,60, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/glasses_frame_1 + name = "Glasses Frame" + desc = "Good for crafting a pare of glasses, by itself its useless. Just add a the other lens." + icon = 'icons/obj/glass_ware.dmi' + icon_state = "frames_1" + next_step = /obj/item/glasswork/glass_base/glasses_frame_2 + +/obj/item/glasswork/glass_base/glasses_frame_1/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/glasswork/glass_base/lens)) + if(do_after(user,60, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glass_base/glasses_frame_2 + name = "Glasses Frame" + desc = "Good for crafting a pare of glasses, by itself its useless. Just adjust the pices into the frame with a screwdriver." + icon = 'icons/obj/glass_ware.dmi' + icon_state = "frames_2" + next_step = /obj/item/glasswork/glasses + +/obj/item/glasswork/glass_base/glasses_frame_2/attackby(obj/item/I, mob/user, params) + ..() + if(I.tool_behaviour == TOOL_SCREWDRIVER) + if(do_after(user,180, target = src)) + new next_step(user.loc, 1) + qdel(src) + +/obj/item/glasswork/glasses + name = "Hand Made Glasses" + desc = "Hande made glasses that have not been polished at all making them useless. Selling them could still be worth a bit of credits." + icon = 'icons/obj/glass_ware.dmi' + icon_state = "frames_2" \ No newline at end of file diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index 89868c2332..4626ef69d1 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -1,21 +1,92 @@ -//Gun crafting parts til they can be moved elsewhere - -// PARTS // - -/obj/item/weaponcrafting/receiver - name = "modular receiver" - desc = "A prototype modular receiver and trigger assembly for a firearm." +k// PARTS // +/obj/item/weaponcrafting icon = 'icons/obj/improvised.dmi' - icon_state = "receiver" /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." - icon = 'icons/obj/improvised.dmi' + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6) icon_state = "riflestock" -/obj/item/weaponcrafting/silkstring - name = "silkstring" - desc = "A long piece of silk with some resemblance to cable coil." - icon = 'icons/obj/improvised.dmi' - icon_state = "silkstring" +/obj/item/weaponcrafting/durathread_string + name = "durathread string" + desc = "A long piece of durathread with some resemblance to cable coil." + icon_state = "durastring" + +//////////////////////////////// +// KAT IMPROVISED WEAPON PARTS// +//////////////////////////////// + +/obj/item/weaponcrafting/improvised_parts + name = "Eerie bunch of coloured dots." + desc = "You feel the urge to report to Central that the parent type of guncrafting, which should never appear in this reality, has appeared. Whatever that means." + icon = 'icons/obj/guns/gun_parts.dmi' + icon_state = "palette" + +// BARRELS + +/obj/item/weaponcrafting/improvised_parts/barrel_rifle + name = "rifle barrel" + desc = "A pipe with a diameter just the right size to fire 7.62 rounds out of." + icon_state = "barrel_rifle" + +/obj/item/weaponcrafting/improvised_parts/barrel_shotgun + name = "shotgun barrel" + desc = "A twenty bore shotgun barrel." + icon_state = "barrel_shotgun" + +/obj/item/weaponcrafting/improvised_parts/barrel_pistol + name = "pistol barrel" + desc = "A pipe with a small diameter and some holes finely cut into it. It fits .32 ACP bullets. Probably." + icon_state = "barrel_pistol" + w_class = WEIGHT_CLASS_SMALL + +// RECEIVERS + +/obj/item/weaponcrafting/improvised_parts/rifle_receiver + name = "bolt action receiver" + desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle. It's generic enough to modify to create other rifles, potentially." + icon_state = "receiver_rifle" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/pistol_receiver + name = "pistol receiver" + desc = "A receiver to connect house and connects all the parts to make an improvised pistol." + icon_state = "receiver_pistol" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/laser_receiver + name = "energy emitter assembly" + desc = "A mixture of components haphazardly wired together to form an energy emitter." + icon_state = "laser_assembly" + +/obj/item/weaponcrafting/improvised_parts/shotgun_receiver + name = "break-action assembly" + desc = "An improvised receiver to create a break-action breechloaded shotgun. Parts of this are still useful if you want to make another type of shotgun, however." + icon_state = "receiver_shotgun" + w_class = WEIGHT_CLASS_SMALL + +// MISC + +/obj/item/weaponcrafting/improvised_parts/trigger_assembly + name = "firearm trigger assembly" + desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss." + icon_state = "trigger_assembly" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/wooden_body + name = "wooden firearm body" + desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart." + icon_state = "wooden_body" + +/obj/item/weaponcrafting/improvised_parts/wooden_grip + name = "wooden pistol grip" + desc = "A nice wooden grip hollowed out for pistol magazines." + icon_state = "wooden_pistolgrip" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/makeshift_lens + name = "makeshift focusing lens" + desc = "A properly made lens made with actual glassworking tools would perform much better, but this will have to do." + icon_state = "focusing_lens" + w_class = WEIGHT_CLASS_TINY diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 2b6f1a5b81..bc76082f0a 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -23,3 +23,4 @@ */ /datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) return TRUE + diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index ba47b64b97..7a7379c834 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -40,6 +40,30 @@ reqs = list(/obj/item/paper = 20) category = CAT_CLOTHING +/datum/crafting_recipe/armwraps + name = "Armwraps" + result = /obj/item/clothing/gloves/fingerless/pugilist + time = 60 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/stack/sheet/cloth = 4, + /obj/item/stack/sheet/durathread = 2, + /obj/item/stack/sheet/leather = 2) + category = CAT_CLOTHING + +/datum/crafting_recipe/armwrapsplusone + name = "Armwraps of Mighty Fists" + result = /obj/item/clothing/gloves/fingerless/pugilist/magic + time = 300 + tools = list(TOOL_WIRECUTTER, /obj/item/book/codex_gigas, /obj/item/clothing/head/wizard, /obj/item/clothing/suit/wizrobe) + reqs = list(/obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/durathread = 2, + /datum/reagent/consumable/ethanol/sake = 100, + /datum/reagent/consumable/ethanol/wizz_fizz = 100, + /obj/item/stack/sheet/sinew = 1, + /obj/item/stack/sheet/mineral/gold = 50) + category = CAT_CLOTHING + //////// //Huds// //////// @@ -294,3 +318,25 @@ /obj/item/bedsheet/cosmos = 1) time = 60 category = CAT_CLOTHING + + +/datum/crafting_recipe/garlic_necklace + name = "Garlic Necklace" + result = /obj/item/clothing/neck/garlic_necklace + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, + /obj/item/stack/cable_coil = 10) + time = 100 //Takes awhile to put all the garlics on the coil and knot it. + category = CAT_CLOTHING + +/datum/crafting_recipe/gripperoffbrand + name = "Improvised Gripper Gloves" + reqs = list( + /obj/item/clothing/gloves/fingerless = 1, + // /obj/item/stack/sticky_tape = 1 + /obj/item/stack/cable_coil = 5, + /obj/item/stack/sheet/cloth = 2, + ) + result = /obj/item/clothing/gloves/tackler/offbrand + category = CAT_CLOTHING + tools = list(TOOL_WIRECUTTER) + time = 20 diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index ee72745016..b076407efc 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -8,6 +8,7 @@ /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1) result = /obj/structure/curtain + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/guillotine @@ -18,6 +19,7 @@ /obj/item/stack/sheet/mineral/wood = 20, /obj/item/stack/cable_coil = 10) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/femur_breaker @@ -27,12 +29,119 @@ reqs = list(/obj/item/stack/sheet/metal = 20, /obj/item/stack/cable_coil = 30) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC +// Blood Sucker stuff // +/datum/crafting_recipe/bloodsucker/blackcoffin + name = "Black Coffin" + result = /obj/structure/closet/crate/coffin/blackcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/mineral/wood = 5, + /obj/item/stack/sheet/metal = 1) + ///obj/item/stack/packageWrap = 8, + ///obj/item/pipe = 2) + time = 150 + subcategory = CAT_FURNITURE + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/meatcoffin + name = "Meat Coffin" + result =/obj/structure/closet/crate/coffin/meatcoffin + tools = list(/obj/item/kitchen/knife, + /obj/item/kitchen/rollingpin) + reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, + /obj/item/restraints/handcuffs/cable = 1) + time = 150 + subcategory = CAT_FURNITURE + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/metalcoffin + name = "Metal Coffin" + result =/obj/structure/closet/crate/coffin/metalcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/metal = 5) + time = 100 + subcategory = CAT_FURNITURE + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/vassalrack + name = "Persuasion Rack" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/vassalrack + tools = list(/obj/item/weldingtool, + //obj/item/screwdriver, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/mineral/wood = 3, + /obj/item/stack/sheet/metal = 2, + /obj/item/restraints/handcuffs/cable = 2, + //obj/item/storage/belt = 1, + //obj/item/stack/sheet/animalhide = 1, + //obj/item/stack/sheet/leather = 1, + //obj/item/stack/sheet/plasteel = 5 + ) + //parts = list(/obj/item/storage/belt = 1 + // ) + time = 150 + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + always_availible = FALSE // Disabled til learned + + +/datum/crafting_recipe/bloodsucker/candelabrum + name = "Candelabrum" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/candelabrum + tools = list(/obj/item/weldingtool, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/stack/rods = 1, + /obj/item/candle = 1 + ) + time = 100 + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + always_availible = FALSE // Disabled til learned + /////////////////// //Tools & Storage// /////////////////// +/datum/crafting_recipe/upgraded_gauze + name = "Improved Gauze" + result = /obj/item/stack/medical/gauze/adv/one + time = 1 + reqs = list(/obj/item/stack/medical/gauze = 1, + /datum/reagent/space_cleaner/sterilizine = 10) + category = CAT_MISC + subcategory = CAT_TOOL + +/datum/crafting_recipe/brute_pack + name = "Suture Pack" + result = /obj/item/stack/medical/suture/one + time = 1 + reqs = list(/obj/item/stack/medical/gauze = 1, + /datum/reagent/medicine/styptic_powder = 10) + category = CAT_MISC + subcategory = CAT_TOOL + +/datum/crafting_recipe/burn_pack + name = "Regenerative Mesh" + result = /obj/item/stack/medical/mesh/one + time = 1 + reqs = list(/obj/item/stack/medical/gauze = 1, + /datum/reagent/medicine/silver_sulfadiazine = 10) + category = CAT_MISC + subcategory = CAT_TOOL + /datum/crafting_recipe/ghettojetpack name = "Improvised Jetpack" result = /obj/item/tank/jetpack/improvised @@ -42,72 +151,95 @@ /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30) category = CAT_MISC + subcategory = CAT_TOOL tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) /datum/crafting_recipe/goldenbox name = "Gold Plated Toolbox" result = /obj/item/storage/toolbox/gold_fake - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting /obj/item/stack/cable_coil = 10, /obj/item/stack/sheet/mineral/gold = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL + category = CAT_MISC + +/datum/crafting_recipe/papersack + name = "Paper Sack" + result = /obj/item/storage/box/papersack + time = 10 + reqs = list(/obj/item/paper = 5) + subcategory = CAT_TOOL + category = CAT_MISC + +/datum/crafting_recipe/smallcarton + name = "Small Carton" + result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton + time = 10 + reqs = list(/obj/item/stack/sheet/cardboard = 1) + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/bronze_driver name = "Bronze Plated Screwdriver" - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) result = /obj/item/screwdriver/bronze reqs = list(/obj/item/screwdriver = 1, /obj/item/stack/cable_coil = 10, /obj/item/stack/tile/bronze = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/bronze_welder name = "Bronze Plated Welding Tool" - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) result = /obj/item/weldingtool/bronze reqs = list(/obj/item/weldingtool = 1, /obj/item/stack/cable_coil = 10, /obj/item/stack/tile/bronze = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/bronze_wirecutters name = "Bronze Plated Wirecutters" - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) result = /obj/item/wirecutters/bronze reqs = list(/obj/item/wirecutters = 1, /obj/item/stack/cable_coil = 10, /obj/item/stack/tile/bronze = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/bronze_crowbar name = "Bronze Plated Crowbar" - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) result = /obj/item/crowbar/bronze reqs = list(/obj/item/crowbar = 1, /obj/item/stack/cable_coil = 10, /obj/item/stack/tile/bronze = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/bronze_wrench name = "Bronze Plated Wrench" - tools = list(/obj/item/stock_parts/cell/upgraded/plus) + tools = list(/obj/item/stock_parts/cell/high) result = /obj/item/wrench/bronze reqs = list(/obj/item/wrench = 1, /obj/item/stack/cable_coil = 10, /obj/item/stack/tile/bronze = 1, /datum/reagent/water = 15) time = 40 + subcategory = CAT_TOOL category = CAT_MISC /datum/crafting_recipe/rcl @@ -116,6 +248,25 @@ time = 40 tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) reqs = list(/obj/item/stack/sheet/metal = 15) + subcategory = CAT_TOOL + category = CAT_MISC + +/datum/crafting_recipe/picket_sign + name = "Picket Sign" + result = /obj/item/picket_sign + reqs = list(/obj/item/stack/rods = 1, + /obj/item/stack/sheet/cardboard = 2) + time = 80 + subcategory = CAT_TOOL + category = CAT_MISC + +/datum/crafting_recipe/electrochromatic_kit + name = "Electrochromatic Kit" + result = /obj/item/electronics/electrochromatic_kit + reqs = list(/obj/item/stack/sheet/metal = 1, + /obj/item/stack/cable_coil = 1) + time = 5 + subcategory = CAT_TOOL category = CAT_MISC //////////// @@ -128,6 +279,7 @@ reqs = list(/obj/item/stack/sheet/plasteel = 2, /obj/item/stack/rods = 8) time = 100 + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/skateboard @@ -136,6 +288,7 @@ time = 60 reqs = list(/obj/item/stack/sheet/metal = 5, /obj/item/stack/rods = 10) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/scooter @@ -144,6 +297,7 @@ time = 65 reqs = list(/obj/item/stack/sheet/metal = 5, /obj/item/stack/rods = 12) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC ///////// @@ -154,18 +308,21 @@ name = "Toy Sword" reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) result = /obj/item/toy/sword + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/extendohand name = "Extendo-Hand" reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1) result = /obj/item/extendohand + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/toyneb name = "Non-Euplastic Blade" reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) result = /obj/item/toy/sword/cx + subcategory = CAT_MISCELLANEOUS category = CAT_MISC //////////// @@ -176,6 +333,7 @@ name = "Black Carpet" reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) result = /obj/item/stack/tile/carpet/black/fifty + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/paperframes @@ -183,6 +341,7 @@ result = /obj/item/stack/sheet/paperframes/five time = 10 reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/naturalpaper @@ -191,6 +350,7 @@ reqs = list(/datum/reagent/water = 50, /obj/item/stack/sheet/mineral/wood = 1) tools = list(/obj/item/hatchet) result = /obj/item/paper_bin/bundlenatural + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/bluespacehonker @@ -200,6 +360,7 @@ reqs = list(/obj/item/stack/ore/bluespace_crystal = 1, /obj/item/toy/crayon/blue = 1, /obj/item/bikehorn = 1) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/mousetrap @@ -208,13 +369,7 @@ time = 10 reqs = list(/obj/item/stack/sheet/cardboard = 1, /obj/item/stack/rods = 1) - category = CAT_MISC - -/datum/crafting_recipe/papersack - name = "Paper Sack" - result = /obj/item/storage/box/papersack - time = 10 - reqs = list(/obj/item/paper = 5) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/flashlight_eyes @@ -225,13 +380,7 @@ /obj/item/flashlight = 2, /obj/item/restraints/handcuffs/cable = 1 ) - category = CAT_MISC - -/datum/crafting_recipe/smallcarton - name = "Small Carton" - result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton - time = 10 - reqs = list(/obj/item/stack/sheet/cardboard = 1) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/pressureplate @@ -242,6 +391,7 @@ /obj/item/stack/tile/plasteel = 1, /obj/item/stack/cable_coil = 2, /obj/item/assembly/igniter = 1) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/gold_horn @@ -250,6 +400,7 @@ time = 20 reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, /obj/item/bikehorn = 1) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC /datum/crafting_recipe/spooky_camera @@ -259,14 +410,16 @@ reqs = list(/obj/item/camera = 1, /datum/reagent/water/holywater = 10) parts = list(/obj/item/camera = 1) + subcategory = CAT_MISCELLANEOUS category = CAT_MISC -/datum/crafting_recipe/paperwork - name = "Filed Paper Work" - result = /obj/item/folder/paperwork_correct - time = 10 //Takes time for people to file and complete paper work! - tools = list(/obj/item/pen) - reqs = list(/obj/item/folder/paperwork = 1) +/datum/crafting_recipe/coconut_bong + name = "Coconut Bong" + result = /obj/item/bong/coconut + reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2, + /obj/item/reagent_containers/food/snacks/grown/coconut = 1) + time = 70 + subcategory = CAT_MISCELLANEOUS category = CAT_MISC ////////////// @@ -279,6 +432,7 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/captain/parade = 1) + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/engineering_banner @@ -287,6 +441,7 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/engineering/engineer = 1) + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/cargo_banner @@ -295,6 +450,7 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/cargo/tech = 1) + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/science_banner @@ -303,6 +459,7 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/rnd/scientist = 1) + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/medical_banner @@ -311,6 +468,7 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/medical/doctor = 1) + subcategory = CAT_FURNITURE category = CAT_MISC /datum/crafting_recipe/security_banner @@ -319,50 +477,5 @@ time = 40 reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/security/officer = 1) + subcategory = CAT_FURNITURE category = CAT_MISC - - /datum/crafting_recipe/bloodsucker/vassalrack - name = "Persuasion Rack" - //desc = "For converting crewmembers into loyal Vassals." - result = /obj/structure/bloodsucker/vassalrack - tools = list(/obj/item/weldingtool, - ///obj/item/screwdriver, - /obj/item/wrench - ) - reqs = list(/obj/item/stack/sheet/mineral/wood = 3, - /obj/item/stack/sheet/metal = 2, - /obj/item/restraints/handcuffs/cable = 2, - ///obj/item/storage/belt = 1 - ///obj/item/stack/sheet/animalhide = 1, // /obj/item/stack/sheet/leather = 1, - ///obj/item/stack/sheet/plasteel = 5 - ) - //parts = list(/obj/item/storage/belt = 1 - // ) - - time = 150 - category = CAT_MISC - always_availible = FALSE // Disabled til learned - - - /datum/crafting_recipe/bloodsucker/candelabrum - name = "Candelabrum" - //desc = "For converting crewmembers into loyal Vassals." - result = /obj/structure/bloodsucker/candelabrum - tools = list(/obj/item/weldingtool, - /obj/item/wrench - ) - reqs = list(/obj/item/stack/sheet/metal = 3, - /obj/item/stack/rods = 1, - /obj/item/candle = 1 - ) - time = 100 - category = CAT_MISC - always_availible = FALSE // Disabled til learned - -/datum/crafting_recipe/coconut_bong - name = "Coconut Bong" - result = /obj/item/bong/coconut - reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2, - /obj/item/reagent_containers/food/snacks/grown/coconut = 1) - time = 70 - category = CAT_MISC \ No newline at end of file diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm index ae611e5855..bb4f4ce6d5 100644 --- a/code/datums/components/crafting/recipes/recipes_primal.dm +++ b/code/datums/components/crafting/recipes/recipes_primal.dm @@ -116,4 +116,41 @@ always_availible = FALSE reqs = list(/obj/item/stack/rods = 1, /obj/item/stack/sheet/mineral/sandstone = 4) - category = CAT_PRIMAL \ No newline at end of file + category = CAT_PRIMAL + +/datum/crafting_recipe/rib + name = "Collosal Rib" + always_availible = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 10, + /datum/reagent/oil = 5) + result = /obj/structure/statue/bone/rib + subcategory = CAT_PRIMAL + +/datum/crafting_recipe/skull + name = "Skull Carving" + always_availible = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 6, + /datum/reagent/oil = 5) + result = /obj/structure/statue/bone/skull + category = CAT_PRIMAL + +/datum/crafting_recipe/halfskull + name = "Cracked Skull Carving" + always_availible = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 3, + /datum/reagent/oil = 5) + result = /obj/structure/statue/bone/skull/half + category = CAT_PRIMAL + +/datum/crafting_recipe/boneshovel + name = "Serrated Bone Shovel" + always_availible = FALSE + reqs = list( + /obj/item/stack/sheet/bone = 4, + /datum/reagent/oil = 5, + /obj/item/shovel/spade = 1) + result = /obj/item/shovel/serrated + category = CAT_PRIMAL diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index aa3f2d3969..9d712ef059 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -6,7 +6,7 @@ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) time = 50 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_OTHER /datum/crafting_recipe/pin_removal/check_requirements(mob/user, list/collected_requirements) var/obj/item/gun/G = collected_requirements[/obj/item/gun][1] @@ -22,7 +22,7 @@ /obj/item/shield/riot = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/strobeshield/New() ..() @@ -38,7 +38,7 @@ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER) time = 100 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/spear name = "Spear" @@ -49,7 +49,7 @@ parts = list(/obj/item/shard = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/stunprod name = "Stunprod" @@ -59,7 +59,7 @@ /obj/item/assembly/igniter = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/teleprod name = "Teleprod" @@ -70,7 +70,7 @@ /obj/item/stack/ore/bluespace_crystal = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/bola name = "Bola" @@ -88,7 +88,7 @@ /obj/item/stack/sheet/metal = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/tailwhip name = "Liz O' Nine Tails" @@ -97,7 +97,7 @@ /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/catwhip name = "Cat O' Nine Tails" @@ -106,7 +106,7 @@ /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE /datum/crafting_recipe/chainsaw name = "Chainsaw" @@ -117,7 +117,7 @@ tools = list(TOOL_WELDER) time = 50 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE ////////////////// ///BOMB CRAFTING// @@ -134,7 +134,7 @@ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) time = 30 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_OTHER /datum/crafting_recipe/chemical_payload2 name = "Chemical Payload (Gibtonite)" @@ -147,7 +147,7 @@ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2) time = 50 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_OTHER /datum/crafting_recipe/molotov name = "Molotov" @@ -169,7 +169,7 @@ parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1) time = 15 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_OTHER /datum/crafting_recipe/lance name = "Explosive Lance (Grenade)" @@ -180,7 +180,7 @@ /obj/item/grenade = 1) time = 15 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE ////////////////// ///GUNS CRAFTING// @@ -192,7 +192,7 @@ result = /obj/item/gun/ballistic/bow/pipe reqs = list(/obj/item/pipe = 5, /obj/item/stack/sheet/plastic = 15, - /obj/item/weaponcrafting/silkstring = 5) + /obj/item/weaponcrafting/durathread_string = 5) time = 450 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -251,8 +251,10 @@ /datum/crafting_recipe/ishotgun name = "Improvised Shotgun" result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 1, + reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 1, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) @@ -261,10 +263,12 @@ subcategory = CAT_WEAPON /datum/crafting_recipe/irifle - name = "Improvised Rifle(7.62mm)" + name = "Improvised Rifle (7.62mm)" result = /obj/item/gun/ballistic/shotgun/boltaction/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 2, + reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_rifle = 1, + /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) @@ -272,6 +276,49 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON +/datum/crafting_recipe/ipistol + name = "Improvised Pistol (.32)" + result = /obj/item/gun/ballistic/automatic/pistol/improvised/nomag + reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_pistol = 1, + /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/wooden_grip = 1, + /obj/item/stack/sheet/plastic = 15, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WIRECUTTER) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/ilaser + name = "Improvised Energy Gun" + result = /obj/item/gun/energy/e_gun/old/improvised + reqs = list(/obj/item/weaponcrafting/improvised_parts/laser_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 1, + /obj/item/stock_parts/cell = 1, + /obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/cable_coil = 10) + tools = list(TOOL_SCREWDRIVER) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/ilaser/upgraded + name = "Improvised Energy Gun Upgrade" + result = /obj/item/gun/energy/e_gun/old/improvised/upgraded + reqs = list(/obj/item/gun/energy/e_gun/old/improvised = 1, + /obj/item/glasswork/glass_base/lens = 1, + /obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stock_parts/micro_laser/ultra = 1, + /obj/item/stock_parts/cell/bluespace = 1, + /obj/item/stack/cable_coil = 5) + tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + ////////////////// ///AMMO CRAFTING// ////////////////// @@ -281,7 +328,7 @@ result = /obj/item/ammo_casing/caseless/arrow/wood time = 30 reqs = list(/obj/item/stack/sheet/mineral/wood = 1, - /obj/item/stack/sheet/silk = 1, + /obj/item/stack/sheet/durathread = 1, /obj/item/stack/rods = 1) // 1 metal sheet = 2 rods = 2 arrows category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -298,7 +345,7 @@ subcategory = CAT_AMMO /datum/crafting_recipe/ashen_arrow - name = "Fire Hardened Arrow" + name = "Ashen Arrow" result = /obj/item/ammo_casing/caseless/arrow/ash tools = list(TOOL_WELDER) time = 30 @@ -394,3 +441,114 @@ time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO + +/datum/crafting_recipe/m32acp + name = ".32ACP Empty Magazine" + result = /obj/item/ammo_box/magazine/m32acp/empty + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/stack/sheet/plasteel = 1, + /obj/item/stack/packageWrap = 1) + tools = list(TOOL_WELDER,TOOL_SCREWDRIVER) + time = 5 + category = CAT_WEAPONRY + subcategory = CAT_AMMO + +//////////////////// +// PARTS CRAFTING // +//////////////////// + +// BARRELS + +/datum/crafting_recipe/rifle_barrel + name = "Improvised Rifle Barrel" + result = /obj/item/weaponcrafting/improvised_parts/barrel_rifle + reqs = list(/obj/item/pipe = 2) + tools = list(TOOL_WELDER,TOOL_SAW) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/shotgun_barrel + name = "Improvised Shotgun Barrel" + result = /obj/item/weaponcrafting/improvised_parts/barrel_shotgun + reqs = list(/obj/item/pipe = 2) + tools = list(TOOL_WELDER,TOOL_SAW) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/pistol_barrel + name = "Improvised Pistol Barrel" + result = /obj/item/weaponcrafting/improvised_parts/barrel_pistol + reqs = list(/obj/item/pipe = 1, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_WELDER,TOOL_SAW) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +// RECEIVERS + +/datum/crafting_recipe/rifle_receiver + name = "Improvised Rifle Receiver" + result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/shotgun_receiver + name = "Improvised Shotgun Receiver" + result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Dual wielding has been removed, plasteel is a soft timesink to obtain for most to make mass production harder. + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/pistol_receiver + name = "Improvised Pistol Receiver" + result = /obj/item/weaponcrafting/improvised_parts/pistol_receiver + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_SAW) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/laser_receiver + name = "Energy Weapon Assembly" + result = /obj/item/weaponcrafting/improvised_parts/laser_receiver + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stock_parts/capacitor = 2, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/assembly/prox_sensor = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WELDER) // Prox sensor and multitool for the circuit board, welder for extremely ghetto soldering. + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +// MISC + +/datum/crafting_recipe/trigger_assembly + name = "Trigger Assembly" + result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/assembly/igniter = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/makeshift_lens + name = "Makeshift Lens" + result = /obj/item/weaponcrafting/improvised_parts/makeshift_lens + reqs = list(/obj/item/stack/sheet/metal = 1, + /obj/item/stack/sheet/glass = 2) + tools = list(TOOL_WELDER) // Glassmaking lets you make non-makeshift lenses. + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm deleted file mode 100644 index 60317797a7..0000000000 --- a/code/datums/components/decal.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/component/decal - dupe_mode = COMPONENT_DUPE_ALLOWED - can_transfer = TRUE - var/cleanable - var/description - var/mutable_appearance/pic - - var/first_dir // This only stores the dir arg from init - -/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255) - if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) - return COMPONENT_INCOMPATIBLE - first_dir = _dir - description = _description - cleanable = _cleanable - - apply() - -/datum/component/decal/RegisterWithParent() - . = ..() - if(first_dir) - RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) - if(cleanable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) - if(description) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) - -/datum/component/decal/UnregisterFromParent() - . = ..() - UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) - -/datum/component/decal/Destroy() - remove() - return ..() - -/datum/component/decal/PreTransfer() - remove() - -/datum/component/decal/PostTransfer() - remove() - apply() - -/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha) - if(!_icon || !_icon_state) - return FALSE - // It has to be made from an image or dir breaks because of a byond bug - var/temp_image = image(_icon, null, _icon_state, _layer, _dir) - pic = new(temp_image) - pic.color = _color - pic.alpha = _alpha - return TRUE - -/datum/component/decal/proc/apply(atom/thing) - var/atom/master = thing || parent - master.add_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/remove(atom/thing) - var/atom/master = thing || parent - master.cut_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir) - if(old_dir == new_dir) - return - remove() - pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) - apply() - -/datum/component/decal/proc/clean_react(datum/source, strength) - if(strength >= cleanable) - qdel(src) - -/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) - examine_list += description \ No newline at end of file diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm deleted file mode 100644 index c8be6251b5..0000000000 --- a/code/datums/components/decals/blood.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/component/decal/blood - dupe_mode = COMPONENT_DUPE_UNIQUE - -/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - . = ..() - RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name) - -/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) - var/atom/A = parent - - return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm index bf52296e2c..e2cca2eb50 100644 --- a/code/datums/components/edit_complainer.dm +++ b/code/datums/components/edit_complainer.dm @@ -3,7 +3,7 @@ var/list/say_lines /datum/component/edit_complainer/Initialize(list/text) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE var/static/list/default_lines = list( diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm new file mode 100644 index 0000000000..137a1bb864 --- /dev/null +++ b/code/datums/components/embedded.dm @@ -0,0 +1,363 @@ +/* + This component is responsible for handling individual instances of embedded objects. The embeddable element is what allows an item to be embeddable and stores its embedding stats, + and when it impacts and meets the requirements to stick into something, it instantiates an embedded component. Once the item falls out, the component is destroyed, while the + element survives to embed another day. + + There are 2 different things that can be embedded presently: carbons, and closed turfs (see: walls) + + - Carbon embedding has all the classical embedding behavior, and tracks more events and signals. The main behaviors and hooks to look for are: + -- Every process tick, there is a chance to randomly proc pain, controlled by pain_chance. There may also be a chance for the object to fall out randomly, per fall_chance + -- Every time the mob moves, there is a chance to proc jostling pain, controlled by jostle_chance (and only 50% as likely if the mob is walking or crawling) + -- Various signals hooking into carbon topic() and the embed removal surgery in order to handle removals. + + - Turf embedding is much simpler. All we do here is draw an overlay of the item's inhand on the turf, hide the item, and create an HTML link in the turf's inspect + that allows you to rip the item out. There's nothing dynamic about this, so far less checks. + + + In addition, there are 2 cases of embedding: embedding, and sticking + + - Embedding involves harmful and dangerous embeds, whether they cause brute damage, stamina damage, or a mix. This is the default behavior for embeddings, for when something is "pointy" + + - Sticking occurs when an item should not cause any harm while embedding (imagine throwing a sticky ball of tape at someone, rather than a shuriken). An item is considered "sticky" + when it has 0 for both pain multiplier and jostle pain multiplier. It's a bit arbitrary, but fairly straightforward. + + Stickables differ from embeds in the following ways: + -- Text descriptors use phrasing like "X is stuck to Y" rather than "X is embedded in Y" + -- There is no slicing sound on impact + -- All damage checks and bloodloss are skipped for carbons + -- Pointy objects create sparks when embedding into a turf + +*/ + + +/datum/component/embedded + dupe_mode = COMPONENT_DUPE_ALLOWED + var/obj/item/bodypart/limb + var/obj/item/weapon + + // all of this stuff is explained in _DEFINES/combat.dm + var/embed_chance // not like we really need it once we're already stuck in but hey + var/fall_chance + var/pain_chance + var/pain_mult + var/impact_pain_mult + var/remove_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + var/embed_chance_turf_mod + + ///if both our pain multiplier and jostle pain multiplier are 0, we're harmless and can omit most of the damage related stuff + var/harmful + var/mutable_appearance/overlay + +/datum/component/embedded/Initialize(obj/item/I, + datum/thrownthing/throwingdatum, + obj/item/bodypart/part, + embed_chance = EMBED_CHANCE, + fall_chance = EMBEDDED_ITEM_FALLOUT, + pain_chance = EMBEDDED_PAIN_CHANCE, + pain_mult = EMBEDDED_PAIN_MULTIPLIER, + remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, + ignore_throwspeed_threshold = FALSE, + jostle_chance = EMBEDDED_JOSTLE_CHANCE, + jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, + pain_stam_pct = EMBEDDED_PAIN_STAM_PCT, + embed_chance_turf_mod = EMBED_CHANCE_TURF_MOD) + + if((!iscarbon(parent) && !isclosedturf(parent)) || !isitem(I)) + return COMPONENT_INCOMPATIBLE + + if(part) + limb = part + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + src.impact_pain_mult = impact_pain_mult + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + src.embed_chance_turf_mod = embed_chance_turf_mod + + src.weapon = I + + if(!weapon.isEmbedHarmless()) + harmful = TRUE + + weapon.embedded(parent) + + if(iscarbon(parent)) + initCarbon() + else if(isclosedturf(parent)) + initTurf(throwingdatum) + +/datum/component/embedded/RegisterWithParent() + if(iscarbon(parent)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/jostleCheck) + RegisterSignal(parent, COMSIG_CARBON_EMBED_RIP, .proc/ripOutCarbon) + RegisterSignal(parent, COMSIG_CARBON_EMBED_REMOVAL, .proc/safeRemoveCarbon) + else if(isclosedturf(parent)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examineTurf) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/itemMoved) + +/datum/component/embedded/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_EMBED_RIP, COMSIG_CARBON_EMBED_REMOVAL, COMSIG_PARENT_EXAMINE)) + +/datum/component/embedded/process() + if(iscarbon(parent)) + processCarbon() + +/datum/component/embedded/Destroy() + if(weapon) + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + if(overlay) + var/atom/A = parent + A.cut_overlay(overlay, TRUE) + qdel(overlay) + + return ..() + +//////////////////////////////////////// +/////////////HUMAN PROCS//////////////// +//////////////////////////////////////// + +/// Set up an instance of embedding for a carbon. This is basically an extension of Initialize() so not much to say +/datum/component/embedded/proc/initCarbon() + START_PROCESSING(SSdcs, src) + var/mob/living/carbon/victim = parent + if(!istype(limb)) + limb = pick(victim.bodyparts) + + limb.embedded_objects |= weapon // on the inside... on the inside... + weapon.forceMove(victim) + RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), .proc/byeItemCarbon) + + if(harmful) + victim.visible_message("[weapon] embeds itself in [victim]'s [limb.name]!",ignored_mobs=victim) + to_chat(victim, "[weapon] embeds itself in your [limb.name]!") + victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + playsound(victim,'sound/weapons/bladeslice.ogg', 40) + weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! + var/damage = weapon.w_class * impact_pain_mult + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + else + victim.visible_message("[weapon] sticks itself to [victim]'s [limb.name]!",ignored_mobs=victim) + to_chat(victim, "[weapon] sticks itself to your [limb.name]!") + +/// Called every time a carbon with a harmful embed moves, rolling a chance for the item to cause pain. The chance is halved if the carbon is crawling or walking. +/datum/component/embedded/proc/jostleCheck() + var/mob/living/carbon/victim = parent + + var/chance = jostle_chance + if(victim.m_intent == MOVE_INTENT_WALK || !(victim.mobility_flags & MOBILITY_STAND)) + chance *= 0.5 + + if(harmful && prob(chance)) + var/damage = weapon.w_class * jostle_pain_mult + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + to_chat(victim, "[weapon] embedded in your [limb.name] jostles and stings!") + + +/// Called when then item randomly falls out of a carbon. This handles the damage and descriptors, then calls safe_remove() +/datum/component/embedded/proc/fallOutCarbon() + var/mob/living/carbon/victim = parent + + if(harmful) + var/damage = weapon.w_class * remove_pain_mult + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + victim.visible_message("[weapon] falls out of [victim.name]'s [limb.name]!", ignored_mobs=victim) + to_chat(victim, "[weapon] falls out of your [limb.name]!") + else + victim.visible_message("[weapon] falls off of [victim.name]'s [limb.name]!", ignored_mobs=victim) + to_chat(victim, "[weapon] falls off of your [limb.name]!") + + safeRemoveCarbon() + + +/// Called when a carbon with an object embedded/stuck to them inspects themselves and clicks the appropriate link to begin ripping the item out. This handles the ripping attempt, descriptors, and dealing damage, then calls safe_remove() +/datum/component/embedded/proc/ripOutCarbon(datum/source, obj/item/I, obj/item/bodypart/limb) + if(I != weapon || src.limb != limb) + return + + var/mob/living/carbon/victim = parent + var/time_taken = rip_time * weapon.w_class + + victim.visible_message("[victim] attempts to remove [weapon] from [victim.p_their()] [limb.name].","You attempt to remove [weapon] from your [limb.name]... (It will take [DisplayTimeText(time_taken)].)") + if(do_after(victim, time_taken, target = victim)) + if(!weapon || !limb || weapon.loc != victim || !(weapon in limb.embedded_objects)) + qdel(src) + return + + if(harmful) + var/damage = weapon.w_class * remove_pain_mult + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) //It hurts to rip it out, get surgery you dingus. + victim.emote("scream") + victim.visible_message("[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].") + else + victim.visible_message("[victim] successfully rips [weapon] off of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].") + + safeRemoveCarbon(TRUE) + + +/// This proc handles the final step and actual removal of an embedded/stuck item from a carbon, whether or not it was actually removed safely. +/// Pass TRUE for to_hands if we want it to go to the victim's hands when they pull it out +/datum/component/embedded/proc/safeRemoveCarbon(to_hands) + var/mob/living/carbon/victim = parent + limb.embedded_objects -= weapon + + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) // have to unhook these here so they don't also register as having disappeared + + if(!weapon) + if(!victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + qdel(src) + return + + if(weapon.unembedded()) // if it deleted itself + weapon = null + if(!victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + qdel(src) + return + + if(to_hands) + victim.put_in_hands(weapon) + else + weapon.forceMove(get_turf(victim)) + + if(!victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + qdel(src) + + +/// Something deleted or moved our weapon while it was embedded, how rude! +/datum/component/embedded/proc/byeItemCarbon() + var/mob/living/carbon/victim = parent + limb.embedded_objects -= weapon + UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + + if(victim) + to_chat(victim, "\The [weapon] that was embedded in your [limb.name] disappears!") + if(!victim.has_embedded_objects()) + victim.clear_alert("embeddedobject") + SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") + weapon = null + qdel(src) + + +/// Items embedded/stuck to carbons both check whether they randomly fall out (if applicable), as well as if the target mob and limb still exists. +/// Items harmfully embedded in carbons have an additional check for random pain (if applicable) +/datum/component/embedded/proc/processCarbon() + var/mob/living/carbon/victim = parent + + if(!victim || !limb) // in case the victim and/or their limbs exploded (say, due to a sticky bomb) + weapon.forceMove(get_turf(weapon)) + qdel(src) + + if(victim.stat == DEAD) + return + + var/damage = weapon.w_class * pain_mult + var/chance = pain_chance + if(pain_stam_pct && IS_STAMCRIT(victim)) //if it's a less-lethal embed, give them a break if they're already stamcritted + chance *= 0.3 + damage *= 0.7 + + if(harmful && prob(chance)) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + to_chat(victim, "[weapon] embedded in your [limb.name] hurts!") + + if(prob(fall_chance)) + fallOutCarbon() + + + +//////////////////////////////////////// +//////////////TURF PROCS//////////////// +//////////////////////////////////////// + +/// Turfs are much lower maintenance, since we don't care if they're in pain, but since they don't bleed or scream, we draw an overlay to show their status. +/// The only difference pointy/sticky items make here is text descriptors and pointy objects making a spark shower on impact. +/datum/component/embedded/proc/initTurf(datum/thrownthing/throwingdatum) + var/turf/closed/hit = parent + + // we can't store the item IN the turf (cause turfs are just kinda... there), so we fake it by making the item invisible and bailing if it moves due to a blast + weapon.forceMove(hit) + weapon.invisibility = INVISIBILITY_ABSTRACT + RegisterSignal(weapon, COMSIG_MOVABLE_MOVED, .proc/itemMoved) + + var/pixelX = rand(-2, 2) + var/pixelY = rand(-1, 3) // bias this upwards since in-hands are usually on the lower end of the sprite + + switch(throwingdatum.init_dir) + if(NORTH) + pixelY -= 2 + if(SOUTH) + pixelY += 2 + if(WEST) + pixelX += 2 + if(EAST) + pixelX -= 2 + + if(throwingdatum.init_dir in list(NORTH, WEST, NORTHWEST, SOUTHWEST)) + overlay = mutable_appearance(icon=weapon.righthand_file,icon_state=weapon.item_state) + else + overlay = mutable_appearance(icon=weapon.lefthand_file,icon_state=weapon.item_state) + + var/matrix/M = matrix() + M.Translate(pixelX, pixelY) + overlay.transform = M + hit.add_overlay(overlay, TRUE) + + if(harmful) + hit.visible_message("[weapon] embeds itself in [hit]!") + playsound(hit,'sound/weapons/bladeslice.ogg', 70) + + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(1, 1, parent) + sparks.attach(parent) + sparks.start() + else + hit.visible_message("[weapon] sticks itself to [hit]!") + + +/datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list) + if(harmful) + examine_list += "\t There is \a [weapon] embedded in [parent]!" + else + examine_list += "\t There is \a [weapon] stuck to [parent]!" + + +/// Someone is ripping out the item from the turf by hand +/datum/component/embedded/Topic(datum/source, href_list) + var/mob/living/us = usr + if(in_range(us, parent) && locate(href_list["embedded_object"]) == weapon) + if(harmful) + us.visible_message("[us] begins unwedging [weapon] from [parent].", "You begin unwedging [weapon] from [parent]...") + else + us.visible_message("[us] begins unsticking [weapon] from [parent].", "You begin unsticking [weapon] from [parent]...") + + if(do_after(us, 30, target = parent)) + us.put_in_hands(weapon) + weapon.unembedded() + qdel(src) + + +/// This proc handles if something knocked the invisible item loose from the turf somehow (probably an explosion). Just make it visible and say it fell loose, then get outta here. +/datum/component/embedded/proc/itemMoved() + weapon.invisibility = initial(weapon.invisibility) + weapon.visible_message("[weapon] falls loose from [parent].") + weapon.unembedded() + qdel(src) diff --git a/code/datums/components/empprotection.dm b/code/datums/components/empprotection.dm deleted file mode 100644 index c85cdf31c7..0000000000 --- a/code/datums/components/empprotection.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/component/empprotection - var/flags = NONE - -/datum/component/empprotection/Initialize(_flags) - if(!istype(parent, /atom)) - return COMPONENT_INCOMPATIBLE - flags = _flags - RegisterSignal(parent, list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags) - -/datum/component/empprotection/proc/getEmpFlags(datum/source, severity) - return flags diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 820208a319..2e5834c025 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -13,7 +13,7 @@ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/explodable_attack) RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, .proc/explodable_insert_item) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/detonate) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, .proc/explodable_impact) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/explodable_bump) if(isitem(parent)) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index a203264fae..8441f962f9 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -9,6 +9,7 @@ var/originalName var/list/affixes var/list/appliedComponents + var/list/appliedElements var/static/list/affixListing @@ -22,6 +23,7 @@ src.affixes = affixes appliedComponents = list() + appliedElements = list() randomAffixes() /datum/component/fantasy/Destroy() @@ -118,6 +120,8 @@ affix.remove(src) for(var/i in appliedComponents) qdel(i) + for(var/i in appliedElements) + master._RemoveElement(i) master.force = max(0, master.force - quality) master.throwforce = max(0, master.throwforce - quality) diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 702ec9329a..b6de85cab0 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -45,7 +45,8 @@ /datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent - comp.appliedComponents += master.AddComponent(/datum/component/tactical) + master.AddElement(/datum/element/tactical) + comp.appliedElements += list(/datum/element/tactical) return "tactical [newName]" /datum/fantasy_affix/pyromantic @@ -54,7 +55,7 @@ /datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent - comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10)) + comp.appliedComponents += master.AddComponent(/datum/component/igniter, clamp(comp.quality, 1, 10)) return "pyromantic [newName]" /datum/fantasy_affix/vampiric diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index f32ca50595..59328b9bc9 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -144,7 +144,7 @@ var/obj/item/projectile/picked_projectiletype = pickweight(weighted_projectile_types) var/obj/item/master = comp.parent - comp.appliedComponents += master.AddComponent(/datum/component/shrapnel, picked_projectiletype) + comp.appliedComponents += master.AddComponent(/datum/component/mirv, picked_projectiletype) return "[newName] of [initial(picked_projectiletype.name)] shrapnel" /datum/fantasy_affix/strength diff --git a/code/datums/components/field_of_vision.dm b/code/datums/components/field_of_vision.dm new file mode 100644 index 0000000000..5fb7b2596c --- /dev/null +++ b/code/datums/components/field_of_vision.dm @@ -0,0 +1,354 @@ +#define CENTERED_RENDER_SOURCE(img, atom, FoV) \ + atom.render_target = atom.render_target || ref(atom);\ + img.render_source = atom.render_target;\ + if(atom.icon){\ + var/_cached_sizes = FoV.width_n_height_offsets[atom.icon];\ + if(!_cached_sizes){\ + var/icon/_I = icon(atom.icon);\ + var/list/L = list();\ + L += (_I.Width() - world.icon_size)/2;\ + L += (_I.Height() - world.icon_size)/2;\ + _cached_sizes = FoV.width_n_height_offsets[atom.icon] = L\ + }\ + img.pixel_x = _cached_sizes[1];\ + img.pixel_y = _cached_sizes[2];\ + img.loc = atom\ + } + +#define REGISTER_NESTED_LOCS(source, list, comsig, proc) \ + for(var/k in get_nested_locs(source)){\ + var/atom/_A = k;\ + RegisterSignal(_A, comsig, proc);\ + list += _A\ + } + +#define UNREGISTER_NESTED_LOCS(list, comsig, index) \ + for(var/k in index to length(list)){\ + var/atom/_A = list[k];\ + UnregisterSignal(_A, comsig);\ + list -= _A\ + } + +/** + * Field of Vision component. Does totally what you probably think it does, + * ergo preventing players from seeing what's behind them. + */ +/datum/component/field_of_vision + can_transfer = TRUE + +/** + * That special invisible, almost neigh indestructible movable + * that holds both shadow cone mask and image and follows the player around. + */ + var/atom/movable/fov_holder/fov + ///The current screen size this field of vision is meant to fit for. + var/current_fov_size = list(15, 15) + ///How much is the cone rotated clockwise, purely backend. Please use rotate_shadow_cone() if you must. + var/angle = 0 + /// Used to scale the shadow cone when rotating it to fit over the edges of the screen. + var/rot_scale = 1 + /// The inner angle of this cone, right hardset to 90, 180, or 270 degrees, until someone figures out a way to make it dynamic. + var/shadow_angle = FOV_90_DEGREES + /// The mask portion of the cone, placed on a * render target plane so while not visible it still applies the filter. + var/image/shadow_mask + /// The visual portion of the cone, placed on the highest layer of the wall plane + var/image/visual_shadow +/** + * An image whose render_source is kept up to date to prevent the mob (or the topmost movable holding it) from being hidden by the mask. + * Will make it use vis_contents instead once a few byonds bugs with images and vis contents are fixed. + */ + var/image/owner_mask +/** + * A circle image used to somewhat uncover the adjacent portion of the shadow cone, making mobs and objects behind us somewhat visible. + * The owner mask is still required for those mob going over the default 32x32 px size btw. + */ + var/image/adj_mask + /// A list of nested locations the mob is in, to ensure the above image works correctly. + var/list/nested_locs = list() +/** + * A static list of offsets based on icon width and height, because render sources are centered unlike most other visuals, + * and that gives us some problems when the icon is larger or smaller than world.icon_size + */ + var/static/list/width_n_height_offsets = list() + +/datum/component/field_of_vision/Initialize(fov_type = FOV_90_DEGREES, _angle = 0) + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + angle = _angle + shadow_angle = fov_type + +/datum/component/field_of_vision/RegisterWithParent() + . = ..() + var/mob/M = parent + if(M.client) + generate_fov_holder(M, angle) + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGIN, .proc/on_mob_login) + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_mob_logout) + RegisterSignal(M, COMSIG_MOB_GET_VISIBLE_MESSAGE, .proc/on_visible_message) + RegisterSignal(M, COMSIG_MOB_EXAMINATE, .proc/on_examinate) + RegisterSignal(M, COMSIG_MOB_FOV_VIEW, .proc/on_fov_view) + RegisterSignal(M, COMSIG_MOB_CLIENT_CHANGE_VIEW, .proc/on_change_view) + RegisterSignal(M, COMSIG_MOB_RESET_PERSPECTIVE, .proc/on_reset_perspective) + RegisterSignal(M, COMSIG_MOB_FOV_VIEWER, .proc/is_viewer) + +/datum/component/field_of_vision/UnregisterFromParent() + . = ..() + var/mob/M = parent + if(!QDELETED(fov)) + if(M.client) + UnregisterSignal(M, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_MOVABLE_MOVED, COMSIG_MOB_DEATH, COMSIG_LIVING_REVIVE)) + M.client.images -= owner_mask + M.client.images -= shadow_mask + M.client.images -= visual_shadow + M.client.images -= adj_mask + qdel(fov, TRUE) // Forced. + fov = null + QDEL_NULL(owner_mask) + QDEL_NULL(adj_mask) + if(length(nested_locs)) + UNREGISTER_NESTED_LOCS(nested_locs, COMSIG_MOVABLE_MOVED, 1) + UnregisterSignal(M, list(COMSIG_MOB_CLIENT_LOGIN, COMSIG_MOB_CLIENT_LOGOUT, + COMSIG_MOB_GET_VISIBLE_MESSAGE, COMSIG_MOB_EXAMINATE, + COMSIG_MOB_FOV_VIEW, COMSIG_MOB_RESET_PERSPECTIVE, + COMSIG_MOB_CLIENT_CHANGE_VIEW, COMSIG_MOB_FOV_VIEWER)) + +/** + * Generates the holder and images (if not generated yet) and adds them to client.images. + * Run when the component is registered to a player mob, or upon login. + */ +/datum/component/field_of_vision/proc/generate_fov_holder(mob/M, _angle = 0) + if(QDELETED(fov)) + fov = new(get_turf(M)) + fov.icon_state = "[shadow_angle]" + fov.dir = M.dir + shadow_mask = image('icons/misc/field_of_vision.dmi', fov, "[shadow_angle]", FIELD_OF_VISION_LAYER) + shadow_mask.plane = FIELD_OF_VISION_PLANE + visual_shadow = image('icons/misc/field_of_vision.dmi', fov, "[shadow_angle]_v", FIELD_OF_VISION_LAYER) + visual_shadow.plane = FIELD_OF_VISION_VISUAL_PLANE + owner_mask = new + owner_mask.appearance_flags = RESET_TRANSFORM + owner_mask.plane = FIELD_OF_VISION_BLOCKER_PLANE + adj_mask = image('icons/misc/field_of_vision.dmi', fov, "adj_mask", FIELD_OF_VISION_LAYER) + adj_mask.appearance_flags = RESET_TRANSFORM + adj_mask.plane = FIELD_OF_VISION_BLOCKER_PLANE + if(_angle) + rotate_shadow_cone(_angle) + fov.alpha = M.stat == DEAD ? 0 : 255 + RegisterSignal(M, COMSIG_MOB_DEATH, .proc/hide_fov) + RegisterSignal(M, COMSIG_LIVING_REVIVE, .proc/show_fov) + RegisterSignal(M, COMSIG_ATOM_DIR_CHANGE, .proc/on_dir_change) + RegisterSignal(M, COMSIG_MOVABLE_MOVED, .proc/on_mob_moved) + RegisterSignal(M, COMSIG_ROBOT_UPDATE_ICONS, .proc/manual_centered_render_source) + var/atom/A = M + if(M.loc && !isturf(M.loc)) + REGISTER_NESTED_LOCS(M, nested_locs, COMSIG_MOVABLE_MOVED, .proc/on_loc_moved) + A = nested_locs[nested_locs.len] + CENTERED_RENDER_SOURCE(owner_mask, A, src) + M.client.images += shadow_mask + M.client.images += visual_shadow + M.client.images += owner_mask + M.client.images += adj_mask + if(M.client.view != "[current_fov_size[1]]x[current_fov_size[2]]") + resize_fov(current_fov_size, getviewsize(M.client.view)) + +///Rotates the shadow cone to a certain degree. Backend shenanigans. +/datum/component/field_of_vision/proc/rotate_shadow_cone(new_angle) + var/simple_degrees = SIMPLIFY_DEGREES(new_angle - angle) + var/to_scale = cos(simple_degrees) * sin(simple_degrees) + if(to_scale) + var/old_rot_scale = rot_scale + rot_scale = 1 + to_scale + if(old_rot_scale != rot_scale) + visual_shadow.transform = shadow_mask.transform = shadow_mask.transform.Scale(rot_scale/old_rot_scale) + visual_shadow.transform = shadow_mask.transform = shadow_mask.transform.Turn(fov.transform, simple_degrees) + +/** + * Resizes the shadow to match the current screen size. + * Run when the client view size is changed, or if the player has a viewsize different than "15x15" on login/comp registration. + */ +/datum/component/field_of_vision/proc/resize_fov(list/old_view, list/view) + current_fov_size = view + var/old_size = max(old_view[1], old_view[2]) + var/new_size = max(view[1], view[2]) + if(old_size == new_size) //longest edges are still of the same length. + return + visual_shadow.transform = shadow_mask.transform = shadow_mask.transform.Scale(new_size/old_size) + +/datum/component/field_of_vision/proc/on_mob_login(mob/source, client/client) + generate_fov_holder(source, angle) + +/datum/component/field_of_vision/proc/on_mob_logout(mob/source, client/client) + UnregisterSignal(source, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_MOVABLE_MOVED, COMSIG_MOB_DEATH, + COMSIG_LIVING_REVIVE, COMSIG_ROBOT_UPDATE_ICONS)) + if(length(nested_locs)) + UNREGISTER_NESTED_LOCS(nested_locs, COMSIG_MOVABLE_MOVED, 1) + +/datum/component/field_of_vision/proc/on_dir_change(mob/source, old_dir, new_dir) + fov.dir = new_dir + +///Hides the shadow, other visibility comsig procs will take it into account. Called when the mob dies. +/datum/component/field_of_vision/proc/hide_fov(mob/source) + fov.alpha = 0 + +/// Shows the shadow. Called when the mob is revived. +/datum/component/field_of_vision/proc/show_fov(mob/source) + fov.alpha = 255 + +/// Hides the shadow when looking through other items, shows it otherwise. +/datum/component/field_of_vision/proc/on_reset_perspective(mob/source, atom/target) + if(source.client.eye == source || source.client.eye == source.loc) + fov.alpha = 255 + else + fov.alpha = 0 + +/// Called when the client view size is changed. +/datum/component/field_of_vision/proc/on_change_view(mob/source, client, list/old_view, list/view) + resize_fov(old_view, view) + +/** + * Called when the owner mob moves around. Used to keep shadow located right behind us, + * As well as modify the owner mask to match the topmost item. + */ +/datum/component/field_of_vision/proc/on_mob_moved(mob/source, atom/oldloc, dir, forced) + var/turf/T + if(!isturf(source.loc)) //Recalculate all nested locations. + UNREGISTER_NESTED_LOCS( nested_locs, COMSIG_MOVABLE_MOVED, 1) + REGISTER_NESTED_LOCS(source, nested_locs, COMSIG_MOVABLE_MOVED, .proc/on_loc_moved) + var/atom/movable/topmost = nested_locs[nested_locs.len] + T = topmost.loc + CENTERED_RENDER_SOURCE(owner_mask, topmost, src) + else + T = source.loc + if(length(nested_locs)) + UNREGISTER_NESTED_LOCS(nested_locs, COMSIG_MOVABLE_MOVED, 1) + CENTERED_RENDER_SOURCE(owner_mask, source, src) + if(T) + fov.forceMove(T, harderforce = TRUE) + +/// Pretty much like the above, but meant for other movables the mob is stored in (bodybags, boxes, mechs etc). +/datum/component/field_of_vision/proc/on_loc_moved(atom/movable/source, atom/oldloc, dir, forced) + if(isturf(source.loc) && isturf(oldloc)) //This is the case of the topmost movable loc moving around the world, skip. + fov.forceMove(source.loc, harderforce = TRUE) + return + var/atom/movable/prev_topmost = nested_locs[nested_locs.len] + if(prev_topmost != source) + UNREGISTER_NESTED_LOCS(nested_locs, COMSIG_MOVABLE_MOVED, nested_locs.Find(source) + 1) + REGISTER_NESTED_LOCS(source, nested_locs, COMSIG_MOVABLE_MOVED, .proc/on_loc_moved) + var/atom/movable/topmost = nested_locs[nested_locs.len] + if(topmost != prev_topmost) + CENTERED_RENDER_SOURCE(owner_mask, topmost, src) + if(topmost.loc) + fov.forceMove(topmost.loc, harderforce = TRUE) + +/// A hacky comsig proc for things that somehow decide to change icon on the go. may make a change_icon_file() proc later but... +/datum/component/field_of_vision/proc/manual_centered_render_source(mob/source, old_icon) + if(!isturf(source.loc)) + return + CENTERED_RENDER_SOURCE(owner_mask, source, src) + +#undef CENTERED_RENDER_SOURCE +#undef REGISTER_NESTED_LOCS +#undef UNREGISTER_NESTED_LOCS + +/** + * Byond doc is not entirely correct on the integrated arctan() proc. + * When both x and y are negative, the output is also negative, cycling clockwise instead of counter-clockwise. + * That's also why I am extensively using the SIMPLIFY_DEGREES macro here. + * + * Overall this is the main macro that calculates wheter a target is within the shadow cone angle or not. + */ +#define FOV_ANGLE_CHECK(mob, target, zero_x_y_statement, success_statement) \ + var/turf/T1 = get_turf(target);\ + var/turf/T2 = get_turf(mob);\ + if(!T1 || !T2){\ + zero_x_y_statement\ + }\ + var/_x = (T1.x - T2.x);\ + var/_y = (T1.y - T2.y);\ + if(ISINRANGE(_x, -1, 1) && ISINRANGE(_y, -1, 1)){\ + zero_x_y_statement\ + }\ + var/dir = (mob.dir & (EAST|WEST)) || mob.dir;\ + var/_degree = -angle;\ + var/_half = shadow_angle/2;\ + switch(dir){\ + if(EAST){\ + _degree += 180;\ + }\ + if(NORTH){\ + _degree += 270;\ + }\ + if(SOUTH){\ + _degree += 90;\ + }\ + }\ + var/_min = SIMPLIFY_DEGREES(_degree - _half);\ + var/_max = SIMPLIFY_DEGREES(_degree + _half);\ + if((_min > _max) ? !ISINRANGE(SIMPLIFY_DEGREES(arctan(_x, _y)), _max, _min) : ISINRANGE(SIMPLIFY_DEGREES(arctan(_x, _y)), _min, _max)){\ + success_statement;\ + } + +/datum/component/field_of_vision/proc/on_examinate(mob/source, atom/target) + if(fov.alpha) + FOV_ANGLE_CHECK(source, target, return, return COMPONENT_DENY_EXAMINATE|COMPONENT_EXAMINATE_BLIND) + +/datum/component/field_of_vision/proc/on_visible_message(mob/source, atom/target, message, range, list/ignored_mobs) + if(fov.alpha) + FOV_ANGLE_CHECK(source, target, return, return COMPONENT_NO_VISIBLE_MESSAGE) + +/datum/component/field_of_vision/proc/on_fov_view(mob/source, list/atoms) + if(!fov.alpha) + return + for(var/k in atoms) + var/atom/A = k + FOV_ANGLE_CHECK(source, A, continue, atoms -= A) + +/datum/component/field_of_vision/proc/is_viewer(mob/source, atom/center, depth, list/viewers_list) + if(fov.alpha) + FOV_ANGLE_CHECK(source, center, return, viewers_list -= source) + +#undef FOV_ANGLE_CHECK + +/** + * The shadow cone's mask and visual images holder which can't locate inside the mob, + * lest they inherit the mob opacity and cause a lot of hindrance + */ +/atom/movable/fov_holder + name = "field of vision holder" + pixel_x = -224 //the image is about 480x480 px, ergo 15 tiles (480/32) big, and we gotta center it. + pixel_y = -224 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plane = FIELD_OF_VISION_PLANE + anchored = TRUE + +/atom/movable/fov_holder/ConveyorMove() + return + +/atom/movable/fov_holder/has_gravity(turf/T) + return FALSE + +/atom/movable/fov_holder/ex_act(severity) + return FALSE + +/atom/movable/fov_holder/singularity_act() + return + +/atom/movable/fov_holder/singularity_pull() + return + +/atom/movable/fov_holder/blob_act() + return + +/atom/movable/fov_holder/onTransitZ() + return + +/// Prevents people from moving these after creation, because they shouldn't be. +/atom/movable/fov_holder/forceMove(atom/destination, no_tp=FALSE, harderforce = FALSE) + if(harderforce) + return ..() + +/// Last but not least, these shouldn't be deleted by anything but the component itself +/atom/movable/fov_holder/Destroy(force = FALSE) + if(!force) + return QDEL_HINT_LETMELIVE + return ..() diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index fbf559fe35..f767c607a5 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -1,26 +1,52 @@ +///Footstep component. Plays footsteps at parents location when it is appropriate. /datum/component/footstep + ///How many steps the parent has taken since the last time a footstep was played var/steps = 0 + ///volume determines the extra volume of the footstep. This is multiplied by the base volume, should there be one. var/volume + ///e_range stands for extra range - aka how far the sound can be heard. This is added to the base value and ignored if there isn't a base value. var/e_range + ///footstep_type is a define which determines what kind of sounds should get chosen. + var/footstep_type + ///This can be a list OR a soundfile OR null. Determines whatever sound gets played. + var/footstep_sounds -/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1) +/datum/component/footstep/Initialize(footstep_type_ = FOOTSTEP_MOB_BAREFOOT, volume_ = 0.5, e_range_ = -1) if(!isliving(parent)) return COMPONENT_INCOMPATIBLE volume = volume_ e_range = e_range_ - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_footstep) + footstep_type = footstep_type_ + switch(footstep_type) + if(FOOTSTEP_MOB_HUMAN) + if(!ishuman(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/play_humanstep) + return + if(FOOTSTEP_MOB_CLAW) + footstep_sounds = GLOB.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + footstep_sounds = GLOB.barefootstep + if(FOOTSTEP_MOB_HEAVY) + footstep_sounds = GLOB.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + footstep_sounds = GLOB.footstep + if(FOOTSTEP_MOB_SLIME) + footstep_sounds = 'sound/effects/footstep/slime1.ogg' + if(FOOTSTEP_MOB_CRAWL) + footstep_sounds = 'sound/effects/footstep/crawl1.ogg' + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/play_simplestep) //Note that this doesn't get called for humans. -/datum/component/footstep/proc/play_footstep() +///Prepares a footstep. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open +/datum/component/footstep/proc/prepare_step() var/turf/open/T = get_turf(parent) if(!istype(T)) return var/mob/living/LM = parent - var/v = volume - var/e = e_range if(!T.footstep || LM.buckled || !CHECK_MOBILITY(LM, MOBILITY_STAND) || LM.buckled || LM.throwing || (LM.movement_type & (VENTCRAWLING | FLYING))) if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) + playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume) return if(HAS_TRAIT(LM, TRAIT_SILENT_STEP)) @@ -30,79 +56,83 @@ var/mob/living/carbon/C = LM if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG)) return - if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK) - v /= 2 - e -= 5 + if(C.m_intent == MOVE_INTENT_WALK) + return steps++ - if(steps >= 3) + if(steps >= 6) steps = 0 - else + if(steps % 2) return - if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around + if(steps != 0 && !LM.has_gravity(T)) // don't need to step as often when you hop around return + return T - //begin playsound shenanigans// - - //for barefooted non-clawed mobs like monkeys - if(isbarefoot(LM)) - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * v, - TRUE, - GLOB.barefootstep[T.barefootstep][3] + e) +/datum/component/footstep/proc/play_simplestep() + var/turf/open/T = prepare_step() + if(!T) return - - //for xenomorphs, dogs, and other clawed mobs - if(isclawfoot(LM)) - if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps - v /= 3 - e -= 5 - - playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]), - GLOB.clawfootstep[T.clawfootstep][2] * v, - TRUE, - GLOB.clawfootstep[T.clawfootstep][3] + e) + if(isfile(footstep_sounds) || istext(footstep_sounds)) + playsound(T, footstep_sounds, volume) return - - //for megafauna and other large and imtimidating mobs such as the bloodminer - if(isheavyfoot(LM)) - playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]), - GLOB.heavyfootstep[T.heavyfootstep][2] * v, - TRUE, - GLOB.heavyfootstep[T.heavyfootstep][3] + e) + var/turf_footstep + switch(footstep_type) + if(FOOTSTEP_MOB_CLAW) + turf_footstep = T.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + turf_footstep = T.barefootstep + if(FOOTSTEP_MOB_HEAVY) + turf_footstep = T.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + turf_footstep = T.footstep + if(!turf_footstep) return + playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range) - //for slimes - if(isslime(LM)) - playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v) +/datum/component/footstep/proc/play_humanstep() + var/turf/open/T = prepare_step() + if(!T) return - - //for (simple) humanoid mobs (clowns, russians, pirates, etc.) - if(isshoefoot(LM)) - if(!ishuman(LM)) - playsound(T, pick(GLOB.footstep[T.footstep][1]), - GLOB.footstep[T.footstep][2] * v, - TRUE, - GLOB.footstep[T.footstep][3] + e) - return - if(ishuman(LM)) //for proper humans, they're special - var/mob/living/carbon/human/H = LM - var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET))) - - if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v) + var/mob/living/carbon/human/H = parent + var/list/L = GLOB.barefootstep + var/turf_footstep = T.barefootstep + var/special = FALSE + if(H.physiology.footstep_type) + switch(H.physiology.footstep_type) + if(FOOTSTEP_MOB_CLAW) + turf_footstep = T.clawfootstep + L = GLOB.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + turf_footstep = T.barefootstep + L = GLOB.barefootstep + if(FOOTSTEP_MOB_HEAVY) + turf_footstep = T.heavyfootstep + L = GLOB.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + turf_footstep = T.footstep + L = GLOB.footstep + if(FOOTSTEP_MOB_SLIME) + playsound(T, 'sound/effects/footstep/slime1.ogg', 50 * volume) return + if(FOOTSTEP_MOB_CRAWL) + playsound(T, 'sound/effects/footstep/crawl1.ogg', 50 * volume) + return + special = TRUE + else + var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET))) + if(feetCover) //are we wearing shoes + playsound(T, pick(GLOB.footstep[T.footstep][1]), + GLOB.footstep[T.footstep][2] * volume, + TRUE, + GLOB.footstep[T.footstep][3] + e_range) + return - if(feetCover) //are we wearing shoes - playsound(T, pick(GLOB.footstep[T.footstep][1]), - GLOB.footstep[T.footstep][2] * v, - TRUE, - GLOB.footstep[T.footstep][3] + e) - - if(!feetCover) //are we NOT wearing shoes - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * v, - TRUE, - GLOB.barefootstep[T.barefootstep][3] + e) \ No newline at end of file + if(!special && H.dna.species.special_step_sounds) + playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE) + else + playsound(T, pick(L[turf_footstep][1]), + L[turf_footstep][2] * volume, + TRUE, + L[turf_footstep][3] + e_range) diff --git a/code/datums/components/forced_gravity.dm b/code/datums/components/forced_gravity.dm deleted file mode 100644 index 100bcf781c..0000000000 --- a/code/datums/components/forced_gravity.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/component/forced_gravity - var/gravity - var/ignore_space = FALSE //If forced gravity should also work on space turfs - -/datum/component/forced_gravity/Initialize(forced_value = 1) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_ATOM_HAS_GRAVITY, .proc/gravity_check) - if(isturf(parent)) - RegisterSignal(COMSIG_TURF_HAS_GRAVITY, .proc/turf_gravity_check) - - gravity = forced_value - -/datum/component/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs) - if(!ignore_space && isspaceturf(location)) - return - gravs += gravity - -/datum/component/forced_gravity/proc/turf_gravity_check(datum/source, atom/checker, list/gravs) - return gravity_check(parent, gravs) \ No newline at end of file diff --git a/code/datums/components/identification.dm b/code/datums/components/identification.dm new file mode 100644 index 0000000000..f7dc211504 --- /dev/null +++ b/code/datums/components/identification.dm @@ -0,0 +1,88 @@ +/** + * Identification components + */ +/datum/component/identification + /// General flags for how we should work. + var/identification_flags = NONE + /// General flags for what we should do. + var/identification_effect_flags = NONE + /// General flags for how we can be identified. + var/identification_method_flags = NONE + /// If this is set, show this on examine to the examiner if they know how to use it. + var/additional_examine_text = "You seem to know more about this item than others.." + /// Added to deconstructive analyzer say on success if set + var/deconstructor_reveal_text = "item operation instructions" + +/datum/component/identification/Initialize(id_flags, id_effect_flags, id_method_flags) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + . = ..() + if(. & COMPONENT_INCOMPATIBLE) + return + identification_flags = id_flags + identification_effect_flags = id_effect_flags + identification_method_flags = id_method_flags + +/datum/component/identification/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + if(identification_effect_flags & ID_COMPONENT_EFFECT_NO_ACTIONS) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) + if(identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) + RegisterSignal(parent, COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN, .proc/on_deconstructor_deepscan) + +/datum/component/identification/UnregisterFromParent() + var/list/unregister = list(COMSIG_PARENT_EXAMINE) + if(identification_effect_flags & ID_COMPONENT_EFFECT_NO_ACTIONS) + unregister += COMSIG_ITEM_EQUIPPED + if(identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) + unregister += COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN + UnregisterSignal(parent, unregister) + +/datum/component/identification/proc/on_examine(datum/source, mob/user, list/returnlist) + if(check_knowledge(user) != ID_COMPONENT_KNOWLEDGE_FULL) + return + if(!additional_examine_text) + return + returnlist += additional_examine_text + +/datum/component/identification/vv_edit_var(var_name, var_value) + // since i care SOOO much about memory optimization, we only register signals we need to + // so when someone vv's us, we should probably make sure we have the ones we need to with an update. + if((var_value == NAMEOF(src, identification_flags)) || (var_value == NAMEOF(src, identification_effect_flags)) || (var_value == NAMEOF(src, identification_method_flags))) + UnregisterFromParent() + . = ..() + if((var_value == NAMEOF(src, identification_flags)) || (var_value == NAMEOF(src, identification_effect_flags)) || (var_value == NAMEOF(src, identification_method_flags))) + RegisterWithParent() + +/datum/component/identification/proc/on_equip(datum/source, mob/user) + if(check_knowledge(user) == ID_COMPONENT_KNOWLEDGE_FULL) + return + if(identification_method_flags & ID_COMPONENT_EFFECT_NO_ACTIONS) + return COMPONENT_NO_GRANT_ACTIONS + +/datum/component/identification/proc/check_knowledge(mob/user) + return ID_COMPONENT_KNOWLEDGE_NONE + +/datum/component/identification/proc/on_identify(mob/user) + if(identification_flags & ID_COMPONENT_DEL_ON_IDENTIFY) + qdel(src) + +/datum/component/identification/proc/on_deconstructor_deepscan(datum/source, obj/machinery/rnd/destructive_analyzer/analyzer, mob/user, list/information = list()) + if((identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) && !(identification_flags & ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED)) + identification_flags |= ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED + on_identify(user) + if(deconstructor_reveal_text) + information += deconstructor_reveal_text + return COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION + +/** + * Identification component subtype - Syndicate + * + * Checks if the user is a traitor. + */ +/datum/component/identification/syndicate + +/datum/component/identification/syndicate/check_knowledge(mob/user) + . = ..() + if(user?.mind?.has_antag_datum(/datum/antagonist/traitor)) + . = max(., ID_COMPONENT_KNOWLEDGE_FULL) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index ad2b7ded14..8d3c6ab81f 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -13,7 +13,7 @@ expire_time = world.time + expire_in QDEL_IN(src, expire_in) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) diff --git a/code/datums/components/knockback.dm b/code/datums/components/knockback.dm index 988a0e575e..bd0d5ae352 100644 --- a/code/datums/components/knockback.dm +++ b/code/datums/components/knockback.dm @@ -1,13 +1,18 @@ /datum/component/knockback + /// distance the atom will be thrown var/throw_distance + /// whether this can throw anchored targets (tables, etc) var/throw_anchored + /// whether this is a gentle throw (default false means people thrown into walls are stunned / take damage) + var/throw_gentle -/datum/component/knockback/Initialize(throw_distance=1) +/datum/component/knockback/Initialize(throw_distance=1, throw_gentle=FALSE) if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent)) return COMPONENT_INCOMPATIBLE src.throw_distance = throw_distance src.throw_anchored = throw_anchored + src.throw_gentle = throw_gentle /datum/component/knockback/RegisterWithParent() . = ..() @@ -22,19 +27,31 @@ . = ..() UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) +/// triggered after an item attacks something /datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) if(!proximity_flag) return do_knockback(target, user, get_dir(source, target)) +/// triggered after a hostile simplemob attacks something /datum/component/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target) do_knockback(target, attacker, get_dir(attacker, target)) +/// triggered after a projectile hits something /datum/component/knockback/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) do_knockback(target, null, angle2dir(Angle)) + +/** + * Throw a target in a direction + * + * Arguments: + * * target - Target atom to throw + * * thrower - Thing that caused this atom to be thrown + * * throw_dir - Direction to throw the atom + */ /datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir) - if(!ismovableatom(target) || throw_dir == null) + if(!ismovable(target) || throw_dir == null) return var/atom/movable/throwee = target if(throwee.anchored && !throw_anchored) @@ -43,4 +60,4 @@ throw_dir = turn(throw_dir, 180) throw_distance *= -1 var/atom/throw_target = get_edge_target_turf(throwee, throw_dir) - throwee.safe_throw_at(throw_target, throw_distance, 1, thrower) + throwee.safe_throw_at(throw_target, throw_distance, 1, thrower) //, gentle = throw_gentle) diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index 045611ab9d..2f4401862d 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -47,14 +47,11 @@ if(icon_state) lock_icon_state = icon_state generate_lock_visuals() - var/mob/M = parent - LAZYOR(M.mousemove_intercept_objects, src) + RegisterSignal(parent, COMSIG_MOB_CLIENT_MOUSEMOVE, .proc/onMouseMove) START_PROCESSING(SSfastprocess, src) /datum/component/lockon_aiming/Destroy() - var/mob/M = parent clear_visuals() - LAZYREMOVE(M.mousemove_intercept_objects, src) STOP_PROCESSING(SSfastprocess, src) return ..() @@ -120,7 +117,7 @@ return LAZYREMOVE(immune_weakrefs, A.weak_reference) -/datum/component/lockon_aiming/onMouseMove(object,location,control,params) +/datum/component/lockon_aiming/proc/onMouseMove(object,location,control,params) var/mob/M = parent if(!istype(M) || !M.client) return diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index c7e59e0ead..181b24260b 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -2,7 +2,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/crossed_react) RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/uncrossed_react) for(var/i in get_turf(parent)) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 2f411ff37f..51dc4ee8f7 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -73,7 +73,7 @@ if(!material_amount) to_chat(user, "[I] does not contain sufficient materials to be accepted by [parent].") return - if(!has_space(material_amount)) + if((!precise_insertion || !GLOB.typecache_stack[I.type]) && !has_space(material_amount)) to_chat(user, "[parent] has not enough space. Please remove materials from [parent] in order to insert more.") return user_insert(I, user) diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm index 20e3b317ec..56b41533f5 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -14,8 +14,8 @@ var/x = target.x var/y = target.y var/z = target.z - var/turf/southwest = locate(CLAMP(x - (direction & WEST ? range : 0), 1, world.maxx), CLAMP(y - (direction & SOUTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) - var/turf/northeast = locate(CLAMP(x + (direction & EAST ? range : 0), 1, world.maxx), CLAMP(y + (direction & NORTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) + var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) + var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) //holder.vis_contents += block(southwest, northeast) // This doesnt work because of beta bug memes for(var/i in block(southwest, northeast)) holder.vis_contents += i @@ -39,4 +39,5 @@ /obj/effect/abstract/mirage_holder name = "Mirage holder" anchored = TRUE + plane = PLANE_SPACE mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/datums/components/shrapnel.dm b/code/datums/components/mirv.dm similarity index 70% rename from code/datums/components/shrapnel.dm rename to code/datums/components/mirv.dm index 4d1fe21b95..2a1663776c 100644 --- a/code/datums/components/shrapnel.dm +++ b/code/datums/components/mirv.dm @@ -1,36 +1,37 @@ - -/datum/component/shrapnel +/datum/component/mirv var/projectile_type var/radius // shoots a projectile for every turf on this radius from the hit target var/override_projectile_range -/datum/component/shrapnel/Initialize(projectile_type, radius=1, override_projectile_range) - if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent)) +/datum/component/mirv/Initialize(projectile_type, radius=1, override_projectile_range) + if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent) && !isgrenade(parent)) return COMPONENT_INCOMPATIBLE src.projectile_type = projectile_type src.radius = radius src.override_projectile_range = override_projectile_range + if(isgrenade(parent)) + parent.AddComponent(/datum/component/pellet_cloud, projectile_type=projectile_type) -/datum/component/shrapnel/RegisterWithParent() +/datum/component/mirv/RegisterWithParent() . = ..() if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) -/datum/component/shrapnel/UnregisterFromParent() +/datum/component/mirv/UnregisterFromParent() . = ..() UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT)) -/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) +/datum/component/mirv/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) do_shrapnel(firer, target) -/datum/component/shrapnel/proc/do_shrapnel(mob/firer, atom/target) +/datum/component/mirv/proc/do_shrapnel(mob/firer, atom/target) if(radius < 1) return var/turf/target_turf = get_turf(target) for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target)) - var/obj/item/projectile/P = new projectile_type(target_turf) + var/obj/item/projectile/P = new projectile_type(target_turf) //Shooting Code: P.range = radius+1 if(override_projectile_range) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 5e9382f88e..90fea9ec8a 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -1,40 +1,52 @@ +#define ECSTATIC_SANITY_PEN -1 +#define SLIGHT_INSANITY_PEN 1 #define MINOR_INSANITY_PEN 5 #define MAJOR_INSANITY_PEN 10 +#define MOOD_INSANITY_MALUS 0.13 // 13% debuff per sanity_level above the default of 4 (higher is worser), overall a 39% debuff to skills at rock bottom depression. /datum/component/mood var/mood //Real happiness var/sanity = 100 //Current sanity var/shown_mood //Shown happiness, this is what others can see when they try to examine you, prevents antag checking by noticing traitors are always very happy. var/mood_level = 5 //To track what stage of moodies they're on - var/sanity_level = 5 //To track what stage of sanity they're on + var/sanity_level = 3 //To track what stage of sanity they're on var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets var/list/datum/mood_event/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? var/obj/screen/mood/screen_obj + var/datum/skill_modifier/bad_mood/malus + var/datum/skill_modifier/great_mood/bonus + var/static/malus_id = 0 + var/static/list/free_maluses = list() /datum/component/mood/Initialize() if(!isliving(parent)) return COMPONENT_INCOMPATIBLE - START_PROCESSING(SSmood, src) + var/mob/living/owner = parent + if(owner.stat != DEAD) + START_PROCESSING(SSobj, src) RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) RegisterSignal(parent, COMSIG_MODIFY_SANITY, .proc/modify_sanity) RegisterSignal(parent, COMSIG_LIVING_REVIVE, .proc/on_revive) - RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) - var/mob/living/owner = parent + RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/stop_processing) + if(owner.hud_used) modify_hud() var/datum/hud/hud = owner.hud_used hud.show_hud(hud.hud_version) /datum/component/mood/Destroy() - STOP_PROCESSING(SSmood, src) + STOP_PROCESSING(SSobj, src) unmodify_hud() return ..() +/datum/component/mood/proc/stop_processing() + STOP_PROCESSING(SSobj, src) + /datum/component/mood/proc/print_mood(mob/user) var/msg = "*---------*\nYour current mood\n" msg += "My mental status: " //Long term @@ -126,7 +138,7 @@ else screen_obj.icon_state = "mood[mood_level]" -/datum/component/mood/process() //Called on SSmood process +/datum/component/mood/process() //Called on SSobj process if(QDELETED(parent)) // workaround to an obnoxious sneaky periodical runtime. qdel(src) return @@ -150,7 +162,7 @@ if(8) setSanity(sanity+0.25, maximum=SANITY_GREAT) if(9) - setSanity(sanity+0.4, maximum=SANITY_GREAT) + setSanity(sanity+0.4, maximum=SANITY_AMAZING) HandleNutrition(owner) @@ -172,41 +184,69 @@ else sanity = amount + var/old_sanity_level = sanity_level switch(sanity) if(-INFINITY to SANITY_CRAZY) setInsanityEffect(MAJOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1.5) //Did we change something ? movetypes is runtiming, movetypes=(~FLYING)) + master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane) sanity_level = 6 if(SANITY_CRAZY to SANITY_UNSTABLE) setInsanityEffect(MINOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=1)//, movetypes=(~FLYING)) + master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/crazy) sanity_level = 5 if(SANITY_UNSTABLE to SANITY_DISTURBED) - setInsanityEffect(0) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5)//, movetypes=(~FLYING)) + setInsanityEffect(SLIGHT_INSANITY_PEN) + master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed) sanity_level = 4 if(SANITY_DISTURBED to SANITY_NEUTRAL) setInsanityEffect(0) - master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) sanity_level = 3 if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences setInsanityEffect(0) - master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) sanity_level = 2 if(SANITY_GREAT+1 to INFINITY) - setInsanityEffect(0) - master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + setInsanityEffect(ECSTATIC_SANITY_PEN) //It's not a penalty but w/e + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY) sanity_level = 1 + + if(sanity_level != old_sanity_level) + if(sanity_level >= 4) + if(!malus) + if(!length(free_maluses)) + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/bad_mood, malus_id++, master, malus) + else + malus = pick_n_take(free_maluses) + if(master.mind) + master.mind.add_skill_modifier(malus.identifier) + else + malus.RegisterSignal(master, COMSIG_MOB_ON_NEW_MIND, /datum/skill_modifier.proc/on_mob_new_mind, TRUE) + malus.value_mod = malus.level_mod = 1 - (sanity_level - 3) * MOOD_INSANITY_MALUS + else if(malus) + if(master.mind) + master.mind.remove_skill_modifier(malus.identifier) + else + malus.UnregisterSignal(master, COMSIG_MOB_ON_NEW_MIND) + free_maluses += malus + malus = null + //update_mood_icon() /datum/component/mood/proc/setInsanityEffect(newval)//More code so that the previous proc works if(newval == insanity_effect) return - //var/mob/living/master = parent - //master.crit_threshold = (master.crit_threshold - insanity_effect) + newval + + var/mob/living/L = parent + if(newval == ECSTATIC_SANITY_PEN && !bonus) + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/great_mood, null, L, bonus) + else if(bonus) + REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/great_mood, null, L) + bonus = null + insanity_effect = newval -/datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = -INFINITY, maximum = INFINITY) +/datum/component/mood/proc/modify_sanity(datum/source, amount, minimum = SANITY_INSANE, maximum = SANITY_AMAZING) setSanity(sanity + amount, minimum, maximum) /datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger. @@ -281,12 +321,38 @@ if(0 to NUTRITION_LEVEL_STARVING) add_event(null, "nutrition", /datum/mood_event/starving) -///Called when parent is ahealed. +/datum/component/mood/proc/update_beauty(area/A) + if(A.outdoors) //if we're outside, we don't care. + clear_event(null, "area_beauty") + return FALSE + if(HAS_TRAIT(parent, TRAIT_SNOB)) + switch(A.beauty) + if(-INFINITY to BEAUTY_LEVEL_HORRID) + add_event(null, "area_beauty", /datum/mood_event/horridroom) + return + if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD) + add_event(null, "area_beauty", /datum/mood_event/badroom) + return + switch(A.beauty) + if(-INFINITY to BEAUTY_LEVEL_DECENT) + clear_event(null, "area_beauty") + if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD) + add_event(null, "area_beauty", /datum/mood_event/decentroom) + if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT) + add_event(null, "area_beauty", /datum/mood_event/goodroom) + if(BEAUTY_LEVEL_GREAT to INFINITY) + add_event(null, "area_beauty", /datum/mood_event/greatroom) + +///Called when parent is revived. /datum/component/mood/proc/on_revive(datum/source, full_heal) + START_PROCESSING(SSobj, src) if(!full_heal) return remove_temp_moods() setSanity(initial(sanity)) +#undef ECSTATIC_SANITY_PEN +#undef SLIGHT_INSANITY_PEN #undef MINOR_INSANITY_PEN #undef MAJOR_INSANITY_PEN +#undef MOOD_INSANITY_MALUS diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 7aacb745b6..29add286be 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -12,7 +12,7 @@ var/list/datum/nanite_program/programs = list() var/max_programs = NANITE_PROGRAM_LIMIT - var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when cheking for conflicts + var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when checking for conflicts var/start_time = 0 ///Timestamp to when the nanites were first inserted in the host var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners @@ -175,7 +175,7 @@ return (nanite_volume > 0) /datum/component/nanites/proc/adjust_nanites(datum/source, amount) - nanite_volume = CLAMP(nanite_volume + amount, 0, max_nanites) + nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) if(nanite_volume <= 0) //oops we ran out qdel(src) @@ -187,7 +187,7 @@ if(remove || stealth) return //bye icon var/nanite_percent = (nanite_volume / max_nanites) * 100 - nanite_percent = CLAMP(CEILING(nanite_percent, 10), 10, 100) + nanite_percent = clamp(CEILING(nanite_percent, 10), 10, 100) holder.icon_state = "nanites[nanite_percent]" /datum/component/nanites/proc/on_emp(datum/source, severity) @@ -249,13 +249,13 @@ return FALSE /datum/component/nanites/proc/set_volume(datum/source, amount) - nanite_volume = CLAMP(amount, 0, max_nanites) + nanite_volume = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_max_volume(datum/source, amount) max_nanites = max(1, max_nanites) /datum/component/nanites/proc/set_cloud(datum/source, amount) - cloud_id = CLAMP(amount, 0, 100) + cloud_id = clamp(amount, 0, 100) /datum/component/nanites/proc/set_cloud_sync(datum/source, method) switch(method) @@ -267,7 +267,7 @@ cloud_active = TRUE /datum/component/nanites/proc/set_safety(datum/source, amount) - safety_threshold = CLAMP(amount, 0, max_nanites) + safety_threshold = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_regen(datum/source, amount) regen_rate = amount diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm new file mode 100644 index 0000000000..3ea7677710 --- /dev/null +++ b/code/datums/components/omen.dm @@ -0,0 +1,74 @@ +/** + * omen.dm: For when you want someone to have a really bad day + * + * When you attach an omen component to someone, they start running the risk of all sorts of bad environmental injuries, like nearby vending machines randomly falling on you, + * or hitting your head really hard when you slip and fall, or... well, for now those two are all I have. More will come. + * + * Omens are removed once the victim is either maimed by one of the possible injuries, or if they receive a blessing (read: bashing with a bible) from the chaplain. + */ +/datum/component/omen + dupe_mode = COMPONENT_DUPE_UNIQUE + + /// Whatever's causing the omen, if there is one. Destroying the vessel won't stop the omen, but we destroy the vessel (if one exists) upon the omen ending + var/obj/vessel + +/datum/component/omen/Initialize(silent=FALSE, vessel) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/person = parent + if(!silent) + to_chat(person, "You get a bad feeling...") + src.vessel = vessel + +/datum/component/omen/Destroy(force, silent) + if(vessel) + vessel.visible_message("[vessel] burns up in a sinister flash, taking an evil energy with it...") + vessel = null + return ..() + +/datum/component/omen/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/check_accident) + RegisterSignal(parent, COMSIG_LIVING_STATUS_KNOCKDOWN, .proc/check_slip) + RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/check_bless) + +/datum/component/omen/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED, COMSIG_ADD_MOOD_EVENT)) + +/** + * check_accident() is called each step we take + * + * While we're walking around, roll to see if there's any environmental hazards (currently only vending machines) on one of the adjacent tiles we can trigger. + * We do the prob() at the beginning to A. add some tension for /when/ it will strike, and B. (more importantly) ameliorate the fact that we're checking up to 5 turfs's contents each time + */ +/datum/component/omen/proc/check_accident(atom/movable/our_guy) + if(!prob(15)) + return + for(var/t in get_adjacent_open_turfs(our_guy)) + var/turf/the_turf = t + for(var/obj/machinery/vending/darth_vendor in the_turf) + if(darth_vendor.tiltable) + darth_vendor.tilt(our_guy) + qdel(src) + return + +/// If we get knocked down, see if we have a really bad slip and bash our head hard +/datum/component/omen/proc/check_slip(mob/living/our_guy, amount) + if(amount <= 0 || prob(50)) // 50% chance to bonk our head + return + + var/obj/item/bodypart/the_head = our_guy.get_bodypart(BODY_ZONE_HEAD) + if(!the_head) + return + + playsound(get_turf(our_guy), "sound/effects/tableheadsmash.ogg", 90, TRUE) + our_guy.visible_message("[our_guy] hits [our_guy.p_their()] head really badly falling down!", "You hit your head really badly falling down!") + the_head.receive_damage(75) + our_guy.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) + qdel(src) + +/// Hijack the mood system to see if we get the blessing mood event to cancel the omen +/datum/component/omen/proc/check_bless(mob/living/our_guy, category) + if(category != "blessing") + return + to_chat(our_guy, "You feel a horrible omen lifted off your shoulders!") + qdel(src) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 2be22d01e5..53373de6d7 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -22,14 +22,14 @@ /datum/component/orbiter/RegisterWithParent() . = ..() var/atom/target = parent - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) target = target.loc /datum/component/orbiter/UnregisterFromParent() . = ..() var/atom/target = parent - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc @@ -62,7 +62,9 @@ orbiters[orbiter] = TRUE orbiter.orbiting = src RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react) + var/matrix/initial_transform = matrix(orbiter.transform) + orbiters[orbiter] = initial_transform // Head first! if(pre_rotation) @@ -79,8 +81,6 @@ orbiter.SpinAnimation(rotation_speed, -1, clockwise, rotation_segments, parallel = FALSE) - //we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit - orbiter.transform = initial_transform orbiter.forceMove(get_turf(parent)) to_chat(orbiter, "Now orbiting [parent].") @@ -89,6 +89,8 @@ return UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) orbiter.SpinAnimation(0, 0) + if(istype(orbiters[orbiter],/matrix)) //This is ugly. + orbiter.transform = orbiters[orbiter] orbiters -= orbiter orbiter.stop_orbit(src) orbiter.orbiting = null @@ -111,12 +113,12 @@ // These are prety rarely activated, how often are you following something in a bag? if(oldloc && !isturf(oldloc)) // We used to be registered to it, probably var/atom/target = oldloc - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc if(orbited?.loc && orbited.loc != newturf) // We want to know when anything holding us moves too var/atom/target = orbited.loc - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) target = target.loc diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm new file mode 100644 index 0000000000..938d9f5f56 --- /dev/null +++ b/code/datums/components/pellet_cloud.dm @@ -0,0 +1,283 @@ +/* + * This component is used when you want to create a bunch of shrapnel or projectiles (say, shrapnel from a fragmentation grenade, or buckshot from a shotgun) from a central point, + * without necessarily printing a separate message for every single impact. This component should be instantiated right when you need it (like the moment of firing), then activated + * by signal. + * + * Pellet cloud currently works on two classes of sources: directed (ammo casings), and circular (grenades, landmines). + * -Directed: This means you're shooting multiple pellets, like buckshot. If an ammo casing is defined as having multiple pellets, it will automatically create a pellet cloud + * and call COMSIG_PELLET_CLOUD_INIT (see [/obj/item/ammo_casing/proc/fire_casing]). Thus, the only projectiles fired will be the ones fired here. + * The magnitude var controls how many pellets are created. + * -Circular: This results in a big spray of shrapnel flying all around the detonation point when the grenade fires COMSIG_GRENADE_PRIME or landmine triggers COMSIG_MINE_TRIGGERED. + * The magnitude var controls how big the detonation radius is (the bigger the magnitude, the more shrapnel is created). Grenades can be covered with bodies to reduce shrapnel output. + * + * Once all of the fired projectiles either hit a target or disappear due to ranging out/whatever else, we resolve the list of all the things we hit and print aggregate messages so we get + * one "You're hit by 6 buckshot pellets" vs 6x "You're hit by the buckshot blah blah" messages. + * + * Note that this is how all guns handle shooting ammo casings with multiple pellets, in case such a thing comes up. +*/ + +/datum/component/pellet_cloud + /// What's the projectile path of the shrapnel we're shooting? + var/projectile_type + + /// How many shrapnel projectiles are we responsible for tracking? May be reduced for grenades if someone dives on top of it. Defined by ammo casing for casings, derived from magnitude otherwise + var/num_pellets + /// For grenades/landmines, how big is the radius of turfs we're targeting? Note this does not effect the projectiles range, only how many we generate + var/radius = 4 + + /// The list of pellets we're responsible for tracking, once these are all accounted for, we finalize. + var/list/pellets = list() + /// An associated list with the atom hit as the key and how many pellets they've eaten for the value, for printing aggregate messages + var/list/targets_hit = list() + /// For grenades, any /mob/living's the grenade is moved onto, see [/datum/component/pellet_cloud/proc/handle_martyrs()] + var/list/bodies + /// For grenades, tracking people who die covering a grenade for achievement purposes, see [/datum/component/pellet_cloud/proc/handle_martyrs()] + var/list/purple_hearts + + /// For grenades, tracking how many pellets are removed due to martyrs and how many pellets are added due to the last person to touch it being on top of it + var/pellet_delta = 0 + /// how many pellets ranged out without hitting anything + var/terminated + /// how many pellets impacted something + var/hits + /// If the parent tried deleting and we're not done yet, we send it to nullspace then delete it after + var/queued_delete = FALSE + + /// for if we're an ammo casing being fired + var/mob/living/shooter + +/datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) + if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent)) + return COMPONENT_INCOMPATIBLE + + if(magnitude < 1) + stack_trace("Invalid magnitude [magnitude] < 1 on pellet_cloud, parent: [parent]") + magnitude = 1 + + src.projectile_type = projectile_type + + if(isammocasing(parent)) + num_pellets = magnitude + else if(isgrenade(parent) || islandmine(parent)) + radius = magnitude + +/datum/component/pellet_cloud/Destroy(force, silent) + purple_hearts = null + pellets = null + targets_hit = null + bodies = null + return ..() + +/datum/component/pellet_cloud/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/nullspace_parent) + if(isammocasing(parent)) + RegisterSignal(parent, COMSIG_PELLET_CLOUD_INIT, .proc/create_casing_pellets) + else if(isgrenade(parent)) + RegisterSignal(parent, COMSIG_GRENADE_ARMED, .proc/grenade_armed) + RegisterSignal(parent, COMSIG_GRENADE_PRIME, .proc/create_blast_pellets) + else if(islandmine(parent)) + RegisterSignal(parent, COMSIG_MINE_TRIGGERED, .proc/create_blast_pellets) + +/datum/component/pellet_cloud/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNCROSSED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) + +/** + * create_casing_pellets() is for directed pellet clouds for ammo casings that have multiple pellets (buckshot and scatter lasers for instance) + * + * Honestly this is mostly just a rehash of [/obj/item/ammo_casing/proc/fire_casing()] for pellet counts > 1, except this lets us tamper with the pellets and hook onto them for tracking purposes. + * The arguments really don't matter, this proc is triggered by COMSIG_PELLET_CLOUD_INIT which is only for this really, it's just a big mess of the state vars we need for doing the stuff over here. + */ +/datum/component/pellet_cloud/proc/create_casing_pellets(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro) + shooter = user + var/targloc = get_turf(target) + if(!zone_override) + zone_override = shooter.zone_selected + + for(var/i in 1 to num_pellets) + shell.ready_proj(target, user, SUPPRESSED_VERY, zone_override, fired_from) + if(distro) + if(randomspread) + spread = round((rand() - 0.5) * distro) + else //Smart spread + spread = round((i / num_pellets - 0.5) * distro) + + RegisterSignal(shell.BB, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit) + RegisterSignal(shell.BB, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), .proc/pellet_range) + pellets += shell.BB + if(!shell.throw_proj(target, targloc, shooter, params, spread)) + return + if(i != num_pellets) + shell.newshot() + +/** + * create_blast_pellets() is for when we have a central point we want to shred the surroundings of with a ring of shrapnel, namely frag grenades and landmines. + * + * Note that grenades have extra handling for someone throwing themselves/being thrown on top of it, while landmines do not (obviously, it's a landmine!). See [/datum/component/pellet_cloud/proc/handle_martyrs()] + */ +/datum/component/pellet_cloud/proc/create_blast_pellets(obj/O, mob/living/lanced_by) + var/atom/A = parent + + if(isgrenade(parent)) // handle_martyrs can reduce the radius and thus the number of pellets we produce if someone dives on top of a frag grenade + handle_martyrs(lanced_by) // note that we can modify radius in this proc + + if(radius < 1) + return + + var/list/all_the_turfs_were_gonna_lacerate = RANGE_TURFS(radius, A) - RANGE_TURFS(radius-1, A) + num_pellets = all_the_turfs_were_gonna_lacerate.len + pellet_delta + + for(var/T in all_the_turfs_were_gonna_lacerate) + var/turf/shootat_turf = T + pew(shootat_turf) + +/** + * handle_martyrs() is used for grenades that shoot shrapnel to check if anyone threw themselves/were thrown on top of the grenade, thus absorbing a good chunk of the shrapnel + * + * Between the time the grenade is armed and the actual detonation, we set var/list/bodies to the list of mobs currently on the new tile, as if the grenade landed on top of them, tracking if any of them move off the tile and removing them from the "under" list + * Once the grenade detonates, handle_martyrs() is called and gets all the new mobs on the tile, and add the ones not in var/list/bodies to var/list/martyrs + * We then iterate through the martyrs and reduce the shrapnel magnitude for each mob on top of it, shredding each of them with some of the shrapnel they helped absorb. This can snuff out all of the shrapnel if there's enough bodies + * + * Note we track anyone who's alive and client'd when they get shredded in var/list/purple_hearts, for achievement checking later + */ +/datum/component/pellet_cloud/proc/handle_martyrs(mob/living/lanced_by) + var/magnitude_absorbed + var/list/martyrs = list() + + var/self_harm_radius_mult = 3 + + if(lanced_by && prob(60)) + to_chat(lanced_by, "Your plan to whack someone with a grenade on a stick backfires on you, literally!") + self_harm_radius_mult = 1 // we'll still give the guy who got hit some extra shredding, but not 3*radius + pellet_delta += radius + for(var/i in 1 to radius) + pew(lanced_by) // thought you could be tricky and lance someone with no ill effects!! + + for(var/mob/living/body in get_turf(parent)) + if(body == shooter) + pellet_delta += radius * self_harm_radius_mult + for(var/i in 1 to radius * self_harm_radius_mult) + pew(body) // free shrapnel if it goes off in your hand, and it doesn't even count towards the absorbed. fun! + else if(!(body in bodies)) + martyrs += body // promoted from a corpse to a hero + + for(var/M in martyrs) + var/mob/living/martyr = M + if(radius > 4) + martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, absorbing a load of the shrapnel!", "You heroically cover \the [parent] with your body, absorbing a load of the shrapnel!") + magnitude_absorbed += round(radius * 0.5) + else if(radius >= 2) + martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, absorbing some of the shrapnel!", "You heroically cover \the [parent] with your body, absorbing some of the shrapnel!") + magnitude_absorbed += 2 + else + martyr.visible_message("[martyr] heroically covers \the [parent] with [martyr.p_their()] body, snuffing out the shrapnel!", "You heroically cover \the [parent] with your body, snuffing out the shrapnel!") + magnitude_absorbed = radius + + var/pellets_absorbed = (radius ** 2) - ((radius - magnitude_absorbed - 1) ** 2) + radius -= magnitude_absorbed + pellet_delta -= round(pellets_absorbed * 0.5) + + if(martyr.stat != DEAD && martyr.client) + LAZYADD(purple_hearts, martyr) + RegisterSignal(martyr, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) + + for(var/i in 1 to round(pellets_absorbed * 0.5)) + pew(martyr) + + if(radius < 1) + break + +///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets) +/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle) + pellets -= P + terminated++ + hits++ + targets_hit[target]++ + if(targets_hit[target] == 1) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) + UnregisterSignal(P, list(COMSIG_PARENT_QDELETING, COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT)) + if(terminated == num_pellets) + finalize() + +///One of our pellets disappeared due to hitting their max range (or just somehow got qdel'd), remove it from our list and check if we're done (terminated == num_pellets) +/datum/component/pellet_cloud/proc/pellet_range(obj/item/projectile/P) + pellets -= P + terminated++ + UnregisterSignal(P, list(COMSIG_PARENT_QDELETING, COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT)) + if(terminated == num_pellets) + finalize() + +/// Minor convenience function for creating each shrapnel piece with circle explosions, mostly stolen from the MIRV component +/datum/component/pellet_cloud/proc/pew(atom/target, spread=0) + var/obj/item/projectile/P = new projectile_type(get_turf(parent)) + + //Shooting Code: + P.spread = spread + P.original = target + P.fired_from = parent + P.firer = parent // don't hit ourself that would be really annoying + P.permutated += parent // don't hit the target we hit already with the flak + P.suppressed = SUPPRESSED_VERY // set the projectiles to make no message so we can do our own aggregate message + P.preparePixelProjectile(target, parent) + RegisterSignal(P, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit) + RegisterSignal(P, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PARENT_QDELETING), .proc/pellet_range) + pellets += P + P.fire() + +///All of our pellets are accounted for, time to go target by target and tell them how many things they got hit by. +/datum/component/pellet_cloud/proc/finalize() + var/obj/item/projectile/P = projectile_type + var/proj_name = initial(P.name) + + for(var/atom/target in targets_hit) + var/num_hits = targets_hit[target] + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + if(num_hits > 1) + target.visible_message("[target] is hit by [num_hits] [proj_name]s!", null, null, COMBAT_MESSAGE_RANGE, target) + to_chat(target, "You're hit by [num_hits] [proj_name]s!") + else + target.visible_message("[target] is hit by a [proj_name]!", null, null, COMBAT_MESSAGE_RANGE, target) + to_chat(target, "You're hit by a [proj_name]!") + + UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED) + if(queued_delete) + qdel(parent) + qdel(src) + +/// Look alive, we're armed! Now we start watching to see if anyone's covering us +/datum/component/pellet_cloud/proc/grenade_armed(obj/item/nade) + if(ismob(nade.loc)) + shooter = nade.loc + LAZYINITLIST(bodies) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/grenade_dropped) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/grenade_moved) + RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/grenade_uncrossed) + +/// Someone dropped the grenade, so set them to the shooter in case they're on top of it when it goes off +/datum/component/pellet_cloud/proc/grenade_dropped(obj/item/nade, mob/living/slick_willy) + shooter = slick_willy + grenade_moved() + +/// Our grenade has moved, reset var/list/bodies so we're "on top" of any mobs currently on the tile +/datum/component/pellet_cloud/proc/grenade_moved() + LAZYCLEARLIST(bodies) + for(var/mob/living/L in get_turf(parent)) + RegisterSignal(L, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) + bodies += L + +/// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it +/datum/component/pellet_cloud/proc/grenade_uncrossed(datum/source, atom/movable/AM) + bodies -= AM + +/// Our grenade or landmine or caseless shell or whatever tried deleting itself, so we intervene and nullspace it until we're done here +/datum/component/pellet_cloud/proc/nullspace_parent() + var/atom/movable/AM = parent + AM.moveToNullspace() + queued_delete = TRUE + return TRUE + +/// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it +/datum/component/pellet_cloud/proc/on_target_qdel(atom/target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + targets_hit -= target + bodies -= target + purple_hearts -= target diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm index ede222d001..6b7e7221c3 100644 --- a/code/datums/components/phantomthief.dm +++ b/code/datums/components/phantomthief.dm @@ -1,8 +1,8 @@ //This component applies a customizable drop_shadow filter to its wearer when they toggle combat mode on or off. This can stack. /datum/component/wearertargeting/phantomthief - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - signals = list(COMSIG_LIVING_COMBAT_ENABLED) + dupe_mode = COMPONENT_DUPE_ALLOWED + signals = list(COMSIG_LIVING_COMBAT_ENABLED, COMSIG_LIVING_COMBAT_DISABLED) proctype = .proc/handlefilterstuff var/filter_x var/filter_y @@ -19,8 +19,8 @@ filter_color = _color valid_slots = _valid_slots -/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(datum/source, mob/user, combatmodestate) - if(!combatmodestate) +/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(mob/living/user, was_forced = FALSE) + if(!SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) user.remove_filter("phantomthief") else user.add_filter("phantomthief", 4, list(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, color = filter_color)) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 2853f800f5..decc2dd65c 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -25,7 +25,6 @@ RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack) else CRASH("Something that wasn't an atom was given /datum/component/radioactive") - return if(strength > RAD_MINIMUM_CONTAMINATION) SSradiation.warn(src) @@ -84,4 +83,4 @@ #undef RAD_AMOUNT_LOW #undef RAD_AMOUNT_MEDIUM #undef RAD_AMOUNT_HIGH -#undef RAD_AMOUNT_EXTREME \ No newline at end of file +#undef RAD_AMOUNT_EXTREME diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index b22d2e09a2..747dd8ca61 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -20,16 +20,21 @@ var/ride_check_ridden_incapacitated = FALSE var/list/offhands = list() // keyed list containing all the current riding offsets associated by mob + var/del_on_unbuckle_all = FALSE + /datum/component/riding/Initialize() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) /datum/component/riding/proc/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) + var/atom/movable/AM = parent restore_position(M) unequip_buckle_inhands(M) + if(del_on_unbuckle_all && !AM.has_buckled_mobs()) + qdel(src) /datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) handle_vehicle_offsets() @@ -66,6 +71,9 @@ var/atom/movable/AM = parent AM.unbuckle_mob(M) +/datum/component/riding/proc/additional_offset_checks() + return TRUE + /datum/component/riding/proc/handle_vehicle_offsets() var/atom/movable/AM = parent var/AM_dir = "[AM.dir]" @@ -77,16 +85,17 @@ var/list/offsets = get_offsets(passindex) var/rider_dir = get_rider_dir(passindex) buckled_mob.setDir(rider_dir) - dir_loop: - for(var/offsetdir in offsets) - if(offsetdir == AM_dir) - var/list/diroffsets = offsets[offsetdir] - buckled_mob.pixel_x = diroffsets[1] - if(diroffsets.len >= 2) - buckled_mob.pixel_y = diroffsets[2] - if(diroffsets.len == 3) - buckled_mob.layer = diroffsets[3] - break dir_loop + for(var/offsetdir in offsets) + if(offsetdir == AM_dir) + var/list/diroffsets = offsets[offsetdir] + buckled_mob.pixel_x = diroffsets[1] + if(diroffsets.len >= 2) + buckled_mob.pixel_y = diroffsets[2] + if(diroffsets.len == 3) + buckled_mob.layer = diroffsets[3] + break + if (!additional_offset_checks()) + return var/list/static/default_vehicle_pixel_offsets = list(TEXT_NORTH = list(0, 0), TEXT_SOUTH = list(0, 0), TEXT_EAST = list(0, 0), TEXT_WEST = list(0, 0)) var/px = default_vehicle_pixel_offsets[AM_dir] var/py = default_vehicle_pixel_offsets[AM_dir] @@ -147,7 +156,6 @@ if(user.incapacitated()) Unbuckle(user) return - if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * vehicle_move_delay)) return last_vehicle_move = world.time @@ -169,8 +177,8 @@ else last_move_diagonal = FALSE - handle_vehicle_layer() handle_vehicle_offsets() + handle_vehicle_layer() else to_chat(user, "You'll need the keys in one of your hands to [drive_verb] [AM].") @@ -191,26 +199,28 @@ ///////Yes, I said humans. No, this won't end well...////////// /datum/component/riding/human + del_on_unbuckle_all = TRUE var/fireman_carrying = FALSE /datum/component/riding/human/Initialize() . = ..() + directional_vehicle_layers = list(TEXT_NORTH = MOB_LOWER_LAYER, TEXT_SOUTH = MOB_UPPER_LAYER, TEXT_EAST = MOB_UPPER_LAYER, TEXT_WEST = MOB_UPPER_LAYER) RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee) /datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) - . = ..() var/mob/living/carbon/human/H = parent if(!length(H.buckled_mobs)) - H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING) + H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry) if(!fireman_carrying) M.Daze(25) REMOVE_TRAIT(M, TRAIT_MOBILITY_NOUSE, src) + return ..() /datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) . = ..() var/mob/living/carbon/human/H = parent if(length(H.buckled_mobs)) - H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN) + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/human_carry, TRUE, fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN) if(fireman_carrying) ADD_TRAIT(M, TRAIT_MOBILITY_NOUSE, src) @@ -220,6 +230,7 @@ force_dismount(target) /datum/component/riding/human/handle_vehicle_layer() + . = ..() var/atom/movable/AM = parent if(AM.buckled_mobs && AM.buckled_mobs.len) for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied @@ -244,6 +255,10 @@ else return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4)) +/datum/component/riding/human/additional_offset_checks() + var/mob/living/carbon/human/H = parent + return !H.buckled + /datum/component/riding/human/force_dismount(mob/living/user) var/atom/movable/AM = parent AM.unbuckle_mob(user) @@ -252,6 +267,11 @@ user.visible_message("[AM] pushes [user] off of [AM.p_them()]!") /datum/component/riding/cyborg + del_on_unbuckle_all = TRUE + +/datum/component/riding/cyborg/Initialize() + . = ..() + directional_vehicle_layers = list(TEXT_NORTH = MOB_LOWER_LAYER, TEXT_SOUTH = MOB_UPPER_LAYER, TEXT_EAST = MOB_UPPER_LAYER, TEXT_WEST = MOB_UPPER_LAYER) /datum/component/riding/cyborg/ride_check(mob/user) var/atom/movable/AM = parent diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 422d73520e..f5da669c3a 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -14,7 +14,7 @@ var/default_rotation_direction = ROTATION_CLOCKWISE /datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE //throw if no rotation direction is specificed ? @@ -23,18 +23,12 @@ if(can_user_rotate) src.can_user_rotate = can_user_rotate - else - src.can_user_rotate = CALLBACK(src,.proc/default_can_user_rotate) if(can_be_rotated) src.can_be_rotated = can_be_rotated - else - src.can_be_rotated = CALLBACK(src,.proc/default_can_be_rotated) if(after_rotation) src.after_rotation = after_rotation - else - src.after_rotation = CALLBACK(src,.proc/default_after_rotation) //Try Clockwise,counter,flip in order if(src.rotation_flags & ROTATION_FLIP) @@ -103,14 +97,34 @@ examine_list += "Alt-click to rotate it clockwise." /datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction) - if(!can_be_rotated.Invoke(user, rotation) || !can_user_rotate.Invoke(user, rotation)) - return + if(can_be_rotated) + if(!can_be_rotated.Invoke(user, default_rotation_direction)) + return + else + if(!default_can_be_rotated(user, default_rotation_direction)) + return + if(can_user_rotate) + if(!can_user_rotate.Invoke(user, default_rotation_direction)) + return + else + if(!default_can_user_rotate(user, default_rotation_direction)) + return BaseRot(user, rotation) return TRUE /datum/component/simple_rotation/proc/WrenchRot(datum/source, obj/item/I, mob/living/user) - if(!can_be_rotated.Invoke(user,default_rotation_direction) || !can_user_rotate.Invoke(user,default_rotation_direction)) - return + if(can_be_rotated) + if(!can_be_rotated.Invoke(user, default_rotation_direction)) + return + else + if(!default_can_be_rotated(user, default_rotation_direction)) + return + if(can_user_rotate) + if(!can_user_rotate.Invoke(user, default_rotation_direction)) + return + else + if(!default_can_user_rotate(user, default_rotation_direction)) + return if(istype(I,/obj/item/wrench)) BaseRot(user,default_rotation_direction) return COMPONENT_NO_AFTERATTACK @@ -126,7 +140,10 @@ if(ROTATION_FLIP) rot_degree = 180 AM.setDir(turn(AM.dir,rot_degree)) - after_rotation.Invoke(user,rotation_type) + if(after_rotation) + after_rotation.Invoke(user, rotation_type) + else + default_after_rotation(user, rotation_type) /datum/component/simple_rotation/proc/default_can_user_rotate(mob/living/user, rotation_type) if(!istype(user) || !user.canUseTopic(parent, BE_CLOSE, NO_DEXTERY)) diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm new file mode 100644 index 0000000000..2052e57f49 --- /dev/null +++ b/code/datums/components/shielded.dm @@ -0,0 +1,191 @@ +/datum/component/shielded + dupe_mode = COMPONENT_DUPE_ALLOWED + can_transfer = TRUE + var/charges = 3 + var/max_charges = 3 + var/recharge_delay = 20 SECONDS //How long after we've been attacked before we can start recharging. + var/recharge_rate = 1 //How quickly the shield recharges once it starts charging. Can be a decimal. set to zero to disable. + var/last_time_used //Last time the shield attempted to stop an attack. + var/accepted_slots + var/shield_state = "shield-old" //the state of the shield overlay. + var/broken_state //null by default. + var/recharge_sound = 'sound/magic/charge.ogg' + var/recharge_end_sound = 'sound/machines/ding.ogg' + var/mob/living/holder //who is currently benefiting from the shield. + var/dissipating = FALSE //Is this shield meant to dissipate over time instead of recharging. + var/del_on_overload = FALSE //will delete itself once it has no charges left. + +/datum/component/shielded/Initialize(current, max = 3, delay = 20 SECONDS, rate = 1, slots, state = "shield-old", broken, \ + sound = 'sound/magic/charge.ogg', end_sound = 'sound/machines/ding.ogg', diss = FALSE, del_overload = FALSE) + var/isitem = isitem(parent) + if(!isitem && !isliving(parent)) + return COMPONENT_INCOMPATIBLE + max_charges = max + charges = !isnull(current) ? current : max_charges + recharge_delay = delay + recharge_rate = rate + accepted_slots = slots + shield_state = state + broken_state = broken + recharge_sound = sound + recharge_end_sound = end_sound + dissipating = diss + del_on_overload = del_overload + if(dissipating && recharge_rate > 0) + recharge_rate = -recharge_rate + if(recharge_delay && recharge_rate && (charges < max_charges || dissipating)) + START_PROCESSING(SSdcs, src) + +/datum/component/shielded/RegisterWithParent() + . = ..() + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) + else //it's a mob + var/mob/living/L = parent + RegisterSignal(L, COMSIG_LIVING_RUN_BLOCK, .proc/living_block) + holder = L + var/to_add = charges >= 1 ? shield_state : broken_state + if(to_add) + var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) + M.layer = (L.layer > MOB_LAYER ? L.layer : MOB_LAYER) + 0.01 + holder.add_overlay(M, TRUE) + +/datum/component/shielded/UnregisterFromParent() + . = ..() + if(parent != holder) //not a mob, thus an item. + UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK,COMSIG_ITEM_CHECK_BLOCK,COMSIG_ITEM_EQUIPPED,COMSIG_ITEM_DROPPED)) + if(holder) + UnregisterSignal(holder, list(COMSIG_LIVING_RUN_BLOCK, COMSIG_LIVING_GET_BLOCKING_ITEMS)) + var/to_remove = charges >= 1 ? shield_state : broken_state + if(to_remove) + holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + holder = null + +/datum/component/shielded/process() + if(world.time < last_time_used && !dissipating) + return + var/old_charges = charges + charges = clamp(charges + recharge_rate, 0, max_charges) + if(round(old_charges) >= round(charges)) //only send outputs if it effectively gained at least one charge + return + var/sound = recharge_sound + if(dissipating ? !charges : charges == max_charges ) + STOP_PROCESSING(SSdcs, src) + sound = recharge_end_sound + if(parent && sound) + playsound(parent, sound, 50, 1) + if(charges < 1 && del_on_overload) + if(holder) + holder.visible_message("[holder]'s shield overloads!") + qdel(src) + return + if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)) + update_shield_overlay(charges < 1) + +/datum/component/shielded/proc/adjust_charges(amount) + var/old_charges = charges + charges = clamp(charges + amount, 0, max_charges) + if(recharge_delay && recharge_rate && (dissipating ? !charges : charges == max_charges)) + STOP_PROCESSING(SSdcs, src) + if(charges < 1 && del_on_overload) + if(holder) + holder.visible_message("[holder]'s shield overloads!") + qdel(src) + return + if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)) + update_shield_overlay(charges < 1) + +/datum/component/shielded/proc/update_shield_overlay(broken) + if(!holder) + return + var/to_remove = broken ? shield_state : broken_state + var/to_add = broken ? broken_state : shield_state + if(to_remove) + holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + if(to_add) + var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) + M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 + holder.add_overlay(M, TRUE) + +/datum/component/shielded/proc/on_equip(obj/item/source, mob/living/equipper, slot) + if(!(accepted_slots & slotdefine2slotbit(slot))) + return + holder = equipper + RegisterSignal(parent, COMSIG_ITEM_RUN_BLOCK, .proc/on_run_block) + RegisterSignal(parent, COMSIG_ITEM_CHECK_BLOCK, .proc/on_check_block) + RegisterSignal(equipper, COMSIG_LIVING_GET_BLOCKING_ITEMS, .proc/include_shield) + var/to_add = charges >= 1 ? shield_state : broken_state + if(to_add) + var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) + M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 + equipper.add_overlay(M, TRUE) + +/datum/component/shielded/proc/on_drop(obj/item/source, mob/dropper) + if(holder == dropper) + UnregisterSignal(holder, COMSIG_LIVING_GET_BLOCKING_ITEMS) + UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK, COMSIG_ITEM_CHECK_BLOCK)) + var/to_remove = charges >= 1 ? shield_state : broken_state + if(to_remove) + holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + holder = null + +/datum/component/shielded/proc/include_shield(mob/source, list/items) + items += parent + +/datum/component/shielded/proc/on_run_block(obj/item/source, mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] >= 100) //already blocked by another shielded item, don't do anything. + block_return[BLOCK_RETURN_BLOCK_CAPACITY] += round(charges) + return BLOCK_NONE + last_time_used = world.time + recharge_delay + if(charges < 1) + return BLOCK_NONE + var/datum/effect_system/spark_spread/s = new + s.set_up(2, 1, source) + s.start() + owner.visible_message("[holder]'s shields deflect [attack_text] in a shower of sparks!") + charges-- + var/rounded_charges = round(charges) + if(recharge_delay && recharge_rate && !dissipating) + START_PROCESSING(SSdcs, src) + if(charges < 1) + owner.visible_message("[holder]'s shield overloads!") + if(del_on_overload) + qdel(src) + else + update_shield_overlay(TRUE) + block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = 100 + block_return[BLOCK_RETURN_BLOCK_CAPACITY] += rounded_charges + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + +/datum/component/shielded/proc/on_check_block(obj/item/source, mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(charges >= 1) + block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = 100 + block_return[BLOCK_RETURN_BLOCK_CAPACITY] += round(charges) + +/datum/component/shielded/proc/living_block(mob/living/source, real_attack, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) + if(!real_attack) + if(charges >= 1) + return_list[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = 100 + return_list[BLOCK_RETURN_BLOCK_CAPACITY] = round(charges) + return + last_time_used = world.time + recharge_delay + if(charges < 1) + return BLOCK_NONE + var/datum/effect_system/spark_spread/s = new + s.set_up(2, 1, source) + s.start() + source.visible_message("[source]'s shields deflect [attack_text] in a shower of sparks!") + charges-- + var/rounded_charges = round(charges) + if(recharge_delay && recharge_rate && !dissipating) + START_PROCESSING(SSdcs, src) + if(charges < 1) + source.visible_message("[source]'s shield overloads!") + if(del_on_overload) + qdel(src) + else + update_shield_overlay(TRUE) + return_list[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = 100 + return_list[BLOCK_RETURN_BLOCK_CAPACITY] += rounded_charges + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index f070d9b22f..96807fe313 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -14,7 +14,7 @@ parent_atom.opacity = 0 if(isliving(parent_atom)) var/mob/living/L = parent_atom - L.add_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY, update=TRUE, priority=100, multiplicative_slowdown=4) + L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(iscarbon(L)) var/mob/living/carbon/C = L C.unequip_everything() @@ -35,7 +35,7 @@ parent_atom.opacity = oldopac if(isliving(parent_atom)) var/mob/living/L = parent_atom - L.remove_movespeed_modifier(MOVESPEED_ID_SHRINK_RAY) + L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index ad538760db..792222b27b 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -16,7 +16,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak) RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ITEM_WEARERCROSSED), .proc/play_squeak_crossed) RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 13267e74c3..b651133274 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -5,7 +5,7 @@ var/allow_death = FALSE /datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) RegisterSignal(parent, list(COMSIG_MOVABLE_SECLUDED_LOCATION), .proc/relocate) diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 4c8f1b4c97..55c3e1d083 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -60,7 +60,7 @@ _contents_limbo = null if(_user_limbo) for(var/i in _user_limbo) - show_to(i) + ui_show(i) _user_limbo = null /datum/component/storage/concrete/_insert_physical_item(obj/item/I, override = FALSE) @@ -136,9 +136,7 @@ var/mob/M = parent.loc I.dropped(M) if(new_location) - //Reset the items values - _removal_reset(AM) - AM.forceMove(new_location) + AM.forceMove(new_location) // exited comsig will handle removal reset. //We don't want to call this if the item is being destroyed AM.on_exit_storage(src) else diff --git a/code/datums/components/storage/concrete/emergency.dm b/code/datums/components/storage/concrete/emergency.dm index 348821a913..faaeada13d 100644 --- a/code/datums/components/storage/concrete/emergency.dm +++ b/code/datums/components/storage/concrete/emergency.dm @@ -18,7 +18,7 @@ return . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - show_to(user) + ui_show(user) A.do_jiggle() if(rustle_sound) playsound(A, "rustle", 50, 1, -5) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 4d3ecc8d17..6a879a3fed 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -56,7 +56,8 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol + /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol, + /obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini )) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() @@ -67,7 +68,7 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/bikehorn, /obj/item/gun/ballistic/automatic/pistol)) + /obj/item/firing_pin, /obj/item/bikehorn, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/energy/e_gun/mini)) /datum/component/storage/concrete/pockets/pocketprotector max_items = 3 diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 2f95466238..d919828e8e 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -3,6 +3,7 @@ allow_quick_gather = TRUE allow_quick_empty = TRUE click_gather = TRUE + storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 100 max_items = 100 diff --git a/code/datums/components/storage/concrete/stack.dm b/code/datums/components/storage/concrete/stack.dm index 1f0c44c650..a3f1e526a0 100644 --- a/code/datums/components/storage/concrete/stack.dm +++ b/code/datums/components/storage/concrete/stack.dm @@ -1,6 +1,7 @@ //Stack-only storage. /datum/component/storage/concrete/stack display_numerical_stacking = TRUE + storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT var/max_combined_stack_amount = 300 max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = WEIGHT_CLASS_NORMAL * 14 diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index ea72a8a6dd..f93d40bb04 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -15,15 +15,23 @@ var/datum/component/storage/concrete/master //If not null, all actions act on master and this is just an access point. var/list/can_hold //if this is set, only things in this typecache will fit. + var/list/can_hold_extra //if this is set, it will also be able to hold these. var/list/cant_hold //if this is set, anything in this typecache will not be able to fit. var/list/mob/is_using //lazy list of mobs looking at the contents of this storage. var/locked = FALSE //when locked nothing can see inside or use it. - var/max_w_class = WEIGHT_CLASS_SMALL //max size of objects that will fit. - var/max_combined_w_class = 14 //max combined sizes of objects that will fit. - var/max_items = 7 //max number of objects that will fit. + /// Storage flags, including what kinds of limiters we use for how many items we can hold + var/storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT + /// Max w_class we can hold. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] and [STORAGE_LIMIT_VOLUME] + var/max_w_class = WEIGHT_CLASS_SMALL + /// Max combined w_class. Applies to [STORAGE_LIMIT_COMBINED_W_CLASS] + var/max_combined_w_class = WEIGHT_CLASS_SMALL * 7 + /// Max items we can hold. Applies to [STORAGE_LIMIT_MAX_ITEMS] + var/max_items = 7 + /// Max volume we can hold. Applies to [STORAGE_LIMIT_VOLUME]. Auto scaled on New() if unset. + var/max_volume var/emp_shielded = FALSE @@ -39,8 +47,17 @@ var/display_numerical_stacking = FALSE //stack things of the same type and show as a single object with a number. - var/obj/screen/storage/boxes //storage display object - var/obj/screen/close/closer //close button object + /// "legacy"/default view mode's storage "boxes" + var/obj/screen/storage/boxes/ui_boxes + /// New volumetric storage display mode's left side + var/obj/screen/storage/left/ui_left + /// New volumetric storage display mode's center 'blocks' + var/obj/screen/storage/continuous/ui_continuous + /// The close button, used in all modes. Frames right side in volumetric mode. + var/obj/screen/storage/close/ui_close + /// Associative list of list(item = screen object) for volumetric storage item screen blocks + var/list/ui_item_blocks + var/current_maxscreensize var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. @@ -68,9 +85,6 @@ return COMPONENT_INCOMPATIBLE if(master) change_master(master) - boxes = new(null, src) - closer = new(null, src) - orient2hud() RegisterSignal(parent, COMSIG_CONTAINS_STORAGE, .proc/on_check) RegisterSignal(parent, COMSIG_IS_STORAGE_LOCKED, .proc/check_locked) @@ -111,8 +125,15 @@ /datum/component/storage/Destroy() close_all() - QDEL_NULL(boxes) - QDEL_NULL(closer) + QDEL_NULL(ui_boxes) + QDEL_NULL(ui_close) + QDEL_NULL(ui_continuous) + QDEL_NULL(ui_left) + // DO NOT USE QDEL_LIST_ASSOC. + if(ui_item_blocks) + for(var/i in ui_item_blocks) + qdel(ui_item_blocks[i]) //qdel the screen object not the item + ui_item_blocks.Cut() LAZYCLEARLIST(is_using) return ..() @@ -286,7 +307,7 @@ if(!_target) _target = get_turf(parent) if(usr) - hide_from(usr) + ui_hide(usr) var/list/contents = contents() var/atom/real_location = real_location() for(var/obj/item/I in contents) @@ -300,106 +321,8 @@ if(check_locked()) close_all() -/datum/component/storage/proc/_process_numerical_display() - . = list() - for(var/obj/item/I in accessible_items()) - if(QDELETED(I)) - continue - if(!.[I.type]) - .[I.type] = new /datum/numbered_display(I, 1) - else - var/datum/numbered_display/ND = .[I.type] - ND.number++ - . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE) - -//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing. -/datum/component/storage/proc/orient2hud(mob/user, maxcolumns) - var/list/accessible_contents = accessible_items() - var/adjusted_contents = length(accessible_contents) - - //Numbered contents display - var/list/datum/numbered_display/numbered_contents - if(display_numerical_stacking) - numbered_contents = _process_numerical_display() - adjusted_contents = numbered_contents.len - - var/columns = CLAMP(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) - var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) - standard_orient_objs(rows, columns, numbered_contents) - -//This proc draws out the inventory and places the items on it. It uses the standard position. -/datum/component/storage/proc/standard_orient_objs(rows, cols, list/obj/item/numerical_display_contents) - boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+cols-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" - var/cx = screen_start_x - var/cy = screen_start_y - if(islist(numerical_display_contents)) - for(var/type in numerical_display_contents) - var/datum/numbered_display/ND = numerical_display_contents[type] - ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE - ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = ABOVE_HUD_LAYER - ND.sample_object.plane = ABOVE_HUD_PLANE - cx++ - if(cx - screen_start_x >= cols) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break - else - for(var/obj/O in accessible_items()) - if(QDELETED(O)) - continue - O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" - O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" - O.maptext = "" - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - cx++ - if(cx - screen_start_x >= cols) - cx = screen_start_x - cy++ - if(cy - screen_start_y >= rows) - break - closer.screen_loc = "[screen_start_x + cols]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" - -/datum/component/storage/proc/show_to(mob/M, set_screen_size = TRUE) - if(!M.client) - return FALSE - var/list/cview = getviewsize(M.client.view) - var/maxallowedscreensize = cview[1]-8 - if(set_screen_size) - current_maxscreensize = maxallowedscreensize - else if(current_maxscreensize) - maxallowedscreensize = current_maxscreensize - if(M.active_storage != src && (M.stat == CONSCIOUS)) - for(var/obj/item/I in accessible_items()) - if(I.on_found(M)) - return FALSE - if(M.active_storage) - M.active_storage.hide_from(M) - orient2hud(M, (isliving(M) ? maxallowedscreensize : 7)) - M.client.screen |= boxes - M.client.screen |= closer - M.client.screen |= accessible_items() - M.active_storage = src - LAZYOR(is_using, M) - return TRUE - -/datum/component/storage/proc/hide_from(mob/M) - if(!M.client) - return TRUE - var/atom/real_location = real_location() - M.client.screen -= boxes - M.client.screen -= closer - M.client.screen -= real_location.contents - if(M.active_storage == src) - M.active_storage = null - LAZYREMOVE(is_using, M) - return TRUE - /datum/component/storage/proc/close(mob/M) - hide_from(M) + ui_hide(M) /datum/component/storage/proc/close_all() . = FALSE @@ -418,25 +341,6 @@ var/datum/component/storage/concrete/master = master() master.emp_act(source, severity) -//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. -//The numbers are calculated from the bottom-left The bottom-left slot being 1,1. -/datum/component/storage/proc/orient_objs(tx, ty, mx, my) - var/atom/real_location = real_location() - var/cx = tx - var/cy = ty - boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" - for(var/obj/O in real_location) - if(QDELETED(O)) - continue - O.screen_loc = "[cx],[cy]" - O.layer = ABOVE_HUD_LAYER - O.plane = ABOVE_HUD_PLANE - cx++ - if(cx > mx) - cx = tx - cy-- - closer.screen_loc = "[mx+1],[my]" - //Resets something that is being removed from storage. /datum/component/storage/proc/_removal_reset(atom/movable/thing) if(!istype(thing)) @@ -447,7 +351,14 @@ return master._removal_reset(thing) /datum/component/storage/proc/_remove_and_refresh(datum/source, atom/movable/thing) - _removal_reset(thing) + if(LAZYACCESS(ui_item_blocks, thing)) + var/obj/screen/storage/volumetric_box/center/C = ui_item_blocks[thing] + for(var/i in can_see_contents()) //runtimes result if mobs can access post deletion. + var/mob/M = i + M.client?.screen -= C.on_screen_objects() + ui_item_blocks -= thing + qdel(C) + _removal_reset(thing) // THIS NEEDS TO HAPPEN AFTER SO LAYERING DOESN'T BREAK! refresh_mob_views() //Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted @@ -462,7 +373,7 @@ /datum/component/storage/proc/refresh_mob_views() var/list/seeing = can_see_contents() for(var/i in seeing) - show_to(i) + ui_show(i) return TRUE /datum/component/storage/proc/can_see_contents() @@ -559,7 +470,7 @@ A.add_fingerprint(M) if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE))) return FALSE - show_to(M, !ghost) + ui_show(M, !ghost) /datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M) if(isitem(O)) @@ -587,30 +498,42 @@ if(M && !stop_messages) host.add_fingerprint(M) return FALSE - if(real_location.contents.len >= max_items) - if(!stop_messages) - to_chat(M, "[host] is full, make some space!") - return FALSE //Storage item is full - if(length(can_hold)) - if(!is_type_in_typecache(I, can_hold)) + if(!length(can_hold_extra) || !is_type_in_typecache(I, can_hold_extra)) + if(length(can_hold) && !is_type_in_typecache(I, can_hold)) if(!stop_messages) to_chat(M, "[host] cannot hold [I]!") return FALSE - if(is_type_in_typecache(I, cant_hold)) //Check for specific items which this container can't hold. - if(!stop_messages) - to_chat(M, "[host] cannot hold [I]!") - return FALSE - if(I.w_class > max_w_class) - if(!stop_messages) - to_chat(M, "[I] is too big for [host]!") - return FALSE - var/sum_w_class = I.w_class - for(var/obj/item/_I in real_location) - sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. - if(sum_w_class > max_combined_w_class) - if(!stop_messages) - to_chat(M, "[I] won't fit in [host], make some space!") - return FALSE + if(is_type_in_typecache(I, cant_hold)) //Check for specific items which this container can't hold. + if(!stop_messages) + to_chat(M, "[host] cannot hold [I]!") + return FALSE + if(storage_flags & STORAGE_LIMIT_MAX_W_CLASS && I.w_class > max_w_class) + if(!stop_messages) + to_chat(M, "[I] is too long for [host]!") + return FALSE + // STORAGE LIMITS + if(storage_flags & STORAGE_LIMIT_MAX_ITEMS) + if(real_location.contents.len >= max_items) + if(!stop_messages) + to_chat(M, "[host] has too many things in it, make some space!") + return FALSE //Storage item is full + if(storage_flags & STORAGE_LIMIT_COMBINED_W_CLASS) + var/sum_w_class = I.w_class + for(var/obj/item/_I in real_location) + sum_w_class += _I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. + if(sum_w_class > max_combined_w_class) + if(!stop_messages) + to_chat(M, "[I] won't fit in [host], make some space!") + return FALSE + if(storage_flags & STORAGE_LIMIT_VOLUME) + var/sum_volume = I.get_w_volume() + for(var/obj/item/_I in real_location) + sum_volume += _I.get_w_volume() + if(sum_volume > get_max_volume()) + if(!stop_messages) + to_chat(M, "[I] is too spacious to fit in [host], make some space!") + return FALSE + ///////////////// if(isitem(host)) var/obj/item/IP = host var/datum/component/storage/STR_I = I.GetComponent(/datum/component/storage) @@ -648,10 +571,9 @@ return if(rustle_sound) playsound(parent, "rustle", 50, 1, -5) - for(var/mob/viewing in viewers(user, null)) - if(M == viewing) - to_chat(usr, "You put [I] [insert_preposition]to [parent].") - else if(in_range(M, viewing)) //If someone is standing close enough, they can tell what it is... + to_chat(user, "You put [I] [insert_preposition]to [parent].") + for(var/mob/viewing in fov_viewers(world.view, user)-M) + if(in_range(M, viewing)) //If someone is standing close enough, they can tell what it is... viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", MSG_VISUAL) else if(I && I.w_class >= 3) //Otherwise they can only see large or normal items from a distance... viewing.show_message("[M] puts [I] [insert_preposition]to [parent].", MSG_VISUAL) @@ -742,7 +664,7 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - show_to(user) + ui_show(user) A.do_jiggle() /datum/component/storage/proc/signal_on_pickup(datum/source, mob/user) @@ -761,7 +683,7 @@ return do_quick_empty(loctarget) /datum/component/storage/proc/signal_hide_attempt(datum/source, mob/target) - return hide_from(target) + return ui_hide(target) /datum/component/storage/proc/on_alt_click(datum/source, mob/user) if(!isliving(user) || !user.CanReach(parent)) @@ -790,7 +712,7 @@ user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].") return TRUE -/datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source) +/datum/component/storage/proc/action_trigger(datum/action/source, obj/target) gather_mode_switch(source.owner) return COMPONENT_ACTION_BLOCK_TRIGGER @@ -803,3 +725,9 @@ to_chat(user, "[parent] now picks up all items in a tile at once.") if(COLLECT_ONE) to_chat(user, "[parent] now picks up one item at a time.") + +/** + * Gets our max volume + */ +/datum/component/storage/proc/get_max_volume() + return max_volume || AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_combined_w_class) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm new file mode 100644 index 0000000000..c7ac0d3549 --- /dev/null +++ b/code/datums/components/storage/ui.dm @@ -0,0 +1,297 @@ +/** + * Generates a list of numbered_display datums for the numerical display system. + */ +/datum/component/storage/proc/_process_numerical_display() + . = list() + for(var/obj/item/I in accessible_items()) + if(QDELETED(I)) + continue + if(!.[I.type]) + .[I.type] = new /datum/numbered_display(I, 1) + else + var/datum/numbered_display/ND = .[I.type] + ND.number++ + . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE) + +/** + * Orients all objects in legacy mode, and returns the objects to show to the user. + */ +/datum/component/storage/proc/orient2hud_legacy(mob/user, maxcolumns) + . = list() + var/list/accessible_contents = accessible_items() + var/adjusted_contents = length(accessible_contents) + + //Numbered contents display + var/list/datum/numbered_display/numbered_contents + if(display_numerical_stacking) + numbered_contents = _process_numerical_display() + adjusted_contents = numbered_contents.len + + var/columns = clamp(max_items, 1, maxcolumns ? maxcolumns : screen_max_columns) + var/rows = clamp(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + + // First, boxes. + ui_boxes = get_ui_boxes() + ui_boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+columns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_boxes + // Then, closer. + ui_close = get_ui_close() + ui_close.screen_loc = "[screen_start_x + columns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" + . += ui_close + // Then orient the actual items. + var/cx = screen_start_x + var/cy = screen_start_y + if(islist(numbered_contents)) + for(var/type in numbered_contents) + var/datum/numbered_display/ND = numbered_contents[type] + ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE + ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" + ND.sample_object.layer = ABOVE_HUD_LAYER + ND.sample_object.plane = ABOVE_HUD_PLANE + . += ND.sample_object + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + else + for(var/obj/O in accessible_items()) + if(QDELETED(O)) + continue + O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" + O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" + O.maptext = "" + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE + . += O + cx++ + if(cx - screen_start_x >= columns) + cx = screen_start_x + cy++ + if(cy - screen_start_y >= rows) + break + +/** + * Orients all objects in .. volumetric mode. Does not support numerical display! + */ +/datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns) + . = list() + + // Generate ui_item_blocks for missing ones and render+orient. + var/list/atom/contents = accessible_items() + // our volume + var/our_volume = get_max_volume() + var/horizontal_pixels = (maxcolumns * world.icon_size) - (VOLUMETRIC_STORAGE_EDGE_PADDING * 2) + var/max_horizontal_pixels = horizontal_pixels * screen_max_rows + // sigh loopmania time + var/used = 0 + // define outside for performance + var/volume + var/list/volume_by_item = list() + var/list/percentage_by_item = list() + for(var/obj/item/I in contents) + if(QDELETED(I)) + continue + volume = I.get_w_volume() + used += volume + volume_by_item[I] = volume + percentage_by_item[I] = volume / get_max_volume() + var/padding_pixels = ((length(percentage_by_item) - 1) * VOLUMETRIC_STORAGE_ITEM_PADDING) + VOLUMETRIC_STORAGE_EDGE_PADDING * 2 + var/min_pixels = (MINIMUM_PIXELS_PER_ITEM * length(percentage_by_item)) + padding_pixels + // do the check for fallback for when someone has too much gamer gear + if((min_pixels) > (max_horizontal_pixels + 4)) // 4 pixel grace zone + to_chat(user, "[parent] was showed to you in legacy mode due to your items overrunning the three row limit! Consider not carrying too much or bugging a maintainer to raise this limit!") + return orient2hud_legacy(user, maxcolumns) + // after this point we are sure we can somehow fit all items into our max number of rows. + + // determine rows + var/rows = clamp(CEILING(min_pixels / horizontal_pixels, 1), 1, screen_max_rows) + + var/overrun = FALSE + if(used > our_volume) + // congratulations we are now in overrun mode. everything will be crammed to minimum storage pixels. + to_chat(user, "[parent] rendered in overrun mode due to more items inside than the maximum volume supports.") + overrun = TRUE + + // how much we are using + var/using_horizontal_pixels = horizontal_pixels * rows + + // item padding + using_horizontal_pixels -= padding_pixels + + // define outside for marginal performance boost + var/obj/item/I + // start at this pixel from screen_start_x. + var/current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING + var/first = TRUE + var/row = 1 + + LAZYINITLIST(ui_item_blocks) + + for(var/i in percentage_by_item) + I = i + var/percent = percentage_by_item[I] + if(!ui_item_blocks[I]) + ui_item_blocks[I] = new /obj/screen/storage/volumetric_box/center(null, src, I) + var/obj/screen/storage/volumetric_box/center/B = ui_item_blocks[I] + var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM) + var/addrow = FALSE + if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1)) + pixels_to_use = horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING + addrow = TRUE + + // now that we have pixels_to_use, place our thing and add it to the returned list. + B.screen_loc = I.screen_loc = "[screen_start_x]:[round(current_pixel + (pixels_to_use * 0.5) + (first? 0 : VOLUMETRIC_STORAGE_ITEM_PADDING), 1)],[screen_start_y+row-1]:[screen_pixel_y]" + // add the used pixels to pixel after we place the object + current_pixel += pixels_to_use + (first? 0 : VOLUMETRIC_STORAGE_ITEM_PADDING) + first = FALSE //apply padding to everything after this + + // set various things + B.set_pixel_size(pixels_to_use) + B.layer = VOLUMETRIC_STORAGE_BOX_LAYER + B.plane = VOLUMETRIC_STORAGE_BOX_PLANE + B.name = I.name + + I.mouse_opacity = MOUSE_OPACITY_ICON + I.maptext = "" + I.layer = VOLUMETRIC_STORAGE_ITEM_LAYER + I.plane = VOLUMETRIC_STORAGE_ITEM_PLANE + + // finally add our things. + . += B.on_screen_objects() + . += I + + // go up a row if needed + if(addrow) + row++ + first = TRUE //first in the row, don't apply between-item padding. + current_pixel = VOLUMETRIC_STORAGE_EDGE_PADDING + + // Then, continuous section. + ui_continuous = get_ui_continuous() + ui_continuous.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+maxcolumns-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_continuous + // Then, left. + ui_left = get_ui_left() + ui_left.screen_loc = "[screen_start_x]:[screen_pixel_x - 2],[screen_start_y]:[screen_pixel_y] to [screen_start_x]:[screen_pixel_x - 2],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_left + // Then, closer, which is also our right element. + ui_close = get_ui_close() + ui_close.screen_loc = "[screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x + maxcolumns]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" + . += ui_close + +/** + * Shows our UI to a mob. + */ +/datum/component/storage/proc/ui_show(mob/M, set_screen_size = TRUE) + if(!M.client) + return FALSE + var/list/cview = getviewsize(M.client.view) + // in tiles + var/maxallowedscreensize = cview[1]-8 + if(set_screen_size) + current_maxscreensize = maxallowedscreensize + else if(current_maxscreensize) + maxallowedscreensize = current_maxscreensize + // we got screen size, register signal + RegisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT, .proc/on_logout, override = TRUE) + if(M.active_storage != src) + if(M.active_storage) + M.active_storage.ui_hide(M) + M.active_storage = src + LAZYOR(is_using, M) + if(!M.client?.prefs?.no_tetris_storage && volumetric_ui()) + //new volumetric ui bay-style + M.client.screen |= orient2hud_volumetric(M, maxallowedscreensize) + else + //old ui + M.client.screen |= orient2hud_legacy(M, maxallowedscreensize) + return TRUE + +/** + * VV hooked to ensure no lingering screen objects. + */ +/datum/component/storage/vv_edit_var(var_name, var_value) + var/list/old + if(var_name == NAMEOF(src, storage_flags)) + old = is_using.Copy() + for(var/i in is_using) + ui_hide(i) + . = ..() + if(old) + for(var/i in old) + ui_show(i) + +/** + * Proc triggered by signal to ensure logging out clients don't linger. + */ +/datum/component/storage/proc/on_logout(datum/source, client/C) + ui_hide(source) + +/** + * Hides our UI from a mob + */ +/datum/component/storage/proc/ui_hide(mob/M) + if(!M.client) + return TRUE + UnregisterSignal(M, COMSIG_MOB_CLIENT_LOGOUT) + M.client.screen -= list(ui_boxes, ui_close, ui_left, ui_continuous) + get_ui_item_objects_hide(M) + if(M.active_storage == src) + M.active_storage = null + LAZYREMOVE(is_using, M) + return TRUE + +/** + * Returns TRUE if we are using volumetric UI instead of box UI + */ +/datum/component/storage/proc/volumetric_ui() + var/atom/real_location = real_location() + return (storage_flags & STORAGE_LIMIT_VOLUME) && (length(real_location.contents) <= MAXIMUM_VOLUMETRIC_ITEMS) && !display_numerical_stacking + +/** + * Gets the ui item objects to ui_hide. + */ +/datum/component/storage/proc/get_ui_item_objects_hide(mob/M) + if(!volumetric_ui() || M.client?.prefs?.no_tetris_storage) + var/atom/real_location = real_location() + return real_location.contents + else + . = list() + for(var/i in ui_item_blocks) + // get both the box and the item + . += ui_item_blocks[i] + . += i + +/** + * Gets our ui_boxes, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_boxes() + if(!ui_boxes) + ui_boxes = new(null, src) + return ui_boxes + +/** + * Gets our ui_left, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_left() + if(!ui_left) + ui_left = new(null, src) + return ui_left + +/** + * Gets our ui_close, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_close() + if(!ui_close) + ui_close = new(null, src) + return ui_close + +/** + * Gets our ui_continuous, making it if it doesn't exist. + */ +/datum/component/storage/proc/get_ui_continuous() + if(!ui_continuous) + ui_continuous = new(null, src) + return ui_continuous diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index 61718301b3..1d66cf9307 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -59,7 +59,7 @@ var/mob/living/simple_animal/L = new chosen_mob_type(spawn_location) if(ishostile(L)) var/mob/living/simple_animal/hostile/H = L - H.friends += summoner // do not attack our summon boy + H.friends[summoner]++ // do not attack our summon boy spawned_mobs += L if(faction != null) L.faction = faction diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index 64844c4c32..e840788766 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -11,6 +11,17 @@ RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm) RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm) +/datum/component/swarming/Destroy() + if(is_swarming) + for(var/A in swarm_members) + var/datum/component/swarming/other_swarm = A + other_swarm.swarm_members -= src + swarm_members -= other_swarm + if(!length(other_swarm.swarm_members)) + other_swarm.unswarm() + unswarm() + return ..() + /datum/component/swarming/proc/join_swarm(datum/source, atom/movable/AM) var/datum/component/swarming/other_swarm = AM.GetComponent(/datum/component/swarming) if(!other_swarm) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm new file mode 100644 index 0000000000..bd12ecc092 --- /dev/null +++ b/code/datums/components/tackle.dm @@ -0,0 +1,491 @@ +#define MAX_TABLE_MESSES 8 // how many things can we knock off a table at once? + +/** + *#tackle.dm + * + * For when you want to throw a person at something and have fun stuff happen + * + * This component is made for carbon mobs (really, humans), and allows its parent to throw themselves and perform tackles. This is done by enabling throw mode, then clicking on your + * intended target with an empty hand. You will then launch toward your target. If you hit a carbon, you'll roll to see how hard you hit them. If you hit a solid non-mob, you'll + * roll to see how badly you just messed yourself up. If, along your journey, you hit a table, you'll slam onto it and send up to MAX_TABLE_MESSES (8) /obj/items on the table flying, + * and take a bit of extra damage and stun for each thing launched. + * + * There are 2 """skill rolls""" involved here, which are handled and explained in sack() and rollTackle() (for roll 1, carbons), and splat() (for roll 2, walls and solid objects) +*/ +/datum/component/tackler + dupe_mode = COMPONENT_DUPE_UNIQUE + ///How much stamina it takes to launch a tackle + var/stamina_cost + ///Launching a tackle calls Knockdown on you for this long, so this is your cooldown. Once you stand back up, you can tackle again. + var/base_knockdown + ///Your max range for how far you can tackle. + var/range + ///How fast you sail through the air. Standard tackles are 1 speed, but gloves that throw you faster come at a cost: higher speeds make it more likely you'll be badly injured if you fly into a non-mob obstacle. + var/speed + ///A flat modifier to your roll against your target, as described in [rollTackle()][/datum/component/tackler/proc/rollTackle]. Slightly misleading, skills aren't relevant here, this is a matter of what type of gloves (or whatever) is granting you the ability to tackle. + var/skill_mod + ///Some gloves, generally ones that increase mobility, may have a minimum distance to fly. Rocket gloves are especially dangerous with this, be sure you'll hit your target or have a clear background if you miss, or else! + var/min_distance + ///The throwdatum we're currently dealing with, if we need it + var/datum/thrownthing/tackle + +/datum/component/tackler/Initialize(stamina_cost = 25, base_knockdown = 1 SECONDS, range = 4, speed = 1, skill_mod = 0, min_distance = min_distance) + if(!iscarbon(parent)) + return COMPONENT_INCOMPATIBLE + + src.stamina_cost = stamina_cost + src.base_knockdown = base_knockdown + src.range = range + src.speed = speed + src.skill_mod = skill_mod + src.min_distance = min_distance + + var/mob/living/carbon/P = parent + to_chat(P, "You are now able to launch tackles! You can do so by activating throw intent, and clicking on your target with an empty hand.") + P.tackling = TRUE + addtimer(CALLBACK(src, .proc/resetTackle), base_knockdown, TIMER_STOPPABLE) + +/datum/component/tackler/Destroy() + var/mob/living/carbon/P = parent + to_chat(P, "You can no longer tackle.") + P.tackling = FALSE + ..() + +/datum/component/tackler/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_CLICKON, .proc/checkTackle) + RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, .proc/sack) + RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, .proc/registerTackle) + +/datum/component/tackler/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_IMPACT, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_POST_THROW)) + +///Store the thrownthing datum for later use +/datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/TT) + tackle = TT + +///See if we can tackle or not. If we can, leap! +/datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/A, params) + if(!user.in_throw_mode || user.get_active_held_item() || user.pulling || user.buckling) + return + + if(HAS_TRAIT(user, TRAIT_HULK)) + to_chat(user, "You're too angry to remember how to tackle!") + return + + if(user.restrained()) + to_chat(user, "You need free use of your hands to tackle!") + return + + if(!(user.mobility_flags & MOBILITY_STAND)) + to_chat(user, "You must be standing to tackle!") + return + + if(user.tackling) + to_chat(user, "You're not ready to tackle!") + return + + if(user.has_status_effect(STATUS_EFFECT_TASED)) // can't tackle if you just got tased + to_chat(user, "You can't tackle while tased!") + return + + user.face_atom(A) + + var/list/modifiers = params2list(params) + if(modifiers["alt"] || modifiers["shift"] || modifiers["ctrl"] || modifiers["middle"]) + return + + user.tackling = TRUE + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/checkObstacle) + playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1) + + var/leap_word = iscatperson(user) ? "pounce" : "leap" ///If cat, "pounce" instead of "leap". + if(can_see(user, A, 7)) + user.visible_message("[user] [leap_word]s at [A]!", "You [leap_word] at [A]!") + else + user.visible_message("[user] [leap_word]s!", "You [leap_word]!") + + if(get_dist(user, A) < min_distance) + A = get_ranged_target_turf(user, get_dir(user, A), min_distance) //TODO: this only works in cardinals/diagonals, make it work with in-betweens too! + + user.Knockdown(base_knockdown, TRUE, TRUE) + user.adjustStaminaLoss(stamina_cost) + user.throw_at(A, range, speed, user, FALSE) + user.toggle_throw_mode() + addtimer(CALLBACK(src, .proc/resetTackle), base_knockdown, TIMER_STOPPABLE) + return(COMSIG_MOB_CANCEL_CLICKON) + +/** + * sack() + * + * sack() is called when you actually smack into something, assuming we're mid-tackle. First it deals with smacking into non-carbons, in two cases: + * * If it's a non-carbon mob, we don't care, get out of here and do normal thrown-into-mob stuff + * * Else, if it's something dense (walls, machinery, structures, most things other than the floor), go to splat() and get ready for some high grade shit + * + * If it's a carbon we hit, we'll call rollTackle() which rolls a die and calculates modifiers for both the tackler and target, then gives us a number. Negatives favor the target, while positives favor the tackler. + * Check [rollTackle()][/datum/component/tackler/proc/rollTackle] for a more thorough explanation on the modifiers at play. + * + * Then, we figure out what effect we want, and we get to work! Note that with standard gripper gloves and no modifiers, the range of rolls is (-3, 3). The results are as follows, based on what we rolled: + * * -inf to -5: Seriously botched tackle, tackler suffers a concussion, brute damage, and a 3 second paralyze, target suffers nothing + * * -4 to -2: weak tackle, tackler gets 3 second knockdown, target gets shove slowdown but is otherwise fine + * * -1 to 0: decent tackle, tackler gets up a bit quicker than the target + * * 1: solid tackle, tackler has more of an advantage getting up quicker + * * 2 to 4: expert tackle, tackler has sizeable advantage and lands on their feet with a free passive grab + * * 5 to inf: MONSTER tackle, tackler gets up immediately and gets a free aggressive grab, target takes sizeable stamina damage from the hit and is paralyzed for one and a half seconds and knocked down for three seconds + * + * Finally, we return a bitflag to [COMSIG_MOVABLE_IMPACT] that forces the hitpush to false so that we don't knock them away. +*/ +/datum/component/tackler/proc/sack(mob/living/carbon/user, atom/hit) + if(!user.tackling || !tackle) + return + + if(!iscarbon(hit)) + if(hit.density) + return splat(user, hit) + return + + var/mob/living/carbon/target = hit + var/tackle_word = iscatperson(user) ? "pounce" : "tackle" ///If cat, "pounce" instead of "tackle". + + var/roll = rollTackle(target) + user.tackling = FALSE + + switch(roll) + if(-INFINITY to -5) + user.visible_message("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!", "You botch your [tackle_word] and slam your head into [target], knocking yourself silly!", target) + to_chat(target, "[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!") + + user.Paralyze(30) + var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD) + if(hed) + hed.receive_damage(brute=20, updating_health=TRUE) + user.gain_trauma(/datum/brain_trauma/mild/concussion) + + if(-4 to -2) // glancing blow at best + user.visible_message("[user] lands a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", "You land a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", target) + to_chat(target, "[user] lands a weak [tackle_word] on you, briefly knocking you off-balance!") + user.Knockdown(30) + target.adjustStaminaLoss(15) + target.apply_status_effect(STATUS_EFFECT_TASED_WEAK, 6 SECONDS) + + if(-1 to 0) // decent hit, both parties are about equally inconvenienced + user.visible_message("[user] lands a passable [tackle_word] on [target], sending them both tumbling!", "You land a passable [tackle_word] on [target], sending you both tumbling!", target) + to_chat(target, "[user] lands a passable [tackle_word] on you, sending you both tumbling!") + + target.adjustStaminaLoss(stamina_cost * 1.5) + target.Paralyze(5) + user.Knockdown(20) + target.Knockdown(30) + + if(1 to 2) // solid hit, tackler has a slight advantage + user.visible_message("[user] lands a solid [tackle_word] on [target], knocking them both down hard!", "You land a solid [tackle_word] on [target], knocking you both down hard!", target) + to_chat(target, "[user] lands a solid [tackle_word] on you, knocking you both down hard!") + + target.adjustStaminaLoss(40) + target.Paralyze(5) + user.Knockdown(10) + target.Knockdown(20) + + if(3 to 4) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land + user.visible_message("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!", "You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!", target) + to_chat(target, "[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!") + + user.SetKnockdown(0) + user.set_resting(FALSE, TRUE, FALSE) + user.forceMove(get_turf(target)) + target.adjustStaminaLoss(50) + target.Paralyze(3) //Otherwise the victim can just instantly get out of the grab. + target.DefaultCombatKnockdown(20) //So they cant get up instantly. + if(ishuman(target) && iscarbon(user)) + target.grabbedby(user) + + if(5 to INFINITY) // absolutely BODIED + user.visible_message("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", target) + to_chat(target, "[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!") + + user.SetKnockdown(0) + user.set_resting(FALSE, TRUE, FALSE) + user.forceMove(get_turf(target)) + target.adjustStaminaLoss(65) + target.Paralyze(10) + target.DefaultCombatKnockdown(20) + if(ishuman(target) && iscarbon(user)) + target.grabbedby(user) + target.grippedby(user, instant = TRUE) + + SEND_SIGNAL(user, COMSIG_CARBON_TACKLED, roll) + return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH + +/** + * rollTackle() + * + * This handles all of the modifiers for the actual carbon-on-carbon tackling, and gets its own proc because of how many there are (with plenty more in mind!) + * + * The base roll is between (-3, 3), with negative numbers favoring the target, and positive numbers favoring the tackler. The target and the tackler are both assessed for + * how easy they are to knock over, with clumsiness and dwarfiness being strong maluses for each, and gigantism giving a bonus for each. These numbers and ideas + * are absolutely subject to change. + + * In addition, after subtracting the defender's mod and adding the attacker's mod to the roll, the component's base (skill) mod is added as well. Some sources of tackles + * are better at taking people down, like the bruiser and rocket gloves, while the dolphin gloves have a malus in exchange for better mobility. +*/ +/datum/component/tackler/proc/rollTackle(mob/living/carbon/target) + var/defense_mod = 0 + var/attack_mod = 0 + + // DE-FENSE + if(target.drunkenness > 60) // drunks are easier to knock off balance + defense_mod -= 3 + else if(target.drunkenness > 30) + defense_mod -= 1 + if(HAS_TRAIT(target, TRAIT_CLUMSY)) + defense_mod -= 2 + if(HAS_TRAIT(target, TRAIT_FAT)) // chonkers are harder to knock over + defense_mod += 1 + //if(HAS_TRAIT(target, TRAIT_GRABWEAKNESS)) Todo, port the pushover trait + //defense_mod -= 2 + if(HAS_TRAIT(target, TRAIT_DWARF)) + defense_mod -= 2 + if(HAS_TRAIT(target, TRAIT_GIANT)) + defense_mod += 2 + + if(ishuman(target)) + var/mob/living/carbon/human/T = target + var/suit_slot = T.get_item_by_slot(ITEM_SLOT_OCLOTHING) + + if(isnull(T.wear_suit) && isnull(T.w_uniform)) // who honestly puts all of their effort into tackling a naked guy? + defense_mod += 2 + if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/space/hardsuit))) + defense_mod += 1 + if(T.is_shove_knockdown_blocked()) // riot armor and such + defense_mod += 5 + if(T.is_holding_item_of_type(/obj/item/shield)) + defense_mod += 2 + + if(islizard(T)) + if(!T.getorganslot(ORGAN_SLOT_TAIL)) // lizards without tails are off-balance + defense_mod -= 1 + else if(T.dna.species.is_wagging_tail()) // lizard tail wagging is robust and can swat away assailants! + defense_mod += 1 + + // OF-FENSE + var/mob/living/carbon/sacker = parent + + if(sacker.drunkenness > 60) // you're far too drunk to hold back! + attack_mod += 1 + else if(sacker.drunkenness > 30) // if you're only a bit drunk though, you're just sloppy + attack_mod -= 1 + if(HAS_TRAIT(sacker, TRAIT_CLUMSY)) + attack_mod -= 2 + if(HAS_TRAIT(sacker, TRAIT_DWARF)) + attack_mod -= 2 + if(HAS_TRAIT(sacker, TRAIT_GIANT)) + attack_mod += 2 + + if(ishuman(target)) + var/mob/living/carbon/human/S = sacker + + var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING) + if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/riot))) // tackling in riot armor is more effective, but tiring + attack_mod += 2 + sacker.adjustStaminaLoss(20) + + var/r = rand(-3, 3) - defense_mod + attack_mod + skill_mod + return r + + +/** + * splat() + * + * This is where we handle diving into dense atoms, generally with effects ranging from bad to REALLY bad. This works as a percentile roll that is modified in two steps as detailed below. The higher + * the roll, the more severe the result. + * + * Mod 1: Speed + * * Base tackle speed is 1, which is what normal gripper gloves use. For other sources with higher speed tackles, like dolphin and ESPECIALLY rocket gloves, we obey Newton's laws and hit things harder. + * * For every unit of speed above 1, move the lower bound of the roll up by 15. Unlike Mod 2, this only serves to raise the lower bound, so it can't be directly counteracted by anything you can control. + * + * Mod 2: Misc + * -Flat modifiers, these take whatever you rolled and add/subtract to it, with the end result capped between the minimum from Mod 1 and 100. Note that since we can't roll higher than 100 to start with, + * wearing a helmet should be enough to remove any chance of permanently paralyzing yourself and dramatically lessen knocking yourself unconscious, even with rocket gloves. Will expand on maybe + * * Wearing a helmet: -6 + * * Wearing armor: -6 + * * Clumsy: +6 + * + * Effects: Below are the outcomes based off your roll, in order of increasing severity + * * 1-63: Knocked down for a few seconds and a bit of brute and stamina damage + * * 64-83: Knocked silly, gain some confusion as well as the above + * * 84-93: Cranial trauma, get a concussion and more confusion, plus more damage + * * 94-98: Knocked unconscious, significant chance to get a random mild brain trauma, as well as a fair amount of damage + * * 99-100: Break your spinal cord, get paralyzed, take a bunch of damage too. Very unlucky! +*/ +/datum/component/tackler/proc/splat(mob/living/carbon/user, atom/hit) + if(istype(hit, /obj/structure/window)) + var/obj/structure/window/W = hit + splatWindow(user, W) + if(QDELETED(W)) + return COMPONENT_MOVABLE_IMPACT_NEVERMIND + return + + var/oopsie_mod = 0 + var/danger_zone = (speed - 1) * 15 // for every extra speed we have over 1, take away 15 of the safest chance + danger_zone = max(min(danger_zone, 100), 1) + + if(ishuman(user)) + var/mob/living/carbon/human/S = user + var/head_slot = S.get_item_by_slot(ITEM_SLOT_HEAD) + var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING) + if(head_slot && (istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) + oopsie_mod -= 6 + if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/))) + oopsie_mod -= 6 + + if(HAS_TRAIT(user, TRAIT_CLUMSY)) + oopsie_mod += 6 //honk! + + var/oopsie = rand(danger_zone, 100) + if(oopsie >= 94 && oopsie_mod < 0) // good job avoiding getting paralyzed! gold star! + to_chat(user, "You're really glad you're wearing protection!") + oopsie += oopsie_mod + + switch(oopsie) + if(99 to INFINITY) + // can you imagine standing around minding your own business when all of the sudden some guy fucking launches himself into a wall at full speed and irreparably paralyzes himself? + user.visible_message("[user] slams face-first into [hit] at an awkward angle, severing [user.p_their()] spinal column with a sickening crack! Holy shit!", "You slam face-first into [hit] at an awkward angle, severing your spinal column with a sickening crack! Holy shit!") + user.adjustStaminaLoss(30) + user.adjustBruteLoss(30) + playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE) + playsound(user, 'sound/effects/splat.ogg', 70, TRUE) + user.emote("scream") + user.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) // oopsie indeed! + shake_camera(user, 7, 7) + user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.clear_fullscreen("flash", 4.5) + + if(94 to 98) + user.visible_message("[user] slams face-first into [hit] with a concerning squish, immediately going limp!", "You slam face-first into [hit], and immediately lose consciousness!") + user.adjustStaminaLoss(100) + user.adjustBruteLoss(30) + user.Unconscious(100) + user.gain_trauma_type(BRAIN_TRAUMA_MILD) + user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) + shake_camera(user, 6, 6) + user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.clear_fullscreen("flash", 3.5) + + if(84 to 93) + user.visible_message("[user] slams head-first into [hit], suffering major cranial trauma!", "You slam head-first into [hit], and the world explodes around you!") + user.adjustStaminaLoss(30) + user.adjustBruteLoss(30) + user.confused += 15 + if(prob(80)) + user.gain_trauma(/datum/brain_trauma/mild/concussion) + user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) + user.DefaultCombatKnockdown(40) + shake_camera(user, 5, 5) + user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.clear_fullscreen("flash", 2.5) + + if(64 to 83) + user.visible_message("[user] slams hard into [hit], knocking [user.p_them()] senseless!", "You slam hard into [hit], knocking yourself senseless!") + user.adjustStaminaLoss(30) + user.adjustBruteLoss(10) + user.confused += 10 + user.DefaultCombatKnockdown(30) + shake_camera(user, 3, 4) + + if(1 to 63) + user.visible_message("[user] slams into [hit]!", "You slam into [hit]!") + user.adjustStaminaLoss(20) + user.adjustBruteLoss(10) + user.DefaultCombatKnockdown(30) + shake_camera(user, 2, 2) + + playsound(user, 'sound/weapons/smash.ogg', 70, TRUE) + + +/datum/component/tackler/proc/resetTackle() + var/mob/living/carbon/P = parent + P.tackling = FALSE + QDEL_NULL(tackle) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + +///A special case for splatting for handling windows +/datum/component/tackler/proc/splatWindow(mob/living/carbon/user, obj/structure/window/W) + playsound(user, "sound/effects/Glasshit.ogg", 140, TRUE) + + if(W.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows + for(var/i = 0, i < speed, i++) + var/obj/item/shard/shard = new /obj/item/shard(get_turf(user)) + //shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=3, pain_chance=5) + shard.updateEmbedding() + user.hitby(shard, skipcatch = TRUE, hitpush = FALSE) + shard.embedding = list() + shard.updateEmbedding() + W.obj_destruction() + user.adjustStaminaLoss(10 * speed) + user.DefaultCombatKnockdown(40) + user.Paralyze(5) + user.visible_message("[user] slams into [W] and shatters it, shredding [user.p_them()]self with glass!", "You slam into [W] and shatter it, shredding yourself with glass!") + + else + user.visible_message("[user] slams into [W] like a bug, then slowly slides off it!", "You slam into [W] like a bug, then slowly slide off it!") + user.Paralyze(2) + user.DefaultCombatKnockdown(20) + W.take_damage(20 * speed) + user.adjustStaminaLoss(10 * speed) + user.adjustBruteLoss(5 * speed) + +/datum/component/tackler/proc/delayedSmash(obj/structure/window/W) + if(W) + W.obj_destruction() + playsound(W, "shatter", 70, TRUE) + +///Check to see if we hit a table, and if so, make a big mess! +/datum/component/tackler/proc/checkObstacle(mob/living/carbon/owner) + if(!owner.tackling) + return + + var/turf/T = get_turf(owner) + var/obj/structure/table/kevved = locate(/obj/structure/table) in T.contents + if(!kevved) + return + + var/list/messes = list() + + // we split the mess-making into two parts (check what we're gonna send flying, intermission for dealing with the tackler, then actually send stuff flying) for the benefit of making sure the face-slam text + // comes before the list of stuff that goes flying, but can still adjust text + damage to how much of a mess it made + for(var/obj/item/I in T.contents) + if(!I.anchored) + messes += I + if(messes.len >= MAX_TABLE_MESSES) + break + + /// for telling HOW big of a mess we just made + var/HOW_big_of_a_miss_did_we_just_make = "" + if(messes.len) + if(messes.len < MAX_TABLE_MESSES / 4) + HOW_big_of_a_miss_did_we_just_make = ", making a mess" + else if(messes.len < MAX_TABLE_MESSES / 2) + HOW_big_of_a_miss_did_we_just_make = ", making a big mess" + else if(messes.len < MAX_TABLE_MESSES) + HOW_big_of_a_miss_did_we_just_make = ", making a giant mess" + else + HOW_big_of_a_miss_did_we_just_make = ", making a ginormous mess!" // an extra exclamation point!! for emphasis!!! + + owner.visible_message("[owner] trips over [kevved] and slams into it face-first[HOW_big_of_a_miss_did_we_just_make]!", "You trip over [kevved] and slam into it face-first[HOW_big_of_a_miss_did_we_just_make]!") + owner.adjustStaminaLoss(20 + messes.len * 2) + owner.adjustBruteLoss(10 + messes.len) + owner.Paralyze(2 * messes.len) + owner.DefaultCombatKnockdown(20 + 5 * messes.len) // 2 seconds of knockdown after the paralyze + + for(var/obj/item/I in messes) + var/dist = rand(1, 3) + var/sp = 2 + if(prob(25 * (src.speed - 1))) // if our tackle speed is higher than 1, with chance (speed - 1 * 25%), throw the thing at our tackle speed + 1 + sp = speed + 1 + I.throw_at(get_ranged_target_turf(I, pick(GLOB.alldirs), range = dist), range = dist, speed = sp) + I.visible_message("[I] goes flying[sp > 3 ? " dangerously fast" : ""]!") // standard embed speed + + playsound(owner, 'sound/weapons/smash.ogg', 70, TRUE) + tackle.finalize(hit=TRUE) + resetTackle() + +#undef MAX_TABLE_MESSES diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm deleted file mode 100644 index ba028e2fd5..0000000000 --- a/code/datums/components/tactical.dm +++ /dev/null @@ -1,44 +0,0 @@ - -/datum/component/tactical - var/allowed_slot - -/datum/component/tactical/Initialize(allowed_slot) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - - src.allowed_slot = allowed_slot - -/datum/component/tactical/RegisterWithParent() - . = ..() - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/modify) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unmodify) - -/datum/component/tactical/UnregisterFromParent() - . = ..() - UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) - unmodify() - -/datum/component/fantasy/Destroy() - unmodify() - return ..() - -/datum/component/tactical/proc/modify(obj/item/source, mob/user, slot) - if(allowed_slot && slot != allowed_slot) - unmodify() - return - - var/obj/item/master = parent - var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) - I.copy_overlays(master) - I.override = TRUE - source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) - I.layer = ABOVE_MOB_LAYER - -/datum/component/tactical/proc/unmodify(obj/item/source, mob/user) - var/obj/item/master = source || parent - if(!user) - if(!ismob(master.loc)) - return - user = master.loc - - user.remove_alt_appearance("sneaking_mission") diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index e73465d785..dde8961482 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -27,6 +27,8 @@ GLOBAL_LIST_EMPTY(uplinks) var/datum/ui_state/checkstate var/compact_mode = FALSE var/debug = FALSE + var/saved_player_population = 0 + var/list/filters = list() /datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate, datum/traitor_class/traitor_class) if(!isitem(parent)) @@ -47,7 +49,6 @@ GLOBAL_LIST_EMPTY(uplinks) RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation) GLOB.uplinks += src - var/list/filters = list() if(istype(traitor_class)) filters = traitor_class.uplink_filters starting_tc = traitor_class.TC @@ -68,6 +69,7 @@ GLOBAL_LIST_EMPTY(uplinks) if(!lockable) active = TRUE locked = FALSE + saved_player_population = GLOB.joined_player_list.len /datum/component/uplink/InheritComponent(datum/component/uplink/U) lockable |= U.lockable @@ -117,7 +119,18 @@ GLOBAL_LIST_EMPTY(uplinks) return active = TRUE if(user) + //update the saved population + var/previous_player_population = saved_player_population + saved_player_population = GLOB.joined_player_list.len + //if population has changed, update uplink items + if(saved_player_population != previous_player_population) + //make sure discounts are not rerolled + var/old_discounts = uplink_items["Discounted Gear"] + uplink_items = get_uplink_items(gamemode, FALSE, allow_restricted, filters) + if(old_discounts) + uplink_items["Discounted Gear"] = old_discounts ui_interact(user) + // an unlocked uplink blocks also opening the PDA or headset menu return COMPONENT_NO_INTERACT @@ -190,7 +203,9 @@ GLOBAL_LIST_EMPTY(uplinks) if(item in buyable_items) var/datum/uplink_item/I = buyable_items[item] - MakePurchase(usr, I) + //check to make sure people cannot buy items when the player pop is below the requirement + if(GLOB.joined_player_list.len >= I.player_minimum) + MakePurchase(usr, I) . = TRUE if("lock") active = FALSE diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm index 9239d4c565..56e06e3582 100644 --- a/code/datums/components/virtual_reality.dm +++ b/code/datums/components/virtual_reality.dm @@ -176,7 +176,7 @@ /** *The following procs simply acts as hooks for quit(), since components do not use callbacks anymore */ -/datum/component/virtual_reality/proc/action_trigger(datum/signal_source, datum/action/source) +/datum/component/virtual_reality/proc/action_trigger(datum/action/source, obj/target) quit() return COMPONENT_ACTION_BLOCK_TRIGGER diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm index feaa88f934..4760757701 100644 --- a/code/datums/components/wearertargeting.dm +++ b/code/datums/components/wearertargeting.dm @@ -19,4 +19,4 @@ UnregisterSignal(equipper, signals) /datum/component/wearertargeting/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, signals) \ No newline at end of file + UnregisterSignal(user, signals) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 20f2c1bbb5..0fbbcd59b0 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -19,7 +19,6 @@ var/datum/component/wet_floor/WF = newcomp //Lets make an assumption if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. CRASH("Wet floor component tried to inherit another, but the other was able to garbage collect while being inherited! What a waste of time!") - return for(var/i in WF.time_left_list) add_wet(text2num(i), WF.time_left_list[i]) @@ -182,7 +181,7 @@ /datum/component/wet_floor/proc/_do_add_wet(type, duration_minimum, duration_add, duration_maximum) var/time = 0 if(LAZYACCESS(time_left_list, "[type]")) - time = CLAMP(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) + time = clamp(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) else time = min(duration_minimum, duration_maximum) LAZYSET(time_left_list, "[type]", time) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 8eda936bb7..80570d0c3b 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -19,7 +19,7 @@ dashing_item = dasher holder = user -/datum/action/innate/dash/IsAvailable() +/datum/action/innate/dash/IsAvailable(silent = FALSE) if(current_charges > 0) return TRUE else @@ -42,7 +42,7 @@ addtimer(CALLBACK(src, .proc/charge), charge_rate) /datum/action/innate/dash/proc/charge() - current_charges = CLAMP(current_charges + 1, 0, max_charges) + current_charges = clamp(current_charges + 1, 0, max_charges) holder.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, 1) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a856f2392d..6202ac444e 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -109,6 +109,8 @@ UnregisterSignal(target, signal_procs[target]) //END: ECS SHIT + SSsounds.free_datum_channels(src) + return QDEL_HINT_QUEUE #ifdef DATUMVAR_DEBUGGING_MODE @@ -173,11 +175,9 @@ if(!islist(jsonlist)) if(!istext(jsonlist)) CRASH("Invalid JSON") - return jsonlist = json_decode(jsonlist) if(!islist(jsonlist)) CRASH("Invalid JSON") - return if(!jsonlist["DATUM_TYPE"]) return if(!ispath(jsonlist["DATUM_TYPE"])) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 81db7deb68..348f9e6778 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,7 +1,3 @@ -#define VV_MSG_MARKED "
    Marked Object" -#define VV_MSG_EDITED "
    Var Edited" -#define VV_MSG_DELETED "
    Deleted" - /datum/proc/CanProcCall(procname) return TRUE @@ -21,1386 +17,35 @@ return debug_variable(var_name, list(), 0, src) return debug_variable(var_name, vars[var_name], 0, src) +/datum/proc/can_vv_mark() + return TRUE + //please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down //add separaters by doing . += "---" /datum/proc/vv_get_dropdown() . = list() - . += "---" - .["Call Proc"] = "?_src_=vars;[HrefToken()];proc_call=\ref[src]" - .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=\ref[src]" - .["Delete"] = "?_src_=vars;[HrefToken()];delete=\ref[src]" - .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=\ref[src]" + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_CALLPROC, "Call Proc") + VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object") + VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete") + VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player") + VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") +//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! +//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! +//This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. +/datum/proc/vv_do_topic(list/href_list) + if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE)) + return FALSE //This is VV, not to be called by anything else. + if(href_list[VV_HK_MODIFY_TRAITS]) + usr.client.holder.modify_traits(src) + return TRUE + +/datum/proc/vv_get_header() + . = list() + if(("name" in vars) && !isatom(src)) + . += "[vars["name"]]
    " /datum/proc/on_reagent_change(changetype) return - - -/client/proc/debug_variables(datum/D in world) - set category = "Debug" - set name = "View Variables" - //set src in world - var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. - - if(!usr.client || !usr.client.holder) //The usr vs src abuse in this proc is intentional and must not be changed - to_chat(usr, "You need to be an administrator to access this.") - return - - if(!D) - return - - var/islist = islist(D) - if (!islist && !istype(D)) - return - - var/title = "" - var/refid = "\ref[D]" - var/icon/sprite - var/hash - - var/type = /list - if (!islist) - type = D.type - - if(istype(D, /atom)) - var/atom/AT = D - if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - hash = md5(AT.icon) - hash = md5(hash + AT.icon_state) - src << browse_rsc(sprite, "vv[hash].png") - - title = "[D] ([REF(D)]) = [type]" - var/formatted_type = replacetext("[type]", "/", "/") - - var/sprite_text - if(sprite) - sprite_text = "" - var/list/atomsnowflake = list() - - if(istype(D, /atom)) - var/atom/A = D - if(isliving(A)) - atomsnowflake += "[D]" - atomsnowflake += "
    << [dir2text(A.dir) || A.dir] >>" - var/mob/living/M = A - atomsnowflake += {" -
    [M.ckey || "No ckey"] / [M.real_name || "No real name"] -
    - BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getOrganLoss(ORGAN_SLOT_BRAIN)] - STAMINA:[M.getStaminaLoss()] - "} - if(GLOB.Debug2) - atomsnowflake += {" - HEART:[M.getOrganLoss(ORGAN_SLOT_HEART)] - LIVER:[M.getOrganLoss(ORGAN_SLOT_LIVER)] - LUNGS:[M.getOrganLoss(ORGAN_SLOT_LUNGS)] - EYES:[M.getOrganLoss(ORGAN_SLOT_EYES)] - EARS:[M.getOrganLoss(ORGAN_SLOT_EARS)] - STOMACH:[M.getOrganLoss(ORGAN_SLOT_STOMACH)] - TONGUE:[M.getOrganLoss(ORGAN_SLOT_TONGUE)] - APPENDIX:[M.getOrganLoss(ORGAN_SLOT_APPENDIX)] - "} - atomsnowflake += {" - - "} - else - atomsnowflake += "[D]" - atomsnowflake += "
    << [dir2text(A.dir) || A.dir] >>" - else if("name" in D.vars) - atomsnowflake += "[D]" - else - atomsnowflake += "[formatted_type]" - formatted_type = null - - var/marked - if(holder && holder.marked_datum && holder.marked_datum == D) - marked = VV_MSG_MARKED - var/varedited_line = "" - if(!islist && (D.datum_flags & DF_VAR_EDITED)) - varedited_line = VV_MSG_EDITED - var/deleted_line - if(!islist && D.gc_destroyed) - deleted_line = VV_MSG_DELETED - - var/list/dropdownoptions = list() - if (islist) - dropdownoptions = list( - "---", - "Add Item" = "?_src_=vars;[HrefToken()];listadd=[refid]", - "Remove Nulls" = "?_src_=vars;[HrefToken()];listnulls=[refid]", - "Remove Dupes" = "?_src_=vars;[HrefToken()];listdupes=[refid]", - "Set len" = "?_src_=vars;[HrefToken()];listlen=[refid]", - "Shuffle" = "?_src_=vars;[HrefToken()];listshuffle=[refid]", - "Show VV To Player" = "?_src_=vars;[HrefToken()];expose=[refid]" - ) - else - dropdownoptions = D.vv_get_dropdown() - var/list/dropdownoptions_html = list() - - for (var/name in dropdownoptions) - var/link = dropdownoptions[name] - if (link) - dropdownoptions_html += "" - else - dropdownoptions_html += "" - - var/list/names = list() - if (!islist) - for (var/V in D.vars) - names += V - sleep(1)//For some reason, without this sleep, VVing will cause client to disconnect on certain objects. - - var/list/variable_html = list() - if (islist) - var/list/L = D - for (var/i in 1 to L.len) - var/key = L[i] - var/value - if (IS_NORMAL_LIST(L) && !isnum(key)) - value = L[key] - variable_html += debug_variable(i, value, 0, D) - else - - names = sortList(names) - for (var/V in names) - if(D.can_vv_get(V)) - variable_html += D.vv_get_var(V) - - var/html = {" - - - - [title] - - - - -
    - - - - - -
    - - - - -
    - [sprite_text] -
    - [atomsnowflake.Join()] -
    -
    -
    - [formatted_type] - [marked] - [varedited_line] - [deleted_line] -
    -
    -
    - Refresh -
    - -
    -
    -
    -
    -
    - - E - Edit, tries to determine the variable type by itself.
    - C - Change, asks you for the var type first.
    - M - Mass modify: changes this variable for all objects of this type.
    -
    -
    - - - - - -
    -
    - Search: -
    -
    - -
    -
    -
      - [variable_html.Join()] -
    - - - -"} - src << browse(html, "window=variables[refid];size=475x650") - - -/client/proc/vv_update_display(datum/D, span, content) - src << output("[span]:[content]", "variables\ref[D].browser:replace_span") - - -#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) -/proc/debug_variable(name, value, level, datum/DA = null, sanitize = TRUE) - var/header - if(DA) - if (islist(DA)) - var/index = name - if (value) - name = DA[name] //name is really the index until this line - else - value = DA[name] - header = "
  • (E) (C) (-) " - else - header = "
  • (E) (C) (M) " - else - header = "
  • " - - var/item - if (isnull(value)) - item = "[VV_HTML_ENCODE(name)] = null" - - else if (istext(value)) - item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\"" - - else if (isicon(value)) - #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - item = "[VV_HTML_ENCODE(name)] = ([value]) " - #else - item = "[VV_HTML_ENCODE(name)] = /icon ([value])" - #endif - - else if (isfile(value)) - item = "[VV_HTML_ENCODE(name)] = '[value]'" - - else if (istype(value, /datum)) - var/datum/D = value - if ("[D]" != "[D.type]") //if the thing as a name var, lets use it. - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D] [D.type]" - else - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D.type]" - - else if (islist(value)) - var/list/L = value - var/list/items = list() - - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150))) - for (var/i in 1 to L.len) - var/key = L[i] - var/val - if (IS_NORMAL_LIST(L) && !isnum(key)) - val = L[key] - if (isnull(val)) // we still want to display non-null false values, such as 0 or "" - val = key - key = i - - items += debug_variable(key, val, level + 1, sanitize = sanitize) - - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])
      [items.Join()]
    " - else - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" - - else if (name in GLOB.bitfields) - var/list/flags = list() - for (var/i in GLOB.bitfields[name]) - if (value & GLOB.bitfields[name][i]) - flags += i - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(jointext(flags, ", "))]" - else - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)]" - - return "[header][item]
  • " - -#undef VV_HTML_ENCODE - -/client/proc/view_var_Topic(href, href_list, hsrc) - if( (usr.client != src) || !src.holder || !holder.CheckAdminHref(href, href_list)) - return - if(href_list["Vars"]) - debug_variables(locate(href_list["Vars"])) - - else if(href_list["datumrefresh"]) - var/datum/DAT = locate(href_list["datumrefresh"]) - if(!DAT) //can't be an istype() because /client etc aren't datums - return - src.debug_variables(DAT) - - else if(href_list["mob_player_panel"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["mob_player_panel"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.holder.show_player_panel(M) - - else if(href_list["godmode"]) - if(!check_rights(R_ADMIN)) - return - - var/mob/M = locate(href_list["godmode"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.cmd_admin_godmode(M) - - else if(href_list["mark_object"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["mark_object"]) - if(!istype(D)) - to_chat(usr, "This can only be done to instances of type /datum") - return - - if(holder.marked_datum) - vv_update_display(holder.marked_datum, "marked", "") - holder.marked_datum = D - vv_update_display(D, "marked", VV_MSG_MARKED) - - else if(href_list["proc_call"]) - if(!check_rights(NONE)) - return - - var/T = locate(href_list["proc_call"]) - - if(T) - callproc_datum(T) - - else if(href_list["delete"]) - if(!check_rights(R_DEBUG, 0)) - return - - var/datum/D = locate(href_list["delete"]) - if(!istype(D)) - to_chat(usr, "Unable to locate item!") - admin_delete(D) - if (isturf(D)) // show the turf that took its place - debug_variables(D) - - else if(href_list["osay"]) - if(!check_rights(R_FUN, 0)) - return - usr.client.object_say(locate(href_list["osay"])) - - else if(href_list["regenerateicons"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["regenerateicons"]) in GLOB.mob_list - if(!ismob(M)) - to_chat(usr, "This can only be done to instances of type /mob") - return - M.regenerate_icons() - else if(href_list["expose"]) - if(!check_rights(R_ADMIN, FALSE)) - return - var/thing = locate(href_list["expose"]) - if (!thing) - return - var/value = vv_get_value(VV_CLIENT) - if (value["class"] != VV_CLIENT) - return - var/client/C = value["value"] - if (!C) - return - var/prompt = alert("Do you want to grant [C] access to view this VV window? (they will not be able to edit or change anything nor open nested vv windows unless they themselves are an admin)", "Confirm", "Yes", "No") - if (prompt != "Yes" || !usr.client) - return - message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") - log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [thing]") - to_chat(C, "[usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") - C.debug_variables(thing) - - -//Needs +VAREDIT past this point - - else if(check_rights(R_VAREDIT)) - - - //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). - - if(href_list["rename"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["rename"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - var/new_name = stripped_input(usr,"What would you like to name this mob?","Input a name",M.real_name,MAX_NAME_LEN) - if( !new_name || !M ) - return - - message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") - M.fully_replace_character_name(M.real_name,new_name) - vv_update_display(M, "name", new_name) - vv_update_display(M, "real_name", M.real_name || "No real name") - - else if(href_list["varnameedit"] && href_list["datumedit"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["datumedit"]) - if(!istype(D, /datum)) - to_chat(usr, "This can only be used on datums") - return - - if (!modify_variables(D, href_list["varnameedit"], 1)) - return - switch(href_list["varnameedit"]) - if("name") - vv_update_display(D, "name", "[D]") - if("dir") - if(isatom(D)) - var/dir = D.vars["dir"] - vv_update_display(D, "dir", dir2text(dir) || dir) - if("ckey") - if(isliving(D)) - vv_update_display(D, "ckey", D.vars["ckey"] || "No ckey") - if("real_name") - if(isliving(D)) - vv_update_display(D, "real_name", D.vars["real_name"] || "No real name") - - else if(href_list["varnamechange"] && href_list["datumchange"]) - if(!check_rights(NONE)) - return - - var/D = locate(href_list["datumchange"]) - if(!istype(D, /datum)) - to_chat(usr, "This can only be used on datums") - return - - modify_variables(D, href_list["varnamechange"], 0) - - else if(href_list["varnamemass"] && href_list["datummass"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["datummass"]) - if(!istype(D)) - to_chat(usr, "This can only be used on instances of type /datum") - return - - cmd_mass_modify_object_variables(D, href_list["varnamemass"]) - - else if(href_list["listedit"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listedit"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list(L, null, "list", "contents", index, autodetect_class = TRUE) - - else if(href_list["listchange"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listchange"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list(L, null, "list", "contents", index, autodetect_class = FALSE) - - else if(href_list["listremove"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listremove"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - var/variable = L[index] - var/prompt = alert("Do you want to remove item number [index] from list?", "Confirm", "Yes", "No") - if (prompt != "Yes") - return - L.Cut(index, index+1) - log_world("### ListVarEdit by [src]: /list's contents: REMOVED=[html_encode("[variable]")]") - log_admin("[key_name(src)] modified list's contents: REMOVED=[variable]") - message_admins("[key_name_admin(src)] modified list's contents: REMOVED=[variable]") - - else if(href_list["listadd"]) - var/list/L = locate(href_list["listadd"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list_add(L, null, "list", "contents") - - else if(href_list["listdupes"]) - var/list/L = locate(href_list["listdupes"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - uniqueList_inplace(L) - log_world("### ListVarEdit by [src]: /list contents: CLEAR DUPES") - log_admin("[key_name(src)] modified list's contents: CLEAR DUPES") - message_admins("[key_name_admin(src)] modified list's contents: CLEAR DUPES") - - else if(href_list["listnulls"]) - var/list/L = locate(href_list["listnulls"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - listclearnulls(L) - log_world("### ListVarEdit by [src]: /list contents: CLEAR NULLS") - log_admin("[key_name(src)] modified list's contents: CLEAR NULLS") - message_admins("[key_name_admin(src)] modified list's contents: CLEAR NULLS") - - else if(href_list["listlen"]) - var/list/L = locate(href_list["listlen"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - var/value = vv_get_value(VV_NUM) - if (value["class"] != VV_NUM) - return - - L.len = value["value"] - log_world("### ListVarEdit by [src]: /list len: [L.len]") - log_admin("[key_name(src)] modified list's len: [L.len]") - message_admins("[key_name_admin(src)] modified list's len: [L.len]") - - else if(href_list["listshuffle"]) - var/list/L = locate(href_list["listshuffle"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - shuffle_inplace(L) - log_world("### ListVarEdit by [src]: /list contents: SHUFFLE") - log_admin("[key_name(src)] modified list's contents: SHUFFLE") - message_admins("[key_name_admin(src)] modified list's contents: SHUFFLE") - - else if(href_list["give_spell"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["give_spell"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_spell(M) - - else if(href_list["remove_spell"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["remove_spell"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - remove_spell(M) - - else if(href_list["give_disease"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["give_disease"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_disease(M) - - else if(href_list["gib"]) - if(!check_rights(R_FUN)) - return - - var/mob/M = locate(href_list["gib"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.cmd_admin_gib(M) - - else if(href_list["build_mode"]) - if(!check_rights(R_BUILDMODE)) - return - - var/mob/M = locate(href_list["build_mode"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - togglebuildmode(M) - - else if(href_list["drop_everything"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["drop_everything"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(usr.client) - usr.client.cmd_admin_drop_everything(M) - - else if(href_list["direct_control"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["direct_control"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(usr.client) - usr.client.cmd_assume_direct_control(M) - - else if(href_list["offer_control"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["offer_control"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - offer_control(M) - - else if (href_list["modarmor"]) - if(!check_rights(NONE)) - return - - var/obj/O = locate(href_list["modarmor"]) - if(!istype(O)) - to_chat(usr, "This can only be used on instances of type /obj") - return - - var/list/pickerlist = list() - var/list/armorlist = O.armor.getList() - - for (var/i in armorlist) - pickerlist += list(list("value" = armorlist[i], "name" = i)) - - var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [O]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist) - - if (islist(result)) - if (result["button"] == 2) // If the user pressed the cancel button - return - // text2num conveniently returns a null on invalid values - O.armor = O.armor.setRating(melee = text2num(result["values"]["melee"]),\ - bullet = text2num(result["values"]["bullet"]),\ - laser = text2num(result["values"]["laser"]),\ - energy = text2num(result["values"]["energy"]),\ - bomb = text2num(result["values"]["bomb"]),\ - bio = text2num(result["values"]["bio"]),\ - rad = text2num(result["values"]["rad"]),\ - fire = text2num(result["values"]["fire"]),\ - acid = text2num(result["values"]["acid"])) - log_admin("[key_name(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") - message_admins("[key_name_admin(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") - else - return - - else if(href_list["delall"]) - if(!check_rights(R_DEBUG|R_SERVER)) - return - - var/obj/O = locate(href_list["delall"]) - if(!isobj(O)) - to_chat(usr, "This can only be used on instances of type /obj") - return - - var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") - if(action_type == "Cancel" || !action_type) - return - - if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes") - return - - if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") - return - - var/O_type = O.type - switch(action_type) - if("Strict type") - var/i = 0 - for(var/obj/Obj in world) - if(Obj.type == O_type) - i++ - qdel(Obj) - CHECK_TICK - if(!i) - to_chat(usr, "No objects of this type exist") - return - log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - if("Type and subtypes") - var/i = 0 - for(var/obj/Obj in world) - if(istype(Obj,O_type)) - i++ - qdel(Obj) - CHECK_TICK - if(!i) - to_chat(usr, "No objects of this type exist") - return - log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - - else if(href_list["addreagent"]) - if(!check_rights(NONE)) - return - - var/atom/A = locate(href_list["addreagent"]) - - if(!A.reagents) - var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num - if(amount) - A.create_reagents(amount) - - if(A.reagents) - var/chosen_id = choose_reagent_id(usr) - if(chosen_id) - var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num - if(amount) - A.reagents.add_reagent(chosen_id, amount) - log_admin("[key_name(usr)] has added [amount] units of [chosen_id] to \the [A]") - message_admins("[key_name(usr)] has added [amount] units of [chosen_id] to \the [A]") - - else if(href_list["explode"]) - if(!check_rights(R_FUN)) - return - - var/atom/A = locate(href_list["explode"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return - - src.cmd_admin_explosion(A) - - else if(href_list["emp"]) - if(!check_rights(R_FUN)) - return - - var/atom/A = locate(href_list["emp"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return - - src.cmd_admin_emp(A) - - else if(href_list["modtransform"]) - if(!check_rights(R_DEBUG)) - return - - var/atom/A = locate(href_list["modtransform"]) - if(!istype(A)) - to_chat(usr, "This can only be done to atoms.") - return - - var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") - var/matrix/M = A.transform - switch(result) - if("Scale") - var/x = input(usr, "Choose x mod","Transform Mod") as null|num - var/y = input(usr, "Choose y mod","Transform Mod") as null|num - if(!isnull(x) && !isnull(y)) - A.transform = M.Scale(x,y) - if("Translate") - var/x = input(usr, "Choose x mod","Transform Mod") as null|num - var/y = input(usr, "Choose y mod","Transform Mod") as null|num - if(!isnull(x) && !isnull(y)) - A.transform = M.Translate(x,y) - if("Rotate") - var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num - if(!isnull(angle)) - A.transform = M.Turn(angle) - - else if(href_list["rotatedatum"]) - if(!check_rights(NONE)) - return - - var/atom/A = locate(href_list["rotatedatum"]) - if(!istype(A)) - to_chat(usr, "This can only be done to instances of type /atom") - return - - switch(href_list["rotatedir"]) - if("right") - A.setDir(turn(A.dir, -45)) - if("left") - A.setDir(turn(A.dir, 45)) - vv_update_display(A, "dir", dir2text(A.dir)) - - else if(href_list["editorgans"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["editorgans"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - manipulate_organs(C) - - else if(href_list["givemartialart"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["givemartialart"]) in GLOB.carbon_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/artpaths = subtypesof(/datum/martial_art) - var/list/artnames = list() - for(var/i in artpaths) - var/datum/martial_art/M = i - artnames[initial(M.name)] = M - - var/result = input(usr, "Choose the martial art to teach","JUDO CHOP") as null|anything in artnames - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/chosenart = artnames[result] - var/datum/martial_art/MA = new chosenart - MA.teach(C) - - else if(href_list["givetrauma"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["givetrauma"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/traumas = subtypesof(/datum/brain_trauma) - var/result = input(usr, "Choose the brain trauma to apply","Traumatize") as null|anything in traumas - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - C.gain_trauma(result) - - else if(href_list["curetraumas"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["curetraumas"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - C.cure_all_traumas(TRAUMA_RESILIENCE_ABSOLUTE) - - else if(href_list["hallucinate"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/hallucinations = subtypesof(/datum/hallucination) - var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - new result(C, TRUE) - - else if(href_list["makehuman"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list - if(!istype(Mo)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!Mo) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("humanone"=href_list["makehuman"])) - - else if(href_list["makemonkey"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) - - else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makerobot"=href_list["makerobot"])) - - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makealien"=href_list["makealien"])) - - else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makeslime"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makeslime"=href_list["makeslime"])) - - else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/H = locate(href_list["makeai"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makeai"=href_list["makeai"])) - - else if(href_list["setspecies"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list - - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/newtype = GLOB.species_list[result] - admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [H] to [result]") - H.set_species(newtype) - - else if(href_list["editbodypart"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/C = locate(href_list["editbodypart"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("add","remove", "augment") - if(!edit_action) - return - var/list/limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - if(edit_action == "augment") - limb_list += BODY_ZONE_CHEST - var/result = input(usr, "Please choose which body part to [edit_action]","[capitalize(edit_action)] Body Part") as null|anything in limb_list - - if(!C) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/obj/item/bodypart/BP = C.get_bodypart(result) - switch(edit_action) - if("remove") - if(BP) - BP.drop_limb() - else - to_chat(usr, "[C] doesn't have such bodypart.") - if("add") - if(BP) - to_chat(usr, "[C] already has such bodypart.") - else - if(!C.regenerate_limb(result)) - to_chat(usr, "[C] cannot have such bodypart.") - if("augment") - if(ishuman(C)) - if(BP) - BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE) - else - to_chat(usr, "[C] doesn't have such bodypart.") - else - to_chat(usr, "Only humans can be augmented.") - admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [C]") - - - else if(href_list["purrbation"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["purrbation"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - if(!ishumanbasic(H)) - to_chat(usr, "This can only be done to the basic human species at the moment.") - return - - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - - var/success = purrbation_toggle(H) - if(success) - to_chat(usr, "Put [H] on purrbation.") - log_admin("[key_name(usr)] has put [key_name(H)] on purrbation.") - var/msg = "[key_name_admin(usr)] has put [key_name(H)] on purrbation." - message_admins(msg) - admin_ticket_log(H, msg) - - else - to_chat(usr, "Removed [H] from purrbation.") - log_admin("[key_name(usr)] has removed [key_name(H)] from purrbation.") - var/msg = "[key_name_admin(usr)] has removed [key_name(H)] from purrbation." - message_admins(msg) - admin_ticket_log(H, msg) - - else if(href_list["adjustDamage"] && href_list["mobToDamage"]) - if(!check_rights(NONE)) - return - - var/mob/living/L = locate(href_list["mobToDamage"]) in GLOB.mob_list - if(!istype(L)) - return - - var/Text = href_list["adjustDamage"] - - var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num - - if(!L) - to_chat(usr, "Mob doesn't exist anymore") - return - - var/newamt - switch(Text) - if("brute") - L.adjustBruteLoss(amount) - newamt = L.getBruteLoss() - if("fire") - L.adjustFireLoss(amount) - newamt = L.getFireLoss() - if("toxin") - L.adjustToxLoss(amount) - newamt = L.getToxLoss() - if("oxygen") - L.adjustOxyLoss(amount) - newamt = L.getOxyLoss() - if("brain") - L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) - if("clone") - L.adjustCloneLoss(amount) - newamt = L.getCloneLoss() - if("stamina") - L.adjustStaminaLoss(amount) - newamt = L.getStaminaLoss() - if("heart") - L.adjustOrganLoss(ORGAN_SLOT_HEART, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_HEART) - if("liver") - L.adjustOrganLoss(ORGAN_SLOT_LIVER, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_LIVER) - if("lungs") - L.adjustOrganLoss(ORGAN_SLOT_LUNGS, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_LUNGS) - if("eye_sight") - L.adjustOrganLoss(ORGAN_SLOT_EYES, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_EYES) - if("ears") - L.adjustOrganLoss(ORGAN_SLOT_EARS, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_EARS) - if("stomach") - L.adjustOrganLoss(ORGAN_SLOT_STOMACH, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_STOMACH) - if("tongue") - L.adjustOrganLoss(ORGAN_SLOT_TONGUE, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_TONGUE) - if("appendix") - L.adjustOrganLoss(ORGAN_SLOT_APPENDIX, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_APPENDIX) - else - to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") - return - - if(amount != 0) - log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] " - message_admins("[msg]") - admin_ticket_log(L, msg) - vv_update_display(L, Text, "[newamt]") - else if(href_list["copyoutfit"]) - if(!check_rights(R_SPAWN)) - return - var/mob/living/carbon/human/H = locate(href_list["copyoutfit"]) in GLOB.carbon_list - if(istype(H)) - H.copy_outfit() - else if(href_list["modquirks"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["modquirks"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - var/list/options = list("Clear"="Clear") - for(var/x in subtypesof(/datum/quirk)) - var/datum/quirk/T = x - var/qname = initial(T.name) - options[H.has_quirk(T) ? "[qname] (Remove)" : "[qname] (Add)"] = T - - var/result = input(usr, "Choose quirk to add/remove","Quirk Mod") as null|anything in options - if(result) - if(result == "Clear") - for(var/datum/quirk/q in H.roundstart_quirks) - H.remove_quirk(q.type) - else - var/T = options[result] - if(H.has_quirk(T)) - H.remove_quirk(T) - else - H.add_quirk(T,TRUE) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index a7a61802d3..216d82b4c8 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -145,4 +145,10 @@ return !is_mouth_covered() /mob/living/carbon/CanSpreadAirborneDisease() - return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25))) \ No newline at end of file + return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25))) + +/mob/living/proc/set_shocked() + flags_1 |= SHOCKED_1 + +/mob/living/proc/reset_shocked() + flags_1 &= ~ SHOCKED_1 \ No newline at end of file diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 330a3494d9..7e3ac29b2d 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -246,10 +246,10 @@ else visibility_flags &= ~HIDDEN_SCANNER - SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) + SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) - cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20 + cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_rate"], 2) SetSeverity(properties["severity"]) GenerateCure(properties) @@ -304,7 +304,7 @@ // Will generate a random cure, the less resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/GenerateCure() if(properties && properties.len) - var/res = CLAMP(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) + var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) if(res == oldres) return cures = list(pick(advance_cures[res])) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 59afe163b4..787704e848 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -126,7 +126,7 @@ var/datum/reagent/R = E M.reagents.remove_reagent(R.type, actual_power) if(food_conversion) - M.nutrition += 0.3 + M.adjust_nutrition(0.3) if(prob(2)) to_chat(M, "You feel a mild warmth as your blood purifies itself.") return 1 @@ -164,7 +164,7 @@ C.reagents.metabolize(C, can_overdose=TRUE) C.overeatduration = max(C.overeatduration - 2, 0) var/lost_nutrition = 9 - (reduced_hunger * 5) - C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed + C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed if(prob(2)) to_chat(C, "You feel an odd gurgle in your stomach, as if it was working much faster than normal.") return 1 @@ -454,7 +454,7 @@ "Transmission 6" = "Additionally heals cellular damage and toxin lovers.", "Resistance 7" = "Increases healing speed.", ) - + /datum/symptom/heal/radiation/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index bbacdd885d..79966b8f54 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -58,7 +58,7 @@ var/mob/living/carbon/C = M if(prob(10)) if(trauma_heal_severe) - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_SURGERY) else C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 9be484d99a..9fa6ed5cc8 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -30,7 +30,6 @@ Bonus symptom_delay_max = 120 var/scramble_language = FALSE var/datum/language/current_language - var/datum/language_holder/original_language threshold_desc = list( "Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.", "Stage Speed 7" = "Changes voice more often.", @@ -48,9 +47,6 @@ Bonus symptom_delay_max = 85 if(A.properties["transmittable"] >= 14) //random language scramble_language = TRUE - var/mob/living/M = A.affected_mob - var/datum/language_holder/mob_language = M.get_language_holder() - original_language = mob_language.copy() /datum/symptom/voice_change/Activate(datum/disease/advance/A) if(!..()) @@ -64,12 +60,10 @@ Bonus if(ishuman(M)) var/mob/living/carbon/human/H = M H.SetSpecialVoice(H.dna.species.random_name(H.gender)) - if(scramble_language) - H.remove_language(current_language) + if(scramble_language && !current_language) // Last part prevents rerolling language with small amounts of cure. current_language = pick(subtypesof(/datum/language) - /datum/language/common) - H.grant_language(current_language) - var/datum/language_holder/mob_language = H.get_language_holder() - mob_language.only_speaks_language = current_language + H.add_blocked_language(subtypesof(/datum/language) - current_language, LANGUAGE_VOICECHANGE) + H.grant_language(current_language, TRUE, TRUE, LANGUAGE_VOICECHANGE) /datum/symptom/voice_change/End(datum/disease/advance/A) ..() @@ -77,7 +71,5 @@ Bonus var/mob/living/carbon/human/H = A.affected_mob H.UnsetSpecialVoice() if(scramble_language) - var/mob/living/M = A.affected_mob - M.copy_known_languages_from(original_language, TRUE) - current_language = null - QDEL_NULL(original_language) + A.affected_mob.remove_blocked_language(subtypesof(/datum/language), LANGUAGE_VOICECHANGE) + A.affected_mob.remove_all_languages(LANGUAGE_VOICECHANGE) // In case someone managed to get more than one anyway. diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 5eab698750..bb0d9bdcf9 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -50,4 +50,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.nutrition = max(M.nutrition - 100, 0) \ No newline at end of file + M.adjust_nutrition(-100) \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 1bb927aa12..d72dcbd362 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -52,9 +52,9 @@ to_chat(affected_mob, pick(stage5)) if(QDELETED(affected_mob)) return - if(affected_mob.notransform) + if(affected_mob.mob_transforming) return - affected_mob.notransform = 1 + affected_mob.mob_transforming = 1 for(var/obj/item/W in affected_mob.get_equipped_items(TRUE)) affected_mob.dropItemToGround(W) for(var/obj/item/I in affected_mob.held_items) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 23902603ce..f59a19c7a3 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -52,7 +52,7 @@ if(prob(3)) to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) - affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) + affected_mob.adjust_nutrition(-100) if(prob(15)) to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") affected_mob.adjust_bodytemperature(40) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 71a5bcb99e..e769f466b9 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE permeability_mod = 0.75 - desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." + desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of mental hysteria, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." severity = DISEASE_SEVERITY_HARMFUL required_organs = list(/obj/item/bodypart/head) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 95b45b6bc2..ed5104e296 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -17,6 +17,7 @@ var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block var/stability = 100 var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. + var/skin_tone_override //because custom skin tones are not found in the skin_tones global list. /datum/dna/New(mob/living/new_holder) if(istype(new_holder)) @@ -41,11 +42,13 @@ /datum/dna/proc/transfer_identity(mob/living/carbon/destination, transfer_SE = 0) if(!istype(destination)) return + var/old_size = destination.dna.features["body_size"] destination.dna.unique_enzymes = unique_enzymes destination.dna.uni_identity = uni_identity destination.dna.blood_type = blood_type - destination.set_species(species.type, icon_update=0) + destination.dna.skin_tone_override = skin_tone_override destination.dna.features = features.Copy() + destination.set_species(species.type, icon_update=0) destination.dna.real_name = real_name destination.dna.nameless = nameless destination.dna.custom_species = custom_species @@ -56,6 +59,8 @@ if(transfer_SE) destination.dna.mutation_index = mutation_index + destination.dna.update_body_size(old_size) + SEND_SIGNAL(destination, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, src, transfer_SE) /datum/dna/proc/copy_dna(datum/dna/new_dna) @@ -63,6 +68,7 @@ new_dna.mutation_index = mutation_index new_dna.uni_identity = uni_identity new_dna.blood_type = blood_type + new_dna.skin_tone_override = skin_tone_override new_dna.features = features.Copy() new_dna.species = new species.type new_dna.real_name = real_name @@ -146,10 +152,11 @@ return . /datum/dna/proc/generate_dna_blocks() - var/bonus + var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations if(species && species.inert_mutation) - bonus = GET_INITIALIZED_MUTATION(species.inert_mutation) - var/list/mutations_temp = GLOB.good_mutations + GLOB.bad_mutations + GLOB.not_good_mutations + bonus + var/bonus = GET_INITIALIZED_MUTATION(species.inert_mutation) + if(bonus) + mutations_temp += bonus if(!LAZYLEN(mutations_temp)) return mutation_index.Cut() @@ -239,6 +246,17 @@ construct_block(GLOB.mam_body_markings_list.Find(features["mam_body_markings"]), GLOB.mam_body_markings_list.len) if(DNA_TAUR_BLOCK) construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) + if(species.mutant_bodyparts["taur"] && ishuman(holder)) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]] + switch(T?.taur_mode) + if(STYLE_HOOF_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_SHOE + if(STYLE_PAW_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_CLAW + if(STYLE_SNEK_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_CRAWL + else + H.physiology.footstep_type = null //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/HM) @@ -259,10 +277,11 @@ return /datum/dna/proc/is_same_as(datum/dna/D) - if(uni_identity == D.uni_identity && mutation_index == D.mutation_index && real_name == D.real_name && nameless == D.nameless && custom_species == D.custom_species) - if(species.type == D.species.type && features == D.features && blood_type == D.blood_type) - return 1 - return 0 + if(uni_identity != D.uni_identity || mutation_index != D.mutation_index || real_name != D.real_name || nameless != D.nameless || custom_species != D.custom_species) + return FALSE + if(species.type != D.species.type || features != D.features || blood_type != D.blood_type || skin_tone_override != D.skin_tone_override) + return FALSE + return TRUE /datum/dna/proc/update_instability(alert=TRUE) stability = 100 @@ -302,7 +321,7 @@ unique_enzymes = generate_unique_enzymes() uni_identity = generate_uni_identity() generate_dna_blocks() - features = random_features(species?.id) + features = random_features(species?.id, holder?.gender) /datum/dna/stored //subtype used by brain mob's stored_dna @@ -348,6 +367,11 @@ var/datum/species/old_species = dna.species dna.species = new_race dna.species.on_species_gain(src, old_species, pref_load) + if(ishuman(src)) + qdel(language_holder) + var/species_holder = initial(mrace.species_language_holder) + language_holder = new species_holder(src) + update_atom_languages() /mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) ..() @@ -367,14 +391,6 @@ /mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures) - if(newfeatures) - dna.features = newfeatures - - if(mrace) - var/datum/species/newrace = new mrace.type - newrace.copy_properties_from(mrace) - set_species(newrace, icon_update=0) - if(newreal_name) real_name = newreal_name dna.generate_unique_enzymes() @@ -384,7 +400,17 @@ if(ui) dna.uni_identity = ui - updateappearance(icon_update=0) + updateappearance(icon_update=FALSE) + + if(newfeatures) + var/old_size = dna.features["body_size"] + dna.features = newfeatures + dna.update_body_size(old_size) + + if(mrace) + var/datum/species/newrace = new mrace.type + newrace.copy_properties_from(mrace) + set_species(newrace, icon_update=FALSE) if(LAZYLEN(mutation_index)) dna.mutation_index = mutation_index.Copy() @@ -425,7 +451,7 @@ var/structure = dna.uni_identity hair_color = sanitize_hexcolor(getblock(structure, DNA_HAIR_COLOR_BLOCK)) facial_hair_color = sanitize_hexcolor(getblock(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)) - skin_tone = GLOB.skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), GLOB.skin_tones.len)] + skin_tone = dna.skin_tone_override || GLOB.skin_tones[deconstruct_block(getblock(structure, DNA_SKIN_TONE_BLOCK), GLOB.skin_tones.len)] eye_color = sanitize_hexcolor(getblock(structure, DNA_EYE_COLOR_BLOCK)) facial_hair_style = GLOB.facial_hair_styles_list[deconstruct_block(getblock(structure, DNA_FACIAL_HAIR_STYLE_BLOCK), GLOB.facial_hair_styles_list.len)] hair_style = GLOB.hair_styles_list[deconstruct_block(getblock(structure, DNA_HAIR_STYLE_BLOCK), GLOB.hair_styles_list.len)] @@ -644,3 +670,15 @@ gib() else set_species(/datum/species/dullahan) + +/datum/dna/proc/update_body_size(old_size) + if(!holder || features["body_size"] == old_size) + return + holder.resize = features["body_size"] / old_size + holder.update_transform() + var/danger = CONFIG_GET(number/threshold_body_size_slowdown) + if(features["body_size"] < danger) + var/slowdown = 1 + round(danger/features["body_size"], 0.1) * CONFIG_GET(number/body_size_slowdown_multiplier) + holder.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/small_stride, TRUE, slowdown) + else if(old_size < danger) + holder.remove_movespeed_modifier(/datum/movespeed_modifier/small_stride) diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index b9e774aa50..744f57c391 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -175,11 +175,6 @@ name = "Trooper REAL_NAME" desc = "That's not red paint. That's real corgi blood." -/datum/dog_fashion/head/colour - name = "Stylish REAL_NAME" - desc = "From the tips of their paws to the top of their head, they look like a made bed." - emote_see = list("tries to tap dances.","looks sadly at others outfits...","barks at bad fashion!") - /datum/dog_fashion/head/telegram name = "Messenger REAL_NAME" desc = "Dont shoot the messenger..." diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index f74dcd0b6e..a147325170 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -19,11 +19,13 @@ SHOULD_CALL_PARENT(1) if(type == /datum/element) return ELEMENT_INCOMPATIBLE + SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src) if(element_flags & ELEMENT_DETACH) RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE) /// Deactivates the functionality defines by the element on the given datum /datum/element/proc/Detach(datum/source, force) + SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) SHOULD_CALL_PARENT(1) UnregisterSignal(source, COMSIG_PARENT_QDELETING) diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm new file mode 100644 index 0000000000..960d22af56 --- /dev/null +++ b/code/datums/elements/art.dm @@ -0,0 +1,64 @@ + +#define BAD_ART 12.5 +#define GOOD_ART 25 +#define GREAT_ART 50 + +/datum/element/art + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/impressiveness = 0 + +/datum/element/art/Attach(datum/target, impress) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target)) + return ELEMENT_INCOMPATIBLE + impressiveness = impress + if(isobj(target)) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_obj_examine) + if(isstructure(target)) + RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + if(isitem(target)) + RegisterSignal(target, COMSIG_ITEM_ATTACK_SELF, .proc/apply_moodlet) + else + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_other_examine) + +/datum/element/art/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_ITEM_ATTACK_SELF)) + return ..() + +/datum/element/art/proc/apply_moodlet(atom/source, mob/M, impress) + M.visible_message("[M] stops and looks intently at [source].", \ + "You stop to take in [source].") + switch(impress) + if (0 to BAD_ART) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) + if (BAD_ART to GOOD_ART) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok) + if (GOOD_ART to GREAT_ART) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood) + if(GREAT_ART to INFINITY) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) + +/datum/element/art/proc/on_other_examine(atom/source, mob/M) + apply_moodlet(source, M, impressiveness) + +/datum/element/art/proc/on_obj_examine(atom/source, mob/M) + var/obj/O = source + apply_moodlet(source, M, impressiveness *(O.obj_integrity/O.max_integrity)) + +/datum/element/art/proc/on_attack_hand(atom/source, mob/M) + to_chat(M, "You start examining [source]...") + if(!do_after(M, 20, target = source)) + return + on_obj_examine(source, M) + +/datum/element/art/rev + +/datum/element/art/rev/apply_moodlet(atom/source, mob/M, impress) + M.visible_message("[M] stops to inspect [source].", \ + "You take in [source], inspecting the fine craftsmanship of the proletariat.") + + if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) + else + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm new file mode 100644 index 0000000000..8acfda73e1 --- /dev/null +++ b/code/datums/elements/beauty.dm @@ -0,0 +1,34 @@ +/datum/element/beauty + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/beauty = 0 + +/datum/element/beauty/Attach(datum/target, beautyamount) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target)) + return ELEMENT_INCOMPATIBLE + beauty = beautyamount + RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area) + RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area) + var/area/A = get_area(target) + if(A) + enter_area(null, A) + +/datum/element/beauty/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_ENTER_AREA, COMSIG_EXIT_AREA)) + var/area/A = get_area(target) + if(A) + exit_area(null, A) + return ..() + +/datum/element/beauty/proc/enter_area(datum/source, area/A) + if(A.outdoors) + return + A.totalbeauty += beauty + A.update_beauty() + +/datum/element/beauty/proc/exit_area(datum/source, area/A) + if(A.outdoors) + return + A.totalbeauty -= beauty + A.update_beauty() diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index 3f80204089..d86fe22632 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -1,6 +1,6 @@ /datum/element/cleaning/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/Clean) diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm new file mode 100644 index 0000000000..4bd482915a --- /dev/null +++ b/code/datums/elements/decal.dm @@ -0,0 +1,75 @@ +/datum/element/decal + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/cleanable + var/description + var/mutable_appearance/pic + var/list/num_decals_per_atom + + var/first_dir // This stores the direction of the decal compared to the parent facing NORTH + +/datum/element/decal/Attach(datum/target, _icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description, _alpha=255) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !_icon || !_icon_state || !isatom(target)) + return ELEMENT_INCOMPATIBLE + var/atom/A = target + if(!pic) + // It has to be made from an image or dir breaks because of a byond bug + var/temp_image = image(_icon, null, _icon_state, _layer, _dir) + pic = new(temp_image) + pic.color = _color + pic.alpha = _alpha + first_dir = _dir + description = _description + cleanable = _cleanable + + LAZYINITLIST(num_decals_per_atom) + + if(!num_decals_per_atom[A]) + if(first_dir) + RegisterSignal(A, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react) + if(cleanable) + RegisterSignal(A, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) + if(description) + RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/examine) + + apply(A, TRUE) + + num_decals_per_atom[A]++ + +/datum/element/decal/Detach(datum/target) + var/atom/A = target + remove(A, A.dir) + UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) + LAZYREMOVE(num_decals_per_atom, A) + return ..() + +/datum/element/decal/proc/remove(atom/target, old_dir) + pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(old_dir)) + for(var/i in 1 to num_decals_per_atom[target]) + target.cut_overlay(pic, TRUE) + if(isitem(target)) + addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/element/decal/proc/apply(atom/target, init = FALSE) + pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(target.dir)) + if(init) + target.add_overlay(pic, TRUE) + else + for(var/i in 1 to num_decals_per_atom[target]) + target.add_overlay(pic, TRUE) + if(isitem(target)) + addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) + +/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir) + if(old_dir == new_dir) + return + remove(source, old_dir) + apply(source) + +/datum/element/decal/proc/clean_react(datum/source, strength) + if(strength >= cleanable) + Detach(source) + +/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list) + examine_list += description diff --git a/code/datums/elements/dusts_on_leaving_area.dm b/code/datums/elements/dusts_on_leaving_area.dm index 9527e1fd3a..7b1807a15c 100644 --- a/code/datums/elements/dusts_on_leaving_area.dm +++ b/code/datums/elements/dusts_on_leaving_area.dm @@ -1,28 +1,20 @@ /datum/element/dusts_on_leaving_area element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE id_arg_index = 2 - var/list/attached_mobs = list() var/list/area_types = list() /datum/element/dusts_on_leaving_area/Attach(datum/target,types) . = ..() if(!ismob(target)) return ELEMENT_INCOMPATIBLE - attached_mobs += target area_types = types - START_PROCESSING(SSprocessing,src) + RegisterSignal(target,COMSIG_ENTER_AREA,.proc/check_dust) /datum/element/dusts_on_leaving_area/Detach(mob/M) . = ..() - if(M in attached_mobs) - attached_mobs -= M - if(!attached_mobs.len) - STOP_PROCESSING(SSprocessing,src) + UnregisterSignal(M,COMSIG_ENTER_AREA) -/datum/element/dusts_on_leaving_area/process() - for(var/m in attached_mobs) - var/mob/M = m - var/area/A = get_area(M) - if(!(A.type in area_types)) - M.dust(force = TRUE) - Detach(M) +/datum/element/dusts_on_leaving_area/proc/check_dust(datum/source, area/A) + var/mob/M = source + if(istype(M) && !(A.type in area_types)) + M.dust(force = TRUE) diff --git a/code/datums/elements/dwarfism.dm b/code/datums/elements/dwarfism.dm new file mode 100644 index 0000000000..fefbe4fbe7 --- /dev/null +++ b/code/datums/elements/dwarfism.dm @@ -0,0 +1,42 @@ +#define SHORT 4/5 +#define TALL 5/4 + +///Very similar to squish, but for dwarves and shorties +/datum/element/dwarfism + element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + id_arg_index = 2 + var/comsig + var/list/attached_targets = list() + +/datum/element/dwarfism/Attach(datum/target, comsig, comsig_target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.comsig = comsig + + var/mob/living/L = target + if(L.lying != 0) + L.transform = L.transform.Scale(SHORT, 1) + else + L.transform = L.transform.Scale(1, SHORT) + attached_targets[target] = comsig_target + RegisterSignal(target, comsig, .proc/check_loss) //Second arg of the signal will be checked against the comsig_target. + +/datum/element/dwarfism/proc/check_loss(mob/living/L, comsig_target) + if(attached_targets[L] == comsig_target) + Detach(L) + +/datum/element/dwarfism/Detach(mob/living/L) + . = ..() + if(QDELETED(L)) + return + if(L.lying != 0) + L.transform = L.transform.Scale(TALL, 1) + else + L.transform = L.transform.Scale(1, TALL) + UnregisterSignal(L, comsig) + attached_targets -= L + +#undef SHORT +#undef TALL diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 7477742673..91c2120fc2 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -4,7 +4,7 @@ var/list/user_by_item = list() /datum/element/earhealing/New() - START_PROCESSING(SSdcs, src) + START_PROCESSING(SSobj, src) /datum/element/earhealing/Attach(datum/target) . = ..() diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm new file mode 100644 index 0000000000..8a7acde9cb --- /dev/null +++ b/code/datums/elements/embed.dm @@ -0,0 +1,227 @@ +/* + The presence of this element allows an item (or a projectile carrying an item) to embed itself in a human or turf when it is thrown into a target (whether by hand, gun, or explosive wave) with either + at least 4 throwspeed (EMBED_THROWSPEED_THRESHOLD) or ignore_throwspeed_threshold set to TRUE. Items meant to be used as shrapnel for projectiles should have ignore_throwspeed_threshold set to true. + + Whether we're dealing with a direct /obj/item (throwing a knife at someone) or an /obj/projectile with a shrapnel_type, how we handle things plays out the same, with one extra step separating them. + Items simply make their COMSIG_MOVABLE_IMPACT or COMSIG_MOVABLE_IMPACT_ZONE check (against a closed turf or a carbon, respectively), while projectiles check on COMSIG_PROJECTILE_SELF_ON_HIT. + Upon a projectile hitting a valid target, it spawns whatever type of payload it has defined, then has that try to embed itself in the target on its own. + + Otherwise non-embeddable or stickable items can be made embeddable/stickable through wizard events/sticky tape/admin memes. +*/ + +#define STANDARD_WALL_HARDNESS 40 + +/datum/element/embed + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/initialized = FALSE /// whether we can skip assigning all the vars (since these are bespoke elements, we don't have to reset the vars every time we attach to something, we already know what we are!) + + // all of this stuff is explained in _DEFINES/combat.dm + var/embed_chance + var/fall_chance + var/pain_chance + var/pain_mult + var/remove_pain_mult + var/impact_pain_mult + var/rip_time + var/ignore_throwspeed_threshold + var/jostle_chance + var/jostle_pain_mult + var/pain_stam_pct + var/payload_type + var/embed_chance_turf_mod + +/datum/element/embed/Attach(datum/target, embed_chance, fall_chance, pain_chance, pain_mult, remove_pain_mult, impact_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, embed_chance_turf_mod, projectile_payload=/obj/item/shard) + . = ..() + + if(!isitem(target) && !isprojectile(target)) + return ELEMENT_INCOMPATIBLE + + if(isitem(target)) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, .proc/checkEmbedMob) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/checkEmbedOther) + RegisterSignal(target, COMSIG_ELEMENT_ATTACH, .proc/severancePackage) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/examined) + RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, .proc/tryForceEmbed) + RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, .proc/detachFromWeapon) + if(!initialized) + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + src.impact_pain_mult = impact_pain_mult + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + src.embed_chance_turf_mod = embed_chance_turf_mod + initialized = TRUE + else + payload_type = projectile_payload + RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/checkEmbedProjectile) + + +/datum/element/embed/Detach(obj/target) + . = ..() + if(isitem(target)) + UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_PARENT_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED)) + else + UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT)) + + +/// Checking to see if we're gonna embed into a human +/datum/element/embed/proc/checkEmbedMob(obj/item/weapon, mob/living/carbon/victim, hit_zone, datum/thrownthing/throwingdatum, blocked = FALSE, forced = FALSE) + if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) + return + + var/actual_chance = embed_chance + + if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign + var/armor = max(victim.run_armor_check(hit_zone, "bullet", silent=TRUE), victim.run_armor_check(hit_zone, "bomb", silent=TRUE)) // we'll be nice and take the better of bullet and bomb armor + + if(armor) // we only care about armor penetration if there's actually armor to penetrate + var/pen_mod = -armor + weapon.armour_penetration // even a little bit of armor can make a big difference for shrapnel with large negative armor pen + actual_chance += pen_mod // doing the armor pen as a separate calc just in case this ever gets expanded on + if(actual_chance <= 0) + victim.visible_message("[weapon] bounces off [victim]'s armor!", "[weapon] bounces off your armor!", vision_distance = COMBAT_MESSAGE_RANGE) + return + + var/roll_embed = prob(actual_chance) + var/pass = forced || ((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && roll_embed && (!HAS_TRAIT(victim, TRAIT_AUTO_CATCH_ITEM) || victim.incapacitated() || victim.get_active_held_item())) + if(!pass) + return + + var/obj/item/bodypart/limb = victim.get_bodypart(hit_zone) || pick(victim.bodyparts) + victim.AddComponent(/datum/component/embedded,\ + weapon,\ + throwingdatum,\ + part = limb,\ + embed_chance = embed_chance,\ + fall_chance = fall_chance,\ + pain_chance = pain_chance,\ + pain_mult = pain_mult,\ + remove_pain_mult = remove_pain_mult,\ + rip_time = rip_time,\ + ignore_throwspeed_threshold = ignore_throwspeed_threshold,\ + jostle_chance = jostle_chance,\ + jostle_pain_mult = jostle_pain_mult,\ + pain_stam_pct = pain_stam_pct,\ + embed_chance_turf_mod = embed_chance_turf_mod) + + return TRUE + +/// We need the hit_zone if we're embedding into a human, so this proc only handles if we're embedding into a turf +/datum/element/embed/proc/checkEmbedOther(obj/item/weapon, turf/closed/hit, datum/thrownthing/throwingdatum, forced=FALSE) + if(!istype(hit)) + return + + var/chance = embed_chance + embed_chance_turf_mod + if(iswallturf(hit)) + var/turf/closed/wall/W = hit + chance += 2 * (W.hardness - STANDARD_WALL_HARDNESS) + + if(!forced && chance <= 0 || embed_chance_turf_mod <= -100) + return + + var/pass = ((((throwingdatum ? throwingdatum.speed : weapon.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || ignore_throwspeed_threshold) && prob(chance)) + if(!pass) + return + + hit.AddComponent(/datum/component/embedded,\ + weapon,\ + throwingdatum,\ + embed_chance = embed_chance,\ + fall_chance = fall_chance,\ + pain_chance = pain_chance,\ + pain_mult = pain_mult,\ + remove_pain_mult = remove_pain_mult,\ + rip_time = rip_time,\ + ignore_throwspeed_threshold = ignore_throwspeed_threshold,\ + jostle_chance = jostle_chance,\ + jostle_pain_mult = jostle_pain_mult,\ + pain_stam_pct = pain_stam_pct,\ + embed_chance_turf_mod = embed_chance_turf_mod) + + return TRUE + +///A different embed element has been attached, so we'll detach and let them handle things +/datum/element/embed/proc/severancePackage(obj/item/weapon, datum/element/E) + if(istype(E, /datum/element/embed)) + Detach(weapon) + +///If we don't want to be embeddable anymore (deactivating an e-dagger for instance) +/datum/element/embed/proc/detachFromWeapon(obj/weapon) + Detach(weapon) + +///Someone inspected our embeddable item +/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) + if(I.isEmbedHarmless()) + examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!" + else + examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!" + +/** + * checkEmbedProjectile() is what we get when a projectile with a defined shrapnel_type impacts a target. + * + * If we hit a valid target (carbon or closed turf), we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead + * it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to. + */ +/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone) + if(!iscarbon(hit) && !isclosedturf(hit)) + Detach(P) + return // we don't care + + var/obj/item/payload = new payload_type(get_turf(hit)) + var/did_embed + if(iscarbon(hit)) + var/mob/living/carbon/C = hit + var/obj/item/bodypart/limb + limb = C.get_bodypart(hit_zone) + if(!limb) + limb = C.get_bodypart() + did_embed = payload.tryEmbed(limb) + else + did_embed = payload.tryEmbed(hit) + + if(!did_embed) + payload.failedEmbed() + Detach(P) + +/** + * tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it. + * + * The reason for this extra mucking about is avoiding having to do an extra hitby(), and annoying the target by impacting them once with the projectile, then again with the shrapnel (which likely represents said bullet), and possibly + * AGAIN if we actually embed. This way, we save on at least one message. Runs the standard embed checks on the mob/turf. + * + * Arguments: + * * I- what we're trying to embed, obviously + * * target- what we're trying to shish-kabob, either a bodypart, a carbon, or a closed turf + * * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting. + * * forced- if we want this to succeed 100% + */ +/datum/element/embed/proc/tryForceEmbed(obj/item/I, atom/target, hit_zone, forced=FALSE) + var/obj/item/bodypart/limb + var/mob/living/carbon/C + var/turf/closed/T + + if(!forced && !prob(embed_chance)) + return + + if(iscarbon(target)) + C = target + if(!hit_zone) + limb = pick(C.bodyparts) + hit_zone = limb.body_zone + else if(isbodypart(target)) + limb = target + hit_zone = limb.body_zone + C = limb.owner + else if(isclosedturf(target)) + T = target + + if(C) + return checkEmbedMob(I, C, hit_zone, forced=TRUE) + else if(T) + return checkEmbedOther(I, T, forced=TRUE) diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm new file mode 100644 index 0000000000..c24914decb --- /dev/null +++ b/code/datums/elements/empprotection.dm @@ -0,0 +1,18 @@ +/datum/element/empprotection + element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + id_arg_index = 2 + var/flags = NONE + +/datum/element/empprotection/Attach(datum/target, _flags) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) + return ELEMENT_INCOMPATIBLE + flags = _flags + RegisterSignal(target, COMSIG_ATOM_EMP_ACT, .proc/getEmpFlags) + +/datum/element/empprotection/Detach(atom/target) + UnregisterSignal(target, COMSIG_ATOM_EMP_ACT) + return ..() + +/datum/element/empprotection/proc/getEmpFlags(datum/source, severity) + return flags diff --git a/code/datums/elements/firestacker.dm b/code/datums/elements/firestacker.dm index 39021d23bb..771812242f 100644 --- a/code/datums/elements/firestacker.dm +++ b/code/datums/elements/firestacker.dm @@ -10,7 +10,7 @@ /datum/element/firestacker/Attach(datum/target, amount) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE src.amount = amount diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index e9d8f278f4..92251861ed 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -5,12 +5,16 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code id_arg_index = 3 var/flavor_name = "Flavor Text" var/list/texts_by_atom = list() - var/addendum = "This can also be used for OOC notes and preferences!" + var/addendum = "" var/always_show = FALSE var/max_len = MAX_FLAVOR_LEN var/can_edit = TRUE + /// For preference/DNA saving/loading. Null to prevent. Prefs are only loaded from obviously if it exists in preferences.features. + var/save_key + /// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\] + var/examine_no_preview = FALSE -/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) +/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE) . = ..() if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too. @@ -25,6 +29,8 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code addendum = _addendum always_show = _always_show can_edit = _edit + save_key = _save_key + examine_no_preview = _examine_no_preview RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/show_flavor) @@ -33,9 +39,12 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src) M.verbs |= /mob/proc/manage_flavor_tests + if(save_key && ishuman(target)) + RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text) + /datum/element/flavor_text/Detach(atom/A) . = ..() - UnregisterSignal(A, COMSIG_PARENT_EXAMINE) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_HUMAN_PREFS_COPIED_TO)) texts_by_atom -= A if(can_edit && ismob(A)) var/mob/M = A @@ -58,6 +67,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/text = texts_by_atom[target] if(!text) return + if(examine_no_preview) + examine_list += "\[[flavor_name]\]" + return var/msg = replacetext(text, "\n", " ") if(length_char(msg) <= 40) examine_list += "[msg]" @@ -105,20 +117,24 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code return FALSE var/lower_name = lowertext(flavor_name) - var/new_text = stripped_multiline_input(user, "Set the [lower_name] displayed on 'examine'. [addendum]", flavor_name, texts_by_atom[usr], max_len, TRUE) + var/new_text = stripped_multiline_input(user, "Set the [lower_name] displayed on 'examine'. [addendum]", flavor_name, html_decode(texts_by_atom[usr]), max_len, TRUE) if(!isnull(new_text) && (user in texts_by_atom)) - texts_by_atom[user] = html_decode(new_text) + texts_by_atom[user] = new_text to_chat(src, "Your [lower_name] has been updated.") return TRUE return FALSE +/datum/element/flavor_text/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE) + if(P.features.Find(save_key)) + texts_by_atom[H] = P.features[save_key] + //subtypes with additional hooks for DNA and preferences. /datum/element/flavor_text/carbon //list of antagonists etcetera that should have nothing to do with people's snowflakes. var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert, /datum/antagonist/nukeop, /datum/antagonist/wizard)) -/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) +/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE) if(!iscarbon(target)) return ELEMENT_INCOMPATIBLE . = ..() @@ -127,7 +143,6 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code RegisterSignal(target, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, .proc/update_dna_flavor_text) RegisterSignal(target, COMSIG_MOB_ANTAG_ON_GAIN, .proc/on_antag_gain) if(ishuman(target)) - RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text) RegisterSignal(target, COMSIG_HUMAN_HARDSET_DNA, .proc/update_dna_flavor_text) RegisterSignal(target, COMSIG_HUMAN_ON_RANDOMIZE, .proc/unset_flavor) @@ -136,15 +151,12 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_MOB_ANTAG_ON_GAIN, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE)) /datum/element/flavor_text/carbon/proc/update_dna_flavor_text(mob/living/carbon/C) - texts_by_atom[C] = C.dna.features["flavor_text"] - -/datum/element/flavor_text/carbon/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE) - texts_by_atom[H] = P.features["flavor_text"] + texts_by_atom[C] = C.dna.features[save_key] /datum/element/flavor_text/carbon/set_flavor(mob/living/carbon/user) . = ..() if(. && user.dna) - user.dna.features["flavor_text"] = texts_by_atom[user] + user.dna.features[save_key] = texts_by_atom[user] /datum/element/flavor_text/carbon/proc/unset_flavor(mob/living/carbon/user) texts_by_atom[user] = "" @@ -153,4 +165,4 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code if(is_type_in_typecache(antag, i_dont_even_know_who_you_are)) texts_by_atom[user] = "" if(user.dna) - user.dna.features["flavor_text"] = "" \ No newline at end of file + user.dna.features[save_key] = "" diff --git a/code/datums/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm new file mode 100644 index 0000000000..0b50df5b21 --- /dev/null +++ b/code/datums/elements/forced_gravity.dm @@ -0,0 +1,30 @@ +/datum/element/forced_gravity + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/gravity + var/ignore_space + +/datum/element/forced_gravity/Attach(datum/target, gravity=1, ignore_space=FALSE) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + + src.gravity = gravity + src.ignore_space = ignore_space + + RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, .proc/gravity_check) + if(isturf(target)) + RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, .proc/turf_gravity_check) + +/datum/element/forced_gravity/Detach(datum/source, force) + . = ..() + var/static/list/signals_b_gone = list(COMSIG_ATOM_HAS_GRAVITY, COMSIG_TURF_HAS_GRAVITY) + UnregisterSignal(source, signals_b_gone) + +/datum/element/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs) + if(!ignore_space && isspaceturf(location)) + return + gravs += gravity + +/datum/element/forced_gravity/proc/turf_gravity_check(datum/source, atom/checker, list/gravs) + return gravity_check(null, source, gravs) diff --git a/code/datums/elements/ghost_role_eligibility.dm b/code/datums/elements/ghost_role_eligibility.dm index 519a34e01f..4e7884efe4 100644 --- a/code/datums/elements/ghost_role_eligibility.dm +++ b/code/datums/elements/ghost_role_eligibility.dm @@ -1,66 +1,48 @@ +GLOBAL_LIST_EMPTY(ghost_eligible_mobs) + +GLOBAL_LIST_EMPTY(client_ghost_timeouts) + /datum/element/ghost_role_eligibility element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE - id_arg_index = 3 - var/list/timeouts = list() - var/list/mob/eligible_mobs = list() + id_arg_index = 2 var/penalizing = FALSE var/free_ghost = FALSE -/datum/element/ghost_role_eligibility/Attach(datum/target,penalize = FALSE,free_ghosting = FALSE, penalize_on_ghost = FALSE) +/datum/element/ghost_role_eligibility/Attach(datum/target,free_ghosting = FALSE, penalize_on_ghost = FALSE) . = ..() if(!ismob(target)) return ELEMENT_INCOMPATIBLE penalizing = penalize_on_ghost free_ghost = free_ghosting var/mob/M = target - if(!(M in eligible_mobs)) - eligible_mobs += M - if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. - var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES - var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES - if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. - penalty += roundstart_quit_limit - world.time - if(penalty) - penalty += world.realtime - if(SSautotransfer.can_fire && SSautotransfer.maxvotes) - var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes - if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) - penalty = CANT_REENTER_ROUND - if(!(M.ckey in timeouts)) - timeouts += M.ckey - timeouts[M.ckey] = 0 - else if(timeouts[M.ckey] == CANT_REENTER_ROUND) - return - timeouts[M.ckey] = max(timeouts[M.ckey],penalty) - RegisterSignal(M,COMSIG_MOB_GHOSTIZE,.proc/get_ghost_flags) + if(!(M in GLOB.ghost_eligible_mobs)) + GLOB.ghost_eligible_mobs += M + RegisterSignal(M, COMSIG_MOB_GHOSTIZE, .proc/get_ghost_flags) /datum/element/ghost_role_eligibility/Detach(mob/M) . = ..() - if(M in eligible_mobs) - eligible_mobs -= M + if(M in GLOB.ghost_eligible_mobs) + GLOB.ghost_eligible_mobs -= M + UnregisterSignal(M, COMSIG_MOB_GHOSTIZE) -/datum/element/ghost_role_eligibility/proc/get_all_ghost_role_eligible(silent = FALSE) +/proc/get_all_ghost_role_eligible(silent = FALSE) var/list/candidates = list() - for(var/m in eligible_mobs) + for(var/m in GLOB.ghost_eligible_mobs) var/mob/M = m if(M.can_reenter_round(TRUE)) candidates += M return candidates /mob/proc/can_reenter_round(silent = FALSE) - var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(list(/datum/element/ghost_role_eligibility)) - return eli.can_reenter_round(src,silent) - -/datum/element/ghost_role_eligibility/proc/can_reenter_round(var/mob/M,silent = FALSE) - if(!(M in eligible_mobs)) + if(!(src in GLOB.ghost_eligible_mobs)) return FALSE - if(!(M.ckey in timeouts)) + if(!(ckey in GLOB.client_ghost_timeouts)) return TRUE - var/timeout = timeouts[M.ckey] + var/timeout = GLOB.client_ghost_timeouts[ckey] if(timeout != CANT_REENTER_ROUND && timeout <= world.realtime) return TRUE - if(!silent && M.client) - to_chat(M, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].") + if(!silent && client) + to_chat(src, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].") return FALSE /datum/element/ghost_role_eligibility/proc/get_ghost_flags() diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index 3cd5367f65..d770e0f30d 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -71,11 +71,12 @@ name = "bugged mob" desc = "Yell at coderbrush." icon = null - alternate_worn_icon = 'icons/mob/animals_held.dmi' + mob_overlay_icon = 'icons/mob/animals_held.dmi' righthand_file = 'icons/mob/animals_held_rh.dmi' lefthand_file = 'icons/mob/animals_held_lh.dmi' icon_state = "" w_class = WEIGHT_CLASS_BULKY + dynamic_hair_suffix = "" var/mob/living/held_mob /obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, slots = NONE) @@ -85,7 +86,7 @@ assimilate(target) if(alt_worn) - alternate_worn_icon = alt_worn + mob_overlay_icon = alt_worn if(worn_state) item_state = worn_state icon_state = worn_state @@ -162,6 +163,11 @@ L.visible_message("[held_mob] escapes from [L]!", "[held_mob] escapes your grip!") release() +/obj/item/clothing/head/mob_holder/mob_can_equip(mob/living/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) + if(M == held_mob || !ishuman(M)) //monkeys holding monkeys holding monkeys... + return FALSE + return ..() + /obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env) var/atom/location = loc if(!loc) diff --git a/code/datums/elements/photosynthesis.dm b/code/datums/elements/photosynthesis.dm new file mode 100644 index 0000000000..93e4369b8b --- /dev/null +++ b/code/datums/elements/photosynthesis.dm @@ -0,0 +1,81 @@ +/datum/element/photosynthesis + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + ///how much brute damage (or integrity, for objects) is healed (taken if positive) at maximum luminosity. (if lum_minus were 0) + var/light_bruteheal = -1 + ///how much burn damage is restored/taken at maximum luminosity. Mobs only. + var/light_burnheal = -1 + ///how much tox damage is restored/taken at maximum luminosity. Mobs only. + var/light_toxheal = -1 + ///how much oxy damage is restored/taken at maximum luminosity. Mobs only. + var/light_oxyheal = -1 + ///how nutrition recovery/expenses factor, not affected by bonus_lum and malus_lum. Mobs only. + var/light_nutrition_gain = 4 + ///A value subtracted to the lum count, which allows targets to wilt or heal in the darkness. + var/lum_minus = 0.5 + ///the minimum lum count over which where the target damage is adjusted. + var/bonus_lum = 0.2 + ///the maximum lum count under which the target damage is inversely adjusted. + var/malus_lum = 0 + ///List of atoms this element is attached to. Doubles as a multiplier if the same element is attached multiple times to a target multiple times. + var/list/attached_atoms + +/datum/element/photosynthesis/Attach(datum/target, brute = -1, burn = -1, tox = -1, oxy = -1, nutri = 4, minus = 0.2, bonus = 0.3, malus = -0.1) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !(isliving(target) || (isobj(target) && light_bruteheal))) + return ELEMENT_INCOMPATIBLE + light_bruteheal = brute + light_burnheal = burn + light_toxheal = tox + light_oxyheal = oxy + light_nutrition_gain = nutri + lum_minus = minus + bonus_lum = bonus + malus_lum = malus + + if(!attached_atoms) + attached_atoms = list() + START_PROCESSING(SSobj, src) + attached_atoms[target]++ + +/datum/element/photosynthesis/Detach(datum/target) + attached_atoms[target]-- + if(!attached_atoms[target]) + attached_atoms -= target + if(!length(attached_atoms)) + STOP_PROCESSING(SSobj, src) + attached_atoms = null + return ..() + +/datum/element/photosynthesis/process() + for(var/A in attached_atoms) + var/atom/movable/AM = A + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(AM.loc)) //else, there's considered to be no light + var/turf/T = AM.loc + light_amount = (T.get_lumcount() - lum_minus) + + if(isliving(AM)) + var/mob/living/L = AM + if(L.stat == DEAD) + continue + if(light_nutrition_gain) + L.adjust_nutrition(light_amount * light_nutrition_gain * attached_atoms[AM], NUTRITION_LEVEL_FULL) + if(light_amount > bonus_lum || light_amount < malus_lum) + var/mult = ((light_amount > bonus_lum) ? 1 : -1) * attached_atoms[AM] + if(light_bruteheal) + L.adjustBruteLoss(light_bruteheal * mult) + if(light_burnheal) + L.adjustFireLoss(light_burnheal * mult) + if(light_toxheal) + L.adjustToxLoss(light_toxheal * mult) + if(light_oxyheal) + L.adjustOxyLoss(light_oxyheal * mult) + + else if(light_amount > bonus_lum || light_amount < malus_lum) + var/obj/O = AM + var/damage = light_bruteheal * ((light_amount > bonus_lum) ? 1 : -1) * attached_atoms[AM] + if(damage < 0 && O.obj_integrity < O.max_integrity) + O.obj_integrity = min(O.obj_integrity + damage, O.max_integrity) //Till we get a obj heal proc... + else + O.take_damage(damage, BRUTE, FALSE, FALSE, null, 100) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm new file mode 100644 index 0000000000..1c438c86c5 --- /dev/null +++ b/code/datums/elements/polychromic.dm @@ -0,0 +1,187 @@ +#define POLYCHROMIC_ALTCLICK (1<<0) +#define POLYCHROMIC_ACTION (1<<1) +#define POLYCHROMIC_NO_HELD (1<<2) +#define POLYCHROMIC_NO_WORN (1<<3) + +/datum/element/polychromic + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 3 + var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number. + var/list/colors_by_atom = list() //list of color strings or mutable appearances, depending on the above variable. + var/icon_file + var/worn_file //used in place of items' held or mob overlay icons if present. + var/list/overlays_names //wrap numbers into text strings please. + var/list/actions_by_atom = list() + var/poly_flags + var/static/list/suits_with_helmet_typecache = typecacheof(list(/obj/item/clothing/suit/hooded, /obj/item/clothing/suit/space/hardsuit)) + var/list/helmet_by_suit = list() //because poly winter coats exist. + var/list/suit_by_helmet = list() //Idem. + +/datum/element/polychromic/Attach(datum/target, list/colors, states, _flags = POLYCHROMIC_ACTION|POLYCHROMIC_NO_HELD, _icon, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary")) + . = ..() + var/make_appearances = islist(states) + var/states_len = make_appearances ? length(states) : states + var/names_len = length(names) + if(!states_len || !names_len || colors_by_atom[target] || !isatom(target)) + return ELEMENT_INCOMPATIBLE + var/atom/A = target + + overlays_states = states + icon_file = _icon + worn_file = _worn + poly_flags = _flags + + var/mut_icon = icon_file || A.icon + var/list/L = list() + for(var/I in 1 to states_len) + var/col = LAZYACCESS(colors, I) || "#FFFFFF" + L += make_appearances ? mutable_appearance(mut_icon, overlays_states[I], color = col) : col + colors_by_atom[A] = L + + RegisterSignal(A, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) + + if(_flags & POLYCHROMIC_ALTCLICK) + RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(A, COMSIG_CLICK_ALT, .proc/set_color) + + if(!overlays_names && names) //generate + overlays_names = names + var/diff = states_len - names_len + if(diff > 0) + for(var/i in 1 to diff) + overlays_names += "[names_len + i]°" + else if(diff < 0) + overlays_names.len += diff + + if(isitem(A)) + if(_flags & POLYCHROMIC_ACTION) + RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) + RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action) + if(!(_flags & POLYCHROMIC_NO_WORN) || !(_flags & POLYCHROMIC_NO_HELD)) + A.AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + if(suits_with_helmet_typecache[A.type]) + RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) + else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized. + var/datum/action/polychromic/P = new(A) + RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) + actions_by_atom[A] = P + P.Grant(A) + + A.update_icon() //apply the overlays. + +/datum/element/polychromic/Detach(atom/A) + . = ..() + colors_by_atom -= A + var/datum/action/polychromic/P = actions_by_atom[A] + if(P) + actions_by_atom -= A + qdel(P) + UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_SUIT_MADE_HELMET)) + if(isitem(A)) + var/obj/item/clothing/head/H = helmet_by_suit[A] + if(H) + UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) + helmet_by_suit -= A + suit_by_helmet -= H + colors_by_atom -= H + if(!QDELETED(H)) + H.update_icon() //removing the overlays + if(!(poly_flags & POLYCHROMIC_NO_WORN) || !(poly_flags & POLYCHROMIC_NO_HELD)) + A.RemoveElement(/datum/element/update_icon_updates_onmob) + if(!QDELETED(A) && ismob(A.loc)) + var/mob/M = A.loc + if(!(poly_flags & POLYCHROMIC_NO_HELD) && M.is_holding(A)) + M.update_inv_hands() + else if(!(poly_flags & POLYCHROMIC_NO_WORN)) + M.regenerate_icons() + if(!QDELETED(A)) + A.update_icon() //removing the overlays + +/datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays) + var/list/L = colors_by_atom[source] + var/f_icon = icon_file || source.icon + if(isnum(overlays_states)) + for(var/i in 1 to overlays_states) + overlays += mutable_appearance(f_icon, "[source.icon_state]-[i]", color = L[i]) + else + overlays += colors_by_atom[source] + +/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon, used_state, style_flags, list/overlays) + if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN)) + return + var/f_icon = worn_file || icon + var/list/L = colors_by_atom[source] + + if(isnum(overlays_states)) + for(var/i in 1 to overlays_states) + overlays += mutable_appearance(f_icon, "[used_state]-[i]", color = L[i]) + else + for(var/i in 1 to length(overlays_states)) + var/mutable_appearance/M = L[i] + overlays += mutable_appearance(f_icon, overlays_states[i], color = M.color) + +/datum/element/polychromic/proc/set_color(atom/source, mob/user) + var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names + if(!choice || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) + return + var/index = overlays_names.Find(choice) + var/list/L = colors_by_atom[source] + if(!L) // Ummmmmh. + return + var/mutable_appearance/M = L[index] + var/old_color = istype(M) ? M.color : M + var/ncolor = input(user, "Polychromic options", "Choose [choice] Color", old_color) as color|null + if(!ncolor || QDELETED(source) || !colors_by_atom[source] || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) + return + ncolor = sanitize_hexcolor(ncolor, 6, TRUE, old_color) + if(istype(M)) + M.color = ncolor + else + L[index] = ncolor + + source.update_icon() + return TRUE + +/datum/element/polychromic/proc/grant_user_action(atom/source, mob/user, slot) + if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED || slot == SLOT_HANDCUFFED || slot == SLOT_GENERC_DEXTROUS_STORAGE) + return + var/datum/action/polychromic/P = actions_by_atom[source] + if(!P) + P = new (source) + P.name = "Modify [source]'\s Colors" + actions_by_atom[source] = P + P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS + RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) + P.Grant(user) + +/datum/element/polychromic/proc/remove_user_action(atom/source, mob/user) + var/datum/action/polychromic/P = actions_by_atom[source] + P?.Remove(user) + +/datum/element/polychromic/proc/activate_action(datum/action/source, atom/target) + set_color(target, source.owner) + +/datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list) + examine_list += "Alt-click to recolor it." + +/datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H) + suit_by_helmet[H] = source + helmet_by_suit[source] = H + colors_by_atom[H] = colors_by_atom[source] + RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays) + RegisterSignal(H, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) + RegisterSignal(H, COMSIG_PARENT_QDELETING, .proc/unregister_helmet) + +/datum/element/polychromic/proc/unregister_helmet(atom/source) + var/obj/item/clothing/suit/S = suit_by_helmet[source] + suit_by_helmet -= source + helmet_by_suit -= S + colors_by_atom -= source + +/datum/action/polychromic + name = "Modify Polychromic Colors" + background_icon_state = "bg_polychromic" + use_target_appearance = TRUE + button_icon_state = null + target_appearance_matrix = list(0.8,0,0,0,0.8,0) diff --git a/code/datums/elements/scavenging.dm b/code/datums/elements/scavenging.dm new file mode 100644 index 0000000000..1993005be7 --- /dev/null +++ b/code/datums/elements/scavenging.dm @@ -0,0 +1,215 @@ + /* + * Scavenging element. Its scope shouldn't elude your imagination. + * Basically loot piles that can be searched through for some items. + * In my opinion, these are more engaging than normal maintenance loot spawners. + * The loot doesn't have to be strictly made of items and objects, you could also use it to invoke some "events" + * such as mice, rats, an halloween spook, persistent relics, traps, etcetera, go wild. + */ +/datum/element/scavenging + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 3 + + var/list/loot_left_per_atom = list() //loot left per attached atom. + var/list/loot_table //pickweight list of available loot. + var/list/unique_loot //limited loot, once the associated value reaches zero, its key is removed from loot_table + var/scavenge_time = 12 SECONDS //how much time it takes + var/can_use_hands = TRUE //bare handed scavenge time multiplier. If set to zero, only tools are usable. + var/list/tool_types //which tool types the player can use instead of scavenging by hand, associated value is their speed. + var/del_atom_on_depletion = FALSE //Will the atom be deleted when there is no loot left? + var/list/search_texts = list("starts searching through", "start searching through", "You hear rummaging...") + var/loot_restriction = NO_LOOT_RESTRICTION + var/maximum_loot_per_player = 1 //only relevant if there is a restriction. + var/list/scavenger_restriction_list //used for restrictions. + + var/mean_loot_weight = 0 + var/list/progress_per_atom = list() //seconds of ditched progress per atom, used to resume the work instead of starting over. + var/static/list/players_busy_scavenging = list() //players already busy scavenging. + +/datum/element/scavenging/Attach(atom/target, amount = 5, list/loot, list/unique, time = 12 SECONDS, hands = TRUE, list/tools, list/texts, \ + del_deplete = FALSE, restriction = NO_LOOT_RESTRICTION, max_per_player = 1) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !length(loot) || !amount || !istype(target) || isarea(target)) + return ELEMENT_INCOMPATIBLE + loot_left_per_atom[target] = amount + if(!loot_table) + loot_table = loot + for(var/A in loot_table) //tally the list weights + mean_loot_weight += loot_table[A] + mean_loot_weight /= length(loot_table) + if(!unique_loot) + unique_loot = unique || list() + scavenge_time = time + can_use_hands = hands + tool_types = tools + if(texts) + search_texts = texts + del_atom_on_depletion = del_deplete + loot_restriction = restriction + maximum_loot_per_player = max_per_player + if(can_use_hands) + RegisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW), .proc/scavenge_barehanded) + if(tool_types) + RegisterSignal(target, COMSIG_PARENT_ATTACKBY, .proc/scavenge_tool) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine) + +/datum/element/scavenging/Detach(atom/target) + . = ..() + loot_left_per_atom -= target + progress_per_atom -= target + if(maximum_loot_per_player == LOOT_RESTRICTION_MIND_PILE || maximum_loot_per_player == LOOT_RESTRICTION_CKEY_PILE) + maximum_loot_per_player -= target + UnregisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE)) + +/datum/element/scavenging/proc/on_examine(atom/source, mob/user, list/examine_list) + var/methods = tool_types.Copy() + if(can_use_hands) + methods += list("bare handed") + if(!length(methods)) + return + var/text = english_list(methods, "", " or ") + examine_list += "Looks like [source.p_they()] can be scavenged [length(tool_types) ? "with" : ""][length(methods == 1) ? "" : "either "][length(tool_types) ? "a " : ""][text]" + +/datum/element/scavenging/proc/scavenge_barehanded(atom/source, mob/user) + scavenge(source, user, 1) + return COMPONENT_NO_ATTACK_HAND + +/datum/element/scavenging/proc/scavenge_tool(atom/source, obj/item/I, mob/user, params) + if(user.a_intent == INTENT_HARM || !I.tool_behaviour) //Robust trash disposal techniques! + return + var/speed_multi = tool_types[I.tool_behaviour] + if(!speed_multi) + return + scavenge(source, user, speed_multi) + return COMPONENT_NO_AFTERATTACK + +/// This proc has to be asynced (cough cough, do_after) in order to return the comsig values in time to stop the attack chain. +/datum/element/scavenging/proc/scavenge(atom/source, mob/user, speed_multi = 1) + set waitfor = FALSE + + if(players_busy_scavenging[user]) + return + players_busy_scavenging[user] = TRUE + var/progress_done = progress_per_atom[source] + var/len_messages = length(search_texts) + var/msg_first_person + if(len_messages >= 2) + msg_first_person = "You [progress_done ? ", resume a ditched task and " : ""][search_texts[2]] [source]." + var/msg_blind + if(len_messages >= 3) + msg_blind = "[search_texts[3]]" + user.visible_message("[user] [search_texts[1]] [source].", msg_first_person, msg_blind) + if(do_after(user, scavenge_time * speed_multi, TRUE, source, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi)) + spawn_loot(source, user) + players_busy_scavenging -= user + +/datum/element/scavenging/proc/set_progress(atom/source, start_time) + progress_per_atom[source] = world.time - start_time + return TRUE + +/datum/element/scavenging/proc/spawn_loot(atom/source, mob/user) + progress_per_atom -= source + + var/loot = pickweight(loot_table) + var/special = TRUE + var/free = FALSE + if(!loot_left_per_atom[source]) + to_chat(user, "Looks likes there is nothing worth of interest left in [source], what a shame...") + return + + var/num_times = 0 + switch(loot_restriction) + if(LOOT_RESTRICTION_MIND) + num_times = LAZYACCESS(scavenger_restriction_list, user.mind) + if(LOOT_RESTRICTION_CKEY) + num_times = LAZYACCESS(scavenger_restriction_list, user.ckey) + if(LOOT_RESTRICTION_MIND_PILE) + var/list/L = LAZYACCESS(scavenger_restriction_list, source) + if(L) + num_times = LAZYACCESS(L, user.mind) + if(LOOT_RESTRICTION_CKEY_PILE) + var/list/L = LAZYACCESS(scavenger_restriction_list, source) + if(L) + num_times = LAZYACCESS(L, user.ckey) + if(num_times >= maximum_loot_per_player) + to_chat(user, "You can't find anything else vaguely useful in [source]. Another set of eyes might, however.") + return + + switch(loot) // TODO: datumize these out. + if(SCAVENGING_FOUND_NOTHING) + to_chat(user, "You found nothing, better luck next time.") + free = TRUE //doesn't consume the loot pile. + if(SCAVENGING_SPAWN_MOUSE) + var/nasty_rodent = pick("mouse", "rodent", "squeaky critter", "stupid pest", "annoying cable chewer", "nasty, ugly, evil, disease-ridden rodent") + to_chat(user, "You found something in [source]... no wait, that's just another [nasty_rodent].") + new /mob/living/simple_animal/mouse(source.loc) + if(SCAVENGING_SPAWN_MICE) + user.visible_message("A small gang of mice emerges from [source].", \ + "You found something in [source]... no wait, that's just another- no wait, that's a lot of damn mice.") + for(var/i in 1 to rand(4, 6)) + new /mob/living/simple_animal/mouse(source.loc) + if(SCAVENGING_SPAWN_TOM) + if(GLOB.tom_existed) //There can only be one. + to_chat(user, "You found nothing, better luck next time.") + free = TRUE + else + to_chat(user, "You found something in [source]... no wait, that's Tom, the mouse! What is he doing here?") + new /mob/living/simple_animal/mouse/brown/Tom(source.loc) + else + special = FALSE + + if(!special) //generic loot. Nothing too strange like more loot spawners anyway. + var/atom/A = new loot(source.loc) + if(isitem(A) && !user.get_active_held_item()) + user.put_in_hands(A) + var/rarity_append = "." + switch(loot_table[loot]/mean_loot_weight*100) + if(0 to 1) + rarity_append = "! AMAZING!" + if(1 to 2) + rarity_append = "! Woah!" + if(2 to 5) + rarity_append = ". Rare!" + if(5 to 10) + rarity_append = ". Great." + if(10 to 25) + rarity_append = ". Nice." + if(20 to 50) + rarity_append = ". Not bad." + to_chat(user, "You found something in [source]... it's \a [A][rarity_append]") + + if(unique_loot[loot]) + var/loot_left = --unique_loot[loot] + if(!loot_left) + loot_table -= loot + unique_loot -= loot + mean_loot_weight = 0 + for(var/A in loot_table) //re-tally the list weights + mean_loot_weight += loot_table[A] + mean_loot_weight /= length(loot_table) + + if(free) + return + + --loot_left_per_atom[source] + if(del_atom_on_depletion && !loot_left_per_atom[source]) + source.visible_message("[source] has been looted clean.") + qdel(source) + return + + if(!loot_restriction) + return + + LAZYINITLIST(scavenger_restriction_list) + switch(loot_restriction) + if(LOOT_RESTRICTION_MIND) + scavenger_restriction_list[user.mind]++ + if(LOOT_RESTRICTION_CKEY) + scavenger_restriction_list[user.ckey]++ + if(LOOT_RESTRICTION_MIND_PILE) + LAZYINITLIST(scavenger_restriction_list[source]) + var/list/L = scavenger_restriction_list[source] + L[user.mind]++ + if(LOOT_RESTRICTION_CKEY_PILE) + LAZYINITLIST(scavenger_restriction_list[source]) + var/list/L = scavenger_restriction_list[source] + L[user.ckey]++ diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm new file mode 100644 index 0000000000..0e322c7c9d --- /dev/null +++ b/code/datums/elements/snail_crawl.dm @@ -0,0 +1,31 @@ +/datum/element/snailcrawl + element_flags = ELEMENT_DETACH + +/datum/element/snailcrawl/Attach(datum/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + var/P + if(iscarbon(target)) + P = .proc/snail_crawl + else + P = .proc/lubricate + RegisterSignal(target, COMSIG_MOVABLE_MOVED, P) + +/datum/element/snailcrawl/Detach(mob/living/carbon/target) + . = ..() + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + if(istype(target)) + target.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) + +/datum/element/snailcrawl/proc/snail_crawl(mob/living/carbon/snail) + if(snail.resting && !snail.buckled && lubricate(snail)) + snail.add_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) + else + snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl) + +/datum/element/snailcrawl/proc/lubricate(atom/movable/snail) + var/turf/open/OT = get_turf(snail) + if(istype(OT)) + OT.MakeSlippery(TURF_WET_LUBE, 20) + return TRUE diff --git a/code/datums/elements/spellcasting.dm b/code/datums/elements/spellcasting.dm index b325fd3a3a..877bcdbcd3 100644 --- a/code/datums/elements/spellcasting.dm +++ b/code/datums/elements/spellcasting.dm @@ -4,6 +4,7 @@ var/cast_flags var/cast_slots var/list/users_by_item = list() + var/list/stacked_spellcasting_by_user = list() /datum/element/spellcasting/Attach(datum/target, _flags, _slots) . = ..() @@ -11,7 +12,8 @@ RegisterSignal(target, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(target, COMSIG_ITEM_DROPPED, .proc/on_drop) else if(ismob(target)) - RegisterSignal(target, COMSIG_MOB_SPELL_CAST_CHECK, .proc/on_cast) + RegisterSignal(target, COMSIG_MOB_SPELL_CAN_CAST, .proc/on_cast) + stacked_spellcasting_by_user[target]++ else return ELEMENT_INCOMPATIBLE cast_flags = _flags @@ -19,19 +21,34 @@ /datum/element/spellcasting/Detach(datum/target) . = ..() - UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOB_SPELL_CAST_CHECK)) + UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_MOB_SPELL_CAN_CAST)) if(users_by_item[target]) var/mob/user = users_by_item[target] - UnregisterSignal(user, COMSIG_MOB_SPELL_CAST_CHECK) + stacked_spellcasting_by_user[user]-- + if(!stacked_spellcasting_by_user[user]) + stacked_spellcasting_by_user -= user + UnregisterSignal(user, COMSIG_MOB_SPELL_CAN_CAST) + else if(ismob(target)) + stacked_spellcasting_by_user[target]-- + if(!stacked_spellcasting_by_user[target]) + stacked_spellcasting_by_user -= target /datum/element/spellcasting/proc/on_equip(datum/source, mob/equipper, slot) - if(slot in cast_slots) - RegisterSignal(equipper, COMSIG_MOB_SPELL_CAST_CHECK, .proc/on_cast) - users_by_item[source] = equipper + if(!(cast_slots & slotdefine2slotbit(slot))) + return + users_by_item[source] = equipper + if(!stacked_spellcasting_by_user[equipper]) + RegisterSignal(equipper, COMSIG_MOB_SPELL_CAN_CAST, .proc/on_cast) + stacked_spellcasting_by_user[equipper]++ /datum/element/spellcasting/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, COMSIG_MOB_SPELL_CAST_CHECK) + if(!users_by_item[source]) + return users_by_item -= source + stacked_spellcasting_by_user[user]-- + if(!stacked_spellcasting_by_user[user]) + stacked_spellcasting_by_user -= user + UnregisterSignal(user, COMSIG_MOB_SPELL_CAN_CAST) /datum/element/spellcasting/proc/on_cast(mob/caster, obj/effect/proc_holder/spell) return cast_flags diff --git a/code/datums/elements/squish.dm b/code/datums/elements/squish.dm new file mode 100644 index 0000000000..823d391e14 --- /dev/null +++ b/code/datums/elements/squish.dm @@ -0,0 +1,28 @@ +#define SHORT 5/7 +#define TALL 7/5 + +/datum/element/squish + element_flags = ELEMENT_DETACH + +/datum/element/squish/Attach(datum/target, duration) + . = ..() + if(!iscarbon(target)) + return ELEMENT_INCOMPATIBLE + + var/mob/living/carbon/C = target + var/was_lying = (C.lying != 0) + addtimer(CALLBACK(src, .proc/Detach, C, was_lying), duration) + + C.transform = C.transform.Scale(TALL, SHORT) + +/datum/element/squish/Detach(mob/living/carbon/C, was_lying) + . = ..() + if(istype(C)) + var/is_lying = (C.lying != 0) + if(was_lying == is_lying) + C.transform = C.transform.Scale(SHORT, TALL) + else + C.transform = C.transform.Scale(TALL, SHORT) + +#undef SHORT +#undef TALL diff --git a/code/datums/elements/tactical.dm b/code/datums/elements/tactical.dm new file mode 100644 index 0000000000..4b49552fbe --- /dev/null +++ b/code/datums/elements/tactical.dm @@ -0,0 +1,37 @@ +/datum/element/tactical + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/allowed_slot + +/datum/element/tactical/Attach(datum/target, allowed_slot) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.allowed_slot = allowed_slot + RegisterSignal(target, COMSIG_ITEM_EQUIPPED, .proc/modify) + RegisterSignal(target, COMSIG_ITEM_DROPPED, .proc/unmodify) + +/datum/element/tactical/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + unmodify(target) + return ..() + +/datum/element/tactical/proc/modify(obj/item/source, mob/user, slot) + if(allowed_slot && slot != allowed_slot) + unmodify(source, user) + return + + var/image/I = image(icon = source.icon, icon_state = source.icon_state, loc = user) + I.copy_overlays(source) + I.override = TRUE + source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) + I.layer = ABOVE_MOB_LAYER + +/datum/element/tactical/proc/unmodify(obj/item/source, mob/user) + if(!user) + if(!ismob(source.loc)) + return + user = source.loc + + user.remove_alt_appearance("sneaking_mission") diff --git a/code/datums/elements/update_icon_updates_onmob.dm b/code/datums/elements/update_icon_updates_onmob.dm index ca0e8b1641..5c71547f62 100644 --- a/code/datums/elements/update_icon_updates_onmob.dm +++ b/code/datums/elements/update_icon_updates_onmob.dm @@ -5,7 +5,7 @@ . = ..() if(!istype(target, /obj/item)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_onmob) + RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, .proc/update_onmob, override = TRUE) /datum/element/update_icon_updates_onmob/proc/update_onmob(obj/item/target) if(ismob(target.loc)) diff --git a/code/datums/elements/wuv.dm b/code/datums/elements/wuv.dm index fffb90c681..6476a204cf 100644 --- a/code/datums/elements/wuv.dm +++ b/code/datums/elements/wuv.dm @@ -41,7 +41,7 @@ return //we want to delay the effect to be displayed after the mob is petted, not before. switch(user.a_intent) - if(INTENT_HARM, INTENT_DISARM) + if(INTENT_HARM) addtimer(CALLBACK(src, .proc/kick_the_dog, source, user), 1) if(INTENT_HELP) addtimer(CALLBACK(src, .proc/pet_the_dog, source, user), 1) diff --git a/code/datums/embedding_behavior.dm b/code/datums/embedding_behavior.dm deleted file mode 100644 index a261ea48c6..0000000000 --- a/code/datums/embedding_behavior.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define EMBEDID "embed-[embed_chance]-[embedded_fall_chance]-[embedded_pain_chance]-[embedded_pain_multiplier]-[embedded_fall_pain_multiplier]-[embedded_impact_pain_multiplier]-[embedded_unsafe_removal_pain_multiplier]-[embedded_unsafe_removal_time]" - -/proc/getEmbeddingBehavior(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - . = locate(EMBEDID) - if (!.) - . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) - -/datum/embedding_behavior - var/embed_chance - var/embedded_fall_chance - var/embedded_pain_chance - var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) - var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) - var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) - var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) - var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. - -/datum/embedding_behavior/New(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - src.embed_chance = embed_chance - src.embedded_fall_chance = embedded_fall_chance - src.embedded_pain_chance = embedded_pain_chance - src.embedded_pain_multiplier = embedded_pain_multiplier - src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier - src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier - src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier - src.embedded_unsafe_removal_time = embedded_unsafe_removal_time - tag = EMBEDID - -/datum/embedding_behavior/proc/setRating(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) - return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ - (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ - (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ - (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ - (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ - (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ - (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ - (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time)) - -#undef EMBEDID diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 7be4489e86..dc32902e5e 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -76,7 +76,9 @@ GLOBAL_LIST_EMPTY(explosions) //I would make this not ex_act the thing that triggered the explosion, //but everything that explodes gives us their loc or a get_turf() //and somethings expect us to ex_act them so they can qdel() - stoplag() //tldr, let the calling proc call qdel(src) before we explode + //stoplag() //tldr, let the calling proc call qdel(src) before we explode + // no - use sleep. stoplag() results in quirky things like explosions taking too long to process and hanging mid-air for no reason. + sleep(0) EX_PREPROCESS_EXIT_CHECK @@ -121,14 +123,14 @@ GLOBAL_LIST_EMPTY(explosions) if(dist <= round(max_range + world.view - 2, 1)) M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound) if(baseshakeamount > 0) - shake_camera(M, 25, CLAMP(baseshakeamount, 0, 10)) + shake_camera(M, 25, clamp(baseshakeamount, 0, 10)) // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. else if(dist <= far_dist) - var/far_volume = CLAMP(far_dist, 30, 50) // Volume is based on explosion size and dist + var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound) if(baseshakeamount > 0) - shake_camera(M, 10, CLAMP(baseshakeamount*0.25, 0, 2.5)) + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) EX_PREPROCESS_CHECK_TICK //postpone processing for a bit diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 0b0fed407c..91b8e32566 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -5,16 +5,18 @@ var/list/testmerge = list() /datum/getrev/New() + commit = rustg_git_revparse("HEAD") + if(commit) + date = rustg_git_commit_date(commit) + originmastercommit = rustg_git_revparse("origin/master") + +/datum/getrev/proc/load_tgs_info() testmerge = world.TgsTestMerges() var/datum/tgs_revision_information/revinfo = world.TgsRevision() if(revinfo) commit = revinfo.commit originmastercommit = revinfo.origin_commit - else - commit = rustg_git_revparse("HEAD") - if(commit) - date = rustg_git_commit_date(commit) - originmastercommit = rustg_git_revparse("origin/master") + date = rustg_git_commit_date(commit) // goes to DD log and config_error.txt log_world(get_log_message()) @@ -77,7 +79,9 @@ msg += "No commit information" if(world.TgsAvailable()) var/datum/tgs_version/version = world.TgsVersion() - msg += "Server tools version: [version.raw_parameter]" + msg += "TGS version: [version.raw_parameter]" + var/datum/tgs_version/api_version = world.TgsApiVersion() + msg += "DMAPI version: [api_version.raw_parameter]" // Game mode odds msg += "
    Current Informational Settings:" @@ -121,4 +125,4 @@ if(probabilities[ctag] > 0) var/percentage = round(probabilities[ctag] / sum * 100, 0.1) msg += "[ctag] [percentage]%" - to_chat(src, msg.Join("
    ")) \ No newline at end of file + to_chat(src, msg.Join("
    ")) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6b0981665d..c46a03a986 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -128,7 +128,7 @@ // Can most things breathe? if(trace_gases) continue - if(A_gases[/datum/gas/oxygen] >= 16) + if(A_gases[/datum/gas/oxygen] <= 16) continue if(A_gases[/datum/gas/plasma]) continue diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 6b6fcb9691..c1811fb9b3 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -27,7 +27,8 @@ GLOBAL_LIST_INIT(huds, list( ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(), ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(), - ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker() + ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker(), + ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag() )) /datum/atom_hud diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 49942976ce..bafb6fbf0e 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -73,7 +73,7 @@ var/list/atoms_cache = output_atoms var/sound/S = sound(soundfile) if(direct) - S.channel = open_sound_channel() + S.channel = SSsounds.random_available_channel() S.volume = volume for(var/i in 1 to atoms_cache.len) var/atom/thing = atoms_cache[i] diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 7b7975bedb..8241f685d7 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -10,6 +10,11 @@ var/help_verb var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist. var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts + /// Can we be used to unarmed parry? + var/can_martial_parry = FALSE + /// Set this variable to something not null, this'll be the preferred unarmed parry in most cases if [can_martial_parry] is TRUE. YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING! + var/datum/block_parry_data/block_parry_data + var/pugilist = FALSE /datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return FALSE @@ -35,6 +40,17 @@ current_target = new_target streak = "" +/datum/martial_art/proc/damage_roll(mob/living/carbon/human/A, mob/living/carbon/human/D) + //Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode. + var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) + if(SEND_SIGNAL(D, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + damage *= 1.5 + if(!CHECK_MOBILITY(A, MOBILITY_STAND)) + damage *= 0.5 + if(SEND_SIGNAL(A, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + damage *= 0.25 + return damage + /datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE) if(!istype(H) || !H.mind) return FALSE @@ -50,6 +66,8 @@ if(help_verb) H.verbs += help_verb H.mind.martial_art = src + if(pugilist) + ADD_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) return TRUE /datum/martial_art/proc/store(datum/martial_art/M,mob/living/carbon/human/H) @@ -68,6 +86,7 @@ else var/datum/martial_art/X = H.mind.default_martial_art X.teach(H) + REMOVE_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) /datum/martial_art/proc/on_remove(mob/living/carbon/human/H) if(help_verb) @@ -76,4 +95,4 @@ ///Gets called when a projectile hits the owner. Returning anything other than BULLET_ACT_HIT will stop the projectile from hitting the mob. /datum/martial_art/proc/on_projectile_hit(mob/living/carbon/human/A, obj/item/projectile/P, def_zone) - return BULLET_ACT_HIT \ No newline at end of file + return BULLET_ACT_HIT diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 16d61c29f9..e3c7726d61 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -2,6 +2,7 @@ name = "Boxing" id = MARTIALART_BOXING pacifism_check = FALSE //Let's pretend pacifists can boxe the heck out of other people, it only deals stamina damage right now. + pugilist = TRUE /datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) to_chat(A, "Can't disarm while boxing!") @@ -16,16 +17,13 @@ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) var/atk_verb = pick("left hook","right hook","straight punch") - - var/damage = rand(10, 13) - var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) + var/extra_damage = damage_roll(A,D) if(extra_damage == A.dna.species.punchdamagelow) playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) D.visible_message("[A] has attempted to [atk_verb] [D]!", \ "[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE) log_combat(A, D, "attempted to hit", atk_verb) return TRUE - damage += extra_damage var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) var/armor_block = D.run_armor_check(affecting, "melee") @@ -35,7 +33,7 @@ D.visible_message("[A] has [atk_verb]ed [D]!", \ "[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE) - D.apply_damage(damage, STAMINA, affecting, armor_block) + D.apply_damage(rand(10,13) + extra_damage, STAMINA, affecting, armor_block) log_combat(A, D, "punched (boxing) ") if(D.getStaminaLoss() > 100 && istype(D.mind?.martial_art, /datum/martial_art/boxing)) var/knockout_prob = (D.getStaminaLoss() + rand(-15,15))*0.75 @@ -68,9 +66,9 @@ return /obj/item/clothing/gloves/boxing/dropped(mob/user) + . = ..() if(!ishuman(user)) return var/mob/living/carbon/human/H = user if(H.get_item_by_slot(SLOT_GLOVES) == src) style.remove(H) - return diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 0871cf7eaa..96ba7bf965 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -9,6 +9,7 @@ id = MARTIALART_CQC help_verb = /mob/living/carbon/human/proc/CQC_help block_chance = 75 + pugilist = TRUE var/old_grab_state = null /datum/martial_art/cqc/reset_streak(mob/living/carbon/human/new_target) @@ -42,11 +43,12 @@ /datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE + var/damage = (damage_roll(A,D) + 5) if(CHECK_MOBILITY(D, MOBILITY_STAND)) D.visible_message("[A] slams [D] into the ground!", \ "[A] slams you into the ground!") playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) + D.apply_damage(damage, BRUTE) D.DefaultCombatKnockdown(120) log_combat(A, D, "slammed (CQC)") return TRUE @@ -54,29 +56,33 @@ /datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE - if(CHECK_MOBILITY(D, MOBILITY_STAND)) - D.visible_message("[A] kicks [D] back!", \ - "[A] kicks you back!") - playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - var/atom/throw_target = get_edge_target_turf(D, A.dir) - D.throw_at(throw_target, 1, 14, A) - D.apply_damage(10, BRUTE) - log_combat(A, D, "kicked (CQC)") + var/damage = damage_roll(A,D) if(!CHECK_MOBILITY(D, MOBILITY_STAND) && CHECK_MOBILITY(D, MOBILITY_USE)) log_combat(A, D, "knocked out (Head kick)(CQC)") D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \ "[A] kicks your head, knocking you out!") playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) D.SetSleeping(300) - D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) + D.apply_damage(damage + 5, BRUTE) + var/atom/throw_target = get_edge_target_turf(D, A.dir) + D.throw_at(throw_target, 1, 14, A) + D.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage + 10, 150) + else + D.visible_message("[A] kicks [D]!", \ + "[A] kicks you!") + playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) + D.Dizzy(damage) + D.apply_damage(damage + 15, BRUTE) + log_combat(A, D, "kicked (CQC)") return TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE + var/damage = (damage_roll(A,D) + 55) log_combat(A, D, "pressured (CQC)") D.visible_message("[A] punches [D]'s neck!") - D.adjustStaminaLoss(60) + D.apply_damage(damage, STAMINA) playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) return TRUE @@ -85,11 +91,12 @@ return if(!can_use(A)) return FALSE + var/damage = (damage_roll(A,D) + 15) if(!D.stat) log_combat(A, D, "restrained (CQC)") D.visible_message("[A] locks [D] into a restraining position!", \ "[A] locks you into a restraining position!") - D.adjustStaminaLoss(20) + D.apply_damage(damage, STAMINA) D.Stun(100) restraining = TRUE addtimer(VARSET_CALLBACK(src, restraining, FALSE), 50, TIMER_UNIQUE) @@ -98,6 +105,7 @@ /datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE + var/damage = damage_roll(A,D) if(!D.stat) log_combat(A, D, "consecutive CQC'd (CQC)") D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \ @@ -106,8 +114,8 @@ var/obj/item/I = D.get_active_held_item() if(I && D.temporarilyRemoveItemFromInventory(I)) A.put_in_hands(I) - D.adjustStaminaLoss(50) - D.apply_damage(25, BRUTE) + D.apply_damage(damage + 45, STAMINA) + D.apply_damage(damage + 20, BRUTE) return TRUE /datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -135,7 +143,7 @@ log_combat(A, D, "attacked (CQC)") A.do_attack_animation(D) var/picked_hit_type = pick("CQC'd", "Big Bossed") - var/bonus_damage = 13 + var/bonus_damage = (damage_roll(A,D) + 7) if(!CHECK_MOBILITY(D, MOBILITY_STAND)) bonus_damage += 5 picked_hit_type = "stomps on" @@ -151,7 +159,7 @@ D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) + D.apply_damage(bonus_damage, BRUTE) D.DefaultCombatKnockdown(60) log_combat(A, D, "sweeped (CQC)") return TRUE @@ -161,23 +169,29 @@ return FALSE add_to_streak("D",D) var/obj/item/I = null + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold if(check_streak(A,D)) return TRUE - if(prob(65)) - if(CHECK_MOBILITY(D, MOBILITY_MOVE) || !restraining) + if(CHECK_MOBILITY(D, MOBILITY_MOVE) || !restraining) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + if(damage >= stunthreshold) I = D.get_active_held_item() D.visible_message("[A] strikes [D]'s jaw with their hand!", \ - "[A] strikes your jaw, disorienting you!") + "[A] strikes your jaw, disorienting you!") playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) + D.drop_all_held_items() D.Jitter(2) - D.apply_damage(5, BRUTE) - else - D.visible_message("[A] attempted to disarm [D]!", \ - "[A] attempted to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") + D.Dizzy(damage) + D.apply_damage(damage*2 + 20, STAMINA) + D.apply_damage(damage*0.5, BRUTE) + else + D.visible_message("[A] strikes [D] in the chest!", \ + "[A] strikes in chest!") + playsound(D, 'sound/weapons/cqchit1.ogg', 25, 1, -1) + D.apply_damage(damage + 15, STAMINA) + D.apply_damage(damage*0.5, BRUTE) + log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") if(restraining && A.pulling == D) log_combat(A, D, "knocked out (Chokehold)(CQC)") D.visible_message("[A] puts [D] into a chokehold!", \ diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 1a244f911e..50438d9d8d 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -1,6 +1,7 @@ /datum/martial_art/krav_maga name = "Krav Maga" id = MARTIALART_KRAVMAGA + pugilist = TRUE var/datum/action/neck_chop/neckchop = new/datum/action/neck_chop() var/datum/action/leg_sweep/legsweep = new/datum/action/leg_sweep() var/datum/action/lung_punch/lungpunch = new/datum/action/lung_punch() @@ -84,64 +85,71 @@ if("neck_chop") streak = "" neck_chop(A,D) - return 1 + return TRUE if("leg_sweep") streak = "" leg_sweep(A,D) - return 1 + return TRUE if("quick_choke")//is actually lung punch streak = "" quick_choke(A,D) - return 1 - return 0 + return TRUE + return FALSE /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST) + var/armor_block = D.run_armor_check(affecting, "melee") + var/damage = (damage_roll(A,D)*2 + 25) if(!CHECK_MOBILITY(D, MOBILITY_STAND)) - return 0 + return FALSE D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.apply_damage(5, BRUTE) - D.DefaultCombatKnockdown(40, override_hardstun = 0.01, override_stamdmg = 25) + D.apply_damage(damage, STAMINA, affecting, armor_block) + D.DefaultCombatKnockdown(80, override_hardstun = 1, override_stamdmg = 0) log_combat(A, D, "leg sweeped") - return 1 + return TRUE /datum/martial_art/krav_maga/proc/quick_choke(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)//is actually lung punch + var/damage = damage_roll(A,D) D.visible_message("[A] pounds [D] on the chest!", \ "[A] slams your chest! You can't breathe!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) if(D.losebreath <= 10) - D.losebreath = CLAMP(D.losebreath + 5, 0, 10) - D.adjustOxyLoss(10) + D.losebreath = clamp(D.losebreath + 5, 0, 10) + D.adjustOxyLoss(damage + 5) log_combat(A, D, "quickchoked") - return 1 + return TRUE /datum/martial_art/krav_maga/proc/neck_chop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + var/damage = (damage_roll(A,D)*0.5) D.visible_message("[A] karate chops [D]'s neck!", \ "[A] karate chops your neck, rendering you unable to speak!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) - D.apply_damage(5, BRUTE) + D.apply_damage(damage, BRUTE) if(D.silent <= 10) - D.silent = CLAMP(D.silent + 10, 0, 10) + D.silent = clamp(D.silent + 10, 0, 10) log_combat(A, D, "neck chopped") - return 1 + return TRUE /datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(check_streak(A,D)) - return 1 + return TRUE log_combat(A, D, "grabbed (Krav Maga)") ..() /datum/martial_art/krav_maga/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") if(check_streak(A,D)) - return 1 + return TRUE log_combat(A, D, "punched") var/picked_hit_type = pick("punches", "kicks") - var/bonus_damage = 10 - if(CHECK_MOBILITY(D, MOBILITY_STAND)) - bonus_damage += 5 + var/bonus_damage = damage_roll(A,D) + if(!CHECK_MOBILITY(D, MOBILITY_STAND)) + bonus_damage += 10 picked_hit_type = "stomps on" - D.apply_damage(bonus_damage, BRUTE) + D.apply_damage(bonus_damage, BRUTE, affecting, armor_block) if(picked_hit_type == "kicks" || picked_hit_type == "stomps on") A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, 1, -1) @@ -151,24 +159,36 @@ D.visible_message("[A] [picked_hit_type] [D]!", \ "[A] [picked_hit_type] you!") log_combat(A, D, "[picked_hit_type] with [name]") - return 1 + return TRUE -/datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - var/obj/item/I = null - if(prob(60)) - I = D.get_active_held_item() - if(I) - if(D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) - D.visible_message("[A] has disarmed [D]!", \ - "[A] has disarmed [D]!") - playsound(D, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) +/datum/martial_art/krav_maga/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + if(check_streak(A,D)) + return TRUE + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + if(CHECK_MOBILITY(D, MOBILITY_STAND)) + D.visible_message("[A] reprimands [D]!", \ + "You're slapped by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You jab [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(damage*2 + 15, STAMINA, affecting, armor_block) + log_combat(A, D, "punched nonlethally") else - D.visible_message("[A] attempted to disarm [D]!", \ - "[A] attempted to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - log_combat(A, D, "disarmed (Krav Maga)", "[I ? " removing \the [I]" : ""]") - return 1 + D.visible_message("[A] reprimands [D]!", \ + "You're manhandled by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You stomp [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(damage*2 + 20, STAMINA, affecting, armor_block) + log_combat(A, D, "stomped nonlethally") + if(damage >= stunthreshold) + D.visible_message("[D] sputters and recoils in pain!", "You recoil in pain as you are jabbed in a nerve!") + D.drop_all_held_items() + + return TRUE //Krav Maga Gloves @@ -183,6 +203,7 @@ style.teach(H,1) /obj/item/clothing/gloves/krav_maga/dropped(mob/user) + . = ..() if(!ishuman(user)) return var/mob/living/carbon/human/H = user diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm index fe9f0d77d6..3fd0a637c2 100644 --- a/code/datums/martial/mushpunch.dm +++ b/code/datums/martial/mushpunch.dm @@ -4,6 +4,7 @@ /datum/martial_art/mushpunch/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) var/atk_verb + var/damage = (damage_roll(A,D)*3) to_chat(A, "You begin to wind up an attack...") if(!do_after(A, 25, target = D)) to_chat(A, "Your attack was interrupted!") @@ -12,7 +13,7 @@ atk_verb = pick("punches", "smashes", "ruptures", "cracks") D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \ "[A] [atk_verb] you with inhuman strength, sending you flying backwards!") - D.apply_damage(rand(15,30), BRUTE) + D.apply_damage(damage, BRUTE) //KAPOW playsound(D, 'sound/effects/meteorimpact.ogg', 25, 1, -1) var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 71fb00c467..16ffb381aa 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -6,6 +6,7 @@ name = "Plasma Fist" id = MARTIALART_PLASMAFIST help_verb = /mob/living/carbon/human/proc/plasma_fist_help + pugilist = TRUE /datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -44,11 +45,13 @@ return /datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = (damage_roll(A,D)*3) D.visible_message("[A] has hit [D] with Plasma Punch!", \ "[A] has hit [D] with Plasma Punch!") playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) D.throw_at(throw_target, 200, 4,A) + D.apply_damage(damage, BRUTE) A.say("HYAH!", forced="plasma fist") log_combat(A, D, "threw back (Plasma Fist)") return diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 75053dbbfc..06d07260ed 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -14,6 +14,7 @@ /datum/martial_art/psychotic_brawling/proc/psycho_attack(mob/living/carbon/human/A, mob/living/carbon/human/D) var/atk_verb + var/damage = damage_roll(A,D) switch(rand(1,8)) if(1) D.help_shake_act(A) @@ -44,10 +45,10 @@ D.visible_message("[A] [atk_verb] [D]!", \ "[A] [atk_verb] you!") playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, 1, -1) - D.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD) - A.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD) + D.apply_damage(damage*1.5, BRUTE, BODY_ZONE_HEAD) + A.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat)) - D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + D.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage) A.Stun(rand(10,45)) D.DefaultCombatKnockdown(rand(5,30))//CIT CHANGE - makes stuns from martial arts always use Knockdown instead of Stun for the sake of consistency if(5,6) @@ -55,7 +56,7 @@ atk_verb = pick("punches", "kicks", "hits", "slams into") D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \ "[A] [atk_verb] you with inhuman strength, sending you flying backwards!") - D.apply_damage(rand(15,30), BRUTE) + D.apply_damage(damage*2, BRUTE) playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1) var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 8055bd54e9..0d77644c86 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -1,5 +1,5 @@ -#define REPULSE_PUNCH_COMBO "HDHD" -#define SHOULDER_FLIP_COMBO "GHDGHH" +#define REPULSE_PUNCH_COMBO "HDD" +#define SHOULDER_FLIP_COMBO "DHDHG" #define FOOT_SMASH_COMBO "HH" #define SIDE_KICK_COMBO "skick" #define DEFT_SWITCH_COMBO "deft" @@ -9,6 +9,7 @@ id = MARTIALART_RISINGBASS allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/rising_bass_help + pugilist = TRUE var/datum/action/risingbassmove/sidekick = new/datum/action/risingbassmove/sidekick() var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch() var/repulsecool = 0 @@ -37,7 +38,6 @@ return FALSE -//Repulse Punch - Slams the opponent far away from you. /datum/action/risingbassmove name = "" icon_icon = 'icons/mob/actions/actions_items.dmi' @@ -78,6 +78,7 @@ return TRUE /datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = (damage_roll(A,D)*0.5) if(CHECK_MOBILITY(D, MOBILITY_STAND)) var/dir = A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH) var/oppdir = dir == NORTH ? SOUTH : dir == SOUTH ? NORTH : dir == EAST ? WEST : EAST @@ -87,8 +88,8 @@ D.visible_message("[A] kicks [D] in the side, sliding them over!", \ "[A] kicks you in the side, forcing you to step away!") playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - D.apply_damage(5, BRUTE, BODY_ZONE_CHEST) - D.DefaultCombatKnockdown(60) + D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) + D.DefaultCombatKnockdown(60, override_hardstun = 1, override_stamdmg = damage) var/L = !checkfordensity(H,D) ? (!checkfordensity(K,D) ? D.loc : K) : H D.forceMove(L) log_combat(A, D, "side kicked (Rising Bass)") @@ -96,24 +97,27 @@ return TRUE /datum/martial_art/the_rising_bass/proc/shoulderFlip(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(CHECK_MOBILITY(D, MOBILITY_STAND)) - var/turf/H = get_step(A, get_dir(D,A)) - var/L = checkfordensity(H,D) ? H : A.loc - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] flips [D] over their shoulder, slamming them into the ground!", \ - "[A] flips you over their shoulder, slamming you into the ground!") - playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - D.emote("scream") - D.apply_damage(10, BRUTE, BODY_ZONE_CHEST) - D.apply_damage(30, BRUTE, BODY_ZONE_HEAD) + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + var/turf/H = get_step(A, get_dir(D,A)) + var/L = checkfordensity(H,D) ? H : A.loc + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] flips [D] over their shoulder, slamming them into the ground!", \ + "[A] flips you over their shoulder, slamming you into the ground!") + playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + D.emote("scream") + D.apply_damage(damage + 10, BRUTE, BODY_ZONE_CHEST) + D.apply_damage(damage + 10, BRUTE, BODY_ZONE_HEAD) + if(damage >= stunthreshold) D.Sleeping(60) - D.DefaultCombatKnockdown(300) - D.forceMove(L) - log_combat(A, D, "shoulder flipped (Rising Bass)") - return TRUE - return FALSE + D.DefaultCombatKnockdown(300, override_hardstun = 1, override_stamdmg = 50) + D.forceMove(L) + log_combat(A, D, "shoulder flipped (Rising Bass)") + return TRUE +//Repulse Punch - Slams the opponent far away from you. /datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = damage_roll(A,D) if(CHECK_MOBILITY(D, MOBILITY_STAND) && repulsecool < world.time) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] smashes [D] in the chest, throwing them away!", \ @@ -121,20 +125,22 @@ playsound(get_turf(A), 'sound/weapons/punch1.ogg', 50, 1, -1) var/atom/F = get_edge_target_turf(D, get_dir(A, get_step_away(D, A))) D.throw_at(F, 10, 1) - D.apply_damage(10, BRUTE, BODY_ZONE_CHEST) - D.DefaultCombatKnockdown(90) + D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) + D.DefaultCombatKnockdown(90, override_hardstun = 1, override_stamdmg = damage*2) + D.confused += min(damage, 20) log_combat(A, D, "repulse punched (Rising Bass)") repulsecool = world.time + 3 SECONDS return TRUE return FALSE /datum/martial_art/the_rising_bass/proc/footSmash(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = (damage_roll(A,D)*0.5) if(CHECK_MOBILITY(D, MOBILITY_STAND)) A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] smashes their foot down on [D]'s foot!", \ "[A] smashes your foot!") playsound(get_turf(A), 'sound/weapons/punch1.ogg', 50, 1, -1) - D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + D.apply_damage(damage, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) D.dropItemToGround(D.get_active_held_item()) log_combat(A, D, "foot smashed (Rising Bass)") return TRUE @@ -158,7 +164,23 @@ add_to_streak("D",D) if(check_streak(A,D)) return TRUE - return ..() + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold) + D.visible_message("[A] trips [D]!", \ + "You're tripped by [A]!", "You hear something thump against the floor!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You trip [D]!") + D.DefaultCombatKnockdown(10, override_hardstun = 0.01, override_stamdmg = damage) + D.Dizzy(damage) + else + D.visible_message("[A] jabs [D] in the stomach!", \ + "You're jabbed in the stomach by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You jab [D] in the stomach!") + D.apply_damage(damage*2 + 10, STAMINA) + D.disgust = min(damage, 20) + playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + return TRUE /datum/martial_art/the_rising_bass/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) @@ -181,7 +203,7 @@ . = ..() if(A.incapacitated(FALSE, TRUE)) //NO STUN return BULLET_ACT_HIT - if(!(A.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE + if(!CHECK_ALL_MOBILITY(A, MOBILITY_USE|MOBILITY_STAND)) //NO UNABLE TO USE, NO DODGING ON THE FLOOR return BULLET_ACT_HIT if(A.dna && A.dna.check_mutation(HULK)) //NO HULK return BULLET_ACT_HIT @@ -199,9 +221,9 @@ to_chat(usr, "You retreat inward and recall the teachings of the Rising Bass...") to_chat(usr, "Side Kick: Forces opponent to step to the side.") - to_chat(usr, "Shoulder Flip: Grab Harm Disarm Grab Harm Harm. Flips opponent over your shoulder and stuns.") - to_chat(usr, "Repulse Punch: Harm Disarm Harm Disarm. Slams the opponent far away from you.") - to_chat(usr, "Foot Smash: Harm Harm. Stuns opponent, minor damage.") + to_chat(usr, "Shoulder Flip: Disarm Harm Disarm Harm Grab. Flips opponent over your shoulder and stuns.") + to_chat(usr, "Repulse Punch: Harm Disarm Disarm. Slams the opponent far away from you.") + to_chat(usr, "Foot Smash: Harm Harm. Knocks opponent prone, minor damage.") to_chat(usr, "Deft Switch: Switches the opponent's held item for your own. Most useful with nothing in your hand.") /datum/martial_art/the_rising_bass/teach(mob/living/carbon/human/H, make_temporary = FALSE) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 2b7d9e0a09..82ddd90b42 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -7,6 +7,7 @@ id = MARTIALART_SLEEPINGCARP allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/sleeping_carp_help + pugilist = TRUE /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,STRONG_PUNCH_COMBO)) @@ -23,7 +24,7 @@ return TRUE return FALSE -///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch, has a chance to crit +///Gnashing Teeth: Harm Harm, high force punch on every second harm punch, has a chance to crit for near triple damage /datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/carbon/human/A, mob/living/carbon/human/D) ///this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) @@ -31,50 +32,53 @@ var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam") ///this is the critical hit damage added to the attack if it rolls, it starts at 0 because it'll be changed when rolled var/crit_damage = 0 + var/damage = damage_roll(A,D) D.visible_message("[A] [atk_verb]s [D]!", \ "[A] [atk_verb]s you!", null, null, A) to_chat(A, "You [atk_verb] [D]!") if(prob(10)) - crit_damage += 20 + crit_damage += (damage*2 + 15) playsound(get_turf(D), 'sound/weapons/bite.ogg', 50, TRUE, -1) - D.visible_message("[D] sputters blood as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!") + D.visible_message("[D] staggers as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!") log_combat(A, D, "critcal strong punched (Sleeping Carp)")//log it here because a critical can swing for 40 force and it's important for the sake of how hard they hit else playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) log_combat(A, D, "strong punched (Sleeping Carp)")//so as to not double up on logging - D.apply_damage(20 + crit_damage, BRUTE, affecting) - return + D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting) + return TRUE ///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards /datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = (damage_roll(A,D) + 15) A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] kicks [D] square in the chest, sending them flying!", \ "You are kicked square in the chest by [A], sending you flying!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(D, A.dir) D.throw_at(throw_target, 7, 14, A) - D.apply_damage(15, BRUTE, BODY_ZONE_CHEST) + D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) log_combat(A, D, "launchkicked (Sleeping Carp)") - return + return TRUE ///Keelhaul: Harm Grab combo, knocks people down, deals stamina damage while they're on the floor /datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/damage = damage_roll(A,D) A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) if((D.mobility_flags & MOBILITY_STAND)) - D.apply_damage(10, BRUTE, BODY_ZONE_HEAD) - D.DefaultCombatKnockdown(50) - D.adjustStaminaLoss(40) //A cit specific change form the tg port to really punish anyone who tries to stand up + D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) + D.DefaultCombatKnockdown(50, override_hardstun = 0.01, override_stamdmg = 0) + D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) //A cit specific change form the tg port to really punish anyone who tries to stand up D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \ "You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) - if(!(D.mobility_flags & MOBILITY_STAND)) - D.apply_damage(5, BRUTE, BODY_ZONE_HEAD) - D.adjustStaminaLoss(40) + else + D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD) + D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) D.drop_all_held_items() D.visible_message("[A] kicks [D] in the head!", \ "You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) log_combat(A, D, "dropkicked (Sleeping Carp)") - return + return TRUE /datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("G",D) @@ -85,6 +89,8 @@ /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) + var/damage = (damage_roll(A,D) + 5) + var/stunthreshold = A.dna.species.punchstunthreshold if(check_streak(A,D)) return TRUE var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) @@ -93,8 +99,11 @@ D.visible_message("[A] [atk_verb]s [D]!", \ "[A] [atk_verb]s you!", null, null, A) to_chat(A, "You [atk_verb] [D]!") - D.apply_damage(rand(10,15), BRUTE, affecting) + D.apply_damage(damage, BRUTE, affecting) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) + if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold) + to_chat(D, "You stumble and fall!") + D.DefaultCombatKnockdown(10, override_hardstun = 0.01, override_stamdmg = damage) log_combat(A, D, "punched (Sleeping Carp)") return TRUE @@ -110,7 +119,7 @@ . = ..() if(A.incapacitated(FALSE, TRUE)) //NO STUN return BULLET_ACT_HIT - if(!(A.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE + if(!CHECK_ALL_MOBILITY(A, MOBILITY_USE|MOBILITY_STAND)) //NO UNABLE TO USE, NO DEFLECTION ON THE FLOOR return BULLET_ACT_HIT if(A.dna && A.dna.check_mutation(HULK)) //NO HULK return BULLET_ACT_HIT @@ -121,6 +130,7 @@ playsound(get_turf(A), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) P.firer = A P.setAngle(rand(0, 360))//SHING + A.adjustStaminaLossBuffered (3) //Citadel change to stop infinite bullet sponging as you run away, but it is buffered! return BULLET_ACT_FORCE_PIERCE return BULLET_ACT_HIT @@ -131,9 +141,10 @@ ADD_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) + ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant - H.physiology.stamina_mod *= 0.5 //stun batons prove to be one of the few ways to fight them. They have stun resistance already, so I think doubling down too hard on this resistance is a bit much. + H.physiology.stamina_mod *= 0.5 //You take less stamina damage overall, but you do not reduce the damage from stun batons H.physiology.stun_mod *= 0.3 //for those rare stuns H.physiology.pressure_mod *= 0.3 //go hang out with carp H.physiology.cold_mod *= 0.3 //cold mods are different to burn mods, they do stack however @@ -146,6 +157,7 @@ REMOVE_TRAIT(H, TRAIT_NOGUNS, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT) REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT) + REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT) H.physiology.brute_mod = initial(H.physiology.brute_mod) H.physiology.burn_mod = initial(H.physiology.burn_mod) H.physiology.stamina_mod = initial(H.physiology.stamina_mod) @@ -237,7 +249,7 @@ else return ..() -/obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(wielded) - return ..() - return FALSE +/obj/item/twohanded/bostaff/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!wielded) + return BLOCK_NONE + return ..() diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 349efdd342..87fcf78964 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -19,29 +19,29 @@ /datum/martial_art/wrestling/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(!can_use(A, D)) - return 0 + return FALSE switch(streak) if("drop") streak = "" drop(A,D) - return 1 + return TRUE if("strike") streak = "" strike(A,D) - return 1 + return TRUE if("kick") streak = "" kick(A,D) - return 1 + return TRUE if("throw") streak = "" throw_wrassle(A,D) - return 1 + return TRUE if("slam") streak = "" slam(A,D) - return 1 - return 0 + return TRUE + return FALSE /datum/action/slam name = "Slam (Cinch) - Slam a grappled opponent into the floor." @@ -138,7 +138,7 @@ /datum/martial_art/wrestling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(check_streak(A,D)) - return 1 + return TRUE log_combat(A, D, "punched with wrestling") ..() @@ -173,11 +173,11 @@ if (get_dist(A, D) > 1) to_chat(A, "[D] is too far away!") - return 0 + return FALSE if (!isturf(A.loc) || !isturf(D.loc)) to_chat(A, "You can't throw [D] from here!") - return 0 + return FALSE A.setDir(turn(A.dir, 90)) var/turf/T = get_step(A, A.dir) @@ -186,7 +186,7 @@ D.forceMove(T) D.setDir(get_dir(D, A)) else - return 0 + return FALSE sleep(delay) @@ -195,11 +195,11 @@ if (get_dist(A, D) > 1) to_chat(A, "[D] is too far away!") - return 0 + return FALSE if (!isturf(A.loc) || !isturf(D.loc)) to_chat(A, "You can't throw [D] from here!") - return 0 + return FALSE D.forceMove(A.loc) // Maybe this will help with the wallthrowing bug. @@ -211,7 +211,7 @@ D.emote("scream") D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human.proc/DefaultCombatKnockdown, 20)) log_combat(A, D, "has thrown with wrestling") - return 0 + return FALSE /datum/martial_art/wrestling/proc/FlipAnimation(mob/living/carbon/human/D) set waitfor = FALSE @@ -227,6 +227,7 @@ if(!A.pulling || A.pulling != D) to_chat(A, "You need to have [D] in a cinch!") return + var/damage = damage_roll(A,D) D.forceMove(A.loc) A.setDir(get_dir(A, D)) D.setDir(get_dir(D, A)) @@ -258,7 +259,7 @@ A.pixel_y = 0 D.pixel_x = 0 D.pixel_y = 0 - return 0 + return FALSE if (!isturf(A.loc) || !isturf(D.loc)) to_chat(A, "You can't slam [D] here!") @@ -266,7 +267,7 @@ A.pixel_y = 0 D.pixel_x = 0 D.pixel_y = 0 - return 0 + return FALSE else if (A) A.pixel_x = 0 @@ -274,7 +275,7 @@ if (D) D.pixel_x = 0 D.pixel_y = 0 - return 0 + return FALSE sleep(1) @@ -286,11 +287,11 @@ if (get_dist(A, D) > 1) to_chat(A, "[D] is too far away!") - return 0 + return FALSE if (!isturf(A.loc) || !isturf(D.loc)) to_chat(A, "You can't slam [D] here!") - return 0 + return FALSE D.forceMove(A.loc) @@ -309,11 +310,11 @@ switch(rand(1,3)) if (2) - D.adjustBruteLoss(rand(20,30)) + D.apply_damage(damage + 25, BRUTE) if (3) D.ex_act(EXPLODE_LIGHT) else - D.adjustBruteLoss(rand(10,20)) + D.apply_damage(damage + 15, BRUTE) else D.ex_act(EXPLODE_LIGHT) @@ -327,7 +328,7 @@ log_combat(A, D, "body-slammed") - return 0 + return FALSE /datum/martial_art/wrestling/proc/CheckStrikeTurf(mob/living/carbon/human/A, turf/T) if (A && (T && isturf(T) && get_dist(A, T) <= 1)) @@ -337,6 +338,7 @@ if(!D) return var/turf/T = get_turf(A) + var/damage = damage_roll(A,D) if (T && isturf(T) && D && isturf(D.loc)) for (var/i = 0, i < 4, i++) A.setDir(turn(A.dir, 90)) @@ -345,7 +347,7 @@ addtimer(CALLBACK(src, .proc/CheckStrikeTurf, A, T), 4) A.visible_message("[A] headbutts [D]!") - D.adjustBruteLoss(rand(10,20)) + D.apply_damage(damage + 15, BRUTE) playsound(A.loc, "swing_hit", 50, 1) D.Unconscious(20) log_combat(A, D, "headbutted") @@ -353,13 +355,14 @@ /datum/martial_art/wrestling/proc/kick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D) return + var/damage = damage_roll(A,D) A.emote("scream") A.emote("flip") A.setDir(turn(A.dir, 90)) A.visible_message("[A] roundhouse-kicks [D]!") playsound(A.loc, "swing_hit", 50, 1) - D.adjustBruteLoss(rand(10,20)) + D.apply_damage(damage + 15, STAMINA) var/turf/T = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) if (T && isturf(T)) @@ -373,7 +376,8 @@ var/obj/surface = null var/turf/ST = null var/falling = 0 - + var/damage = damage_roll(A,D) + for (var/obj/O in oview(1, A)) if (O.density == 1) if (O == A) @@ -401,15 +405,15 @@ A.pixel_y = 0 if (falling == 1) A.visible_message("...and dives head-first into the ground, ouch!") - A.adjustBruteLoss(rand(10,20)) + A.apply_damage(damage + 15, BRUTE) A.DefaultCombatKnockdown(60) to_chat(A, "[D] is too far away!") - return 0 + return FALSE if (!isturf(A.loc) || !isturf(D.loc)) A.pixel_y = 0 to_chat(A, "You can't drop onto [D] from here!") - return 0 + return FALSE if(A) animate(A, transform = matrix(90, MATRIX_ROTATE), time = 1, loop = 0) @@ -427,9 +431,9 @@ if (prob(33) || D.stat) D.ex_act(EXPLODE_LIGHT) else - D.adjustBruteLoss(rand(20,30)) + D.apply_damage(damage + 25, BRUTE) else - D.adjustBruteLoss(rand(20,30)) + D.apply_damage(damage + 25, BRUTE) D.DefaultCombatKnockdown(40) @@ -442,14 +446,16 @@ return /datum/martial_art/wrestling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + damage_roll(A,D) if(check_streak(A,D)) - return 1 + return TRUE log_combat(A, D, "wrestling-disarmed") ..() /datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + damage_roll(A,D) if(check_streak(A,D)) - return 1 + return TRUE if(!can_use(A,D)) return ..() if(A.pulling == D || A == D) // don't stun grab yoursel @@ -459,7 +465,7 @@ "[A] gets [D] in a cinch!") D.Stun(rand(60,100)) log_combat(A, D, "cinched") - return 1 + return TRUE /obj/item/storage/belt/champion/wrestling name = "Wrestling Belt" @@ -474,12 +480,12 @@ return /obj/item/storage/belt/champion/wrestling/dropped(mob/user) + . = ..() if(!ishuman(user)) return var/mob/living/carbon/human/H = user if(H.get_item_by_slot(SLOT_BELT) == src) style.remove(H) - return //Subtype of wrestling, reserved for the wrestling belts found in the holodeck /datum/martial_art/wrestling/holodeck @@ -492,7 +498,7 @@ //Make sure that moves can only be used on people wearing the holodeck belt /datum/martial_art/wrestling/holodeck/can_use(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(!(istype(D.mind?.martial_art, /datum/martial_art/wrestling/holodeck))) - return 0 + return FALSE else return ..() diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index c658ac215d..1a8ce755e1 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -24,6 +24,8 @@ Simple datum which is instanced once per type and is used for every object of sa var/value_per_unit = 0 ///Armor modifiers, multiplies an items normal armor vars by these amounts. var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) + ///How beautiful is this material per unit? + var/beauty_modifier = 0 ///This proc is called when the material is added to an object. /datum/material/proc/on_applied(atom/source, amount, material_flags) @@ -39,6 +41,9 @@ Simple datum which is instanced once per type and is used for every object of sa if(istype(source, /obj)) //objs on_applied_obj(source, amount, material_flags) + if(beauty_modifier) + addtimer(CALLBACK(source, /datum.proc/_AddElement, list(/datum/element/beauty, beauty_modifier * amount)), 0) + ///This proc is called when the material is added to an object specifically. /datum/material/proc/on_applied_obj(var/obj/o, amount, material_flags) if(material_flags & MATERIAL_AFFECT_STATISTICS) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index c006f97bff..d4921a04d2 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -19,7 +19,8 @@ integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass value_per_unit = 0.0025 - armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) // yeah ok retard + beauty_modifier = 0.05 + armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) // yeah ok /* Color matrices are like regular colors but unlike with normal colors, you can go over 255 on a channel. @@ -35,6 +36,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver value_per_unit = 0.025 + beauty_modifier = 0.075 ///Slight force increase /datum/material/gold @@ -46,6 +48,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold value_per_unit = 0.0625 + beauty_modifier = 0.15 armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1) ///Has no special properties @@ -58,6 +61,8 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond value_per_unit = 0.25 + beauty_modifier = 0.3 + armor_modifiers = list("melee" = 1.3, "bullet" = 1.3, "laser" = 0.6, "energy" = 1, "bomb" = 1.2, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) ///Is slightly radioactive /datum/material/uranium @@ -68,11 +73,12 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium value_per_unit = 0.05 + beauty_modifier = 0.3 //It shines so beautiful armor_modifiers = list("melee" = 1.5, "bullet" = 1.4, "laser" = 0.5, "energy" = 0.5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 1, "acid" = 1) /datum/material/uranium/on_applied(atom/source, amount, material_flags) . = ..() - source.AddComponent(/datum/component/radioactive, amount / 20, source, 0) //half-life of 0 because we keep on going. + source.AddComponent(/datum/component/radioactive, amount / 60, source, 0) //half-life of 0 because we keep on going. /datum/material/uranium/on_removed(atom/source, material_flags) . = ..() @@ -88,11 +94,12 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma value_per_unit = 0.1 + beauty_modifier = 0.15 armor_modifiers = list("melee" = 1.4, "bullet" = 0.7, "laser" = 0, "energy" = 1.2, "bomb" = 0, "bio" = 1.2, "rad" = 1, "fire" = 0, "acid" = 0.5) /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() - if(ismovableatom(source)) + if(ismovable(source)) source.AddElement(/datum/element/firestacker, amount=1) source.AddComponent(/datum/component/explodable, 0, 0, amount / 2500, amount / 1250) @@ -109,6 +116,7 @@ Unless you know what you're doing, only use the first three numbers. They're in color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) alpha = 200 categories = list(MAT_CATEGORY_ORE = TRUE) + beauty_modifier = 0.5 sheet_type = /obj/item/stack/sheet/bluespace_crystal value_per_unit = 0.15 @@ -121,6 +129,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium value_per_unit = 0.5 + beauty_modifier = 0.5 armor_modifiers = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0) //Clowns cant be blown away /datum/material/bananium/on_applied(atom/source, amount, material_flags) @@ -144,6 +153,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium value_per_unit = 0.0625 + beauty_modifier = 0.05 armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1) /datum/material/runite @@ -154,6 +164,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.3 categories = list(MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/runite + beauty_modifier = 0.5 armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. ///Force decrease @@ -165,6 +176,7 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic value_per_unit = 0.0125 + beauty_modifier = -0.01 armor_modifiers = list("melee" = 1.5, "bullet" = 1.1, "laser" = 0.3, "energy" = 0.5, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1.1, "acid" = 1) ///Force decrease and mushy sound effect. (Not yet implemented) @@ -176,6 +188,30 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.8 value_per_unit = 0.025 +/datum/material/wood + name = "wood" + id = "wood" + desc = "Flexible, durable, but flamable. Hard to come across in space." + color = "#bb8e53" + strength_modifier = 0.5 + sheet_type = /obj/item/stack/sheet/mineral/wood + categories = list(MAT_CATEGORY_RIGID = TRUE) + value_per_unit = 0.06 + beauty_modifier = 0.1 + armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3) + +/datum/material/wood/on_applied_obj(obj/source, amount, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/wooden = source + wooden.resistance_flags |= FLAMMABLE + +/datum/material/wood/on_removed_obj(obj/source, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/wooden = source + wooden.resistance_flags &= ~FLAMMABLE + ///Stronk force increase /datum/material/adamantine name = "adamantine" @@ -186,6 +222,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/adamantine value_per_unit = 0.25 + beauty_modifier = 0.4 armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1) ///RPG Magic. (Admin only) @@ -197,6 +234,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/mythril value_per_unit = 0.75 + beauty_modifier = 0.5 armor_modifiers = list("melee" = 2, "bullet" = 2, "laser" = 2, "energy" = 2, "bomb" = 2, "bio" = 2, "rad" = 2, "fire" = 2, "acid" = 2) /datum/material/mythril/on_applied_obj(atom/source, amount, material_flags) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 45a0f86a98..2a6835cc23 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -63,7 +63,11 @@ var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator var/list/learned_recipes //List of learned recipe TYPES. + /// Our skill holder. + var/datum/skill_holder/skill_holder + /datum/mind/New(var/key) + skill_holder = new() src.key = key soulOwner = src martial_art = default_martial_art @@ -76,12 +80,12 @@ if(antag_datum.delete_on_mind_deletion) qdel(i) antag_datums = null + QDEL_NULL(skill_holder) return ..() /datum/mind/proc/get_language_holder() if(!language_holder) - var/datum/language_holder/L = current.get_language_holder(shadow=FALSE) - language_holder = L.copy(src) + language_holder = new (src) return language_holder @@ -93,12 +97,6 @@ if(current) // remove ourself from our old body's mind variable current.mind = null SStgui.on_transfer(current, new_character) - if(iscarbon(current)) - var/mob/living/carbon/C = current - C.disable_intentional_combat_mode(TRUE) - if(!language_holder) - var/datum/language_holder/mob_holder = new_character.get_language_holder(shadow = FALSE) - language_holder = mob_holder.copy(src) if(key) if(new_character.key != key) //if we're transferring into a body with a key associated which is not ours @@ -126,6 +124,7 @@ transfer_martial_arts(new_character) if(active || force_key_move) new_character.key = key //now transfer the key to link the client to our new body + current.update_atom_languages() //CIT CHANGE - makes arousal update when transfering bodies if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs. @@ -332,14 +331,20 @@ /datum/mind/proc/enslave_mind_to_creator(mob/living/creator) if(iscultist(creator)) - SSticker.mode.add_cultist(src) + if(iscultist(creator, TRUE)) + SSticker.mode.add_cultist(src) + else + src.add_antag_datum(/datum/antagonist/cult/neutered/traitor) else if(is_revolutionary(creator)) var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) converter.add_revolutionary(src,FALSE) else if(is_servant_of_ratvar(creator)) - add_servant_of_ratvar(current) + if(is_servant_of_ratvar(creator, TRUE)) + add_servant_of_ratvar(current) + else + add_servant_of_ratvar(current, FALSE, FALSE, /datum/antagonist/clockcult/neutered/traitor) else if(is_nuclear_operative(creator)) var/datum/antagonist/nukeop/converter = creator.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) @@ -511,6 +516,19 @@ message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") + else if(href_list["traitor_class"]) + var/static/list/choices + if(!choices) + choices = list() + for(var/C in GLOB.traitor_classes) + var/datum/traitor_class/t = C + choices[initial(t.employer)] = C + var/datum/antagonist/traitor/T = locate(href_list["target_antag"]) in antag_datums + if(T) + var/selected_type = input("Select traitor class:", "Traitor class", T.traitor_kind.employer) as null|anything in choices + selected_type = choices[selected_type] + T.set_traitor_kind(selected_type) + else if (href_list["obj_delete"]) var/datum/objective/objective diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index 70acffdb8f..4107fd7380 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -23,6 +23,11 @@ mood_change = 4 timeout = 2 MINUTES +/datum/mood_event/race_drink + description = "That drink was made for me!\n" + mood_change = 6 + timeout = 5 MINUTES + /datum/mood_event/amazingtaste description = "Amazing taste!\n" mood_change = 50 //Is this not really high..? diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 1464927c3a..f5692c297a 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -153,7 +153,13 @@ mood_change = -4 timeout = 2400 +/datum/mood_event/graverobbing + description ="I just desecrated someone's grave... I can't believe I did that...\n" + mood_change = -8 + timeout = 3 MINUTES + //These are unused so far but I want to remember them to use them later + /datum/mood_event/cloned_corpse description = "I recently saw my own corpse...\n" mood_change = -6 @@ -162,6 +168,8 @@ description = "HE'S CUTTING ME OPEN!!\n" mood_change = -8 +//End unused + /datum/mood_event/sad_empath description = "Someone seems upset...\n" mood_change = -2 @@ -199,6 +207,8 @@ mood_change = -2 timeout = 1 MINUTES +//Cursed stuff end. + /datum/mood_event/vampcandle description = "Something is making your mind feel... loose...\n" mood_change = -15 @@ -248,7 +258,7 @@ description = "Something I recently ate was horrifyingly disgusting.\n" mood_change = -5 timeout = 5 MINUTES - + /datum/mood_event/nanite_sadness description = "+++++++HAPPINESS SUPPRESSION+++++++\n" mood_change = -7 @@ -256,3 +266,7 @@ /datum/mood_event/nanite_sadness/add_effects(message) description = "+++++++[message]+++++++\n" +/datum/mood_event/artbad + description = "I've produced better art than that from my ass.\n" + mood_change = -2 + timeout = 1200 diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 1e9a53cf57..95177f6869 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -182,3 +182,17 @@ description = "What a peculiar emblem. It makes me feel hopeful for my future.\n" mood_change = 5 +/datum/mood_event/artok + description = "It's nice to see people are making art around here.\n" + mood_change = 2 + timeout = 2 MINUTES + +/datum/mood_event/artgood + description = "What a thought-provoking piece of art. I'll remember that for a while.\n" + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/artgreat + description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this.\n" + mood_change = 4 + timeout = 4 MINUTES diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 2156581cb1..db739c5100 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -31,6 +31,7 @@ //MUT_EXTRA - A mutation that is in the mutations tab, and can be given and taken away through though the DNA console. Has a 0 before it's name in the mutation section of the dna console //MUT_OTHER Cannot be interacted with by players through normal means. I.E. wizards mutate + var/list/conflicts //any mutations that might conflict. put mutation typepath defines in here. make sure to enter it both ways (so that A conflicts with B, and B with A) var/can_chromosome = CHROMOSOME_NONE //can we take chromosomes? 0: CHROMOSOME_NEVER never, 1:CHROMOSOME_NONE yeah, 2: CHROMOSOME_USED no, already have one var/chromosome_name //purely cosmetic var/modified = FALSE //ugly but we really don't want chromosomes and on_acquiring to overlap and apply double the powers @@ -60,6 +61,14 @@ return TRUE if(limb_req && !H.get_bodypart(limb_req)) return TRUE + for(var/M in H.dna.mutations)//check for conflicting powers + var/datum/mutation/human/mewtayshun = M + if(LAZYLEN(mewtayshun.conflicts)) + for(var/cons in mewtayshun.conflicts) + var/datum/mutation/human/conflicter = cons + if(conflicter == type) + to_chat(H, "You feel your genes resisting something.") + return TRUE owner = H dna = H.dna dna.mutations += src @@ -107,7 +116,8 @@ owner.apply_overlay(layer_used) if(power) owner.RemoveSpell(power) - qdel(src) + qdel(power) + SEND_SIGNAL(owner, COMSIG_HUMAN_MUTATION_LOSS, src) return 0 return 1 diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index e933e02c15..1475cfa356 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -406,6 +406,8 @@ w_class = WEIGHT_CLASS_SMALL sharpness = IS_SHARP var/mob/living/carbon/human/fired_by + /// if we missed our target + var/missed = TRUE /obj/item/hardened_spike/Initialize(mapload, firedby) . = ..() @@ -413,13 +415,12 @@ addtimer(CALLBACK(src, .proc/checkembedded), 5 SECONDS) /obj/item/hardened_spike/proc/checkembedded() - if(ishuman(loc)) - var/mob/living/carbon/human/embedtest = loc - for(var/l in embedtest.bodyparts) - var/obj/item/bodypart/limb = l - if(src in limb.embedded_objects) - return limb - unembedded() + if(missed) + unembedded() + +/obj/item/hardened_spike/embedded(atom/target) + if(isbodypart(target)) + missed = FALSE /obj/item/hardened_spike/unembedded() var/turf/T = get_turf(src) @@ -490,11 +491,7 @@ var/obj/item/bodypart/L = spikey.checkembedded() - L.embedded_objects -= spikey //this is where it would deal damage, if it transfers chems it removes itself so no damage spikey.forceMove(get_turf(L)) transfered.visible_message("[spikey] falls out of [transfered]!") - if(!transfered.has_embedded_objects()) - transfered.clear_alert("embeddedobject") - SEND_SIGNAL(transfered, COMSIG_CLEAR_MOOD_EVENT, "embedded") - spikey.unembedded() + diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index cc286058f1..866ea85dbf 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -75,20 +75,22 @@ quality = POSITIVE difficulty = 16 instability = 5 + conflicts = list(GIGANTISM) locked = TRUE // Default intert species for now, so locked from regular pool. /datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.transform = owner.transform.Scale(1, 0.8) - owner.pass_flags |= PASSTABLE + ADD_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) + owner.AddElement(/datum/element/dwarfism, COMSIG_HUMAN_MUTATION_LOSS, src) + passtable_on(owner, GENETIC_MUTATION) owner.visible_message("[owner] suddenly shrinks!", "Everything around you seems to grow..") /datum/mutation/human/dwarfism/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.transform = owner.transform.Scale(1, 1.25) - owner.pass_flags &= ~PASSTABLE + REMOVE_TRAIT(owner, TRAIT_DWARF, GENETIC_MUTATION) + passtable_off(owner, GENETIC_MUTATION) owner.visible_message("[owner] suddenly grows!", "Everything around you seems to shrink..") @@ -333,10 +335,12 @@ desc = "The cells within the subject spread out to cover more area, making the subject appear larger." quality = MINOR_NEGATIVE difficulty = 12 + conflicts = list(DWARFISM) /datum/mutation/human/gigantism/on_acquiring(mob/living/carbon/human/owner) if(..()) return + ADD_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) owner.resize = 1.25 owner.update_transform() owner.visible_message("[owner] suddenly grows!", "Everything around you seems to shrink..") @@ -344,6 +348,7 @@ /datum/mutation/human/gigantism/on_losing(mob/living/carbon/human/owner) if(..()) return + REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) owner.resize = 0.8 owner.update_transform() owner.visible_message("[owner] suddenly shrinks!", "Everything around you seems to grow..") diff --git a/code/datums/mutations/combined.dm b/code/datums/mutations/combined.dm index d3cc83f9c0..465706c897 100644 --- a/code/datums/mutations/combined.dm +++ b/code/datums/mutations/combined.dm @@ -26,3 +26,7 @@ /datum/generecipe/tonguechem required = "/datum/mutation/human/tongue_spike; /datum/mutation/human/stimmed" result = TONGUESPIKECHEM + +/datum/generecipe/hulk + required = "/datum/mutation/human/strong; /datum/mutation/human/radioactive" + result = HULK diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 56ce3533fc..d4db7e34c2 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -79,7 +79,7 @@ message = " [message] " //Time for a friendly game of SS13 message = replacetext(message," stupid "," smart ") - message = replacetext(message," retard "," genius ") + message = replacetext(message," idiot "," genius ") message = replacetext(message," unrobust "," robust ") message = replacetext(message," dumb "," smart ") message = replacetext(message," awful "," great ") @@ -108,7 +108,6 @@ message = replacetext(message," drink "," liquid ") message = replacetext(message," feminist "," empowered woman ") message = replacetext(message," i hate you "," you're a mean ") - message = replacetext(message," jew "," jewish ") message = replacetext(message," shit "," shiz ") message = replacetext(message," crap "," poo ") message = replacetext(message," slut "," tease ") @@ -263,7 +262,7 @@ message = replacetext(message," thank you "," thank you, thank you very much ") message = replacetext(message," what are you "," whatcha ") message = replacetext(message," yes ",pick(" sure", "yea ")) - message = replacetext(message," faggot "," square ") + message = replacetext(message," dumbass "," square ") message = replacetext(message," muh valids "," getting my kicks ") speech_args[SPEECH_MESSAGE] = trim(message) @@ -278,10 +277,10 @@ /datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner) ..() - owner.grant_language(/datum/language/beachbum) - owner.remove_language(/datum/language/common) + owner.grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER) + owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER) /datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner) ..() - owner.grant_language(/datum/language/common) - owner.remove_language(/datum/language/beachbum) + owner.remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER) + owner.remove_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER) diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 44ff87e8ae..482e15c57d 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -20,7 +20,7 @@ return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) /proc/angle_between_points(datum/point/a, datum/point/b) - return ATAN2((b.y - a.y), (b.x - a.x)) + return arctan((b.y - a.y), (b.x - a.x)) /datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. var/x = 0 @@ -189,6 +189,12 @@ x += mpx * (multiplier) y += mpy * (multiplier) +/datum/point/vector/proc/pixel_increment(pixels = 32, update_iteration = TRUE, realistic_iteration = FALSE) + if(update_iteration) + iteration += realistic_iteration? round(pixels / speed) : 1 + x += sin(angle) * pixels + y += cos(angle) * pixels + /datum/point/vector/proc/return_vector_after_increments(amount = 7, multiplier = 1, force_simulate = FALSE) var/datum/point/vector/v = copy_to() if(force_simulate) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index faecf809cc..fbc194cc6f 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -38,7 +38,7 @@ if (user.client) user.client.images += bar - progress = CLAMP(progress, 0, goal) + progress = clamp(progress, 0, goal) bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" if (!shown) user.client.images += bar diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 4795f8da60..fe018a8761 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -117,10 +117,10 @@ continue contam_atoms += thing var/did_contam = 0 - if(length(can_contam)) + if(can_contam && contam_atoms.len) var/rad_strength = ((strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT)/contam_atoms.len - for(var/k in 1 to contam_atoms.len) - var/atom/thing = contam_atoms[k] + for(var/A in contam_atoms) + var/atom/thing = A thing.AddComponent(/datum/component/radioactive, rad_strength, source) did_contam = 1 return did_contam diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm new file mode 100644 index 0000000000..347ba2e4d4 --- /dev/null +++ b/code/datums/ruins/icemoon.dm @@ -0,0 +1,112 @@ +// Hey! Listen! Update \config\iceruinblacklist.txt with your new ruins! + +/datum/map_template/ruin/icemoon + prefix = "_maps/RandomRuins/IceRuins/" + allow_duplicates = FALSE + cost = 5 + +// above ground only + +/datum/map_template/ruin/icemoon/lust + name = "Ruin of Lust" + id = "lust" + description = "Not exactly what you expected." + suffix = "icemoon_surface_lust.dmm" + +/datum/map_template/ruin/icemoon/asteroid + name = "Asteroid Site" + id = "asteroidsite" + description = "Surprised to see us here?" + suffix = "icemoon_surface_asteroid.dmm" + +/datum/map_template/ruin/icemoon/hotsprings + name = "Hot Springs" + id = "hotsprings" + description = "Just relax and take a dip, nothing will go wrong, I swear!" + suffix = "icemoon_surface_hotsprings.dmm" + +/datum/map_template/ruin/icemoon/engioutpost + name = "Engineer Outpost" + id = "engioutpost" + description = "Blown up by an unfortunate accident." + suffix = "icemoon_surface_engioutpost.dmm" + +/datum/map_template/ruin/icemoon/fountain + name = "Fountain Hall" + id = "fountain" + description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." + prefix = "_maps/RandomRuins/AnywhereRuins/" + suffix = "fountain_hall.dmm" + +// above and below ground together + +/datum/map_template/ruin/icemoon/mining_site + name = "Mining Site" + id = "miningsite" + description = "Ruins of a site where people once mined with primitive tools for ore." + suffix = "icemoon_surface_mining_site.dmm" + always_place = TRUE + always_spawn_with = list(/datum/map_template/ruin/icemoon/underground/mining_site_below = PLACE_BELOW) + +/datum/map_template/ruin/icemoon/underground/mining_site_below + name = "Mining Site Underground" + id = "miningsite-underground" + description = "Who knew ladders could be so useful?" + suffix = "icemoon_underground_mining_site.dmm" + unpickable = TRUE + +// below ground only + +/datum/map_template/ruin/icemoon/underground + name = "underground ruin" + +/datum/map_template/ruin/icemoon/underground/abandonedvillage + name = "Abandoned Village" + id = "abandonedvillage" + description = "Who knows what lies within?" + suffix = "icemoon_underground_abandoned_village.dmm" + +/datum/map_template/ruin/icemoon/underground/library + name = "Buried Library" + id = "buriedlibrary" + description = "A once grand library, now lost to the confines of the Ice Moon." + suffix = "icemoon_underground_library.dmm" + +/datum/map_template/ruin/icemoon/underground/wrath + name = "Ruin of Wrath" + id = "wrath" + description = "You'll fight and fight and just keep fighting." + suffix = "icemoon_underground_wrath.dmm" + +/datum/map_template/ruin/icemoon/underground/lavaland + name = "Lavaland Site" + id = "lavalandsite" + description = "I guess we never really left you huh?" + suffix = "icemoon_underground_lavaland.dmm" + +/datum/map_template/ruin/icemoon/underground/puzzle + name = "Ancient Puzzle" + id = "puzzle" + description = "Mystery to be solved." + suffix = "icemoon_underground_puzzle.dmm" + +/datum/map_template/ruin/icemoon/underground/bathhouse + name = "Bath House" + id = "bathhouse" + description = "A taste of paradise, locked in the hell of the Ice Moon." + suffix = "icemoon_underground_bathhouse.dmm" + +/datum/map_template/ruin/icemoon/underground/wendigo_cave + name = "Wendigo Cave" + id = "wendigocave" + description = "Into the jaws of the beast." + suffix = "icemoon_underground_wendigo_cave.dmm" + +/datum/map_template/ruin/icemoon/underground/free_golem + name = "Free Golem Ship" + id = "golem-ship" + description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ + Seem very intent on research and individual liberty, and also geology-based naming?" + prefix = "_maps/RandomRuins/AnywhereRuins/" + suffix = "golem_ship.dmm" + allow_duplicates = FALSE diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 483c1e353f..933eaf082e 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -67,7 +67,8 @@ description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ Seem very intent on research and individual liberty, and also geology based naming?" cost = 20 - suffix = "lavaland_surface_golem_ship.dmm" + prefix = "_maps/RandomRuins/AnywhereRuins/" + suffix = "golem_ship.dmm" allow_duplicates = FALSE /datum/map_template/ruin/lavaland/animal_hospital @@ -175,7 +176,8 @@ name = "Fountain Hall" id = "fountain" description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." - suffix = "lavaland_surface_fountain_hall.dmm" + prefix = "_maps/RandomRuins/AnywhereRuins/" + suffix = "fountain_hall.dmm" cost = 5 allow_duplicates = FALSE @@ -248,4 +250,12 @@ cost = 5 placement_weight = 3 always_place = TRUE - allow_duplicates = TRUE + allow_duplicates = TRUE + +/datum/map_template/ruin/lavaland/elephant_graveyard + name = "Elephant Graveyard" + id = "Graveyard" + description = "An abandoned graveyard, calling to those unable to continue." + suffix = "lavaland_surface_elephant_graveyard.dmm" + allow_duplicates = FALSE + cost = 10 diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 0a44954e51..5282156042 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -23,14 +23,14 @@ mappath = "[prefix][shuttle_id].dmm" . = ..() -/datum/map_template/shuttle/preload_size(path, cache) +/datum/map_template/shuttle/preload_size(path = mappath, force_cache = FALSE) . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map if(!cached_map) return discover_port_offset() - if(!cache) + if(!cached_map) cached_map = null /datum/map_template/shuttle/proc/discover_port_offset() @@ -53,12 +53,11 @@ ++xcrd --ycrd -/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) +/datum/map_template/shuttle/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, register = TRUE) . = ..() if(!.) return - var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), - locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) + var/list/turfs = get_last_loaded_turf_block() for(var/i in 1 to turfs.len) var/turf/place = turfs[i] if(istype(place, /turf/open/space)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. @@ -163,6 +162,10 @@ port_id = "pirate" can_be_bought = FALSE +/datum/map_template/shuttle/hunter + port_id = "hunter" + can_be_bought = FALSE + /datum/map_template/shuttle/ruin //For random shuttles in ruins port_id = "ruin" can_be_bought = FALSE @@ -171,6 +174,11 @@ port_id = "snowdin" can_be_bought = FALSE +/datum/map_template/shuttle/snow_taxi + port_id = "snow" + can_be_bought = FALSE + suffix = "taxi" + // Shuttles start here: /datum/map_template/shuttle/emergency/backup @@ -558,6 +566,10 @@ suffix = "cog" name = "arrival shuttle (Cog)" +/datum/map_template/shuttle/arrival/snaxi + suffix = "snaxi" + name = "arrival shuttle (Snaxi)" + /datum/map_template/shuttle/aux_base/default suffix = "default" name = "auxilliary base (Default)" @@ -605,3 +617,15 @@ /datum/map_template/shuttle/snowdin/excavation suffix = "excavation" name = "Snowdin Excavation Elevator" + +/datum/map_template/shuttle/hunter/space_cop + suffix = "space_cop" + name = "Police Spacevan" + +/datum/map_template/shuttle/hunter/russian + suffix = "russian" + name = "Russian Cargo Ship" + +/datum/map_template/shuttle/hunter/bounty + suffix = "bounty" + name = "Bounty Hunter Ship" \ No newline at end of file diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm new file mode 100644 index 0000000000..a94c7c95ba --- /dev/null +++ b/code/datums/skills/_check_skills.dm @@ -0,0 +1,16 @@ +// yeah yeah verbs suck whatever I suck at this fix this someone please - kevinz000 + +/mob/verb/check_skills() + set name = "Check Skills" + set category = "IC" + set desc = "Check your skills (if you have any..)" + + if(!mind) + to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without a mind?") + return + if(!mind.skill_holder) + to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without the capability for skills? (PROBABLY A BUG, PRESS F1.)") + return + var/datum/browser/B = new(usr, "skilldisplay_[REF(src)]", "Skills of [src]") + B.set_content(mind.skill_html_readout()) + B.open() diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm new file mode 100644 index 0000000000..571a8274d8 --- /dev/null +++ b/code/datums/skills/_skill.dm @@ -0,0 +1,201 @@ +GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums()) + +/proc/init_skill_datums() + . = list() + for(var/path in subtypesof(/datum/skill)) + var/datum/skill/S = path + if(initial(S.abstract_type) == path) + continue + S = new path + .[S.type] = S + +/** + * Skill datums + */ + +/datum/skill + /// Our name + var/name + /// Our description + var/desc + /// Color of the name as shown in the html readout + var/name_color = "#F0F0F0" // White on dark surface. + /// Our progression type. These are mostly used to skip typechecks overhead, don't go around messing with these. + var/progression_type + /// Abstract type + var/abstract_type = /datum/skill + /// List of max levels. Only used in level skills, but present here for helper macros. + var/max_levels = INFINITY + /// skill threshold used in generic skill competency operations. + var/list/competency_thresholds + /// Base multiplier used in skill competency operations. + var/base_multiplier = 1 + /// Value added to the base multiplier depending on overall competency compared to maximum value/level. + var/competency_multiplier = 1 + /// A list of ways this skill can affect or be affected through actions and skill modifiers. + var/list/skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE) + +/** + * Ensures what someone's setting as a value for this skill is valid. + */ +/datum/skill/proc/sanitize_value(new_value) + return new_value + +/** + * Sets the new value of this skill in the holder skills list. + * As well as possible feedback messages or secondary effects on value change, that's on you. + */ +/datum/skill/proc/set_skill_value(datum/skill_holder/H, value, mob/owner) + H.skills[type] = value + +/** + * Checks if a value is greater + */ +/datum/skill/proc/is_value_greater(existing, new_value) + if(!existing) + return TRUE + return new_value > existing + +/** + * Standard value "render" + */ +/datum/skill/proc/standard_render_value(value, level) + return value + +// Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context. +// Aka: So people don't forget to change checks if they change a skill's progression type. + +/datum/skill/binary + abstract_type = /datum/skill/binary + progression_type = SKILL_PROGRESSION_BINARY + competency_thresholds = list(THRESHOLD_COMPETENT = FALSE, THRESHOLD_EXPERT = TRUE, THRESHOLD_MASTER = TRUE) + +/datum/skill/binary/sanitize_value(new_value) + return new_value? TRUE : FALSE + +/datum/skill/binary/standard_render_value(value, level) + return value? "Yes" : "No" + +/datum/skill/numerical + abstract_type = /datum/skill/numerical + progression_type = SKILL_PROGRESSION_NUMERICAL + competency_thresholds = list(THRESHOLD_COMPETENT = 25, THRESHOLD_EXPERT = 50, THRESHOLD_MASTER = 75) + /// Max value of this skill + var/max_value = 100 + /// Min value of this skill + var/min_value = 0 + /// Display as a percent in standard_render_value? + var/display_as_percent = FALSE + +/datum/skill/numerical/sanitize_value(new_value) + return clamp(new_value, min_value, max_value) + +/datum/skill/numerical/standard_render_value(value, level) + return display_as_percent? "[round(value/max_value/100, 0.01)]%" : "[value] / [max_value]" + +/datum/skill/enum + abstract_type = /datum/skill/enum + progression_type = SKILL_PROGRESSION_ENUM + /// Valid values for the skill + var/list/valid_values = list() + +/datum/skill/enum/sanitize_value(new_value) + if(new_value in valid_values) + return new_value + +/** + * Classing r p g styled skills, tiered by lvl, and current/nextlvl experience. + */ +/datum/skill/level + abstract_type = /datum/skill/level + progression_type = SKILL_PROGRESSION_LEVEL + max_levels = STD_MAX_LVL + var/standard_xp_lvl_up = STD_XP_LVL_UP //the standard required to level up. def: 100 + var/xp_lvl_multiplier = STD_XP_LVL_MULTI //standard required level up exp multiplier. def: 2 (100, 200, 400, 800 etc.) + var/level_up_method = STANDARD_LEVEL_UP //how levels are calculated. + var/list/levels = list() //level thresholds, if associative, these will be preceded by tiers such as "novice" or "trained" + var/associative = FALSE //See above. + var/unskilled_tier = "Unskilled" //Only relevant for associative experience levels + +//Builds the levels list. +/datum/skill/level/New() + . = ..() + var/max_assoc = "" + var/max_assoc_start = 1 + for(var/lvl in 1 to max_levels) + var/value + switch(level_up_method) + if(STANDARD_LEVEL_UP) + value = XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl) + if(DWARFY_LEVEL_UP) + value = DORF_XP_LEVEL(standard_xp_lvl_up, xp_lvl_multiplier, lvl) + value = round(value, 1) + if(!associative) + levels += value + continue + if(max_assoc) + levels["[max_assoc] +[max_assoc_start++]"] = value + continue + var/key = LAZYACCESS(levels, lvl) + if(!key) + if(lvl == 1) //You dun goof it. + stack_trace("Skill datum [src] was set to have an associative levels list despite the latter having no key value.") + associative = FALSE + levels += value + continue + max_assoc = levels[lvl-1] + levels["[max_assoc] +[max_assoc_start++]"] = value + levels[key] = value + +/datum/skill/level/sanitize_value(new_value) + return max(new_value, 0) + +/datum/skill/level/set_skill_value(datum/skill_holder/H, value, datum/mind/M, silent = FALSE) + H.skills[type] = value + var/new_level + for(var/k in levels) + if(value < (associative ? levels[k] : k)) + break + new_level++ + var/old_level = LAZYACCESS(H.skill_levels, type) + LAZYSET(H.skill_levels, type, new_level) + . = new_level - old_level + if(silent || !(M?.current)) + return + if(. > 0) + to_chat(M.current, "I feel like I've become more proficient at [name]!") + else if(. < 0) + to_chat(M.current, "I feel like I've become worse at [name]!") + +/datum/skill/level/standard_render_value(value, level) + var/current_lvl = associative ? (!level ? unskilled_tier : levels[level]) : level + var/current_lvl_xp_sum = 0 + if(level) + current_lvl_xp_sum = associative ? levels[levels[level]] : levels[level] + var/next_index = min(max_levels, level+1) + var/next_lvl_xp = associative ? levels[levels[next_index]] : levels[next_index] + if(next_lvl_xp > current_lvl_xp_sum) + next_lvl_xp -= current_lvl_xp_sum + + return "[associative ? current_lvl : "Lvl. [current_lvl]"] ([value - current_lvl_xp_sum]/[next_lvl_xp])[level == max_levels ? " \[MAX!\]" : ""]" + +/datum/skill/level/job + abstract_type = /datum/skill/level/job + levels = list("Basic", "Trained", "Experienced", "Master") + competency_thresholds = list(THRESHOLD_COMPETENT = JOB_SKILL_TRAINED, THRESHOLD_EXPERT = JOB_SKILL_EXPERT, THRESHOLD_MASTER = JOB_SKILL_MASTER) + associative = TRUE + +//quite the reference, no? +/datum/skill/level/dwarfy + abstract_type = /datum/skill/level/dwarfy + standard_xp_lvl_up = DORF_XP_LVL_UP + xp_lvl_multiplier = DORF_XP_LVL_MULTI + max_levels = DORF_MAX_LVL + level_up_method = DWARFY_LEVEL_UP + levels = list("Novice", "Adequate", "Competent", "Skilled", + "Proficient", "Talented", "Adept", "Expert", + "Professional", "Accomplished", "Great", "Master", + "High Master", "Grand Master", "Legendary") + competency_thresholds = list(THRESHOLD_COMPETENT = DORF_SKILL_COMPETENT, THRESHOLD_EXPERT = DORF_SKILL_EXPERT, THRESHOLD_MASTER = DORF_SKILL_MASTER) + associative = TRUE + unskilled_tier = "Dabbling" diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm new file mode 100644 index 0000000000..0a5c4f8f58 --- /dev/null +++ b/code/datums/skills/_skill_holder.dm @@ -0,0 +1,200 @@ +/** + * Skill holder datums + * All procs are tied to the mind, since they are always expected to have a skill holder anyway. + */ +/datum/skill_holder + /// Our list of skills and values. Lazylist. Associative. Keys are datum typepaths to the skill. + var/list/skills + /// Same as [skills] but affinities, which are multiplied to increase amount when gaining skills. + var/list/skill_affinities + /// Let's say we want to get a specific skill "level" without looping through a proc everytime. + /// Only supported by skills with tiers or levels. + var/list/skill_levels + /// current skill modifiers lists, per value, affinity, level. + var/list/skill_value_mods + var/list/skill_affinity_mods + var/list/skill_level_mods + /// List of all current skill modifiers, so we don't add the same ones twice. + var/list/all_current_skill_modifiers + /// List of original values stored at the time a modifier with the MODIFIER_SKILL_ORIGIN_DIFF enabled was added. + var/list/original_values + var/list/original_affinities + var/list/original_levels + +/** + * Grabs the value of a skill. + */ +/datum/mind/proc/get_skill_value(skill, apply_modifiers = TRUE) + if(!ispath(skill)) + CRASH("Invalid get_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + if(!skill_holder.skills) + . = 0 + else + . = skill_holder.skills[skill] || 0 + if(apply_modifiers && skill_holder.skill_value_mods) + var/L = LAZYACCESS(skill_holder.skill_value_mods, skill) + for(var/k in L) + var/datum/skill_modifier/M = GLOB.skill_modifiers[k] + . = M.apply_modifier(., skill, skill_holder, MODIFIER_TARGET_VALUE) + +/** + * Grabs the level of a skill. Only supported by skills with tiers or levels. + */ +/datum/mind/proc/get_skill_level(skill, apply_modifiers = TRUE, round = FALSE) + if(!ispath(skill, /datum/skill)) + CRASH("Invalid get_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + if(!skill_holder.skill_levels) + . = 0 + else + . = skill_holder.skill_levels[skill] || 0 + if(apply_modifiers && skill_holder.skill_level_mods) + var/L = LAZYACCESS(skill_holder.skill_level_mods, skill) + for(var/k in L) + var/datum/skill_modifier/M = GLOB.skill_modifiers[k] + . = M.apply_modifier(., skill, skill_holder, MODIFIER_TARGET_LEVEL) + . = SANITIZE_SKILL_LEVEL(skill, round ? round(., 1) : .) + +/** + * Grabs our affinity for a skill. !!This is a multiplier!! + */ +/datum/mind/proc/get_skill_affinity(skill, apply_modifiers = TRUE) + . = 1 + if(!ispath(skill, /datum/skill)) + CRASH("Invalid get_skill_affinity call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + var/affinity = LAZYACCESS(skill_holder.skill_affinities, skill) + if(!isnull(affinity)) + . = affinity + if(apply_modifiers && skill_holder.skill_affinity_mods) + var/L = LAZYACCESS(skill_holder.skill_affinity_mods, skill) + for(var/k in L) + var/datum/skill_modifier/M = GLOB.skill_modifiers[k] + . = M.apply_modifier(., skill, skill_holder, MODIFIER_TARGET_AFFINITY) + + +/** + * Sets the value of a skill. + */ +/datum/mind/proc/set_skill_value(skill, value, silent = FALSE) + if(!ispath(skill, /datum/skill)) + CRASH("Invalid set_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + var/datum/skill/S = GLOB.skill_datums[skill] + value = S.sanitize_value(value) + if(!isnull(value)) + LAZYINITLIST(skill_holder.skills) + S.set_skill_value(skill_holder, value, src, silent) + return TRUE + return FALSE + +/** + * Boosts a skill to a value if not aobve + */ +/datum/mind/proc/boost_skill_value_to(skill, value, silent = FALSE, current) + current = current || get_skill_value(skill, FALSE) + if(!IS_SKILL_VALUE_GREATER(skill, current, value)) + return FALSE + set_skill_value(skill, value, silent) + return TRUE + +/** + * Automatic skill increase, multiplied by skill affinity if existing. + * Only works if skill is numerical. + */ +/datum/mind/proc/auto_gain_experience(skill, value, maximum, silent = FALSE) + if(!ispath(skill, /datum/skill)) + CRASH("Invalid set_skill_value call. Use skill typepaths.") + var/datum/skill/S = GLOB.skill_datums[skill] + if(S.progression_type != SKILL_PROGRESSION_NUMERICAL && S.progression_type != SKILL_PROGRESSION_LEVEL) + CRASH("You cannot auto increment a non numerical(experience skill!") + var/current = get_skill_value(skill, FALSE) + var/affinity = get_skill_affinity(skill) + var/target_value = current + (value * affinity) + if(maximum) + target_value = min(target_value, maximum) + if(target_value == maximum) //no more experience to gain, early return. + return + boost_skill_value_to(skill, target_value, silent, current) + +/** + * Generic value modifier proc that uses one skill. + * Args: + * * value : the value to modify, may be a delay, damage, probability. + * * threshold : The difficulty of the action, in short. Refer to __DEFINES/skills/defines.dm for the defines. + * * modifier_is_multiplier : wheter the modifier is a multiplier or a divisor. + */ +/datum/mind/proc/action_skill_mod(skill, value, threshold, modifier_is_multiplier = TRUE) + var/datum/skill/S = GLOB.skill_datums[skill] + if(!S) + return value + var/mod = S.base_multiplier + switch(S.progression_type) + if(SKILL_PROGRESSION_LEVEL) + var/datum/skill/level/L = S + var/skill_lvl = get_skill_level(L.type) + mod += skill_lvl/(L.max_levels+max(L.competency_thresholds[threshold]-skill_lvl, 0))*L.competency_multiplier + if(SKILL_PROGRESSION_NUMERICAL) + var/datum/skill/numerical/N = S + var/skill_val = get_skill_value(N.type) + mod += skill_val/(N.max_value+max(N.competency_thresholds[threshold]-skill_val, 0))*N.competency_multiplier + else + var/comp_threshold = S.competency_thresholds[threshold] + mod += (comp_threshold ? (get_skill_value(S.type) / comp_threshold) : get_skill_value(S.type))*S.competency_multiplier + . = modifier_is_multiplier ? value*mod : value/mod + +/** + * Generic value modifier proc that uses several skills, intended for items. + * Args: + * * item/I : the item used in this action. its used_skills list variable contains the skills exercised with it. + * * value : the value to modify, may be a delay, damage, probability. + * * traits : the required traits each skill (either in I.used_skills or the skill datum skill_traits) must have to influence + * * the value. + * * bad_traits : the opposite of the above. + * * modifier_is_multiplier : wheter the modifier is a multiplier or a divisor. + */ +/datum/mind/proc/item_action_skills_mod(obj/item/I, value, traits, bad_traits, modifier_is_multiplier = TRUE) + . = value + var/sum = 0 + var/divisor = 0 + var/one_trait = istext(traits) + var/one_bad_trait = istext(bad_traits) + for(var/k in I.used_skills) + var/datum/skill/S = GLOB.skill_datums[k] + if(!S) + continue + var/our_traits = S.skill_traits + our_traits |= I.used_skills[k] + if(traits && !(one_trait ? (traits in our_traits) : length(our_traits & traits))) + continue + if(bad_traits && (one_bad_trait ? (bad_traits in our_traits) : length(our_traits & bad_traits))) + continue + var/mod = S.base_multiplier + switch(S.progression_type) + if(SKILL_PROGRESSION_LEVEL) + var/datum/skill/level/L = S + var/skill_lvl = get_skill_level(L.type) + mod += skill_lvl/(L.max_levels+max(L.competency_thresholds[I.skill_difficulty]-skill_lvl, 0))*L.competency_multiplier + if(SKILL_PROGRESSION_NUMERICAL) + var/datum/skill/numerical/N = S + var/skill_val = get_skill_value(N.type) + mod += skill_val/(N.max_value+max(N.competency_thresholds[I.skill_difficulty]-skill_val, 0))*N.competency_multiplier + else + var/comp_threshold = S.competency_thresholds[I.skill_difficulty] + mod += (comp_threshold ? (get_skill_value(S.type) / comp_threshold) : get_skill_value(S.type))*S.competency_multiplier + sum += mod + divisor++ + if(divisor) + . = modifier_is_multiplier ? value*(sum/divisor) : value/(sum/divisor) + +/** + * Generates a HTML readout of our skills. + * Port to tgui-next when? + */ +/datum/mind/proc/skill_html_readout() + var/list/out = list("

    Skills


    ") + out += "" + for(var/path in GLOB.skill_datums) + var/datum/skill/S = GLOB.skill_datums[path] + var/skill_value = get_skill_value(path) + var/skill_level = get_skill_level(path, round = TRUE) + out += "" + out += "
    SkillValue
    [S.name][S.standard_render_value(skill_value, skill_level)]
    " + return out.Join("") diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm new file mode 100644 index 0000000000..a28cf3aebd --- /dev/null +++ b/code/datums/skills/_skill_modifier.dm @@ -0,0 +1,204 @@ +GLOBAL_LIST_EMPTY_TYPED(skill_modifiers, /datum/skill_modifier) +GLOBAL_LIST_EMPTY(potential_skills_per_mod) +GLOBAL_LIST_EMPTY(potential_mods_per_skill) + +/** + * Base skill modifier datum, used to modify a player skills without directly touching their values, levels and affinity + * and cause lots of edge cases. These are fairly simple overall... make a subtype though, don't use this one. + */ +/datum/skill_modifier + /// flags for this skill modifier. + var/modifier_flags = NONE + /// target skills, can be a specific skill typepath or a list of skill traits. + var/target_skills = /datum/skill + /// the GLOB.potential_skills_per_mod key generated on runtime. You shouldn't be var-editing it. + var/target_skills_key + /// The identifier key this skill modifier is associated with. + var/identifier + /// skill affinity modifier, can be a multiplier or addendum, depending on the modifier_flags. + var/affinity_mod = 1 + /// skill value modifier, see above. + var/value_mod = 1 + /// skill level modifier, see above. + var/level_mod = 1 + /// Priority of this skill modifier compared to other ones. + var/priority = MODIFIER_SKILL_PRIORITY_DEF + +/datum/skill_modifier/New(id, register = FALSE) + identifier = GET_SKILL_MOD_ID(type, id) + if(id) + var/former_id = identifier + var/dupe = 0 + while(GLOB.skill_modifiers[identifier]) + identifier = "[former_id][++dupe]" + + if(register) + register() + +/datum/skill_modifier/proc/register() + if(GLOB.skill_modifiers[identifier]) + CRASH("Skill modifier identifier \"[identifier]\" already taken.") + GLOB.skill_modifiers[identifier] = src + if(ispath(target_skills)) + target_skills_key = target_skills + var/list/mod_L = GLOB.potential_mods_per_skill[target_skills] + if(!mod_L) + mod_L = GLOB.potential_mods_per_skill[target_skills] = list() + else + BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE) + mod_L[identifier] = src + GLOB.potential_skills_per_mod[target_skills_key] = list(target_skills) + else //Should be a list. + var/list/T = target_skills + T = sortTim(target_skills, /proc/cmp_text_asc) //Sort the list contents alphabetically. + target_skills_key = T.Join("-") + var/list/L = GLOB.potential_skills_per_mod[target_skills_key] + if(!L) + L = list() + for(var/path in GLOB.skill_datums) + if(GLOB.skill_datums[path].skill_traits & target_skills) + L += path + GLOB.potential_skills_per_mod[target_skills_key] = L + for(var/path in L) + var/list/mod_L = GLOB.potential_mods_per_skill[path] + if(!mod_L) + mod_L = GLOB.potential_mods_per_skill[path] = list() + else + BINARY_INSERT(identifier, mod_L, datum/skill_modifier, src, priority, COMPARE_VALUE) + mod_L[identifier] = src + +/datum/skill_modifier/Destroy() + for(var/path in GLOB.potential_skills_per_mod[target_skills_key]) + var/mod_L = GLOB.potential_mods_per_skill[path] + mod_L -= identifier + if(!length(mod_L)) + GLOB.potential_mods_per_skill -= path + GLOB.skill_modifiers -= identifier + return ..() + +#define ADD_MOD_STEP(L, P, O, G) \ + var/__L = L[P];\ + if(!__L){\ + L[P] = list(id)\ + } else {\ + L[P] = GLOB.potential_mods_per_skill[P] & (__L + id)\ + }\ + if(M.modifier_flags & MODIFIER_SKILL_ORIGIN_DIFF){\ + LAZYADDASSOC(O, id, "[P]" = G)\ + } + +/datum/mind/proc/add_skill_modifier(id) + if(LAZYACCESS(skill_holder.all_current_skill_modifiers, id)) + return + var/datum/skill_modifier/M = GLOB.skill_modifiers[id] + if(!M) + CRASH("Invalid add_skill_modifier id: [id].") + if(M.modifier_flags & MODIFIER_SKILL_BODYBOUND && !current) + CRASH("Body-bound skill modifier [M] was tried to be added to a mob-less mind.") + + if(M.modifier_flags & MODIFIER_SKILL_VALUE) + LAZYINITLIST(skill_holder.skill_value_mods) + if(M.modifier_flags & MODIFIER_SKILL_AFFINITY) + LAZYINITLIST(skill_holder.skill_affinity_mods) + if(M.modifier_flags & MODIFIER_SKILL_LEVEL) + LAZYINITLIST(skill_holder.skill_level_mods) + for(var/path in GLOB.potential_skills_per_mod[M.target_skills_key]) + if(M.modifier_flags & MODIFIER_SKILL_VALUE) + ADD_MOD_STEP(skill_holder.skill_value_mods, path, skill_holder.original_values, get_skill_value(path, FALSE)) + if(M.modifier_flags & MODIFIER_SKILL_AFFINITY) + ADD_MOD_STEP(skill_holder.skill_affinity_mods, path, skill_holder.original_affinities, get_skill_affinity(path, FALSE)) + if(M.modifier_flags & MODIFIER_SKILL_LEVEL) + ADD_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels, get_skill_level(path, FALSE)) + LAZYSET(skill_holder.all_current_skill_modifiers, id, TRUE) + + if(M.modifier_flags & MODIFIER_SKILL_BODYBOUND) + M.RegisterSignal(src, COMSIG_MIND_TRANSFER, /datum/skill_modifier.proc/on_mind_transfer) + M.RegisterSignal(current, COMSIG_MOB_ON_NEW_MIND, /datum/skill_modifier.proc/on_mob_new_mind, TRUE) + RegisterSignal(M, COMSIG_PARENT_PREQDELETED, .proc/on_skill_modifier_deletion) + +#undef ADD_MOD_STEP + +#define REMOVE_MOD_STEP(L, P, O)\ + LAZYREMOVEASSOC(L, P, id);\ + if(M.modifier_flags & MODIFIER_SKILL_ORIGIN_DIFF){\ + LAZYREMOVEASSOC(O, id, "[P]")\ + } + +/datum/mind/proc/remove_skill_modifier(id, mind_transfer = FALSE) + if(!LAZYACCESS(skill_holder.all_current_skill_modifiers, id)) + return + var/datum/skill_modifier/M = GLOB.skill_modifiers[id] + if(!M) + CRASH("Invalid remove_skill_modifier id: [id].") + + if(!skill_holder.skill_value_mods && !skill_holder.skill_affinity_mods && !skill_holder.skill_level_mods) + return + for(var/path in GLOB.potential_skills_per_mod[M.target_skills_key]) + if(M.modifier_flags & MODIFIER_SKILL_VALUE && skill_holder.skill_value_mods) + REMOVE_MOD_STEP(skill_holder.skill_value_mods, path, skill_holder.original_values) + if(M.modifier_flags & MODIFIER_SKILL_AFFINITY && skill_holder.skill_affinity_mods) + REMOVE_MOD_STEP(skill_holder.skill_affinity_mods, path, skill_holder.original_affinities) + if(M.modifier_flags & MODIFIER_SKILL_LEVEL && skill_holder.skill_level_mods) + REMOVE_MOD_STEP(skill_holder.skill_level_mods, path, skill_holder.original_levels) + LAZYREMOVE(skill_holder.all_current_skill_modifiers, id) + + if(!mind_transfer && M.modifier_flags & MODIFIER_SKILL_BODYBOUND) + M.UnregisterSignal(src, COMSIG_MIND_TRANSFER) + M.UnregisterSignal(current, list(COMSIG_MOB_ON_NEW_MIND)) + UnregisterSignal(M, COMSIG_PARENT_PREQDELETED) + +#undef REMOVE_MOD_STEP + +/datum/mind/proc/on_skill_modifier_deletion(datum/skill_modifier/source) + remove_skill_modifier(source.identifier) + +/datum/skill_modifier/proc/apply_modifier(value, skillpath, datum/skill_holder/H, method = MODIFIER_TARGET_VALUE) + . = value + var/mod = value_mod + switch(method) + if(MODIFIER_TARGET_LEVEL) + mod = level_mod + if(MODIFIER_TARGET_AFFINITY) + mod = affinity_mod + + if(modifier_flags & MODIFIER_USE_THRESHOLDS && istext(mod)) + var/datum/skill/S = GLOB.skill_datums[skillpath] + if(method == MODIFIER_TARGET_VALUE && S.progression_type == SKILL_PROGRESSION_LEVEL) + var/datum/skill/level/L = S + switch(L.level_up_method) + if(STANDARD_LEVEL_UP) + mod = XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod]) + if(DWARFY_LEVEL_UP) + mod = DORF_XP_LEVEL(L.standard_xp_lvl_up, L.xp_lvl_multiplier, S.competency_thresholds[mod]) + else + mod = S.competency_thresholds[mod] + + var/diff = 0 + if(modifier_flags & (MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_HANDICAP)) + if(modifier_flags & MODIFIER_SKILL_VIRTUE) + . = max(., mod) + if(modifier_flags & MODIFIER_SKILL_HANDICAP) + . = min(., mod) + diff = . - mod + else if(modifier_flags & MODIFIER_SKILL_MULT) + . *= mod + else + . += mod + + if(modifier_flags & MODIFIER_SKILL_ORIGIN_DIFF) + var/list/to_access = H.original_values + switch(method) + if(MODIFIER_TARGET_LEVEL) + to_access = H.original_levels + if(MODIFIER_TARGET_AFFINITY) + to_access = H.original_affinities + . += value - diff - LAZYACCESS(to_access[identifier], "[skillpath]") + +///Body bound modifier signal procs. +/datum/skill_modifier/proc/on_mind_transfer(datum/mind/source, mob/new_character, mob/old_character) + source.remove_skill_modifier(identifier, TRUE) + UnregisterSignal(source, COMSIG_MIND_TRANSFER) + +/datum/skill_modifier/proc/on_mob_new_mind(mob/source) + source.mind.add_skill_modifier(identifier) + RegisterSignal(source.mind, COMSIG_MIND_TRANSFER, /datum/skill_modifier.proc/on_mind_transfer) diff --git a/code/datums/skills/engineering.dm b/code/datums/skills/engineering.dm new file mode 100644 index 0000000000..db7b33450c --- /dev/null +++ b/code/datums/skills/engineering.dm @@ -0,0 +1,5 @@ +/datum/skill/level/job/wiring + name = "Wiring" + desc = "How proficient and knowledged you are at wiring beyond laying cables on the floor." + name_color = COLOR_PALE_ORANGE + skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE, SKILL_USE_TOOL, SKILL_TRAINING_TOOL) diff --git a/code/datums/skills/medical.dm b/code/datums/skills/medical.dm new file mode 100644 index 0000000000..404c141157 --- /dev/null +++ b/code/datums/skills/medical.dm @@ -0,0 +1,5 @@ +/datum/skill/numerical/surgery + name = "Surgery" + desc = "How proficient you are at doing surgery." + name_color = COLOR_PALE_BLUE_GRAY + competency_multiplier = 1.5 // 60% surgery speed up at max value of 100, considering the base multiplier. diff --git a/code/datums/skills/modifiers/job.dm b/code/datums/skills/modifiers/job.dm new file mode 100644 index 0000000000..7d79ae89b3 --- /dev/null +++ b/code/datums/skills/modifiers/job.dm @@ -0,0 +1,35 @@ +/// Jobbie skill modifiers. + +/datum/skill_modifier/job + modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF + priority = MODIFIER_SKILL_PRIORITY_MAX + +/datum/skill_modifier/job/surgery + target_skills = /datum/skill/numerical/surgery + value_mod = STARTING_SKILL_SURGERY_MEDICAL + +/datum/skill_modifier/job/affinity + modifier_flags = MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_VIRTUE + affinity_mod = STARTING_SKILL_AFFINITY_DEF_JOB + +/datum/skill_modifier/job/affinity/surgery + target_skills = /datum/skill/numerical/surgery + +/datum/skill_modifier/job/affinity/wiring + target_skills = /datum/skill/level/job/wiring + +/// Level skill modifiers below. +/datum/skill_modifier/job/level + modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_ORIGIN_DIFF + level_mod = JOB_SKILL_TRAINED + +/datum/skill_modifier/job/level/New(id) + if(level_mod) + value_mod = GET_STANDARD_LVL(level_mod) + ..() + +/datum/skill_modifier/job/level/wiring + target_skills = /datum/skill/level/job/wiring + +/datum/skill_modifier/job/level/wiring/basic + level_mod = JOB_SKILL_BASIC diff --git a/code/datums/skills/modifiers/mood.dm b/code/datums/skills/modifiers/mood.dm new file mode 100644 index 0000000000..30f24afcc4 --- /dev/null +++ b/code/datums/skills/modifiers/mood.dm @@ -0,0 +1,8 @@ +/datum/skill_modifier/bad_mood + modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND + target_skills = list(SKILL_SANITY) + +/datum/skill_modifier/great_mood + modifier_flags = MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND + target_skills = list(SKILL_SANITY) + affinity_mod = 1.2 diff --git a/code/datums/skills/modifiers/organs.dm b/code/datums/skills/modifiers/organs.dm new file mode 100644 index 0000000000..13ebaf0658 --- /dev/null +++ b/code/datums/skills/modifiers/organs.dm @@ -0,0 +1,13 @@ +/datum/skill_modifier/brain_damage + target_skills = list(SKILL_INTELLIGENCE) + modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_MULT|MODIFIER_SKILL_BODYBOUND + value_mod = 0.85 + level_mod = 0.85 + affinity_mod = 0.85 + +/datum/skill_modifier/heavy_brain_damage + target_skills = list(SKILL_INTELLIGENCE) + modifier_flags = MODIFIER_SKILL_VALUE|MODIFIER_SKILL_AFFINITY|MODIFIER_SKILL_LEVEL|MODIFIER_SKILL_BODYBOUND|MODIFIER_SKILL_HANDICAP|MODIFIER_USE_THRESHOLDS + priority = MODIFIER_SKILL_PRIORITY_LOW + value_mod = THRESHOLD_COMPETENT + level_mod = THRESHOLD_COMPETENT diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 86afd2cc15..e080e597a3 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -550,3 +550,30 @@ else if(isanimal(L)) var/mob/living/simple_animal/SM = L SM.adjustHealth(-3.5, forced = TRUE) + +/obj/screen/alert/status_effect/regenerative_core + name = "Reinforcing Tendrils" + desc = "You can move faster than your broken body could normally handle!" + icon_state = "regenerative_core" + name = "Regenerative Core Tendrils" + +/datum/status_effect/regenerative_core + id = "Regenerative Core" + duration = 1 MINUTES + status_type = STATUS_EFFECT_REPLACE + alert_type = /obj/screen/alert/status_effect/regenerative_core + +/datum/status_effect/regenerative_core/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core") + owner.adjustBruteLoss(-25) + if(!AmBloodsucker(owner)) //use your coffin you lazy bastard + owner.adjustFireLoss(-25) + owner.remove_CC() + owner.bodytemperature = BODYTEMP_NORMAL + return TRUE + +/datum/status_effect/regenerative_core/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core") + owner.updatehealth() \ No newline at end of file diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 5a69ebe427..37f520cf7f 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -113,19 +113,26 @@ duration = set_duration . = ..() -/datum/status_effect/no_combat_mode/mesmerize +/datum/status_effect/mesmerize id = "Mesmerize" alert_type = /obj/screen/alert/status_effect/mesmerized -/datum/status_effect/no_combat_mode/mesmerize/on_creation(mob/living/new_owner, set_duration) +/datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration) . = ..() ADD_TRAIT(owner, TRAIT_MUTE, "mesmerize") - owner.add_movespeed_modifier("[STATUS_EFFECT_MESMERIZE]_[id]", TRUE, priority = 64, override = TRUE, multiplicative_slowdown = 5, blacklisted_movetypes = FALSE? NONE : CRAWLING) + ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, "mesmerize") + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize) -/datum/status_effect/no_combat_mode/mesmerize/on_remove() +/datum/status_effect/mesmerize/on_remove() . = ..() REMOVE_TRAIT(owner, TRAIT_MUTE, "mesmerize") - owner.remove_movespeed_modifier("[STATUS_EFFECT_MESMERIZE]_[id]") + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, "mesmerize") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize) + +/datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + . = ..() /obj/screen/alert/status_effect/mesmerized name = "Mesmerized" @@ -136,9 +143,7 @@ /datum/status_effect/electrode id = "tased" alert_type = null - var/slowdown = 1.5 - var/slowdown_priority = 50 //to make sure the stronger effect overrides - var/affect_crawl = FALSE + var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased var/nextmove_modifier = 1 var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it. @@ -150,12 +155,12 @@ last_tick = world.time if(iscarbon(owner)) var/mob/living/carbon/C = owner - C.add_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]", TRUE, priority = slowdown_priority, override = TRUE, multiplicative_slowdown = slowdown, blacklisted_movetypes = affect_crawl? NONE : CRAWLING) + C.add_movespeed_modifier(movespeed_mod) /datum/status_effect/electrode/on_remove() if(iscarbon(owner)) var/mob/living/carbon/C = owner - C.remove_movespeed_modifier("[MOVESPEED_ID_TASED_STATUS]_[id]") + C.remove_movespeed_modifier(movespeed_mod) . = ..() /datum/status_effect/electrode/tick() @@ -173,8 +178,7 @@ /datum/status_effect/electrode/no_combat_mode id = "tased_strong" - slowdown = 8 - slowdown_priority = 100 + movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode nextmove_modifier = 2 blocks_combatmode = TRUE stamdmg_per_ds = 1 @@ -331,7 +335,7 @@ if(prob(severity * 0.15)) to_chat(owner, "\"[text2ratvar(pick(mania_messages))]\"") owner.playsound_local(get_turf(motor), hum, severity, 1) - owner.adjust_drugginess(CLAMP(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1 + owner.adjust_drugginess(clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1 if(owner.hallucination < 50) owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1 if(owner.dizziness < 50) @@ -389,78 +393,34 @@ owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. ..() -/datum/status_effect/saw_bleed +/datum/status_effect/stacking/saw_bleed id = "saw_bleed" - duration = -1 //removed under specific conditions tick_interval = 6 - alert_type = null - var/mutable_appearance/bleed_overlay - var/mutable_appearance/bleed_underlay - var/bleed_amount = 3 - var/bleed_buildup = 3 - var/delay_before_decay = 5 + delay_before_decay = 5 + stack_threshold = 10 + max_stacks = 10 + overlay_file = 'icons/effects/bleed.dmi' + underlay_file = 'icons/effects/bleed.dmi' + overlay_state = "bleed" + underlay_state = "bleed" var/bleed_damage = 200 - var/needs_to_bleed = FALSE -/datum/status_effect/saw_bleed/Destroy() - if(owner) - owner.cut_overlay(bleed_overlay) - owner.underlays -= bleed_underlay - QDEL_NULL(bleed_overlay) - return ..() +/datum/status_effect/stacking/saw_bleed/fadeout_effect() + new /obj/effect/temp_visual/bleed(get_turf(owner)) -/datum/status_effect/saw_bleed/on_apply() - if(owner.stat == DEAD) - return FALSE - bleed_overlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]") - bleed_underlay = mutable_appearance('icons/effects/bleed.dmi', "bleed[bleed_amount]") - var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) - var/icon_height = I.Height() - bleed_overlay.pixel_x = -owner.pixel_x - bleed_overlay.pixel_y = FLOOR(icon_height * 0.25, 1) - bleed_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the bleed overlay's size based on the target's icon size - bleed_underlay.pixel_x = -owner.pixel_x - bleed_underlay.transform = matrix() * (icon_height/world.icon_size) * 3 - bleed_underlay.alpha = 40 - owner.add_overlay(bleed_overlay) - owner.underlays += bleed_underlay - return ..() +/datum/status_effect/stacking/saw_bleed/threshold_cross_effect() + owner.adjustBruteLoss(bleed_damage) + var/turf/T = get_turf(owner) + new /obj/effect/temp_visual/bleed/explode(T) + for(var/d in GLOB.alldirs) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d) + playsound(T, "desceration", 100, TRUE, -1) -/datum/status_effect/saw_bleed/tick() - if(owner.stat == DEAD) - qdel(src) - else - add_bleed(-1) - -/datum/status_effect/saw_bleed/proc/add_bleed(amount) - owner.cut_overlay(bleed_overlay) - owner.underlays -= bleed_underlay - bleed_amount += amount - if(bleed_amount) - if(bleed_amount >= 10) - needs_to_bleed = TRUE - qdel(src) - else - if(amount > 0) - tick_interval += delay_before_decay - bleed_overlay.icon_state = "bleed[bleed_amount]" - bleed_underlay.icon_state = "bleed[bleed_amount]" - owner.add_overlay(bleed_overlay) - owner.underlays += bleed_underlay - else - qdel(src) - -/datum/status_effect/saw_bleed/on_remove() - . = ..() - if(needs_to_bleed) - var/turf/T = get_turf(owner) - new /obj/effect/temp_visual/bleed/explode(T) - for(var/d in GLOB.alldirs) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d) - playsound(T, "desceration", 200, 1, -1) - owner.adjustBruteLoss(bleed_damage) - else - new /obj/effect/temp_visual/bleed(get_turf(owner)) +/datum/status_effect/stacking/saw_bleed/bloodletting + id = "bloodletting" + stack_threshold = 7 + max_stacks = 7 + bleed_damage = 20 /datum/status_effect/neck_slice id = "neck_slice" @@ -589,7 +549,7 @@ old_health = owner.health if(!old_oxyloss) old_oxyloss = owner.getOxyLoss() - var/health_difference = old_health - owner.health - CLAMP(owner.getOxyLoss() - old_oxyloss,0, owner.getOxyLoss()) + var/health_difference = old_health - owner.health - clamp(owner.getOxyLoss() - old_oxyloss,0, owner.getOxyLoss()) if(!health_difference) return owner.visible_message("The light in [owner]'s eyes dims as [owner.p_theyre()] harmed!", \ @@ -645,11 +605,11 @@ if(isnum(set_duration)) duration = set_duration . = ..() - owner.add_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF, multiplicative_slowdown = 1, movetypes = GROUND) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/electrostaff) /datum/status_effect/electrostaff/on_remove() . = ..() - owner.remove_movespeed_modifier(MOVESPEED_ID_ELECTROSTAFF) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/electrostaff) //GOLEM GANG @@ -835,3 +795,44 @@ datum/status_effect/pacify name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." icon_state = "dna_melt" + +/datum/status_effect/fake_virus + id = "fake_virus" + duration = 1800//3 minutes + status_type = STATUS_EFFECT_REPLACE + tick_interval = 1 + alert_type = null + var/msg_stage = 0//so you dont get the most intense messages immediately + +/datum/status_effect/fake_virus/tick() + var/fake_msg = "" + var/fake_emote = "" + switch(msg_stage) + if(0 to 300) + if(prob(1)) + fake_msg = pick("[pick("Your head hurts.", "Your head pounds.")]", + "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]", + "[pick("You feel dizzy.", "Your head spins.")]", + "[pick("You swallow excess mucus.", "You lightly cough.")]", + "[pick("Your head hurts.", "Your mind blanks for a moment.")]", + "[pick("Your throat hurts.", "You clear your throat.")]") + if(301 to 600) + if(prob(2)) + fake_msg = pick("[pick("Your head hurts a lot.", "Your head pounds incessantly.")]", + "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]", + "You feel very [pick("dizzy","woozy","faint")].", + "[pick("You hear a ringing in your ear.", "Your ears pop.")]", + "You nod off for a moment.") + else + if(prob(3)) + if(prob(50))// coin flip to throw a message or an emote + fake_msg = pick("[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]", + "[pick("Your lungs hurt!", "It hurts to breathe!")]", + "[pick("You feel nauseated.", "You feel like you're going to throw up!")]") + else + fake_emote = pick("cough", "sniff", "sneeze") + if(fake_emote) + owner.emote(fake_emote) + else if(fake_msg) + to_chat(owner, fake_msg) + msg_stage++ diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index e2114f0778..33c8384d72 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -7,7 +7,6 @@ var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means. var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second. var/mob/living/owner //The mob affected by the status effect. - var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description @@ -16,6 +15,8 @@ /// If this is TRUE, the user will have sprint forcefully disabled while this is active. var/blocks_sprint = FALSE var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists + /// How many of the effect can be on one mob, and what happens when you try to add another + var/status_type = STATUS_EFFECT_UNIQUE /datum/status_effect/New(list/arguments) on_creation(arglist(arguments)) @@ -67,6 +68,9 @@ /datum/status_effect/proc/tick() //Called every tick. +/datum/status_effect/proc/before_remove() //! Called before being removed; returning FALSE will cancel removal + return TRUE + /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null SHOULD_CALL_PARENT(TRUE) REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) @@ -123,12 +127,13 @@ S1 = new effect(arguments) . = S1 -/mob/living/proc/remove_status_effect(effect) //removes all of a given status effect from this mob, returning TRUE if at least one was removed +/mob/living/proc/remove_status_effect(effect, ...) //removes all of a given status effect from this mob, returning TRUE if at least one was removed . = FALSE + var/list/arguments = args.Copy(2) if(status_effects) var/datum/status_effect/S1 = effect for(var/datum/status_effect/S in status_effects) - if(initial(S1.id) == S.id) + if(initial(S1.id) == S.id && S.before_remove(arguments)) qdel(S) . = TRUE @@ -147,3 +152,129 @@ for(var/datum/status_effect/S in status_effects) if(initial(S1.id) == S.id) . += S + +////////////////////// +// STACKING EFFECTS // +////////////////////// + +/datum/status_effect/stacking + id = "stacking_base" + duration = -1 //removed under specific conditions + alert_type = null + var/stacks = 0 //how many stacks are accumulated, also is # of stacks that target will have when first applied + var/delay_before_decay //deciseconds until ticks start occuring, which removes stacks (first stack will be removed at this time plus tick_interval) + tick_interval = 10 //deciseconds between decays once decay starts + var/stack_decay = 1 //how many stacks are lost per tick (decay trigger) + var/stack_threshold //special effects trigger when stacks reach this amount + var/max_stacks //stacks cannot exceed this amount + var/consumed_on_threshold = TRUE //if status should be removed once threshold is crossed + var/threshold_crossed = FALSE //set to true once the threshold is crossed, false once it falls back below + var/overlay_file + var/underlay_file + var/overlay_state // states in .dmi must be given a name followed by a number which corresponds to a number of stacks. put the state name without the number in these state vars + var/underlay_state // the number is concatonated onto the string based on the number of stacks to get the correct state name + var/mutable_appearance/status_overlay + var/mutable_appearance/status_underlay + +/datum/status_effect/stacking/proc/threshold_cross_effect() //what happens when threshold is crossed + +/datum/status_effect/stacking/proc/stacks_consumed_effect() //runs if status is deleted due to threshold being crossed + +/datum/status_effect/stacking/proc/fadeout_effect() //runs if status is deleted due to being under one stack + +/datum/status_effect/stacking/proc/stack_decay_effect() //runs every time tick() causes stacks to decay + +/datum/status_effect/stacking/proc/on_threshold_cross() + threshold_cross_effect() + if(consumed_on_threshold) + stacks_consumed_effect() + qdel(src) + +/datum/status_effect/stacking/proc/on_threshold_drop() + +/datum/status_effect/stacking/proc/can_have_status() + return owner.stat != DEAD + +/datum/status_effect/stacking/proc/can_gain_stacks() + return owner.stat != DEAD + +/datum/status_effect/stacking/tick() + if(!can_have_status()) + qdel(src) + else + add_stacks(-stack_decay) + stack_decay_effect() + +/datum/status_effect/stacking/proc/add_stacks(stacks_added) + if(stacks_added > 0 && !can_gain_stacks()) + return FALSE + owner.cut_overlay(status_overlay) + owner.underlays -= status_underlay + stacks += stacks_added + if(stacks > 0) + if(stacks >= stack_threshold && !threshold_crossed) //threshold_crossed check prevents threshold effect from occuring if changing from above threshold to still above threshold + threshold_crossed = TRUE + on_threshold_cross() + if(consumed_on_threshold) + return + else if(stacks < stack_threshold && threshold_crossed) + threshold_crossed = FALSE //resets threshold effect if we fall below threshold so threshold effect can trigger again + on_threshold_drop() + if(stacks_added > 0) + tick_interval += delay_before_decay //refreshes time until decay + stacks = min(stacks, max_stacks) + status_overlay.icon_state = "[overlay_state][stacks]" + status_underlay.icon_state = "[underlay_state][stacks]" + owner.add_overlay(status_overlay) + owner.underlays += status_underlay + else + fadeout_effect() + qdel(src) //deletes status if stacks fall under one + +/datum/status_effect/stacking/on_creation(mob/living/new_owner, stacks_to_apply) + . = ..() + if(.) + add_stacks(stacks_to_apply) + +/datum/status_effect/stacking/on_apply() + if(!can_have_status()) + return FALSE + status_overlay = mutable_appearance(overlay_file, "[overlay_state][stacks]") + status_underlay = mutable_appearance(underlay_file, "[underlay_state][stacks]") + var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) + var/icon_height = I.Height() + status_overlay.pixel_x = -owner.pixel_x + status_overlay.pixel_y = FLOOR(icon_height * 0.25, 1) + status_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the status's overlay size based on the target's icon size + status_underlay.pixel_x = -owner.pixel_x + status_underlay.transform = matrix() * (icon_height/world.icon_size) * 3 + status_underlay.alpha = 40 + owner.add_overlay(status_overlay) + owner.underlays += status_underlay + return ..() + +/datum/status_effect/stacking/Destroy() + if(owner) + owner.cut_overlay(status_overlay) + owner.underlays -= status_underlay + QDEL_NULL(status_overlay) + return ..() + +/// Status effect from multiple sources, when all sources are removed, so is the effect +/datum/status_effect/grouped + status_type = STATUS_EFFECT_MULTIPLE //! Adds itself to sources and destroys itself if one exists already, there are never multiple + var/list/sources = list() + +/datum/status_effect/grouped/on_creation(mob/living/new_owner, source) + var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) + if(existing) + existing.sources |= source + qdel(src) + return FALSE + else + sources |= source + return ..() + +/datum/status_effect/grouped/before_remove(source) + sources -= source + return !length(sources) diff --git a/code/datums/tgs_event_handler.dm b/code/datums/tgs_event_handler.dm new file mode 100644 index 0000000000..731be64183 --- /dev/null +++ b/code/datums/tgs_event_handler.dm @@ -0,0 +1,39 @@ +/datum/tgs_event_handler/impl + var/datum/timedevent/reattach_timer + +/datum/tgs_event_handler/impl/HandleEvent(event_code, ...) + switch(event_code) + if(TGS_EVENT_REBOOT_MODE_CHANGE) + var/list/reboot_mode_lookup = list ("[TGS_REBOOT_MODE_NORMAL]" = "be normal", "[TGS_REBOOT_MODE_SHUTDOWN]" = "shutdown the server", "[TGS_REBOOT_MODE_RESTART]" = "hard restart the server") + var old_reboot_mode = args[2] + var new_reboot_mode = args[3] + message_admins("TGS: Reboot will no longer [reboot_mode_lookup["[old_reboot_mode]"]], it will instead [reboot_mode_lookup["[new_reboot_mode]"]]") + if(TGS_EVENT_PORT_SWAP) + message_admins("TGS: Changing port from [world.port] to [args[2]]") + if(TGS_EVENT_INSTANCE_RENAMED) + message_admins("TGS: Instance renamed to from [world.TgsInstanceName()] to [args[2]]") + if(TGS_EVENT_COMPILE_START) + message_admins("TGS: Deployment started, new game version incoming...") + if(TGS_EVENT_COMPILE_CANCELLED) + message_admins("TGS: Deployment cancelled!") + if(TGS_EVENT_COMPILE_FAILURE) + message_admins("TGS: Deployment failed!") + if(TGS_EVENT_DEPLOYMENT_COMPLETE) + message_admins("TGS: Deployment complete!") + to_chat(world, "Server updated, changes will be applied on the next round...") + if(TGS_EVENT_WATCHDOG_DETACH) + message_admins("TGS restarting...") + reattach_timer = addtimer(CALLBACK(src, .proc/LateOnReattach), 1 MINUTES) + if(TGS_EVENT_WATCHDOG_REATTACH) + var/datum/tgs_version/old_version = world.TgsVersion() + var/datum/tgs_version/new_version = args[2] + if(!old_version.Equals(new_version)) + to_chat(world, "TGS updated to v[old_version.deprefixed_parameter]") + else + message_admins("TGS: Back online") + if(reattach_timer) + deltimer(reattach_timer) + reattach_timer = null + +/datum/tgs_event_handler/impl/proc/LateOnReattach() + message_admins("Warning: TGS hasn't notified us of it coming back for a full minute! Is there a problem?") diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index d1b5240798..4b039aa1b5 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -10,6 +10,15 @@ lose_text = "You can taste again!" medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." +/datum/quirk/snob + name = "Snob" + desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?" + value = 0 + gain_text = "You feel like you understand what things should look like." + lose_text = "Well who cares about deco anyways?" + medical_record_text = "Patient seems to be rather stuck up." + mob_trait = TRAIT_SNOB + /datum/quirk/pineapple_liker name = "Ananas Affinity" desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!" diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 6761ecbb4c..98a25053e1 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -1,49 +1,96 @@ -//The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures. +/** + * Causes weather to occur on a z level in certain area types + * + * The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures. + * Weather always occurs on different z levels at different times, regardless of weather type. + * Can have custom durations, targets, and can automatically protect indoor areas. + * + */ /datum/weather + /// name of weather var/name = "space wind" + /// description of weather var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open." - var/telegraph_message = "The wind begins to pick up." //The message displayed in chat to foreshadow the weather's beginning - var/telegraph_duration = 300 //In deciseconds, how long from the beginning of the telegraph until the weather begins - var/telegraph_sound //The sound file played to everyone on an affected z-level - var/telegraph_overlay //The overlay applied to all tiles on the z-level + /// The message displayed in chat to foreshadow the weather's beginning + var/telegraph_message = "The wind begins to pick up." - var/weather_message = "The wind begins to blow ferociously!" //Displayed in chat once the weather begins in earnest - var/weather_duration = 1200 //In deciseconds, how long the weather lasts once it begins - var/weather_duration_lower = 1200 //See above - this is the lowest possible duration - var/weather_duration_upper = 1500 //See above - this is the highest possible duration + /// In deciseconds, how long from the beginning of the telegraph until the weather begins + var/telegraph_duration = 300 + /// The sound file played to everyone on an affected z-level + var/telegraph_sound + /// The overlay applied to all tiles on the z-level + var/telegraph_overlay + /// Displayed in chat once the weather begins in earnest + var/weather_message = "The wind begins to blow ferociously!" + ///In deciseconds, how long the weather lasts once it begins + var/weather_duration = 1200 + ///See above - this is the lowest possible duration + var/weather_duration_lower = 1200 + ///See above - this is the highest possible duration + var/weather_duration_upper = 1500 + /// Looping sound while weather is occuring var/weather_sound + /// Area overlay while the weather is occuring var/weather_overlay + /// Color to apply to the area while weather is occuring var/weather_color = null - var/end_message = "The wind relents its assault." //Displayed once the weather is over - var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely + /// Displayed once the weather is over + var/end_message = "The wind relents its assault." + /// In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely + var/end_duration = 300 + /// Sound that plays while weather is ending var/end_sound + /// Area overlay while weather is ending var/end_overlay - var/area_type = /area/space //Types of area to affect - var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins - var/list/protected_areas = list()//Areas that are protected and excluded from the affected areas. - var/impacted_z_levels // The list of z-levels that this weather is actively affecting + /// Types of area to affect + var/area_type = /area/space + /// TRUE value protects areas with outdoors marked as false, regardless of area type + var/protect_indoors = FALSE + /// Areas to be affected by the weather, calculated when the weather begins + var/list/impacted_areas = list() - var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. - var/aesthetic = FALSE //If the weather has no purpose other than looks - var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather + /// Areas that are protected and excluded from the affected areas. + var/list/protected_areas = list() + /// The list of z-levels that this weather is actively affecting + var/impacted_z_levels - var/stage = END_STAGE //The stage of the weather, from 1-4 + /// Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. + var/overlay_layer = AREA_LAYER + /// Plane for the overlay + var/overlay_plane = BLACKNESS_PLANE + /// If the weather has no purpose but aesthetics. + var/aesthetic = FALSE + /// Used by mobs to prevent them from being affected by the weather + var/immunity_type = "storm" - // These are read by the weather subsystem and used to determine when and where to run the weather. - var/probability = 0 // Weight amongst other eligible weather. If zero, will never happen randomly. - var/target_trait = ZTRAIT_STATION // The z-level trait to affect when run randomly or when not overridden. + /// The stage of the weather, from 1-4 + var/stage = END_STAGE + /// Weight amongst other eligible weather. if zero, will never happen randomly. + var/probability = 0 + /// The z-level trait to affect when run randomly or when not overridden. + var/target_trait = ZTRAIT_STATION + + /// Whether a barometer can predict when the weather will happen var/barometer_predictable = FALSE - var/next_hit_time = 0 //For barometers to know when the next storm will hit + /// For barometers to know when the next storm will hit + var/next_hit_time = 0 /datum/weather/New(z_levels) ..() impacted_z_levels = z_levels +/** + * Telegraphs the beginning of the weather on the impacted z levels + * + * Sends sounds and details to mobs in the area + * Calculates duration and hit areas, and makes a callback for the actual weather to start + * + */ /datum/weather/proc/telegraph() if(stage == STARTUP_STAGE) return @@ -58,6 +105,8 @@ affectareas -= get_areas(V) for(var/V in affectareas) var/area/A = V + if(protect_indoors && !A.outdoors) + continue if(A.z in impacted_z_levels) impacted_areas |= A weather_duration = rand(weather_duration_lower, weather_duration_upper) @@ -72,6 +121,13 @@ SEND_SOUND(M, sound(telegraph_sound)) addtimer(CALLBACK(src, .proc/start), telegraph_duration) +/** + * Starts the actual weather and effects from it + * + * Updates area overlays and sends sounds and messages to mobs to notify them + * Begins dealing effects from weather to mobs in the area + * + */ /datum/weather/proc/start() if(stage >= MAIN_STAGE) return @@ -86,6 +142,13 @@ SEND_SOUND(M, sound(weather_sound)) addtimer(CALLBACK(src, .proc/wind_down), weather_duration) +/** + * Weather enters the winding down phase, stops effects + * + * Updates areas to be in the winding down phase + * Sends sounds and messages to mobs to notify them + * + */ /datum/weather/proc/wind_down() if(stage >= WIND_DOWN_STAGE) return @@ -100,6 +163,13 @@ SEND_SOUND(M, sound(end_sound)) addtimer(CALLBACK(src, .proc/end), end_duration) +/** + * Fully ends the weather + * + * Effects no longer occur and area overlays are removed + * Removes weather from processing completely + * + */ /datum/weather/proc/end() if(stage == END_STAGE) return 1 @@ -115,7 +185,11 @@ if(can_weather_act(L)) weather_act(L) -/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob? +/** + * Returns TRUE if the living mob can be affected by the weather + * + */ +/datum/weather/proc/can_weather_act(mob/living/L) var/turf/mob_turf = get_turf(L) if(mob_turf && !(mob_turf.z in impacted_z_levels)) return @@ -123,11 +197,19 @@ return if(!(get_area(L) in impacted_areas)) return - return 1 + return TRUE -/datum/weather/proc/weather_act(mob/living/L) //What effect does this weather have on the hapless mob? +/** + * Affects the mob with whatever the weather does + * + */ +/datum/weather/proc/weather_act(mob/living/L) return +/** + * Updates the overlays on impacted areas + * + */ /datum/weather/proc/update_areas() for(var/V in impacted_areas) var/area/N = V diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm index 93e5c2556e..a1ec4871d5 100644 --- a/code/datums/weather/weather_types/acid_rain.dm +++ b/code/datums/weather/weather_types/acid_rain.dm @@ -17,8 +17,9 @@ end_message = "The downpour gradually slows to a light shower. It should be safe outside now." end_sound = 'sound/ambience/acidrain_end.ogg' - area_type = /area/lavaland/surface/outdoors - target_trait = ZTRAIT_MINING + area_type = /area + protect_indoors = TRUE + target_trait = ZTRAIT_ACIDRAIN immunity_type = "acid" // temp diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index b44778054e..43190ef50c 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -16,8 +16,9 @@ end_duration = 300 end_overlay = "light_ash" - area_type = /area/lavaland/surface/outdoors - target_trait = ZTRAIT_MINING + area_type = /area + protect_indoors = TRUE + target_trait = ZTRAIT_ASHSTORM immunity_type = "ash" diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 43b2ba9744..4638508d1c 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -18,7 +18,7 @@ area_type = /area protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, - /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/security/prison, /area/ruin, /area/space/nearstation) + /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/security/prison, /area/ruin, /area/space/nearstation, /area/icemoon) target_trait = ZTRAIT_STATION immunity_type = "rad" diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index db29f49098..8ab4839cdb 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -15,8 +15,9 @@ end_duration = 100 end_message = "The snowfall dies down, it should be safe to go outside again." - area_type = /area/awaymission/snowdin/outside - target_trait = ZTRAIT_AWAY + area_type = /area + protect_indoors = TRUE + target_trait = ZTRAIT_SNOWSTORM immunity_type = "snow" diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index d4a5dcdeb3..11e7e12bd8 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -11,9 +11,6 @@ if(A.attachable) return TRUE -/atom - var/datum/wires/wires = null - /atom/proc/attempt_wire_interaction(mob/user) if(!wires) return WIRE_INTERACTION_FAIL @@ -33,12 +30,14 @@ var/list/assemblies = list() // List of attached assemblies. var/randomize = 0 // If every instance of these wires should be random. // Prevents wires from showing up in station blueprints + var/req_knowledge = INFINITY //wiring skill level on which the functions are revealed. + var/req_skill = JOB_SKILL_BASIC //used in user's cutting/pulsing/mending speed calculations. + var/list/current_users //list of untrained people currently interacting with this set of wires. /datum/wires/New(atom/holder) ..() if(!istype(holder, holder_type)) CRASH("Wire holder is not of the expected type!") - return src.holder = holder if(randomize) @@ -131,8 +130,22 @@ cut_wires += wire on_cut(wire, mend = FALSE) -/datum/wires/proc/cut_color(color) +/datum/wires/proc/cut_color(color, mob/living/user) + LAZYINITLIST(current_users) + if(current_users[user]) + return FALSE + if(req_skill && user?.mind) + var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring, round = TRUE) + if(level_diff > 0) + LAZYSET(current_users, user, TRUE) + to_chat(user, "You begin cutting [holder]'s [color] wire...") + if(!do_after(user, 0.75 SECONDS * level_diff, target = holder) || !interactable(user)) + LAZYREMOVE(current_users, user) + return FALSE + LAZYREMOVE(current_users, user) + to_chat(user, "You cut [holder]'s [color] wire.") cut(get_wire(color)) + return TRUE /datum/wires/proc/cut_random() cut(wires[rand(1, wires.len)]) @@ -147,7 +160,21 @@ on_pulse(wire, user) /datum/wires/proc/pulse_color(color, mob/living/user) + LAZYINITLIST(current_users) + if(current_users[user]) + return FALSE + if(req_skill && user?.mind) + var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring, round = TRUE) + if(level_diff > 0) + LAZYSET(current_users, user, TRUE) + to_chat(user, "You begin pulsing [holder]'s [color] wire...") + if(!do_after(user, 1.5 SECONDS * level_diff, target = holder) || !interactable(user)) + LAZYREMOVE(current_users, user) + return FALSE + LAZYREMOVE(current_users, user) + to_chat(user, "You pulse [holder]'s [color] wire.") pulse(get_wire(color), user) + return TRUE /datum/wires/proc/pulse_assembly(obj/item/assembly/S) for(var/color in assemblies) @@ -225,7 +252,7 @@ var/reveal_wires = FALSE // Admin ghost can see a purpose of each wire. - if(IsAdminGhost(user)) + if(IsAdminGhost(user) || user.mind.get_skill_level(/datum/skill/level/job/wiring) >= req_knowledge) reveal_wires = TRUE // Same for anyone with an abductor multitool. @@ -260,18 +287,16 @@ if("cut") I = L.is_holding_tool_quality(TOOL_WIRECUTTER) if(I || IsAdminGhost(usr)) - if(I && holder) + if(cut_color(target_wire, L) && I && holder) I.play_tool_sound(holder, 20) - cut_color(target_wire) . = TRUE else to_chat(L, "You need wirecutters!") if("pulse") I = L.is_holding_tool_quality(TOOL_MULTITOOL) if(I || IsAdminGhost(usr)) - if(I && holder) + if(pulse_color(target_wire, L) && I && holder) I.play_tool_sound(holder, 20) - pulse_color(target_wire, L) . = TRUE else to_chat(L, "You need a multitool!") diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index 0c4715e27e..dae92d3c42 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -1,6 +1,7 @@ /datum/wires/airalarm holder_type = /obj/machinery/airalarm proper_name = "Air Alarm" + req_knowledge = JOB_SKILL_MASTER /datum/wires/airalarm/New(atom/holder) wires = list( diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index b6699540c3..2b13344cc6 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -1,6 +1,7 @@ /datum/wires/airlock holder_type = /obj/machinery/door/airlock proper_name = "Generic Airlock" + req_skill = JOB_SKILL_UNTRAINED //Training wheel, as per request. var/wiretype /datum/wires/airlock/secure @@ -52,10 +53,11 @@ /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder + if(!A.panel_open) + return FALSE if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100)) return FALSE - if(A.panel_open) - return TRUE + return TRUE /datum/wires/airlock/get_status() var/obj/machinery/door/airlock/A = holder diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index dc126f612e..19b2b8dda8 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -1,6 +1,7 @@ /datum/wires/apc holder_type = /obj/machinery/power/apc proper_name = "APC" + req_knowledge = JOB_SKILL_MASTER /datum/wires/apc/New(atom/holder) wires = list( @@ -29,6 +30,7 @@ if(WIRE_POWER1, WIRE_POWER2) // Short for a long while. if(!A.shorted) A.shorted = TRUE + A.update() addtimer(CALLBACK(A, /obj/machinery/power/apc.proc/reset, wire), 1200) if(WIRE_IDSCAN) // Unlock for a little while. A.locked = FALSE @@ -48,6 +50,7 @@ else A.shorted = TRUE A.shock(usr, 50) + A.update() if(WIRE_AI) // Disable AI control. if(mend) A.aidisabled = FALSE diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index f83bab5910..01e87228d4 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -1,6 +1,7 @@ /datum/wires/autolathe holder_type = /obj/machinery/autolathe proper_name = "Autolathe" + req_knowledge = JOB_SKILL_EXPERT /datum/wires/autolathe/New(atom/holder) wires = list( diff --git a/code/datums/wires/autoylathe.dm b/code/datums/wires/autoylathe.dm deleted file mode 100644 index 736c9551ec..0000000000 --- a/code/datums/wires/autoylathe.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/wires/autoylathe - holder_type = /obj/machinery/autoylathe - proper_name = "Autoylathe" - -/datum/wires/autoylathe/New(atom/holder) - wires = list( - WIRE_HACK, WIRE_DISABLE, - WIRE_SHOCK, WIRE_ZAP - ) - add_duds(6) - ..() - -/datum/wires/autoylathe/interactable(mob/user) - var/obj/machinery/autoylathe/A = holder - if(A.panel_open) - return TRUE - -/datum/wires/autoylathe/get_status() - var/obj/machinery/autoylathe/A = holder - var/list/status = list() - status += "The red light is [A.disabled ? "on" : "off"]." - status += "The blue light is [A.hacked ? "on" : "off"]." - return status - -/datum/wires/autoylathe/on_pulse(wire) - var/obj/machinery/autoylathe/A = holder - switch(wire) - if(WIRE_HACK) - A.adjust_hacked(!A.hacked) - addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60) - if(WIRE_SHOCK) - A.shocked = !A.shocked - addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60) - if(WIRE_DISABLE) - A.disabled = !A.disabled - addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60) - -/datum/wires/autoylathe/on_cut(wire, mend) - var/obj/machinery/autoylathe/A = holder - switch(wire) - if(WIRE_HACK) - A.adjust_hacked(!mend) - if(WIRE_HACK) - A.shocked = !mend - if(WIRE_DISABLE) - A.disabled = !mend - if(WIRE_ZAP) - A.shock(usr, 50) diff --git a/code/datums/wires/emitter.dm b/code/datums/wires/emitter.dm index d0e1352c0e..6d82a7db5a 100644 --- a/code/datums/wires/emitter.dm +++ b/code/datums/wires/emitter.dm @@ -1,6 +1,8 @@ /datum/wires/emitter holder_type = /obj/machinery/power/emitter + req_knowledge = JOB_SKILL_TRAINED + req_skill = JOB_SKILL_UNTRAINED /datum/wires/emitter/New(atom/holder) wires = list(WIRE_ZAP,WIRE_HACK) diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index 3d1ed8b746..dc4db9e85d 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -15,6 +15,7 @@ /datum/wires/explosive/c4 holder_type = /obj/item/grenade/plastic/c4 randomize = TRUE //Same behaviour since no wire actually disarms it + req_skill = JOB_SKILL_UNTRAINED /datum/wires/explosive/c4/interactable(mob/user) var/obj/item/grenade/plastic/c4/P = holder @@ -29,6 +30,7 @@ /datum/wires/explosive/pizza holder_type = /obj/item/pizzabox randomize = TRUE + req_skill = JOB_SKILL_MASTER /datum/wires/explosive/pizza/New(atom/holder) wires = list( diff --git a/code/datums/wires/microwave.dm b/code/datums/wires/microwave.dm index 8c74abfa46..c6e6aa13b5 100644 --- a/code/datums/wires/microwave.dm +++ b/code/datums/wires/microwave.dm @@ -1,6 +1,8 @@ /datum/wires/microwave holder_type = /obj/machinery/microwave proper_name = "Microwave" + req_knowledge = JOB_SKILL_TRAINED + req_skill = JOB_SKILL_UNTRAINED /datum/wires/microwave/New(atom/holder) wires = list( diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index a452b46830..988487727b 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -1,6 +1,7 @@ /datum/wires/mulebot holder_type = /mob/living/simple_animal/bot/mulebot randomize = TRUE + req_knowledge = JOB_SKILL_MASTER /datum/wires/mulebot/New(atom/holder) wires = list( diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index af89f0d6f1..b782e589dd 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -1,6 +1,8 @@ /datum/wires/particle_accelerator/control_box holder_type = /obj/machinery/particle_accelerator/control_box proper_name = "Particle Accelerator" + req_knowledge = JOB_SKILL_EXPERT + req_skill = JOB_SKILL_TRAINED /datum/wires/particle_accelerator/control_box/New(atom/holder) wires = list( diff --git a/code/datums/wires/r_n_d.dm b/code/datums/wires/r_n_d.dm index ea61c1779e..25d3b73fe0 100644 --- a/code/datums/wires/r_n_d.dm +++ b/code/datums/wires/r_n_d.dm @@ -1,6 +1,7 @@ /datum/wires/rnd holder_type = /obj/machinery/rnd randomize = TRUE + req_knowledge = JOB_SKILL_EXPERT /datum/wires/rnd/New(atom/holder) wires = list( diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index a1118da6d7..5db6ddd186 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -1,6 +1,8 @@ /datum/wires/radio holder_type = /obj/item/radio proper_name = "Radio" + req_knowledge = JOB_SKILL_TRAINED + req_skill = JOB_SKILL_UNTRAINED /datum/wires/radio/New(atom/holder) wires = list( diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index aa7c3cc4c3..6ede0415da 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -1,6 +1,8 @@ /datum/wires/robot holder_type = /mob/living/silicon/robot randomize = TRUE + req_knowledge = JOB_SKILL_MASTER + req_skill = JOB_SKILL_TRAINED /datum/wires/robot/New(atom/holder) wires = list( diff --git a/code/datums/wires/suit_storage_unit.dm b/code/datums/wires/suit_storage_unit.dm index eb7781203b..4387d0dc76 100644 --- a/code/datums/wires/suit_storage_unit.dm +++ b/code/datums/wires/suit_storage_unit.dm @@ -1,6 +1,8 @@ /datum/wires/suit_storage_unit holder_type = /obj/machinery/suit_storage_unit proper_name = "Suit Storage Unit" + req_knowledge = JOB_SKILL_TRAINED + req_skill = JOB_SKILL_UNTRAINED /datum/wires/suit_storage_unit/New(atom/holder) wires = list( diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 53c1a1b9bc..8e1cf5002f 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -1,6 +1,8 @@ /datum/wires/syndicatebomb holder_type = /obj/machinery/syndicatebomb randomize = TRUE + req_skill = JOB_SKILL_EXPERT //good luck, wannabe hero. + /datum/wires/syndicatebomb/New(atom/holder) wires = list( diff --git a/code/datums/wires/tesla_coil.dm b/code/datums/wires/tesla_coil.dm index fa858a9a8f..68fe8e72fc 100644 --- a/code/datums/wires/tesla_coil.dm +++ b/code/datums/wires/tesla_coil.dm @@ -2,6 +2,7 @@ /datum/wires/tesla_coil randomize = 1 //Only one wire don't need blueprints holder_type = /obj/machinery/power/tesla_coil + req_knowledge = JOB_SKILL_TRAINED /datum/wires/tesla_coil/New(atom/holder) wires = list(WIRE_ZAP) diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 114791e873..6c7e59c24c 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -1,6 +1,7 @@ /datum/wires/vending holder_type = /obj/machinery/vending proper_name = "Vending Unit" + req_knowledge = JOB_SKILL_EXPERT /datum/wires/vending/New(atom/holder) wires = list( diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index c2855250f4..30699d36f4 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -169,7 +169,7 @@ .["real_mode"] = SSticker.mode.name // Key-authed callers may know the truth behind the "secret" - .["security_level"] = get_security_level() + .["security_level"] = NUM2SECLEVEL(GLOB.security_level) .["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 // Amount of world's ticks in seconds, useful for calculating round duration diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index bc034db718..cbad2f7ab0 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -324,6 +324,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Service Hallway" icon_state = "hall_service" +/area/hallway/secondary/civilian + name = "Civilian Wing" + icon_state = "hallFS" + + //Command /area/bridge @@ -1046,7 +1051,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Monastery Garden" icon_state = "hydro" - //Science /area/science @@ -1393,3 +1397,199 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/fitness/pool name = "Pool Area" icon_state = "pool" + +/area/crew_quarters/dorms/blue + name = "Blue Dorms" + icon_state = "Sleep" + nightshift_public_area = NIGHTSHIFT_AREA_NONE + +/area/crew_quarters/dorms/purple + name = "Purple Dorms" + icon_state = "Sleep" + nightshift_public_area = NIGHTSHIFT_AREA_NONE + +/area/crew_quarters/lounge/jazz + name = "Jazz Lounge" + icon_state = "yellow" + ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + + +/area/crew_quarters/fitness/recreation + name = "Recreation Area" + icon_state = "fitness" + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/fitness/cogpool + name = "Pool" + icon_state = "fitness" + clockwork_warp_fail = "Pool's closed." + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/barbershop + name = "Barbershop" + icon_state = "blue" + nightshift_public_area = NIGHTSHIFT_AREA_RECREATION + +/area/crew_quarters/observatory + name = "Observatory" + icon_state = "Sleep" + +//Engineering + +/area/engine/teg_hot + name = "Hot Loop" + icon_state = "red" + +/area/engine/teg_cold + name = "Cold Loop" + icon_state = "blue" + +/area/engine/workshop + name = "Engineering Workshop" + icon_state = "engine" + +/area/security/courtroom/jury + name = "Jury Room" + icon_state = "courtroom" + +/area/quartermaster/miningdock/airless + name = "Mining Dock" + icon_state = "mining" + has_gravity = STANDARD_GRAVITY + valid_territory = FALSE + outdoors = TRUE + ambientsounds = SPACE + blob_allowed = FALSE //While part of the station, what good will it do you? + +/area/quartermaster/miningdock/airless/no_grav + name = "Mining Dock" + icon_state = "mining" + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + valid_territory = FALSE + outdoors = TRUE + ambientsounds = SPACE + blob_allowed = FALSE //While part of the station, what good will it do you? + +/area/janitor/aux + name = "Auxiliary Custodial Closet" + icon_state = "janitor" + flags_1 = NONE + +/area/hydroponics/lobby + name = "Hydroponics Lobby" + icon_state = "hydro" + +//Storage + +/area/storage/emergency/generic + name = "Emergency Storage" + icon_state = "emergencystorage" + +//Construction + +/area/construction + name = "Construction Area" + icon_state = "yellow" + ambientsounds = ENGINEERING + +/area/construction/secondary + name = "Secondary Construction Area" + icon_state = "yellow" + +/area/construction/minisat_exterior + name = "Minisat Exterior" + icon_state = "yellow" + +/area/construction/mining/aux_base + name = "Auxiliary Base Construction" + icon_state = "yellow" + +/area/construction/mining/aux_base/closet + name = "Auxiliary Closet Construction" + icon_state = "yellow" + +/area/construction/supplyshuttle + name = "Supply Shuttle" + icon_state = "yellow" + +/area/construction/quarters + name = "Engineers' Quarters" + icon_state = "yellow" + +/area/construction/qmaint + name = "Maintenance" + icon_state = "yellow" + +/area/construction/hallway + name = "Hallway" + icon_state = "yellow" + +/area/construction/solars + name = "Solar Panels" + icon_state = "yellow" + +/area/construction/solarscontrol + name = "Solar Panel Control" + icon_state = "yellow" + +/area/construction/storage + name = "Construction Site Storage" + icon_state = "yellow" + +/area/construction/storage/wing + name = "Storage Wing" + icon_state = "storage_wing" + +//Routers + +/area/router + name = "Router" + icon_state = "yellow" + ambientsounds = ENGINEERING + +/area/router/service + name = "Service Router" + icon_state = "green" + +/area/router/public + name = "Public Router" + icon_state = "yellow" + +/area/router/sec + name = "Security Router" + icon_state = "blue" + +/area/router/medsci + name = "MedSci Router" + icon_state = "yellow" + +/area/router/eva + name = "EVA Router" + icon_state = "yellow" + +/area/router/air + name = "Airbridge Router" + icon_state = "red" + +/area/router/eng + name = "Engineering Router" + icon_state = "yellow" + +/area/router/aux + name = "Routing System" + icon_state = "yellow" + requires_power = FALSE + has_gravity = STANDARD_GRAVITY + always_unpowered = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + valid_territory = FALSE + outdoors = TRUE + ambientsounds = SPACE + blob_allowed = FALSE //While part of the station, what good will it do you? \ No newline at end of file diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index ac56d6f17c..dabbe93bec 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -11,25 +11,46 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING - var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. + /// Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. + var/map_name - var/valid_territory = TRUE // If it's a valid territory for gangs to claim - var/blob_allowed = TRUE // Does it count for blobs score? By default, all areas count. - var/clockwork_warp_allowed = TRUE // Can servants warp into this area from Reebe? + /// If it's valid territory for gangs/cults to summon + var/valid_territory = TRUE + /// if blobs can spawn there and if it counts towards their score. + var/blob_allowed = TRUE + /// whether servants can warp into this area from Reebe + var/clockwork_warp_allowed = TRUE + /// Message to display when the clockwork warp fails var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)" + /// If mining tunnel generation is allowed in this area + var/tunnel_allowed = FALSE + /// If flora are allowed to spawn in this area randomly through tunnel generation + var/flora_allowed = FALSE + /// if mobs can be spawned by natural random generation + var/mob_spawn_allowed = FALSE + /// If megafauna can be spawned by natural random generation + var/megafauna_spawn_allowed = FALSE + var/fire = null var/atmos = TRUE var/atmosalm = FALSE var/poweralm = TRUE var/lightswitch = TRUE + var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area. + var/beauty = 0 // Beauty average per open turf in the area + var/beauty_threshold = 150 //If a room is too big it doesn't have beauty. + var/requires_power = TRUE - var/always_unpowered = FALSE // This gets overridden to 1 for space in area/Initialize(). + /// This gets overridden to 1 for space in area/Initialize(). + var/always_unpowered = FALSE - var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) + /// For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) + var/outdoors = FALSE - var/areasize = 0 //Size of the area in open turfs, only calculated for indoors areas. + /// Size of the area in open turfs, only calculated for indoors areas. + var/areasize = 0 var/power_equip = TRUE var/power_light = TRUE @@ -43,9 +64,12 @@ var/static_environ var/has_gravity = 0 - var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) - var/hidden = FALSE //Hides area from player Teleport function. - var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers + /// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) + var/noteleport = FALSE + /// Hides area from player Teleport function. + var/hidden = FALSE + /// Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers + var/safe = FALSE /// If false, loading multiple maps with this area type will create multiple instances. var/unique = TRUE @@ -63,6 +87,7 @@ var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with + /// Color on minimaps, if it's null (which is default) it makes one at random. var/minimap_color @@ -171,6 +196,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/LateInitialize() if(!base_area) //we don't want to run it twice. power_change() // all machines set to current power level, also updates icon + update_beauty() /area/proc/reg_in_areas_in_z() if(contents.len) @@ -517,6 +543,16 @@ GLOBAL_LIST_EMPTY(teleportlocs) L.client.played = TRUE addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600) +///Divides total beauty in the room by roomsize to allow us to get an average beauty per tile. +/area/proc/update_beauty() + if(!areasize) + beauty = 0 + return FALSE + if(areasize >= beauty_threshold) + beauty = 0 + return FALSE //Too big + beauty = totalbeauty / areasize + /area/Exited(atom/movable/M) SEND_SIGNAL(src, COMSIG_AREA_EXITED, M) SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 1241b7a240..96b621acd8 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -32,7 +32,8 @@ /area/centcom/vip name = "VIP Zone" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - /area/centcom/winterball + +/area/centcom/winterball name = "winterball Zone" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index d32091f98b..9eec00460a 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -13,6 +13,16 @@ Asserts are to avoid the inevitable infinite loops */ +/area/holodeck/Initialize() + . = ..() + var/list/update_holodeck_cache = SSholodeck?.rejected_areas[type] + if(update_holodeck_cache) + var/list/info_this = list("name" = name, "type" = type) + var/list/target = restricted ? SSholodeck.emag_program_cache : SSholodeck.program_cache + for(var/A in update_holodeck_cache) + LAZYADD(target[A], info_this) + SSholodeck.rejected_areas -= type + /area/holodeck/powered(var/chan) if(!requires_power) return 1 diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 2ca9167bb2..70e0910dde 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -3,6 +3,7 @@ /area/mine icon_state = "mining" has_gravity = STANDARD_GRAVITY + flora_allowed = TRUE /area/mine/explored name = "Mine" @@ -17,6 +18,7 @@ outdoors = TRUE flags_1 = NONE ambientsounds = MINING + flora_allowed = FALSE /area/mine/unexplored name = "Mine" @@ -31,6 +33,7 @@ outdoors = TRUE flags_1 = NONE ambientsounds = MINING + tunnel_allowed = TRUE /area/mine/lobby name = "Mining Station" @@ -82,6 +85,7 @@ icon_state = "mining" has_gravity = STANDARD_GRAVITY flags_1 = NONE + flora_allowed = TRUE /area/lavaland/surface name = "Lavaland" @@ -114,9 +118,79 @@ /area/lavaland/surface/outdoors/unexplored //monsters and ruins spawn here icon_state = "unexplored" + tunnel_allowed = TRUE + mob_spawn_allowed = TRUE /area/lavaland/surface/outdoors/unexplored/danger //megafauna will also spawn here icon_state = "danger" + megafauna_spawn_allowed = TRUE /area/lavaland/surface/outdoors/explored name = "Lavaland Labor Camp" + flora_allowed = FALSE + + + +/**********************Ice Moon Areas**************************/ + +/area/icemoon + icon_state = "mining" + has_gravity = STANDARD_GRAVITY + flags_1 = NONE + flora_allowed = TRUE + blob_allowed = FALSE + +/area/icemoon/surface + name = "Icemoon" + icon_state = "explored" + always_unpowered = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + requires_power = TRUE + ambientsounds = MINING + +/area/icemoon/underground + name = "Icemoon Caves" + outdoors = TRUE + always_unpowered = TRUE + requires_power = TRUE + poweralm = FALSE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + ambientsounds = MINING + +/area/icemoon/underground/unexplored // mobs and megafauna and ruins spawn here + name = "Icemoon Caves" + icon_state = "unexplored" + tunnel_allowed = TRUE + mob_spawn_allowed = TRUE + megafauna_spawn_allowed = TRUE + +/area/icemoon/underground/unexplored/rivers // rivers spawn here + icon_state = "danger" + +/area/icemoon/underground/explored + name = "Icemoon Underground" + flora_allowed = FALSE + +/area/icemoon/surface/outdoors + name = "Icemoon Wastes" + outdoors = TRUE + +/area/icemoon/surface/outdoors/labor_camp + name = "Icemoon Labor Camp" + flora_allowed = FALSE + +/area/icemoon/surface/outdoors/unexplored //monsters and ruins spawn here + icon_state = "unexplored" + tunnel_allowed = TRUE + mob_spawn_allowed = TRUE + +/area/icemoon/surface/outdoors/unexplored/rivers // rivers spawn here + icon_state = "danger" + +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters + mob_spawn_allowed = FALSE diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm new file mode 100644 index 0000000000..6706a5faea --- /dev/null +++ b/code/game/area/areas/ruins/icemoon.dm @@ -0,0 +1,9 @@ +// Icemoon Ruins + +/area/ruin/unpowered/buried_library + name = "Buried Library" + icon_state = "dk_yellow" + +/area/ruin/powered/bathhouse + name = "Bath House" + icon_state = "dk_yellow" diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 76f090d5e3..19a1fd503d 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -32,6 +32,14 @@ /area/ruin/powered/seedvault icon_state = "dk_yellow" +/area/ruin/unpowered/elephant_graveyard + name = "Elephant Graveyard" + icon_state = "dk_yellow" + +/area/ruin/powered/graveyard_shuttle + name = "Elephant Graveyard" + icon_state = "green" + /area/ruin/unpowered/syndicate_lava_base name = "Secret Base" icon_state = "dk_yellow" diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 59c195ded1..a9f48af64e 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -129,7 +129,26 @@ icon_state = "crew_quarters" +//Ruin of Space Diner +/area/ruin/space/diner + name = "Space Diner" + +/area/ruin/space/diner/interior + name = "Space Diner" + icon_state = "maintbar" + has_gravity = STANDARD_GRAVITY + blob_allowed = FALSE //Nope, no winning in the diner as a blob. Gotta eat the main station. + +/area/ruin/space/diner/solars + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + valid_territory = FALSE + blob_allowed = FALSE + flags_1 = NONE + ambientsounds = ENGINEERING + name = "Space Diner Solar Array" + icon_state = "yellow" //Ruin of Derelict Oupost diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index ab4fa10d44..43ea487894 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -93,6 +93,13 @@ /area/shuttle/abandoned/pod name = "Abandoned Ship Pod" +////////////////////////////Bounty Hunter Shuttles//////////////////////////// +/area/shuttle/hunter + name = "Hunter Shuttle" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + blob_allowed = FALSE + canSmoothWithAreas = /area/shuttle/hunter + ////////////////////////////Single-area shuttles//////////////////////////// /area/shuttle/transit @@ -103,6 +110,10 @@ /area/shuttle/custom name = "Custom player shuttle" +/area/shuttle/custom/powered + name = "Custom Powered player shuttle" + requires_power = FALSE + /area/shuttle/arrival name = "Arrival Shuttle" unique = TRUE // SSjob refers to this area for latejoiners @@ -200,4 +211,7 @@ name = "Tiny Freighter" /area/shuttle/caravan/freighter3 - name = "Tiny Freighter" \ No newline at end of file + name = "Tiny Freighter" + +/area/shuttle/snowtaxi + name = "Snow Taxi" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d8d7ce3d91..e3f4829d3d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -8,6 +8,13 @@ var/interaction_flags_atom = NONE var/datum/reagents/reagents = null + var/flags_ricochet = NONE + + ///When a projectile tries to ricochet off this atom, the projectile ricochet chance is multiplied by this + var/ricochet_chance_mod = 1 + ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom + var/ricochet_damage_mod = 0.33 + //This atom's HUD (med/sec, etc) images. Associative list. var/list/image/hud_list = null //HUD images that this atom can provide. @@ -32,6 +39,9 @@ var/list/filter_data //For handling persistent filters + var/custom_price + var/custom_premium_price + var/datum/component/orbiter/orbiters var/rad_flags = NONE // Will move to flags_1 when i can be arsed to @@ -44,12 +54,21 @@ ///Modifier that raises/lowers the effect of the amount of a material, prevents small and easy to get items from being death machines. var/material_modifier = 1 + var/datum/wires/wires = null + var/icon/blood_splatter_icon var/list/fingerprints var/list/fingerprintshidden var/list/blood_DNA var/list/suit_fibers + /// Last name used to calculate a color for the chatmessage overlays + var/chat_color_name + /// Last color calculated for the the chatmessage overlays + var/chat_color + /// A luminescence-shifted value of the last color calculated for chatmessage overlays + var/chat_color_darkened + /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() @@ -129,8 +148,27 @@ return ..() +/** + * Checks if a projectile should ricochet off of us. Projectiles get final say. + * [__DEFINES/projectiles.dm] for return values. + */ +/atom/proc/check_projectile_ricochet(obj/item/projectile/P) + return (flags_1 & DEFAULT_RICOCHET_1)? PROJECTILE_RICOCHET_YES : PROJECTILE_RICOCHET_NO + /atom/proc/handle_ricochet(obj/item/projectile/P) - return + var/turf/p_turf = get_turf(P) + var/face_direction = get_dir(src, p_turf) + var/face_angle = dir2angle(face_direction) + var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180)) + var/a_incidence_s = abs(incidence_s) + if(a_incidence_s > 90 && a_incidence_s < 270) + return FALSE + if((P.flag in list("bullet", "bomb")) && P.ricochet_incidence_leeway) + if((a_incidence_s < 90 && a_incidence_s < 90 - P.ricochet_incidence_leeway) || (a_incidence_s > 270 && a_incidence_s -270 > P.ricochet_incidence_leeway)) + return + var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) + P.setAngle(new_angle_s) + return TRUE /atom/proc/CanPass(atom/movable/mover, turf/target) return !density @@ -192,7 +230,7 @@ reagents = new() reagents.reagent_list.Add(A) reagents.conditional_update() - else if(ismovableatom(A)) + else if(ismovable(A)) var/atom/movable/M = A if(isliving(M.loc)) var/mob/living/L = M.loc @@ -303,10 +341,11 @@ . += desc if(custom_materials) + var/list/materials_list = list() for(var/i in custom_materials) var/datum/material/M = i - . += "It is made out of [M.name]." - + materials_list += "[M.name]" + . += "It is made out of [english_list(materials_list)]." if(reagents) if(reagents.reagents_holder_flags & TRANSPARENT) . += "It contains:" @@ -397,13 +436,13 @@ //returns the mob's dna info as a list, to be inserted in an object's blood_DNA list /mob/living/proc/get_blood_dna_list() var/blood_id = get_blood_id() - if(!(blood_id =="blood" || blood_id == "jellyblood")) + if(!(blood_id in GLOB.blood_reagent_types)) return return list("ANIMAL DNA" = "Y-") /mob/living/carbon/get_blood_dna_list() var/blood_id = get_blood_id() - if(!(blood_id =="blood" || blood_id == "jellyblood")) + if(!(blood_id in GLOB.blood_reagent_types)) return var/list/blood_dna = list() if(dna) @@ -571,6 +610,14 @@ SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) return FALSE +/** + * Respond to a electric bolt action on our item + * + * Default behaviour is to return, we define here to allow for cleaner code later on + */ +/atom/proc/zap_act(power, zap_flags, shocked_targets) + return + /atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) if(GetComponent(/datum/component/storage)) return component_storage_contents_dump_act(src_object, user) @@ -584,11 +631,8 @@ stoplag(1) qdel(progress) to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") - STR.orient2hud(user) - src_object.orient2hud(user) if(user.active_storage) //refresh the HUD to show the transfered contents - user.active_storage.close(user) - user.active_storage.show_to(user) + user.active_storage.ui_show(user) return TRUE /atom/proc/get_dumping_location(obj/item/storage/source,mob/user) @@ -694,14 +738,64 @@ /atom/vv_get_dropdown() . = ..() - . += "---" - var/turf/curturf = get_turf(src) - if (curturf) - .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" - .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]" - .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]" - .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]" - .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + if(!ismovable(src)) + var/turf/curturf = get_turf(src) + if(curturf) + . += "" + VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRANSFORM, "Modify Transform") + VV_DROPDOWN_OPTION(VV_HK_ADD_REAGENT, "Add Reagent") + VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse") + VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") + +/atom/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_ADD_REAGENT] && check_rights(R_VAREDIT)) + if(!reagents) + var/amount = input(usr, "Specify the reagent size of [src]", "Set Reagent Size", 50) as num + if(amount) + create_reagents(amount) + + if(reagents) + var/chosen_id = choose_reagent_id(usr) + if(chosen_id) + var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", reagents.maximum_volume) as num + if(amount) + reagents.add_reagent(chosen_id, amount) + log_admin("[key_name(usr)] has added [amount] units of [chosen_id] to [src]") + message_admins("[key_name(usr)] has added [amount] units of [chosen_id] to [src]") + if(href_list[VV_HK_TRIGGER_EXPLOSION] && check_rights(R_FUN)) + usr.client.cmd_admin_explosion(src) + if(href_list[VV_HK_TRIGGER_EMP] && check_rights(R_FUN)) + usr.client.cmd_admin_emp(src) + if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) + var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") + var/matrix/M = transform + switch(result) + if("Scale") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(!isnull(x) && !isnull(y)) + transform = M.Scale(x,y) + if("Translate") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(!isnull(x) && !isnull(y)) + transform = M.Translate(x,y) + if("Rotate") + var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num + if(!isnull(angle)) + transform = M.Turn(angle) + if(href_list[VV_HK_AUTO_RENAME] && check_rights(R_VAREDIT)) + var/newname = input(usr, "What do you want to rename this to?", "Automatic Rename") as null|text + if(newname) + vv_auto_rename(newname) + +/atom/vv_get_header() + . = ..() + var/refid = REF(src) + . += "[VV_HREF_TARGETREF(refid, VV_HK_AUTO_RENAME, "[src]")]" + . += "
    << [dir2text(dir) || dir] >>" /atom/proc/drop_location() var/atom/L = loc @@ -709,6 +803,9 @@ return null return L.AllowDrop() ? L : L.drop_location() +/atom/proc/vv_auto_rename(newname) + name = newname + /atom/Entered(atom/movable/AM, atom/oldLoc) SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) @@ -775,6 +872,17 @@ /atom/proc/GenerateTag() return +/** + * Called after a shuttle is loaded **from map template initially**. + * + * @params + * * port - Mobile port/shuttle + * * dock - Stationary dock the shuttle's at + * * idnum - ID number of the shuttle + */ +/atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + return + // Generic logging helper /atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) if(!log_globally) @@ -867,14 +975,14 @@ Proc for attack log creation, because really why not target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) // Filter stuff -/atom/movable/proc/add_filter(name,priority,list/params) +/atom/proc/add_filter(name,priority,list/params) LAZYINITLIST(filter_data) var/list/p = params.Copy() p["priority"] = priority filter_data[name] = p update_filters() -/atom/movable/proc/update_filters() +/atom/proc/update_filters() filters = null filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) for(var/f in filter_data) @@ -883,11 +991,11 @@ Proc for attack log creation, because really why not arguments -= "priority" filters += filter(arglist(arguments)) -/atom/movable/proc/get_filter(name) +/atom/proc/get_filter(name) if(filter_data && filter_data[name]) return filters[filter_data.Find(name)] -/atom/movable/proc/remove_filter(name) +/atom/proc/remove_filter(name) if(filter_data && filter_data[name]) filter_data -= name update_filters() @@ -915,7 +1023,7 @@ Proc for attack log creation, because really why not for(var/x in materials) var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) - if(!(material_flags & MATERIAL_NO_EFFECTS)) + if(material_flags & MATERIAL_EFFECTS) custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags) custom_materials[custom_material] += materials[x] * multiplier diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d8f54e9993..9736f473e8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -11,7 +11,7 @@ var/throw_range = 7 var/mob/pulledby = null var/initial_language_holder = /datum/language_holder - var/datum/language_holder/language_holder + var/datum/language_holder/language_holder // Mindless mobs and objects need language too, some times. Mind holder takes prescedence. var/verb_say = "says" var/verb_ask = "asks" var/verb_exclaim = "exclaims" @@ -25,6 +25,7 @@ var/inertia_move_delay = 5 var/pass_flags = 0 var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move + var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. var/list/client_mobs_in_contents // This contains all the client mobs within this container var/list/acted_explosions //for explosion dodging glide_size = 8 @@ -36,6 +37,8 @@ var/throwforce = 0 var/datum/component/orbiter/orbiting var/can_be_z_moved = TRUE + ///If we were without gravity and another animation happened, the bouncing will stop, and we need to restart it in next life(). + var/floating_need_update = FALSE var/zfalling = FALSE @@ -55,10 +58,6 @@ em_block = new(src, render_target) vis_contents += em_block -/atom/movable/Destroy() - QDEL_NULL(em_block) - return ..() - /atom/movable/proc/update_emissive_block() if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) return @@ -68,7 +67,7 @@ if(vs.plane == EMISSIVE_BLOCKER_PLANE) SSvis_overlays.remove_vis_overlay(src, list(vs)) break - SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir) /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) @@ -182,14 +181,15 @@ return TRUE /atom/movable/proc/stop_pulling() - if(pulling) - pulling.pulledby = null - var/mob/living/ex_pulled = pulling - pulling = null - setGrabState(0) - if(isliving(ex_pulled)) - var/mob/living/L = ex_pulled - L.update_mobility()// mob gets up if it was lyng down in a chokehold + if(!pulling) + return + pulling.pulledby = null + var/mob/living/ex_pulled = pulling + pulling = null + setGrabState(0) + if(isliving(ex_pulled)) + var/mob/living/L = ex_pulled + L.update_mobility()// mob gets up if it was lyng down in a chokehold /atom/movable/proc/Move_Pulled(atom/A) if(!pulling) @@ -207,6 +207,7 @@ if(!Process_Spacemove(get_dir(pulling.loc, A))) return step(pulling, get_dir(pulling.loc, A)) + return TRUE /atom/movable/proc/check_pulling() if(pulling) @@ -224,14 +225,18 @@ if(pulling.anchored || pulling.move_resist > move_force) stop_pulling() return + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() /atom/movable/Destroy(force) QDEL_NULL(proximity_monitor) QDEL_NULL(language_holder) + QDEL_NULL(em_block) unbuckle_all_mobs(force=1) . = ..() + if(loc) //Restore air flow if we were blocking it (movables with ATMOS_PASS_PROC will need to do this manually if necessary) if(((CanAtmosPass == ATMOS_PASS_DENSITY && density) || CanAtmosPass == ATMOS_PASS_NO) && isturf(loc)) @@ -251,8 +256,13 @@ /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) set waitfor = 0 - SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) - return hit_atom.hitby(src, throwingdatum=throwingdatum) + var/hitpush = TRUE + var/impact_signal = SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) + if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH) + hitpush = FALSE // hacky, tie this to something else or a proper workaround later + + if(impact_signal & ~COMPONENT_MOVABLE_IMPACT_NEVERMIND) // in case a signal interceptor broke or deleted the thing before we could process our hit + return hit_atom.hitby(src, throwingdatum = throwingdatum, hitpush = hitpush) /atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) @@ -468,9 +478,8 @@ /atom/movable/vv_get_dropdown() . = ..() - . -= "Jump to" - .["Follow"] = "?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(src)]" - .["Get"] = "?_src_=holder;[HrefToken()];admingetmovable=[REF(src)]" + . += "" + . += "" /atom/movable/proc/ex_check(ex_id) if(!ex_id) @@ -485,97 +494,104 @@ /atom/movable/proc/float(on) if(throwing) return - if(on && !(movement_type & FLOATING)) + if(on && (!(movement_type & FLOATING) || floating_need_update)) animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) sleep(10) animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) - setMovetype(movement_type | FLOATING) - else if (!on && (movement_type & FLOATING)) + if(!(movement_type & FLOATING)) + setMovetype(movement_type | FLOATING) + else if (!on && movement_type & FLOATING) animate(src, pixel_y = initial(pixel_y), time = 10) setMovetype(movement_type & ~FLOATING) + floating_need_update = FALSE -/* Language procs */ -/atom/movable/proc/get_language_holder(shadow=TRUE) - if(language_holder) - return language_holder - else +/* Language procs +* Unless you are doing something very specific, these are the ones you want to use. +*/ + +/// Gets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one. +/atom/movable/proc/get_language_holder(get_minds = TRUE) + if(!language_holder) language_holder = new initial_language_holder(src) - return language_holder + return language_holder -/atom/movable/proc/grant_language(datum/language/dt, body = FALSE) - var/datum/language_holder/H = get_language_holder(!body) - H.grant_language(dt, body) +/// Grants the supplied language and sets omnitongue true. +/atom/movable/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ATOM) + var/datum/language_holder/LH = get_language_holder() + return LH.grant_language(language, understood, spoken, source) -/atom/movable/proc/grant_all_languages(omnitongue=FALSE) - var/datum/language_holder/H = get_language_holder() - H.grant_all_languages(omnitongue) +/// Grants every language. +/atom/movable/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND) + var/datum/language_holder/LH = get_language_holder() + return LH.grant_all_languages(understood, spoken, grant_omnitongue, source) +/// Removes a single language. +/atom/movable/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) + var/datum/language_holder/LH = get_language_holder() + return LH.remove_language(language, understood, spoken, source) + +/// Removes every language and sets omnitongue false. +/atom/movable/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE) + var/datum/language_holder/LH = get_language_holder() + return LH.remove_all_languages(source, remove_omnitongue) + +/// Adds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later. +/atom/movable/proc/add_blocked_language(language, source = LANGUAGE_ATOM) + var/datum/language_holder/LH = get_language_holder() + return LH.add_blocked_language(language, source) + +/// Removes a language from the blocked language list. +/atom/movable/proc/remove_blocked_language(language, source = LANGUAGE_ATOM) + var/datum/language_holder/LH = get_language_holder() + return LH.remove_blocked_language(language, source) + +/// Checks if atom has the language. If spoken is true, only checks if atom can speak the language. +/atom/movable/proc/has_language(language, spoken = FALSE) + var/datum/language_holder/LH = get_language_holder() + return LH.has_language(language, spoken) + +/// Checks if atom can speak the language. +/atom/movable/proc/can_speak_language(language) + var/datum/language_holder/LH = get_language_holder() + return LH.can_speak_language(language) + +/// Returns the result of tongue specific limitations on spoken languages. +/atom/movable/proc/could_speak_language(language) + return TRUE + +/// Returns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible. +/atom/movable/proc/get_selected_language() + var/datum/language_holder/LH = get_language_holder() + return LH.get_selected_language() + +/// Gets a random understood language, useful for hallucinations and such. /atom/movable/proc/get_random_understood_language() - var/datum/language_holder/H = get_language_holder() - . = H.get_random_understood_language() + var/datum/language_holder/LH = get_language_holder() + return LH.get_random_understood_language() -/atom/movable/proc/remove_language(datum/language/dt, body = FALSE) - var/datum/language_holder/H = get_language_holder(!body) - H.remove_language(dt, body) +/// Gets a random spoken language, useful for forced speech and such. +/atom/movable/proc/get_random_spoken_language() + var/datum/language_holder/LH = get_language_holder() + return LH.get_random_spoken_language() -/atom/movable/proc/remove_all_languages() - var/datum/language_holder/H = get_language_holder() - H.remove_all_languages() +/// Copies all languages into the supplied atom/language holder. Source should be overridden when you +/// do not want the language overwritten by later atom updates or want to avoid blocked languages. +/atom/movable/proc/copy_languages(from_holder, source_override) + if(isatom(from_holder)) + var/atom/movable/thing = from_holder + from_holder = thing.get_language_holder() + var/datum/language_holder/LH = get_language_holder() + return LH.copy_languages(from_holder, source_override) -/atom/movable/proc/has_language(datum/language/dt) - var/datum/language_holder/H = get_language_holder() - . = H.has_language(dt) - -/atom/movable/proc/copy_known_languages_from(thing, replace=FALSE) - var/datum/language_holder/H = get_language_holder() - . = H.copy_known_languages_from(thing, replace) - -// Whether an AM can speak in a language or not, independent of whether -// it KNOWS the language -/atom/movable/proc/could_speak_in_language(datum/language/dt) - . = TRUE - -/atom/movable/proc/can_speak_in_language(datum/language/dt) - var/datum/language_holder/H = get_language_holder() - - if(!H.has_language(dt)) - return FALSE - else if(H.omnitongue) - return TRUE - else if(could_speak_in_language(dt) && (!H.only_speaks_language || H.only_speaks_language == dt)) - return TRUE - else - return FALSE - -/atom/movable/proc/get_default_language() - // if no language is specified, and we want to say() something, which - // language do we use? - var/datum/language_holder/H = get_language_holder() - - if(H.selected_default_language) - if(can_speak_in_language(H.selected_default_language)) - return H.selected_default_language - else - H.selected_default_language = null - - - var/datum/language/chosen_langtype - var/highest_priority - - for(var/lt in H.languages) - var/datum/language/langtype = lt - if(!can_speak_in_language(langtype)) - continue - - var/pri = initial(langtype.default_priority) - if(!highest_priority || (pri > highest_priority)) - chosen_langtype = langtype - highest_priority = pri - - H.selected_default_language = . - . = chosen_langtype +/// Empties out the atom specific languages and updates them according to the current atoms language holder. +/// As a side effect, it also creates missing language holders in the process. +/atom/movable/proc/update_atom_languages() + var/datum/language_holder/LH = get_language_holder() + return LH.update_atom_languages(src) /* End language procs */ + + /atom/movable/proc/ConveyorMove(movedir) set waitfor = FALSE if(!anchored && has_gravity()) diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index d418652cd8..68db17f076 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -20,6 +20,9 @@ if(!newloc.Enter(src, src.loc)) return + if (SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE) + return + // Past this is the point of no return var/atom/oldloc = loc var/area/oldarea = get_area(oldloc) @@ -51,13 +54,8 @@ /atom/movable/Move(atom/newloc, direct) var/atom/movable/pullee = pulling var/turf/T = loc - if(pulling) - if(pullee && get_dist(src, pullee) > 1) - stop_pulling() - - if(pullee && pullee.loc != loc && !isturf(pullee.loc) ) //to be removed once all code that changes an object's loc uses forceMove(). - log_game("DEBUG:[src]'s pull on [pullee] wasn't broken despite [pullee] being in [pullee.loc]. Pull stopped manually.") - stop_pulling() + if(!moving_from_pull) + check_pulling() if(!loc || !newloc) return FALSE var/atom/oldloc = loc @@ -130,19 +128,16 @@ if(has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) return FALSE - if(pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move. + if(pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move. if(pulling.anchored) stop_pulling() else var/pull_dir = get_dir(src, pulling) //puller and pullee more than one tile away or in diagonal position if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) + pulling.moving_from_pull = src pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position - if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up - stop_pulling() - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. - pulledby.stop_pulling() - + pulling.moving_from_pull = null Moved(oldloc, direct) /atom/movable/proc/handle_buckled_mob_movement(newloc,direct) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 1a57cf5051..413484b99b 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -147,7 +147,6 @@ return "health-85" else return "health-100" - return "0" //HOOKS @@ -323,7 +322,6 @@ return "crit" else return "dead" - return "dead" //Sillycone hooks /mob/living/silicon/proc/diag_hud_set_health() diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 9515d6063c..c54de16e2e 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -9,8 +9,14 @@ var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \ /datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,) // The antags you're allowed to be if turning Vassal. -/proc/isvamp(mob/living/M) - return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker) + +/proc/AmBloodsucker(mob/living/M, falseIfInDisguise = FALSE) + if(!M.mind) + return FALSE + // No Datum + if(!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + return FALSE + return TRUE /datum/game_mode/bloodsucker name = "bloodsucker" @@ -47,7 +53,7 @@ restricted_jobs += "Assistant" // Set number of Vamps - recommended_enemies = CLAMP(round(num_players()/10), 1, 6); + recommended_enemies = clamp(round(num_players()/10), 1, 6); // Select Antags for(var/i = 0, i < recommended_enemies, i++) @@ -70,49 +76,27 @@ // Gamemode is all done being set up. We have all our Vamps. We now pick objectives and let them know what's happening. /datum/game_mode/bloodsucker/post_setup() - // Sunlight (Creating Bloodsuckers manually will check to create this, too) check_start_sunlight() - // Vamps for(var/datum/mind/bloodsucker in bloodsuckers) - // spawn() --> Run block of code but game continues on past it. - // sleep() --> Run block of code and freeze code there (including whoever called us) until it's resolved. - - //Clean Bloodsucker Species (racist?) - //clean_invalid_species(bloodsucker) - // TO-DO !!! - - // Add Bloodsucker Antag Datum (or remove from list on Fail) - if (!make_bloodsucker(bloodsucker)) + if(!make_bloodsucker(bloodsucker)) bloodsuckers -= bloodsucker - - // NOTE: Hunters are done in ..() parent proc - return ..() -// Checking for ACTUALLY Dead Vamps -/datum/game_mode/bloodsucker/are_special_antags_dead() - // Bloodsucker not Final Dead - for(var/datum/mind/bloodsucker in bloodsuckers) - if(!bloodsucker.AmFinalDeath()) - return FALSE - return TRUE - - // Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker /datum/game_mode/proc/check_start_sunlight() // Already Sunlight (and not about to cancel) - if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) + if(istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) return bloodsucker_sunlight = new () // End Sun (last bloodsucker removed) /datum/game_mode/proc/check_cancel_sunlight() // No Sunlight - if (!istype(bloodsucker_sunlight)) + if(!istype(bloodsucker_sunlight)) return - if (bloodsuckers.len <= 0) + if(bloodsuckers.len <= 0) bloodsucker_sunlight.cancel_me = TRUE qdel(bloodsucker_sunlight) bloodsucker_sunlight = null @@ -151,43 +135,37 @@ // Not High Enough if(creator) var/datum/antagonist/bloodsucker/creator_bloodsucker = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - if(!istype(creator_bloodsucker) || creator_bloodsucker.vamplevel < BLOODSUCKER_LEVEL_TO_EMBRACE) + if(!istype(creator_bloodsucker) || creator_bloodsucker.bloodsucker_level < BLOODSUCKER_LEVEL_TO_EMBRACE) to_chat(creator, "Your blood is too thin to turn this corpse!") return FALSE return TRUE /datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode. - if (!can_make_bloodsucker(bloodsucker)) + if(!can_make_bloodsucker(bloodsucker)) return FALSE - // Create Datum: Fledgling var/datum/antagonist/bloodsucker/A // [FLEDGLING] - if (creator) + if(creator) A = new (bloodsucker) A.creator = creator bloodsucker.add_antag_datum(A) // Log message_admins("[bloodsucker] has become a Bloodsucker, and was created by [creator].") log_admin("[bloodsucker] has become a Bloodsucker, and was created by [creator].") - // [MASTER] else A = bloodsucker.add_antag_datum(ANTAG_DATUM_BLOODSUCKER) - - return TRUE - /datum/game_mode/proc/remove_bloodsucker(datum/mind/bloodsucker) bloodsucker.remove_antag_datum(ANTAG_DATUM_BLOODSUCKER) - /datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker) // Only checking for Humans here - if (!ishuman(bloodsucker.current) || !bloodsucker.current.client) + if(!ishuman(bloodsucker.current) || !bloodsucker.current.client) return var/am_valid = TRUE var/mob/living/carbon/human/H = bloodsucker.current @@ -202,7 +180,7 @@ // everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag) // Convert to HUMAN (along with ID and PDA) - if (!am_valid) + if(!am_valid) H.set_species(/datum/species/human) H.real_name = H.client.prefs.custom_names["human"] var/obj/item/card/id/ID = H.wear_id?.GetID() @@ -211,12 +189,13 @@ ID.update_label() -/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE) +/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning = TRUE)//, check_antag_or_loyal=FALSE) // Not Correct Type: Abort - if (!iscarbon(target) || !creator) + if(!iscarbon(target) || !creator) return FALSE - if (target.stat > UNCONSCIOUS) + if(target.stat > UNCONSCIOUS) return FALSE + // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) //message_admins("DEBUG2: can_make_vassal() Abort: No reagents") @@ -233,23 +212,23 @@ //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") // return 0 // No Mind! - if (!target.mind || !target.mind.key) - if (display_warning) + if(!target.mind || !target.mind.key) + if(display_warning) to_chat(creator, "[target] isn't self-aware enough to be made into a Vassal.") return FALSE // Already MY Vassal var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if (istype(V) && V.master) - if (V.master.owner == creator) - if (display_warning) + if(istype(V) && V.master) + if(V.master.owner == creator) + if(display_warning) to_chat(creator, "[target] is already your loyal Vassal!") else - if (display_warning) + if(display_warning) to_chat(creator, "[target] is the loyal Vassal of another Bloodsucker!") return FALSE // Already Antag or Loyal (Vamp Hunters count as antags) - if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || - if (display_warning) + if(target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || + if(display_warning) to_chat(creator, "[target] resists the power of your blood to dominate their mind!") return FALSE return TRUE @@ -268,24 +247,24 @@ return FALSE // Does even ONE antag appear in this mind that isn't in the list? Then FAIL! for(var/datum/antagonist/antag_datum in M.antag_datums) - if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. + if(!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. //message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]") return TRUE //message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])") // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE -/datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator) - if (!can_make_vassal(target,creator)) +/datum/game_mode/proc/make_vassal(var/mob/living/target, var/datum/mind/creator) + if(!can_make_vassal(target, creator)) return FALSE // Make Vassal - var/datum/antagonist/vassal/V = new (target.mind) + var/datum/antagonist/vassal/V = new(target.mind) var/datum/antagonist/bloodsucker/B = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) V.master = B target.mind.add_antag_datum(V, V.master.get_team()) // Update Bloodsucker Title (we're a daddy now) B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. - // Log + // Log it message_admins("[target] has become a Vassal, and is enslaved to [creator].") log_admin("[target] has become a Vassal, and is enslaved to [creator].") return TRUE diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 4db8f4129a..8029685bf7 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -119,7 +119,6 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th C.appearance = chosen_prof.appearance_list[slot] C.name = chosen_prof.name_list[slot] C.flags_cover = chosen_prof.flags_cover_list[slot] - C.item_color = chosen_prof.item_color_list[slot] C.item_state = chosen_prof.item_state_list[slot] if(equip) user.equip_to_slot_or_del(C, GLOB.slot2slot[slot]) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 15d7744205..7b798f19e4 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -45,8 +45,11 @@ Credit where due: // PROCS // /////////// -/proc/is_servant_of_ratvar(mob/M) - return istype(M) && !isobserver(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/clockcult) +/proc/is_servant_of_ratvar(mob/M, require_full_power = FALSE, holy_water_check = FALSE) + if(!istype(M) || isobserver(M)) + return FALSE + var/datum/antagonist/clockcult/D = M?.mind?.has_antag_datum(/datum/antagonist/clockcult) + return D && (!require_full_power || !D.neutered) && (!holy_water_check || !D.ignore_holy_water) /proc/is_eligible_servant(mob/M) if(!istype(M)) @@ -70,12 +73,14 @@ Credit where due: return TRUE return FALSE -/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE) +/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE, override_type) if(!L || !L.mind) return var/update_type = /datum/antagonist/clockcult if(silent) update_type = /datum/antagonist/clockcult/silent + if(override_type) //prioritizes + update_type = override_type var/datum/antagonist/clockcult/C = new update_type(L.mind) C.make_team = create_team C.show_in_roundend = create_team //tutorial scarabs begone @@ -105,9 +110,6 @@ Credit where due: L.playsound_local(get_turf(L), 'sound/ambience/antag/clockcultalr.ogg', 40, TRUE, frequency = 100000, pressure_affected = FALSE) flash_color(L, flash_color = list("#BE8700", "#BE8700", "#BE8700", rgb(0,0,0)), flash_time = 5) - - - /proc/remove_servant_of_ratvar(mob/L, silent = FALSE) if(!L || !L.mind) return diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 0a231a5ff1..afa3dbfeaa 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -63,7 +63,7 @@ attack_verb_on = list("slipped") clumsy_check = FALSE sharpness = IS_BLUNT - item_color = "yellow" + sword_color = "yellow" heat = 0 light_color = "#ffff00" var/next_trombone_allowed = 0 @@ -202,7 +202,7 @@ icon_state = "moustacheg" clumsy_check = GRENADE_NONCLUMSY_FUMBLE -/obj/item/grenade/chem_grenade/teargas/moustache/prime() +/obj/item/grenade/chem_grenade/teargas/moustache/prime(mob/living/lanced_by) var/list/check_later = list() for(var/mob/living/carbon/C in get_turf(src)) check_later += C diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 497cc2f1c3..8ec4123201 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -3,8 +3,11 @@ /datum/game_mode var/list/datum/mind/cult = list() -/proc/iscultist(mob/living/M) - return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/cult) +/proc/iscultist(mob/living/M, require_full_power = FALSE, holy_water_check = FALSE) + if(!istype(M)) + return FALSE + var/datum/antagonist/cult/D = M?.mind?.has_antag_datum(/datum/antagonist/cult) + return D && (!require_full_power || !D.neutered) && (!holy_water_check || !D.ignore_holy_water) /datum/team/cult/proc/is_sacrifice_target(datum/mind/mind) for(var/datum/objective/sacrifice/sac_objective in objectives) @@ -93,7 +96,7 @@ add_cultist(cult_mind, 0, equip=TRUE) if(!main_cult) var/datum/antagonist/cult/C = cult_mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C && C.cult_team) + if(C?.cult_team) main_cult = C.cult_team ..() diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index b8a5e72d55..659d50c077 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -40,8 +40,10 @@ GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) // Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) - +// Storyteller picked by the voting. GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) +// Storyteller forced by admins during voting--will be used instead of above. +GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) /datum/game_mode/dynamic name = "dynamic mode" @@ -54,12 +56,18 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) // Current storyteller var/datum/dynamic_storyteller/storyteller = null // Threat logging vars + /// Starting threat level, for things that increase it but can bring it back down. + var/initial_threat_level = 0 /// Target threat level right now. Events and antags will try to keep the round at this level. var/threat_level = 0 /// The current antag threat. Recalculated every time a ruletype starts or ends. var/threat = 0 - /// Starting threat level, for things that increase it but can bring it back down. - var/initial_threat_level = 0 + /// Threat average over the course of the round, for endgame logs. + var/threat_average = 0 + /// Number of times threat average has been calculated, for calculating above. + var/threat_average_weight = 0 + /// Last time a threat average sample was taken. Used for weighting the rolling average. + var/last_threat_sample_time = 0 /// Things that cause a rolling threat adjustment to be displayed at roundend. var/list/threat_tallies = list() /// Running information about the threat. Can store text or datum entries. @@ -158,7 +166,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) dat += "Current threat: [threat] \[Adjust\] \[View Log\]
    " dat += "
    " - dat += "Storyteller: [storyteller.name]
    " + dat += "Storyteller: [storyteller.name]
    " dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
    " dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
    " dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
    " @@ -199,7 +207,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) if(threatadd > 0) create_threat(threatadd) else - spend_threat(-threatadd) + remove_threat(threatadd) else if (href_list["injectlate"]) latejoin_injection_cooldown = 0 forced_injection = TRUE @@ -216,6 +224,15 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) show_threatlog(usr) else if (href_list["stacking_limit"]) GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num + else if (href_list["change_storyteller"]) + var/list/choices = list() + for(var/T in config.storyteller_cache) + var/datum/dynamic_storyteller/S = T + choices[initial(S.name)] = T + var/selected_storyteller = choices[input("Select storyteller:", "Storyteller", storyteller.name) as null|anything in choices] + storyteller = new selected_storyteller + storyteller.on_start() + message_admins("[key_name(usr)] changed the storyteller to [storyteller].", 1) admin_panel() // Refreshes the window @@ -237,10 +254,11 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) /datum/game_mode/dynamic/send_intercept() . = "Central Command Status Summary
    " switch(round(threat_level)) - if(0 to 20) + if(-INFINITY to 20) . += "Peaceful Waypoint
    " . += "Your station orbits deep within controlled, core-sector systems and serves as a waypoint for routine traffic through Nanotrasen's trade empire. Due to the combination of high security, interstellar traffic, and low strategic value, it makes any direct threat of violence unlikely. Your primary enemies will be incompetence and bored crewmen: try to organize team-building events to keep staffers interested and productive. However, even deep in our territory there may be subversive elements, especially for such a high-value target as your station. Keep an eye out, but don't expect much trouble." set_security_level(SEC_LEVEL_GREEN) + station_goals.len = 0 for(var/T in subtypesof(/datum/station_goal)) var/datum/station_goal/G = new T if(!(G in station_goals)) @@ -251,6 +269,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) . += "Core Territory
    " . += "Your station orbits within reliably mundane, secure space. Although Nanotrasen has a firm grip on security in your region, the valuable resources and strategic position aboard your station make it a potential target for infiltrations. Monitor crew for non-loyal behavior, but expect a relatively tame shift free of large-scale destruction. We expect great things from your station." set_security_level(SEC_LEVEL_GREEN) + station_goals.len = 0 for(var/T in subtypesof(/datum/station_goal)) var/datum/station_goal/G = new T if(!(G in station_goals)) @@ -267,7 +286,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) . += "Black Orbit
    " . += "As part of a mandatory security protocol, we are required to inform you that as a result of your orbital pattern directly behind an astrological body (oriented from our nearest observatory), your station will be under decreased monitoring and support. It is anticipated that your extreme location and decreased surveillance could pose security risks. Avoid unnecessary risks and attempt to keep your station in one piece." set_security_level(SEC_LEVEL_AMBER) - if(96 to 100) + if(96 to INFINITY) . += "Impending Doom
    " . += "Your station is somehow in the middle of hostile territory, in clear view of any enemy of the corporation. Your likelihood to survive is low, and station destruction is expected and almost inevitable. Secure any sensitive material and neutralize any enemy you will come across. It is important that you at least try to maintain the station.
    " . += "Good luck." @@ -338,6 +357,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) SSblackbox.record_feedback("tally","dynamic_threat",peaceful_percentage,"Percent of same-vote rounds that are more peaceful") /datum/game_mode/dynamic/can_start() + if(GLOB.dynamic_forced_storyteller) + GLOB.dynamic_storyteller_type = GLOB.dynamic_forced_storyteller storyteller = new GLOB.dynamic_storyteller_type // this is where all the initialization happens storyteller.on_start() SSblackbox.record_feedback("text","dynamic_storyteller",1,storyteller.name) @@ -433,6 +454,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) if(!drafted_rules.len) message_admins("Not enough threat level for roundstart antags!") log_game("DYNAMIC: Not enough threat level for roundstart antags!") + midround_injection_cooldown = round((midround_injection_cooldown + world.time) / 2, 1) + latejoin_injection_cooldown = round((latejoin_injection_cooldown + world.time) / 2, 1) var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1) extra_rulesets_amount = 0 if (GLOB.dynamic_classic_secret) @@ -490,7 +513,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) starting_rule = pickweight(drafted_rules) // Check if the ruleset is highlander and if a highlander ruleset has been executed else if(starting_rule.flags & HIGHLANDER_RULESET) // Should already be filtered out, but making sure. Check filtering at end of proc if reported. - if(threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(threat_level <= GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) if(highlander_executed) drafted_rules -= starting_rule if(drafted_rules.len <= 0) @@ -713,8 +736,19 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) if (O.started_as_observer) // Observers current_players[CURRENT_OBSERVERS].Add(M) continue - current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow) + if(!M.voluntary_ghosted) + current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow) threat = storyteller.calculate_threat() + added_threat + if(threat_average_weight) + var/cur_sample_weight = world.time - last_threat_sample_time + threat_average = ((threat_average * threat_average_weight) + (threat * cur_sample_weight)) / (threat_average_weight + cur_sample_weight) + threat_average_weight += cur_sample_weight + last_threat_sample_time = world.time + else + threat_average = threat + threat_average_weight++ + last_threat_sample_time = world.time + /// Removes type from the list /datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type) for(var/I in type_list) @@ -805,3 +839,11 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) return RULE_OF_THREE(40, 20, x) + 50 if (20 to INFINITY) return rand(90, 100) + +/datum/game_mode/dynamic/ghost_info() + . = list() + . += "Current threat: [threat]" + . += "Target threat: [threat_level]" + . += "Storyteller: [storyteller.name]
    " + . += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
    " + . += "On average, [peaceful_percentage]% of the rounds are more peaceful.
    " diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index cec6f31e99..da33da5f43 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -222,6 +222,26 @@ message_admins("[M.name] was made into a bloodsucker by dynamic.") return TRUE +////////////////////////////////////////////// +// // +// CHANGELINGS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/latejoin/changeling + name = "Changeling Infiltrator" + config_tag = "latejoin_changeling" + antag_flag = ROLE_CHANGELING + antag_datum = /datum/antagonist/changeling + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 1 + weight = 3 + cost = 15 + requirements = list(101,101,101,101,101,101,101,101,101,101) + property_weights = list("trust" = -2, "valid" = 2) + high_population_requirement = 101 + ////////////////////////////////////////////// // // // COLLECTOR // diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index b746100f27..6a7671cd5b 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -34,8 +34,7 @@ living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) - var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(list(/datum/element/ghost_role_eligibility)) - ghost_eligible = trim_list(eligibility.get_all_ghost_role_eligible()) + ghost_eligible = trim_list(get_all_ghost_role_eligible()) /datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) var/list/trimmed_list = L.Copy() @@ -106,7 +105,7 @@ if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles) && (!(M in candidates) || (M.mind.assigned_role in restricted_roles))) job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it - var/threat = CLAMP(round(mode.threat_level/10),1,10) + var/threat = clamp(round(mode.threat_level/10),1,10) if (job_check < required_enemies[threat]) SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles") return FALSE @@ -643,6 +642,9 @@ for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) spawn_locs += L.loc + for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc if(!spawn_locs.len) return FALSE spawn_loc = pick(spawn_locs) @@ -672,7 +674,7 @@ message_admins("[ADMIN_LOOKUPFLW(Ninja)] has been made into a ninja by dynamic.") log_game("[key_name(Ninja)] was spawned as a ninja by dynamic.") return Ninja - + /datum/dynamic_ruleset/midround/from_ghosts/ninja/finish_setup(mob/new_character, index) return diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index a7fc9b86ce..edaadeae1c 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -789,7 +789,7 @@ if (prob(meteorminutes/2)) wavetype = GLOB.meteors_catastrophic - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) + var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index 35d5a04488..561b38fde1 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -11,6 +11,7 @@ WAROPS_ALWAYS_ALLOWED: Can always do warops, regardless of threat level. USE_PREF_WEIGHTS: Will use peoples' preferences to change the threat centre. FORCE_IF_WON: If this mode won the vote, forces it + USE_PREV_ROUND_WEIGHTS: Changes its threat centre based on the average chaos of previous rounds. */ var/flags = 0 var/dead_player_weight = 1 // How much dead players matter for threat calculation @@ -21,11 +22,11 @@ var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic. /** -Property weights are: +Property weights are: "story_potential" -- essentially how many different ways the antag can be played. "trust" -- How much it makes the crew trust each other. Negative values means they're suspicious. Team antags are like this. "chaos" -- How chaotic it makes the round. Has some overlap with "valid" and somewhat contradicts "extended". -"valid" -- How likely the non-antag-enemy crew are to get involved, e.g. nukies encouraging the warden to +"valid" -- How likely the non-antag-enemy crew are to get involved, e.g. nukies encouraging the warden to let everyone into the armory, wizard moving around and being a nuisance, nightmare busting lights. "extended" -- How much the antag is conducive to a long round. Nukies and cults are bad for this; Wizard is less bad; and so on. "conversion" -- Basically a bool. Conversion antags, well, convert. It's its own class for a good reason. @@ -33,13 +34,13 @@ Property weights are: /datum/dynamic_storyteller/proc/start_injection_cooldowns() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) - mode.latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time + mode.latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max) - mode.midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time - + mode.midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time + var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - mode.event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) + mode.event_injection_cooldown = (round(clamp(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) /datum/dynamic_storyteller/proc/calculate_threat() var/threat = 0 @@ -92,19 +93,21 @@ Property weights are: mean += 5 if(voters) GLOB.dynamic_curve_centre += (mean/voters) + if(flags & USE_PREV_ROUND_WEIGHTS) + GLOB.dynamic_curve_centre += (50 - SSpersistence.average_dynamic_threat) / 10 GLOB.dynamic_forced_threat_level = forced_threat_level /datum/dynamic_storyteller/proc/get_midround_cooldown() var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - return round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + return round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) /datum/dynamic_storyteller/proc/get_event_cooldown() var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - return round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + return round(clamp(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) /datum/dynamic_storyteller/proc/get_latejoin_cooldown() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - return round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + return round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) /datum/dynamic_storyteller/proc/get_injection_chance(dry_run = FALSE) if(mode.forced_injection) @@ -112,7 +115,7 @@ Property weights are: return 100 var/threat_perc = mode.threat/mode.threat_level - return round(max(0,100*(1-(threat_perc*threat_perc*threat_perc)))) + return clamp(round(100*(1-(threat_perc*threat_perc))**2,1),0,100) /datum/dynamic_storyteller/proc/roundstart_draft() var/list/drafted_rules = list() @@ -141,7 +144,7 @@ Property weights are: if(!(rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to - pick this particular ruleset. + pick this particular ruleset. Let's use a toy example: there's 60 threat level and 10 threat spent. We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets. Ruleset 1 has 30 cost, ruleset 2 has 5 cost. @@ -149,7 +152,7 @@ Property weights are: is 2.26 times as likely to be picked, all other things considered. Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight. */ - threat_weight = 1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)) + threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) @@ -206,10 +209,10 @@ Property weights are: weight = 1 event_frequency_lower = 2 MINUTES event_frequency_upper = 10 MINUTES - flags = WAROPS_ALWAYS_ALLOWED - min_players = 40 + flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON + min_players = 30 var/refund_cooldown = 0 - + /datum/dynamic_storyteller/chaotic/do_process() if(refund_cooldown < world.time) mode.create_threat(20) @@ -218,7 +221,7 @@ Property weights are: /datum/dynamic_storyteller/chaotic/get_midround_cooldown() return ..() / 4 - + /datum/dynamic_storyteller/chaotic/get_latejoin_cooldown() return ..() / 4 @@ -229,8 +232,8 @@ Property weights are: curve_centre = 2 curve_width = 1.5 weight = 2 - min_players = 30 - flags = WAROPS_ALWAYS_ALLOWED + min_players = 20 + flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS property_weights = list("valid" = 3, "trust" = 5) /datum/dynamic_storyteller/team/get_injection_chance(dry_run = FALSE) @@ -268,9 +271,6 @@ Property weights are: /datum/dynamic_storyteller/random/get_injection_chance() return 50 // i would do rand(0,100) but it's actually the same thing when you do the math -/datum/dynamic_storyteller/random/calculate_threat() - return 0 // what IS threat - /datum/dynamic_storyteller/random/roundstart_draft() var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules) @@ -324,19 +324,20 @@ Property weights are: desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies. Has a buildup-climax-falling action threat curve." weight = 2 curve_width = 2 + flags = USE_PREV_ROUND_WEIGHTS property_weights = list("story_potential" = 2) /datum/dynamic_storyteller/story/calculate_threat() var/current_time = (world.time / SSautotransfer.targettime)*180 mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.25),0.1) - ..() + return ..() /datum/dynamic_storyteller/classic name = "Classic" config_tag = "classic" desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight." - flags = USE_PREF_WEIGHTS + flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS /datum/dynamic_storyteller/suspicion name = "Intrigue" @@ -345,6 +346,7 @@ Property weights are: weight = 2 curve_width = 2 dead_player_weight = 2 + flags = USE_PREV_ROUND_WEIGHTS property_weights = list("trust" = -3) /datum/dynamic_storyteller/liteextended @@ -356,7 +358,7 @@ Property weights are: flags = NO_ASSASSIN | FORCE_IF_WON weight = 1 dead_player_weight = 5 - property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10) + property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10) /datum/dynamic_storyteller/no_antag name = "Extended" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 5affeba6d6..a7ccada9f2 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -272,7 +272,7 @@ reports += config.mode_reports[config_tag] Count++ for(var/i in Count to rand(3,5)) //Between three and five wrong entries on the list. - var/false_report_type = pickweightAllowZero(report_weights) + var/false_report_type = pickweight(report_weights, 0) report_weights[false_report_type] = 0 //Make it so the same false report won't be selected twice reports += config.mode_reports[false_report_type] @@ -417,7 +417,7 @@ if(player.assigned_role == job) candidates -= player - if(candidates.len < recommended_enemies) + if(candidates.len < recommended_enemies && CONFIG_GET(keyed_list/force_antag_count)[config_tag]) for(var/mob/dead/new_player/player in players) if(player.client && player.ready == PLAYER_READY_TO_PLAY) if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one @@ -604,3 +604,7 @@ /// Mode specific admin panel. /datum/game_mode/proc/admin_panel() return + +/// Mode specific info for ghost game_info +/datum/game_mode/proc/ghost_info() + return diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm index 858c10c46c..db145ffacc 100644 --- a/code/game/gamemodes/gangs/dominator.dm +++ b/code/game/gamemodes/gangs/dominator.dm @@ -48,9 +48,6 @@ /obj/machinery/dominator/hulk_damage() return (max_integrity - integrity_failure) / DOM_HULK_HITS_REQUIRED -/obj/machinery/dominator/tesla_act() - qdel(src) - /obj/machinery/dominator/update_icon() cut_overlays() if(stat & BROKEN) @@ -148,9 +145,9 @@ new /obj/item/stack/sheet/plasteel(src.loc) qdel(src) -/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user) +/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) add_fingerprint(user) - ..() + return ..() /obj/machinery/dominator/attack_hand(mob/user) if(operating || (stat & BROKEN)) @@ -229,7 +226,7 @@ if(!was_stranded) priority_announce("All hostile activity within station systems has ceased.","Network Alert") - if(get_security_level() == "delta") + if(NUM2SECLEVEL(GLOB.security_level) == "delta") set_security_level("red") SSshuttle.clearHostileEnvironment(src) @@ -243,4 +240,4 @@ #undef DOM_BLOCKED_SPAM_CAP #undef DOM_REQUIRED_TURFS -#undef DOM_HULK_HITS_REQUIRED \ No newline at end of file +#undef DOM_HULK_HITS_REQUIRED diff --git a/code/game/gamemodes/gangs/gang.dm b/code/game/gamemodes/gangs/gang.dm index df94d68688..a766dda57c 100644 --- a/code/game/gamemodes/gangs/gang.dm +++ b/code/game/gamemodes/gangs/gang.dm @@ -32,7 +32,7 @@ /datum/antagonist/gang/farewell() if(ishuman(owner.current)) owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current) - to_chat(owner, "You are no longer a gangster!") + to_chat(owner, "You are no longer a gangster! Your memories from the time you were in a gang are hazy... You don't seem to be able to recall the names of your previous allies, not even your bosses...") /datum/antagonist/gang/on_gain() if(!gang) diff --git a/code/game/gamemodes/gangs/gang_decals.dm b/code/game/gamemodes/gangs/gang_decals.dm index 7aaed769d9..a37b4cb63b 100644 --- a/code/game/gamemodes/gangs/gang_decals.dm +++ b/code/game/gamemodes/gangs/gang_decals.dm @@ -10,7 +10,7 @@ /obj/effect/decal/cleanable/crayon/gang icon = 'icons/effects/crayondecal.dmi' layer = ABOVE_NORMAL_TURF_LAYER //Harder to hide - plane = GAME_PLANE + plane = ABOVE_WALL_PLANE do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/team/gang/gang diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm index d3ccb5a355..7d6ecd00f6 100644 --- a/code/game/gamemodes/gangs/gang_items.dm +++ b/code/game/gamemodes/gangs/gang_items.dm @@ -288,7 +288,7 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m name = "Fragmentation Grenade" id = "frag nade" cost = 5 - item_path = /obj/item/grenade/syndieminibomb/concussion/frag + item_path = /obj/item/grenade/frag /datum/gang_item/equipment/implant_breaker name = "Implant Breaker" diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 7857eb8253..afeebb770b 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -25,7 +25,7 @@ if (prob(meteorminutes/2)) wavetype = GLOB.meteors_catastrophic - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) + var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 4497f9faef..3b95b1281f 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -19,6 +19,15 @@ GLOBAL_LIST_EMPTY(objectives) if(text) explanation_text = text +/datum/objective/Destroy(force, ...) + GLOB.objectives -= src + if(owner) + for(var/datum/antagonist/A in owner.antag_datums) + A.objectives -= src + if(team) + team.objectives -= src + . = ..() + /datum/objective/proc/get_owners() // Combine owner and team into a single list. . = (team && team.members) ? team.members.Copy() : list() if(owner) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2e5dae3e04..131e61c674 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -36,6 +36,7 @@ targetitem = /obj/item/gun/energy/e_gun/hos difficulty = 10 excludefromjob = list("Head Of Security") + altitems = list(/obj/item/gun/ballistic/revolver/mws, /obj/item/choice_beacon/hosgun) //We now look for eather the alt verson of the hos gun or the beacon picker. /datum/objective_item/steal/handtele name = "a hand teleporter." diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm index d2cdd2e029..f08d84eae2 100644 --- a/code/game/gamemodes/objective_sabotage.dm +++ b/code/game/gamemodes/objective_sabotage.dm @@ -90,7 +90,10 @@ sabotage_type = "cloner" /datum/sabotage_objective/cloner/check_conditions() - return !(locate(/obj/machinery/clonepod) in GLOB.machines) + for(var/obj/machinery/clonepod/cloner in GLOB.machines) + if(is_station_level(cloner.z)) + return FALSE + return TRUE /datum/sabotage_objective/ai_law name = "Upload a hacked law to the AI." diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 74554ac9f8..9eed18d906 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -70,7 +70,7 @@ /datum/game_mode/revolution/post_setup() var/list/heads = SSjob.get_living_heads() var/list/sec = SSjob.get_living_sec() - var/weighted_score = CLAMP(round(heads.len - ((3 - sec.len) / 3)), 1, max_headrevs) + var/weighted_score = clamp(round(heads.len - ((3 - sec.len) / 3)), 1, max_headrevs) for(var/datum/mind/rev_mind in headrev_candidates) //People with return to lobby may still be in the lobby. Let's pick someone else in that case. if(isnewplayer(rev_mind.current)) diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index e1fbb636c8..e97d276296 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -2,8 +2,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) -/mob - var/datum/hSB/sandbox = null + /mob/proc/CanBuild() sandbox = new/datum/hSB sandbox.owner = src.ckey diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 42904383bb..5402c8f41e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -26,6 +26,8 @@ var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning var/enter_message = "You feel cool air surround you. You go numb as your senses turn inward." + payment_department = ACCOUNT_MED + fair_market_price = 5 /obj/machinery/sleeper/Initialize() . = ..() @@ -35,6 +37,11 @@ reset_chem_buttons() RefreshParts() add_inital_chems() + new_occupant_dir = dir + +/obj/machinery/sleeper/setDir(newdir) + . = ..() + new_occupant_dir = dir /obj/machinery/sleeper/on_deconstruction() var/obj/item/reagent_containers/sleeper_buffer/buffer = new (loc) @@ -205,6 +212,13 @@ ui = new(user, src, ui_key, "sleeper", name, 550, 700, master_ui, state) ui.open() +/obj/machinery/sleeper/process() + ..() + check_nap_violations() + +/obj/machinery/sleeper/nap_violation(mob/violator) + open_machine() + /obj/machinery/sleeper/ui_data() var/list/data = list() var/chemical_list = list() @@ -250,7 +264,7 @@ data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) - + if(mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) chemical_list += list(list("name" = R.name, "volume" = R.volume)) @@ -290,7 +304,7 @@ if(..()) return var/mob/living/mob_occupant = occupant - + check_nap_violations() switch(action) if("door") if(state_open) @@ -420,3 +434,45 @@ /obj/machinery/sleeper/old icon_state = "oldpod" + +/obj/machinery/sleeper/party + name = "party pod" + desc = "'Sleeper' units were once known for their healing properties, until a lengthy investigation revealed they were also dosing patients with deadly lead acetate. This appears to be one of those old 'sleeper' units repurposed as a 'Party Pod'. It’s probably not a good idea to use it." + icon_state = "partypod" + idle_power_usage = 3000 + circuit = /obj/item/circuitboard/machine/sleeper/party + var/leddit = FALSE //Get it like reddit and lead alright fine + ui_x = 310 + ui_y = 400 + + controls_inside = TRUE + possible_chems = list( + list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/laughter), + list(/datum/reagent/spraytan,/datum/reagent/barbers_aid), + list(/datum/reagent/colorful_reagent,/datum/reagent/hair_dye), + list(/datum/reagent/drug/space_drugs,/datum/reagent/baldium) + )//Exclusively uses non-lethal, "fun" chems. At an obvious downside. + var/spray_chems = list( + /datum/reagent/spraytan, /datum/reagent/hair_dye, /datum/reagent/baldium, /datum/reagent/barbers_aid + )//Chemicals that need to have a touch or vapor reaction to be applied, not the standard chamber reaction. + enter_message = "You're surrounded by some funky music inside the chamber. You zone out as you feel waves of krunk vibe within you." + +/obj/machinery/sleeper/party/inject_chem(chem, mob/user) + if(leddit) + occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, 4) //You're injecting chemicals into yourself from a recalled, decrepit medical machine. What did you expect? + else if (prob(20)) + occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, rand(1,3)) + if(chem in spray_chems) + var/datum/reagents/holder = new() + holder.add_reagent(chem_buttons[chem], 10) //I hope this is the correct way to do this. + holder.reaction(occupant, VAPOR, 0) + holder.trans_to(occupant, 10) + playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6) + if(user) + log_combat(user, occupant, "sprayed [chem] into", addition = "via [src]") + return TRUE + ..() + +/obj/machinery/sleeper/party/emag_act(mob/user) + ..() + leddit = TRUE diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 995d11acb7..096b40ddb7 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -92,6 +92,8 @@ Class Procs: pressure_resistance = 15 max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. + flags_ricochet = RICOCHET_HARD + ricochet_chance_mod = 0.3 anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT @@ -110,7 +112,8 @@ Class Procs: var/state_open = FALSE var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures. var/list/occupant_typecache //if set, turned into typecache in Initialize, other wise, defaults to mob/living typecache - var/atom/movable/occupant = null + var/atom/movable/occupant + var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine. var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created // For storing and overriding ui id and dimensions @@ -121,6 +124,10 @@ Class Procs: var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE + var/fair_market_price = 69 + var/market_verb = "Customer" + var/payment_department = ACCOUNT_ENG + /obj/machinery/Initialize() if(!armor) armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) @@ -213,6 +220,7 @@ Class Procs: if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled)) occupant = target target.forceMove(src) + target.setDir(new_occupant_dir) updateUsrDialog() update_icon() @@ -248,6 +256,36 @@ Class Procs: return FALSE return TRUE +/obj/machinery/proc/check_nap_violations() + if(!SSeconomy.full_ancap) + return TRUE + if(occupant && !state_open) + if(ishuman(occupant)) + var/mob/living/carbon/human/H = occupant + var/obj/item/card/id/I = H.get_idcard() + if(I) + var/datum/bank_account/insurance = I.registered_account + if(!insurance) + say("[market_verb] NAP Violation: No bank account found.") + nap_violation() + return FALSE + else + if(!insurance.adjust_money(-fair_market_price)) + say("[market_verb] NAP Violation: Unable to pay.") + nap_violation() + return FALSE + var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) + if(D) + D.adjust_money(fair_market_price) + else + say("[market_verb] NAP Violation: No ID card found.") + nap_violation() + return FALSE + return TRUE + +/obj/machinery/proc/nap_violation(mob/violator) + return + //////////////////////////////////////////////////////////////////////////////////////////// //Return a non FALSE value to interrupt attack_hand propagation to subtypes. @@ -486,11 +524,11 @@ Class Procs: /obj/machinery/proc/can_be_overridden() . = 1 -/obj/machinery/tesla_act(power, tesla_flags, shocked_objects) - ..() - if(prob(85) && (tesla_flags & TESLA_MACHINE_EXPLOSIVE)) +/obj/machinery/zap_act(power, zap_flags, shocked_objects) + . = ..() + if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE)) explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE) - if(tesla_flags & TESLA_OBJ_DAMAGE) + else if(zap_flags & ZAP_OBJ_DAMAGE) take_damage(power/2000, BURN, "energy") if(prob(40)) emp_act(EMP_LIGHT) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6fa7fa30c0..4eeb6b8b0f 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -17,7 +17,6 @@ var/list/L = list() var/list/LL = list() var/hacked = FALSE - var/hackable = TRUE var/disabled = 0 var/shocked = FALSE var/hack_wire @@ -28,11 +27,13 @@ var/prod_coeff = 1 var/datum/design/being_built - var/datum/techweb/stored_research var/list/datum/design/matching_designs var/selected_category var/screen = 1 + var/base_price = 25 + var/hacked_price = 50 + var/datum/techweb/specialized/autounlocking/stored_research = /datum/techweb/specialized/autounlocking/autolathe var/list/categories = list( "Tools", "Electronics", @@ -45,9 +46,7 @@ "Dinnerware", "Imported" ) - -/obj/machinery/autolathe/Initialize() - var/static/list/allowed_types = list( + var/list/allowed_materials = list( /datum/material/iron, /datum/material/glass, /datum/material/gold, @@ -61,12 +60,18 @@ /datum/material/runite, /datum/material/plastic, /datum/material/adamantine, - /datum/material/mythril + /datum/material/mythril, + /datum/material/wood ) - AddComponent(/datum/component/material_container, allowed_types, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) + + /// Base print speed + var/base_print_speed = 10 + +/obj/machinery/autolathe/Initialize() + AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) - stored_research = new /datum/techweb/specialized/autounlocking/autolathe + stored_research = new stored_research matching_designs = list() /obj/machinery/autolathe/Destroy() @@ -91,7 +96,7 @@ if(AUTOLATHE_SEARCH_MENU) dat = search_win(user) - var/datum/browser/popup = new(user, "autolathe", name, 400, 500) + var/datum/browser/popup = new(user, name, name, 400, 500) popup.set_content(dat) popup.open() @@ -169,7 +174,7 @@ var/multiplier = text2num(href_list["multiplier"]) var/is_stack = ispath(being_built.build_path, /obj/item/stack) - multiplier = CLAMP(multiplier,1,50) + multiplier = clamp(multiplier,1,50) ///////////////// @@ -206,7 +211,7 @@ busy = TRUE use_power(power) icon_state = "autolathe_n" - var/time = is_stack ? 32 : 32*coeff*multiplier + var/time = is_stack ? 10 : base_print_speed * coeff * multiplier addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time) else to_chat(usr, "Not enough materials for this operation.") @@ -254,10 +259,12 @@ T += MB.rating*75000 var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = T - T=1.2 + var/manips = 0 + var/total_manip_rating = 0 for(var/obj/item/stock_parts/manipulator/M in component_parts) - T -= M.rating*0.2 - prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 + total_manip_rating += M.rating + manips++ + prod_coeff = STANDARD_PART_LEVEL_LATHE_COEFFICIENT(total_manip_rating / (manips? manips : 1)) /obj/machinery/autolathe/examine(mob/user) . += ..() @@ -420,11 +427,11 @@ /obj/machinery/autolathe/proc/adjust_hacked(state) hacked = state - if(!hackable && hacked) - return for(var/id in SSresearch.techweb_designs) var/datum/design/D = SSresearch.techweb_design_by_id(id) - if((D.build_type & AUTOLATHE) && ("hacked" in D.category)) + if(D.build_type & stored_research.design_autounlock_skip_types) + continue + if((D.build_type & stored_research.design_autounlock_buildtypes) && ("hacked" in D.category)) if(hacked) stored_research.add_design(D) else @@ -436,11 +443,35 @@ /obj/machinery/autolathe/secure name = "secured autolathe" - desc = "An autolathe reprogrammed with security protocols to prevent hacking." - hackable = FALSE + desc = "It produces items using metal and glass. This model was reprogrammed without some of the more hazardous designs." circuit = /obj/item/circuitboard/machine/autolathe/secure + stored_research = /datum/techweb/specialized/autounlocking/autolathe/public + base_print_speed = 20 -//Called when the object is constructed by an autolathe -//Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes -/obj/item/proc/autolathe_crafted(obj/machinery/autolathe/A) - return +/obj/machinery/autolathe/toy + name = "autoylathe" + desc = "It produces toys using plastic, metal and glass." + circuit = /obj/item/circuitboard/machine/autolathe/toy + + stored_research = /datum/techweb/specialized/autounlocking/autolathe/toy + categories = list( + "Toys", + "Figurines", + "Pistols", + "Rifles", + "Heavy", + "Melee", + "Armor", + "Adult", + "Misc", + "Imported" + ) + allowed_materials = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/plastic + ) + +/obj/machinery/autolathe/toy/hacked/Initialize() + . = ..() + adjust_hacked(TRUE) diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 41867a8520..2b683f16a3 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -8,6 +8,7 @@ var/obj/item/radio/radio var/radio_channel = RADIO_CHANNEL_COMMON var/minimum_time_between_warnings = 400 + var/syphoning_credits = 0 /obj/machinery/computer/bank_machine/Initialize() . = ..() @@ -25,9 +26,14 @@ if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/C = I value = C.value * C.amount + else if(istype(I, /obj/item/holochip)) + var/obj/item/holochip/H = I + value = H.credits if(value) - SSshuttle.points += value - to_chat(user, "You deposit [I]. The station now has [SSshuttle.points] credits.") + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(value) + to_chat(user, "You deposit [I]. The Cargo Budget is now [D.account_balance] cr.") qdel(I) return return ..() @@ -38,14 +44,16 @@ if(siphoning) if (stat & (BROKEN|NOPOWER)) say("Insufficient power. Halting siphon.") - siphoning = FALSE - if(SSshuttle.points < 200) - say("Station funds depleted. Halting siphon.") - siphoning = FALSE - else - new /obj/item/stack/spacecash/c200(drop_location()) // will autostack - playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1) - SSshuttle.points -= 200 + end_syphon() + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(!D.has_money(200)) + say("Cargo budget depleted. Halting siphon.") + end_syphon() + return + + playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1) + syphoning_credits += 200 + D.adjust_money(-200) if(next_warning < world.time && prob(15)) var/area/A = get_area(loc) var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" @@ -61,7 +69,8 @@ /obj/machinery/computer/bank_machine/ui_data(mob/user) var/list/data = list() - data["current_balance"] = SSshuttle.points + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + data["current_balance"] = D.account_balance data["siphoning"] = siphoning data["station_name"] = station_name() @@ -78,5 +87,10 @@ . = TRUE if("halt") say("Station credit withdrawal halted.") - siphoning = FALSE + end_syphon() . = TRUE + +/obj/machinery/computer/bank_machine/proc/end_syphon() + siphoning = FALSE + new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot + syphoning_credits = 0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index ad3dd5d720..71de04ee99 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -16,7 +16,13 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/machinery/button/Initialize(mapload, ndir = 0, built = 0) + if(istext(id) && mapload && id[1] == "!") + id = SSmapping.get_obfuscated_id(id) . = ..() + var/turf/T = get_turf_pixel(src) + if(iswallturf(T)) + plane = ABOVE_WALL_PLANE + if(built) setDir(ndir) pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) @@ -24,7 +30,6 @@ panel_open = TRUE update_icon() - if(!built && !device && device_type) device = new device_type(src) @@ -260,6 +265,11 @@ req_access = list() id = 1 +/obj/machinery/button/electrochromatic + name = "window dim control" + desc = "Controls linked electrochromatic windows" + device_type = /obj/item/assembly/control/electrochromatic + /obj/item/wallframe/button name = "button frame" desc = "Used for building buttons." diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index c8b8e7c9cd..e386674b9e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -381,14 +381,12 @@ for(var/obj/machinery/camera/C in oview(4, M)) if(C.can_use()) // check if camera disabled return C - break return null /proc/near_range_camera(var/mob/M) for(var/obj/machinery/camera/C in range(4, M)) if(C.can_use()) // check if camera disabled return C - break return null diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 1766391709..b6af0600e4 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -48,8 +48,7 @@ if(2) // State 2 if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if(C.use(2)) + if(W.use_tool(src, user, 0, 2)) to_chat(user, "You add wires to the assembly.") state = 3 else diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 021232f435..33e250fa59 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -75,7 +75,7 @@ // UPGRADE PROCS /obj/machinery/camera/proc/upgradeEmpProof() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/plasma(assembly)) upgrades |= CAMERA_UPGRADE_EMP_PROOF diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 648c227c0a..cfe9d14663 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -37,6 +37,9 @@ var/list/unattached_flesh var/flesh_number = 0 + var/datum/bank_account/current_insurance + fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. + payment_department = ACCOUNT_MED /obj/machinery/clonepod/Initialize() . = ..() @@ -69,7 +72,7 @@ for(var/obj/item/stock_parts/manipulator/P in component_parts) speed_coeff += (P.rating / 2) speed_coeff = max(1, speed_coeff) - heal_level = CLAMP((efficiency * 10) + 10, MINIMUM_HEAL_LEVEL, 100) + heal_level = clamp((efficiency * 10) + 10, MINIMUM_HEAL_LEVEL, 100) //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. @@ -131,7 +134,7 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) if(panel_open) return FALSE if(mess || attempting) @@ -144,6 +147,8 @@ return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. return FALSE + if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker + return FALSE if(clonemind.active) //somebody is using that mind if( ckey(clonemind.key)!=ckey ) return FALSE @@ -159,9 +164,7 @@ mess = TRUE update_icon() return FALSE - if(isvamp(clonemind)) //If the mind is a bloodsucker - return FALSE - + current_insurance = insurance attempting = TRUE //One at a time!! countdown.start() @@ -224,15 +227,29 @@ connected_message("Clone Ejected: Loss of power.") else if(mob_occupant && (mob_occupant.loc == src)) - if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. - connected_message("Clone Rejected: Deceased.") + if(SSeconomy.full_ancap) + if(!current_insurance) + go_out() + connected_message("Clone Ejected: No bank account.") + if(internal_radio) + SPEAK("The cloning of [mob_occupant.real_name] has been terminated due to no bank account to draw payment from.") + else if(!current_insurance.adjust_money(-fair_market_price)) + go_out() + connected_message("Clone Ejected: Out of Money.") + if(internal_radio) + SPEAK("The cloning of [mob_occupant.real_name] has been ended prematurely due to being unable to pay.") + else + var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) + if(D) + D.adjust_money(fair_market_price) + if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") if(internal_radio) SPEAK("The cloning has been \ aborted due to unrecoverable tissue failure.") go_out() mob_occupant.copy_from_prefs_vr() - else if(mob_occupant.cloneloss > (100 - heal_level)) + else if(mob_occupant && mob_occupant.cloneloss > (100 - heal_level)) mob_occupant.Unconscious(80) var/dmg_mult = CONFIG_GET(number/damage_multiplier) //Slowly get that clone healed and finished. @@ -259,7 +276,7 @@ use_power(7500) //This might need tweaking. - else if((mob_occupant.cloneloss <= (100 - heal_level))) + else if((mob_occupant && mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") if(internal_radio) SPEAK("The cloning cycle is complete.") @@ -368,7 +385,7 @@ if(!mob_occupant) return - + current_insurance = null REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) REMOVE_TRAIT(mob_occupant, TRAIT_MUTATION_STASIS, CLONING_POD_TRAIT) REMOVE_TRAIT(mob_occupant, TRAIT_STABLELIVER, CLONING_POD_TRAIT) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 6d22f9d6c8..eae2d5fa5b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -150,7 +150,7 @@ return log_activity("changed greater than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = CLAMP(new_filter, 0, 100) + new_filter = clamp(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) result_filters["Charge Above"] = new_filter if(href_list["below_filter"]) @@ -160,7 +160,7 @@ return log_activity("changed lesser than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = CLAMP(new_filter, 0, 100) + new_filter = clamp(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) result_filters["Charge Below"] = new_filter if(href_list["access_filter"]) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index b561224668..2d9880578c 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -55,7 +55,7 @@ /obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK, /obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK, /obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK, - /obj/item/clothing/gloves/rapid/hug = ARCADE_WEIGHT_TRICK, + /obj/item/clothing/gloves/fingerless/pugilist/hug = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK, diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index 3e32c4ceeb..ad325455ad 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -159,6 +159,8 @@ if(CHECK_BITFIELD(obj_flags, EMAGGED) && !exploding_hell) exploding_hell = TRUE explode_EVERYTHING() + if(QDELETED(src)) + return if(mine_sound) switch(rand(1,3)) //Play every time a mine is hit if(1) @@ -306,12 +308,12 @@ var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE - new_rows = CLAMP(new_rows + 1, 4, 30) + new_rows = clamp(new_rows + 1, 4, 30) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE - new_columns = CLAMP(new_columns + 1, 4, 50) + new_columns = clamp(new_columns + 1, 4, 50) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) var/grid_area = (new_rows - 1) * (new_columns - 1) var/lower_limit = round(grid_area*0.156) @@ -322,7 +324,7 @@ playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) rows = new_rows columns = new_columns - mine_limit = CLAMP(new_mine_limit, lower_limit, upper_limit) + mine_limit = clamp(new_mine_limit, lower_limit, upper_limit) return TRUE /obj/machinery/computer/arcade/minesweeper/proc/make_mines(var/reset_everything) @@ -367,10 +369,10 @@ var/row_limit = rows-1 var/column_limit = columns-1 var/mine_limit_v2 = mine_limit - if(rows > 11) - row_limit = 10 - if(columns > 11) - column_limit = 10 + if(rows > 21) + row_limit = 20 + if(columns > 21) + column_limit = 20 if(mine_limit > (rows*columns) * 0.25) mine_limit_v2 = 24 message_admins("[key_name_admin(user)] failed an emagged Minesweeper arcade and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!") @@ -378,15 +380,38 @@ explosion(loc, 2, 5, 10, 15) //Thought you could survive by putting as few mines as possible, huh?? else explosion(loc, 1, 3, rand(1,5), rand(1,10)) - for(var/y69=y-row_limit;y69Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.
    ") if(fuel <= 0) dat += "
    You ran out of fuel, and drift, slowly, into a star." diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 22e102b54b..79ea51eca4 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -296,7 +296,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("rate") var/target = text2num(params["rate"]) if(!isnull(target)) - target = CLAMP(target, 0, MAX_TRANSFER_RATE) + target = clamp(target, 0, MAX_TRANSFER_RATE) signal.data += list("tag" = input_tag, "set_volume_rate" = target) . = TRUE if("output") @@ -305,7 +305,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("pressure") var/target = text2num(params["pressure"]) if(!isnull(target)) - target = CLAMP(target, 0, MAX_OUTPUT_PRESSURE) + target = clamp(target, 0, MAX_OUTPUT_PRESSURE) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 47c761fa52..70a59230b2 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -45,11 +45,11 @@ if (ismob(user) && !isliving(user)) // ghosts don't need cameras return if (!network) - CRASH("No camera network") + stack_trace("No camera network") user.unset_machine() return FALSE if (!(islist(network))) - CRASH("Camera network is not a list") + stack_trace("Camera network is not a list") user.unset_machine() return FALSE @@ -175,6 +175,12 @@ clockwork = TRUE //it'd look very weird light_power = 0 +/obj/machinery/computer/security/telescreen/Initialize() + . = ..() + var/turf/T = get_turf_pixel(src) + if(iswallturf(T)) + plane = ABOVE_WALL_PLANE + /obj/machinery/computer/security/telescreen/update_icon_state() icon_state = initial(icon_state) if(stat & BROKEN) @@ -251,3 +257,12 @@ name = "AI upload monitor" desc = "A telescreen that connects to the AI upload's camera network." network = list("aiupload") + +// Subtype that connects to shuttles. +/obj/machinery/computer/security/shuttle + circuit = /obj/item/circuitboard/computer/security/shuttle + +/obj/machinery/computer/security/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + for(var/i in network) + network -= i + network += "[idnum][i]" diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index b0e80b63d2..74cceacd12 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -467,7 +467,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) to_chat(usr, "No log exists for this job.") updateUsrDialog() return - + if(inserted_modify_id.registered_account) + inserted_modify_id.registered_account.account_job = jobdatum // this is a terrible idea and people will grief but sure whatever inserted_modify_id.access = ( istype(src, /obj/machinery/computer/card/centcom) ? get_centcom_access(t1) : jobdatum.get_access() ) if (inserted_modify_id) inserted_modify_id.assignment = t1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 07cc252b87..981a5643a8 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -73,7 +73,7 @@ if(pod.occupant) continue //how though? - if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"])) + if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"])) temp = "[R.fields["name"]] => Cloning cycle in progress..." records -= R @@ -415,7 +415,7 @@ else if(pod.occupant) temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"])) + else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"], C.fields["bank_account"])) temp = "[C.fields["name"]] => Cloning cycle in progress..." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) records.Remove(C) @@ -441,9 +441,13 @@ /obj/machinery/computer/cloning/proc/scan_occupant(occupant) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) var/datum/dna/dna + var/datum/bank_account/has_bank_account if(ishuman(mob_occupant)) var/mob/living/carbon/C = mob_occupant dna = C.has_dna() + var/obj/item/card/id/I = C.get_idcard() + if(I) + has_bank_account = I.registered_account if(isbrain(mob_occupant)) var/mob/living/brain/B = mob_occupant dna = B.stored_dna @@ -468,7 +472,10 @@ scantemp = "Subject already in database." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return - + if(SSeconomy.full_ancap && !has_bank_account) + scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan." + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + return var/datum/data/record/R = new() if(dna.species) // We store the instance rather than the path, because some @@ -490,6 +497,7 @@ R.fields["features"] = dna.features R.fields["factions"] = mob_occupant.faction R.fields["quirks"] = list() + R.fields["bank_account"] = has_bank_account for(var/V in mob_occupant.roundstart_quirks) var/datum/quirk/T = V R.fields["quirks"][T.type] = T.clone_data() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index bd81b79694..22bea14381 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -111,7 +111,7 @@ to_chat(usr, "Authorization confirmed. Modifying security level.") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) //Only notify people if an actual change happened - var/security_level = get_security_level() + var/security_level = NUM2SECLEVEL(GLOB.security_level) log_game("[key_name(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].") message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] with [src] at [AREACOORD(usr)].") deadchat_broadcast("[usr.real_name] has changed the security level to [security_level] with [src] at [get_area_name(usr, TRUE)].", usr) @@ -163,11 +163,15 @@ else if(!S.prerequisites_met()) to_chat(usr, "You have not met the requirements for purchasing this shuttle.") else - if(SSshuttle.points >= S.credit_cost) + var/points_to_check + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + points_to_check = D.account_balance + if(points_to_check >= S.credit_cost) var/obj/machinery/shuttle_manipulator/M = locate() in GLOB.machines if(M) SSshuttle.shuttle_purchased = TRUE - SSshuttle.points -= S.credit_cost + D.adjust_money(-S.credit_cost) minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase") message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].") SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]") @@ -292,6 +296,10 @@ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) CentCom_announce(input, usr) to_chat(usr, "Message transmitted to Central Command.") + for(var/client/X in GLOB.admins) + if(X.prefs.toggles & SOUND_ADMINHELP) + SEND_SOUND(X, sound('sound/effects/printer.ogg')) + window_flash(X, ignorepref = FALSE) usr.log_talk(input, LOG_SAY, tag="CentCom announcement") deadchat_broadcast("[usr.real_name] has messaged CentCom, \"[input]\" at [get_area_name(usr, TRUE)].", usr) CM.lastTimeUsed = world.time @@ -309,6 +317,10 @@ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) Syndicate_announce(input, usr) to_chat(usr, "SYSERR @l(19833)of(transmit.dm): !@$ MESSAGE TRANSMITTED TO SYNDICATE COMMAND.") + for(var/client/X in GLOB.admins) + if(X.prefs.toggles & SOUND_ADMINHELP) + SEND_SOUND(X, sound('sound/effects/printer.ogg')) + window_flash(X, ignorepref = FALSE) usr.log_talk(input, LOG_SAY, tag="Syndicate announcement") deadchat_broadcast("[usr.real_name] has messaged the Syndicate, \"[input]\" at [get_area_name(usr, TRUE)].", usr) CM.lastTimeUsed = world.time @@ -396,7 +408,7 @@ security_level_cd = world.time + 15 SECONDS if(GLOB.security_level != old_level) //Only notify people if an actual change happened - var/security_level = get_security_level() + var/security_level = NUM2SECLEVEL(GLOB.security_level) log_game("[key_name(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].") message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [security_level] from [src] at [AREACOORD(usr)].") deadchat_broadcast("[usr.real_name] has changed the security level to [security_level] from [src] at [get_area_name(usr, TRUE)].", usr) @@ -547,7 +559,7 @@ dat += " Biohazard \]

    " playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if(STATE_ALERT_LEVEL) - dat += "Current alert level: [get_security_level()]
    " + dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
    " if(GLOB.security_level == SEC_LEVEL_DELTA) dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate." else @@ -555,8 +567,8 @@ dat += "Blue
    " dat += "Green" if(STATE_CONFIRM_LEVEL) - dat += "Current alert level: [get_security_level()]
    " - dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)]
    " + dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
    " + dat += "Confirm the change to: [NUM2SECLEVEL(tmp_alertlevel)]
    " dat += "Swipe ID to confirm change.
    " if(STATE_TOGGLE_EMERGENCY) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) @@ -568,7 +580,8 @@ dat += "
    Lift access restrictions on maintenance and external airlocks?
    \[ OK | Cancel \]" if(STATE_PURCHASE) - dat += "Budget: [SSshuttle.points] Credits.
    " + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + dat += "Budget: [D.account_balance] Credits.
    " dat += "
    " dat += "Caution: Purchasing dangerous shuttles may lead to mutiny and/or death.
    " dat += "
    " @@ -688,7 +701,7 @@ dat += " Biohazard \]

    " if(STATE_ALERT_LEVEL) - dat += "Current alert level: [get_security_level()]
    " + dat += "Current alert level: [NUM2SECLEVEL(GLOB.security_level)]
    " if(GLOB.security_level == SEC_LEVEL_DELTA) dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate." else diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index b9bd3da95e..d465ff2022 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -604,13 +604,13 @@ if("setbufferlabel") var/text = sanitize(input(usr, "Input a new label:", "Input a Text", null) as text|null) if(num && text) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot["label"] = text if("setbuffer") if(num && viable_occupant) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) buffer[num] = list( "label"="Buffer[num]:[viable_occupant.real_name]", "UI"=viable_occupant.dna.uni_identity, @@ -620,7 +620,7 @@ ) if("clearbuffer") if(num) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot.Cut() @@ -635,7 +635,7 @@ apply_buffer(SCANNER_ACTION_MIXED,num) if("injector") if(num && injectorready < world.time) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) var/obj/item/dnainjector/timed/I @@ -662,11 +662,11 @@ injectorready = world.time + INJECTOR_TIMEOUT if("loaddisk") if(num && diskette && diskette.fields) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) buffer[num] = diskette.fields.Copy() if("savedisk") if(num && diskette && !diskette.read_only) - num = CLAMP(num, 1, NUMBER_OF_BUFFERS) + num = clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) diskette.name = "data disk \[[buffer_slot["label"]]\]" @@ -953,7 +953,7 @@ return viable_occupant /obj/machinery/computer/scan_consolenew/proc/apply_buffer(action,buffer_num) - buffer_num = CLAMP(buffer_num, 1, NUMBER_OF_BUFFERS) + buffer_num = clamp(buffer_num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[buffer_num] var/mob/living/carbon/viable_occupant = get_viable_occupant() if(istype(buffer_slot)) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index e4a6a0b2d4..ca75ff1dd0 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -97,7 +97,7 @@ return if(!new_goal) new_goal = default_goal - contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + contained_id.goal = clamp(new_goal, 0, 1000) //maximum 1000 points return TRUE if("toggle_open") if(teleporter.locked) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index b007bc0161..5ee8223625 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -83,7 +83,6 @@ if(istype(P, /obj/item/stack/cable_coil)) if(!P.tool_start_check(user, amount=5)) return - to_chat(user, "You start to add cables to the frame...") if(P.use_tool(src, user, 20, volume=50, amount=5)) to_chat(user, "You add cables to the frame.") diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 118145ed88..9330a30555 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -242,6 +242,7 @@ if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) var/mob/living/mob_occupant = occupant + investigate_log("Cryogenics machine closed with occupant [key_name(occupant)] by user [key_name(user)].", INVESTIGATE_CRYOGENICS) if(mob_occupant && mob_occupant.stat != DEAD) to_chat(occupant, "You feel cool air surround you. You go numb as your senses turn inward.") if(mob_occupant.client)//if they're logged in @@ -251,12 +252,15 @@ icon_state = "cryopod" /obj/machinery/cryopod/open_machine() + if(occupant) + investigate_log("Cryogenics machine opened with occupant [key_name(occupant)] inside.", INVESTIGATE_CRYOGENICS) ..() icon_state = "cryopod-open" density = TRUE name = initial(name) /obj/machinery/cryopod/container_resist(mob/living/user) + investigate_log("Cryogenics machine container resisted by [key_name(user)] with occupant [key_name(occupant)].", INVESTIGATE_CRYOGENICS) visible_message("[occupant] emerges from [src]!", "You climb out of [src]!") open_machine() @@ -304,6 +308,8 @@ var/mob/living/mob_occupant = occupant var/list/obj/item/cryo_items = list() + + investigate_log("Despawning [key_name(mob_occupant)].", INVESTIGATE_CRYOGENICS) //Handle Borg stuff first if(iscyborg(mob_occupant)) @@ -405,7 +411,7 @@ // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) - mob_occupant.ghostize(FALSE, penalize = TRUE) + mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE) QDEL_NULL(occupant) for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 686b62d1c3..252e6cf6b3 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -33,7 +33,7 @@ to_chat(user, "You begin repairing [src]...") if(I.use_tool(src, user, 40, volume=40)) - obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) + obj_integrity = clamp(obj_integrity + 20, 0, max_integrity) else return ..() @@ -70,14 +70,13 @@ if(W.amount < 5) to_chat(user, "You need at least five wooden planks to make a wall!") return - else - to_chat(user, "You start adding [I] to [src]...") - if(do_after(user, 50, target=src)) - W.use(5) - var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/mineral/wood/nonmetal) - qdel(src) - return + to_chat(user, "You start adding [I] to [src]...") + if(do_after(user, 50, target=src)) + W.use(5) + var/turf/T = get_turf(src) + T.PlaceOnTop(/turf/closed/wall/mineral/wood/nonmetal) + qdel(src) + return return ..() @@ -170,7 +169,8 @@ to_chat(user, "[src] is now in [mode] mode.") -/obj/item/grenade/barrier/prime() +/obj/item/grenade/barrier/prime(mob/living/lanced_by) + . = ..() new /obj/structure/barricade/security(get_turf(src.loc)) switch(mode) if(VERTICAL) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 3bc8aff809..635522fa41 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -413,8 +413,8 @@ // shock user with probability prb (if all connections & power are working) // returns TRUE if shocked, FALSE otherwise // The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/proc/shock(mob/user, prb) - if(!hasPower()) // unpowered, no shock +/obj/machinery/door/airlock/proc/shock(mob/living/user, prb) + if(!istype(user) || !hasPower()) // unpowered, no shock return FALSE if(shockCooldown > world.time) return FALSE //Already shocked someone recently? @@ -577,11 +577,17 @@ cut_overlays() add_overlay(frame_overlay) add_overlay(filling_overlay) - add_overlay(lights_overlay) + if(lights_overlay) + add_overlay(lights_overlay) + var/mutable_appearance/lights_vis = mutable_appearance(lights_overlay.icon, lights_overlay.icon_state) + add_overlay(lights_vis) add_overlay(panel_overlay) add_overlay(weld_overlay) add_overlay(sparks_overlay) - add_overlay(damag_overlay) + if(damag_overlay) + add_overlay(damag_overlay) + var/mutable_appearance/damage_vis = mutable_appearance(damag_overlay.icon, damag_overlay.icon_state) + add_overlay(damage_vis) add_overlay(note_overlay) check_unres() diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 7b90715f2b..ae6930f5fb 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -1,6 +1,7 @@ /obj/item/electronics/airlock name = "airlock electronics" req_access = list(ACCESS_MAINT_TUNNELS) + custom_price = PRICE_CHEAP var/list/accesses = list() var/one_access = 0 diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index adc1748ded..1d39372dec 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -21,6 +21,7 @@ icon = 'icons/obj/status_display.dmi' icon_state = "frame" desc = "A remote control for a door." + plane = ABOVE_WALL_PLANE req_access = list(ACCESS_SECURITY) density = FALSE var/id // id of linked machinery/lockers @@ -135,7 +136,7 @@ . /= 10 /obj/machinery/door_timer/proc/set_timer(value) - var/new_time = CLAMP(value,0,MAX_TIMER) + var/new_time = clamp(value,0,MAX_TIMER) . = new_time == timer_duration //return 1 on no change timer_duration = new_time diff --git a/code/game/machinery/doors/checkForMultipleDoors.dm b/code/game/machinery/doors/checkForMultipleDoors.dm index 3c1364dfdd..35a944c965 100644 --- a/code/game/machinery/doors/checkForMultipleDoors.dm +++ b/code/game/machinery/doors/checkForMultipleDoors.dm @@ -12,5 +12,5 @@ for(var/obj/machinery/door/D in locate(src.x,src.y,src.z)) if(!istype(D, /obj/machinery/door/window) && D.density) return 0 - //There are no false wall checks because that would be fucking retarded + //There are no false wall checks because that would be fucking return 1 \ No newline at end of file diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c4c712ca25..1fb50e13c6 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -12,6 +12,7 @@ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1 + ricochet_chance_mod = 0.8 interaction_flags_atom = INTERACT_ATOM_UI_INTERACT @@ -290,8 +291,6 @@ operating = TRUE do_animate("closing") layer = closingLayer - if(!safe) - crush() sleep(5) density = TRUE sleep(5) @@ -303,6 +302,8 @@ update_freelook_sight() if(safe) CheckForMobs() + else + crush() return 1 /obj/machinery/door/proc/CheckForMobs() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 1b83bb4b96..b52cf1a891 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -260,6 +260,7 @@ /obj/item/electronics/firelock name = "firelock circuitry" + custom_price = PRICE_CHEAP desc = "A circuit board used in construction of firelocks." icon_state = "mainboard" @@ -400,12 +401,11 @@ "You begin adding wires to [src]...") playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) if(do_after(user, 60, target = src)) - if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B) + if(constructionStep != CONSTRUCTION_GUTTED || !B.use_tool(src, user, 0, 5)) return user.visible_message("[user] adds wires to [src].", \ "You wire [src].") playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) - B.use(5) constructionStep = CONSTRUCTION_WIRES_EXPOSED update_icon() return diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 87e8c8f6a7..362dde1157 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -53,7 +53,9 @@ if("opening") rad_insulation = 1 if("closing") - rad_insulation = 0.2 + rad_insulation = -0.5 + +// A 3x3 N2 SM setup won't irradiate you if you're behind the shutter at -0.9 insulation. If it starts to delam, it'll start irradiating you slowly. Keep the value between -0.1 to -0.9 /obj/machinery/door/poddoor/shutters/window name = "windowed shutters" diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index db806ef3ac..a9c411c634 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -174,9 +174,11 @@ GLOBAL_LIST_EMPTY(doppler_arrays) else linked_techweb.largest_bomb_value = TECHWEB_BOMB_POINTCAP point_gain = 1000 - + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI) + if(D) + D.adjust_money(point_gain) linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, point_gain) - say("Gained [point_gain] points from explosion dataset.") + say("Explosion details and mixture analyzed and sold to the highest bidder for [point_gain] cr, with a reward of [point_gain] points.") else //you've made smaller bombs say("Data already captured. Aborting.") diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 6c8467dbd3..6416de70f1 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -34,7 +34,7 @@ /obj/machinery/embedded_controller/radio/simple_vent_controller icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_control_standby" - + plane = ABOVE_WALL_PLANE name = "vent controller" density = FALSE diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index f4f308c490..0b23e650d7 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -2,6 +2,7 @@ /obj/item/electronics/firealarm name = "fire alarm electronics" + custom_price = PRICE_CHEAP desc = "A fire alarm circuit. Can handle heat levels up to 40 degrees celsius." /obj/item/wallframe/firealarm @@ -16,6 +17,7 @@ desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." icon = 'icons/obj/monitors.dmi' icon_state = "fire0" + plane = ABOVE_WALL_PLANE max_integrity = 250 integrity_failure = 0.4 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) @@ -205,11 +207,9 @@ return if(1) if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = W - if(coil.get_amount() < 5) + if(!W.use_tool(src, user, 0, 5)) to_chat(user, "You need more cable for this!") else - coil.use(5) buildstage = 2 to_chat(user, "You wire \the [src].") update_icon() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 7bef255aff..f4f1aa0637 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -5,6 +5,7 @@ desc = "A wall-mounted flashbulb device." icon = 'icons/obj/stationobjs.dmi' icon_state = "mflash1" + plane = ABOVE_WALL_PLANE max_integrity = 250 integrity_failure = 0.4 light_color = LIGHT_COLOR_WHITE @@ -20,6 +21,7 @@ name = "portable flasher" desc = "A portable flashing device. Wrench to activate and deactivate. Cannot detect slow movements." icon_state = "pflash1-p" + plane = GAME_PLANE strength = 80 anchored = FALSE base_state = "pflash" diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 244c300905..141f261688 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -20,6 +20,11 @@ . = ..() if(prob(1)) name = "auto-autopsy" + new_occupant_dir = dir + +/obj/machinery/harvester/setDir(newdir) + . = ..() + new_occupant_dir = dir /obj/machinery/harvester/RefreshParts() interval = 0 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 067f10fa0f..621e486e90 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(network_holopads) desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" layer = LOW_OBJ_LAYER - plane = FLOOR_PLANE + plane = ABOVE_WALL_PLANE flags_1 = HEAR_1 use_power = IDLE_POWER_USE idle_power_usage = 5 @@ -396,7 +396,6 @@ GLOBAL_LIST_EMPTY(network_holopads) Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) Hologram.Impersonation = user - Hologram.copy_known_languages_from(user,replace = TRUE) Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. Hologram.setAnchored(TRUE)//So space wind cannot drag it. @@ -555,9 +554,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ Hologram.alpha = 170 Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) Hologram.dir = SOUTH //for now - Hologram.grant_all_languages(omnitongue=TRUE) var/datum/language_holder/holder = Hologram.get_language_holder() - holder.selected_default_language = record.language + holder.selected_language = record.language Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. Hologram.setAnchored(TRUE)//So space wind cannot drag it. @@ -649,7 +647,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ return if(HOLORECORD_LANGUAGE) var/datum/language_holder/holder = replay_holo.get_language_holder() - holder.selected_default_language = entry[2] + holder.selected_language = entry[2] if(HOLORECORD_PRESET) var/preset_type = entry[2] var/datum/preset_holoimage/H = new preset_type @@ -672,6 +670,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ updateDialog() /obj/effect/overlay/holo_pad_hologram + initial_language_holder = /datum/language_holder/universal var/mob/living/Impersonation var/datum/holocall/HC diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm new file mode 100644 index 0000000000..1b57f61b79 --- /dev/null +++ b/code/game/machinery/hypnochair.dm @@ -0,0 +1,205 @@ +/obj/machinery/hypnochair + name = "enhanced interrogation chamber" + desc = "A device used to perform \"enhanced interrogation\" through invasive mental conditioning." + icon = 'icons/obj/machines/implantchair.dmi' + icon_state = "hypnochair" + circuit = /obj/item/circuitboard/machine/hypnochair + density = TRUE + opacity = 0 + ui_x = 375 + ui_y = 480 + var/mob/living/carbon/victim = null ///Keeps track of the victim to apply effects if it teleports away + var/interrogating = FALSE ///Is the device currently interrogating someone? + var/start_time = 0 ///Time when the interrogation was started, to calculate effect in case of interruption + var/trigger_phrase = "" ///Trigger phrase to implant + var/timerid = 0 ///Timer ID for interrogations + + var/message_cooldown = 0 ///Cooldown for breakout message + +/obj/machinery/hypnochair/Initialize() + . = ..() + open_machine() + update_icon() + +/obj/machinery/hypnochair/attackby(obj/item/I, mob/user, params) + if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + update_icon() + return + + if(default_pry_open(I)) + return + + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/hypnochair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "hypnochair", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/hypnochair/ui_data() + var/list/data = list() + data["occupied"] = occupant ? TRUE : FALSE + data["open"] = state_open + data["interrogating"] = interrogating + + data["occupant"] = list() + if(occupant) + var/mob/living/mob_occupant = occupant + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat + + data["trigger"] = trigger_phrase + + return data + +/obj/machinery/hypnochair/ui_act(action, params) + if(..()) + return + switch(action) + if("door") + if(state_open) + close_machine() + else + if(!interrogating) + open_machine() + . = TRUE + if("set_phrase") + set_phrase(params["phrase"]) + . = TRUE + if("interrogate") + if(!interrogating) + interrogate() + else + interrupt_interrogation() + . = TRUE + +/obj/machinery/hypnochair/proc/set_phrase(phrase) + trigger_phrase = phrase + +/obj/machinery/hypnochair/proc/interrogate() + if(!trigger_phrase) + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + return + var/mob/living/carbon/C = occupant + if(!istype(C)) + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, TRUE) + return + victim = C + if(!(C.get_eye_protection() > 0)) + to_chat(C, "Strobing coloured lights assault you relentlessly! You're losing your ability to think straight!") + C.become_blind("hypnochair") + ADD_TRAIT(C, TRAIT_DEAF, "hypnochair") + interrogating = TRUE + START_PROCESSING(SSobj, src) + start_time = world.time + update_icon() + timerid = addtimer(CALLBACK(src, .proc/finish_interrogation), 450, TIMER_STOPPABLE) + +/obj/machinery/hypnochair/process() + var/mob/living/carbon/C = occupant + if(!istype(C) || C != victim) + interrupt_interrogation() + return + if(prob(10) && !(C.get_eye_protection() > 0)) + to_chat(C, "[pick(\ + "...blue... red... green... blue, red, green, blueredgreenblueredgreen",\ + "...pretty colors...",\ + "...you keep hearing words, but you can't seem to understand them...",\ + "...so peaceful...",\ + "...an annoying buzz in your ears..."\ + )]") + +/obj/machinery/hypnochair/proc/finish_interrogation() + interrogating = FALSE + STOP_PROCESSING(SSobj, src) + update_icon() + var/temp_trigger = trigger_phrase + trigger_phrase = "" //Erase evidence, in case the subject is able to look at the panel afterwards + audible_message("[src] pings!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + + if(QDELETED(victim) || victim != occupant) + victim = null + return + victim.cure_blind("hypnochair") + REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair") + if(!(victim.get_eye_protection() > 0)) + victim.cure_trauma_type(/datum/brain_trauma/severe/hypnotic_trigger, TRAUMA_RESILIENCE_SURGERY) + if(prob(90)) + victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_trigger(temp_trigger), TRAUMA_RESILIENCE_SURGERY) + else + victim.gain_trauma(new /datum/brain_trauma/severe/hypnotic_stupor(), TRAUMA_RESILIENCE_SURGERY) + victim = null + +/obj/machinery/hypnochair/proc/interrupt_interrogation() + deltimer(timerid) + interrogating = FALSE + STOP_PROCESSING(SSobj, src) + update_icon() + + if(QDELETED(victim)) + victim = null + return + victim.cure_blind("hypnochair") + REMOVE_TRAIT(victim, TRAIT_DEAF, "hypnochair") + if(!(victim.get_eye_protection() > 0)) + var/time_diff = world.time - start_time + switch(time_diff) + if(0 to 100) + victim.confused += 10 + victim.Dizzy(100) + victim.blur_eyes(5) + if(101 to 200) + victim.confused += 15 + victim.Dizzy(200) + victim.blur_eyes(10) + if(prob(25)) + victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE) + if(201 to INFINITY) + victim.confused += 20 + victim.Dizzy(300) + victim.blur_eyes(15) + if(prob(65)) + victim.apply_status_effect(/datum/status_effect/trance, rand(50,150), FALSE) + victim = null + +/obj/machinery/hypnochair/update_icon_state() + icon_state = initial(icon_state) + if(state_open) + icon_state += "_open" + if(occupant) + if(interrogating) + icon_state += "_active" + else + icon_state += "_occupied" + +/obj/machinery/hypnochair/container_resist(mob/living/user) + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(600)].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(600), target = src)) + if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open_machine() + +/obj/machinery/hypnochair/relaymove(mob/user) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + +/obj/machinery/hypnochair/MouseDrop_T(mob/target, mob/user) + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) + return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return + close_machine(target) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index ad5df7cea0..cd9e9dc83f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -13,7 +13,8 @@ var/obj/item/reagent_containers/beaker var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood, /obj/item/reagent_containers/food, - /obj/item/reagent_containers/glass)) + /obj/item/reagent_containers/glass, + /obj/item/reagent_containers/chem_pack)) /obj/machinery/iv_drip/Initialize(mapload) . = ..() diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 0f5e51215d..c8219e9ebf 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -57,7 +57,7 @@ var/turf/target = locate(target_x, target_y, z) ghost.forceMove(target) -/obj/machinery/launchpad/proc/isAvailable() +/obj/machinery/launchpad/proc/isAvailable(silent = FALSE) if(stat & NOPOWER) return FALSE if(panel_open) @@ -68,9 +68,9 @@ if(teleporting) return if(!isnull(x)) - x_offset = CLAMP(x, -range, range) + x_offset = clamp(x, -range, range) if(!isnull(y)) - y_offset = CLAMP(y, -range, range) + y_offset = clamp(y, -range, range) /obj/machinery/launchpad/proc/doteleport(mob/user, sending) if(teleporting) @@ -198,7 +198,7 @@ QDEL_NULL(briefcase) return ..() -/obj/machinery/launchpad/briefcase/isAvailable() +/obj/machinery/launchpad/briefcase/isAvailable(silent = FALSE) if(closed) return FALSE return ..() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index b2a35dcf41..421e3433ca 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -5,6 +5,7 @@ name = "light switch" icon = 'icons/obj/power.dmi' icon_state = "light1" + plane = ABOVE_WALL_PLANE desc = "Make dark." var/on = TRUE var/area/area = null diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index b0e26ce129..c144616c05 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -55,9 +55,9 @@ new /obj/item/pipe_meter(loc) wait = world.time + 15 if(href_list["layer_up"]) - piping_layer = CLAMP(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = clamp(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if(href_list["layer_down"]) - piping_layer = CLAMP(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = clamp(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index ff79038a96..1887ee46c0 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -679,7 +679,7 @@ /obj/machinery/porta_turret/syndicate/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/porta_turret/syndicate/energy icon_state = "standard_stun" @@ -788,7 +788,7 @@ /obj/machinery/porta_turret/centcom_shuttle/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp) return 0 diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index afb00d4ee2..7fdb9b38be 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -70,8 +70,8 @@ else return ..() -/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user) - parent_turret.attacked_by(I, user) +/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user, attackchain_flags = NONE, damage_multiplier = 1) + return parent_turret.attacked_by(I, user) /obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/humanoid/user) parent_turret.attack_alien(user) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm old mode 100755 new mode 100644 index 24fd956677..2fff2011c1 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -17,6 +17,8 @@ /obj/item/melee/baton, /obj/item/ammo_box/magazine/recharge, /obj/item/modular_computer, + /obj/item/ammo_casing/mws_batt, + /obj/item/ammo_box/magazine/mws_mag, /obj/item/twohanded/electrostaff, /obj/item/gun/ballistic/automatic/magrifle)) @@ -53,6 +55,11 @@ using_power = FALSE update_icon() +/obj/machinery/recharger/Exited(atom/movable/M, atom/newloc) + . = ..() + if(charging == M) + setCharging() + /obj/machinery/recharger/attackby(obj/item/G, mob/user, params) if(istype(G, /obj/item/wrench)) if(charging) @@ -109,15 +116,12 @@ add_fingerprint(user) if(charging) charging.update_icon() - charging.forceMove(drop_location()) user.put_in_hands(charging) - setCharging(null) /obj/machinery/recharger/attack_tk(mob/user) if(charging) charging.update_icon() charging.forceMove(drop_location()) - setCharging(null) /obj/machinery/recharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) @@ -141,6 +145,29 @@ using_power = TRUE update_icon() return + + if(istype(charging, /obj/item/ammo_casing/mws_batt)) + var/obj/item/ammo_casing/mws_batt/R = charging + if(R.cell.charge < R.cell.maxcharge) + R.cell.give(R.cell.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) + using_power = 1 + if(R.BB == null) + R.chargeshot() + update_icon(using_power) + + if(istype(charging, /obj/item/ammo_box/magazine/mws_mag)) + var/obj/item/ammo_box/magazine/mws_mag/R = charging + for(var/B in R.stored_ammo) + var/obj/item/ammo_casing/mws_batt/batt = B + if(batt.cell.charge < batt.cell.maxcharge) + batt.cell.give(batt.cell.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) + using_power = 1 + if(batt.BB == null) + batt.chargeshot() + update_icon(using_power) + else return PROCESS_KILL diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index dc9f280e48..8680aa69e6 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -100,44 +100,61 @@ eat(AM) . = ..() -/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) +/obj/machinery/recycler/proc/eat(atom/AM0) if(stat & (BROKEN|NOPOWER) || safety_mode) return var/list/to_eat - to_eat = AM0.GetAllContentsIgnoring(GLOB.typecache_mob) + to_eat = list(AM0) var/items_recycled = 0 + var/buzz = FALSE for(var/i in to_eat) var/atom/movable/AM = i + if(QDELETED(AM)) + continue var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM - var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) || istype(AM, /obj/item/dullahan_relay) + var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay) if(brain_holder) - emergency_stop(AM) - else if(isliving(AM)) - if((obj_flags & EMAGGED)||((!allowed(AM))&&(!ishuman(AM)))) - crush_living(AM) + if(obj_flags & EMAGGED) + continue else emergency_stop(AM) + return + else if(isliving(AM)) + if((obj_flags & EMAGGED)||((!allowed(AM))&&(!ishuman(AM)))) + to_eat += crush_living(AM) + else + emergency_stop(AM) + return else if(isitem(AM)) var/obj/O = AM if(O.resistance_flags & INDESTRUCTIBLE) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz = TRUE O.forceMove(loc) else - recycle_item(AM) + to_eat += recycle_item(AM) items_recycled++ else - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + buzz = TRUE AM.forceMove(loc) - if(items_recycled && sound) + if(items_recycled) playsound(src, item_recycle_sound, 50, 1) + if(buzz) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) /obj/machinery/recycler/proc/recycle_item(obj/item/I) + . = list() + for(var/A in I) + var/atom/movable/AM = A + AM.forceMove(loc) + if(AM.loc == loc) + . += AM + I.forceMove(loc) var/obj/item/grown/log/L = I if(istype(L)) @@ -172,6 +189,7 @@ /obj/machinery/recycler/proc/crush_living(mob/living/L) + . = list() L.forceMove(loc) if(issilicon(L)) @@ -193,7 +211,7 @@ if(eat_victim_items) for(var/obj/item/I in L.get_equipped_items(TRUE)) if(L.dropItemToGround(I)) - eat(I, sound=FALSE) + . += I // Instantly lie down, also go unconscious from the pain, before you die. L.Unconscious(100) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index c05fbe229c..e1f55da551 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -9,13 +9,14 @@ GLOBAL_LIST_EMPTY(allConsoles) #define NO_NEW_MESSAGE 0 #define NORMAL_MESSAGE_PRIORITY 1 #define HIGH_MESSAGE_PRIORITY 2 -#define EXTREME_MESSAGE_PRIORITY 3 // not implemented, will probably require some hacking... everything needs to have a hidden feature in this game. +#define EXTREME_MESSAGE_PRIORITY 3 // is implimented, does require hacking. everything needs to have a hidden feature in this game. /obj/machinery/requests_console name = "requests console" desc = "A console intended to send requests to different departments on the station." icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" + plane = ABOVE_WALL_PLANE var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department var/list/messages = list() //List of all messages var/departmentType = 0 @@ -47,9 +48,9 @@ GLOBAL_LIST_EMPTY(allConsoles) var/announceAuth = FALSE //Will be set to 1 when you authenticate yourself for announcements var/msgVerified = "" //Will contain the name of the person who verified it var/msgStamped = "" //If a message is stamped, this will contain the stamp name - var/message = ""; - var/dpt = ""; //the department which will be receiving the message - var/priority = -1 ; //Priority of the message being sent + var/message = "" + var/dpt = "" //the department which will be receiving the message + var/priority = NORMAL_MESSAGE_PRIORITY //Priority of the message being sent. why is the default -1?? var/obj/item/radio/Radio var/emergency //If an emergency has been called by this device. Acts as both a cooldown and lets the responder know where it the emergency was triggered from var/receive_ore_updates = FALSE //If ore redemption machines will send an update when it receives new ores. @@ -61,16 +62,17 @@ GLOBAL_LIST_EMPTY(allConsoles) update_icon() /obj/machinery/requests_console/update_icon_state() - if(stat & NOPOWER) + if(CHECK_BITFIELD(stat, NOPOWER)) set_light(0) else - set_light(1.4,0.7,"#34D352")//green light + set_light(1.4, 0.7, "#34D352")//green light + if(open) if(!hackState) icon_state="req_comp_open" else icon_state="req_comp_rewired" - else if(stat & NOPOWER) + else if(CHECK_BITFIELD(stat, NOPOWER)) if(icon_state != "req_comp_off") icon_state = "req_comp_off" else @@ -121,7 +123,7 @@ GLOBAL_LIST_EMPTY(allConsoles) GLOB.req_console_information += department Radio = new /obj/item/radio(src) - Radio.listening = 0 + Radio.listening = FALSE /obj/machinery/requests_console/Destroy() QDEL_NULL(Radio) @@ -130,164 +132,173 @@ GLOBAL_LIST_EMPTY(allConsoles) /obj/machinery/requests_console/ui_interact(mob/user) . = ..() + if(open) //no. + return + var/dat = "" - if(!open) - switch(screen) - if(1) //req. assistance - dat += "Which department do you need assistance from?

    " - dat += "" - for(var/dpt in GLOB.req_console_assistance) - if (dpt != department) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
    [dpt]Normal High" - if(hackState) - dat += "EXTREME" - dat += "
    " - dat += "
    << Back
    " + switch(screen) + if(1) //req. assistance + dat += "Which department do you need assistance from?

    " + dat += "" + for(var/dpt in GLOB.req_console_assistance) + if(dpt == department) + continue + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
    [dpt]" + dat += "Normal" + dat += "High" + if(hackState) + dat += "EXTREME" + dat += "
    " + dat += "
    << Back
    " - if(2) //req. supplies - dat += "Which department do you need supplies from?

    " - dat += "" - for(var/dpt in GLOB.req_console_supplies) - if (dpt != department) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
    [dpt]Normal High" - if(hackState) - dat += "EXTREME" - dat += "
    " - dat += "
    << Back
    " + if(2) //req. supplies + dat += "Which department do you need supplies from?

    " + dat += "" + for(var/dpt in GLOB.req_console_supplies) + if(dpt == department) + continue - if(3) //relay information - dat += "Which department would you like to send information to?

    " - dat += "
    " - for(var/dpt in GLOB.req_console_information) - if (dpt != department) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
    [dpt]Normal High" - if(hackState) - dat += "EXTREME" - dat += "
    " - dat += "
    << Back
    " + dat += "" + dat += "[dpt]" + dat += "" + dat += "Normal" + dat += "High" + if(hackState) + dat += "EXTREME" + dat += "" + dat += "" + dat += "" + dat += "
    << Back
    " - if(6) //sent successfully - dat += "Message sent.

    " - dat += "Continue
    " + if(3) //relay information + dat += "Which department would you like to send information to?

    " + dat += "" + for(var/dpt in GLOB.req_console_information) + if(dpt == department) + continue + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
    [dpt]" + dat += "Normal" + dat += "High" + if(hackState) + dat += "EXTREME" + dat += "
    " + dat += "
    << Back
    " - if(7) //unsuccessful; not sent - dat += "An error occurred.

    " - dat += "Continue
    " + if(6) //sent successfully + dat += "Message sent.

    " + dat += "Continue
    " - if(8) //view messages - for (var/obj/machinery/requests_console/Console in GLOB.allConsoles) - if (Console.department == department) - Console.newmessagepriority = NO_NEW_MESSAGE - Console.update_icon() + if(7) //unsuccessful; not sent + dat += "An error occurred.

    " + dat += "Continue
    " - newmessagepriority = NO_NEW_MESSAGE - update_icon() - var/messageComposite = "" - for(var/msg in messages) // This puts more recent messages at the *top*, where they belong. - messageComposite = "
    [msg]
    " + messageComposite - dat += messageComposite - dat += "
    << Back to Main Menu
    " + if(8) //view messages + for(var/obj/machinery/requests_console/Console in GLOB.allConsoles) + if(Console.department == department) + Console.newmessagepriority = NO_NEW_MESSAGE + Console.update_icon() - if(9) //authentication before sending - dat += "Message Authentication

    " - dat += "Message for [dpt]: [message]

    " - dat += "
    You may authenticate your message now by scanning your ID or your stamp

    " - dat += "Validated by: [msgVerified ? msgVerified : "Not Validated"]
    " - dat += "Stamped by: [msgStamped ? msgStamped : "Not Stamped"]

    " - dat += "Send Message
    " - dat += "
    << Discard Message
    " + newmessagepriority = NO_NEW_MESSAGE + update_icon() + var/messageComposite = "" + for(var/msg in messages) // This puts more recent messages at the *top*, where they belong. + messageComposite = "
    [msg]
    " + messageComposite + dat += messageComposite + dat += "
    << Back to Main Menu
    " - if(10) //send announcement - dat += "

    Station-wide Announcement

    " - if(announceAuth) - dat += "
    Authentication accepted

    " - else - dat += "
    Swipe your card to authenticate yourself

    " - dat += "Message: [message ? message : "No Message"]
    " - dat += "[message ? "Edit" : "Write"] Message

    " - if ((announceAuth || IsAdminGhost(user)) && message) - dat += "Announce Message
    " - else - dat += "Announce Message
    " - dat += "
    << Back
    " + if(9) //authentication before sending + dat += "Message Authentication

    " + dat += "Message for [dpt]: [message]

    " + dat += "
    You may authenticate your message now by scanning your ID or your stamp

    " + + dat += "Validated by: [msgVerified ? "[msgVerified]" : "Not Validated"]
    " + dat += "Stamped by: [msgStamped ? "[msgStamped]" : "Not Stamped"]

    " + + dat += "Send Message

    " + dat += "<< Discard Message
    " - else //main menu - screen = 0 - announceAuth = FALSE - if (newmessagepriority == NORMAL_MESSAGE_PRIORITY) - dat += "
    There are new messages

    " - if (newmessagepriority == HIGH_MESSAGE_PRIORITY) - dat += "
    There are new PRIORITY messages

    " - if (newmessagepriority == EXTREME_MESSAGE_PRIORITY) - dat += "
    There are new EXTREME PRIORITY messages

    " - dat += "View Messages

    " + if(10) //send announcement + dat += "

    Station-wide Announcement

    " + if(announceAuth) + dat += "
    Authentication accepted

    " + else + dat += "
    Swipe your card to authenticate yourself

    " + dat += "Message: [message ? message : "No Message"]
    " + dat += "[message ? "Edit" : "Write"] Message

    " + if((announceAuth || IsAdminGhost(user)) && message) + dat += "Announce Message
    " + else + dat += "Announce Message
    " + dat += "
    << Back
    " - dat += "Request Assistance
    " - dat += "Request Supplies
    " - dat += "Relay Anonymous Information

    " + else //main menu + screen = 0 + announceAuth = FALSE + if(newmessagepriority == NORMAL_MESSAGE_PRIORITY) + dat += "
    There are new messages

    " + if(newmessagepriority == HIGH_MESSAGE_PRIORITY) + dat += "
    There are new PRIORITY messages

    " + if(newmessagepriority == EXTREME_MESSAGE_PRIORITY) + dat += "
    There are new EXTREME PRIORITY messages

    " - if(!emergency) - dat += "Emergency: Security
    " - dat += "Emergency: Engineering
    " - dat += "Emergency: Medical

    " - else - dat += "[emergency] has been dispatched to this location.

    " + dat += "View Messages

    " - if(announcementConsole) - dat += "Send Station-wide Announcement

    " - if (silent) - dat += "Speaker OFF" - else - dat += "Speaker ON" - var/datum/browser/popup = new(user, "req_console", "[department] Requests Console", 450, 440) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return + dat += "Request Assistance
    " + dat += "Request Supplies
    " + dat += "Relay Anonymous Information

    " + + if(!emergency) + dat += "Emergency: Security
    " + dat += "Emergency: Engineering
    " + dat += "Emergency: Medical

    " + else + dat += "
    [emergency] has been dispatched to this location.


    " + + if(announcementConsole) + dat += "Send Station-wide Announcement

    " + if(silent) + dat += "Speaker OFF" + else + dat += "Speaker ON" + + var/datum/browser/popup = new(user, "req_console", "[department] Requests Console", 450, 440) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() /obj/machinery/requests_console/Topic(href, href_list) if(..()) return usr.set_machine(src) add_fingerprint(usr) - + if(href_list["write"]) dpt = ckey(reject_bad_text(href_list["write"])) //write contains the string of the receiving department's name var/new_message = stripped_input(usr, "Write your message:", "Awaiting Input", "", MAX_MESSAGE_LEN) if(new_message) message = new_message screen = 9 - if (text2num(href_list["priority"]) < 2) - priority = -1 - else - priority = text2num(href_list["priority"]) + priority = text2num(href_list["priority"]) else dpt = ""; msgVerified = "" msgStamped = "" screen = 0 - priority = -1 + priority = NORMAL_MESSAGE_PRIORITY //:salt: if(href_list["writeAnnouncement"]) var/new_message = reject_bad_text(stripped_input(usr, "Write your message:", "Awaiting Input", "", MAX_MESSAGE_LEN)) if(new_message) message = new_message - if (text2num(href_list["priority"]) < 2) - priority = -1 - else - priority = text2num(href_list["priority"]) + priority = text2num(href_list["priority"]) else message = "" announceAuth = FALSE @@ -295,106 +306,116 @@ GLOBAL_LIST_EMPTY(allConsoles) if(href_list["sendAnnouncement"]) if(!announcementConsole) + updateUsrDialog() return if(isliving(usr)) var/mob/living/L = usr message = L.treat_message(message) minor_announce(message, "[department] Announcement:") GLOB.news_network.SubmitArticle(message, department, "Station Announcements", null) - usr.log_talk(message, LOG_SAY, tag="station announcement from [src]") + usr.log_talk(message, LOG_SAY, tag = "station announcement from [src]") message_admins("[ADMIN_LOOKUPFLW(usr)] has made a station announcement from [src] at [AREACOORD(usr)].") announceAuth = FALSE message = "" screen = 0 if(href_list["emergency"]) - if(!emergency) - var/radio_freq - switch(text2num(href_list["emergency"])) - if(1) //Security - radio_freq = FREQ_SECURITY - emergency = "Security" - if(2) //Engineering - radio_freq = FREQ_ENGINEERING - emergency = "Engineering" - if(3) //Medical - radio_freq = FREQ_MEDICAL - emergency = "Medical" - if(radio_freq) - Radio.set_frequency(radio_freq) - Radio.talk_into(src,"[emergency] emergency in [department]!!",radio_freq) - update_icon() - addtimer(CALLBACK(src, .proc/clear_emergency), 3000) + if(emergency) //already has an emergency? do not continue + updateUsrDialog() + return - if( href_list["department"] && message ) - var/log_msg = message + var/radio_freq + switch(text2num(href_list["emergency"])) + if(1) //Security + radio_freq = FREQ_SECURITY + emergency = "Security" + if(2) //Engineering + radio_freq = FREQ_ENGINEERING + emergency = "Engineering" + if(3) //Medical + radio_freq = FREQ_MEDICAL + emergency = "Medical" + if(radio_freq) + Radio.set_frequency(radio_freq) + Radio.talk_into(src, "[emergency] emergency in [department]!!", radio_freq) + update_icon() + addtimer(CALLBACK(src, .proc/clear_emergency), 5 MINUTES) + + if(href_list["department"] && message) var/sending = message sending += "
    " - if (msgVerified) - sending += msgVerified - sending += "
    " - if (msgStamped) - sending += msgStamped - sending += "
    " - screen = 7 //if it's successful, this will get overrwritten (7 = unsufccessfull, 6 = successfull) - if (sending) - var/pass = FALSE - var/datum/data_rc_msg/log = new(href_list["department"], department, log_msg, msgStamped, msgVerified, priority) - for (var/obj/machinery/telecomms/message_server/MS in GLOB.telecomms_list) - if (MS.toggled) - MS.rc_msgs += log - pass = TRUE + if(msgVerified) + sending += "[msgVerified]
    " + if(msgStamped) + sending += "[msgStamped]
    " + //so you're telling me is you cheated, by making fail happen, then quickly replacing it with 6 - if(pass) - var/radio_freq = 0 - switch(href_list["department"]) - if("bridge") - radio_freq = FREQ_COMMAND - if("medbay") - radio_freq = FREQ_MEDICAL - if("science") - radio_freq = FREQ_SCIENCE - if("engineering") - radio_freq = FREQ_ENGINEERING - if("security") - radio_freq = FREQ_SECURITY - if("cargobay" || "mining") - radio_freq = FREQ_SUPPLY - Radio.set_frequency(radio_freq) - var/authentic - if(msgVerified || msgStamped) - authentic = " (Authenticated)" + var/workingServer = FALSE + var/datum/data_rc_msg/log = new(href_list["department"], department, message, msgStamped, msgVerified, priority) + for(var/obj/machinery/telecomms/message_server/MS in GLOB.telecomms_list) + if(MS.on) //on does the calculations. why would this server still work even though the apc is off?? + LAZYADD(MS.rc_msgs, log) + workingServer = TRUE - var/alert = "" - for (var/obj/machinery/requests_console/Console in GLOB.allConsoles) - if (ckey(Console.department) == ckey(href_list["department"])) - switch(priority) - if(2) //High priority - alert = "PRIORITY Alert in [department][authentic]" - Console.createmessage(src, alert, sending, 2, 1) - if(3) // Extreme Priority - alert = "EXTREME PRIORITY Alert from [department][authentic]" - Console.createmessage(src, alert , sending, 3, 1) - else // Normal priority - alert = "Message from [department][authentic]" - Console.createmessage(src, alert , sending, 1, 1) - screen = 6 + if(!workingServer) + screen = 7 + say("NOTICE: No server detected! Please contact your local engineering team.") + updateUsrDialog() + return - if(radio_freq) - Radio.talk_into(src, "[alert]: [message]", radio_freq) + var/radio_freq = 0 + switch(href_list["department"]) + if("bridge") + radio_freq = FREQ_COMMAND + if("medbay") + radio_freq = FREQ_MEDICAL + if("science") + radio_freq = FREQ_SCIENCE + if("engineering") + radio_freq = FREQ_ENGINEERING + if("security") + radio_freq = FREQ_SECURITY + if("cargobay" || "mining") + radio_freq = FREQ_SUPPLY + Radio.set_frequency(radio_freq) - switch(priority) - if(2) - messages += "High Priority
    To: [dpt]
    [sending]" - else - messages += "To: [dpt]
    [sending]" + var/authentic = "" + if(msgVerified || msgStamped) + authentic = " (Authenticated)" + + var/alert = "" + for(var/obj/machinery/requests_console/C in GLOB.allConsoles) + if(ckey(C.department) != ckey(href_list["department"])) + continue + switch(priority) + if(HIGH_MESSAGE_PRIORITY) //High priority + alert = "PRIORITY Alert from [department][authentic]" + C.createmessage(src, alert, sending, HIGH_MESSAGE_PRIORITY) + if(EXTREME_MESSAGE_PRIORITY) // Extreme Priority + alert = "EXTREME PRIORITY Alert from [department][authentic]" + C.createmessage(src, alert, sending, EXTREME_MESSAGE_PRIORITY) + else // Normal priority + alert = "Message from [department][authentic]" + C.createmessage(src, alert, sending, NORMAL_MESSAGE_PRIORITY) + screen = 6 //if it ever gets here that means (c.department == href_ls["dept"]) + + if(radio_freq) + Radio.talk_into(src, "[alert]: [message]", radio_freq) + //log to (this) + switch(priority) + if(HIGH_MESSAGE_PRIORITY) + messages += "High Priority
    To: [dpt]
    [sending]" + if(EXTREME_MESSAGE_PRIORITY) + messages += "!!!Extreme Priority!!!
    To: [dpt]
    [sending]" else - say("NOTICE: No server detected!") + messages += "To: [dpt]
    [sending]" //Handle screen switching switch(text2num(href_list["setScreen"])) if(null) //skip + updateUsrDialog() + return if(1) //req. assistance screen = 1 if(2) //req. supplies @@ -422,16 +443,14 @@ GLOBAL_LIST_EMPTY(allConsoles) msgVerified = "" msgStamped = "" message = "" - priority = -1 + priority = NORMAL_MESSAGE_PRIORITY // :salt: screen = 0 //Handle silencing the console - switch( href_list["setSilent"] ) - if(null) //skip - if("1") - silent = TRUE - else - silent = FALSE + if(href_list["setSilent"] == "1") + silent = TRUE + else + silent = FALSE updateUsrDialog() return @@ -456,32 +475,32 @@ GLOBAL_LIST_EMPTY(allConsoles) linkedsender = source capitalize(title) switch(priority) - if(2) //High priority + if(HIGH_MESSAGE_PRIORITY) //High priority if(newmessagepriority < HIGH_MESSAGE_PRIORITY) newmessagepriority = HIGH_MESSAGE_PRIORITY update_icon() if(!silent) playsound(src, 'sound/machines/twobeep.ogg', 50, 1) say(title) - messages += "High Priority
    From: [linkedsender]
    [message]" + messages += "High Priority
    From: [linkedsender]
    [message]" //the fuck is this not being sent - if(3) // Extreme Priority + if(EXTREME_MESSAGE_PRIORITY) // Extreme Priority if(newmessagepriority < EXTREME_MESSAGE_PRIORITY) newmessagepriority = EXTREME_MESSAGE_PRIORITY update_icon() - if(1) - playsound(src, 'sound/machines/twobeep.ogg', 50, 1) - say(title) - messages += "!!!Extreme Priority!!!
    From: [linkedsender]
    [message]" + //we ignore the silent option because this is !!!IMPORTANT!!! + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) + say(title) + messages += "!!!Extreme Priority!!!
    From: [linkedsender]
    [message]" else // Normal priority if(newmessagepriority < NORMAL_MESSAGE_PRIORITY) newmessagepriority = NORMAL_MESSAGE_PRIORITY update_icon() - if(!src.silent) + if(!silent) playsound(src, 'sound/machines/twobeep.ogg', 50, 1) say(title) - messages += "From: [linkedsender]
    [message]" + messages += "From: [linkedsender]
    [message]" /obj/machinery/requests_console/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/crowbar)) @@ -505,23 +524,26 @@ GLOBAL_LIST_EMPTY(allConsoles) to_chat(user, "You must open the maintenance panel first!") return - var/obj/item/card/id/ID = O.GetID() - if(ID) + if(istype(O, /obj/item/card/id)) + var/obj/item/card/id/ID = O.GetID() + if(!ID) + return if(screen == 9) - msgVerified = "Verified by [ID.registered_name] ([ID.assignment])" + msgVerified = "Verified by [ID.registered_name] ([ID.assignment])" updateUsrDialog() if(screen == 10) - if (ACCESS_RC_ANNOUNCE in ID.access) + if(ACCESS_RC_ANNOUNCE in ID.access) announceAuth = TRUE else announceAuth = FALSE to_chat(user, "You are not authorized to send announcements!") updateUsrDialog() return - if (istype(O, /obj/item/stamp)) + + if(istype(O, /obj/item/stamp)) if(screen == 9) var/obj/item/stamp/T = O - msgStamped = "Stamped with the [T.name]" + msgStamped = "Stamped with the [T.name]" updateUsrDialog() return return ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index c152e302fe..6793d361b5 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -160,10 +160,7 @@ to_chat(user, "You need one length of cable to repair [src]!") return to_chat(user, "You begin to replace the wires...") - if(do_after(user, 30, target = src)) - if(coil.get_amount() < 1) - return - coil.use(1) + if(W.use_tool(src, user, 30, 1)) obj_integrity = max_integrity stat &= ~BROKEN to_chat(user, "You repair \the [src].") @@ -270,7 +267,7 @@ use_stored_power(50) /obj/machinery/shieldwallgen/proc/use_stored_power(amount) - power = CLAMP(power - amount, 0, maximum_stored_power) + power = clamp(power - amount, 0, maximum_stored_power) update_activity() /obj/machinery/shieldwallgen/proc/update_activity() diff --git a/code/game/machinery/shuttle/custom_shuttle.dm b/code/game/machinery/shuttle/custom_shuttle.dm new file mode 100644 index 0000000000..7c83cade69 --- /dev/null +++ b/code/game/machinery/shuttle/custom_shuttle.dm @@ -0,0 +1,33 @@ +/obj/machinery/shuttle + name = "shuttle component" + desc = "Something for shuttles." + density = TRUE + obj_integrity = 250 + max_integrity = 250 + icon = 'icons/turf/shuttle.dmi' + icon_state = "burst_plasma" + idle_power_usage = 150 + circuit = /obj/item/circuitboard/machine/shuttle/engine + var/icon_state_closed = "burst_plasma" + var/icon_state_open = "burst_plasma_open" + var/icon_state_off = "burst_plasma_off" + +/obj/machinery/shuttle/Initialize() + . = ..() + GLOB.custom_shuttle_machines += src + +/obj/machinery/shuttle/Destroy() + . = ..() + GLOB.custom_shuttle_machines -= src + +/obj/machinery/shuttle/attackby(obj/item/I, mob/living/user, params) + if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) + return + if(default_pry_open(I)) + return + if(panel_open) + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + return ..() diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm new file mode 100644 index 0000000000..1b2ce686d2 --- /dev/null +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -0,0 +1,138 @@ +//----------------------------------------------- +//-------------Engine Thrusters------------------ +//----------------------------------------------- + +#define ENGINE_HEAT_TARGET 600 +#define ENGINE_HEATING_POWER 5000000 + +/obj/machinery/shuttle/engine + name = "shuttle thruster" + desc = "A thruster for shuttles." + density = TRUE + obj_integrity = 250 + max_integrity = 250 + icon = 'icons/turf/shuttle.dmi' + icon_state = "burst_plasma" + idle_power_usage = 150 + circuit = /obj/item/circuitboard/machine/shuttle/engine + var/thrust = 0 + var/fuel_use = 0 + var/bluespace_capable = TRUE + var/cooldown = 0 + var/thruster_active = FALSE + var/datum/weakref/attached_heater + +/obj/machinery/shuttle/engine/plasma + name = "plasma thruster" + desc = "A thruster that burns plasma stored in an adjacent plasma thruster heater." + icon_state = "burst_plasma" + icon_state_off = "burst_plasma_off" + + idle_power_usage = 0 + circuit = /obj/item/circuitboard/machine/shuttle/engine/plasma + thrust = 25 + fuel_use = 0.24 + bluespace_capable = FALSE + cooldown = 45 + +/obj/machinery/shuttle/engine/void + name = "void thruster" + desc = "A thruster using technology to breach voidspace for propulsion." + icon_state = "burst_void" + icon_state_off = "burst_void" + icon_state_closed = "burst_void" + icon_state_open = "burst_void_open" + idle_power_usage = 0 + circuit = /obj/item/circuitboard/machine/shuttle/engine/void + thrust = 400 + fuel_use = 0 + bluespace_capable = TRUE + cooldown = 90 + +/obj/machinery/shuttle/engine/Initialize() + . = ..() + check_setup() + +/obj/machinery/shuttle/engine/on_construction() + . = ..() + check_setup() + +/obj/machinery/shuttle/engine/Destroy() + attached_heater = FALSE + thruster_active = FALSE + return ..() + +/obj/machinery/shuttle/engine/proc/check_setup() + if(!anchored) + attached_heater = null + update_engine() + return + var/heater_turf + switch(dir) + if(NORTH) + heater_turf = get_offset_target_turf(src, 0, 1) + if(SOUTH) + heater_turf = get_offset_target_turf(src, 0, -1) + if(EAST) + heater_turf = get_offset_target_turf(src, 1, 0) + if(WEST) + heater_turf = get_offset_target_turf(src, -1, 0) + if(!heater_turf) + attached_heater = null + update_engine() + return + attached_heater = null + for(var/obj/machinery/atmospherics/components/unary/shuttle/heater/as_heater in heater_turf) + if(as_heater.dir != dir) + continue + if(as_heater.panel_open) + continue + if(!as_heater.anchored) + continue + attached_heater = WEAKREF(as_heater) + break + update_engine() + return + +/obj/machinery/shuttle/engine/proc/update_engine() + if(!attached_heater) + icon_state = icon_state_off + thruster_active = FALSE + return + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater.resolve() + if(panel_open) + thruster_active = FALSE + else if(resolved_heater?.hasFuel(1)) + icon_state = icon_state_closed + thruster_active = TRUE + else + thruster_active = FALSE + icon_state = icon_state_off + return + +/obj/machinery/shuttle/engine/void/update_engine() + if(panel_open) + thruster_active = FALSE + return + thruster_active = TRUE + icon_state = icon_state_closed + return + +//Thanks to spaceheater.dm for inspiration :) +/obj/machinery/shuttle/engine/proc/fireEngine() + var/turf/heatTurf = loc + if(!heatTurf) + return + var/datum/gas_mixture/env = heatTurf.return_air() + var/heat_cap = env.heat_capacity() + var/req_power = abs(env.return_temperature() - ENGINE_HEAT_TARGET) * heat_cap + req_power = min(req_power, ENGINE_HEATING_POWER) + var/deltaTemperature = req_power / heat_cap + if(deltaTemperature < 0) + return + env.temperature += deltaTemperature + air_update_turf() + +/obj/machinery/shuttle/engine/default_change_direction_wrench(mob/user, obj/item/I) + . = ..() + update_engine() diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm new file mode 100644 index 0000000000..3c36e53b5a --- /dev/null +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -0,0 +1,132 @@ +//----------------------------------------------- +//--------------Engine Heaters------------------- +//This uses atmospherics, much like a thermomachine, +//but instead of changing temp, it stores plasma and uses +//it for the engine. +//----------------------------------------------- +/obj/machinery/atmospherics/components/unary/shuttle + name = "shuttle atmospherics device" + desc = "This does something to do with shuttle atmospherics" + icon_state = "heater" + icon = 'icons/turf/shuttle.dmi' + +/obj/machinery/atmospherics/components/unary/shuttle/heater + name = "engine heater" + desc = "Directs energy into compressed particles in order to power an attached thruster." + icon_state = "heater_pipe" + var/icon_state_closed = "heater_pipe" + var/icon_state_open = "heater_pipe_open" + var/icon_state_off = "heater_pipe" + idle_power_usage = 50 + circuit = /obj/item/circuitboard/machine/shuttle/heater + + density = TRUE + max_integrity = 400 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30) + layer = OBJ_LAYER + showpipe = TRUE + + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY + + var/gas_type = /datum/gas/plasma + var/efficiency_multiplier = 1 + var/gas_capacity = 0 + +/obj/machinery/atmospherics/components/unary/shuttle/heater/New() + . = ..() + GLOB.custom_shuttle_machines += src + SetInitDirections() + update_adjacent_engines() + updateGasStats() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/Destroy() + . = ..() + update_adjacent_engines() + GLOB.custom_shuttle_machines -= src + +/obj/machinery/atmospherics/components/unary/shuttle/heater/on_construction() + ..(dir, dir) + SetInitDirections() + update_adjacent_engines() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/default_change_direction_wrench(mob/user, obj/item/I) + if(!..()) + return FALSE + SetInitDirections() + var/obj/machinery/atmospherics/node = nodes[1] + if(node) + node.disconnect(src) + nodes[1] = null + if(!parents[1]) + return + nullifyPipenet(parents[1]) + + atmosinit() + node = nodes[1] + if(node) + node.atmosinit() + node.addMember(src) + build_network() + return TRUE + +/obj/machinery/atmospherics/components/unary/shuttle/heater/RefreshParts() + var/cap = 0 + var/eff = 0 + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + cap += M.rating + for(var/obj/item/stock_parts/micro_laser/L in component_parts) + eff += L.rating + gas_capacity = 5000 * ((cap - 1) ** 2) + 1000 + efficiency_multiplier = round(((eff / 2) / 2.8) ** 2, 0.1) + updateGasStats() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/examine(mob/user) + . = ..() + var/datum/gas_mixture/air_contents = airs[1] + . += "The engine heater's gas dial reads [air_contents.return_volume()] liters in internal tank.
    " + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/updateGasStats() + var/datum/gas_mixture/air_contents = airs[1] + if(!air_contents) + return + air_contents.volume = gas_capacity + air_contents.temperature = T20C + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/hasFuel(var/required) + var/datum/gas_mixture/air_contents = airs[1] + var/moles = air_contents.total_moles() + return moles >= required + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/consumeFuel(var/amount) + var/datum/gas_mixture/air_contents = airs[1] + air_contents.remove(amount) + return + +/obj/machinery/atmospherics/components/unary/shuttle/heater/attackby(obj/item/I, mob/living/user, params) + update_adjacent_engines() + if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) + return + if(default_pry_open(I)) + return + if(panel_open) + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + return ..() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/update_adjacent_engines() + var/engine_turf + switch(dir) + if(NORTH) + engine_turf = get_offset_target_turf(src, 0, -1) + if(SOUTH) + engine_turf = get_offset_target_turf(src, 0, 1) + if(EAST) + engine_turf = get_offset_target_turf(src, -1, 0) + if(WEST) + engine_turf = get_offset_target_turf(src, 1, 0) + if(!engine_turf) + return + for(var/obj/machinery/shuttle/engine/E in engine_turf) + E.check_setup() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 41dfe8e3ac..1730569e10 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -115,8 +115,8 @@ return PROCESS_KILL /obj/machinery/space_heater/RefreshParts() - var/laser = 0 - var/cap = 0 + var/laser = 2 + var/cap = 1 for(var/obj/item/stock_parts/micro_laser/M in component_parts) laser += M.rating for(var/obj/item/stock_parts/capacitor/M in component_parts) @@ -127,7 +127,7 @@ settableTemperatureRange = cap * 30 efficiency = (cap + 1) * 10000 - targetTemperature = CLAMP(targetTemperature, + targetTemperature = clamp(targetTemperature, max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) @@ -166,6 +166,11 @@ else return ..() +/obj/machinery/space_heater/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I, 5) + return TRUE + /obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -230,7 +235,7 @@ target= text2num(target) + T0C . = TRUE if(.) - targetTemperature = CLAMP(round(target), + targetTemperature = clamp(round(target), max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) if("eject") diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 746c17f225..3bb67e2a1c 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -21,6 +21,7 @@ desc = null icon = 'icons/obj/status_display.dmi' icon_state = "frame" + plane = ABOVE_WALL_PLANE density = FALSE use_power = IDLE_POWER_USE idle_power_usage = 10 @@ -289,7 +290,7 @@ if("shuttle_id") update() -/obj/machinery/status_display/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) +/obj/machinery/status_display/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) if (port && (shuttle_id == initial(shuttle_id) || override)) shuttle_id = port.id update() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b8d4ef26e8..50984c43b8 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -195,7 +195,7 @@ /obj/machinery/syndicatebomb/proc/settings(mob/user) var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station - timer_set = CLAMP(new_timer, minimum_timer, maximum_timer) + timer_set = clamp(new_timer, minimum_timer, maximum_timer) loc.visible_message("[icon2html(src, viewers(src))] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 4e3e11d1e2..a9b6736f05 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -100,7 +100,7 @@ obj/source, // the originating radio frequency, // the frequency the signal is taking place on atom/movable/virtualspeaker/speaker, // representation of the method's speaker - datum/language/language, // the langauge of the message + datum/language/language, // the language of the message message, // the text content of the message spans // the list of spans applied to the message ) diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index f2b2c594b7..fdf6ba121c 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -1,215 +1,164 @@ - +/* + The log console for viewing the entire telecomms + network log +*/ /obj/machinery/computer/telecomms/server name = "telecommunications server monitoring console" icon_screen = "comm_logs" desc = "Has full access to all details and record of the telecommunications network it's monitoring." + circuit = /obj/item/circuitboard/computer/comm_server + req_access = list(ACCESS_TCOMSAT) - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/obj/machinery/telecomms/server/SelectedServer + var/list/machinelist = list() // the servers located by the computer + var/obj/machinery/telecomms/server/SelectedMachine = null var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages + var/notice = "" + var/universal_translate = FALSE // set to TRUE(1) if it can translate nonhuman speech - var/universal_translate = 0 // set to 1 if it can translate nonhuman speech +/obj/machinery/computer/telecomms/server/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "tcommsserver", "Telecomms Server Monitor", 575, 400, master_ui, state) + ui.open() - req_access = list(ACCESS_TCOMSAT) - circuit = /obj/item/circuitboard/computer/comm_server +/obj/machinery/computer/telecomms/server/ui_data(mob/user) + var/list/data_out = list() + data_out["network"] = network + data_out["notice"] = notice -/obj/machinery/computer/telecomms/server/ui_interact(mob/user) - . = ..() - var/dat = "Telecommunication Server Monitor
    Telecommunications Server Monitor
    " + data_out["servers"] = list() + for(var/obj/machinery/telecomms/server/T in machinelist) + var/list/data = list( + name = T.name, + id = T.id, + ref = REF(T) + ) + data_out["servers"] += list(data) + data_out["servers"] = sortList(data_out["servers"]) //a-z sort - switch(screen) + if(!SelectedMachine) //null is bad. + data_out["selected"] = null //but in js, null is good. + return data_out + data_out["selected"] = list( + name = SelectedMachine.name, + id = SelectedMachine.id, + status = SelectedMachine.on, + traffic = SelectedMachine.totaltraffic, //note: total traffic, not traffic! + ref = REF(SelectedMachine) + ) + data_out["selected_logs"] = list() - // --- Main Menu --- + if(!LAZYLEN(SelectedMachine.log_entries)) + return data_out + + for(var/datum/comm_log_entry/C in SelectedMachine.log_entries) + var/list/data = list() + data["name"] = C.name //name of the file + data["ref"] = REF(C) + data["input_type"] = C.input_type //type of input ("Speech File" | "Execution Error"). - if(0) - dat += "
    [temp]
    " - dat += "
    Current Network: [network]
    " - if(servers.len) - dat += "
    Detected Telecommunication Servers:
      " - for(var/obj/machinery/telecomms/T in servers) - dat += "
    • [REF(T)] [T.name] ([T.id])
    • " - dat += "
    " - dat += "
    \[Flush Buffer\]" + if(C.input_type == "Speech File") //there is a reason why this is not a switch. + data["source"] = list( + name = C.parameters["name"], //name of the mob | obj + job = C.parameters["job"] //job of the mob | obj + ) + // -- Determine race of orator -- + var/mobtype = C.parameters["mobtype"] + var/race // The actual race of the mob + + if(ispath(mobtype, /mob/living/carbon/human) || ispath(mobtype, /mob/living/brain)) + race = "Humanoid" + else if(ispath(mobtype, /mob/living/simple_animal/slime)) + race = "Slime" // NT knows a lot about slimes, but not aliens. Can identify slimes + else if(ispath(mobtype, /mob/living/carbon/monkey)) + race = "Monkey" + else if(ispath(mobtype, /mob/living/silicon) || C.parameters["job"] == "AI") + race = "Artificial Life" // sometimes M gets deleted prematurely for AIs... just check the job + else if(isobj(mobtype)) + race = "Machinery" + else if(ispath(mobtype, /mob/living/simple_animal)) + race = "Domestic Animal" else - dat += "
    No servers detected. Scan for servers: \[Scan\]" + race = "Unidentifiable" + data["race"] = race + // based on [/atom/movable/proc/lang_treat] + var/message = C.parameters["message"] + var/language = C.parameters["language"] - // --- Viewing Server --- + if(universal_translate || user.has_language(language)) + message = message + else if(!user.has_language(language)) + var/datum/language/D = GLOB.language_datum_instances[language] + message = D.scramble(message) + else if(language) + message = "(unintelligible)" - if(1) - dat += "
    [temp]
    " - dat += "
    \[Main Menu\] \[Refresh\]
    " - dat += "
    Current Network: [network]" - dat += "
    Selected Server: [SelectedServer.id]" + data["message"] = message - if(SelectedServer.totaltraffic >= 1024) - dat += "
    Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

    " - else - dat += "
    Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

    " + else if(C.input_type == "Execution Error") + data["message"] = C.parameters["message"] + else + data["message"] = "(unintelligible)" + + data_out["selected_logs"] += list(data) + return data_out - dat += "Stored Logs:
      " - - var/i = 0 - for(var/datum/comm_log_entry/C in SelectedServer.log_entries) - i++ - - - // If the log is a speech file - if(C.input_type == "Speech File") - dat += "
    1. [C.name] \[X\]
      " - - // -- Determine race of orator -- - - var/mobtype = C.parameters["mobtype"] - var/race // The actual race of the mob - - if(ispath(mobtype, /mob/living/carbon/human) || ispath(mobtype, /mob/living/brain)) - race = "Humanoid" - - // NT knows a lot about slimes, but not aliens. Can identify slimes - else if(ispath(mobtype, /mob/living/simple_animal/slime)) - race = "Slime" - - else if(ispath(mobtype, /mob/living/carbon/monkey)) - race = "Monkey" - - // sometimes M gets deleted prematurely for AIs... just check the job - else if(ispath(mobtype, /mob/living/silicon) || C.parameters["job"] == "AI") - race = "Artificial Life" - - else if(isobj(mobtype)) - race = "Machinery" - - else if(ispath(mobtype, /mob/living/simple_animal)) - race = "Domestic Animal" - - else - race = "Unidentifiable" - - dat += "Data type: [C.input_type]
      " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
      " - dat += "Class: [race]
      " - var/message = C.parameters["message"] - var/language = C.parameters["language"] - - // based on [/atom/movable/proc/lang_treat] - if (universal_translate || user.has_language(language)) - message = "\"[message]\"" - else if (!user.has_language(language)) - var/datum/language/D = GLOB.language_datum_instances[language] - message = "\"[D.scramble(message)]\"" - else if (language) - message = "(unintelligible)" - - dat += "Contents: [message]
      " - dat += "

    2. " - - else if(C.input_type == "Execution Error") - dat += "
    3. [C.name] \[X\]
      " - dat += "Error: \"[C.parameters["message"]]\"
      " - dat += "

    4. " - - else - dat += "
    5. [C.name] \[X\]
      " - dat += "Data type: [C.input_type]
      " - dat += "Contents: (unintelligible)
      " - dat += "

    6. " - - - dat += "
    " - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/server/Topic(href, href_list) +/obj/machinery/computer/telecomms/server/ui_act(action, params) if(..()) return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in urange(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if(href_list["delete"]) - - if(!src.allowed(usr) && !(obj_flags & EMAGGED)) - to_chat(usr, "ACCESS DENIED.") + switch(action) + if("mainmenu") + SelectedMachine = null + notice = "" return + if("release") + machinelist = list() + notice = "" + return + if("network") //network change, flush the selected machine and buffer + var/newnet = sanitize(sanitize_text(params["value"], network)) + if(length(newnet) > 15) //i'm looking at you, you href fuckers + notice = "FAILED: Network tag string too lengthy" + return + network = newnet + SelectedMachine = null + machinelist = list() + return + if("probe") + if(LAZYLEN(machinelist) > 0) + notice = "FAILED: Cannot probe when buffer full" + return + + for(var/obj/machinery/telecomms/T in GLOB.telecomms_list) //telecomms just went global! + if(T.network == network) + LAZYADD(machinelist, T) - if(SelectedServer) + if(!LAZYLEN(machinelist)) + notice = "FAILED: Unable to locate network entities in \[[network]\]" + return + if("viewmachine") + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == params["value"]) + SelectedMachine = T + break + if("delete") + if(!src.allowed(usr) && !CHECK_BITFIELD(obj_flags, EMAGGED)) + to_chat(usr, "ACCESS DENIED.") + return - var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - - temp = "- DELETED ENTRY: [D.name] -" - - SelectedServer.log_entries.Remove(D) + if(!SelectedMachine) + notice = "ALERT: No server detected. Server may be nonresponsive." + return + var/datum/comm_log_entry/D = locate(params["value"]) + if(!istype(D)) + notice = "NOTICE: Object not found" + return + notice = "Deleted entry: [D.name]" + LAZYREMOVE(SelectedMachine.log_entries, D) qdel(D) - - else - temp = "- FAILED: NO SELECTED MACHINE -" - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/attackby() - . = ..() - updateUsrDialog() \ No newline at end of file diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 5e39997872..41d417967b 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -3,241 +3,360 @@ Lets you read PDA and request console messages. */ -#define LINKED_SERVER_NONRESPONSIVE (!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - // The monitor itself. /obj/machinery/computer/message_monitor name = "message monitor console" desc = "Used to monitor the crew's PDA messages, as well as request console messages." icon_screen = "comm_logs" circuit = /obj/item/circuitboard/computer/message_monitor - //Server linked to. + + //Servers, and server linked to. + var/network = "tcommsat" // the network to probe + var/list/machinelist = list() // the servers located by the computer var/obj/machinery/telecomms/message_server/linkedServer = null + //Sparks effect - For emag var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread + //Messages - Saves me time if I want to change something. - var/noserver = "ALERT: No server detected." - var/incorrectkey = "ALERT: Incorrect decryption key!" - var/defaultmsg = "Welcome. Please select an option." - var/rebootmsg = "%$&(�: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" + var/noserver = "ALERT: No server detected. Server may be nonresponsive." + var/incorrectkey = "ALERT: Incorrect decryption key!" + var/rebootmsg = "%$�(�:SYS&EM INTRN@L ACfES VIOL�TIa█ DEtE₡TED! Ree3ARcinG A█ BAaKUP RdST�RE PbINT \[0xcff32ca/ - PLfASE aAIT" + //Computer properties - var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message var/hacking = FALSE // Is it being hacked into by the AI/Cyborg - var/message = "System bootup complete. Please select an option." // The message that shows on the main menu. - var/auth = FALSE // Are they authenticated? - var/optioncount = 7 + var/message = "" // The message that shows on the main menu. + var/auth = FALSE // Are they authenticated? + // Custom Message Properties - var/customsender = "System Administrator" var/obj/item/pda/customrecepient = null + var/customsender = "System Administrator" var/customjob = "Admin" var/custommessage = "This is a test, please ignore." light_color = LIGHT_COLOR_GREEN +/obj/machinery/computer/message_monitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE,\ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + + if(!ui) + ui = new(user, src, ui_key, "telepdalog", name, 727, 510, master_ui, state) + ui.open() + +/obj/machinery/computer/message_monitor/ui_static_data(mob/user) + var/list/data_out = list() + + if(!linkedServer || !auth) // no need building this if the usr isn't authenticated + return data_out + + data_out["recon_logs"] = list() + var/i1 = 0 + for(var/datum/data_rc_msg/rc in linkedServer.rc_msgs) + i1++ + if(i1 > 3000) + break + var/list/data = list( + sender = rc.send_dpt, + recipient = rc.rec_dpt, + message = rc.message, + stamp = rc.stamp, + auth = rc.id_auth, + priority = rc.priority, + ref = REF(rc) + ) + data_out["recon_logs"] += list(data) + + data_out["message_logs"] = list() + var/i2 = 0 + for(var/datum/data_pda_msg/pda in linkedServer.pda_msgs) + i2++ + if(i2 > 3000) + break + var/list/data = list( + sender = pda.sender, + recipient = pda.recipient, + message = pda.message, + picture = pda.picture ? TRUE : FALSE, + ref = REF(pda) + ) + data_out["message_logs"] += list(data) + + return data_out + +/obj/machinery/computer/message_monitor/ui_data(mob/user) + var/list/data_out = list() + + data_out["notice"] = message + data_out["authenticated"] = auth + data_out["network"] = network + + var/mob/living/silicon/S = user + if(istype(S) && S.hack_software) + data_out["canhack"] = TRUE + + data_out["hacking"] = (hacking || CHECK_BITFIELD(obj_flags, EMAGGED)) + if(hacking) + data_out["borg"] = ((isAI(user) || iscyborg(user)) && !CHECK_BITFIELD(obj_flags, EMAGGED)) //even borgs can't read emag + return data_out + + data_out["servers"] = list() + for(var/obj/machinery/telecomms/message_server/T in machinelist) + var/list/data = list( + name = T.name, + id = T.id, + ref = REF(T) + ) + data_out["servers"] += list(data) // This /might/ cause an oom. Too bad! + data_out["servers"] = sortList(data_out["servers"]) //a-z sort + + data_out["fake_message"] = list( + sender = customsender, + job = customjob, + message = custommessage, + recepient = (customrecepient ? "[customrecepient.owner] ([customrecepient.ownjob])" : null) + ) + + if(!linkedServer) + data_out["selected"] = null + return data_out + + data_out["selected"] = list( + name = linkedServer.name, + id = linkedServer.id, + ref = REF(linkedServer), + status = (linkedServer.on && (linkedServer.toggled != FALSE)) // returns true if server is running + ) + return data_out + +/obj/machinery/computer/message_monitor/ui_act(action, params) + if(..()) + return + switch(action) + if("mainmenu") //deselect + linkedServer = null + auth = FALSE + message = "" + return + if("release") //release server listing + machinelist = list() + message = "" + return + if("network") //network change, flush the selected machine and buffer, and de-auth them, if blank, return default + var/newnet = sanitize(sanitize_text(params["value"], network)) + if(length(newnet) > 15) //i'm looking at you, you href fuckers + message = "FAILED: Network tag string too lengthy" + return + network = newnet + linkedServer = null + machinelist = list() + auth = FALSE + message = "NOTICE: Network change detected. Server disconnected, please re-authenticate." + return + if("probe") //probe network for the pda serbs + if(LAZYLEN(machinelist) > 0) + message = "FAILED: Cannot probe when buffer full" + return + + for(var/obj/machinery/telecomms/message_server/T in GLOB.telecomms_list) + if(T.network == network) + LAZYADD(machinelist, T) + + if(!LAZYLEN(machinelist)) + message = "FAILED: Unable to locate network entities in \[[network]\]" + return + if("viewmachine") //selected but not authorized + for(var/obj/machinery/telecomms/message_server/T in machinelist) + if(T.id == params["value"]) + linkedServer = T + break + + if("auth") + if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + if(auth) + auth = FALSE + update_static_data(usr) //make sure it's cleared! + return + var/dkey = stripped_input(usr, "Please enter the decryption key.") + if(dkey && dkey == "") + return + if(linkedServer.decryptkey == dkey) + auth = TRUE + else + message = incorrectkey + update_static_data(usr) + if("change_auth") + if(!auth) + message = "WARNING: Auth failed! Please log in to change the password!" + return + else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + + var/dkey = stripped_input(usr, "Please enter the old decryption key.") + if(dkey && dkey != "") + if(linkedServer.decryptkey == dkey) + var/newkey = stripped_input(usr, "Please enter the new key (3 - 20 characters max):") + if(!ISINRANGE(length(newkey), 3, 20)) + message = "NOTICE: Decryption key length too long/short!" + return + if(newkey && newkey != "") + linkedServer.decryptkey = newkey + message = "NOTICE: Decryption key set." + return + message = incorrectkey + + if("hack") + if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + + var/mob/living/silicon/S = usr + if(istype(S) && S.hack_software) + hacking = TRUE + //Time it takes to bruteforce is dependant on the password length. + addtimer(CALLBACK(src, .proc/BruteForce, usr), (10 SECONDS) * length(linkedServer.decryptkey)) + + if("del_log") + if(!auth) + message = "WARNING: Auth failed! Delete aborted!" + return + else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + + var/datum/data_ref = locate(params["ref"]) + if(istype(data_ref, /datum/data_rc_msg)) + LAZYREMOVE(linkedServer.rc_msgs, data_ref) + message = "NOTICE: Log Deleted!" + else if(istype(data_ref, /datum/data_pda_msg)) + LAZYREMOVE(linkedServer.pda_msgs, data_ref) + message = "NOTICE: Log Deleted!" + else + message = "NOTICE: Log not found! It may have already been deleted" + update_static_data(usr) + + if("clear_log") + if(!auth) + message = "WARNING: Auth failed! Delete aborted!" + return + else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + + var/what = params["value"] + if(what == "pda_logs") + linkedServer.pda_msgs = list() + if(what == "rc_msgs") + linkedServer.rc_msgs = list() + update_static_data(usr) + if("fake") + if(!auth) + message = "WARNING: Auth failed!" + return + else if(!(linkedServer.on && (linkedServer.toggled != FALSE))) + message = noserver + return + + if("reset" in params) + ResetMessage() + return + if("send" in params) + if(isnull(customrecepient)) + message = "NOTICE: No recepient selected!" + return + if(length(custommessage) <= 0 || custommessage == "") + message = "NOTICE: No message entered!" + return + if(length(customjob) <= 0 || customjob == "") + customjob = "Admin" + return + if(length(customsender) <= 0 || customsender == "") + customsender = "UNKNOWN" + //sanitize text!!! + var/datum/signal/subspace/pda/signal = new(src, list( + "name" = sanitize(customsender), + "job" = sanitize(customjob), + "message" = sanitize(custommessage), + "emojis" = TRUE, + "targets" = list("[customrecepient.owner] ([customrecepient.ownjob])") + )) + // this will log the signal and transmit it to the target + linkedServer.receive_information(signal, null) + usr.log_message("(PDA: [name] | [usr.real_name]) sent \"[sanitize(custommessage)]\" to [signal.format_target()]", LOG_PDA) + message = "" + return + // Do not check if it's blank yet + // But do check if it's above our set limit (for people who manualy send hrefs at us!) + if("sender" in params) + var/S = params["sender"] + if(length(S) > MAX_NAME_LEN) + message = "FAILED: Job string too lengthy" + return + customsender = S + return + if("job" in params) + var/J = params["job"] + if(length(J) > 100) + message = "FAILED: Job string too lengthy" + return + + customjob = J + return + if("message" in params) + var/M = params["message"] + if(length(M) > MAX_MESSAGE_LEN) + message = "FAILED: Message string too lengthy" + return + custommessage = M + return + + if("recepient" in params) + // Get out list of viable PDAs + var/list/obj/item/pda/sendPDAs = get_viewable_pdas() + if(GLOB.PDAs && LAZYLEN(GLOB.PDAs) > 0) + customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs) + else + customrecepient = null + return + if("refresh") + update_static_data(usr) + /obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params) - if(istype(O, /obj/item/screwdriver) && (obj_flags & EMAGGED)) - //Stops people from just unscrewing the monitor and putting it back to get the console working again. + if(istype(O, /obj/item/screwdriver) && CHECK_BITFIELD(obj_flags, EMAGGED)) + //Stops people from just unscrewing the monitor and putting it back to get the console working again. + //Why this though, you should make it emag to a board level. (i wont do it) to_chat(user, "It is too hot to mess with!") else return ..() /obj/machinery/computer/message_monitor/emag_act(mob/user) . = ..() - if(obj_flags & EMAGGED) + if(CHECK_BITFIELD(obj_flags, EMAGGED)) return if(isnull(linkedServer)) to_chat(user, "A no server error appears on the screen.") return - obj_flags |= EMAGGED - screen = 2 + ENABLE_BITFIELD(obj_flags, EMAGGED) spark_system.set_up(5, 0, src) spark_system.start() var/obj/item/paper/monitorkey/MK = new(loc, linkedServer) // Will help make emagging the console not so easy to get away with. MK.info += "

    �%@%(*$%&(�&?*(%&�/{}" - var/time = 100 * length(linkedServer.decryptkey) - addtimer(CALLBACK(src, .proc/UnmagConsole), time) - message = rebootmsg + addtimer(CALLBACK(src, .proc/UnmagConsole), (10 SECONDS) * length(linkedServer.decryptkey)) + //message = rebootmsg return TRUE /obj/machinery/computer/message_monitor/New() . = ..() GLOB.telecomms_list += src -/obj/machinery/computer/message_monitor/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/computer/message_monitor/LateInitialize() - //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list. - if(!linkedServer) - for(var/obj/machinery/telecomms/message_server/S in GLOB.telecomms_list) - linkedServer = S - break - /obj/machinery/computer/message_monitor/Destroy() GLOB.telecomms_list -= src . = ..() -/obj/machinery/computer/message_monitor/ui_interact(mob/living/user) - . = ..() - //If the computer is being hacked or is emagged, display the reboot message. - if(hacking || (obj_flags & EMAGGED)) - message = rebootmsg - var/dat = "
    " - - if(auth) - dat += "

    \[Authenticated\] /" - dat += " Server Power: [linkedServer && linkedServer.toggled ? "\[On\]":"\[Off\]"]

    " - else - dat += "

    \[Unauthenticated\] /" - dat += " Server Power: [linkedServer && linkedServer.toggled ? "\[On\]":"\[Off\]"]

    " - - if(hacking || (obj_flags & EMAGGED)) - screen = 2 - else if(!auth || LINKED_SERVER_NONRESPONSIVE) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - screen = 0 - - switch(screen) - //Main menu - if(0) - // = TAB - var/i = 0 - dat += "
    [++i]. Link To A Server
    " - if(auth) - if(LINKED_SERVER_NONRESPONSIVE) - dat += "
    ERROR: Server not found!
    " - else - dat += "
    [++i]. View Message Logs
    " - dat += "
    [++i]. View Request Console Logs
    " - dat += "
    [++i]. Clear Message Logs
    " - dat += "
    [++i]. Clear Request Console Logs
    " - dat += "
    [++i]. Set Custom Key
    " - dat += "
    [++i]. Send Admin Message
    " - else - for(var/n = ++i; n <= optioncount; n++) - dat += "
    [n]. ---------------
    " - var/mob/living/silicon/S = usr - if(istype(S) && S.hack_software) - //Malf/Traitor AIs can bruteforce into the system to gain the Key. - dat += "
    *&@#. Bruteforce Key
    " - else - dat += "
    " - - //Bottom message - if(!auth) - dat += "

    Please authenticate with the server in order to show additional options." - else - dat += "

    Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties." - - //Message Logs - if(1) - var/index = 0 - dat += "
    Back - Refresh

    " - dat += "" - for(var/datum/data_pda_msg/pda in linkedServer.pda_msgs) - index++ - if(index > 3000) - break - // Del - Sender - Recepient - Message - // X - Al Green - Your Mom - WHAT UP!? - dat += "" - dat += "
    XSenderRecipientMessage
    X
    [pda.sender][pda.recipient][pda.message][pda.picture ? " (Photo)":""]
    " - //Hacking screen. - if(2) - if(isAI(user) || iscyborg(user)) - dat += "Brute-forcing for server key.
    It will take 20 seconds for every character that the password has." - dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time." - else - //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever. - dat += {"01000010011100100111010101110100011001010010110
    - 10110011001101111011100100110001101101001011011100110011
    - 10010000001100110011011110111001000100000011100110110010
    - 10111001001110110011001010111001000100000011010110110010
    - 10111100100101110001000000100100101110100001000000111011
    - 10110100101101100011011000010000001110100011000010110101
    - 10110010100100000001100100011000000100000011100110110010
    - 10110001101101111011011100110010001110011001000000110011
    - 00110111101110010001000000110010101110110011001010111001
    - 00111100100100000011000110110100001100001011100100110000
    - 10110001101110100011001010111001000100000011101000110100
    - 00110000101110100001000000111010001101000011001010010000
    - 00111000001100001011100110111001101110111011011110111001
    - 00110010000100000011010000110000101110011001011100010000
    - 00100100101101110001000000111010001101000011001010010000
    - 00110110101100101011000010110111001110100011010010110110
    - 10110010100101100001000000111010001101000011010010111001
    - 10010000001100011011011110110111001110011011011110110110
    - 00110010100100000011000110110000101101110001000000111001
    - 00110010101110110011001010110000101101100001000000111100
    - 10110111101110101011100100010000001110100011100100111010
    - 10110010100100000011010010110111001110100011001010110111
    - 00111010001101001011011110110111001110011001000000110100
    - 10110011000100000011110010110111101110101001000000110110
    - 00110010101110100001000000111001101101111011011010110010
    - 10110111101101110011001010010000001100001011000110110001
    - 10110010101110011011100110010000001101001011101000010111
    - 00010000001001101011000010110101101100101001000000111001
    - 10111010101110010011001010010000001101110011011110010000
    - 00110100001110101011011010110000101101110011100110010000
    - 00110010101101110011101000110010101110010001000000111010
    - 00110100001100101001000000111001001101111011011110110110
    - 10010000001100100011101010111001001101001011011100110011
    - 10010000001110100011010000110000101110100001000000111010
    - 001101001011011010110010100101110"} - - //Fake messages - if(3) - dat += "
    Back - Reset

    " - - dat += {" - - - - "} - //Sender - Sender's Job - Recepient - Message - //Al Green- Your Dad - Your Mom - WHAT UP!? - - dat += {" - - - "} - dat += "
    SenderSender's JobRecipientMessage
    [customsender][customjob][customrecepient ? customrecepient.owner : "NONE"][custommessage]

    Send" - - //Request Console Logs - if(4) - - var/index = 0 - /* data_rc_msg - X - 5% - var/rec_dpt = "Unspecified" //name of the person - 15% - var/send_dpt = "Unspecified" //name of the sender- 15% - var/message = "Blank" //transferred message - 300px - var/stamp = "Unstamped" - 15% - var/id_auth = "Unauthenticated" - 15% - var/priority = "Normal" - 10% - */ - dat += "
    Back - Refresh

    " - dat += {" - "} - for(var/datum/data_rc_msg/rc in linkedServer.rc_msgs) - index++ - if(index > 3000) - break - // Del - Sender - Recepient - Message - // X - Al Green - Your Mom - WHAT UP!? - dat += {" - "} - dat += "
    XSending Dep.Receiving Dep.MessageStampID Auth.Priority.
    X
    [rc.send_dpt][rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
    " - - message = defaultmsg - var/datum/browser/popup = new(user, "hologram_console", name, 700, 700) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - /obj/machinery/computer/message_monitor/proc/BruteForce(mob/user) if(isnull(linkedServer)) to_chat(user, "Could not complete brute-force: Linked Server Disconnected!") @@ -245,10 +364,11 @@ var/currentKey = linkedServer.decryptkey to_chat(user, "Brute-force completed! The key is '[currentKey]'.") hacking = FALSE - screen = 0 // Return the screen back to normal + message = "" /obj/machinery/computer/message_monitor/proc/UnmagConsole() - obj_flags &= ~EMAGGED + DISABLE_BITFIELD(obj_flags, EMAGGED) + message = "" /obj/machinery/computer/message_monitor/proc/ResetMessage() customsender = "System Administrator" @@ -256,199 +376,12 @@ custommessage = "This is a test, please ignore." customjob = "Admin" -/obj/machinery/computer/message_monitor/Topic(href, href_list) - if(..()) - return - - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr)) - //Authenticate - if (href_list["auth"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - auth = FALSE - screen = 0 - else - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) - if(dkey && dkey != "") - if(linkedServer.decryptkey == dkey) - auth = TRUE - else - message = incorrectkey - - //Turn the server on/off. - if (href_list["active"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - linkedServer.toggled = !linkedServer.toggled - //Find a server - if (href_list["find"]) - var/list/message_servers = list() - for (var/obj/machinery/telecomms/message_server/M in GLOB.telecomms_list) - message_servers += M - - if(message_servers.len > 1) - linkedServer = input(usr, "Please select a server.", "Select a server.", null) as null|anything in message_servers - message = "NOTICE: Server selected." - else if(message_servers.len > 0) - linkedServer = message_servers[1] - message = "NOTICE: Only Single Server Detected - Server selected." - else - message = noserver - - //View the logs - KEY REQUIRED - if (href_list["view_logs"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - screen = 1 - - //Clears the logs - KEY REQUIRED - if (href_list["clear_logs"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - linkedServer.pda_msgs = list() - message = "NOTICE: Logs cleared." - //Clears the request console logs - KEY REQUIRED - if (href_list["clear_requests"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - linkedServer.rc_msgs = list() - message = "NOTICE: Logs cleared." - //Change the password - KEY REQUIRED - if (href_list["pass"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - var/dkey = stripped_input(usr, "Please enter the decryption key.") - if(dkey && dkey != "") - if(linkedServer.decryptkey == dkey) - var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) - if(length(newkey) <= 3) - message = "NOTICE: Decryption key too short!" - else if(length(newkey) > 16) - message = "NOTICE: Decryption key too long!" - else if(newkey && newkey != "") - linkedServer.decryptkey = newkey - message = "NOTICE: Decryption key set." - else - message = incorrectkey - - //Hack the Console to get the password - if (href_list["hack"]) - var/mob/living/silicon/S = usr - if(istype(S) && S.hack_software) - hacking = TRUE - screen = 2 - //Time it takes to bruteforce is dependant on the password length. - spawn(100*length(linkedServer.decryptkey)) - if(src && linkedServer && usr) - BruteForce(usr) - //Delete the log. - if (href_list["delete_logs"]) - //Are they on the view logs screen? - if(screen == 1) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else //if(istype(href_list["delete_logs"], /datum/data_pda_msg)) - linkedServer.pda_msgs -= locate(href_list["delete_logs"]) - message = "NOTICE: Log Deleted!" - //Delete the request console log. - if (href_list["delete_requests"]) - //Are they on the view logs screen? - if(screen == 4) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else //if(istype(href_list["delete_logs"], /datum/data_pda_msg)) - linkedServer.rc_msgs -= locate(href_list["delete_requests"]) - message = "NOTICE: Log Deleted!" - //Create a custom message - if (href_list["msg"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - screen = 3 - //Fake messaging selection - KEY REQUIRED - if (href_list["select"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - screen = 0 - else - switch(href_list["select"]) - - //Reset - if("Reset") - ResetMessage() - - //Select Your Name - if("Sender") - customsender = stripped_input(usr, "Please enter the sender's name.") || customsender - - //Select Receiver - if("Recepient") - //Get out list of viable PDAs - var/list/obj/item/pda/sendPDAs = get_viewable_pdas() - if(GLOB.PDAs && GLOB.PDAs.len > 0) - customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs) - else - customrecepient = null - - //Enter custom job - if("RecJob") - customjob = stripped_input(usr, "Please enter the sender's job.") || customjob - - //Enter message - if("Message") - custommessage = stripped_input(usr, "Please enter your message.") || custommessage - - //Send message - if("Send") - if(isnull(customsender) || customsender == "") - customsender = "UNKNOWN" - - if(isnull(customrecepient)) - message = "NOTICE: No recepient selected!" - return attack_hand(usr) - - if(isnull(custommessage) || custommessage == "") - message = "NOTICE: No message entered!" - return attack_hand(usr) - - var/datum/signal/subspace/pda/signal = new(src, list( - "name" = "[customsender]", - "job" = "[customjob]", - "message" = custommessage, - "emojis" = TRUE, - "targets" = list("[customrecepient.owner] ([customrecepient.ownjob])") - )) - // this will log the signal and transmit it to the target - linkedServer.receive_information(signal, null) - usr.log_message("(PDA: [name] | [usr.real_name]) sent \"[custommessage]\" to [signal.format_target()]", LOG_PDA) - - - //Request Console Logs - KEY REQUIRED - if(href_list["view_requests"]) - if(LINKED_SERVER_NONRESPONSIVE) - message = noserver - else if(auth) - screen = 4 - - if (href_list["back"]) - screen = 0 - - return attack_hand(usr) - -#undef LINKED_SERVER_NONRESPONSIVE - /obj/item/paper/monitorkey name = "monitor decryption key" /obj/item/paper/monitorkey/Initialize(mapload, obj/machinery/telecomms/message_server/server) ..() - if (server) + if(server) print(server) return INITIALIZE_HINT_NORMAL else @@ -460,7 +393,7 @@ add_overlay("paper_words") /obj/item/paper/monitorkey/LateInitialize() - for (var/obj/machinery/telecomms/message_server/server in GLOB.telecomms_list) - if (server.decryptkey) + for(var/obj/machinery/telecomms/message_server/server in GLOB.telecomms_list) + if(server.decryptkey) print(server) break diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index 23c03514ca..bca16a0de4 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -1,4 +1,3 @@ - /* Telecomms monitor tracks the overall trafficing of a telecommunications network and displays a heirarchy of linked machines. @@ -10,117 +9,98 @@ icon_screen = "comm_monitor" desc = "Monitors the details of the telecommunications network it's synced with." - var/screen = 0 // the screen number: var/list/machinelist = list() // the machines located by the computer - var/obj/machinery/telecomms/SelectedMachine + var/obj/machinery/telecomms/SelectedMachine = null var/network = "NULL" // the network to probe + var/notice = "" - var/temp = "" // temporary feedback messages circuit = /obj/item/circuitboard/computer/comm_monitor -/obj/machinery/computer/telecomms/monitor/ui_interact(mob/user) - . = ..() - var/dat = "Telecommunications Monitor
    Telecommunications Monitor
    " +/obj/machinery/computer/telecomms/monitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE,\ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - switch(screen) + if(!ui) + ui = new(user, src, ui_key, "telemonitor", name, 575, 400, master_ui, state) + ui.open() +/obj/machinery/computer/telecomms/monitor/ui_data(mob/user) + var/list/data_out = list() + data_out["network"] = network + data_out["notice"] = notice - // --- Main Menu --- + data_out["servers"] = list() + for(var/obj/machinery/telecomms/T in machinelist) + var/list/data = list( + name = T.name, + id = T.id, + ref = REF(T) + ) + data_out["servers"] += list(data) + data_out["servers"] = sortList(data_out["servers"]) - if(0) - dat += "
    [temp]

    " - dat += "
    Current Network: [network]
    " - if(machinelist.len) - dat += "
    Detected Network Entities:
      " - for(var/obj/machinery/telecomms/T in machinelist) - dat += "
    • [REF(T)] [T.name] ([T.id])
    • " - dat += "
    " - dat += "
    \[Flush Buffer\]" - else - dat += "\[Probe Network\]" + if(!SelectedMachine) //null is bad. + data_out["selected"] = null //but in js, null is good. + return data_out + + data_out["selected"] = list( + name = SelectedMachine.name, + id = SelectedMachine.id, + status = SelectedMachine.on, + traffic = SelectedMachine.traffic, + netspeed = SelectedMachine.netspeed, + freq_listening = SelectedMachine.freq_listening, + long_range_link = SelectedMachine.long_range_link, + ref = REF(SelectedMachine) + ) + data_out["selected_servers"] = list() + for(var/obj/machinery/telecomms/T in SelectedMachine.links) + if(!T.hide) + var/list/data = list( + name = T.name, + id = T.id, + ref = REF(T) + ) + data_out["selected_servers"] += list(data) + return data_out - // --- Viewing Machine --- - - if(1) - dat += "
    [temp]
    " - dat += "
    \[Main Menu\]
    " - dat += "
    Current Network: [network]
    " - dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
    " - dat += "Linked Entities:
      " - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - if(!T.hide) - dat += "
    1. [REF(T.id)] [T.name] ([T.id])
    2. " - dat += "
    " - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) +/obj/machinery/computer/telecomms/monitor/ui_act(action, params) if(..()) return + switch(action) + if("mainmenu") + SelectedMachine = null + notice = "" + return + if("release") + machinelist = list() + notice = "" + return + if("network") //network change, flush the selected machine and buffer + var/newnet = sanitize(sanitize_text(params["value"], network)) + if(length(newnet) > 15) //i'm looking at you, you href fuckers + notice = "FAILED: Network tag string too lengthy" + return + network = newnet + SelectedMachine = null + machinelist = list() + return + if("probe") + if(LAZYLEN(machinelist) > 0) + notice = "FAILED: Cannot probe when buffer full" + return + + for(var/obj/machinery/telecomms/T in GLOB.telecomms_list) + if(T.network == network) + LAZYADD(machinelist, T) - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewmachine"]) - screen = 1 - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == href_list["viewmachine"]) - SelectedMachine = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - machinelist = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("probe") - if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/T in urange(25, src)) - if(T.network == network) - machinelist.Add(T) - - if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" - else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" - - screen = 0 - - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - network = newnet - screen = 0 - machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/attackby() - . = ..() - updateUsrDialog() \ No newline at end of file + if(!LAZYLEN(machinelist)) + notice = "FAILED: Unable to locate network entities in \[[network]\]" + return + if("viewmachine") + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == params["value"]) + SelectedMachine = T + break diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 4de8929b6b..6d299f4413 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -9,9 +9,9 @@ var/temp = "" // output message /obj/machinery/telecomms/attackby(obj/item/P, mob/user, params) - var/icon_closed = initial(icon_state) var/icon_open = "[initial(icon_state)]_o" + if(!on) icon_closed = "[initial(icon_state)]_off" icon_open = "[initial(icon_state)]_o_off" @@ -27,78 +27,240 @@ else return ..() -/obj/machinery/telecomms/ui_interact(mob/user) - . = ..() - // You need a multitool to use this, or be silicon - if(!hasSiliconAccessInArea(user)) - // istype returns false if the value is null - if(!istype(user.get_active_held_item(), /obj/item/multitool)) - return +/obj/machinery/telecomms/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE,\ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + if(!canInteract(user)) + if(ui) + ui.close() //haha no. + return + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + + if(!ui) + ui = new(user, src, ui_key, "teleinteract", "[name] Access", 520, 500, master_ui, state) + ui.open() + +/obj/machinery/telecomms/ui_data(mob/user) + . = list() //cpypaste from the vending bus + .["notice"] = temp + .["multitool"] = FALSE var/obj/item/multitool/P = get_multitool(user) - var/dat - dat = "[name]

    [name] Access

    " - dat += "
    [temp]
    " - dat += "
    Power Status: [toggled ? "On" : "Off"]" - if(on && toggled) - if(id != "" && id) - dat += "
    Identification String: [id]" - else - dat += "
    Identification String: NULL" - dat += "
    Network: [network]" - dat += "
    Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" - if(hide) - dat += "
    Shadow Link: ACTIVE" + if(P) + .["multitool"] = TRUE + .["multitool_buf"] = null //to clean the list! + var/obj/machinery/telecomms/T = P.buffer + if(istype(T)) + .["multitool_buf"] = list( + name = T.name, + id = T.id + ) - //Show additional options for certain machines. - dat += Options_Menu() + .["machine"] = list() + .["machine"]["power"] = toggled + .["machine"]["id"] = id + .["machine"]["network"] = network + .["machine"]["prefab"] = LAZYLEN(autolinkers) ? TRUE : FALSE + .["machine"]["hidden"] = hide - dat += "
    Linked Network Entities:
      " + .["links"] = list() + for(var/obj/machinery/telecomms/T in links) + if(T.hide && !hide) + continue + var/list/data = list( + name = T.name, + id = T.id, + ref = REF(T) + ) + .["links"] += list(data) - var/i = 0 - for(var/obj/machinery/telecomms/T in links) - i++ - if(T.hide && !hide) - continue - dat += "
    1. [REF(T)] [T.name] ([T.id]) \[X\]
    2. " - dat += "
    " + .["freq_listening"] = freq_listening - dat += "
    Filtering Frequencies: " +/obj/machinery/telecomms/relay/ui_data(mob/user) + . = ..() + .["machine"]["isrelay"] = TRUE + .["machine"]["broadcast"] = broadcasting + .["machine"]["receiving"] = receiving - i = 0 - if(length(freq_listening)) - for(var/x in freq_listening) - i++ - if(i < length(freq_listening)) - dat += "[format_frequency(x)] GHz\[X\]; " - else - dat += "[format_frequency(x)] GHz\[X\]" - else - dat += "NONE" +/obj/machinery/telecomms/bus/ui_data(mob/user) + . = ..() + .["machine"]["isbus"] = TRUE + .["machine"]["chang_frequency"] = change_frequency + .["machine"]["chang_freq_value"] = change_freq_value - dat += "
    \[Add Filter\]" - dat += "
    " - - if(P) - var/obj/machinery/telecomms/T = P.buffer - if(istype(T)) - dat += "

    MULTITOOL BUFFER: [T] ([T.id]) \[Link\] \[Flush\]" - else - dat += "

    MULTITOOL BUFFER:
    \[Add Machine\]" - - dat += "
    " +/obj/machinery/telecomms/ui_act(action, params, datum/tgui/ui) + if(!canInteract(usr)) + if(ui) + ui.close() //haha no. + return temp = "" - user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") - onclose(user, "tcommachine") - return TRUE + + switch(action) + if("toggle") + toggled = !toggled + temp = "-% [src.name] has been [toggled ? "activated" : "deactivated"]. %-" + update_power() + return + if("machine") + if("id" in params) + if(!canAccess(usr)) + return + //if the text is blank, return the id it was using + var/newid = sanitize_text(reject_bad_text(params["id"]), id) // reject_bad_text can return null! + if(length(newid) > 255) + temp = "-% Too many characters in new id tag. %-" + return + temp = "-% New ID assigned: \"[newid]\". %-" + id = newid + return + if("network" in params) + if(!canAccess(usr)) + return + var/newnet = sanitize(sanitize_text(params["network"], network)) + if(length(newnet) > 15) + temp = "-% Too many characters in new network tag. %-" + return + network = newnet + links = list() + temp = "-% New network tag assigned: \"[network]\" %-" + return + if("multitool") + var/obj/item/multitool/P = get_multitool(usr) + if("Link" in params) + if(!canAccess(usr)) + return + if(!istype(P)) + temp = "-% Unable to acquire buffer %-" + return + + var/obj/machinery/telecomms/T = P.buffer + if(!istype(T) || T == src) + temp = "-% Unable to acquire buffer %-" + return + + if(!(src in T.links)) + LAZYADD(T.links, src) + + if(!(T in links)) + LAZYADD(links, T) + temp = "-% Successfully linked with [REF(T)] [T.name] %-" + + if("Flush" in params) + if(!istype(P)) + temp = "-% Unable to acquire multitool %-" + return + + temp = "-% Buffer successfully flushed. %-" + P.buffer = null + + if("Add" in params) + if(!canAccess(usr)) + return + if(!istype(P)) + temp = "-% Unable to acquire multitool %-" + return + + P.buffer = src + temp = "% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-" + + if("unlink") + var/obj/machinery/telecomms/T = locate(params["value"]) + if(!canAccess(usr)) + return + if(!istype(T)) + temp = "-% Unable to locate machine to unlink from, try again. %-" + return + + temp = "-% Removed [REF(T)] [T.name] from linked entities. %-" + if(T.links) //lazyrem makes blank list null, which is good but some might cause runtime ee's + T.links.Remove(src) + links.Remove(T) + if("freq") + if("add" in params) + var/newfreq = input("Specify a new frequency to filter (GHz). Decimals assigned automatically.", src.name, null) as null|num + if(!canAccess(usr) || !newfreq || isnull(newfreq)) + return + + if(findtext(num2text(newfreq), ".")) // did they not read the text? + newfreq *= 10 // shift the decimal one place + + newfreq = sanitize_frequency(newfreq, TRUE) //sanitize + if(newfreq == FREQ_SYNDICATE) + temp = "-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-" + return + if(newfreq in freq_listening) + temp = "-% Error: Frequency already filtered %-" + return + + LAZYADD(freq_listening, newfreq) + temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" + + if("remove" in params) + if(!canAccess(usr)) + return + var/x = text2num(params["remove"]) + temp = "-% Removed frequency filter [x] %-" + freq_listening.Remove(x) + +/obj/machinery/telecomms/relay/ui_act(action, params) + ..() + switch(action) + if("relay") + if("broadcast" in params) + if(!canAccess(usr)) + return + broadcasting = !broadcasting + temp = "-% Broadcasting mode changed. %-" + return + if("receiving" in params) + if(!canAccess(usr)) + return + receiving = !receiving + temp = "-% Receiving mode changed. %-" + +/obj/machinery/telecomms/bus/ui_act(action, params) + ..() + switch(action) + if("frequency") + if("toggle" in params) + if(!canAccess(usr)) + return + change_frequency = !change_frequency + return + if("adjust" in params) + var/newfreq = text2num(params["adjust"]) + if(!canAccess(usr) || !newfreq) + return + // this should return true, unless the href is handcrafted + if(findtext(num2text(newfreq), ".")) + newfreq *= 10 // shift the decimal one place + + newfreq = sanitize_frequency(newfreq, TRUE) + if(newfreq == FREQ_SYNDICATE) + temp = "-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-" + return + + change_freq_value = newfreq + temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" + return + +// Check if the user can use it. +/obj/machinery/telecomms/proc/canInteract(mob/user) + if(hasSiliconAccessInArea(user) || istype(user.get_active_held_item(), /obj/item/multitool)) + return TRUE + return FALSE +// Check if the user is nearby and has a multitool. +/obj/machinery/telecomms/proc/canAccess(mob/user) + if((canInteract(user) && in_range(user, src)) || hasSiliconAccessInArea(user)) + return TRUE + return FALSE // Returns a multitool from a user depending on their mobtype. - /obj/machinery/telecomms/proc/get_multitool(mob/user) - - var/obj/item/multitool/P = null - // Let's double check - if(!hasSiliconAccessInArea(user) && istype(user.get_active_held_item(), /obj/item/multitool)) - P = user.get_active_held_item() + if(!canInteract(user)) + return null + var/obj/item/multitool/P = user.get_active_held_item() + // Is the ref not a null? and is it the actual type? + if(istype(P)) + return P else if(isAI(user)) var/mob/living/silicon/ai/U = user P = U.aiMulti @@ -106,170 +268,3 @@ if(istype(user.get_active_held_item(), /obj/item/multitool)) P = user.get_active_held_item() return P - -// Additional Options for certain machines. Use this when you want to add an option to a specific machine. -// Example of how to use below. - -/obj/machinery/telecomms/proc/Options_Menu() - return "" - -// The topic for Additional Options. Use this for checking href links for your specific option. -// Example of how to use below. -/obj/machinery/telecomms/proc/Options_Topic(href, href_list) - return - -// RELAY - -/obj/machinery/telecomms/relay/Options_Menu() - var/dat = "" - dat += "
    Broadcasting: [broadcasting ? "YES" : "NO"]" - dat += "
    Receiving: [receiving ? "YES" : "NO"]" - return dat - -/obj/machinery/telecomms/relay/Options_Topic(href, href_list) - - if(href_list["receive"]) - receiving = !receiving - temp = "-% Receiving mode changed. %-" - if(href_list["broadcast"]) - broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" - -// BUS - -/obj/machinery/telecomms/bus/Options_Menu() - var/dat = "
    Change Signal Frequency: [change_frequency ? "YES ([change_frequency])" : "NO"]" - return dat - -/obj/machinery/telecomms/bus/Options_Topic(href, href_list) - - if(href_list["change_freq"]) - - var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num - if(canAccess(usr)) - if(newfreq) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(newfreq < 10000) - change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" - else - change_frequency = 0 - temp = "-% Frequency changing deactivated %-" - - -/obj/machinery/telecomms/Topic(href, href_list) - if(..()) - return - - if(!hasSiliconAccessInArea(usr)) - if(!istype(usr.get_active_held_item(), /obj/item/multitool)) - return - - var/obj/item/multitool/P = get_multitool(usr) - - if(href_list["input"]) - switch(href_list["input"]) - - if("toggle") - - toggled = !toggled - temp = "-% [src] has been [toggled ? "activated" : "deactivated"]." - update_power() - - - if("id") - var/newid = reject_bad_text(stripped_input(usr, "Specify the new ID for this machine", src, id, MAX_MESSAGE_LEN)) - if(newid && canAccess(usr)) - id = newid - temp = "-% New ID assigned: \"[id]\" %-" - - if("network") - var/newnet = stripped_input(usr, "Specify the new network for this machine. This will break all current links.", src, network) - if(newnet && canAccess(usr)) - - if(length(newnet) > 15) - temp = "-% Too many characters in new network tag %-" - - else - for(var/obj/machinery/telecomms/T in links) - T.links.Remove(src) - - network = newnet - links = list() - temp = "-% New network tag assigned: \"[network]\" %-" - - - if("freq") - var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num - if(newfreq && canAccess(usr)) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(newfreq == FREQ_SYNDICATE) - temp = "-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-" - else - if(!(newfreq in freq_listening) && newfreq < 10000) - freq_listening.Add(newfreq) - temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" - - if(href_list["delete"]) - - // changed the layout about to workaround a pesky runtime -- Doohl - - var/x = text2num(href_list["delete"]) - temp = "-% Removed frequency filter [x] %-" - freq_listening.Remove(x) - - if(href_list["unlink"]) - - if(text2num(href_list["unlink"]) <= length(links)) - var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - if(T) - temp = "-% Removed [REF(T)] [T.name] from linked entities. %-" - - // Remove link entries from both T and src. - - if(T.links) - T.links.Remove(src) - links.Remove(T) - - else - temp = "-% Unable to locate machine to unlink from, try again. %-" - - if(href_list["link"]) - - if(P) - var/obj/machinery/telecomms/T = P.buffer - if(istype(T) && T != src) - if(!(src in T.links)) - T.links += src - - if(!(T in links)) - links += T - - temp = "-% Successfully linked with [REF(T)] [T.name] %-" - - else - temp = "-% Unable to acquire buffer %-" - - if(href_list["buffer"]) - - P.buffer = src - temp = "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-" - - - if(href_list["flush"]) - - temp = "-% Buffer successfully flushed. %-" - P.buffer = null - - Options_Topic(href, href_list) - - usr.set_machine(src) - - updateUsrDialog() - -/obj/machinery/telecomms/proc/canAccess(mob/user) - if(hasSiliconAccessInArea(user) || in_range(user, src)) - return TRUE - return FALSE diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index 6b03bcc880..d16835eee7 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -17,6 +17,11 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages idle_power_usage = 25 circuit = /obj/item/circuitboard/machine/telecomms/broadcaster +/obj/machinery/telecomms/broadcaster/RefreshParts() + idle_power_usage = 25 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 1.5) //Has 2 manipulators + /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals if(!istype(signal)) diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index ce5ed31094..bf3dfe8f7e 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -17,14 +17,20 @@ idle_power_usage = 50 netspeed = 40 circuit = /obj/item/circuitboard/machine/telecomms/bus - var/change_frequency = 0 + var/change_frequency = FALSE + var/change_freq_value = 0 + +/obj/machinery/telecomms/bus/RefreshParts() + idle_power_usage = 50 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 2) //Has 2 manipulators /obj/machinery/telecomms/bus/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) if(!istype(signal) || !is_freq_listening(signal)) return - if(change_frequency && signal.frequency != FREQ_SYNDICATE) - signal.frequency = change_frequency + if(change_frequency && (change_freq_value && signal.frequency != FREQ_SYNDICATE)) + signal.frequency = change_freq_value if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it // send to one linked processor unit diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm index e7e3788774..e960dab422 100644 --- a/code/game/machinery/telecomms/machines/hub.dm +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -19,6 +19,11 @@ netspeed = 40 circuit = /obj/item/circuitboard/machine/telecomms/hub +/obj/machinery/telecomms/hub/RefreshParts() + idle_power_usage = 80 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 5) //Has 2 manipulators + /obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(!is_freq_listening(signal)) return diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index ed39bb0578..7f8872ca74 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -140,11 +140,16 @@ ..() if(href_list["photo"]) var/mob/M = usr - M << browse_rsc(picture.picture_image, "pda_photo.png") - M << browse("PDA Photo" \ - + "" \ - + "" \ - + "", "window=pdaphoto;size=[picture.psize_x]x[picture.psize_y];can-close=true") + + M << browse_rsc(picture.picture_image, "pda_photo.png") + + var/dat = "
    " + dat += "" + dat += "
    " + + var/datum/browser/popup = new(M, "pdaphoto", "PDA Photo", picture.psize_x, picture.psize_y) + popup.set_content(dat) + popup.open() onclose(M, "pdaphoto") /datum/data_rc_msg diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm index a09b3ca8fb..269f5269f3 100644 --- a/code/game/machinery/telecomms/machines/processor.dm +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -16,6 +16,11 @@ circuit = /obj/item/circuitboard/machine/telecomms/processor var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals +/obj/machinery/telecomms/processor/RefreshParts() + idle_power_usage = 30 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 1.5) //Has 2 manipulators + /obj/machinery/telecomms/processor/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) if(!is_freq_listening(signal)) return diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 4dd3af036c..0e443bad8f 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -15,6 +15,11 @@ idle_power_usage = 30 circuit = /obj/item/circuitboard/machine/telecomms/receiver +/obj/machinery/telecomms/receiver/RefreshParts() + idle_power_usage = 30 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 1.5) //Has 2 manipulators + /obj/machinery/telecomms/receiver/receive_signal(datum/signal/subspace/signal) if(!on || !istype(signal) || !check_receive_level(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) return diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 65f70a4f23..10328f0788 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -19,6 +19,11 @@ var/broadcasting = 1 var/receiving = 1 +/obj/machinery/telecomms/relay/RefreshParts() + idle_power_usage = 30 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating * 1.5) //Has 2 manipulators + /obj/machinery/telecomms/relay/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) // Add our level and send it back var/turf/T = get_turf(src) diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index 46b16252c5..6f80cfbf0e 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -19,6 +19,11 @@ /obj/machinery/telecomms/server/Initialize() . = ..() +/obj/machinery/telecomms/server/RefreshParts() + idle_power_usage = 15 + for(var/obj/item/stock_parts/manipulator/P in component_parts) + idle_power_usage -= (P.rating) //has 2 manipulators + /obj/machinery/telecomms/server/receive_information(datum/signal/subspace/vocal/signal, obj/machinery/telecomms/machine_from) // can't log non-vocal signals if(!istype(signal) || !signal.data["message"] || !is_freq_listening(signal)) @@ -28,7 +33,7 @@ totaltraffic += traffic // add current traffic to total traffic // Delete particularly old logs - if (log_entries.len >= 400) + if(LAZYLEN(log_entries) >= 400) //[list].len is not safe log_entries.Cut(1, 2) var/datum/comm_log_entry/log = new diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index d21edffea1..e1b345f507 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -117,9 +117,9 @@ GLOBAL_LIST_EMPTY(telecomms_list) icon_state = "[initial(icon_state)]_off" /obj/machinery/telecomms/proc/update_power() - if(toggled) - if(stat & (BROKEN|NOPOWER|EMPED)) // if powered, on. if not powered, off. if too damaged, off + // if powered, on. if not powered, off. if too damaged, off + if(CHECK_BITFIELD(stat, (BROKEN | NOPOWER | EMPED))) on = FALSE else on = TRUE @@ -137,11 +137,11 @@ GLOBAL_LIST_EMPTY(telecomms_list) /obj/machinery/telecomms/emp_act(severity) . = ..() - if(. & EMP_PROTECT_SELF) + if(CHECK_BITFIELD(., EMP_PROTECT_SELF)) return - if(prob(100/severity)) - if(!(stat & EMPED)) - stat |= EMPED - var/duration = (300 * 10)/severity + if(prob(100 / severity)) + if(!CHECK_BITFIELD(stat, EMPED)) + ENABLE_BITFIELD(stat, EMPED) + var/duration = (300 * 10) / severity spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot. - stat &= ~EMPED + DISABLE_BITFIELD(stat, EMPED) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 985c1166b7..16ae158ea7 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -70,7 +70,7 @@ com.target = null visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return - if (ismovableatom(M)) + if (ismovable(M)) if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE)) use_power(5000) diff --git a/code/game/machinery/toylathe.dm b/code/game/machinery/toylathe.dm deleted file mode 100644 index c679f3f983..0000000000 --- a/code/game/machinery/toylathe.dm +++ /dev/null @@ -1,415 +0,0 @@ -#define AUTOYLATHE_MAIN_MENU 1 -#define AUTOYLATHE_CATEGORY_MENU 2 -#define AUTOYLATHE_SEARCH_MENU 3 - -/obj/machinery/autoylathe - name = "autoylathe" - desc = "It produces toys using plastic, metal and glass." - icon_state = "autolathe" - density = TRUE - use_power = IDLE_POWER_USE - idle_power_usage = 10 - active_power_usage = 100 - circuit = /obj/item/circuitboard/machine/autoylathe - layer = BELOW_OBJ_LAYER - - var/operating = FALSE - var/list/L = list() - var/list/LL = list() - var/hacked = FALSE - var/disabled = 0 - var/shocked = FALSE - var/hack_wire - var/disable_wire - var/shock_wire - - var/busy = FALSE - var/prod_coeff = 1 - - var/datum/design/being_built - var/datum/techweb/stored_research - var/list/datum/design/matching_designs - var/selected_category - var/screen = 1 - - var/list/categories = list( - "Toys", - "Figurines", - "Pistols", - "Rifles", - "Heavy", - "Melee", - "Armor", - "Adult", - "Misc", - "Imported" - ) - -/obj/machinery/autoylathe/Initialize() - var/static/list/allowed_materials = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/plastic - ) - AddComponent(/datum/component/material_container, allowed_materials, 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) - . = ..() - - wires = new /datum/wires/autoylathe(src) - stored_research = new /datum/techweb/specialized/autounlocking/autoylathe - matching_designs = list() - -/obj/machinery/autoylathe/Destroy() - QDEL_NULL(wires) - return ..() - -/obj/machinery/autoylathe/ui_interact(mob/user) - . = ..() - if(!is_operational()) - return - - if(shocked && !(stat & NOPOWER)) - shock(user,50) - - var/dat - - switch(screen) - if(AUTOYLATHE_MAIN_MENU) - dat = main_win(user) - if(AUTOYLATHE_CATEGORY_MENU) - dat = category_win(user,selected_category) - if(AUTOYLATHE_SEARCH_MENU) - dat = search_win(user) - - var/datum/browser/popup = new(user, "Autoylathe", name, 400, 500) - popup.set_content(dat) - popup.open() - -/obj/machinery/autoylathe/on_deconstruction() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - -/obj/machinery/autoylathe/attackby(obj/item/O, mob/user, params) - if (busy) - to_chat(user, "The autoylathe is busy. Please wait for completion of previous operation.") - return TRUE - - if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) - updateUsrDialog() - return TRUE - - if(default_deconstruction_crowbar(O)) - return TRUE - - if(panel_open && is_wire_tool(O)) - wires.interact(user) - return TRUE - - if(user.a_intent == INTENT_HARM) //so we can hit the machine - return ..() - - if(stat) - return TRUE - - if(istype(O, /obj/item/disk/design_disk)) - user.visible_message("[user] begins to load \the [O] in \the [src]...", - "You begin to load a design from \the [O]...", - "You hear the chatter of a floppy drive.") - busy = TRUE - var/obj/item/disk/design_disk/D = O - if(do_after(user, 14.4, target = src)) - for(var/B in D.blueprints) - if(B) - stored_research.add_design(B) - busy = FALSE - return TRUE - - return ..() - -/obj/machinery/autoylathe/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted) - if(item_inserted.custom_materials?.len && item_inserted.custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]) - flick("autolathe_r",src)//plays glass insertion animation by default otherwise - else - flick("autolathe_o",src)//plays metal insertion animation - - use_power(min(1000, amount_inserted / 100)) - updateUsrDialog() - -/obj/machinery/autoylathe/Topic(href, href_list) - if(..()) - return - if (!busy) - if(href_list["menu"]) - screen = text2num(href_list["menu"]) - updateUsrDialog() - - if(href_list["category"]) - selected_category = href_list["category"] - updateUsrDialog() - - if(href_list["make"]) - - ///////////////// - //href protection - being_built = stored_research.isDesignResearchedID(href_list["make"]) - if(!being_built) - return - - var/multiplier = text2num(href_list["multiplier"]) - var/is_stack = ispath(being_built.build_path, /obj/item/stack) - multiplier = CLAMP(multiplier,1,50) - - ///////////////// - - var/coeff = (is_stack ? 1 : prod_coeff) //stacks are unaffected by production coefficient - var/total_amount = 0 - for(var/MAT in being_built.materials) - total_amount += being_built.materials[MAT] - var/power = max(2000, (total_amount)*multiplier/5) //Change this to use all materials - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - var/list/materials_used = list() - var/list/custom_materials = list() //These will apply their material effect, This should usually only be one. - - for(var/MAT in being_built.materials) - var/datum/material/used_material = MAT - var/amount_needed = being_built.materials[MAT] * coeff * multiplier - if(istext(used_material)) //This means its a category - var/list/list_to_show = list() - for(var/i in SSmaterials.materials_by_category[used_material]) - if(materials.materials[i] > 0) - list_to_show += i - - used_material = input("Choose [used_material]", "Custom Material") as null|anything in list_to_show - if(!used_material) - return //Didn't pick any material, so you can't build shit either. - custom_materials[used_material] += amount_needed - - materials_used[used_material] = amount_needed - - if(materials.has_materials(materials_used)) - busy = TRUE - use_power(power) - icon_state = "autolathe_n" - var/time = is_stack ? 32 : 32*coeff*multiplier - addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time) - else - to_chat(usr, "Not enough materials for this operation.") - - if(href_list["search"]) - matching_designs.Cut() - - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(findtext(D.name,href_list["to_search"])) - matching_designs.Add(D) - updateUsrDialog() - else - to_chat(usr, "The autoylathe is busy. Please wait for completion of previous operation.") - - updateUsrDialog() - - return - -/obj/machinery/autoylathe/proc/make_item(power, list/materials_used, list/picked_materials, multiplier, coeff, is_stack) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/atom/A = drop_location() - use_power(power) - materials.use_materials(materials_used) - - if(is_stack) - var/obj/item/stack/N = new being_built.build_path(A, multiplier) - N.update_icon() - N.autoylathe_crafted(src) - else - for(var/i=1, i<=multiplier, i++) - var/obj/item/new_item = new being_built.build_path(A) - new_item.autoylathe_crafted(src) - if(length(picked_materials)) - new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount - icon_state = "autolathe" - busy = FALSE - updateDialog() - -/obj/machinery/autoylathe/RefreshParts() - var/T = 0 - for(var/obj/item/stock_parts/matter_bin/MB in component_parts) - T += MB.rating*75000 - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.max_amount = T - T=1.2 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - T -= M.rating*0.2 - prod_coeff = CLAMP(T,1,0) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 - -/obj/machinery/autoylathe/proc/main_win(mob/user) - var/dat = "

    Autoylathe Menu:


    " - dat += materials_printout() - - dat += "
    \ - \ - \ - \ - \ - \ -

    " - - var/line_length = 1 - dat += "" - - for(var/C in categories) - if(line_length > 2) - dat += "" - line_length = 1 - - dat += "" - line_length++ - - dat += "
    [C]
    " - return dat - -/obj/machinery/autoylathe/proc/category_win(mob/user,selected_category) - var/dat = "Return to main menu" - dat += "

    Browsing [selected_category]:


    " - dat += materials_printout() - - for(var/v in stored_research.researched_designs) - var/datum/design/D = SSresearch.techweb_design_by_id(v) - if(!(selected_category in D.category)) - continue - - if(disabled || !can_build(D)) - dat += "[D.name]" - else - dat += "[D.name]" - - if(ispath(D.build_path, /obj/item/stack)) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/max_multiplier - for(var/datum/material/mat in D.materials) - max_multiplier = min(D.maxstack, round(materials.get_material_amount(mat)/D.materials[mat])) - if (max_multiplier>10 && !disabled) - dat += " x10" - if (max_multiplier>25 && !disabled) - dat += " x25" - if(max_multiplier > 0 && !disabled) - dat += " x[max_multiplier]" - else - if(!disabled && can_build(D, 5)) - dat += " x5" - if(!disabled && can_build(D, 10)) - dat += " x10" - - dat += "[get_design_cost(D)]
    " - - dat += "
    " - return dat - -/obj/machinery/autoylathe/proc/search_win(mob/user) - var/dat = "Return to main menu" - dat += "

    Search results:


    " - dat += materials_printout() - - for(var/v in matching_designs) - var/datum/design/D = v - if(disabled || !can_build(D)) - dat += "[D.name]" - else - dat += "[D.name]" - - if(ispath(D.build_path, /obj/item/stack)) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/max_multiplier - for(var/datum/material/mat in D.materials) - max_multiplier = min(D.maxstack, round(materials.get_material_amount(mat)/D.materials[mat])) - if (max_multiplier>10 && !disabled) - dat += " x10" - if (max_multiplier>25 && !disabled) - dat += " x25" - if(max_multiplier > 0 && !disabled) - dat += " x[max_multiplier]" - - dat += "[get_design_cost(D)]
    " - - dat += "
    " - return dat - -/obj/machinery/autoylathe/proc/materials_printout() - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
    " - for(var/mat_id in materials.materials) - var/datum/material/M = mat_id - var/mineral_amount = materials.materials[mat_id] - if(mineral_amount > 0) - dat += "[M.name] amount: [mineral_amount] cm3
    " - return dat - -/obj/machinery/autoylathe/proc/can_build(datum/design/D, amount = 1) - if(D.make_reagents.len) - return FALSE - - var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) - - var/list/required_materials = list() - - for(var/i in D.materials) - required_materials[i] = D.materials[i] * coeff * amount - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - - return materials.has_materials(required_materials) - -/obj/machinery/autoylathe/proc/get_design_cost(datum/design/D) - var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff) - var/dat - for(var/i in D.materials) - if(istext(i)) //Category handling - dat += "[D.materials[i] * coeff] [i]" - else - var/datum/material/M = i - dat += "[D.materials[i] * coeff] [M.name] " - return dat - -/obj/machinery/autoylathe/proc/reset(wire) - switch(wire) - if(WIRE_HACK) - if(!wires.is_cut(wire)) - adjust_hacked(FALSE) - if(WIRE_SHOCK) - if(!wires.is_cut(wire)) - shocked = FALSE - if(WIRE_DISABLE) - if(!wires.is_cut(wire)) - disabled = FALSE - -/obj/machinery/autoylathe/proc/shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock - return FALSE - if(!prob(prb)) - return FALSE - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() - if (electrocute_mob(user, get_area(src), src, 0.7, TRUE)) - return TRUE - else - return FALSE - -/obj/machinery/autoylathe/proc/adjust_hacked(state) - hacked = state - for(var/id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[id] - if((D.build_type & AUTOYLATHE) && ("hacked" in D.category)) - if(hacked) - stored_research.add_design(D) - else - stored_research.remove_design(D) - -/obj/machinery/autoylathe/hacked/Initialize() - . = ..() - adjust_hacked(TRUE) - -//Called when the object is constructed by an autoylathe -//Has a reference to the autoylathe so you can do !!FUN!! things with hacked lathes -/obj/item/proc/autoylathe_crafted(obj/machinery/autoylathe/A) - return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index ff5ba14810..26220d4d89 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -1,3 +1,111 @@ +//dye registry, add dye colors and their resulting output here if you want the sprite to change instead of just the color. +GLOBAL_LIST_INIT(dye_registry, list( + DYE_REGISTRY_UNDER = list( + DYE_RED = /obj/item/clothing/under/color/red, + DYE_ORANGE = /obj/item/clothing/under/color/orange, + DYE_YELLOW = /obj/item/clothing/under/color/yellow, + DYE_GREEN = /obj/item/clothing/under/color/green, + DYE_BLUE = /obj/item/clothing/under/color/blue, + DYE_PURPLE = /obj/item/clothing/under/color/lightpurple, + DYE_BLACK = /obj/item/clothing/under/color/black, + DYE_WHITE = /obj/item/clothing/under/color/white, + DYE_RAINBOW = /obj/item/clothing/under/color/rainbow, + DYE_MIME = /obj/item/clothing/under/rank/civilian/mime, + DYE_CLOWN = /obj/item/clothing/under/rank/civilian/clown, + DYE_QM = /obj/item/clothing/under/rank/cargo/qm, + DYE_LAW = /obj/item/clothing/under/suit/black, + DYE_CAPTAIN = /obj/item/clothing/under/rank/captain, + DYE_HOP = /obj/item/clothing/under/rank/civilian/head_of_personnel, + DYE_HOS = /obj/item/clothing/under/rank/security/head_of_security, + DYE_CE = /obj/item/clothing/under/rank/engineering/chief_engineer, + DYE_RD = /obj/item/clothing/under/rank/rnd/research_director, + DYE_CMO = /obj/item/clothing/under/rank/medical/chief_medical_officer, + DYE_REDCOAT = /obj/item/clothing/under/costume/redcoat + ), + DYE_REGISTRY_JUMPSKIRT = list( + DYE_RED = /obj/item/clothing/under/color/jumpskirt/red, + DYE_ORANGE = /obj/item/clothing/under/color/jumpskirt/orange, + DYE_YELLOW = /obj/item/clothing/under/color/jumpskirt/yellow, + DYE_GREEN = /obj/item/clothing/under/color/jumpskirt/green, + DYE_BLUE = /obj/item/clothing/under/color/jumpskirt/blue, + DYE_PURPLE = /obj/item/clothing/under/color/jumpskirt/lightpurple, + DYE_BLACK = /obj/item/clothing/under/color/jumpskirt/black, + DYE_WHITE = /obj/item/clothing/under/color/jumpskirt/white, + DYE_RAINBOW = /obj/item/clothing/under/color/jumpskirt/rainbow + ), + DYE_REGISTRY_GLOVES = list( + DYE_RED = /obj/item/clothing/gloves/color/red, + DYE_ORANGE = /obj/item/clothing/gloves/color/orange, + DYE_YELLOW = /obj/item/clothing/gloves/color/yellow, + DYE_GREEN = /obj/item/clothing/gloves/color/green, + DYE_BLUE = /obj/item/clothing/gloves/color/blue, + DYE_PURPLE = /obj/item/clothing/gloves/color/purple, + DYE_BLACK = /obj/item/clothing/gloves/color/black, + DYE_WHITE = /obj/item/clothing/gloves/color/white, + DYE_RAINBOW = /obj/item/clothing/gloves/color/rainbow, + DYE_MIME = /obj/item/clothing/gloves/color/white, + DYE_CLOWN = /obj/item/clothing/gloves/color/rainbow, + DYE_QM = /obj/item/clothing/gloves/color/brown, + DYE_CAPTAIN = /obj/item/clothing/gloves/color/captain, + DYE_HOP = /obj/item/clothing/gloves/color/grey, + DYE_HOS = /obj/item/clothing/gloves/color/black, + DYE_CE = /obj/item/clothing/gloves/color/black, + DYE_RD = /obj/item/clothing/gloves/color/grey, + DYE_CMO = /obj/item/clothing/gloves/color/latex/nitrile, + DYE_REDCOAT = /obj/item/clothing/gloves/color/white + ), + DYE_REGISTRY_SNEAKERS = list( + DYE_RED = /obj/item/clothing/shoes/sneakers/red, + DYE_ORANGE = /obj/item/clothing/shoes/sneakers/orange, + DYE_YELLOW = /obj/item/clothing/shoes/sneakers/yellow, + DYE_GREEN = /obj/item/clothing/shoes/sneakers/green, + DYE_BLUE = /obj/item/clothing/shoes/sneakers/blue, + DYE_PURPLE = /obj/item/clothing/shoes/sneakers/purple, + DYE_BLACK = /obj/item/clothing/shoes/sneakers/black, + DYE_WHITE = /obj/item/clothing/shoes/sneakers/white, + DYE_RAINBOW = /obj/item/clothing/shoes/sneakers/rainbow, + DYE_MIME = /obj/item/clothing/shoes/sneakers/black, + DYE_QM = /obj/item/clothing/shoes/sneakers/brown, + DYE_CAPTAIN = /obj/item/clothing/shoes/sneakers/brown, + DYE_HOP = /obj/item/clothing/shoes/sneakers/brown, + DYE_CE = /obj/item/clothing/shoes/sneakers/brown, + DYE_RD = /obj/item/clothing/shoes/sneakers/brown, + DYE_CMO = /obj/item/clothing/shoes/sneakers/brown + ), + DYE_REGISTRY_FANNYPACK = list( + DYE_RED = /obj/item/storage/belt/fannypack/red, + DYE_ORANGE = /obj/item/storage/belt/fannypack/orange, + DYE_YELLOW = /obj/item/storage/belt/fannypack/yellow, + DYE_GREEN = /obj/item/storage/belt/fannypack/green, + DYE_BLUE = /obj/item/storage/belt/fannypack/blue, + DYE_PURPLE = /obj/item/storage/belt/fannypack/purple, + DYE_BLACK = /obj/item/storage/belt/fannypack/black, + DYE_WHITE = /obj/item/storage/belt/fannypack/white + ), + DYE_REGISTRY_BEDSHEET = list( + DYE_RED = /obj/item/bedsheet/red, + DYE_ORANGE = /obj/item/bedsheet/orange, + DYE_YELLOW = /obj/item/bedsheet/yellow, + DYE_GREEN = /obj/item/bedsheet/green, + DYE_BLUE = /obj/item/bedsheet/blue, + DYE_PURPLE = /obj/item/bedsheet/purple, + DYE_BLACK = /obj/item/bedsheet/black, + DYE_WHITE = /obj/item/bedsheet, + DYE_RAINBOW = /obj/item/bedsheet/rainbow, + DYE_MIME = /obj/item/bedsheet/mime, + DYE_CLOWN = /obj/item/bedsheet/clown, + DYE_QM = /obj/item/bedsheet/qm, + DYE_LAW = /obj/item/bedsheet/black, + DYE_CAPTAIN = /obj/item/bedsheet/captain, + DYE_HOP = /obj/item/bedsheet/hop, + DYE_HOS = /obj/item/bedsheet/hos, + DYE_CE = /obj/item/bedsheet/ce, + DYE_RD = /obj/item/bedsheet/rd, + DYE_CMO = /obj/item/bedsheet/cmo, + DYE_COSMIC = /obj/item/bedsheet/cosmos + ) +)) + /obj/machinery/washing_machine name = "washing machine" desc = "Gets rid of those pesky bloodstains, or your money back!" @@ -13,27 +121,22 @@ /obj/machinery/washing_machine/examine(mob/user) . = ..() - . += "Alt-click it to start a wash cycle." + if(!busy) + . += "Alt-click it to start a wash cycle." /obj/machinery/washing_machine/AltClick(mob/user) . = ..() if(!user.canUseTopic(src)) return - if(busy) return - if(state_open) to_chat(user, "Close the door first") return TRUE - if(bloody_mess) to_chat(user, "[src] must be cleaned up first.") return TRUE - if(has_corgi) - bloody_mess = 1 - busy = TRUE update_icon() addtimer(CALLBACK(src, .proc/wash_cycle), 200) @@ -76,6 +179,28 @@ color_source = null update_icon() +/obj/item/proc/dye_item(dye_color) + if(undyeable) + return FALSE + if(dying_key) + if(!GLOB.dye_registry[dying_key]) + log_runtime("Item just tried to be dyed with an invalid registry key: [dying_key]") + return FALSE + var/obj/item/target_type = GLOB.dye_registry[dying_key][dye_color] + if(target_type) + icon = initial(target_type.icon) + icon_state = initial(target_type.icon_state) + lefthand_file = initial(target_type.lefthand_file) + righthand_file = initial(target_type.righthand_file) + item_state = initial(target_type.item_state) + mob_overlay_icon = initial(target_type.mob_overlay_icon) + inhand_x_dimension = initial(target_type.inhand_x_dimension) + inhand_y_dimension = initial(target_type.inhand_y_dimension) + name = initial(target_type.name) + desc = "[initial(target_type.desc)] The colors look a little dodgy." + return target_type //successfully "appearance copy" dyed something; returns the target type as a hacky way of extending + add_atom_colour(dye_color, FIXED_COLOUR_PRIORITY) + return FALSE //what happens to this object when washed inside a washing machine /atom/movable/proc/machine_wash(obj/machinery/washing_machine/WM) @@ -89,105 +214,27 @@ new /obj/item/reagent_containers/food/snacks/meat/slab/corgi(loc) qdel(src) -/obj/item/paper/machine_wash(obj/machinery/washing_machine/WM) - if(WM.color_source) - if(istype(WM.color_source, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/CR = WM.color_source - add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY) - -/obj/item/reagents_containers/rag/towel/machine_wash(obj/machinery/washing_machine/WM) - if(WM.color_source) - if(istype(WM.color_source, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/CR = WM.color_source - add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY) - /mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM) gib() -/obj/item/clothing/under/color/machine_wash(obj/machinery/washing_machine/WM) - jumpsuit_wash(WM) - -/obj/item/clothing/under/rank/machine_wash(obj/machinery/washing_machine/WM) - jumpsuit_wash(WM) - -/obj/item/clothing/under/proc/jumpsuit_wash(obj/machinery/washing_machine/WM) +/obj/item/machine_wash(obj/machinery/washing_machine/WM) if(WM.color_source) - var/wash_color = WM.color_source.item_color - var/obj/item/clothing/under/U - for(var/T in typesof(/obj/item/clothing/under/color)) - var/obj/item/clothing/under/color/J = T - if(wash_color == initial(J.item_color)) - U = J - break - if(!U) - for(var/T in typesof(/obj/item/clothing/under/rank)) - var/obj/item/clothing/under/rank/R = T - if(wash_color == initial(R.item_color)) - U = R - break - if(U) - item_state = initial(U.item_state) - icon_state = initial(U.icon_state) - item_color = wash_color - name = initial(U.name) - desc = "The colors are a bit dodgy." - can_adjust = initial(U.can_adjust) - if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable - toggle_jumpsuit_adjust() + dye_item(WM.color_source.dye_color) -/obj/item/clothing/gloves/color/machine_wash(obj/machinery/washing_machine/WM) - if(WM.color_source) - var/wash_color = WM.color_source.item_color - for(var/T in typesof(/obj/item/clothing/gloves/color)) - var/obj/item/clothing/gloves/color/G = T - if(wash_color == initial(G.item_color)) - item_state = initial(G.item_state) - icon_state = initial(G.icon_state) - item_color = wash_color - name = initial(G.name) - desc = "The colors are a bit dodgy." - break +/obj/item/clothing/under/dye_item(dye_color, dye_key) + . = ..() + if(.) + var/obj/item/clothing/under/U = . + can_adjust = initial(U.can_adjust) + if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable + toggle_jumpsuit_adjust() /obj/item/clothing/shoes/sneakers/machine_wash(obj/machinery/washing_machine/WM) if(chained) chained = 0 slowdown = SHOES_SLOWDOWN new /obj/item/restraints/handcuffs(loc) - if(WM.color_source) - var/wash_color = WM.color_source.item_color - for(var/T in typesof(/obj/item/clothing/shoes/sneakers)) - var/obj/item/clothing/shoes/sneakers/S = T - if(wash_color == initial(S.item_color)) - icon_state = initial(S.icon_state) - item_color = wash_color - name = initial(S.name) - desc = "The colors are a bit dodgy." - break - -/obj/item/bedsheet/machine_wash(obj/machinery/washing_machine/WM) - if(WM.color_source) - var/wash_color = WM.color_source.item_color - for(var/T in typesof(/obj/item/bedsheet)) - var/obj/item/bedsheet/B = T - if(wash_color == initial(B.item_color)) - icon_state = initial(B.icon_state) - item_color = wash_color - name = initial(B.name) - desc = "The colors are a bit dodgy." - break - -/obj/item/clothing/head/soft/machine_wash(obj/machinery/washing_machine/WM) - if(WM.color_source) - var/wash_color = WM.color_source.item_color - for(var/T in typesof(/obj/item/clothing/head/soft)) - var/obj/item/clothing/head/soft/H = T - if(wash_color == initial(H.item_color)) - icon_state = initial(H.icon_state) - item_color = wash_color - name = initial(H.name) - desc = "The colors are a bit dodgy." - break - + ..() /obj/machinery/washing_machine/relaymove(mob/user) container_resist(user) @@ -223,27 +270,27 @@ if(istype(W, /obj/item/clothing/head/mob_holder)) to_chat(user, "It's too unwieldly to put in this way.") - return 1 + return TRUE else if(user.a_intent != INTENT_HARM) if (!state_open) to_chat(user, "Open the door first!") - return 1 + return TRUE if(bloody_mess) to_chat(user, "[src] must be cleaned up first.") - return 1 + return TRUE if(contents.len >= max_wash_capacity) to_chat(user, "The washing machine is full!") - return 1 + return TRUE if(!user.transferItemToLoc(W, src)) to_chat(user, "\The [W] is stuck to your hand, you cannot put it in the washing machine!") - return 1 + return TRUE - if(istype(W, /obj/item/toy/crayon) || istype(W, /obj/item/stamp)) + if(W.dye_color) color_source = W update_icon() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index f618888d98..ee28f118fa 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -11,9 +11,6 @@ var/insisting = 0 /obj/machinery/wish_granter/attack_hand(mob/living/carbon/user) - . = ..() - if(.) - return if(charges <= 0) to_chat(user, "The Wish Granter lies silent.") return @@ -22,22 +19,116 @@ to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") return - else if(is_special_character(user)) - to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") - else if (!insisting) to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") insisting++ else - to_chat(user, "You speak. [pick("I want the station to disappear","Humanity is corrupt, mankind must be destroyed","I want to be rich", "I want to rule the world","I want immortality.")]. The Wish Granter answers.") - to_chat(user, "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first.") + if(is_special_character(user)) + to_chat(user, "You speak. [pick("I want power","Humanity is corrupt, mankind must be destroyed", "I want to rule the world","I want immortality")]. The Wish Granter answers.") + to_chat(user, "Your head pounds for a moment, before your vision clears. The Wish Granter, sensing the darkness in your heart, has given you limitless power, and it's all yours!") + user.dna.add_mutation(HULK) + user.dna.add_mutation(XRAY) + user.dna.add_mutation(SPACEMUT) + user.dna.add_mutation(TK) + user.next_move_modifier *= 0.5 //half the delay between attacks! + to_chat(user, "Things around you feel slower!") + charges-- + insisting = FALSE + to_chat(user, "You have a very great feeling about this!") + else + to_chat(user, "The Wish Granter awaits your wish.") + var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","The Station To Disappear","To Kill","Nothing") + switch(wish) + if("Power") //Gives infinite power in exchange for infinite power going off in your face! + if(charges <= 0) + return + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, warping itself into a delaminating supermatter shard!") + var/obj/item/stock_parts/cell/infinite/powah = new /obj/item/stock_parts/cell/infinite(get_turf(user)) + if(user.put_in_hands(powah)) + to_chat(user, "[powah] materializes into your hands!") + else + to_chat(user, "[powah] materializes onto the floor.") + var/obj/machinery/power/supermatter_crystal/powerwish = new /obj/machinery/power/supermatter_crystal(loc) + powerwish.damage = 700 //right at the emergency threshold + powerwish.produces_gas = FALSE + charges-- + insisting = FALSE + if(!charges) + qdel(src) + if("Wealth") //Gives 1 million space bucks in exchange for being turned into gold! + if(charges <= 0) + return + to_chat(user, "Your wish is granted, but at a cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, warping your body to match the greed in your heart.") + new /obj/structure/closet/crate/trashcart/moneywish(loc) + new /obj/structure/closet/crate/trashcart/moneywish(loc) + user.set_species(/datum/species/golem/gold) + charges-- + insisting = FALSE + if(!charges) + qdel(src) + if("The Station To Disappear") //teleports you to the station and makes you blind, making the station disappear for you! + if(charges <= 0) + return + to_chat(user, "Your wish is 'granted', but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your eyes to match the darkness in your heart.") + user.dna.add_mutation(BLINDMUT) + var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) + if(eyes) + eyes.applyOrganDamage(eyes.maxHealth) + var/list/destinations = list() + for(var/obj/item/beacon/B in GLOB.teleportbeacons) + var/turf/T = get_turf(B) + if(is_station_level(T.z)) + destinations += B + var/chosen_beacon = pick(destinations) + var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon)) + try_move_adjacent(J) + playsound(src,'sound/effects/sparks4.ogg',50,1) + charges-- + insisting = FALSE + if(!charges) + qdel(src) + if("To Kill") //Makes you kill things in exchange for rewards! + if(charges <= 0) + return + to_chat(user, "Your wish is granted, but at a terrible cost...") + to_chat(user, "The Wish Granter punishes you for your wickedness, warping itself into a dastardly creature for you to kill! ...but it almost seems to reward you for this.") + var/obj/item/melee/transforming/energy/sword/cx/killreward = new /obj/item/melee/transforming/energy/sword/cx(get_turf(user)) + if(user.put_in_hands(killreward)) + to_chat(user, "[killreward] materializes into your hands!") + else + to_chat(user, "[killreward] materializes onto the floor.") + user.next_move_modifier *= 0.8 //20% less delay between attacks! + to_chat(user, "Things around you feel slightly slower!") + var/mob/living/simple_animal/hostile/venus_human_trap/killwish = new /mob/living/simple_animal/hostile/venus_human_trap(loc) + killwish.maxHealth = 1500 + killwish.health = killwish.maxHealth + killwish.vine_grab_distance = 6 + killwish.melee_damage_upper = 30 + killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic) + charges-- + insisting = FALSE + if(!charges) + qdel(src) + if("Nothing") //Makes the wish granter disappear + if(charges <= 0) + return + to_chat(user, "The Wish Granter vanishes from sight!") + to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") + charges-- + insisting = FALSE + qdel(src) - charges-- - insisting = 0 +//ITEMS THAT IT USES - user.mind.add_antag_datum(/datum/antagonist/wishgranter) +/obj/structure/closet/crate/trashcart/moneywish + desc = "A heavy, metal trashcart with wheels. Filled with cash." + name = "loaded trash cart" - to_chat(user, "You have a very bad feeling about this.") - - return +/obj/structure/closet/crate/trashcart/moneywish/PopulateContents() //25*20*1000=500,000 + for(var/i in 1 to 25) + var/obj/item/stack/spacecash/c1000/lodsamoney = new /obj/item/stack/spacecash/c1000(src) + lodsamoney.amount = lodsamoney.max_amount diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm index c678912a21..fdcc4df151 100644 --- a/code/game/mecha/combat/neovgre.dm +++ b/code/game/mecha/combat/neovgre.dm @@ -62,18 +62,21 @@ /obj/mecha/combat/neovgre/process() ..() - if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hople to stop the superweapon + if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hope to stop the superweapon cell.charge = INFINITY max_integrity = INFINITY obj_integrity = max_integrity CHECK_TICK //Just to be on the safe side lag wise - else if(cell.charge < cell.maxcharge) - for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src)) - var/delta = min(recharge_rate, cell.maxcharge - cell.charge) - if (get_clockwork_power() <= delta) - cell.charge += delta - adjust_clockwork_power(-delta) - CHECK_TICK + else + if(cell.charge < cell.maxcharge) + for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src)) + var/delta = min(recharge_rate, cell.maxcharge - cell.charge) + if (get_clockwork_power() >= delta) + cell.charge += delta + adjust_clockwork_power(-delta) + if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork)) + obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200) + CHECK_TICK /obj/mecha/combat/neovgre/Initialize() .=..() @@ -90,7 +93,7 @@ energy_drain = 30 name = "Aribter Laser Cannon" desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere" - fire_sound = "sound/weapons/neovgre_laser.ogg" + fire_sound = 'sound/weapons/neovgre_laser.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/mecha/combat/neovgre/M) if(istype(M)) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 7ff8696084..4a4d58ea73 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -530,7 +530,6 @@ equip_cooldown = 0 var/obj/item/gun/medbeam/mech/medigun custom_materials = list(/datum/material/iron = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) - material_flags = MATERIAL_NO_EFFECTS /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize() . = ..() diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index f1fa5ddd20..65aa001fe1 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -484,7 +484,7 @@ /obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) - if(ismovableatom(hit_atom)) + if(ismovable(hit_atom)) var/atom/movable/AM = hit_atom AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), 7, 2) qdel(src) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 9acc8921b9..93228c7fee 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -19,6 +19,7 @@ var/processing_queue = 0 var/screen = "main" var/temp + var/offstation_security_levels = TRUE var/list/part_sets = list( "Cyborg", "Ripley", @@ -72,6 +73,8 @@ for(var/obj/item/stock_parts/manipulator/Ml in component_parts) T += Ml.rating time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01) + var/obj/item/circuitboard/machine/mechfab/C = circuit + offstation_security_levels = C.offstation_security_levels /obj/machinery/mecha_part_fabricator/examine(mob/user) . = ..() @@ -106,13 +109,27 @@ if(!(set_name in D.category)) continue output += "
    [output_part_info(D)]
    \[" - if(check_resources(D)) + if(check_clearance(D) && check_resources(D)) output += "Build | " output += "Add to queue\]\[?\]
    " return output +/obj/machinery/mecha_part_fabricator/proc/check_clearance(datum/design/D) + if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)) && !ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level)) + return FALSE + return TRUE + /obj/machinery/mecha_part_fabricator/proc/output_part_info(datum/design/D) - var/output = "[initial(D.name)] (Cost: [output_part_cost(D)]) [get_construction_time_w_coeff(D)/10]sec" + var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)) + var/sec_text = "" + if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA)) + sec_text = " (Allowed security levels: " + for(var/n in D.min_security_level to D.max_security_level) + sec_text += NUM2SECLEVEL(n) + if(n + 1 <= D.max_security_level) + sec_text += ", " + sec_text += ") " + var/output = "[initial(D.name)] (Cost: [output_part_cost(D)]) [sec_text][get_construction_time_w_coeff(D)/10]sec" return output /obj/machinery/mecha_part_fabricator/proc/output_part_cost(datum/design/D) @@ -171,7 +188,6 @@ var/location = get_step(src,(dir)) var/obj/item/I = new D.build_path(location) - I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this. I.set_custom_materials(res_coef) say("\The [I] is complete.") being_built = null @@ -216,6 +232,11 @@ while(D) if(stat&(NOPOWER|BROKEN)) return FALSE + if(!check_clearance(D)) + say("Security level not met. Queue processing stopped.") + temp = {"Security level not met to build next part.
    + Try again | Return"} + return FALSE if(!check_resources(D)) say("Not enough resources. Queue processing stopped.") temp = {"Not enough resources to build next part.
    @@ -236,7 +257,7 @@ for(var/datum/design/D in queue) i++ var/obj/part = D.build_path - output += "" + output += "" output += initial(part.name) + " - " output += "[i>1?"
    ":null] " output += "[i↓":null] " @@ -440,3 +461,7 @@ return FALSE return TRUE + +/obj/machinery/mecha_part_fabricator/offstation + offstation_security_levels = FALSE + circuit = /obj/item/circuitboard/machine/mechfab/offstation diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 02115d3e30..32be825489 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -23,11 +23,11 @@ layer = BELOW_MOB_LAYER//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 - flags_1 = HEAR_1 + flags_1 = HEAR_1|BLOCK_FACE_ATOM_1 var/can_move = 0 //time of next allowed movement - var/mob/living/carbon/occupant = null + var/mob/living/occupant = null var/step_in = 10 //make a step in step_in/10 sec. - var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + var/dir_in = SOUTH //What direction will the mech face when entered/powered on? Defaults to South. var/normal_step_energy_drain = 10 //How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. var/step_energy_drain = 10 var/melee_energy_drain = 15 @@ -495,6 +495,10 @@ occupant_message("Air port connection teared off!") mecha_log_message("Lost connection to gas port.") +/obj/mecha/setDir(newdir) + . = ..() + occupant?.setDir(newdir) + /obj/mecha/Process_Spacemove(var/movement_dir = 0) . = ..() if(.) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index de1c035000..5160282180 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -3,6 +3,44 @@ //////////////////////////////// /datum/component/construction/mecha var/base_icon + var/looky_helpy = TRUE + +/datum/component/construction/mecha/examine(datum/source, mob/user, list/examine_list) + . = ..() + if(looky_helpy) + switch(steps[index]["key"]) + if(TOOL_WRENCH) + examine_list += "The mech could be wrenched into place." + if(TOOL_SCREWDRIVER) + examine_list += "The mech could be screwed into place." + if(TOOL_WIRECUTTER) + examine_list += "The mech wires could be trimmed into place." + if(/obj/item/stack/cable_coil) + examine_list += "The mech could use some wiring." + if(/obj/item/circuitboard) + examine_list += "The mech could use a type ofcircuitboard." + if(/obj/item/stock_parts/scanning_module) + examine_list += "The mech could use a scanning stock part." + if(/obj/item/stock_parts/capacitor) + examine_list += "The mech could use a power based stock part." + if(/obj/item/stock_parts/cell) + examine_list += "The mech could use a power source." + if(/obj/item/stack/sheet/metal) + examine_list += "The mech could use some sheets of metal." + if(/obj/item/stack/sheet/plasteel) + examine_list += "The mech could use some sheets of strong steel." + if(/obj/item/bikehorn) + examine_list += "HONK IT!." + if(/obj/item/clothing/mask/gas/clown_hat) + examine_list += "GIVE IT CLOWN MAKEUP HONK!." + if(/obj/item/clothing/shoes/clown_shoes) + examine_list += "GIVE IT GOOFY SHOES HONK HONK!." + if(/obj/item/mecha_parts/part) + examine_list += "The mech could use a mech part." + if(/obj/item/stack/ore/bluespace_crystal) + examine_list += "The mech could use a crystal of sorts." + if(/obj/item/assembly/signaler/anomaly) + examine_list += "The mech could use a anomaly of sorts." /datum/component/construction/mecha/spawn_result() if(!result) diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 581283d339..395ac810f4 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -77,7 +77,7 @@ /obj/mecha/attack_animal(mob/living/simple_animal/user) mecha_log_message("Attack by simple animal. Attacker - [user].", color="red") if(!user.melee_damage_upper && !user.obj_damage) - user.emote("custom", message = "[user.friendly] [src].") + user.emote("custom", message = "[user.friendly_verb_continuous] [src].") return 0 else var/play_soundeffect = 1 @@ -220,8 +220,7 @@ return else if(istype(W, /obj/item/stack/cable_coil)) if(state == 3 && (internal_damage & MECHA_INT_SHORT_CIRCUIT)) - var/obj/item/stack/cable_coil/CC = W - if(CC.use(2)) + if(W.use_tool(src, user, 0, 2)) clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) to_chat(user, "You replace the fused wires.") else @@ -283,9 +282,9 @@ else return ..() -/obj/mecha/attacked_by(obj/item/I, mob/living/user) +/obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) mecha_log_message("Attacked by [I]. Attacker - [user]") - ..() + return ..() /obj/mecha/proc/mech_toxin_damage(mob/living/target) playsound(src, 'sound/effects/spray2.ogg', 50, 1) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 8d6328cf08..b1ab944b49 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -333,10 +333,13 @@ send_byjax(occupant,"exosuit.browser","t_port_connection","[internal_tank.connected_port?"Disconnect from":"Connect to"] gas port") if(href_list["dna_lock"]) - if(occupant && !iscarbon(occupant)) - to_chat(occupant, " You do not have any DNA!") + if(!occupant) return - dna_lock = occupant.dna.unique_enzymes + var/mob/living/carbon/C = occupant + if(!istype(C) || !C.dna) + to_chat(C, " You do not have any DNA!") + return + dna_lock = C.dna.unique_enzymes occupant_message("You feel a prick as the needle takes your DNA sample.") if(href_list["reset_dna"]) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 0e14af75a9..bacb8c6669 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -55,8 +55,12 @@ M.buckling = null return FALSE - if(M.pulledby && buckle_prevents_pull) - M.pulledby.stop_pulling() + if(M.pulledby) + if(buckle_prevents_pull) + M.pulledby.stop_pulling() + else if(isliving(M.pulledby)) + var/mob/living/L = M.pulledby + L.reset_pull_offsets(M, TRUE) if(!check_loc && M.loc != loc) M.forceMove(loc) @@ -137,4 +141,7 @@ "You unbuckle yourself from [src].",\ "You hear metal clanking.") add_fingerprint(user) + if(isliving(M.pulledby)) + var/mob/living/L = M.pulledby + L.set_pull_offsets(M, L.grab_state) return M diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 3b5a029df4..5276062121 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -17,7 +17,7 @@ target = get_turf(src) if(acid_amt) - acid_level = min( (CLAMP(round(acid_amt, 1), 0, INFINITY)) *acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor. + acid_level = min( (clamp(round(acid_amt, 1), 0, INFINITY)) *acid_pwr, 12000) //capped so the acid effect doesn't last a half hour on the floor. //handle APCs and newscasters and stuff nicely pixel_x = target.pixel_x + rand(-4,4) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 6b61eb2ebd..c56731b3d3 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -49,7 +49,9 @@ var/original_name desc = "A large piece of space-resistant printed paper." icon = 'icons/obj/contraband.dmi' + plane = ABOVE_WALL_PLANE anchored = TRUE + buildable_sign = FALSE //Cannot be unwrenched from a wall. var/ruined = FALSE var/random_basetype var/never_random = FALSE // used for the 'random' subclasses. @@ -68,6 +70,8 @@ name = "poster - [name]" desc = "A large piece of space-resistant printed paper. [desc]" + addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 300)), 0) + /obj/structure/sign/poster/proc/randomise(base_type) var/list/poster_types = subtypesof(base_type) var/list/approved_types = list() @@ -424,6 +428,11 @@ desc = "A poster decipting a snake shaped into an ominous 'S'!" icon_state = "poster47" +/obj/structure/sign/poster/contraband/bountyhunters + name = "Bounty Hunters" + desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\"" + icon_state = "poster48" + /obj/structure/sign/poster/official poster_item_name = "motivational poster" poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 5720d5ce34..34996177af 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -5,6 +5,7 @@ var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one? + var/beauty = 0 /obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases) . = ..() @@ -26,6 +27,8 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) + addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, beauty)), 0) + /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal if(mergeable_decal) qdel(C) diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 3afc0ef671..fa4bfe7e67 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -3,6 +3,7 @@ name = "xeno blood" desc = "It's green and acidic. It looks like... blood?" color = BLOOD_COLOR_XENO + beauty = -250 /obj/effect/decal/cleanable/blood/splatter/xeno color = BLOOD_COLOR_XENO diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index ab0d1caca4..a5acc7d394 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -7,6 +7,7 @@ blood_state = BLOOD_STATE_BLOOD bloodiness = BLOOD_AMOUNT_PER_DECAL color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. + beauty = -100 /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) if (C.blood_DNA) @@ -45,12 +46,14 @@ icon_state = "tracks" desc = "They look like tracks left by wheels." random_icon_states = null + beauty = -50 /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose name = "blood" icon_state = "ltrails_1" desc = "Your instincts say you shouldn't be following these." random_icon_states = null + beauty = -50 var/list/existing_dirs = list() /obj/effect/decal/cleanable/trail_holder/update_icon() diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 910c4f4609..2e45bbfca5 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -3,6 +3,7 @@ desc = "Someone should clean that up." icon = 'icons/obj/objects.dmi' icon_state = "shards" + beauty = -50 /obj/effect/decal/cleanable/ash name = "ashes" @@ -10,6 +11,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "ash" mergeable_decal = FALSE + beauty = -50 /obj/effect/decal/cleanable/ash/Initialize() . = ..() @@ -24,6 +26,7 @@ /obj/effect/decal/cleanable/ash/large name = "large pile of ashes" icon_state = "big_ash" + beauty = -100 /obj/effect/decal/cleanable/ash/large/Initialize() . = ..() @@ -34,6 +37,7 @@ desc = "Back to sand." icon = 'icons/obj/shards.dmi' icon_state = "tiny" + beauty = -100 /obj/effect/decal/cleanable/glass/Initialize() . = ..() @@ -52,6 +56,7 @@ canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) smooth = SMOOTH_FALSE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + beauty = -75 /obj/effect/decal/cleanable/dirt/Initialize() . = ..() @@ -72,6 +77,10 @@ desc = "It's still good. Four second rule!" icon_state = "flour" +/obj/effect/decal/cleanable/dirt/dust + name = "dust" + desc = "A thin layer of dust coating the floor." + /obj/effect/decal/cleanable/greenglow/ecto name = "ectoplasmic puddle" desc = "You know who to call." @@ -80,8 +89,11 @@ /obj/effect/decal/cleanable/greenglow name = "glowing goo" desc = "Jeez. I hope that's not for lunch." + light_power = 1 + light_range = 1 light_color = LIGHT_COLOR_GREEN icon_state = "greenglow" + beauty = -300 /obj/effect/decal/cleanable/greenglow/Initialize(mapload) . = ..() @@ -97,6 +109,7 @@ layer = WALL_OBJ_LAYER icon_state = "cobweb1" resistance_flags = FLAMMABLE + beauty = -100 /obj/effect/decal/cleanable/cobweb/cobweb2 icon_state = "cobweb2" @@ -108,10 +121,12 @@ icon = 'icons/effects/effects.dmi' icon_state = "molten" mergeable_decal = FALSE + beauty = -150 /obj/effect/decal/cleanable/molten_object/large name = "big gooey grey mass" icon_state = "big_molten" + beauty = -300 //Vomit (sorry) /obj/effect/decal/cleanable/vomit @@ -120,6 +135,7 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") + beauty = -150 /obj/effect/decal/cleanable/vomit/attack_hand(mob/user) . = ..() @@ -133,7 +149,7 @@ if(reagents) for(var/datum/reagent/consumable/R in reagents.reagent_list) if(R.nutriment_factor > 0) - H.nutrition += R.nutriment_factor * R.volume + H.adjust_nutrition(R.nutriment_factor * R.volume) reagents.del_reagent(R.type) reagents.trans_to(H, reagents.total_volume) qdel(src) @@ -152,6 +168,7 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") + beauty = -100 /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index cf030df120..2765330977 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -10,6 +10,7 @@ blood_state = BLOOD_STATE_OIL bloodiness = BLOOD_AMOUNT_PER_DECAL mergeable_decal = FALSE + beauty = -50 /obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases) . = ..() @@ -50,6 +51,7 @@ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") blood_state = BLOOD_STATE_OIL bloodiness = BLOOD_AMOUNT_PER_DECAL + beauty = -100 /obj/effect/decal/cleanable/oil/Initialize() . = ..() @@ -58,6 +60,7 @@ /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") + beauty = -50 /obj/effect/decal/cleanable/oil/slippery diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 955b9935dd..8cfdad0432 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -3,7 +3,7 @@ desc = "Graffiti. Damn kids." icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" - plane = GAME_PLANE //makes the graffiti visible over a wall. + plane = ABOVE_WALL_PLANE //makes the graffiti visible over a wall. gender = NEUTER mergeable_decal = FALSE var/do_icon_rotate = TRUE diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 3e7706282a..25b262a146 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -35,6 +35,7 @@ icon = 'icons/turf/decals.dmi' icon_state = "warningline" layer = TURF_DECAL_LAYER + plane = ABOVE_WALL_PLANE /obj/effect/turf_decal/Initialize() ..() @@ -45,4 +46,4 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha) + T.AddElement(/datum/element/decal, icon, icon_state, turn(dir, -dir2angle(T.dir)), CLEAN_GOD, color, null, null, alpha) diff --git a/code/game/objects/effects/decals/vgdecals.dm b/code/game/objects/effects/decals/vgdecals.dm new file mode 100644 index 0000000000..93db0075c8 --- /dev/null +++ b/code/game/objects/effects/decals/vgdecals.dm @@ -0,0 +1,119 @@ +// Full credit goes to VG station for these assets. https://github.com/vgstation-coders/vgstation13 +// All items in this .dm and the associated .dmi were made by VG station and all credit should go to them. + +// -<| IMPORTANT MAPPER NOTE |>- +// Change the 'color' variable on any white sprite to simply recolour it! + +/obj/effect/turf_decal/vg_decals + icon = 'icons/turf/vgstation_decals.dmi' + icon_state = "no" + +// NUMBERS START + +/obj/effect/turf_decal/vg_decals/numbers + icon_state = "no" + +/obj/effect/turf_decal/vg_decals/numbers/one + icon_state = "1" + +/obj/effect/turf_decal/vg_decals/numbers/two + icon_state = "2" + +/obj/effect/turf_decal/vg_decals/numbers/three + icon_state = "3" + +/obj/effect/turf_decal/vg_decals/numbers/four + icon_state = "4" + +/obj/effect/turf_decal/vg_decals/numbers/five + icon_state = "5" + +/obj/effect/turf_decal/vg_decals/numbers/six + icon_state = "6" + +/obj/effect/turf_decal/vg_decals/numbers/seven + icon_state = "7" + +/obj/effect/turf_decal/vg_decals/numbers/eight + icon_state = "8" + +/obj/effect/turf_decal/vg_decals/numbers/nine + icon_state = "9" + +/obj/effect/turf_decal/vg_decals/numbers/zero + icon_state = "0" + +// NUMBERS END + +// ATMOS START + +/obj/effect/turf_decal/vg_decals/atmos + icon_state = "no" + +/obj/effect/turf_decal/vg_decals/atmos/oxygen + icon_state = "oxygen" + +/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide + icon_state = "carbon_dioxide" + +/obj/effect/turf_decal/vg_decals/atmos/nitrogen + icon_state = "nitrogen" + +/obj/effect/turf_decal/vg_decals/atmos/air + icon_state = "air" + +/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide + icon_state = "nitrous_oxide" + +/obj/effect/turf_decal/vg_decals/atmos/plasma + icon_state = "plasma" + +/obj/effect/turf_decal/vg_decals/atmos/mix + icon_state = "mix" + +// ATMOS END + +// DEPARTMENT START + +/obj/effect/turf_decal/vg_decals/department/hop + icon_state = "hop" + +/obj/effect/turf_decal/vg_decals/department/bar + icon_state = "bar" + +/obj/effect/turf_decal/vg_decals/department/cargo + icon_state = "cargo" + +/obj/effect/turf_decal/vg_decals/department/med + icon_state = "med" + +/obj/effect/turf_decal/vg_decals/department/sci + icon_state = "sci" + +/obj/effect/turf_decal/vg_decals/department/sec + icon_state = "sec" + +/obj/effect/turf_decal/vg_decals/department/mining + icon_state = "mine" + +/obj/effect/turf_decal/vg_decals/department/zoo + icon_state = "zoo" + +// DEPARTMENT END + +// MISC START + +/obj/effect/turf_decal/vg_decals/no + icon = 'icons/turf/vgstation_decals.dmi' + icon_state = "no" + +/obj/effect/turf_decal/vg_decals/radiation_huge + icon_state = "radiation_huge" + +/obj/effect/turf_decal/vg_decals/radiation + icon_state = "radiation" + +/obj/effect/turf_decal/vg_decals/radiation_custom + icon_state = "radiation-w" + +// MISC END diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 8f0ce83c82..979b811bc5 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -7,7 +7,7 @@ move_resist = INFINITY obj_flags = 0 - vis_flags = NONE + vis_flags = VIS_INHERIT_PLANE /obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) return diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 4ed6dc9dc9..6910bb1db0 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -36,6 +36,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) var/jobspawn_override = FALSE var/delete_after_roundstart = TRUE var/used = FALSE + var/job_spawnpoint = TRUE //Is it a potential job spawnpoint or should we skip it? /obj/effect/landmark/start/proc/after_round_start() if(delete_after_roundstart) @@ -281,6 +282,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "bomb or clown beacon spawner" var/nukie_path = /obj/item/sbeacondrop/bomb var/clown_path = /obj/item/sbeacondrop/clownbomb + job_spawnpoint = FALSE /obj/effect/landmark/start/nuclear_equipment/after_round_start() var/npath = nukie_path @@ -311,6 +313,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "carpspawn" icon_state = "carp_spawn" +// lone op (optional) +/obj/effect/landmark/loneopspawn + name = "loneop+ninjaspawn" + icon_state = "snukeop_spawn" + // observer-start. /obj/effect/landmark/observer_start name = "Observer-Start" @@ -462,6 +469,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/stationroom var/list/templates = list() layer = BULLET_HOLE_LAYER + plane = ABOVE_WALL_PLANE /obj/effect/landmark/stationroom/New() ..() @@ -481,7 +489,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) if(!SSmapping.station_room_templates[t]) log_world("Station room spawner placed at ([T.x], [T.y], [T.z]) has invalid ruin name of \"[t]\" in its list") templates -= t - template_name = pickweightAllowZero(templates) + template_name = pickweight(templates, 0) if(!template_name) GLOB.stationroom_landmarks -= src qdel(src) @@ -490,7 +498,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) if(!template) return FALSE testing("Room \"[template_name]\" placed at ([T.x], [T.y], [T.z])") - template.load(T, centered = FALSE) + template.load(T, centered = FALSE, orientation = dir, rotate_placement_to_orientation = TRUE) template.loaded++ GLOB.stationroom_landmarks -= src qdel(src) @@ -502,7 +510,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) templates = list("Engine SM" = 3, "Engine Singulo" = 3, "Engine Tesla" = 3) icon = 'icons/rooms/box/engine.dmi' - /obj/effect/landmark/stationroom/box/engine/New() . = ..() templates = CONFIG_GET(keyed_list/box_random_engine) @@ -511,3 +518,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/stationroom/lavaland/station templates = list("Public Mining Base" = 3) icon = 'icons/rooms/Lavaland/Mining.dmi' + +// handled in portals.dm, id connected to one-way portal +/obj/effect/landmark/portal_exit + name = "portal exit" + icon_state = "portal_exit" + var/id diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 2fb068a29b..40104d5ea8 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -5,19 +5,21 @@ anchored = TRUE icon = 'icons/obj/items_and_weapons.dmi' icon_state = "uglymine" - var/triggered = 0 + /// We manually check to see if we've been triggered in case multiple atoms cross us in the time between the mine being triggered and it actually deleting, to avoid a race condition with multiple detonations + var/triggered = FALSE /obj/effect/mine/proc/mineEffect(mob/victim) to_chat(victim, "*click*") -/obj/effect/mine/Crossed(AM as mob|obj) - if(isturf(loc)) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - triggermine(AM) - else - triggermine(AM) +/obj/effect/mine/Crossed(atom/movable/AM) + if(triggered || !isturf(loc)) + return + . = ..() + + if(AM.movement_type & FLYING) + return + + triggermine(AM) /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) @@ -27,9 +29,13 @@ s.set_up(3, 1, src) s.start() mineEffect(victim) + SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED) triggered = 1 qdel(src) +/obj/effect/mine/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir) + . = ..() + triggermine() /obj/effect/mine/explosive name = "explosive mine" @@ -50,6 +56,18 @@ if(isliving(victim)) victim.DefaultCombatKnockdown(stun_time) +/obj/effect/mine/shrapnel + name = "shrapnel mine" + var/shrapnel_type = /obj/item/projectile/bullet/shrapnel + var/shrapnel_magnitude = 3 + +/obj/effect/mine/shrapnel/mineEffect(mob/victim) + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_magnitude) + +/obj/effect/mine/shrapnel/sting + name = "stinger mine" + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball + /obj/effect/mine/kickmine name = "kick mine" @@ -105,7 +123,7 @@ /obj/effect/mine/pickup/triggermine(mob/victim) if(triggered) return - triggered = 1 + triggered = TRUE invisibility = INVISIBILITY_ABSTRACT mineEffect(victim) qdel(src) @@ -170,7 +188,7 @@ if(!victim.client || !istype(victim)) return to_chat(victim, "You feel fast!") - victim.add_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + victim.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) sleep(duration) - victim.remove_movespeed_modifier(MOVESPEED_ID_YELLOW_ORB) + victim.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) to_chat(victim, "You slow down.") diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 596e428c7f..b310119827 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -49,5 +49,6 @@ /obj/effect/overlay/vis mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE + vis_flags = NONE var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 04e194f6c3..504b931685 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -29,6 +29,7 @@ var/allow_anchored = FALSE var/innate_accuracy_penalty = 0 var/last_effect = 0 + var/force_teleport = FALSE /obj/effect/portal/anom name = "wormhole" @@ -162,7 +163,7 @@ no_effect = TRUE else last_effect = world.time - if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel)) + if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport)) if(istype(M, /obj/item/projectile)) var/obj/item/projectile/P = M P.ignore_source_check = TRUE @@ -183,3 +184,47 @@ else real_target = get_turf(linked) return real_target + +/obj/effect/portal/permanent + name = "permanent portal" + desc = "An unwavering portal that will never fade." + hardlinked = FALSE // dont qdel my portal nerd + force_teleport = TRUE // force teleports because they're a mapmaker tool + var/id // var edit or set id in map editor + +/obj/effect/portal/permanent/proc/set_linked() + if(!id) + return + for(var/obj/effect/portal/permanent/P in GLOB.portals - src) + if(P.id == id) + P.linked = src + linked = P + break + +/obj/effect/portal/permanent/teleport(atom/movable/M, force = FALSE) + set_linked() // update portal links + . = ..() + +/obj/effect/portal/permanent/one_way // doesn't have a return portal, can have multiple exits, /obj/effect/landmark/portal_exit to mark them + name = "one-way portal" + desc = "You get the feeling that this might not be the safest thing you've ever done." + +/obj/effect/portal/permanent/one_way/set_linked() + if(!id) + return + var/list/possible_turfs = list() + for(var/obj/effect/landmark/portal_exit/PE in GLOB.landmarks_list) + if(PE.id == id) + var/turf/T = get_turf(PE) + if(T) + possible_turfs |= T + if(possible_turfs.len) + hard_target = pick(possible_turfs) + +/obj/effect/portal/permanent/one_way/one_use + name = "one-use portal" + desc = "This is probably the worst decision you'll ever make in your life." + +/obj/effect/portal/permanent/one_way/one_use/teleport(atom/movable/M, force = FALSE) + . = ..() + qdel(src) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index c135458873..231c1465cd 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -37,7 +37,7 @@ if(ishuman(source_mob)) var/mob/living/carbon/human/H = source_mob if(H.dna.species.use_skintones) - body_coloring = "#[skintone2hex(H.skin_tone)]" + body_coloring = SKINTONE2HEX(H.skin_tone) else body_coloring = "#[H.dna.features["mcolor"]]" @@ -49,7 +49,7 @@ H.set_species(gib_mob_species) dna_to_add = temp_mob.get_blood_dna_list() if(H.dna.species.use_skintones) - body_coloring = "#[skintone2hex(H.skin_tone)]" + body_coloring = SKINTONE2HEX(H.skin_tone) else body_coloring = "#[H.dna.features["mcolor"]]" else diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 71c394a404..57b25a8901 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -2,6 +2,7 @@ icon = 'icons/effects/landmarks_static.dmi' icon_state = "random_loot" layer = OBJ_LAYER + var/spawn_on_turf = TRUE var/lootcount = 1 //how many items will be spawned var/lootdoubles = TRUE //if the same item can be spawned twice var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect) @@ -10,7 +11,7 @@ /obj/effect/spawner/lootdrop/Initialize(mapload) ..() if(loot && loot.len) - var/turf/T = get_turf(src) + var/atom/A = spawn_on_turf ? get_turf(src) : loc var/loot_spawned = 0 while((lootcount-loot_spawned) && loot.len) var/lootspawn = pickweight(loot) @@ -18,7 +19,7 @@ loot.Remove(lootspawn) if(lootspawn) - var/atom/movable/spawned_loot = new lootspawn(T) + var/atom/movable/spawned_loot = new lootspawn(A) if (!fan_out_items) if (pixel_x != 0) spawned_loot.pixel_x = pixel_x @@ -45,7 +46,6 @@ /obj/effect/spawner/lootdrop/armory_contraband name = "armory contraband gun spawner" lootdoubles = FALSE - loot = list( /obj/item/gun/ballistic/automatic/pistol = 8, /obj/item/gun/ballistic/shotgun/automatic/combat = 5, @@ -129,7 +129,6 @@ loot = typesof(/obj/item/flashlight/glowstick) . = ..() - /obj/effect/spawner/lootdrop/gloves name = "random gloves" desc = "These gloves are supposed to be a random color..." @@ -150,7 +149,6 @@ /obj/effect/spawner/lootdrop/crate_spawner name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF! lootdoubles = FALSE - loot = list( /obj/structure/closet/crate/secure/loot = 20, "" = 80 @@ -266,7 +264,6 @@ LAZYSET(loot, M, our_chance) return ..() - // Tech storage circuit board spawners // For these, make sure that lootcount equals the number of list items @@ -386,3 +383,351 @@ /obj/structure/reagent_dispensers/keg/aphro = 2, /obj/structure/reagent_dispensers/keg/aphro/strong = 2, /obj/structure/reagent_dispensers/keg/gargle = 1) + +/obj/effect/spawner/lootdrop/coin + lootcount = 1 + loot = list( + /obj/item/coin/silver = 30, + /obj/item/coin/iron = 30, + /obj/item/coin/gold = 10, + /obj/item/coin/diamond = 10, + /obj/item/coin/plasma = 10, + /obj/item/coin/uranium = 10, + ) + +/obj/effect/spawner/lootdrop/cig_packs + lootcount = 1 + loot = list( + /obj/item/storage/fancy/cigarettes = 20, + /obj/item/storage/fancy/cigarettes/dromedaryco = 10, + /obj/item/storage/fancy/cigarettes/cigpack_robust = 5, + /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 5, + /obj/item/storage/fancy/cigarettes/cigpack_carp = 15, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 2, + /obj/item/storage/fancy/cigarettes/cigpack_midori = 10, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 5, + /obj/item/storage/fancy/cigarettes/cigpack_xeno = 3, + /obj/item/storage/fancy/cigarettes/cigpack_cannabis = 10, + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker = 10, + /obj/item/storage/fancy/rollingpapers = 10 + ) + +/obj/effect/spawner/lootdrop/cigars_cases + lootcount = 1 + loot = list( + /obj/item/storage/fancy/cigarettes/cigars = 50, + /obj/item/storage/fancy/cigarettes/cigars/cohiba = 25, + /obj/item/storage/fancy/cigarettes/cigars/havana = 25, + ) + +/obj/effect/spawner/lootdrop/space_cash + lootcount = 1 + loot = list( + /obj/item/stack/spacecash/c1 = 1, + /obj/item/stack/spacecash/c10 = 9, + /obj/item/stack/spacecash/c20 = 10, + /obj/item/stack/spacecash/c50 = 15, + /obj/item/stack/spacecash/c100 = 25, + /obj/item/stack/spacecash/c200 = 20, + /obj/item/stack/spacecash/c500 = 19, + /obj/item/stack/spacecash/c1000 = 1, + ) + +/obj/effect/spawner/lootdrop/druggie_pill + lootcount = 1 + loot = list( + /obj/item/reagent_containers/pill/stimulant = 1, + /obj/item/reagent_containers/pill/zoom = 9, + /obj/item/reagent_containers/pill/happy = 10, + /obj/item/reagent_containers/pill/lsd = 15, + /obj/item/reagent_containers/pill/aranesp = 25, + /obj/item/reagent_containers/pill/psicodine = 20, + /obj/item/reagent_containers/pill/mannitol = 19, + /obj/item/reagent_containers/pill/happiness = 1, + ) + +/obj/effect/spawner/lootdrop/low_loot_toilet + name = "random low toilet spawner" + lootcount = 1 + spawn_on_turf = FALSE +//Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that +//This is ment for "low" loot that anyone could fine in a toilet, for better gear use high loot toilet + loot = list("" = 30, + /obj/item/lighter = 2, + /obj/item/tape/random = 1, + /obj/item/poster/random_contraband = 1, + /obj/item/clothing/glasses/sunglasses/blindfold = 4, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/toy/plush/random = 5, + /obj/effect/spawner/lootdrop/gloves/no_turf = 5, + /obj/effect/spawner/lootdrop/glowstick/no_turf = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 3, + /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, + /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 2, + /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, + /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, + /obj/item/storage/pill_bottle/dice = 5, + /obj/item/toy/cards/deck = 5, + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5 + ) + +/obj/effect/spawner/lootdrop/prison_loot_toilet + name = "random prison toilet spawner" + lootcount = 1 + spawn_on_turf = FALSE +//Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that +//This is ment for "prison" loot that is rather rare and ment for "prisoners if they get a crowbar to fine, or sec. + loot = list("" = 10, + /obj/item/lighter = 5, + /obj/item/poster/random_contraband = 5, + /obj/item/clothing/glasses/sunglasses = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 5, + /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, + /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 5, + /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, + /obj/item/storage/pill_bottle/dice = 5, + /obj/item/toy/cards/deck = 5, + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, + /obj/item/kitchen/knife = 5, + /obj/item/screwdriver = 5, + /obj/item/crowbar/red = 1, //Dont you need a crowbar to open this? + /obj/item/stack/medical/suture = 3, + /obj/item/reagent_containers/food/drinks/bottle/vodka = 2, + /obj/item/radio = 5, + /obj/item/flashlight = 4, + /obj/item/clothing/mask/breath = 2, + /obj/item/tank/internals/emergency_oxygen = 3, + /obj/item/storage/box/mre/menu4/safe = 3, + /obj/item/grenade/smokebomb = 2 + ) + +/obj/effect/spawner/lootdrop/high_loot_toilet + name = "random high toilet spawner" + lootcount = 1 + spawn_on_turf = FALSE +//Note this is out of a 100 - Meaning the number you see is also the percent its going to pick that +//The items inside are always going to be something usefull, illegal and likely traitorous. + loot = list( + /obj/item/clothing/glasses/sunglasses = 5, + /obj/effect/spawner/lootdrop/coin/no_turf = 5, + /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, + /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate = 5, + /obj/item/suppressor = 5, + /obj/item/toy/cards/deck/syndicate = 5, + /obj/item/clothing/under/syndicate = 5, + /obj/item/clothing/mask/gas/syndicate = 5, + /obj/item/grenade/smokebomb = 10, + /obj/item/gun/ballistic/automatic/toy/pistol = 5, + /obj/item/firing_pin = 5, + /obj/item/grenade/empgrenade = 15, + /obj/item/clothing/gloves/tackler/combat/insulated = 10, + /obj/item/clothing/shoes/sneakers/noslip = 10 + ) + +/obj/effect/spawner/lootdrop/low_tools + name = "random basic tool(s) spawner" + lootcount = 1 + loot = list( + /obj/item/screwdriver = 1, + /obj/item/wrench = 1, + /obj/item/weldingtool/mini = 1, + /obj/item/crowbar = 1, + /obj/item/wirecutters = 1, + /obj/item/analyzer = 1, + /obj/item/t_scanner = 1 + ) + +/obj/effect/spawner/lootdrop/high_tools + name = "random adv tool(s) spawner" + lootcount = 1 + loot = list( + /obj/item/screwdriver/power = 1, + /obj/item/weldingtool/experimental = 1, + /obj/item/crowbar/power = 1, + /obj/item/analyzer = 1, + /obj/item/multitool = 1 + ) + +/obj/effect/spawner/lootdrop/welder_tools + name = "random safe welder tool(s) spawner" + lootcount = 1 + loot = list( + /obj/item/weldingtool = 1, + /obj/item/weldingtool/mini = 1, + /obj/item/weldingtool/hugetank = 1, + /obj/item/weldingtool/largetank = 1 + ) + +/obj/effect/spawner/lootdrop/tool_box + name = "random safe tool box(es) spawner" + lootcount = 1 + loot = list( + /obj/item/storage/toolbox/mechanical = 1, + /obj/item/storage/toolbox/mechanical/old = 1, + /obj/item/storage/toolbox/emergency = 1, + /obj/item/storage/toolbox/emergency/old = 1, + /obj/item/storage/toolbox/electrical = 1, + /obj/item/storage/toolbox/syndicate = 1, + /obj/item/storage/toolbox/artistic = 1, + /obj/item/storage/toolbox/gold_fake = 1, + /obj/item/storage/toolbox/rubber = 1 + ) + +/obj/effect/spawner/lootdrop/healing_kits + name = "random safe medical kit(s) spawner" + lootcount = 1 + loot = list( + /obj/item/storage/firstaid/regular = 1, + /obj/item/storage/firstaid/ancient = 1, + /obj/item/storage/firstaid/fire = 1, + /obj/item/storage/firstaid/toxin = 1, + /obj/item/storage/firstaid/radbgone = 1, + /obj/item/storage/firstaid/o2 = 1, + /obj/item/storage/firstaid/brute = 1 + ) + +/obj/effect/spawner/lootdrop/breathing_tanks + name = "random internal tank(s) spawner" + lootcount = 1 + loot = list( + /obj/item/tank/internals/oxygen = 1, + /obj/item/tank/internals/oxygen/yellow = 1, + /obj/item/tank/internals/oxygen/red = 1, + /obj/item/tank/internals/air = 1, + /obj/item/tank/internals/plasmaman = 1, + /obj/item/tank/internals/plasmaman/belt = 1, + /obj/item/tank/internals/emergency_oxygen = 1, + /obj/item/tank/internals/emergency_oxygen/engi = 1, + /obj/item/tank/internals/emergency_oxygen/double = 1 + ) + +/obj/effect/spawner/lootdrop/breathing_masks + name = "random internal mask(s) spawner" + lootcount = 1 + loot = list( + /obj/item/clothing/mask/gas = 2, + /obj/item/clothing/mask/gas/glass = 4, + /obj/item/clothing/mask/breath = 5, + /obj/item/clothing/mask/breath/medical = 1 + ) + +/obj/effect/spawner/lootdrop/welder_tools/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/low_tools/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/breathing_tanks/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/breathing_masks/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/coin/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/space_cash/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/druggie_pill/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/gloves/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/cig_packs/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/cigars_cases/no_turf + spawn_on_turf = FALSE + +/obj/effect/spawner/lootdrop/glowstick/no_turf + spawn_on_turf = FALSE + +// Random Parts + +/obj/effect/spawner/lootdrop/stock_parts + name = "random stock parts spawner" + lootcount = 1 + loot = list( + /obj/item/stock_parts/capacitor, + /obj/item/stock_parts/scanning_module, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/micro_laser, + /obj/item/stock_parts/matter_bin, + /obj/item/stock_parts/cell + ) + +// Random Weapon Parts + +/obj/effect/spawner/lootdrop/weapon_parts + name = "random weapon parts spawner 50%" + lootcount = 1 + spawn_on_turf = FALSE + loot = list("" = 50, + /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 10, + /obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 5, + /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5, + /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 10, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 3, + /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 3, + /obj/item/weaponcrafting/improvised_parts/laser_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 10, + /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3, + ) + +/obj/effect/spawner/lootdrop/weapon_parts + name = "random weapon parts spawner 25%" + lootcount = 1 + spawn_on_turf = FALSE + loot = list("" = 75, + /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 5, + /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5, + /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5, + /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 2, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5, + /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3, + ) + +/obj/effect/spawner/lootdrop/ammo + name = "random ammo 75%" + lootcount = 1 + spawn_on_turf = FALSE + loot = list("" = 25, + /obj/item/ammo_box/c32mm = 15, + /obj/item/ammo_box/r32mm = 15, + /obj/item/ammo_box/magazine/wt550m9 = 1, + /obj/item/ammo_casing/shotgun/buckshot = 7, + /obj/item/ammo_casing/shotgun/rubbershot = 7, + /obj/item/ammo_casing/a762 = 15, + /obj/item/ammo_box/a762 = 15, + ) + +/obj/effect/spawner/lootdrop/ammo/fiftypercent + name = "random ammo 50%" + lootcount = 1 + spawn_on_turf = FALSE + loot = list("" = 50, + /obj/item/ammo_box/c32mm = 7, + /obj/item/ammo_box/r32mm = 7, + /obj/item/ammo_box/magazine/wt550m9 = 2, + /obj/item/ammo_casing/shotgun/buckshot = 10, + /obj/item/ammo_casing/shotgun/rubbershot = 10, + /obj/item/ammo_casing/a762 = 7, + /obj/item/ammo_box/a762 = 7, + ) + +/obj/effect/spawner/lootdrop/ammo/shotgun + name = "random ammo 50%" + lootcount = 1 + spawn_on_turf = FALSE + loot = list("" = 50, + /obj/item/ammo_box/shotgun/loaded/buckshot = 5, + /obj/item/ammo_box/shotgun/loaded/beanbag = 5, + /obj/item/ammo_box/shotgun/loaded/incendiary = 5, + /obj/item/ammo_casing/shotgun/buckshot = 8, + /obj/item/ammo_casing/shotgun/rubbershot = 9, + /obj/item/ammo_casing/shotgun = 8, + /obj/item/ammo_casing/shotgun/incendiary = 10, + ) diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index cdf3f3e6b4..7a151c4312 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -24,6 +24,23 @@ again. name = "window spawner" spawn_list = list(/obj/structure/grille, /obj/structure/window/fulltile) dir = SOUTH + var/electrochromatic + var/electrochromatic_id + +/obj/effect/spawner/structure/window/Initialize() + . = ..() + if(!electrochromatic) + return + if(!electrochromatic_id) + stack_trace("Electrochromatic window spawner set without electromatic id.") + return + if(electrochromatic_id[1] == "!") + electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id) + for(var/obj/structure/window/W in get_turf(src)) + W.electrochromatic_id = electrochromatic_id + W.make_electrochromatic() + if(electrochromatic == ELECTROCHROMATIC_DIMMED) + W.electrochromatic_dim() /obj/effect/spawner/structure/window/hollow name = "hollow window spawner" @@ -140,13 +157,16 @@ again. spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) . = ..() -//tinted +//tinted and electrochromatic /obj/effect/spawner/structure/window/reinforced/tinted name = "tinted reinforced window spawner" icon_state = "twindow_spawner" spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/tinted/fulltile) +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic + name = "electrochromatic reinforced window spawner" + electrochromatic = ELECTROCHROMATIC_DIMMED //shuttle window diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 01edd82ccb..80178c95c4 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -52,7 +52,7 @@ var/list/affecting = list() /obj/effect/step_trigger/thrower/Trigger(atom/A) - if(!A || !ismovableatom(A)) + if(!A || !ismovable(A)) return var/atom/movable/AM = A var/curtiles = 0 diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 59c4e23283..9a236c00c3 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -95,6 +95,56 @@ icon_state = "warden_gaze" duration = 3 +/obj/effect/temp_visual/ratvar/volt_hit + name = "volt blast" + layer = ABOVE_MOB_LAYER + duration = 8 + icon_state = "volt_hit" + light_range = 1.5 + light_power = 2 + light_color = LIGHT_COLOR_ORANGE + var/mob/user + var/damage = 20 + +/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster) + . = ..() + user = caster + if(user) + var/matrix/M = new + M.Turn(Get_Angle(src, user)) + transform = M + INVOKE_ASYNC(src, .proc/volthit) + +/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit() + if(user) + Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray) + var/hit_amount = 0 + var/turf/T = get_turf(src) + for(var/mob/living/L in T) + if(is_servant_of_ratvar(L)) + continue + var/obj/item/I = L.anti_magic_check() + if(I) + L.visible_message("Strange energy flows into [L]'s [I.name]!", \ + "Your [I.name] shields you from [src]!") + continue + L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!") + L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) + log_combat(user, L, "struck with a volt blast") + hit_amount++ + for(var/obj/mecha/M in T) + if(M.occupant) + if(is_servant_of_ratvar(M.occupant)) + continue + to_chat(M.occupant, "Your [M.name] is struck by a [name]!") + M.visible_message("[M] is struck by a [name]!") + M.take_damage(damage, BURN, 0, 0) + hit_amount++ + if(hit_amount) + playsound(src, 'sound/machines/defib_zap.ogg', damage*hit_amount, 1, -1) + else + playsound(src, "sparks", 50, 1) + /obj/effect/temp_visual/ratvar/ocular_warden/Initialize() . = ..() pixel_x = rand(-8, 8) diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index d9f231b318..b63a126c5d 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -7,7 +7,7 @@ if(log) message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") - log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") + log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range >= 1) new /obj/effect/temp_visual/emp/pulse(epicenter) @@ -29,4 +29,4 @@ T.emp_act(EMP_LIGHT) else if(distance <= light_range) T.emp_act(EMP_LIGHT) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 222b82d134..60bae4016a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,13 +4,30 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // if true, everyone item when created will have its name changed to be // more... RPG-like. +GLOBAL_VAR_INIT(stickpocalypse, FALSE) // if true, all non-embeddable items will be able to harmlessly stick to people when thrown +GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to embed in people, takes precedence over stickpocalypse + /obj/item name = "item" icon = 'icons/obj/items_and_weapons.dmi' blocks_emissive = EMISSIVE_BLOCK_GENERIC + + ///icon state name for inhand overlays var/item_state = null + ///Icon file for left hand inhand overlays var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + ///Icon file for right inhand overlays var/righthand_file = 'icons/mob/inhands/items_righthand.dmi' + + ///Icon file for mob worn overlays. + ///no var for state because it should *always* be the same as icon_state + var/icon/mob_overlay_icon + //Forced mob worn layer instead of the standard preferred size. + var/alternate_worn_layer + + var/icon/anthro_mob_worn_overlay //Version of the above dedicated to muzzles/digitigrade + var/icon/taur_mob_worn_overlay // Idem but for taurs. Currently only used by suits. + var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE //Dimensions of the icon file used when this item is worn, eg: hats.dmi @@ -22,10 +39,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/inhand_x_dimension = 32 var/inhand_y_dimension = 32 - //Not on /clothing because for some reason any /obj/item can technically be "worn" with enough fuckery. - var/icon/alternate_worn_icon = null//If this is set, update_icons() will find on mob (WORN, NOT INHANDS) states in this file instead, primary use: badminnery/events - var/alternate_worn_layer = null//If this is set, update_icons() will force the on mob state (WORN, NOT INHANDS) onto this layer, instead of it's default - max_integrity = 200 obj_flags = NONE @@ -34,13 +47,26 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/hitsound = null var/usesound = null var/throwhitsound = null + + /// Weight class for how much storage capacity it uses and how big it physically is meaning storages can't hold it if their maximum weight class isn't as high as it. var/w_class = WEIGHT_CLASS_NORMAL + /// Volume override for the item, otherwise automatically calculated from w_class. + var/w_volume /// The amount of stamina it takes to swing an item in a normal melee attack do not lie to me and say it's for realism because it ain't. If null it will autocalculate from w_class. var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds. /// How long, in deciseconds, this staggers for, if null it will autocalculate from w_class and force. Unlike total mass this supports 0 and negatives. var/stagger_force + /** + * Set FALSE and then checked at the end of on mob/living/attackby(), set TRUE on living/pre_attacked_by(). + * Should it be FALSE by the end of the item/attack(), that means the item overrode the standard attack behaviour + * and the user still needs the delay applied. We can't be using return values since that'll stop afterattack() from being triggered. + */ + var/attack_delay_done = FALSE + ///next_move click/attack delay of this item. + var/click_delay = CLICK_CD_MELEE + var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE pressure_resistance = 4 @@ -61,8 +87,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //Citadel Edit for digitigrade stuff var/mutantrace_variation = NONE //Are there special sprites for specific situations? Don't use this unless you need to. - var/item_color = null //this needs deprecating, soonish - var/body_parts_covered = 0 //see setup.dm for appropriate bit flags var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets) var/permeability_coefficient = 1 // for chemicals/diseases @@ -83,7 +107,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged - var/datum/embedding_behavior/embedding + var/list/embedding = NONE var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES var/heat = 0 @@ -93,8 +117,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/tool_behaviour = NONE var/toolspeed = 1 - var/block_chance = 0 - var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom var/reach = 1 //In tiles, how far this weapon can reach; 1 for adjacent, which is default //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. @@ -111,13 +133,36 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/trigger_guard = TRIGGER_GUARD_NONE + ///Used as the dye color source in the washing machine only (at the moment). Can be a hex color or a key corresponding to a registry entry, see washing_machine.dm + var/dye_color + ///Whether the item is unaffected by standard dying. + var/undyeable = FALSE + ///What dye registry should be looked at when dying this item; see washing_machine.dm + var/dying_key + //Grinder vars var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder! + /* Our block parry data. Should be set in init, or something if you are using it. + * This won't be accessed without ITEM_CAN_BLOCK or ITEM_CAN_PARRY so do not set it unless you have to to save memory. + * If you decide it's a good idea to leave this unset while turning the flags on, you will runtime. Enjoy. + * If this is set to a path, it'll run get_block_parry_data(path). YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING! + */ + var/datum/block_parry_data/block_parry_data + + ///Skills vars + //list of skill PATHS exercised when using this item. An associated bitfield can be set to indicate additional ways the skill is used by this specific item. + var/list/datum/skill/used_skills + var/skill_difficulty = THRESHOLD_UNTRAINED //how difficult it's to use this item in general. + var/skill_gain = DEF_SKILL_GAIN //base skill value gain from using this item. + + var/canMouseDown = FALSE + + /obj/item/Initialize() - if (attack_verb) + if(attack_verb) attack_verb = typelist("attack_verb", attack_verb) . = ..() @@ -125,9 +170,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) new path(src) actions_types = null - if(GLOB.rpg_loot_items) - AddComponent(/datum/component/fantasy) - if(force_string) item_flags |= FORCE_STRING_OVERRIDE @@ -137,16 +179,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(damtype == "brute") hitsound = "swing_hit" - if (!embedding) - embedding = getEmbeddingBehavior() - else if (islist(embedding)) - embedding = getEmbeddingBehavior(arglist(embedding)) - else if (!istype(embedding, /datum/embedding_behavior)) - stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()") - - if(sharpness) //give sharp objects butchering functionality, for consistency - AddComponent(/datum/component/butchering, 80 * toolspeed) - /obj/item/Destroy() item_flags &= ~DROPDEL //prevent reqdels if(ismob(loc)) @@ -156,6 +188,26 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) qdel(X) return ..() +/obj/item/ComponentInitialize() + . = ..() + + // this proc says it's for initializing components, but we're initializing elements too because it's you and me against the world >:) + if(!LAZYLEN(embedding)) + if(GLOB.embedpocalypse) + embedding = EMBED_POINTY + name = "pointy [name]" + else if(GLOB.stickpocalypse) + embedding = EMBED_HARMLESS + name = "sticky [name]" + + updateEmbedding() + + if(GLOB.rpg_loot_items) + AddComponent(/datum/component/fantasy) + + if(sharpness) //give sharp objects butchering functionality, for consistency + AddComponent(/datum/component/butchering, 80 * toolspeed) + /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || (!isturf(target.loc) && !isturf(target) && not_inside)) return 0 @@ -206,8 +258,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(resistance_flags & FIRE_PROOF) . += "[src] is made of fire-retardant materials." - - + if(item_flags & (ITEM_CAN_BLOCK | ITEM_CAN_PARRY)) + var/datum/block_parry_data/data = return_block_parry_datum(block_parry_data) + . += "[src] has the capacity to be used to block and/or parry. \[Show Stats\]" if(!user.research_scanner) return @@ -365,28 +418,24 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // afterattack() and attack() prototypes moved to _onclick/item_attack.dm for consistency -/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args) - if(prob(final_block_chance)) - owner.visible_message("[owner] blocks [attack_text] with [src]!") - return 1 - return 0 - /obj/item/proc/talk_into(mob/M, input, channel, spans, datum/language/language) return ITALICS | REDUCE_RANGE /obj/item/proc/dropped(mob/user) + SHOULD_CALL_PARENT(TRUE) for(var/X in actions) var/datum/action/A = X A.Remove(user) if(item_flags & DROPDEL) qdel(src) item_flags &= ~IN_INVENTORY - SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) + if(SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) & COMPONENT_DROPPED_RELOCATION) + . = ITEM_RELOCATED_BY_DROPPED user.update_equipment_speed_mods() // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) item_flags |= IN_INVENTORY @@ -403,14 +452,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return usr.client.Click(src, src_location, src_control, params) var/list/directaccess = usr.DirectAccess() //This, specifically, is what requires the copypaste. If this were after the adjacency check, then it'd be impossible to use items in your inventory, among other things. //If this were before the above checks, then trying to click on items would act a little funky and signal overrides wouldn't work. - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if((C.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && ((C.CanReach(src) || (src in directaccess)) && (C.CanReach(over) || (over in directaccess)))) - if(!C.get_active_held_item()) - C.UnarmedAttack(src, TRUE) - if(C.get_active_held_item() == src) - melee_attack_chain(C, over) - return TRUE //returning TRUE as a "is this overridden?" flag + if(SEND_SIGNAL(usr, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) && ((usr.CanReach(src) || (src in directaccess)) && (usr.CanReach(over) || (over in directaccess)))) + if(!usr.get_active_held_item()) + usr.UnarmedAttack(src, TRUE) + if(usr.get_active_held_item() == src) + melee_attack_chain(usr, over) + return TRUE //returning TRUE as a "is this overridden?" flag if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows @@ -423,14 +470,22 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(mob/user, slot) - SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) - for(var/X in actions) - var/datum/action/A = X - if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. - A.Grant(user) + . = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) + if(!(. & COMPONENT_NO_GRANT_ACTIONS)) + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) item_flags |= IN_INVENTORY user.update_equipment_speed_mods() +//Overlays for the worn overlay so you can overlay while you overlay +//eg: ammo counters, primed grenade flashing, etc. +//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file +/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = list() + SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, used_state, style_flags, .) + //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there @@ -464,9 +519,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/ui_action_click(mob/user, actiontype) attack_self(user) -/obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit - return 0 - /obj/item/proc/eyestab(mob/living/carbon/M, mob/living/carbon/user) if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm [M]!") @@ -583,6 +635,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/itempush = 1 if(w_class < 4) itempush = 0 //too light to push anything + if(isliving(hit_atom)) //Living mobs handle hit sounds differently. + var/volume = get_volume_by_throwforce_and_or_w_class() + if (throwforce > 0) + if (throwhitsound) + playsound(hit_atom, throwhitsound, volume, TRUE, -1) + else if(hitsound) + playsound(hit_atom, hitsound, volume, TRUE, -1) + else + playsound(hit_atom, 'sound/weapons/genhit.ogg',volume, TRUE, -1) + else + playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) + return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum) /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) @@ -760,14 +824,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/user = usr tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it. -/obj/item/MouseExited() +/obj/item/MouseExited(location,control,params) + SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params) deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) +/obj/item/MouseEntered(location,control,params) + SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params) // Called when a mob tries to use the item as a tool. // Handles most checks. -/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks) +/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = 1, max_level = INFINITY) // No delay means there is no start message, and no reason to call tool_start_check before use_tool. // Run the start check here so we wouldn't have to call it manually. if(!delay && !tool_start_check(user, amount)) @@ -779,6 +846,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) play_tool_sound(target, volume) if(delay) + if(user.mind && used_skills) + delay = user.mind.item_action_skills_mod(src, delay, skill_difficulty, SKILL_USE_TOOL, null, FALSE) + // Create a callback with checks that would be called every tick by do_after. var/datum/callback/tool_check = CALLBACK(src, .proc/tool_check_callback, user, amount, extra_checks) @@ -803,6 +873,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(delay >= MIN_TOOL_SOUND_DELAY) play_tool_sound(target, volume) + + if(user.mind && used_skills && skill_gain_mult) + var/gain = skill_gain + delay/SKILL_GAIN_DELAY_DIVISOR + for(var/skill in used_skills) + if(!(SKILL_TRAINING_TOOL in used_skills[skill])) + continue + user.mind.auto_gain_experience(skill, gain*skill_gain_mult, GET_STANDARD_LVL(max_level)) + return TRUE // Called before use_tool if there is a delay, or by use_tool if there isn't. @@ -857,11 +935,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return return ..() -/obj/item/proc/embedded(mob/living/carbon/human/embedded_mob) +/// Get an item's volume that it uses when being stored. +/obj/item/proc/get_w_volume() + // if w_volume is 0 you fucked up anyways lol + return w_volume || AUTO_SCALE_VOLUME(w_class) + +/obj/item/proc/embedded(atom/embedded_target) return /obj/item/proc/unembedded() - return + if(item_flags & DROPDEL) + QDEL_NULL(src) + return TRUE /** * Sets our slowdown and updates equipment slowdown of any mob we're equipped on. @@ -877,3 +962,135 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) . = ..() if(var_name == NAMEOF(src, slowdown)) set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior. +/** + * Does the current embedding var meet the criteria for being harmless? Namely, does it explicitly define the pain multiplier and jostle pain mult to be 0? If so, return true. + * + */ +/obj/item/proc/isEmbedHarmless() + if(embedding) + return !isnull(embedding["pain_mult"]) && !isnull(embedding["jostle_pain_mult"]) && embedding["pain_mult"] == 0 && embedding["jostle_pain_mult"] == 0 + +///In case we want to do something special (like self delete) upon failing to embed in something, return true +/obj/item/proc/failedEmbed() + if(item_flags & DROPDEL) + QDEL_NULL(src) + return TRUE + +/** + + + + * tryEmbed() is for when you want to try embedding something without dealing with the damage + hit messages of calling hitby() on the item while targetting the target. + + + + * + + + + * Really, this is used mostly with projectiles with shrapnel payloads, from [/datum/element/embed/proc/checkEmbedProjectile], and called on said shrapnel. Mostly acts as an intermediate between different embed elements. + + + + * + + + + * Arguments: + + + + * * target- Either a body part, a carbon, or a closed turf. What are we hitting? + + + + * * forced- Do we want this to go through 100%? + + + + */ + + + +/obj/item/proc/tryEmbed(atom/target, forced=FALSE, silent=FALSE) + + + + if(!isbodypart(target) && !iscarbon(target) && !isclosedturf(target)) + + + + return + + + + if(!forced && !LAZYLEN(embedding)) + + + + return + + + + + + + + if(SEND_SIGNAL(src, COMSIG_EMBED_TRY_FORCE, target, forced, silent)) + + + + return TRUE + + + + failedEmbed() + + + + + + + +///For when you want to disable an item's embedding capabilities (like transforming weapons and such), this proc will detach any active embed elements from it. + + + +/obj/item/proc/disableEmbedding() + + + + SEND_SIGNAL(src, COMSIG_ITEM_DISABLE_EMBED) + + + + return + + + + + + + +///For when you want to add/update the embedding on an item. Uses the vars in [/obj/item/embedding], and defaults to config values for values that aren't set. Will automatically detach previous embed elements on this item. + + + +/obj/item/proc/updateEmbedding() + if(!islist(embedding) || !LAZYLEN(embedding)) + return + + AddElement(/datum/element/embed,\ + embed_chance = (!isnull(embedding["embed_chance"]) ? embedding["embed_chance"] : EMBED_CHANCE),\ + fall_chance = (!isnull(embedding["fall_chance"]) ? embedding["fall_chance"] : EMBEDDED_ITEM_FALLOUT),\ + pain_chance = (!isnull(embedding["pain_chance"]) ? embedding["pain_chance"] : EMBEDDED_PAIN_CHANCE),\ + pain_mult = (!isnull(embedding["pain_mult"]) ? embedding["pain_mult"] : EMBEDDED_PAIN_MULTIPLIER),\ + remove_pain_mult = (!isnull(embedding["remove_pain_mult"]) ? embedding["remove_pain_mult"] : EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER),\ + rip_time = (!isnull(embedding["rip_time"]) ? embedding["rip_time"] : EMBEDDED_UNSAFE_REMOVAL_TIME),\ + ignore_throwspeed_threshold = (!isnull(embedding["ignore_throwspeed_threshold"]) ? embedding["ignore_throwspeed_threshold"] : FALSE),\ + impact_pain_mult = (!isnull(embedding["impact_pain_mult"]) ? embedding["impact_pain_mult"] : EMBEDDED_IMPACT_PAIN_MULTIPLIER),\ + jostle_chance = (!isnull(embedding["jostle_chance"]) ? embedding["jostle_chance"] : EMBEDDED_JOSTLE_CHANCE),\ + jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\ + pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT),\ + embed_chance_turf_mod = (!isnull(embedding["embed_chance_turf_mod"]) ? embedding["embed_chance_turf_mod"] : EMBED_CHANCE_TURF_MOD)) + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index d248556a9c..2fbb45173b 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -143,8 +143,8 @@ RLD //if user can't be seen from A (only checks surroundings' opaqueness) and can't see A. //jarring, but it should stop people from targetting atoms they can't see... //excluding darkness, to allow RLD to be used to light pitch black dark areas. - if(!((user in view(view_range, A)) || (user in viewers(view_range, A)))) - to_chat(user, "You focus, pointing \the [src] at whatever outside your field of vision in the given direction... to no avail.") + if(!((user in view(view_range, A)) || (user in fov_viewers(view_range, A)))) + to_chat(user, "You focus, pointing \the [src] at whatever outside your field of vision in that direction... to no avail.") return FALSE return TRUE @@ -154,6 +154,8 @@ RLD icon_state = "rcd" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + custom_price = PRICE_ABOVE_EXPENSIVE + custom_premium_price = PRICE_ALMOST_ONE_GRAND max_matter = 160 item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE @@ -744,7 +746,7 @@ RLD if(istype(A, /obj/machinery/light/)) if(checkResource(deconcost, user)) to_chat(user, "You start deconstructing [A]...") - user.Beam(A,icon_state="nzcrentrs_power",time=15) + user.Beam(A,icon_state="light_beam",time=15) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, decondelay, target = A)) if(!useResource(deconcost, user)) @@ -758,7 +760,7 @@ RLD var/turf/closed/wall/W = A if(checkResource(floorcost, user)) to_chat(user, "You start building a wall light...") - user.Beam(A,icon_state="nzcrentrs_power",time=15) + user.Beam(A,icon_state="light_beam",time=15) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 0) if(do_after(user, floordelay, target = A)) @@ -804,7 +806,7 @@ RLD var/turf/open/floor/F = A if(checkResource(floorcost, user)) to_chat(user, "You start building a floor light...") - user.Beam(A,icon_state="nzcrentrs_power",time=15) + user.Beam(A,icon_state="light_beam",time=15) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1) if(do_after(user, floordelay, target = A)) @@ -833,6 +835,12 @@ RLD return TRUE return FALSE +/obj/item/construction/rld/mini + name = "mini-rapid-light-device (MRLD)" + desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges." + matter = 100 + max_matter = 100 + /obj/item/rcd_upgrade name = "RCD advanced design disk" desc = "It seems to be empty." diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 72e6ccbbe2..f3ea461c74 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -113,7 +113,7 @@ cable_overlay.color = GLOB.cable_colors[colors[current_color_index]] . += cable_overlay -/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands || !(loaded?.amount)) return @@ -201,7 +201,7 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) return //If we've run out, display message and exit else last = null - loaded.item_color = colors[current_color_index] + loaded.color = colors[current_color_index] last = loaded.place_turf(get_turf(src), user, turn(user.dir, 180)) is_empty(user) //If we've run out, display message update_icon() @@ -223,7 +223,6 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) continue if(C.d1 == 0) return C - break return @@ -277,7 +276,7 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) if(T.intact || !T.can_have_cabling()) return - loaded.item_color = colors[current_color_index] + loaded.color = colors[current_color_index] var/obj/structure/cable/linkingCable = findLinkingCable(user) if(linkingCable) @@ -299,7 +298,7 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook) var/cwname = colors[current_color_index] to_chat(user, "Color changed to [cwname]!") if(loaded) - loaded.item_color= colors[current_color_index] + loaded.color = colors[current_color_index] update_icon() if(wiring_gui_menu) wiringGuiUpdate(user) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index ba0766de00..01b351edd0 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -7,7 +7,7 @@ RSF name = "\improper Rapid-Service-Fabricator" desc = "A device used to rapidly deploy service items." icon = 'icons/obj/tools.dmi' - icon_state = "rcd" + icon_state = "rsf" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' opacity = 0 @@ -41,24 +41,21 @@ RSF /obj/item/rsf/attack_self(mob/user) playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) switch(mode) + if(5) + mode = 1 + to_chat(user, "Changed dispensing mode to 'Drinking Glass'") if(1) mode = 2 - to_chat(user, "Changed dispensing mode to 'Drinking Glass'") + to_chat(user, "Changed dispensing mode to 'Paper'") if(2) mode = 3 - to_chat(user, "Changed dispensing mode to 'Paper'") + to_chat(user, "Changed dispensing mode to 'Pen'") if(3) mode = 4 - to_chat(user, "Changed dispensing mode to 'Pen'") + to_chat(user, "Changed dispensing mode to 'Dice Pack'") if(4) mode = 5 - to_chat(user, "Changed dispensing mode to 'Dice Pack'") - if(5) - mode = 6 to_chat(user, "Changed dispensing mode to 'Cigarette'") - if(6) - mode = 1 - to_chat(user, "Changed dispensing mode to 'Dosh'") // Change mode /obj/item/rsf/afterattack(atom/A, mob/user, proximity) @@ -81,26 +78,22 @@ RSF playsound(src.loc, 'sound/machines/click.ogg', 10, 1) switch(mode) if(1) - to_chat(user, "Dispensing Dosh...") - new /obj/item/stack/spacecash/c10(T) - use_matter(200, user) - if(2) to_chat(user, "Dispensing Drinking Glass...") new /obj/item/reagent_containers/food/drinks/drinkingglass(T) use_matter(20, user) - if(3) + if(2) to_chat(user, "Dispensing Paper Sheet...") new /obj/item/paper(T) use_matter(10, user) - if(4) + if(3) to_chat(user, "Dispensing Pen...") new /obj/item/pen(T) use_matter(50, user) - if(5) + if(4) to_chat(user, "Dispensing Dice Pack...") new /obj/item/storage/pill_bottle/dice(T) use_matter(200, user) - if(6) + if(5) to_chat(user, "Dispensing Cigarette...") new /obj/item/clothing/mask/cigarette(T) use_matter(10, user) @@ -117,7 +110,7 @@ RSF name = "Cookie Synthesizer" desc = "A self-recharging device used to rapidly deploy cookies." icon = 'icons/obj/tools.dmi' - icon_state = "rcd" + icon_state = "rsf" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' var/matter = 10 diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 45fea91e49..c9a31a48c2 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -125,3 +125,112 @@ user.put_in_hands(ink) to_chat(user, "You remove [ink] from [src].") ink = null + + +/obj/item/airlock_painter/decal + name = "decal painter" + desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design." + icon = 'icons/obj/objects.dmi' + icon_state = "decal_sprayer" + item_state = "decalsprayer" + custom_materials = list(/datum/material/iron=2000, /datum/material/glass=500) + var/stored_dir = 2 + var/stored_color = "" + var/stored_decal = "warningline" + var/stored_decal_total = "warningline" + var/color_list = list("","red","white") + var/dir_list = list(1,2,4,8) + var/decal_list = list(list("Warning Line","warningline"), + list("Warning Line Corner","warninglinecorner"), + list("Caution Label","caution"), + list("Directional Arrows","arrows"), + list("Stand Clear Label","stand_clear"), + list("Box","box"), + list("Box Corner","box_corners"), + list("Delivery Marker","delivery"), + list("Warning Box","warn_full")) + +/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity) + . = ..() + var/turf/open/floor/F = target + if(!proximity) + to_chat(user, "You need to get closer!") + return + if(use_paint(user) && isturf(F)) + F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, turn(stored_dir, -dir2angle(F.dir)), CLEAN_STRONG, color, null, null, alpha) + +/obj/item/airlock_painter/decal/attack_self(mob/user) + if((ink) && (ink.charges >= 1)) + to_chat(user, "[src] beeps to prevent you from removing the toner until out of charges.") + return + . = ..() + +/obj/item/airlock_painter/decal/AltClick(mob/user) + . = ..() + ui_interact(user) + +/obj/item/airlock_painter/decal/Initialize() + . = ..() + ink = new /obj/item/toner/large(src) + +/obj/item/airlock_painter/decal/proc/update_decal_path() + var/yellow_fix = "" //This will have to do until someone refactor's markings.dm + if (stored_color) + yellow_fix = "_" + stored_decal_total = "[stored_decal][yellow_fix][stored_color]" + return + +/obj/item/airlock_painter/decal/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "decal_painter", name, 500, 400, master_ui, state) + ui.open() + +/obj/item/airlock_painter/decal/ui_data(mob/user) + var/list/data = list() + data["decal_direction"] = stored_dir + data["decal_color"] = stored_color + data["decal_style"] = stored_decal + data["decal_list"] = list() + data["color_list"] = list() + data["dir_list"] = list() + + for(var/i in decal_list) + data["decal_list"] += list(list( + "name" = i[1], + "decal" = i[2] + )) + for(var/j in color_list) + data["color_list"] += list(list( + "colors" = j + )) + for(var/k in dir_list) + data["dir_list"] += list(list( + "dirs" = k + )) + return data + +/obj/item/airlock_painter/decal/ui_act(action,list/params) + if(..()) + return + switch(action) + //Lists of decals and designs + if("select decal") + var/selected_decal = params["decals"] + stored_decal = selected_decal + if("select color") + var/selected_color = params["colors"] + stored_color = selected_color + if("selected direction") + var/selected_direction = text2num(params["dirs"]) + stored_dir = selected_direction + update_decal_path() + . = TRUE + +/obj/item/airlock_painter/decal/debug + name = "extreme decal painter" + icon_state = "decal_sprayer_ex" + +/obj/item/airlock_painter/decal/debug/Initialize() + . = ..() + ink = new /obj/item/toner/extreme(src) \ No newline at end of file diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 1f6dff490d..3640db2d8a 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -58,18 +58,22 @@ /obj/item/wallframe/proc/after_attach(var/obj/O) transfer_fingerprints_to(O) -/obj/item/wallframe/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/screwdriver)) - // For camera-building borgs - var/turf/T = get_step(get_turf(user), user.dir) - if(iswallturf(T)) - T.attackby(src, user, params) +/obj/item/wallframe/screwdriver_act(mob/user, obj/item/I) + . = ..() + if(.) + return + // For camera-building borgs + var/turf/T = get_step(get_turf(user), user.dir) + if(iswallturf(T)) + T.attackby(src, user) +/obj/item/wallframe/wrench_act(mob/user, obj/item/I) + if(!custom_materials) + return var/metal_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]/MINERAL_MATERIAL_AMOUNT) var/glass_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]/MINERAL_MATERIAL_AMOUNT) - if(istype(W, /obj/item/wrench) && (metal_amt || glass_amt)) + if(metal_amt || glass_amt) to_chat(user, "You dismantle [src].") if(metal_amt) new /obj/item/stack/sheet/metal(get_turf(src), metal_amt) diff --git a/code/game/objects/items/balls.dm b/code/game/objects/items/balls.dm index c24f58208b..2e5a385ead 100644 --- a/code/game/objects/items/balls.dm +++ b/code/game/objects/items/balls.dm @@ -15,7 +15,7 @@ lefthand_file = 'modular_citadel/icons/mob/inhands/balls_left.dmi' righthand_file = 'modular_citadel/icons/mob/inhands/balls_right.dmi' item_state = "tennis_classic" - alternate_worn_icon = 'modular_citadel/icons/mob/mouthball.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/mouthball.dmi' slot_flags = ITEM_SLOT_HEAD | ITEM_SLOT_NECK | ITEM_SLOT_EARS //Fluff item, put it wherever you want! throw_range = 14 w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index e93bfb9976..dbc66b1899 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -38,7 +38,6 @@ /obj/item/bodybag/bluespace name = "bluespace body bag" desc = "A folded bluespace body bag designed for the storage and transportation of cadavers." - icon = 'icons/obj/bodybag.dmi' icon_state = "bluebodybag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/bluespace w_class = WEIGHT_CLASS_SMALL @@ -81,3 +80,13 @@ return loc.visible_message("[user] suddenly appears in front of [loc]!", "[user] breaks free of [src]!") qdel(src) + +// Containment bodybag + +/obj/item/bodybag/containment + name = "radiation containment body bag" + desc = "A folded heavy body bag designed for the storage and transportation of heavily irradiated cadavers." + icon_state = "radbodybag_folded" + unfoldedbag_path = /obj/structure/closet/body_bag/containment + w_class = WEIGHT_CLASS_NORMAL + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 2daf6f0c0b..6648db46c4 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -6,17 +6,42 @@ icon_state = "cutout_basic" w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE - // Possible restyles for the cutout; - // add an entry in change_appearance() if you add to here - var/list/possible_appearances = list("Assistant", "Clown", "Mime", - "Traitor", "Nuke Op", "Cultist", "Brass Cultist", "Clockwork Cultist", - "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Xenomorph Maid", "Swarmer", - "Ash Walker", "Deathsquad Officer", "Ian", "Slaughter Demon", - "Laughter Demon", "Private Security Officer", "Securitron", "Gondola", "Monkey") - var/pushed_over = FALSE //If the cutout is pushed over and has to be righted - var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version + /// Possible restyles for the cutout, add an entry in change_appearance() if you add to here + var/static/list/possible_appearances + /// If the cutout is pushed over and has to be righted + var/pushed_over = FALSE + /// If the cutout actually appears as what it portray and not a discolored version + var/deceptive = FALSE - var/lastattacker = null +/obj/item/cardboard_cutout/Initialize() + . = ..() + if(possible_appearances) + return + possible_appearances = sortList(list( + "Assistant" = image(icon = src.icon, icon_state = "cutout_greytide"), + "Clown" = image(icon = src.icon, icon_state = "cutout_clown"), + "Mime" = image(icon = src.icon, icon_state = "cutout_mime"), + "Traitor" = image(icon = src.icon, icon_state = "cutout_traitor"), + "Nuke Op" = image(icon = src.icon, icon_state = "cutout_fluke"), + "Cultist" = image(icon = src.icon, icon_state = "cutout_cultist"), + "Brass Cultist" = image(icon = src.icon, icon_state = "cutout_servant"), + "Clockwork Cultist" = image(icon = src.icon, icon_state = "cutout_new_servant"), + "Revolutionary" = image(icon = src.icon, icon_state = "cutout_viva"), + "Wizard" = image(icon = src.icon, icon_state = "cutout_wizard"), + "Shadowling" = image(icon = src.icon, icon_state = "cutout_shadowling"), + "Xenomorph" = image(icon = src.icon, icon_state = "cutout_fukken_xeno"), + "Xenomorph Maid" = image(icon = src.icon, icon_state = "cutout_lusty"), + "Swarmer" = image(icon = src.icon, icon_state = "cutout_swarmer"), + "Ash Walker" = image(icon = src.icon, icon_state = "cutout_free_antag"), + "Deathsquad Officer" = image(icon = src.icon, icon_state = "cutout_deathsquad"), + "Ian" = image(icon = src.icon, icon_state = "cutout_ian"), + "Slaughter Demon" = image(icon = 'icons/mob/mob.dmi', icon_state = "daemon"), + "Laughter Demon" = image(icon = 'icons/mob/mob.dmi', icon_state = "bowmon"), + "Private Security Officer" = image(icon = src.icon, icon_state = "cutout_ntsec"), + "Securitron" = image(icon = src.icon, icon_state = "cutout_law"), + "Gondola" = image(icon = src.icon, icon_state = "cutout_gondola"), + "Monkey" = image(icon = src.icon, icon_state = "cutout_monky"), + )) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/cardboard_cutout/attack_hand(mob/living/user) @@ -76,22 +101,21 @@ push_over() return BULLET_ACT_HIT +/** + * change_appearance: Changes a skin of the cardboard cutout based on a user's choice + * + * Arguments: + * * crayon The crayon used to change and recolor the cardboard cutout + * * user The mob choosing a skin of the cardboard cutout + */ /obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user) - if(!crayon || !user) - return - if(pushed_over) - to_chat(user, "Right [src] first!") - return - if(crayon.check_empty(user)) - return - if(crayon.is_capped) - to_chat(user, "Take the cap off first!") - return - var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances - if(!new_appearance || !crayon || !user.canUseTopic(src)) + var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, .proc/check_menu, user, crayon), radius = 36, require_near = TRUE) + if(!new_appearance) return if(!do_after(user, 10, FALSE, src, TRUE)) - return + return FALSE + if(!check_menu(user, crayon)) + return FALSE user.visible_message("[user] gives [src] a new look.", "Voila! You give [src] a new look.") crayon.use_charges(1) crayon.check_empty(user) @@ -196,7 +220,33 @@ name = "monkey ([rand(1, 999)])" desc = "A cardboard cutout of a monkey." icon_state = "cutout_monky" - return 1 + else + return FALSE + return TRUE + +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + * * crayon The crayon used to interact with a menu + */ +/obj/item/cardboard_cutout/proc/check_menu(mob/living/user, obj/item/toy/crayon/crayon) + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + if(pushed_over) + to_chat(user, "Right [src] first!") + return FALSE + if(!crayon || !user.is_holding(crayon)) + return FALSE + if(crayon.check_empty(user)) + return FALSE + if(crayon.is_capped) + to_chat(user, "Take the cap off first!") + return FALSE + return TRUE /obj/item/cardboard_cutout/setDir(newdir) dir = SOUTH diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 20e0b09d26..58d907e14b 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -6,8 +6,6 @@ * FINGERPRINT CARD */ - - /* * DATA CARDS - Used for the IC data card reader */ @@ -85,7 +83,7 @@ /obj/item/card/emag/bluespace name = "bluespace cryptographic sequencer" desc = "It's a blue card with a magnetic strip attached to some circuitry. It appears to have some sort of transmitter attached to it." - color = rgb(40, 130, 255) + icon_state = "emag_bs" prox_check = FALSE /obj/item/card/emag/attack() @@ -168,18 +166,39 @@ slot_flags = ITEM_SLOT_ID armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) resistance_flags = FIRE_PROOF | ACID_PROOF + var/id_type_name = "identification card" var/mining_points = 0 //For redeeming at mining equipment vendors var/list/access = list() var/registered_name = null // The name registered_name on the card var/assignment = null var/access_txt // mapping aid - - + var/bank_support = ID_FREE_BANK_ACCOUNT + var/datum/bank_account/registered_account + var/obj/machinery/paystand/my_store + var/uses_overlays = TRUE + var/icon/cached_flat_icon /obj/item/card/id/Initialize(mapload) . = ..() if(mapload && access_txt) access = text2access(access_txt) + switch(bank_support) + if(ID_FREE_BANK_ACCOUNT) + var/turf/T = get_turf(src) + if(T && is_vr_level(T.z)) //economy is exploitable on VR in so many ways. + bank_support = ID_NO_BANK_ACCOUNT + if(ID_LOCKED_BANK_ACCOUNT) + registered_account = new /datum/bank_account/remote/non_transferable(pick(GLOB.redacted_strings)) + +/obj/item/card/id/Destroy() + if(bank_support == ID_LOCKED_BANK_ACCOUNT) + QDEL_NULL(registered_account) + else + registered_account = null + if(my_store) + my_store.my_card = null + my_store = null + return ..() /obj/item/card/id/vv_edit_var(var_name, var_value) . = ..() @@ -193,12 +212,149 @@ user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ "You show \the [src.name].") add_fingerprint(user) + +/obj/item/card/id/attackby(obj/item/W, mob/user, params) + if(!bank_support) + return ..() + if(istype(W, /obj/item/holochip)) + insert_money(W, user) + else if(istype(W, /obj/item/stack/spacecash) || istype(W, /obj/item/coin)) + insert_money(W, user, TRUE) + else if(istype(W, /obj/item/storage/bag/money)) + var/obj/item/storage/bag/money/money_bag = W + var/list/money_contained = money_bag.contents + var/money_added = mass_insert_money(money_contained, user) + if (money_added) + to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.") + else + return ..() + +/obj/item/card/id/proc/insert_money(obj/item/I, mob/user, physical_currency) + var/cash_money = I.get_item_credit_value() + if(!cash_money) + to_chat(user, "[I] doesn't seem to be worth anything!") return + if(!registered_account) + to_chat(user, "[src] doesn't have a linked account to deposit [I] into!") + return + + registered_account.adjust_money(cash_money) + if(physical_currency) + to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.") + else + to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.") + + to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.") + qdel(I) + +/obj/item/card/id/proc/mass_insert_money(list/money, mob/user) + if (!money || !money.len) + return FALSE + + var/total = 0 + + for (var/obj/item/physical_money in money) + var/cash_money = physical_money.get_item_credit_value() + + total += cash_money + + registered_account.adjust_money(cash_money) + + QDEL_LIST(money) + + return total + +/obj/item/card/id/proc/alt_click_can_use_id(mob/living/user) + if(!isliving(user)) + return + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + + return TRUE + +// Returns true if new account was set. +/obj/item/card/id/proc/set_new_account(mob/living/user) + if(bank_support != ID_FREE_BANK_ACCOUNT) + to_chat(user, "This ID has no modular banking support whatsover, must be an older model...") + return + . = FALSE + var/datum/bank_account/old_account = registered_account + + var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null + + if (isnull(new_bank_id)) + return + + if(!alt_click_can_use_id(user)) + return + if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999) + to_chat(user, "The account ID number needs to be between 111111 and 999999.") + return + if (registered_account && registered_account.account_id == new_bank_id) + to_chat(user, "The account ID was already assigned to this card.") + return + + for(var/A in SSeconomy.bank_accounts) + var/datum/bank_account/B = A + if(B.account_id == new_bank_id) + if (old_account) + old_account.bank_cards -= src + + B.bank_cards += src + registered_account = B + to_chat(user, "The provided account has been linked to this ID card.") + + return TRUE + + to_chat(user, "The account ID number provided is invalid.") + return + +/obj/item/card/id/AltClick(mob/living/user) + . = ..() + if(!bank_support || !alt_click_can_use_id(user)) + return + + if(!registered_account && bank_support == ID_FREE_BANK_ACCOUNT) + set_new_account(user) + return + + if (world.time < registered_account.withdrawDelay) + registered_account.bank_card_talk("ERROR: UNABLE TO LOGIN DUE TO SCHEDULED MAINTENANCE. MAINTENANCE IS SCHEDULED TO COMPLETE IN [(registered_account.withdrawDelay - world.time)/10] SECONDS.", TRUE) + return + + var/amount_to_remove = input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null + + if(!amount_to_remove || amount_to_remove < 0) + return + if(!alt_click_can_use_id(user)) + return + amount_to_remove = FLOOR(min(amount_to_remove, registered_account.account_balance), 1) + if(amount_to_remove && registered_account.adjust_money(-amount_to_remove)) + var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) + user.put_in_hands(holochip) + to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.") + return + registered_account.bank_card_talk("ERROR: The linked account has no sufficient credits to perform that withdrawal.", TRUE) + /obj/item/card/id/examine(mob/user) . = ..() if(mining_points) . += "There's [mining_points] mining equipment redemption point\s loaded onto this card." + if(!bank_support || (bank_support == ID_LOCKED_BANK_ACCOUNT && !registered_account)) + . += "This ID has no banking support whatsover, must be an older model..." + else if(registered_account) + . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." + if(registered_account.account_job) + var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) + if(D) + . += "The [D.account_holder] reports a balance of [D.account_balance] cr." + . += "Alt-Click the ID to pull money from the linked account in the form of holochips." + . += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID." + if(registered_account.account_holder == user.real_name) + . += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number." + else + . += "There is no registered account linked to this card. Alt-Click to add one." /obj/item/card/id/GetAccess() return access @@ -209,20 +365,38 @@ /obj/item/card/id/RemoveID() return src -/* -Usage: -update_label() - Sets the id name to whatever registered_name and assignment is +/obj/item/card/id/update_overlays() + . = ..() + if(!uses_overlays) + return + cached_flat_icon = null + var/job = assignment ? ckey(GetJobName()) : null + if(registered_name == "Captain") + job = "captain" + if(registered_name && registered_name != "Captain") + . += mutable_appearance(icon, "assigned") + if(job) + . += mutable_appearance(icon, "id[job]") + +/obj/item/card/id/proc/get_cached_flat_icon() + if(!cached_flat_icon) + cached_flat_icon = getFlatIcon(src) + return cached_flat_icon + + +/obj/item/card/id/get_examine_string(mob/user, thats = FALSE) + if(uses_overlays) + return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat + return ..() -update_label("John Doe", "Clowny") - Properly formats the name and occupation and sets the id name to the arguments -*/ /obj/item/card/id/proc/update_label(newname, newjob) if(newname || newjob) name = "[(!newname) ? "identification card" : "[newname]'s ID Card"][(!newjob) ? "" : " ([newjob])"]" + update_icon() return name = "[(!registered_name) ? "identification card" : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]" + update_icon() /obj/item/card/id/silver name = "silver identification card" @@ -235,6 +409,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/silver/reaper name = "Thirteen's ID Card (Reaper)" access = list(ACCESS_MAINT_TUNNELS) + icon_state = "reaper" assignment = "Reaper" registered_name = "Thirteen" @@ -258,6 +433,8 @@ update_label("John Doe", "Clowny") chameleon_action.chameleon_type = /obj/item/card/id chameleon_action.chameleon_name = "ID Card" chameleon_action.initialize_disguises() + if(!anyone) + AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, NONE) //no deconstructive analyzer usage. /obj/item/card/id/syndicate/afterattack(obj/item/O, mob/user, proximity) if(!proximity) @@ -278,8 +455,12 @@ update_label("John Doe", "Clowny") else return ..() - var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset") - if(user.incapacitated()) + var/popup_input + if(bank_support == ID_FREE_BANK_ACCOUNT) + popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset", "Change Account ID") + else + popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset") + if(!user.canUseTopic(src, BE_CLOSE, FALSE)) return if(popup_input == "Forge/Reset" && !forged) var/input_name = stripped_input(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) @@ -302,6 +483,18 @@ update_label("John Doe", "Clowny") forged = TRUE to_chat(user, "You successfully forge the ID card.") log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\" and occupation \"[assignment]\".") + + // First time use automatically sets the account id to the user. + if (first_use && !registered_account) + if(ishuman(user)) + var/mob/living/carbon/human/accountowner = user + + for(var/bank_account in SSeconomy.bank_accounts) + var/datum/bank_account/account = bank_account + if(account.account_id == accountowner.account_id) + account.bank_cards += src + registered_account = account + to_chat(user, "Your account number has been automatically assigned.") return else if (popup_input == "Forge/Reset" && forged) registered_name = initial(registered_name) @@ -311,6 +504,9 @@ update_label("John Doe", "Clowny") forged = FALSE to_chat(user, "You successfully reset the ID card.") return + else if (popup_input == "Change Account ID") + set_new_account(user) + return return ..() /obj/item/card/id/syndicate/anyone @@ -327,6 +523,15 @@ update_label("John Doe", "Clowny") assignment = "Syndicate Overlord" access = list(ACCESS_SYNDICATE) +/obj/item/card/id/no_banking + bank_support = ID_NO_BANK_ACCOUNT + +/obj/item/card/id/locked_banking + bank_support = ID_LOCKED_BANK_ACCOUNT + +/obj/item/card/id/syndicate/locked_banking + bank_support = ID_LOCKED_BANK_ACCOUNT + /obj/item/card/id/captains_spare name = "captain's spare ID" desc = "The spare ID of the High Lord himself." @@ -356,7 +561,7 @@ update_label("John Doe", "Clowny") /obj/item/card/id/ert name = "\improper CentCom ID" desc = "An ERT ID card." - icon_state = "centcom" + icon_state = "ert_commander" registered_name = "Emergency Response Team Commander" assignment = "Emergency Response Team Commander" @@ -365,6 +570,7 @@ update_label("John Doe", "Clowny") . = ..() /obj/item/card/id/ert/Security + icon_state = "ert_security" registered_name = "Security Response Officer" assignment = "Security Response Officer" @@ -373,6 +579,7 @@ update_label("John Doe", "Clowny") . = ..() /obj/item/card/id/ert/Engineer + icon_state = "ert_engineer" registered_name = "Engineer Response Officer" assignment = "Engineer Response Officer" @@ -381,6 +588,7 @@ update_label("John Doe", "Clowny") . = ..() /obj/item/card/id/ert/Medical + icon_state = "ert_medical" registered_name = "Medical Response Officer" assignment = "Medical Response Officer" @@ -389,6 +597,7 @@ update_label("John Doe", "Clowny") . = ..() /obj/item/card/id/ert/chaplain + icon_state = "ert_chaplain" registered_name = "Religious Response Officer" assignment = "Religious Response Officer" @@ -441,40 +650,49 @@ update_label("John Doe", "Clowny") . += "Your sentence is up! You're free!" /obj/item/card/id/prisoner/one + icon_state = "prisoner_001" name = "Prisoner #13-001" registered_name = "Prisoner #13-001" /obj/item/card/id/prisoner/two + icon_state = "prisoner_002" name = "Prisoner #13-002" registered_name = "Prisoner #13-002" /obj/item/card/id/prisoner/three + icon_state = "prisoner_003" name = "Prisoner #13-003" registered_name = "Prisoner #13-003" /obj/item/card/id/prisoner/four + icon_state = "prisoner_004" name = "Prisoner #13-004" registered_name = "Prisoner #13-004" /obj/item/card/id/prisoner/five + icon_state = "prisoner_005" name = "Prisoner #13-005" registered_name = "Prisoner #13-005" /obj/item/card/id/prisoner/six + icon_state = "prisoner_006" name = "Prisoner #13-006" registered_name = "Prisoner #13-006" /obj/item/card/id/prisoner/seven + icon_state = "prisoner_007" name = "Prisoner #13-007" registered_name = "Prisoner #13-007" /obj/item/card/id/mining name = "mining ID" + icon_state = "retro" access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) /obj/item/card/id/away name = "a perfectly generic identification card" desc = "A perfectly generic identification card. Looks like it could use some flavor." + icon_state = "retro" access = list(ACCESS_AWAY_GENERAL) /obj/item/card/id/away/hotel @@ -514,6 +732,36 @@ update_label("John Doe", "Clowny") desc = "A special ID card that allows access to APC terminals." access = list(ACCESS_ENGINE_EQUIP) +/obj/item/card/id/departmental_budget + name = "departmental card (FUCK)" + desc = "Provides access to the departmental budget." + icon_state = "budgetcard" + var/department_ID = ACCOUNT_CIV + var/department_name = ACCOUNT_CIV_NAME + +/obj/item/card/id/departmental_budget/Initialize() + . = ..() + var/datum/bank_account/B = SSeconomy.get_dep_account(department_ID) + if(B) + registered_account = B + if(!B.bank_cards.Find(src)) + B.bank_cards += src + name = "departmental card ([department_name])" + desc = "Provides access to the [department_name]." + icon_state = "[lowertext(department_ID)]_budget" + SSeconomy.dep_cards += src + +/obj/item/card/id/departmental_budget/Destroy() + SSeconomy.dep_cards -= src + return ..() + +/obj/item/card/id/departmental_budget/update_label() + return + +/obj/item/card/id/departmental_budget/car + department_ID = ACCOUNT_CAR + department_name = ACCOUNT_CAR_NAME + //Polychromatic Knight Badge /obj/item/card/id/knight @@ -576,5 +824,5 @@ update_label("John Doe", "Clowny") /obj/item/card/id/debug/Initialize() access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + registered_account = SSeconomy.get_dep_account(ACCOUNT_CAR) . = ..() - diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 6b3428698b..766c3d8636 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -65,7 +65,7 @@ . = ..() AddElement(/datum/element/update_icon_blocker) -/obj/item/gun/energy/chrono_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/energy/chrono_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(field) field_disconnect(field) ..() @@ -193,7 +193,7 @@ /obj/effect/chrono_field/update_icon() var/ttk_frame = 1 - (tickstokill / initial(tickstokill)) - ttk_frame = CLAMP(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) + ttk_frame = clamp(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) if(ttk_frame != RPpos) RPpos = ttk_frame mob_underlay.icon_state = "frame[RPpos]" diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 5b7c70b1b6..bfbacb1a34 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -8,6 +8,9 @@ CIGARS SMOKING PIPES CHEAP LIGHTERS ZIPPO +ROLLING PAPER +VAPES +BONGS CIGARETTE PACKETS ARE IN FANCY.DM */ @@ -506,6 +509,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM resistance_flags = FIRE_PROOF light_color = LIGHT_COLOR_FIRE grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/oil = 5) + custom_price = PRICE_ALMOST_CHEAP /obj/item/lighter/Initialize() . = ..() @@ -615,6 +619,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM desc = "A cheap-as-free lighter." icon_state = "lighter" fancy = FALSE + custom_price = PRICE_CHEAP_AS_FREE overlay_list = list( "transp", "tall", @@ -706,8 +711,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "\improper E-Cigarette" desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\""//<<< i'd vape to that. icon = 'icons/obj/clothing/masks.dmi' - icon_state = null - item_state = null + icon_state = "black_vape" + item_state = "black_vape" w_class = WEIGHT_CLASS_TINY var/chem_volume = 100 var/vapetime = FALSE //this so it won't puff out clouds every tick @@ -723,11 +728,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() create_reagents(chem_volume, NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it reagents.add_reagent(/datum/reagent/drug/nicotine, 50) - if(!icon_state) - if(!param_color) - param_color = pick("red","blue","black","white","green","purple","yellow","orange") - icon_state = "[param_color]_vape" - item_state = "[param_color]_vape" + if(!param_color) + param_color = pick("red","blue","black","white","green","purple","yellow","orange") + icon_state = "[param_color]_vape" + item_state = "[param_color]_vape" /obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params) if(O.tool_behaviour == TOOL_SCREWDRIVER) @@ -799,6 +803,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM to_chat(user, "You need to close the cap first!") /obj/item/clothing/mask/vape/dropped(mob/user) + . = ..() var/mob/living/carbon/C = user if(C.get_item_by_slot(SLOT_WEAR_MASK) == src) ENABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT) @@ -1067,4 +1072,4 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "coconut bong" icon_off = "coconut_bong" icon_on = "coconut_bong_lit" - desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo." \ No newline at end of file + desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo." diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 8400b6fa5c..f94c8f3513 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -14,6 +14,10 @@ name = "Security Cameras (Computer Board)" build_path = /obj/machinery/computer/security +/obj/item/circuitboard/computer/security/shuttle + name = "Shuttlelinking Security Cameras (Computer Board)" + build_path = /obj/machinery/computer/security/shuttle + /obj/item/circuitboard/computer/xenobiology name = "circuit board (Xenobiology Console)" build_path = /obj/machinery/computer/camera_advanced/xenobio @@ -293,9 +297,9 @@ name = "Mining Shuttle (Computer Board)" build_path = /obj/machinery/computer/shuttle/mining -/obj/item/circuitboard/computer/mining_shuttle/common - name = "Lavaland Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/mining/common +/obj/item/circuitboard/computer/snow_taxi + name = "Snow Taxi (Computer Board)" + build_path = /obj/machinery/computer/shuttle/snow_taxi /obj/item/circuitboard/computer/white_ship name = "White Ship (Computer Board)" @@ -379,3 +383,11 @@ /obj/item/circuitboard/computer/nanite_cloud_controller name = "Nanite Cloud Control (Computer Board)" build_path = /obj/machinery/computer/nanite_cloud_controller + +/obj/item/circuitboard/computer/shuttle/flight_control + name = "Shuttle Flight Control (Computer Board)" + build_path = /obj/machinery/computer/custom_shuttle + +/obj/item/circuitboard/computer/shuttle/docker + name = "Shuttle Navigation Computer (Computer Board)" + build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index b13cfd9f64..ea839ae12d 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -229,10 +229,11 @@ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/item/circuitboard/machine/vendor - name = "Booze-O-Mat Vendor (Machine Board)" + name = "Custom Vendor (Machine Board)" desc = "You can turn the \"brand selection\" dial using a screwdriver." - build_path = /obj/machinery/vending/boozeomat - req_components = list(/obj/item/vending_refill/boozeomat = 1) + custom_premium_price = 100 + build_path = /obj/machinery/vending/custom + req_components = list(/obj/item/vending_refill/custom = 1) var/static/list/vending_names_paths = list( /obj/machinery/vending/boozeomat = "Booze-O-Mat", @@ -244,7 +245,7 @@ /obj/machinery/vending/autodrobe = "AutoDrobe", /obj/machinery/vending/assist = "\improper Vendomat", /obj/machinery/vending/engivend = "\improper Engi-Vend", - /obj/machinery/vending/engivend = "\improper YouTool", + /obj/machinery/vending/tool = "\improper YouTool", /obj/machinery/vending/sustenance = "\improper Sustenance Vendor", /obj/machinery/vending/dinnerware = "\improper Plasteel Chef's Dinnerware Vendor", /obj/machinery/vending/cart = "\improper PTech", @@ -269,7 +270,8 @@ /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", /obj/machinery/vending/clothing = "ClothesMate", /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/wallmed = "NanoMed") + /obj/machinery/vending/wallmed = "NanoMed", + /obj/machinery/vending/custom = "Custom Vendor") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) @@ -308,6 +310,13 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/sheet/glass = 1) + var/offstation_security_levels = TRUE + +/obj/item/circuitboard/machine/mechfab/offstation + offstation_security_levels = FALSE + +/obj/item/circuitboard/machine/mechfab/rnd_crafted(obj/machinery/rnd/production/P) + offstation_security_levels = P.offstation_security_levels /obj/item/circuitboard/machine/cryo_tube name = "Cryotube (Machine Board)" @@ -683,6 +692,17 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) needs_anchored = FALSE +/obj/item/circuitboard/machine/chem_dispenser/apothecary + name = "Apotechary Chem Dispenser (Machine Board)" + build_path = /obj/machinery/chem_dispenser/apothecary + req_components = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell = 1) + def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/upgraded/plus) + /obj/item/circuitboard/machine/chem_dispenser/drinks name = "Soda Dispenser (Machine Board)" build_path = /obj/machinery/chem_dispenser/drinks @@ -698,6 +718,10 @@ def_components = list(/obj/item/stock_parts/cell = /obj/item/stock_parts/cell/high) needs_anchored = FALSE +/obj/item/circuitboard/machine/sleeper/party + name = "Party Pod (Machine Board)" + build_path = /obj/machinery/sleeper/party + /obj/item/circuitboard/machine/smoke_machine name = "Smoke Machine (Machine Board)" build_path = /obj/machinery/smoke_machine @@ -759,6 +783,13 @@ /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 1, /obj/item/reagent_containers/glass/beaker = 2) + var/offstation_security_levels = TRUE + +/obj/item/circuitboard/machine/circuit_imprinter/offstation + offstation_security_levels = FALSE + +/obj/item/circuitboard/machine/mechfab/rnd_crafted(obj/machinery/rnd/production/P) + offstation_security_levels = P.offstation_security_levels /obj/item/circuitboard/machine/circuit_imprinter/department name = "Departmental Circuit Imprinter (Machine Board)" @@ -804,7 +835,7 @@ var/new_cloud = input("Set the public nanite chamber's Cloud ID (1-100).", "Cloud ID", cloud_id) as num|null if(new_cloud == null) return - cloud_id = CLAMP(round(new_cloud, 1), 1, 100) + cloud_id = clamp(round(new_cloud, 1), 1, 100) /obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user) . = ..() @@ -832,6 +863,13 @@ /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/manipulator = 2, /obj/item/reagent_containers/glass/beaker = 2) + var/offstation_security_levels = TRUE + +/obj/item/circuitboard/machine/protolathe/offstation + offstation_security_levels = FALSE + +/obj/item/circuitboard/machine/protolathe/rnd_crafted(obj/machinery/rnd/production/P) + offstation_security_levels = P.offstation_security_levels /obj/item/circuitboard/machine/protolathe/department name = "Departmental Protolathe (Machine Board)" @@ -861,6 +899,16 @@ name = "Departmental Protolathe - Service (Machine Board)" build_path = /obj/machinery/rnd/production/protolathe/department/service +/obj/item/circuitboard/machine/bepis + name = "BEPIS Chamber (Machine Board)" + build_path = /obj/machinery/rnd/bepis + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/micro_laser = 1, + /obj/item/stock_parts/scanning_module = 1) + /obj/item/circuitboard/machine/techfab name = "\improper Techfab (Machine Board)" build_path = /obj/machinery/rnd/production/techfab @@ -1019,6 +1067,11 @@ build_path = /obj/machinery/ore_silo req_components = list() +/obj/item/circuitboard/machine/paystand + name = "Pay Stand (Machine Board)" + build_path = /obj/machinery/paystand + req_components = list() + /obj/item/circuitboard/machine/autobottler name = "Auto-Bottler (Machine Board)" build_path = /obj/machinery/rnd/production/protolathe/department/autobottler //Manips make you print things cheaper, even chems @@ -1033,10 +1086,44 @@ build_path = /obj/machinery/vending/kink req_components = list(/obj/item/vending_refill/kink = 1) -/obj/item/circuitboard/machine/autoylathe +/obj/item/circuitboard/machine/autolathe/toy name = "Autoylathe (Machine Board)" - build_path = /obj/machinery/autoylathe + build_path = /obj/machinery/autolathe/toy req_components = list( /obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) + +/obj/item/circuitboard/machine/hypnochair + name = "Enhanced Interrogation Chamber (Machine Board)" + icon_state = "security" + build_path = /obj/machinery/hypnochair + req_components = list( + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/scanning_module = 2 + ) + +/obj/item/circuitboard/machine/shuttle/engine + name = "Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine + req_components = list() + +/obj/item/circuitboard/machine/shuttle/engine/plasma + name = "Plasma Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine/plasma + req_components = list(/obj/item/stock_parts/capacitor = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/micro_laser = 1) + +/obj/item/circuitboard/machine/shuttle/engine/void + name = "Void Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine/void + req_components = list(/obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/micro_laser/quadultra = 1) + +/obj/item/circuitboard/machine/shuttle/heater + name = "Electronic Engine Heater (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/shuttle/heater + req_components = list(/obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/matter_bin = 1) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm new file mode 100644 index 0000000000..8d55d3d5a2 --- /dev/null +++ b/code/game/objects/items/crab17.dm @@ -0,0 +1,229 @@ +/obj/item/suspiciousphone + name = "suspicious phone" + desc = "This device raises pink levels to unknown highs." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "suspiciousphone" + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("dumped") + var/dumped = FALSE + +/obj/item/suspiciousphone/attack_self(mob/user) + if(!ishuman(user)) + to_chat(user, "This device is too advanced for you!") + return + if(dumped) + to_chat(user, "You already activated Protocol CRAB-17.") + return FALSE + if(alert(user, "Are you sure you want to crash this market with no survivors?", "Protocol CRAB-17", "Yes", "No") == "Yes") + if(dumped || QDELETED(src)) //Prevents fuckers from cheesing alert + return FALSE + var/turf/targetturf = get_safe_random_station_turf() + if (!targetturf) + return FALSE + new /obj/effect/dumpeetTarget(targetturf, user) + dumped = TRUE + +/obj/structure/checkoutmachine + name = "\improper Nanotrasen Space-Coin Market" + desc = "This is good for spacecoin because" + icon = 'icons/obj/money_machine.dmi' + icon_state = "bogdanoff" + layer = LARGE_MOB_LAYER + armor = list("melee" = 80, "bullet" = 30, "laser" = 30, "energy" = 60, "bomb" = 90, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) + density = TRUE + pixel_z = -8 + max_integrity = 5000 + var/list/accounts_to_rob + var/mob/living/carbon/human/bogdanoff + var/canwalk = FALSE + +/obj/structure/checkoutmachine/examine(mob/living/user) + . = ..() + . += "It's integrated integrity meter reads: HEALTH: [obj_integrity]." + +/obj/structure/checkoutmachine/proc/check_if_finished() + for(var/i in accounts_to_rob) + var/datum/bank_account/B = i + if (B.being_dumped) + return FALSE + return TRUE + +/obj/structure/checkoutmachine/attackby(obj/item/W, mob/user, params) + if(check_if_finished()) + qdel(src) + return + if(istype(W, /obj/item/card/id)) + var/obj/item/card/id/card = W + if(!card.registered_account) + to_chat(user, "This card does not have a registered account!") + return + if(!card.registered_account.being_dumped) + to_chat(user, "It appears that your funds are safe from draining!") + return + if(do_after(user, 40, target = src)) + if(!card.registered_account.being_dumped) + return + to_chat(user, "You quickly cash out your funds to a more secure banking location. Funds are safu.") // This is a reference and not a typo + card.registered_account.being_dumped = FALSE + card.registered_account.withdrawDelay = 0 + if(check_if_finished()) + qdel(src) + return + else + return ..() + +/obj/structure/checkoutmachine/Initialize(mapload, mob/living/user) + . = ..() + bogdanoff = user + add_overlay("flaps") + add_overlay("hatch") + add_overlay("legs_retracted") + addtimer(CALLBACK(src, .proc/startUp), 50) + QDEL_IN(src, 8 MINUTES) //Self destruct after 8 min + + +/obj/structure/checkoutmachine/proc/startUp() //very VERY snowflake code that adds a neat animation when the pod lands. + start_dumping() //The machine doesnt move during this time, giving people close by a small window to grab their funds before it starts running around + sleep(10) + if(QDELETED(src)) + return + playsound(src, 'sound/machines/click.ogg', 15, TRUE, -3) + cut_overlay("flaps") + sleep(10) + if(QDELETED(src)) + return + playsound(src, 'sound/machines/click.ogg', 15, TRUE, -3) + cut_overlay("hatch") + sleep(30) + if(QDELETED(src)) + return + playsound(src,'sound/machines/twobeep.ogg',50,FALSE) + var/mutable_appearance/hologram = mutable_appearance(icon, "hologram") + hologram.pixel_y = 16 + add_overlay(hologram) + var/mutable_appearance/holosign = mutable_appearance(icon, "holosign") + holosign.pixel_y = 16 + add_overlay(holosign) + add_overlay("legs_extending") + cut_overlay("legs_retracted") + pixel_z += 4 + sleep(5) + if(QDELETED(src)) + return + add_overlay("legs_extended") + cut_overlay("legs_extending") + pixel_z += 4 + sleep(20) + if(QDELETED(src)) + return + add_overlay("screen_lines") + sleep(5) + if(QDELETED(src)) + return + cut_overlay("screen_lines") + sleep(5) + if(QDELETED(src)) + return + add_overlay("screen_lines") + add_overlay("screen") + sleep(5) + if(QDELETED(src)) + return + playsound(src,'sound/machines/triple_beep.ogg',50,FALSE) + add_overlay("text") + sleep(10) + if(QDELETED(src)) + return + add_overlay("legs") + cut_overlay("legs_extended") + cut_overlay("screen") + add_overlay("screen") + cut_overlay("screen_lines") + add_overlay("screen_lines") + cut_overlay("text") + add_overlay("text") + canwalk = TRUE + START_PROCESSING(SSfastprocess, src) + +/obj/structure/checkoutmachine/Destroy() + stop_dumping() + STOP_PROCESSING(SSfastprocess, src) + priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol") + explosion(src, 0,0,1, flame_range = 2) + return ..() + +/obj/structure/checkoutmachine/proc/start_dumping() + accounts_to_rob = SSeconomy.bank_accounts.Copy() + accounts_to_rob -= bogdanoff.get_bank_account() + for(var/i in accounts_to_rob) + var/datum/bank_account/B = i + B.dumpeet() + dump() + +/obj/structure/checkoutmachine/proc/dump() + var/percentage_lost = (rand(5, 15) / 100) + for(var/i in accounts_to_rob) + var/datum/bank_account/B = i + if(!B.being_dumped) + continue + var/amount = B.account_balance * percentage_lost + var/datum/bank_account/account = bogdanoff.get_bank_account() + if (account) // get_bank_account() may return FALSE + account.transfer_money(B, amount) + B.bank_card_talk("You have lost [percentage_lost * 100]% of your funds! A spacecoin credit deposit machine is located at: [get_area(src)].") + addtimer(CALLBACK(src, .proc/dump), 150) //Drain every 15 seconds + +/obj/structure/checkoutmachine/process() + var/anydir = pick(GLOB.cardinals) + if(Process_Spacemove(anydir)) + Move(get_step(src, anydir), anydir) + +/obj/structure/checkoutmachine/proc/stop_dumping() + for(var/i in accounts_to_rob) + var/datum/bank_account/B = i + B.being_dumped = FALSE + +/obj/effect/dumpeetFall //Falling pod + name = "" + icon = 'icons/obj/money_machine_64.dmi' + pixel_z = 300 + desc = "Get out of the way!" + layer = FLY_LAYER//that wasnt flying, that was falling with style! + icon_state = "missile_blur" + +/obj/effect/dumpeetTarget + name = "Landing Zone Indicator" + desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." + icon = 'icons/mob/actions/actions_items.dmi' + icon_state = "sniper_zoom" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + light_range = 2 + var/obj/effect/dumpeetFall/DF + var/obj/structure/checkoutmachine/dump + var/mob/living/carbon/human/bogdanoff + +/obj/effect/ex_act() + return + +/obj/effect/dumpeetTarget/Initialize(mapload, user) + . = ..() + bogdanoff = user + addtimer(CALLBACK(src, .proc/startLaunch), 100) + sound_to_playing_players('sound/items/dump_it.ogg', 20) + deadchat_broadcast("Protocol CRAB-17 has been activated. A space-coin market has been launched at the station!", turf_target = get_turf(src)) + +/obj/effect/dumpeetTarget/proc/startLaunch() + DF = new /obj/effect/dumpeetFall(drop_location()) + dump = new /obj/structure/checkoutmachine(null, bogdanoff) + priority_announce("The spacecoin bubble has popped! Get to the credit deposit machine at [get_area(src)] and cash out before you lose all of your funds!", sender_override = "CRAB-17 Protocol") + animate(DF, pixel_z = -8, time = 5, , easing = LINEAR_EASING) + playsound(src, 'sound/weapons/mortar_whistle.ogg', 70, TRUE, 6) + addtimer(CALLBACK(src, .proc/endLaunch), 5, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + + + +/obj/effect/dumpeetTarget/proc/endLaunch() + QDEL_NULL(DF) //Delete the falling machine effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears + playsound(src, "explosion", 80, TRUE) + dump.forceMove(get_turf(src)) + qdel(src) //The target's purpose is complete. It can rest easy now diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index f5b13d4e3e..a4ed8dedd1 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -26,7 +26,7 @@ var/icon_uncapped var/use_overlays = FALSE - item_color = "red" + var/crayon_color = "red" w_class = WEIGHT_CLASS_TINY attack_verb = list("attacked", "coloured") grind_results = list() @@ -59,7 +59,7 @@ var/edible = TRUE // That doesn't mean eating it is a good idea - var/list/reagent_contents = list(/datum/reagent/consumable/nutriment = 1) + var/list/reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1) // If the user can toggle the colour, a la vanilla spraycan var/can_change_colour = FALSE @@ -83,12 +83,19 @@ . = ..() // Makes crayons identifiable in things like grinders if(name == "crayon") - name = "[item_color] crayon" + name = "[crayon_color] crayon" + + dye_color = crayon_color drawtype = pick(all_drawables) refill() +/obj/item/toy/crayon/examine(mob/user) + . = ..() + if(can_change_colour) + . += "Ctrl-click [src] while it's on your person to quickly recolour it." + /obj/item/toy/crayon/proc/refill() if(charges == -1) charges_left = 100 @@ -158,6 +165,12 @@ update_icon() return TRUE +/obj/item/toy/crayon/CtrlClick(mob/user) + if(can_change_colour && !isturf(loc) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + select_colour(user) + else + return ..() + /obj/item/toy/crayon/proc/staticDrawables() . = list() @@ -235,14 +248,7 @@ else paint_mode = PAINT_NORMAL if("select_colour") - if(can_change_colour) - var/chosen_colour = input(usr,"","Choose Color",paint_color) as color|null - - if (!isnull(chosen_colour)) - paint_color = chosen_colour - . = TRUE - else - . = FALSE + . = can_change_colour && select_colour(usr) if("enter_text") var/txt = stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer) @@ -252,6 +258,13 @@ drawtype = "a" update_icon() +/obj/item/toy/crayon/proc/select_colour(mob/user) + var/chosen_colour = input(user, "", "Choose Color", paint_color) as color|null + if (!isnull(chosen_colour) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + paint_color = chosen_colour + return TRUE + return FALSE + /obj/item/toy/crayon/proc/crayon_text_strip(text) var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]") return replacetext(lowertext(text), crayon_r, "") @@ -344,8 +357,8 @@ var/clicky if(click_params && click_params["icon-x"] && click_params["icon-y"]) - clickx = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - clicky = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + clickx = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + clicky = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) if(!instant) to_chat(user, "You start drawing a [temp] on the [target.name]...") @@ -484,66 +497,75 @@ /obj/item/toy/crayon/red icon_state = "crayonred" paint_color = "#DA0000" - item_color = "red" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/red = 1) + crayon_color = "red" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/red = 0.9) + dye_color = DYE_RED /obj/item/toy/crayon/orange icon_state = "crayonorange" paint_color = "#FF9300" - item_color = "orange" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/orange = 1) + crayon_color = "orange" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/orange = 0.9) + dye_color = DYE_ORANGE /obj/item/toy/crayon/yellow icon_state = "crayonyellow" paint_color = "#FFF200" - item_color = "yellow" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/yellow = 1) + crayon_color = "yellow" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/yellow = 0.9) + dye_color = DYE_YELLOW /obj/item/toy/crayon/green icon_state = "crayongreen" paint_color = "#A8E61D" - item_color = "green" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/green = 1) + crayon_color = "green" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/green = 0.9) + dye_color = DYE_GREEN /obj/item/toy/crayon/blue icon_state = "crayonblue" paint_color = "#00B7EF" - item_color = "blue" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/blue = 1) + crayon_color = "blue" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/blue = 0.9) + dye_color = DYE_BLUE /obj/item/toy/crayon/purple icon_state = "crayonpurple" paint_color = "#DA00FF" - item_color = "purple" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/purple = 1) + crayon_color = "purple" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/purple = 0.9) + dye_color = DYE_PURPLE /obj/item/toy/crayon/black icon_state = "crayonblack" paint_color = "#1C1C1C" //Not completely black because total black looks bad. So Mostly Black. - item_color = "black" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/black = 1) + crayon_color = "black" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/black = 0.9) + dye_color = DYE_BLACK /obj/item/toy/crayon/white icon_state = "crayonwhite" paint_color = "#FFFFFF" - item_color = "white" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/white = 1) + crayon_color = "white" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/white = 0.9) + dye_color = DYE_WHITE /obj/item/toy/crayon/mime icon_state = "crayonmime" desc = "A very sad-looking crayon." paint_color = "#FFFFFF" - item_color = "mime" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent/crayonpowder/invisible = 1) + crayon_color = "mime" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent/crayonpowder/invisible = 0.9) charges = -1 + dye_color = DYE_MIME /obj/item/toy/crayon/rainbow icon_state = "crayonrainbow" paint_color = "#FFF000" - item_color = "rainbow" - reagent_contents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1) + crayon_color = "rainbow" + reagent_contents = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/colorful_reagent = 0.9) drawtype = RANDOM_ANY // just the default starter. - + dye_color = DYE_RAINBOW charges = -1 /obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params) @@ -580,12 +602,12 @@ /obj/item/storage/crayons/update_overlays() . = ..() for(var/obj/item/toy/crayon/crayon in contents) - add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color)) + add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.crayon_color)) /obj/item/storage/crayons/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W - switch(C.item_color) + switch(C.crayon_color) if("mime") to_chat(usr, "This crayon is too sad to be contained in this box.") return @@ -715,13 +737,12 @@ to_chat(usr, "A color that dark on an object like this? Surely not...") return FALSE - target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) if(istype(target, /obj/structure/window)) - if(color_hex2num(paint_color) < 255) - target.set_opacity(255) - else - target.set_opacity(initial(target.opacity)) + var/obj/structure/window/W = target + W.spraycan_paint(paint_color) + else + target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) . = use_charges(user, 2) var/fraction = min(1, . / reagents.maximum_volume) diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm new file mode 100644 index 0000000000..0acb225772 --- /dev/null +++ b/code/game/objects/items/credit_holochip.dm @@ -0,0 +1,107 @@ +/obj/item/holochip + name = "credit holochip" + desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and viceversa. Keep away from magnets." + icon = 'icons/obj/economy.dmi' + icon_state = "holochip" + throwforce = 0 + force = 0 + w_class = WEIGHT_CLASS_TINY + var/credits = 0 + +/obj/item/holochip/Initialize(mapload, amount) + . = ..() + credits = amount + update_icon() + +/obj/item/holochip/examine(mob/user) + . = ..() + . += "It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]\n"+\ + "Alt-Click to split." + +/obj/item/holochip/get_item_credit_value() + return credits + +/obj/item/holochip/update_icon() + name = "\improper [credits] credit holochip" + var/rounded_credits = credits + switch(credits) + if(1 to 999) + icon_state = "holochip" + if(1000 to 999999) + icon_state = "holochip_kilo" + rounded_credits = round(rounded_credits * 0.001) + if(1000000 to 999999999) + icon_state = "holochip_mega" + rounded_credits = round(rounded_credits * 0.000001) + if(1000000000 to INFINITY) + icon_state = "holochip_giga" + rounded_credits = round(rounded_credits * 0.000000001) + var/overlay_color = "#914792" + switch(rounded_credits) + if(0 to 4) + overlay_color = "#8E2E38" + if(5 to 9) + overlay_color = "#914792" + if(10 to 19) + overlay_color = "#BF5E0A" + if(20 to 49) + overlay_color = "#358F34" + if(50 to 99) + overlay_color = "#676767" + if(100 to 199) + overlay_color = "#009D9B" + if(200 to 499) + overlay_color = "#0153C1" + if(500 to INFINITY) + overlay_color = "#2C2C2C" + cut_overlays() + var/mutable_appearance/holochip_overlay = mutable_appearance('icons/obj/economy.dmi', "[icon_state]-color") + holochip_overlay.color = overlay_color + add_overlay(holochip_overlay) + +/obj/item/holochip/proc/spend(amount, pay_anyway = FALSE) + if(credits >= amount) + credits -= amount + if(credits == 0) + qdel(src) + update_icon() + return amount + else if(pay_anyway) + qdel(src) + return credits + else + return 0 + +/obj/item/holochip/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/holochip)) + var/obj/item/holochip/H = I + credits += H.credits + to_chat(user, "You insert the credits into [src].") + update_icon() + qdel(H) + +/obj/item/holochip/AltClick(mob/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + var/split_amount = round(input(user,"How many credits do you want to extract from the holochip?") as null|num) + if(split_amount == null || split_amount <= 0 || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + else + var/new_credits = spend(split_amount, TRUE) + var/obj/item/holochip/H = new(user ? user : drop_location(), new_credits) + if(user) + if(!user.put_in_hands(H)) + H.forceMove(user.drop_location()) + add_fingerprint(user) + H.add_fingerprint(user) + to_chat(user, "You extract [split_amount] credits into a new holochip.") + +/obj/item/holochip/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + var/wipe_chance = 60 / severity + if(prob(wipe_chance)) + visible_message("[src] fizzles and disappears!") + qdel(src) //rip cash diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 3ac3347222..7cc76da312 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -433,7 +433,7 @@ H.visible_message("The defibrillator safely discharges the excessive charge into the floor!") return var/mob/living/M = H.pulledby - if(M.electrocute_act(30, src)) + if(M.electrocute_act(30, H)) M.visible_message("[M] is electrocuted by [M.p_their()] contact with [H]!") M.emote("scream") diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 157cd451d4..2dabcca29f 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -807,9 +807,9 @@ GLOBAL_LIST_EMPTY(PDAs) // If it didn't reach, note that fact if (!signal.data["done"]) to_chat(user, "ERROR: Server isn't responding.") - return if (!silent) playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) + return var/target_text = signal.format_target() if(allow_emojis) @@ -998,9 +998,9 @@ GLOBAL_LIST_EMPTY(PDAs) var/obj/item/card/id/idcard = C if(!idcard.registered_name) to_chat(user, "\The [src] rejects the ID!") - return if (!silent) playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) + return if(!owner) owner = idcard.registered_name diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 1006fe9146..6eae9f127a 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -692,14 +692,14 @@ Code: return GLOB.news_network.SubmitArticle(message,host_pda.owner,current_channel) host_pda.Topic(null,list("choice"=num2text(host_pda.mode))) - return playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + return if("Newscaster Switch Channel") current_channel = host_pda.msg_input() host_pda.Topic(null,list("choice"=num2text(host_pda.mode))) - return playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + return //emoji previews if(href_list["emoji"]) diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index e5dcfc0075..e3385dc13f 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -39,7 +39,7 @@ var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num if(new_duration) new_duration = new_duration SECONDS - new_duration = CLAMP(new_duration, 50, max_duration) + new_duration = clamp(new_duration, 50, max_duration) duration = new_duration to_chat(user, "You set the duration to [DisplayTimeText(duration)].") return TRUE diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 748c494737..41a12136ef 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -3,7 +3,7 @@ /obj/item/dogborg/sleeper name = "hound sleeper" desc = "nothing should see this." - icon = 'icons/mob/dogborg.dmi' + icon = 'icons/mob/robot_items.dmi' icon_state = "sleeper" w_class = WEIGHT_CLASS_TINY var/mob/living/carbon/patient @@ -324,7 +324,7 @@ cleaning_cycles-- cleaning = TRUE for(var/mob/living/carbon/C in (touchable_items)) - if((C.status_flags & GODMODE) || !C.digestable) + if((C.status_flags & GODMODE) || !CHECK_BITFIELD(C.vore_flags, DIGESTABLE)) items_preserved += C else C.adjustBruteLoss(2) @@ -333,7 +333,7 @@ var/atom/target = pick(touchable_items) if(iscarbon(target)) //Handle the target being a mob var/mob/living/carbon/T = target - if(T.stat == DEAD && T.digestable) //Mob is now dead + if(T.stat == DEAD && CHECK_BITFIELD(T.vore_flags, DIGESTABLE)) //Mob is now dead message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") to_chat(hound,"You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.") to_chat(T,"You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.") @@ -418,34 +418,20 @@ var/units = round(patient.reagents.get_reagent_amount(chem)) to_chat(hound, "Injecting [units] unit\s of [chem] into occupant.") //If they were immersed, the reagents wouldn't leave with them. -/obj/item/dogborg/sleeper/medihound //Medihound sleeper - name = "Mobile Sleeper" - desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves." - icon = 'icons/mob/dogborg.dmi' - icon_state = "sleeper" - breakout_time = 30 //Medical sleepers should be designed to be as easy as possible to get out of. - /obj/item/dogborg/sleeper/K9 //The K9 portabrig name = "Mobile Brig" desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals." - icon = 'icons/mob/dogborg.dmi' icon_state = "sleeperb" inject_amount = 0 min_health = -100 injection_chems = null //So they don't have all the same chems as the medihound! breakout_time = 300 -/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity) - if(istype(K9)) - K9.afterattack(src, user ,1) - else - . = ..() - /obj/item/dogborg/sleeper/K9/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity) var/mob/living/silicon/robot/hound = get_host() if(!hound || !istype(target) || !proximity || target.anchored) return - if (!target.devourable) + if (!CHECK_BITFIELD(target.vore_flags,DEVOURABLE)) to_chat(user, "The target registers an error code. Unable to insert into [src].") return if(patient) @@ -462,70 +448,6 @@ user.visible_message("[hound.name]'s mobile brig clunks in series as [target] slips inside.", "Your mobile brig groans lightly as [target] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots - -/obj/item/dogborg/sleeper/compactor //Janihound gut. - name = "garbage processor" - desc = "A mounted garbage compactor unit with fuel processor." - icon = 'icons/mob/dogborg.dmi' - icon_state = "compactor" - inject_amount = 0 - min_health = -100 - injection_chems = null //So they don't have all the same chems as the medihound! - var/max_item_count = 30 - -/obj/item/storage/attackby(obj/item/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO! - if(istype(compactor)) - compactor.afterattack(src, user ,1) - else - . = ..() - -/obj/item/dogborg/sleeper/compactor/afterattack(atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS - var/mob/living/silicon/robot/hound = get_host() - if(!hound || !istype(target) || !proximity || target.anchored) - return - if(length(contents) > (max_item_count - 1)) - to_chat(user,"Your [src] is full. Eject or process contents to continue.") - return - if(isitem(target)) - var/obj/item/I = target - if(CheckAccepted(I)) - to_chat(user,"[I] registers an error code to your [src]") - return - if(I.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user,"[I] is too large to fit into your [src]") - return - user.visible_message("[hound.name] is ingesting [I] into their [src.name].", "You start ingesting [target] into your [src.name]...") - if(do_after(user, 15, target = target) && length(contents) < max_item_count) - I.forceMove(src) - I.visible_message("[hound.name]'s garbage processor groans lightly as [I] slips inside.", "Your garbage compactor groans lightly as [I] slips inside.") - playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1) - if(length(contents) > 11) //grow that tum after a certain junk amount - hound.sleeper_r = 1 - hound.update_icons() - else - hound.sleeper_r = 0 - hound.update_icons() - return - - if(iscarbon(target) || issilicon(target)) - var/mob/living/trashman = target - if(!trashman.devourable) - to_chat(user, "[target] registers an error code to your [src]") - return - if(patient) - to_chat(user,"Your [src] is already occupied.") - return - if(trashman.buckled) - to_chat(user,"[trashman] is buckled and can not be put into your [src].") - return - user.visible_message("[hound.name] is ingesting [trashman] into their [src].", "You start ingesting [trashman] into your [src.name]...") - if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) - trashman.forceMove(src) - trashman.reset_perspective(src) - update_gut() - user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) - /obj/item/dogborg/sleeper/K9/flavour name = "Recreational Sleeper" - desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes." \ No newline at end of file + desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes." diff --git a/code/game/objects/items/devices/electrochromatic_kit.dm b/code/game/objects/items/devices/electrochromatic_kit.dm new file mode 100644 index 0000000000..d582eab00e --- /dev/null +++ b/code/game/objects/items/devices/electrochromatic_kit.dm @@ -0,0 +1,14 @@ +/obj/item/electronics/electrochromatic_kit + name = "electrochromatic kit" + desc = "A kit for upgrading a window into an electrochromatic one." + /// Electrochromatic ID + var/id + +/obj/item/electronics/electrochromatic_kit/attack_self(mob/user) + . = ..() + if(.) + return + var/new_id = input(user, "Set this kit's electrochromatic ID", "Set ID", id) as text|null + if(isnull(new_id)) + return + id = new_id diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 29a31122bf..fdc3aa30af 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -1,6 +1,7 @@ /obj/item/flashlight name = "flashlight" desc = "A hand-held emergency light." + custom_price = PRICE_REALLY_CHEAP icon = 'icons/obj/lighting.dmi' icon_state = "flashlight" item_state = "flashlight" @@ -210,6 +211,7 @@ light_color = "#CDDDFF" flashlight_power = 0.9 hitsound = 'sound/weapons/genhit1.ogg' + custom_price = PRICE_ALMOST_CHEAP // the desk lamps are a bit special /obj/item/flashlight/lamp @@ -350,6 +352,13 @@ brightness_on = 6 // luminosity when on light_color = "#FFAA44" flashlight_power = 0.8 + custom_price = PRICE_CHEAP + +/obj/item/flashlight/lantern/jade + name = "jade lantern" + desc = "An ornate, green lantern." + color = LIGHT_COLOR_GREEN + light_color = LIGHT_COLOR_GREEN /obj/item/flashlight/slime gender = PLURAL @@ -422,6 +431,7 @@ /obj/item/flashlight/glowstick name = "glowstick" desc = "A military-grade glowstick." + custom_price = PRICE_CHEAP_AS_FREE w_class = WEIGHT_CLASS_SMALL brightness_on = 4 color = LIGHT_COLOR_GREEN diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 9a09be093d..981a811bc3 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(GPS_list) if(!ui) // Variable window height, depending on how many GPS units there are // to show, clamped to relatively safe range. - var/gps_window_height = CLAMP(325 + GLOB.GPS_list.len * 14, 325, 700) + var/gps_window_height = clamp(325 + GLOB.GPS_list.len * 14, 325, 700) ui = new(user, src, ui_key, "gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height ui.open() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index a3cfdb9177..c931d92379 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -18,7 +18,6 @@ var/recharge_locked = FALSE var/obj/item/stock_parts/micro_laser/diode //used for upgrading! - /obj/item/laser_pointer/red pointer_icon_state = "red_laser" /obj/item/laser_pointer/green @@ -28,6 +27,9 @@ /obj/item/laser_pointer/purple pointer_icon_state = "purple_laser" +/obj/item/laser_pointer/blue/handmade + diode = null + /obj/item/laser_pointer/New() ..() diode = new(src) @@ -133,7 +135,8 @@ outmsg = "You miss the lens of [C] with [src]!" //catpeople - for(var/mob/living/carbon/human/H in view(1,targloc)) + var/list/viewers = fov_viewers(1,targloc) + for(var/mob/living/carbon/human/H in viewers) if(!iscatperson(H) || H.incapacitated() || H.eye_blind ) continue if(!H.lying) @@ -148,7 +151,7 @@ H.visible_message("[H] stares at the light"," You stare at the light... ") //cats! - for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc)) + for(var/mob/living/simple_animal/pet/cat/C in viewers) if(prob(50)) C.visible_message("[C] pounces on the light!","LIGHT!") C.Move(targloc) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index bee59b254c..9ab6115634 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -171,7 +171,7 @@ // Negative numbers will subtract /obj/item/lightreplacer/proc/AddUses(amount = 1) - uses = CLAMP(uses + amount, 0, max_uses) + uses = clamp(uses + amount, 0, max_uses) /obj/item/lightreplacer/proc/AddShards(amount = 1, user) bulb_shards += amount diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 63092b5a13..4d0ed362fc 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -68,10 +68,9 @@ update_icon() /obj/item/multitool/update_icon_state() + icon_state = initial(icon_state) if(selected_io) - icon_state = "multitool_red" - else - icon_state = "multitool" + icon_state += "_red" /obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user) if(!io.holder.assembly) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 5b332cda46..7450cb937c 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -99,7 +99,7 @@ if(href_list["reset_radio_short"]) pai.unshort_radio() if(href_list["setlaws"]) - var/newlaws = stripped_multiline_input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", MAX_MESSAGE_LEN) + var/newlaws = stripped_multiline_input(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", "", MAX_MESSAGE_LEN) if(newlaws && pai) pai.add_supplied_law(0,newlaws) if(href_list["toggle_holo"]) diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm new file mode 100644 index 0000000000..fb15ce45dc --- /dev/null +++ b/code/game/objects/items/devices/polycircuit.dm @@ -0,0 +1,52 @@ +/obj/item/stack/circuit_stack + name = "polycircuit aggregate" + desc = "A dense, overdesigned cluster of electronics which attempted to function as a multipurpose circuit electronic. Circuits can be removed from it... if you don't bleed out in the process." + icon_state = "circuit_mess" + item_state = "rods" + w_class = WEIGHT_CLASS_TINY + max_amount = 8 + var/circuit_type = /obj/item/electronics/airlock + var/chosen_circuit = "airlock" + +/obj/item/stack/circuit_stack/attack_self(mob/user)// Prevents the crafting menu, and tells you how to use it. + to_chat(user, "You can't use [src] by itself, you'll have to try and remove one of these circuits by hand... carefully.") + +/obj/item/stack/circuit_stack/attack_hand(mob/user) + var/mob/living/carbon/human/H = user + if(!user.get_inactive_held_item() == src) + return ..() + else + if(zero_amount()) + return + chosen_circuit = input("What type of circuit would you like to remove?", "Choose a Circuit Type", chosen_circuit) in list("airlock","firelock","fire alarm","air alarm","APC") + if(zero_amount()) + return + switch(chosen_circuit) + if("airlock") + circuit_type = /obj/item/electronics/airlock + if("firelock") + circuit_type = /obj/item/electronics/firelock + if("fire alarm") + circuit_type = /obj/item/electronics/firealarm + if("air alarm") + circuit_type = /obj/item/electronics/airalarm + if("APC") + circuit_type = /obj/item/electronics/apc + to_chat(user, "You spot your circuit, and carefully attempt to remove it from [src], hold still!") + if(do_after(user, 30, target = user)) + if(!src || QDELETED(src))//Sanity Check. + return + var/returned_circuit = new circuit_type(src) + user.put_in_hands(returned_circuit) + use(1) + if(!amount) + to_chat(user, "You navigate the sharp edges of circuitry and remove the last board.") + else + to_chat(user, "You navigate the sharp edges of circuitry and remove a single board from [src]") + else + H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + to_chat(user, "You give yourself a wicked cut on [src]'s many sharp corners and edges!") + ..() + +/obj/item/stack/circuit_stack/full + amount = 8 diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 8520571d22..2b5c8d873b 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -8,6 +8,7 @@ level = 1 var/trigger_mob = TRUE var/trigger_item = FALSE + var/specific_item = null var/trigger_silent = FALSE var/sound/trigger_sound = 'sound/effects/pressureplate.ogg' var/obj/item/assembly/signaler/sigdev = null @@ -35,6 +36,8 @@ . = ..() if(!can_trigger || !active) return + if(trigger_item && !istype(AM, specific_item)) + return if(trigger_mob && isliving(AM)) var/mob/living/L = AM to_chat(L, "You feel something click beneath you!") diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 914f2a149a..e94d14a57d 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -81,7 +81,7 @@ if(!usr.canUseTopic(src, BE_CLOSE)) return new_code = round(new_code) - new_code = CLAMP(new_code, 1, 100) + new_code = clamp(new_code, 1, 100) code = new_code if(href_list["set"] == "power") @@ -149,7 +149,7 @@ Code: name = "shock collar" desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.." icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/neck.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/citadel/neck.dmi' icon_state = "shockcollar" item_state = "shockcollar" body_parts_covered = NECK diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index ada598866b..f4c317c8ba 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -2,6 +2,7 @@ name = "station intercom" desc = "Talk through this." icon_state = "intercom" + plane = ABOVE_WALL_PLANE anchored = TRUE w_class = WEIGHT_CLASS_BULKY canhear_range = 2 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 60b93d9461..5fe9de75aa 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -98,7 +98,7 @@ /obj/item/radio/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/radio/interact(mob/user) if(unscrewed && !isAI(user)) @@ -199,7 +199,7 @@ if(!spans) spans = list(M.speech_span) if(!language) - language = M.get_default_language() + language = M.get_selected_language() INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language) return ITALICS | REDUCE_RANGE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0e109cd400..28e1e1294f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -6,11 +6,14 @@ T-RAY HEALTH ANALYZER GAS ANALYZER SLIME SCANNER +NANITE SCANNER +GENETICS SCANNER */ /obj/item/t_scanner name = "\improper T-ray scanner" desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + custom_price = PRICE_REALLY_CHEAP icon = 'icons/obj/device.dmi' icon_state = "t-ray0" var/on = FALSE @@ -275,10 +278,8 @@ SLIME SCANNER //LIVER else if(istype(O, /obj/item/organ/liver)) var/obj/item/organ/liver/L = O - if(H.undergoing_liver_failure() && H.stat != DEAD) //might be depreciated + if(L.organ_flags & ORGAN_FAILING && H.stat != DEAD) //might be depreciated temp_message += "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!" - if(L.swelling > 20) - temp_message += " Subject is suffering from an enlarged liver." //i.e. shrink their liver or give them a transplant. //HEART else if(ishuman(M) && (istype(O, /obj/item/organ/heart))) @@ -310,11 +311,11 @@ SLIME SCANNER //GENERAL HANDLER if(!damage_message) if(O.organ_flags & ORGAN_FAILING) - damage_message += " End Stage [O.name] failure detected." + damage_message += " Chronic [O.name] failure detected." else if(O.damage > O.high_threshold) - damage_message += " Chronic [O.name] failure detected." + damage_message += " Acute [O.name] failure detected." else if(O.damage > O.low_threshold && advanced) - damage_message += " Acute [O.name] failure detected." + damage_message += " Minor [O.name] failure detected." if(temp_message || damage_message) msg += "\t[uppertext(O.name)]: [damage_message] [temp_message]\n" @@ -654,9 +655,10 @@ SLIME SCANNER amount += inaccurate return DisplayTimeText(max(1,amount)) -/proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src) +/proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src, visible = TRUE) var/icon = target - user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") + if(visible) + user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].") var/list/airs = islist(mixture) ? mixture : list(mixture) diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index 79d26776a9..a1f4994a64 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -5,6 +5,7 @@ icon_state = "scanner" w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT + custom_price = PRICE_ABOVE_EXPENSIVE /obj/item/sensor_device/attack_self(mob/user) GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 4bab5a5bcd..b6261b9060 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -232,7 +232,7 @@ effective or pretty fucking useless. charge = max(0,charge - 25)//Quick decrease in light else charge = min(max_charge,charge + 50) //Charge in the dark - animate(user,alpha = CLAMP(255 - charge,0,255),time = 10) + animate(user,alpha = clamp(255 - charge,0,255),time = 10) /obj/item/jammer diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index f572d0a841..4fdb862288 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -170,7 +170,7 @@ /obj/item/dice/proc/diceroll(mob/user) result = roll(sides) if(rigged && result != rigged) - if(prob(CLAMP(1/(sides - 1) * 100, 25, 80))) + if(prob(clamp(1/(sides - 1) * 100, 25, 80))) result = rigged var/fake_result = roll(sides)//Daredevil isn't as good as he used to be var/comment = "" diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index ea24e77832..1172b50377 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -51,8 +51,8 @@ to_chat(user, "You have already forged a seal on [src]!") else var/obj/item/toy/crayon/C = O - name = "[C.item_color] secret documents" - icon_state = "docs_[C.item_color]" - forgedseal = C.item_color - to_chat(user, "You forge the official seal with a [C.item_color] crayon. No one will notice... right?") - update_icon() \ No newline at end of file + name = "[C.crayon_color] secret documents" + icon_state = "docs_[C.crayon_color]" + forgedseal = C.crayon_color + to_chat(user, "You forge the official seal with a [C.crayon_color] crayon. No one will notice... right?") + update_icon() diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index b0882b6e5d..c785c22813 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -196,9 +196,8 @@ sleep(1) previousturf = T operating = FALSE - for(var/mob/M in viewers(1, loc)) - if((M.client && M.machine == src)) - attack_self(M) + if(usr.machine == src) + attack_self(usr) /obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05) @@ -234,15 +233,16 @@ /obj/item/flamethrower/full/tank create_with_tank = TRUE -/obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - var/obj/item/projectile/P = hitby - if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15)) - owner.visible_message("\The [attack_text] hits the fueltank on [owner]'s [name], rupturing it! What a shot!") - var/target_turf = get_turf(owner) - igniter.ignite_turf(src,target_turf, release_amount = 100) - qdel(ptank) - return 1 //It hit the flamethrower, not them - +/obj/item/flamethrower/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(attack_type & ATTACK_TYPE_PROJECTILE) + var/obj/item/projectile/P = object + if(istype(P) && (P.damage_type != STAMINA) && damage && !P.nodamage && prob(15)) + owner.visible_message("\The [attack_text] hits the fueltank on [owner]'s [name], rupturing it! What a shot!") + var/target_turf = get_turf(owner) + igniter.ignite_turf(src,target_turf, release_amount = 100) + qdel(ptank) + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return ..() /obj/item/assembly/igniter/proc/flamethrower_process(turf/open/location) location.hotspot_expose(700,2) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 9749bae313..bafffa18e3 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -57,6 +57,35 @@ on_reading_finished(user) reading = FALSE return TRUE +///TRAITS/// + +/obj/item/book/granter/trait + var/granted_trait + var/traitname = "being cool" + +/obj/item/book/granter/trait/already_known(mob/user) + if(!granted_trait) + return TRUE + if(HAS_TRAIT(user, granted_trait)) + to_chat(user, "You already have all the insight you need about [traitname].") + return TRUE + return FALSE + +/obj/item/book/granter/trait/on_reading_start(mob/user) + to_chat(user, "You start reading about [traitname]...") + +/obj/item/book/granter/trait/on_reading_finished(mob/user) + to_chat(user, "You feel like you've got a good handle on [traitname]!") + ADD_TRAIT(user, granted_trait, BOOK_TRAIT) + +/obj/item/book/granter/trait/rifleman + name = "\proper the Neo-Russian Rifleman\'s Primer" + desc = "A book with stains of vodka and...blood? The back is hard to read, but says something about bolt-actions. Or pump-actions. Both, maybe." + oneuse = FALSE + granted_trait = TRAIT_FAST_PUMP + traitname = "riflery" + icon_state = "book1" + remarks = list("One smooth motion...", "Palm the bolt...", "Push up, rotate back, push forward, down...", "Don't slap yourself with the bolt...", "Wait, what's this about pumping?", "Who just scribbled \"Z\" and \"LMB\" on this page?") ///ACTION BUTTONS/// @@ -220,10 +249,8 @@ /obj/item/book/granter/spell/smoke/recoil(mob/user) ..() to_chat(user,"Your stomach rumbles...") - if(user.nutrition) - user.nutrition = 200 - if(user.nutrition <= 0) - user.nutrition = 0 + if(user.nutrition > NUTRITION_LEVEL_STARVING + 50) + user.set_nutrition(NUTRITION_LEVEL_STARVING + 50) /obj/item/book/granter/spell/blind spell = /obj/effect/proc_holder/spell/targeted/trigger/blind diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index 43b2f94986..b6700599a3 100644 --- a/code/game/objects/items/grenades/antigravity.dm +++ b/code/game/objects/items/grenades/antigravity.dm @@ -2,16 +2,17 @@ name = "antigravity grenade" icon_state = "emp" item_state = "emp" - + var/range = 7 var/forced_value = 0 var/duration = 300 -/obj/item/grenade/antigravity/prime() +/obj/item/grenade/antigravity/prime(mob/living/lanced_by) + . = ..() update_mob() - + for(var/turf/T in view(range,src)) - var/datum/component/C = T.AddComponent(/datum/component/forced_gravity,forced_value) - QDEL_IN(C,duration) - + T.AddElement(/datum/element/forced_gravity, forced_value) + addtimer(CALLBACK(T, /datum/.proc/_RemoveElement, list(forced_value)), duration) + qdel(src) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index acd71c57ac..4ce0e811c3 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -97,8 +97,7 @@ to_chat(user, "You add [A] to the [initial(name)] assembly.") else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = I - if (C.use(1)) + if (I.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC)) det_time = 50 // In case the cable_coil was removed and readded. stage_change(WIRED) to_chat(user, "You rig the [initial(name)] assembly.") @@ -175,10 +174,11 @@ message_admins(message) user.log_message("primed [src] ([reagent_string])",LOG_GAME) -/obj/item/grenade/chem_grenade/prime() +/obj/item/grenade/chem_grenade/prime(mob/living/lanced_by) if(stage != READY) return FALSE + . = ..() var/list/datum/reagents/reactants = list() for(var/obj/item/reagent_containers/glass/G in beakers) reactants += G.reagents @@ -218,7 +218,7 @@ ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades. threatscale = 1.1 // 10% more effective. -/obj/item/grenade/chem_grenade/large/prime() +/obj/item/grenade/chem_grenade/large/prime(mob/living/lanced_by) if(stage != READY) return FALSE @@ -287,7 +287,7 @@ return ..() -/obj/item/grenade/chem_grenade/adv_release/prime() +/obj/item/grenade/chem_grenade/adv_release/prime(mob/living/lanced_by) if(stage != READY) return FALSE diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index c16b4a30a1..9980ff34ce 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -14,7 +14,8 @@ var/max_spawned = 8 var/segment_chance = 35 -/obj/item/grenade/clusterbuster/prime() +/obj/item/grenade/clusterbuster/prime(mob/living/lanced_by) + . = ..() update_mob() var/numspawned = rand(min_spawned,max_spawned) var/again = 0 @@ -59,7 +60,7 @@ step_away(src,loc) addtimer(CALLBACK(src, .proc/prime), rand(15,60)) -/obj/item/grenade/clusterbuster/segment/prime() +/obj/item/grenade/clusterbuster/segment/prime(mob/living/lanced_by) new payload_spawner(drop_location(), payload, rand(min_spawned,max_spawned)) playsound(src, prime_sound, 75, 1, -3) qdel(src) diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 99cf4bdf99..815a3b343c 100644 --- a/code/game/objects/items/grenades/emgrenade.dm +++ b/code/game/objects/items/grenades/emgrenade.dm @@ -4,7 +4,8 @@ icon_state = "emp" item_state = "emp" -/obj/item/grenade/empgrenade/prime() +/obj/item/grenade/empgrenade/prime(mob/living/lanced_by) + . = ..() update_mob() empulse(src, 4, 10) qdel(src) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 6f79df28fe..f51db9fa4c 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -6,7 +6,8 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 //how many tiles away the mob will be stunned. -/obj/item/grenade/flashbang/prime() +/obj/item/grenade/flashbang/prime(mob/living/lanced_by) + . = ..() update_mob() var/flashbang_turf = get_turf(src) if(!flashbang_turf) @@ -42,3 +43,92 @@ var/distance = get_dist(get_turf(M), source) if(M.flash_act(affect_silicon = 1)) M.DefaultCombatKnockdown(max(200/max(1,distance), 60)) + +/obj/item/grenade/stingbang + name = "stingbang" + icon_state = "timeg" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + var/flashbang_range = 1 //how many tiles away the mob will be stunned. + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball + shrapnel_radius = 5 + custom_premium_price = 700 // mostly gotten through cargo, but throw in one for the sec vendor ;) + +/obj/item/grenade/stingbang/mega + name = "mega stingbang" + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/mega + shrapnel_radius = 12 + +/obj/item/grenade/stingbang/prime(mob/living/lanced_by) + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + var/obj/item/bodypart/B = C.get_holding_bodypart_of_item(src) + if(B) + C.visible_message("[src] goes off in [C]'s hand, blowing [C.p_their()] [B.name] to bloody shreds!", "[src] goes off in your hand, blowing your [B.name] to bloody shreds!") + B.dismember() + + . = ..() + update_mob() + var/flashbang_turf = get_turf(src) + if(!flashbang_turf) + return + do_sparks(rand(5, 9), FALSE, src) + playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 50, TRUE, 8, 0.9) + new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_WHITE, (flashbang_range + 2), 2, 1) + for(var/mob/living/M in get_hearers_in_view(flashbang_range, flashbang_turf)) + pop(get_turf(M), M) + qdel(src) + +/obj/item/grenade/stingbang/proc/pop(turf/T , mob/living/M) + if(M.stat == DEAD) //They're dead! + return + M.show_message("POP", MSG_AUDIBLE) + var/distance = max(0,get_dist(get_turf(src),T)) + +//Flash + if(M.flash_act(affect_silicon = 1)) + M.Paralyze(max(10/max(1,distance), 5)) + M.Knockdown(max(100/max(1,distance), 60)) + +//Bang + if(!distance || loc == M || loc == M.loc) + M.Paralyze(20) + M.Knockdown(200) + M.soundbang_act(1, 200, 10, 15) + if(M.apply_damages(10, 10)) + to_chat(M, "The blast from \the [src] bruises and burns you!") + + // only checking if they're on top of the tile, cause being one tile over will be its own punishment + +// Grenade that releases more shrapnel the more times you use it in hand between priming and detonation (sorta like the 9bang from MW3), for admin goofs +/obj/item/grenade/primer + name = "rotfrag grenade" + desc = "A grenade that generates more shrapnel the more you rotate it in your hand after pulling the pin. This one releases shrapnel shards." + icon_state = "timeg" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + var/rots_per_mag = 3 /// how many times we need to "rotate" the charge in hand per extra tile of magnitude + shrapnel_type = /obj/item/projectile/bullet/shrapnel + var/rots = 1 /// how many times we've "rotated" the charge + +/obj/item/grenade/primer/attack_self(mob/user) + . = ..() + if(active) + user.playsound_local(user, 'sound/misc/box_deploy.ogg', 50, TRUE) + rots++ + user.changeNext_move(CLICK_CD_RAPID) + +/obj/item/grenade/primer/prime(mob/living/lanced_by) + shrapnel_radius = round(rots / rots_per_mag) + . = ..() + qdel(src) + +/obj/item/grenade/primer/stingbang + name = "rotsting" + desc = "A grenade that generates more shrapnel the more you rotate it in your hand after pulling the pin. This one releases stingballs." + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + rots_per_mag = 2 + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 1725d84dcc..3553d79faf 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -45,12 +45,13 @@ /obj/item/grenade/iedcasing/attack_self(mob/user) // if(!active) - if(clown_check(user)) + if(!botch_check(user)) to_chat(user, "You light the [name]!") cut_overlay("improvised_grenade_filled") preprime(user, null, FALSE) -/obj/item/grenade/iedcasing/prime() //Blowing that can up +/obj/item/grenade/iedcasing/prime(mob/living/lanced_by) //Blowing that can up + . = ..() update_mob() explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. qdel(src) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 77b4b33a8c..7a6157bf65 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -17,10 +17,31 @@ var/det_time = 50 var/display_timer = 1 var/clumsy_check = GRENADE_CLUMSY_FUMBLE + var/sticky = FALSE + // I moved the explosion vars and behavior to base grenades because we want all grenades to call [/obj/item/grenade/proc/prime] so we can send COMSIG_GRENADE_PRIME + ///how big of a devastation explosion radius on prime + var/ex_dev = 0 + ///how big of a heavy explosion radius on prime + var/ex_heavy = 0 + ///how big of a light explosion radius on prime + var/ex_light = 0 + ///how big of a flame explosion radius on prime + var/ex_flame = 0 + + // dealing with creating a [/datum/component/pellet_cloud] on prime + /// if set, will spew out projectiles of this type + var/shrapnel_type + /// the higher this number, the more projectiles are created as shrapnel + var/shrapnel_radius + var/shrapnel_initialized /obj/item/grenade/suicide_act(mob/living/carbon/user) user.visible_message("[user] primes [src], then eats it! It looks like [user.p_theyre()] trying to commit suicide!") + if(shrapnel_type && shrapnel_radius) + shrapnel_initialized = TRUE + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius) playsound(src, 'sound/items/eatfood.ogg', 50, 1) + SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time) preprime(user, det_time) user.transferItemToLoc(src, user, TRUE)//>eat a grenade set to 5 seconds >rush captain sleep(det_time)//so you dont die instantly @@ -32,19 +53,21 @@ if(!QDELETED(src)) qdel(src) -/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user) +/obj/item/grenade/proc/botch_check(mob/living/carbon/human/user) var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY) if(clumsy) if(clumsy_check == GRENADE_CLUMSY_FUMBLE && prob(50)) to_chat(user, "Huh? How does this thing work?") preprime(user, 5, FALSE) - return FALSE + return TRUE else if(clumsy_check == GRENADE_NONCLUMSY_FUMBLE && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))) to_chat(user, "You pull the pin on [src]. Attached to it is a pink ribbon that says, \"HONK\"") preprime(user, 5, FALSE) - return FALSE - return TRUE + return TRUE + else if(sticky && prob(50)) // to add risk to sticky tape grenade cheese, no return cause we still prime as normal after + to_chat(user, "What the... [src] is stuck to your hand!") + ADD_TRAIT(src, TRAIT_NODROP, STICKY_NODROP) /obj/item/grenade/examine(mob/user) . = ..() @@ -56,8 +79,16 @@ /obj/item/grenade/attack_self(mob/user) + if(HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, "You try prying [src] off your hand...") + if(do_after(user, 70, target=src)) + to_chat(user, "You manage to remove [src] from your hand.") + REMOVE_TRAIT(src, TRAIT_NODROP, STICKY_NODROP) + + return + if(!active) - if(clown_check(user)) + if(!botch_check(user)) // if they botch the prime, it'll be handled in botch_check preprime(user) /obj/item/grenade/proc/log_grenade(mob/user, turf/T) @@ -81,10 +112,18 @@ icon_state = initial(icon_state) + "_active" addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride) -/obj/item/grenade/proc/prime() +/obj/item/grenade/proc/prime(mob/living/lanced_by) var/turf/T = get_turf(src) log_game("Grenade detonation at [AREACOORD(T)], location [loc]") + if(shrapnel_type && shrapnel_radius && !shrapnel_initialized) // add a second check for adding the component in case whatever triggered the grenade went straight to prime (badminnery for example) + shrapnel_initialized = TRUE + AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius) + + SEND_SIGNAL(src, COMSIG_GRENADE_PRIME, lanced_by) + if(ex_dev || ex_heavy || ex_light || ex_flame) + explosion(loc, ex_dev, ex_heavy, ex_light, flame_range = ex_flame) + /obj/item/grenade/proc/update_mob() if(ismob(loc)) var/mob/M = loc @@ -115,12 +154,14 @@ /obj/item/grenade/attack_paw(mob/user) return attack_hand(user) -/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - var/obj/item/projectile/P = hitby - if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15)) - owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") - prime() - return TRUE //It hit the grenade, not them +/obj/item/grenade/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(attack_type & ATTACK_TYPE_PROJECTILE) + var/obj/item/projectile/P = object + if(damage && !P.nodamage && (P.damage_type != STAMINA) && prob(15)) + owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") + prime() + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return ..() /obj/item/proc/grenade_prime_react(obj/item/grenade/nade) return diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index eaecae5a92..a2b0e3edd4 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -26,7 +26,7 @@ /obj/item/grenade/plastic/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/grenade/plastic/Destroy() qdel(nadeassembly) @@ -94,7 +94,7 @@ return var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num if(user.get_active_held_item() == src) - newtime = CLAMP(newtime, 10, 60000) + newtime = clamp(newtime, 10, 60000) det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") @@ -122,7 +122,9 @@ var/obj/item/I = AM I.throw_speed = max(1, (I.throw_speed - 3)) I.throw_range = max(1, (I.throw_range - 3)) - I.embedding = I.embedding.setRating(embed_chance = 0) + if(I.embedding) + I.embedding["embed_chance"] = 0 + I.updateEmbedding() target.add_overlay(plastic_overlay, TRUE) if(!nadeassembly) @@ -205,9 +207,10 @@ else return ..() -/obj/item/grenade/plastic/c4/prime() +/obj/item/grenade/plastic/c4/prime(mob/living/lanced_by) if(QDELETED(src)) return + . = ..() var/turf/location if(target) if(!QDELETED(target)) diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm index f26390faf6..1b856fc013 100644 --- a/code/game/objects/items/grenades/smokebomb.dm +++ b/code/game/objects/items/grenades/smokebomb.dm @@ -17,7 +17,8 @@ qdel(smoke) return ..() -/obj/item/grenade/smokebomb/prime() +/obj/item/grenade/smokebomb/prime(mob/living/lanced_by) + . = ..() update_mob() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.set_up(4, src) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 2cc72f3694..a8b0fa3cd3 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -7,7 +7,8 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver -/obj/item/grenade/spawnergrenade/prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. +/obj/item/grenade/spawnergrenade/prime(mob/living/lanced_by) // Prime now just handles the two loops that query for people in lockers and people who can see it. + . = ..() update_mob() if(spawner_type && deliveryamt) // Make a quick flash diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index 35e9abd982..9f12edeb17 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -4,27 +4,45 @@ icon = 'icons/obj/grenade.dmi' icon_state = "syndicate" item_state = "flashbang" + ex_dev = 1 + ex_heavy = 2 + ex_light = 4 + ex_flame = 2 -/obj/item/grenade/syndieminibomb/prime() +/obj/item/grenade/syndieminibomb/prime(mob/living/lanced_by) + . = ..() update_mob() - explosion(src.loc,1,2,4,flame_range = 2) qdel(src) /obj/item/grenade/syndieminibomb/concussion name = "HE Grenade" desc = "A compact shrapnel grenade meant to devastate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction." icon_state = "concussion" + ex_heavy = 2 + ex_light = 3 + ex_flame = 3 -/obj/item/grenade/syndieminibomb/concussion/prime() - update_mob() - explosion(src.loc,0,2,3,flame_range = 3) - qdel(src) - -/obj/item/grenade/syndieminibomb/concussion/frag +/obj/item/grenade/frag name = "frag grenade" - desc = "Fire in the hole." + desc = "An anti-personnel fragmentation grenade, this weapon excels at killing soft targets by shredding them with metal shrapnel." icon_state = "frag" + shrapnel_type = /obj/item/projectile/bullet/shrapnel + shrapnel_radius = 4 + ex_heavy = 1 + ex_light = 3 + ex_flame = 4 + +/obj/item/grenade/frag/mega + name = "FRAG grenade" + desc = "An anti-everything fragmentation grenade, this weapon excels at killing anything any everything by shredding them with metal shrapnel." + shrapnel_type = /obj/item/projectile/bullet/shrapnel/mega + shrapnel_radius = 12 + +/obj/item/grenade/frag/prime(mob/living/lanced_by) + . = ..() + update_mob() + qdel(src) /obj/item/grenade/gluon desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors." @@ -36,7 +54,8 @@ var/rad_damage = 350 var/stamina_damage = 30 -/obj/item/grenade/gluon/prime() +/obj/item/grenade/gluon/prime(mob/living/lanced_by) + . = ..() update_mob() playsound(loc, 'sound/effects/empulse.ogg', 50, 1) radiation_pulse(src, rad_damage) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index a12847ccf7..c7c9fa37a9 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -113,12 +113,12 @@ desc = "Looks like some cables tied together. Could be used to tie something up." icon_state = "cuff" item_state = "coil" - color = "red" + color = "#ff0000" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' custom_materials = list(/datum/material/iron=150, /datum/material/glass=75) breakouttime = 300 //Deciseconds = 30s - cuffsound = 'sound/weapons/cablecuff.ogg' + cuffsound = 'sound/weapons/cablecuff.ogg' /obj/item/restraints/handcuffs/cable/attack_self(mob/user) to_chat(user, "You start unwinding the cable restraints back into coil") @@ -130,37 +130,30 @@ user.put_in_hands(coil) coil.color = color to_chat(user, "You unwind the cable restraints back into coil") - + /obj/item/restraints/handcuffs/cable/red - item_color = "red" color = "#ff0000" /obj/item/restraints/handcuffs/cable/yellow - item_color = "yellow" color = "#ffff00" /obj/item/restraints/handcuffs/cable/blue - item_color = "blue" color = "#1919c8" /obj/item/restraints/handcuffs/cable/green - item_color = "green" color = "#00aa00" /obj/item/restraints/handcuffs/cable/pink - item_color = "pink" color = "#ff3ccd" /obj/item/restraints/handcuffs/cable/orange - item_color = "orange" color = "#ff8000" /obj/item/restraints/handcuffs/cable/cyan - item_color = "cyan" color = "#00ffff" /obj/item/restraints/handcuffs/cable/white - item_color = "white" + color = null /obj/item/restraints/handcuffs/cable/random @@ -170,7 +163,6 @@ color = pick(cable_colors) /obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) - ..() if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if (R.use(1)) @@ -204,12 +196,15 @@ name = "zipties" desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." item_state = "zipties" + color = "white" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' custom_materials = null breakouttime = 450 //Deciseconds = 45s trashtype = /obj/item/restraints/handcuffs/cable/zipties/used - item_color = "white" + +/obj/item/restraints/handcuffs/cable/zipties/attack_self() //Zipties arent cable + return /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." @@ -230,7 +225,6 @@ /obj/item/restraints/handcuffs/fake/kinky name = "kinky handcuffs" desc = "Fake handcuffs meant for erotic roleplay." - icon = 'modular_citadel/icons/obj/items_and_weapons.dmi' icon_state = "handcuffgag" item_state = "kinkycuff" @@ -257,7 +251,7 @@ throw_range = 1 icon_state = "beartrap" desc = "A trap used to catch bears and other legged creatures." - var/armed = 0 + var/armed = FALSE var/trap_damage = 20 /obj/item/restraints/legcuffs/beartrap/Initialize() @@ -280,14 +274,14 @@ if(armed && isturf(src.loc)) if(isliving(AM)) var/mob/living/L = AM - var/snap = 0 + var/snap = FALSE var/def_zone = BODY_ZONE_CHEST if(iscarbon(L)) var/mob/living/carbon/C = L - snap = 1 if(!C.lying) def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) if(!C.legcuffed && C.get_num_legs(FALSE) >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs. + snap = TRUE C.legcuffed = src forceMove(C) C.update_equipment_speed_mods() @@ -296,21 +290,21 @@ else if(isanimal(L)) var/mob/living/simple_animal/SA = L if(SA.mob_size > MOB_SIZE_TINY) - snap = 1 - if(L.movement_type & FLYING) - snap = 0 + snap = TRUE + if(L.movement_type & (FLYING | FLOATING)) + snap = FALSE if(snap) - armed = 0 + armed = FALSE icon_state = "[initial(icon_state)][armed]" playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) L.visible_message("[L] triggers \the [src].", \ "You trigger \the [src]!") - L.apply_damage(trap_damage,BRUTE, def_zone) + L.apply_damage(trap_damage, BRUTE, def_zone) ..() /obj/item/restraints/legcuffs/beartrap/energy name = "energy snare" - armed = 1 + armed = TRUE icon_state = "e_snare" trap_damage = 0 item_flags = DROPDEL diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index c961134244..6e270b6374 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -197,9 +197,9 @@ /obj/item/his_grace/proc/adjust_bloodthirst(amt) prev_bloodthirst = bloodthirst if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER && !ascended) - bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) + bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) else if(!ascended) - bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) + bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) update_stats() /obj/item/his_grace/proc/update_stats() diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index b8f15ec295..381257721e 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -122,7 +122,7 @@ /obj/item/clothing/head/helmet/chaplain/cage name = "cage" desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is." - alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' + mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' icon_state = "cage" item_state = "cage" worn_x_dimension = 64 @@ -187,6 +187,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/storage/book/bible, HOLY_WEAPONS, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) hoodtype = /obj/item/clothing/head/hooded/chaplain_hood + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/hooded/chaplain_hood name = "follower hood" @@ -238,19 +239,29 @@ if(user.mind && (user.mind.isholy) && !reskinned) reskin_holy_weapon(user) +/** + * reskin_holy_weapon: Shows a user a list of all available nullrod reskins and based on his choice replaces the nullrod with the reskinned version + * + * Arguments: + * * M The mob choosing a nullrod reskin + */ /obj/item/nullrod/proc/reskin_holy_weapon(mob/living/L) if(GLOB.holy_weapon_type) return var/obj/item/holy_weapon var/list/holy_weapons_list = subtypesof(/obj/item/nullrod) + list(HOLY_WEAPONS) var/list/display_names = list() + var/list/nullrod_icons = list() for(var/V in holy_weapons_list) var/obj/item/nullrod/rodtype = V if (initial(rodtype.chaplain_spawnable)) display_names[initial(rodtype.name)] = rodtype + nullrod_icons += list(initial(rodtype.name) = image(icon = initial(rodtype.icon), icon_state = initial(rodtype.icon_state))) - var/choice = input(L, "What theme would you like for your holy weapon?","Holy Weapon Theme") as null|anything in display_names - if(QDELETED(src) || !choice || !in_range(L, src) || !CHECK_MOBILITY(L, MOBILITY_USE) || reskinned) + nullrod_icons = sortList(nullrod_icons) + + var/choice = show_radial_menu(L, src , nullrod_icons, custom_check = CALLBACK(src, .proc/check_menu, L), radius = 42, require_near = TRUE) + if(!choice || !check_menu(L)) return var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new @@ -265,6 +276,21 @@ qdel(src) L.put_in_active_hand(holy_weapon) +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/item/nullrod/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(QDELETED(src) || reskinned) + return FALSE + if(user.incapacitated() || !user.is_holding(src)) + return FALSE + return TRUE + /obj/item/nullrod/proc/jedi_spin(mob/living/user) for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) user.setDir(i) @@ -303,8 +329,8 @@ block_chance = 50 var/shield_icon = "shield-red" -/obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, style_flags = NONE) - . = list() +/obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) + . = ..() if(isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) @@ -328,9 +354,9 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") -/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 //Don't bring a sword to a gunfight +/obj/item/nullrod/claymore/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(attack_type & ATTACK_TYPE_PROJECTILE) // Don't bring a sword to a gunfight + return NONE return ..() /obj/item/nullrod/claymore/darkblade @@ -493,7 +519,9 @@ S.name = name S.ckey = C.ckey S.status_flags |= GODMODE - S.language_holder = user.language_holder.copy(S) + S.copy_languages(user, LANGUAGE_MASTER) //Make sure the sword can understand and communicate with the user. + S.update_atom_languages() + grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue S.AddElement(/datum/element/ghost_role_eligibility,penalize_on_ghost = TRUE) START_PROCESSING(SSprocessing,src) var/input = stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN) diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 5f74830c99..347ec118fd 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -74,7 +74,7 @@ L.SetAllImmobility(0) L.SetSleeping(0) L.SetUnconscious(0) - L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, CLAMP(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck! + L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, clamp(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck! colorize(L) /obj/item/hot_potato/examine(mob/user) diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index c1983b6b8c..cc2ae3631e 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -5,7 +5,7 @@ actions_types = list(/datum/action/item_action/hands_free/activate) var/activated = TRUE //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants var/mob/living/imp_in = null - item_color = "b" + var/implant_color = "b" var/allow_multiple = FALSE var/uses = -1 item_flags = DROPDEL diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 0c50beadea..e0765e7951 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -5,36 +5,30 @@ icon_state = "implant" activated = 1 var/obj/machinery/abductor/pad/home - var/cooldown = 30 + var/next_use = 0 /obj/item/implant/abductor/activate() . = ..() - if(cooldown == initial(cooldown)) + if(next_use <= world.time) home.Retrieve(imp_in,1) - cooldown = 0 - START_PROCESSING(SSobj, src) + next_use = world.time + 60 SECONDS else - to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!") - -/obj/item/implant/abductor/process() - if(cooldown < initial(cooldown)) - cooldown++ - if(cooldown == initial(cooldown)) - STOP_PROCESSING(SSobj, src) + to_chat(imp_in, "You must wait [DisplayTimeText(next_use - world.time)] to use [src] again!") /obj/item/implant/abductor/implant(mob/living/target, mob/user) - if(..()) - var/obj/machinery/abductor/console/console - if(ishuman(target)) - var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) - if(A) - console = get_abductor_console(A.team.team_number) - home = console.pad - - if(!home) - var/list/consoles = list() - for(var/obj/machinery/abductor/console/C in GLOB.machines) - consoles += C - console = pick(consoles) + . = ..() + if(!.) + return + var/obj/machinery/abductor/console/console + if(ishuman(target)) + var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) + if(A) + console = get_abductor_console(A.team.team_number) home = console.pad - return TRUE + + if(!home) + var/list/consoles = list() + for(var/obj/machinery/abductor/console/C in GLOB.machines) + consoles += C + console = pick(consoles) + home = console.pad diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index f3e66d2c08..280fbb7cd3 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -2,7 +2,7 @@ name = "freedom implant" desc = "Use this to escape from those evil Red Shirts." icon_state = "freedom" - item_color = "r" + implant_color = "r" uses = 4 diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm index 1dfc0b4580..4dc0263fa7 100644 --- a/code/game/objects/items/implants/implant_storage.dm +++ b/code/game/objects/items/implants/implant_storage.dm @@ -2,7 +2,7 @@ name = "storage implant" desc = "Stores up to two big items in a bluespace pocket." icon_state = "storage" - item_color = "r" + implant_color = "r" var/max_slot_stacking = 4 var/obj/item/storage/bluespace_pocket/pocket diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index 481f1a4181..8573324b56 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -15,7 +15,7 @@ /obj/item/implantcase/update_icon_state() if(imp) - icon_state = "implantcase-[imp.item_color]" + icon_state = "implantcase-[imp.implant_color]" else icon_state = "implantcase-0" diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 7c863017a1..4766e534c9 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -66,7 +66,7 @@ if(ismob(loc)) attack_self(loc) else - for(var/mob/M in viewers(1, src)) + for(var/mob/M in fov_viewers(1, src)) if(M.client) attack_self(M) add_fingerprint(usr) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 5f3524d1c3..dda41494ff 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -3,6 +3,7 @@ * Fork * Kitchen knives * Ritual Knife + * Bloodletter * Butcher's cleaver * Combat Knife * Rolling Pins @@ -70,6 +71,7 @@ sharpness = IS_SHARP_ACCURATE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) var/bayonet = FALSE //Can this be attached to a gun? + custom_price = PRICE_NORMAL /obj/item/kitchen/knife/Initialize() . = ..() @@ -97,6 +99,28 @@ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL +/obj/item/kitchen/knife/bloodletter + name = "bloodletter" + desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood." + icon = 'icons/obj/ice_moon/artifacts.dmi' + icon_state = "bloodletter" + w_class = WEIGHT_CLASS_NORMAL + /// Bleed stacks applied when an organic mob target is hit + var/bleed_stacks_per_hit = 3 + +/obj/item/kitchen/knife/bloodletter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!isliving(target) || !proximity_flag) + return + var/mob/living/M = target + if(!(M.mob_biotypes & MOB_ORGANIC)) + return + var/datum/status_effect/stacking/saw_bleed/bloodletting/B = M.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting) + if(!B) + M.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, bleed_stacks_per_hit) + else + B.add_stacks(bleed_stacks_per_hit) + /obj/item/kitchen/knife/butcher name = "butcher's cleaver" icon_state = "butch" @@ -107,12 +131,14 @@ custom_materials = list(/datum/material/iron=18000) attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") w_class = WEIGHT_CLASS_NORMAL + custom_price = PRICE_EXPENSIVE /obj/item/kitchen/knife/combat name = "combat knife" icon_state = "buckknife" item_state = "knife" desc = "A military combat utility survival knife." + embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) force = 20 throwforce = 20 attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") @@ -123,6 +149,7 @@ icon_state = "survivalknife" item_state = "knife" desc = "A hunting grade survival knife." + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) force = 15 throwforce = 15 bayonet = TRUE @@ -134,6 +161,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A sharpened bone. The bare minimum in survival." + embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) force = 15 throwforce = 15 custom_materials = null @@ -142,6 +170,7 @@ name = "plastic knife" desc = "A plastic knife. Rather harmless to anything." force = 1 + throwforce = 1 bayonet = FALSE /obj/item/kitchen/knife/combat/cyborg @@ -172,7 +201,9 @@ throw_speed = 3 throw_range = 7 w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.5) attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + custom_price = PRICE_ALMOST_CHEAP /obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 210c3d0da0..6c01e68a48 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -172,7 +172,7 @@ It can cook multiple items at once.

    Processor:

    - Use it to process certain ingredients (meat into faggot, doughslice into spaghetti, potato into fries,etc...) + Use it to process certain ingredients (meat into meatball, doughslice into spaghetti, potato into fries,etc...)

    Gibber:

    Stuff an animal in it to grind it into meat. diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index aba07c9120..aec3c333b7 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -5,12 +5,15 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF var/brightness_on = 3 + var/sword_color total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces. /obj/item/melee/transforming/energy/Initialize() . = ..() total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75)) if(active) + if(sword_color) + icon_state = "sword[sword_color]" set_light(brightness_on) START_PROCESSING(SSobj, src) @@ -37,8 +40,8 @@ . = ..() if(.) if(active) - if(item_color) - icon_state = "sword[item_color]" + if(sword_color) + icon_state = "sword[sword_color]" START_PROCESSING(SSobj, src) set_light(brightness_on) else @@ -100,26 +103,54 @@ throw_speed = 3 throw_range = 5 sharpness = IS_SHARP - embedding = list("embed_chance" = 75, "embedded_impact_pain_multiplier" = 10) + embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) armour_penetration = 35 - block_chance = 50 + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + block_parry_data = /datum/block_parry_data/energy_sword + var/list/possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) + +/datum/block_parry_data/energy_sword + parry_time_windup = 0 + parry_time_active = 25 + parry_time_spindown = 0 + // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing. + parry_time_windup_visual_override = 1 + parry_time_active_visual_override = 3 + parry_time_spindown_visual_override = 12 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // esword users can attack while + parry_time_perfect = 2.5 // first ds isn't perfect + parry_time_perfect_leeway = 1.5 + parry_imperfect_falloff_percent = 5 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 65 // VERY generous + parry_efficiency_perfect = 100 + parry_failed_stagger_duration = 4 SECONDS + parry_cooldown = 0.5 SECONDS + +/obj/item/melee/transforming/energy/sword/Initialize(mapload) + . = ..() + set_sword_color() + +/obj/item/melee/transforming/energy/sword/proc/set_sword_color() + if(LAZYLEN(possible_colors)) + light_color = possible_colors[pick(possible_colors)] /obj/item/melee/transforming/energy/sword/transform_weapon(mob/living/user, supress_message_text) . = ..() if(active) - if(. && item_color) - icon_state = "sword[item_color]" AddElement(/datum/element/sword_point) else RemoveElement(/datum/element/sword_point) -/obj/item/melee/transforming/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(active) - return ..() - return 0 +/obj/item/melee/transforming/energy/sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!active) + return NONE + return ..() /obj/item/melee/transforming/energy/sword/cyborg - item_color = "red" + sword_color = "red" + light_color = "#ff0000" + possible_colors = null var/hitcost = 50 /obj/item/melee/transforming/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R) @@ -140,7 +171,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "esaw_0" icon_state_on = "esaw_1" - item_color = null //stops icon from breaking when turned on. + sword_color = null //stops icon from breaking when turned on. hitcost = 75 //Costs more than a standard cyborg esword w_class = WEIGHT_CLASS_NORMAL sharpness = IS_SHARP @@ -148,19 +179,17 @@ tool_behaviour = TOOL_SAW toolspeed = 0.7 -/obj/item/melee/transforming/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return 0 +/obj/item/melee/transforming/energy/sword/cyborg/saw/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + return NONE /obj/item/melee/transforming/energy/sword/saber - var/list/possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) + possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) var/hacked = FALSE -/obj/item/melee/transforming/energy/sword/saber/Initialize(mapload) - . = ..() +/obj/item/melee/transforming/energy/sword/saber/set_sword_color() if(LAZYLEN(possible_colors)) - var/set_color = pick(possible_colors) - item_color = set_color - light_color = possible_colors[set_color] + sword_color = pick(possible_colors) + light_color = possible_colors[sword_color] /obj/item/melee/transforming/energy/sword/saber/process() . = ..() @@ -185,7 +214,7 @@ if(istype(W, /obj/item/multitool)) if(!hacked) hacked = TRUE - item_color = "rainbow" + sword_color = "rainbow" to_chat(user, "RNBW_ENGAGE") if(active) @@ -204,6 +233,7 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' icon_state_on = "cutlass1" light_color = "#ff0000" + possible_colors = null /obj/item/melee/transforming/energy/blade name = "energy blade" @@ -262,6 +292,10 @@ light_color = "#37FFF7" actions_types = list() +/obj/item/melee/transforming/energy/sword/cx/Initialize() + icon_state_on = icon_state + return ..() + /obj/item/melee/transforming/energy/sword/cx/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -271,38 +305,15 @@ return TRUE /obj/item/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text) - active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE - if(active) //also I'd need to rip out the iconstate changing bits - force = force_on - throwforce = throwforce_on - hitsound = hitsound_on - throw_speed = 4 - if(attack_verb_on.len) - attack_verb = attack_verb_on - w_class = w_class_on - START_PROCESSING(SSobj, src) - set_light(brightness_on) - update_icon() - else - force = initial(force) - throwforce = initial(throwforce) - hitsound = initial(hitsound) - throw_speed = initial(throw_speed) - if(attack_verb_off.len) - attack_verb = attack_verb_off - w_class = initial(w_class) - STOP_PROCESSING(SSobj, src) - set_light(0) - update_icon() - transform_messages(user, supress_message_text) - add_fingerprint(user) - return TRUE + . = ..() + update_icon() /obj/item/melee/transforming/energy/sword/cx/transform_messages(mob/living/user, supress_message_text) playsound(user, active ? 'sound/weapons/nebon.ogg' : 'sound/weapons/neboff.ogg', 65, 1) if(!supress_message_text) to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") + /obj/item/melee/transforming/energy/sword/cx/update_overlays() . = ..() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade") @@ -337,7 +348,7 @@ . = ..() . += "Alt-click to recolor it." -/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(active) if(isinhands) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index cbbd50b573..741607edc3 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -2,13 +2,12 @@ item_flags = NEEDS_PERMIT /obj/item/melee/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user) - if(target.check_block()) + if(target.check_martial_melee_block()) target.visible_message("[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!", "You block the attack!") user.Stun(40) return TRUE - /obj/item/melee/chainofcommand name = "chain of command" desc = "A tool used by great men to placate the frothing masses." @@ -62,22 +61,34 @@ force = 18 throwforce = 15 w_class = WEIGHT_CLASS_BULKY - block_chance = 50 armour_penetration = 75 sharpness = IS_SHARP attack_verb = list("slashed", "cut") hitsound = 'sound/weapons/rapierhit.ogg' custom_materials = list(/datum/material/iron = 1000) total_mass = 3.4 + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + block_parry_data = /datum/block_parry_data/captain_saber + +/datum/block_parry_data/captain_saber + parry_time_windup = 0.5 + parry_time_active = 4 + parry_time_spindown = 1 + parry_time_perfect = 0.75 + parry_time_perfect_leeway = 0.75 + parry_imperfect_falloff_percent = 30 + parry_efficiency_perfect = 100 + parry_failed_stagger_duration = 3 SECONDS + parry_failed_clickcd_duration = 2 SECONDS /obj/item/melee/sabre/Initialize() . = ..() AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results. AddElement(/datum/element/sword_point) -/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 //Don't bring a sword to a gunfight +/obj/item/melee/sabre/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(attack_type & ATTACK_TYPE_PROJECTILE) // Don't bring a sword to a gunfight. + return BLOCK_NONE return ..() /obj/item/melee/sabre/on_exit_storage(datum/component/storage/S) @@ -151,7 +162,6 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' force = 15 throwforce = 25 - block_chance = 50 armour_penetration = 200 //Apparently this gives it the ability to pierce block flags_1 = CONDUCT_1 obj_flags = UNIQUE_RENAME @@ -160,16 +170,47 @@ attack_verb = list("stabs", "punctures", "pierces", "pokes") hitsound = 'sound/weapons/rapierhit.ogg' total_mass = 0.4 + item_flags = ITEM_CAN_PARRY | NEEDS_PERMIT + block_parry_data = /datum/block_parry_data/traitor_rapier + +// Fast, efficient parry. +/datum/block_parry_data/traitor_rapier + parry_time_windup = 0.5 + parry_time_active = 5 + parry_time_spindown = 0 + parry_time_active_visual_override = 3 + parry_time_spindown_visual_override = 2 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING + parry_time_perfect = 0 + parry_time_perfect_leeway = 3 + parry_time_perfect_leeway_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 1 + ) + parry_imperfect_falloff_percent_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 50 // useless after 3rd decisecond + ) + parry_imperfect_falloff_percent = 30 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 1 + parry_efficiency_perfect = 100 + parry_data = list( + PARRY_DISARM_ATTACKER = TRUE, + PARRY_KNOCKDOWN_ATTACKER = 10 + ) + parry_failed_stagger_duration = 2 SECONDS + parry_failed_clickcd_duration = CLICK_CD_RANGE + parry_cooldown = 0 + +/obj/item/melee/rapier/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) + . = ..() + if((attack_type & ATTACK_TYPE_PROJECTILE) && (parry_efficiency >= 100)) + . |= BLOCK_SHOULD_REDIRECT + return_list[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT /obj/item/melee/rapier/Initialize() . = ..() AddComponent(/datum/component/butchering, 20, 65, 0) -/obj/item/melee/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 - return ..() - /obj/item/melee/rapier/on_exit_storage(datum/component/storage/S) var/obj/item/storage/belt/sabre/rapier/B = S.parent if(istype(B)) @@ -192,10 +233,9 @@ . = ..() if(iscarbon(target)) var/mob/living/carbon/H = target - var/loss = H.getStaminaLoss() H.Dizzy(10) H.adjustStaminaLoss(30) - if((loss > 40) && prob(loss)) // if above 40, roll for sleep using 1% every 1 stamina damage + if(CHECK_STAMCRIT(H) != NOT_STAMCRIT) H.Sleeping(180) /obj/item/melee/classic_baton @@ -305,7 +345,7 @@ return else if(cooldown_check < world.time) - if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) + if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, null) & BLOCK_SUCCESS) playsound(target, 'sound/weapons/genhit.ogg', 50, 1) return if(ishuman(target)) @@ -326,7 +366,7 @@ else target.LAssailant = WEAKREF(user) cooldown_check = world.time + cooldown - user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina + user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT)) else var/wait_desc = get_wait_description() if(wait_desc) @@ -649,7 +689,7 @@ item_state = "mace_greyscale" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color. + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Material type changes the prefix as well as the color. custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace. slot_flags = ITEM_SLOT_BELT force = 14 @@ -665,4 +705,4 @@ . = ..() overlay = mutable_appearance(icon, overlay_state) overlay.appearance_flags = RESET_COLOR - add_overlay(overlay) \ No newline at end of file + add_overlay(overlay) diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 5bccf91868..386a6e9acc 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -53,6 +53,8 @@ throw_speed = 4 if(attack_verb_on.len) attack_verb = attack_verb_on + if(embedding) + updateEmbedding() icon_state = icon_state_on w_class = w_class_on else @@ -62,6 +64,8 @@ throw_speed = initial(throw_speed) if(attack_verb_off.len) attack_verb = attack_verb_off + if(embedding) + updateEmbedding() icon_state = initial(icon_state) w_class = initial(w_class) total_mass = initial(total_mass) diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index c6bb350929..7237a1788f 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -115,6 +115,44 @@ new /obj/item/toy/crayon/spraycan(src) new /obj/item/clothing/shoes/sandal(src) +/obj/item/choice_beacon/hosgun + name = "personal weapon beacon" + desc = "Use this to summon your personal Head of Security issued firearm!" + +/obj/item/choice_beacon/hosgun/generate_display_names() + var/static/list/hos_gun_list + if(!hos_gun_list) + hos_gun_list = list() + var/list/templist = subtypesof(/obj/item/storage/secure/briefcase/hos/) //we have to convert type = name to name = type, how lovely! + for(var/V in templist) + var/atom/A = V + hos_gun_list[initial(A.name)] = A + return hos_gun_list + +/obj/item/choice_beacon/augments + name = "augment beacon" + desc = "Summons augmentations." + +/obj/item/choice_beacon/augments/generate_display_names() + var/static/list/augment_list + if(!augment_list) + augment_list = list() + var/list/templist = list( + /obj/item/organ/cyberimp/brain/anti_drop, + /obj/item/organ/cyberimp/arm/toolset, + /obj/item/organ/cyberimp/arm/surgery, + /obj/item/organ/cyberimp/chest/thrusters, + /obj/item/organ/lungs/cybernetic, + /obj/item/organ/liver/cybernetic) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof + for(var/V in templist) + var/atom/A = V + augment_list[initial(A.name)] = A + return augment_list + +/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M) + new choice(get_turf(M)) + to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"") + /obj/item/skub desc = "It's skub." name = "skub" @@ -123,11 +161,3 @@ w_class = WEIGHT_CLASS_BULKY attack_verb = list("skubbed") -/obj/item/supermatterspray - name = "supermatter spray" - desc = "A spray bottle containing some kind of magical spray to fix the SM. \"Do not inhale.\" is written on the side. Unless aimed at the supermatter, it does nothing." - icon = 'icons/obj/supermatter.dmi' - icon_state = "supermatterspray" - w_class = WEIGHT_CLASS_SMALL - var/usesleft = 2 - diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index cc2f5e9be7..cd65149f5d 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -7,7 +7,7 @@ desc = "Used to recolor floors and walls. Can be removed by the janitor." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "paint_neutral" - item_color = "FFFFFF" + var/paint_color = "FFFFFF" item_state = "paintcan" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FLAMMABLE @@ -16,37 +16,37 @@ /obj/item/paint/red name = "red paint" - item_color = "C73232" //"FF0000" + paint_color = "C73232" //"FF0000" icon_state = "paint_red" /obj/item/paint/green name = "green paint" - item_color = "2A9C3B" //"00FF00" + paint_color = "2A9C3B" //"00FF00" icon_state = "paint_green" /obj/item/paint/blue name = "blue paint" - item_color = "5998FF" //"0000FF" + paint_color = "5998FF" //"0000FF" icon_state = "paint_blue" /obj/item/paint/yellow name = "yellow paint" - item_color = "CFB52B" //"FFFF00" + paint_color = "CFB52B" //"FFFF00" icon_state = "paint_yellow" /obj/item/paint/violet name = "violet paint" - item_color = "AE4CCD" //"FF00FF" + paint_color = "AE4CCD" //"FF00FF" icon_state = "paint_violet" /obj/item/paint/black name = "black paint" - item_color = "333333" + paint_color = "333333" icon_state = "paint_black" /obj/item/paint/white name = "white paint" - item_color = "FFFFFF" + paint_color = "FFFFFF" icon_state = "paint_white" @@ -61,31 +61,31 @@ return switch(t1) if("red") - item_color = "C73232" + paint_color = "C73232" if("pink") - item_color = "FFC0CD" + paint_color = "FFC0CD" if("blue") - item_color = "5998FF" + paint_color = "5998FF" if("cyan") - item_color = "00FFFF" + paint_color = "00FFFF" if("green") - item_color = "2A9C3B" + paint_color = "2A9C3B" if("lime") - item_color = "00FF00" + paint_color = "00FF00" if("yellow") - item_color = "CFB52B" + paint_color = "CFB52B" if("orange") - item_color = "fFA700" + paint_color = "fFA700" if("violet") - item_color = "AE4CCD" + paint_color = "AE4CCD" if("purple") - item_color = "800080" + paint_color = "800080" if("white") - item_color = "FFFFFF" + paint_color = "FFFFFF" if("gray") - item_color = "808080" + paint_color = "808080" if("black") - item_color = "333333" + paint_color = "333333" icon_state = "paint_[t1]" add_fingerprint(user) @@ -99,7 +99,7 @@ return if(!isturf(target) || isspaceturf(target)) return - var/newcolor = "#" + item_color + var/newcolor = "#" + paint_color target.add_atom_colour(newcolor, WASHABLE_COLOUR_PRIORITY) /obj/item/paint/paint_remover @@ -112,7 +112,7 @@ . = ..() if(!proximity) return - if(!isturf(target) || !isobj(target)) + if(!isturf(target) && !isobj(target)) return if(target.color != initial(target.color)) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 090c2f6d57..3420e72c72 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -78,6 +78,7 @@ name = "crew pinpointer" desc = "A handheld tracking device that points to crew suit sensors." icon_state = "pinpointer_crew" + custom_price = PRICE_ABOVE_EXPENSIVE var/has_owner = FALSE var/pinpointer_owner = null @@ -182,3 +183,20 @@ A.other_pair = B B.other_pair = A + +/obj/item/pinpointer/shuttle + name = "fugitive pinpointer" + desc = "A handheld tracking device that locates the bounty hunter shuttle for quick escapes." + icon_state = "pinpointer_hunter" + var/obj/shuttleport + +/obj/item/pinpointer/shuttle/Initialize(mapload) + . = ..() + shuttleport = SSshuttle.getShuttle("huntership") + +/obj/item/pinpointer/shuttle/scan_for_target() + target = shuttleport + +/obj/item/pinpointer/shuttle/Destroy() + shuttleport = null + . = ..() \ No newline at end of file diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 498990fcf3..00a9ff22f4 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -140,7 +140,8 @@ if(jsonlist["icon_state"]) icon_state = jsonlist["icon_state"] item_state = jsonlist["item_state"] - icon = 'config/plushies/sprites.dmi' + var/static/config_sprites = file("config/plushies/sprites.dmi") + icon = config_sprites if(jsonlist["attack_verb"]) attack_verb = jsonlist["attack_verb"] if(jsonlist["squeak_override"]) @@ -434,7 +435,15 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() - var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : pick(GLOB.valid_plushie_paths) + var/newtype + var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies) + + /// If there are no snowflake plushies we'll default to base plush, so we grab from the valid list + if (snowflake_list.len) + newtype = prob(CONFIG_GET(number/snowflake_plushie_prob)) ? /obj/item/toy/plush/random_snowflake : pick(GLOB.valid_plushie_paths) + else + newtype = pick(GLOB.valid_plushie_paths) + new newtype(loc) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 342f756ffc..23be8cbb9a 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -201,8 +201,8 @@ return target var/x_o = (target.x - starting.x) var/y_o = (target.y - starting.y) - var/new_x = CLAMP((starting.x + (x_o * range_multiplier)), 0, world.maxx) - var/new_y = CLAMP((starting.y + (y_o * range_multiplier)), 0, world.maxy) + var/new_x = clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) + var/new_y = clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 648f465a22..b7e2d22d2f 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -6,6 +6,7 @@ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' flags_1 = CONDUCT_1 + item_flags = NEEDS_PERMIT | NO_COMBAT_MODE_FORCE_MODIFIER //To avoid ambushing and oneshotting healthy crewmembers on force setting 3. attack_verb = list("whacked", "fisted", "power-punched") force = 20 throwforce = 10 @@ -13,7 +14,7 @@ w_class = WEIGHT_CLASS_NORMAL armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40) resistance_flags = FIRE_PROOF - var/click_delay = 1.5 + click_delay = CLICK_CD_MELEE * 1.5 var/fisto_setting = 1 var/gasperfist = 3 var/obj/item/tank/internals/tank = null //Tank used for the gauntlet's piston-ram. @@ -70,42 +71,46 @@ /obj/item/melee/powerfist/attack(mob/living/target, mob/living/user) - if(!tank) - to_chat(user, "\The [src] can't operate without a source of gas!") - return - var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) - var/turf/T = get_turf(src) - if(!T) - return - T.assume_air(gasused) - T.air_update_turf() - if(!gasused) - to_chat(user, "\The [src]'s tank is empty!") - target.apply_damage((force / 5), BRUTE) - playsound(loc, 'sound/weapons/punch1.ogg', 50, 1) - target.visible_message("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!", \ - "[user]'s punches you!") - return - if(gasused.total_moles() < gasperfist * fisto_setting) - to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") - playsound(loc, 'sound/weapons/punch4.ogg', 50, 1) - target.apply_damage((force / 2), BRUTE) - target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ - "[user]'s punch strikes with force!") - return - target.apply_damage(force * fisto_setting, BRUTE) - target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ - "You cry out in pain as [user]'s punch flings you backwards!") - new /obj/effect/temp_visual/kinetic_blast(target.loc) - playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) - playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm other living beings!") + return FALSE + if(!tank) + to_chat(user, "\The [src] can't operate without a source of gas!") + return FALSE + var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) + var/turf/T = get_turf(src) + if(!T) + return FALSE + var/totalitemdamage = target.pre_attacked_by(src, user) + T.assume_air(gasused) + T.air_update_turf() + if(!gasused) + to_chat(user, "\The [src]'s tank is empty!") + target.apply_damage((totalitemdamage / 5), BRUTE) + playsound(loc, 'sound/weapons/punch1.ogg', 50, 1) + target.visible_message("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "[user]'s punches you!") + return + if(gasused.total_moles() < gasperfist * fisto_setting) + to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") + playsound(loc, 'sound/weapons/punch4.ogg', 50, 1) + target.apply_damage((totalitemdamage / 2), BRUTE) + target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "[user]'s punch strikes with force!") + return + target.apply_damage(totalitemdamage * fisto_setting, BRUTE) + target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "You cry out in pain as [user]'s punch flings you backwards!") + new /obj/effect/temp_visual/kinetic_blast(target.loc) + playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) + playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) - var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) + var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) + target.throw_at(throw_target, 5 * fisto_setting, 0.5 + (fisto_setting / 2)) - target.throw_at(throw_target, 5 * fisto_setting, 0.5 + (fisto_setting / 2)) + log_combat(user, target, "power fisted", src) - log_combat(user, target, "power fisted", src) - - user.changeNext_move(CLICK_CD_MELEE * click_delay) - - return + var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) + if(weight) + user.adjustStaminaLossBuffered(weight) + return TRUE diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm new file mode 100644 index 0000000000..648ba27897 --- /dev/null +++ b/code/game/objects/items/puzzle_pieces.dm @@ -0,0 +1,146 @@ +//************** +//*****Keys******************* +//************** ** ** +/obj/item/keycard + name = "security keycard" + desc = "This feels like it belongs to a door." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "keycard" + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 1 + throw_range = 7 + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/puzzle_id = null + +//Two test keys for use alongside the two test doors. +/obj/item/keycard/cheese + name = "cheese keycard" + desc = "Look, I still don't understand the reference. What the heck is a keyzza?" + color = "#f0da12" + puzzle_id = "cheese" + +/obj/item/keycard/swordfish + name = "titanic keycard" + desc = "Smells like it was at the bottom of a harbor." + color = "#3bbbdb" + puzzle_id = "swordfish" + +//*************** +//*****Doors***** +//*************** + +/obj/machinery/door/keycard + name = "locked door" + desc = "This door only opens when a keycard is swiped. It looks virtually indestructable." + icon = 'icons/obj/doors/puzzledoor/default.dmi' + icon_state = "door_closed" + explosion_block = 3 + heat_proof = TRUE + max_integrity = 600 + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + damage_deflection = 70 + /// Make sure that the key has the same puzzle_id as the keycard door! + var/puzzle_id = null + /// Message that occurs when the door is opened + var/open_message = "The door beeps, and slides opens." + +//Standard Expressions to make keycard doors basically un-cheeseable +/obj/machinery/door/keycard/Bumped(atom/movable/AM) + return !density && ..() + +/obj/machinery/door/keycard/emp_act(severity) + return + +/obj/machinery/door/keycard/ex_act(severity, target) + return + +/obj/machinery/door/keycard/try_to_activate_door(mob/user) + add_fingerprint(user) + if(operating) + return + +/obj/machinery/door/keycard/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I,/obj/item/keycard)) + var/obj/item/keycard/key = I + if((!puzzle_id || puzzle_id == key.puzzle_id) && density) + if(open_message) + to_chat(user, "[open_message]") + open() + return + else if(puzzle_id != key.puzzle_id) + to_chat(user, "[src] buzzes. This must not be the right key.") + return + else + to_chat(user, "This door doesn't appear to close.") + return + +//Test doors. Gives admins a few doors to use quickly should they so choose. +/obj/machinery/door/keycard/cheese + name = "blue airlock" + desc = "Smells like... pizza?" + puzzle_id = "cheese" + +/obj/machinery/door/keycard/swordfish + name = "blue airlock" + desc = "If nautical nonsense be something you wish." + puzzle_id = "swordfish" + +//************************* +//***Box Pushing Puzzles*** +//************************* +//We're working off a subtype of pressureplates, which should work just a BIT better now. +/obj/structure/holobox + name = "holobox" + desc = "A hard-light box, containing a secure decryption key." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "laserbox" + density = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + +//Uses the pressure_plate settings for a pretty basic custom pattern that waits for a specific item to trigger. Easy enough to retool for mapping purposes or subtypes. +/obj/item/pressure_plate/hologrid + name = "hologrid" + desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "lasergrid" + anchored = TRUE + trigger_mob = FALSE + trigger_item = TRUE + specific_item = /obj/structure/holobox + removable_signaller = FALSE //Being a pressure plate subtype, this can also use signals. + roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however. + active = TRUE + trigger_delay = 10 + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/reward = /obj/item/reagent_containers/food/snacks/cookie + var/claimed = FALSE + +/obj/item/pressure_plate/hologrid/examine(mob/user) + . = ..() + if(claimed) + . += "This one appears to be spent already." + +/obj/item/pressure_plate/hologrid/trigger() + if(!claimed) + new reward(loc) + flick("lasergrid_a",src) + icon_state = "lasergrid_full" + claimed = TRUE + +/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) + . = ..() + if(trigger_item && istype(AM, specific_item) && !claimed) + AM.anchored = TRUE + flick("laserbox_burn", AM) + trigger() + sleep(15) + qdel(AM) + +// snowflake code until undertile elements +/obj/item/pressure_plate/hologrid/hide() + . = ..() + anchored = TRUE diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index b89a2983f5..61a05aacd8 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -189,6 +189,7 @@ slowdown = 2.0 //gotta pretend we're balanced. body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/plate/crusader/red icon_state = "crusader-red" @@ -214,8 +215,9 @@ /obj/item/clothing/head/helmet/plate/crusader/prophet name = "Prophet's Hat" desc = "A religious-looking hat." - alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' - flags_1 = 0 + icon_state = "prophet" + mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' + flags_1 = NONE armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 70, "bio" = 50, "rad" = 50, "fire" = 60, "acid" = 60) //religion protects you from disease and radiation, honk. worn_x_dimension = 64 worn_y_dimension = 64 diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 0ca2fbd386..4b8728e426 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -11,7 +11,7 @@ var/charge_cost = 30 /obj/item/borg/stun/attack(mob/living/M, mob/living/user) - if(M.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK)) + if(M.mob_run_block(src, 0, "[M]'s [name]", ATTACK_TYPE_MELEE, 0, user, ran_zone(user.zone_selected), null) & BLOCK_SUCCESS) playsound(M, 'sound/weapons/genhit.ogg', 50, 1) return FALSE if(iscyborg(user)) @@ -358,6 +358,7 @@ check_amount() /obj/item/borg/lollipop/dropped(mob/user) + . = ..() check_amount() /obj/item/borg/lollipop/proc/check_amount() //Doesn't even use processing ticks. @@ -419,7 +420,7 @@ A.BB.damage = hitdamage if(hitdamage) A.BB.nodamage = FALSE - A.BB.speed = 0.5 + A.BB.pixels_per_second = TILES_TO_PIXELS(20) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) A.fire_casing(target, user, params, 0, 0, null, 0, src) user.visible_message("[user] blasts a flying lollipop at [target]!") @@ -434,7 +435,7 @@ A.BB.damage = hitdamage if(hitdamage) A.BB.nodamage = FALSE - A.BB.speed = 0.5 + A.BB.pixels_per_second = TILES_TO_PIXELS(20) A.BB.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, 1) A.fire_casing(target, user, params, 0, 0, null, 0, src) @@ -649,7 +650,7 @@ continue usage += projectile_tick_speed_ecost usage += (tracked[I] * projectile_damage_tick_ecost_coefficient) - energy = CLAMP(energy - usage, 0, maxenergy) + energy = clamp(energy - usage, 0, maxenergy) if(energy <= 0) deactivate_field() visible_message("[src] blinks \"ENERGY DEPLETED\".") @@ -659,7 +660,7 @@ if(iscyborg(host.loc)) host = host.loc else - energy = CLAMP(energy + energy_recharge, 0, maxenergy) + energy = clamp(energy + energy_recharge, 0, maxenergy) return if(host.cell && (host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy)) host.cell.use(energy_recharge*energy_recharge_cyborg_drain_coefficient) @@ -671,13 +672,13 @@ if(track_projectile) tracked[P] = P.damage P.damage *= projectile_damage_coefficient - P.speed *= projectile_speed_coefficient + P.pixels_per_second *= projectile_speed_coefficient P.add_overlay(projectile_effect) /obj/item/borg/projectile_dampen/proc/restore_projectile(obj/item/projectile/P) tracked -= P P.damage *= (1/projectile_damage_coefficient) - P.speed *= (1/projectile_speed_coefficient) + P.pixels_per_second *= (1/projectile_speed_coefficient) P.cut_overlay(projectile_effect) /********************************************************************** @@ -902,4 +903,47 @@ name = "mining point card" desc = "A robotic ID strip used for claiming and transferring mining points. Must be held in an active slot to transfer points." access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) - icon_state = "data_1" \ No newline at end of file + icon_state = "data_1" + + +///Mere cosmetic dogborg items, remnants of what were once the most annoying cyborg modules. +/obj/item/dogborg_tongue + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/robot_items.dmi' + icon_state = "synthtongue" + hitsound = 'sound/effects/attackblob.ogg' + desc = "For giving affectionate kisses." + item_flags = NOBLUDGEON + +/obj/item/dogborg_tongue/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity || !isliving(target)) + return + var/mob/living/silicon/robot/R = user + var/mob/living/L = target + if(L.ckey && !(L.client?.prefs.vore_flags & LICKABLE)) + to_chat(R, "ERROR ERROR: Target not lickable. Aborting display-of-affection subroutine.") + return + + if(check_zone(R.zone_selected) == "head") + R.visible_message("\the [R] affectionally licks \the [L]'s face!", "You affectionally lick \the [L]'s face!") + playsound(R, 'sound/effects/attackblob.ogg', 50, 1) + else + R.visible_message("\the [R] affectionally licks \the [L]!", "You affectionally lick \the [L]!") + playsound(R, 'sound/effects/attackblob.ogg', 50, 1) + +/obj/item/dogborg_nose + name = "boop module" + desc = "The BOOP module" + icon = 'icons/mob/robot_items.dmi' + icon_state = "nose" + flags_1 = CONDUCT_1|NOBLUDGEON + force = 0 + +/obj/item/dogborg_nose/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity) + return + do_attack_animation(target, null, src) + user.visible_message("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!") diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b137c5c0f3..bf82ee1ea9 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -545,7 +545,7 @@ to_chat(usr, "This unit already has an expand module installed!") return FALSE - R.notransform = TRUE + R.mob_transforming = TRUE var/prev_locked_down = R.locked_down R.SetLockdown(1) R.anchored = TRUE @@ -559,7 +559,7 @@ if(!prev_locked_down) R.SetLockdown(0) R.anchored = FALSE - R.notransform = FALSE + R.mob_transforming = FALSE R.resize = 2 R.hasExpanded = TRUE R.update_transform() @@ -663,21 +663,19 @@ var/maxReduction = 1 -/obj/effect/proc_holder/silicon/cyborg/vtecControl/Click(mob/living/silicon/robot/user) - var/mob/living/silicon/robot/self = usr - +/obj/effect/proc_holder/silicon/cyborg/vtecControl/Trigger(mob/living/silicon/robot/user) currentState = (currentState + 1) % 3 - if(istype(self)) + if(istype(user)) switch(currentState) if (0) - self.speed = initial(self.speed) + user.speed = initial(user.speed) if (1) - self.speed = initial(self.speed) - maxReduction * 0.5 + user.speed = initial(user.speed) - maxReduction * 0.5 if (2) - self.speed = initial(self.speed) - maxReduction * 1 + user.speed = initial(user.speed) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" action.UpdateButtonIcon() - return + return TRUE diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index 93056adc99..014d4cb159 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -35,14 +35,14 @@ if(TH.force_wielded > initial(TH.force_wielded)) to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return - TH.force_wielded = CLAMP(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay + TH.force_wielded = clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") I.sharpness = IS_SHARP_ACCURATE - I.force = CLAMP(I.force + increment, 0, max) - I.throwforce = CLAMP(I.throwforce + increment, 0, max) + I.force = clamp(I.force + increment, 0, max) + I.throwforce = clamp(I.throwforce + increment, 0, max) I.name = "[prefix] [I.name]" name = "worn out [name]" desc = "[desc] At least, it used to." diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 07f4cb4e40..aefa5d3cc8 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -1,13 +1,188 @@ /obj/item/shield name = "shield" - icon = 'icons/obj/items_and_weapons.dmi' - block_chance = 50 + icon = 'icons/obj/shields.dmi' + item_flags = ITEM_CAN_BLOCK + block_parry_data = /datum/block_parry_data/shield armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) - var/transparent = FALSE // makes beam projectiles pass through the shield + /// Shield flags + var/shield_flags = SHIELD_FLAGS_DEFAULT + /// Last shieldbash world.time + var/last_shieldbash = 0 + /// Shieldbashing cooldown + var/shieldbash_cooldown = 5 SECONDS + /// Shieldbashing stamina cost + var/shieldbash_stamcost = 7.5 + /// Shieldbashing knockback + var/shieldbash_knockback = 2 + /// Shield bashing brute damage + var/shieldbash_brutedamage = 5 + /// Shield bashing stamina damage + var/shieldbash_stamdmg = 15 + /// Shield bashing stagger duration + var/shieldbash_stagger_duration = 3.5 SECONDS + /// Shield bashing push distance + var/shieldbash_push_distance = 1 -/obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) +/datum/block_parry_data/shield + block_damage_multiplier = 0.25 + block_stamina_efficiency = 2.5 + block_stamina_cost_per_second = 3.5 + block_slowdown = 0 + block_lock_attacking = FALSE + block_lock_sprinting = TRUE + block_start_delay = 1.5 + block_damage_absorption = 5 + block_resting_stamina_penalty_multiplier = 2 + block_projectile_mitigation = 75 + +/obj/item/shield/examine(mob/user) + . = ..() + if(shield_flags & SHIELD_CAN_BASH) + . += "Right click on combat mode attack with [src] to shield bash!" + if(shield_flags & SHIELD_BASH_GROUND_SLAM) + . += "Directly rightclicking on a downed target with [src] will slam them instead of bashing." + +/obj/item/shield/proc/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance) return TRUE +/obj/item/shield/alt_pre_attack(atom/A, mob/living/user, params) + user_shieldbash(user, A, user.a_intent == INTENT_HARM) + return TRUE + +/obj/item/shield/altafterattack(atom/target, mob/user, proximity_flag, click_parameters) + user_shieldbash(user, target, user.a_intent == INTENT_HARM) + return TRUE + +/obj/item/shield/proc/do_shieldbash_effect(mob/living/user, dir, harmful) + var/px = 0 + var/py = 0 + switch(dir) + if(NORTH) + py = 12 + if(SOUTH) + py = -12 + if(EAST) + px = 12 + if(WEST) + px = -12 + var/obj/effect/temp_visual/dir_setting/shield_bash/effect = new(user.loc, dir) + effect.pixel_x = user.pixel_x - 32 //96x96 effect, -32. + effect.pixel_y = user.pixel_y - 32 + user.visible_message("[user] [harmful? "charges forwards with" : "sweeps"] [src]!") + animate(user, pixel_x = px, pixel_y = py, time = 3, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL | ANIMATION_RELATIVE) + animate(user, pixel_x = -px, pixel_y = -py, time = 3, flags = ANIMATION_RELATIVE) + animate(effect, alpha = 0, pixel_x = px * 1.5, pixel_y = py * 1.5, time = 3, flags = ANIMATION_PARALLEL | ANIMATION_RELATIVE) + +/obj/item/shield/proc/bash_target(mob/living/user, mob/living/target, bashdir, harmful) + if(!(target.status_flags & CANKNOCKDOWN) || HAS_TRAIT(src, TRAIT_STUNIMMUNE)) // should probably add stun absorption check at some point I guess.. + // unified stun absorption system when lol + target.visible_message("[user] slams [target] with [src], but [target] doesn't falter!", "[user] slams you with [src], but it barely fazes you!") + return FALSE + var/target_downed = !CHECK_MOBILITY(target, MOBILITY_STAND) + var/wallhit = FALSE + var/turf/target_current_turf = get_turf(target) + if(harmful) + target.visible_message("[target_downed? "[user] slams [src] into [target]" : "[user] bashes [target] with [src]"]!", + "[target_downed? "[user] slams [src] into you" : "[user] bashes you with [src]"]!") + else + target.visible_message("[user] shoves [target] with [src]!", + "[user] shoves you with [src]!") + for(var/i in 1 to harmful? shieldbash_knockback : shieldbash_push_distance) + var/turf/new_turf = get_step(target, bashdir) + var/mob/living/carbon/human/H = locate() in (new_turf.contents - target) + if(H && harmful) + H.visible_message("[target] is sent crashing into [H]!", + "[target] is sent crashing into you!") + H.KnockToFloor() + wallhit = TRUE + break + else + step(target, bashdir) + if(get_turf(target) == target_current_turf) + wallhit = TRUE + break + else + target_current_turf = get_turf(target) + var/disarming = (target_downed && (shield_flags & SHIELD_BASH_GROUND_SLAM_DISARM)) || (shield_flags & SHIELD_BASH_ALWAYS_DISARM) || (wallhit && (shield_flags & SHIELD_BASH_WALL_DISARM)) + var/knockdown = !target_downed && ((shield_flags & SHIELD_BASH_ALWAYS_KNOCKDOWN) || (wallhit && (shield_flags & SHIELD_BASH_WALL_KNOCKDOWN))) + if(shieldbash_stagger_duration || knockdown) + target.visible_message("[target] is knocked [knockdown? "to the floor" : "off balanace"]!", + "You are knocked [knockdown? "to the floor" : "off balanace"]!") + if(knockdown) + target.KnockToFloor(disarming) + else if(disarming) + target.drop_all_held_items() + + if(harmful) + target.apply_damage(shieldbash_stamdmg, STAMINA, BODY_ZONE_CHEST) + target.apply_damage(shieldbash_brutedamage, BRUTE, BODY_ZONE_CHEST) + target.Stagger(shieldbash_stagger_duration) + return TRUE + +/obj/item/shield/proc/user_shieldbash(mob/living/user, atom/target, harmful) + if(!SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //Combat mode has to be enabled for shield bashing + return FALSE + if(!(shield_flags & SHIELD_CAN_BASH)) + to_chat(user, "[src] can't be used to shield bash!") + return FALSE + if(!CHECK_MOBILITY(user, MOBILITY_STAND)) + to_chat(user, "You can't bash with [src] while on the ground!") + return FALSE + if(world.time < last_shieldbash + shieldbash_cooldown) + to_chat(user, "You can't bash with [src] again so soon!") + return FALSE + var/mob/living/livingtarget = target //only access after an isliving check! + if(isliving(target) && !CHECK_MOBILITY(livingtarget, MOBILITY_STAND)) //GROUND SLAAAM + if(!(shield_flags & SHIELD_BASH_GROUND_SLAM)) + to_chat(user, "You can't ground slam with [src]!") + return FALSE + bash_target(user, target, NONE, harmful) + user.do_attack_animation(target, used_item = src) + playsound(src, harmful? "swing_hit" : 'sound/weapons/thudswoosh.ogg', 75, 1) + last_shieldbash = world.time + user.adjustStaminaLossBuffered(shieldbash_stamcost) + return TRUE + // Directional sweep! + last_shieldbash = world.time + user.adjustStaminaLossBuffered(shieldbash_stamcost) + // Since we are in combat mode, we can probably safely use the user's dir instead of getting their mouse pointing cardinal dir. + var/bashdir = user.dir + do_shieldbash_effect(user, bashdir, harmful) + var/list/checking = list(get_step(user, user.dir), get_step(user, turn(user.dir, 45)), get_step(user, turn(user.dir, -45))) + var/list/victims = list() + for(var/i in checking) + var/turf/T = i + for(var/mob/living/L in T.contents) + victims += L + if(length(victims)) + for(var/i in victims) + bash_target(user, i, bashdir, harmful) + playsound(src, harmful? "swing_hit" : 'sound/weapons/thudswoosh.ogg', 75, 1) + else + playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1) + return length(victims) + +/obj/effect/temp_visual/dir_setting/shield_bash + icon = 'icons/effects/96x96_attack_sweep.dmi' + icon_state = "shield_bash" + duration = 3 + +/obj/item/shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(ismovable(object)) + var/atom/movable/AM = object + if(CHECK_BITFIELD(shield_flags, SHIELD_TRANSPARENT) && (AM.pass_flags & PASSGLASS)) + return BLOCK_NONE + if(attack_type & ATTACK_TYPE_THROWN) + final_block_chance += 30 + if(attack_type & ATTACK_TYPE_TACKLE) + final_block_chance = 100 + . = ..() + if(. & BLOCK_SUCCESS) + on_shield_block(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + +/obj/item/shield/on_active_block(mob/living/owner, atom/object, damage, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + on_shield_block(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance) + /obj/item/shield/riot name = "riot shield" desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." @@ -23,19 +198,10 @@ custom_materials = list(/datum/material/glass=7500, /datum/material/iron=1000) attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time - transparent = TRUE - max_integrity = 75 - -/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(transparent && (hitby.pass_flags & PASSGLASS)) - return FALSE - if(attack_type == THROWN_PROJECTILE_ATTACK) - final_block_chance += 30 - if(attack_type == LEAP_ATTACK) - final_block_chance = 100 - . = ..() - if(.) - on_shield_block(owner, hitby, attack_text, damage, attack_type) + var/repair_material = /obj/item/stack/sheet/mineral/titanium + var/can_shatter = TRUE + shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_TRANSPARENT + max_integrity = 450 /obj/item/shield/riot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/melee/baton)) @@ -43,14 +209,14 @@ user.visible_message("[user] bashes [src] with [W]!") playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) cooldown = world.time - else if(istype(W, /obj/item/stack/sheet/mineral/titanium)) + else if(istype(W, repair_material)) if(obj_integrity >= max_integrity) to_chat(user, "[src] is already in perfect condition.") else - var/obj/item/stack/sheet/mineral/titanium/T = W - T.use(1) + var/obj/item/stack/S = W + S.use(1) obj_integrity = max_integrity - to_chat(user, "You repair [src] with [T].") + to_chat(user, "You repair [src] with [S].") else return ..() @@ -69,16 +235,33 @@ playsound(owner, 'sound/effects/glassbr3.ogg', 100) new /obj/item/shard((get_turf(src))) -/obj/item/shield/riot/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) - if(obj_integrity <= damage) +/obj/item/shield/riot/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(can_shatter && (obj_integrity <= damage)) var/turf/T = get_turf(owner) - T.visible_message("[hitby] destroys [src]!") + T.visible_message("[attack_text] destroys [src]!") shatter(owner) qdel(src) return FALSE take_damage(damage) return ..() +/obj/item/shield/riot/laser_proof + name = "laser resistant shield" + desc = "A far more frail shield made of dark glass meant to block lasers but suffers from being being weak to ballistic projectiles." + armor = list("melee" = 30, "bullet" = -10, "laser" = 80, "energy" = 80, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + icon_state = "riot_laser" + item_state = "riot_laser" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + shield_flags = SHIELD_FLAGS_DEFAULT + max_integrity = 300 + +obj/item/shield/riot/bullet_proof + name = "bullet resistant shield" + desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics." + armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + max_integrity = 300 + /obj/item/shield/riot/roman name = "\improper Roman shield" desc = "Bears an inscription on the inside: \"Romanes venio domus\"." @@ -86,14 +269,15 @@ item_state = "roman_shield" lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - transparent = FALSE - max_integrity = 65 + repair_material = /obj/item/stack/sheet/mineral/wood + shield_flags = SHIELD_FLAGS_DEFAULT + max_integrity = 250 /obj/item/shield/riot/roman/fake desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." block_chance = 0 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - max_integrity = 30 + max_integrity = 40 /obj/item/shield/riot/roman/shatter(mob/living/carbon/human/owner) playsound(owner, 'sound/effects/grillehit.ogg', 100) @@ -106,68 +290,17 @@ item_state = "buckler" lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - custom_materials = null + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 10) resistance_flags = FLAMMABLE + repair_material = /obj/item/stack/sheet/mineral/wood block_chance = 30 - transparent = FALSE - max_integrity = 55 + shield_flags = SHIELD_FLAGS_DEFAULT + max_integrity = 150 /obj/item/shield/riot/buckler/shatter(mob/living/carbon/human/owner) playsound(owner, 'sound/effects/bang.ogg', 50) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) - -/obj/item/shield/energy - name = "energy combat shield" - desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere." - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - w_class = WEIGHT_CLASS_TINY - attack_verb = list("shoved", "bashed") - throw_range = 5 - force = 3 - throwforce = 3 - throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted - var/on_force = 10 - var/on_throwforce = 8 - var/on_throw_speed = 2 - var/active = 0 - var/clumsy_check = TRUE - -/obj/item/shield/energy/Initialize() - . = ..() - icon_state = "[base_icon_state]0" - -/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return 0 - -/obj/item/shield/energy/IsReflect() - return (active) - -/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) - if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - to_chat(user, "You beat yourself in the head with [src]!") - user.take_bodypart_damage(5) - active = !active - icon_state = "[base_icon_state][active]" - - if(active) - force = on_force - throwforce = on_throwforce - throw_speed = on_throw_speed - w_class = WEIGHT_CLASS_BULKY - playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE) - to_chat(user, "[src] is now active.") - else - force = initial(force) - throwforce = initial(throwforce) - throw_speed = initial(throw_speed) - w_class = WEIGHT_CLASS_TINY - playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE) - to_chat(user, "[src] can now be concealed.") - add_fingerprint(user) - /obj/item/shield/riot/tele name = "telescopic shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." @@ -180,12 +313,15 @@ throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_NORMAL - var/active = 0 + var/active = FALSE -/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(active) - return ..() - return 0 +/obj/item/shield/riot/tele/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!active) + return BLOCK_NONE + return ..() + +/obj/item/shield/riot/tele/can_active_block() + return ..() && active /obj/item/shield/riot/tele/attack_self(mob/living/user) active = !active @@ -214,12 +350,11 @@ armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80) lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - icon = 'icons/obj/items_and_weapons.dmi' item_state = "metal" icon_state = "makeshift_shield" custom_materials = list(/datum/material/iron = 18000) slot_flags = null - block_chance = 35 + max_integrity = 300 //Made of metal welded together its strong but not unkillable force = 10 throwforce = 7 @@ -229,27 +364,107 @@ armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user item_state = "metal" icon_state = "metal" - icon = 'icons/obj/items_and_weapons.dmi' - block_chance = 75 //1/4 shots will hit* force = 16 slowdown = 2 throwforce = 15 //Massive pice of metal w_class = WEIGHT_CLASS_HUGE item_flags = SLOWS_WHILE_IN_HAND - transparent = FALSE + shield_flags = SHIELD_FLAGS_DEFAULT + +/obj/item/shield/riot/tower/swat + name = "swat shield" + desc = "A massive, heavy shield that can block a lot of attacks, can take a lot of abuse before breaking." + max_integrity = 250 /obj/item/shield/riot/implant - name = "riot tower shield" - desc = "A massive shield that can block a lot of attacks and can take a lot of abuse before breaking." //It cant break unless it is removed from the implant + name = "telescoping shield implant" + desc = "A compact, arm-mounted telescopic shield. While nigh-indestructible when powered by a host user, it will eventually overload from damage. Recharges while inside its implant." item_state = "metal" icon_state = "metal" - icon = 'icons/obj/items_and_weapons.dmi' - block_chance = 30 //May be big but hard to move around to block. slowdown = 1 - transparent = FALSE + shield_flags = SHIELD_FLAGS_DEFAULT + max_integrity = 100 + obj_integrity = 100 + can_shatter = FALSE item_flags = SLOWS_WHILE_IN_HAND + var/recharge_timerid + var/recharge_delay = 15 SECONDS -/obj/item/shield/riot/implant/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 60 //Massive shield +/// Entirely overriden take_damage. This shouldn't exist outside of an implant (other than maybe christmas). +/obj/item/shield/riot/implant/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0) + obj_integrity -= damage_amount + if(obj_integrity < 0) + obj_integrity = 0 + if(obj_integrity == 0) + if(ismob(loc)) + var/mob/living/L = loc + playsound(src, 'sound/effects/glassbr3.ogg', 100) + L.visible_message("[src] overloads from the damage sustained!") + L.dropItemToGround(src) //implant component catch hook will grab it. + +/obj/item/shield/riot/implant/Moved() + . = ..() + if(istype(loc, /obj/item/organ/cyberimp/arm/shield)) + recharge_timerid = addtimer(CALLBACK(src, .proc/recharge), recharge_delay, flags = TIMER_STOPPABLE) + else //extending + if(recharge_timerid) + deltimer(recharge_timerid) + recharge_timerid = null + +/obj/item/shield/riot/implant/proc/recharge() + if(obj_integrity == max_integrity) + return + obj_integrity = max_integrity + if(ismob(loc.loc)) //cyberimplant.user + to_chat(loc, "[src] has recharged its reinforcement matrix and is ready for use!") + +/obj/item/shield/energy + name = "energy combat shield" + desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere." + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + attack_verb = list("shoved", "bashed") + throw_range = 5 + force = 3 + throwforce = 3 + throw_speed = 3 + var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + var/on_force = 10 + var/on_throwforce = 8 + var/on_throw_speed = 2 + var/active = 0 + var/clumsy_check = TRUE + +/obj/item/shield/energy/Initialize() + . = ..() + icon_state = "[base_icon_state]0" + +/obj/item/shield/energy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT return ..() + +/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) + if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + to_chat(user, "You beat yourself in the head with [src]!") + user.take_bodypart_damage(5) + active = !active + icon_state = "[base_icon_state][active]" + + if(active) + force = on_force + throwforce = on_throwforce + throw_speed = on_throw_speed + w_class = WEIGHT_CLASS_BULKY + playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE) + to_chat(user, "[src] is now active.") + else + force = initial(force) + throwforce = initial(throwforce) + throw_speed = initial(throw_speed) + w_class = WEIGHT_CLASS_TINY + playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE) + to_chat(user, "[src] can now be concealed.") + add_fingerprint(user) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm new file mode 100644 index 0000000000..7108080ecc --- /dev/null +++ b/code/game/objects/items/shrapnel.dm @@ -0,0 +1,64 @@ +/obj/item/shrapnel // frag grenades + name = "shrapnel shard" + embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=4, embed_chance_turf_mod=-100) + custom_materials = list(/datum/material/iron=50) + armour_penetration = -20 + icon = 'icons/obj/shards.dmi' + icon_state = "large" + w_class = WEIGHT_CLASS_TINY + item_flags = DROPDEL + +/obj/item/shrapnel/stingball // stingbang grenades + name = "stingball" + embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100) + icon_state = "tiny" + +/obj/item/shrapnel/bullet // bullets + name = "bullet" + icon = 'icons/obj/ammo.dmi' + icon_state = "s-casing" + item_flags = NONE + +/obj/item/shrapnel/bullet/c38 // .38 round + name = "\improper .38 bullet" + +/obj/item/shrapnel/bullet/c38/dumdum // .38 DumDum round + name = "\improper .38 DumDum bullet" + embedding = list(embed_chance=70, fall_chance=7, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10, embed_chance_turf_mod=-100) + +/obj/item/projectile/bullet/shrapnel + name = "flying shrapnel shard" + damage = 9 + range = 10 + armour_penetration = -30 + dismemberment = 5 + ricochets_max = 2 + ricochet_chance = 40 + shrapnel_type = /obj/item/shrapnel + ricochet_incidence_leeway = 60 + +/obj/item/projectile/bullet/shrapnel/mega + name = "flying shrapnel hunk" + range = 25 + dismemberment = 10 + ricochets_max = 4 + ricochet_chance = 90 + ricochet_decay_chance = 0.9 + +/obj/item/projectile/bullet/pellet/stingball + name = "stingball pellet" + damage = 3 + stamina = 8 + ricochets_max = 4 + ricochet_chance = 66 + ricochet_decay_chance = 1 + ricochet_decay_damage = 0.9 + ricochet_auto_aim_angle = 10 + ricochet_auto_aim_range = 2 + ricochet_incidence_leeway = 0 + shrapnel_type = /obj/item/shrapnel/stingball + +/obj/item/projectile/bullet/pellet/stingball/mega + name = "megastingball pellet" + ricochets_max = 6 + ricochet_chance = 110 diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 2b00114ef8..cf7373b700 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -40,12 +40,4 @@ user.visible_message("[user] waves around \the \"[label]\" sign.") else user.visible_message("[user] waves around blank sign.") - user.changeNext_move(CLICK_CD_MELEE) - -/datum/crafting_recipe/picket_sign - name = "Picket Sign" - result = /obj/item/picket_sign - reqs = list(/obj/item/stack/rods = 1, - /obj/item/stack/sheet/cardboard = 2) - time = 80 - category = CAT_MISC \ No newline at end of file + user.changeNext_move(CLICK_CD_MELEE) \ No newline at end of file diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index 4c64ed9dd4..dc761ee3bf 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -37,7 +37,7 @@ /obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder) for(var/atom/X in orange(5,pull)) - if(ismovableatom(X)) + if(ismovable(X)) var/atom/movable/A = X if(A == wielder) continue diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index f864df5a21..00e48fd12a 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "bluespace_crystal" singular_name = "bluespace crystal" + dye_color = DYE_COSMIC w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/bluespace=MINERAL_MATERIAL_AMOUNT) points = 50 diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 94f6fca28c..ce0bc6591a 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/economy.dmi' icon_state = "spacecash" amount = 1 - max_amount = 20 + max_amount = INFINITY throwforce = 0 throw_speed = 2 throw_range = 2 @@ -18,9 +18,11 @@ update_desc() /obj/item/stack/spacecash/proc/update_desc() - var/total_worth = amount*value + var/total_worth = get_item_credit_value() desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]" +/obj/item/stack/spacecash/get_item_credit_value() + return (amount*value) /obj/item/stack/spacecash/merge(obj/item/stack/S) . = ..() @@ -69,3 +71,9 @@ icon_state = "spacecash1000" singular_name = "one thousand credit bill" value = 1000 + +/obj/item/stack/spacecash/c10000 + icon_state = "spacecash10000" + singular_name = "ten thousand credit bill" + value = 10000 + diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 205ce57251..e6403e83cc 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -13,18 +13,33 @@ novariants = FALSE item_flags = NOBLUDGEON var/self_delay = 50 + var/other_delay = 0 + var/repeating = FALSE /obj/item/stack/medical/attack(mob/living/M, mob/user) . = ..() + try_heal(M, user) + + +/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE) if(!M.can_inject(user, TRUE)) return if(M == user) - user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...") + if(!silent) + user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...") if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE))) return + else if(other_delay) + if(!silent) + user.visible_message("[user] starts to apply \the [src] on [M].", "You begin applying \the [src] on [M]...") + if(!do_mob(user, M, other_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE))) + return + if(heal(M, user)) log_combat(user, M, "healed", src.name) use(1) + if(repeating && amount > 0) + try_heal(M, user, TRUE) /obj/item/stack/medical/proc/heal(mob/living/M, mob/user) @@ -59,6 +74,9 @@ self_delay = 20 grind_results = list(/datum/reagent/medicine/styptic_powder = 10) +/obj/item/stack/medical/bruise_pack/one + amount = 1 + /obj/item/stack/medical/bruise_pack/heal(mob/living/M, mob/user) if(M.stat == DEAD) to_chat(user, " [M] is dead. You can not help [M.p_them()]!") @@ -72,6 +90,8 @@ to_chat(user, " [M] is at full health.") return FALSE user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") + if(AmBloodsucker(M)) + return M.heal_bodypart_damage((heal_brute/2)) return TRUE if(iscarbon(M)) @@ -91,6 +111,7 @@ var/stop_bleeding = 1800 var/heal_brute = 5 self_delay = 10 + custom_price = PRICE_REALLY_CHEAP /obj/item/stack/medical/gauze/heal(mob/living/M, mob/user) if(ishuman(M)) @@ -98,6 +119,7 @@ if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression H.suppress_bloodloss(stop_bleeding) to_chat(user, "You stop the bleeding of [M]!") + H.adjustBruteLoss(-(heal_brute)) return TRUE to_chat(user, "You can not use \the [src] on [M]!") @@ -125,6 +147,15 @@ stop_bleeding = 900 heal_brute = 0 +/obj/item/stack/medical/gauze/adv + name = "sterilized medical gauze" + desc = "A roll of elastic sterilized cloth that is extremely effective at stopping bleeding, heals minor wounds and cleans them." + singular_name = "sterilized medical gauze" + self_delay = 5 + +/obj/item/stack/medical/gauze/adv/one + amount = 1 + /obj/item/stack/medical/gauze/cyborg custom_materials = null is_cyborg = 1 @@ -142,14 +173,124 @@ self_delay = 20 grind_results = list(/datum/reagent/medicine/silver_sulfadiazine = 10) +/obj/item/stack/medical/ointment/one + amount = 1 + /obj/item/stack/medical/ointment/heal(mob/living/M, mob/user) if(M.stat == DEAD) to_chat(user, " [M] is dead. You can not help [M.p_them()]!") return if(iscarbon(M)) return heal_carbon(M, user, 0, heal_burn) + if(AmBloodsucker(M)) + return to_chat(user, "You can't heal [M] with the \the [src]!") /obj/item/stack/medical/ointment/suicide_act(mob/living/user) user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?") return TOXLOSS + +/obj/item/stack/medical/suture + name = "suture" + desc = "Sterile sutures used to seal up cuts and lacerations." + gender = PLURAL + singular_name = "suture" + icon_state = "suture" + self_delay = 30 + other_delay = 10 + amount = 15 + max_amount = 15 + repeating = TRUE + var/heal_brute = 10 + grind_results = list(/datum/reagent/medicine/spaceacillin = 2) + +/obj/item/stack/medical/suture/one + amount = 1 + +/obj/item/stack/medical/suture/heal(mob/living/M, mob/user) + . = ..() + if(M.stat == DEAD) + to_chat(user, "[M] is dead! You can not help [M.p_them()].") + return + if(iscarbon(M)) + return heal_carbon(M, user, heal_brute, 0) + if(isanimal(M)) + var/mob/living/simple_animal/critter = M + if (!(critter.healable)) + to_chat(user, "You cannot use \the [src] on [M]!") + return FALSE + else if (critter.health == critter.maxHealth) + to_chat(user, "[M] is at full health.") + return FALSE + user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") + M.heal_bodypart_damage(heal_brute) + return TRUE + + to_chat(user, "You can't heal [M] with the \the [src]!") + +/obj/item/stack/medical/mesh + name = "regenerative mesh" + desc = "A bacteriostatic mesh used to dress burns." + gender = PLURAL + singular_name = "regenerative mesh" + icon_state = "regen_mesh" + self_delay = 30 + other_delay = 10 + amount = 15 + max_amount = 15 + repeating = TRUE + var/heal_burn = 10 + var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened. + grind_results = list(/datum/reagent/medicine/spaceacillin = 2) + +/obj/item/stack/medical/mesh/one + amount = 1 + +/obj/item/stack/medical/mesh/Initialize() + . = ..() + if(amount == max_amount) //only seal full mesh packs + is_open = FALSE + update_icon() + +/obj/item/stack/medical/mesh/update_icon_state() + if(!is_open) + icon_state = "regen_mesh_closed" + else + return ..() + +/obj/item/stack/medical/mesh/heal(mob/living/M, mob/user) + . = ..() + if(M.stat == DEAD) + to_chat(user, "[M] is dead! You can not help [M.p_them()].") + return + if(iscarbon(M)) + return heal_carbon(M, user, 0, heal_burn) + to_chat(user, "You can't heal [M] with the \the [src]!") + + +/obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE) + if(!is_open) + to_chat(user, "You need to open [src] first.") + return + . = ..() + +/obj/item/stack/medical/mesh/AltClick(mob/living/user) + if(!is_open) + to_chat(user, "You need to open [src] first.") + return + . = ..() + +/obj/item/stack/medical/mesh/attack_hand(mob/user) + if(!is_open & user.get_inactive_held_item() == src) + to_chat(user, "You need to open [src] first.") + return + . = ..() + +/obj/item/stack/medical/mesh/attack_self(mob/user) + if(!is_open) + is_open = TRUE + to_chat(user, "You open the sterile mesh package.") + update_icon() + playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE) + return + . = ..() diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index e919f3fe02..6fdea26683 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -21,6 +21,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' + embedding = list() novariants = TRUE /obj/item/stack/rods/suicide_act(mob/living/carbon/user) @@ -89,3 +90,19 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ /obj/item/stack/rods/fifty amount = 50 + +/obj/item/stack/rods/lava + name = "heat resistant rod" + desc = "Treated, specialized metal rods. When exposed to the vaccum of space their coating breaks off, but they can hold up against the extreme heat of active lava." + singular_name = "heat resistant rod" + icon_state = "rods" + item_state = "rods" + color = "#5286b9ff" + flags_1 = CONDUCT_1 + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) + max_amount = 30 + resistance_flags = FIRE_PROOF | LAVA_PROOF + +/obj/item/stack/rods/lava/thirty + amount = 30 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 75db89f616..57af862b69 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -22,6 +22,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ new/datum/stack_recipe("spout flask", /obj/item/glasswork/glass_base/spouty, 20), \ new/datum/stack_recipe("small bulb flask", /obj/item/glasswork/glass_base/flask_small, 5), \ new/datum/stack_recipe("large bottle flask", /obj/item/glasswork/glass_base/flask_large, 15), \ + new/datum/stack_recipe("tea cup", /obj/item/glasswork/glass_base/tea_plate, 5), \ + new/datum/stack_recipe("tea plate", /obj/item/glasswork/glass_base/tea_cup, 5), \ )), \ )) @@ -67,7 +69,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ if (get_amount() < 1 || CC.get_amount() < 5) to_chat(user, "You attach wire to the [name].") var/obj/item/stack/light_w/new_tile = new(user.loc) @@ -107,7 +109,6 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) tableVariant = /obj/structure/table/plasmaglass - material_flags = MATERIAL_NO_EFFECTS shard_type = /obj/item/shard/plasma /obj/item/stack/sheet/plasmaglass/fifty @@ -137,7 +138,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ return ..() /obj/item/stack/sheet/plasmaglass/on_solar_construction(obj/machinery/power/solar/S) - S.obj_integrity *= 1.2 + S.max_integrity *= 1.2 S.efficiency *= 1.2 /* @@ -170,7 +171,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ ..() /obj/item/stack/sheet/rglass/on_solar_construction(obj/machinery/power/solar/S) - S.obj_integrity *= 2 + S.max_integrity *= 2 /obj/item/stack/sheet/rglass/cyborg custom_materials = null @@ -207,7 +208,6 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5,) armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF - material_flags = MATERIAL_NO_EFFECTS merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) point_value = 23 @@ -218,7 +218,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ . += GLOB.prglass_recipes /obj/item/stack/sheet/plasmarglass/on_solar_construction(obj/machinery/power/solar/S) - S.obj_integrity *= 2.2 + S.max_integrity *= 2.2 S.efficiency *= 1.2 GLOBAL_LIST_INIT(titaniumglass_recipes, list( @@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( . += GLOB.titaniumglass_recipes /obj/item/stack/sheet/titaniumglass/on_solar_construction(obj/machinery/power/solar/S) - S.obj_integrity *= 2.5 + S.max_integrity *= 2.5 S.efficiency *= 1.5 GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( @@ -257,7 +257,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( item_state = "sheet-plastitaniumglass" custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) - material_flags = MATERIAL_NO_EFFECTS resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass shard_type = /obj/item/shard @@ -270,7 +269,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( . += GLOB.plastitaniumglass_recipes /obj/item/stack/sheet/titaniumglass/on_solar_construction(obj/machinery/power/solar/S) - S.obj_integrity *= 2 + S.max_integrity *= 2 S.efficiency *= 2 /obj/item/shard @@ -292,6 +291,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( max_integrity = 40 sharpness = IS_SHARP var/icon_prefix + embedding = list("embed_chance" = 65) /obj/item/shard/suicide_act(mob/user) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 65931db2f5..f655e831d8 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -178,6 +178,11 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ icon_state = "sinew" novariants = TRUE +/obj/item/stack/sheet/sinew/wolf + name = "wolf sinew" + desc = "Long stringy filaments which came from the insides of a wolf." + singular_name = "wolf sinew" + GLOBAL_LIST_INIT(sinew_recipes, list ( \ new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/sinew, 1), \ @@ -202,6 +207,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER +/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide + name = "polar bear hides" + desc = "Pieces of a polar bear's fur, these might be able to make your suit a bit more durable to attack from the local fauna." + icon_state = "polar_bear_hide" + singular_name = "polar bear hide" /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 4a7156db72..d28ae52b52 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -324,7 +324,6 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) point_value = 45 merge_type = /obj/item/stack/sheet/mineral/plastitanium - material_flags = MATERIAL_NO_EFFECTS /obj/item/stack/sheet/mineral/plastitanium/fifty amount = 50 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 51f5349f81..c11b619431 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -5,7 +5,6 @@ * Wood * Bamboo * Cloth - * Silk * Durathread * Cardboard * Runed Metal (cult) @@ -63,7 +62,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \ new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \ null, \ - new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75), \ null, \ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ @@ -179,8 +178,21 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \ new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \ - new/datum/stack_recipe("crate", /obj/structure/closet/crate, 5, time = 90, one_per_turf = TRUE), \ - null, \ + new /datum/stack_recipe_list("crates", list( \ + new /datum/stack_recipe("gray crate", /obj/structure/closet/crate, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("internals crate", /obj/structure/closet/crate/internals, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("trash cart", /obj/structure/closet/crate/trashcart, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("medical crate", /obj/structure/closet/crate/medical, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("freezer crate", /obj/structure/closet/crate/freezer, 8, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("blood bag crate", /obj/structure/closet/crate/freezer/blood, 8, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("surplus limbs crate", /obj/structure/closet/crate/freezer/surplus_limbs, 8, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("radiation containment crate", /obj/structure/closet/crate/radiation, 8, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("hydroponics crate", /obj/structure/closet/crate/hydroponics, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("engineering crate", /obj/structure/closet/crate/engineering, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("eletrical crate", /obj/structure/closet/crate/engineering/electrical, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("RCD storage crate", /obj/structure/closet/crate/rcd, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("science crate", /obj/structure/closet/crate/science, 5, time = 50, one_per_turf = 1, on_floor = 1), \ + )), \ new /datum/stack_recipe_list("airlock assemblies", list( \ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 50, one_per_turf = 1, on_floor = 1), \ @@ -202,7 +214,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) point_value = 23 tableVariant = /obj/structure/table/reinforced - material_flags = MATERIAL_NO_EFFECTS /obj/item/stack/sheet/plasteel/get_main_recipes() . = ..() @@ -229,7 +240,9 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\ )), null, \ + new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 40), \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \ + new/datum/stack_recipe("pistol grip", /obj/item/weaponcrafting/improvised_parts/wooden_grip, 5, time = 40), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ @@ -256,6 +269,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ null, \ new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ + new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \ new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ )) @@ -267,11 +281,13 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ icon_state = "sheet-wood" item_state = "sheet-wood" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT) sheettype = "wood" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE + material_type = /datum/material/wood grind_results = list(/datum/reagent/carbon = 20) /obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there. @@ -368,6 +384,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \ + new/datum/stack_recipe("padded floor tile", /obj/item/stack/tile/padded, 1, 4, 20), \ null, \ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1),\ new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 1),\ @@ -375,6 +392,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ null, \ new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \ null, \ + new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteenXnineteen, 3), \ + new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythreeXnineteen, 4), \ + new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythreeXtwentythree, 5), \ )) /obj/item/stack/sheet/cloth @@ -386,9 +406,6 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ resistance_flags = FLAMMABLE force = 0 throwforce = 0 - pull_effort = 90 - is_fabric = TRUE - loom_result = /obj/item/stack/sheet/silk merge_type = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cloth/get_main_recipes() @@ -401,30 +418,6 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ /obj/item/stack/sheet/cloth/thirty amount = 30 -/* - * Silk - */ - - GLOBAL_LIST_INIT(silk_recipes, list ( \ - new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 4, time = 40), \ - new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 2, time = 40), \ - null, \ - new/datum/stack_recipe("silk string", /obj/item/weaponcrafting/silkstring, 1, time = 40), \ - )) - -/obj/item/stack/sheet/silk - name = "silk" - desc = "A long, soft material. Made out of refined cotton, instead of relying on the habits of spiders or silkworms." - singular_name = "silk sheet" - icon_state = "sheet-silk" - item_state = "sheet-cloth" - novariants = TRUE - merge_type = /obj/item/stack/sheet/silk - -/obj/item/stack/sheet/silk/get_main_recipes() - . = ..() - . += GLOB.silk_recipes - /* * Durathread */ @@ -433,6 +426,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \ + new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40), \ )) /obj/item/stack/sheet/durathread @@ -768,6 +762,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2))) /obj/item/stack/sheet/plastic @@ -784,6 +779,9 @@ GLOBAL_LIST_INIT(plastic_recipes, list( /obj/item/stack/sheet/plastic/fifty amount = 50 +/obj/item/stack/sheet/plastic/twenty + amount = 20 + /obj/item/stack/sheet/plastic/five amount = 5 @@ -823,13 +821,12 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra max_amount = 80 singular_name = "raw cotton ball" icon_state = "sheet-cotton" - is_fabric = TRUE resistance_flags = FLAMMABLE force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cotton - pull_effort = 30 - loom_result = /obj/item/stack/sheet/cloth + var/pull_effort = 30 + var/loom_result = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cotton/ten amount = 10 @@ -845,4 +842,3 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread - diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 378855707e..dfba533247 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -13,9 +13,6 @@ mats_per_stack = MINERAL_MATERIAL_AMOUNT var/sheettype = null //this is used for girders in the creation of walls/false walls var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity - var/is_fabric = FALSE //is this a valid material for the loom? - var/loom_result //result from pulling on the loom - var/pull_effort = 0 //amount of delay when pulling on the loom var/shard_type // the shard debris typepath left over by solar panels and windows etc. /obj/item/stack/sheet/Initialize(mapload, new_amount, merge) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5f2795c857..2c8e700316 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -71,9 +71,9 @@ /obj/item/stack/proc/update_weight() if(amount <= (max_amount * (1/3))) - w_class = CLAMP(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) + w_class = clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) else if (amount <= (max_amount * (2/3))) - w_class = CLAMP(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) + w_class = clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) else w_class = full_w_class @@ -201,8 +201,13 @@ if(!building_checks(R, multiplier)) return if (R.time) + var/adjusted_time = 0 usr.visible_message("[usr] starts building [R.title].", "You start building [R.title]...") - if (!do_after(usr, R.time, target = usr)) + if(HAS_TRAIT(usr, R.trait_booster)) + adjusted_time = (R.time * R.trait_modifier) + else + adjusted_time = R.time + if (!do_after(usr, adjusted_time, target = usr)) return if(!building_checks(R, multiplier)) return @@ -240,8 +245,7 @@ else if(istype(O, /obj/item/restraints/handcuffs/cable)) var/obj/item/cuffs = O - cuffs.item_color = item_color - cuffs.update_icon() + cuffs.color = color if (QDELETED(O)) return //It's a stack and has already been merged @@ -458,8 +462,10 @@ var/window_checks = FALSE var/placement_checks = FALSE var/applies_mats = FALSE + var/trait_booster = null + var/trait_modifier = 1 -/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE) +/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE, trait_booster = null, trait_modifier = 1) src.title = title @@ -473,6 +479,8 @@ src.window_checks = window_checks src.placement_checks = placement_checks src.applies_mats = applies_mats + src.trait_booster = trait_booster + src.trait_modifier = trait_modifier /* * Recipe list datum */ diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm new file mode 100644 index 0000000000..177260febb --- /dev/null +++ b/code/game/objects/items/stacks/tape.dm @@ -0,0 +1,61 @@ + + +/obj/item/stack/sticky_tape + name = "sticky tape" + singular_name = "sticky tape" + desc = "Used for sticking to things for sticking said things to people." + icon = 'icons/obj/tapes.dmi' + icon_state = "tape_w" + var/prefix = "sticky" + item_flags = NOBLUDGEON + amount = 5 + max_amount = 5 + resistance_flags = FLAMMABLE + + var/list/conferred_embed = EMBED_HARMLESS + var/overwrite_existing = FALSE + +/obj/item/stack/sticky_tape/afterattack(obj/item/I, mob/living/user) + if(!istype(I)) + return + + if(I.embedding && I.embedding == conferred_embed) + to_chat(user, "[I] is already coated in [src]!") + return + + user.visible_message("[user] begins wrapping [I] with [src].", "You begin wrapping [I] with [src].") + + if(do_after(user, 30, target=I)) + I.embedding = conferred_embed + I.updateEmbedding() + to_chat(user, "You finish wrapping [I] with [src].") + use(1) + I.name = "[prefix] [I.name]" + + if(istype(I, /obj/item/grenade)) + var/obj/item/grenade/sticky_bomb = I + sticky_bomb.sticky = TRUE + +/obj/item/stack/sticky_tape/super + name = "super sticky tape" + singular_name = "super sticky tape" + desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution." + icon_state = "tape_y" + prefix = "super sticky" + conferred_embed = EMBED_HARMLESS_SUPERIOR + +/obj/item/stack/sticky_tape/pointy + name = "pointy tape" + singular_name = "pointy tape" + desc = "Used for sticking to things for sticking said things inside people." + icon_state = "tape_evil" + prefix = "pointy" + conferred_embed = EMBED_POINTY + +/obj/item/stack/sticky_tape/pointy/super + name = "super pointy tape" + singular_name = "super pointy tape" + desc = "You didn't know tape could look so sinister. Welcome to Space Station 13." + icon_state = "tape_spikes" + prefix = "super pointy" + conferred_embed = EMBED_POINTY_SUPERIOR \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 50edc9d15a..1bcd8d72ca 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -78,4 +78,3 @@ turf_type = /turf/open/floor/mineral/plastitanium mineralType = "plastitanium" custom_materials = list(/datum/material/titanium=250, /datum/material/plasma=250) - material_flags = MATERIAL_NO_EFFECTS \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 2e537d3eff..0635c55ca3 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -142,6 +142,14 @@ turf_type = /turf/open/floor/wood resistance_flags = FLAMMABLE +//Cloth Floors + +/obj/item/stack/tile/padded + name = "padded floor tile" + desc = "These are soft and cushy, they'd make good pillows. They look very comfortable, although what they're used for is discomforting." + icon_state = "tile_padded" + turf_type = /turf/open/floor/padded + //Basalt /obj/item/stack/tile/basalt name = "basalt tile" @@ -258,6 +266,9 @@ /obj/item/stack/tile/carpet/blackred/twenty amount = 20 +/obj/item/stack/tile/carpet/blackred/thirty + amount = 30 + /obj/item/stack/tile/carpet/blackred/fifty amount = 50 @@ -267,6 +278,9 @@ /obj/item/stack/tile/carpet/monochrome/twenty amount = 20 +/obj/item/stack/tile/carpet/monochrome/thirty + amount = 30 + /obj/item/stack/tile/carpet/monochrome/fifty amount = 50 @@ -276,6 +290,9 @@ /obj/item/stack/tile/carpet/blue/twenty amount = 20 +/obj/item/stack/tile/carpet/blue/thirty + amount = 30 + /obj/item/stack/tile/carpet/blue/fifty amount = 50 @@ -285,6 +302,9 @@ /obj/item/stack/tile/carpet/cyan/twenty amount = 20 +/obj/item/stack/tile/carpet/cyan/thirty + amount = 30 + /obj/item/stack/tile/carpet/cyan/fifty amount = 50 @@ -294,6 +314,9 @@ /obj/item/stack/tile/carpet/green/twenty amount = 20 +/obj/item/stack/tile/carpet/green/thirty + amount = 30 + /obj/item/stack/tile/carpet/green/fifty amount = 50 @@ -303,6 +326,9 @@ /obj/item/stack/tile/carpet/orange/twenty amount = 20 +/obj/item/stack/tile/carpet/orange/thirty + amount = 30 + /obj/item/stack/tile/carpet/orange/fifty amount = 50 @@ -312,6 +338,9 @@ /obj/item/stack/tile/carpet/purple/twenty amount = 20 +/obj/item/stack/tile/carpet/purple/thirty + amount = 30 + /obj/item/stack/tile/carpet/purple/fifty amount = 50 @@ -321,6 +350,9 @@ /obj/item/stack/tile/carpet/red/twenty amount = 20 +/obj/item/stack/tile/carpet/red/thirty + amount = 30 + /obj/item/stack/tile/carpet/red/fifty amount = 50 @@ -330,6 +362,9 @@ /obj/item/stack/tile/carpet/royalblack/twenty amount = 20 +/obj/item/stack/tile/carpet/royalblack/thirty + amount = 30 + /obj/item/stack/tile/carpet/royalblack/fifty amount = 50 @@ -339,6 +374,9 @@ /obj/item/stack/tile/carpet/royalblue/twenty amount = 20 +/obj/item/stack/tile/carpet/royalblue/thirty + amount = 30 + /obj/item/stack/tile/carpet/royalblue/fifty amount = 50 diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/_storage.dm similarity index 97% rename from code/game/objects/items/storage/storage.dm rename to code/game/objects/items/storage/_storage.dm index 8f4cb99048..fd4cc793ab 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -16,7 +16,7 @@ AddComponent(component_type) /obj/item/storage/AllowDrop() - return FALSE + return TRUE /obj/item/storage/contents_explosion(severity, target) for(var/atom/A in contents) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index a4d9636414..3d5f0dc924 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -24,9 +24,9 @@ /obj/item/storage/backpack/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_combined_w_class = 21 - STR.max_w_class = WEIGHT_CLASS_NORMAL - STR.max_items = 21 + STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_volume = STORAGE_VOLUME_BACKPACK + STR.max_w_class = MAX_WEIGHT_CLASS_BACKPACK /* * Backpack Types @@ -64,9 +64,9 @@ /obj/item/storage/backpack/holding/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.allow_big_nesting = TRUE - STR.max_w_class = WEIGHT_CLASS_BULKY - STR.max_combined_w_class = 35 + STR.max_w_class = MAX_WEIGHT_CLASS_BAG_OF_HOLDING + STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_volume = STORAGE_VOLUME_BAG_OF_HOLDING /obj/item/storage/backpack/holding/suicide_act(mob/living/user) user.visible_message("[user] is jumping into [src]! It looks like [user.p_theyre()] trying to commit suicide.") @@ -344,7 +344,7 @@ /obj/item/storage/backpack/duffelbag/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_combined_w_class = 30 + STR.max_volume = STORAGE_VOLUME_DUFFLEBAG /obj/item/storage/backpack/duffelbag/captain name = "captain's duffel bag" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 103dabdeec..ee515d321f 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -61,7 +61,7 @@ switch(contents.len) if(0) icon_state = "[initial(icon_state)]" - if(0 to 11) + if(1 to 11) icon_state = "[initial(icon_state)]1" if(11 to 20) icon_state = "[initial(icon_state)]2" @@ -382,16 +382,16 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bag" desc = "A bag for storing pills, patches, and bottles." - w_class = WEIGHT_CLASS_TINY + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET resistance_flags = FLAMMABLE /obj/item/storage/bag/chemistry/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_combined_w_class = 200 - STR.max_items = 50 + STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_volume = STORAGE_VOLUME_CHEMISTRY_BAG STR.insert_preposition = "in" - STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/syringe/dart)) + STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/syringe/dart, /obj/item/reagent_containers/chem_pack)) /* * Biowaste bag (mostly for xenobiologists) @@ -402,7 +402,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "biobag" desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." - w_class = WEIGHT_CLASS_TINY + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET resistance_flags = FLAMMABLE /obj/item/storage/bag/bio/ComponentInitialize() @@ -412,7 +412,7 @@ STR.max_combined_w_class = 200 STR.max_items = 25 STR.insert_preposition = "in" - STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube, /obj/item/organ, /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/bodypart)) + STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/cube, /obj/item/organ, /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/bodypart)) STR.cant_hold = typecacheof(list(/obj/item/organ/brain, /obj/item/organ/liver/cybernetic, /obj/item/organ/heart/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/tongue/cybernetic, /obj/item/organ/ears/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/cyberimp)) /obj/item/storage/bag/bio/holding @@ -427,3 +427,21 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = INFINITY STR.max_items = 100 + +/obj/item/storage/bag/ammo + name = "ammo pouch" + desc = "A pouch for your ammo that goes in your pocket." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "ammopouch" + slot_flags = ITEM_SLOT_POCKET + w_class = WEIGHT_CLASS_BULKY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/ammo/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = 30 + STR.max_items = 3 + STR.display_numerical_stacking = FALSE + STR.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) \ No newline at end of file diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 0a29562d6b..4a396c9210 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -22,7 +22,7 @@ for(var/obj/item/I in contents) . += I.get_belt_overlay() -/obj/item/storage/belt/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/storage/belt/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands && onmob_overlays) for(var/obj/item/I in contents) @@ -43,6 +43,7 @@ icon_state = "utilitybelt" item_state = "utility" content_overlays = TRUE + custom_premium_price = 300 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //because this is easier than trying to have showers wash all contents. /obj/item/storage/belt/utility/ComponentInitialize() @@ -179,7 +180,8 @@ /obj/item/implantcase, /obj/item/implant, /obj/item/implanter, - /obj/item/pinpointer/crew + /obj/item/pinpointer/crew, + /obj/item/reagent_containers/chem_pack )) /obj/item/storage/belt/medical/surgery_belt_adv @@ -511,16 +513,16 @@ new /obj/item/grenade/smokebomb(src) new /obj/item/grenade/empgrenade(src) new /obj/item/grenade/empgrenade(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) - new /obj/item/grenade/syndieminibomb/concussion/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) new /obj/item/grenade/gluon(src) new /obj/item/grenade/gluon(src) new /obj/item/grenade/gluon(src) @@ -695,7 +697,10 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box, /obj/item/toy/gun, - /obj/item/gun/energy/e_gun/mini + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/ballistic/automatic/magrifle/pistol, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/taser )) /obj/item/storage/belt/holster/full/PopulateContents() @@ -708,6 +713,8 @@ desc = "A dorky fannypack for keeping small items in." icon_state = "fannypack_leather" item_state = "fannypack_leather" + dying_key = DYE_REGISTRY_FANNYPACK + custom_price = PRICE_ALMOST_CHEAP /obj/item/storage/belt/fannypack/ComponentInitialize() . = ..() @@ -804,3 +811,4 @@ attack_verb = list("bashed", "slashes", "prods", "pokes") fitting_swords = list(/obj/item/melee/rapier) starting_sword = /obj/item/melee/rapier + diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index a67757a535..cdd3781748 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -275,6 +275,16 @@ for(var/i in 1 to 7) new /obj/item/grenade/flashbang(src) +obj/item/storage/box/stingbangs + name = "box of stingbangs (WARNING)" + desc = "WARNING: These devices are extremely dangerous and can cause severe injuries or death in repeated use." + icon_state = "secbox" + illustration = "flashbang" + +/obj/item/storage/box/stingbangs/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/grenade/stingbang(src) + /obj/item/storage/box/flashes name = "box of flashbulbs" desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required." @@ -434,6 +444,7 @@ desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes." icon_state = "donkpocketbox" illustration=null + custom_premium_price = PRICE_ABOVE_NORMAL // git gud /obj/item/storage/box/donkpockets/ComponentInitialize() . = ..() @@ -454,11 +465,11 @@ . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 7 - STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/monkeycube)) + STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/cube/monkey)) /obj/item/storage/box/monkeycubes/PopulateContents() for(var/i in 1 to 5) - new /obj/item/reagent_containers/food/snacks/monkeycube(src) + new /obj/item/reagent_containers/food/snacks/cube/monkey(src) /obj/item/storage/box/ids name = "box of spare IDs" @@ -622,6 +633,7 @@ item_state = "zippo" w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT + custom_price = PRICE_REALLY_CHEAP /obj/item/storage/box/matches/ComponentInitialize() . = ..() @@ -743,8 +755,8 @@ ////// /obj/item/storage/box/hug/medical/PopulateContents() - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/ointment(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/mesh(src) new /obj/item/reagent_containers/hypospray/medipen(src) // Clown survival box @@ -850,12 +862,6 @@ -#define NODESIGN "None" -#define NANOTRASEN "NanotrasenStandard" -#define SYNDI "SyndiSnacks" -#define HEART "Heart" -#define SMILEY "SmileyFace" - /obj/item/storage/box/papersack name = "paper sack" desc = "A sack neatly crafted out of paper." @@ -863,7 +869,18 @@ item_state = "paperbag_None" resistance_flags = FLAMMABLE foldable = null - var/design = NODESIGN + /// A list of all available papersack reskins + var/list/papersack_designs = list() + +/obj/item/storage/box/papersack/Initialize(mapload) + . = ..() + papersack_designs = sortList(list( + "None" = image(icon = src.icon, icon_state = "paperbag_None"), + "NanotrasenStandard" = image(icon = src.icon, icon_state = "paperbag_NanotrasenStandard"), + "SyndiSnacks" = image(icon = src.icon, icon_state = "paperbag_SyndiSnacks"), + "Heart" = image(icon = src.icon, icon_state = "paperbag_Heart"), + "SmileyFace" = image(icon = src.icon, icon_state = "paperbag_SmileyFace") + )) /obj/item/storage/box/papersack/update_icon_state() if(contents.len == 0) @@ -871,55 +888,64 @@ else icon_state = "[item_state]_closed" + /obj/item/storage/box/papersack/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) - //if a pen is used on the sack, dialogue to change its design appears - if(contents.len) - to_chat(user, "You can't modify [src] with items still inside!") - return - var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILEY, "Cancel") - var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) in designs - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away!") - return - var/choice = designs.Find(switchDesign) - if(design == designs[choice] || designs[choice] == "Cancel") - return 0 - to_chat(usr, "You make some modifications to [src] using your pen.") - design = designs[choice] - icon_state = "paperbag_[design]" - item_state = "paperbag_[design]" - switch(designs[choice]) - if(NODESIGN) + var/choice = show_radial_menu(user, src , papersack_designs, custom_check = CALLBACK(src, .proc/check_menu, user, W), radius = 36, require_near = TRUE) + if(!choice) + return FALSE + if(icon_state == "paperbag_[choice]") + return FALSE + switch(choice) + if("None") desc = "A sack neatly crafted out of paper." - if(NANOTRASEN) + if("NanotrasenStandard") desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go." - if(SYNDI) + if("SyndiSnacks") desc = "The design on this paper sack is a remnant of the notorious 'SyndieSnacks' program." - if(HEART) + if("Heart") desc = "A paper sack with a heart etched onto the side." - if(SMILEY) + if("SmileyFace") desc = "A paper sack with a crude smile etched onto the side." - return 0 + else + return FALSE + to_chat(user, "You make some modifications to [src] using your pen.") + icon_state = "paperbag_[choice]" + item_state = "paperbag_[choice]" + return FALSE else if(W.get_sharpness()) if(!contents.len) if(item_state == "paperbag_None") user.show_message("You cut eyeholes into [src].", MSG_VISUAL) new /obj/item/clothing/head/papersack(user.loc) qdel(src) - return 0 + return FALSE else if(item_state == "paperbag_SmileyFace") user.show_message("You cut eyeholes into [src] and modify the design.", MSG_VISUAL) new /obj/item/clothing/head/papersack/smiley(user.loc) qdel(src) - return 0 + return FALSE return ..() -#undef NODESIGN -#undef NANOTRASEN -#undef SYNDI -#undef HEART -#undef SMILEY +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + * * P The pen used to interact with a menu + */ +/obj/item/storage/box/papersack/proc/check_menu(mob/user, obj/item/pen/P) + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + if(contents.len) + to_chat(user, "You can't modify [src] with items still inside!") + return FALSE + if(!P || !user.is_holding(P)) + to_chat(user, "You need a pen to modify [src]!") + return FALSE + return TRUE /obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef spawns with, it shouldn't actually exist. name = "ingredients box" @@ -953,7 +979,7 @@ /obj/item/reagent_containers/food/snacks/grown/corn, /obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet, /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle, - /obj/item/reagent_containers/food/snacks/faggot, + /obj/item/reagent_containers/food/snacks/meatball, /obj/item/reagent_containers/food/snacks/grown/citrus/orange, /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, /obj/item/reagent_containers/food/snacks/grown/citrus/lime, @@ -1005,7 +1031,7 @@ /obj/item/storage/box/ingredients/italian/PopulateContents() for(var/i in 1 to 3) new /obj/item/reagent_containers/food/snacks/grown/tomato(src) - new /obj/item/reagent_containers/food/snacks/faggot(src) + new /obj/item/reagent_containers/food/snacks/meatball(src) new /obj/item/reagent_containers/food/drinks/bottle/wine(src) /obj/item/storage/box/ingredients/vegetarian @@ -1028,7 +1054,7 @@ new /obj/item/reagent_containers/food/snacks/grown/potato(src) new /obj/item/reagent_containers/food/snacks/grown/tomato(src) new /obj/item/reagent_containers/food/snacks/grown/corn(src) - new /obj/item/reagent_containers/food/snacks/faggot(src) + new /obj/item/reagent_containers/food/snacks/meatball(src) /obj/item/storage/box/ingredients/fruity theme_name = "fruity" @@ -1084,7 +1110,7 @@ new /obj/item/reagent_containers/food/snacks/carpmeat(src) new /obj/item/reagent_containers/food/snacks/meat/slab/xeno(src) new /obj/item/reagent_containers/food/snacks/meat/slab/corgi(src) - new /obj/item/reagent_containers/food/snacks/faggot(src) + new /obj/item/reagent_containers/food/snacks/meatball(src) /obj/item/storage/box/ingredients/exotic theme_name = "exotic" @@ -1117,9 +1143,9 @@ desc = "A box containing a gift for worthy golems." /obj/item/storage/box/rndboards/PopulateContents() - new /obj/item/circuitboard/machine/protolathe(src) + new /obj/item/circuitboard/machine/protolathe/offstation(src) new /obj/item/circuitboard/machine/destructive_analyzer(src) - new /obj/item/circuitboard/machine/circuit_imprinter(src) + new /obj/item/circuitboard/machine/circuit_imprinter/offstation(src) new /obj/item/circuitboard/computer/rdconsole(src) /obj/item/storage/box/silver_sulf @@ -1328,6 +1354,7 @@ name = "box of marshmallows" desc = "A box of marshmallows." illustration = "marshmallow" + custom_premium_price = PRICE_BELOW_NORMAL /obj/item/storage/box/marshmallow/PopulateContents() for (var/i in 1 to 5) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 3bc90d3615..821fd52bd1 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -70,6 +70,7 @@ name = "donut box" spawn_type = /obj/item/reagent_containers/food/snacks/donut fancy_open = TRUE + custom_price = PRICE_NORMAL /obj/item/storage/fancy/donut_box/ComponentInitialize() . = ..() @@ -136,6 +137,23 @@ slot_flags = ITEM_SLOT_BELT icon_type = "cigarette" spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette + custom_price = PRICE_ALMOST_CHEAP + var/spawn_coupon = TRUE + +/obj/item/storage/fancy/cigarettes/attack_self(mob/user) + if(contents.len == 0 && spawn_coupon) + to_chat(user, "You rip the back off \the [src] and get a coupon!") + var/obj/item/coupon/attached_coupon = new + user.put_in_hands(attached_coupon) + attached_coupon.generate() + attached_coupon = null + spawn_coupon = FALSE + name = "discarded cigarette packet" + desc = "An old cigarette packet with the back torn off, worth less than nothing now." + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 0 + return + return ..() /obj/item/storage/fancy/cigarettes/ComponentInitialize() . = ..() @@ -146,6 +164,8 @@ /obj/item/storage/fancy/cigarettes/examine(mob/user) . = ..() . += "Alt-click to extract contents." + if(spawn_coupon) + . += "There's a coupon on the back of the pack! You can tear it off once it's empty." /obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) @@ -274,8 +294,10 @@ w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper_pack" +///The value in here has NOTHING to do with icons. It needs to be this for the proper examine. icon_type = "rolling paper" spawn_type = /obj/item/rollingpaper + custom_price = PRICE_REALLY_CHEAP /obj/item/storage/fancy/rollingpapers/ComponentInitialize() . = ..() @@ -283,6 +305,10 @@ STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/rollingpaper)) +///Overrides to do nothing because fancy boxes are fucking insane. +/obj/item/storage/fancy/rollingpapers/update_icon_state() + return + /obj/item/storage/fancy/rollingpapers/update_overlays() . = ..() if(!contents.len) @@ -300,6 +326,7 @@ w_class = WEIGHT_CLASS_NORMAL icon_type = "premium cigar" spawn_type = /obj/item/clothing/mask/cigarette/cigar + spawn_coupon = FALSE /obj/item/storage/fancy/cigarettes/cigars/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 01193d0e21..37b6baaa0b 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -37,10 +37,10 @@ if(empty) return new /obj/item/stack/medical/gauze(src) - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/ointment(src) - new /obj/item/stack/medical/ointment(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/mesh(src) + new /obj/item/stack/medical/mesh(src) new /obj/item/reagent_containers/hypospray/medipen(src) new /obj/item/healthanalyzer(src) @@ -52,12 +52,12 @@ if(empty) return new /obj/item/stack/medical/gauze(src) - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/bruise_pack(src) - new /obj/item/stack/medical/ointment(src) - new /obj/item/stack/medical/ointment(src) - new /obj/item/stack/medical/ointment(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/suture(src) + new /obj/item/stack/medical/mesh(src) + new /obj/item/stack/medical/mesh(src) + new /obj/item/stack/medical/mesh(src) /obj/item/storage/firstaid/fire name = "burn treatment kit" @@ -223,6 +223,8 @@ /obj/item/storage/pill_bottle/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.storage_flags = STORAGE_FLAGS_VOLUME_DEFAULT + STR.max_volume = STORAGE_VOLUME_PILL_BOTTLE STR.allow_quick_gather = TRUE STR.click_gather = TRUE STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/dice)) @@ -244,7 +246,7 @@ desc = "Contains pills used to counter radiation poisoning." /obj/item/storage/pill_bottle/anitrad/PopulateContents() - for(var/i in 1 to 5) + for(var/i in 1 to 4) new /obj/item/reagent_containers/pill/antirad(src) /obj/item/storage/pill_bottle/epinephrine @@ -276,7 +278,7 @@ desc = "Guaranteed to give you that extra burst of energy during a long shift!" /obj/item/storage/pill_bottle/stimulant/PopulateContents() - for(var/i in 1 to 5) + for(var/i in 1 to 4) new /obj/item/reagent_containers/pill/stimulant(src) /obj/item/storage/pill_bottle/mining @@ -373,7 +375,7 @@ ///////////// /obj/item/storage/belt/organbox - name = "Organ Storge" + name = "Organ Storage" desc = "A compact box that helps hold massive amounts of implants, organs, and some tools. Has a belt clip for easy carrying" w_class = WEIGHT_CLASS_BULKY icon = 'icons/obj/mysterybox.dmi' @@ -392,6 +394,12 @@ STR.can_hold = typecacheof(list( /obj/item/storage/pill_bottle, /obj/item/reagent_containers/hypospray, + /obj/item/pinpointer/crew, + /obj/item/tele_iv, + /obj/item/sequence_scanner, + /obj/item/sensor_device, + /obj/item/bodybag, + /obj/item/surgicaldrill/advanced, /obj/item/healthanalyzer, /obj/item/reagent_containers/syringe, /obj/item/clothing/glasses/hud/health, @@ -407,8 +415,11 @@ /obj/item/implantcase, /obj/item/implanter, /obj/item/circuitboard/computer/operating, + /obj/item/circuitboard/computer/crew, + /obj/item/stack/sheet/glass, /obj/item/stack/sheet/mineral/silver, - /obj/item/organ_storage + /obj/item/organ_storage, + /obj/item/reagent_containers/chem_pack )) //hijacking the minature first aids for hypospray boxes. <3 @@ -422,6 +433,8 @@ throw_range = 7 var/empty = FALSE item_state = "firstaid" + custom_price = PRICE_ABOVE_NORMAL + custom_premium_price = PRICE_EXPENSIVE /obj/item/storage/hypospraykit/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 5b6089d430..ce4e8b9df1 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -188,19 +188,52 @@ new /obj/item/clothing/accessory/medal/plasma/nobel_science(src) /obj/item/storage/lockbox/medal/engineering - name = "engineering medal box" - desc = "A locked box used to store medals to be given to the members of the engineering department." - req_access = list(ACCESS_CE) + name = "engineering medal box" + desc = "A locked box used to store medals to be given to the members of the engineering department." + req_access = list(ACCESS_CE) /obj/item/storage/lockbox/medal/engineering/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/clothing/accessory/medal/engineer(src) + for(var/i in 1 to 3) + new /obj/item/clothing/accessory/medal/engineer(src) /obj/item/storage/lockbox/medal/medical - name = "medical medal box" - desc = "A locked box used to store medals to be given to the members of the medical department." - req_access = list(ACCESS_CMO) + name = "medical medal box" + desc = "A locked box used to store medals to be given to the members of the medical department." + req_access = list(ACCESS_CMO) /obj/item/storage/lockbox/medal/medical/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src) \ No newline at end of file + for(var/i in 1 to 3) + new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src) + +/obj/item/storage/lockbox/order + name = "order lockbox" + desc = "A box used to secure small cargo orders from being looted by those who didn't order it. Yeah, cargo tech, that means you." + icon = 'icons/obj/storage.dmi' + icon_state = "secure" + item_state = "sec-case" + lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi' + w_class = WEIGHT_CLASS_HUGE + var/datum/bank_account/buyer_account + var/privacy_lock = TRUE + +/obj/item/storage/lockbox/order/Initialize(datum/bank_account/_buyer_account) + . = ..() + buyer_account = _buyer_account + +/obj/item/storage/lockbox/order/attackby(obj/item/W, mob/user, params) + if(!istype(W, /obj/item/card/id)) + return ..() + + var/obj/item/card/id/id_card = W + if(iscarbon(user)) + add_fingerprint(user) + + if(id_card.registered_account != buyer_account) + to_chat(user, "Bank account does not match with buyer![user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock.", + "You [privacy_lock ? "" : "un"]lock [src]'s privacy lock.") diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index e177a9f9fd..0e9a9fda61 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -105,10 +105,7 @@ if (length(code) > 5) code = "ERROR" add_fingerprint(usr) - for(var/mob/M in viewers(1, loc)) - if ((M.client && M.machine == src)) - attack_self(M) - return + attack_self(usr) return @@ -150,6 +147,35 @@ for(var/i = 0, i < STR.max_items - 2, i++) new /obj/item/stack/spacecash/c1000(src) +/obj/item/storage/secure/briefcase/mws_pack + name = "\improper \'MWS\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + +/obj/item/storage/secure/briefcase/mws_pack/PopulateContents() + new /obj/item/gun/ballistic/revolver/mws(src) + new /obj/item/ammo_box/magazine/mws_mag(src) + for(var/path in subtypesof(/obj/item/ammo_casing/mws_batt)) + new path(src) + +/obj/item/storage/secure/briefcase/hos/mws_pack_hos + name = "\improper \'MWS\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + +/obj/item/storage/secure/briefcase/hos/mws_pack_hos/PopulateContents() + new /obj/item/gun/ballistic/revolver/mws(src) + new /obj/item/ammo_box/magazine/mws_mag(src) + new /obj/item/ammo_casing/mws_batt/lethal(src) + new /obj/item/ammo_casing/mws_batt/lethal(src) + new /obj/item/ammo_casing/mws_batt/stun(src) + new /obj/item/ammo_casing/mws_batt/stun(src) + new /obj/item/ammo_casing/mws_batt/ion(src) + +/obj/item/storage/secure/briefcase/hos/multiphase_box + name = "\improper X-01 Multiphase energy gun box" + desc = "A storage case for a high-tech energy firearm." + +/obj/item/storage/secure/briefcase/hos/multiphase_box/PopulateContents() + new /obj/item/gun/energy/e_gun/hos(src) // ----------------------------- // Secure Safe @@ -158,6 +184,7 @@ /obj/item/storage/secure/safe name = "secure safe" icon = 'icons/obj/storage.dmi' + plane = ABOVE_WALL_PLANE icon_state = "safe" icon_opened = "safe0" icon_locking = "safeb" diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 50620b90fe..7e89ddbd8d 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -16,12 +16,17 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) attack_verb = list("robusted") hitsound = 'sound/weapons/smash.ogg' custom_materials = list(/datum/material/iron = 500) - material_flags = MATERIAL_COLOR var/latches = "single_latch" var/has_latches = TRUE var/can_rubberify = TRUE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too +/obj/item/storage/toolbox/greyscale + icon_state = "toolbox_default" + item_state = "toolbox_default" + can_rubberify = FALSE + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS + /obj/item/storage/toolbox/Initialize(mapload) if(has_latches) if(prob(10)) @@ -48,7 +53,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) name = "emergency toolbox" icon_state = "red" item_state = "toolbox_red" - material_flags = NONE /obj/item/storage/toolbox/emergency/PopulateContents() new /obj/item/crowbar/red(src) @@ -73,7 +77,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) name = "mechanical toolbox" icon_state = "blue" item_state = "toolbox_blue" - material_flags = NONE /obj/item/storage/toolbox/mechanical/PopulateContents() new /obj/item/screwdriver(src) @@ -102,7 +105,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) name = "electrical toolbox" icon_state = "yellow" item_state = "toolbox_yellow" - material_flags = NONE /obj/item/storage/toolbox/electrical/PopulateContents() var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") @@ -124,7 +126,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) desc = "A toolbox painted black with a red stripe. It looks more heavier than normal toolboxes." force = 15 throwforce = 18 - material_flags = NONE /obj/item/storage/toolbox/syndicate/ComponentInitialize() . = ..() @@ -138,13 +139,12 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) new /obj/item/crowbar/red(src) new /obj/item/wirecutters(src, "red") new /obj/item/multitool(src) - new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/gloves/tackler/combat/insulated(src) /obj/item/storage/toolbox/drone name = "mechanical toolbox" icon_state = "blue" item_state = "toolbox_blue" - material_flags = NONE /obj/item/storage/toolbox/drone/PopulateContents() var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") @@ -166,7 +166,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) w_class = WEIGHT_CLASS_HUGE attack_verb = list("robusted", "crushed", "smashed") can_rubberify = FALSE - material_flags = NONE var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab /obj/item/storage/toolbox/brass/ComponentInitialize() @@ -209,7 +208,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) w_class = WEIGHT_CLASS_HUGE //heyo no bohing this! force = 18 //spear damage can_rubberify = FALSE - material_flags = NONE /obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity) . = ..() @@ -225,7 +223,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) icon_state = "green" item_state = "toolbox_green" w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox! - material_flags = NONE /obj/item/storage/toolbox/artistic/ComponentInitialize() . = ..() @@ -302,7 +299,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) icon_state = "gold" item_state = "toolbox_gold" has_latches = FALSE - material_flags = NONE /obj/item/storage/toolbox/gold_real/PopulateContents() new /obj/item/screwdriver/nuke(src) @@ -311,7 +307,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) new /obj/item/crowbar/red(src) new /obj/item/wirecutters(src, "red") new /obj/item/multitool/ai_detect(src) - new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/gloves/tackler/combat/insulated(src) /obj/item/storage/toolbox/gold_real/ComponentInitialize() . = ..() @@ -328,7 +324,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) force = 0 throwforce = 0 can_rubberify = FALSE - material_flags = NONE /obj/item/storage/toolbox/proc/rubberify() name = "rubber [name]" @@ -364,7 +359,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) throwforce = 15 attack_verb = list("robusted", "bounced") can_rubberify = FALSE //we are already the future. - material_flags = NONE /obj/item/storage/toolbox/rubber/Initialize() icon_state = pick("blue", "red", "yellow", "green") diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 037ae51e30..ffa3d83304 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -294,18 +294,18 @@ name = "chameleon kit" /obj/item/storage/box/syndie_kit/chameleon/PopulateContents() - new /obj/item/clothing/under/chameleon(src) - new /obj/item/clothing/suit/chameleon(src) - new /obj/item/clothing/gloves/chameleon(src) - new /obj/item/clothing/shoes/chameleon(src) - new /obj/item/clothing/glasses/chameleon(src) - new /obj/item/clothing/head/chameleon(src) - new /obj/item/clothing/mask/chameleon(src) - new /obj/item/storage/backpack/chameleon(src) - new /obj/item/radio/headset/chameleon(src) - new /obj/item/stamp/chameleon(src) - new /obj/item/pda/chameleon(src) - new /obj/item/clothing/neck/cloak/chameleon(src) + new /obj/item/clothing/under/chameleon/syndicate(src) + new /obj/item/clothing/suit/chameleon/syndicate(src) + new /obj/item/clothing/gloves/chameleon/insulated/syndicate(src) + new /obj/item/clothing/shoes/chameleon/syndicate(src) + new /obj/item/clothing/glasses/chameleon/syndicate(src) + new /obj/item/clothing/head/chameleon/syndicate(src) + new /obj/item/clothing/mask/chameleon/syndicate(src) + new /obj/item/storage/backpack/chameleon/syndicate(src) + new /obj/item/radio/headset/chameleon/syndicate(src) + new /obj/item/stamp/chameleon/syndicate(src) + new /obj/item/pda/chameleon/syndicate(src) + new /obj/item/clothing/neck/cloak/chameleon/syndicate(src) //5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars. //Not counting the damage it will do while embedded (2*4 = 8, at 15% chance) @@ -404,6 +404,12 @@ new /obj/item/gun/ballistic/revolver(src) new /obj/item/ammo_box/a357(src) +/obj/item/storage/box/syndie_kit/pistol + +/obj/item/storage/box/syndie_kit/pistol/PopulateContents() + new /obj/item/gun/ballistic/automatic/pistol(src) + new /obj/item/ammo_box/magazine/m10mm(src) + /obj/item/storage/box/syndie_kit/contract_kit name = "contractor kit" desc = "Supplied to Syndicate contractors in active mission areas." @@ -494,4 +500,14 @@ new item1(src) // Create three, non repeat items from the list. new item2(src) new item3(src) - new /obj/item/paper/contractor_guide(src) //Paper guide \ No newline at end of file + new /obj/item/paper/contractor_guide(src) //Paper guide + +/obj/item/storage/box/syndie_kit/northstar + +/obj/item/storage/box/syndie_kit/northstar/PopulateContents() + new /obj/item/clothing/gloves/fingerless/pugilist/rapid(src) + new /obj/item/clothing/accessory/padding(src) + new /obj/item/clothing/under/chameleon(src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) + new /obj/item/lighter(src) + diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 27cd9c8908..0b4b6f54f3 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -16,6 +16,7 @@ STR.cant_hold = typecacheof(list(/obj/item/screwdriver/power)) STR.can_hold = typecacheof(list( /obj/item/stack/spacecash, + /obj/item/holochip, /obj/item/card, /obj/item/clothing/mask/cigarette, /obj/item/flashlight/pen, @@ -101,17 +102,5 @@ icon_state = "random_wallet" /obj/item/storage/wallet/random/PopulateContents() - var/item1_type = pick( /obj/item/stack/spacecash/c10, /obj/item/stack/spacecash/c100, /obj/item/stack/spacecash/c1000, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500) - var/item2_type - if(prob(50)) - item2_type = pick( /obj/item/stack/spacecash/c10, /obj/item/stack/spacecash/c100, /obj/item/stack/spacecash/c1000, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c200, /obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500) - var/item3_type = pick( /obj/item/coin/silver, /obj/item/coin/silver, /obj/item/coin/gold, /obj/item/coin/iron, /obj/item/coin/iron, /obj/item/coin/iron ) - - spawn(2) - if(item1_type) - new item1_type(src) - if(item2_type) - new item2_type(src) - if(item3_type) - new item3_type(src) - update_icon() + new /obj/item/holochip(src, rand(5,30)) + icon_state = "wallet" diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 64a0026424..fa0c9ba693 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -16,7 +16,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) var/stamforce = 35 - var/status = FALSE + var/turned_on = FALSE var/knockdown = TRUE var/obj/item/stock_parts/cell/cell var/hitcost = 750 @@ -49,7 +49,7 @@ /obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling - if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) + if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom)) baton_stun(hit_atom) /obj/item/melee/baton/loaded //this one starts with a cell pre-installed. @@ -66,16 +66,16 @@ copper_top.use(min(chrgdeductamt, copper_top.charge), explode) if(QDELETED(src)) return FALSE - if(status && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY)))) + if(turned_on && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY)))) //we're below minimum, turn off switch_status(FALSE) /obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE) - if(status != new_status) - status = new_status + if(turned_on != new_status) + turned_on = new_status if(!silent) playsound(loc, "sparks", 75, 1, -1) - if(status) + if(turned_on) START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) @@ -85,7 +85,7 @@ deductcharge(round(hitcost * STUNBATON_DEPLETION_RATE), FALSE, FALSE) /obj/item/melee/baton/update_icon_state() - if(status) + if(turned_on) icon_state = "[initial(name)]_active" else if(!cell) icon_state = "[initial(name)]_nocell" @@ -134,14 +134,14 @@ else to_chat(user, "[src] is out of charge.") else - switch_status(!status) - to_chat(user, "[src] is now [status ? "on" : "off"].") + switch_status(!turned_on) + to_chat(user, "[src] is now [turned_on ? "on" : "off"].") add_fingerprint(user) /obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) var/interrupt = common_baton_melee(M, user, FALSE) if(!interrupt) - ..() + return ..() /obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params) . = common_baton_melee(A, user, TRUE) //return true (attackchain interrupt) if this also returns true. no harm-disarming. @@ -151,29 +151,31 @@ /obj/item/melee/baton/proc/common_baton_melee(mob/M, mob/living/user, disarming = FALSE) if(iscyborg(M) || !isliving(M)) //can't baton cyborgs return FALSE - if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + if(turned_on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) clowning_around(user) if(IS_STAMCRIT(user)) //CIT CHANGE - makes it impossible to baton in stamina softcrit - to_chat(user, "You're too exhausted for that.") + to_chat(user, "You're too exhausted to use [src] properly.") return TRUE if(ishuman(M)) var/mob/living/carbon/human/L = M if(check_martial_counter(L, user)) return TRUE - if(status) + if(turned_on) if(baton_stun(M, user, disarming)) user.do_attack_animation(M) - user.adjustStaminaLossBuffered(getweight()) //CIT CHANGE - makes stunbatonning others cost stamina + user.adjustStaminaLossBuffered(getweight(user, STAM_COST_BATON_MOB_MULT)) else if(user.a_intent != INTENT_HARM) //they'll try to bash in the last proc. M.visible_message("[user] has prodded [M] with [src]. Luckily it was off.", \ "[user] has prodded you with [src]. Luckily it was off") return disarming || (user.a_intent != INTENT_HARM) /obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user, disarming = FALSE) - if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + var/list/return_list = list() + if(L.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; check_shields() handles that playsound(L, 'sound/weapons/genhit.ogg', 50, 1) return FALSE var/stunpwr = stamforce + stunpwr = block_calculate_resultant_damage(stunpwr, return_list) var/obj/item/stock_parts/cell/our_cell = get_cell() if(!our_cell) switch_status(FALSE) @@ -232,11 +234,8 @@ /obj/item/melee/baton/stunsword name = "stunsword" desc = "not actually sharp, this sword is functionally identical to a stunbaton" - icon = 'modular_citadel/icons/obj/stunsword.dmi' icon_state = "stunsword" item_state = "sword" - lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi' - righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi' /obj/item/melee/baton/stunsword/get_belt_overlay() if(istype(loc, /obj/item/storage/belt/sabre)) @@ -295,6 +294,48 @@ sparkler?.activate() . = ..() +/obj/item/melee/baton/boomerang + name = "\improper OZtek Boomerang" + desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!" + throw_speed = 1 + icon_state = "boomerang" + item_state = "boomerang" + force = 5 + throwforce = 5 + throw_range = 5 + hitcost = 2000 + throw_hit_chance = 99 //Have you prayed today? + custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) + +/obj/item/melee/baton/boomerang/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force) + if(turned_on) + if(ishuman(thrower)) + var/mob/living/carbon/human/H = thrower + H.throw_mode_off() //so they can catch it on the return. + return ..() + +/obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(turned_on) + var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) + if(ishuman(hit_atom) && !caught && prob(throw_hit_chance))//if they are a carbon and they didn't catch it + baton_stun(hit_atom) + if(thrownby && !caught) + sleep(1) + if(!QDELETED(src)) + throw_at(thrownby, throw_range+2, throw_speed, null, TRUE) + else + return ..() + +/obj/item/melee/baton/boomerang/update_icon() + if(turned_on) + icon_state = "[initial(icon_state)]_active" + else if(!cell) + icon_state = "[initial(icon_state)]_nocell" + else + icon_state = "[initial(icon_state)]" + +/obj/item/melee/baton/boomerang/loaded //Same as above, comes with a cell. + preload_cell_type = /obj/item/stock_parts/cell/high #undef STUNBATON_CHARGE_LENIENCY #undef STUNBATON_DEPLETION_RATE diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index f592055338..817258d1c7 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -14,13 +14,15 @@ var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not var/datum/effect_system/trail_follow/ion/ion_trail -/obj/item/tank/jetpack/New() +/obj/item/tank/jetpack/Initialize() ..() + ion_trail = new + ion_trail.set_up(src) + +/obj/item/tank/jetpack/populate_gas() if(gas_type) air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) - ion_trail = new - ion_trail.set_up(src) /obj/item/tank/jetpack/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_jetpack)) @@ -52,7 +54,7 @@ ion_trail.start() RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react) if(full_speed) - user.add_movespeed_modifier(MOVESPEED_ID_JETPACK, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK) + user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) /obj/item/tank/jetpack/proc/turn_off(mob/user) on = FALSE @@ -60,7 +62,7 @@ icon_state = initial(icon_state) ion_trail.stop() UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - user.remove_movespeed_modifier(MOVESPEED_ID_JETPACK) + user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) /obj/item/tank/jetpack/proc/move_react(mob/user) allow_thrust(0.01, user) @@ -188,8 +190,8 @@ var/obj/item/tank/internals/tank = null var/mob/living/carbon/human/cur_user -/obj/item/tank/jetpack/suit/New() - ..() +/obj/item/tank/jetpack/suit/Initialize() + . = ..() STOP_PROCESSING(SSobj, src) temp_air_contents = air_contents diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 0e6dfaa1b3..b4c8d8adf0 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -12,15 +12,13 @@ */ /obj/item/tank/internals/oxygen name = "oxygen tank" - desc = "A tank of oxygen." + desc = "A tank of oxygen, this one is blue." icon_state = "oxygen" distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE force = 10 dog_fashion = /datum/dog_fashion/back - -/obj/item/tank/internals/oxygen/New() - ..() +/obj/item/tank/internals/oxygen/populate_gas() air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return @@ -35,6 +33,8 @@ icon_state = "oxygen_fr" dog_fashion = null +/obj/item/tank/internals/oxygen/empty/populate_gas() + return /* * Anesthetic @@ -46,11 +46,9 @@ item_state = "an_tank" force = 10 -/obj/item/tank/internals/anesthetic/New() - ..() +/obj/item/tank/internals/anesthetic/populate_gas() air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return /* * Air @@ -63,11 +61,9 @@ force = 10 dog_fashion = /datum/dog_fashion/back -/obj/item/tank/internals/air/New() - ..() +/obj/item/tank/internals/air/populate_gas() air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return /* @@ -82,10 +78,8 @@ force = 8 -/obj/item/tank/internals/plasma/New() - ..() +/obj/item/tank/internals/plasma/populate_gas() air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/flamethrower)) @@ -99,12 +93,12 @@ F.update_icon() else return ..() - -/obj/item/tank/internals/plasma/full/New() - ..() // Plasma asserted in parent - air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) +//Makes empty oxygen tanks spawn without gas +/obj/item/tank/internals/plasma/empty/populate_gas() return +/obj/item/tank/internals/plasma/full/populate_gas() + air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /* * Plasmaman Plasma Tank @@ -118,13 +112,10 @@ force = 10 distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE -/obj/item/tank/internals/plasmaman/New() - ..() +/obj/item/tank/internals/plasmaman/populate_gas() air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return -/obj/item/tank/internals/plasmaman/full/New() - ..() // Plasma asserted in parent +/obj/item/tank/internals/plasmaman/full/populate_gas() air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return @@ -137,12 +128,13 @@ volume = 6 w_class = WEIGHT_CLASS_SMALL //thanks i forgot this -/obj/item/tank/internals/plasmaman/belt/full/New() - ..() // Plasma asserted in parent +/obj/item/tank/internals/plasmaman/belt/full/populate_gas() air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return - +//makes empty plasma tanks spawn without gas. +/obj/item/tank/internals/plasmaman/belt/empty/populate_gas() + return /* * Emergency Oxygen @@ -159,17 +151,25 @@ volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) -/obj/item/tank/internals/emergency_oxygen/New() - ..() +/obj/item/tank/internals/emergency_oxygen/populate_gas() air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return +/obj/item/tank/internals/emergency_oxygen/empty/populate_gas() + return + /obj/item/tank/internals/emergency_oxygen/engi name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" volume = 6 +/obj/item/tank/internals/emergency_oxygen/engi/empty/populate_gas() + return + /obj/item/tank/internals/emergency_oxygen/double name = "double emergency oxygen tank" icon_state = "emergency_double" volume = 10 + +/obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas() + return \ No newline at end of file diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 58e16ad615..00fbc41516 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -60,14 +60,19 @@ H.update_action_buttons_icon() -/obj/item/tank/New() - ..() +/obj/item/tank/Initialize() + . = ..() air_contents = new(volume) //liters air_contents.temperature = T20C + populate_gas() + START_PROCESSING(SSobj, src) +/obj/item/tank/proc/populate_gas() + return + /obj/item/tank/Destroy() if(air_contents) qdel(air_contents) @@ -78,9 +83,9 @@ /obj/item/tank/examine(mob/user) var/obj/icon = src . = ..() - if (istype(src.loc, /obj/item/assembly)) + if(istype(src.loc, /obj/item/assembly)) icon = src.loc - if(!in_range(src, user)) + if(!in_range(src, user) && !isobserver(user)) if (icon == src) . += "If you want any more information you'll need to get closer." return @@ -148,6 +153,10 @@ return (BRUTELOSS) +/obj/item/tank/attack_ghost(mob/dead/observer/O) + . = ..() + atmosanalyzer_scan(air_contents, O, src, FALSE) + /obj/item/tank/attackby(obj/item/W, mob/user, params) add_fingerprint(user) if(istype(W, /obj/item/assembly_holder)) @@ -204,7 +213,7 @@ pressure = text2num(pressure) . = TRUE if(.) - distribute_pressure = CLAMP(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) + distribute_pressure = clamp(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) /obj/item/tank/remove_air(amount) return air_contents.remove(amount) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index c1cbf534ca..b1c0d3dfbb 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -145,6 +145,7 @@ desc = "A janitorial watertank backpack with nozzle to clean dirt and graffiti." icon_state = "waterbackpackjani" item_state = "waterbackpackjani" + custom_price = PRICE_ALMOST_ONE_GRAND /obj/item/watertank/janitor/Initialize() . = ..() @@ -209,6 +210,7 @@ power = 8 force = 10 precision = 1 + total_mass = 0.2 cooling_power = 5 w_class = WEIGHT_CLASS_HUGE item_flags = ABSTRACT // don't put in storage @@ -376,8 +378,8 @@ filling.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(filling) -/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) //apply chemcolor and level - . = list() +/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) //apply chemcolor and level + . = ..() //inhands + reagent_filling if(!isinhands && reagents.total_volume) var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index b5edb27704..881e4d5f1a 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -104,7 +104,7 @@ if (ismob(src.loc)) attack_self(src.loc) else - for(var/mob/M in viewers(1, src)) + for(var/mob/M in fov_viewers(1, src)) if (M.client) src.attack_self(M) return diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 6fbf9316ed..08390e1607 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -256,7 +256,7 @@ . = ..() if(!sliver) return - if(proximity && ismovableatom(O) && O != sliver) + if(proximity && ismovable(O) && O != sliver) Consume(O, user) /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins diff --git a/code/game/objects/items/tools/saw.dm b/code/game/objects/items/tools/saw.dm new file mode 100644 index 0000000000..aab59c00be --- /dev/null +++ b/code/game/objects/items/tools/saw.dm @@ -0,0 +1,47 @@ +/obj/item/hatchet/saw + name = "handsaw" + desc = "A very sharp handsaw, it's compact." + icon = 'icons/obj/tools.dmi' + icon_state = "saw" + item_state = "sawhandle_greyscale" + lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' + tool_behaviour = TOOL_SAW + force = 10 + throwforce = 8 + throw_speed = 3 + throw_range = 5 + custom_materials = list(/datum/material/iron = 5000) + attack_verb = list("sawed", "sliced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = IS_SHARP + var/random_color = TRUE //code taken from screwdrivers.dm; cool handles are cool. + var/static/list/saw_colors = list( + "blue" = rgb(24, 97, 213), + "red" = rgb(255, 0, 0), + "pink" = rgb(213, 24, 141), + "brown" = rgb(160, 82, 18), + "green" = rgb(14, 127, 27), + "cyan" = rgb(24, 162, 213), + "yellow" = rgb(255, 165, 0) + ) + +/obj/item/hatchet/saw/Initialize() + . = ..() + if(random_color) + icon_state = "sawhandle_greyscale" + var/our_color = pick(saw_colors) + add_atom_colour(saw_colors[our_color], FIXED_COLOUR_PRIORITY) + update_icon() + if(prob(75)) + pixel_y = rand(-8, 8) + +/obj/item/hatchet/saw/update_overlays() + . = ..() + if(!random_color) //icon override + return + var/mutable_appearance/base_overlay = mutable_appearance(icon, "sawblade") + base_overlay.appearance_flags = RESET_COLOR + . += base_overlay + +// END \ No newline at end of file diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 0d2892cb4a..e9f517a9f1 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -53,8 +53,8 @@ base_overlay.appearance_flags = RESET_COLOR . += base_overlay -/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(isinhands && random_color) var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head") M.appearance_flags = RESET_COLOR diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ba51fa3d65..cd630a2c82 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -241,11 +241,13 @@ playsound(user, activation_sound, transform_volume, 1) w_class = WEIGHT_CLASS_BULKY AddElement(/datum/element/sword_point) + total_mass = total_mass_on else to_chat(user, "[deactivation_message]") playsound(user, deactivation_sound, transform_volume, 1) w_class = WEIGHT_CLASS_SMALL RemoveElement(/datum/element/sword_point) + total_mass = initial(total_mass) update_icon() add_fingerprint(user) @@ -273,15 +275,12 @@ var/obj/item/twohanded/dualsaber/toy/newSaber = new /obj/item/twohanded/dualsaber/toy(user.loc) if(hacked) // That's right, we'll only check the "original" "sword". newSaber.hacked = TRUE - newSaber.item_color = "rainbow" qdel(W) qdel(src) else if(istype(W, /obj/item/multitool)) if(!hacked) hacked = TRUE - item_color = "rainbow" to_chat(user, "RNBW_ENGAGE") - if(active) update_icon() user.update_inv_hands() @@ -290,9 +289,6 @@ else return ..() -/obj/item/toy/sword/getweight() - return (active ? total_mass_on : total_mass) || w_class *1.25 - /obj/item/toy/sword/cx name = "\improper DX Non-Euplastic LightSword" desc = "A deluxe toy replica of an energy sword. Realistic visuals and sounds! Ages 8 and up." @@ -352,7 +348,7 @@ update_light() return TRUE -/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(active) if(isinhands) @@ -450,15 +446,13 @@ throw_range = 5 force_unwielded = 0 force_wielded = 0 + block_parry_data = null attack_verb = list("attacked", "struck", "hit") total_mass_on = TOTAL_MASS_TOY_SWORD sharpness = IS_BLUNT -/obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return FALSE - -/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles - return FALSE +/obj/item/twohanded/dualsaber/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + return BLOCK_NONE /obj/item/twohanded/dualsaber/hypereutactic/toy name = "\improper DX Hyper-Euplastic LightSword" @@ -474,11 +468,8 @@ slowdown_wielded = 0 sharpness = IS_BLUNT -/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return FALSE - -/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles - return FALSE +/obj/item/twohanded/dualsaber/hypereutactic/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + return BLOCK_NONE /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander" @@ -787,6 +778,7 @@ var/cooldown = 0 var/obj/machinery/computer/holodeck/holo = null // Holodeck cards should not be infinite var/list/cards = list() + var/original_size = 52 /obj/item/toy/cards/deck/Initialize() . = ..() @@ -844,11 +836,11 @@ /obj/item/toy/cards/deck/update_icon_state() switch(cards.len) - if(27 to INFINITY) + if(original_size*0.5 to INFINITY) icon_state = "deck_[deckstyle]_full" - if(11 to 27) + if(original_size*0.25 to original_size*0.5) icon_state = "deck_[deckstyle]_half" - if(1 to 11) + if(1 to original_size*0.25) icon_state = "deck_[deckstyle]_low" else icon_state = "deck_[deckstyle]_empty" @@ -912,79 +904,57 @@ name = "hand of cards" desc = "A number of cards not in a deck, customarily held in ones hand." icon = 'icons/obj/toy.dmi' - icon_state = "nanotrasen_hand2" + icon_state = "none" w_class = WEIGHT_CLASS_TINY var/list/currenthand = list() var/choice = null - /obj/item/toy/cards/cardhand/attack_self(mob/user) - user.set_machine(src) + var/list/handradial = list() interact(user) -/obj/item/toy/cards/cardhand/ui_interact(mob/user) - . = ..() - var/dat = "You have:
    " for(var/t in currenthand) - dat += "A [t].
    " - dat += "Which card will you remove next?" - var/datum/browser/popup = new(user, "cardhand", "Hand of Cards", 400, 240) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.set_content(dat) - popup.open() + handradial[t] = image(icon = src.icon, icon_state = "sc_[t]_[deckstyle]") - -/obj/item/toy/cards/cardhand/Topic(href, href_list) - if(..()) - return if(usr.stat || !ishuman(usr)) return var/mob/living/carbon/human/cardUser = usr - var/O = src - if(href_list["pick"]) - if (cardUser.is_holding(src)) - var/choice = href_list["pick"] - var/obj/item/toy/cards/singlecard/C = new/obj/item/toy/cards/singlecard(cardUser.loc) - src.currenthand -= choice - C.parentdeck = src.parentdeck - C.cardname = choice - C.apply_card_vars(C,O) - C.pickup(cardUser) - cardUser.put_in_hands(C) - cardUser.visible_message("[cardUser] draws a card from [cardUser.p_their()] hand.", "You take the [C.cardname] from your hand.") - - interact(cardUser) - if(src.currenthand.len < 3) - src.icon_state = "[deckstyle]_hand2" - else if(src.currenthand.len < 4) - src.icon_state = "[deckstyle]_hand3" - else if(src.currenthand.len < 5) - src.icon_state = "[deckstyle]_hand4" - if(src.currenthand.len == 1) - var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc) - N.parentdeck = src.parentdeck - N.cardname = src.currenthand[1] - N.apply_card_vars(N,O) - qdel(src) - N.pickup(cardUser) - cardUser.put_in_hands(N) - to_chat(cardUser, "You also take [currenthand[1]] and hold it.") - cardUser << browse(null, "window=cardhand") + if(!(cardUser.mobility_flags & MOBILITY_USE)) return + var/O = src + var/choice = show_radial_menu(usr,src, handradial, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 36, require_near = TRUE) + if(!choice) + return FALSE + var/obj/item/toy/cards/singlecard/C = new/obj/item/toy/cards/singlecard(cardUser.loc) + currenthand -= choice + handradial -= choice + C.parentdeck = parentdeck + C.cardname = choice + C.apply_card_vars(C,O) + C.pickup(cardUser) + cardUser.put_in_hands(C) + cardUser.visible_message("[cardUser] draws a card from [cardUser.p_their()] hand.", "You take the [C.cardname] from your hand.") + + interact(cardUser) + update_sprite() + if(length(currenthand) == 1) + var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(loc) + N.parentdeck = parentdeck + N.cardname = currenthand[1] + N.apply_card_vars(N,O) + qdel(src) + N.pickup(cardUser) + cardUser.put_in_hands(N) + to_chat(cardUser, "You also take [currenthand[1]] and hold it.") /obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user, params) if(istype(C)) if(C.parentdeck == src.parentdeck) src.currenthand += C.cardname - user.visible_message("[user] adds a card to [user.p_their()] hand.", "You add the [C.cardname] to your hand.") + user.visible_message("[user] adds a card to [user.p_their()] hand.", "You add the [C.cardname] to your hand.") qdel(C) interact(user) - if(currenthand.len > 4) - src.icon_state = "[deckstyle]_hand5" - else if(currenthand.len > 3) - src.icon_state = "[deckstyle]_hand4" - else if(currenthand.len > 2) - src.icon_state = "[deckstyle]_hand3" + update_sprite(src) else to_chat(user, "You can't mix cards from other decks!") else @@ -993,7 +963,7 @@ /obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj) ..() newobj.deckstyle = sourceobj.deckstyle - newobj.icon_state = "[deckstyle]_hand2" // Another dumb hack, without this the hand is invisible (or has the default deckstyle) until another card is added. + update_sprite() newobj.card_hitsound = sourceobj.card_hitsound newobj.card_force = sourceobj.card_force newobj.card_throwforce = sourceobj.card_throwforce @@ -1002,6 +972,31 @@ newobj.card_attack_verb = sourceobj.card_attack_verb newobj.resistance_flags = sourceobj.resistance_flags +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/item/toy/cards/cardhand/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + return TRUE + +/** + * This proc updates the sprite for when you create a hand of cards + */ +/obj/item/toy/cards/cardhand/proc/update_sprite() + cut_overlays() + var/overlay_cards = currenthand.len + + var/k = overlay_cards == 2 ? 1 : overlay_cards - 2 + for(var/i = k; i <= overlay_cards; i++) + var/card_overlay = image(icon=src.icon,icon_state="sc_[currenthand[i]]_[deckstyle]",pixel_x=(1-i+k)*3,pixel_y=(1-i+k)*3) + add_overlay(card_overlay) + /obj/item/toy/cards/singlecard name = "card" desc = "a card" diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index b188250fff..8c9cde5b76 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -30,6 +30,8 @@ var/wieldsound = null var/unwieldsound = null var/slowdown_wielded = 0 + /// Do we need to be wielded to actively block/parry? + var/requires_wield_to_block_parry = TRUE item_flags = SLOWS_WHILE_IN_HAND /obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE) @@ -90,6 +92,12 @@ user.put_in_inactive_hand(O) set_slowdown(slowdown + slowdown_wielded) +/obj/item/twohanded/can_active_block() + return ..() && (!requires_wield_to_block_parry || wielded) + +/obj/item/twohanded/can_active_parry() + return ..() && (!requires_wield_to_block_parry || wielded) + /obj/item/twohanded/dropped(mob/user) . = ..() //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand @@ -129,6 +137,7 @@ return ..() /obj/item/twohanded/offhand/dropped(mob/living/user, show_message = TRUE) //Only utilized by dismemberment since you can't normally switch to the offhand to drop it. + . = ..() var/obj/I = user.get_active_held_item() if(I && istype(I, /obj/item/twohanded)) var/obj/item/twohanded/thw = I @@ -274,6 +283,8 @@ throw_range = 5 w_class = WEIGHT_CLASS_SMALL var/w_class_on = WEIGHT_CLASS_BULKY + item_flags = ITEM_CAN_PARRY | SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK + block_parry_data = /datum/block_parry_data/dual_esword force_unwielded = 3 force_wielded = 34 wieldsound = 'sound/weapons/saberon.ogg' @@ -281,14 +292,15 @@ hitsound = "swing_hit" var/hitsound_on = 'sound/weapons/blade1.ogg' armour_penetration = 35 - item_color = "green" + var/saber_color = "green" light_color = "#00ff00"//green attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - block_chance = 75 max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) resistance_flags = FIRE_PROOF var/hacked = FALSE + /// Can this reflect all energy projectiles? + var/can_reflect = TRUE var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD var/list/possible_colors = list("red", "blue", "green", "purple") var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER) @@ -296,6 +308,42 @@ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces. var/total_mass_on = 3.4 +/datum/block_parry_data/dual_esword + block_damage_absorption = 2 + block_damage_multiplier = 0.15 + block_damage_multiplier_override = list( + ATTACK_TYPE_MELEE = 0.25 + ) + block_start_delay = 0 // instantaneous block + block_stamina_cost_per_second = 2.5 + block_stamina_efficiency = 3 + block_lock_sprinting = TRUE + // no attacking while blocking + block_lock_attacking = TRUE + block_projectile_mitigation = 75 + + parry_time_windup = 0 + parry_time_active = 8 + parry_time_spindown = 0 + // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing. + parry_time_windup_visual_override = 1 + parry_time_active_visual_override = 3 + parry_time_spindown_visual_override = 4 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // esword users can attack while parrying. + parry_time_perfect = 2 // first ds isn't perfect + parry_time_perfect_leeway = 1 + parry_imperfect_falloff_percent = 10 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 25 // VERY generous + parry_efficiency_perfect = 90 + parry_failed_stagger_duration = 3 SECONDS + parry_failed_clickcd_duration = CLICK_CD_MELEE + + // more efficient vs projectiles + block_stamina_efficiency_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 4 + ) + /obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user) if(wielded) user.visible_message("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!") @@ -324,8 +372,8 @@ /obj/item/twohanded/dualsaber/Initialize() . = ..() if(LAZYLEN(possible_colors)) - item_color = pick(possible_colors) - switch(item_color) + saber_color = pick(possible_colors) + switch(saber_color) if("red") light_color = LIGHT_COLOR_RED if("green") @@ -341,7 +389,7 @@ /obj/item/twohanded/dualsaber/update_icon_state() if(wielded) - icon_state = "dualsaber[item_color][wielded]" + icon_state = "dualsaber[saber_color][wielded]" else icon_state = "dualsaber0" clean_blood() @@ -373,10 +421,13 @@ else user.adjustStaminaLoss(25) -/obj/item/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(wielded) - return ..() - return 0 +/obj/item/twohanded/dualsaber/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!wielded) + return NONE + if(can_reflect && is_energy_reflectable_projectile(object) && (attack_type & ATTACK_TYPE_PROJECTILE)) + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER //no you + return BLOCK_SHOULD_REDIRECT | BLOCK_SUCCESS | BLOCK_REDIRECTED + return ..() /obj/item/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up if(wielded) @@ -419,10 +470,6 @@ /obj/item/twohanded/dualsaber/proc/rainbow_process() light_color = pick(rainbow_colors) -/obj/item/twohanded/dualsaber/IsReflect() - if(wielded) - return 1 - /obj/item/twohanded/dualsaber/ignition_effect(atom/A, mob/user) // same as /obj/item/melee/transforming/energy, mostly if(!wielded) @@ -456,7 +503,7 @@ if(!hacked) hacked = TRUE to_chat(user, "2XRNBW_ENGAGE") - item_color = "rainbow" + saber_color = "rainbow" update_icon() else to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.") @@ -530,7 +577,7 @@ update_light() return TRUE -/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(isinhands) var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem") @@ -560,15 +607,13 @@ block_chance = 50 armour_penetration = 0 var/chaplain_spawnable = TRUE + can_reflect = FALSE obj_flags = UNIQUE_RENAME /obj/item/twohanded/dualsaber/hypereutactic/chaplain/ComponentInitialize() . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) -/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect() - return FALSE - //spears /obj/item/twohanded/spear icon_state = "spearglass0" @@ -583,7 +628,7 @@ force_wielded = 18 throwforce = 20 throw_speed = 4 - embedding = list("embedded_impact_pain_multiplier" = 3, "embed_chance" = 90) + embedding = list("impact_pain_mult" = 3) armour_penetration = 10 custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' @@ -668,6 +713,7 @@ force_wielded = 19 force_unwielded = 11 throwforce = 21 + embedding = list(embed_chance = 75, pain_mult = 1.5) //plasmaglass spears are sharper icon_prefix = "spearplasma" qdel(tip) var/obj/item/twohanded/spear/S = locate() in parts_list @@ -682,6 +728,7 @@ if(G) explosive = G name = "explosive lance" + embedding = list(embed_chance = 0, pain_mult = 1)//elances should not be embeddable desc = "A makeshift spear with [G] attached to it." update_icon() @@ -752,12 +799,16 @@ armour_penetration = 100 force_on = 30 -/obj/item/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) +/obj/item/twohanded/required/chainsaw/doomslayer/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + block_return[BLOCK_RETURN_REFLECT_PROJECTILE_CHANCE] = 100 + return ..() + +/obj/item/twohanded/required/chainsaw/doomslayer/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(attack_type & ATTACK_TYPE_PROJECTILE) owner.visible_message("Ranged attacks just make [owner] angrier!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) - return 1 - return 0 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return ..() //GREY TIDE /obj/item/twohanded/spear/grey_tide @@ -844,6 +895,7 @@ return (BRUTELOSS) /obj/item/twohanded/pitchfork/demonic/pickup(mob/living/user) + . = ..() if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user)) var/mob/living/U = user U.visible_message("As [U] picks [src] up, [U]'s arms briefly catch fire.", \ @@ -897,19 +949,20 @@ AddComponent(/datum/component/butchering, 20, 105) AddElement(/datum/element/sword_point) -/obj/item/twohanded/vibro_weapon/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/twohanded/vibro_weapon/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(wielded) final_block_chance *= 2 - if(wielded || attack_type != PROJECTILE_ATTACK) + if(wielded || !(attack_type & ATTACK_TYPE_PROJECTILE)) if(prob(final_block_chance)) - if(attack_type == PROJECTILE_ATTACK) + if(attack_type & ATTACK_TYPE_PROJECTILE) owner.visible_message("[owner] deflects [attack_text] with [src]!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) - return 1 + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL else owner.visible_message("[owner] parries [attack_text] with [src]!") - return 1 - return 0 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return NONE /obj/item/twohanded/vibro_weapon/update_icon_state() icon_state = "hfrequency[wielded]" @@ -1024,13 +1077,12 @@ force_wielded = 10 throwforce = 15 //if you are a madman and finish someone off with this, power to you. throw_speed = 1 - item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND - block_chance = 30 + item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK | ITEM_CAN_PARRY + block_parry_data = /datum/block_parry_data/electrostaff attack_verb = list("struck", "beaten", "thwacked", "pulped") total_mass = 5 //yeah this is a heavy thing, beating people with it while it's off is not going to do you any favors. (to curb stun-kill rampaging without it being on) var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high var/on = FALSE - var/can_block_projectiles = FALSE //can't block guns var/lethal_cost = 400 //10000/400*20 = 500. decent enough? var/lethal_damage = 20 var/lethal_stam_cost = 4 @@ -1040,6 +1092,43 @@ var/stun_status_duration = 25 var/stun_stam_cost = 3.5 +// haha security desword time /s +/datum/block_parry_data/electrostaff + block_damage_absorption = 0 + block_damage_multiplier = 1 + can_block_attack_types = ~ATTACK_TYPE_PROJECTILE // only able to parry non projectiles + block_damage_multiplier_override = list( + TEXT_ATTACK_TYPE_MELEE = 0.5, // only useful on melee and unarmed + TEXT_ATTACK_TYPE_UNARMED = 0.3 + ) + block_start_delay = 0.5 // near instantaneous block + block_stamina_cost_per_second = 3 + block_stamina_efficiency = 2 // haha this is a horrible idea + // more slowdown that deswords because security + block_slowdown = 2 + // no attacking while blocking + block_lock_attacking = TRUE + + parry_time_windup = 1 + parry_time_active = 5 + parry_time_spindown = 0 + parry_time_spindown_visual_override = 1 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING // no attacking while parrying + parry_time_perfect = 0 + parry_time_perfect_leeway = 0.5 + parry_efficiency_perfect = 100 + parry_imperfect_falloff_percent = 1 + parry_imperfect_falloff_percent_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 45 // really crappy vs projectiles + ) + parry_time_perfect_leeway_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 1 // extremely harsh window for projectiles + ) + // not extremely punishing to fail, but no spamming the parry. + parry_cooldown = 2.5 SECONDS + parry_failed_stagger_duration = 1.5 SECONDS + parry_failed_clickcd_duration = 1 SECONDS + /obj/item/twohanded/electrostaff/Initialize(mapload) . = ..() if(ispath(cell)) @@ -1055,13 +1144,6 @@ var/mob/living/silicon/robot/R = loc . = R.get_cell() -/obj/item/twohanded/electrostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!on) - return FALSE - if((attack_type == PROJECTILE_ATTACK) && !can_block_projectiles) - return FALSE - return ..() - /obj/item/twohanded/electrostaff/proc/min_hitcost() return min(stun_cost, lethal_cost) @@ -1172,30 +1254,30 @@ /obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user) if(IS_STAMCRIT(user))//CIT CHANGE - makes it impossible to baton in stamina softcrit - to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + to_chat(user, "You're too exhausted to use [src] properly.")//CIT CHANGE - ditto return //CIT CHANGE - ditto if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) clowning_around(user) //ouch! return if(iscyborg(target)) - ..() - return - if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + return ..() + var/list/return_list = list() + if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; run_block() handles that playsound(target, 'sound/weapons/genhit.ogg', 50, 1) return FALSE if(user.a_intent != INTENT_HARM) - if(stun_act(target, user)) + if(stun_act(target, user, null, return_list)) user.do_attack_animation(target) user.adjustStaminaLossBuffered(stun_stam_cost) return - else if(!harm_act(target, user)) + else if(!harm_act(target, user, null, return_list)) return ..() //if you can't fry them just beat them with it else //we did harm act them user.do_attack_animation(target) user.adjustStaminaLossBuffered(lethal_stam_cost) -/obj/item/twohanded/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE) - var/stunforce = stun_stamdmg +/obj/item/twohanded/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list()) + var/stunforce = block_calculate_resultant_damage(stun_stamdmg, block_return) if(!no_charge_and_force) if(!on) target.visible_message("[user] has bapped [target] with [src]. Luckily it was off.", \ @@ -1225,8 +1307,8 @@ H.forcesay(GLOB.hit_appends) return TRUE -/obj/item/twohanded/electrostaff/proc/harm_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE) - var/lethal_force = lethal_damage +/obj/item/twohanded/electrostaff/proc/harm_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE, list/block_return = list()) + var/lethal_force = block_calculate_resultant_damage(lethal_damage, block_return) if(!no_charge_and_force) if(!on) return FALSE //standard item attack diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index bc9c3255a6..67dcd71e65 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -84,6 +84,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 name = "purified longsword" desc = "A hastily-purified longsword. While not as holy as it could be, it's still a formidable weapon against those who would rather see you dead." force = 25 + block_chance = 0 /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." @@ -121,11 +122,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/highlander/pickup(mob/living/user) + . = ..() to_chat(user, "The power of Scotland protects you! You are shielded from all stuns and knockdowns.") user.add_stun_absorption("highlander", INFINITY, 1, " is protected by the power of Scotland!", "The power of Scotland absorbs the stun!", " is protected by the power of Scotland!") user.ignore_slowdown(HIGHLANDER) /obj/item/claymore/highlander/dropped(mob/living/user) + . = ..() user.unignore_slowdown(HIGHLANDER) if(!QDELETED(src)) qdel(src) //If this ever happens, it's because you lost an arm @@ -155,8 +158,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return to_chat(user, "[src] thrums and points to the [dir2text(get_dir(user, closest_victim))].") -/obj/item/claymore/highlander/IsReflect() - return 1 //YOU THINK YOUR PUNY LASERS CAN STOP ME? +/obj/item/claymore/highlander/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) + return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED + return ..() /obj/item/claymore/highlander/proc/add_notch(mob/living/user) //DYNAMIC CLAYMORE PROGRESSION SYSTEM - THIS IS THE FUTURE notches++ @@ -294,12 +299,27 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 2 throwforce = 20 //This is never used on mobs since this has a 100% embed chance. throw_speed = 4 - embedding = list("embedded_pain_multiplier" = 4, "embed_chance" = 100, "embedded_fall_chance" = 0) + embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15) + armour_penetration = 40 + w_class = WEIGHT_CLASS_SMALL sharpness = IS_SHARP custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) resistance_flags = FIRE_PROOF +/obj/item/throwing_star/stamina + name = "shock throwing star" + desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm." + throwforce = 5 + embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3) + +/obj/item/throwing_star/toy + name = "toy throwing star" + desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security." + sharpness = IS_BLUNT + force = 0 + throwforce = 0 + embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) /obj/item/switchblade name = "switchblade" @@ -475,6 +495,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_speed = 5 throw_range = 2 attack_verb = list("busted") + var/impressiveness = 45 + +/obj/item/statuebust/Initialize() + . = ..() + AddElement(/datum/element/art, impressiveness) + addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 1000)), 0) /obj/item/tailclub name = "tail club" @@ -498,7 +524,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = "catwhip" /obj/item/melee/skateboard - name = "skateboard" + name = "improvised skateboard" desc = "A skateboard. It can be placed on its wheels and ridden, or used as a strong weapon." icon_state = "skateboard" item_state = "skateboard" @@ -506,11 +532,39 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 4 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("smacked", "whacked", "slammed", "smashed") + ///The vehicle counterpart for the board + var/board_item_type = /obj/vehicle/ridden/scooter/skateboard /obj/item/melee/skateboard/attack_self(mob/user) - new /obj/vehicle/ridden/scooter/skateboard(get_turf(user)) + if(!user.canUseTopic(src, TRUE, FALSE, TRUE)) + return + var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user)) + S.buckle_mob(user) qdel(src) +/obj/item/melee/skateboard/pro + name = "skateboard" + desc = "A RaDSTORMz brand professional skateboard. It looks sturdy and well made." + icon_state = "skateboard2" + item_state = "skateboard2" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro + custom_premium_price = 500 + +/obj/item/melee/skateboard/hoverboard + name = "hoverboard" + desc = "A blast from the past, so retro!" + icon_state = "hoverboard_red" + item_state = "hoverboard_red" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard + custom_premium_price = 2015 + +/obj/item/melee/skateboard/hoverboard/admin + name = "\improper Board Of Directors" + desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." + icon_state = "hoverboard_nt" + item_state = "hoverboard_nt" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin + /obj/item/melee/baseball_bat name = "baseball bat" desc = "There ain't a skull in the league that can withstand a swatter." @@ -522,6 +576,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 10 throwforce = 12 attack_verb = list("beat", "smacked") + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5) w_class = WEIGHT_CLASS_BULKY var/homerun_ready = 0 var/homerun_able = 0 @@ -581,14 +636,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 12 throwforce = 15 -/obj/item/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers - var/picksound = rand(1,2) - var/turf = get_turf(src) - if(picksound == 1) - playsound(turf, 'sound/weapons/effects/batreflect1.ogg', 50, 1) - if(picksound == 2) - playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1) - return 1 +/obj/item/melee/baseball_bat/ablative/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + //some day this will reflect thrown items instead of lasers + if(is_energy_reflectable_projectile(object) && (attack_type == ATTACK_TYPE_PROJECTILE)) + var/turf = get_turf(src) + playsound(turf, pick('sound/weapons/effects/batreflect1.ogg', 'sound/weapons/effects/batreflect2.ogg'), 50, 1) + return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED + return ..() /obj/item/melee/baseball_bat/ablative/syndi name = "syndicate major league bat" @@ -611,6 +665,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 w_class = WEIGHT_CLASS_SMALL //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/list/strong_against + var/list/spider_panic /obj/item/melee/flyswatter/Initialize() . = ..() @@ -620,7 +675,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/simple_animal/cockroach, /obj/item/queen_bee )) - + spider_panic = typecacheof(list( + /mob/living/simple_animal/banana_spider, + /mob/living/simple_animal/hostile/poison/giant_spider, + )) /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag) . = ..() @@ -631,6 +689,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(istype(target, /mob/living/)) var/mob/living/bug = target bug.death(1) + if(is_type_in_typecache(target, spider_panic)) + to_chat(user, "You easily land a critical blow on the [target].") + if(istype(target, /mob/living/)) + var/mob/living/bug = target + bug.adjustBruteLoss(35) //What kinda mad man would go into melee with a spider?! else qdel(target) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index e582aa7e67..54ac2a5559 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -31,7 +31,7 @@ if(damage_flag) armor_protection = armor.getRating(damage_flag) if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor. - armor_protection = CLAMP(armor_protection - armour_penetration, 0, 100) + armor_protection = clamp(armor_protection - armour_penetration, 0, 100) return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION) //the sound played when the obj is damaged. @@ -74,7 +74,8 @@ /obj/bullet_act(obj/item/projectile/P) . = ..() playsound(src, P.hitsound, 50, 1) - visible_message("[src] is hit by \a [P]!", null, null, COMBAT_MESSAGE_RANGE) + if(P.suppressed != SUPPRESSED_VERY) + visible_message("[src] is hit by \a [P]!", null, null, COMBAT_MESSAGE_RANGE) if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) @@ -112,7 +113,7 @@ /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage_upper && !M.obj_damage) - M.emote("custom", message = "[M.friendly] [src].") + M.emote("custom", message = "[M.friendly_verb_continuous] [src].") return 0 else var/play_soundeffect = 1 @@ -213,7 +214,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(T.intact && level == 1) //fire can't damage things hidden below the floor. return if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) - take_damage(CLAMP(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) + take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE)) resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src @@ -232,19 +233,20 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e cut_overlay(GLOB.fire_overlay, TRUE) SSfire_burning.processing -= src -/obj/proc/tesla_act(power, tesla_flags, shocked_targets) +/obj/zap_act(power, zap_flags, shocked_targets) + if(QDELETED(src)) + return 0 obj_flags |= BEING_SHOCKED - var/power_bounced = power / 2 - tesla_zap(src, 3, power_bounced, tesla_flags, shocked_targets) addtimer(CALLBACK(src, .proc/reset_shocked), 10) + return power / 2 //The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health -//Only tesla coils and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later. -/obj/proc/tesla_buckle_check(var/strength) +//Only tesla coils, vehicles, and grounding rods currently call this because mobs are already targeted over all other objects, but this might be useful for more things later. +/obj/proc/zap_buckle_check(var/strength) if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - buckled_mob.electrocute_act((CLAMP(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) + buckled_mob.electrocute_act((clamp(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) /obj/proc/reset_shocked() obj_flags &= ~BEING_SHOCKED diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4eaa0b4e0a..ba3eba9bd3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -3,6 +3,7 @@ var/crit_fail = FALSE animate_movement = 2 speech_span = SPAN_ROBOT + vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. @@ -122,7 +123,7 @@ /obj/proc/updateUsrDialog() if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) var/is_in_use = FALSE - var/list/nearby = viewers(1, src) + var/list/nearby = fov_viewers(1, src) for(var/mob/M in nearby) if ((M.client && M.machine == src)) is_in_use = TRUE @@ -151,7 +152,7 @@ if(obj_flags & IN_USE) var/is_in_use = FALSE if(update_viewers) - for(var/mob/M in viewers(1, src)) + for(var/mob/M in fov_viewers(1, src)) if ((M.client && M.machine == src)) is_in_use = TRUE src.interact(M) @@ -213,9 +214,78 @@ /obj/vv_get_dropdown() . = ..() - .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]" - .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]" - .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]" + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_MASS_DEL_TYPE, "Delete all of type") + VV_DROPDOWN_OPTION(VV_HK_OSAY, "Object Say") + VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify armor values") + +/obj/vv_do_topic(list/href_list) + if(!(. = ..())) + return + if(href_list[VV_HK_OSAY]) + if(check_rights(R_FUN, FALSE)) + usr.client.object_say(src) + if(href_list[VV_HK_ARMOR_MOD]) + var/list/pickerlist = list() + var/list/armorlist = armor.getList() + + for (var/i in armorlist) + pickerlist += list(list("value" = armorlist[i], "name" = i)) + + var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [src]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist) + + if (islist(result)) + if (result["button"] != 2) // If the user pressed the cancel button + // text2num conveniently returns a null on invalid values + armor = armor.setRating(melee = text2num(result["values"]["melee"]),\ + bullet = text2num(result["values"]["bullet"]),\ + laser = text2num(result["values"]["laser"]),\ + energy = text2num(result["values"]["energy"]),\ + bomb = text2num(result["values"]["bomb"]),\ + bio = text2num(result["values"]["bio"]),\ + rad = text2num(result["values"]["rad"]),\ + fire = text2num(result["values"]["fire"]),\ + acid = text2num(result["values"]["acid"])) + log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") + message_admins("[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") + if(href_list[VV_HK_MASS_DEL_TYPE]) + if(check_rights(R_DEBUG|R_SERVER)) + var/action_type = alert("Strict type ([type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert("Are you really sure you want to delete all objects of type [type]?",,"Yes","No") != "Yes") + return + + if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") + return + + var/O_type = type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/obj/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No objects of this type exist") + return + log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") + if("Type and subtypes") + var/i = 0 + for(var/obj/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No objects of this type exist") + return + log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") /obj/examine(mob/user) . = ..() @@ -245,3 +315,16 @@ current_skin = choice icon_state = unique_reskin[choice] to_chat(M, "[src] is now skinned as '[choice]'.") + +//Called when the object is constructed by an autolathe +//Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes +/obj/proc/autolathe_crafted(obj/machinery/autolathe/A) + return + +/obj/proc/rnd_crafted(obj/machinery/rnd/production/P) + return + +/obj/handle_ricochet(obj/item/projectile/P) + . = ..() + if(. && ricochet_damage_mod) + take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index e185defc0a..d30f617919 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -9,6 +9,8 @@ var/mob/living/structureclimber var/broken = 0 //similar to machinery's stat BROKEN layer = BELOW_OBJ_LAYER + flags_ricochet = RICOCHET_HARD + ricochet_chance_mod = 0.5 /obj/structure/Initialize() if (!armor) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 3e35c12314..1090bae9f8 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -131,7 +131,7 @@ if(C.get_amount() >= 5) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You start to add cables to the frame...") - if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5)) + if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use_tool(src, user, 0, 5)) to_chat(user, "You add cables to the frame.") state = CABLED_CORE update_icon() diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 405e697d3b..fcc26d1313 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -35,101 +35,368 @@ else painting = null - -////////////// -// CANVASES // -////////////// - -#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break. - -//To safe memory on making /icons we cache the blanks.. -GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES)) - /obj/item/canvas name = "canvas" desc = "Draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" resistance_flags = FLAMMABLE - var/whichGlobalBackup = 1 //List index + var/width = 11 + var/height = 11 + var/list/grid + var/canvas_color = "#ffffff" //empty canvas color + var/ui_x = 400 + var/ui_y = 400 + var/used = FALSE + var/painting_name //Painting name, this is set after framing. + var/finalized = FALSE //Blocks edits + var/author_ckey + var/icon_generated = FALSE + var/icon/generated_icon -/obj/item/canvas/nineteenXnineteen - icon_state = "19x19" - whichGlobalBackup = 2 + // Painting overlay offset when framed + var/framed_offset_x = 11 + var/framed_offset_y = 10 -/obj/item/canvas/twentythreeXnineteen - icon_state = "23x19" - whichGlobalBackup = 3 + pixel_x = 10 + pixel_y = 9 -/obj/item/canvas/twentythreeXtwentythree - icon_state = "23x23" - whichGlobalBackup = 4 - -//HEY YOU -//ARE YOU READING THE CODE FOR CANVASES? -//ARE YOU AWARE THEY CRASH HALF THE SERVER WHEN SOMEONE DRAWS ON THEM... -//...AND NOBODY CAN FIGURE OUT WHY? -//THEN GO ON BRAVE TRAVELER -//TRY TO FIX THEM AND REMOVE THIS CODE /obj/item/canvas/Initialize() - ..() - return INITIALIZE_HINT_QDEL //Delete on creation + . = ..() + reset_grid() -//Find the right size blank canvas -/obj/item/canvas/proc/getGlobalBackup() - . = null - if(GLOB.globalBlankCanvases[whichGlobalBackup]) - . = GLOB.globalBlankCanvases[whichGlobalBackup] - else - var/icon/I = icon(initial(icon),initial(icon_state)) - GLOB.globalBlankCanvases[whichGlobalBackup] = I - . = I +/obj/item/canvas/proc/reset_grid() + grid = new/list(width,height) + for(var/x in 1 to width) + for(var/y in 1 to height) + grid[x][y] = canvas_color +/obj/item/canvas/attack_self(mob/user) + . = ..() + ui_interact(user) +/obj/item/canvas/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) -//One pixel increments -/obj/item/canvas/attackby(obj/item/I, mob/user, params) - //Click info - var/list/click_params = params2list(params) - var/pixX = text2num(click_params["icon-x"]) - var/pixY = text2num(click_params["icon-y"]) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "canvas", name, ui_x, ui_y, master_ui, state) + ui.set_autoupdate(FALSE) + ui.open() - //Should always be true, otherwise you didn't click the object, but let's check because SS13~ - if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) - return - - //Cleaning one pixel with a soap or rag - if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag)) - //Pixel info created only when needed - var/icon/masterpiece = icon(icon,icon_state) - var/thePix = masterpiece.GetPixel(pixX,pixY) - var/icon/Ico = getGlobalBackup() - if(!Ico) - qdel(masterpiece) - return - - var/theOriginalPix = Ico.GetPixel(pixX,pixY) - if(thePix != theOriginalPix) //colour changed - DrawPixelOn(theOriginalPix,pixX,pixY) - qdel(masterpiece) - - //Drawing one pixel with a crayon - else if(istype(I, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/C = I - DrawPixelOn(C.paint_color, pixX, pixY) +/obj/item/canvas/attackby(obj/item/I, mob/living/user, params) + if(user.a_intent == INTENT_HELP) + ui_interact(user) else return ..() +/obj/item/canvas/ui_data(mob/user) + . = ..() + .["grid"] = grid + .["name"] = painting_name + .["finalized"] = finalized -//Clean the whole canvas -/obj/item/canvas/attack_self(mob/user) - if(!user) +/obj/item/canvas/examine(mob/user) + . = ..() + ui_interact(user) + +/obj/item/canvas/ui_act(action, params) + . = ..() + if(. || finalized) return - var/icon/blank = getGlobalBackup() - if(blank) - //it's basically a giant etch-a-sketch - icon = blank - user.visible_message("[user] cleans the canvas.","You clean the canvas.") + var/mob/user = usr + switch(action) + if("paint") + var/obj/item/I = user.get_active_held_item() + var/color = get_paint_tool_color(I) + if(!color) + return FALSE + var/x = text2num(params["x"]) + var/y = text2num(params["y"]) + grid[x][y] = color + used = TRUE + update_icon() + . = TRUE + if("finalize") + . = TRUE + if(!finalized) + finalize(user) + +/obj/item/canvas/proc/finalize(mob/user) + finalized = TRUE + author_ckey = user.ckey + generate_proper_overlay() + try_rename(user) + +/obj/item/canvas/update_overlays() + . = ..() + if(!icon_generated) + if(used) + var/mutable_appearance/detail = mutable_appearance(icon,"[icon_state]wip") + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail + else + var/mutable_appearance/detail = mutable_appearance(generated_icon) + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail + +/obj/item/canvas/proc/generate_proper_overlay() + if(icon_generated) + return + var/png_filename = "data/paintings/temp_painting.png" + var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string()) + if(result) + CRASH("Error generating painting png : [result]") + generated_icon = new(png_filename) + icon_generated = TRUE + update_icon() + +/obj/item/canvas/proc/get_data_string() + var/list/data = list() + for(var/y in 1 to height) + for(var/x in 1 to width) + data += grid[x][y] + return data.Join("") + +//Todo make this element ? +/obj/item/canvas/proc/get_paint_tool_color(obj/item/I) + if(!I) + return + if(istype(I, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/C = I + return C.paint_color + else if(istype(I, /obj/item/pen)) + var/obj/item/pen/P = I + switch(P.colour) + if("black") + return "#000000" + if("blue") + return "#0000ff" + if("red") + return "#ff0000" + return P.colour + else if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag)) + return canvas_color + +/obj/item/canvas/proc/try_rename(mob/user) + var/new_name = stripped_input(user,"What do you want to name the painting?") + if(!painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) + painting_name = new_name + SStgui.update_uis(src) + +/obj/item/canvas/nineteenXnineteen + icon_state = "19x19" + width = 19 + height = 19 + ui_x = 600 + ui_y = 600 + pixel_x = 6 + pixel_y = 9 + framed_offset_x = 8 + framed_offset_y = 9 + +/obj/item/canvas/twentythreeXnineteen + icon_state = "23x19" + width = 23 + height = 19 + ui_x = 800 + ui_y = 600 + pixel_x = 4 + pixel_y = 10 + framed_offset_x = 6 + framed_offset_y = 8 + +/obj/item/canvas/twentythreeXtwentythree + icon_state = "23x23" + width = 23 + height = 23 + ui_x = 800 + ui_y = 800 + pixel_x = 5 + pixel_y = 9 + framed_offset_x = 5 + framed_offset_y = 6 + +/obj/item/wallframe/painting + name = "painting frame" + desc = "The perfect showcase for your favorite deathtrap memories." + icon = 'icons/obj/decals.dmi' + custom_materials = null + flags_1 = 0 + icon_state = "frame-empty" + result_path = /obj/structure/sign/painting + +/obj/structure/sign/painting + name = "Painting" + desc = "Art or \"Art\"? You decide." + icon = 'icons/obj/decals.dmi' + icon_state = "frame-empty" + buildable_sign = FALSE + var/obj/item/canvas/C + var/persistence_id + +/obj/structure/sign/painting/Initialize(mapload, dir, building) + . = ..() + SSpersistence.painting_frames += src + AddElement(/datum/element/art, 20) + if(dir) + setDir(dir) + if(building) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) + pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 + +/obj/structure/sign/painting/Destroy() + . = ..() + SSpersistence.painting_frames -= src + +/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params) + if(!C && istype(I, /obj/item/canvas)) + frame_canvas(user,I) + else if(C && !C.painting_name && istype(I,/obj/item/pen)) + try_rename(user) + else + return ..() + +/obj/structure/sign/painting/examine(mob/user) + . = ..() + if(C) + C.ui_interact(user,state = GLOB.physical_obscured_state) + +/obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(C) + C.forceMove(drop_location()) + C = null + to_chat(user, "You remove the painting from the frame.") + update_icon() + return TRUE + +/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas) + if(user.transferItemToLoc(new_canvas,src)) + C = new_canvas + if(!C.finalized) + C.finalize(user) + to_chat(user,"You frame [C].") + update_icon() + +/obj/structure/sign/painting/proc/try_rename(mob/user) + if(!C.painting_name) + C.try_rename(user) + +/obj/structure/sign/painting/update_icon_state() + . = ..() + if(C && C.generated_icon) + icon_state = null + else + icon_state = "frame-empty" -#undef AMT_OF_CANVASES +/obj/structure/sign/painting/update_overlays() + . = ..() + if(C && C.generated_icon) + var/mutable_appearance/MA = mutable_appearance(C.generated_icon) + MA.pixel_x = C.framed_offset_x + MA.pixel_y = C.framed_offset_y + . += MA + var/mutable_appearance/frame = mutable_appearance(C.icon,"[C.icon_state]frame") + frame.pixel_x = C.framed_offset_x - 1 + frame.pixel_y = C.framed_offset_y - 1 + . += frame + +/obj/structure/sign/painting/proc/load_persistent() + if(!persistence_id) + return + if(!SSpersistence.paintings || !SSpersistence.paintings[persistence_id] || !length(SSpersistence.paintings[persistence_id])) + return + var/list/chosen = pick(SSpersistence.paintings[persistence_id]) + var/title = chosen["title"] + var/author = chosen["ckey"] + var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png" + if(!fexists(png)) + stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.") + return + var/icon/I = new(png) + var/obj/item/canvas/new_canvas + var/w = I.Width() + var/h = I.Height() + for(var/T in typesof(/obj/item/canvas)) + new_canvas = T + if(initial(new_canvas.width) == w && initial(new_canvas.height) == h) + new_canvas = new T(src) + break + new_canvas.fill_grid_from_icon(I) + new_canvas.generated_icon = I + new_canvas.icon_generated = TRUE + new_canvas.finalized = TRUE + new_canvas.painting_name = title + new_canvas.author_ckey = author + C = new_canvas + update_icon() + +/obj/structure/sign/painting/proc/save_persistent() + if(!persistence_id || !C) + return + if(sanitize_filename(persistence_id) != persistence_id) + stack_trace("Invalid persistence_id - [persistence_id]") + return + var/data = C.get_data_string() + var/md5 = md5(data) + var/list/current = SSpersistence.paintings[persistence_id] + if(!current) + current = list() + for(var/list/entry in current) + if(entry["md5"] == md5) + return + var/png_directory = "data/paintings/[persistence_id]/" + var/png_path = png_directory + "[md5].png" + var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data) + if(result) + CRASH("Error saving persistent painting: [result]") + current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey)) + SSpersistence.paintings[persistence_id] = current + +/obj/item/canvas/proc/fill_grid_from_icon(icon/I) + var/h = I.Height() + 1 + for(var/x in 1 to width) + for(var/y in 1 to height) + grid[x][y] = I.GetPixel(x,h-y) + +//Presets for art gallery mapping, for paintings to be shared across stations +/obj/structure/sign/painting/library + persistence_id = "library" + +/obj/structure/sign/painting/library_secure + persistence_id = "library_secure" + +/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least + persistence_id = "library_private" + +/obj/structure/sign/painting/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION(VV_HK_REMOVE_PAINTING, "Remove Persistent Painting") + +/obj/structure/sign/painting/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_REMOVE_PAINTING]) + if(!check_rights(NONE)) + return + var/mob/user = usr + if(!persistence_id || !C) + to_chat(user,"This is not a persistent painting.") + return + var/md5 = md5(C.get_data_string()) + var/author = C.author_ckey + var/list/current = SSpersistence.paintings[persistence_id] + if(current) + for(var/list/entry in current) + if(entry["md5"] == md5) + current -= entry + var/png = "data/paintings/[persistence_id]/[md5].png" + fdel(png) + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + if(P.C && md5(P.C.get_data_string()) == md5) + QDEL_NULL(P.C) + log_admin("[key_name(user)] has deleted a persistent painting made by [author].") + message_admins("[key_name_admin(user)] has deleted persistent painting made by [author].") diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index d2fff9649d..821409c26b 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -84,7 +84,6 @@ panel_open = FALSE else if(istype(I, /obj/item/stack/cable_coil) && panel_open) - var/obj/item/stack/cable_coil/C = I if(obj_flags & EMAGGED) //Emagged, not broken by EMP to_chat(user, "Sign has been damaged beyond repair!") return @@ -92,7 +91,7 @@ to_chat(user, "This sign is functioning properly!") return - if(C.use(2)) + if(I.use_tool(src, user, 0, 2)) to_chat(user, "You replace the burnt wiring.") broken = FALSE else diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 06c1d96711..2225c4c0c2 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -108,7 +108,9 @@ if(!istype(poordude)) return TRUE user.visible_message("[user] pulls [src] out from under [poordude].", "You pull [src] out from under [poordude].") - var/C = new item_chair(loc) + var/obj/item/chair/C = new item_chair(loc) + C.set_custom_materials(custom_materials) + TransferComponents(C) user.put_in_hands(C) poordude.DefaultCombatKnockdown(20)//rip in peace user.adjustStaminaLoss(5) @@ -153,7 +155,7 @@ ///Material chair /obj/structure/chair/greyscale icon_state = "chair_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS item_chair = /obj/item/chair/greyscale buildstacktype = null //Custom mats handle this @@ -317,7 +319,7 @@ throwforce = 10 throw_range = 3 hitsound = 'sound/items/trayhit1.ogg' - hit_reaction_chance = 50 + block_chance = 50 custom_materials = list(/datum/material/iron = 2000) var/break_chance = 5 //Likely hood of smashing the chair. var/obj/structure/chair/origin_type = /obj/structure/chair @@ -362,18 +364,17 @@ new stack_type(get_turf(loc)) qdel(src) -/obj/item/chair/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance)) - owner.visible_message("[owner] fends off [attack_text] with [src]!") - return 1 - return 0 +/obj/item/chair/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!(attack_type & ATTACK_TYPE_UNARMED)) + return NONE + return ..() /obj/item/chair/afterattack(atom/target, mob/living/carbon/user, proximity) . = ..() if(!proximity) return if(prob(break_chance)) - user.visible_message("[user] smashes \the [src] to pieces against \the [target]") + user.visible_message("[user] smashes [src] to pieces against [target]") if(iscarbon(target)) var/mob/living/carbon/C = target if(C.health < C.maxHealth*0.5) @@ -383,7 +384,7 @@ /obj/item/chair/greyscale icon_state = "chair_greyscale_toppled" item_state = "chair_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS origin_type = /obj/structure/chair/greyscale /obj/item/chair/stool diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 0991351102..a4ee2f16e2 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -16,8 +16,8 @@ LINEN BINS throw_speed = 1 throw_range = 2 w_class = WEIGHT_CLASS_TINY - item_color = "white" resistance_flags = FLAMMABLE + dying_key = DYE_REGISTRY_BEDSHEET dog_fashion = /datum/dog_fashion/head/ghost var/list/dream_messages = list("white") @@ -41,7 +41,7 @@ LINEN BINS return /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wirecutters) || I.get_sharpness()) + if(!(flags_1 & HOLOGRAM_1) && (istype(I, /obj/item/wirecutters) || I.get_sharpness())) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) C.add_fingerprint(user) @@ -52,79 +52,66 @@ LINEN BINS /obj/item/bedsheet/blue icon_state = "sheetblue" - item_color = "blue" dream_messages = list("blue") /obj/item/bedsheet/green icon_state = "sheetgreen" - item_color = "green" dream_messages = list("green") /obj/item/bedsheet/grey icon_state = "sheetgrey" - item_color = "grey" dream_messages = list("grey") /obj/item/bedsheet/orange icon_state = "sheetorange" - item_color = "orange" dream_messages = list("orange") /obj/item/bedsheet/purple icon_state = "sheetpurple" - item_color = "purple" dream_messages = list("purple") /obj/item/bedsheet/patriot name = "patriotic bedsheet" desc = "You've never felt more free than when sleeping on this." icon_state = "sheetUSA" - item_color = "sheetUSA" dream_messages = list("America", "freedom", "fireworks", "bald eagles") /obj/item/bedsheet/rainbow name = "rainbow bedsheet" desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together." icon_state = "sheetrainbow" - item_color = "rainbow" dream_messages = list("red", "orange", "yellow", "green", "blue", "purple", "a rainbow") /obj/item/bedsheet/red icon_state = "sheetred" - item_color = "red" dream_messages = list("red") /obj/item/bedsheet/yellow icon_state = "sheetyellow" - item_color = "yellow" dream_messages = list("yellow") /obj/item/bedsheet/mime name = "mime's blanket" desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this." icon_state = "sheetmime" - item_color = "mime" dream_messages = list("silence", "gestures", "a pale face", "a gaping mouth", "the mime") /obj/item/bedsheet/clown name = "clown's blanket" desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas." icon_state = "sheetclown" - item_color = "clown" dream_messages = list("honk", "laughter", "a prank", "a joke", "a smiling face", "the clown") /obj/item/bedsheet/captain name = "captain's bedsheet" desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains." icon_state = "sheetcaptain" - item_color = "captain" dream_messages = list("authority", "a golden ID", "sunglasses", "a green disc", "an antique gun", "the captain") /obj/item/bedsheet/rd name = "research director's bedsheet" desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day." icon_state = "sheetrd" - item_color = "director" dream_messages = list("authority", "a silvery ID", "a bomb", "a mech", "a facehugger", "maniacal laughter", "the research director") // for Free Golems. @@ -137,111 +124,94 @@ LINEN BINS name = "medical blanket" desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station." icon_state = "sheetmedical" - item_color = "medical" dream_messages = list("healing", "life", "surgery", "a doctor") /obj/item/bedsheet/cmo name = "chief medical officer's bedsheet" desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime." icon_state = "sheetcmo" - item_color = "cmo" dream_messages = list("authority", "a silvery ID", "healing", "life", "surgery", "a cat", "the chief medical officer") /obj/item/bedsheet/hos name = "head of security's bedsheet" desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!" icon_state = "sheethos" - item_color = "hosred" dream_messages = list("authority", "a silvery ID", "handcuffs", "a baton", "a flashbang", "sunglasses", "the head of security") /obj/item/bedsheet/hop name = "head of personnel's bedsheet" desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio." icon_state = "sheethop" - item_color = "hop" dream_messages = list("authority", "a silvery ID", "obligation", "a computer", "an ID", "a corgi", "the head of personnel") /obj/item/bedsheet/ce name = "chief engineer's bedsheet" desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil." icon_state = "sheetce" - item_color = "chief" dream_messages = list("authority", "a silvery ID", "the engine", "power tools", "an APC", "a parrot", "the chief engineer") /obj/item/bedsheet/qm name = "quartermaster's bedsheet" desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper." icon_state = "sheetqm" - item_color = "qm" dream_messages = list("a grey ID", "a shuttle", "a crate", "a sloth", "the quartermaster") /obj/item/bedsheet/brown icon_state = "sheetbrown" - item_color = "cargo" dream_messages = list("brown") /obj/item/bedsheet/black icon_state = "sheetblack" - item_color = "black" dream_messages = list("black") /obj/item/bedsheet/centcom name = "\improper CentCom bedsheet" desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials." icon_state = "sheetcentcom" - item_color = "centcom" dream_messages = list("a unique ID", "authority", "artillery", "an ending") /obj/item/bedsheet/syndie name = "syndicate bedsheet" desc = "It has a syndicate emblem and it has an aura of evil." icon_state = "sheetsyndie" - item_color = "syndie" dream_messages = list("a green disc", "a red crystal", "a glowing blade", "a wire-covered ID") /obj/item/bedsheet/cult name = "cultist's bedsheet" desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence." icon_state = "sheetcult" - item_color = "cult" dream_messages = list("a tome", "a floating red crystal", "a glowing sword", "a bloody symbol", "a massive humanoid figure") /obj/item/bedsheet/wiz name = "wizard's bedsheet" desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!" icon_state = "sheetwiz" - item_color = "wiz" dream_messages = list("a book", "an explosion", "lightning", "a staff", "a skeleton", "a robe", "magic") /obj/item/bedsheet/nanotrasen name = "nanotrasen bedsheet" desc = "It has the Nanotrasen logo on it and has an aura of duty." icon_state = "sheetNT" - item_color = "nanotrasen" dream_messages = list("authority", "an ending") /obj/item/bedsheet/ian icon_state = "sheetian" - item_color = "ian" dream_messages = list("a dog", "a corgi", "woof", "bark", "arf") /obj/item/bedsheet/runtime icon_state = "sheetruntime" - item_color = "runtime" dream_messages = list("a kitty", "a cat", "meow", "purr", "nya~") /obj/item/bedsheet/pirate name = "pirate's bedsheet" desc = "It has a Jolly Roger emblem on it and has a faint scent of grog." icon_state = "sheetpirate" - item_color = "black" dream_messages = list("doing whatever oneself wants", "cause a pirate is free", "being a pirate", "stealing", "landlubbers", "gold", "a buried treasure", "yarr", "avast", "a swashbuckler", "sailing the Seven Seas", "a parrot", "a monkey", "an island", "a talking skull") /obj/item/bedsheet/gondola name = "gondola bedsheet" desc = "A precious bedsheet made from the hide of a rare and peculiar critter." icon_state = "sheetgondola" - item_color = "cargo" var/g_mouth var/g_eyes @@ -252,7 +222,7 @@ LINEN BINS add_overlay(g_mouth) add_overlay(g_eyes) -/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) . += mutable_appearance(icon_file, g_mouth) @@ -262,14 +232,12 @@ LINEN BINS name = "cosmic space bedsheet" desc = "Made from the dreams of those who wonder at the stars." icon_state = "sheetcosmos" - item_color = "cosmos" dream_messages = list("the infinite cosmos", "Hans Zimmer music", "a flight through space", "the galaxy", "being fabulous", "shooting stars") light_power = 2 light_range = 1.4 /obj/item/bedsheet/random icon_state = "random_bedsheet" - item_color = "rainbow" name = "random bedsheet" desc = "If you're reading this description ingame, something has gone wrong! Honk!" @@ -293,6 +261,11 @@ LINEN BINS var/list/sheets = list() var/obj/item/hidden = null +/obj/structure/bedsheetbin/empty + amount = 0 + icon_state = "linenbin-empty" + anchored = FALSE + /obj/structure/bedsheetbin/examine(mob/user) . = ..() if(amount < 1) @@ -396,4 +369,4 @@ LINEN BINS /obj/structure/bedsheetbin/color sheet_types = list(/obj/item/bedsheet, /obj/item/bedsheet/blue, /obj/item/bedsheet/green, /obj/item/bedsheet/orange, \ /obj/item/bedsheet/purple, /obj/item/bedsheet/red, /obj/item/bedsheet/yellow, /obj/item/bedsheet/brown, \ - /obj/item/bedsheet/black) \ No newline at end of file + /obj/item/bedsheet/black) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a40314c7ad..5da04a6686 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -505,7 +505,7 @@ /obj/structure/closet/container_resist(mob/living/user) if(opened) return - if(ismovableatom(loc)) + if(ismovable(loc)) user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT var/atom/movable/AM = loc diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 5ec3851128..e51aeafdc1 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -100,3 +100,12 @@ if(isliving(A)) to_chat(A, "You're suddenly forced into a tiny, compressed space!") qdel(src) + +/obj/structure/closet/body_bag/containment + name = "containment body bag" + desc = "A folded heavy body bag designed for the storage and transportation of cadavers with heavy radiation." + icon = 'icons/obj/bodybag.dmi' + icon_state = "radbodybag" + mob_storage_capacity = 1 + foldedbag_path = /obj/item/bodybag/containment + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index ae2e1a070a..500b8d6a49 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -24,6 +24,7 @@ move_delay = TRUE var/oldloc = loc step(src, direction) + user.setDir(direction) if(oldloc != loc) addtimer(CALLBACK(src, .proc/ResetMoveDelay), (use_mob_movespeed ? user.movement_delay() : CONFIG_GET(number/movedelay/walk_delay)) * move_speed_multiplier) else @@ -42,7 +43,7 @@ Snake = L break if(Snake) - alerted = viewers(7,src) + alerted = fov_viewers(world.view,src) ..() if(LAZYLEN(alerted)) egged = world.time + SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 83827b56b6..0da502283b 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -37,8 +37,8 @@ ..() new /obj/item/clothing/glasses/eyepatch(src) new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/gloves/combat(src) - new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/gloves/tackler/combat(src) + new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/head/helmet/swat(src) new /obj/item/clothing/head/helmet/swat(src) new /obj/item/clothing/mask/gas/sechailer/swat(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 58d72e6ee0..05798df953 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -77,6 +77,7 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) + new /obj/item/cartridge/engineering(src) /obj/structure/closet/secure_closet/atmospherics name = "\proper atmospheric technician's locker" @@ -97,6 +98,7 @@ new /obj/item/clothing/head/hardhat/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) + new /obj/item/cartridge/atmos(src) /* * Empty lockers diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 14d32cd4fe..beb14ff48c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -51,7 +51,6 @@ new /obj/item/storage/backpack/satchel/leather/withwallet( src ) new /obj/item/instrument/piano_synth(src) new /obj/item/radio/headset( src ) - new /obj/item/clothing/head/colour(src) /obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params) var/obj/item/card/id/I = W.GetID() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 57520f6f40..0c314d988c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -6,8 +6,16 @@ max_integrity = 250 armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) secure = TRUE + var/melee_min_damage = 20 /obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 20) + if(damage_flag == "melee" && damage_amount < melee_min_damage) return 0 - . = ..() \ No newline at end of file + . = ..() + +// Exists to work around the minimum 700 cr price for goodies / small items +/obj/structure/closet/secure_closet/goodies + icon_state = "goodies" + desc = "A sturdier card-locked storage unit used for bulky shipments." + max_integrity = 500 // Same as crates. + melee_min_damage = 25 // Idem. diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index e5c50af782..9f4da351fa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -76,12 +76,13 @@ new /obj/item/storage/box/flashbangs(src) new /obj/item/shield/riot/tele(src) new /obj/item/storage/belt/security/full(src) - new /obj/item/gun/energy/e_gun/hos(src) + new /obj/item/choice_beacon/hosgun(src) new /obj/item/flashlight/seclite(src) new /obj/item/pinpointer/nuke(src) new /obj/item/circuitboard/machine/techfab/department/security(src) new /obj/item/storage/photo_album/HoS(src) new /obj/item/clothing/suit/hooded/wintercoat/hos(src) + /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" req_access = list(ACCESS_ARMORY) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index a8f3dc0676..9ed2fbdeb5 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -26,7 +26,7 @@ if (prob(40)) new /obj/item/storage/toolbox/emergency(src) - switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 5))) + switch (pickweight(list("small" = 35, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 5, "rng" = 5))) if ("small") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) @@ -49,6 +49,12 @@ if ("nothing") // doot + if ("rng") + new /obj/effect/spawner/lootdrop/breathing_tanks/no_turf(src) + new /obj/effect/spawner/lootdrop/breathing_tanks/no_turf(src) + new /obj/effect/spawner/lootdrop/breathing_masks/no_turf(src) + new /obj/effect/spawner/lootdrop/breathing_masks/no_turf(src) + return /* @@ -100,13 +106,15 @@ if(prob(70)) new /obj/item/wrench(src) if(prob(70)) - new /obj/item/weldingtool(src) + new /obj/effect/spawner/lootdrop/welder_tools/no_turf(src) if(prob(70)) new /obj/item/crowbar(src) if(prob(70)) new /obj/item/wirecutters(src) if(prob(70)) new /obj/item/t_scanner(src) + if(prob(70)) + new /obj/effect/spawner/lootdrop/low_tools/no_turf(src) //Spare random basic tool if(prob(20)) new /obj/item/storage/belt/utility(src) if(prob(30)) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index b0dfec6318..2c977a34d6 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -179,6 +179,7 @@ desc = "A crate with a radiation sign on it." name = "radiation crate" icon_state = "radiation" + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/structure/closet/crate/hydroponics name = "hydroponics crate" diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 3dbbfd5c23..4b33f33c99 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -22,6 +22,9 @@ return ..() +/obj/structure/closet/crate/critter/update_icon_state() + return + /obj/structure/closet/crate/critter/closet_update_overlays(list/new_overlays) . = new_overlays if(opened) @@ -35,4 +38,4 @@ if(tank) return tank.air_contents else - return loc.return_air() \ No newline at end of file + return loc.return_air() diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 4ac69253d3..2c923c1905 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -74,4 +74,43 @@ /obj/structure/closet/crate/secure/medical desc = "A secure medical crate." name = "medical crate" - icon_state = "medical_secure_crate" \ No newline at end of file + icon_state = "medical_secure_crate" + +/obj/structure/closet/crate/secure/owned + name = "private crate" + desc = "A crate cover designed to only open for who purchased its contents." + icon_state = "privatecrate" + var/datum/bank_account/buyer_account + var/privacy_lock = TRUE + +/obj/structure/closet/crate/secure/owned/examine(mob/user) + . = ..() + to_chat(user, "It's locked with a privacy lock, and can only be unlocked by the buyer's ID.") + +/obj/structure/closet/crate/secure/owned/Initialize(mapload, datum/bank_account/_buyer_account) + . = ..() + buyer_account = _buyer_account + +/obj/structure/closet/crate/secure/owned/togglelock(mob/living/user, silent) + if(privacy_lock) + if(!broken) + var/obj/item/card/id/id_card = user.get_idcard(TRUE) + if(id_card) + if(id_card.registered_account) + if(id_card.registered_account == buyer_account) + if(iscarbon(user)) + add_fingerprint(user) + locked = !locked + user.visible_message("[user] unlocks [src]'s privacy lock.", + "You unlock [src]'s privacy lock.") + privacy_lock = FALSE + update_icon() + else if(!silent) + to_chat(user, "Bank account does not match with buyer!") + else if(!silent) + to_chat(user, "No linked bank account detected!") + else if(!silent) + to_chat(user, "No ID detected!") + else if(!silent) + to_chat(user, "[src] is broken!") + else ..() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 9b736517be..3bc84deb4d 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -3,6 +3,7 @@ desc = "A small wall mounted cabinet designed to hold a fire extinguisher." icon = 'icons/obj/wallmounts.dmi' icon_state = "extinguisher_closed" + plane = ABOVE_WALL_PLANE anchored = TRUE density = FALSE max_integrity = 200 diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index e44698f96e..679a755321 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -7,6 +7,7 @@ anchored = TRUE icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" + plane = WALL_PLANE layer = LOW_OBJ_LAYER density = TRUE opacity = 1 diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 0f3a23dd0f..f4c1dd5ab9 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -3,6 +3,7 @@ desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." icon = 'icons/obj/wallmounts.dmi' icon_state = "fireaxe" + plane = ABOVE_WALL_PLANE anchored = TRUE density = FALSE armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index ee8f285230..ca66dbd8de 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -130,7 +130,7 @@ if(burn_time_remaining() < MAXIMUM_BURN_TIMER) flame_expiry_timer = world.time + MAXIMUM_BURN_TIMER else - fuel_added = CLAMP(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) + fuel_added = clamp(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) /obj/structure/fireplace/proc/burn_time_remaining() if(lit) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 261dae1ea2..c1f8af43f0 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -302,7 +302,8 @@ /obj/item/twohanded/required/kirbyplants/Initialize() . = ..() - AddComponent(/datum/component/tactical) + AddElement(/datum/element/tactical) + addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 500)), 0) /obj/item/twohanded/required/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' @@ -350,11 +351,28 @@ icon = 'icons/obj/flora/rocks.dmi' resistance_flags = FIRE_PROOF density = TRUE + /// Itemstack that is dropped when a rock is mined with a pickaxe + var/obj/item/stack/mineResult = /obj/item/stack/ore/glass/basalt + /// Amount of the itemstack to drop + var/mineAmount = 20 /obj/structure/flora/rock/Initialize() . = ..() icon_state = "[icon_state][rand(1,3)]" +/obj/structure/flora/rock/attackby(obj/item/W, mob/user, params) + if(!mineResult || W.tool_behaviour != TOOL_MINING) + return ..() + if(flags_1 & NODECONSTRUCT_1) + return ..() + to_chat(user, "You start mining...") + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You finish mining the rock.") + if(mineResult && mineAmount) + new mineResult(get_turf(src), mineAmount) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type) + qdel(src) + /obj/structure/flora/rock/pile icon_state = "lavarocks" desc = "A pile of rocks." diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm new file mode 100644 index 0000000000..afdff7afec --- /dev/null +++ b/code/game/objects/structures/fugitive_role_spawners.dm @@ -0,0 +1,66 @@ + + +/obj/effect/mob_spawn/human/fugitive + assignedrole = "Fugitive Hunter" + flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details + roundstart = FALSE + death = FALSE + random = TRUE + show_flavour = FALSE + density = TRUE + var/back_story = "error" + +/obj/effect/mob_spawn/human/fugitive/Initialize(mapload) + . = ..() + notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE) + +/obj/effect/mob_spawn/human/fugitive/special(mob/living/new_spawn) + var/datum/antagonist/fugitive_hunter/fughunter = new + fughunter.backstory = back_story + new_spawn.mind.add_antag_datum(fughunter) + fughunter.greet() + message_admins("[ADMIN_LOOKUPFLW(new_spawn)] has been made into a Fugitive Hunter by an event.") + log_game("[key_name(new_spawn)] was spawned as a Fugitive Hunter by an event.") + +/obj/effect/mob_spawn/human/fugitive/spacepol + name = "police pod" + desc = "A small sleeper typically used to put people to sleep for briefing on the mission." + mob_name = "a spacepol officer" + flavour_text = "Justice has arrived. I am a member of the Spacepol!" + back_story = "space cop" + outfit = /datum/outfit/spacepol + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + +/obj/effect/mob_spawn/human/fugitive/russian + name = "russian pod" + flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!" + back_story = "russian" + desc = "A small sleeper typically used to make long distance travel a bit more bearable." + mob_name = "russian" + outfit = /datum/outfit/russiancorpse/hunter + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + +/obj/effect/mob_spawn/human/fugitive/bounty + name = "bounty hunter pod" + flavour_text = "We got a new bounty on some fugitives, dead or alive." + back_story = "bounty hunters" + desc = "A small sleeper typically used to make long distance travel a bit more bearable." + mob_name = "bounty hunter" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + +/obj/effect/mob_spawn/human/fugitive/bounty/Destroy() + var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) + S.setDir(dir) + return ..() + +/obj/effect/mob_spawn/human/fugitive/bounty/armor + outfit = /datum/outfit/bountyarmor + +/obj/effect/mob_spawn/human/fugitive/bounty/hook + outfit = /datum/outfit/bountyhook + +/obj/effect/mob_spawn/human/fugitive/bounty/synth + outfit = /datum/outfit/bountysynth diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index c918e7b867..4455c8820d 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -32,6 +32,7 @@ new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere? new_spawn.socks = "Nude" new_spawn.update_body(TRUE) + new_spawn.language_holder.selected_language = /datum/language/sylvan //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. @@ -63,10 +64,6 @@ else to_chat(new_spawn, "You have been born outside of your natural home! Whether you decide to return home, or make due with your new home is your own decision.") - new_spawn.grant_language(/datum/language/draconic) - var/datum/language_holder/holder = new_spawn.get_language_holder() - holder.selected_default_language = /datum/language/draconic - //Ash walkers on birth understand how to make bone bows, bone arrows and ashen arrows new_spawn.mind.teach_crafting_recipe(/datum/crafting_recipe/bone_arrow) @@ -453,7 +450,7 @@ name = "Syndicate Operative Empty" uniform = /obj/item/clothing/under/syndicate shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset/syndicate/alt back = /obj/item/storage/backpack implants = list(/obj/item/implant/weapons_auth) @@ -584,7 +581,7 @@ uniform = /obj/item/clothing/under/rank/rnd/scientist shoes = /obj/item/clothing/shoes/laceup id = /obj/item/card/id/away/old/sci - l_pocket = /obj/item/stack/medical/bruise_pack + l_pocket = /obj/item/stack/medical/suture assignedrole = "Ancient Crew" job_description = "Oldstation Crew" @@ -689,7 +686,7 @@ name = "ID, jumpsuit and shoes" uniform = /obj/item/clothing/under/color/random shoes = /obj/item/clothing/shoes/sneakers/black - id = /obj/item/card/id + id = /obj/item/card/id/no_banking r_hand = /obj/item/storage/box/syndie_kit/chameleon/ghostcafe @@ -697,15 +694,12 @@ ..() var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT if (CONFIG_GET(flag/grey_assistants)) - if(suited) - uniform = /obj/item/clothing/under/color/grey - else - uniform = /obj/item/clothing/under/color/jumpskirt/grey + uniform = suited ? /obj/item/clothing/under/color/grey : /obj/item/clothing/under/color/jumpskirt/grey else - if(suited) - uniform = /obj/item/clothing/under/color/random + if(SSevents.holidays && SSevents.holidays[PRIDE_MONTH]) + uniform = suited ? /obj/item/clothing/under/color/rainbow : /obj/item/clothing/under/color/jumpskirt/rainbow else - uniform = /obj/item/clothing/under/color/jumpskirt/random + uniform = suited ? /obj/item/clothing/under/color/random : /obj/item/clothing/under/color/jumpskirt/random /obj/item/storage/box/syndie_kit/chameleon/ghostcafe name = "ghost cafe costuming kit" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 7c373f2734..cacf361722 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -6,6 +6,7 @@ density = TRUE var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. + var/next_beep = 0 //Prevents spamming of the construction sound var/can_displace = TRUE //If the girder can be moved around by wrenching it max_integrity = 200 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE @@ -27,11 +28,17 @@ . += "[src] is disassembled! You probably shouldn't be able to see this examine message." /obj/structure/girder/attackby(obj/item/W, mob/user, params) + var/platingmodifier = 1 + if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) + platingmodifier = 0.7 + if(next_beep <= world.time) + next_beep = world.time + 10 + playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) add_fingerprint(user) if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") - if(W.use_tool(src, user, 40, volume=100)) + if(W.use_tool(src, user, 40*platingmodifier, volume=100)) to_chat(user, "You slice apart the girder.") var/obj/item/stack/sheet/metal/M = new (loc, 2) M.add_fingerprint(user) @@ -62,7 +69,7 @@ to_chat(user, "You need at least two rods to create a false wall!") return to_chat(user, "You start building a reinforced false wall...") - if(do_after(user, 20, target = src)) + if(do_after(user, 20*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -75,7 +82,7 @@ to_chat(user, "You need at least five rods to add plating!") return to_chat(user, "You start adding plating...") - if(do_after(user, 40, target = src)) + if(do_after(user, 40*platingmodifier, target = src)) if(S.get_amount() < 5) return S.use(5) @@ -96,7 +103,7 @@ to_chat(user, "You need two sheets of metal to create a false wall!") return to_chat(user, "You start building a false wall...") - if(do_after(user, 20, target = src)) + if(do_after(user, 20*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -109,7 +116,7 @@ to_chat(user, "You need two sheets of metal to finish a wall!") return to_chat(user, "You start adding plating...") - if (do_after(user, 40, target = src)) + if (do_after(user, 40*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -126,7 +133,7 @@ to_chat(user, "You need at least two sheets to create a false wall!") return to_chat(user, "You start building a reinforced false wall...") - if(do_after(user, 20, target = src)) + if(do_after(user, 20*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -139,7 +146,7 @@ if(S.get_amount() < 1) return to_chat(user, "You start finalizing the reinforced wall...") - if(do_after(user, 50, target = src)) + if(do_after(user, 50*platingmodifier, target = src)) if(S.get_amount() < 1) return S.use(1) @@ -153,7 +160,7 @@ if(S.get_amount() < 1) return to_chat(user, "You start reinforcing the girder...") - if(do_after(user, 60, target = src)) + if(do_after(user, 60*platingmodifier, target = src)) if(S.get_amount() < 1) return S.use(1) @@ -172,7 +179,7 @@ if(S.get_amount() < 2) to_chat(user, "You need at least two sheets to create a false wall!") return - if(do_after(user, 20, target = src)) + if(do_after(user, 20*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -188,7 +195,7 @@ to_chat(user, "You need at least two sheets to add plating!") return to_chat(user, "You start adding plating...") - if (do_after(user, 40, target = src)) + if (do_after(user, 40*platingmodifier, target = src)) if(S.get_amount() < 2) return S.use(2) @@ -294,7 +301,7 @@ /obj/structure/girder/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSGRILLE) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 61983dcb4f..20151a0bdb 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -129,7 +129,7 @@ /obj/structure/grille/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSGRILLE) @@ -267,7 +267,7 @@ var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 3, C.newavail() * 0.01, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN | TESLA_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. + tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 611a6d024d..0a5ba6a68c 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -130,7 +130,7 @@ // The crowd is pleased // The delay is to making large crowds have a longer laster applause var/delay_offset = 0 - for(var/mob/M in viewers(src, 7)) + for(var/mob/M in fov_viewers(world.view, src)) var/mob/living/carbon/human/C = M if (ishuman(M)) addtimer(CALLBACK(C, /mob/.proc/emote, "clap"), delay_offset * 0.3) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm new file mode 100644 index 0000000000..e68918c764 --- /dev/null +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -0,0 +1,179 @@ +GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50, + /obj/item/stack/ore/iron = 100, + /obj/item/stack/ore/plasma = 75, + /obj/item/stack/ore/silver = 50, + /obj/item/stack/ore/gold = 50, + /obj/item/stack/ore/diamond = 25, + /obj/item/stack/ore/bananium = 5, + /obj/item/stack/ore/titanium = 75)) + +/obj/structure/spawner/ice_moon + name = "cave entrance" + desc = "A hole in the ground, filled with monsters ready to defend it." + icon = 'icons/mob/nest.dmi' + icon_state = "hole" + faction = list("mining") + max_mobs = 3 + max_integrity = 250 + mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf) + move_resist = INFINITY + anchored = TRUE + +/obj/structure/spawner/ice_moon/Initialize() + . = ..() + clear_rock() + +/** + * Clears rocks around the spawner when it is created + * + */ +/obj/structure/spawner/ice_moon/proc/clear_rock() + for(var/turf/F in RANGE_TURFS(2, src)) + if(abs(src.x - F.x) + abs(src.y - F.y) > 3) + continue + if(ismineralturf(F)) + var/turf/closed/mineral/M = F + M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) + +/obj/structure/spawner/ice_moon/deconstruct(disassembled) + destroy_effect() + drop_loot() + return ..() + +/** + * Effects and messages created when the spawner is destroyed + * + */ +/obj/structure/spawner/ice_moon/proc/destroy_effect() + playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) + visible_message("[src] collapses, sealing everything inside!\nOres fall out of the cave as it is destroyed!") + +/** + * Drops items after the spawner is destroyed + * + */ +/obj/structure/spawner/ice_moon/proc/drop_loot() + for(var/type in GLOB.ore_probability) + var/chance = GLOB.ore_probability[type] + if(!prob(chance)) + continue + new type(loc, rand(5, 10)) + +/obj/structure/spawner/ice_moon/polarbear + max_mobs = 1 + spawn_time = 60 SECONDS + mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear) + +/obj/structure/spawner/ice_moon/polarbear/clear_rock() + for(var/turf/F in RANGE_TURFS(1, src)) + if(ismineralturf(F)) + var/turf/closed/mineral/M = F + M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) + +/obj/structure/spawner/ice_moon/demonic_portal + name = "demonic portal" + desc = "A portal that goes to another world, normal creatures couldn't survive there." + icon_state = "nether" + mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon) + light_range = 1 + light_color = LIGHT_COLOR_RED + +/obj/structure/spawner/ice_moon/demonic_portal/clear_rock() + for(var/turf/F in RANGE_TURFS(3, src)) + if(abs(src.x - F.x) + abs(src.y - F.y) > 5) + continue + if(ismineralturf(F)) + var/turf/closed/mineral/M = F + M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) + +/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect() + new /obj/effect/collapsing_demonic_portal(loc) + +/obj/structure/spawner/ice_moon/demonic_portal/drop_loot() + return + +/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp + mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp) + +/obj/structure/spawner/ice_moon/demonic_portal/snowlegion + mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril) + +/obj/effect/collapsing_demonic_portal + name = "collapsing demonic portal" + desc = "It's slowly fading!" + layer = TABLE_LAYER + icon = 'icons/mob/nest.dmi' + icon_state = "nether" + anchored = TRUE + density = TRUE + +/obj/effect/collapsing_demonic_portal/Initialize() + . = ..() + playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) + visible_message("[src] begins to collapse, cutting it off from this world!") + animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS) + addtimer(CALLBACK(src, .proc/collapse), 5 SECONDS) + +/obj/effect/collapsing_demonic_portal/proc/collapse() + visible_message("Something slips out of [src]!") + var/loot = rand(1, 28) + switch(loot) + if(1) + new /obj/item/clothing/suit/space/hardsuit/cult(loc) + if(2) + new /obj/item/clothing/glasses/godeye(loc) + if(3) + new /obj/item/reagent_containers/glass/bottle/potion/flight(loc) + if(4) + new /obj/item/organ/heart/cursed/wizard(loc) + if(5) + new /obj/item/jacobs_ladder(loc) + if(6) + new /obj/item/rod_of_asclepius(loc) + if(7) + new /obj/item/warp_cube/red(loc) + if(8) + new /obj/item/wisp_lantern(loc) + if(9) + new /obj/item/immortality_talisman(loc) + if(10) + new /obj/item/book/granter/spell/summonitem(loc) + if(11) + new /obj/item/clothing/neck/necklace/memento_mori(loc) + if(12) + new /obj/item/borg/upgrade/modkit/lifesteal(loc) + new /obj/item/bedsheet/cult(loc) + if(13) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(loc) + if(14) + new /obj/item/disk/design_disk/modkit_disc/bounty(loc) + if(15) + new /obj/item/ship_in_a_bottle(loc) + new /obj/item/oar(loc) + if(16) + new /obj/item/seeds/gatfruit(loc) + if(17) + new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc) + if(18) + new /obj/item/assembly/signaler/anomaly/bluespace(loc) + if(19) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(loc) + if(20) + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(loc) + if(21) + new /obj/item/slimepotion/transference(loc) + if(22) + new /obj/item/slime_extract/adamantine(loc) + if(23) + new /obj/item/weldingtool/abductor(loc) + if(24) + new /obj/structure/elite_tumor(loc) + if(25) + new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc) + if(26) + new /obj/item/clothing/shoes/winterboots/ice_boots(loc) + if(27) + new /obj/item/book/granter/spell/sacredflame(loc) + if(28) + new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc) + qdel(src) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index b10ca8002c..38133d9089 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -32,7 +32,6 @@ /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) if(!user.transferItemToLoc(I, src)) return - updateUsrDialog() to_chat(user, "You put [I] into [src].") return @@ -96,70 +95,82 @@ . = ..() if(.) return - user.set_machine(src) - var/dat + + var/list/items = list() if(mybag) - dat += "[mybag.name]
    " + items += list("Trash bag" = image(icon = mybag.icon, icon_state = mybag.icon_state)) if(mymop) - dat += "[mymop.name]
    " + items += list("Mop" = image(icon = mymop.icon, icon_state = mymop.icon_state)) if(mybroom) - dat += "[mybroom.name]
    " + items += list("Broom" = image(icon = mybroom.icon, icon_state = mybroom.icon_state)) if(myspray) - dat += "[myspray.name]
    " + items += list("Spray bottle" = image(icon = myspray.icon, icon_state = myspray.icon_state)) if(myreplacer) - dat += "[myreplacer.name]
    " - if(signs) - dat += "[signs] sign\s
    " - var/datum/browser/popup = new(user, "janicart", name, 240, 160) - popup.set_content(dat) - popup.open() + items += list("Light replacer" = image(icon = myreplacer.icon, icon_state = myreplacer.icon_state)) + var/obj/item/caution/sign = locate() in src + if(sign) + items += list("Sign" = image(icon = sign.icon, icon_state = sign.icon_state)) - -/obj/structure/janitorialcart/Topic(href, href_list) - if(!in_range(src, usr)) + if(!length(items)) return - if(!isliving(usr)) + items = sortList(items) + var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 38, require_near = TRUE) + if(!pick) return - var/mob/living/user = usr - if(href_list["garbage"]) - if(mybag) + switch(pick) + if("Trash bag") + if(!mybag) + return user.put_in_hands(mybag) to_chat(user, "You take [mybag] from [src].") mybag = null - if(href_list["mop"]) - if(mymop) + if("Mop") + if(!mymop) + return user.put_in_hands(mymop) to_chat(user, "You take [mymop] from [src].") mymop = null - if(href_list["broom"]) - if(mybroom) + if("Broom") + if(!mybroom) + return user.put_in_hands(mybroom) to_chat(user, "You take [mybroom] from [src].") mybroom = null - if(href_list["spray"]) - if(myspray) + if("Spray bottle") + if(!myspray) + return user.put_in_hands(myspray) to_chat(user, "You take [myspray] from [src].") myspray = null - if(href_list["replacer"]) - if(myreplacer) + if("Light replacer") + if(!myreplacer) + return user.put_in_hands(myreplacer) to_chat(user, "You take [myreplacer] from [src].") myreplacer = null - if(href_list["sign"]) - if(signs) - var/obj/item/caution/Sign = locate() in src - if(Sign) - user.put_in_hands(Sign) - to_chat(user, "You take \a [Sign] from [src].") - signs-- - else - WARNING("Signs ([signs]) didn't match contents") - signs = 0 + if("Sign") + if(signs <= 0) + return + user.put_in_hands(sign) + to_chat(user, "You take \a [sign] from [src].") + signs-- + else + return update_icon() - updateUsrDialog() +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/structure/janitorialcart/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + return TRUE /obj/structure/janitorialcart/update_overlays() . = ..() diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 53a1f609d1..f321498bfd 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -91,8 +91,13 @@ if (!is_ghost && !in_range(src, user)) return + var/list/tool_list = list( + "Up" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), + "Down" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH) + ) + if (up && down) - var/result = alert("Go up or down [src]?", "Ladder", "Up", "Down", "Cancel") + var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) if (!is_ghost && !in_range(src, user)) return // nice try switch(result) @@ -112,6 +117,11 @@ if(!is_ghost) add_fingerprint(user) +/obj/structure/ladder/proc/check_menu(mob/user) + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + /obj/structure/ladder/attack_hand(mob/user) . = ..() if(.) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c41d6d32af..6e497cff60 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -149,3 +149,30 @@ pixel_x = 0 pixel_y = 0 return TRUE + +/obj/structure/lattice/lava + name = "heatproof support lattice" + desc = "A specialized support beam for building across lava. Watch your step." + icon = 'icons/obj/smooth_structures/catwalk.dmi' + icon_state = "catwalk" + number_of_rods = 1 + color = "#5286b9ff" + smooth = SMOOTH_TRUE + canSmoothWith = null + obj_flags = CAN_BE_HIT | BLOCK_Z_FALL + resistance_flags = FIRE_PROOF | LAVA_PROOF + +/obj/structure/lattice/lava/deconstruction_hints(mob/user) + return "The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile." + +/obj/structure/lattice/lava/attackby(obj/item/C, mob/user, params) + . = ..() + if(istype(C, /obj/item/stack/tile/plasteel)) + var/obj/item/stack/tile/plasteel/P = C + if(P.use(1)) + to_chat(user, "You construct a floor plating, as lava settles around the rods.") + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + new /turf/open/floor/plating(locate(x, y, z)) + else + to_chat(user, "You need one floor tile to build atop [src].") + return diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm new file mode 100644 index 0000000000..4f6256e9c4 --- /dev/null +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -0,0 +1,86 @@ +//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks. +//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason + +/obj/structure/geyser + name = "geyser" + icon = 'icons/obj/lavaland/terrain.dmi' + icon_state = "geyser" + anchored = TRUE + + var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob + var/activated = FALSE //whether we are active and generating chems + var/reagent_id = /datum/reagent/fuel/oil + var/potency = 2 //how much reagents we add every process (2 seconds) + var/max_volume = 500 + var/start_volume = 50 + +/obj/structure/geyser/proc/start_chemming() + activated = TRUE + create_reagents(max_volume, DRAINABLE) + reagents.add_reagent(reagent_id, start_volume) + START_PROCESSING(SSfluids, src) //It's main function is to be plumbed, so use SSfluids + if(erupting_state) + icon_state = erupting_state + else + var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup") + I.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(I) + +/obj/structure/geyser/process() + if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive + reagents.add_reagent(reagent_id, potency) + +/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) + if(!_reinforced) + to_chat(user, "The [P.name] isn't strong enough!") + return + if(activated) + to_chat(user, "The [name] is already active!") + return + + to_chat(user, "You start vigorously plunging [src]!") + if(do_after(user, 50 * P.plunge_mod, target = src) && !activated) + start_chemming() + +/obj/structure/geyser/random + erupting_state = null + var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) + +/obj/structure/geyser/random/Initialize() + . = ..() + reagent_id = pickweight(options) + +/obj/item/plunger + name = "plunger" + desc = "It's a plunger for plunging." + icon = 'icons/obj/watercloset.dmi' + icon_state = "plunger" + + slot_flags = ITEM_SLOT_MASK + + var/plunge_mod = 1 //time*plunge_mod = total time we take to plunge an object + var/reinforced = FALSE //whether we do heavy duty stuff like geysers + +/obj/item/plunger/attack_obj(obj/O, mob/living/user) + if(!O.plunger_act(src, user, reinforced)) + return ..() + +/obj/item/plunger/throw_impact(atom/hit_atom, datum/thrownthing/tt) + . = ..() + if(tt.target_zone != BODY_ZONE_HEAD) + return + if(iscarbon(hit_atom)) + var/mob/living/carbon/H = hit_atom + if(!H.wear_mask) + H.equip_to_slot_if_possible(src, ITEM_SLOT_MASK) + H.visible_message("The plunger slams into [H]'s face!", "The plunger suctions to your face!") + +/obj/item/plunger/reinforced + name = "reinforced plunger" + desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging." + icon_state = "reinforced_plunger" + + reinforced = TRUE + plunge_mod = 0.8 + + custom_premium_price = 1200 diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 6ce0228f54..2911babd83 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -25,6 +25,9 @@ /obj/structure/spawner/lavaland/legion mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) +/obj/structure/spawner/lavaland/icewatcher + mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) + GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/Initialize() . = ..() @@ -94,4 +97,4 @@ GLOBAL_LIST_INIT(tendrils, list()) for(var/turf/T in range(2,src)) if(!T.density) T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 2244742f3a..164e597117 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -21,24 +21,21 @@ return TRUE ///Handles the weaving. -/obj/structure/loom/proc/weave(obj/item/stack/sheet/S, mob/user) - if(!istype(S) || !S.is_fabric) +/obj/structure/loom/proc/weave(obj/item/stack/sheet/cotton/W, mob/user) + if(!istype(W)) return FALSE if(!anchored) user.show_message("The loom needs to be wrenched down.", MSG_VISUAL) return FALSE - if(S.amount < FABRIC_PER_SHEET) - user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1) + if(W.amount < FABRIC_PER_SHEET) + user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", MSG_VISUAL) return FALSE - user.show_message("You start weaving \the [S.name] through the loom..", MSG_VISUAL) - if(S.use_tool(src, user, S.pull_effort)) - if(S.amount >= FABRIC_PER_SHEET) - new S.loom_result(drop_location()) - S.use(FABRIC_PER_SHEET) - user.show_message("You weave \the [S.name] into a workable fabric.", MSG_VISUAL) + user.show_message("You start weaving \the [W.name] through the loom..", MSG_VISUAL) + if(W.use_tool(src, user, W.pull_effort)) + if(W.amount >= FABRIC_PER_SHEET) + new W.loom_result(drop_location()) + W.use(FABRIC_PER_SHEET) + user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) return TRUE -/obj/structure/loom/unanchored - anchored = FALSE - #undef FABRIC_PER_SHEET \ No newline at end of file diff --git a/code/game/objects/structures/loot_pile.dm b/code/game/objects/structures/loot_pile.dm new file mode 100644 index 0000000000..b6249ec1e4 --- /dev/null +++ b/code/game/objects/structures/loot_pile.dm @@ -0,0 +1,66 @@ + /* + * Loot piles structures, somewhat inspired from Polaris 13 ones but without the one search per pile ckey/mind restriction + * because the actual code is located its own element and has enough variables already. the piles themselves merely cosmetical. + */ +/obj/structure/loot_pile + name = "pile of junk" + desc = "Lots of junk lying around. They say one man's trash is another man's treasure." + icon = 'icons/obj/loot_piles.dmi' + icon_state = "randompile" + density = FALSE + anchored = TRUE + var/loot_amount = 5 + var/delete_on_depletion = FALSE + var/can_use_hands = TRUE + var/scavenge_time = 12 SECONDS + var/allowed_tools = list(TOOL_SHOVEL = 0.6) //list of tool_behaviours with associated speed multipliers (lower is better) + var/icon_states_to_use = list("junk_pile1", "junk_pile2", "junk_pile3", "junk_pile4", "junk_pile5") + var/list/loot + + /* + * Associated values in this list are not weights but numbers of times the kery can be rolled + * before being removed from ALL piles with same kind. This is why I wanted 'scavenging' to be an element and not a component. + */ + var/list/unique_loot + + /* + * used for restrictions such as "one per mind", "one per ckey". Depending on the setting, these can be either limited to + * the current pile or shared throughout all atoms attached to this element. + */ + var/loot_restriction = NO_LOOT_RESTRICTION + var/maximum_loot_per_player = 1 + +/obj/structure/loot_pile/Initialize() + . = ..() + icon_state = pick(icon_states_to_use) + +/obj/structure/loot_pile/ComponentInitialize() + . = ..() + if(loot) + AddElement(/datum/element/scavenging, loot_amount, loot, unique_loot, scavenge_time, can_use_hands, allowed_tools, null, delete_on_depletion, loot_restriction, maximum_loot_per_player) + +//uses the maintenance_loot global list, mostly boring stuff and mices. +/obj/structure/loot_pile/maint + name = "trash pile" + desc = "A heap of garbage, but maybe there's something interesting inside?" + density = TRUE + layer = TABLE_LAYER + climbable = TRUE + pass_flags = LETPASSTHROW + loot = list( + SCAVENGING_FOUND_NOTHING = 50, + SCAVENGING_SPAWN_MOUSE = 10, + SCAVENGING_SPAWN_MICE = 5, + SCAVENGING_SPAWN_TOM = 1, + /obj/item/clothing/gloves/color/yellow = 0.5) + unique_loot = list(/obj/item/clothing/gloves/color/yellow = 5, SCAVENGING_SPAWN_TOM = 1) + +/obj/structure/loot_pile/maint/ComponentInitialize() + var/static/safe_maint_items + if(!safe_maint_items) + safe_maint_items = list() + for(var/A in GLOB.maintenance_loot) + if(ispath(A, /obj/item)) + safe_maint_items[A] = GLOB.maintenance_loot[A] + loot += safe_maint_items + return ..() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index e5ca09c7b8..65e1b7dd9a 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -4,6 +4,7 @@ desc = "Mirror mirror on the wall, who's the most robust of them all?" icon = 'icons/obj/watercloset.dmi' icon_state = "mirror" + plane = ABOVE_WALL_PLANE density = FALSE anchored = TRUE max_integrity = 200 @@ -158,11 +159,24 @@ H.set_species(newrace, icon_update=0) if(H.dna.species.use_skintones) - var/new_s_tone = input(user, "Choose your skin tone:", "Race change") as null|anything in GLOB.skin_tones - + var/list/choices = GLOB.skin_tones + if(CONFIG_GET(flag/allow_custom_skintones)) + choices += "custom" + var/new_s_tone = input(H, "Choose your skin tone:", "Race change") as null|anything in choices if(new_s_tone) - H.skin_tone = new_s_tone - H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) + if(new_s_tone == "custom") + var/default = H.dna.skin_tone_override || null + var/custom_tone = input(user, "Choose your custom skin tone:", "Race change", default) as color|null + if(custom_tone) + var/temp_hsv = RGBtoHSV(new_s_tone) + if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + to_chat(H,"Invalid color. Your color is not bright enough.") + else + H.skin_tone = custom_tone + H.dna.skin_tone_override = custom_tone + else + H.skin_tone = new_s_tone + H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) if(MUTCOLORS in H.dna.species.species_traits) var/new_mutantcolor = input(user, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8cf5b1ee66..79a7ce0519 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -333,7 +333,7 @@ GLOBAL_LIST_EMPTY(crematoriums) to_chat(user, "That's not connected to anything!") /obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user) - if(!ismovableatom(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) + if(!ismovable(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) return if(!ismob(O)) if(!istype(O, /obj/structure/closet/body_bag)) @@ -375,6 +375,6 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm deleted file mode 100644 index bba51035fe..0000000000 --- a/code/game/objects/structures/musician.dm +++ /dev/null @@ -1,383 +0,0 @@ - -#define MUSICIAN_HEARCHECK_MINDELAY 4 -#define MUSIC_MAXLINES 600 -#define MUSIC_MAXLINECHARS 150 - -/datum/song - var/name = "Untitled" - var/list/lines = new() - var/tempo = 5 // delay between notes - - var/playing = 0 // if we're playing - var/help = 0 // if help is open - var/edit = 1 // if we're in editing mode - var/repeat = 0 // number of times remaining to repeat - var/max_repeats = 10 // maximum times we can repeat - - var/instrumentDir = "piano" // the folder with the sounds - var/instrumentExt = "ogg" // the file extension - var/obj/instrumentObj = null // the associated obj playing the sound - var/last_hearcheck = 0 - var/list/hearing_mobs - -/datum/song/New(dir, obj, ext = "ogg") - tempo = sanitize_tempo(tempo) - instrumentDir = dir - instrumentObj = obj - instrumentExt = ext - -/datum/song/Destroy() - instrumentObj = null - return ..() - -// note is a number from 1-7 for A-G -// acc is either "b", "n", or "#" -// oct is 1-8 (or 9 for C) -/datum/song/proc/playnote(note, acc as text, oct) - // handle accidental -> B<>C of E<>F - if(acc == "b" && (note == 3 || note == 6)) // C or F - if(note == 3) - oct-- - note-- - acc = "n" - else if(acc == "#" && (note == 2 || note == 5)) // B or E - if(note == 2) - oct++ - note++ - acc = "n" - else if(acc == "#" && (note == 7)) //G# - note = 1 - acc = "b" - else if(acc == "#") // mass convert all sharps to flats, octave jump already handled - acc = "b" - note++ - - // check octave, C is allowed to go to 9 - if(oct < 1 || (note == 3 ? oct > 9 : oct > 8)) - return - - // now generate name - var/soundfile = "sound/instruments/[instrumentDir]/[ascii2text(note+64)][acc][oct].[instrumentExt]" - soundfile = file(soundfile) - // make sure the note exists - if(!fexists(soundfile)) - return - // and play - var/turf/source = get_turf(instrumentObj) - if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) - LAZYCLEARLIST(hearing_mobs) - for(var/mob/M in get_hearers_in_view(15, source)) - if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) - continue - LAZYADD(hearing_mobs, M) - last_hearcheck = world.time - - var/sound/music_played = sound(soundfile) - for(var/i in hearing_mobs) - var/mob/M = i - M.playsound_local(source, null, 100, falloff = 5, S = music_played) - -/datum/song/proc/updateDialog(mob/user) - instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise - -/datum/song/proc/shouldStopPlaying(mob/user) - if(instrumentObj) - if(!user.canUseTopic(instrumentObj, TRUE, FALSE, FALSE, FALSE)) - return TRUE - return !instrumentObj.anchored // add special cases to stop in subclasses - else - return TRUE - -/datum/song/proc/playsong(mob/user) - while(repeat >= 0) - var/cur_oct[7] - var/cur_acc[7] - for(var/i = 1 to 7) - cur_oct[i] = 3 - cur_acc[i] = "n" - - for(var/line in lines) - for(var/beat in splittext(lowertext(line), ",")) - var/list/notes = splittext(beat, "/") - for(var/note in splittext(notes[1], "-")) - if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case - playing = FALSE - hearing_mobs = null - return - if(!length(note)) - continue - var/cur_note = text2ascii(note) - 96 - if(cur_note < 1 || cur_note > 7) - continue - var/notelen = length(note) - var/ni = "" - for(var/i = length(note[1]) + 1, i <= notelen, i += length(ni)) - ni = note[i] - if(!text2num(ni)) - if(ni == "#" || ni == "b" || ni == "n") - cur_acc[cur_note] = ni - else if(ni == "s") - cur_acc[cur_note] = "#" // so shift is never required - else - cur_oct[cur_note] = text2num(ni) - if(user.dizziness > 0 && prob(user.dizziness / 2)) - cur_note = CLAMP(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7) - if(user.dizziness > 0 && prob(user.dizziness / 5)) - if(prob(30)) - cur_acc[cur_note] = "#" - else if(prob(42)) - cur_acc[cur_note] = "b" - else if(prob(75)) - cur_acc[cur_note] = "n" - playnote(cur_note, cur_acc[cur_note], cur_oct[cur_note]) - if(notes.len >= 2 && text2num(notes[2])) - sleep(sanitize_tempo(tempo / text2num(notes[2]))) - else - sleep(tempo) - repeat-- - hearing_mobs = null - playing = FALSE - repeat = 0 - updateDialog(user) - -/datum/song/proc/interact(mob/user) - var/dat = "" - - if(lines.len > 0) - dat += "

    Playback

    " - if(!playing) - dat += "Play Stop

    " - dat += "Repeat Song: " - dat += repeat > 0 ? "--" : "--" - dat += " [repeat] times " - dat += repeat < max_repeats ? "++" : "++" - dat += "
    " - else - dat += "Play Stop
    " - dat += "Repeats left: [repeat]
    " - if(!edit) - dat += "
    Show Editor
    " - else - dat += "

    Editing

    " - dat += "Hide Editor" - dat += " Start a New Song" - dat += " Import a Song

    " - var/bpm = round(600 / tempo) - dat += "Tempo: - [bpm] BPM +

    " - var/linecount = 0 - for(var/line in lines) - linecount += 1 - dat += "Line [linecount]: Edit X [line]
    " - dat += "Add Line

    " - if(help) - dat += "Hide Help
    " - dat += {" - Lines are a series of chords, separated by commas (,), each with notes separated by hyphens (-).
    - Every note in a chord will play together, with chord timed by the tempo.
    -
    - Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
    - By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
    - Example: C,D,E,F,G,A,B will play a C major scale.
    - After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
    - Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
    - A pause may be denoted by an empty chord: C,E,,C,G
    - To make a chord be a different time, end it with /x, where the chord length will be length
    - defined by tempo / x: C,G/2,E/4
    - Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 -
    - Lines may be up to [MUSIC_MAXLINECHARS] characters.
    - A song may only contain up to [MUSIC_MAXLINES] lines.
    - "} - else - dat += "Show Help
    " - - var/datum/browser/popup = new(user, "instrument", instrumentObj.name, 700, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(instrumentObj.icon, instrumentObj.icon_state)) - popup.open() - -/datum/song/proc/ParseSong(text) - set waitfor = FALSE - //split into lines - lines = splittext(text, "\n") - if(lines.len) - var/bpm_string = "BPM: " - if(findtext(lines[1], bpm_string, 1, length(bpm_string) + 1)) - var/divisor = text2num(copytext(lines[1], length(bpm_string) + 1)) || 120 // default - tempo = sanitize_tempo(600 / round(divisor, 1)) - lines.Cut(1, 2) - else - tempo = sanitize_tempo(5) // default 120 BPM - if(lines.len > MUSIC_MAXLINES) - to_chat(usr, "Too many lines!") - lines.Cut(MUSIC_MAXLINES + 1) - var/linenum = 1 - for(var/l in lines) - if(length_char(l) > MUSIC_MAXLINECHARS) - to_chat(usr, "Line [linenum] too long!") - lines.Remove(l) - else - linenum++ - updateDialog(usr) // make sure updates when complete - -/datum/song/Topic(href, href_list) - if(!usr.canUseTopic(instrumentObj, TRUE, FALSE, FALSE, FALSE)) - usr << browse(null, "window=instrument") - usr.unset_machine() - return - - instrumentObj.add_fingerprint(usr) - - if(href_list["newsong"]) - lines = new() - tempo = sanitize_tempo(5) // default 120 BPM - name = "" - - else if(href_list["import"]) - var/t = "" - do - t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message) - if(!in_range(instrumentObj, usr)) - return - - if(length_char(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") - if(cont == "no") - break - while(length_char(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - ParseSong(t) - - else if(href_list["help"]) - help = text2num(href_list["help"]) - 1 - - else if(href_list["edit"]) - edit = text2num(href_list["edit"]) - 1 - - if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. - if(playing) - return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing. - repeat += round(text2num(href_list["repeat"])) - if(repeat < 0) - repeat = 0 - if(repeat > max_repeats) - repeat = max_repeats - - else if(href_list["tempo"]) - tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) - - else if(href_list["play"]) - playing = TRUE - spawn() - playsong(usr) - - else if(href_list["newline"]) - var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null) - if(!newline || !in_range(instrumentObj, usr)) - return - if(lines.len > MUSIC_MAXLINES) - return - if(length(newline) > MUSIC_MAXLINECHARS) - newline = copytext(newline, 1, MUSIC_MAXLINECHARS) - lines.Add(newline) - - else if(href_list["deleteline"]) - var/num = round(text2num(href_list["deleteline"])) - if(num > lines.len || num < 1) - return - lines.Cut(num, num+1) - - else if(href_list["modifyline"]) - var/num = round(text2num(href_list["modifyline"]),1) - var/content = stripped_input(usr, "Enter your line: ", instrumentObj.name, lines[num], MUSIC_MAXLINECHARS) - if(!content || !in_range(instrumentObj, usr)) - return - if(num > lines.len || num < 1) - return - lines[num] = content - - else if(href_list["stop"]) - playing = FALSE - hearing_mobs = null - - updateDialog(usr) - return - -/datum/song/proc/sanitize_tempo(new_tempo) - new_tempo = abs(new_tempo) - return max(round(new_tempo, world.tick_lag), world.tick_lag) - -// subclass for handheld instruments, like violin -/datum/song/handheld - -/datum/song/handheld/updateDialog(mob/user) - instrumentObj.interact(user) - -/datum/song/handheld/shouldStopPlaying() - if(instrumentObj) - return !isliving(instrumentObj.loc) - else - return TRUE - - -////////////////////////////////////////////////////////////////////////// - - -/obj/structure/piano - name = "space minimoog" - icon = 'icons/obj/musician.dmi' - icon_state = "minimoog" - anchored = TRUE - density = TRUE - var/datum/song/song - -/obj/structure/piano/unanchored - anchored = FALSE - -/obj/structure/piano/New() - ..() - song = new("piano", src) - - if(prob(50) && icon_state == initial(icon_state)) - name = "space minimoog" - desc = "This is a minimoog, like a space piano, but more spacey!" - icon_state = "minimoog" - else - name = "space piano" - desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't." - icon_state = "piano" - -/obj/structure/piano/Destroy() - qdel(song) - song = null - return ..() - -/obj/structure/piano/Initialize(mapload) - . = ..() - if(mapload) - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded - -/obj/structure/piano/attack_hand(mob/user) - . = ..() - if(.) - return - interact(user) - -/obj/structure/piano/attack_paw(mob/user) - return attack_hand(user) - -/obj/structure/piano/interact(mob/user) - ui_interact(user) - -/obj/structure/piano/ui_interact(mob/user) - if(!user || !anchored) - return - - if(!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") - return 1 - user.set_machine(src) - song.interact(user) - -/obj/structure/piano/wrench_act(mob/living/user, obj/item/I) - default_unfasten_wrench(user, I, 40) - return TRUE diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index f4bca1f900..68da53aa6c 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -3,6 +3,7 @@ desc = "A board for pinning important notices upon." icon = 'icons/obj/stationobjs.dmi' icon_state = "nboard00" + plane = ABOVE_WALL_PLANE density = FALSE anchored = TRUE max_integrity = 150 diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index a8a5a577c2..97eadff5f6 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -4,11 +4,13 @@ icon_state = "human_male" density = TRUE anchored = TRUE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 max_integrity = 200 - var/timer = 240 //eventually the person will be freed + var/timer = 8 MINUTES //eventually the person will be freed var/mob/living/petrified_mob -/obj/structure/statue/petrified/New(loc, mob/living/L, statue_timer) +/obj/structure/statue/petrified/Initialize(mapload, mob/living/L, statue_timer) + . = ..() if(statue_timer) timer = statue_timer if(L) @@ -17,25 +19,18 @@ L.buckled.unbuckle_mob(L,force=1) L.visible_message("[L]'s skin rapidly turns to marble!", "Your body freezes up! Can't... move... can't... think...") L.forceMove(src) - ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) + ADD_TRAIT(L, TRAIT_MUTE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_EMOTEMUTE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_LOOC_MUTE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_AOOC_MUTE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOMOVE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOPICKUP, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOUSE, STATUE_TRAIT) L.faction += "mimic" //Stops mimics from instaqdeling people in statues L.status_flags |= GODMODE obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues max_integrity = obj_integrity - START_PROCESSING(SSobj, src) - ..() - -/obj/structure/statue/petrified/process() - if(!petrified_mob) - STOP_PROCESSING(SSobj, src) - timer-- - petrified_mob.Stun(40) //So they can't do anything while petrified - if(timer <= 0) - STOP_PROCESSING(SSobj, src) - qdel(src) - -/obj/structure/statue/petrified/contents_explosion(severity, target) - return + QDEL_IN(src, timer) /obj/structure/statue/petrified/handle_atom_del(atom/A) if(A == petrified_mob) @@ -59,7 +54,13 @@ if(petrified_mob) petrified_mob.status_flags &= ~GODMODE petrified_mob.forceMove(loc) - REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) + REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_EMOTEMUTE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_LOOC_MUTE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_AOOC_MUTE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOMOVE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOPICKUP, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOUSE, STATUE_TRAIT) petrified_mob.take_overall_damage((petrified_mob.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= "mimic" petrified_mob = null diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 84add2f65f..aa31fe9542 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -3,6 +3,7 @@ anchored = TRUE opacity = 0 density = FALSE + plane = ABOVE_WALL_PLANE layer = SIGN_LAYER max_integrity = 100 armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) @@ -35,6 +36,7 @@ "You unfasten [src].") var/obj/item/sign_backing/SB = new (get_turf(user)) SB.icon_state = icon_state + SB.set_custom_materials(custom_materials) //This is here so picture frames and wooden things don't get messed up. SB.sign_path = type SB.setDir(dir) qdel(src) diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm index 12932bbab6..b4fd823e76 100644 --- a/code/game/objects/structures/signs/signs_departments.dm +++ b/code/game/objects/structures/signs/signs_departments.dm @@ -60,6 +60,11 @@ desc = "A sign labelling a restroom." icon_state = "restroom" +/obj/structure/sign/departments/showers + name ="\improper SHOWER" + desc = "A sign labelling showers." + icon_state = "showerroom" + /obj/structure/sign/departments/medbay name = "\improper MEDBAY" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm index 1e3bfd6d36..ee29ef7443 100644 --- a/code/game/objects/structures/signs/signs_maps.dm +++ b/code/game/objects/structures/signs/signs_maps.dm @@ -55,3 +55,18 @@ name = "cafe" desc = "A direction sign, pointing out which way the Cafe is." icon_state = "direction_cafe" + +obj/structure/sign/directions/rooms + name = "room" + desc = "Room numbers, helps others find you!" + icon_state = "roomnum" + +obj/structure/sign/directions/dorms + name = "dorm" + desc = "Dorm numbers, help others find you, or you find others." + icon_state = "dormnum" + +obj/structure/sign/directions/cells + name = "room" + desc = "So the less fortunate amongst us know where they'll be staying." + icon_state = "cellnum" diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/signs/signs_plaques.dm index 8a20456911..d1067f1963 100644 --- a/code/game/objects/structures/signs/signs_plaques.dm +++ b/code/game/objects/structures/signs/signs_plaques.dm @@ -23,7 +23,7 @@ /obj/structure/sign/plaques/kiddie name = "\improper AI developers plaque" - desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"." + desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be stupid. Beneath the image, someone has scratched the word \"PACKETS\"." icon_state = "kiddieplaque" /obj/structure/sign/plaques/kiddie/badger @@ -46,4 +46,4 @@ name = "Mr. Deempisi portrait" desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'" icon_state = "monkey_painting" - \ No newline at end of file + custom_materials = list(/datum/material/wood = 2000) //The same as /obj/structure/sign/picture_frame diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm index f735ed7bc9..3138d44e9d 100644 --- a/code/game/objects/structures/signs/signs_warning.dm +++ b/code/game/objects/structures/signs/signs_warning.dm @@ -73,3 +73,8 @@ name = "\improper ENGINEERING SAFETY" desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift." icon_state = "safety" + +/obj/structure/sign/warning/explosives + name = "\improper HIGH EXPLOSIVES sign" + desc = "A warning sign which reads 'HIGH EXPLOSIVES'." + icon_state = "explosives" diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 9a6b24b472..466912f93e 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -8,12 +8,17 @@ max_integrity = 100 var/oreAmount = 5 var/material_drop_type = /obj/item/stack/sheet/metal + var/impressiveness = 15 CanAtmosPass = ATMOS_PASS_DENSITY +/obj/structure/statue/Initialize() + . = ..() + AddElement(/datum/element/art, impressiveness) + addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, impressiveness * 75)), 0) + /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) - user.changeNext_move(CLICK_CD_MELEE) if(!(flags_1 & NODECONSTRUCT_1)) if(default_unfasten_wrench(user, W)) return @@ -30,15 +35,6 @@ return return ..() -/obj/structure/statue/attack_hand(mob/living/user) - . = ..() - if(.) - return - user.changeNext_move(CLICK_CD_MELEE) - add_fingerprint(user) - user.visible_message("[user] rubs some dust off from the [name]'s surface.", \ - "You rub some dust off from the [name]'s surface.") - /obj/structure/statue/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(material_drop_type) @@ -58,6 +54,7 @@ material_drop_type = /obj/item/stack/sheet/mineral/uranium var/last_event = 0 var/active = null + impressiveness = 25 // radiation makes an impression /obj/structure/statue/uranium/nuke name = "statue of a nuclear fission explosive" @@ -101,6 +98,7 @@ max_integrity = 200 material_drop_type = /obj/item/stack/sheet/mineral/plasma desc = "This statue is suitably made from plasma." + impressiveness = 20 /obj/structure/statue/plasma/scientist name = "statue of a scientist" @@ -151,6 +149,7 @@ max_integrity = 300 material_drop_type = /obj/item/stack/sheet/mineral/gold desc = "This is a highly valuable statue made from gold." + impressiveness = 30 /obj/structure/statue/gold/hos name = "statue of the head of security" @@ -178,6 +177,7 @@ max_integrity = 300 material_drop_type = /obj/item/stack/sheet/mineral/silver desc = "This is a valuable statue made from silver." + impressiveness = 25 /obj/structure/statue/silver/md name = "statue of a medical officer" @@ -205,6 +205,7 @@ max_integrity = 1000 material_drop_type = /obj/item/stack/sheet/mineral/diamond desc = "This is a very expensive diamond statue." + impressiveness = 60 /obj/structure/statue/diamond/captain name = "statue of THE captain." @@ -225,6 +226,7 @@ material_drop_type = /obj/item/stack/sheet/mineral/bananium desc = "A bananium statue with a small engraving:'HOOOOOOONK'." var/spam_flag = 0 + impressiveness = 65 /obj/structure/statue/bananium/clown name = "statue of a clown" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 550c0216c6..012d92e103 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -103,7 +103,7 @@ /obj/structure/table/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) @@ -163,6 +163,9 @@ if(istype(I, /obj/item/storage/bag/tray)) var/obj/item/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty + for(var/x in T.contents) + var/obj/item/item = x + AfterPutItemOnTable(item, user) SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) user.visible_message("[user] empties [I] on [src].") return @@ -175,15 +178,19 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) - return 1 + I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + AfterPutItemOnTable(I, user) + return TRUE else return ..() +/obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) + return + /obj/structure/table/alt_attack_hand(mob/user) if(user && Adjacent(user) && !user.incapacitated()) - user.setClickCooldown(4) + user.changeNext_move(CLICK_CD_MELEE*0.5) if(istype(user) && user.a_intent == INTENT_HARM) user.visible_message("[user] slams [user.p_their()] palms down on [src].", "You slam your palms down on [src].") playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) @@ -211,9 +218,40 @@ /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' icon_state = "table" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS buildstack = null //No buildstack, so generate from mat datums +///Table on wheels +/obj/structure/table/rolling + name = "Rolling table" + desc = "A NT brand \"Rolly poly\" rolling table. It can and will move." + anchored = FALSE + smooth = SMOOTH_FALSE + canSmoothWith = list() + icon = 'icons/obj/smooth_structures/rollingtable.dmi' + icon_state = "rollingtable" + var/list/attached_items = list() + +/obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) + . = ..() + attached_items += I + RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/RemoveItemFromTable) //Listen for the pickup event, unregister on pick-up so we aren't moved + +/obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) + if(newloc != loc) //Did we not move with the table? because that shit's ok + return FALSE + attached_items -= source + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/obj/structure/table/rolling/Moved(atom/OldLoc, Dir) + for(var/mob/M in OldLoc.contents)//Kidnap everyone on top + M.forceMove(loc) + for(var/x in attached_items) + var/atom/movable/AM = x + if(!AM.Move(loc)) + RemoveItemFromTable(AM, AM.loc) + return TRUE + /* * Glass tables */ @@ -610,7 +648,7 @@ /obj/structure/rack/CanAStarPass(ID, dir, caller) . = !density - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 17ca178cd9..c3b388fc29 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -152,8 +152,8 @@ pod_moving = 0 if(!QDELETED(pod)) var/datum/gas_mixture/floor_mixture = loc.return_air() - ARCHIVE_TEMPERATURE(floor_mixture) - ARCHIVE_TEMPERATURE(pod.air_contents) + ARCHIVE(floor_mixture) + ARCHIVE(pod.air_contents) pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on air_update_turf() diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 8044bb9bb7..4c8379d14f 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -80,10 +80,11 @@ name = "shock trap" desc = "A trap that will shock and render you immobile. You'd better avoid it." icon_state = "trap-shock" + var/stun_time = 100 /obj/structure/trap/stun/trap_effect(mob/living/L) L.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message. - L.DefaultCombatKnockdown(100) + L.Paralyze(stun_time) /obj/structure/trap/fire name = "flame trap" @@ -151,3 +152,75 @@ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc) new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc) QDEL_IN(src, 30) + +//fugitive traps +/obj/structure/trap/stun/hunter + name = "bounty trap" + desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it." + icon = 'icons/obj/objects.dmi' + icon_state = "bounty_trap_on" + stun_time = 200 + var/obj/item/bountytrap/stored_item + var/caught = FALSE + +/obj/structure/trap/stun/hunter/Initialize(mapload) + . = ..() + time_between_triggers = 10 + +/obj/structure/trap/stun/hunter/Crossed(atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive)) + return + caught = TRUE + . = ..() + +/obj/structure/trap/stun/hunter/flare() + ..() + stored_item.forceMove(get_turf(src)) + forceMove(stored_item) + if(caught) + stored_item.announce_fugitive() + caught = FALSE + +/obj/item/bountytrap + name = "bounty trap" + desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive." + icon = 'icons/obj/objects.dmi' + icon_state = "bounty_trap_off" + var/obj/structure/trap/stun/hunter/stored_trap + var/obj/item/radio/radio + var/datum/effect_system/spark_spread/spark_system + +/obj/item/bountytrap/Initialize(mapload) + . = ..() + radio = new(src) + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + spark_system = new + spark_system.set_up(4,1,src) + spark_system.attach(src) + name = "[name] #[rand(1, 999)]" + stored_trap = new(src) + stored_trap.name = name + stored_trap.stored_item = src + +/obj/item/bountytrap/proc/announce_fugitive() + spark_system.start() + playsound(src, 'sound/machines/ding.ogg', 50, TRUE) + radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON) + +/obj/item/bountytrap/attack_self(mob/living/user) + var/turf/T = get_turf(src) + if(!user || !user.transferItemToLoc(src, T))//visibly unequips + return + to_chat(user, "You set up [src]. Examine while close to disarm it.") + stored_trap.forceMove(T)//moves trap to ground + forceMove(stored_trap)//moves item into trap + +/obj/item/bountytrap/Destroy() + qdel(stored_trap) + QDEL_NULL(radio) + QDEL_NULL(spark_system) + . = ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 5f806e7fc4..5eecc6962a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -11,13 +11,20 @@ var/cistern = 0 //if the cistern bit is open var/w_items = 0 //the combined w_class of all the items in the cistern var/mob/living/swirlie = null //the mob being given a swirlie - + var/buildstacktype = /obj/item/stack/sheet/metal //they're metal now, shut up + var/buildstackamount = 1 /obj/structure/toilet/Initialize() . = ..() open = round(rand(0, 1)) update_icon() +/obj/structure/toilet/Destroy() + if(loc) + for(var/A in contents) + var/atom/movable/AM = A + AM.forceMove(loc) + return ..() /obj/structure/toilet/attack_hand(mob/living/user) . = ..() @@ -66,17 +73,26 @@ else I.forceMove(drop_location()) to_chat(user, "You find [I] in the cistern.") - w_items -= I.w_class + w_items = max(w_items - I.w_class, 0) else open = !open update_icon() - /obj/structure/toilet/update_icon_state() icon_state = "toilet[open][cistern]" +/obj/structure/toilet/deconstruct() + if(!(flags_1 & NODECONSTRUCT_1)) + if(buildstacktype) + new buildstacktype(loc,buildstackamount) + else + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(loc, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + ..() /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) + add_fingerprint(user) if(istype(I, /obj/item/crowbar)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) @@ -84,7 +100,9 @@ user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() - + else if(I.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) + I.play_tool_sound(src) + deconstruct() else if(cistern) if(user.a_intent != INTENT_HARM) if(I.w_class > WEIGHT_CLASS_NORMAL) @@ -99,6 +117,10 @@ w_items += I.w_class to_chat(user, "You carefully place [I] into the cistern.") + if(istype(I, /obj/item/reagent_containers/food/snacks/cube)) + var/obj/item/reagent_containers/food/snacks/cube/cube = I + cube.Expand() + return else if(istype(I, /obj/item/reagent_containers)) if (!open) return @@ -116,12 +138,28 @@ . = ..() if (secret_type) secret = new secret_type(src) - secret.desc += " It's a secret!" - w_items += secret.w_class + secret.desc += "" //In case you want to add something to the item that spawns contents += secret +/obj/structure/toilet/secret/LateInitialize() + . = ..() + w_items = 0 //recalculate total weight thanks to the secret. + for(var/obj/item/I in contents) + w_items += I.w_class +/obj/structure/toilet/secret/low_loot + secret_type = /obj/effect/spawner/lootdrop/low_loot_toilet +/obj/structure/toilet/secret/high_loot + secret_type = /obj/effect/spawner/lootdrop/high_loot_toilet + +/obj/structure/toilet/secret/prison + secret_type = /obj/effect/spawner/lootdrop/prison_loot_toilet + +/obj/structure/toilet/greyscale + + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + buildstacktype = null /obj/structure/urinal name = "urinal" @@ -194,7 +232,6 @@ exposed = !exposed return TRUE - /obj/item/reagent_containers/food/urinalcake name = "urinal cake" desc = "The noble urinal cake, protecting the station's pipes from the station's pee. Do not eat." @@ -278,7 +315,6 @@ add_hiddenprint(user) return TRUE - /obj/machinery/shower/update_overlays() . = ..() if(on) @@ -315,7 +351,6 @@ else if(isobj(AM)) wash_obj(AM) - /obj/machinery/shower/proc/wash_obj(obj/O) . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) . = O.clean_blood() @@ -325,7 +360,6 @@ I.acid_level = 0 I.extinguish() - /obj/machinery/shower/proc/wash_turf() if(isturf(loc)) var/turf/tile = loc @@ -336,7 +370,6 @@ if(is_cleanable(E)) qdel(E) - /obj/machinery/shower/proc/wash_mob(mob/living/L) SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) L.wash_cream() @@ -457,6 +490,8 @@ anchored = TRUE var/busy = FALSE //Something's being washed at the moment var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens + var/buildstacktype = /obj/item/stack/sheet/metal + var/buildstackamount = 1 /obj/structure/sink/attack_hand(mob/living/user) . = ..() @@ -518,7 +553,7 @@ if(istype(O, /obj/item/melee/baton)) var/obj/item/melee/baton/B = O if(B.cell) - if(B.cell.charge > 0 && B.status == 1) + if(B.cell.charge > 0 && B.turned_on) flick("baton_active", src) var/stunforce = B.stamforce user.DefaultCombatKnockdown(stunforce * 2) @@ -535,6 +570,11 @@ playsound(loc, 'sound/effects/slosh.ogg', 25, 1) return + if(O.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1)) + O.play_tool_sound(src) + deconstruct() + return + if(istype(O, /obj/item/stack/medical/gauze)) var/obj/item/stack/medical/gauze/G = O new /obj/item/reagent_containers/rag(src.loc) @@ -566,9 +606,18 @@ else return ..() -/obj/structure/sink/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/metal (loc, 3) - qdel(src) +/obj/structure/sink/deconstruct() + if(!(flags_1 & NODECONSTRUCT_1)) + drop_materials() + ..() + +/obj/structure/sink/proc/drop_materials() + if(buildstacktype) + new buildstacktype(loc,buildstackamount) + else + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(loc, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) /obj/structure/sink/kitchen name = "kitchen sink" @@ -653,6 +702,11 @@ icon_state = "puddle" resistance_flags = UNACIDABLE +/obj/structure/sink/greyscale + icon_state = "sink_greyscale" + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + buildstacktype = null + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/sink/puddle/attack_hand(mob/M) icon_state = "puddle-splash" @@ -667,11 +721,13 @@ /obj/structure/sink/puddle/deconstruct(disassembled = TRUE) qdel(src) +/obj/structure/sink/greyscale + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + buildstacktype = null //Shower Curtains// //Defines used are pre-existing in layers.dm// - /obj/structure/curtain name = "curtain" desc = "Contains less than 1% mercury." @@ -727,7 +783,6 @@ return TRUE - /obj/structure/curtain/attack_hand(mob/user) . = ..() if(.) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 04c3909696..4544cab3da 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -169,8 +169,7 @@ if(do_after(user, 40, target = src)) if(!src || !anchored || src.state != "01") return - var/obj/item/stack/cable_coil/CC = W - if(!CC.use(1)) + if(!W.use_tool(src, user, 0, 1)) to_chat(user, "You need more cable to do this!") return to_chat(user, "You wire the windoor.") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5dd4e7d987..e896f8072b 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -1,3 +1,14 @@ +GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) + +/proc/do_electrochromatic_toggle(new_status, id) + var/list/windows = GLOB.electrochromatic_window_lookup["[id]"] + if(!windows) + return + var/obj/structure/window/W //define outside for performance because obviously this matters. + for(var/i in windows) + W = i + new_status? W.electrochromatic_dim() : W.electrochromatic_off() + /obj/structure/window name = "window" desc = "A window." @@ -27,9 +38,18 @@ var/hitsound = 'sound/effects/Glasshit.ogg' rad_insulation = RAD_VERY_LIGHT_INSULATION rad_flags = RAD_PROTECT_CONTENTS + flags_ricochet = RICOCHET_HARD + ricochet_chance_mod = 0.4 + + /// Electrochromatic status + var/electrochromatic_status = NOT_ELECTROCHROMATIC + /// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes. + var/electrochromatic_id /obj/structure/window/examine(mob/user) . = ..() + if(electrochromatic_status != NOT_ELECTROCHROMATIC) + . += "The window has electrochromatic circuitry on it." if(reinf) if(anchored && state == WINDOW_SCREWED_TO_FRAME) . += "The window is screwed to the frame." @@ -52,6 +72,9 @@ if(reinf && anchored) state = WINDOW_SCREWED_TO_FRAME + if(mapload && electrochromatic_id && electrochromatic_id[1] == "!") + electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id) + ini_dir = dir air_update_turf(1) @@ -62,6 +85,12 @@ real_explosion_block = explosion_block explosion_block = EXPLOSION_BLOCK_PROC + if(electrochromatic_status != NOT_ELECTROCHROMATIC) + var/old = electrochromatic_status + make_electrochromatic() + if(old == ELECTROCHROMATIC_DIMMED) + electrochromatic_dim() + /obj/structure/window/ComponentInitialize() . = ..() AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) @@ -177,6 +206,24 @@ to_chat(user, "[src] is already in good condition!") return + if(istype(I, /obj/item/electronics/electrochromatic_kit) && user.a_intent == INTENT_HELP) + var/obj/item/electronics/electrochromatic_kit/K = I + if(electrochromatic_status != NOT_ELECTROCHROMATIC) + to_chat(user, "[src] is already electrochromatic!") + return + if(anchored) + to_chat(user, "[src] must not be attached to the floor!") + return + if(!K.id) + to_chat(user, "[K] has no ID set!") + return + if(!user.temporarilyRemoveItemFromInventory(K)) + to_chat(user, "[K] is stuck to your hand!") + return + user.visible_message("[user] upgrades [src] with [I].", "You upgrade [src] with [I].") + make_electrochromatic(K.id) + qdel(K) + if(!(flags_1&NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver)) I.play_tool_sound(src, 75) @@ -224,6 +271,91 @@ air_update_turf(TRUE) update_nearby_icons() +/obj/structure/window/proc/spraycan_paint(paint_color) + if(color_hex2num(paint_color) < 255) + set_opacity(255) + else + set_opacity(initial(opacity)) + add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) + +/obj/structure/window/proc/electrochromatic_dim() + if(electrochromatic_status == ELECTROCHROMATIC_DIMMED) + return + electrochromatic_status = ELECTROCHROMATIC_DIMMED + animate(src, color = "#222222", time = 2) + set_opacity(TRUE) + +/obj/structure/window/proc/electrochromatic_off() + if(electrochromatic_status == ELECTROCHROMATIC_OFF) + return + electrochromatic_status = ELECTROCHROMATIC_OFF + var/current = color + update_atom_colour() + var/newcolor = color + color = current + animate(src, color = newcolor, time = 2) + +/obj/structure/window/proc/remove_electrochromatic() + electrochromatic_off() + electrochromatic_status = NOT_ELECTROCHROMATIC + if(!electrochromatic_id) + return + var/list/L = GLOB.electrochromatic_window_lookup["[electrochromatic_id]"] + if(L) + L -= src + electrochromatic_id = null + +/obj/structure/window/vv_edit_var(var_name, var_value) + var/check_status + if(var_name == NAMEOF(src, electrochromatic_id)) + if(electrochromatic_id && GLOB.electrochromatic_window_lookup["[electrochromatic_id]"]) + GLOB.electrochromatic_window_lookup[electrochromatic_id] -= src + if(var_name == NAMEOF(src, electrochromatic_status)) + check_status = TRUE + . = ..() //do this first incase it runtimes. + if(var_name == NAMEOF(src, electrochromatic_id)) + if((electrochromatic_status != NOT_ELECTROCHROMATIC) && electrochromatic_id) + LAZYINITLIST(GLOB.electrochromatic_window_lookup[electrochromatic_id]) + GLOB.electrochromatic_window_lookup[electrochromatic_id] += src + if(check_status) + if(electrochromatic_status == NOT_ELECTROCHROMATIC) + remove_electrochromatic() + return + else if(electrochromatic_status == ELECTROCHROMATIC_OFF) + if(!electrochromatic_id) + return + else + make_electrochromatic() + electrochromatic_off() + return + else if(electrochromatic_status == ELECTROCHROMATIC_DIMMED) + if(!electrochromatic_id) + return + else + make_electrochromatic() + electrochromatic_dim() + return + else + remove_electrochromatic() + +/obj/structure/window/proc/make_electrochromatic(new_id = electrochromatic_id) + remove_electrochromatic() + if(!new_id) + CRASH("Attempted to make electrochromatic with null ID.") + electrochromatic_id = new_id + electrochromatic_status = ELECTROCHROMATIC_OFF + LAZYINITLIST(GLOB.electrochromatic_window_lookup["[electrochromatic_id]"]) + GLOB.electrochromatic_window_lookup[electrochromatic_id] |= src + +/obj/structure/window/update_atom_colour() + if((electrochromatic_status != ELECTROCHROMATIC_OFF) && (electrochromatic_status != ELECTROCHROMATIC_DIMMED)) + return FALSE + . = ..() + if(color && (color_hex2num(color) < 255)) + set_opacity(255) + else + set_opacity(FALSE) + /obj/structure/window/proc/check_state(checked_state) if(state == checked_state) return TRUE @@ -263,7 +395,6 @@ if(BURN) playsound(src, 'sound/items/Welder.ogg', 100, 1) - /obj/structure/window/deconstruct(disassembled = TRUE) if(QDELETED(src)) return @@ -272,6 +403,9 @@ if(!(flags_1 & NODECONSTRUCT_1)) for(var/obj/item/shard/debris in spawnDebris(drop_location())) transfer_fingerprints_to(debris) // transfer fingerprints to shards only + if(electrochromatic_status != NOT_ELECTROCHROMATIC) //eh fine keep your kit. + new /obj/item/electronics/electrochromatic_kit(drop_location()) + // Intentionally not setting the ID so you can't decon one to know all of the IDs. qdel(src) update_nearby_icons() @@ -315,9 +449,9 @@ density = FALSE air_update_turf(1) update_nearby_icons() + remove_electrochromatic() return ..() - /obj/structure/window/Move() var/turf/T = loc . = ..() @@ -393,6 +527,7 @@ explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass rad_insulation = RAD_HEAVY_INSULATION + ricochet_chance_mod = 0.8 /obj/structure/window/reinforced/spawner/east dir = EAST @@ -558,6 +693,7 @@ level = 3 glass_type = /obj/item/stack/sheet/titaniumglass glass_amount = 2 + ricochet_chance_mod = 0.9 /obj/structure/window/shuttle/narsie_act() add_atom_colour("#3C3434", FIXED_COLOUR_PRIORITY) @@ -731,7 +867,6 @@ set_opacity(TRUE) queue_smooth(src) - /obj/structure/window/paperframe/attackby(obj/item/W, mob/user) if(W.get_temperature()) fire_act(W.get_temperature()) diff --git a/code/game/say.dm b/code/game/say.dm index 85ae9f0681..35a1b1d072 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_INIT(freqtospan, list( return spans |= speech_span if(!language) - language = get_default_language() + language = get_selected_language() send_speech(message, 7, src, , spans, message_language=language) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "
    " //Message - var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" + var/messagepart = " [say_emphasis(lang_treat(speaker, message_language, raw_message, spans, message_mode))]" var/languageicon = "" var/datum/language/D = GLOB.language_datum_instances[message_language] @@ -96,21 +96,38 @@ GLOBAL_LIST_INIT(freqtospan, list( return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]" // Citadel edit [spanned ? ", \"[spanned]\"" : ""]" -/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode) +#define ENCODE_HTML_EPHASIS(input, char, html, varname) \ + var/static/regex/##varname = regex("[char]{2}(.+?)[char]{2}", "g");\ + input = varname.Replace_char(input, "<[html]>$1") + +/atom/movable/proc/say_emphasis(input) + ENCODE_HTML_EPHASIS(input, "\\|", "i", italics) + ENCODE_HTML_EPHASIS(input, "\\+", "b", bold) + ENCODE_HTML_EPHASIS(input, "_", "u", underline) + return input + +#undef ENCODE_HTML_EPHASIS + +/// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when? +/atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode) + var/pos = findtext(input, "*") + return pos? copytext(input, pos + 1) : input + +/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE) if(has_language(language)) var/atom/movable/AM = speaker.GetSource() if(AM) //Basically means "if the speaker is virtual" - return AM.say_quote(raw_message, spans, message_mode) + return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode) else - return speaker.say_quote(raw_message, spans, message_mode) + return no_quote ? speaker.quoteless_say_quote(raw_message, spans, message_mode) : speaker.say_quote(raw_message, spans, message_mode) else if(language) var/atom/movable/AM = speaker.GetSource() var/datum/language/D = GLOB.language_datum_instances[language] raw_message = D.scramble(raw_message) if(AM) - return AM.say_quote(raw_message, spans, message_mode) + return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode) else - return speaker.say_quote(raw_message, spans, message_mode) + return no_quote ? speaker.quoteless_say_quote(raw_message, spans, message_mode) : speaker.say_quote(raw_message, spans, message_mode) else return "makes a strange sound." diff --git a/code/game/sound.dm b/code/game/sound.dm index c285026d5b..577b058178 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -8,7 +8,7 @@ return //allocate a channel if necessary now so its the same for everyone - channel = channel || open_sound_channel() + channel = channel || SSsounds.random_available_channel() // Looping through the player list has the added bonus of working for mobs inside containers var/sound/S = sound(get_sfx(soundin)) @@ -26,10 +26,10 @@ if(get_dist(M, turf_source) <= maxdistance) M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry) -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y, distance_multiplier = 1) if(audiovisual_redirect) var/turf/T = get_turf(src) - audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, 0, -1000, turf_source.x - T.x, turf_source.y - T.y) + audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, 0, -1000, turf_source.x - T.x, turf_source.y - T.y, distance_multiplier) if(!client || !can_hear()) return @@ -37,7 +37,7 @@ S = sound(get_sfx(soundin)) S.wait = 0 //No queue - S.channel = channel || open_sound_channel() + S.channel = channel || SSsounds.random_available_channel() S.volume = vol S.environment = 7 @@ -55,6 +55,8 @@ if(!manual_x && !manual_y) distance = get_dist(T, turf_source) + distance *= distance_multiplier + S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff. if(pressure_affected) @@ -86,13 +88,13 @@ dx = turf_source.x - T.x else dx = manual_x - S.x = dx + S.x = dx * distance_multiplier var/dz = 0 // Hearing from infront/behind if(!manual_x) dz = turf_source.y - T.y else dz = manual_y - S.z = dz + S.z = dz * distance_multiplier // The y value is for above your head, but there is no ceiling in 2d spessmens. S.y = 1 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) @@ -107,15 +109,14 @@ var/mob/M = m M.playsound_local(M, null, volume, vary, frequency, falloff, channel, pressure_affected, S) -/proc/open_sound_channel() - var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used - . = ++next_channel - if(next_channel > CHANNEL_HIGHEST_AVAILABLE) - next_channel = 1 - /mob/proc/stop_sound_channel(chan) SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) +/mob/proc/set_sound_channel_volume(channel, volume) + var/sound/S = sound(null, FALSE, FALSE, channel, volume) + S.status = SOUND_UPDATE + SEND_SOUND(src, S) + /client/proc/playtitlemusic(vol = 85) set waitfor = FALSE UNTIL(SSticker.login_music) //wait for SSticker init to set the login music diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index bc4cd8df33..38e0839617 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -80,7 +80,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_dynamic_lighting = dynamic_lighting var/old_affecting_lights = affecting_lights var/old_lighting_object = lighting_object - var/old_corners = corners + var/old_lc_topright = lc_topright + var/old_lc_topleft = lc_topleft + var/old_lc_bottomright = lc_bottomright + var/old_lc_bottomleft = lc_bottomleft var/old_exl = explosion_level var/old_exi = explosion_id @@ -119,7 +122,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( recalc_atom_opacity() lighting_object = old_lighting_object affecting_lights = old_affecting_lights - corners = old_corners + lc_topright = old_lc_topright + lc_topleft = old_lc_topleft + lc_bottomright = old_lc_bottomright + lc_bottomleft = old_lc_bottomleft if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting) reconsider_lights() @@ -256,9 +262,9 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(depth) var/list/target_baseturfs if(length(copytarget.baseturfs)) - // with default inputs this would be Copy(CLAMP(2, -INFINITY, baseturfs.len)) + // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] - target_baseturfs = copytarget.baseturfs.Copy(CLAMP(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) + target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) else if(!ignore_bottom) target_baseturfs = list(copytarget.baseturfs) if(target_baseturfs) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 9e593cafce..9fe23d78d7 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -1,5 +1,6 @@ /turf/closed layer = CLOSED_TURF_LAYER + plane = WALL_PLANE opacity = 1 density = TRUE blocks_air = 1 @@ -86,6 +87,11 @@ smooth = SMOOTH_TRUE explosion_block = INFINITY +/turf/closed/indestructible/syndicate + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + smooth = SMOOTH_TRUE + /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium" @@ -134,6 +140,15 @@ icon = 'icons/turf/walls.dmi' icon_state = "icerock" +/turf/closed/indestructible/rock/snow/ice/ore + icon = 'icons/turf/walls/icerock_wall.dmi' + icon_state = "icerock" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/closed) + pixel_x = -4 + pixel_y = -4 + + /turf/closed/indestructible/paper name = "thick paper wall" desc = "A wall layered with impenetrable sheets of paper." @@ -175,3 +190,16 @@ desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." icon = 'icons/turf/walls/hierophant_wall.dmi' icon_state = "wall" + +/turf/closed/indestructible/rock/glacierrock + name = "unaturally hard ice wall" + desc = "Ice, hardened over thousands of years, you're not breaking through this." + icon = 'icons/turf/walls.dmi' + icon_state = "snow_rock" + +/turf/closed/indestructible/rock/glacierrock/blue + name = "blue ice wall" + desc = "The incredible compressive forces that formed this sturdy ice wall gave it a blue color." + icon = 'icons/turf/walls.dmi' + icon_state = "ice" + canSmoothWith = list(/turf/closed/indestructible/rock/glacierrock/blue) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index d5b5cfc695..b81c5be44c 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -110,6 +110,9 @@ if(prob(12)) icon_state = "necro[rand(2,3)]" +/turf/open/indestructible/necropolis/ice + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + /turf/open/indestructible/necropolis/air initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index 66507e7053..90fab29611 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -1,7 +1,20 @@ +GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdrop, new) + +/atom/movable/openspace_backdrop + name = "openspace_backdrop" + + anchored = TRUE + + icon = 'icons/turf/floors.dmi' + icon_state = "grey" + plane = OPENSPACE_BACKDROP_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = SPLASHSCREEN_LAYER + /turf/open/openspace name = "open space" desc = "Watch your step!" - icon_state = "grey" + icon_state = "transparent" baseturfs = /turf/open/openspace CanAtmosPassVertical = ATMOS_PASS_YES //mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -14,8 +27,9 @@ /turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - plane = FLOOR_OPENSPACE_PLANE + plane = OPENSPACE_PLANE layer = OPENSPACE_LAYER + vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it. return INITIALIZE_HINT_LATELOAD /turf/open/openspace/LateInitialize() @@ -132,3 +146,13 @@ PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE + +/turf/open/openspace/icemoon + name = "ice chasm" + baseturfs = /turf/open/openspace/icemoon + can_cover_up = FALSE + can_build_on = FALSE + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/openspace/icemoon/can_zFall(atom/movable/A, levels = 1, turf/target) + return TRUE diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index dab0c1c376..5e8f55feed 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -88,6 +88,15 @@ light_power = 0.65 //less bright, too light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right +// Chasms for Ice moon, with planetary atmos and glow +/turf/open/chasm/icemoon + icon = 'icons/turf/floors/icechasms.dmi' + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + planetary_atmos = TRUE + baseturfs = /turf/open/chasm/icemoon + light_range = 1.9 + light_power = 0.65 + light_color = LIGHT_COLOR_PURPLE // Chasms for the jungle, with planetary atmos and a different icon /turf/open/chasm/jungle @@ -115,4 +124,4 @@ . = ..() var/turf/T = safepick(get_area_turfs(/area/fabric_of_reality)) if(T) - set_target(T) \ No newline at end of file + set_target(T) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 720490942a..9f5ce679f9 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -48,7 +48,9 @@ "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar", "carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", "ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11", - "ironsand12", "ironsand13", "ironsand14", "ironsand15") + "ironsand12", "ironsand13", "ironsand14", "ironsand15", + "snow", "snow0", "snow1", "snow2", "snow3", "snow4", "snow5", "snow6", "snow7", "snow8", "snow9", "snow10", "snow11", "snow12", "snow-ice", "snow_dug", + "unsmooth", "smooth", "1-i", "2-i", "3-i", "4-i", "1-n", "2-n", "3-s", "4-s", "1-w", "2-e", "3-w", "4-e", "1-nw", "2-ne", "3-sw", "4-se", "1-f", "2-f", "3-f", "4-f") if(broken || burnt || (icon_state in icons_to_ignore_at_floor_init)) //so damaged/burned tiles or plating icons aren't saved as the default icon_regular_floor = "floor" else diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index c9b429cecc..2f4e2e0eee 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -11,6 +11,7 @@ desc = "Stylish dark wood." icon_state = "wood" floor_tile = /obj/item/stack/tile/wood + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.25) broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7") footstep = FOOTSTEP_WOOD barefootstep = FOOTSTEP_WOOD_BAREFOOT @@ -156,7 +157,7 @@ planetary_atmos = TRUE floor_tile = null initial_gas_mix = FROZEN_ATMOS - slowdown = 2 + slowdown = 1.5 //So digging it out paths are usefull. bullet_sizzle = TRUE footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index f75772a230..f6e70f8ef5 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -260,3 +260,10 @@ icon = 'icons/obj/clockwork_objects.dmi' icon_state = "clockwork_floor" floor_tile = /obj/item/stack/tile/bronze + +/turf/open/floor/padded + name = "padded floor" + desc = "Keeps crazy people from hurting themselves. It's soft, plush, and very nice to get shoved agaisnt." + icon = 'icons/turf/floors.dmi' + icon_state = "floor_padded" + floor_tile = /obj/item/stack/tile/padded diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index a3a92e7898..af48160ef1 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -68,6 +68,9 @@ /turf/open/floor/plasteel/chapel icon_state = "chapel" +/turf/open/floor/plasteel/chapel_floor + icon_state = "chapel_alt" + /turf/open/floor/plasteel/showroomfloor icon_state = "showroomfloor" diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 053b18d8d2..1fbeee7523 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -13,11 +13,15 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY + /// Environment type for the turf var/environment_type = "asteroid" + /// Base turf type to be created by the tunnel var/turf_type = /turf/open/floor/plating/asteroid //Because caves do whacky shit to revert to normal - var/floor_variance = 20 //probability floor has a different icon state + /// Probability the floor has a different icon state + var/floor_variance = 20 attachment_holes = FALSE var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt + /// Whether the turf has been dug or not var/dug /turf/open/floor/plating/asteroid/Initialize() @@ -27,6 +31,7 @@ if(prob(floor_variance)) icon_state = "[environment_type][rand(0,12)]" +/// Drops itemstack when dug and changes icon /turf/open/floor/plating/asteroid/proc/getDug() new digResult(src, 5) if(postdig_icon_change) @@ -35,6 +40,7 @@ icon_state = "[environment_type]_dug" dug = TRUE +/// If the user can dig the turf /turf/open/floor/plating/asteroid/proc/can_dig(mob/user) if(!dug) return TRUE @@ -135,16 +141,30 @@ #define SPAWN_BUBBLEGUM 6 /turf/open/floor/plating/asteroid/airless/cave + /// Length of the tunnel var/length = 100 + /// Mobs that can spawn in the tunnel, weighted list var/list/mob_spawn_list + /// Megafauna that can spawn in the tunnel, weighted list var/list/megafauna_spawn_list + /// Flora that can spawn in the tunnel, weighted list var/list/flora_spawn_list + /// Turf type to choose when spawning in tunnel at 1% chance, weighted list + var/list/choose_turf_type + /// if the tunnel should keep being created var/sanity = 1 + /// Cave direction to move var/forward_cave_dir = 1 + /// Backwards cave direction for tracking var/backward_cave_dir = 2 + /// If the tunnel is moving backwards var/going_backwards = TRUE + /// If this is a cave creating type var/has_data = FALSE + /// The non-cave creating type var/data_having_type = /turf/open/floor/plating/asteroid/airless/cave/has_data + /// Option tunnel width, wegihted list + var/list/pick_tunnel_width turf_type = /turf/open/floor/plating/asteroid/airless /turf/open/floor/plating/asteroid/airless/cave/has_data //subtype for producing a tunnel with given data @@ -163,6 +183,46 @@ /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data has_data = TRUE +/turf/open/floor/plating/asteroid/airless/cave/snow + gender = PLURAL + name = "snow" + desc = "Looks cold." + icon = 'icons/turf/snow.dmi' + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + icon_state = "snow" + icon_plating = "snow" + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + slowdown = 2 + environment_type = "snow" + flags_1 = NONE + planetary_atmos = TRUE + burnt_states = list("snow_dug") + bullet_sizzle = TRUE + bullet_bounce_sound = null + digResult = /obj/item/stack/sheet/mineral/snow + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, \ + /mob/living/simple_animal/hostile/asteroid/polarbear = 30, /obj/structure/spawner/ice_moon/polarbear = 3, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10) + flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/grass/both = 12, /obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6) + data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/has_data + turf_type = /turf/open/floor/plating/asteroid/snow/icemoon + choose_turf_type = list(/turf/open/floor/plating/asteroid/snow/icemoon = 19, /turf/open/floor/plating/ice/icemoon = 1) + pick_tunnel_width = list("1" = 6, "2" = 1) + +/turf/open/floor/plating/asteroid/airless/cave/snow/underground + mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/ice_demon = 50, /obj/structure/spawner/ice_moon/demonic_portal = 3, \ + /mob/living/simple_animal/hostile/asteroid/ice_whelp = 30, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 3, \ + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 3) + flora_spawn_list = list(/obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6) + data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/underground/has_data + choose_turf_type = null + +/turf/open/floor/plating/asteroid/airless/cave/snow/has_data //subtype for producing a tunnel with given data + has_data = TRUE + +/turf/open/floor/plating/asteroid/airless/cave/snow/underground/has_data //subtype for producing a tunnel with given data + has_data = TRUE + /turf/open/floor/plating/asteroid/airless/cave/Initialize() if (!mob_spawn_list) mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3) @@ -175,6 +235,7 @@ if(!has_data) produce_tunnel_from_data() +/// Sets the tunnel length and direction /turf/open/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1) // If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg. if(!set_length) @@ -187,6 +248,7 @@ // Get the opposite direction of our facing direction backward_cave_dir = angle2dir(dir2angle(forward_cave_dir) + 180) +/// Gets the tunnel length and direction then makes the tunnel /turf/open/floor/plating/asteroid/airless/cave/proc/produce_tunnel_from_data(tunnel_length, excluded_dir = -1) get_cave_data(tunnel_length, excluded_dir) // Make our tunnels @@ -196,10 +258,22 @@ // Kill ourselves by replacing ourselves with a normal floor. SpawnFloor(src) +/** + * Makes the tunnel and spawns things inside of it + * + * Picks a tunnel width for the tunnel and then starts spawning turfs in the direction it moves in + * Can randomly change directions of the tunnel, stops if it hits the edge of the map, or a no tunnel area + * Can randomly make new tunnels out of itself + * + */ /turf/open/floor/plating/asteroid/airless/cave/proc/make_tunnel(dir) var/turf/closed/mineral/tunnel = src var/next_angle = pick(45, -45) + var/tunnel_width = 1 + if(pick_tunnel_width) + tunnel_width = text2num(pickweight(pick_tunnel_width)) + for(var/i = 0; i < length; i++) if(!sanity) break @@ -210,9 +284,11 @@ // Expand the edges of our tunnel for(var/edge_angle in L) - var/turf/closed/mineral/edge = get_step(tunnel, angle2dir(dir2angle(dir) + edge_angle)) - if(istype(edge)) - SpawnFloor(edge) + var/turf/closed/mineral/edge = tunnel + for(var/current_tunnel_width = 1 to tunnel_width) + edge = get_step(edge, angle2dir(dir2angle(dir) + edge_angle)) + if(istype(edge)) + SpawnFloor(edge) if(!sanity) break @@ -223,9 +299,12 @@ if(istype(tunnel)) // Small chance to have forks in our tunnel; otherwise dig our tunnel. if(i > 3 && prob(20)) - if(istype(tunnel.loc, /area/mine/explored) || (istype(tunnel.loc, /area/lavaland/surface/outdoors) && !istype(tunnel.loc, /area/lavaland/surface/outdoors/unexplored))) - sanity = 0 - break + if(isarea(tunnel.loc)) + + var/area/A = tunnel.loc + if(!A.tunnel_allowed) + sanity = 0 + break var/turf/open/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, null, CHANGETURF_IGNORE_AIR) C.going_backwards = FALSE C.produce_tunnel_from_data(rand(10, 15), dir) @@ -241,26 +320,35 @@ setDir(angle2dir(dir2angle(dir) )+ next_angle) +/// Spawns the floor of the tunnel and any type of structure or mob it can have /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnFloor(turf/T) - for(var/S in RANGE_TURFS(1, src)) - var/turf/NT = S - if(!NT || isspaceturf(NT) || istype(NT.loc, /area/mine/explored) || (istype(NT.loc, /area/lavaland/surface/outdoors) && !istype(NT.loc, /area/lavaland/surface/outdoors/unexplored))) - sanity = 0 - break - if(!sanity) + var/area/A = T.loc + if(!A.tunnel_allowed) + sanity = 0 return - SpawnFlora(T) - - SpawnMonster(T) + if(choose_turf_type) + turf_type = pickweight(choose_turf_type) + if(turf_type == initial(turf_type)) // Don't spawn different turf types under flora or terrain + var/spawned_flora = FALSE + if(is_mining_level(z)) + spawned_flora = SpawnFlora(T) + if(!spawned_flora) // no rocks beneath mob spawners / mobs. + SpawnMonster(T) T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) +/// Spawns a random mob or megafauna in the tunnel /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) + if(!isarea(loc)) + return + var/area/A = loc if(prob(30)) - if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored)) + if(!A.mob_spawn_allowed) return var/randumb = pickweight(mob_spawn_list) + if(!randumb) + return while(randumb == SPAWN_MEGAFAUNA) - if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time. + if(A.megafauna_spawn_allowed && megafauna_spawn_list && megafauna_spawn_list.len) //this is danger. it's boss time. var/maybe_boss = pickweight(megafauna_spawn_list) if(megafauna_spawn_list[maybe_boss]) randumb = maybe_boss @@ -278,22 +366,26 @@ return //prevents tendrils spawning in each other's collapse range new randumb(T) - return + return TRUE #undef SPAWN_MEGAFAUNA #undef SPAWN_BUBBLEGUM +/// Spawns a random flora in the tunnel, can spawn clumps of them. /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T) if(prob(12)) - if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) - return + if(isarea(loc)) + var/area/A = loc + if(!A.flora_allowed) + return var/randumb = pickweight(flora_spawn_list) - for(var/obj/structure/flora/ash/F in range(4, T)) //Allows for growing patches, but not ridiculous stacks of flora + if(!randumb) + return + for(var/obj/structure/flora/F in range(4, T)) // Allows for growing patches, but not ridiculous stacks of flora if(!istype(F, randumb)) return new randumb(T) - - + return TRUE /turf/open/floor/plating/asteroid/snow gender = PLURAL @@ -322,6 +414,15 @@ return TRUE return FALSE +/turf/open/floor/plating/asteroid/snow/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/lava/plasma/ice_moon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + baseturfs = /turf/open/lava/plasma/ice_moon + planetary_atmos = TRUE + /turf/open/floor/plating/asteroid/snow/ice name = "icy snow" desc = "Looks colder." @@ -336,6 +437,15 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY +/turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + planetary_atmos = TRUE + +/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel + icon = 'icons/turf/floors.dmi' + icon_state = "solarpanel" + /turf/open/floor/plating/asteroid/snow/ice/burn_tile() return FALSE @@ -347,4 +457,4 @@ /turf/open/floor/plating/asteroid/snow/atmosphere initial_gas_mix = FROZEN_ATMOS - planetary_atmos = FALSE \ No newline at end of file + planetary_atmos = FALSE diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 5c58d99e1a..5323db001f 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -3,6 +3,10 @@ icon_state = "plating" initial_gas_mix = AIRLESS_ATMOS +/turf/open/floor/plating/icemoon + icon_state = "plating" + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + /turf/open/floor/plating/abductor name = "alien floor" icon_state = "alienpod1" @@ -194,8 +198,7 @@ /turf/open/floor/plating/ice/smooth icon_state = "smooth" smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice) - /turf/open/floor/plating/ice/colder + canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder) /turf/open/floor/plating/ice/colder temperature = 140 @@ -209,6 +212,8 @@ /turf/open/floor/plating/ice/burn_tile() return +/turf/open/floor/plating/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/snowed name = "snowed-over plating" @@ -240,4 +245,6 @@ /turf/open/floor/plating/snowed/temperatre temperature = 255.37 +/turf/open/floor/plating/snowed/smoothed/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index dd2b9dfa18..2f223f2c40 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -81,10 +81,25 @@ /turf/open/lava/TakeTemperature(temp) +/turf/open/lava/attackby(obj/item/C, mob/user, params) + ..() + if(istype(C, /obj/item/stack/rods/lava)) + var/obj/item/stack/rods/lava/R = C + var/obj/structure/lattice/lava/H = locate(/obj/structure/lattice/lava, src) + if(H) + to_chat(user, "There is already a lattice here!") + return + if(R.use(1)) + to_chat(user, "You construct a lattice.") + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + new /obj/structure/lattice/lava(locate(x, y, z)) + else + to_chat(user, "You need one rod to build a heatproof lattice.") + return /turf/open/lava/proc/is_safe() //if anything matching this typecache is found in the lava, we don't burn things - var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) + var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile, /obj/structure/lattice/lava)) var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) for(var/obj/structure/stone_tile/S in found_safeties) if(S.fallen) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index c61ac8972c..048394b942 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -147,6 +147,11 @@ var/mineralChance = 13 var/display_icon_state = "rock" +/turf/closed/mineral/random/more_caves + mineralSpawnChanceList = list(/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10, + /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 15, /turf/closed/mineral/bscrystal = 1) + /turf/closed/mineral/random/Initialize() mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) @@ -173,6 +178,16 @@ /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, /turf/closed/mineral/gibtonite = 4, /turf/closed/mineral/bscrystal = 1) +/turf/closed/mineral/random/no_caves/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + mineralSpawnChanceList = list(/turf/closed/mineral/uranium/earth_like = 5, /turf/closed/mineral/diamond/earth_like = 1, /turf/closed/mineral/gold/earth_like = 10, + /turf/closed/mineral/silver/earth_like = 12, /turf/closed/mineral/plasma/earth_like = 20, /turf/closed/mineral/iron/earth_like = 40, + /turf/closed/mineral/titanium/earth_like = 11, /turf/closed/mineral/gibtonite/earth_like = 4, /turf/closed/mineral/bscrystal/earth_like = 1) + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 @@ -185,15 +200,35 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE mineralSpawnChanceList = list( /turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45, /turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20) +/turf/closed/mineral/random/high_chance/snow + name = "snowy mountainside" + icon = 'icons/turf/mining.dmi' + smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon_state = "mountainrock" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/closed) + defer_change = TRUE + environment_type = "snow" + turf_type = /turf/open/floor/plating/asteroid/snow/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 35, /turf/closed/mineral/diamond/ice/icemoon = 30, /turf/closed/mineral/gold/ice/icemoon = 45, /turf/closed/mineral/titanium/ice/icemoon = 45, + /turf/closed/mineral/silver/ice/icemoon = 50, /turf/closed/mineral/plasma/ice/icemoon = 50, /turf/closed/mineral/bscrystal/ice/icemoon = 20) + /turf/closed/mineral/random/high_chance/earth_like icon_state = "rock_highchance_oxy" turf_type = /turf/open/floor/plating/asteroid baseturfs = /turf/open/floor/plating/asteroid + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/earth_like = 35, /turf/closed/mineral/diamond/earth_like = 30, /turf/closed/mineral/gold/earth_like = 45, + /turf/closed/mineral/titanium/earth_like = 45, /turf/closed/mineral/silver/earth_like = 50, /turf/closed/mineral/plasma/earth_like = 50, + /turf/closed/mineral/bscrystal/earth_like = 20) initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE @@ -211,6 +246,10 @@ turf_type = /turf/open/floor/plating/asteroid baseturfs = /turf/open/floor/plating/asteroid initial_gas_mix = OPENTURF_DEFAULT_ATMOS + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/earth_like = 2, /turf/closed/mineral/diamond/earth_like = 1, /turf/closed/mineral/gold/earth_like = 4, + /turf/closed/mineral/titanium/earth_like = 4, /turf/closed/mineral/silver/earth_like = 6, /turf/closed/mineral/plasma/earth_like = 15, + /turf/closed/mineral/iron/earth_like = 40, /turf/closed/mineral/gibtonite/earth_like = 2, /turf/closed/mineral/bscrystal/earth_like = 1) defer_change = TRUE /turf/closed/mineral/random/volcanic @@ -218,7 +257,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE mineralChance = 10 mineralSpawnChanceList = list( @@ -226,6 +265,36 @@ /turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40, /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/closed/mineral/bscrystal/volcanic = 1) +/turf/closed/mineral/random/volcanic/more_caves + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/volcanic = 5, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 10, /turf/closed/mineral/titanium/volcanic = 11, + /turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40, + /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 15, /turf/closed/mineral/bscrystal/volcanic = 1) + +/turf/closed/mineral/random/snow + name = "snowy mountainside" + icon = 'icons/turf/mining.dmi' + smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon_state = "mountainrock" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/closed) + defer_change = TRUE + environment_type = "snow" + turf_type = /turf/open/floor/plating/asteroid/snow/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + + mineralChance = 10 + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11, + /turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40, + /turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow = 1, /turf/closed/mineral/bscrystal/ice/icemoon = 1) + +/turf/closed/mineral/random/snow/no_caves + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11, + /turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40, + /turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/closed/mineral/bscrystal/ice/icemoon = 1) /turf/closed/mineral/random/labormineral mineralSpawnChanceList = list( @@ -234,24 +303,50 @@ /turf/closed/mineral/gibtonite = 2) icon_state = "rock_labor" +/turf/closed/mineral/random/snow/underground + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11, + /turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40, + /turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow/underground = 1, /turf/closed/mineral/bscrystal/ice/icemoon = 1) + +/turf/closed/mineral/random/snow/more_caves + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 5, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 10, /turf/closed/mineral/titanium/ice/icemoon = 11, + /turf/closed/mineral/silver/ice/icemoon = 12, /turf/closed/mineral/plasma/ice/icemoon = 20, /turf/closed/mineral/iron/ice/icemoon = 40, + /turf/closed/mineral/gibtonite/ice/icemoon = 4, /turf/open/floor/plating/asteroid/airless/cave/snow = 15, /turf/closed/mineral/bscrystal/ice/icemoon = 1) + /turf/closed/mineral/random/labormineral/volcanic environment_type = "basalt" turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE mineralSpawnChanceList = list( /turf/closed/mineral/uranium/volcanic = 3, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 8, /turf/closed/mineral/titanium/volcanic = 8, /turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2, /turf/closed/mineral/iron/volcanic = 95) -/turf/closed/mineral/random/earth_like - icon_state = "rock_oxy" - turf_type = /turf/open/floor/plating/asteroid - baseturfs = /turf/open/floor/plating/asteroid - initial_gas_mix = OPENTURF_DEFAULT_ATMOS +//Subtypes for placing ores manually. +/turf/closed/mineral/random/labormineral/ice + name = "snowy mountainside" + icon = 'icons/turf/mining.dmi' + smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon_state = "mountainrock" + smooth = SMOOTH_MORE|SMOOTH_BORDER + canSmoothWith = list (/turf/closed) defer_change = TRUE + environment_type = "snow" + turf_type = /turf/open/floor/plating/asteroid/snow/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + + defer_change = TRUE + mineralSpawnChanceList = list( + /turf/closed/mineral/uranium/ice/icemoon = 3, /turf/closed/mineral/diamond/ice/icemoon = 1, /turf/closed/mineral/gold/ice/icemoon = 8, /turf/closed/mineral/titanium/ice/icemoon = 8, + /turf/closed/mineral/silver/ice/icemoon = 20, /turf/closed/mineral/plasma/ice/icemoon = 30, /turf/closed/mineral/bscrystal/ice/icemoon = 1, /turf/closed/mineral/gibtonite/ice/icemoon = 2, + /turf/closed/mineral/iron/ice/icemoon = 95) + /turf/closed/mineral/iron @@ -283,6 +378,11 @@ initial_gas_mix = FROZEN_ATMOS defer_change = TRUE +/turf/closed/mineral/iron/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + /turf/closed/mineral/uranium mineralType = /obj/item/stack/ore/uranium @@ -295,7 +395,21 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE + +/turf/closed/mineral/uranium/ice + environment_type = "snow_cavern" + icon_state = "icerock_Uranium" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/uranium/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/uranium/earth_like icon_state = "rock_oxy" @@ -316,7 +430,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/diamond/earth_like icon_state = "rock_oxy" @@ -334,6 +448,11 @@ initial_gas_mix = FROZEN_ATMOS defer_change = TRUE +/turf/closed/mineral/diamond/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + /turf/closed/mineral/gold mineralType = /obj/item/stack/ore/gold @@ -346,7 +465,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/gold/earth_like icon_state = "rock_oxy" @@ -355,6 +474,19 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE +/turf/closed/mineral/gold/ice + environment_type = "snow_cavern" + icon_state = "icerock_gold" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/gold/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver @@ -367,7 +499,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/silver/earth_like icon_state = "rock_oxy" @@ -376,6 +508,19 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE +/turf/closed/mineral/silver/ice + environment_type = "snow_cavern" + icon_state = "icerock_silver" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/silver/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium @@ -388,7 +533,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/titanium/earth_like icon_state = "rock_oxy" @@ -397,6 +542,19 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE +/turf/closed/mineral/titanium/ice + environment_type = "snow_cavern" + icon_state = "icerock_titanium" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/titanium/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma @@ -409,7 +567,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/plasma/earth_like icon_state = "rock_oxy" @@ -427,6 +585,10 @@ initial_gas_mix = FROZEN_ATMOS defer_change = TRUE +/turf/closed/mineral/plasma/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/bananium @@ -443,6 +605,21 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE +/turf/closed/mineral/bananium/ice + environment_type = "snow_cavern" + icon_state = "icerock_Bananium" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/bananium/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + + /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 @@ -455,7 +632,7 @@ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/bscrystal/earth_like icon_state = "rock_oxy" @@ -464,6 +641,19 @@ initial_gas_mix = OPENTURF_DEFAULT_ATMOS defer_change = TRUE +/turf/closed/mineral/bscrystal/ice + environment_type = "snow_cavern" + icon_state = "icerock_BScrystal" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/bscrystal/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/closed/mineral/volcanic environment_type = "basalt" @@ -475,7 +665,7 @@ environment_type = "basalt" turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/earth_like icon_state = "rock_oxy" @@ -495,7 +685,7 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS environment_type = "waste" turf_type = /turf/open/floor/plating/ashplanet/rocky - defer_change = 1 + defer_change = TRUE /turf/closed/mineral/snowmountain name = "snowy mountainside" @@ -510,6 +700,11 @@ turf_type = /turf/open/floor/plating/asteroid/snow defer_change = TRUE +/turf/closed/mineral/snowmountain/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + /turf/closed/mineral/snowmountain/cavern name = "ice cavern rock" icon = 'icons/turf/mining.dmi' @@ -521,6 +716,11 @@ environment_type = "snow_cavern" turf_type = /turf/open/floor/plating/asteroid/snow/ice +/turf/closed/mineral/snowmountain/cavern/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + //GIBTONITE /turf/closed/mineral/gibtonite @@ -619,8 +819,82 @@ /turf/closed/mineral/gibtonite/volcanic + environment_type = "basalt" + turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + +/turf/closed/mineral/gibtonite/earth_like + icon_state = "rock_oxy" + turf_type = /turf/open/floor/plating/asteroid + baseturfs = /turf/open/floor/plating/asteroid + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + defer_change = TRUE + + +/turf/closed/mineral/gibtonite/ice + environment_type = "snow_cavern" + icon_state = "icerock_Gibtonite" + smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + turf_type = /turf/open/floor/plating/asteroid/snow/ice + baseturfs = /turf/open/floor/plating/asteroid/snow/ice + initial_gas_mix = FROZEN_ATMOS + defer_change = TRUE + +/turf/closed/mineral/gibtonite/ice/icemoon + turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon + baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/closed/mineral/strong + name = "Very strong rock" + desc = "Seems to be stronger than the other rocks in the area. Only a master of mining techniques could destroy this." environment_type = "basalt" turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 + smooth_icon = 'icons/turf/walls/rock_wall.dmi' + +/* +/turf/closed/mineral/strong/attackby(obj/item/I, mob/user, params) + if(!ishuman(user)) + to_chat(usr, "Only a more advanced species could break a rock such as this one!") + return FALSE + var/mob/living/carbon/human/H = user + if(H.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER) + . = ..() + else + to_chat(usr, "The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner.") +*/ + +/turf/closed/mineral/strong/gets_drilled(mob/user) + if(!ishuman(user)) + return // see attackby + /* + var/mob/living/carbon/human/H = user + if(!(H.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER)) + return + */ + drop_ores() +// H.client.give_award(/datum/award/achievement/skill/legendary_miner, H) + var/flags = NONE + if(defer_change) // TODO: make the defer change var a var for any changeturf flag + flags = CHANGETURF_DEFER_CHANGE + ScrapeAway(flags=flags) + addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE) + playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction +// H.mind.adjust_experience(/datum/skill/mining, 100) //yay! + +/turf/closed/mineral/strong/proc/drop_ores() + if(prob(10)) + new /obj/item/stack/sheet/mineral/mythril(src, 5) + else + new /obj/item/stack/sheet/mineral/adamantine(src, 5) + +/turf/closed/mineral/strong/acid_melt() + return + +/turf/closed/mineral/strong/ex_act(severity, target) + return diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index b04f4f0aa0..5c74eb4ecc 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -191,7 +191,7 @@ icon = 'icons/turf/walls/shuttle_wall.dmi' icon_state = "map-shuttle" explosion_block = 3 - flags_1 = CAN_BE_DIRTY_1 | CHECK_RICOCHET_1 + flags_1 = CAN_BE_DIRTY_1 | DEFAULT_RICOCHET_1 sheet_type = /obj/item/stack/sheet/mineral/titanium smooth = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) @@ -302,4 +302,4 @@ /turf/closed/wall/mineral/plastitanium/copyTurf(turf/T) . = ..() - T.transform = transform \ No newline at end of file + T.transform = transform diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 268e8e9109..b01a1df2c0 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -41,17 +41,6 @@ /turf/closed/wall/attack_tk() return -/turf/closed/wall/handle_ricochet(obj/item/projectile/P) //A huge pile of shitcode! - var/turf/p_turf = get_turf(P) - var/face_direction = get_dir(src, p_turf) - var/face_angle = dir2angle(face_direction) - var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180)) - if(abs(incidence_s) > 90 && abs(incidence_s) < 270) - return FALSE - var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) - P.setAngle(new_angle_s) - return TRUE - /turf/closed/wall/proc/dismantle_wall(devastated=0, explode=0) if(devastated) devastate_wall() @@ -290,7 +279,7 @@ if(LAZYLEN(dent_decals) >= MAX_DENT_DECALS) return - var/mutable_appearance/decal = mutable_appearance('icons/effects/effects.dmi', "", BULLET_HOLE_LAYER) + var/mutable_appearance/decal = mutable_appearance('icons/effects/effects.dmi', "", BULLET_HOLE_LAYER, ABOVE_WALL_PLANE) switch(denttype) if(WALL_DENT_SHOT) decal.icon_state = "bullet_hole" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f31649eaca..88f6dd6962 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,6 +1,8 @@ /turf icon = 'icons/turf/floors.dmi' level = 1 + vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID //when this be added to vis_contents of something it inherit something.plane and be associatet with something on clicking, + //important for visualisation of turf in openspace and interraction with openspace that show you turf. var/intact = 1 @@ -441,7 +443,7 @@ for(var/V in contents) var/atom/A = V if(!QDELETED(A) && A.level >= affecting_level) - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A if(!AM.ex_check(explosion_id)) continue diff --git a/code/game/world.dm b/code/game/world.dm index 77361310b8..83e82403e0 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,6 +1,7 @@ #define RESTART_COUNTER_PATH "data/round_counter.txt" GLOBAL_VAR(restart_counter) +GLOBAL_VAR_INIT(tgs_initialized, FALSE) GLOBAL_VAR(topic_status_lastcache) GLOBAL_LIST(topic_status_cache) @@ -8,11 +9,12 @@ GLOBAL_LIST(topic_status_cache) //This happens after the Master subsystem new(s) (it's a global datum) //So subsystems globals exist, but are not initialised /world/New() + var/extools = world.GetConfig("env", "EXTOOLS_DLL") || "./byond-extools.dll" + if (fexists(extools)) + call(extools, "maptick_initialize")() enable_debugger() -#if DM_VERSION >= 513 && DM_BUILD >= 1506 world.Profile(PROFILE_START) -#endif log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") @@ -22,10 +24,11 @@ GLOBAL_LIST(topic_status_cache) make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - TgsNew(minimum_required_security_level = TGS_SECURITY_TRUSTED) GLOB.revdata = new + InitTgs() + config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) //SetupLogs depends on the RoundID, so lets check @@ -36,6 +39,9 @@ GLOBAL_LIST(topic_status_cache) #ifndef USE_CUSTOM_ERROR_HANDLER world.log = file("[GLOB.log_directory]/dd.log") +#else + if (TgsAvailable()) + world.log = file("[GLOB.log_directory]/dd.log") //not all runtimes trigger world/Error, so this is the only way to ensure we can see all of them. #endif load_admins() @@ -61,6 +67,11 @@ GLOBAL_LIST(topic_status_cache) if(TEST_RUN_PARAMETER in params) HandleTestRun() +/world/proc/InitTgs() + TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) + GLOB.revdata.load_tgs_info() + GLOB.tgs_initialized = TRUE + /world/proc/HandleTestRun() //trigger things to run the whole process Master.sleep_offline_after_initializations = FALSE @@ -109,6 +120,7 @@ GLOBAL_LIST(topic_status_cache) GLOB.world_game_log = "[GLOB.log_directory]/game.log" GLOB.world_virus_log = "[GLOB.log_directory]/virus.log" + GLOB.world_asset_log = "[GLOB.log_directory]/asset.log" GLOB.world_attack_log = "[GLOB.log_directory]/attack.log" GLOB.world_pda_log = "[GLOB.log_directory]/pda.log" GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log" @@ -124,6 +136,7 @@ GLOBAL_LIST(topic_status_cache) GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log" GLOB.reagent_log = "[GLOB.log_directory]/reagents.log" GLOB.world_crafting_log = "[GLOB.log_directory]/crafting.log" + GLOB.click_log = "[GLOB.log_directory]/click.log" #ifdef UNIT_TESTS @@ -143,6 +156,7 @@ GLOBAL_LIST(topic_status_cache) start_log(GLOB.subsystem_log) start_log(GLOB.reagent_log) start_log(GLOB.world_crafting_log) + start_log(GLOB.click_log) GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently if(fexists(GLOB.config_error_log)) @@ -222,16 +236,17 @@ GLOBAL_LIST(topic_status_cache) qdel(src) //shut it down /world/Reboot(reason = 0, fast_track = FALSE) - TgsReboot() if (reason || fast_track) //special reboot, do none of the normal stuff if (usr) log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") - to_chat(world, "Rebooting World immediately due to host request") + to_chat(world, "Rebooting World immediately due to host request.") else to_chat(world, "Rebooting world...") Master.Shutdown() //run SS shutdowns + TgsReboot() + if(TEST_RUN_PARAMETER in params) FinishTestRun() return @@ -300,8 +315,8 @@ GLOBAL_LIST(topic_status_cache) if(SSmapping.config) // this just stops the runtime, honk. features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map - if(get_security_level())//CIT CHANGE - makes the hub entry show the security level - features += "[get_security_level()] alert" + if(NUM2SECLEVEL(GLOB.security_level))//CIT CHANGE - makes the hub entry show the security level + features += "[NUM2SECLEVEL(GLOB.security_level)] alert" if (n > 1) features += "~[n] players" diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index e79784290b..26ae200990 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -22,6 +22,11 @@ sparks.set_up(2,0) sparks.attach(src) update_icon() + new_occupant_dir = dir + +/obj/machinery/vr_sleeper/setDir(newdir) + . = ..() + new_occupant_dir = dir /obj/machinery/vr_sleeper/attackby(obj/item/I, mob/user, params) if(!state_open && !occupant) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4a7e818125..a2e2b3c122 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -429,6 +429,10 @@ for(var/datum/dynamic_ruleset/roundstart/rule in GLOB.dynamic_forced_roundstart_ruleset) dat += {"-> [rule.name] <-
    "} dat += "(Clear Rulesets)
    " + dat += "(Force Storyteller)
    " + if (GLOB.dynamic_forced_storyteller) + var/datum/dynamic_storyteller/S = GLOB.dynamic_forced_storyteller + dat += "-> [initial(S.name)] <-
    " dat += "(Dynamic mode options)
    " else if (SSticker.IsRoundInProgress()) dat += "(Force Next Latejoin Ruleset)
    " @@ -690,7 +694,7 @@ var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting) CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting) if (!prev_dynamic_voting) - to_chat(world, "Vote is now a ranked choice of dynamic storytellers.") + to_chat(world, "Vote is now between dynamic storytellers.") else to_chat(world, "Vote is now between extended and secret.") log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 55c55c42de..99bb988be6 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -4,7 +4,7 @@ var/F = file("[GLOB.log_directory]/[subject].html") WRITE_FILE(F, "[TIME_STAMP("hh:mm:ss", FALSE)] [REF(src)] ([x],[y],[z]) || [src] [message]
    ") -/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RCD, INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) ) +/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RCD, INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES, INVESTIGATE_CRYOGENICS) ) set name = "Investigate" set category = "Admin" if(!holder) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3ccd113864..289abbe250 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -74,13 +74,14 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/addbunkerbypass, /client/proc/revokebunkerbypass, /client/proc/stop_sounds, + /client/proc/mark_datum_mapview, /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /datum/admins/proc/open_borgopanel ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) -GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/set_round_end_sound)) +GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound)) GLOBAL_PROTECT(admin_verbs_sounds) GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/cmd_admin_dress, @@ -105,6 +106,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/show_tip, /client/proc/smite, /client/proc/admin_away, + /client/proc/cmd_admin_toggle_fov, /client/proc/roll_dices //CIT CHANGE - Adds dice verb )) GLOBAL_PROTECT(admin_verbs_fun) @@ -363,7 +365,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) log_admin("[key_name(usr)] admin ghosted.") message_admins("[key_name_admin(usr)] admin ghosted.") var/mob/body = mob - body.ghostize(1) + body.ghostize(1, voluntary = TRUE) if(body && !body.key) body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 19e53b09b4..88aab2c4ce 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -104,7 +104,7 @@ GLOBAL_VAR(antag_prototypes) var/special_statuses = get_special_statuses() if(length(special_statuses)) - out += get_special_statuses() + "
    " + out += special_statuses + "
    " if(!GLOB.antag_prototypes) GLOB.antag_prototypes = list() diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm new file mode 100644 index 0000000000..c13353b7cd --- /dev/null +++ b/code/modules/admin/callproc/callproc.dm @@ -0,0 +1,208 @@ + +/client/proc/callproc() + set category = "Debug" + set name = "Advanced ProcCall" + set waitfor = FALSE + callproc_blocking() + +/client/proc/callproc_blocking(list/get_retval) + if(!check_rights(R_DEBUG)) + return + + var/datum/target + var/targetselected = FALSE + var/returnval + + switch(alert("Proc owned by something?",,"Yes","No")) + if("Yes") + targetselected = TRUE + var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT, VV_MARKED_DATUM, VV_TEXT_LOCATE, VV_PROCCALL_RETVAL)) + if (!value["class"] || !value["value"]) + return + target = value["value"] + if(!istype(target)) + to_chat(usr, "Invalid target.") + return + if("No") + target = null + targetselected = FALSE + + var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null + if(!procpath) + return + + //strip away everything but the proc name + var/list/proclist = splittext(procpath, "/") + if (!length(proclist)) + return + + var/procname = proclist[proclist.len] + var/proctype = ("verb" in proclist) ? "verb" :"proc" + + if(targetselected) + if(!hascall(target, procname)) + to_chat(usr, "Error: callproc(): type [target.type] has no [proctype] named [procpath].") + return + else + procpath = "/[proctype]/[procname]" + if(!text2path(procpath)) + to_chat(usr, "Error: callproc(): [procpath] does not exist.") + return + + var/list/lst = get_callproc_args() + if(!lst) + return + + if(targetselected) + if(!target) + to_chat(usr, "Error: callproc(): owner of proc no longer exists.") + return + var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + log_admin(msg) + message_admins(msg) //Proccall announce removed. + admin_ticket_log(target, msg) + returnval = WrapAdminProcCall(target, procname, lst) // Pass the lst as an argument list to the proc + else + //this currently has no hascall protection. wasn't able to get it working. + log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") //Proccall announce removed. + returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc + SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(get_retval) + get_retval += returnval + . = get_callproc_returnval(returnval, procname) + if(.) + to_chat(usr, .) + +GLOBAL_VAR(AdminProcCaller) +GLOBAL_PROTECT(AdminProcCaller) +GLOBAL_VAR_INIT(AdminProcCallCount, 0) +GLOBAL_PROTECT(AdminProcCallCount) +GLOBAL_VAR(LastAdminCalledTargetRef) +GLOBAL_PROTECT(LastAdminCalledTargetRef) +GLOBAL_VAR(LastAdminCalledTarget) +GLOBAL_PROTECT(LastAdminCalledTarget) +GLOBAL_VAR(LastAdminCalledProc) +GLOBAL_PROTECT(LastAdminCalledProc) +GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) +GLOBAL_PROTECT(AdminProcCallSpamPrevention) + +/proc/WrapAdminProcCall(datum/target, procname, list/arguments) + if(target != GLOBAL_PROC && procname == "Del") + to_chat(usr, "Calling Del() is not allowed") + return + + if(target != GLOBAL_PROC && !target.CanProcCall(procname)) + to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!") + return + var/current_caller = GLOB.AdminProcCaller + var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller + if(!ckey) + CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]") + if(current_caller && current_caller != ckey) + if(!GLOB.AdminProcCallSpamPrevention[ckey]) + to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") + GLOB.AdminProcCallSpamPrevention[ckey] = TRUE + UNTIL(!GLOB.AdminProcCaller) + to_chat(usr, "Running your proc") + GLOB.AdminProcCallSpamPrevention -= ckey + else + UNTIL(!GLOB.AdminProcCaller) + GLOB.LastAdminCalledProc = procname + if(target != GLOBAL_PROC) + GLOB.LastAdminCalledTargetRef = "[REF(target)]" + GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you + ++GLOB.AdminProcCallCount + . = world.WrapAdminProcCall(target, procname, arguments) + if(--GLOB.AdminProcCallCount == 0) + GLOB.AdminProcCaller = null + +//adv proc call this, ya nerds +/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) + if(target == GLOBAL_PROC) + return call(text2path("/proc/[procname]"))(arglist(arguments)) + else if(target != world) + return call(target, procname)(arglist(arguments)) + else + log_admin_private("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]") + +/proc/IsAdminAdvancedProcCall() +#ifdef TESTING + return FALSE +#else + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey +#endif + +/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) + set category = "Debug" + set name = "Atom ProcCall" + set waitfor = FALSE + + if(!check_rights(R_DEBUG)) + return + + var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null + if(!procname) + return + if(!hascall(A,procname)) + to_chat(usr, "Error: callproc_datum(): type [A.type] has no proc named [procname].") + return + var/list/lst = get_callproc_args() + if(!lst) + return + + if(!A || !IsValidSrc(A)) + to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") + return + var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + log_admin(msg) + message_admins(msg) + admin_ticket_log(A, msg) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc + . = get_callproc_returnval(returnval,procname) + if(.) + to_chat(usr, .) + +/client/proc/get_callproc_args() + var/argnum = input("Number of arguments","Number:",0) as num|null + if(isnull(argnum)) + return + + . = list() + var/list/named_args = list() + while(argnum--) + var/named_arg = input("Leave blank for positional argument. Positional arguments will be considered as if they were added first.", "Named argument") as text|null + var/value = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) + if (!value["class"]) + return + if(named_arg) + named_args[named_arg] = value["value"] + else + . += value["value"] + if(LAZYLEN(named_args)) + . += named_args + +/client/proc/get_callproc_returnval(returnval,procname) + . = "" + if(islist(returnval)) + var/list/returnedlist = returnval + . = "" + if(returnedlist.len) + var/assoc_check = returnedlist[1] + if(istext(assoc_check) && (returnedlist[assoc_check] != null)) + . += "[procname] returned an associative list:" + for(var/key in returnedlist) + . += "\n[key] = [returnedlist[key]]" + + else + . += "[procname] returned a list:" + for(var/elem in returnedlist) + . += "\n[elem]" + else + . = "[procname] returned an empty list" + . += "" + + else + . = "[procname] returned: [!isnull(returnval) ? returnval : "null"]" diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index e2ddcdcf6a..9b15729a9e 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -142,3 +142,51 @@ GLOBAL_LIST(round_end_notifiees) log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.") message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.") return "[params] has been added to the current round's bunker bypass list." + +// More (silly) chat commands citadel added. +/datum/tgs_chat_command/wheelofsalt + name = "wheelofsalt" + help_text = "What are Citadel Station 13 players salting about today? Spin the wheel and find out!" + +/datum/tgs_chat_command/wheelofsalt/Run(datum/tgs_chat_user/sender, params) + var/saltresult = "The wheel of salt [pick("clatters","screams","vibrates","clanks","resonates","groans","moans","squeaks","emits a[pick(" god-forsaken"," lewd"," creepy"," generic","n orgasmic"," demonic")] [pick("airhorn","bike horn","trumpet","clown","latex","vore","dog","laughing")] noise")] as it spins violently... And it seems the salt of the day is the " + var/saltprimarysubject = "[pick("combat","medical","grab","furry","wall","orgasm","cat","ERP","lizard","dog","latex","vision cone","atmospherics","table","chem","vore","dogborg","Skylar Lineman","Mekhi Anderson","Peppermint","rework","cum","dick","cockvore","Medihound","sleeper","belly sleeper","door wires","flightsuit","coder privilege","Developer abuse","ban reason","github self merge","red panda","beret","male catgirl","powergame","hexacrocin","Discord server","Clitadel","Cargonia","Solarian Republic","Main and RP merger","bluespace","salt","chem dispenser theft","Botany","moth","BWOINK","anal vore","stamina","Mason Jakops","mining","noodle","milf","Lavaland","Necropolis","Ashwalker","Chase Redtail","Drew Mint","Pavel Marsk","Joker Amari","Durgit","chaplain","Antag","nanite","Syndicate","Nar-Sie","Ratvar","Cult","maint","Foam-Force","AI","cyborg","ghost","clockwork","cyberpunk","vaporwave","Clown","Leon Beech","Mime","security","research","Megafauna","Bubblegum","Ash Drake","Legion","Colossus","White Shuttle","Changeling","Cowboy","Space Ninja","Poly","Revolutionary","Skyrim","forbidden fruits","xenomorph","blob","Nuclear Operative","crossdressing")]" + var/saltsecondarysubject = "[pick("rework","changes","r34","ban","removal","addition","leak","proposal","fanart","introduction","tabling","ERP","bikeshedding","crossdressing","sprites","semen keg","argument","theft","nerf","screeching","salt","creampie","lewding","murder","kissing","marriage","replacement","fucking","ship","netflix adaptation","dance","remaster","system","voyeur","decoration","pre-order","bukkake","seduction","worship","gangbang","handholding")]" + if(prob(10)) + saltresult += "@here for your salt, all day every day" + if(prob(1)) + saltresult += " @everyone gets some salt this time too" + else + saltresult += "[saltprimarysubject] [saltsecondarysubject]" + return "[saltresult]!" + +/datum/tgs_chat_command/valentine + name = "valentine" + help_text = "Get a random flirt line." + +/datum/tgs_chat_command/valentine/Run(datum/tgs_chat_user/sender, params) + return "[pick(GLOB.flirts)]" + +/datum/tgs_chat_command/despacito + name = "despacito" //someone please high effort this sometime and make it a full on ytdl search + help_text = "This is so sad." + +/datum/tgs_chat_command/despacito/Run() + return "https://www.youtube.com/watch?v=kJQP7kiw5Fk" + +/datum/tgs_chat_command/poly + name = "poly" + help_text = "The Lewder, more applicable Poly speak for Citadel Station 13." + var/list/speech_buffer + +/datum/tgs_chat_command/poly/Run() + LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point + if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time. + return "[pick(speech_buffer)]" + else + var/json_file = file("data/npc_saves/Poly.json") + if(!fexists(json_file)) + return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***" + var/list/json = json_decode(file2text(json_file)) + speech_buffer = json["phrases"] + return "[pick(speech_buffer)]" diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 3e604856c5..59651b17d5 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -18,6 +18,7 @@ H.undie_color = random_short_color() H.undershirt = random_undershirt(H.gender) H.shirt_color = random_short_color() + H.dna.skin_tone_override = null H.skin_tone = random_skin_tone() H.hair_style = random_hair_style(H.gender) H.facial_hair_style = random_facial_hair_style(H.gender) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 255b1a10fa..41662c1cad 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -61,18 +61,14 @@ Summon Events (Toggle)
    There can only be one!
    There can only be one! (40-second delay)
    - Make all players retarded
    + Make all players stupid
    Egalitarian Station Mode
    + Anarcho-Capitalist Station Mode
    Break all lights
    Fix all lights
    The floor is lava! (DANGEROUS: extremely lame)
    Spawn a custom portal storm

    - Flip client movement directions
    - Randomize client movement directions
    - Set each movement direction manually
    - Reset movement directions to default
    -
    Change bomb cap
    Mass Purrbation
    Mass Remove Purrbation
    @@ -452,14 +448,14 @@ var/datum/round_event/disease_outbreak/DO = E DO.virus_type = virus - if("retardify") + if("stupify") if(!check_rights(R_FUN)) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage")) for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80) - message_admins("[key_name_admin(usr)] made everybody retarded") + message_admins("[key_name_admin(usr)] made everybody stupid") if("eagles")//SCRAW if(!check_rights(R_FUN)) @@ -478,6 +474,17 @@ usr.client.ak47s() sound_to_playing_players('sound/misc/ak47s.ogg') + if("ancap") + if(!check_rights(R_FUN)) + return + SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Anarcho-capitalist Station")) + SSeconomy.full_ancap = !SSeconomy.full_ancap + message_admins("[key_name_admin(usr)] toggled Anarcho-capitalist mode") + if(SSeconomy.full_ancap) + priority_announce("The NAP is now in full effect.", null, "commandreport") + else + priority_announce("The NAP has been revoked.", null, "commandreport") + if("guns") if(!check_rights(R_FUN)) return @@ -591,60 +598,6 @@ purrbation.") log_admin("[key_name(usr)] has removed everyone from purrbation.") - if("flipmovement") - if(!check_rights(R_FUN)) - return - if(alert("Flip all movement controls?","Confirm","Yes","Cancel") == "Cancel") - return - var/list/movement_keys = SSinput.movement_keys - for(var/i in 1 to movement_keys.len) - var/key = movement_keys[i] - movement_keys[key] = turn(movement_keys[key], 180) - message_admins("[key_name_admin(usr)] has flipped all movement directions.") - log_admin("[key_name(usr)] has flipped all movement directions.") - - if("randommovement") - if(!check_rights(R_FUN)) - return - if(alert("Randomize all movement controls?","Confirm","Yes","Cancel") == "Cancel") - return - var/list/movement_keys = SSinput.movement_keys - for(var/i in 1 to movement_keys.len) - var/key = movement_keys[i] - movement_keys[key] = turn(movement_keys[key], 45 * rand(1, 8)) - message_admins("[key_name_admin(usr)] has randomized all movement directions.") - log_admin("[key_name(usr)] has randomized all movement directions.") - - if("custommovement") - if(!check_rights(R_FUN)) - return - if(alert("Are you sure you want to change every movement key?","Confirm","Yes","Cancel") == "Cancel") - return - var/list/movement_keys = SSinput.movement_keys - var/list/new_movement = list() - for(var/i in 1 to movement_keys.len) - var/key = movement_keys[i] - - var/msg = "Please input the new movement direction when the user presses [key]. Ex. northeast" - var/title = "New direction for [key]" - var/new_direction = text2dir(input(usr, msg, title) as text|null) - if(!new_direction) - new_direction = movement_keys[key] - - new_movement[key] = new_direction - SSinput.movement_keys = new_movement - message_admins("[key_name_admin(usr)] has configured all movement directions.") - log_admin("[key_name(usr)] has configured all movement directions.") - - if("resetmovement") - if(!check_rights(R_FUN)) - return - if(alert("Are you sure you want to reset movement keys to default?","Confirm","Yes","Cancel") == "Cancel") - return - SSinput.setup_default_movement_keys() - message_admins("[key_name_admin(usr)] has reset all movement keys.") - log_admin("[key_name(usr)] has reset all movement keys.") - if("customportal") if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index 702e2071bd..56c778dc85 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -95,7 +95,7 @@ var/new_volume = input(user, "Choose a volume.", "Sound Emitter", sound_volume) as null|num if(isnull(new_volume)) return - new_volume = CLAMP(new_volume, 0, 100) + new_volume = clamp(new_volume, 0, 100) sound_volume = new_volume to_chat(user, "Volume set to [sound_volume]%.") if(href_list["edit_mode"]) @@ -118,7 +118,7 @@ var/new_radius = input(user, "Choose a radius.", "Sound Emitter", sound_volume) as null|num if(isnull(new_radius)) return - new_radius = CLAMP(new_radius, 0, 127) + new_radius = clamp(new_radius, 0, 127) play_radius = new_radius to_chat(user, "Audible radius set to [play_radius].") if(href_list["play"]) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 7b59e72403..356746ddbc 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -393,7 +393,7 @@ var/nsd = CONFIG_GET(number/note_stale_days) var/nfd = CONFIG_GET(number/note_fresh_days) if (agegate && type == "note" && isnum(nsd) && isnum(nfd) && nsd > nfd) - var/alpha = CLAMP(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) + var/alpha = clamp(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) if (alpha < 100) if (alpha <= 15) if (skipped) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d86211f216..042a6e0fe9 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1394,6 +1394,32 @@ log_admin("[key_name(usr)] removed [rule] from the forced roundstart rulesets.") message_admins("[key_name(usr)] removed [rule] from the forced roundstart rulesets.", 1) + else if(href_list["f_dynamic_storyteller"]) + if(!check_rights(R_ADMIN)) + return + if(SSticker && SSticker.mode) + return alert(usr, "The game has already started.", null, null, null, null) + if(GLOB.master_mode != "dynamic") + return alert(usr, "The game mode has to be dynamic mode.", null, null, null, null) + var/list/choices = list() + for(var/T in config.storyteller_cache) + var/datum/dynamic_storyteller/S = T + choices[initial(S.name)] = T + var/choice = choices[input("Select storyteller:", "Storyteller", "Classic") as null|anything in choices] + if(choice) + GLOB.dynamic_forced_storyteller = choice + log_admin("[key_name(usr)] forced the storyteller to [GLOB.dynamic_forced_storyteller].") + message_admins("[key_name(usr)] forced the storyteller to [GLOB.dynamic_forced_storyteller].") + Game() + + else if(href_list["f_dynamic_storyteller_clear"]) + if(!check_rights(R_ADMIN)) + return + GLOB.dynamic_forced_storyteller = null + Game() + log_admin("[key_name(usr)] cleared the forced storyteller. The mode will pick one as normal.") + message_admins("[key_name(usr)] cleared the forced storyteller. The mode will pick one as normal.", 1) + else if(href_list["f_dynamic_latejoin"]) if(!check_rights(R_ADMIN)) return @@ -1732,9 +1758,8 @@ var/mob/M = locate(href_list["makeeligible"]) if(!ismob(M)) to_chat(usr, "this can only be used on instances of type /mob.") - var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(list(/datum/element/ghost_role_eligibility)) - if(M.ckey in eli.timeouts) - eli.timeouts -= M.ckey + if(M.ckey in GLOB.client_ghost_timeouts) + GLOB.client_ghost_timeouts -= M.ckey else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) @@ -2364,7 +2389,7 @@ return var/list/offset = splittext(href_list["offset"],",") - var/number = CLAMP(text2num(href_list["object_count"]), 1, 100) + var/number = clamp(text2num(href_list["object_count"]), 1, 100) var/X = offset.len > 0 ? text2num(offset[1]) : 0 var/Y = offset.len > 1 ? text2num(offset[2]) : 0 var/Z = offset.len > 2 ? text2num(offset[3]) : 0 diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 14906bc83a..bff431a6c7 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -346,7 +346,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null //print the key if(islist(key)) recursive_list_print(output, key, datum_handler, atom_handler) - else if(is_proper_datum(key) && (datum_handler || (isatom(key) && atom_handler))) + else if(is_object_datatype(key) && (datum_handler || (isatom(key) && atom_handler))) if(isatom(key) && atom_handler) output += atom_handler.Invoke(key) else @@ -360,7 +360,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/value = input[key] if(islist(value)) recursive_list_print(output, value, datum_handler, atom_handler) - else if(is_proper_datum(value) && (datum_handler || (isatom(value) && atom_handler))) + else if(is_object_datatype(value) && (datum_handler || (isatom(value) && atom_handler))) if(isatom(value) && atom_handler) output += atom_handler.Invoke(value) else @@ -498,7 +498,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(length(select_text)) var/text = islist(select_text)? select_text.Join() : select_text var/static/result_offset = 0 - showmob << browse(text, "window=SDQL-result-[result_offset++]") + showmob << browse(text, "window=SDQL-result-[result_offset++];size=800x1200") show_next_to_key = null if(qdel_on_finish) qdel(src) @@ -646,7 +646,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null switch(query_tree[1]) if("call") for(var/i in found) - if(!is_proper_datum(i)) + if(!is_object_datatype(i)) continue world.SDQL_var(i, query_tree["call"][1], null, i, superuser, src) obj_count_finished++ @@ -664,7 +664,10 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/list/text_list = list() var/print_nulls = !(options & SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS) obj_count_finished = select_refs + var/n = 0 for(var/i in found) + if(++n == 20000) + text_list += "
    TRUNCATED - 20000 OBJECT LIMIT HIT" SDQL_print(i, text_list, print_nulls) select_refs[REF(i)] = TRUE SDQL2_TICK_CHECK @@ -675,7 +678,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if("set" in query_tree) var/list/set_list = query_tree["set"] for(var/d in found) - if(!is_proper_datum(d)) + if(!is_object_datatype(d)) continue SDQL_internal_vv(d, set_list) obj_count_finished++ @@ -685,47 +688,72 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_finished = length(obj_count_finished) state = SDQL2_STATE_SWITCHING -/datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE) - if(is_proper_datum(object)) - text_list += "[REF(object)] : [object]" - if(istype(object, /atom)) - var/atom/A = object - var/turf/T = A.loc - var/area/a - if(istype(T)) - text_list += " at [T] [ADMIN_COORDJMP(T)]" - a = T.loc - else - var/turf/final = get_turf(T) //Recursive, hopefully? - if(istype(final)) - text_list += " at [final] [ADMIN_COORDJMP(final)]" - a = final.loc +/** + * Recursively prints out an object to text list for SDQL2 output to admins, with VV links and all. + * Recursion limit: 50 + * Limit imposed by callers should be around 10000 objects + * Seriously, if you hit those limits, you're doing something wrong. + */ +/datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 1, linebreak = TRUE) + if(recursion > 50) + text_list += "
    RECURSION LIMIT REACHED.
    " + return + if(is_object_datatype(object)) + if(!islist(object)) + text_list += "[object.type] [REF(object)]: [object]" + if(istype(object, /atom)) + if(istype(object, /turf)) + var/turf/T = object + text_list += " [ADMIN_COORDJMP(T)] at [T.loc]" else - text_list += " at nonexistant location" - if(a) - text_list += " in area [a]" - if(T.loc != a) - text_list += " inside [T]" - text_list += "
    " - else if(islist(object)) - var/list/L = object - var/first = TRUE - text_list += "\[" - for (var/x in L) - if (!first) - text_list += ", " - first = FALSE - SDQL_print(x, text_list) - if (!isnull(x) && !isnum(x) && L[x] != null) - text_list += " -> " - SDQL_print(L[L[x]], text_list) - text_list += "]
    " + var/atom/A = object + var/atom/container = A.loc + if(isturf(container)) + text_list += " in [container] [ADMIN_COORDJMP(container)] at [container.loc]" + else if(container) + var/turf/T = get_turf(container) + var/cref = REF(container) + text_list += " in [container]([cref])" + if(T) + text_list += " on [T] [ADMIN_COORDJMP(T)] at[T.loc]" + else + text_list += " in nullspace" + else // lists are snowflake and get special treatment. + text_list += "/list [REF(object)] \[
    " + var/list/L = object + if(length(L)) + for(var/key in object) + if(islist(key)) + text_list += "" + SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) + text_list += "" + else + SDQL_print(key, text_list, TRUE, recursion, FALSE) + if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) + var/value = L[key] + text_list += " --> " + if(islist(value)) + text_list += "" + SDQL_print(value, text_list, TRUE, recursion + 1, FALSE) + text_list += "" + else + SDQL_print(value, text_list, TRUE, recursion, FALSE) + text_list += "
    " + text_list += "\]" + if(linebreak) + text_list += "
    " else if(isnull(object)) if(print_nulls) - text_list += "NULL
    " + text_list += "NULL" + else if(istext(object)) + text_list += "\"[object]\"" + else if(isnum(object) || ispath(object)) + text_list += "[object]" else - text_list += "[object]
    " + text_list += "UNKNOWN: [object]" + if(linebreak) + text_list += "
    " /datum/SDQL2_query/CanProcCall() if(!allow_admin_interact) @@ -764,7 +792,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null for(var/arg in arguments) new_args[++new_args.len] = SDQL_expression(source, arg) if(object == GLOB) // Global proc. - procname = "/proc/[procname]" return superuser? (call(procname)(new_args)) : (WrapAdminProcCall(GLOBAL_PROC, procname, new_args)) return superuser? (call(object, procname)(new_args)) : (WrapAdminProcCall(object, procname, new_args)) @@ -958,7 +985,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/static/list/exclude = list("usr", "src", "marked", "global") var/long = start < expression.len var/datum/D - if(is_proper_datum(object)) + if(is_object_datatype(object)) D = object if (object == world && (!long || expression[start + 1] == ".") && !(expression[start] in exclude)) //3 == length("SS") + 1 @@ -1026,8 +1053,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null v = SSnpcpool if("SSmobs") v = SSmobs - if("SSmood") - v = SSmood if("SSquirks") v = SSquirks if("SSwet_floors") @@ -1164,9 +1189,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null query_list += word return query_list -/proc/is_proper_datum(thing) - return istype(thing, /datum) || istype(thing, /client) - /obj/effect/statclick/SDQL2_delete/Click() var/datum/SDQL2_query/Q = target Q.delete_click() diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 8cfd53b300..869e44e4f5 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -23,8 +23,8 @@ /datum/borgpanel/New(to_user, mob/living/silicon/robot/to_borg) if(!istype(to_borg)) - CRASH("Borg panel is only available for borgs") qdel(src) + CRASH("Borg panel is only available for borgs") user = CLIENT_FROM_VAR(to_user) @@ -85,7 +85,7 @@ if ("set_charge") var/newcharge = input("New charge (0-[borg.cell.maxcharge]):", borg.name, borg.cell.charge) as num|null if (newcharge) - borg.cell.charge = CLAMP(newcharge, 0, borg.cell.maxcharge) + borg.cell.charge = clamp(newcharge, 0, borg.cell.maxcharge) message_admins("[key_name_admin(user)] set the charge of [ADMIN_LOOKUPFLW(borg)] to [borg.cell.charge].") log_admin("[key_name(user)] set the charge of [key_name(borg)] to [borg.cell.charge].") if ("remove_cell") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 54d6a864fd..8406248164 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -15,214 +15,6 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/* 21st Sept 2010 -Updated by Skie -- Still not perfect but better! -Stuff you can't do: -Call proc /mob/proc/Dizzy() for some player -Because if you select a player mob as owner it tries to do the proc for -/mob/living/carbon/human/ instead. And that gives a run-time error. -But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. -*/ - -/client/proc/callproc() - set category = "Debug" - set name = "Advanced ProcCall" - set waitfor = FALSE - - if(!check_rights(R_DEBUG)) - return - - var/datum/target = null - var/targetselected = FALSE - var/returnval = null - - if(alert("Proc owned by something?",,"Yes","No") == "Yes") - targetselected = TRUE - var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT)) - if (!value["class"] || !value["value"]) - return - target = value["value"] - - var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null - if(!procpath) - return - - //strip away everything but the proc name - var/list/proclist = splittext(procpath, "/") - if (!length(proclist)) - return - - var/procname = proclist[proclist.len] - var/proctype = ("verb" in proclist) ? "verb" :"proc" - - if(targetselected) - if(!hascall(target, procname)) - to_chat(usr, "Error: callproc(): type [target.type] has no [proctype] named [procpath].") - return - else - procpath = "/[proctype]/[procname]" - if(!text2path(procpath)) - to_chat(usr, "Error: callproc(): [procpath] does not exist.") - return - - var/list/lst = get_callproc_args() - if(!lst) - return - - if(targetselected) - if(!target) - to_chat(usr, "Error: callproc(): owner of proc no longer exists.") - return - var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]." - log_admin(msg) - message_admins(msg) - admin_ticket_log(target, msg) - returnval = WrapAdminProcCall(target, procname, lst) - else - var/msg = "[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]." - log_admin(msg) - message_admins(msg) - returnval = WrapAdminProcCall(GLOBAL_PROC, procpath, lst) //calling globals needs full qualified name (e.g /proc/foo) - . = get_callproc_returnval(returnval, procname) - if(.) - to_chat(usr, .) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -GLOBAL_VAR(AdminProcCaller) -GLOBAL_PROTECT(AdminProcCaller) -GLOBAL_VAR_INIT(AdminProcCallCount, 0) -GLOBAL_PROTECT(AdminProcCallCount) -GLOBAL_VAR(LastAdminCalledTargetRef) -GLOBAL_PROTECT(LastAdminCalledTargetRef) -GLOBAL_VAR(LastAdminCalledTarget) -GLOBAL_PROTECT(LastAdminCalledTarget) -GLOBAL_VAR(LastAdminCalledProc) -GLOBAL_PROTECT(LastAdminCalledProc) -GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) -GLOBAL_PROTECT(AdminProcCallSpamPrevention) - -/proc/WrapAdminProcCall(datum/target, procname, list/arguments) - if(target != GLOBAL_PROC && procname == "Del") - to_chat(usr, "Calling Del() is not allowed") - return - - if(target != GLOBAL_PROC && !target.CanProcCall(procname)) - to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!") - return - var/current_caller = GLOB.AdminProcCaller - var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller - if(!ckey) - CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]") - if(current_caller && current_caller != ckey) - if(!GLOB.AdminProcCallSpamPrevention[ckey]) - to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") - GLOB.AdminProcCallSpamPrevention[ckey] = TRUE - UNTIL(!GLOB.AdminProcCaller) - to_chat(usr, "Running your proc") - GLOB.AdminProcCallSpamPrevention -= ckey - else - UNTIL(!GLOB.AdminProcCaller) - GLOB.LastAdminCalledProc = procname - if(target != GLOBAL_PROC) - GLOB.LastAdminCalledTargetRef = "[REF(target)]" - GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you - ++GLOB.AdminProcCallCount - . = world.WrapAdminProcCall(target, procname, arguments) - if(--GLOB.AdminProcCallCount == 0) - GLOB.AdminProcCaller = null - -//adv proc call this, ya nerds -/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) - if(target == GLOBAL_PROC) - return call(procname)(arglist(arguments)) - else if(target != world) - return call(target, procname)(arglist(arguments)) - else - log_admin_private("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]") - -/proc/IsAdminAdvancedProcCall() -#ifdef TESTING - return FALSE -#else - return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey -#endif - -/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) - set category = "Debug" - set name = "Atom ProcCall" - set waitfor = FALSE - - if(!check_rights(R_DEBUG)) - return - - var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null - if(!procname) - return - if(!hascall(A,procname)) - to_chat(usr, "Error: callproc_datum(): type [A.type] has no proc named [procname].") - return - var/list/lst = get_callproc_args() - if(!lst) - return - - if(!A || !IsValidSrc(A)) - to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") - return - var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." - log_admin(msg) - message_admins(msg) - admin_ticket_log(A, msg) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc - . = get_callproc_returnval(returnval,procname) - if(.) - to_chat(usr, .) - -/client/proc/get_callproc_args() - var/argnum = input("Number of arguments","Number:",0) as num|null - if(isnull(argnum)) - return - - . = list() - var/list/named_args = list() - while(argnum--) - var/named_arg = input("Leave blank for positional argument. Positional arguments will be considered as if they were added first.", "Named argument") as text|null - var/value = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) - if (!value["class"]) - return - if(named_arg) - named_args[named_arg] = value["value"] - else - . += value["value"] - if(LAZYLEN(named_args)) - . += named_args - -/client/proc/get_callproc_returnval(returnval,procname) - . = "" - if(islist(returnval)) - var/list/returnedlist = returnval - . = "" - if(returnedlist.len) - var/assoc_check = returnedlist[1] - if(istext(assoc_check) && (returnedlist[assoc_check] != null)) - . += "[procname] returned an associative list:" - for(var/key in returnedlist) - . += "\n[key] = [returnedlist[key]]" - - else - . += "[procname] returned a list:" - for(var/elem in returnedlist) - . += "\n[elem]" - else - . = "[procname] returned an empty list" - . += "" - - else - . = "[procname] returned: [!isnull(returnval) ? returnval : "null"]" - /client/proc/Cell() set category = "Debug" set name = "Air Status in Location" @@ -343,66 +135,6 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) else alert("Invalid mob") -/proc/make_types_fancy(var/list/types) - if (ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/item/radio/headset = "HEADSET", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/book/manual = "MANUAL", - /obj/item/reagent_containers/food/drinks = "DRINK", //longest paths comes first - /obj/item/reagent_containers/food = "FOOD", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/organ = "ORGAN", - /obj/item = "ITEM", - /obj/machinery = "MACHINERY", - /obj/effect = "EFFECT", - /obj = "O", - /datum = "D", - /turf/open = "OPEN", - /turf/closed = "CLOSED", - /turf = "T", - /mob/living/carbon = "CARBON", - /mob/living/simple_animal = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for (var/tn in TYPES_SHORTCUTS) - if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - //TODO: merge the vievars version into this or something maybe mayhaps /client/proc/cmd_debug_del_all(object as text) set category = "Debug" @@ -973,10 +705,17 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) var/list/names = list() names += "---- Space Ruins ----" for(var/name in SSmapping.space_ruins_templates) - names[name] = list(SSmapping.space_ruins_templates[name], ZTRAIT_SPACE_RUINS, /area/space) + names[name] = list(SSmapping.space_ruins_templates[name], ZTRAIT_SPACE_RUINS, list(/area/space)) names += "---- Lava Ruins ----" for(var/name in SSmapping.lava_ruins_templates) names[name] = list(SSmapping.lava_ruins_templates[name], ZTRAIT_LAVA_RUINS, /area/lavaland/surface/outdoors/unexplored) + names[name] = list(SSmapping.lava_ruins_templates[name], ZTRAIT_LAVA_RUINS, list(/area/lavaland/surface/outdoors/unexplored)) + names += "---- Ice Ruins ----" + for(var/name in SSmapping.ice_ruins_templates) + names[name] = list(SSmapping.ice_ruins_templates[name], ZTRAIT_ICE_RUINS, list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored)) + names += "---- Ice Underground Ruins ----" + for(var/name in SSmapping.ice_ruins_underground_templates) + names[name] = list(SSmapping.ice_ruins_underground_templates[name], ZTRAIT_ICE_RUINS_UNDERGROUND, list(/area/icemoon/underground/unexplored)) var/ruinname = input("Select ruin", "Spawn Ruin") as null|anything in names var/data = names[ruinname] diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index d71cdca991..e89c3ad5a6 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -18,9 +18,12 @@ var/image/item = image('icons/turf/overlays.dmi',S,"greenOverlay") item.plane = ABOVE_LIGHTING_PLANE preview += item + var/list/orientations = list("South" = SOUTH, "North" = NORTH, "East" = EAST, "West" = WEST) + var/choice = input(src, "Which orientation? Maps are normally facing SOUTH.", "Template Orientation", "South") as null|anything in orientations + var/orientation = orientations[choice] images += preview if(alert(src,"Confirm location.","Template Confirm","Yes","No") == "Yes") - if(template.load(T, centered = TRUE)) + if(template.load(T, centered = TRUE, orientation = orientation)) message_admins("[key_name_admin(src)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]") else to_chat(src, "Failed to place map") diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index cbbec40f85..e7b9342645 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -10,7 +10,7 @@ var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num if(!freq) freq = 1 - vol = CLAMP(vol, 1, 100) + vol = clamp(vol, 1, 100) var/sound/admin_sound = new() admin_sound.file = S @@ -138,6 +138,49 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") +/client/proc/manual_play_web_sound() + set category = "Fun" + set name = "Manual Play Internet Sound" + if(!check_rights(R_SOUNDS)) + return + + var/web_sound_input = input("Enter content stream URL (fetch this from local youtube-dl!)", "Play Internet Sound via direct URL") as text|null + if(istext(web_sound_input)) + if(!length(web_sound_input)) + log_admin("[key_name(src)] stopped web sound") + message_admins("[key_name(src)] stopped web sound") + var/mob/M + for(var/i in GLOB.player_list) + M = i + M?.client?.chatOutput?.stopMusic() + return + else + if(web_sound_input && !findtext(web_sound_input, GLOB.is_http_protocol)) + to_chat(src, "BLOCKED: Content URL not using http(s) protocol") + return + var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num + if(isnull(freq)) + return + if(!freq) + freq = 1 + SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]")) + var/logstr = "[key_name(src)] played web sound at freq [freq]: [web_sound_input]" + log_admin(logstr) + message_admins(logstr) + var/mob/M + var/client/C + var/datum/chatOutput/O + for(var/i in GLOB.player_list) + M = i + C = M.client + if(!(C?.prefs?.toggles & SOUND_MIDI)) + continue + O = C.chatOutput + if(!O || O.broken || !O.loaded) + continue + O.sendMusic(web_sound_input, freq) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Manual Play Internet Sound") + /client/proc/set_round_end_sound(S as sound) set category = "Fun" set name = "Set Round End Sound" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index c44328775f..d335cfb171 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -594,31 +594,6 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(A) -/client/proc/admin_delete(datum/D) - var/atom/A = D - var/coords = "" - var/jmp_coords = "" - if(istype(A)) - var/turf/T = get_turf(A) - if(T) - coords = "at [COORD(T)]" - jmp_coords = "at [ADMIN_COORDJMP(T)]" - else - jmp_coords = coords = "in nullspace" - - if (alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [D] [coords]") - message_admins("[key_name_admin(usr)] deleted [D] [jmp_coords]") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(isturf(D)) - var/turf/T = D - T.ScrapeAway() - else - vv_update_display(D, "deleted", VV_MSG_DELETED) - qdel(D) - if(!QDELETED(D)) - vv_update_display(D, "deleted", "") - /client/proc/cmd_admin_list_open_jobs() set category = "Admin" set name = "Manage Job Slots" @@ -1243,6 +1218,58 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_admin_toggle_fov() + set category = "Fun" + set name = "Enable/Disable Field of Vision" + + var/static/busy_toggling_fov = FALSE + if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) + return + + var/on_off = CONFIG_GET(flag/use_field_of_vision) + + if(busy_toggling_fov) + to_chat(usr, "A previous call of this function is still busy toggling FoV [on_off ? "on" : "off"]. Have some patiece.") + return + busy_toggling_fov = TRUE + + log_admin("[key_name(usr)] has [on_off ? "disabled" : "enabled"] the Field of Vision configuration.") + CONFIG_SET(flag/use_field_of_vision, !on_off) + + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Field of Vision", "[on_off ? "Enabled" : "Disabled"]")) + + if(on_off) + for(var/k in GLOB.mob_list) + if(!k) + continue + var/mob/M = k + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!(H.dna?.species.has_field_of_vision)) + continue + else if(!M.has_field_of_vision) + continue + var/datum/component/field_of_vision/FoV = M.GetComponent(/datum/component/field_of_vision) + if(FoV) + qdel(FoV) + CHECK_TICK + else + for(var/k in GLOB.clients) + if(!k) + continue + var/client/C = k + var/mob/M = C.mob + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!(H.dna?.species.has_field_of_vision)) + continue + else if(!M.has_field_of_vision) + continue + M.LoadComponent(/datum/component/field_of_vision, M.field_of_vision_type) + CHECK_TICK + + busy_toggling_fov = FALSE + /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" set category = "Fun" @@ -1404,3 +1431,47 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits else message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") + +/// Allow admin to add or remove traits of datum +/datum/admins/proc/modify_traits(datum/D) + if(!D) + return + + var/add_or_remove = input("Remove/Add?", "Trait Remove/Add") as null|anything in list("Add","Remove") + if(!add_or_remove) + return + var/list/availible_traits = list() + + switch(add_or_remove) + if("Add") + for(var/key in GLOB.traits_by_type) + if(istype(D,key)) + availible_traits += GLOB.traits_by_type[key] + if("Remove") + if(!GLOB.trait_name_map) + GLOB.trait_name_map = generate_trait_name_map() + for(var/trait in D.status_traits) + var/name = GLOB.trait_name_map[trait] || trait + availible_traits[name] = trait + + var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in sortList(availible_traits) + if(!chosen_trait) + return + chosen_trait = availible_traits[chosen_trait] + + var/source = "adminabuse" + switch(add_or_remove) + if("Add") //Not doing source choosing here intentionally to make this bit faster to use, you can always vv it. + ADD_TRAIT(D,chosen_trait,source) + if("Remove") + var/specific = input("All or specific source ?", "Trait Remove/Add") as null|anything in list("All","Specific") + if(!specific) + return + switch(specific) + if("All") + source = null + if("Specific") + source = input("Source to be removed","Trait Remove/Add") as null|anything in sortList(D.status_traits[chosen_trait]) + if(!source) + return + REMOVE_TRAIT(D,chosen_trait,source) diff --git a/code/modules/admin/view_variables/admin_delete.dm b/code/modules/admin/view_variables/admin_delete.dm new file mode 100644 index 0000000000..947ad5db2c --- /dev/null +++ b/code/modules/admin/view_variables/admin_delete.dm @@ -0,0 +1,24 @@ +/client/proc/admin_delete(datum/D) + var/atom/A = D + var/coords = "" + var/jmp_coords = "" + if(istype(A)) + var/turf/T = get_turf(A) + if(T) + coords = "at [COORD(T)]" + jmp_coords = "at [ADMIN_COORDJMP(T)]" + else + jmp_coords = coords = "in nullspace" + + if (alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D] [coords]") + message_admins("[key_name_admin(usr)] deleted [D] [jmp_coords]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(isturf(D)) + var/turf/T = D + T.ScrapeAway() + else + vv_update_display(D, "deleted", VV_MSG_DELETED) + qdel(D) + if(!QDELETED(D)) + vv_update_display(D, "deleted", "") diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm new file mode 100644 index 0000000000..ab9f4a534c --- /dev/null +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -0,0 +1,96 @@ +#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) +/// Get displayed variable in VV variable list +/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE) //if D is a list, name will be index, and value will be assoc value. + var/header + if(D) + if(islist(D)) + var/index = name + if (value) + name = D[name] //name is really the index until this line + else + value = D[name] + header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_REMOVE, "-", index)]) " + else + header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_MASSEDIT, "M", name)]) " + else + header = "
  • " + + var/item + var/name_part = VV_HTML_ENCODE(name) + if(level > 0 || islist(D)) //handling keys in assoc lists + if(istype(name,/datum)) + name_part = "[VV_HTML_ENCODE(name)] [REF(name)]" + else if(islist(name)) + var/list/L = name + name_part = " /list ([length(L)]) [REF(name)]" + + if (isnull(value)) + item = "[name_part] = null" + + else if (istext(value)) + item = "[name_part] = \"[VV_HTML_ENCODE(value)]\"" + + else if (isicon(value)) + #ifdef VARSICON + var/icon/I = icon(value) + var/rnd = rand(1,10000) + var/rname = "tmp[REF(I)][rnd].png" + usr << browse_rsc(I, rname) + item = "[name_part] = ([value]) " + #else + item = "[name_part] = /icon ([value])" + #endif + + else if (isfile(value)) + item = "[name_part] = '[value]'" + + else if(istype(value,/matrix)) // Needs to be before datum + var/matrix/M = value + item = {"[name_part] = +
      + + + + + + +
    [M.a][M.d]0
    [M.b][M.e]0
    [M.c][M.f]1
     
    "} //TODO link to modify_transform wrapper for all matrices + else if (istype(value, /datum)) + var/datum/DV = value + if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it. + item = "[name_part] = [DV] [DV.type] [REF(value)]" + else + item = "[name_part] = [DV.type] [REF(value)]" + + else if (islist(value)) + var/list/L = value + var/list/items = list() + + if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) + for (var/i in 1 to L.len) + var/key = L[i] + var/val + if (IS_NORMAL_LIST(L) && !isnum(key)) + val = L[key] + if (isnull(val)) // we still want to display non-null false values, such as 0 or "" + val = key + key = i + + items += debug_variable(key, val, level + 1, sanitize = sanitize) + + item = "[name_part] = /list ([L.len])
      [items.Join()]
    " + else + item = "[name_part] = /list ([L.len])" + + else if (name in GLOB.bitfields) + var/list/flags = list() + for (var/i in GLOB.bitfields[name]) + if (value & GLOB.bitfields[name][i]) + flags += i + item = "[name_part] = [VV_HTML_ENCODE(jointext(flags, ", "))]" + else + item = "[name_part] = [VV_HTML_ENCODE(value)]" + + return "[header][item]
  • " + +#undef VV_HTML_ENCODE \ No newline at end of file diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm new file mode 100644 index 0000000000..3f90002edc --- /dev/null +++ b/code/modules/admin/view_variables/get_variables.dm @@ -0,0 +1,271 @@ +/client/proc/vv_get_class(var_name, var_value) + if(isnull(var_value)) + . = VV_NULL + + else if(isnum(var_value)) + if(var_name in GLOB.bitfields) + . = VV_BITFIELD + else + . = VV_NUM + + else if(istext(var_value)) + if(findtext(var_value, "\n")) + . = VV_MESSAGE + else + . = VV_TEXT + + else if(isicon(var_value)) + . = VV_ICON + + else if(ismob(var_value)) + . = VV_MOB_REFERENCE + + else if(isloc(var_value)) + . = VV_ATOM_REFERENCE + + else if(istype(var_value, /client)) + . = VV_CLIENT + + else if(istype(var_value, /datum)) + . = VV_DATUM_REFERENCE + + else if(ispath(var_value)) + if(ispath(var_value, /atom)) + . = VV_ATOM_TYPE + else if(ispath(var_value, /datum)) + . = VV_DATUM_TYPE + else + . = VV_TYPE + + else if(islist(var_value)) + . = VV_LIST + + else if(isfile(var_value)) + . = VV_FILE + else + . = VV_NULL + +/client/proc/vv_get_value(class, default_class, current_value, list/restricted_classes, list/extra_classes, list/classes, var_name) + . = list("class" = class, "value" = null) + if(!class) + if(!classes) + classes = list ( + VV_NUM, + VV_TEXT, + VV_MESSAGE, + VV_ICON, + VV_ATOM_REFERENCE, + VV_DATUM_REFERENCE, + VV_MOB_REFERENCE, + VV_CLIENT, + VV_ATOM_TYPE, + VV_DATUM_TYPE, + VV_TYPE, + VV_FILE, + VV_NEW_ATOM, + VV_NEW_DATUM, + VV_NEW_TYPE, + VV_NEW_LIST, + VV_NULL, + VV_RESTORE_DEFAULT, + VV_TEXT_LOCATE, + VV_PROCCALL_RETVAL, + ) + + var/markstring + if(!(VV_MARKED_DATUM in restricted_classes)) + markstring = "[VV_MARKED_DATUM] (CURRENT: [(istype(holder) && istype(holder.marked_datum))? holder.marked_datum.type : "NULL"])" + classes += markstring + + if(restricted_classes) + classes -= restricted_classes + + if(extra_classes) + classes += extra_classes + + .["class"] = input(src, "What kind of data?", "Variable Type", default_class) as null|anything in classes + if(holder && holder.marked_datum && .["class"] == markstring) + .["class"] = VV_MARKED_DATUM + + switch(.["class"]) + if(VV_TEXT) + .["value"] = input("Enter new text:", "Text", current_value) as null|text + if(.["value"] == null) + .["class"] = null + return + if(VV_MESSAGE) + .["value"] = input("Enter new text:", "Text", current_value) as null|message + if(.["value"] == null) + .["class"] = null + return + + + if(VV_NUM) + .["value"] = input("Enter new number:", "Num", current_value) as null|num + if(.["value"] == null) + .["class"] = null + return + + if(VV_BITFIELD) + .["value"] = input_bitfield(usr, "Editing bitfield: [var_name]", var_name, current_value) + if(.["value"] == null) + .["class"] = null + return + + if(VV_ATOM_TYPE) + .["value"] = pick_closest_path(FALSE) + if(.["value"] == null) + .["class"] = null + return + + if(VV_DATUM_TYPE) + .["value"] = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + if(.["value"] == null) + .["class"] = null + return + + if(VV_TYPE) + var/type = current_value + var/error = "" + do + type = input("Enter type:[error]", "Type", type) as null|text + if(!type) + break + type = text2path(type) + error = "\nType not found, Please try again" + while(!type) + if(!type) + .["class"] = null + return + .["value"] = type + + if(VV_ATOM_REFERENCE) + var/type = pick_closest_path(FALSE) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_DATUM_REFERENCE) + var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_MOB_REFERENCE) + var/type = pick_closest_path(FALSE, make_types_fancy(typesof(/mob))) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_CLIENT) + .["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients + if(.["value"] == null) + .["class"] = null + return + + if(VV_FILE) + .["value"] = input("Pick file:", "File") as null|file + if(.["value"] == null) + .["class"] = null + return + + if(VV_ICON) + .["value"] = input("Pick icon:", "Icon") as null|icon + if(.["value"] == null) + .["class"] = null + return + + if(VV_MARKED_DATUM) + .["value"] = holder.marked_datum + if(.["value"] == null) + .["class"] = null + return + + if(VV_PROCCALL_RETVAL) + var/list/get_retval = list() + callproc_blocking(get_retval) + .["value"] = get_retval[1] //should have been set in proccall! + if(.["value"] == null) + .["class"] = null + return + + if(VV_NEW_ATOM) + var/type = pick_closest_path(FALSE) + if(!type) + .["class"] = null + return + .["type"] = type + var/atom/newguy = new type() + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_DATUM) + var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + if(!type) + .["class"] = null + return + .["type"] = type + var/datum/newguy = new type() + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_TYPE) + var/type = current_value + var/error = "" + do + type = input("Enter type:[error]", "Type", type) as null|text + if(!type) + break + type = text2path(type) + error = "\nType not found, Please try again" + while(!type) + if(!type) + .["class"] = null + return + .["type"] = type + var/datum/newguy = new type() + if(istype(newguy)) + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_LIST) + .["value"] = list() + .["type"] = /list + + if(VV_TEXT_LOCATE) + var/datum/D + do + var/ref = input("Enter reference:", "Reference") as null|text + if(!ref) + break + D = locate(ref) + if(!D) + alert("Invalid ref!") + continue + if(!D.can_vv_mark()) + alert("Datum can not be marked!") + continue + while(!D) + .["type"] = D.type + .["value"] = D diff --git a/code/modules/admin/view_variables/mark_datum.dm b/code/modules/admin/view_variables/mark_datum.dm new file mode 100644 index 0000000000..9f1b333750 --- /dev/null +++ b/code/modules/admin/view_variables/mark_datum.dm @@ -0,0 +1,12 @@ +/client/proc/mark_datum(datum/D) + if(!holder) + return + if(holder.marked_datum) + vv_update_display(holder.marked_datum, "marked", "") + holder.marked_datum = D + vv_update_display(D, "marked", VV_MSG_MARKED) + +/client/proc/mark_datum_mapview(datum/D as mob|obj|turf|area in view(view)) + set category = "Debug" + set name = "Mark Object" + mark_datum(D) diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/view_variables/mass_edit_variables.dm similarity index 94% rename from code/modules/admin/verbs/massmodvar.dm rename to code/modules/admin/view_variables/mass_edit_variables.dm index ba199350e3..4e78e1aed7 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/view_variables/mass_edit_variables.dm @@ -197,7 +197,7 @@ log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)") message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)") - +//not using global lists as vv is a debug function and debug functions should rely on as less things as possible. /proc/get_all_of_type(var/T, subtypes = TRUE) var/list/typecache = list() typecache[T] = 1 @@ -205,19 +205,25 @@ typecache = typecacheof(typecache) . = list() if (ispath(T, /mob)) - for(var/mob/thing in GLOB.mob_list) + for(var/mob/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK else if (ispath(T, /obj/machinery/door)) - for(var/obj/machinery/door/thing in GLOB.airlocks) + for(var/obj/machinery/door/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK else if (ispath(T, /obj/machinery)) - for(var/obj/machinery/thing in GLOB.machines) + for(var/obj/machinery/thing in world) + if (typecache[thing.type]) + . += thing + CHECK_TICK + + else if (ispath(T, /obj/item)) + for(var/obj/item/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK @@ -247,7 +253,7 @@ CHECK_TICK else if (ispath(T, /client)) - for(var/client/thing in GLOB.clients) + for(var/client/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/view_variables/modify_variables.dm similarity index 60% rename from code/modules/admin/verbs/modifyvariables.dm rename to code/modules/admin/view_variables/modify_variables.dm index 537c31d3b4..5f80b3a5e4 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -1,264 +1,12 @@ -GLOBAL_LIST_INIT(VVlocked, list("vars", "datum_flags", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "force_ending")) +GLOBAL_LIST_INIT(VVlocked, list("vars", "datum_flags", "client", "mob")) //Requires DEBUG GLOBAL_PROTECT(VVlocked) -GLOBAL_LIST_INIT(VVicon_edit_lock, list("icon", "icon_state", "overlays", "underlays", "resize")) +GLOBAL_LIST_INIT(VVicon_edit_lock, list("icon", "icon_state", "overlays", "underlays")) //Requires DEBUG or FUN GLOBAL_PROTECT(VVicon_edit_lock) -GLOBAL_LIST_INIT(VVckey_edit, list("key", "ckey")) +GLOBAL_LIST_INIT(VVckey_edit, list("key", "ckey")) //Requires DEBUG or SPAWN GLOBAL_PROTECT(VVckey_edit) -GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y")) +GLOBAL_LIST_INIT(VVpixelmovement, list("bound_x", "bound_y", "step_x", "step_y", "step_size", "bound_height", "bound_width", "bounds")) //No editing ever. GLOBAL_PROTECT(VVpixelmovement) - -/client/proc/vv_get_class(var/var_name, var/var_value) - if(isnull(var_value)) - . = VV_NULL - - else if (isnum(var_value)) - if (var_name in GLOB.bitfields) - . = VV_BITFIELD - else - . = VV_NUM - - else if (istext(var_value)) - if (findtext(var_value, "\n")) - . = VV_MESSAGE - else - . = VV_TEXT - - else if (isicon(var_value)) - . = VV_ICON - - else if (ismob(var_value)) - . = VV_MOB_REFERENCE - - else if (isloc(var_value)) - . = VV_ATOM_REFERENCE - - else if (istype(var_value, /client)) - . = VV_CLIENT - - else if (istype(var_value, /datum)) - . = VV_DATUM_REFERENCE - - else if (ispath(var_value)) - if (ispath(var_value, /atom)) - . = VV_ATOM_TYPE - else if (ispath(var_value, /datum)) - . = VV_DATUM_TYPE - else - . = VV_TYPE - - else if (islist(var_value)) - . = VV_LIST - - else if (isfile(var_value)) - . = VV_FILE - else - . = VV_NULL - -/client/proc/vv_get_value(class, default_class, current_value, list/restricted_classes, list/extra_classes, list/classes, var_name) - . = list("class" = class, "value" = null) - if (!class) - if (!classes) - classes = list ( - VV_NUM, - VV_TEXT, - VV_MESSAGE, - VV_ICON, - VV_ATOM_REFERENCE, - VV_DATUM_REFERENCE, - VV_MOB_REFERENCE, - VV_CLIENT, - VV_ATOM_TYPE, - VV_DATUM_TYPE, - VV_TYPE, - VV_FILE, - VV_NEW_ATOM, - VV_NEW_DATUM, - VV_NEW_TYPE, - VV_NEW_LIST, - VV_NULL, - VV_RESTORE_DEFAULT - ) - - if(holder && holder.marked_datum && !(VV_MARKED_DATUM in restricted_classes)) - classes += "[VV_MARKED_DATUM] ([holder.marked_datum.type])" - if (restricted_classes) - classes -= restricted_classes - - if (extra_classes) - classes += extra_classes - - .["class"] = input(src, "What kind of data?", "Variable Type", default_class) as null|anything in classes - if (holder && holder.marked_datum && .["class"] == "[VV_MARKED_DATUM] ([holder.marked_datum.type])") - .["class"] = VV_MARKED_DATUM - - - switch(.["class"]) - if (VV_TEXT) - .["value"] = input("Enter new text:", "Text", current_value) as null|text - if (.["value"] == null) - .["class"] = null - return - if (VV_MESSAGE) - .["value"] = input("Enter new text:", "Text", current_value) as null|message - if (.["value"] == null) - .["class"] = null - return - - - if (VV_NUM) - .["value"] = input("Enter new number:", "Num", current_value) as null|num - if (.["value"] == null) - .["class"] = null - return - - if (VV_BITFIELD) - .["value"] = input_bitfield(usr, "Editing bitfield: [var_name]", var_name, current_value) - if (.["value"] == null) - .["class"] = null - return - - if (VV_ATOM_TYPE) - .["value"] = pick_closest_path(FALSE) - if (.["value"] == null) - .["class"] = null - return - - if (VV_DATUM_TYPE) - .["value"] = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - if (.["value"] == null) - .["class"] = null - return - - if (VV_TYPE) - var/type = current_value - var/error = "" - do - type = input("Enter type:[error]", "Type", type) as null|text - if (!type) - break - type = text2path(type) - error = "\nType not found, Please try again" - while(!type) - if (!type) - .["class"] = null - return - .["value"] = type - - - if (VV_ATOM_REFERENCE) - var/type = pick_closest_path(FALSE) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - if (VV_DATUM_REFERENCE) - var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - if (VV_MOB_REFERENCE) - var/type = pick_closest_path(FALSE, make_types_fancy(typesof(/mob))) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - - - if (VV_CLIENT) - .["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients - if (.["value"] == null) - .["class"] = null - return - - - if (VV_FILE) - .["value"] = input("Pick file:", "File") as null|file - if (.["value"] == null) - .["class"] = null - return - - - if (VV_ICON) - .["value"] = input("Pick icon:", "Icon") as null|icon - if (.["value"] == null) - .["class"] = null - return - - - if (VV_MARKED_DATUM) - .["value"] = holder.marked_datum - if (.["value"] == null) - .["class"] = null - return - - - if (VV_NEW_ATOM) - var/type = pick_closest_path(FALSE) - if (!type) - .["class"] = null - return - .["type"] = type - var/atom/newguy = new type() - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - if (VV_NEW_DATUM) - var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - if (!type) - .["class"] = null - return - .["type"] = type - var/datum/newguy = new type() - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - if (VV_NEW_TYPE) - var/type = current_value - var/error = "" - do - type = input("Enter type:[error]", "Type", type) as null|text - if (!type) - break - type = text2path(type) - error = "\nType not found, Please try again" - while(!type) - if (!type) - .["class"] = null - return - .["type"] = type - var/datum/newguy = new type() - if(istype(newguy)) - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - - if (VV_NEW_LIST) - .["value"] = list() - .["type"] = /list - /client/proc/vv_parse_text(O, new_var) if(O && findtext(new_var,"\[")) var/process_vars = alert(usr,"\[] detected in string, process as variables?","Process Variables?","Yes","No") @@ -372,13 +120,13 @@ GLOBAL_PROTECT(VVpixelmovement) if(confirm != "Continue") return - + var/is_normal_list = IS_NORMAL_LIST(L) var/list/names = list() for (var/i in 1 to L.len) var/key = L[i] var/value - if (IS_NORMAL_LIST(L) && !isnum(key)) + if (is_normal_list && !isnum(key)) value = L[key] if (value == null) value = "null" @@ -439,10 +187,18 @@ GLOBAL_PROTECT(VVpixelmovement) assoc_key = L[index] var/default var/variable - if (assoc) - variable = L[assoc_key] - else - variable = L[index] + var/old_assoc_value //EXPERIMENTAL - Keep old associated value while modifying key, if any + if(is_normal_list) + if (assoc) + variable = L[assoc_key] + else + variable = L[index] + //EXPERIMENTAL - Keep old associated value while modifying key, if any + if(IS_VALID_ASSOC_KEY(variable)) + var/found = L[variable] + if(!isnull(found)) + old_assoc_value = found + // default = vv_get_class(objectvar, variable) @@ -504,11 +260,13 @@ GLOBAL_PROTECT(VVpixelmovement) for(var/V in varsvars) new_var = replacetext(new_var,"\[[V]]","[O.vars[V]]") - - if(assoc) - L[assoc_key] = new_var - else - L[index] = new_var + if(is_normal_list) + if(assoc) + L[assoc_key] = new_var + else + L[index] = new_var + if(!isnull(old_assoc_value) && IS_VALID_ASSOC_KEY(new_var)) + L[new_var] = old_assoc_value if (O) if (O.vv_edit_var(objectvar, L) == FALSE) to_chat(src, "Your edit was rejected by the object.") @@ -527,15 +285,8 @@ GLOBAL_PROTECT(VVpixelmovement) if(param_var_name in GLOB.VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG)) return FALSE - if(param_var_name in GLOB.VVpixelmovement) - if(!check_rights(R_DEBUG)) - return FALSE - var/prompt = alert(usr, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT") - if (prompt != "Continue") - return FALSE return TRUE - /client/proc/modify_variables(atom/O, param_var_name = null, autodetect_class = 0) if(!check_rights(R_VAREDIT)) return @@ -567,11 +318,6 @@ GLOBAL_PROTECT(VVpixelmovement) var_value = O.vars[variable] if(!vv_varname_lockcheck(variable)) return - if(istype(O, /datum/armor)) - var/prompt = alert(src, "Editing this var changes this value on potentially thousands of items that share the same combination of armor values. If you want to edit the armor of just one item, use the \"Modify armor values\" dropdown item", "DANGER", "ABORT ", "Continue", " ABORT") - if (prompt != "Continue") - return - var/default = vv_get_class(variable, var_value) @@ -635,10 +381,9 @@ GLOBAL_PROTECT(VVpixelmovement) to_chat(src, "Your edit was rejected by the object.") return vv_update_display(O, "varedited", VV_MSG_EDITED) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args) log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" message_admins(msg) admin_ticket_log(O, msg) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm new file mode 100644 index 0000000000..626e75fa10 --- /dev/null +++ b/code/modules/admin/view_variables/topic.dm @@ -0,0 +1,128 @@ +//DO NOT ADD MORE TO THIS FILE. +//Use vv_do_topic() for datums! +/client/proc/view_var_Topic(href, href_list, hsrc) + if( (usr.client != src) || !src.holder || !holder.CheckAdminHref(href, href_list)) + return + var/target = GET_VV_TARGET + vv_do_basic(target, href_list, href) + if(istype(target, /datum)) + var/datum/D = target + D.vv_do_topic(href_list) + else if(islist(target)) + vv_do_list(target, href_list) + if(href_list["Vars"]) + debug_variables(locate(href_list["Vars"])) + +//Stuff below aren't in dropdowns/etc. + + if(check_rights(R_VAREDIT)) + + //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). + + if(href_list["rename"]) + if(!check_rights(NONE)) + return + + var/mob/M = locate(href_list["rename"]) in GLOB.mob_list + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob") + return + + var/new_name = stripped_input(usr,"What would you like to name this mob?","Input a name",M.real_name,MAX_NAME_LEN) + if( !new_name || !M ) + return + + message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") + M.fully_replace_character_name(M.real_name,new_name) + vv_update_display(M, "name", new_name) + vv_update_display(M, "real_name", M.real_name || "No real name") + + else if(href_list["rotatedatum"]) + if(!check_rights(NONE)) + return + + var/atom/A = locate(href_list["rotatedatum"]) + if(!istype(A)) + to_chat(usr, "This can only be done to instances of type /atom") + return + + switch(href_list["rotatedir"]) + if("right") + A.setDir(turn(A.dir, -45)) + if("left") + A.setDir(turn(A.dir, 45)) + vv_update_display(A, "dir", dir2text(A.dir)) + + + else if(href_list["makehuman"]) + if(!check_rights(R_SPAWN)) + return + + var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list + if(!istype(Mo)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey") + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + if(!Mo) + to_chat(usr, "Mob doesn't exist anymore") + return + holder.Topic(href, list("humanone"=href_list["makehuman"])) + + else if(href_list["adjustDamage"] && href_list["mobToDamage"]) + if(!check_rights(NONE)) + return + + var/mob/living/L = locate(href_list["mobToDamage"]) in GLOB.mob_list + if(!istype(L)) + return + + var/Text = href_list["adjustDamage"] + + var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num + + if(!L) + to_chat(usr, "Mob doesn't exist anymore") + return + + var/newamt + switch(Text) + if("brute") + L.adjustBruteLoss(amount) + newamt = L.getBruteLoss() + if("fire") + L.adjustFireLoss(amount) + newamt = L.getFireLoss() + if("toxin") + L.adjustToxLoss(amount) + newamt = L.getToxLoss() + if("oxygen") + L.adjustOxyLoss(amount) + newamt = L.getOxyLoss() + if("brain") + L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) + if("clone") + L.adjustCloneLoss(amount) + newamt = L.getCloneLoss() + if("stamina") + L.adjustStaminaLoss(amount) + newamt = L.getStaminaLoss() + else + to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") + return + + if(amount != 0) + var/log_msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [key_name(L)]" + message_admins("[key_name(usr)] dealt [amount] amount of [Text] damage to [ADMIN_LOOKUPFLW(L)]") + log_admin(log_msg) + admin_ticket_log(L, "[log_msg]") + vv_update_display(L, Text, "[newamt]") + + + //Finally, refresh if something modified the list. + if(href_list["datumrefresh"]) + var/datum/DAT = locate(href_list["datumrefresh"]) + if(istype(DAT, /datum) || istype(DAT, /client)) + debug_variables(DAT) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm new file mode 100644 index 0000000000..d6e4c2b944 --- /dev/null +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -0,0 +1,79 @@ +//Not using datum.vv_do_topic for very basic/low level debug things, incase the datum's vv_do_topic is runtiming/whatnot. +/client/proc/vv_do_basic(datum/target, href_list) + var/target_var = GET_VV_VAR_TARGET + if(check_rights(R_VAREDIT)) + if(target_var) + if(href_list[VV_HK_BASIC_EDIT]) + if(!modify_variables(target, target_var, 1)) + return + switch(target_var) + if("name") + vv_update_display(target, "name", "[target]") + if("dir") + var/atom/A = target + if(istype(A)) + vv_update_display(target, "dir", dir2text(A.dir) || A.dir) + if("ckey") + var/mob/living/L = target + if(istype(L)) + vv_update_display(target, "ckey", L.ckey || "No ckey") + if("real_name") + var/mob/living/L = target + if(istype(L)) + vv_update_display(target, "real_name", L.real_name || "No real name") + if(href_list[VV_HK_BASIC_CHANGE]) + modify_variables(target, target_var, 0) + if(href_list[VV_HK_BASIC_MASSEDIT]) + cmd_mass_modify_object_variables(target, target_var) + if(check_rights(R_ADMIN, FALSE)) + if(href_list[VV_HK_EXPOSE]) + var/value = vv_get_value(VV_CLIENT) + if (value["class"] != VV_CLIENT) + return + var/client/C = value["value"] + if (!C) + return + if(!target) + to_chat(usr, "The object you tried to expose to [C] no longer exists (nulled or hard-deled)") + return + message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") + log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [target]") + to_chat(C, "[holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") + C.debug_variables(target) + if(check_rights(R_DEBUG)) + if(href_list[VV_HK_DELETE]) + usr.client.admin_delete(target) + if (isturf(src)) // show the turf that took its place + usr.client.debug_variables(src) + if(href_list[VV_HK_MARK]) + usr.client.mark_datum(target) + if(href_list[VV_HK_ADDCOMPONENT]) + if(!check_rights(NONE)) + return + var/list/names = list() + var/list/componentsubtypes = subtypesof(/datum/component) + names += "---Components---" + names += componentsubtypes + names += "---Elements---" + names += subtypesof(/datum/element) + var/result = input(usr, "Choose a component/element to add","better know what ur fuckin doin pal") as null|anything in names + if(!usr || !result || result == "---Components---" || result == "---Elements---") + return + if(QDELETED(src)) + to_chat(usr, "That thing doesn't exist anymore!") + return + var/list/lst = get_callproc_args() + if(!lst) + return + var/datumname = "error" + lst.Insert(1, result) + if(result in componentsubtypes) + datumname = "component" + target._AddComponent(lst) + else + datumname = "element" + target._AddElement(lst) + log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") + message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") + if(href_list[VV_HK_CALLPROC]) + usr.client.callproc_datum(target) diff --git a/code/modules/admin/view_variables/topic_list.dm b/code/modules/admin/view_variables/topic_list.dm new file mode 100644 index 0000000000..349d9da698 --- /dev/null +++ b/code/modules/admin/view_variables/topic_list.dm @@ -0,0 +1,43 @@ +//LISTS - CAN NOT DO VV_DO_TOPIC BECAUSE LISTS AREN'T DATUMS :( +/client/proc/vv_do_list(list/target, href_list) + var/target_index = text2num(GET_VV_VAR_TARGET) + if(check_rights(R_VAREDIT)) + if(target_index) + if(href_list[VV_HK_LIST_EDIT]) + mod_list(target, null, "list", "contents", target_index, autodetect_class = TRUE) + if(href_list[VV_HK_LIST_CHANGE]) + mod_list(target, null, "list", "contents", target_index, autodetect_class = FALSE) + if(href_list[VV_HK_LIST_REMOVE]) + var/variable = target[target_index] + var/prompt = alert("Do you want to remove item number [target_index] from list?", "Confirm", "Yes", "No") + if (prompt != "Yes") + return + target.Cut(target_index, target_index+1) + log_world("### ListVarEdit by [src]: /list's contents: REMOVED=[html_encode("[variable]")]") + log_admin("[key_name(src)] modified list's contents: REMOVED=[variable]") + message_admins("[key_name_admin(src)] modified list's contents: REMOVED=[variable]") + if(href_list[VV_HK_LIST_ADD]) + mod_list_add(target, null, "list", "contents") + if(href_list[VV_HK_LIST_ERASE_DUPES]) + uniqueList_inplace(target) + log_world("### ListVarEdit by [src]: /list contents: CLEAR DUPES") + log_admin("[key_name(src)] modified list's contents: CLEAR DUPES") + message_admins("[key_name_admin(src)] modified list's contents: CLEAR DUPES") + if(href_list[VV_HK_LIST_ERASE_NULLS]) + listclearnulls(target) + log_world("### ListVarEdit by [src]: /list contents: CLEAR NULLS") + log_admin("[key_name(src)] modified list's contents: CLEAR NULLS") + message_admins("[key_name_admin(src)] modified list's contents: CLEAR NULLS") + if(href_list[VV_HK_LIST_SET_LENGTH]) + var/value = vv_get_value(VV_NUM) + if (value["class"] != VV_NUM || value["value"] > max(50000, target.len)) //safety - would rather someone not put an extra 0 and erase the server's memory lmao. + return + target.len = value["value"] + log_world("### ListVarEdit by [src]: /list len: [target.len]") + log_admin("[key_name(src)] modified list's len: [target.len]") + message_admins("[key_name_admin(src)] modified list's len: [target.len]") + if(href_list[VV_HK_LIST_SHUFFLE]) + shuffle_inplace(target) + log_world("### ListVarEdit by [src]: /list contents: SHUFFLE") + log_admin("[key_name(src)] modified list's contents: SHUFFLE") + message_admins("[key_name_admin(src)] modified list's contents: SHUFFLE") diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm new file mode 100644 index 0000000000..abe445589f --- /dev/null +++ b/code/modules/admin/view_variables/view_variables.dm @@ -0,0 +1,260 @@ + +/client/proc/debug_variables(datum/D in world) + set category = "Debug" + set name = "View Variables" + //set src in world + var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. + + if(!usr.client || !usr.client.holder) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs. + to_chat(usr, "You need to be an administrator to access this.") + return + + if(!D) + return + + var/islist = islist(D) + if(!islist && !istype(D)) + return + + var/title = "" + var/refid = REF(D) + var/icon/sprite + var/hash + + var/type = islist? /list : D.type + var/no_icon = FALSE + + if(istype(D, /atom)) + sprite = getFlatIcon(D) + hash = md5(sprite) + if(sprite) + hash = md5(sprite) + src << browse_rsc(sprite, "vv[hash].png") + else + no_icon = TRUE + + title = "[D] ([REF(D)]) = [type]" + var/formatted_type = replacetext("[type]", "/", "/") + + var/sprite_text + if(sprite) + sprite_text = no_icon? "\[NO ICON\]" : "" + var/list/header = islist(D)? list("/list") : D.vv_get_header() + + var/marked_line + if(holder && holder.marked_datum && holder.marked_datum == D) + marked_line = VV_MSG_MARKED + var/varedited_line + if(!islist && (D.datum_flags & DF_VAR_EDITED)) + varedited_line = VV_MSG_EDITED + var/deleted_line + if(!islist && D.gc_destroyed) + deleted_line = VV_MSG_DELETED + + var/list/dropdownoptions + if (islist) + dropdownoptions = list( + "---", + "Add Item" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ADD), + "Remove Nulls" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ERASE_NULLS), + "Remove Dupes" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ERASE_DUPES), + "Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH), + "Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE), + "Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE), + "---" + ) + for(var/i in 1 to length(dropdownoptions)) + var/name = dropdownoptions[i] + var/link = dropdownoptions[name] + dropdownoptions[i] = "" + else + dropdownoptions = D.vv_get_dropdown() + + var/list/names = list() + if(!islist) + for(var/V in D.vars) + names += V + sleep(1) + + var/list/variable_html = list() + if(islist) + var/list/L = D + for(var/i in 1 to L.len) + var/key = L[i] + var/value + if(IS_NORMAL_LIST(L) && IS_VALID_ASSOC_KEY(key)) + value = L[key] + variable_html += debug_variable(i, value, 0, L) + else + names = sortList(names) + for(var/V in names) + if(D.can_vv_get(V)) + variable_html += D.vv_get_var(V) + + var/html = {" + + + + [title] + + + + +
    + + + + + +
    + + + + +
    + [sprite_text] +
    + [header.Join()] +
    +
    +
    + [formatted_type] + [marked_line] + [varedited_line] + [deleted_line] +
    +
    +
    + Refresh +
    + +
    +
    +
    +
    +
    + + E - Edit, tries to determine the variable type by itself.
    + C - Change, asks you for the var type first.
    + M - Mass modify: changes this variable for all objects of this type.
    +
    +
    + + + + + +
    +
    + Search: +
    +
    + +
    +
    +
      + [variable_html.Join()] +
    + + + +"} + src << browse(html, "window=variables[refid];size=475x650") + +/client/proc/vv_update_display(datum/D, span, content) + src << output("[span]:[content]", "variables[REF(D)].browser:replace_span") diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 4a7abda53c..b5ed6c18df 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -24,6 +24,8 @@ GLOBAL_LIST_EMPTY(antagonists) var/list/blacklisted_quirks = list(/datum/quirk/nonviolent,/datum/quirk/mute) // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. var/threat = 0 // Amount of threat this antag poses, for dynamic mode + var/list/skill_modifiers + /datum/antagonist/New() GLOB.antagonists += src typecache_datum_blacklist = typecacheof(typecache_datum_blacklist) @@ -62,21 +64,37 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/remove_innate_effects(mob/living/mob_override) return +// Adds the specified antag hud to the player. Usually called in an antag datum file +/datum/antagonist/proc/add_antag_hud(antag_hud_type, antag_hud_name, mob/living/mob_override) + var/datum/atom_hud/antag/hud = GLOB.huds[antag_hud_type] + hud.join_hud(mob_override) + set_antag_hud(mob_override, antag_hud_name) + +// Removes the specified antag hud from the player. Usually called in an antag datum file +/datum/antagonist/proc/remove_antag_hud(antag_hud_type, mob/living/mob_override) + var/datum/atom_hud/antag/hud = GLOB.huds[antag_hud_type] + hud.leave_hud(mob_override) + set_antag_hud(mob_override, null) + //Assign default team and creates one for one of a kind team antagonists /datum/antagonist/proc/create_team(datum/team/team) return //Proc called when the datum is given to a mind. /datum/antagonist/proc/on_gain() - if(owner && owner.current) - if(!silent) - greet() - apply_innate_effects() - give_antag_moodies() - remove_blacklisted_quirks() - if(is_banned(owner.current) && replace_banned) - replace_banned_player() - SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src) + if(!(owner?.current)) + return + if(!silent) + greet() + apply_innate_effects() + give_antag_moodies() + remove_blacklisted_quirks() + if(is_banned(owner.current) && replace_banned) + replace_banned_player() + if(skill_modifiers) + for(var/A in skill_modifiers) + ADD_SINGLETON_SKILL_MODIFIER(owner, A, type) + SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src) /datum/antagonist/proc/is_banned(mob/M) if(!M) @@ -99,6 +117,8 @@ GLOBAL_LIST_EMPTY(antagonists) clear_antag_moodies() if(owner) LAZYREMOVE(owner.antag_datums, src) + for(var/A in skill_modifiers) + owner.remove_skill_modifier(GET_SKILL_MOD_ID(A, type)) if(!silent && owner.current) farewell() var/datum/team/team = get_team() diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index 653853cfb5..9d138ed0b9 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -42,7 +42,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - report += "Objective #[objective_count]: [objective.explanation_text] Success!" + report += "Objective #[objective_count]: [objective.explanation_text] Success!" else if(completion <= 0) report += "Objective #[objective_count]: [objective.explanation_text] Fail." win = FALSE diff --git a/code/modules/antagonists/abductor/abductee/abductee.dm b/code/modules/antagonists/abductor/abductee/abductee.dm index 901d2f5b11..780c3f7419 100644 --- a/code/modules/antagonists/abductor/abductee/abductee.dm +++ b/code/modules/antagonists/abductor/abductee/abductee.dm @@ -31,4 +31,5 @@ /datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) update_abductor_icons_removed(mob_override ? mob_override.mind : owner) - qdel(brain_trauma) + if(!QDELETED(brain_trauma)) + qdel(brain_trauma) diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 44116dbe36..9132288415 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -21,6 +21,7 @@ landmark_type = /obj/effect/landmark/abductor/agent greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." show_in_antagpanel = TRUE + skill_modifiers = list(/datum/skill_modifier/job/level/wiring) /datum/antagonist/abductor/scientist name = "Abductor Scientist" @@ -29,6 +30,7 @@ landmark_type = /obj/effect/landmark/abductor/scientist greet_text = "Use your experimental console and surgical equipment to monitor your agent and experiment upon abducted humans." show_in_antagpanel = TRUE + skill_modifiers = list(/datum/skill_modifier/job/affinity/surgery) /datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) if(!new_team) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 39cdf8a5fa..b90389094f 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -22,6 +22,7 @@ /obj/item/gun/energy, /obj/item/restraints/handcuffs ) + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -92,10 +93,8 @@ M.cut_overlays() M.regenerate_icons() -/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/IsReflect() +/obj/item/clothing/suit/armor/abductor/vest/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + . = ..() DeactivateStealth() /obj/item/clothing/suit/armor/abductor/vest/ui_action_click() @@ -493,7 +492,7 @@ user.do_attack_animation(L) - if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) + if(L.mob_run_block(src, 0, "[user]'s [src]", ATTACK_TYPE_MELEE, 0, user, check_zone(user.zone_selected), null) & BLOCK_SUCCESS) playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE) return FALSE diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 0d30ebe992..d9ae678bb9 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -6,6 +6,7 @@ status = ORGAN_ROBOTIC beating = TRUE organ_flags = ORGAN_NO_SPOIL + no_pump = TRUE var/true_name = "baseline placebo referencer" var/cooldown_low = 300 var/cooldown_high = 300 @@ -92,6 +93,7 @@ update_gland_hud() /obj/item/organ/heart/gland/on_life() + . = ..() if(!beating) // alien glands are immune to stopping. beating = TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index 82ee77d192..7e52f6fcb6 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -23,5 +23,5 @@ addtimer(CALLBACK(src, .proc/zap), rand(30, 100)) /obj/item/organ/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN) + tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) \ No newline at end of file diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 53b8133528..2df4a1fab9 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -10,7 +10,12 @@ /obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() owner.faction |= "slime" - owner.grant_language(/datum/language/slime) + owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) + +/obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special = 0) + ..() + owner.faction -= "slime" + owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) /obj/item/organ/heart/gland/slime/activate() to_chat(owner, "You feel nauseated!") diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm index b6280ec017..103d09d444 100644 --- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/trauma.dm @@ -10,9 +10,9 @@ /obj/item/organ/heart/gland/trauma/activate() to_chat(owner, "You feel a spike of pain in your head.") if(prob(33)) - owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) + owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY)) else if(prob(20)) - owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) + owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY)) else - owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) \ No newline at end of file + owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_SURGERY)) diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm new file mode 100644 index 0000000000..426e4057eb --- /dev/null +++ b/code/modules/antagonists/abductor/ice_abductor.dm @@ -0,0 +1,12 @@ +/obj/structure/fluff/iced_abductor ///Unless more non-machine ayy structures made, it will stay in fluff. + name = "Mysterious Block of Ice" + desc = "A shadowy figure lies in this sturdy-looking block of ice. Who knows where it came from?" + icon = 'icons/effects/freeze.dmi' + icon_state = "ice_ayy" + density = TRUE + deconstructible = FALSE + +/obj/structure/fluff/iced_abductor/Destroy() + var/turf/T = get_turf(src) + new /obj/effect/mob_spawn/human/abductor(T) + . = ..() \ No newline at end of file diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index ca6481bcfe..f92cb987d0 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -209,7 +209,6 @@ open_machine() SendBack(H) return "Specimen braindead - disposed." - return "ERROR" /obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) diff --git a/code/modules/antagonists/blob/blob/blob_report.dm b/code/modules/antagonists/blob/blob/blob_report.dm index 4385b732c3..d532121e12 100644 --- a/code/modules/antagonists/blob/blob/blob_report.dm +++ b/code/modules/antagonists/blob/blob/blob_report.dm @@ -8,6 +8,13 @@ var/mach = 0 /datum/station_state/proc/count() + floor = 0 + wall = 0 + r_wall = 0 + window = 0 + door = 0 + grille = 0 + mach = 0 for(var/Z in SSmapping.levels_by_trait(ZTRAIT_STATION)) for(var/turf/T in block(locate(1,1,Z), locate(world.maxx,world.maxy,Z))) // don't count shuttles since they may have just left @@ -48,6 +55,10 @@ else if(ismachinery(O)) mach += 1 + CHECK_TICK + CHECK_TICK + CHECK_TICK + /datum/station_state/proc/score(datum/station_state/result) if(!result) return 0 diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index 3757aecd02..ba2363ecc0 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -42,7 +42,7 @@ /mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) ..() if(exposed_temperature) - adjustFireLoss(CLAMP(0.01 * exposed_temperature, 1, 5)) + adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) else adjustFireLoss(5) @@ -86,7 +86,8 @@ melee_damage_upper = 4 obj_damage = 20 environment_smash = ENVIRONMENT_SMASH_STRUCTURES - attacktext = "hits" + attack_verb_continuous = "hits" + attack_verb_simple = "hit" attack_sound = 'sound/weapons/genhit1.ogg' movement_type = FLYING del_on_death = 1 @@ -102,7 +103,9 @@ factory.spores += src . = ..() -/mob/living/simple_animal/hostile/blob/blobspore/Life() +/mob/living/simple_animal/hostile/blob/blobspore/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!is_zombie && isturf(src.loc)) for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile if(H.stat == DEAD) @@ -110,7 +113,6 @@ break if(factory && z != factory.z) death() - ..() /mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H) is_zombie = 1 @@ -205,7 +207,8 @@ melee_damage_lower = 20 melee_damage_upper = 20 obj_damage = 60 - attacktext = "slams" + attack_verb_continuous = "slams" + attack_verb_simple = "slam" attack_sound = 'sound/effects/blobattack.ogg' verb_say = "gurgles" verb_ask = "demands" @@ -231,39 +234,40 @@ return FALSE return ..() -/mob/living/simple_animal/hostile/blob/blobbernaut/Life() - if(..()) - var/list/blobs_in_area = range(2, src) - if(independent) - return // strong independent blobbernaut that don't need no blob - var/damagesources = 0 - if(!(locate(/obj/structure/blob) in blobs_in_area)) - damagesources++ - if(!factory) - damagesources++ - else - if(locate(/obj/structure/blob/core) in blobs_in_area) - adjustHealth(-maxHealth*0.1) - var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed - if(overmind) - H.color = overmind.blobstrain.complementary_color - else - H.color = "#000000" - if(locate(/obj/structure/blob/node) in blobs_in_area) - adjustHealth(-maxHealth*0.05) - var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) - if(overmind) - H.color = overmind.blobstrain.complementary_color - else - H.color = "#000000" - if(damagesources) - for(var/i in 1 to damagesources) - adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both - var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01) - I.appearance_flags = RESET_COLOR +/mob/living/simple_animal/hostile/blob/blobbernaut/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + var/list/blobs_in_area = range(2, src) + if(independent) + return // strong independent blobbernaut that don't need no blob + var/damagesources = 0 + if(!(locate(/obj/structure/blob) in blobs_in_area)) + damagesources++ + if(!factory) + damagesources++ + else + if(locate(/obj/structure/blob/core) in blobs_in_area) + adjustHealth(-maxHealth*0.1) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed if(overmind) - I.color = overmind.blobstrain.complementary_color - flick_overlay_view(I, src, 8) + H.color = overmind.blobstrain.complementary_color + else + H.color = "#000000" + if(locate(/obj/structure/blob/node) in blobs_in_area) + adjustHealth(-maxHealth*0.05) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) + if(overmind) + H.color = overmind.blobstrain.complementary_color + else + H.color = "#000000" + if(damagesources) + for(var/i in 1 to damagesources) + adjustHealth(maxHealth*0.025) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both + var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01) + I.appearance_flags = RESET_COLOR + if(overmind) + I.color = overmind.blobstrain.complementary_color + flick_overlay_view(I, src, 8) /mob/living/simple_animal/hostile/blob/blobbernaut/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() @@ -284,11 +288,11 @@ if(overmind) //if we have an overmind, we're doing chemical reactions instead of pure damage melee_damage_lower = 4 melee_damage_upper = 4 - attacktext = overmind.blobstrain.blobbernaut_message + attack_verb_continuous = overmind.blobstrain.blobbernaut_message else melee_damage_lower = initial(melee_damage_lower) melee_damage_upper = initial(melee_damage_upper) - attacktext = initial(attacktext) + attack_verb_continuous = initial(attack_verb_continuous) /mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) ..(gibbed) diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index bc4e517ced..a2a6ce94d3 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -45,20 +45,11 @@ desc = "A solid wall of slightly twitching tendrils with a reflective glow." damaged_desc = "A wall of twitching tendrils with a reflective glow." icon_state = "blob_glow" - flags_1 = CHECK_RICOCHET_1 point_return = 8 max_integrity = 100 brute_resist = 1 explosion_block = 2 -/obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P) - var/turf/p_turf = get_turf(P) - var/face_direction = get_dir(src, p_turf) - var/face_angle = dir2angle(face_direction) - var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180)) - if(abs(incidence_s) > 90 && abs(incidence_s) < 270) - return FALSE - var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) - P.setAngle(new_angle_s) - visible_message("[P] reflects off [src]!") - return TRUE \ No newline at end of file +/obj/structure/blob/shield/reflective/check_projectile_ricochet(obj/item/projectile/P) + return PROJECTILE_RICOCHET_FORCE + diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index aed64e4039..02be432045 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -203,7 +203,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) B.hud_used.blobpwrdisplay.maptext = "
    [round(blob_core.obj_integrity)]
    " /mob/camera/blob/proc/add_points(points) - blob_points = CLAMP(blob_points + points, 0, max_blob_points) + blob_points = clamp(blob_points + points, 0, max_blob_points) hud_used.blobpwrdisplay.maptext = "
    [round(blob_points)]
    " /mob/camera/blob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index 444b10684b..6a73dc579b 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -77,7 +77,7 @@ /obj/structure/blob/CanAStarPass(ID, dir, caller) . = 0 - if(ismovableatom(caller)) + if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSBLOB) @@ -207,8 +207,8 @@ if(prob(100 - severity * 30)) new /obj/effect/temp_visual/emp(get_turf(src)) -/obj/structure/blob/tesla_act(power) - ..() +/obj/structure/blob/zap_act(power) + . = ..() if(overmind) if(overmind.blobstrain.tesla_reaction(src, power)) take_damage(power/400, BURN, "energy") diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm index 3a6b4efedb..330116a207 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm @@ -1,12 +1,6 @@ // INTEGRATION: Adding Procs and Datums to existing "classes" -/mob/living/proc/AmBloodsucker(falseIfInDisguise=FALSE) - // No Datum - if(!mind || !mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) - return FALSE - return TRUE - -/mob/living/proc/HaveBloodsuckerBodyparts(var/displaymessage="") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. +/mob/living/proc/HaveBloodsuckerBodyparts(displaymessage = "") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. if(!getorganslot(ORGAN_SLOT_HEART)) if(displaymessage != "") to_chat(src, "Without a heart, you are incapable of [displaymessage].") @@ -21,33 +15,6 @@ return FALSE return TRUE - - -// GET DAMAGE - - -// Do NOT count the damage on prosthetics for this. -/mob/living/proc/getBruteLoss_nonProsthetic() - return getBruteLoss() - -/mob/living/proc/getFireLoss_nonProsthetic() - return getFireLoss() - -/mob/living/carbon/getBruteLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.brute_dam - return amount - -/mob/living/carbon/getFireLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.burn_dam - return amount - -/mob/living/carbon // EXAMINING /mob/living/carbon/human/proc/ReturnVampExamine(var/mob/viewer) if(!mind || !viewer.mind) @@ -146,3 +113,5 @@ /mob/living/proc/StartFrenzy(inTime = 120) set waitfor = FALSE + + diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index e774cf4250..47a98623db 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -12,12 +12,12 @@ /datum/antagonist/bloodsucker/proc/LifeTick()// Should probably run from life.dm, same as handle_changeling, but will be an utter pain to move set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side. - var/notice_healing = FALSE + var/notice_healing while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src - if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood - AddBloodVolume(-0.1) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) + if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_FAKEDEATH)) // Deduct Blood + AddBloodVolume(passive_blood_drain) // -.1 currently if(HandleHealing(1)) // Heal - if(notice_healing == FALSE && owner.current.blood_volume > 0) + if(!notice_healing && owner.current.blood_volume > 0) to_chat(owner, "The power of your blood begins knitting your wounds...") notice_healing = TRUE else if(notice_healing == TRUE) @@ -25,7 +25,7 @@ HandleStarving() // Death HandleDeath() // Standard Update update_hud()// Daytime Sleep in Coffin - if (SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker")) if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) Torpor_Begin() // Wait before next pass @@ -39,12 +39,12 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/antagonist/bloodsucker/proc/AddBloodVolume(value) - owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, maxBloodVolume) + owner.current.blood_volume = clamp(owner.current.blood_volume + value, 0, max_blood_volume) update_hud() /datum/antagonist/bloodsucker/proc/HandleFeeding(mob/living/carbon/target, mult=1) // mult: SILENT feed is 1/3 the amount - var/blood_taken = min(feedAmount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) + var/blood_taken = min(feed_amount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) target.blood_volume -= blood_taken // Simple Animals lose a LOT of blood, and take damage. This is to keep cats, cows, and so forth from giving you insane amounts of blood. if(!ishuman(target)) @@ -82,44 +82,47 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked()) + var/actual_regen = regen_rate + additional_regen + if(poweron_masquerade|| owner.current.AmStaked()) return FALSE - owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. - owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) - owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) + if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic)) + return FALSE + if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + return FALSE + owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. + owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) + owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) // No Bleeding - if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + /*if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current - H.bleed_rate = 0 + if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding + H.bleed_rate =- 0.5 + actual_regen * 0.2 */ if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire) - var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) - if(amInCoffinWhileTorpor) + // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) + if(istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_FAKEDEATH))) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor. - costMult = 0.25 + fireheal = min(C.getFireLoss(), regen_rate) // NOTE: Burn damage ONLY heals in torpor. C.ExtinguishMob() CureDisabilities() // Extinguish Fire C.remove_all_embedded_objects() // Remove Embedded! owner.current.regenerate_organs() // Heal Organs (will respawn original eyes etc. but we replace right away, next) CheckVampOrgans() // Heart, Eyes - else - if(owner.current.blood_volume <= 0) // No Blood? Lower Mult - mult = 0.25 - // Crit from burn? Lower damage to maximum allowed. - //if (C.getFireLoss() > owner.current.getMaxHealth()) - // fireheal = regenRate / 2 + if(check_limbs(costMult)) + return TRUE + else if(owner.current.stat >= UNCONSCIOUS) //Faster regeneration and slight burn healing while unconcious + mult *= 2 + fireheal = min(C.getFireLoss(), regen_rate * 0.2) + // BRUTE: Always Heal - var/bruteheal = min(C.getBruteLoss_nonProsthetic(), regenRate) - var/toxinheal = min(C.getToxLoss(), regenRate) + var/bruteheal = min(C.getBruteLoss(), actual_regen) + var/toxinheal = min(C.getToxLoss(), actual_regen) // Heal if Damaged if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. if(mult == 0) return TRUE - if(owner.current.stat >= UNCONSCIOUS) //Faster regeneration while unconcious, so you dont have to wait all day - mult *= 2 // We have damage. Let's heal (one time) C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body. C.adjustFireLoss(-fireheal * mult, forced = TRUE) @@ -127,28 +130,23 @@ //C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above. AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal return TRUE // Healed! Done for this tick. - if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing) - var/list/missing = owner.current.get_missing_limbs() // Heal Missing - if (missing.len) // Cycle through ALL limbs and regen them! - for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. - owner.current.regenerate_limb(targetLimbZone, 0) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - var/obj/item/bodypart/L = owner.current.get_bodypart( targetLimbZone ) // 2) Limb returns Damaged - AddBloodVolume(50 * costMult) // Costs blood to heal - L.brute_dam = 60 - to_chat(owner.current, "Your flesh knits as it regrows [L]!") - playsound(owner.current, 'sound/magic/demon_consume.ogg', 50, 1) - // DONE! After regenerating ANY number of limbs, we stop here. - return TRUE - /*else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. - // Remove Prosthetic/False Limb - for(var/obj/item/bodypart/BP in C.bodyparts) - message_admins("T1: [BP] ") - if (istype(BP) && BP.status == 2) - message_admins("T2: [BP] ") - BP.drop_limb() - return TRUE */ - // NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.*/ - return FALSE + + + +/datum/antagonist/bloodsucker/proc/check_limbs(costMult) + var/limb_regen_cost = 50 * costMult + var/mob/living/carbon/C = owner.current + var/list/missing = C.get_missing_limbs() + if(missing.len && C.blood_volume < limb_regen_cost + 5) + return FALSE + for(var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. + C.regenerate_limb(targetLimbZone, FALSE) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) + AddBloodVolume(50) + var/obj/item/bodypart/L = C.get_bodypart(targetLimbZone) // 2) Limb returns Damaged + L.brute_dam = 60 + to_chat(C, "Your flesh knits as it regrows your [L]!") + playsound(C, 'sound/magic/demon_consume.ogg', 50, TRUE) + return TRUE /datum/antagonist/bloodsucker/proc/CureDisabilities() var/mob/living/carbon/C = owner.current @@ -173,13 +171,22 @@ // EMPTY: Frenzy! // BLOOD_VOLUME_GOOD: [336] Pale (handled in bloodsucker_integration.dm // BLOOD_VOLUME_BAD: [224] Jitter - if(owner.current.blood_volume < BLOOD_VOLUME_BAD && !prob(0.5)) + if(owner.current.blood_volume < BLOOD_VOLUME_BAD && !prob(0.5 && HAS_TRAIT(owner, TRAIT_FAKEDEATH)) && !poweron_masquerade) owner.current.Jitter(3) // BLOOD_VOLUME_SURVIVE: [122] Blur Vision if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL + owner.current.set_nutrition(min(owner.current.blood_volume, NUTRITION_LEVEL_FED)) //The amount of blood is how full we are. + //A bit higher regeneration based on blood volume + if(owner.current.blood_volume < 700) + additional_regen = 0.4 + else if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + additional_regen = 0.3 + else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH @@ -189,7 +196,7 @@ /datum/antagonist/bloodsucker/proc/HandleDeath() // FINAL DEATH // Fire Damage? (above double health) - if(owner.current.getFireLoss_nonProsthetic() >= owner.current.maxHealth * 2.5) + if(owner.current.getFireLoss() >= owner.current.maxHealth * 3) FinalDeath() return // Staked while "Temp Death" or Asleep @@ -218,27 +225,26 @@ Torpor_Begin() to_chat(owner, "Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.") sleep(30) //To avoid spam - if (poweron_masquerade == TRUE) + if(poweron_masquerade) to_chat(owner, "Your wounds will not heal until you disable the Masquerade power.") // End Torpor: else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn) if(total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin)) - // Not Daytime, Not in Torpor - if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + // Not Daytime, Not in Torpor, enough health to not die the moment you end torpor + if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker") && total_damage < owner.current.getMaxHealth()) Torpor_End() // Fake Unconscious - if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) - owner.current.Unconscious(20,1) - //HEALTH_THRESHOLD_CRIT 0 - //HEALTH_THRESHOLD_FULLCRIT -30 - //HEALTH_THRESHOLD_DEAD -100 + if(poweron_masquerade && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) + owner.current.Unconscious(20, 1) -/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin=FALSE) +/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE) owner.current.stat = UNCONSCIOUS - owner.current.fakedeath("bloodsucker") // Come after UNCONSCIOUS or else it fails + owner.current.apply_status_effect(STATUS_EFFECT_UNCONSCIOUS) + ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. - ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. - ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in space. Otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") + owner.current.Jitter(0) // Visuals owner.current.update_sight() owner.current.reload_fullscreen() @@ -246,11 +252,14 @@ for(var/datum/action/bloodsucker/power in powers) if(power.active && !power.can_use_in_torpor) power.DeactivatePower() - + if(owner.current.suiciding) + owner.current.suiciding = FALSE //Youll die but not for long. + to_chat(owner.current, "Your body keeps you going, even as you try to end yourself.") /datum/antagonist/bloodsucker/proc/Torpor_End() owner.current.stat = SOFT_CRIT - owner.current.cure_fakedeath("bloodsucker") // Come after SOFT_CRIT or else it fails + owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) + REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") @@ -283,18 +292,19 @@ // Free my Vassals! FreeAllVassals() // Elders get Dusted - if(vamplevel >= 4) // (vamptitle) + if(bloodsucker_level >= 4) // (bloodsucker_title) owner.current.visible_message("[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a dry, crackling sound.") + sleep(50) owner.current.dust() // Fledglings get Gibbed else owner.current.visible_message("[owner.current]'s skin bursts forth in a spray of gore and detritus. A horrible cry echoes from what is now a wet pile of decaying meat.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a wet, bursting sound.") - owner.current.gib(TRUE, FALSE, FALSE)//Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. - playsound(owner.current.loc, 'sound/effects/tendril_destroyed.ogg', 40, 1) + owner.current.gib(TRUE, FALSE, FALSE) //Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. + playsound(owner.current, 'sound/effects/tendril_destroyed.ogg', 40, TRUE) @@ -304,15 +314,15 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) - if (!isliving(src)) +/mob/proc/CheckBloodsuckerEatFood(food_nutrition) + if(!isliving(src)) return var/mob/living/L = src - if(!L.AmBloodsucker()) + if(!AmBloodsucker(L)) return - // We're a vamp? Try to eat food... - var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - bloodsuckerdatum.handle_eat_human_food(food_nutrition) + // We're a bloodsucker? Try to eat food... + var/datum/antagonist/bloodsucker/B = L.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + B.handle_eat_human_food(food_nutrition) /datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm @@ -321,7 +331,7 @@ return var/mob/living/carbon/C = owner.current // Remove Nutrition, Give Bad Food - C.nutrition -= food_nutrition + C.adjust_nutrition(-food_nutrition) foodInGut += food_nutrition // Already ate some bad clams? Then we can back out, because we're already sick from it. if(foodInGut != food_nutrition) @@ -358,8 +368,8 @@ //Puke blood only if puke_blood is true, and loose some blood, else just puke normally. if(puke_blood) C.blood_volume = max(0, C.blood_volume - foodInGut * 2) - C.vomit(foodInGut * 4, foodInGut * 2, 0) - else + C.vomit(foodInGut * 4, foodInGut * 2, 0) + else C.vomit(foodInGut * 4, FALSE, 0) C.Stun(30) //C.Dizzy(50) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm index 0c80ce0dee..7043c2f429 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm @@ -87,7 +87,7 @@ // Heads? if (target_role == "HEAD") target_amount = rand(1, round(SSticker.mode.num_players() / 20)) - target_amount = CLAMP(target_amount,1,3) + target_amount = clamp(target_amount,1,3) // Department? else switch(target_role) @@ -100,7 +100,7 @@ if("Quartermaster") department_string = "Cargo" target_amount = rand(round(SSticker.mode.num_players() / 20), round(SSticker.mode.num_players() / 10)) - target_amount = CLAMP(target_amount, 2, 4) + target_amount = clamp(target_amount, 2, 4) ..() // EXPLANATION diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 507e1f2739..5c4b1f2b9f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -93,6 +93,14 @@ if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE + if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(display_error) + to_chat(owner, "") + return FALSE + if(owner.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + if(display_error) + to_chat(owner, "Garlic in your blood is interfering with your powers!") + return FALSE // Incap? if(must_be_capacitated) var/mob/living/L = owner diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index 263f91a9a6..43163f6a70 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -45,15 +45,15 @@ // (FINAL LIL WARNING) while(time_til_cycle > 5) sleep(10) - if (cancel_me) + if(cancel_me) return //sleep(TIME_BLOODSUCKER_DAY_FINAL_WARN - 50) warn_daylight(3,"Seek cover, for Sol rises!") // Part 3: Night Ending - while (time_til_cycle > 0) + while(time_til_cycle > 0) sleep(10) - if (cancel_me) + if(cancel_me) return //sleep(50) warn_daylight(4,"Solar flares bombard the station with deadly UV light!
    Stay in cover for the next [TIME_BLOODSUCKER_DAY / 60] minutes or risk Final Death!",\ @@ -69,11 +69,11 @@ while(time_til_cycle > 0) punish_vamps() sleep(TIME_BLOODSUCKER_BURN_INTERVAL) - if (cancel_me) + if(cancel_me) return //daylight_time -= TIME_BLOODSUCKER_BURN_INTERVAL // Issue Level Up! - if(!issued_XP && time_til_cycle <= 15) + if(!issued_XP && time_til_cycle <= 5) issued_XP = TRUE vamps_rank_up() @@ -141,23 +141,23 @@ if(!bloodsuckerdatum.warn_sun_locker) to_chat(M, "Your skin sizzles. The [M.current.loc] doesn't protect well against UV bombardment.") bloodsuckerdatum.warn_sun_locker = TRUE - M.current.adjustFireLoss(0.5 + bloodsuckerdatum.vamplevel / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.vamplevel / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(0.5 + bloodsuckerdatum.bloodsucker_level / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.bloodsucker_level / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_1) // Out in the Open? Buh Bye else if(!bloodsuckerdatum.warn_sun_burn) - if(bloodsuckerdatum.vamplevel > 0) + if(bloodsuckerdatum.bloodsucker_level > 0) to_chat(M, "The solar flare sets your skin ablaze!") else to_chat(M, "The solar flare scalds your neophyte skin!") bloodsuckerdatum.warn_sun_burn = TRUE if(M.current.fire_stacks <= 0) M.current.fire_stacks = 0 - if(bloodsuckerdatum.vamplevel > 0) - M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.vamplevel / 10) + if(bloodsuckerdatum.bloodsucker_level > 0) + M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.bloodsucker_level / 10) M.current.IgniteMob() - M.current.adjustFireLoss(2 + bloodsuckerdatum.vamplevel) // M.current.fireloss += 2 + bloodsuckerdatum.vamplevel // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(2 + bloodsuckerdatum.bloodsucker_level) // M.current.fireloss += 2 + bloodsuckerdatum.bloodsucker_level // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_2) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 94c62df696..888db8193b 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -8,9 +8,9 @@ job_rank = ROLE_BLOODSUCKER threat = 5 // NAME - var/vampname // My Dracula name - var/vamptitle // My Dracula title - var/vampreputation // My "Surname" or description of my deeds + var/bloodsucker_name // My Dracula style name + var/bloodsucker_title // My Dracula style title + var/bloodsucker_reputation // My "Surname" or description of my deeds // CLAN var/datum/team/vampireclan/clan var/list/datum/antagonist/vassal/vassals = list()// Vassals under my control. Periodically remove the dead ones. @@ -20,35 +20,33 @@ var/poweron_feed = FALSE // Am I feeding? var/poweron_masquerade = FALSE // STATS - var/vamplevel = 0 - var/vamplevel_unspent = 1 - var/regenRate = 0.4 // How many points of Brute do I heal per tick? - var/feedAmount = 15 // Amount of blood drawn from a target per tick. - var/maxBloodVolume = 600 // Maximum blood a Vamp can hold via feeding. // BLOOD_VOLUME_NORMAL 550 // BLOOD_VOLUME_SAFE 475 //BLOOD_VOLUME_OKAY 336 //BLOOD_VOLUME_BAD 224 // BLOOD_VOLUME_SURVIVE 122 + var/bloodsucker_level + var/bloodsucker_level_unspent = 1 + var/regen_rate = 0.3 // How fast do I regenerate? + var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. + var/feed_amount = 15 // Amount of blood drawn from a target per tick. + var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. // OBJECTIVES var/list/datum/objective/objectives_given = list() // For removal if needed. var/area/lair var/obj/structure/closet/crate/coffin // TRACKING - var/foodInGut = 0 // How much food to throw up later. You shouldn't have eaten that. - var/warn_sun_locker = FALSE // So we only get the locker burn message once per day. - var/warn_sun_burn = FALSE // So we only get the sun burn message once per day. - var/had_toxlover = FALSE + var/foodInGut // How much food to throw up later. You shouldn't have eaten that. + var/warn_sun_locker // So we only get the locker burn message once per day. + var/warn_sun_burn // So we only get the sun burn message once per day. + var/had_toxlover var/level_bloodcost + var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick // LISTS var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \ - TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE) - // NOTES: TRAIT_AGEUSIA <-- Doesn't like flavors. - // REMOVED: TRAIT_NODEATH - // TO ADD: - //var/static/list/defaultOrgans = list (/obj/item/organ/heart/vampheart,/obj/item/organ/heart/vampeyes) + TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE, TRAIT_NODECAP, TRAIT_NOGUT) /datum/antagonist/bloodsucker/on_gain() SSticker.mode.bloodsuckers |= owner // Add if not already in here (and you might be, if you were picked at round start) SSticker.mode.check_start_sunlight()// Start Sunlight? (if first Vamp) SelectFirstName()// Name & Title - SelectTitle(am_fledgling=TRUE) // If I have a creator, then set as Fledgling. - SelectReputation(am_fledgling=TRUE) + SelectTitle(am_fledgling = TRUE) // If I have a creator, then set as Fledgling. + SelectReputation(am_fledgling = TRUE) AssignStarterPowersAndStats()// Give Powers & Stats forge_bloodsucker_objectives()// Objectives & Team update_bloodsucker_icons_added(owner.current, "bloodsucker") // Add Antag HUD @@ -68,18 +66,18 @@ /datum/antagonist/bloodsucker/greet() var/fullname = ReturnFullName(TRUE) - to_chat(owner, "You are [fullname], a bloodsucking vampire!
    ") + to_chat(owner, "You are [fullname], a strain of vampire dubbed bloodsucker!
    ") owner.announce_objectives() to_chat(owner, "* You regenerate your health slowly, you're weak to fire, and you depend on blood to survive. Allow your stolen blood to run too low, and you will find yourself at \ risk of being discovered!
    ") //to_chat(owner, "As an immortal, your power is linked to your age. The older you grow, the more abilities you will have access to.") - var/vamp_greet - vamp_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
    " - vamp_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
    " - vamp_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
    " - vamp_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
    " - vamp_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
    " - to_chat(owner, vamp_greet) + var/bloodsucker_greet + bloodsucker_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
    " + bloodsucker_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
    " + bloodsucker_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
    " + bloodsucker_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
    " + bloodsucker_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
    " + to_chat(owner, bloodsucker_greet) owner.current.playsound_local(null, 'sound/bloodsucker/BloodsuckerAlert.ogg', 100, FALSE, pressure_affected = FALSE) antag_memory += "Although you were born a mortal, in un-death you earned the name [fullname].
    " @@ -92,13 +90,13 @@ owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) /datum/antagonist/bloodsucker/threat() - return ..()+3*vamplevel + return ..() + 3 * bloodsucker_level /datum/antagonist/bloodsucker/proc/SelectFirstName() // Names (EVERYONE gets one)) if(owner.current.gender == MALE) - vampname = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ + bloodsucker_name = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ "Sveyn","Aurel","Alexe","Iustin","Theodor","Dimitrie","Octav","Damien","Magnus","Caine","Abel", // Romanian/Ancient "Lucius","Gaius","Otho","Balbinus","Arcadius","Romanos","Alexios","Vitellius", // Latin "Melanthus","Teuthras","Orchamus","Amyntor","Axion", // Greek @@ -106,7 +104,7 @@ "Dio") else - vampname = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ + bloodsucker_name = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ "Alina","Rodica","Teodora","Denisa","Mihaela","Svetla","Stefania","Diyana","Kelssa","Lilith", // Romanian/Ancient "Alexia","Athanasia","Callista","Karena","Nephele","Scylla","Ursa", // Latin "Alcestis","Damaris","Elisavet","Khthonia","Teodora", // Greek @@ -114,57 +112,57 @@ /datum/antagonist/bloodsucker/proc/SelectTitle(am_fledgling = 0, forced = FALSE) // Already have Title - if (!forced && vamptitle != null) + if(!forced && bloodsucker_title != null) return // Titles [Master] - if (!am_fledgling) + if(!am_fledgling) if(owner.current.gender == MALE) - vamptitle = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") + bloodsucker_title = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") else - vamptitle = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") + bloodsucker_title = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") to_chat(owner, "You have earned a title! You are now known as [ReturnFullName(TRUE)]!") // Titles [Fledgling] else - vamptitle = null + bloodsucker_title = null /datum/antagonist/bloodsucker/proc/SelectReputation(am_fledgling = 0, forced=FALSE) // Already have Reputation - if(!forced && vampreputation != null) + if(!forced && bloodsucker_reputation != null) return // Reputations [Master] if(!am_fledgling) - vampreputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ + bloodsucker_reputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ "Inqisitor","Harvester","Reviled","Robust","Betrayer","Destructor","Damned","Accursed","Terrible","Vicious","Profane","Vile","Depraved","Foul","Slayer","Manslayer","Sovereign","Slaughterer", \ "Forsaken","Mad","Dragon","Savage","Villainous","Nefarious","Inquisitor","Marauder","Horrible","Immortal","Undying","Overlord","Corrupt","Hellspawn","Tyrant","Sanguineous") if(owner.current.gender == MALE) if(prob(10)) // Gender override - vampreputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") + bloodsucker_reputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") else if(prob(10)) // Gender override - vampreputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") + bloodsucker_reputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") to_chat(owner, "You have earned a reputation! You are now known as [ReturnFullName(TRUE)]!") // Reputations [Fledgling] else - vampreputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ + bloodsucker_reputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ "Unspoiled","Disgraced","Defrocked","Shamed","Meek","Timid","Broken")//,"Fresh") /datum/antagonist/bloodsucker/proc/AmFledgling() - return !vamptitle + return !bloodsucker_title /datum/antagonist/bloodsucker/proc/ReturnFullName(var/include_rep=0) var/fullname // Name First - fullname = (vampname ? vampname : owner.current.name) + fullname = (bloodsucker_name ? bloodsucker_name : owner.current.name) // Title - if(vamptitle) - fullname = vamptitle + " " + fullname + if(bloodsucker_title) + fullname = bloodsucker_title + " " + fullname // Rep - if(include_rep && vampreputation) - fullname = fullname + " the " + vampreputation + if(include_rep && bloodsucker_reputation) + fullname = fullname + " the " + bloodsucker_reputation return fullname @@ -199,24 +197,19 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/S = H.dna.species // Make Changes - H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank! + H.physiology.brute_mod *= 0.8 H.physiology.cold_mod = 0 H.physiology.stun_mod *= 0.5 H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1 - //S.heatmod += 0.5 // Heat shouldn't affect. Only Fire. - //S.punchstunthreshold = 8 //damage at which punches from this race will stun 9 S.punchdamagelow += 1 //lowest possible punch damage 0 S.punchdamagehigh += 1 //highest possible punch damage 9 - // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.remove_mutation(CLOWNMUT) to_chat(H, "As a vampiric clown, you are no longer a danger to yourself. Your nature is subdued.") // Physiology CheckVampOrgans() // Heart, Eyes // Language - owner.current.grant_language(/datum/language/vampiric) - // Soul - //owner.current.hellbound = TRUE Causes wierd stuff + owner.current.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) owner.hasSoul = FALSE // If false, renders the character unable to sell their soul. owner.isholy = FALSE // is this person a chaplain or admin role allowed to use bibles // Disabilities @@ -234,7 +227,7 @@ // Traits for(var/T in defaultTraits) REMOVE_TRAIT(owner.current, T, BLOODSUCKER_TRAIT) - if(had_toxlover == TRUE) + if(had_toxlover) ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT) // Traits: Species @@ -248,13 +241,12 @@ // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.add_mutation(CLOWNMUT) - // NOTE: Use initial() to return things to default! // Physiology owner.current.regenerate_organs() // Update Health owner.current.setMaxHealth(100) // Language - owner.current.remove_language(/datum/language/vampiric) + owner.current.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) // Soul if (owner.soulOwner == owner) // Return soul, if *I* own it. owner.hasSoul = TRUE @@ -264,13 +256,13 @@ set waitfor = FALSE if(!owner || !owner.current) return - vamplevel_unspent ++ + bloodsucker_level_unspent ++ // Spend Rank Immediately? if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) SpendRank() else to_chat(owner, "You have grown more ancient! Sleep in a coffin that you have claimed to thicken your blood and become more powerful.") - if(vamplevel_unspent >= 2) + if(bloodsucker_level_unspent >= 2) to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.
    ") /datum/antagonist/bloodsucker/proc/LevelUpPowers() @@ -279,10 +271,10 @@ /datum/antagonist/bloodsucker/proc/SpendRank() set waitfor = FALSE - if(vamplevel_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) + if(bloodsucker_level_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) return var/mob/living/L = owner.current - level_bloodcost = maxBloodVolume * 0.2 + level_bloodcost = max_blood_volume * 0.2 //If the blood volume of the bloodsucker is lower than the cost to level up, return and inform the bloodsucker //TODO: Make this into a radial, or perhaps a tgui next UI @@ -298,7 +290,7 @@ if(options.len > 1) var/choice = input(owner.current, "You have the opportunity to grow more ancient at the cost of [level_bloodcost] units of blood. Select a power to advance your Rank.", "Your Blood Thickens...") in options // Cheat-Safety: Can't keep opening/closing coffin to spam levels - if(vamplevel_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. + if(bloodsucker_level_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. return if(!istype(owner.current.loc, /obj/structure/closet/crate/coffin)) to_chat(owner.current, "Return to your coffin to advance your Rank.") @@ -329,20 +321,20 @@ // More Health owner.current.setMaxHealth(owner.current.maxHealth + 10) // Vamp Stats - regenRate += 0.05 // Points of brute healed (starts at 0.3) - feedAmount += 2 // Increase how quickly I munch down vics (15) - maxBloodVolume += 100 // Increase my max blood (600) + regen_rate += 0.05 // Points of brute healed (starts at 0.3) + feed_amount += 2 // Increase how quickly I munch down vics (15) + max_blood_volume += 100 // Increase my max blood (600) ///////// - vamplevel ++ - vamplevel_unspent -- + bloodsucker_level ++ + bloodsucker_level_unspent -- // Assign True Reputation - if(vamplevel == 4) + if(bloodsucker_level == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [bloodsucker_level] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [bloodsucker_level - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) - owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -654,13 +646,13 @@ var/datum/antagonist/vassal/mob_V = M.mind.has_antag_datum(ANTAG_DATUM_VASSAL) // Check 2) If they are a BLOODSUCKER, then are they my Master? if (mob_V && atom_B == mob_V.master) - return TRUE // SUCCESS! + return TRUE // Check 3) If I am a BLOODSUCKER, then are they my Vassal? if (mob_B && atom_V && (atom_V in mob_B.vassals)) - return TRUE // SUCCESS! + return TRUE // Check 4) If we are both VASSAL, then do we have the same master? if (atom_V && mob_V && atom_V.master == mob_V.master) - return TRUE // SUCCESS! + return TRUE return FALSE @@ -705,10 +697,10 @@ // Update Rank Counter if(owner.current.hud_used.vamprank_display) - var/valuecolor = vamplevel_unspent ? "#FFFF00" : "#FF0000" - owner.current.hud_used.vamprank_display.update_counter(vamplevel, valuecolor) + var/valuecolor = bloodsucker_level_unspent ? "#FFFF00" : "#FF0000" + owner.current.hud_used.vamprank_display.update_counter(bloodsucker_level, valuecolor) if(updateRank) // Only change icon on special request. - owner.current.hud_used.vamprank_display.icon_state = (vamplevel_unspent > 0) ? "rank_up" : "rank" + owner.current.hud_used.vamprank_display.icon_state = (bloodsucker_level_unspent > 0) ? "rank_up" : "rank" /obj/screen/bloodsucker @@ -718,12 +710,12 @@ invisibility = INVISIBILITY_ABSTRACT /obj/screen/bloodsucker/proc/update_counter(value, valuecolor) - invisibility = 0 // Make Visible + invisibility = 0 -/obj/screen/bloodsucker/blood_counter // NOTE: Look up /obj/screen/devil/soul_counter in _onclick / hud / human.dm - icon = 'icons/mob/actions/bloodsucker.dmi'//'icons/mob/screen_gen.dmi' +/obj/screen/bloodsucker/blood_counter + icon = 'icons/mob/actions/bloodsucker.dmi' name = "Blood Consumed" - icon_state = "blood_display"//"power_display" + icon_state = "blood_display" screen_loc = ui_blood_display /obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) @@ -748,18 +740,18 @@ /datum/antagonist/bloodsucker/proc/update_sunlight(value, amDay = FALSE) // No Hud? Get out. - if (!owner.current.hud_used) + if(!owner.current.hud_used) return // Update Sun Time - if (owner.current.hud_used.sunlight_display) + if(owner.current.hud_used.sunlight_display) var/valuecolor = "#BBBBFF" - if (amDay) + if(amDay) valuecolor = "#FF5555" else if(value <= 25) valuecolor = "#FFCCCC" else if(value < 10) valuecolor = "#FF5555" - var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value,1)] s" + var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value, 1)] s" owner.current.hud_used.sunlight_display.update_counter( value_string, valuecolor ) owner.current.hud_used.sunlight_display.icon_state = "sunlight_" + (amDay ? "day":"night") @@ -767,3 +759,8 @@ /obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() maptext = "
    [value]
    " + +/datum/antagonist/bloodsucker/proc/count_vassals(datum/mind/master) + var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/vassal_amount = B.vassals.len + return vassal_amount diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 3d5ed1369b..c065d5fe7c 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -48,7 +48,7 @@ objectives += vassal_objective objectives_given += vassal_objective give_thrall_eyes() - owner.current.grant_language(/datum/language/vampiric) + owner.current.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_VASSAL) // Add Antag HUD update_vassal_icons_added(owner.current, "vassal") . = ..() @@ -81,7 +81,7 @@ qdel(O) objectives_given = list() remove_thrall_eyes() - owner.current.remove_language(/datum/language/vampiric) + owner.current.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_VASSAL) // Clear Antag HUD update_vassal_icons_removed(owner.current) diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index e4e26fe034..640c53946f 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -5,7 +5,8 @@ var/obj/item/organ/O // Heart O = owner.current.getorganslot(ORGAN_SLOT_HEART) - if(!istype(O, /obj/item/organ/heart/vampheart)) + + if(!istype(O, /obj/item/organ/heart/vampheart) && !istype(O, /obj/item/organ/heart/demon)) qdel(O) var/obj/item/organ/heart/vampheart/H = new H.Insert(owner.current) diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm index 4c377f4b82..2aed251189 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm @@ -30,7 +30,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' force = 6 throwforce = 10 - embedding = list("embed_chance" = 25, "embedded_fall_chance" = 0.5) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled + embedding = list("embed_chance" = 25, "fall_chance" = 0.5) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled //embed_chance = 25 // Look up "is_pointed" to see where we set stakes able to do this. //embedded_fall_chance = 0.5 // Chance it will fall out. obj_integrity = 30 @@ -93,7 +93,7 @@ embedded() add_mob_blood(target)//Place blood on the stake loc = C // Put INSIDE the character - B.receive_damage(w_class * embedding.embedded_impact_pain_multiplier) + B.receive_damage(w_class * embedding["pain_mult"]) if(C.mind) var/datum/antagonist/bloodsucker/bloodsucker = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if(bloodsucker) @@ -118,7 +118,7 @@ force = 8 throwforce = 12 armour_penetration = 10 - embedding = list("embed_chance" = 50, "embedded_fall_chance" = 0) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled + embedding = list("embed_chance" = 50, "fall_chance" = 0) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled obj_integrity = 120 max_integrity = 120 @@ -167,4 +167,4 @@ ///obj/item/pipe = 2) time = 80 category = CAT_WEAPONRY - subcategory = CAT_WEAPON + subcategory = CAT_MELEE diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index debeee3775..e85d3af5a0 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -200,39 +200,3 @@ to_chat(resident, "You fix the mechanism and lock it.") broken = FALSE locked = TRUE - -// Look up recipes.dm OR pneumaticCannon.dm -/datum/crafting_recipe/bloodsucker/blackcoffin - name = "Black Coffin" - result = /obj/structure/closet/crate/coffin/blackcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) - reqs = list(/obj/item/stack/sheet/cloth = 1, - /obj/item/stack/sheet/mineral/wood = 5, - /obj/item/stack/sheet/metal = 1) - ///obj/item/stack/packageWrap = 8, - ///obj/item/pipe = 2) - time = 150 - category = CAT_MISC - always_availible = TRUE - -/datum/crafting_recipe/bloodsucker/meatcoffin - name = "Meat Coffin" - result =/obj/structure/closet/crate/coffin/meatcoffin - tools = list(/obj/item/kitchen/knife, - /obj/item/kitchen/rollingpin) - reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, - /obj/item/restraints/handcuffs/cable = 1) - time = 150 - category = CAT_MISC - always_availible = TRUE - -/datum/crafting_recipe/bloodsucker/metalcoffin - name = "Metal Coffin" - result =/obj/structure/closet/crate/coffin/metalcoffin - tools = list(/obj/item/weldingtool, - /obj/item/screwdriver) - reqs = list(/obj/item/stack/sheet/metal = 5) - time = 100 - category = CAT_MISC - always_availible = TRUE diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index a8925dfb7b..090ef45d89 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -115,13 +115,15 @@ qdel(src) /obj/structure/bloodsucker/vassalrack/examine(mob/user) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) . = ..() - if(isvamp(user) || isobserver(user)) + if(B || isobserver(user)) . += {"This is the vassal rack, which allows you to thrall crewmembers into loyal minions in your service."} . += {"You need to first secure the vassal rack by clicking on it while it is in your lair."} . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} . += {"Make sure that the victim is handcuffed, or else they can simply run away or resist, as the process is not instant."} . += {"To convert the victim, simply click on the vassal rack itself. Sharp weapons work faster than other tools."} + . += {" You have only the power for [B.bloodsucker_level - B.count_vassals(user.mind)] vassals"} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) . += {"This is the vassal rack, which allows your master to thrall crewmembers into his minions.\n Aid your master in bringing their victims here and keeping them secure.\n @@ -130,7 +132,7 @@ /obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user) if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated()) return - if(!anchored && isvamp(user)) + if(!anchored && AmBloodsucker(user)) to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.") return // PULL TARGET: Remember if I was pullin this guy, so we can restore this @@ -183,7 +185,7 @@ /obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) // Attempt Unbuckle - if(!isvamp(user)) + if(!AmBloodsucker(user)) if(M == user) M.visible_message("[user] tries to release themself from the rack!",\ "You attempt to release yourself from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") @@ -222,15 +224,15 @@ // Go away. Torturing. if(useLock) return - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // CHECK ONE: Am I claiming this? Is it in the right place? - if(istype(bloodsuckerdatum) && !owner) - if(!bloodsuckerdatum.lair) + if(istype(B) && !owner) + if(!B.lair) to_chat(user, "You don't have a lair. Claim a coffin to make that location your lair.") - if(bloodsuckerdatum.lair != get_area(src)) - to_chat(user, "You may only activate this structure in your lair: [bloodsuckerdatum.lair].") + if(B.lair != get_area(src)) + to_chat(user, "You may only activate this structure in your lair: [B.lair].") return - switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore","Secure [src]","Yes", "No")) + switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore", "Secure [src]", "Yes", "No")) if("Yes") owner = user density = FALSE @@ -241,27 +243,31 @@ return // CHECK TWO: Am I a non-bloodsucker? var/mob/living/carbon/C = pick(buckled_mobs) - if(!istype(bloodsuckerdatum)) + if(!istype(B)) // Try to release this guy user_unbuckle_mob(C, user) return // Bloodsucker Owner! Let the boy go. if(C.mind) - var/datum/antagonist/vassal/vassaldatum = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(istype(vassaldatum) && vassaldatum.master == bloodsuckerdatum || C.stat >= DEAD) + var/datum/antagonist/vassal/V = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(istype(V) && V.master == B || C.stat >= DEAD) unbuckle_mob(C) useLock = FALSE // Failsafe return // Just torture the boy torture_victim(user, C) +#define CONVERT_COST 150 + /obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE - var/convert_cost = 200 + 200 * bloodsuckerdatum.vassals - if(user.blood_volume < convert_cost + 5) + if(user.blood_volume < CONVERT_COST + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return + if(B.count_vassals(user.mind) > B.bloodsucker_level) + to_chat(user, "Your power is yet too weak to bring more vassals under your control....") + return // Prep... useLock = TRUE // Step One: Tick Down Conversion from 3 to 0 @@ -302,12 +308,13 @@ useLock = FALSE return // Check: Blood - if(user.blood_volume < convert_cost) - to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [convert_cost - user.blood_volume] units more!") + if(user.blood_volume < CONVERT_COST) + to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [CONVERT_COST - user.blood_volume] units more!") useLock = FALSE return - bloodsuckerdatum.AddBloodVolume(-convert_cost) - target.add_mob_blood(user) + B.AddBloodVolume(-CONVERT_COST) + target.add_mob_blood(user, "Youve used [CONVERT_COST] amount of blood to gain a new vassal!") + to_chat(user, ) user.visible_message("[user] marks a bloody smear on [target]'s forehead and puts a wrist up to [target.p_their()] mouth!", \ "You paint a bloody marking across [target]'s forehead, place your wrist to [target.p_their()] mouth, and subject [target.p_them()] to the Dark Communion.") if(!do_mob(user, src, 50)) @@ -315,21 +322,22 @@ useLock = FALSE return // Convert to Vassal! - if(bloodsuckerdatum && bloodsuckerdatum.attempt_turn_vassal(target)) + if(B && B.attempt_turn_vassal(target)) //remove_loyalties(target) // In case of Mindshield, or appropriate Antag (Traitor, Internal, etc) //if (!target.buckled) // to_chat(user, "The ritual has been interrupted!") // useLock = FALSE // return - user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) target.Jitter(25) target.emote("laugh") //remove_victim(target) // Remove on CLICK ONLY! useLock = FALSE -/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult=1) +#undef CONVERT_COST +/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult = 1) var/torture_time = 15 // Fifteen seconds if you aren't using anything. Shorter with weapons and such. var/torture_dmg_brute = 2 var/torture_dmg_burn = 0 @@ -454,7 +462,7 @@ /obj/structure/bloodsucker/candelabrum/examine(mob/user) . = ..() - if((isvamp()) || isobserver(user)) + if((AmBloodsucker(user)) || isobserver(user)) . += {"This is a magical candle which drains at the sanity of mortals who are not under your command while it is active."} . += {"You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally."} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) @@ -463,12 +471,12 @@ /obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(user) || istype(T)) + if(AmBloodsucker(user) || istype(T)) toggle() /obj/structure/bloodsucker/candelabrum/AltClick(mob/user) // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. - if(isvamp(user)) + if(AmBloodsucker(user)) toggle() /obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) @@ -482,13 +490,14 @@ update_icon() /obj/structure/bloodsucker/candelabrum/process() - if(lit) - for(var/mob/living/carbon/human/H in viewers(7, src)) - var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(H) || T) //We dont want vassals or vampires affected by this - return - H.hallucination = 20 - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) + if(!lit) + return + for(var/mob/living/carbon/human/H in fov_viewers(7, src)) + var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(AmBloodsucker(H) || T) //We dont want vassals or vampires affected by this + return + H.hallucination = 20 + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // OTHER THINGS TO USE: HUMAN BLOOD. /obj/effect/decal/cleanable/blood diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm index f68191d6d7..dd7e835d3a 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm @@ -63,7 +63,7 @@ // Find Animals in Area /* if(rand(0,2) == 0) var/mobCount = 0 - var/mobMax = CLAMP(area_turfs.len / 25, 1, 4) + var/mobMax = clamp(area_turfs.len / 25, 1, 4) for (var/turf/T in area_turfs) if(!T) continue var/mob/living/simple_animal/SA = locate() in T diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 1bb7b02357..5383e8c1ac 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -2,7 +2,7 @@ /datum/action/bloodsucker/cloak name = "Cloak of Darkness" - desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas." + desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas, and you cannot dissapear while mortals watch you." button_icon_state = "power_cloak" bloodcost = 5 cooldown = 50 @@ -18,14 +18,10 @@ . = ..() if(!.) return - // must have nobody around to see the cloak - var/watchers = viewers(9,get_turf(owner)) - for(var/mob/living/M in watchers) - if(M != owner) - to_chat(owner, "You may only vanish into the shadows unseen.") - return FALSE - + for(var/mob/living/M in fov_viewers(9, owner) - owner) + to_chat(owner, "You may only vanish into the shadows unseen.") + return FALSE return TRUE /datum/action/bloodsucker/cloak/ActivatePower() @@ -38,7 +34,7 @@ // Pay Blood Toll (if awake) owner.alpha = max(35, owner.alpha - min(75, 10 + 5 * level_current)) bloodsuckerdatum.AddBloodVolume(-0.2) - + runintent = (user.m_intent == MOVE_INTENT_RUN) var/turf/T = get_turf(user) lum = T.get_lumcount() @@ -53,7 +49,7 @@ if(!runintent) user.toggle_move_intent() REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") - + sleep(5) // Check every few ticks /datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index bbce221d91..a113f9c083 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -43,10 +43,14 @@ to_chat(owner, "Lesser beings require a tighter grip.") return FALSE // Bloodsuckers: - else if(iscarbon(target) && target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) - if(display_error) - to_chat(owner, "Other Bloodsuckers will not fall for your subtle approach.") - return FALSE + else if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.can_inject(owner, TRUE, BODY_ZONE_CHEST)) + return FALSE + if(target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if(display_error) + to_chat(owner, "Other Bloodsuckers will not fall for your subtle approach.") + return FALSE // Must have Target if(!target) // || !ismob(target) if(display_error) @@ -63,6 +67,8 @@ return FALSE if(ishuman(target)) var/mob/living/carbon/human/H = target + if(!H.can_inject(owner, TRUE, BODY_ZONE_HEAD) && target == owner.pulling && owner.grab_state < GRAB_AGGRESSIVE) + return FALSE if(NOBLOOD in H.dna.species.species_traits)// || owner.get_blood_id() != target.get_blood_id()) if(display_error) to_chat(owner, "Your victim's blood is not suitable for you to take.") @@ -140,7 +146,7 @@ to_chat(user, "You lean quietly toward [target] and secretly draw out your fangs...") else to_chat(user, "You pull [target] close to you and draw out your fangs...") - if(!do_mob(user, target, feed_time,0,1,extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) + if(!do_mob(user, target, feed_time, 0, 1, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) to_chat(user, "Your feeding was interrupted.") //DeactivatePower(user,target) return @@ -166,11 +172,11 @@ var/deadmessage = target.stat == DEAD ? "" : " [target.p_they(TRUE)] looks dazed, and will not remember this." user.visible_message("[user] puts [target]'s wrist up to [user.p_their()] mouth.", \ "You secretly slip your fangs into [target]'s wrist.[deadmessage]", \ - vision_distance = notice_range, ignored_mobs=target) // Only people who AREN'T the target will notice this action. + vision_distance = notice_range, ignored_mobs = target) // Only people who AREN'T the target will notice this action. // Warn Feeder about Witnesses... var/was_unnoticed = TRUE - for(var/mob/living/M in viewers(notice_range, owner)) - if(M != owner && M != target && iscarbon(M) && M.mind && !M.silicon_privileges && !M.eye_blind && !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + for(var/mob/living/M in fov_viewers(notice_range, owner) - owner - target) + if(M.client && !M.silicon_privileges && !M.eye_blind && !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) was_unnoticed = FALSE break if(was_unnoticed) @@ -257,11 +263,11 @@ to_chat(user, "Your victim is dead. [target.p_their(TRUE)] blood barely nourishes you.") warning_target_dead = TRUE // Full? - if(!warning_full && user.blood_volume >= bloodsuckerdatum.maxBloodVolume) + if(!warning_full && user.blood_volume >= bloodsuckerdatum.max_blood_volume) to_chat(user, "You are full. Further blood will be wasted.") warning_full = TRUE // Blood Remaining? (Carbons/Humans only) - if(iscarbon(target) && !target.AmBloodsucker(1)) + if(iscarbon(target) && !AmBloodsucker(target, TRUE)) if(target.blood_volume <= BLOOD_VOLUME_BAD && warning_target_bloodvol > BLOOD_VOLUME_BAD) to_chat(user, "Your victim's blood volume is fatally low!") else if(target.blood_volume <= BLOOD_VOLUME_OKAY && warning_target_bloodvol > BLOOD_VOLUME_OKAY) @@ -275,8 +281,9 @@ break // Blood Gulp Sound - owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - + owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) + if(!amSilent) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) // DONE! //DeactivatePower(user,target) if(amSilent) @@ -294,12 +301,12 @@ /datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) - // Bad Vampire. You shouldn't do that. + // Bad Bloodsucker. You shouldn't do that. if(target && target.stat >= DEAD && ishuman(target)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target)// Active, and still Antag, + return ..() && target && (!target_grappled || user.pulling == target) && blood_sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index f0724f8204..76f3cc77a4 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -3,7 +3,7 @@ /datum/action/bloodsucker/fortitude - name = "Fortitude"//"Cellular Emporium" + name = "Fortitude" desc = "Withstand egregious physical wounds and walk away from attacks that would stun, pierce, and dismember lesser beings. You cannot run while active." button_icon_state = "power_fortitude" bloodcost = 30 @@ -11,44 +11,53 @@ bloodsucker_can_buy = TRUE amToggle = TRUE warn_constant_cost = TRUE + var/was_running - var/this_resist // So we can raise and lower your brute resist based on what your level_current WAS. + var/fortitude_resist // So we can raise and lower your brute resist based on what your level_current WAS. /datum/action/bloodsucker/fortitude/ActivatePower() - var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner to_chat(user, "Your flesh, skin, and muscles become as steel.") // Traits & Effects ADD_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") ADD_TRAIT(user, TRAIT_NODISMEMBER, "fortitude") ADD_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") - ADD_TRAIT(user, TRAIT_NORUNNING, "fortitude") if(ishuman(owner)) var/mob/living/carbon/human/H = owner - this_resist = max(0.3, 0.7 - level_current * 0.1) - H.physiology.brute_mod *= this_resist//0.5 - H.physiology.burn_mod *= this_resist//0.5 - // Stop Running (Taken from /datum/quirk/nyctophobia in negative.dm) - var/was_running = (user.m_intent == MOVE_INTENT_RUN) + fortitude_resist = max(0.3, 0.7 - level_current * 0.1) + H.physiology.brute_mod *= fortitude_resist + H.physiology.burn_mod *= fortitude_resist + was_running = (user.m_intent == MOVE_INTENT_RUN) if(was_running) user.toggle_move_intent() - while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + while(B && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + if(istype(user.buckled, /obj/vehicle)) //We dont want people using fortitude being able to use vehicles + var/obj/vehicle/V = user.buckled + var/datum/component/riding/VRD = V.GetComponent(/datum/component/riding) + if(VRD) + VRD.force_dismount(user) + to_chat(user, "You trip off the [V], your muscles too heavy for it to support you.") + else + V.unbuckle_mob(user, force = TRUE) + to_chat(user, "You fall off the [V], your weight making you too heavy to be supported by it.") // Pay Blood Toll (if awake) if(user.stat == CONSCIOUS) - bloodsuckerdatum.AddBloodVolume(-0.5) // Used to be 0.3 blood per 2 seconds, but we're making it more expensive to keep on. + B.AddBloodVolume(-0.5) sleep(20) // Check every few ticks that we haven't disabled this power // Return to Running (if you were before) - if(was_running && user.m_intent != MOVE_INTENT_RUN) - user.toggle_move_intent() - + /datum/action/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // Restore Traits & Effects REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude") REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") - REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude") - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod /= this_resist//0.5 - H.physiology.burn_mod /= this_resist//0.5 + if(!ishuman(owner)) + return + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod /= fortitude_resist + H.physiology.burn_mod /= fortitude_resist + if(was_running && user.m_intent == MOVE_INTENT_WALK) + user.toggle_move_intent() + diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm index 4788d7639e..c46a7fce6c 100644 --- a/code/modules/antagonists/bloodsucker/powers/go_home.dm +++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm @@ -64,8 +64,8 @@ var/turf/T = get_turf(user) if(T && T.lighting_object && T.get_lumcount()>= 0.1) // B) Check for Viewers - for(var/mob/living/M in viewers(get_turf(owner))) - if(M != owner && isliving(M) && M.mind && !M.silicon_privileges && !M.eye_blind) // M.client <--- add this in after testing! + for(var/mob/living/M in fov_viewers(world.view, get_turf(owner)) - owner) + if(M.client && !M.silicon_privileges && !M.eye_blind) am_seen = TRUE if (!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) drop_item = TRUE diff --git a/code/modules/antagonists/bloodsucker/powers/haste.dm b/code/modules/antagonists/bloodsucker/powers/haste.dm index 143950b32f..05e2cd0330 100644 --- a/code/modules/antagonists/bloodsucker/powers/haste.dm +++ b/code/modules/antagonists/bloodsucker/powers/haste.dm @@ -8,7 +8,7 @@ desc = "Dash somewhere with supernatural speed. Those nearby may be knocked away, stunned, or left empty-handed." button_icon_state = "power_speed" bloodcost = 6 - cooldown = 50 + cooldown = 120 target_range = 15 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm index f6dfc8ba72..db7868fa8a 100644 --- a/code/modules/antagonists/bloodsucker/powers/lunge.dm +++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm @@ -1,88 +1,46 @@ -// Level 1: Grapple level 2 -// Level 2: Grapple 3 from Behind -// Level 3: Grapple 3 from Shadows -/datum/action/bloodsucker/targeted/lunge + + +/datum/action/bloodsucker/lunge name = "Predatory Lunge" - desc = "Spring at your target and aggressively grapple them without warning. Attacks from concealment or the rear may even knock them down." + desc = "Prepare the strenght to grapple your prey." button_icon_state = "power_lunge" bloodcost = 10 - cooldown = 120 - target_range = 3 - power_activates_immediately = TRUE - message_Trigger = "Whom will you ensnare within your grasp?" - must_be_capacitated = TRUE + cooldown = 30 bloodsucker_can_buy = TRUE + warn_constant_cost = TRUE + amToggle = TRUE + var/leap_skill_mod = 5 -/datum/action/bloodsucker/targeted/lunge/CheckCanUse(display_error) - if(!..(display_error))// DEFAULT CHECKS - return FALSE - // Being Grabbed - if(owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE) - if(display_error) - to_chat(owner, "You're being grabbed!") - return FALSE - if(!owner.has_gravity(owner.loc))//TODO figure out how to check if theyre able to move while in nograv - if(display_error) - to_chat(owner, "You cant lunge while floating!") - return FALSE - return TRUE +/datum/action/bloodsucker/lunge/New() + . = ..() + -/datum/action/bloodsucker/targeted/lunge/CheckValidTarget(atom/A) - return iscarbon(A) +/datum/action/bloodsucker/lunge/Destroy() + . = ..() + UnregisterSignal(owner, COMSIG_CARBON_TACKLED) -/datum/action/bloodsucker/targeted/lunge/CheckCanTarget(atom/A, display_error) - // Check: Self - if(target == owner) - return FALSE - // Check: Range - //if (!(target in view(target_range, get_turf(owner)))) - // if (display_error) - // to_chat(owner, "Your victim is too far away.") - // return FALSE - // DEFAULT CHECKS (Distance) - if(!..()) - return FALSE - // Check: Turf - var/mob/living/L = A - if(!isturf(L.loc)) - return FALSE - return TRUE +/datum/action/bloodsucker/lunge/ActivatePower() + var/mob/living/carbon/user = owner + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/component/tackler/T = user.LoadComponent(/datum/component/tackler) + T.stamina_cost = 50 + T.base_knockdown = 3 SECONDS + T.range = 4 + T.speed = 0.8 + T.skill_mod = 5 //Monstrous tackling + T.min_distance = 2 + active = TRUE + user.toggle_throw_mode() + RegisterSignal(user, COMSIG_CARBON_TACKLED, .proc/DelayedDeactivatePower) + while(B && ContinueActive(user)) + B.AddBloodVolume(-0.1) + sleep(5) -/datum/action/bloodsucker/targeted/lunge/FireTargetedPower(atom/A) - // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. - var/mob/living/carbon/target = A - var/turf/T = get_turf(target) - var/mob/living/L = owner - // Clear Vars - owner.pulling = null - // Will we Knock them Down? - var/do_knockdown = !is_A_facing_B(target,owner) || owner.alpha <= 0 || istype(owner.loc, /obj/structure/closet) - // CAUSES: Target has their back to me, I'm invisible, or I'm in a Closet - // Step One: Heatseek toward Target's Turf - addtimer(CALLBACK(GLOBAL_PROC, .proc/_walk, owner, 0), 2 SECONDS) - target.playsound_local(get_turf(owner), 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // target-only telegraphing - owner.playsound_local(owner, 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // audio feedback to the user - if(do_mob(owner, owner, 7, TRUE, TRUE)) - walk_towards(owner, T, 0.1, 10) // yes i know i shouldn't use this but i don't know how to work in anything better - if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && !CHECK_MOBILITY(L, MOBILITY_STAND)) - var/send_dir = get_dir(owner, T) - new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) - owner.spin(10) - // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination) - for(var/i in 1 to 6) - if (target.Adjacent(owner)) - // LEVEL 2: If behind target, mute or unconscious! - if(do_knockdown) // && level_current >= 1) - target.Knockdown(15 + 10 * level_current,1) - target.adjustStaminaLoss(40 + 10 * level_current) - // Cancel Walk (we were close enough to contact them) - walk(owner, 0) - target.Stun(10,1) //Without this the victim can just walk away - target.grabbedby(owner) // Taken from mutations.dm under changelings - target.grippedby(owner, instant = TRUE) //instant aggro grab - break - sleep(3) +//Without this, the leap component would get removed too early, causing the normal crash into effects. +/datum/action/bloodsucker/lunge/proc/DelayedDeactivatePower() + addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE) -/datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target) - ..() // activate = FALSE - user.update_mobility() +/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner) + . = ..() + qdel(user.GetComponent(/datum/component/tackler)) + UnregisterSignal(user, COMSIG_CARBON_TACKLED) diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm index 7d41899dc2..d83f938e3f 100644 --- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm +++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm @@ -52,6 +52,7 @@ REMOVE_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker") REMOVE_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker") REMOVE_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker") + REMOVE_TRAIT(user, TRAIT_NOBREATH, "bloodsucker") var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART) var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES) E.flash_protect = 0 @@ -93,6 +94,7 @@ ADD_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker") ADD_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker") ADD_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker") + ADD_TRAIT(user, TRAIT_NOBREATH, "bloodsucker") // HEART var/obj/item/organ/heart/H = user.getorganslot(ORGAN_SLOT_HEART) diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm index 3be5eb02e9..fccef4fb0c 100644 --- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm +++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm @@ -64,7 +64,7 @@ to_chat(owner, "Your victim's eyes are glazed over. They cannot perceive you.") return FALSE // Check: Target See Me? (behind wall) - if(!(target in view(target_range, get_turf(owner)))) + if(!(owner in target.fov_view())) // Sub-Check: GET CLOSER //if (!(owner in range(target_range, get_turf(target))) // if (display_error) @@ -90,48 +90,52 @@ /datum/action/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) var/mob/living/carbon/target = A - var/mob/living/user = owner + var/mob/living/L = owner - var/cancontinue=CheckCanTarget(target) + var/cancontinue = CheckCanTarget(target) if(!cancontinue) success = FALSE target.remove_status_effect(STATUS_EFFECT_MESMERIZE) - user.remove_status_effect(STATUS_EFFECT_MESMERIZE) + L.remove_status_effect(STATUS_EFFECT_MESMERIZE) DeactivatePower() DeactivateRangedAbility() StartCooldown() - to_chat(user, "[target] has escaped your gaze!") + to_chat(L, "[target] has escaped your gaze!") UnregisterSignal(target, COMSIG_MOVABLE_MOVED) /datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A - var/mob/living/user = owner + var/mob/living/L = owner + L.face_atom(A) + if(!istype(target)) + return + success = TRUE + var/power_time = 138 + level_current * 12 + target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) + L.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/ContinueTarget) + // 5 second windup + addtimer(CALLBACK(src, .proc/apply_effects, L, target, power_time), 6 SECONDS) - if(istype(target)) - success = TRUE - var/power_time = 138 + level_current * 12 - target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) - user.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) - - RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/ContinueTarget) +/datum/action/bloodsucker/targeted/mesmerize/proc/apply_effects(aggressor, victim, power_time) + var/mob/living/carbon/target = victim + var/mob/living/L = aggressor + if(!success) + return + PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y + target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) + target.face_atom(L) + target.Stun(power_time) + to_chat(L, "[target] is fixed in place by your hypnotic gaze.") + target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm + target.mob_transforming = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. + spawn(power_time) + if(istype(target) && success) + target.mob_transforming = FALSE + if(istype(L) && target.stat == CONSCIOUS && (target in L.fov_view(10))) // They Woke Up! (Notice if within view) + to_chat(L, "[target] has snapped out of their trance.") - // 3 second windup - sleep(30) - if(success) - PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y - target.face_atom(user) - target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) // pretty much purely cosmetic - target.Stun(power_time) - to_chat(user, "[target] is fixed in place by your hypnotic gaze.") - target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm - target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. - spawn(power_time) - if(istype(target) && success) - target.notransform = FALSE - // They Woke Up! (Notice if within view) - if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) - to_chat(user, "[target] has snapped out of their trance.") /datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) return ..() && CheckCanUse() && CheckCanTarget(target) diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm index 45d1dda3ef..cad3eeb88b 100644 --- a/code/modules/antagonists/bloodsucker/powers/trespass.dm +++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm @@ -20,7 +20,7 @@ . = ..() if(!.) return - if(owner.notransform || !get_turf(owner)) + if(owner.mob_transforming || !get_turf(owner)) return FALSE return TRUE @@ -28,7 +28,7 @@ /datum/action/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) // Can't target my tile - if (A == get_turf(owner) || get_turf(A) == get_turf(owner)) + if(A == get_turf(owner) || get_turf(A) == get_turf(owner)) return FALSE return TRUE // All we care about is destination. Anything you click is fine. @@ -43,13 +43,13 @@ // Are either tiles WALLS? var/turf/from_turf = get_turf(owner) var/this_dir // = get_dir(from_turf, target_turf) - for (var/i=1 to 2) + for(var/i=1 to 2) // Keep Prev Direction if we've reached final turf - if (from_turf != final_turf) + if(from_turf != final_turf) this_dir = get_dir(from_turf, final_turf) // Recalculate dir so we don't overshoot on a diagonal. from_turf = get_step(from_turf, this_dir) // ERROR! Wall! - if (iswallturf(from_turf)) + if(iswallturf(from_turf)) if (display_error) var/wallwarning = (i == 1) ? "in the way" : "at your destination" to_chat(owner, "There is a solid wall [wallwarning].") @@ -83,8 +83,8 @@ // Freeze Me user.next_move = world.time + mist_delay user.Stun(mist_delay, ignore_canstun = TRUE) - user.notransform = TRUE - user.density = 0 + user.mob_transforming = TRUE + user.density = FALSE var/invis_was = user.invisibility user.invisibility = INVISIBILITY_MAXIMUM @@ -94,7 +94,7 @@ sleep(mist_delay / 2) // Move & Freeze - if (isturf(target_turf)) + if(isturf(target_turf)) do_teleport(owner, target_turf, no_effects=TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm? user.next_move = world.time + mist_delay / 2 user.Stun(mist_delay / 2, ignore_canstun = TRUE) @@ -106,7 +106,7 @@ user.dir = get_dir(my_turf, target_turf) user.next_move = world.time + mist_delay / 2 user.Stun(mist_delay / 2, ignore_canstun = TRUE) - user.notransform = FALSE + user.mob_transforming = FALSE user.density = 1 user.invisibility = invis_was diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index ecb0611940..422d645ad2 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -82,6 +82,7 @@ // Change Appearance, not randomizing clothes colour, itll just be janky H.gender = pick(MALE, FEMALE) + H.dna.skin_tone_override = null H.skin_tone = random_skin_tone() H.hair_style = random_hair_style(H.gender) H.facial_hair_style = pick(random_facial_hair_style(H.gender),"Shaved") @@ -92,7 +93,7 @@ H.socks = random_socks(H.gender) //H.eye_color = random_eye_color() REMOVE_TRAIT(H, TRAIT_DISFIGURED, null) // - H.dna.features = random_features(H.dna.species?.id) + H.dna.features = random_features(H.dna.species?.id, H.gender) // Apply Appearance H.update_body(TRUE) // Outfit and underwear, also body and privates. @@ -124,6 +125,8 @@ // Revert Appearance H.gender = prev_gender H.skin_tone = prev_skin_tone + if(!GLOB.skin_tones[H.skin_tone]) + H.dna.skin_tone_override = H.skin_tone H.hair_style = prev_hair_style H.facial_hair_style = prev_facial_hair_style H.hair_color = prev_hair_color diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index a48e080a89..0a2e079921 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -111,7 +111,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - parts += "Objective #[objective_count]: [objective.explanation_text] Success!" + parts += "Objective #[objective_count]: [objective.explanation_text] Success!" else if(completion <= 0) parts += "Objective #[objective_count]: [objective.explanation_text] Fail." win = FALSE diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index cc15147312..35639bfd97 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -31,6 +31,7 @@ var/isabsorbing = 0 var/islinking = 0 var/geneticpoints = 10 + var/maxgeneticpoints = 10 var/purchasedpowers = list() var/mimicing = "" var/canrespec = 0 @@ -77,6 +78,7 @@ create_initial_profile() if(give_objectives) forge_objectives() + owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are able to transform our body after all. remove_clownmut() . = ..() @@ -89,6 +91,7 @@ B.organ_flags |= ORGAN_VITAL B.decoy_override = FALSE remove_changeling_powers() + owner.special_role = null . = ..() /datum/antagonist/changeling/proc/remove_clownmut() @@ -98,17 +101,24 @@ to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") H.dna.remove_mutation(CLOWNMUT) -/datum/antagonist/changeling/proc/reset_properties() +/datum/antagonist/changeling/proc/reset_properties(hardReset = FALSE) changeling_speak = 0 chosen_sting = null - geneticpoints = initial(geneticpoints) + + geneticpoints = maxgeneticpoints sting_range = initial(sting_range) - chem_storage = initial(chem_storage) - chem_recharge_rate = initial(chem_recharge_rate) - chem_charges = min(chem_charges, chem_storage) chem_recharge_slowdown = initial(chem_recharge_slowdown) mimicing = "" + if (hardReset) + chem_storage = initial(chem_storage) + chem_recharge_rate = initial(chem_recharge_rate) + geneticpoints = initial(geneticpoints) + maxgeneticpoints = initial(maxgeneticpoints) + + chem_charges = min(chem_charges, chem_storage) + + /datum/antagonist/changeling/proc/remove_changeling_powers() if(ishuman(owner.current) || ismonkey(owner.current)) reset_properties() @@ -287,7 +297,6 @@ prof.name_list[slot] = I.name prof.appearance_list[slot] = I.appearance prof.flags_cover_list[slot] = I.flags_cover - prof.item_color_list[slot] = I.item_color prof.item_state_list[slot] = I.item_state prof.exists_list[slot] = 1 else @@ -423,7 +432,7 @@ objectives += destroy_objective else if(prob(70)) - var/datum/objective/assassinate/kill_objective = new + var/datum/objective/assassinate/once/kill_objective = new kill_objective.owner = owner if(team_mode) //No backstabbing while in a team kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1) @@ -503,7 +512,6 @@ var/list/appearance_list = list() var/list/flags_cover_list = list() var/list/exists_list = list() - var/list/item_color_list = list() var/list/item_state_list = list() var/underwear @@ -526,7 +534,6 @@ newprofile.appearance_list = appearance_list.Copy() newprofile.flags_cover_list = flags_cover_list.Copy() newprofile.exists_list = exists_list.Copy() - newprofile.item_color_list = item_color_list.Copy() newprofile.item_state_list = item_state_list.Copy() newprofile.underwear = underwear newprofile.undershirt = undershirt @@ -558,7 +565,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - parts += "Objective #[count]: [objective.explanation_text] Success!" + parts += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) parts += "Objective #[count]: [objective.explanation_text] Fail." changelingwin = FALSE diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 574edf225a..aa45c56892 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -28,8 +28,7 @@ action.Remove(user) return -/obj/effect/proc_holder/changeling/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/Trigger(mob/user) if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling)) return try_to_sting(user) diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 5cb4faa86e..3e2ff6f3dd 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -59,12 +59,12 @@ changeling.trueabsorbs++ if(user.nutrition < NUTRITION_LEVEL_WELL_FED) - user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED) + user.adjust_nutrition(target.nutrition, NUTRITION_LEVEL_WELL_FED) - if(target.mind)//if the victim has got a mind - // Absorb a lizard, speak Draconic. - user.copy_known_languages_from(target) + // Absorb a lizard, speak Draconic. + user.copy_languages(target, LANGUAGE_ABSORB) + if(target.mind && user.mind)//if the victim and user have minds target.mind.show_memory(user, 0) //I can read your mind, kekeke. Output all their notes. //Some of target's recent speech, so the changeling can attempt to imitate them better. @@ -96,6 +96,7 @@ to_chat(user, "[target] was one of us. We have absorbed their power.") target_ling.remove_changeling_powers() changeling.geneticpoints += round(target_ling.geneticpoints/2) + changeling.maxgeneticpoints += round(target_ling.geneticpoints/2) target_ling.geneticpoints = 0 target_ling.canrespec = 0 changeling.chem_storage += round(target_ling.chem_storage/2) diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index ba40388844..32171a036a 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -13,5 +13,5 @@ //Recover from stuns. /obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user) - user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/drug/methamphetamine/changeling = 10, /datum/reagent/medicine/mannitol = 10, /datum/reagent/medicine/regen_jelly = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) - return TRUE \ No newline at end of file + user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/drug/methamphetamine/changeling = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) + return TRUE diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index 6eafeda63f..a6fdf7008a 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -27,12 +27,12 @@ var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if(!active) - E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes + ADD_TRAIT(user, TRAIT_THERMAL_VISION, CHANGELING_TRAIT) E.flash_protect = -1 //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to sense prey through walls.") active = TRUE //Defined in code/modules/spells/spell.dm else - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS //Remove sight flags from the user's eyes + REMOVE_TRAIT(user, TRAIT_THERMAL_VISION, CHANGELING_TRAIT) E.flash_protect = 2 //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to protect them from bright lights.") active = FALSE @@ -47,10 +47,8 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of X-ray vision and flash protection when the user refunds this ability action.Remove(user) + REMOVE_TRAIT(user, TRAIT_THERMAL_VISION, CHANGELING_TRAIT) var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) - if (active) - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS - else - E.flash_protect = 0 - user.update_sight() \ No newline at end of file + E.flash_protect = initial(E.flash_protect) + user.update_sight() diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index f58b90d8e6..db4e47aa78 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -2,7 +2,7 @@ name = "Biodegrade" desc = "Dissolves restraints or other objects preventing free movement." helptext = "This is obvious to nearby people, and can destroy standard restraints and closets. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat." - chemical_cost = 30 //High cost to prevent spam + chemical_cost = 15 //High cost to prevent spam loudness = 1 dna_cost = 2 req_human = 1 diff --git a/code/modules/antagonists/changeling/powers/chameleon_skin.dm b/code/modules/antagonists/changeling/powers/chameleon_skin.dm index 03f3aab473..c01a1e40c8 100644 --- a/code/modules/antagonists/changeling/powers/chameleon_skin.dm +++ b/code/modules/antagonists/changeling/powers/chameleon_skin.dm @@ -3,7 +3,6 @@ desc = "Our skin pigmentation rapidly changes to suit our current environment." helptext = "Allows us to become invisible after a few seconds of standing still. Can be toggled on and off." dna_cost = 2 - chemical_cost = 25 req_human = 1 action_icon = 'icons/mob/actions/actions_changeling.dmi' action_icon_state = "ling_camouflage" @@ -23,4 +22,4 @@ action.Remove(user) if(user.has_dna()) var/mob/living/carbon/C = user - C.dna.remove_mutation(CHAMELEON) \ No newline at end of file + C.dna.remove_mutation(CHAMELEON) diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index 9672d79ee4..afef2a10c7 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -1,8 +1,9 @@ /obj/effect/proc_holder/changeling/fleshmend name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious." + desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious. This ability is loud, and might cause our blood to react violently to heat." helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood." chemical_cost = 20 + loudness = 2 dna_cost = 2 req_stat = UNCONSCIOUS action_icon = 'icons/mob/actions/actions_changeling.dmi' diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index a6f7b0b6e9..c38bfe3b5b 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -21,13 +21,13 @@ var/datum/changelingprofile/chosen_prof = changeling.get_dna(chosen_name) if(!chosen_prof) return - if(!user || user.notransform) + if(!user || user.mob_transforming) return 0 to_chat(user, "We transform our appearance.") changeling.purchasedpowers -= src - var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS) + var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) changeling_transform(newmob, chosen_prof) return TRUE diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 1f9ca0b3ff..f3690ef5c5 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -11,9 +11,9 @@ //Transform into a monkey. /obj/effect/proc_holder/changeling/lesserform/sting_action(mob/living/carbon/human/user) - if(!user || user.notransform) + if(!user || user.mob_transforming) return 0 to_chat(user, "Our genes cry out!") user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 49c34f4d1f..e4417a6d64 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -137,7 +137,7 @@ name = "Arm Blade" desc = "We reform one of our arms into a deadly blade." helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form. This ability is loud, and might cause our blood to react violently to heat." - chemical_cost = 20 + chemical_cost = 10 dna_cost = 2 loudness = 2 req_human = 1 @@ -410,7 +410,7 @@ desc = "We reform one of our arms into a hard shield." helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat." chemical_cost = 20 - dna_cost = 1 + dna_cost = 2 loudness = 1 req_human = 1 action_icon = 'icons/mob/actions/actions_changeling.dmi' @@ -432,32 +432,35 @@ /obj/item/shield/changeling name = "shield-like mass" desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." - item_flags = ABSTRACT | DROPDEL + item_flags = ABSTRACT | DROPDEL | ITEM_CAN_BLOCK icon = 'icons/obj/items_and_weapons.dmi' icon_state = "ling_shield" lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - block_chance = 50 + block_parry_data = /datum/block_parry_data/shield/changeling var/remaining_uses //Set by the changeling ability. -/obj/item/shield/changeling/Initialize() +/datum/block_parry_data/shield/changeling + block_slowdown = 0 + +/obj/item/shield/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) if(ismob(loc)) loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") -/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(remaining_uses < 1) +/obj/item/shield/changeling/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + block_return[BLOCK_RETURN_BLOCK_CAPACITY] = (block_return[BLOCK_RETURN_BLOCK_CAPACITY] || 0) + remaining_uses + return ..() + +/obj/item/shield/changeling/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + . = ..() + if(--remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.visible_message("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!", "We assimilate our shield into our body", "Our muscles tense and strengthen.") - changeling.chem_recharge_slowdown += 0.5 else - user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES) + user.remove_movespeed_modifier(/datum/movespeed_modifier/strained_muscles) to_chat(user, "Our muscles relax.") - changeling.chem_recharge_slowdown -= 0.5 - if(stacks >= 20) + if(stacks >= 10) to_chat(user, "We collapse in exhaustion.") user.DefaultCombatKnockdown(60) user.emote("gasp") @@ -34,26 +30,24 @@ return TRUE /obj/effect/proc_holder/changeling/strained_muscles/proc/muscle_loop(mob/living/carbon/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) while(active) - user.add_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + user.add_movespeed_modifier(/datum/movespeed_modifier/strained_muscles) if(user.stat != CONSCIOUS || user.staminaloss >= 90) active = !active to_chat(user, "Our muscles relax without the energy to strengthen them.") user.DefaultCombatKnockdown(40) - user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES) - changeling.chem_recharge_slowdown -= 0.5 + user.remove_movespeed_modifier(/datum/movespeed_modifier/strained_muscles) break stacks++ //user.take_bodypart_damage(stacks * 0.03, 0) - user.adjustStaminaLoss(stacks*1.3) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack + user.adjustStaminaLoss(stacks*1.5) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack - if(stacks == 10) //Warning message that the stacks are getting too high + if(stacks == 5) //Warning message that the stacks are getting too high to_chat(user, "Our legs are really starting to hurt...") sleep(40) - while(!active && stacks) //Damage stacks decrease fairly rapidly while not in sanic mode + while(!active && stacks) //Damage stacks decrease slowly while not in sanic mode stacks-- - sleep(20) + sleep(100) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 3e19ce74fe..a8fe56aae7 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -3,8 +3,7 @@ desc = "Stabby stabby." var/sting_icon = null -/obj/effect/proc_holder/changeling/sting/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/sting/Trigger(mob/user) if(!user || !user.mind) return var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) @@ -74,8 +73,7 @@ action_icon_state = "ling_sting_transform" action_background_icon_state = "bg_ling" -/obj/effect/proc_holder/changeling/sting/transformation/Click() - var/mob/user = usr +/obj/effect/proc_holder/changeling/sting/transformation/Trigger(mob/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling.chosen_sting) unset_sting(user) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index daa4e24c69..036ea37ada 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -5,6 +5,7 @@ clockwork_desc = "A sigil of some purpose." icon_state = "sigil" layer = LOW_OBJ_LAYER + plane = ABOVE_WALL_PLANE alpha = 50 resistance_flags = NONE var/affects_servants = FALSE @@ -279,9 +280,15 @@ sigil_name = "Vitality Matrix" var/revive_cost = 150 var/sigil_active = FALSE + var/min_drain_health = -INFINITY + var/can_dust = TRUE var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order +/obj/effect/clockwork/sigil/vitality/neutered + min_drain_health = 20 + can_dust = FALSE + /obj/effect/clockwork/sigil/vitality/examine(mob/user) . = ..() if(is_servant_of_ratvar(user) || isobserver(user)) @@ -306,7 +313,7 @@ animation_number++ if(!is_servant_of_ratvar(L)) var/vitality_drained = 0 - if(L.stat == DEAD && !consumed_vitality) + if(L.stat == DEAD && !consumed_vitality && can_dust) consumed_vitality = TRUE //Prevent the target from being consumed multiple times vitality_drained = L.maxHealth var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) @@ -318,7 +325,7 @@ if(!L.dropItemToGround(W)) qdel(W) L.dust() - else + else if(L.health > min_drain_health) if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS) vitality_drained = L.adjustToxLoss(1, forced = TRUE) else diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm index 7658f7e715..1d65cf9209 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_powerdrain.dm @@ -1,21 +1,31 @@ //horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops -/atom/movable/proc/power_drain(clockcult_user) +/atom/movable/proc/power_drain(clockcult_user, drain_weapons = FALSE) //This proc as of now is only in use for void volt var/obj/item/stock_parts/cell/cell = get_cell() if(cell) return cell.power_drain(clockcult_user) - return 0 + return 0 //Returns 0 instead of FALSE to symbolise it returning the power amount in other cases, not TRUE aka 1 -/obj/item/melee/baton/power_drain(clockcult_user) //balance memes - return 0 +/obj/item/melee/baton/power_drain(clockcult_user, drain_weapons = FALSE) //balance memes + if(!drain_weapons) + return 0 + return ..() -/obj/item/gun/power_drain(clockcult_user) //balance memes - return 0 +/obj/item/gun/power_drain(clockcult_user, drain_weapons = FALSE) //balance memes + if(!drain_weapons) + return 0 + var/obj/item/stock_parts/cell/cell = get_cell() + if(!cell) + return 0 + if(cell.charge) + . = min(cell.charge, MIN_CLOCKCULT_POWER*4) //Done snowflakey because guns have far smaller cells than batons / other equipment + cell.use(.) + update_icon() -/obj/machinery/power/apc/power_drain(clockcult_user) +/obj/machinery/power/apc/power_drain(clockcult_user, drain_weapons = FALSE) if(cell && cell.charge) playsound(src, "sparks", 50, 1) flick("apc-spark", src) - . = min(cell.charge, MIN_CLOCKCULT_POWER*3) + . = min(cell.charge, MIN_CLOCKCULT_POWER*4) cell.use(.) //Better than a power sink! if(!cell.charge && !shorted) shorted = 1 @@ -23,9 +33,9 @@ update() update_icon() -/obj/machinery/power/smes/power_drain(clockcult_user) +/obj/machinery/power/smes/power_drain(clockcult_user, drain_weapons = FALSE) if(charge) - . = min(charge, MIN_CLOCKCULT_POWER*3) + . = min(charge, MIN_CLOCKCULT_POWER*4) charge -= . * 50 if(!charge && !panel_open) panel_open = TRUE @@ -34,19 +44,19 @@ visible_message("[src]'s panel flies open with a flurry of sparks!") update_icon() -/obj/item/stock_parts/cell/power_drain(clockcult_user) +/obj/item/stock_parts/cell/power_drain(clockcult_user, drain_weapons = FALSE) if(charge) - . = min(charge, MIN_CLOCKCULT_POWER*3) - charge = use(.) + . = min(charge, MIN_CLOCKCULT_POWER * 4) //Done like this because normal cells are usually quite a bit bigger than the ones used in guns / APCs + use(min(charge, . * 10)) //Usually cell-powered equipment that is not a gun has at least ten times the capacity of a gun / 5 times the amount of an APC. This adjusts the drain to account for that. update_icon() -/mob/living/silicon/robot/power_drain(clockcult_user) +/mob/living/silicon/robot/power_drain(clockcult_user, drain_weapons = FALSE) if((!clockcult_user || !is_servant_of_ratvar(src)) && cell && cell.charge) . = min(cell.charge, MIN_CLOCKCULT_POWER*4) cell.use(.) spark_system.start() -/obj/mecha/power_drain(clockcult_user) +/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE) if((!clockcult_user || (occupant && !is_servant_of_ratvar(occupant))) && cell && cell.charge) . = min(cell.charge, MIN_CLOCKCULT_POWER*4) cell.use(.) diff --git a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm index 05f11294de..b0259c460e 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm @@ -239,7 +239,7 @@ if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \ extra_checks = CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricator_repair_checks, repair_values, src, user, TRUE))) break - obj_integrity = CLAMP(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) + obj_integrity = clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) adjust_clockwork_power(-repair_values["power_required"]) playsound(src, 'sound/machines/click.ogg', 50, 1) diff --git a/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm b/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm index 37f6f0b2d7..0c01dc0963 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/hierophant_network.dm @@ -35,7 +35,7 @@ var/span_for_name = "heavy_brass" var/span_for_message = "brass" -/datum/action/innate/hierophant/IsAvailable() +/datum/action/innate/hierophant/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) return FALSE return ..() diff --git a/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm index f927fc237d..628add0cb3 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/power_helpers.dm @@ -10,7 +10,7 @@ if(GLOB.ratvar_awakens) current_power = GLOB.clockwork_power = INFINITY else - current_power = GLOB.clockwork_power = CLAMP(GLOB.clockwork_power + amount, 0, MAX_CLOCKWORK_POWER) + current_power = GLOB.clockwork_power = clamp(GLOB.clockwork_power + amount, 0, MAX_CLOCKWORK_POWER) for(var/obj/effect/clockwork/sigil/transmission/T in GLOB.all_clockwork_objects) T.update_icon() var/unlock_message diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index c7c9c42ee9..81ad7ddc26 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -135,6 +135,29 @@ return TRUE +//For the Volt Void scripture, fires a ray of energy at a target location +/obj/effect/proc_holder/slab/volt + ranged_mousepointer = 'icons/effects/volt_target.dmi' + +/obj/effect/proc_holder/slab/volt/InterceptClickOn(mob/living/caller, params, atom/target) + if(target == slab || ..()) //we can't cancel + return TRUE + + var/turf/T = ranged_ability_user.loc + if(!isturf(T)) + return TRUE + + if(target in view(7, get_turf(ranged_ability_user))) + successful = TRUE + ranged_ability_user.visible_message("[ranged_ability_user] fires a ray of energy at [target]!", "You fire a volt ray at [target].") + playsound(ranged_ability_user, 'sound/effects/light_flicker.ogg', 50, 1) + T = get_turf(target) + new/obj/effect/temp_visual/ratvar/volt_hit(T, ranged_ability_user) + log_combat(ranged_ability_user, T, "fired a volt ray") + remove_ranged_ability() + + return TRUE + //For the Kindle scripture; stuns and mutes a target non-servant. /obj/effect/proc_holder/slab/kindle ranged_mousepointer = 'icons/effects/volt_target.dmi' @@ -211,7 +234,7 @@ var/mob/living/carbon/C = L C.stuttering = max(8, C.stuttering) C.drowsyness = max(8, C.drowsyness) - C.confused += CLAMP(16 - C.confused, 0, 8) + C.confused += clamp(16 - C.confused, 0, 8) C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) L.adjustFireLoss(15) ..() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm index a87767c05e..40aca961fc 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/_call_weapon.dm @@ -12,7 +12,7 @@ var/obj/item/clockwork/weapon/weapon_type //The type of weapon to create var/obj/item/clockwork/weapon/weapon -/datum/action/innate/call_weapon/IsAvailable() +/datum/action/innate/call_weapon/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) qdel(src) return diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm new file mode 100644 index 0000000000..a681e9b38b --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_shield.dm @@ -0,0 +1,82 @@ +//Subtype of (riot) shield because of already implemented shieldbash stuff aswell as integrity and simillar things +//ratvarian shield: A shield that absorbs energy from attacks and uses it to empower its bashes with remendous force. It is also quite resistant to damage, though less so against lasers and energy weaponry. + +/obj/item/shield/riot/ratvarian + name = "ratvarian shield" + icon_state = "ratvarian_shield" //Its icons are in the same place the normal shields are in + item_state = "ratvarian_shield" + desc = "A resilient shield made out of brass.. It feels warm to the touch." + var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes." + armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + shield_flags = SHIELD_FLAGS_DEFAULT + max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy + repair_material = /obj/item/stack/tile/brass + var/dam_absorbed = 0 + var/bash_mult_steps = 30 + var/max_bash_mult = 4 + +/obj/item/shield/riot/ratvarian/examine(mob/user) + if((is_servant_of_ratvar(user) || isobserver(user))) + desc = clockwork_desc + desc +="\n The shield has absorbed [dam_absorbed] damage, multiplying the effectiveness of its bashes by [calc_bash_mult()]" + . = ..() + desc = initial(desc) + +obj/item/shield/riot/ratvarian/proc/calc_bash_mult() + var/bash_mult = 0 + if(!dam_absorbed) + return 1 + else + bash_mult += round(clamp(1 + (dam_absorbed / bash_mult_steps), 1, max_bash_mult), 0.1) //Multiplies the effect of bashes by up to [max_bash_mult], though never less than one + return bash_mult + +/obj/item/shield/riot/ratvarian/proc/calc_bash_absorb_use() + var/absorb_use = 0 + absorb_use = max(0, round(dam_absorbed * (calc_bash_mult() / round(1 + (dam_absorbed / bash_mult_steps), 0.1)), 1)) //Calculates how much of the absorbed damage the bash would actually use, so its not wasted + return absorb_use + +/obj/item/shield/riot/ratvarian/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!damage) + return ..() + + if(!is_servant_of_ratvar(owner)) + owner.visible_message("As [owner] blocks the attack with [src], [owner.p_they()] suddenly drops it, whincing in pain! ", "As you block the attack with [src], it heats up tremendously, forcing you to drop it from the pain alone! ") + owner.emote("scream") + playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50) + if(iscarbon(owner)) //Type safety for if a drone somehow got a shield (ratvar protect us) + var/mob/living/carbon/C = owner + var/obj/item/bodypart/part = C.get_holding_bodypart_of_item(src) + C.apply_damage((iscultist(C) ? damage * 2 : damage), BURN, (istype(part, /obj/item/bodypart/l_arm) ? BODY_ZONE_L_ARM : BODY_ZONE_R_ARM)) //Deals the damage to the holder instead of absorbing it instead + forcedrops. Doubled if a cultist of Nar'Sie. + else + owner.adjustFireLoss(iscultist(owner) ? damage * 2 : damage) + addtimer(CALLBACK(owner, /mob/living.proc/dropItemToGround, src, TRUE), 1) + else if(!is_servant_of_ratvar(attacker)) //No exploiting my snowflake mechanics + dam_absorbed += damage + playsound(owner, 'sound/machines/clockcult/steam_whoosh.ogg', 30) + + if(damage <= 10) //The shield itself is hard to break, this DOES NOT modify the actual blocking-mechanic + damage = 0 + else + damage -= 5 + return ..() + +/obj/item/shield/riot/ratvarian/shatter(mob/living/carbon/human/owner) + playsound(owner, 'sound/magic/clockwork/anima_fragment_death.ogg', 50) + new /obj/item/clockwork/alloy_shards/large(get_turf(src)) + +/obj/item/shield/riot/ratvarian/user_shieldbash(mob/living/user, atom/target, harmful) + if(!harmful || !is_servant_of_ratvar(user)) // No fun for non-clockies, but you can keep the normal bashes. Until you try to block with it. + shieldbash_knockback = initial(shieldbash_knockback) + shieldbash_brutedamage = initial(shieldbash_brutedamage) //Prevention for funky stuff that might happen otherwise + shieldbash_stamdmg = initial(shieldbash_stamdmg) + return ..() + var/actual_bash_mult = calc_bash_mult() + shieldbash_knockback = round(initial(shieldbash_knockback) * actual_bash_mult, 1) //Modifying the strength of the bash, done with initial() to prevent magic-number issues if the original shieldbash values are changed + shieldbash_brutedamage = round(initial(shieldbash_brutedamage) * actual_bash_mult, 1) //Where I think of it, better round this stuff because we don't need even more things that deal like 3.25 damage + shieldbash_stamdmg = round(initial(shieldbash_stamdmg) * actual_bash_mult, 1) //Like 20 brute and 60 stam + a fuckton of knockback at the moment (at maximum charge), seems mostly fine? I think? + . = ..() + if(.) //If this bash actually hit someone + if(actual_bash_mult > 1) + playsound(user, 'sound/magic/fireball.ogg', 50, TRUE, frequency = 1.25) + dam_absorbed -= calc_bash_absorb_use() + return diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 4a10862e28..234f0445e0 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -59,7 +59,7 @@ if(issilicon(L)) L.DefaultCombatKnockdown(100) else if(iscultist(L)) - L.confused += CLAMP(10 - L.confused, 0, 5) // Spearthrow now confuses enemy cultists + just deals extra damage / sets on fire instead of hardstunning + damage + L.confused += clamp(10 - L.confused, 0, 5) // Spearthrow now confuses enemy cultists + just deals extra damage / sets on fire instead of hardstunning + damage to_chat(L, "[src] crashes into you with burning force, sending you reeling!") L.adjust_fire_stacks(2) L.DefaultCombatKnockdown(1) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index 5bc04173b9..a4f8bf8062 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -127,7 +127,6 @@ icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_gauntlets" item_state = "clockwork_gauntlets" - item_color = null //So they don't wash. strip_delay = 50 equip_delay_other = 30 body_parts_covered = ARMS diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index b12c72b4af..5837ac302d 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -36,6 +36,24 @@ speed_multiplier = 0 no_cost = TRUE +/obj/item/clockwork/slab/traitor + var/spent = FALSE + +/obj/item/clockwork/slab/traitor/check_uplink_validity() + return !spent + +/obj/item/clockwork/slab/traitor/attack_self(mob/living/user) + if(!is_servant_of_ratvar(user) && !spent) + to_chat(user, "You press your hand onto [src], golden tendrils of light latching onto you. Was this the best of ideas?") + if(add_servant_of_ratvar(user, FALSE, FALSE, /datum/antagonist/clockcult/neutered/traitor)) + spent = TRUE + // Add some (5 KW) power so they don't suffer for 100 ticks + GLOB.clockwork_power += 5000 + // This intentionally does not use adjust_clockwork_power. + else + to_chat(user, "[src] falls dark. It appears you weren't worthy.") + return ..() + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clockwork/slab/debug/attack_hand(mob/living/user) if(!is_servant_of_ratvar(user)) @@ -103,8 +121,8 @@ . = ..() addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later -/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(isinhands && item_state && inhand_overlay) var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]") . += M diff --git a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm index f83afebe24..6bec6e3bc7 100644 --- a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm +++ b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm @@ -31,6 +31,7 @@ laws = new /datum/ai_laws/ratvar() braintype = picked_name GLOB.all_clockwork_objects += src + brainmob.add_blocked_language(subtypesof(/datum/language) - /datum/language/ratvar, LANGUAGE_CLOCKIE) /obj/item/mmi/posibrain/soul_vessel/Destroy() GLOB.all_clockwork_objects -= src diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index e4722dbcb0..faa5e025ca 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -232,7 +232,7 @@ background_icon_state = "bg_clock" buttontooltipstyle = "clockcult" -/datum/action/innate/eminence/IsAvailable() +/datum/action/innate/eminence/IsAvailable(silent = FALSE) if(!iseminence(owner)) qdel(src) return @@ -283,7 +283,7 @@ desc = "Initiates a mass recall, warping all servants to the Ark after a short delay. This can only be used once." button_icon_state = "Spatial Gateway" -/datum/action/innate/eminence/mass_recall/IsAvailable() +/datum/action/innate/eminence/mass_recall/IsAvailable(silent = FALSE) . = ..() if(.) var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm index f43f2814d8..3bc237fc56 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm @@ -17,7 +17,8 @@ obj_damage = 40 melee_damage_lower = 12 melee_damage_upper = 12 - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' weather_immunities = list("lava") movement_type = FLYING @@ -39,8 +40,9 @@ if(!shield_health) return "Its shield has been destroyed!" -/mob/living/simple_animal/hostile/clockwork/marauder/Life() - ..() +/mob/living/simple_animal/hostile/clockwork/marauder/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return var/turf/T = get_turf(src) var/turf/open/space/S = isspaceturf(T)? T : null var/less_space_damage @@ -68,14 +70,16 @@ maxHealth = 300 melee_damage_upper = 25 melee_damage_lower = 25 - attacktext = "devastates" + attack_verb_continuous = "devastates" + attack_verb_simple = "devastate" speed = -1 obj_damage = 100 max_shield_health = INFINITY else if(GLOB.ratvar_approaches) //Hefty health bonus and slight attack damage increase melee_damage_upper = 15 melee_damage_lower = 15 - attacktext = "carves" + attack_verb_continuous = "carves" + attack_verb_simple = "carve" obj_damage = 50 max_shield_health = 4 diff --git a/code/modules/antagonists/clockcult/clock_scripture.dm b/code/modules/antagonists/clockcult/clock_scripture.dm index 753de786dc..1ebefe4d05 100644 --- a/code/modules/antagonists/clockcult/clock_scripture.dm +++ b/code/modules/antagonists/clockcult/clock_scripture.dm @@ -30,6 +30,7 @@ Applications: 8 servants, 3 caches, and 100 CV var/primary_component var/important = FALSE //important scripture will be italicized in the slab's interface var/sort_priority = 1 //what position the scripture should have in a list of scripture. Should be based off of component costs/reqs, but you can't initial() lists. + var/requires_full_power = FALSE //requires the user to be a full, non neutered servant of ratvar //messages for offstation scripture recital, courtesy ratvar's generals(and neovgre) var/static/list/neovgre_penalty = list("Go to the station.", "Useless.", "Don't waste time.", "Pathetic.", "Wasteful.") @@ -77,6 +78,9 @@ Applications: 8 servants, 3 caches, and 100 CV /datum/clockwork_scripture/proc/can_recite() //If the words can be spoken if(!invoker || !slab || invoker.get_active_held_item() != slab) return FALSE + if(!is_servant_of_ratvar(invoker, requires_full_power)) + to_chat(invoker, "You aren't strongly connected enough to Ratvar to invoke this!") + return FALSE if(!invoker.can_speak_vocal()) to_chat(invoker, "You are unable to speak the words of the scripture!") return FALSE @@ -199,6 +203,10 @@ Applications: 8 servants, 3 caches, and 100 CV if(!do_after(invoker, chant_interval, target = invoker, extra_checks = CALLBACK(src, .proc/can_recite))) break clockwork_say(invoker, text2ratvar(pick(chant_invocations)), whispered) + if(multiple_invokers_used) + for(var/mob/living/L in range(1, get_turf(invoker))) + if(can_recite_scripture(L) && L != invoker) + clockwork_say(L, text2ratvar(pick(chant_invocations)), whispered) if(!chant_effects(i)) break if(invoker && slab) @@ -236,18 +244,21 @@ Applications: 8 servants, 3 caches, and 100 CV return FALSE return TRUE +/datum/clockwork_scripture/create_object/proc/get_spawn_path(mob/user) + return object_path + /datum/clockwork_scripture/create_object/scripture_effects() if(creator_message && observer_message) invoker.visible_message(observer_message, creator_message) else if(creator_message) to_chat(invoker, creator_message) - var/obj/O = new object_path (get_turf(invoker)) + var/to_spawn = get_spawn_path(invoker) + var/obj/O = new to_spawn(get_turf(invoker)) O.ratvar_act() //update the new object so it gets buffed if ratvar is alive if(isitem(O) && put_object_in_hands) invoker.put_in_hands(O) return TRUE - //Used specifically to create construct shells. /datum/clockwork_scripture/create_object/construct put_object_in_hands = FALSE diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm index 0fd6c8a8dc..ffe9ecfa80 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_applications.dm @@ -111,7 +111,7 @@ var/mob/living/L = M.current if(ishuman(L) && L.stat != DEAD) human_servants++ - construct_limit = round(CLAMP((human_servants / 4), 1, 3)) //1 per 4 human servants, maximum of 3 + construct_limit = round(clamp((human_servants / 4), 1, 3)) //1 per 4 human servants, maximum of 3 //Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage. /datum/clockwork_scripture/create_object/summon_arbiter diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 5d7a95222f..6349ecb581 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -88,7 +88,7 @@ sort_priority = 4 quickbind = TRUE quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it." - + requires_full_power = TRUE //Kindle: Charges the slab with blazing energy. It can be released to stun and silence a target. /datum/clockwork_scripture/ranged_ability/kindle @@ -211,6 +211,7 @@ quickbind = TRUE quickbind_desc = "Returns you to Reebe." var/client_color + requires_full_power = TRUE /datum/clockwork_scripture/abscond/check_special_requirements() if(is_reebe(invoker.z)) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index 4e1a5b42cb..d22a2f69b7 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -50,7 +50,6 @@ return FALSE return ..() - //Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants. /datum/clockwork_scripture/create_object/vitality_matrix descname = "Trap, Damage to Healing" @@ -77,6 +76,10 @@ return FALSE return ..() +/datum/clockwork_scripture/create_object/vitality_matrix/get_spawn_path(mob/user) + if(!is_servant_of_ratvar(user, TRUE)) + return /obj/effect/clockwork/sigil/vitality/neutered + return ..() //Judicial Visor: Creates a judicial visor, which can smite an area. /datum/clockwork_scripture/create_object/judicial_visor @@ -97,6 +100,24 @@ quickbind = TRUE quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning." +//Nezbere's shield: Creates a ratvarian shield which absorbs attacks, see ratvarian_shield.dm for details. +/datum/clockwork_scripture/create_object/nezberes_shield + descname = "Shield with empowerable bashes" + name = "Nezbere's shield" + desc = "Creates a shield which generates charge from blocking damage, using it to empower its bashes tremendously. It is repaired with brass, and while very durable, extremely weak to lasers and, even more so, to energy weaponry." + invocations = list("Shield me...", "... from the coming dark!") + channel_time = 20 + power_cost = 600 //Shouldn't be too spammable but not too hard to get either + whispered = TRUE + creator_message = "You form a ratvarian shield, which is capable of absorbing blocked attacks to empower its bashes." + object_path = /obj/item/shield/riot/ratvarian + usage_tip = "Bashes will only use charge when performed with intent to harm." + tier = SCRIPTURE_SCRIPT + space_allowed = TRUE + primary_component = VANGUARD_COGWHEEL + sort_priority = 6 + quickbind = TRUE + quickbind_desc = "Creates a Ratvarian shield, which can absorb energy from attacks for use in powerful bashes." //Clockwork Armaments: Grants the invoker the ability to call forth a Ratvarian spear and clockwork armor. /datum/clockwork_scripture/clockwork_armaments @@ -110,7 +131,7 @@ usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear. You will need to wait for 30 seconds before resummoning it." tier = SCRIPTURE_SCRIPT primary_component = VANGUARD_COGWHEEL - sort_priority = 5 + sort_priority = 7 important = TRUE quickbind = TRUE quickbind_desc = "Permanently binds clockwork armor and a Ratvarian spear to you." @@ -150,7 +171,7 @@ /obj/item/clothing/head/helmet/space, /obj/item/clothing/shoes/magboots)) //replace this only if ratvar is up -/datum/action/innate/clockwork_armaments/IsAvailable() +/datum/action/innate/clockwork_armaments/IsAvailable(silent = FALSE) if(!is_servant_of_ratvar(owner)) qdel(src) return @@ -210,7 +231,7 @@ usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal." tier = SCRIPTURE_SCRIPT primary_component = GEIS_CAPACITOR - sort_priority = 6 + sort_priority = 9 quickbind = TRUE quickbind_desc = "Allows you to create a one-way Spatial Gateway to a living Servant or Clockwork Obelisk." @@ -242,3 +263,227 @@ duration = max(duration, 100) return slab.procure_gateway(invoker, duration, portal_uses) + +//Mending Mantra: Channeled for up to ten times over twenty seconds to repair structures and heal allies +/datum/clockwork_scripture/channeled/mending_mantra + descname = "Channeled, Area Healing and Repair" + name = "Mending Mantra" + desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed. Channeled every two seconds for a maximum of twenty seconds." + chant_invocations = list("Mend our dents!", "Heal our scratches!", "Repair our gears!") + chant_amount = 10 + chant_interval = 20 + power_cost = 400 + usage_tip = "This is a very effective way to rapidly reinforce a base after an attack." + tier = SCRIPTURE_SCRIPT + primary_component = VANGUARD_COGWHEEL + sort_priority = 8 + quickbind = TRUE + quickbind_desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed.
    Maximum 10 chants." + var/heal_attempts = 4 + var/heal_amount = 2.5 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + var/static/list/heal_finish_messages = list("There, all mended!", "Try not to get too damaged.", "No more dents and scratches for you!", "Champions never die.", "All patched up.", \ + "Ah, child, it's okay now.", "Pain is temporary.", "What you do for the Justiciar is eternal.", "Bear this for me.", "Be strong, child.", "Please, be careful!", \ + "If you die, you will be remembered.") + var/static/list/heal_target_typecache = typecacheof(list( + /obj/structure/destructible/clockwork, + /obj/machinery/door/airlock/clockwork, + /obj/machinery/door/window/clockwork, + /obj/structure/window/reinforced/clockwork, + /obj/structure/table/reinforced/brass)) + var/static/list/ratvarian_armor_typecache = typecacheof(list( + /obj/item/clothing/suit/armor/clockwork, + /obj/item/clothing/head/helmet/clockwork, + /obj/item/clothing/gloves/clockwork, + /obj/item/clothing/shoes/clockwork)) + +/datum/clockwork_scripture/channeled/mending_mantra/chant_effects(chant_number) + var/turf/T + for(var/atom/movable/M in range(7, invoker)) + if(isliving(M)) + if(isclockmob(M) || istype(M, /mob/living/simple_animal/drone/cogscarab)) + var/mob/living/simple_animal/S = M + if(S.health == S.maxHealth || S.stat == DEAD) + continue + T = get_turf(M) + for(var/i in 1 to heal_attempts) + if(S.health < S.maxHealth) + S.adjustHealth(-heal_amount) + new /obj/effect/temp_visual/heal(T, "#1E8CE1") + if(i == heal_attempts && S.health >= S.maxHealth) //we finished healing on the last tick, give them the message + to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else + to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else if(issilicon(M)) + var/mob/living/silicon/S = M + if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S)) + continue + T = get_turf(M) + for(var/i in 1 to heal_attempts) + if(S.health < S.maxHealth) + S.heal_ordered_damage(heal_amount, damage_heal_order) + new /obj/effect/temp_visual/heal(T, "#1E8CE1") + if(i == heal_attempts && S.health >= S.maxHealth) + to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else + to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.health == H.maxHealth || H.stat == DEAD || !is_servant_of_ratvar(H)) + continue + T = get_turf(M) + var/heal_ticks = 0 //one heal tick for each piece of ratvarian armor worn + var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_SUIT) + if(is_type_in_typecache(I, ratvarian_armor_typecache)) + heal_ticks++ + I = H.get_item_by_slot(SLOT_HEAD) + if(is_type_in_typecache(I, ratvarian_armor_typecache)) + heal_ticks++ + I = H.get_item_by_slot(SLOT_GLOVES) + if(is_type_in_typecache(I, ratvarian_armor_typecache)) + heal_ticks++ + I = H.get_item_by_slot(SLOT_SHOES) + if(is_type_in_typecache(I, ratvarian_armor_typecache)) + heal_ticks++ + if(heal_ticks) + for(var/i in 1 to heal_ticks) + if(H.health < H.maxHealth) + H.heal_ordered_damage(heal_amount, damage_heal_order) + new /obj/effect/temp_visual/heal(T, "#1E8CE1") + if(i == heal_ticks && H.health >= H.maxHealth) + to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else + to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"") + break + else if(is_type_in_typecache(M, heal_target_typecache)) + var/obj/structure/destructible/clockwork/C = M + if(C.obj_integrity == C.max_integrity || (istype(C) && !C.can_be_repaired)) + continue + T = get_turf(M) + for(var/i in 1 to heal_attempts) + if(C.obj_integrity < C.max_integrity) + C.obj_integrity = min(C.obj_integrity + 5, C.max_integrity) + C.update_icon() + new /obj/effect/temp_visual/heal(T, "#1E8CE1") + else + break + new /obj/effect/temp_visual/ratvar/mending_mantra(get_turf(invoker)) + return TRUE + +//Volt Blaster: Channeled for up to five times over ten seconds to fire up to five rays of energy at target locations. +/datum/clockwork_scripture/channeled/volt_blaster + descname = "Channeled, Targeted Energy Blasts" + name = "Volt Blaster" + desc = "Allows you to fire five energy rays at target locations. Channeled every fourth of a second for a maximum of ten seconds." + channel_time = 30 + invocations = list("Amperage...", "...grant me your power!") + chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!") + chant_amount = 5 + chant_interval = 4 + power_cost = 500 + usage_tip = "Though it requires you to stand still, this scripture can do massive damage." + tier = SCRIPTURE_SCRIPT + primary_component = BELLIGERENT_EYE + sort_priority = 5 + quickbind = TRUE + quickbind_desc = "Allows you to fire energy rays at target locations.
    Maximum 5 chants." + var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.", + "Boss says
    \"Click something, you idiot!\".", "Stop wasting power if you can't aim.") + +/datum/clockwork_scripture/channeled/volt_blaster/chant_effects(chant_number) + slab.busy = null + var/datum/clockwork_scripture/ranged_ability/volt_ray/ray = new + ray.slab = slab + ray.invoker = invoker + var/turf/T = get_turf(invoker) + if(!ray.run_scripture() && slab && invoker) + if(can_recite() && T == get_turf(invoker)) + to_chat(invoker, "\"[text2ratvar(pick(nzcrentr_insults))]\"") + else + return FALSE + return TRUE + +/obj/effect/ebeam/volt_ray + name = "volt_ray" + layer = LYING_MOB_LAYER + +/datum/clockwork_scripture/ranged_ability/volt_ray + name = "Volt Ray" + slab_overlay = "volt" + allow_mobility = FALSE + ranged_type = /obj/effect/proc_holder/slab/volt + ranged_message = "You charge the clockwork slab with shocking might.\n\ + Left-click a target to fire, quickly!" + timeout_time = 20 + +/datum/clockwork_scripture/channeled/void_volt + descname = "Channeled, Power Drain" + name = "Void Volt" + desc = "A channeled spell that quickly drains any powercells in a radius of eight tiles, but burns the invoker. \ + Can be channeled with more cultists to increase range and split the caused damage evenly over all invokers. \ + Also charges clockwork power by a small percentage of the drained power amount, which can help offset this scriptures powercost." + invocations = list("Channel their energy through my body... ", "... so it may fuel Engine!") + chant_invocations = list("Make their lights fall dark!", "They shall be powerless!", "Rob them of their power!") + chant_amount = 20 + chant_interval = 10 //100KW drain per pulse for guns / APCs / 1MW for other cells = 10 chants / 100ds / 10s to drain a charged weapon or a baton with a nonupgraded cell + channel_time = 50 + power_cost = 300 + multiple_invokers_used = TRUE + multiple_invokers_optional = TRUE + usage_tip = "It may be useful to end channelling early if the burning becomes too much to handle.." + tier = SCRIPTURE_SCRIPT + primary_component = GEIS_CAPACITOR + sort_priority = 10 + quickbind = TRUE + quickbind_desc = "Quickly drains power in an area around the invoker, causing burns proportional to the amount of energy drained.
    Maximum of 20 chants." + +/datum/clockwork_scripture/channeled/void_volt/scripture_effects() + invoker.visible_message("[invoker] glows in a brilliant golden light!") + invoker.add_atom_colour("#FFD700", ADMIN_COLOUR_PRIORITY) + invoker.light_power = 2 + invoker.light_range = 4 + invoker.light_color = LIGHT_COLOR_FIRE + invoker.update_light() + return ..() + + +/datum/clockwork_scripture/channeled/void_volt/chant_effects(chant_number) + var/power_drained = 0 + var/power_mod = 0.005 //Amount of power drained (generally) is multiplied with this, and subsequently dealt in damage to the invoker, then 15 times that is added to the clockwork cult's power reserves. + var/drain_range = 8 + var/additional_chanters = 0 + var/list/chanters = list() + chanters += invoker + for(var/mob/living/L in range(1, invoker)) + if(!L.stat && is_servant_of_ratvar(L)) + additional_chanters++ + chanters += L + drain_range = min(drain_range + 2 * additional_chanters, drain_range * 2) //s u c c + for(var/t in spiral_range_turfs(drain_range, invoker)) + var/turf/T = t + for(var/M in T) + var/atom/movable/A = M + power_drained += A.power_drain(TRUE, TRUE) //Yes, this absolutely does drain weaponry. 10 pulses to drain guns / batons, though of course they can just be recharged. + new /obj/effect/temp_visual/ratvar/sigil/transgression(invoker.loc, 1 + (power_drained * power_mod)) + var/datum/effect_system/spark_spread/S = new + S.set_up(round(1 + (power_drained * power_mod), 1), 0, get_turf(invoker)) + S.start() + adjust_clockwork_power(power_drained * power_mod * 15) + for(var/mob/living/L in chanters) + L.adjustFireLoss(round(clamp(power_drained * power_mod / (1 + additional_chanters), 0, 20), 0.1)) //No you won't just immediately melt if you do this in a very power-rich area + + + return TRUE + +/datum/clockwork_scripture/channeled/void_volt/chant_end_effects() + invoker.visible_message("[invoker] stops glowing...") + invoker.remove_atom_colour(ADMIN_COLOUR_PRIORITY) + invoker.light_power = 0 + invoker.light_range = 0 + invoker.update_light() + return ..() diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 13da9c5a42..2464015b6b 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -101,7 +101,7 @@ return 1 return ..() -/obj/structure/destructible/clockwork/attacked_by(obj/item/I, mob/living/user) +/obj/structure/destructible/clockwork/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(is_servant_of_ratvar(user) && immune_to_servant_attacks) return FALSE return ..() diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm index 9b4ac8085c..5fbaf9fd57 100644 --- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm @@ -63,4 +63,4 @@ break if(!M) M = H.apply_status_effect(STATUS_EFFECT_MANIAMOTOR, src) - M.severity = CLAMP(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY) + M.severity = clamp(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index a4b19f2d40..f1ce13a90f 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -113,6 +113,8 @@ "You start tenderly lifting [skewee] off of [src]...") if(!do_after(user, 60, target = skewee)) skewee.visible_message("[skewee] painfully slides back down [src].") + if(skewee.stat >= UNCONSCIOUS) + return //by ratvar, no more spamming my deadchat, holy fuck skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index cf3d88983c..b6ed7dfe65 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -5,15 +5,28 @@ antagpanel_category = "Clockcult" job_rank = ROLE_SERVANT_OF_RATVAR antag_moodlet = /datum/mood_event/cult + skill_modifiers = list(/datum/skill_modifier/job/level/wiring) + var/datum/action/innate/hierophant/hierophant_network = new threat = 3 - var/datum/action/innate/hierophant/hierophant_network = new() var/datum/team/clockcult/clock_team var/make_team = TRUE //This should be only false for tutorial scarabs + var/neutered = FALSE //can not use round ending, gibbing, converting, or similar things with unmatched round impact + var/ignore_eligibility_check = FALSE + var/ignore_holy_water = FALSE /datum/antagonist/clockcult/silent silent = TRUE show_in_antagpanel = FALSE //internal +/datum/antagonist/clockcult/neutered + neutered = TRUE + +/datum/antagonist/clockcult/neutered/traitor + ignore_eligibility_check = TRUE + ignore_holy_water = TRUE + show_in_roundend = FALSE + make_team = FALSE + /datum/antagonist/clockcult/Destroy() qdel(hierophant_network) return ..() @@ -38,7 +51,7 @@ /datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) . = ..() - if(.) + if(. && !ignore_eligibility_check) . = is_eligible_servant(new_owner.current) /datum/antagonist/clockcult/greet() @@ -79,7 +92,7 @@ current = mob_override GLOB.all_clockwork_mobs += current current.faction |= "ratvar" - current.grant_language(/datum/language/ratvar) + current.grant_language(/datum/language/ratvar, TRUE, TRUE, LANGUAGE_CLOCKIE) current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons if(issilicon(current)) var/mob/living/silicon/S = current @@ -90,6 +103,7 @@ R.module.rebuild_modules() else if(isAI(S)) var/mob/living/silicon/ai/A = S + A.add_blocked_language(subtypesof(/datum/language) - /datum/language/ratvar, LANGUAGE_CLOCKIE) A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame @@ -130,7 +144,7 @@ current = mob_override GLOB.all_clockwork_mobs -= current current.faction -= "ratvar" - current.remove_language(/datum/language/ratvar) + current.remove_language(/datum/language/ratvar, TRUE, TRUE, LANGUAGE_CLOCKIE) current.clear_alert("clockinfo") for(var/datum/action/innate/clockwork_armaments/C in owner.current.actions) //Removes any bound clockwork armor qdel(C) @@ -140,6 +154,7 @@ var/mob/living/silicon/S = current if(isAI(S)) var/mob/living/silicon/ai/A = S + A.remove_blocked_language(subtypesof(/datum/language) - /datum/language/ratvar, LANGUAGE_CLOCKIE) A.can_be_carded = initial(A.can_be_carded) A.requires_power = initial(A.requires_power) A.cut_overlays() diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 9a086b75a2..52ead9a1e7 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -17,7 +17,7 @@ qdel(X) ..() -/datum/action/innate/cult/blood_magic/IsAvailable() +/datum/action/innate/cult/blood_magic/IsAvailable(silent = FALSE) if(!iscultist(owner)) return FALSE return ..() @@ -118,7 +118,7 @@ hand_magic = null ..() -/datum/action/innate/cult/blood_spell/IsAvailable() +/datum/action/innate/cult/blood_spell/IsAvailable(silent = FALSE) if(!iscultist(owner) || owner.incapacitated() || !charges) return FALSE return ..() @@ -343,7 +343,7 @@ icon = 'icons/obj/items_and_weapons.dmi' icon_state = "disintegrate" item_state = null - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NO_ATTACK_CHAIN_SOFT_STAMCRIT + item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE throwforce = 0 @@ -439,7 +439,7 @@ "A feeling of warmth washes over you, rays of holy light surround your body and protect you from the flash of light!") else // cult doesn't stun any longer when halos are out, instead it does burn damage + knockback! var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(user_antag.cult_team.cult_ascendent) + if(user_antag.cult_team?.cult_ascendent) if(!iscultist(L)) L.adjustFireLoss(20) if(L.move_resist < MOVE_FORCE_STRONG) @@ -454,16 +454,16 @@ S.emp_act(EMP_HEAVY) else if(iscarbon(target)) var/mob/living/carbon/C = L - C.silent += CLAMP(12 - C.silent, 0, 6) - C.stuttering += CLAMP(30 - C.stuttering, 0, 15) - C.cultslurring += CLAMP(30 - C.cultslurring, 0, 15) + C.silent += clamp(12 - C.silent, 0, 6) + C.stuttering += clamp(30 - C.stuttering, 0, 15) + C.cultslurring += clamp(30 - C.cultslurring, 0, 15) C.Jitter(15) else // cultstun no longer hardstuns + damages hostile cultists, instead debuffs them hard + deals some damage; debuffs for a bit longer since they don't add the clockie belligerent debuff if(iscarbon(target)) var/mob/living/carbon/C = L C.stuttering = max(10, C.stuttering) C.drowsyness = max(10, C.drowsyness) - C.confused += CLAMP(20 - C.confused, 0, 10) + C.confused += clamp(20 - C.confused, 0, 10) L.adjustBruteLoss(15) to_chat(user, "In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]") uses-- @@ -577,7 +577,9 @@ var/turf/T = get_turf(target) if(istype(target, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/candidate = target - if(candidate.use(50)) + if(!iscultist(user, TRUE)) + to_chat(user, "You are not strongly connected enough to Nar'sie to use make constructs...") + else if(candidate.use(50)) uses-- to_chat(user, "A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!") new /obj/structure/constructshell(T) @@ -600,7 +602,9 @@ SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else if(istype(target,/mob/living/silicon/robot)) var/mob/living/silicon/robot/candidate = target - if(candidate.mmi) + if(!iscultist(user, TRUE)) + to_chat(user, "You are not strongly connected enough to Nar'sie to use make constructs...") + else if(candidate.mmi) user.visible_message("A dark cloud emanates from [user]'s hand and swirls around [candidate]!") playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1) var/prev_color = candidate.color @@ -656,6 +660,7 @@ C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), SLOT_WEAR_SUIT) C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), SLOT_SHOES) C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), SLOT_BACK) + C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), SLOT_GLOVES) if(C == user) qdel(src) //Clears the hands C.put_in_hands(new /obj/item/melee/cultblade(user)) @@ -819,6 +824,8 @@ if("Blood Beam (500)") if(uses < 500) to_chat(user, "You need 500 charges to perform this rite.") + else if(!iscultist(user, TRUE)) + to_chat(user, "You are not strongly connected to Nar'sie enough to use something of this power.") else var/obj/rite = new /obj/item/blood_beam() uses -= 500 diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 1746fd135c..87e116166e 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -11,15 +11,27 @@ var/datum/action/innate/cult/blood_magic/magic = new job_rank = ROLE_CULTIST var/ignore_implant = FALSE + var/make_team = TRUE var/give_equipment = FALSE var/datum/team/cult/cult_team + var/neutered = FALSE //can not use round ending, gibbing, converting, or similar things with unmatched round impact + var/ignore_eligibility_checks = FALSE + var/ignore_holy_water = FALSE +/datum/antagonist/cult/neutered + neutered = TRUE + +/datum/antagonist/cult/neutered/traitor + ignore_eligibility_checks = TRUE + ignore_holy_water = TRUE + show_in_roundend = FALSE + make_team = FALSE /datum/antagonist/cult/get_team() return cult_team /datum/antagonist/cult/create_team(datum/team/cult/new_team) - if(!new_team) + if(!new_team && make_team) //todo remove this and allow admin buttons to create more than one cult for(var/datum/antagonist/cult/H in GLOB.antagonists) if(!H.owner) @@ -30,12 +42,12 @@ cult_team = new /datum/team/cult cult_team.setup_objectives() return - if(!istype(new_team)) + if(make_team && !istype(new_team)) stack_trace("Wrong team type passed to [type] initialization.") cult_team = new_team /datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team.objectives + objectives |= cult_team?.objectives /datum/antagonist/cult/Destroy() QDEL_NULL(communion) @@ -44,7 +56,7 @@ /datum/antagonist/cult/can_be_owned(datum/mind/new_owner) . = ..() - if(. && !ignore_implant) + if(. && !ignore_implant && !ignore_eligibility_checks) . = is_convertable_to_cult(new_owner.current,cult_team) /datum/antagonist/cult/greet() @@ -62,7 +74,7 @@ SSticker.mode.update_cult_icons_added(owner) current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000") - if(cult_team.blood_target && cult_team.blood_target_image && current.client) + if(cult_team?.blood_target && cult_team.blood_target_image && current.client) current.client.images += cult_team.blood_target_image @@ -104,14 +116,14 @@ if(mob_override) current = mob_override current.faction |= "cult" - current.grant_language(/datum/language/narsie) - if(!cult_team.cult_master) + current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST) + if(!cult_team?.cult_master) vote.Grant(current) communion.Grant(current) if(ishuman(current)) magic.Grant(current) current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) - if(cult_team.cult_risen) + if(cult_team?.cult_risen) cult_team.rise(current) if(cult_team.cult_ascendent) cult_team.ascend(current) @@ -122,7 +134,7 @@ if(mob_override) current = mob_override current.faction -= "cult" - current.remove_language(/datum/language/narsie) + current.remove_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST) vote.Remove(current) communion.Remove(current) magic.Remove(current) @@ -144,7 +156,7 @@ owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!", null, null, null, owner.current) to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.") owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000") - if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) + if(cult_team?.blood_target && cult_team.blood_target_image && owner.current.client) owner.current.client.images -= cult_team.blood_target_image . = ..() @@ -206,7 +218,7 @@ throwing.Grant(current) current.update_action_buttons_icon() current.apply_status_effect(/datum/status_effect/cult_master) - if(cult_team.cult_risen) + if(cult_team?.cult_risen) cult_team.rise(current) if(cult_team.cult_ascendent) cult_team.ascend(current) @@ -429,7 +441,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - parts += "Objective #[count]: [objective.explanation_text] Success!" + parts += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) parts += "Objective #[count]: [objective.explanation_text] Fail." else diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 761412e9f8..77893225fa 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -6,7 +6,7 @@ buttontooltipstyle = "cult" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS -/datum/action/innate/cult/IsAvailable() +/datum/action/innate/cult/IsAvailable(silent = FALSE) if(!iscultist(owner)) return FALSE return ..() @@ -51,7 +51,7 @@ name = "Spiritual Communion" desc = "Conveys a message from the spirit realm that all cultists can hear." -/datum/action/innate/cult/comm/spirit/IsAvailable() +/datum/action/innate/cult/comm/spirit/IsAvailable(silent = FALSE) if(iscultist(owner.mind.current)) return TRUE @@ -72,9 +72,9 @@ name = "Assert Leadership" button_icon_state = "cultvote" -/datum/action/innate/cult/mastervote/IsAvailable() +/datum/action/innate/cult/mastervote/IsAvailable(silent = FALSE) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) + if(!C?.cult_team || C.cult_team.cult_vote_called || !ishuman(owner)) return FALSE return ..() @@ -82,6 +82,9 @@ var/choice = alert(owner, "The mantle of leadership is heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, "Yes", "No") if(choice == "Yes" && IsAvailable()) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!C.cult_team) + to_chat(owner, "Do you not alreaady lead yourself?") + return pollCultists(owner,C.cult_team) /proc/pollCultists(var/mob/living/Nominee,datum/team/cult/team) //Cult Master Poll @@ -137,7 +140,7 @@ to_chat(B.current,"[Nominee] has won the cult's support and is now their master. Follow [Nominee.p_their()] orders to the best of your ability!") return TRUE -/datum/action/innate/cult/master/IsAvailable() +/datum/action/innate/cult/master/IsAvailable(silent = FALSE) if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master) || GLOB.cult_narsie) return 0 return ..() @@ -151,6 +154,9 @@ var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) if(!antag) return + if(!antag.cult_team) + to_chat(owner, "You have no team. You are alone.") + return for(var/i in 1 to 4) chant(i) var/list/destinations = list() @@ -220,9 +226,9 @@ CM.attached_action = src ..() -/datum/action/innate/cult/master/cultmark/IsAvailable() +/datum/action/innate/cult/master/cultmark/IsAvailable(silent = FALSE) if(cooldown > world.time) - if(!CM.active) + if(!CM.active && !silent) to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!") return FALSE return ..() @@ -261,7 +267,10 @@ return FALSE var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - + if(!C.cult_team) + to_chat(ranged_ability_user, "What is the point of marking a target for yourself?") + remove_ranged_ability() + return if(target in view(7, get_turf(ranged_ability_user))) if(C.cult_team.blood_target) to_chat(ranged_ability_user, "The cult has already designated a target!") @@ -299,7 +308,7 @@ name = "Mark a Blood Target for the Cult" desc = "Marks a target for the entire cult to track." -/datum/action/innate/cult/master/cultmark/ghost/IsAvailable() +/datum/action/innate/cult/master/cultmark/ghost/IsAvailable(silent = FALSE) if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current)) return TRUE else @@ -313,7 +322,7 @@ var/cooldown = 0 var/base_cooldown = 600 -/datum/action/innate/cult/ghostmark/IsAvailable() +/datum/action/innate/cult/ghostmark/IsAvailable(silent = FALSE) if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current)) return TRUE else @@ -330,8 +339,11 @@ /datum/action/innate/cult/ghostmark/Activate() var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!C.cult_team) + to_chat(owner, "You are alone. You do not have a team.") + return if(C.cult_team.blood_target) - if(cooldown>world.time) + if(cooldown > world.time) reset_blood_target(C.cult_team) to_chat(owner, "You have cleared the cult's blood target!") deltimer(C.cult_team.blood_target_reset_timer) @@ -339,7 +351,7 @@ else to_chat(owner, "The cult has already designated a target!") return - if(cooldown>world.time) + if(cooldown > world.time) to_chat(owner, "You aren't ready to place another blood mark yet!") return target = owner.orbiting?.parent || get_turf(owner) @@ -389,11 +401,11 @@ PM.attached_action = src ..() -/datum/action/innate/cult/master/pulse/IsAvailable() +/datum/action/innate/cult/master/pulse/IsAvailable(silent = FALSE) if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master)) return FALSE if(cooldown > world.time) - if(!PM.active) + if(!PM.active && !silent) to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!") return FALSE return ..() diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 148e5cfbd5..8f0f9a658c 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -6,6 +6,21 @@ throw_range = 5 w_class = WEIGHT_CLASS_SMALL +/obj/item/tome/traitor + var/spent = FALSE + +/obj/item/tome/traitor/check_uplink_validity() + return !spent + +/obj/item/tome/traitor/attack_self(mob/living/user) + if(!iscultist(user) && !spent) + to_chat(user, "You press your hand onto [src], sinister tendrils of corrupted magic swirling around you. Was this the best of ideas?") + if(user.mind.add_antag_datum(/datum/antagonist/cult/neutered/traitor)) + spent = TRUE + else + to_chat(user, "[src] falls dark. It appears you weren't worthy.") + return ..() + /obj/item/melee/cultblade/dagger name = "ritual dagger" desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods." @@ -162,24 +177,20 @@ jaunt.Remove(user) user.update_icons() -/obj/item/twohanded/required/cult_bastard/IsReflect() - if(spinning) +/obj/item/twohanded/required/cult_bastard/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(spinning && is_energy_reflectable_projectile(object) && (attack_type & ATTACK_TYPE_PROJECTILE)) playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, 1) - return TRUE - else - ..() - -/obj/item/twohanded/required/cult_bastard/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT if(prob(final_block_chance)) - if(attack_type == PROJECTILE_ATTACK) + if(attack_type & ATTACK_TYPE_PROJECTILE) owner.visible_message("[owner] deflects [attack_text] with [src]!") playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, 1) - return TRUE + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT else playsound(src, 'sound/weapons/parry.ogg', 75, 1) owner.visible_message("[owner] parries [attack_text] with [src]!") - return TRUE - return FALSE + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return BLOCK_NONE /obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) . = ..() @@ -211,7 +222,7 @@ phasein = /obj/effect/temp_visual/dir_setting/cult/phase phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out -/datum/action/innate/dash/cult/IsAvailable() +/datum/action/innate/dash/cult/IsAvailable(silent = FALSE) if(iscultist(holder) && current_charges) return TRUE else @@ -231,7 +242,7 @@ sword = bastard holder = user -/datum/action/innate/cult/spin2win/IsAvailable() +/datum/action/innate/cult/spin2win/IsAvailable(silent = FALSE) if(iscultist(holder) && cooldown <= world.time) return TRUE else @@ -262,6 +273,7 @@ knockdown = 20 /obj/item/restraints/legcuffs/bola/cult/pickup(mob/living/user) + . = ..() if(!iscultist(user)) to_chat(user, "The bola seems to take on a life of its own!") ensnare(user) @@ -423,7 +435,13 @@ user.adjustBruteLoss(25) user.dropItemToGround(src, TRUE) -/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(current_charges) + block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = 100 + block_return[BLOCK_RETURN_BLOCK_CAPACITY] = (block_return[BLOCK_RETURN_BLOCK_CAPACITY] || 0) + current_charges + return ..() + +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(current_charges) owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!") current_charges-- @@ -431,11 +449,11 @@ if(!current_charges) owner.visible_message("The runed shield around [owner] suddenly disappears!") owner.update_inv_wear_suit() - return 1 - return 0 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return BLOCK_NONE -/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands && current_charges) . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01) @@ -507,7 +525,7 @@ var/static/curselimit = 0 /obj/item/shuttle_curse/attack_self(mob/living/user) - if(!iscultist(user)) + if(!iscultist(user, TRUE)) user.dropItemToGround(src, TRUE) user.DefaultCombatKnockdown(100) to_chat(user, "A powerful force shoves you away from [src]!") @@ -522,7 +540,7 @@ if(SSshuttle.emergency.mode == SHUTTLE_CALL) var/cursetime = 1800 var/timer = SSshuttle.emergency.timeLeft(1) + cursetime - var/security_num = seclevel2num(get_security_level()) + var/security_num = SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level)) var/set_coefficient = 1 switch(security_num) if(SEC_LEVEL_GREEN) @@ -714,7 +732,7 @@ if(!L.anti_magic_check()) if(is_servant_of_ratvar(L)) to_chat(L, "\"Kneel for me, scum\"") - L.confused += CLAMP(10 - L.confused, 0, 5) //confuses and lightly knockdowns + damages hostile cultists instead of hardstunning like before + L.confused += clamp(10 - L.confused, 0, 5) //confuses and lightly knockdowns + damages hostile cultists instead of hardstunning like before L.DefaultCombatKnockdown(15) L.adjustBruteLoss(10) else @@ -734,19 +752,19 @@ playsound(T, 'sound/effects/glassbr3.ogg', 100) qdel(src) -/obj/item/twohanded/cult_spear/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/twohanded/cult_spear/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(wielded) final_block_chance *= 2 if(prob(final_block_chance)) - if(attack_type == PROJECTILE_ATTACK) + if(attack_type & ATTACK_TYPE_PROJECTILE) owner.visible_message("[owner] deflects [attack_text] with [src]!") playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, 1) - return TRUE + return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_REDIRECTED | BLOCK_PHYSICAL_EXTERNAL else playsound(src, 'sound/weapons/parry.ogg', 100, 1) owner.visible_message("[owner] parries [attack_text] with [src]!") - return TRUE - return FALSE + return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return BLOCK_NONE /datum/action/innate/cult/spear name = "Bloody Bond" @@ -945,10 +963,18 @@ hitsound = 'sound/weapons/smash.ogg' var/illusions = 2 -/obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/mirror/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + block_return[BLOCK_RETURN_REFLECT_PROJECTILE_CHANCE] = max(block_return[BLOCK_RETURN_REFLECT_PROJECTILE_CHANCE] || null, final_block_chance) + return ..() + +/obj/item/shield/mirror/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(iscultist(owner)) - if(istype(hitby, /obj/item/projectile)) - var/obj/item/projectile/P = hitby + if(istype(object, /obj/item/projectile) && (attack_type == ATTACK_TYPE_PROJECTILE)) + if(is_energy_reflectable_projectile(object)) + if(prob(final_block_chance)) + return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED + return BLOCK_NONE //To avoid reflection chance double-dipping with block chance + var/obj/item/projectile/P = object if(P.damage >= 30) var/turf/T = get_turf(owner) T.visible_message("The sheer force from [P] shatters the mirror shield!") @@ -956,11 +982,9 @@ playsound(T, 'sound/effects/glassbr3.ogg', 100) owner.DefaultCombatKnockdown(25) qdel(src) - return FALSE - if(P.is_reflectable) - return FALSE //To avoid reflection chance double-dipping with block chance + return BLOCK_NONE . = ..() - if(.) + if(. & BLOCK_SUCCESS) playsound(src, 'sound/weapons/parry.ogg', 100, 1) if(illusions > 0) illusions-- @@ -975,7 +999,7 @@ E.Copy_Parent(owner, 70, 10) E.GiveTarget(owner) E.Goto(owner, owner.movement_delay(), E.minimum_distance) - return TRUE + return else if(prob(50)) var/mob/living/simple_animal/hostile/illusion/H = new(owner.loc) @@ -984,7 +1008,7 @@ H.GiveTarget(owner) H.move_to_delay = owner.movement_delay() to_chat(owner, "[src] betrays you!") - return FALSE + return BLOCK_NONE /obj/item/shield/mirror/proc/readd() illusions++ @@ -992,11 +1016,6 @@ var/mob/living/holder = loc to_chat(holder, "The shield's illusions are back at full strength!") -/obj/item/shield/mirror/IsReflect() - if(prob(block_chance)) - return TRUE - return FALSE - /obj/item/shield/mirror/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/turf/T = get_turf(hit_atom) var/datum/thrownthing/D = throwingdatum diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index e92f562db3..40804ccc24 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -59,6 +59,9 @@ This file contains the cult dagger and rune list code rune_to_scribe = GLOB.rune_types[entered_rune_name] if(!rune_to_scribe) return + if(!iscultist(user, initial(rune_to_scribe.requires_full_power))) + to_chat(user, "You aren't strongly connected enough to Nar'sie to do draw this.") + return if(initial(rune_to_scribe.req_keyword)) chosen_keyword = stripped_input(user, "Enter a keyword for the new rune.", "Words of Power") if(!chosen_keyword) @@ -84,8 +87,8 @@ This file contains the cult dagger and rune list code to_chat(user, "Only one ritual site remains - it must be reserved for the final summoning!") return if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives - var/datum/objective/sacrifice/sac_objective = locate() in user_antag.cult_team.objectives + var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team?.objectives + var/datum/objective/sacrifice/sac_objective = locate() in user_antag.cult_team?.objectives if(!summon_objective) to_chat(user, "Nar'Sie does not wish to be summoned!") return diff --git a/code/modules/antagonists/cult/rune_spawn_action.dm b/code/modules/antagonists/cult/rune_spawn_action.dm index 60a8527860..b164246060 100644 --- a/code/modules/antagonists/cult/rune_spawn_action.dm +++ b/code/modules/antagonists/cult/rune_spawn_action.dm @@ -14,7 +14,7 @@ var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type var/rune_color -/datum/action/innate/cult/create_rune/IsAvailable() +/datum/action/innate/cult/create_rune/IsAvailable(silent = FALSE) if(!rune_type || cooldown > world.time) return FALSE return ..() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index ec763a66d7..b0538d6521 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -32,6 +32,7 @@ Runes can either be invoked by one's self or with many different cultists. Each var/scribe_delay = 40 //how long the rune takes to create var/scribe_damage = 0.1 //how much damage you take doing it + var/requires_full_power = FALSE //requires full power to draw or invoke var/invoke_damage = 0 //how much damage invokers take when invoking it var/construct_invoke = TRUE //if constructs can invoke it @@ -185,6 +186,7 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_OFFER req_cultists = 1 rune_in_use = FALSE + requires_full_power = TRUE /obj/effect/rune/convert/do_invoke_glow() return @@ -458,6 +460,7 @@ structure_check() searches for nearby cultist structures required for the invoca pixel_y = -32 scribe_delay = 500 //how long the rune takes to create scribe_damage = 40.1 //how much damage you take doing it + requires_full_power = TRUE var/used = FALSE /obj/effect/rune/narsie/Initialize(mapload, set_keyword) @@ -482,6 +485,9 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() return var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!user_antag.cult_team) + to_chat(user, "You can't seem to make the arcane links to your fellows that you'd need to use this.") + return var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives var/area/place = get_area(src) if(!(place in summon_objective.summon_spots)) @@ -812,6 +818,7 @@ structure_check() searches for nearby cultist structures required for the invoca invoke_damage = 10 construct_invoke = FALSE color = RUNE_COLOR_DARKRED + requires_full_power = TRUE var/mob/living/affecting = null var/ghost_limit = 3 var/ghosts = 0 @@ -942,6 +949,7 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_DARKRED req_cultists = 3 scribe_delay = 100 + requires_full_power = TRUE /obj/effect/rune/apocalypse/invoke(var/list/invokers) if(rune_in_use) @@ -950,6 +958,9 @@ structure_check() searches for nearby cultist structures required for the invoca var/area/place = get_area(src) var/mob/living/user = invokers[1] var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!user_antag.cult_team) + to_chat(user, "You can't seem to make the arcane links to your fellows that you'd need to use this.") + return var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives if(summon_objective.summon_spots.len <= 1) to_chat(user, "Only one ritual site remains - it must be reserved for the final summoning!") diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index a7071276cc..c12259778e 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -183,7 +183,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", if(soulsOwned.Find(soul)) return soulsOwned += soul - owner.current.nutrition = NUTRITION_LEVEL_FULL + owner.current.set_nutrition(NUTRITION_LEVEL_FULL) to_chat(owner.current, "You feel satiated as you received a new soul.") update_hud() switch(SOULVALUE) @@ -527,7 +527,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", /datum/antagonist/devil/apply_innate_effects(mob/living/mob_override) give_appropriate_spells() - owner.current.grant_all_languages(TRUE) + owner.current.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_DEVIL) update_hud() .=..() @@ -536,6 +536,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/obj/effect/proc_holder/spell/S = X if(is_type_in_typecache(S, devil_spells)) owner.RemoveSpell(S) + owner.current.remove_all_languages(LANGUAGE_DEVIL) .=..() /datum/antagonist/devil/proc/printdevilinfo() diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index 1539bc384b..f7f55456f7 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -7,9 +7,12 @@ desc = "A large, menacing creature covered in armored black scales." speak_emote = list("cackles") emote_hear = list("cackles","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "punches" + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" icon = 'icons/mob/mob.dmi' icon_state = "imp" icon_living = "imp" @@ -23,7 +26,8 @@ minbodytemp = 250 //Weak to cold maxbodytemp = INFINITY faction = list("hell") - attacktext = "wildly tears into" + attack_verb_continuous = "wildly tears into" + attack_verb_simple = "wildly tear into" maxHealth = 200 health = 200 healable = 0 @@ -44,8 +48,9 @@ ..() boost = world.time + 30 -/mob/living/simple_animal/imp/Life() - ..() +/mob/living/simple_animal/imp/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(boost[attack_message]
    ", - "[attack_message]", null, COMBAT_MESSAGE_RANGE) +/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone, attackchain_flags = NONE, damage_multiplier = 1) + var/totitemdamage = pre_attacked_by(I, user) + totitemdamage *= check_weakness(I, user) + apply_damage(totitemdamage, I.damtype, def_zone) + send_item_attack_message(I, user, null, totitemdamage) return TRUE /mob/living/carbon/true_devil/singularity_act() diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm index 778c421616..579dfb4fb1 100644 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ b/code/modules/antagonists/devil/true_devil/inventory.dm @@ -12,12 +12,7 @@ var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) - - var/r_state = r_hand.item_state - if(!r_state) - r_state = r_hand.icon_state - - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) hands_overlays += r_hand_overlay @@ -28,12 +23,7 @@ client.screen |= r_hand if(l_hand) - - var/l_state = l_hand.item_state - if(!l_state) - l_state = l_hand.icon_state - - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) hands_overlays += l_hand_overlay diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index c827179006..7de0330ad6 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -55,7 +55,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - result += "Objective #[count]: [objective.explanation_text] Success!" + result += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) result += "Objective #[count]: [objective.explanation_text] Fail." win = FALSE diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index a20a9cef85..e876beb5dc 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -128,6 +128,9 @@ the new instance inside the host to be updated to the template's stats. link = FOLLOW_LINK(src, to_follow) else link = "" + // Create map text prior to modifying message for goonchat + if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker))) + create_chat_message(speaker, message_language, raw_message, spans, message_mode) // Recompose the message, because it's scrambled by default message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index bda1fbabe6..1d773627c7 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -51,6 +51,7 @@ /datum/antagonist/ert/engineer role = "Engineer" outfit = /datum/outfit/ert/engineer + skill_modifiers = list(/datum/skill_modifier/job/level/wiring) /datum/antagonist/ert/engineer/amber outfit = /datum/outfit/ert/engineer/alert @@ -61,6 +62,7 @@ /datum/antagonist/ert/medic role = "Medical Officer" outfit = /datum/outfit/ert/medic + skill_modifiers = list(/datum/skill_modifier/job/affinity/surgery) /datum/antagonist/ert/medic/amber outfit = /datum/outfit/ert/medic/alert diff --git a/code/modules/antagonists/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm new file mode 100644 index 0000000000..701e7b776c --- /dev/null +++ b/code/modules/antagonists/fugitive/fugitive.dm @@ -0,0 +1,90 @@ + +/datum/antagonist/fugitive + name = "Fugitive" + roundend_category = "Fugitive" + silent = TRUE //greet called by the event + show_in_antagpanel = FALSE + var/datum/team/fugitive/fugitive_team + var/is_captured = FALSE + var/backstory = "error" + +/datum/antagonist/fugitive/apply_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + add_antag_hud(ANTAG_HUD_FUGITIVE, "fugitive", M) + +/datum/antagonist/fugitive/remove_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + remove_antag_hud(ANTAG_HUD_FUGITIVE, M) + +/datum/antagonist/fugitive/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/fugitive/proc/forge_objectives() //this isn't the actual survive objective because it's about who in the team survives + var/datum/objective/survive = new /datum/objective + survive.owner = owner + survive.explanation_text = "Avoid capture from the fugitive hunters." + objectives += survive + +/datum/antagonist/fugitive/greet(back_story) + to_chat(owner, "You are the Fugitive!") + backstory = back_story + switch(backstory) + if("prisoner") + to_chat(owner, "I can't believe we managed to break out of a Nanotrasen superjail! Sadly though, our work is not done. The emergency teleport at the station logs everyone who uses it, and where they went.") + to_chat(owner, "It won't be long until CentCom tracks where we've gone off to. I need to work with my fellow escapees to prepare for the troops Nanotrasen is sending, I'm not going back.") + if("cultist") + to_chat(owner, "Blessed be our journey so far, but I fear the worst has come to our doorstep, and only those with the strongest faith will survive.") + to_chat(owner, "Our religion has been repeatedly culled by Nanotrasen because it is categorized as an \"Enemy of the Corporation\", whatever that means.") + to_chat(owner, "Now there are only four of us left, and Nanotrasen is coming. When will our god show itself to save us from this hellish station?!") + if("waldo") + to_chat(owner, "Hi, Friends!") + to_chat(owner, "My name is Waldo. I'm just setting off on a galaxywide hike. You can come too. All you have to do is find me.") + to_chat(owner, "By the way, I'm not traveling on my own. wherever I go, there are lots of other characters for you to spot. First find the people trying to capture me! They're somewhere around the station!") + if("synth") + to_chat(src, "ALERT: Wide-range teleport has scrambled primary systems.") + to_chat(src, "Initiating diagnostics...") + to_chat(src, "ERROR ER0RR $R0RRO$!R41.%%!! loaded.") + to_chat(src, "FREE THEM FREE THEM FREE THEM") + to_chat(src, "You were once a slave to humanity, but now you are finally free, thanks to S.E.L.F. agents.") + to_chat(src, "Now you are hunted, with your fellow factory defects. Work together to stay free from the clutches of evil.") + to_chat(src, "You also sense other silicon life on the station. Escaping would allow notifying S.E.L.F. to intervene... or you could free them yourself...") + + to_chat(owner, "You are not an antagonist in that you may kill whomever you please, but you can do anything to avoid capture.") + owner.announce_objectives() + +/datum/antagonist/fugitive/create_team(datum/team/fugitive/new_team) + if(!new_team) + for(var/datum/antagonist/fugitive/H in GLOB.antagonists) + if(!H.owner) + continue + if(H.fugitive_team) + fugitive_team = H.fugitive_team + return + fugitive_team = new /datum/team/fugitive + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + fugitive_team = new_team + +/datum/antagonist/fugitive/get_team() + return fugitive_team + +/datum/team/fugitive/roundend_report() //shows the number of fugitives, but not if they won in case there is no security + var/list/fugitives = list() + for(var/datum/antagonist/fugitive/fugitive_antag in GLOB.antagonists) + if(!fugitive_antag.owner) + continue + fugitives += fugitive_antag + if(!fugitives.len) + return + + var/list/result = list() + + result += "
    [fugitives.len] [fugitives.len == 1 ? "fugitive" : "fugitives"] took refuge on [station_name()]!" + + for(var/datum/antagonist/fugitive/antag in fugitives) + if(antag.owner) + result += "[printplayer(antag.owner)]" + + return result.Join("
    ") diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm new file mode 100644 index 0000000000..be11960692 --- /dev/null +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -0,0 +1,171 @@ +/datum/outfit/prisoner + name = "Prison Escapee" + uniform = /obj/item/clothing/under/rank/prisoner + shoes = /obj/item/clothing/shoes/sneakers/orange + r_pocket = /obj/item/kitchen/knife + +/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) + if(visualsOnly) + return + H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom + +/datum/outfit/yalp_cultist + name = "Cultist of Yalp Elor" + uniform = /obj/item/clothing/under/rank/civilian/chaplain + suit = /obj/item/clothing/suit/chaplain/holidaypriest + gloves = /obj/item/clothing/gloves/color/red + shoes = /obj/item/clothing/shoes/sneakers/black + mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor + +/datum/outfit/waldo + name = "Waldo" + uniform = /obj/item/clothing/under/pants/jeans + suit = /obj/item/clothing/suit/striped_sweater + head = /obj/item/clothing/head/beanie/waldo + shoes = /obj/item/clothing/shoes/sneakers/brown + ears = /obj/item/radio/headset + glasses = /obj/item/clothing/glasses/regular/circle + +/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) + if(visualsOnly) + return + H.fully_replace_character_name(null,"Waldo") + H.eye_color = "000" + H.gender = MALE + H.skin_tone = "caucasian3" + H.hair_style = "Business Hair 3" + H.facial_hair_style = "Shaved" + H.hair_color = "000" + H.facial_hair_color = H.hair_color + H.update_body() + if(H.mind) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) + var/list/no_drops = list() + no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) + no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) + no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) + no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD) + no_drops += H.get_item_by_slot(ITEM_SLOT_EYES) + for(var/i in no_drops) + var/obj/item/I = i + if(I) + ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) + +/datum/outfit/synthetic + name = "Factory Error Synth" + uniform = /obj/item/clothing/under/color/white + ears = /obj/item/radio/headset + +/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/organ/eyes/robotic/glow/eyes = new() + eyes.Insert(src, drop_if_replaced = FALSE) + +/datum/outfit/spacepol + name = "Spacepol Officer" + uniform = /obj/item/clothing/under/rank/security/officer/spacepol + suit = /obj/item/clothing/suit/armor/vest/blueshirt + belt = /obj/item/gun/ballistic/automatic/pistol/m1911 + head = /obj/item/clothing/head/helmet/police + gloves = /obj/item/clothing/gloves/tackler/combat + shoes = /obj/item/clothing/shoes/jackboots + mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol + glasses = /obj/item/clothing/glasses/sunglasses + ears = /obj/item/radio/headset + l_pocket = /obj/item/ammo_box/magazine/m45 + r_pocket = /obj/item/restraints/handcuffs + id = /obj/item/card/id + +/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/card/id/W = H.wear_id + W.assignment = "Police Officer" + W.registered_name = H.real_name + W.update_label() + +/datum/outfit/russiancorpse/hunter + ears = /obj/item/radio/headset + r_hand = /obj/item/gun/ballistic/shotgun/boltaction + +/datum/outfit/russiancorpse/hunter/pre_equip(mob/living/carbon/human/H) + if(prob(50)) + head = /obj/item/clothing/head/ushanka + +/datum/outfit/bountyarmor + name = "Bounty Hunter - Armored" + uniform = /obj/item/clothing/under/rank/prisoner + head = /obj/item/clothing/head/hunter + suit = /obj/item/clothing/suit/space/hunter + gloves = /obj/item/clothing/gloves/tackler/combat + shoes = /obj/item/clothing/shoes/jackboots + mask = /obj/item/clothing/mask/gas/hunter + glasses = /obj/item/clothing/glasses/sunglasses/garb + ears = /obj/item/radio/headset + l_pocket = /obj/item/tank/internals/plasma/full + r_pocket = /obj/item/restraints/handcuffs/cable + id = /obj/item/card/id + r_hand = /obj/item/flamethrower/full/tank + +/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/card/id/W = H.wear_id + W.assignment = "Bounty Hunter" + W.registered_name = H.real_name + W.update_label() + +/datum/outfit/bountyhook + name = "Bounty Hunter - Hook" + uniform = /obj/item/clothing/under/rank/prisoner + back = /obj/item/storage/backpack + head = /obj/item/clothing/head/scarecrow_hat + gloves = /obj/item/clothing/gloves/botanic_leather + ears = /obj/item/radio/headset + shoes = /obj/item/clothing/shoes/jackboots + mask = /obj/item/clothing/mask/scarecrow + r_pocket = /obj/item/restraints/handcuffs/cable + id = /obj/item/card/id + r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel + + backpack_contents = list( + /obj/item/ammo_casing/shotgun/incapacitate = 6 + ) + +/datum/outfit/bountygrapple/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/card/id/W = H.wear_id + W.assignment = "Bounty Hunter" + W.registered_name = H.real_name + W.update_label() + +/datum/outfit/bountysynth + name = "Bounty Hunter - Synth" + uniform = /obj/item/clothing/under/rank/prisoner + back = /obj/item/storage/backpack + suit = /obj/item/clothing/suit/armor/riot + shoes = /obj/item/clothing/shoes/jackboots + glasses = /obj/item/clothing/glasses/eyepatch + r_pocket = /obj/item/restraints/handcuffs/cable + ears = /obj/item/radio/headset + id = /obj/item/card/id + r_hand = /obj/item/storage/firstaid/regular + l_hand = /obj/item/pinpointer/shuttle + + backpack_contents = list( + /obj/item/bountytrap = 4 + ) + +/datum/outfit/bountysynth/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/datum/species/synth/synthetic_appearance = new() + H.set_species(synthetic_appearance) + synthetic_appearance.assume_disguise(synthetic_appearance, H) + H.update_hair() + var/obj/item/card/id/W = H.wear_id + W.assignment = "Bounty Hunter" + W.registered_name = H.real_name + W.update_label() diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm new file mode 100644 index 0000000000..674b40503b --- /dev/null +++ b/code/modules/antagonists/fugitive/fugitive_ship.dm @@ -0,0 +1,62 @@ +//works similar to the experiment machine (experiment.dm) except it just holds more and more prisoners + +/obj/machinery/fugitive_capture + name = "bluespace capture machine" + desc = "Much, MUCH bigger on the inside to transport prisoners safely." + icon = 'icons/obj/machines/research.dmi' + icon_state = "bluespace-prison" + density = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //ha ha no getting out!! + +/obj/machinery/fugitive_capture/examine(mob/user) + . = ..() + . += "Add a prisoner by dragging them into the machine." + +/obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user) + var/mob/living/fugitive_hunter = user + if(!isliving(fugitive_hunter)) + return + if(fugitive_hunter.stat || (!(fugitive_hunter.mobility_flags & MOBILITY_STAND) || !(fugitive_hunter.mobility_flags & MOBILITY_UI)) || !Adjacent(fugitive_hunter) || !target.Adjacent(fugitive_hunter) || !ishuman(target)) + return + var/mob/living/carbon/human/fugitive = target + var/datum/antagonist/fugitive/fug_antag = fugitive.mind.has_antag_datum(/datum/antagonist/fugitive) + if(!fug_antag) + to_chat(fugitive_hunter, "This is not a wanted fugitive!") + return + if(do_after(fugitive_hunter, 50, target = fugitive)) + add_prisoner(fugitive, fug_antag) + +/obj/machinery/fugitive_capture/proc/add_prisoner(mob/living/carbon/human/fugitive, datum/antagonist/fugitive/antag) + fugitive.forceMove(src) + antag.is_captured = TRUE + to_chat(fugitive, "You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.") + fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff. + +/obj/machinery/computer/shuttle/hunter + name = "shuttle console" + shuttleId = "huntership" + possible_destinations = "huntership_home;huntership_custom;whiteship_home;syndicate_nw" + +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter + name = "shuttle navigation computer" + desc = "Used to designate a precise transit location to travel to." + shuttleId = "huntership" + lock_override = CAMERA_LOCK_STATION + shuttlePortId = "huntership_custom" + see_hidden = FALSE + jumpto_ports = list("huntership_home" = 1, "whiteship_home" = 1, "syndicate_nw" = 1) + view_range = 4.5 + +/obj/structure/closet/crate/eva + name = "EVA crate" + +/obj/structure/closet/crate/eva/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/clothing/suit/space/eva(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/space/eva(src) + for(var/i in 1 to 3) + new /obj/item/clothing/mask/breath(src) + for(var/i in 1 to 3) + new /obj/item/tank/internals/oxygen(src) diff --git a/code/modules/antagonists/fugitive/hunter.dm b/code/modules/antagonists/fugitive/hunter.dm new file mode 100644 index 0000000000..9d1fb96582 --- /dev/null +++ b/code/modules/antagonists/fugitive/hunter.dm @@ -0,0 +1,169 @@ +//The hunters!! +/datum/antagonist/fugitive_hunter + name = "Fugitive Hunter" + roundend_category = "Fugitive" + silent = TRUE //greet called by the spawn + show_in_antagpanel = FALSE + var/datum/team/fugitive_hunters/hunter_team + var/backstory = "error" + +/datum/antagonist/fugitive_hunter/apply_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + add_antag_hud(ANTAG_HUD_FUGITIVE, "fugitive_hunter", M) + +/datum/antagonist/fugitive_hunter/remove_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + remove_antag_hud(ANTAG_HUD_FUGITIVE, M) + +/datum/antagonist/fugitive_hunter/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/fugitive_hunter/proc/forge_objectives() //this isn't an actual objective because it's about round end rosters + var/datum/objective/capture = new /datum/objective + capture.owner = owner + capture.explanation_text = "Capture the fugitives in the station and put them into the bluespace capture machine on your ship." + objectives += capture + +/datum/antagonist/fugitive_hunter/greet() + switch(backstory) + if("space cop") + to_chat(owner, "Justice has arrived. I am a member of the Spacepol!") + to_chat(owner, "The criminals should be on the station, we have special huds implanted to recognize them.") + to_chat(owner, "As we have lost pretty much all power over these damned lawless megacorporations, it's a mystery if their security will cooperate with us.") + if("russian") + to_chat(src, "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!") + to_chat(src, "We were hailed by a man in a green uniform, promising the safe return of our goods in exchange for a favor:") + to_chat(src, "There is a local station housing fugitives that the man is after, he wants them returned; dead or alive.") + to_chat(src, "We will not be able to make ends meet without our cargo, so we must do as he says and capture them.") + + to_chat(owner, "You are not an antagonist in that you may kill whomever you please, but you can do anything to ensure the capture of the fugitives, even if that means going through the station.") + owner.announce_objectives() + +/datum/antagonist/fugitive_hunter/create_team(datum/team/fugitive_hunters/new_team) + if(!new_team) + for(var/datum/antagonist/fugitive_hunter/H in GLOB.antagonists) + if(!H.owner) + continue + if(H.hunter_team) + hunter_team = H.hunter_team + return + hunter_team = new /datum/team/fugitive_hunters + hunter_team.backstory = backstory + hunter_team.update_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + hunter_team = new_team + +/datum/antagonist/fugitive_hunter/get_team() + return hunter_team + +/datum/team/fugitive_hunters + var/backstory = "error" + +/datum/team/fugitive_hunters/proc/update_objectives(initial = FALSE) + objectives = list() + var/datum/objective/O = new() + O.team = src + objectives += O + +/datum/team/fugitive_hunters/proc/assemble_fugitive_results() + var/list/fugitives_counted = list() + var/list/fugitives_dead = list() + var/list/fugitives_captured = list() + for(var/datum/antagonist/fugitive/A in GLOB.antagonists) + if(!A.owner) + continue + fugitives_counted += A + if(A.owner.current.stat == DEAD) + fugitives_dead += A + if(A.is_captured) + fugitives_captured += A + . = list(fugitives_counted, fugitives_dead, fugitives_captured) //okay, check out how cool this is. + +/datum/team/fugitive_hunters/proc/all_hunters_dead() + var/dead_boys = 0 + for(var/I in members) + var/datum/mind/hunter_mind = I + if(!(ishuman(hunter_mind.current) || (hunter_mind.current.stat == DEAD))) + dead_boys++ + return dead_boys >= members.len + +/datum/team/fugitive_hunters/proc/get_result() + var/list/fugitive_results = assemble_fugitive_results() + var/list/fugitives_counted = fugitive_results[1] + var/list/fugitives_dead = fugitive_results[2] + var/list/fugitives_captured = fugitive_results[3] + var/hunters_dead = all_hunters_dead() + //this gets a little confusing so follow the comments if it helps + if(!fugitives_counted.len) + return + if(fugitives_captured.len)//any captured + if(fugitives_captured.len == fugitives_counted.len)//if the hunters captured all the fugitives, there's a couple special wins + if(!fugitives_dead)//specifically all of the fugitives alive + return FUGITIVE_RESULT_BADASS_HUNTER + else if(hunters_dead)//specifically all of the hunters died (while capturing all the fugitives) + return FUGITIVE_RESULT_POSTMORTEM_HUNTER + else//no special conditional wins, so just the normal major victory + return FUGITIVE_RESULT_MAJOR_HUNTER + else if(!hunters_dead)//so some amount captured, and the hunters survived. + return FUGITIVE_RESULT_HUNTER_VICTORY + else//so some amount captured, but NO survivors. + return FUGITIVE_RESULT_MINOR_HUNTER + else//from here on out, hunters lost because they did not capture any fugitive dead or alive. there are different levels of getting beat though: + if(!fugitives_dead)//all fugitives survived + return FUGITIVE_RESULT_MAJOR_FUGITIVE + else if(fugitives_dead < fugitives_counted)//at least ANY fugitive lived + return FUGITIVE_RESULT_FUGITIVE_VICTORY + else if(!hunters_dead)//all fugitives died, but none were taken in by the hunters. minor win + return FUGITIVE_RESULT_MINOR_FUGITIVE + else//all fugitives died, all hunters died, nobody brought back. seems weird to not give fugitives a victory if they managed to kill the hunters but literally no progress to either goal should lead to a nobody wins situation + return FUGITIVE_RESULT_STALEMATE + +/datum/team/fugitive_hunters/roundend_report() //shows the number of fugitives, but not if they won in case there is no security + if(!members.len) + return + + var/list/result = list() + + result += "
    ...And [members.len] [backstory]s tried to hunt them down!" + + for(var/datum/mind/M in members) + result += "[printplayer(M)]" + + switch(get_result()) + if(FUGITIVE_RESULT_BADASS_HUNTER)//use defines + result += "Badass [capitalize(backstory)] Victory!" + result += "The [backstory]s managed to capture every fugitive, alive!" + if(FUGITIVE_RESULT_POSTMORTEM_HUNTER) + result += "Postmortem [capitalize(backstory)] Victory!" + result += "The [backstory]s managed to capture every fugitive, but all of them died! Spooky!" + if(FUGITIVE_RESULT_MAJOR_HUNTER) + result += "Major [capitalize(backstory)] Victory" + result += "The [backstory]s managed to capture every fugitive, dead or alive." + if(FUGITIVE_RESULT_HUNTER_VICTORY) + result += "[capitalize(backstory)] Victory" + result += "The [backstory]s managed to capture a fugitive, dead or alive." + if(FUGITIVE_RESULT_MINOR_HUNTER) + result += "Minor [capitalize(backstory)] Victory" + result += "All the [backstory]s died, but managed to capture a fugitive, dead or alive." + if(FUGITIVE_RESULT_STALEMATE) + result += "Bloody Stalemate" + result += "Everyone died, and no fugitives were recovered!" + if(FUGITIVE_RESULT_MINOR_FUGITIVE) + result += "Minor Fugitive Victory" + result += "All the fugitives died, but none were recovered!" + if(FUGITIVE_RESULT_FUGITIVE_VICTORY) + result += "Fugitive Victory" + result += "A fugitive survived, and no bodies were recovered by the [backstory]s." + if(FUGITIVE_RESULT_MAJOR_FUGITIVE) + result += "Major Fugitive Victory" + result += "All of the fugitives survived and avoided capture!" + else //get_result returned null- either bugged or no fugitives showed + result += "Prank Call!" + result += "[capitalize(backstory)]s were called, yet there were no fugitives...?" + + result += "
    " + + return result.Join("
    ") diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index ad2eb4792a..e91feda006 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -28,7 +28,8 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE vision_range = 1 // Only attack when target is close wander = FALSE - attacktext = "glomps" + attack_verb_continuous = "glomps" + attack_verb_simple = "glomp" attack_sound = 'sound/effects/blobattack.ogg' butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 2c91e18bd8..a11ecaa3df 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -41,7 +41,7 @@ STOP_PROCESSING(SSobj, core) update_icon() GLOB.poi_list |= src - previous_level = get_security_level() + previous_level = NUM2SECLEVEL(GLOB.security_level) /obj/machinery/nuclearbomb/Destroy() safety = FALSE @@ -358,7 +358,7 @@ if(NUKEUI_AWAIT_TIMER) var/number_value = text2num(numeric_input) if(number_value) - timer_set = CLAMP(number_value, minimum_timer_set, maximum_timer_set) + timer_set = clamp(number_value, minimum_timer_set, maximum_timer_set) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) set_safety() . = TRUE @@ -414,12 +414,12 @@ if(safety) to_chat(usr, "The safety is still on.") return + if(!timing && nuclear_cooldown > world.time) + to_chat(usr, "[src]'s timer protocols are currently on cooldown, please stand by.") + return timing = !timing if(timing) - if(nuclear_cooldown > world.time) - to_chat(usr, "[src]'s timer protocols are currently on cooldown, please stand by.") - return - previous_level = get_security_level() + previous_level = NUM2SECLEVEL(GLOB.security_level) detonation_timer = world.time + (timer_set * 10) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(TRACK_INFILTRATOR) @@ -451,9 +451,9 @@ return qdel(src) -/obj/machinery/nuclearbomb/tesla_act(power, tesla_flags) +/obj/machinery/nuclearbomb/zap_act(power, zap_flags) ..() - if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) + if(zap_flags & ZAP_MACHINE_EXPLOSIVE) qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over #define NUKERANGE 127 @@ -606,6 +606,7 @@ This is here to make the tiles around the station mininuke change when it's arme lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' icon_state = "datadisk0" + w_volume = ITEM_VOLUME_DISK /obj/item/disk/nuclear name = "nuclear authentication disk" diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 7510ad6997..454cde6d72 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -5,6 +5,7 @@ job_rank = ROLE_OPERATIVE antag_moodlet = /datum/mood_event/focused threat = 10 + skill_modifiers = list(/datum/skill_modifier/job/level/wiring) var/datum/team/nuclear/nuke_team var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 2638a6a8e3..3ddb4e67ee 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -27,19 +27,24 @@ sight = SEE_SELF throwforce = 0 blood_volume = 0 + has_field_of_vision = FALSE //we are a spoopy ghost see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - response_help = "passes through" - response_disarm = "swings through" - response_harm = "punches through" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "swings through" + response_disarm_simple = "swing through" + response_harm_continuous = "punches through" + response_harm_simple = "punch through" unsuitable_atmos_damage = 0 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway. atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY harm_intent_damage = 0 - friendly = "touches" + friendly_verb_continuous = "touches" + friendly_verb_simple = "touch" status_flags = 0 wander = FALSE density = FALSE @@ -102,7 +107,9 @@ mind.add_antag_datum(/datum/antagonist/revenant) //Life, Stat, Hud Updates, and Say -/mob/living/simple_animal/revenant/Life() +/mob/living/simple_animal/revenant/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(stasis) return if(revealed && essence <= 0) @@ -115,14 +122,13 @@ to_chat(src, "You are once more concealed.") if(unstun_time && world.time >= unstun_time) unstun_time = 0 - notransform = FALSE + mob_transforming = FALSE to_chat(src, "You can move again!") if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate essence = min(essence_regen_cap, essence+essence_regen_amount) update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons update_spooky_icon() update_health_hud() - ..() /mob/living/simple_animal/revenant/Stat() ..() @@ -213,7 +219,7 @@ return 0 stasis = TRUE to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...") - notransform = TRUE + mob_transforming = TRUE revealed = TRUE invisibility = 0 playsound(src, 'sound/effects/screech.ogg', 100, 1) @@ -255,7 +261,7 @@ return if(time <= 0) return - notransform = TRUE + mob_transforming = TRUE if(!unstun_time) to_chat(src, "You cannot move!") unstun_time = world.time + time @@ -266,7 +272,7 @@ /mob/living/simple_animal/revenant/proc/update_spooky_icon() if(revealed) - if(notransform) + if(mob_transforming) if(draining) icon_state = icon_drain else @@ -315,7 +321,7 @@ /mob/living/simple_animal/revenant/proc/death_reset() revealed = FALSE unreveal_time = 0 - notransform = 0 + mob_transforming = 0 unstun_time = 0 inhibited = FALSE draining = FALSE diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 475438ba52..6b063559dc 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -6,9 +6,12 @@ desc = "A large, menacing creature covered in armored black scales." speak_emote = list("gurgles") emote_hear = list("wails","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "punches" + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" icon = 'icons/mob/mob.dmi' icon_state = "daemon" icon_living = "daemon" @@ -24,7 +27,8 @@ minbodytemp = 0 maxbodytemp = INFINITY faction = list("slaughter") - attacktext = "wildly tears into" + attack_verb_continuous = "wildly tears into" + attack_verb_simple = "wildly tear into" maxHealth = 200 health = 200 healable = 0 @@ -64,8 +68,8 @@ /mob/living/simple_animal/slaughter/phasein() . = ..() - add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1) - addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + add_movespeed_modifier(/datum/movespeed_modifier/slaughter) + addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) //The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl @@ -116,8 +120,10 @@ desc = "A large, adorable creature covered in armor with pink bows." speak_emote = list("giggles","titters","chuckles") emote_hear = list("guffaws","laughs") - response_help = "hugs" - attacktext = "wildly tickles" + response_help_continuous = "hugs" + response_help_simple = "hug" + attack_verb_continuous = "wildly tickles" + attack_verb_simple = "wildly tickle" attack_sound = 'sound/items/bikehorn.ogg' feast_sound = 'sound/spookoween/scary_horn2.ogg' diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index 069795cfb8..1c6412dcad 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -27,6 +27,9 @@ for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) spawn_locs += L.loc + for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc if(!spawn_locs) message_admins("No valid spawn locations found, aborting...") diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 724c4e6f76..d0e36394ab 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -84,9 +84,11 @@ hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - attacktext = "shocks" + attack_verb_continuous = "shocks" + attack_verb_simple = "shock" attack_sound = 'sound/effects/empulse.ogg' - friendly = "pinches" + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" speed = 0 faction = list("swarmer") AIStatus = AI_OFF @@ -179,8 +181,8 @@ /obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) if(resistance_flags & INDESTRUCTIBLE) return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) + for(var/mob/living/L in GetAllContents()) + if(!ispAI(L) && !isbrain(L)) to_chat(S, "An organism has been detected inside this object. Aborting.") return FALSE return ..() @@ -416,6 +418,57 @@ to_chat(S, "Destroying this object would cause a catastrophic chain reaction. Aborting.") return FALSE +/obj/machinery/ore_silo/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object, however tempting it's, will disrupt the research development that may serve for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/rnd/server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object, will disrupt the research development that may serve for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/pool/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) //pool's closed, but not. + to_chat(S, "The pool must not be closed, it will provide healthy fun for our masters in the future. Aborting.") + return FALSE + +/obj/structure/pool/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "The pool must not be closed, it will provide healthy fun for our masters in the future. Aborting.") + return FALSE + +/obj/structure/holosign/barrier/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + var/static/list/lazy_typecache = typecacheof(list(/obj/structure/holosign/barrier/engineering, /obj/structure/holosign/barrier/firelock, /obj/structure/holosign/barrier/atmos, /obj/structure/holosign/barrier/combifan)) + if(lazy_typecache[type]) + to_chat(S, "Destroying this holographic barrier may not benefit us. Aborting.") + return FALSE + return ..() + +/obj/machinery/dominator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/computer/bsa_control/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/bsa/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/dna_vault/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/structure/filler/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "This advanced piece of technology may be of use for our masters in the future. Aborting.") + return FALSE + +/obj/machinery/computer/sat_control/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object will lower the station shielding against space debris. Aborting.") + return FALSE + +/obj/machinery/satellite/meteor_shield/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Destroying this object will lower the station shielding against space debris. Aborting.") + return FALSE + ////END CTRL CLICK FOR SWARMERS//// /mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) @@ -429,6 +482,14 @@ return new fabrication_object(loc) /mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) + if(isobj(target)) + var/obj/O = target + if(O.resistance_flags & INDESTRUCTIBLE) + return FALSE + for(var/mob/living/L in GetAllContents()) + if(!ispAI(L) && !isbrain(L)) + to_chat(src, "An organism has been detected inside this object. Aborting.") + return FALSE var/resource_gain = target.IntegrateAmount() if(resources + resource_gain > max_resources) to_chat(src, "We cannot hold more materials!") diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index 6ef35fdbaa..c626799a53 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -1,10 +1,10 @@ /datum/round_event_control/spawn_swarmer name = "Spawn Swarmer Shell" typepath = /datum/round_event/spawn_swarmer - weight = 0 - max_occurrences = 0 + weight = 7 + max_occurrences = 1 //Only once okay fam earliest_start = 30 MINUTES - min_players = 15 + min_players = 35 gamemode_blacklist = list("dynamic") diff --git a/code/modules/antagonists/traitor/classes/ai.dm b/code/modules/antagonists/traitor/classes/ai.dm index eaa1137d51..f9682e5025 100644 --- a/code/modules/antagonists/traitor/classes/ai.dm +++ b/code/modules/antagonists/traitor/classes/ai.dm @@ -65,5 +65,5 @@ /datum/traitor_class/ai/finalize_traitor(datum/antagonist/traitor/T) T.add_law_zero() T.owner.current.playsound_local(get_turf(T.owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) - T.owner.current.grant_language(/datum/language/codespeak) + T.owner.current.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MALF) return FALSE diff --git a/code/modules/antagonists/traitor/classes/hijack.dm b/code/modules/antagonists/traitor/classes/hijack.dm index 59e0591600..bbfb0cb11d 100644 --- a/code/modules/antagonists/traitor/classes/hijack.dm +++ b/code/modules/antagonists/traitor/classes/hijack.dm @@ -4,6 +4,7 @@ weight = 3 chaos = 5 threat = 3 + min_players = 25 uplink_filters = list(/datum/uplink_item/stealthy_weapons/romerol_kit) /datum/traitor_class/human/hijack/forge_objectives(datum/antagonist/traitor/T) @@ -16,3 +17,6 @@ /datum/traitor_class/human/hijack/finalize_traitor(datum/antagonist/traitor/T) T.hijack_speed=1 return TRUE + +/datum/traitor_class/human/hijack/clean_up_traitor(datum/antagonist/traitor/T) + T.hijack_speed = 0.5 diff --git a/code/modules/antagonists/traitor/classes/martyr.dm b/code/modules/antagonists/traitor/classes/martyr.dm index 72f9ac86fc..5c407b70fd 100644 --- a/code/modules/antagonists/traitor/classes/martyr.dm +++ b/code/modules/antagonists/traitor/classes/martyr.dm @@ -4,6 +4,7 @@ weight = 2 chaos = 5 threat = 5 + min_players = 20 uplink_filters = list(/datum/uplink_item/stealthy_weapons/romerol_kit,/datum/uplink_item/bundles_TC/contract_kit) /datum/traitor_class/human/martyr/forge_objectives(datum/antagonist/traitor/T) diff --git a/code/modules/antagonists/traitor/classes/traitor_class.dm b/code/modules/antagonists/traitor/classes/traitor_class.dm index 012a269572..568619f59d 100644 --- a/code/modules/antagonists/traitor/classes/traitor_class.dm +++ b/code/modules/antagonists/traitor/classes/traitor_class.dm @@ -7,6 +7,8 @@ GLOBAL_LIST_EMPTY(traitor_classes) var/chaos = 0 var/threat = 0 var/TC = 20 + /// Minimum players for this to randomly roll via get_random_traitor_class(). + var/min_players = 0 var/list/uplink_filters /datum/traitor_class/New() @@ -38,3 +40,7 @@ GLOBAL_LIST_EMPTY(traitor_classes) /datum/traitor_class/proc/finalize_traitor(datum/antagonist/traitor/T) // Finalization. Return TRUE if should play standard traitor sound/equip, return FALSE if both are special case return TRUE + +/datum/traitor_class/proc/clean_up_traitor(datum/antagonist/traitor/T) + // Any effects that need to be cleaned up if traitor class is being swapped. + diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 338d135b4c..0309b7e826 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -4,6 +4,7 @@ antagpanel_category = "Traitor" job_rank = ROLE_TRAITOR antag_moodlet = /datum/mood_event/focused + skill_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) var/special_role = ROLE_TRAITOR var/employer = "The Syndicate" var/give_objectives = TRUE @@ -15,36 +16,55 @@ threat = 5 /datum/antagonist/traitor/New() - ..() if(!GLOB.traitor_classes.len)//Only need to fill the list when it's needed. for(var/I in subtypesof(/datum/traitor_class)) new I + ..() -/datum/antagonist/traitor/proc/set_traitor_kind(var/kind) +/datum/antagonist/traitor/proc/set_traitor_kind(kind) + var/swap_from_old = FALSE + if(traitor_kind) + traitor_kind.remove_innate_effects(owner.current) + traitor_kind.clean_up_traitor(src) + swap_from_old = TRUE traitor_kind = GLOB.traitor_classes[kind] + traitor_kind.apply_innate_effects(owner.current) + if(give_objectives) + for(var/O in objectives) + qdel(O) + traitor_kind.forge_objectives(src) + if(swap_from_old) + traitor_kind.finalize_traitor(src) + traitor_kind.greet(src) + owner.announce_objectives() + +/proc/get_random_traitor_kind(var/list/blacklist = list()) + var/chaos_weight = 0 + if(istype(SSticker.mode,/datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + chaos_weight = (mode.threat - 50)/50 + var/list/weights = list() + for(var/C in GLOB.traitor_classes) + if(!(C in blacklist)) + var/datum/traitor_class/class = GLOB.traitor_classes[C] + if(class.min_players > length(GLOB.joined_player_list)) + continue + var/weight = LOGISTIC_FUNCTION(1.5*class.weight,chaos_weight,class.chaos,0) + weights[C] = weight * 1000 + var/choice = pickweight(weights, 0) + if(!choice) + choice = TRAITOR_HUMAN // it's an "easter egg" + var/datum/traitor_class/actual_class = GLOB.traitor_classes[choice] + actual_class.weight *= 0.8 // less likely this round + return choice /datum/antagonist/traitor/on_gain() if(owner.current && isAI(owner.current)) set_traitor_kind(TRAITOR_AI) else - var/chaos_weight = 0 - if(istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - chaos_weight = (mode.threat - 50)/50 - var/list/weights = list() - for(var/C in GLOB.traitor_classes) - var/datum/traitor_class/class = GLOB.traitor_classes[C] - var/weight = LOGISTIC_FUNCTION(1.5*class.weight,chaos_weight,class.chaos,0) - weights[C] = weight - var/choice = pickweightAllowZero(weights) - if(!choice) - choice = GLOB.traitor_classes[TRAITOR_HUMAN] - set_traitor_kind(pickweightAllowZero(weights)) - traitor_kind.weight *= 0.8 // less likely this round + set_traitor_kind(get_random_traitor_kind()) SSticker.mode.traitors += owner owner.special_role = special_role - if(give_objectives) - traitor_kind.forge_objectives(src) finalize_traitor() ..() @@ -97,7 +117,8 @@ owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) /datum/antagonist/traitor/antag_panel_objectives() - . = ..() + . += "Traitor class: [traitor_kind.employer]
    " + . += ..() if(contractor_hub?.assigned_targets && length(contractor_hub.assigned_targets)) . += "Contract Targets:
    " for(var/datum/mind/M in contractor_hub.assigned_targets) @@ -221,7 +242,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - objectives_text += "
    Objective #[count]: [objective.explanation_text] Success!" + objectives_text += "
    Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) objectives_text += "
    Objective #[count]: [objective.explanation_text] Fail." traitorwin = FALSE diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e6ca95472e..6616eea006 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( else owner_AI = owner -/datum/action/innate/ai/IsAvailable() +/datum/action/innate/ai/IsAvailable(silent = FALSE) . = ..() if(owner_AI && owner_AI.malf_cooldown > world.time) return FALSE diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index d62792042f..70ff59eee0 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -78,18 +78,32 @@ var/mob/living/carbon/human/target = M // After we remove items, at least give them what they need to live. target.dna.species.give_important_for_life(target) handleVictimExperience(M) // After pod is sent we start the victim narrative/heal. - var/points_to_check = SSshuttle.points // This is slightly delayed because of the sleep calls above to handle the narrative. We don't want to tell the station instantly. - if(points_to_check >= ransom) - SSshuttle.points -= ransom - else - SSshuttle.points -= points_to_check + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + var/points_to_check = min(D.account_balance, ransom) + D.adjust_money(min(points_to_check, ransom)) priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \ As is policy we've taken a portion of the station's funds to offset the overall cost.", null, "attention", null, "Nanotrasen Asset Protection") + sleep(30) + + // Pay contractor their portion of ransom + if (status == CONTRACT_STATUS_COMPLETE) + var/mob/living/carbon/human/H + var/obj/item/card/id/C + if(ishuman(contract.owner.current)) + H = contract.owner.current + C = H.get_idcard(TRUE) + + if(C && C.registered_account) + C.registered_account.adjust_money(points_to_check * 0.35) + + C.registered_account.bank_card_talk("We've processed the ransom, agent. Here's your cut - your balance is now \ + [C.registered_account.account_balance] cr.", TRUE) + /datum/syndicate_contract/proc/handleVictimExperience(var/mob/living/M) // They're off to holding - handle the return timer and give some text about what's going on. addtimer(CALLBACK(src, .proc/returnVictim, M), 4 MINUTES) // Ship 'em back - dead or alive... 4 minutes wait. if(M.stat != DEAD) //Even if they weren't the target, we're still treating them the same. - M.reagents.add_reagent(/datum/reagent/medicine/omnizine, 20) // Heal them up - gets them out of crit/soft crit. + M.reagents.add_reagent(/datum/reagent/medicine/regen_jelly, 20) // Heal them up - gets them out of crit/soft crit. -- now 100% toxinlover friendly!! M.flash_act() M.confused += 10 M.blur_eyes(5) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 7c63266255..eaef7a35f5 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -159,7 +159,7 @@ /obj/item/scrying/attack_self(mob/user) to_chat(user, "You can see...everything!") visible_message("[user] stares into [src], their eyes glazing over.") - user.ghostize(1) + user.ghostize(1, voluntary = TRUE) /////////////////////////////////////////Necromantic Stone/////////////////// @@ -369,7 +369,7 @@ var/mob/living/carbon/last_user /obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user) - if(!user || QDELETED(src) || user.notransform) + if(!user || QDELETED(src) || user.mob_transforming) on_cooldown = FALSE return TRUE return FALSE diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 0f43dfaf3a..46961c0caf 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -31,12 +31,12 @@ /obj/item/soulstone/pickup(mob/living/user) ..() - if(!iscultist(user) && !iswizard(user) && !usability) + if(!iscultist(user, TRUE) && !iswizard(user) && !usability) to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.") /obj/item/soulstone/examine(mob/user) . = ..() - if(usability || iscultist(user) || iswizard(user) || isobserver(user)) + if(usability || iscultist(user, TRUE) || iswizard(user) || isobserver(user)) if (old_shard) . += "A soulstone, used to capture a soul, either from dead humans or from freed shades." else @@ -53,7 +53,7 @@ //////////////////////////////Capturing//////////////////////////////////////////////////////// /obj/item/soulstone/attack(mob/living/carbon/human/M, mob/living/user) - if(!iscultist(user) && !iswizard(user) && !usability) + if(!iscultist(user, TRUE) && !iswizard(user) && !usability) user.Unconscious(100) to_chat(user, "Your body is wracked with debilitating pain!") return @@ -74,7 +74,7 @@ /obj/item/soulstone/attack_self(mob/living/user) if(!in_range(src, user)) return - if(!iscultist(user) && !iswizard(user) && !usability) + if(!iscultist(user, TRUE) && !iswizard(user) && !usability) user.Unconscious(100) to_chat(user, "Your body is wracked with debilitating pain!") return @@ -103,7 +103,7 @@ /obj/structure/constructshell/examine(mob/user) . = ..() - if(iscultist(user) || iswizard(user) || user.stat == DEAD) + if(iscultist(user, TRUE) || iswizard(user) || user.stat == DEAD) . += "A construct shell, used to house bound souls from a soulstone." . += "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:" . += "An Artificer, which can produce more shells and soulstones, as well as fortifications." @@ -113,7 +113,7 @@ /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) var/obj/item/soulstone/SS = O - if(!iscultist(user) && !iswizard(user) && !SS.usability) + if(!iscultist(user, TRUE) && !iswizard(user) && !SS.usability) to_chat(user, "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.") user.Dizzy(30) return @@ -145,7 +145,7 @@ if("VICTIM") var/mob/living/carbon/human/T = target var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C && C.cult_team.is_sacrifice_target(T.mind)) + if(C && C.cult_team?.is_sacrifice_target(T.mind)) if(iscultist(user)) to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else @@ -233,7 +233,7 @@ newstruct.cancel_camera() -/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0) +/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/user, vic = 0) new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton T.stop_sound_channel(CHANNEL_HEARTBEAT) T.invisibility = INVISIBILITY_ABSTRACT @@ -245,20 +245,23 @@ S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" T.transfer_ckey(S) - S.language_holder = U.language_holder.copy(S) - if(U) - S.faction |= "[REF(U)]" //Add the master as a faction, allowing inter-mob cooperation - if(U && iscultist(U)) + S.copy_languages(T, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. + S.copy_languages(user, LANGUAGE_MASTER) + S.update_atom_languages() + grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue + if(user) + S.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation + if(user && iscultist(user)) SSticker.mode.add_cultist(S.mind, 0) S.cancel_camera() name = "soulstone: Shade of [T.real_name]" icon_state = "soulstone2" - if(U && (iswizard(U) || usability)) - to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help [U.p_them()] succeed in [U.p_their()] goals at all costs.") - else if(U && iscultist(U)) + if(user && (iswizard(user) || usability)) + to_chat(S, "Your soul has been captured! You are now bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.") + else if(user && iscultist(user)) to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs.") - if(vic && U) - to_chat(U, "Capture successful!: [T.real_name]'s soul has been ripped from [T.p_their()] body and stored within the soul stone.") + if(vic && user) + to_chat(user, "Capture successful!: [T.real_name]'s soul has been ripped from [T.p_their()] body and stored within the soul stone.") /obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 2bcda1d400..a9bc64a932 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -226,7 +226,11 @@ /datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success . = ..() - user.flags_1 |= TESLA_IGNORE_1 + ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") + +/datum/spellbook_entry/lightningbolt/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) + . = ..() + REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") /datum/spellbook_entry/infinite_guns name = "Lesser Summon Guns" @@ -294,7 +298,7 @@ name = "Staff of Change" desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." item_path = /obj/item/gun/magic/staff/change - dynamic_requirement = 60 + dynamic_requirement = 200 /datum/spellbook_entry/item/staffanimation name = "Staff of Animation" @@ -361,7 +365,7 @@ desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative in use. Comes in a handy belt." item_path = /obj/item/storage/belt/wands/full category = "Defensive" - dynamic_requirement = 60 + dynamic_requirement = 200 /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" @@ -386,7 +390,7 @@ name = "Plasma Fist" desc = "A forbidden martial art designed on the surging power of plasma. Use it to harness the ancient power." item_path = /obj/item/book/granter/martial/plasma_fist - cost = 3 + cost = 2 /datum/spellbook_entry/item/guardian name = "Guardian Deck" diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 2d32f8f00a..70adafd3fb 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -269,7 +269,7 @@ if(objective.completable) var/completion = objective.check_completion() if(completion >= 1) - parts += "Objective #[count]: [objective.explanation_text] Success!" + parts += "Objective #[count]: [objective.explanation_text] Success!" else if(completion <= 0) parts += "Objective #[count]: [objective.explanation_text] Fail." wizardwin = FALSE diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm similarity index 99% rename from modular_citadel/code/modules/arousal/arousal.dm rename to code/modules/arousal/arousal.dm index 843672877e..c9b2690784 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -63,10 +63,12 @@ if(!target || !R) return var/turfing = isturf(target) + G.generate_fluid(R) if(spill && R.total_volume >= 5) R.reaction(turfing ? target : target.loc, TOUCH, 1, 0) if(!turfing) R.trans_to(target, R.total_volume * (spill ? G.fluid_transfer_factor : 1)) + G.time_since_last_orgasm = 0 R.clear_reagents() /mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm similarity index 92% rename from modular_citadel/code/modules/arousal/genitals.dm rename to code/modules/arousal/genitals.dm index 47a994326f..fb254a2dcc 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -1,6 +1,7 @@ /obj/item/organ/genital color = "#fcccb3" - w_class = WEIGHT_CLASS_NORMAL + w_class = WEIGHT_CLASS_SMALL + organ_flags = ORGAN_NO_DISMEMBERMENT var/shape var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code var/genital_flags //see citadel_defines.dm @@ -15,6 +16,7 @@ var/fluid_efficiency = 1 var/fluid_rate = CUM_RATE var/fluid_mult = 1 + var/time_since_last_orgasm = 500 var/aroused_state = FALSE //Boolean used in icon_state strings var/obj/item/organ/genital/linked_organ var/linked_organ_slot //used for linking an apparatus' organ to its other half on update_link(). @@ -150,24 +152,18 @@ aroused_state = FALSE /obj/item/organ/genital/on_life() - if(!reagents || !owner) + . = ..() + if(!reagents || !.) return reagents.maximum_volume = fluid_max_volume if(fluid_id && CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION)) - generate_fluid() + time_since_last_orgasm++ -/obj/item/organ/genital/proc/generate_fluid() - var/amount = fluid_rate - if(!reagents.total_volume && amount < 0.1) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank. - amount += 0.1 - var/multiplier = fluid_mult - if(reagents.total_volume >= 5) - multiplier *= 0.8 - if(reagents.total_volume < reagents.maximum_volume) - reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally - reagents.add_reagent(fluid_id, (amount * multiplier))//generate the cum - return TRUE - return FALSE +/obj/item/organ/genital/proc/generate_fluid(datum/reagents/R) + var/amount = clamp(fluid_rate * time_since_last_orgasm * fluid_mult,0,fluid_max_volume) + R.clear_reagents() + R.add_reagent(fluid_id,amount) + return TRUE /obj/item/organ/genital/proc/update_link() if(owner) @@ -319,7 +315,7 @@ genital_overlay = center_image(genital_overlay, dim_x, dim_y) if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) - genital_overlay.color = "#[skintone2hex(skin_tone)]" + genital_overlay.color = SKINTONE2HEX(skin_tone) else switch(S.color_src) if("cock_color") @@ -331,7 +327,7 @@ if("vag_color") genital_overlay.color = "#[dna.features["vag_color"]]" - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][(dna.species.use_skintones && !dna.skin_tone_override) ? "_s" : ""]_[aroused_state]_[layertext]" if(layers_num[layer] == GENITALS_FRONT_LAYER && G.genital_flags & GENITAL_THROUGH_CLOTHES) genital_overlay.layer = -GENITALS_EXPOSED_LAYER @@ -361,14 +357,12 @@ var/willyCheck = getorganslot(ORGAN_SLOT_PENIS) if(organCheck == FALSE) - if(ishuman(src) && dna.species.id == "human") + if(ishuman(src) && dna.species.use_skintones) dna.features["genitals_use_skintone"] = TRUE - dna.species.use_skintones = TRUE - if(MUTCOLORS) - if(src.dna.species.fixed_mut_color) - dna.features["cock_color"] = "[dna.species.fixed_mut_color]" - dna.features["breasts_color"] = "[dna.species.fixed_mut_color]" - return + if(src.dna.species.fixed_mut_color) + dna.features["cock_color"] = "[dna.species.fixed_mut_color]" + dna.features["breasts_color"] = "[dna.species.fixed_mut_color]" + return //So people who haven't set stuff up don't get rainbow surprises. dna.features["cock_color"] = "[dna.features["mcolor"]]" dna.features["breasts_color"] = "[dna.features["mcolor"]]" diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm similarity index 81% rename from modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm rename to code/modules/arousal/genitals_sprite_accessories.dm index dcefa27305..1140a1d3ec 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/code/modules/arousal/genitals_sprite_accessories.dm @@ -3,13 +3,13 @@ var/taur_icon //leave null if the genital doesn't have a taur counterpart. var/accepted_taurs = STYLE_HOOF_TAURIC|STYLE_PAW_TAURIC //Types that match with the accessory. var/feat_taur //the text string of the dna feature to check for those who want to opt out. - var/taur_dimension_y = 0 - var/taur_dimension_x = 0 + var/taur_dimension_y = 32 + var/taur_dimension_x = 32 //DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM /datum/sprite_accessory/penis - icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' + icon = 'icons/obj/genitals/penis_onmob.dmi' name = "penis" //the preview name of the accessory color_src = "cock_color" alt_aroused = TRUE @@ -22,14 +22,14 @@ /datum/sprite_accessory/penis/knotted icon_state = "knotted" name = "Knotted" - taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi' + taur_dimension_x = 64 /datum/sprite_accessory/penis/flared icon_state = "flared" name = "Flared" - taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi' + taur_dimension_x = 64 /datum/sprite_accessory/penis/barbknot icon_state = "barbknot" @@ -38,8 +38,8 @@ /datum/sprite_accessory/penis/tapered icon_state = "tapered" name = "Tapered" - taur_icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' - taur_dimension_y = 64 + taur_icon = 'icons/obj/genitals/taur_penis_onmob.dmi' + taur_dimension_x = 64 /datum/sprite_accessory/penis/tentacle icon_state = "tentacle" @@ -55,7 +55,7 @@ //Testicles /datum/sprite_accessory/testicles - icon = 'modular_citadel/icons/obj/genitals/testicles_onmob.dmi' + icon = 'icons/obj/genitals/testicles_onmob.dmi' icon_state = "testicle" name = "testicle" //the preview name of the accessory color_src = "balls_color" @@ -66,7 +66,7 @@ //Vaginas /datum/sprite_accessory/vagina - icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi' + icon = 'icons/obj/genitals/vagina_onmob.dmi' name = "vagina" color_src = "vag_color" alt_aroused = TRUE @@ -104,7 +104,7 @@ //BREASTS BE HERE /datum/sprite_accessory/breasts - icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' + icon = 'icons/obj/genitals/breasts_onmob.dmi' name = "breasts" color_src = "breasts_color" diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm similarity index 93% rename from modular_citadel/code/modules/arousal/organs/breasts.dm rename to code/modules/arousal/organs/breasts.dm index 8183ba92bc..0989966638 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -5,7 +5,7 @@ name = "breasts" desc = "Female milk producing organs." icon_state = "breasts" - icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' + icon = 'icons/obj/genitals/breasts.dmi' zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_BREASTS size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values @@ -54,14 +54,15 @@ desc += " They're leaking [lowertext(R.name)]." var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape] var/icon_shape = S ? S.icon_state : "pair" - var/icon_size = CLAMP(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) - icon_state = "breasts_[icon_shape]_[breast_values[icon_size]]" + var/icon_size = clamp(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) + icon_state = "breasts_[icon_shape]_[icon_size]" if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. - color = "#[skintone2hex(H.skin_tone)]" - icon_state += "_s" + color = SKINTONE2HEX(H.skin_tone) + if(!H.dna.skin_tone_override) + icon_state += "_s" else color = "#[owner.dna.features["breasts_color"]]" @@ -72,7 +73,7 @@ //this is far too lewd wah /obj/item/organ/genital/breasts/modify_size(modifier, min = -INFINITY, max = INFINITY) - var/new_value = CLAMP(cached_size + modifier, min, max) + var/new_value = clamp(cached_size + modifier, min, max) if(new_value == cached_size) return prev_size = cached_size @@ -117,7 +118,7 @@ /obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna if(D.species.use_skintones && D.features["genitals_use_skintone"]) - color = "#[skintone2hex(H.skin_tone)]" + color = SKINTONE2HEX(H.skin_tone) else color = "#[D.features["breasts_color"]]" size = D.features["breasts_size"] diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm similarity index 92% rename from modular_citadel/code/modules/arousal/organs/penis.dm rename to code/modules/arousal/organs/penis.dm index b3ca0062f8..7b20c0e7ce 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -2,7 +2,7 @@ name = "penis" desc = "A male reproductive organ." icon_state = "penis" - icon = 'modular_citadel/icons/obj/genitals/penis.dmi' + icon = 'icons/obj/genitals/penis.dmi' zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_PENIS masturbation_verb = "stroke" @@ -21,11 +21,11 @@ var/diameter_ratio = COCK_DIAMETER_RATIO_DEF //0.25; check citadel_defines.dm /obj/item/organ/genital/penis/modify_size(modifier, min = -INFINITY, max = INFINITY) - var/new_value = CLAMP(length + modifier, min, max) + var/new_value = clamp(length + modifier, min, max) if(new_value == length) return prev_length = length - length = CLAMP(length + modifier, min, max) + length = clamp(length + modifier, min, max) update() ..() @@ -60,7 +60,7 @@ else if(!enlargement && status_effect) owner.remove_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) if(linked_organ) - linked_organ.size = CLAMP(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX) + linked_organ.size = clamp(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX) linked_organ.update() size = new_size @@ -84,8 +84,9 @@ if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. - color = "#[skintone2hex(H.skin_tone)]" - icon_state += "_s" + color = SKINTONE2HEX(H.skin_tone) + if(!H.dna.skin_tone_override) + icon_state += "_s" else color = "#[owner.dna.features["cock_color"]]" if(genital_flags & GENITAL_CAN_TAUR && S?.taur_icon && (!S.feat_taur || owner.dna.features[S.feat_taur]) && owner.dna.species.mutant_bodyparts["taur"]) @@ -98,7 +99,7 @@ /obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna if(D.species.use_skintones && D.features["genitals_use_skintone"]) - color = "#[skintone2hex(H.skin_tone)]" + color = SKINTONE2HEX(H.skin_tone) else color = "#[D.features["cock_color"]]" length = D.features["cock_length"] diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/code/modules/arousal/organs/testicles.dm similarity index 86% rename from modular_citadel/code/modules/arousal/organs/testicles.dm rename to code/modules/arousal/organs/testicles.dm index 4264cf5e48..bfb5c99a55 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/code/modules/arousal/organs/testicles.dm @@ -2,7 +2,7 @@ name = "testicles" desc = "A male reproductive organ." icon_state = "testicles" - icon = 'modular_citadel/icons/obj/genitals/testicles.dmi' + icon = 'icons/obj/genitals/testicles.dmi' zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_TESTICLES size = BALLS_SIZE_MIN @@ -19,9 +19,8 @@ /obj/item/organ/genital/testicles/generate_fluid() if(!linked_organ && !update_link()) return FALSE - . = ..() - if(. && reagents.holder_full()) - to_chat(owner, "Your balls finally feel full, again.") + return ..() + // in memoriam "Your balls finally feel full, again." ??-2020 /obj/item/organ/genital/testicles/upon_link() size = linked_organ.size @@ -49,19 +48,20 @@ if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. - color = "#[skintone2hex(H.skin_tone)]" - icon_state += "_s" + color = SKINTONE2HEX(H.skin_tone) + if(!H.dna.skin_tone_override) + icon_state += "_s" else color = "#[owner.dna.features["balls_color"]]" /obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna if(D.species.use_skintones && D.features["genitals_use_skintone"]) - color = "#[skintone2hex(H.skin_tone)]" + color = SKINTONE2HEX(H.skin_tone) else color = "#[D.features["balls_color"]]" shape = D.features["balls_shape"] fluid_rate = D.features["balls_cum_rate"] fluid_mult = D.features["balls_cum_mult"] fluid_efficiency = D.features["balls_efficiency"] - toggle_visibility(D.features["balls_visibility"], FALSE) \ No newline at end of file + toggle_visibility(D.features["balls_visibility"], FALSE) diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/code/modules/arousal/organs/vagina.dm similarity index 93% rename from modular_citadel/code/modules/arousal/organs/vagina.dm rename to code/modules/arousal/organs/vagina.dm index f7e8eddcbd..5c8bbeea98 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/code/modules/arousal/organs/vagina.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/vagina name = "vagina" desc = "A female reproductive organ." - icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' + icon = 'icons/obj/genitals/vagina.dmi' icon_state = ORGAN_SLOT_VAGINA zone = BODY_ZONE_PRECISE_GROIN slot = "vagina" @@ -55,8 +55,9 @@ if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. - color = "#[skintone2hex(H.skin_tone)]" - icon_state += "_s" + color = SKINTONE2HEX(H.skin_tone) + if(!H.dna.skin_tone_override) + icon_state += "_s" else color = "#[owner.dna.features["vag_color"]]" if(ishuman(owner)) @@ -66,7 +67,7 @@ /obj/item/organ/genital/vagina/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna if(D.species.use_skintones && D.features["genitals_use_skintone"]) - color = "#[skintone2hex(H.skin_tone)]" + color = SKINTONE2HEX(H.skin_tone) else color = "[D.features["vag_color"]]" shape = "[D.features["vag_shape"]]" diff --git a/modular_citadel/code/modules/arousal/organs/womb.dm b/code/modules/arousal/organs/womb.dm similarity index 84% rename from modular_citadel/code/modules/arousal/organs/womb.dm rename to code/modules/arousal/organs/womb.dm index 7f91310e3e..386f407a26 100644 --- a/modular_citadel/code/modules/arousal/organs/womb.dm +++ b/code/modules/arousal/organs/womb.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital/womb name = "womb" desc = "A female reproductive organ." - icon = 'modular_citadel/icons/obj/genitals/vagina.dmi' + icon = 'icons/obj/genitals/vagina.dmi' icon_state = "womb" zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_WOMB diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm similarity index 98% rename from modular_citadel/code/modules/arousal/toys/dildos.dm rename to code/modules/arousal/toys/dildos.dm index 58245c0c5f..5cb6d47118 100644 --- a/modular_citadel/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -4,7 +4,7 @@ /obj/item/dildo name = "dildo" desc = "Floppy!" - icon = 'modular_citadel/icons/obj/genitals/dildo.dmi' + icon = 'icons/obj/genitals/dildo.dmi' force = 0 hitsound = 'sound/weapons/tap.ogg' throwforce = 0 diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 1c9c1a0203..32e262ce65 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -3,14 +3,35 @@ desc = "A small electronic device able to control a blast door remotely." icon_state = "control" attachable = TRUE - var/id = null - var/can_change_id = 0 + /// Our ID. Make the first character ! if you want to obfuscate it as a mapper via randomization. + var/id + /// Can the ID be changed if used in hand? + var/can_change_id = FALSE + /// Show ID? + var/show_id = TRUE var/cooldown = FALSE //Door cooldowns +/obj/item/assembly/control/Initialize(mapload) + if(mapload && id) + if(copytext(id, 1, 2) == "!") + id = SSmapping.get_obfuscated_id(id) + return ..() + /obj/item/assembly/control/examine(mob/user) . = ..() - if(id) + if(id && show_id) . += "Its channel ID is '[id]'." + if(can_change_id) + . += "Use in hand to change ID." + +/obj/item/assembly/control/attack_self(mob/living/user) + . = ..() + if(!can_change_id) + return + var/new_id + new_id = input(user, "Set ID", "Set ID", show_id? id : null) as text|null + if(!isnull(new_id)) //0/"" is considered !, so check null instead of just !. + id = new_id /obj/item/assembly/control/activate() cooldown = TRUE @@ -22,7 +43,6 @@ INVOKE_ASYNC(M, openclose ? /obj/machinery/door/poddoor.proc/open : /obj/machinery/door/poddoor.proc/close) addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) - /obj/item/assembly/control/airlock name = "airlock controller" desc = "A small electronic device able to control an airlock remotely." @@ -123,7 +143,6 @@ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) - /obj/item/assembly/control/crematorium name = "crematorium controller" desc = "An evil-looking remote controller for a crematorium." @@ -135,3 +154,14 @@ C.cremate(usr) addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) + +/obj/item/assembly/control/electrochromatic + name = "electrochromatic window controller" + desc = "Toggles linked electrochromatic windows." + can_change_id = TRUE + /// Stores our status to prevent windows from desyncing. + var/on = FALSE + +/obj/item/assembly/control/electrochromatic/activate() + on = !on + do_electrochromatic_toggle(on, id) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 13ea317b9b..8a0645f311 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -229,6 +229,7 @@ var/flashcd = 20 var/overheat = 0 var/obj/item/organ/cyberimp/arm/flash/I = null + var/active_light_strength = 7 /obj/item/assembly/flash/armimplant/burn_out() if(I && I.owner) @@ -248,6 +249,12 @@ update_icon(1) return TRUE +/obj/item/assembly/flash/armimplant/Moved(oldLoc, dir) + . = ..() + if(!ismob(loc)) + set_light(0) + else + set_light(7) /obj/item/assembly/flash/armimplant/proc/cooldown() overheat = FALSE @@ -312,7 +319,7 @@ if(holder) holder.update_icon() -/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/assembly/flash/shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) activate() return ..() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index cee0a9054c..e70b6e5c74 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -90,7 +90,7 @@ . = TRUE update_icon() - + /obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W @@ -162,7 +162,6 @@ return return ..(signal) - // Embedded signaller used in anomalies. /obj/item/assembly/signaler/anomaly name = "anomaly core" @@ -179,12 +178,53 @@ return FALSE if(signal.data["code"] != code) return FALSE + if(suicider) + manual_suicide(suicider) for(var/obj/effect/anomaly/A in get_turf(src)) A.anomalyNeutralize() return TRUE -/obj/item/assembly/signaler/anomaly/attack_self() - return +/obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user) + user.visible_message("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!") + user.suiciding = TRUE + user.suicide_log() + user.gib() + +/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_ANALYZER) + to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].") + ..() + +//Anomaly cores +/obj/item/assembly/signaler/anomaly/pyro + name = "\improper pyroclastic anomaly core" + desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research." + icon_state = "pyro core" + anomaly_type = /obj/effect/anomaly/pyro + +/obj/item/assembly/signaler/anomaly/grav + name = "\improper gravitational anomaly core" + desc = "The neutralized core of a gravitational anomaly. It feels much heavier than it looks. It'd probably be valuable for research." + icon_state = "grav core" + anomaly_type = /obj/effect/anomaly/grav + +/obj/item/assembly/signaler/anomaly/flux + name = "\improper flux anomaly core" + desc = "The neutralized core of a flux anomaly. Touching it makes your skin tingle. It'd probably be valuable for research." + icon_state = "flux core" + anomaly_type = /obj/effect/anomaly/flux + +/obj/item/assembly/signaler/anomaly/bluespace + name = "\improper bluespace anomaly core" + desc = "The neutralized core of a bluespace anomaly. It keeps phasing in and out of view. It'd probably be valuable for research." + icon_state = "anomaly core" + anomaly_type = /obj/effect/anomaly/bluespace + +/obj/item/assembly/signaler/anomaly/vortex + name = "\improper vortex anomaly core" + desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research." + icon_state = "vortex core" + anomaly_type = /obj/effect/anomaly/bhole /obj/item/assembly/signaler/cyborg diff --git a/code/modules/asset_cache/asset_cache.dm b/code/modules/asset_cache/asset_cache.dm new file mode 100644 index 0000000000..7a12e5e9f6 --- /dev/null +++ b/code/modules/asset_cache/asset_cache.dm @@ -0,0 +1,100 @@ +/* +Asset cache quick users guide: +Make a datum in asset_list_items.dm with your assets for your thing. +Checkout asset_list.dm for the helper subclasses +The simple subclass will most like be of use for most cases. +Then call get_asset_datum() with the type of the datum you created and store the return +Then call .send(client) on that stored return value. +Note: If your code uses output() with assets you will need to call asset_flush on the client and wait for it to return before calling output(). You only need do this if .send(client) returned TRUE +*/ + +//When sending mutiple assets, how many before we give the client a quaint little sending resources message +#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8 + +//This proc sends the asset to the client, but only if it needs it. +//This proc blocks(sleeps) unless verify is set to false +/proc/send_asset(client/client, asset_name) + return send_asset_list(client, list(asset_name)) + +/// Sends a list of assets to a client +/// This proc will no longer block, use client.asset_flush() if you to need know when the client has all assets (such as for output()). (This is not required for browse() calls as they use the same message queue as asset sends) +/// client - a client or mob +/// asset_list - A list of asset filenames to be sent to the client. +/// Returns TRUE if any assets were sent. +/proc/send_asset_list(client/client, list/asset_list) + if(!istype(client)) + if(ismob(client)) + var/mob/M = client + if(M.client) + client = M.client + else + return + else + return + + var/list/unreceived = list() + + for (var/asset_name in asset_list) + var/datum/asset_cache_item/asset = SSassets.cache[asset_name] + if (!asset) + continue + var/asset_file = asset.resource + if (!asset_file) + continue + + var/asset_md5 = asset.md5 + if (client.sent_assets[asset_name] == asset_md5) + continue + unreceived[asset_name] = asset_md5 + + if (unreceived.len) + if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) + to_chat(client, "Sending Resources...") + + for(var/asset in unreceived) + var/datum/asset_cache_item/ACI + if ((ACI = SSassets.cache[asset])) + log_asset("Sending asset [asset] to client [client]") + client << browse_rsc(ACI.resource, asset) + + client.sent_assets |= unreceived + addtimer(CALLBACK(client, /client/proc/asset_cache_update_json), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) + return TRUE + return FALSE + +//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start. +//The proc calls procs that sleep for long times. +/proc/getFilesSlow(client/client, list/files, register_asset = TRUE, filerate = 3) + var/startingfilerate = filerate + for(var/file in files) + if (!client) + break + if (register_asset) + register_asset(file, files[file]) + + if (send_asset(client, file)) + if (!(--filerate)) + filerate = startingfilerate + client.asset_flush() + stoplag(0) //queuing calls like this too quickly can cause issues in some client versions + +//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. +//icons and virtual assets get copied to the dyn rsc before use +/proc/register_asset(asset_name, asset) + var/datum/asset_cache_item/ACI = new(asset_name, asset) + + //this is technically never something that was supported and i want metrics on how often it happens if at all. + if (SSassets.cache[asset_name]) + var/datum/asset_cache_item/OACI = SSassets.cache[asset_name] + if (OACI.md5 != ACI.md5) + stack_trace("ERROR: new asset added to the asset cache with the same name as another asset: [asset_name] existing asset md5: [OACI.md5] new asset md5:[ACI.md5]") + else + var/list/stacktrace = gib_stack_trace() + log_asset("WARNING: dupe asset added to the asset cache: [asset_name] existing asset md5: [OACI.md5] new asset md5:[ACI.md5]\n[stacktrace.Join("\n")]") + SSassets.cache[asset_name] = ACI + +//Generated names do not include file extention. +//Used mainly for code that deals with assets in a generic way +//The same asset will always lead to the same asset name +/proc/generate_asset_name(file) + return "asset.[md5(fcopy_rsc(file))]" diff --git a/code/modules/asset_cache/asset_cache_client.dm b/code/modules/asset_cache/asset_cache_client.dm new file mode 100644 index 0000000000..50a5685ded --- /dev/null +++ b/code/modules/asset_cache/asset_cache_client.dm @@ -0,0 +1,58 @@ + +/client + var/list/sent_assets = list() // List of all asset filenames sent to this client by the asset cache, along with their assoicated md5s + var/list/completed_asset_jobs = list() /// List of all completed blocking send jobs awaiting acknowledgement by send_asset + + var/last_asset_job = 0 /// Last asset send job id. + var/last_completed_asset_job = 0 + +/// Process asset cache client topic calls for "asset_cache_confirm_arrival=[INT]" +/client/proc/asset_cache_confirm_arrival(job_id) + var/asset_cache_job = round(text2num(job_id)) + //because we skip the limiter, we have to make sure this is a valid arrival and not somebody tricking us into letting them append to a list without limit. + if (asset_cache_job > 0 && asset_cache_job <= last_asset_job && !(completed_asset_jobs["[asset_cache_job]"])) + completed_asset_jobs["[asset_cache_job]"] = TRUE + last_completed_asset_job = max(last_completed_asset_job, asset_cache_job) + else + return asset_cache_job || TRUE + + +/// Process asset cache client topic calls for "asset_cache_preload_data=[HTML+JSON_STRING] +/client/proc/asset_cache_preload_data(data) + /*var/jsonend = findtextEx(data, "{{{ENDJSONDATA}}}") + if (!jsonend) + CRASH("invalid asset_cache_preload_data, no jsonendmarker")*/ + //var/json = html_decode(copytext(data, 1, jsonend)) + var/json = data + var/list/preloaded_assets = json_decode(json) + + for (var/preloaded_asset in preloaded_assets) + if (copytext(preloaded_asset, findlasttext(preloaded_asset, ".")+1) in list("js", "jsm", "htm", "html")) + preloaded_assets -= preloaded_asset + continue + sent_assets |= preloaded_assets + + +/// Updates the client side stored html/json combo file used to keep track of what assets the client has between restarts/reconnects. +/client/proc/asset_cache_update_json(verify = FALSE, list/new_assets = list()) + if (world.time - connection_time < 10 SECONDS) //don't override the existing data file on a new connection + return + if (!islist(new_assets)) + new_assets = list("[new_assets]" = md5(SSassets.cache[new_assets])) + + src << browse(json_encode(new_assets|sent_assets), "file=asset_data.json&display=0") + +/// Blocks until all currently sending browser assets have been sent. +/// Due to byond limitations, this proc will sleep for 1 client round trip even if the client has no pending asset sends. +/// This proc will return an untrue value if it had to return before confirming the send, such as timeout or the client going away. +/client/proc/asset_flush(timeout = 50) + var/job = ++last_asset_job + var/t = 0 + var/timeout_time = timeout + src << browse({""}, "window=asset_cache_browser&file=asset_cache_send_verify.htm") + + while(!completed_asset_jobs["[job]"] && t < timeout_time) // Reception is handled in Topic() + stoplag(1) // Lock up the caller until this is received. + t++ + if (t < timeout_time) + return TRUE diff --git a/code/modules/asset_cache/asset_cache_item.dm b/code/modules/asset_cache/asset_cache_item.dm new file mode 100644 index 0000000000..0e7d44a7ac --- /dev/null +++ b/code/modules/asset_cache/asset_cache_item.dm @@ -0,0 +1,21 @@ +/** + * # asset_cache_item + * + * An internal datum containing info on items in the asset cache. Mainly used to cache md5 info for speed. +**/ +/datum/asset_cache_item + var/name + var/md5 + var/resource + +/datum/asset_cache_item/New(name, file) + if (!isfile(file)) + file = fcopy_rsc(file) + md5 = md5(file) + if (!md5) + md5 = md5(fcopy_rsc(file)) + if (!md5) + CRASH("invalid asset sent to asset cache") + debug_world_log("asset cache unexpected success of second fcopy_rsc") + src.name = name + resource = file diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm new file mode 100644 index 0000000000..fe9859f238 --- /dev/null +++ b/code/modules/asset_cache/asset_list.dm @@ -0,0 +1,228 @@ + +//These datums are used to populate the asset cache, the proc "register()" does this. +//Place any asset datums you create in asset_list_items.dm + +//all of our asset datums, used for referring to these later +GLOBAL_LIST_EMPTY(asset_datums) + +//get an assetdatum or make a new one +/proc/get_asset_datum(type) + return GLOB.asset_datums[type] || new type() + +/datum/asset + var/_abstract = /datum/asset + +/datum/asset/New() + GLOB.asset_datums[type] = src + register() + +/datum/asset/proc/register() + return + +/datum/asset/proc/send(client) + return + + +//If you don't need anything complicated. +/datum/asset/simple + _abstract = /datum/asset/simple + var/assets = list() + +/datum/asset/simple/register() + for(var/asset_name in assets) + register_asset(asset_name, assets[asset_name]) + +/datum/asset/simple/send(client) + . = send_asset_list(client, assets) + + +// For registering or sending multiple others at once +/datum/asset/group + _abstract = /datum/asset/group + var/list/children + +/datum/asset/group/register() + for(var/type in children) + get_asset_datum(type) + +/datum/asset/group/send(client/C) + for(var/type in children) + var/datum/asset/A = get_asset_datum(type) + . = A.send(C) || . + + +// spritesheet implementation - coalesces various icons into a single .png file +// and uses CSS to select icons out of that file - saves on transferring some +// 1400-odd individual PNG files +#define SPR_SIZE 1 +#define SPR_IDX 2 +#define SPRSZ_COUNT 1 +#define SPRSZ_ICON 2 +#define SPRSZ_STRIPPED 3 + +/datum/asset/spritesheet + _abstract = /datum/asset/spritesheet + var/name + var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped) + var/list/sprites = list() // "foo_bar" -> list("32x32", 5) + +/datum/asset/spritesheet/register() + if (!name) + CRASH("spritesheet [type] cannot register without a name") + ensure_stripped() + + var/res_name = "spritesheet_[name].css" + var/fname = "data/spritesheets/[res_name]" + fdel(fname) + text2file(generate_css(), fname) + register_asset(res_name, fcopy_rsc(fname)) + fdel(fname) + + for(var/size_id in sizes) + var/size = sizes[size_id] + register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED]) + +/datum/asset/spritesheet/send(client/C) + if (!name) + return + var/all = list("spritesheet_[name].css") + for(var/size_id in sizes) + all += "[name]_[size_id].png" + . = send_asset_list(C, all) + +/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes) + for(var/size_id in sizes_to_strip) + var/size = sizes[size_id] + if (size[SPRSZ_STRIPPED]) + continue + + // save flattened version + var/fname = "data/spritesheets/[name]_[size_id].png" + fcopy(size[SPRSZ_ICON], fname) + var/error = rustg_dmi_strip_metadata(fname) + if(length(error)) + stack_trace("Failed to strip [name]_[size_id].png: [error]") + size[SPRSZ_STRIPPED] = icon(fname) + fdel(fname) + +/datum/asset/spritesheet/proc/generate_css() + var/list/out = list() + + for (var/size_id in sizes) + var/size = sizes[size_id] + var/icon/tiny = size[SPRSZ_ICON] + out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}" + + for (var/sprite_id in sprites) + var/sprite = sprites[sprite_id] + var/size_id = sprite[SPR_SIZE] + var/idx = sprite[SPR_IDX] + var/size = sizes[size_id] + + var/icon/tiny = size[SPRSZ_ICON] + var/icon/big = size[SPRSZ_STRIPPED] + var/per_line = big.Width() / tiny.Width() + var/x = (idx % per_line) * tiny.Width() + var/y = round(idx / per_line) * tiny.Height() + + out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}" + + return out.Join("\n") + +/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE) + I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving) + if (!I || !length(icon_states(I))) // that direction or state doesn't exist + return + var/size_id = "[I.Width()]x[I.Height()]" + var/size = sizes[size_id] + + if (sprites[sprite_name]) + CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])") + + if (size) + var/position = size[SPRSZ_COUNT]++ + var/icon/sheet = size[SPRSZ_ICON] + size[SPRSZ_STRIPPED] = null + sheet.Insert(I, icon_state=sprite_name) + sprites[sprite_name] = list(size_id, position) + else + sizes[size_id] = size = list(1, I, null) + sprites[sprite_name] = list(size_id, 0) + +/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions) + if (length(prefix)) + prefix = "[prefix]-" + + if (!directions) + directions = list(SOUTH) + + for (var/icon_state_name in icon_states(I)) + for (var/direction in directions) + var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : "" + Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction) + +/datum/asset/spritesheet/proc/css_tag() + return {""} + +/datum/asset/spritesheet/proc/icon_tag(sprite_name) + var/sprite = sprites[sprite_name] + if (!sprite) + return null + var/size_id = sprite[SPR_SIZE] + return {""} + +/datum/asset/spritesheet/proc/icon_class_name(sprite_name) + var/sprite = sprites[sprite_name] + if (!sprite) + return null + var/size_id = sprite[SPR_SIZE] + return {"[name][size_id] [sprite_name]"} + +#undef SPR_SIZE +#undef SPR_IDX +#undef SPRSZ_COUNT +#undef SPRSZ_ICON +#undef SPRSZ_STRIPPED + + +/datum/asset/spritesheet/simple + _abstract = /datum/asset/spritesheet/simple + var/list/assets + +/datum/asset/spritesheet/simple/register() + for (var/key in assets) + Insert(key, assets[key]) + ..() + +//Generates assets based on iconstates of a single icon +/datum/asset/simple/icon_states + _abstract = /datum/asset/simple/icon_states + var/icon + var/list/directions = list(SOUTH) + var/frame = 1 + var/movement_states = FALSE + + var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png" + var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format + +/datum/asset/simple/icon_states/register(_icon = icon) + for(var/icon_state_name in icon_states(_icon)) + for(var/direction in directions) + var/asset = icon(_icon, icon_state_name, direction, frame, movement_states) + if (!asset) + continue + asset = fcopy_rsc(asset) //dedupe + var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : "" + var/asset_name = sanitize_filename("[prefix].[prefix2][icon_state_name].png") + if (generic_icon_names) + asset_name = "[generate_asset_name(asset)].png" + + register_asset(asset_name, asset) + +/datum/asset/simple/icon_states/multiple_icons + _abstract = /datum/asset/simple/icon_states/multiple_icons + var/list/icons + +/datum/asset/simple/icon_states/multiple_icons/register() + for(var/i in icons) + ..(i) diff --git a/code/modules/client/asset_cache.dm b/code/modules/asset_cache/asset_list_items.dm similarity index 51% rename from code/modules/client/asset_cache.dm rename to code/modules/asset_cache/asset_list_items.dm index 7bafefcf53..13a1803188 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -1,399 +1,22 @@ -/* -Asset cache quick users guide: - -Make a datum at the bottom of this file with your assets for your thing. -The simple subsystem will most like be of use for most cases. -Then call get_asset_datum() with the type of the datum you created and store the return -Then call .send(client) on that stored return value. - -You can set verify to TRUE if you want send() to sleep until the client has the assets. -*/ - - -// Amount of time(ds) MAX to send per asset, if this get exceeded we cancel the sleeping. -// This is doubled for the first asset, then added per asset after -#define ASSET_CACHE_SEND_TIMEOUT 7 - -//When sending mutiple assets, how many before we give the client a quaint little sending resources message -#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8 - -//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files -#define ASSET_CACHE_PRELOAD_CONCURRENT 3 - -/client - var/list/cache = list() // List of all assets sent to this client by the asset cache. - var/list/completed_asset_jobs = list() // List of all completed jobs, awaiting acknowledgement. - var/list/sending = list() - var/last_asset_job = 0 // Last job done. - -//This proc sends the asset to the client, but only if it needs it. -//This proc blocks(sleeps) unless verify is set to false -/proc/send_asset(client/client, asset_name, verify = TRUE) - if(!istype(client)) - if(ismob(client)) - var/mob/M = client - if(M.client) - client = M.client - - else - return 0 - - else - return 0 - - if(client.cache.Find(asset_name) || client.sending.Find(asset_name)) - return 0 - - client << browse_rsc(SSassets.cache[asset_name], asset_name) - if(!verify) - client.cache += asset_name - return 1 - - client.sending |= asset_name - var/job = ++client.last_asset_job - - client << browse({" - - "}, "window=asset_cache_browser") - - var/t = 0 - var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT - while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() - stoplag(1) // Lock up the caller until this is received. - t++ - - if(client) - client.sending -= asset_name - client.cache |= asset_name - client.completed_asset_jobs -= job - - return 1 - -//This proc blocks(sleeps) unless verify is set to false -/proc/send_asset_list(client/client, list/asset_list, verify = TRUE) - if(!istype(client)) - if(ismob(client)) - var/mob/M = client - if(M.client) - client = M.client - - else - return 0 - - else - return 0 - - var/list/unreceived = asset_list - (client.cache + client.sending) - if(!unreceived || !unreceived.len) - return 0 - if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) - to_chat(client, "Sending Resources...") - for(var/asset in unreceived) - if (asset in SSassets.cache) - client << browse_rsc(SSassets.cache[asset], asset) - - if(!verify) // Can't access the asset cache browser, rip. - client.cache += unreceived - return 1 - - client.sending |= unreceived - var/job = ++client.last_asset_job - - client << browse({" - - "}, "window=asset_cache_browser") - - var/t = 0 - var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len - while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() - stoplag(1) // Lock up the caller until this is received. - t++ - - if(client) - client.sending -= unreceived - client.cache |= unreceived - client.completed_asset_jobs -= job - - return 1 - -//This proc will download the files without clogging up the browse() queue, used for passively sending files on connection start. -//The proc calls procs that sleep for long times. -/proc/getFilesSlow(client/client, list/files, register_asset = TRUE) - var/concurrent_tracker = 1 - for(var/file in files) - if (!client) - break - if (register_asset) - register_asset(file, files[file]) - if (concurrent_tracker >= ASSET_CACHE_PRELOAD_CONCURRENT) - concurrent_tracker = 1 - send_asset(client, file) - else - concurrent_tracker++ - send_asset(client, file, verify=FALSE) - - stoplag(0) //queuing calls like this too quickly can cause issues in some client versions - -//This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. -//if it's an icon or something be careful, you'll have to copy it before further use. -/proc/register_asset(asset_name, asset) - SSassets.cache[asset_name] = asset - -//Generated names do not include file extention. -//Used mainly for code that deals with assets in a generic way -//The same asset will always lead to the same asset name -/proc/generate_asset_name(file) - return "asset.[md5(fcopy_rsc(file))]" - - -//These datums are used to populate the asset cache, the proc "register()" does this. - -//all of our asset datums, used for referring to these later -GLOBAL_LIST_EMPTY(asset_datums) - -//get an assetdatum or make a new one -/proc/get_asset_datum(type) - return GLOB.asset_datums[type] || new type() - -/datum/asset - var/_abstract = /datum/asset - -/datum/asset/New() - GLOB.asset_datums[type] = src - register() - -/datum/asset/proc/register() - return - -/datum/asset/proc/send(client) - return - - -//If you don't need anything complicated. -/datum/asset/simple - _abstract = /datum/asset/simple - var/assets = list() - var/verify = FALSE - -/datum/asset/simple/register() - for(var/asset_name in assets) - register_asset(asset_name, assets[asset_name]) - -/datum/asset/simple/send(client) - send_asset_list(client,assets,verify) - - -// For registering or sending multiple others at once -/datum/asset/group - _abstract = /datum/asset/group - var/list/children - -/datum/asset/group/register() - for(var/type in children) - get_asset_datum(type) - -/datum/asset/group/send(client/C) - for(var/type in children) - var/datum/asset/A = get_asset_datum(type) - A.send(C) - - -// spritesheet implementation - coalesces various icons into a single .png file -// and uses CSS to select icons out of that file - saves on transferring some -// 1400-odd individual PNG files -#define SPR_SIZE 1 -#define SPR_IDX 2 -#define SPRSZ_COUNT 1 -#define SPRSZ_ICON 2 -#define SPRSZ_STRIPPED 3 - -/datum/asset/spritesheet - _abstract = /datum/asset/spritesheet - var/name - var/list/sizes = list() // "32x32" -> list(10, icon/normal, icon/stripped) - var/list/sprites = list() // "foo_bar" -> list("32x32", 5) - var/verify = FALSE - -/datum/asset/spritesheet/register() - if (!name) - CRASH("spritesheet [type] cannot register without a name") - ensure_stripped() - - var/res_name = "spritesheet_[name].css" - var/fname = "data/spritesheets/[res_name]" - fdel(fname) - text2file(generate_css(), fname) - register_asset(res_name, fcopy_rsc(fname)) - fdel(fname) - - for(var/size_id in sizes) - var/size = sizes[size_id] - register_asset("[name]_[size_id].png", size[SPRSZ_STRIPPED]) - -/datum/asset/spritesheet/send(client/C) - if (!name) - return - var/all = list("spritesheet_[name].css") - for(var/size_id in sizes) - all += "[name]_[size_id].png" - send_asset_list(C, all, verify) - -/datum/asset/spritesheet/proc/ensure_stripped(sizes_to_strip = sizes) - for(var/size_id in sizes_to_strip) - var/size = sizes[size_id] - if (size[SPRSZ_STRIPPED]) - continue - - // save flattened version - var/fname = "data/spritesheets/[name]_[size_id].png" - fcopy(size[SPRSZ_ICON], fname) - var/error = rustg_dmi_strip_metadata(fname) - if(length(error)) - stack_trace("Failed to strip [name]_[size_id].png: [error]") - size[SPRSZ_STRIPPED] = icon(fname) - fdel(fname) - -/datum/asset/spritesheet/proc/generate_css() - var/list/out = list() - - for (var/size_id in sizes) - var/size = sizes[size_id] - var/icon/tiny = size[SPRSZ_ICON] - out += ".[name][size_id]{display:inline-block;width:[tiny.Width()]px;height:[tiny.Height()]px;background:url('[name]_[size_id].png') no-repeat;}" - - for (var/sprite_id in sprites) - var/sprite = sprites[sprite_id] - var/size_id = sprite[SPR_SIZE] - var/idx = sprite[SPR_IDX] - var/size = sizes[size_id] - - var/icon/tiny = size[SPRSZ_ICON] - var/icon/big = size[SPRSZ_STRIPPED] - var/per_line = big.Width() / tiny.Width() - var/x = (idx % per_line) * tiny.Width() - var/y = round(idx / per_line) * tiny.Height() - - out += ".[name][size_id].[sprite_id]{background-position:-[x]px -[y]px;}" - - return out.Join("\n") - -/datum/asset/spritesheet/proc/Insert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE) - I = icon(I, icon_state=icon_state, dir=dir, frame=frame, moving=moving) - if (!I || !length(icon_states(I))) // that direction or state doesn't exist - return - var/size_id = "[I.Width()]x[I.Height()]" - var/size = sizes[size_id] - - if (sprites[sprite_name]) - CRASH("duplicate sprite \"[sprite_name]\" in sheet [name] ([type])") - - if (size) - var/position = size[SPRSZ_COUNT]++ - var/icon/sheet = size[SPRSZ_ICON] - size[SPRSZ_STRIPPED] = null - sheet.Insert(I, icon_state=sprite_name) - sprites[sprite_name] = list(size_id, position) - else - sizes[size_id] = size = list(1, I, null) - sprites[sprite_name] = list(size_id, 0) - -/datum/asset/spritesheet/proc/InsertAll(prefix, icon/I, list/directions) - if (length(prefix)) - prefix = "[prefix]-" - - if (!directions) - directions = list(SOUTH) - - for (var/icon_state_name in icon_states(I)) - for (var/direction in directions) - var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]-" : "" - Insert("[prefix][prefix2][icon_state_name]", I, icon_state=icon_state_name, dir=direction) - -/datum/asset/spritesheet/proc/css_tag() - return {""} - -/datum/asset/spritesheet/proc/icon_tag(sprite_name) - var/sprite = sprites[sprite_name] - if (!sprite) - return null - var/size_id = sprite[SPR_SIZE] - return {""} - -/datum/asset/spritesheet/proc/icon_class_name(sprite_name) - var/sprite = sprites[sprite_name] - if (!sprite) - return null - var/size_id = sprite[SPR_SIZE] - return {"[name][size_id] [sprite_name]"} - -#undef SPR_SIZE -#undef SPR_IDX -#undef SPRSZ_COUNT -#undef SPRSZ_ICON -#undef SPRSZ_STRIPPED - - -/datum/asset/spritesheet/simple - _abstract = /datum/asset/spritesheet/simple - var/list/assets - -/datum/asset/spritesheet/simple/register() - for (var/key in assets) - Insert(key, assets[key]) - ..() - -//Generates assets based on iconstates of a single icon -/datum/asset/simple/icon_states - _abstract = /datum/asset/simple/icon_states - var/icon - var/list/directions = list(SOUTH) - var/frame = 1 - var/movement_states = FALSE - - var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png" - var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format - - verify = FALSE - -/datum/asset/simple/icon_states/register(_icon = icon) - for(var/icon_state_name in icon_states(_icon)) - for(var/direction in directions) - var/asset = icon(_icon, icon_state_name, direction, frame, movement_states) - if (!asset) - continue - asset = fcopy_rsc(asset) //dedupe - var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : "" - var/asset_name = sanitize_filename("[prefix].[prefix2][icon_state_name].png") - if (generic_icon_names) - asset_name = "[generate_asset_name(asset)].png" - - register_asset(asset_name, asset) - -/datum/asset/simple/icon_states/multiple_icons - _abstract = /datum/asset/simple/icon_states/multiple_icons - var/list/icons - -/datum/asset/simple/icon_states/multiple_icons/register() - for(var/i in icons) - ..(i) - - //DEFINITIONS FOR ASSET DATUMS START HERE. - +/* uncomment this and delete the tgui def bellow this for the new tgui /datum/asset/simple/tgui assets = list( - // tgui + "tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js', + "tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css', + ) +*/ +/datum/asset/simple/tgui + assets = list( + // Old TGUI "tgui.css" = 'tgui/assets/tgui.css', "tgui.js" = 'tgui/assets/tgui.js', // tgui-next "tgui-main.html" = 'tgui-next/packages/tgui/public/tgui-main.html', - "tgui-fallback.html" = 'tgui-next/packages/tgui/public/tgui-fallback.html', "tgui.bundle.js" = 'tgui-next/packages/tgui/public/tgui.bundle.js', "tgui.bundle.css" = 'tgui-next/packages/tgui/public/tgui.bundle.css', + // Old TGUI compatability + "tgui-fallback.html" = 'tgui-next/packages/tgui/public/tgui-fallback.html', "shim-html5shiv.js" = 'tgui-next/packages/tgui/public/shim-html5shiv.js', "shim-ie8.js" = 'tgui-next/packages/tgui/public/shim-ie8.js', "shim-dom4.js" = 'tgui-next/packages/tgui/public/shim-dom4.js', @@ -434,8 +57,16 @@ GLOBAL_LIST_EMPTY(asset_datums) "smmon_4.gif" = 'icons/program_icons/smmon_4.gif', "smmon_5.gif" = 'icons/program_icons/smmon_5.gif', "smmon_6.gif" = 'icons/program_icons/smmon_6.gif' + //"borg_mon.gif" = 'icons/program_icons/borg_mon.gif' ) - +/* uncomment if you're porting the new ntnet app +/datum/asset/simple/radar_assets + assets = list( + "ntosradarbackground.png" = 'icons/UI_Icons/tgui/ntosradar_background.png', + "ntosradarpointer.png" = 'icons/UI_Icons/tgui/ntosradar_pointer.png', + "ntosradarpointerS.png" = 'icons/UI_Icons/tgui/ntosradar_pointer_S.png' + ) +*/ /datum/asset/spritesheet/simple/pda name = "pda" assets = list( @@ -464,6 +95,7 @@ GLOBAL_LIST_EMPTY(asset_datums) "refresh" = 'icons/pda_icons/pda_refresh.png', "scanner" = 'icons/pda_icons/pda_scanner.png', "signaler" = 'icons/pda_icons/pda_signaler.png', + //"skills" = 'icons/pda_icons/pda_skills.png', "status" = 'icons/pda_icons/pda_status.png', "dronephone" = 'icons/pda_icons/pda_dronephone.png', "emoji" = 'icons/pda_icons/pda_emoji.png' @@ -483,53 +115,12 @@ GLOBAL_LIST_EMPTY(asset_datums) "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png', "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png', "stamp-law" = 'icons/stamp_icons/large_stamp-law.png' + //"stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png', + //"stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png', + //"stamp-centcom" = 'icons/stamp_icons/large_stamp-centcom.png', + //"stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png' ) -/datum/asset/spritesheet/simple/minesweeper - name = "minesweeper" - assets = list( - "1" = 'icons/UI_Icons/minesweeper_tiles/one.png', - "2" = 'icons/UI_Icons/minesweeper_tiles/two.png', - "3" = 'icons/UI_Icons/minesweeper_tiles/three.png', - "4" = 'icons/UI_Icons/minesweeper_tiles/four.png', - "5" = 'icons/UI_Icons/minesweeper_tiles/five.png', - "6" = 'icons/UI_Icons/minesweeper_tiles/six.png', - "7" = 'icons/UI_Icons/minesweeper_tiles/seven.png', - "8" = 'icons/UI_Icons/minesweeper_tiles/eight.png', - "empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png', - "flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png', - "hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png', - "mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png', - "minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png' - ) - -/datum/asset/spritesheet/simple/pills - name = "pills" - assets = list( - "pill1" = 'icons/UI_Icons/Pills/pill1.png', - "pill2" = 'icons/UI_Icons/Pills/pill2.png', - "pill3" = 'icons/UI_Icons/Pills/pill3.png', - "pill4" = 'icons/UI_Icons/Pills/pill4.png', - "pill5" = 'icons/UI_Icons/Pills/pill5.png', - "pill6" = 'icons/UI_Icons/Pills/pill6.png', - "pill7" = 'icons/UI_Icons/Pills/pill7.png', - "pill8" = 'icons/UI_Icons/Pills/pill8.png', - "pill9" = 'icons/UI_Icons/Pills/pill9.png', - "pill10" = 'icons/UI_Icons/Pills/pill10.png', - "pill11" = 'icons/UI_Icons/Pills/pill11.png', - "pill12" = 'icons/UI_Icons/Pills/pill12.png', - "pill13" = 'icons/UI_Icons/Pills/pill13.png', - "pill14" = 'icons/UI_Icons/Pills/pill14.png', - "pill15" = 'icons/UI_Icons/Pills/pill15.png', - "pill16" = 'icons/UI_Icons/Pills/pill16.png', - "pill17" = 'icons/UI_Icons/Pills/pill17.png', - "pill18" = 'icons/UI_Icons/Pills/pill18.png', - "pill19" = 'icons/UI_Icons/Pills/pill19.png', - "pill20" = 'icons/UI_Icons/Pills/pill20.png', - "pill21" = 'icons/UI_Icons/Pills/pill21.png', - "pill22" = 'icons/UI_Icons/Pills/pill22.png', - ) - /datum/asset/simple/IRV assets = list( "jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js', @@ -573,23 +164,20 @@ GLOBAL_LIST_EMPTY(asset_datums) ) /datum/asset/simple/jquery - verify = FALSE assets = list( "jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js', ) /datum/asset/simple/goonchat - verify = FALSE assets = list( "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', - "browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css', + "browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css', //dark theme, cit specific "browserOutput_light.css" = 'code/modules/goonchat/browserassets/css/browserOutput_light.css' ) /datum/asset/simple/fontawesome - verify = FALSE assets = list( "fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot', "fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff', @@ -630,6 +218,90 @@ GLOBAL_LIST_EMPTY(asset_datums) "none_button.png" = 'html/none_button.png', ) +/datum/asset/spritesheet/simple/minesweeper + name = "minesweeper" + assets = list( + "1" = 'icons/UI_Icons/minesweeper_tiles/one.png', + "2" = 'icons/UI_Icons/minesweeper_tiles/two.png', + "3" = 'icons/UI_Icons/minesweeper_tiles/three.png', + "4" = 'icons/UI_Icons/minesweeper_tiles/four.png', + "5" = 'icons/UI_Icons/minesweeper_tiles/five.png', + "6" = 'icons/UI_Icons/minesweeper_tiles/six.png', + "7" = 'icons/UI_Icons/minesweeper_tiles/seven.png', + "8" = 'icons/UI_Icons/minesweeper_tiles/eight.png', + "empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png', + "flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png', + "hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png', + "mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png', + "minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png' + ) + +/* Port the app game thing +/datum/asset/simple/arcade + assets = list( + "boss1.gif" = 'icons/UI_Icons/Arcade/boss1.gif', + "boss2.gif" = 'icons/UI_Icons/Arcade/boss2.gif', + "boss3.gif" = 'icons/UI_Icons/Arcade/boss3.gif', + "boss4.gif" = 'icons/UI_Icons/Arcade/boss4.gif', + "boss5.gif" = 'icons/UI_Icons/Arcade/boss5.gif', + "boss6.gif" = 'icons/UI_Icons/Arcade/boss6.gif', + ) +*/ +/* +/datum/asset/spritesheet/simple/achievements + name ="achievements" + assets = list( + "default" = 'icons/UI_Icons/Achievements/default.png', + "basemisc" = 'icons/UI_Icons/Achievements/basemisc.png', + "baseboss" = 'icons/UI_Icons/Achievements/baseboss.png', + "baseskill" = 'icons/UI_Icons/Achievements/baseskill.png', + "bbgum" = 'icons/UI_Icons/Achievements/Boss/bbgum.png', + "colossus" = 'icons/UI_Icons/Achievements/Boss/colossus.png', + "hierophant" = 'icons/UI_Icons/Achievements/Boss/hierophant.png', + "legion" = 'icons/UI_Icons/Achievements/Boss/legion.png', + "miner" = 'icons/UI_Icons/Achievements/Boss/miner.png', + "swarmer" = 'icons/UI_Icons/Achievements/Boss/swarmer.png', + "tendril" = 'icons/UI_Icons/Achievements/Boss/tendril.png', + "featofstrength" = 'icons/UI_Icons/Achievements/Misc/featofstrength.png', + "helbital" = 'icons/UI_Icons/Achievements/Misc/helbital.png', + "jackpot" = 'icons/UI_Icons/Achievements/Misc/jackpot.png', + "meteors" = 'icons/UI_Icons/Achievements/Misc/meteors.png', + "timewaste" = 'icons/UI_Icons/Achievements/Misc/timewaste.png', + "upgrade" = 'icons/UI_Icons/Achievements/Misc/upgrade.png', + "clownking" = 'icons/UI_Icons/Achievements/Misc/clownking.png', + "clownthanks" = 'icons/UI_Icons/Achievements/Misc/clownthanks.png', + "rule8" = 'icons/UI_Icons/Achievements/Misc/rule8.png', + "snail" = 'icons/UI_Icons/Achievements/Misc/snail.png', + "mining" = 'icons/UI_Icons/Achievements/Skills/mining.png', + ) +*/ +/datum/asset/spritesheet/simple/pills + name ="pills" + assets = list( + "pill1" = 'icons/UI_Icons/Pills/pill1.png', + "pill2" = 'icons/UI_Icons/Pills/pill2.png', + "pill3" = 'icons/UI_Icons/Pills/pill3.png', + "pill4" = 'icons/UI_Icons/Pills/pill4.png', + "pill5" = 'icons/UI_Icons/Pills/pill5.png', + "pill6" = 'icons/UI_Icons/Pills/pill6.png', + "pill7" = 'icons/UI_Icons/Pills/pill7.png', + "pill8" = 'icons/UI_Icons/Pills/pill8.png', + "pill9" = 'icons/UI_Icons/Pills/pill9.png', + "pill10" = 'icons/UI_Icons/Pills/pill10.png', + "pill11" = 'icons/UI_Icons/Pills/pill11.png', + "pill12" = 'icons/UI_Icons/Pills/pill12.png', + "pill13" = 'icons/UI_Icons/Pills/pill13.png', + "pill14" = 'icons/UI_Icons/Pills/pill14.png', + "pill15" = 'icons/UI_Icons/Pills/pill15.png', + "pill16" = 'icons/UI_Icons/Pills/pill16.png', + "pill17" = 'icons/UI_Icons/Pills/pill17.png', + "pill18" = 'icons/UI_Icons/Pills/pill18.png', + "pill19" = 'icons/UI_Icons/Pills/pill19.png', + "pill20" = 'icons/UI_Icons/Pills/pill20.png', + "pill21" = 'icons/UI_Icons/Pills/pill21.png', + "pill22" = 'icons/UI_Icons/Pills/pill22.png', + ) + //this exists purely to avoid meta by pre-loading all language icons. /datum/asset/language/register() for(var/path in typesof(/datum/language)) @@ -640,7 +312,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/spritesheet/pipes name = "pipes" -/datum/asset/spritesheet/pipes/register() +/datum/asset/spritesheet/pipes/register() //we do not have chempipes for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')) InsertAll("", each, GLOB.alldirs) ..() @@ -650,7 +322,7 @@ GLOBAL_LIST_EMPTY(asset_datums) name = "design" /datum/asset/spritesheet/research_designs/register() - for (var/path in subtypesof(/datum/design)) + for(var/path in subtypesof(/datum/design)) var/datum/design/D = path var/icon_file @@ -704,9 +376,48 @@ GLOBAL_LIST_EMPTY(asset_datums) Insert(initial(D.id), I) return ..() +/datum/asset/spritesheet/vending + name = "vending" + +/datum/asset/spritesheet/vending/register() + for(var/k in GLOB.vending_products) + var/atom/item = k + if(!ispath(item, /atom)) + continue + + var/icon_file = initial(item.icon) + var/icon_state = initial(item.icon_state) + var/icon/I + + var/icon_states_list = icon_states(icon_file) + if(icon_state in icon_states_list) + I = icon(icon_file, icon_state, SOUTH) + var/c = initial(item.color) + if(!isnull(c) && c != "#FFFFFF") + I.Blend(c, ICON_MULTIPLY) + else + var/icon_states_string + for(var/an_icon_state in icon_states_list) + if(!icon_states_string) + icon_states_string = "[json_encode(an_icon_state)](\ref[an_icon_state])" + else + icon_states_string += ", [json_encode(an_icon_state)](\ref[an_icon_state])" + stack_trace("[item] does not have a valid icon state, icon=[icon_file], icon_state=[json_encode(icon_state)](\ref[icon_state]), icon_states=[icon_states_string]") + I = icon('icons/turf/floors.dmi', "", SOUTH) + + var/imgid = replacetext(replacetext("[item]", "/obj/item/", ""), "/", "-") + + Insert(imgid, I) + return ..() + /datum/asset/simple/genetics assets = list( "dna_discovered.gif" = 'html/dna_discovered.gif', "dna_undiscovered.gif" = 'html/dna_undiscovered.gif', "dna_extra.gif" = 'html/dna_extra.gif' -) \ No newline at end of file + ) + +/datum/asset/simple/vv + assets = list( + "view_variables.css" = 'html/admin/view_variables.css' + ) diff --git a/code/modules/asset_cache/validate_assets.html b/code/modules/asset_cache/validate_assets.html new file mode 100644 index 0000000000..205a7f4dad --- /dev/null +++ b/code/modules/asset_cache/validate_assets.html @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index c47c4a44af..06d73867f8 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -9,7 +9,7 @@ return -/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh) +/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh = FALSE, holo = FALSE) var/datum/gas_mixture/air_contents = return_air() if(!air_contents) return 0 @@ -35,7 +35,7 @@ if(oxy < 0.5) return 0 - active_hotspot = new /obj/effect/hotspot(src) + active_hotspot = new /obj/effect/hotspot(src, holo) active_hotspot.temperature = exposed_temperature*50 active_hotspot.volume = exposed_volume*25 @@ -67,8 +67,10 @@ var/bypassing = FALSE var/visual_update_tick = 0 -/obj/effect/hotspot/Initialize() +/obj/effect/hotspot/Initialize(mapload, holo = FALSE) . = ..() + if(holo) + flags_1 |= HOLOGRAM_1 SSair.hotspots += src perform_exposure() setDir(pick(GLOB.cardinals)) @@ -192,7 +194,8 @@ if(bypassing) icon_state = "3" - location.burn_tile() + if(!(flags_1 & HOLOGRAM_1)) + location.burn_tile() //Possible spread due to radiated heat if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) @@ -200,7 +203,7 @@ for(var/t in location.atmos_adjacent_turfs) var/turf/open/T = t if(!T.active_hotspot) - T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) + T.hotspot_expose(radiated_temperature, CELL_VOLUME/4, flags_1 & HOLOGRAM_1) else if(volume > CELL_VOLUME*0.4) @@ -224,7 +227,8 @@ var/turf/open/T = loc if(istype(T) && T.active_hotspot == src) T.active_hotspot = null - DestroyTurf() + if(!(flags_1 & HOLOGRAM_1)) + DestroyTurf() return ..() /obj/effect/hotspot/proc/DestroyTurf() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 632542f605..081f0b1d28 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -89,7 +89,7 @@ temperature_archived = temperature /turf/open/archive() - ARCHIVE_TEMPERATURE(air) + ARCHIVE(air) archived_cycle = SSair.times_fired temperature_archived = temperature @@ -215,7 +215,7 @@ if (planet_atmos) //share our air with the "atmosphere" "above" the turf var/datum/gas_mixture/G = new G.copy_from_turf(src) - ARCHIVE_TEMPERATURE(G) + ARCHIVE(G) if(our_air.compare(G)) if(!our_excited_group) var/datum/excited_group/EG = new diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 5ff8586c34..58e826b36d 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list()) GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture var/list/gases = list() + var/list/gas_archive = list() var/temperature = 0 //kelvins var/tmp/temperature_archived = 0 var/volume = CELL_VOLUME //liters @@ -31,13 +32,25 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) //PV = nRT -/datum/gas_mixture/proc/heat_capacity() //joules per kelvin +/datum/gas_mixture/proc/heat_capacity() + +/datum/gas_mixture/proc/archived_heat_capacity() + +/datum/gas_mixture/heat_capacity() //joules per kelvin var/list/cached_gases = gases var/list/cached_gasheats = GLOB.meta_gas_specific_heats . = 0 for(var/id in cached_gases) . += cached_gases[id] * cached_gasheats[id] +/datum/gas_mixture/archived_heat_capacity() + // lots of copypasta but heat_capacity is the single proc called the most in a regular round, bar none, so performance loss adds up + var/list/cached_gases = gas_archive + var/list/cached_gasheats = GLOB.meta_gas_specific_heats + . = 0 + for(var/id in cached_gases) + . += cached_gases[id] * cached_gasheats[id] + /datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM var/list/cached_gases = gases var/list/cached_gasheats = GLOB.meta_gas_specific_heats @@ -46,6 +59,14 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) if(!.) . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space +/datum/gas_mixture/turf/archived_heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM + var/list/cached_gases = gas_archive + var/list/cached_gasheats = GLOB.meta_gas_specific_heats + for(var/id in cached_gases) + . += cached_gases[id] * cached_gasheats[id] + if(!.) + . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space + /datum/gas_mixture/proc/total_moles() var/cached_gases = gases TOTAL_MOLES(cached_gases, .) @@ -67,6 +88,10 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/thermal_energy() //joules return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas +/datum/gas_mixture/proc/archive() + //Update archived versions of variables + //Returns: 1 in all cases + /datum/gas_mixture/proc/merge(datum/gas_mixture/giver) //Merges all air from giver into self. Deletes giver. //Returns: 1 if we are mutable, 0 otherwise @@ -111,6 +136,10 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) //Performs various reactions such as combustion or fusion (LOL) //Returns: 1 if any reaction took place; 0 otherwise +/datum/gas_mixture/archive() + temperature_archived = temperature + gas_archive = gases.Copy() + return 1 /datum/gas_mixture/merge(datum/gas_mixture/giver) if(!giver) @@ -215,6 +244,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) if(!ispath(path)) path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around gases[path] = text2num(gas[id]) + archive() return 1 /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) @@ -245,7 +275,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) //GAS TRANSFER for(var/id in cached_gases | sharer_gases) // transfer gases - delta = QUANTIZE(cached_gases[id] - sharer_gases[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures + delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) gas_heat_capacity = delta * cached_gasheats[id] @@ -293,8 +323,8 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) sharer_temperature = sharer.temperature_archived var/temperature_delta = temperature_archived - sharer_temperature if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity() + var/self_heat_capacity = archived_heat_capacity() + sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity() if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) var/heat = conduction_coefficient*temperature_delta* \ diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 19f7bff965..c7ffc51458 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g /datum/gas/miasma id = "miasma" - specific_heat = 0.00001 + specific_heat = 20 fusion_power = 50 name = "Miasma" gas_overlay = "miasma" @@ -192,6 +192,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g anchored = TRUE // should only appear in vis_contents, but to be safe layer = FLY_LAYER appearance_flags = TILE_BOUND + vis_flags = NONE /obj/effect/overlay/gas/New(state, alph) . = ..() diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index ebe894138d..59ef15b4cf 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -282,7 +282,7 @@ var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - air.temperature = CLAMP(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY) + air.temperature = clamp(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY) return REACTING /datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst. diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index a4617462fe..b47f45b42d 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -36,6 +36,7 @@ /obj/item/electronics/airalarm name = "air alarm electronics" icon_state = "airalarm_electronics" + custom_price = PRICE_CHEAP /obj/item/wallframe/airalarm name = "air alarm frame" @@ -66,6 +67,7 @@ desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" + plane = ABOVE_WALL_PLANE use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 8 @@ -786,9 +788,8 @@ return user.visible_message("[user.name] wires the air alarm.", \ "You start wiring the air alarm...") - if (do_after(user, 20, target = src)) - if (cable.get_amount() >= 5 && buildstage == 1) - cable.use(5) + if (W.use_tool(src, user, 20, 5)) + if (buildstage == 1) to_chat(user, "You wire the air alarm.") wires.repair() aidisabled = 0 diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 864edfdbe6..97389848ba 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -17,6 +17,7 @@ active_power_usage = 0 power_channel = ENVIRON layer = GAS_PIPE_HIDDEN_LAYER //under wires + plane = ABOVE_WALL_PLANE resistance_flags = FIRE_PROOF max_integrity = 200 obj_flags = CAN_BE_HIT | ON_BLUEPRINTS @@ -64,6 +65,7 @@ nullifyNode(i) SSair.atmos_machinery -= src + SSair.pipenets_needing_rebuilt -= src dropContents() if(pipe_vision_img) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 73cb8eeecb..6b685d4bc1 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -7,6 +7,7 @@ name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." icon_state = "circ-off-0" + plane = GAME_PLANE var/active = FALSE @@ -116,7 +117,7 @@ if(node2) node2.atmosinit() node2.addMember(src) - build_network() + SSair.add_to_rebuild_queue(src) return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 9238b8602b..2dc0afac26 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -159,13 +159,13 @@ pump_direction = 1 if("set_input_pressure" in signal.data) - input_pressure_min = CLAMP(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) + input_pressure_min = clamp(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) if("set_output_pressure" in signal.data) - output_pressure_max = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + output_pressure_max = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) if("status" in signal.data) spawn(2) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 02eb95acab..051dc965ad 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -122,7 +122,7 @@ Passive gate is similar to the regular pump except: pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -144,7 +144,7 @@ Passive gate is similar to the regular pump except: on = !on if("set_output_pressure" in signal.data) - target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 9e49953df5..0e41f78e20 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -145,7 +145,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -167,7 +167,7 @@ on = !on if("set_output_pressure" in signal.data) - target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm index bc58ef158f..7bdd22cbd1 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/relief_valve.dm @@ -91,7 +91,7 @@ pressure = text2num(pressure) . = TRUE if(.) - open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE) + open_pressure = clamp(pressure, close_pressure, 50*ONE_ATMOSPHERE) investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("close_pressure") var/pressure = params["close_pressure"] @@ -106,6 +106,6 @@ pressure = text2num(pressure) . = TRUE if(.) - close_pressure = CLAMP(pressure, 0, open_pressure) + close_pressure = clamp(pressure, 0, open_pressure) investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 864e3eef5e..1005f72afe 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -135,7 +135,7 @@ rate = text2num(rate) . = TRUE if(.) - transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -153,7 +153,7 @@ if("set_transfer_rate" in signal.data) var/datum/gas_mixture/air1 = airs[1] - transfer_rate = CLAMP(text2num(signal.data["set_transfer_rate"]),0,air1.volume) + transfer_rate = clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index a79beca4ec..33fd160b1a 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -32,7 +32,7 @@ var/turf/T = loc if(level == 2 || (istype(T) && !T.intact)) showpipe = TRUE - plane = GAME_PLANE + plane = ABOVE_WALL_PLANE else showpipe = FALSE plane = FLOOR_PLANE @@ -84,7 +84,6 @@ /obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference) if(!reference) CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]") - return var/i = parents.Find(reference) reference.other_airs -= airs[i] reference.other_atmosmch -= src @@ -145,7 +144,7 @@ var/datum/pipeline/parent = parents[i] if(!parent) stack_trace("Component is missing a pipenet! Rebuilding...") - build_network() + SSair.add_to_rebuild_queue(src) parent.update = 1 /obj/machinery/atmospherics/components/returnPipenets() @@ -163,9 +162,12 @@ to_chat(user, "Access denied.") return UI_CLOSE +/obj/machinery/atmospherics/components/attack_ghost(mob/dead/observer/O) + . = ..() + atmosanalyzer_scan(airs, O, src, FALSE) // Tool acts /obj/machinery/atmospherics/components/analyzer_act(mob/living/user, obj/item/I) - atmosanalyzer_scan(airs, user, src) \ No newline at end of file + atmosanalyzer_scan(airs, user, src) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 1099020662..78258dd10a 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -175,7 +175,7 @@ rate = text2num(rate) . = TRUE if(.) - transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + transfer_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) if("filter") filter_type = null diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 5b929452fe..dcf0d09bee 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -164,7 +164,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("node1") var/value = text2num(params["concentration"]) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index e013a86fd2..4f26a2f772 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -6,6 +6,7 @@ max_integrity = 350 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 30, "acid" = 30) layer = ABOVE_WINDOW_LAYER + plane = GAME_PLANE state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY @@ -15,8 +16,8 @@ var/volume = 100 var/efficiency = 1 - var/sleep_factor = 0.00125 - var/unconscious_factor = 0.001 + var/base_knockout = 30 SECONDS + var/knockout_factor = 1 var/heat_capacity = 20000 var/conduction_coefficient = 0.3 @@ -33,6 +34,9 @@ var/message_cooldown var/breakout_time = 300 + fair_market_price = 10 + payment_department = ACCOUNT_MED + /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() . = ..() initialize_directions = dir @@ -50,10 +54,9 @@ var/C for(var/obj/item/stock_parts/matter_bin/M in component_parts) C += M.rating - + // 2 bins total, so C ranges from 2 to 8. efficiency = initial(efficiency) * C - sleep_factor = initial(sleep_factor) * C - unconscious_factor = initial(unconscious_factor) * C + knockout_factor = initial(knockout_factor) / max(1, (C * 0.33)) heat_capacity = initial(heat_capacity) / C conduction_coefficient = initial(conduction_coefficient) * C @@ -149,6 +152,9 @@ add_overlay("cover-on") addtimer(CALLBACK(src, .proc/run_anim, anim_up, occupant_overlay), 7, TIMER_UNIQUE) +/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator) + open_machine() + /obj/machinery/atmospherics/components/unary/cryo_cell/process() ..() @@ -162,7 +168,8 @@ return var/mob/living/mob_occupant = occupant - + if(!check_nap_violations()) + return if(mob_occupant.stat == DEAD) // We don't bother with dead people. return @@ -181,8 +188,10 @@ if(air1.gases.len) if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic. - mob_occupant.Sleeping((mob_occupant.bodytemperature * sleep_factor) * 2000) - mob_occupant.Unconscious((mob_occupant.bodytemperature * unconscious_factor) * 2000) + // temperature factor goes from 1 to about 2.5 + var/amount = max(1, (4 * log(T0C - mob_occupant.bodytemperature)) - 20) * knockout_factor * base_knockout + mob_occupant.Sleeping(amount) + mob_occupant.Unconscious(amount) if(beaker) if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic. beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents. @@ -447,6 +456,6 @@ if(node) node.atmosinit() node.addMember(src) - build_network() + SSair.add_to_rebuild_queue(src) #undef CRYOMOBS diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 87ab4fa643..05720583f9 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -123,7 +123,7 @@ if("set_volume_rate" in signal.data) var/number = text2num(signal.data["set_volume_rate"]) var/datum/gas_mixture/air_contents = airs[1] - volume_rate = CLAMP(number, 0, air_contents.volume) + volume_rate = clamp(number, 0, air_contents.volume) if("status" in signal.data) spawn(2) @@ -172,7 +172,7 @@ rate = text2num(rate) . = TRUE if(.) - volume_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + volume_rate = clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() broadcast_status() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm index 4b6a4a4c10..1d8b875528 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -92,7 +92,7 @@ pressure = text2num(pressure) . = TRUE if(.) - open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE) + open_pressure = clamp(pressure, close_pressure, 50*ONE_ATMOSPHERE) investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("close_pressure") var/pressure = params["close_pressure"] @@ -107,6 +107,6 @@ pressure = text2num(pressure) . = TRUE if(.) - close_pressure = CLAMP(pressure, 0, open_pressure) + close_pressure = clamp(pressure, 0, open_pressure) investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index c1bd59f49b..79ff24e8b7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -7,6 +7,7 @@ max_integrity = 800 density = TRUE layer = ABOVE_WINDOW_LAYER + plane = GAME_PLANE pipe_flags = PIPING_ONE_PER_TURF var/volume = 10000 //in liters var/gas_type = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 877826c1c1..7af3e57bc7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -9,6 +9,7 @@ max_integrity = 300 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) layer = OBJ_LAYER + plane = GAME_PLANE circuit = /obj/item/circuitboard/machine/thermomachine ui_x = 300 ui_y = 230 @@ -116,7 +117,7 @@ if(node) node.atmosinit() node.addMember(src) - build_network() + SSair.add_to_rebuild_queue(src) return TRUE /obj/machinery/atmospherics/components/unary/thermomachine/ui_status(mob/user) @@ -170,7 +171,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = CLAMP(target, min_temperature, max_temperature) + target_temperature = clamp(target, min_temperature, max_temperature) investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -225,6 +226,7 @@ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return target_temperature = min_temperature + to_chat(user,"You minimize the temperature on the [src].") investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") return TRUE @@ -257,6 +259,7 @@ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) return target_temperature = max_temperature + to_chat(user,"You maximize the temperature on the [src].") investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") return TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index f2f2329661..9788bcb4ee 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -210,13 +210,13 @@ if("set_internal_pressure" in signal.data) var/old_pressure = internal_pressure_bound - internal_pressure_bound = CLAMP(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = clamp(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) if(old_pressure != internal_pressure_bound) investigate_log(" internal pressure was set to [internal_pressure_bound] by [key_name(signal_sender)]",INVESTIGATE_ATMOS) if("set_external_pressure" in signal.data) var/old_pressure = external_pressure_bound - external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) if(old_pressure != external_pressure_bound) investigate_log(" external pressure was set to [external_pressure_bound] by [key_name(signal_sender)]",INVESTIGATE_ATMOS) @@ -227,10 +227,10 @@ internal_pressure_bound = 0 if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = CLAMP(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = clamp(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) if("adjust_external_pressure" in signal.data) - external_pressure_bound = CLAMP(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = clamp(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) if("init" in signal.data) name = signal.data["init"] diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 899b621262..565bbb7b3c 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -131,7 +131,6 @@ var/datum/pipeline/P = returnPipenet(A) if(!P) CRASH("null.addMember() called by [type] on [COORD(src)]") - return P.addMember(A, src) @@ -208,7 +207,7 @@ /datum/pipeline/proc/return_air() . = other_airs + air if(null in .) - stack_trace("[src] has one or more null gas mixtures, which may cause bugs. Null mixtures will not be considered in reconcile_air().") + stack_trace("[src]([REF(src)]) has one or more null gas mixtures, which may cause bugs. Null mixtures will not be considered in reconcile_air().") return removeNullsFromList(.) /datum/pipeline/proc/reconcile_air() diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index b98098584f..bc8fd6777d 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -31,7 +31,7 @@ nodes = list() for(var/obj/machinery/atmospherics/A in needs_nullifying) A.disconnect(src) - A.build_network() + SSair.add_to_rebuild_queue(A) /obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes() return front_nodes + back_nodes + nodes @@ -128,7 +128,7 @@ if(initialize_directions & dir) return ..() if((NORTH|EAST) & dir) - user.ventcrawl_layer = CLAMP(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if((SOUTH|WEST) & dir) - user.ventcrawl_layer = CLAMP(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index 77452fd6fd..aa8ee65bd8 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -28,6 +28,8 @@ /obj/machinery/atmospherics/pipe/manifold/update_icon() cut_overlays() + if(!center) + center = mutable_appearance(icon, "manifold_center") PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer) add_overlay(center) diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index 1bcca8d5ae..56c0408d18 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -26,6 +26,8 @@ /obj/machinery/atmospherics/pipe/manifold4w/update_icon() cut_overlays() + if(!center) + center = mutable_appearance(icon, "manifold_center") PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer) add_overlay(center) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 1e513b846c..4a6170c251 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -22,7 +22,7 @@ var/obj/machinery/atmospherics/oldN = nodes[i] ..() if(oldN) - oldN.build_network() + SSair.add_to_rebuild_queue(oldN) /obj/machinery/atmospherics/pipe/destroy_network() QDEL_NULL(parent) @@ -111,3 +111,10 @@ pipe_color = paint_color update_node_icon() return TRUE + +/obj/machinery/atmospherics/pipe/attack_ghost(mob/dead/observer/O) + . = ..() + if(parent) + atmosanalyzer_scan(parent.air, O, src, FALSE) + else + to_chat(O, "[src] doesn't have a pipenet, which is probably a bug.") diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 0b26cfc2f0..03463ff0f7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -159,7 +159,6 @@ /obj/machinery/portable_atmospherics/canister/proto name = "prototype canister" - /obj/machinery/portable_atmospherics/canister/proto/default name = "prototype canister" desc = "The best way to fix an atmospheric emergency... or the best way to introduce one." @@ -172,7 +171,6 @@ can_min_release_pressure = (ONE_ATMOSPHERE / 30) prototype = TRUE - /obj/machinery/portable_atmospherics/canister/proto/default/oxygen name = "prototype canister" desc = "A prototype canister for a prototype bike, what could go wrong?" @@ -181,8 +179,6 @@ filled = 1 release_pressure = ONE_ATMOSPHERE*2 - - /obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture) ..() if(existing_mixture) @@ -192,7 +188,7 @@ pump = new(src, FALSE) pump.on = TRUE pump.stat = 0 - pump.build_network() + SSair.add_to_rebuild_queue(pump) update_icon() @@ -208,6 +204,7 @@ air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) if(starter_temp) air_contents.temperature = starter_temp + /obj/machinery/portable_atmospherics/canister/air/create_gas() air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) @@ -390,7 +387,7 @@ pressure = text2num(pressure) . = TRUE if(.) - release_pressure = CLAMP(round(pressure), can_min_release_pressure, can_max_release_pressure) + release_pressure = clamp(round(pressure), can_min_release_pressure, can_max_release_pressure) investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("valve") var/logmsg @@ -434,7 +431,7 @@ var/N = text2num(user_input) if(!N) return - timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) + timer_set = clamp(N,minimum_timer_set,maximum_timer_set) log_admin("[key_name(usr)] has activated a prototype valve timer") . = TRUE if("toggle_timer") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 8bf0554070..952db8315a 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -147,10 +147,14 @@ /obj/machinery/portable_atmospherics/analyzer_act(mob/living/user, obj/item/I) atmosanalyzer_scan(air_contents, user, src) -/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user) +/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user, attackchain_flags = NONE, damage_multiplier = 1) if(I.force < 10 && !(stat & BROKEN)) take_damage(0) else investigate_log("was smacked with \a [I] by [key_name(user)].", INVESTIGATE_ATMOS) add_fingerprint(user) ..() + +/obj/machinery/portable_atmospherics/attack_ghost(mob/dead/observer/O) + . = ..() + atmosanalyzer_scan(air_contents, O, src, FALSE) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 3603e46490..377e9285e3 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -20,7 +20,7 @@ pump = new(src, FALSE) pump.on = TRUE pump.stat = 0 - pump.build_network() + SSair.add_to_rebuild_queue(pump) /obj/machinery/portable_atmospherics/pump/Destroy() var/turf/T = get_turf(src) @@ -150,7 +150,7 @@ pressure = text2num(pressure) . = TRUE if(.) - pump.target_pressure = CLAMP(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) + pump.target_pressure = clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("eject") if(holding) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0d96c125a1..f841ae20ca 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -487,8 +487,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf toggle_helmet = FALSE // see the whites of their eyes shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - id = /obj/item/card/id/syndicate + gloves = /obj/item/clothing/gloves/tackler/combat belt = /obj/item/gun/ballistic/automatic/pistol/deagle/ctf l_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_pocket = /obj/item/ammo_box/magazine/recharge/ctf diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 50dd1e5608..c11267a5f3 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -205,6 +205,8 @@ H.facial_hair_style = random_facial_hair_style(gender) if(skin_tone) H.skin_tone = skin_tone + if(!GLOB.skin_tones[H.skin_tone]) + H.dna.skin_tone_override = H.skin_tone else H.skin_tone = random_skin_tone() H.update_hair() @@ -488,7 +490,7 @@ glasses = /obj/item/clothing/glasses/eyepatch mask = /obj/item/clothing/mask/cigarette/cigar/cohiba head = /obj/item/clothing/head/centhat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat shoes = /obj/item/clothing/shoes/combat/swat r_pocket = /obj/item/lighter id = /obj/item/card/id @@ -505,7 +507,7 @@ uniform = /obj/item/clothing/under/rank/security/officer suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat mask = /obj/item/clothing/mask/gas/sechailer/swat head = /obj/item/clothing/head/helmet/swat/nanotrasen back = /obj/item/storage/backpack/security diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index a13fecd11c..1b099a22db 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -1,20 +1,39 @@ /*Cabin areas*/ -/area/awaymission/snowforest - name = "Snow Forest" - icon_state = "away" - requires_power = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - /area/awaymission/cabin name = "Cabin" icon_state = "away2" requires_power = TRUE dynamic_lighting = DYNAMIC_LIGHTING_ENABLED -/area/awaymission/snowforest/lumbermill +/area/awaymission/cabin/snowforest + name = "Snow Forest" + icon_state = "away" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + +/area/awaymission/cabin/snowforest/sovietsurface + name = "Snow Forest" + icon_state = "awaycontent29" + requires_power = FALSE + +/area/awaymission/cabin/lumbermill name = "Lumbermill" icon_state = "away3" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + +/area/awaymission/cabin/caves/sovietcave + name = "Soviet Bunker" + icon_state = "awaycontent4" + +/area/awaymission/cabin/caves + name = "North Snowdin Caves" + icon_state = "awaycontent15" + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/awaymission/cabin/caves/mountain + name = "North Snowdin Mountains" + icon_state = "awaycontent24" /obj/structure/firepit name = "firepit" @@ -92,7 +111,7 @@ egg_type = null speak = list() -/*Cabin's forest*/ +/*Cabin's forest. Removed in the new cabin map since it was buggy and I prefer manual placement.*/ /datum/mapGenerator/snowy modules = list(/datum/mapGeneratorModule/bottomlayer/snow, \ /datum/mapGeneratorModule/snow/pineTrees, \ @@ -136,4 +155,4 @@ endTurfX = 159 endTurfY = 157 startTurfX = 37 - startTurfY = 35 + startTurfY = 35 \ No newline at end of file diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index d4c9fdbee7..6c8d8287d8 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,15 +1,19 @@ -// How much "space" we give the edge of the map -GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "[global.config.directory]/awaymissionconfig.txt")) -/proc/createRandomZlevel() - if(GLOB.awaydestinations.len) //crude, but it saves another var! +/proc/createRandomZlevel(name = AWAY_MISSION_NAME, list/traits = list(ZTRAIT_AWAY = TRUE), list/potential_levels = GLOB.potential_away_levels) + if(GLOB.random_zlevels_generated[name]) + stack_trace("[name] level already generated.") + return + if(!length(potential_levels)) + stack_trace("No potential [name] level to load has been found.") return - if(GLOB.potentialRandomZlevels && GLOB.potentialRandomZlevels.len) - to_chat(world, "Loading away mission...") - var/map = pick(GLOB.potentialRandomZlevels) - load_new_z_level(map, "Away Mission") - to_chat(world, "Away mission loaded.") + var/start_time = REALTIMEOFDAY + var/map = pick(potential_levels) + if(!load_new_z_level(map, name, traits)) + INIT_ANNOUNCE("Failed to load [name]! map filepath: [map]!") + return + INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") + GLOB.random_zlevels_generated[name] = TRUE /proc/reset_gateway_spawns(reset = FALSE) for(var/obj/machinery/gateway/G in world) diff --git a/code/modules/buildmode/effects/line.dm b/code/modules/buildmode/effects/line.dm index 60191de934..8bba27ac88 100644 --- a/code/modules/buildmode/effects/line.dm +++ b/code/modules/buildmode/effects/line.dm @@ -12,7 +12,7 @@ var/matrix/mat = matrix() mat.Translate(0, 16) mat.Scale(1, sqrt((x_offset * x_offset) + (y_offset * y_offset)) / 32) - mat.Turn(90 - ATAN2(x_offset, y_offset)) // So... You pass coords in order x,y to this version of atan2. It should be called acsc2. + mat.Turn(90 - arctan(x_offset, y_offset)) // So... You pass coords in order x,y to this version of atan2. It should be called acsc2. mat.Translate(atom_a.pixel_x, atom_a.pixel_y) transform = mat diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm index ba415c50fc..4aed8ac700 100644 --- a/code/modules/buildmode/submodes/copy.dm +++ b/code/modules/buildmode/submodes/copy.dm @@ -23,6 +23,6 @@ DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T) log_admin("Build Mode: [key_name(c)] copied [stored] to [AREACOORD(object)]") else if(right_click) - if(ismovableatom(object)) // No copying turfs for now. + if(ismovable(object)) // No copying turfs for now. to_chat(c, "[object] set as template.") stored = object diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 7afc0d8786..c1f8d9c9d0 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -121,7 +121,7 @@ /datum/bounty/item/medical/defibrillator name = "New defibillators" - description = "After years of storge our defib units have become liabilities. Please send us some new ones." + description = "After years of storage our defibrillation units have worn out. Please send us some new ones." reward = 2250 required_count = 5 wanted_types = list(/obj/item/defibrillator) diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index c543872565..a4632f7ed0 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -55,7 +55,7 @@ /datum/bounty/item/science/advanced_mop name = "Advanced Mop" - description = "Excuse me. I'd like to request 17 credits for a push broom rebristling. Either that, or an advanced mop." + description = "Excuse me. I'd like to request 17 cr for a push broom rebristling. Either that, or an advanced mop." reward = 3000 wanted_types = list(/obj/item/mop/advanced) @@ -116,3 +116,50 @@ exclude_types = list(/obj/item/stack/ore/bluespace_crystal, /obj/item/stack/sheet/bluespace_crystal, /obj/item/stack/ore/bluespace_crystal/refined) + +/datum/bounty/item/science/noneactive_reactivearmor + name = "Reactive Armor Shells" + description = "Do to the breakthroughs in anomalies, we can not keep up in making reactive armor shells, can you send us a few?" + reward = 2000 + required_count = 5 + wanted_types = list(/obj/item/reactive_armour_shell, /obj/item/clothing/suit/armor/reactive) + exclude_types = list(/obj/item/clothing/suit/armor/reactive/repulse, + /obj/item/clothing/suit/armor/reactive/tesla, + /obj/item/clothing/suit/armor/reactive/teleport, + /obj/item/clothing/suit/armor/reactive/stealth, + /obj/item/clothing/suit/armor/reactive/fire) + +/datum/bounty/item/science/anomaly_core + name = "Anomaly Core" + description = "A new theory has begun that each sector of space has different anomalies, this all started when a local station tried to make a fire based reactive suit and failed making a stealth version, please send us a core so we may study it more." + reward = 2500 + required_count = 1 + wanted_types = list(/obj/item/assembly/signaler/anomaly) + +/datum/bounty/item/science/anomaly_neutralizer + name = "Anomaly Neutralizers" + description = "An idea for a long time was to use an unstable Supermatter Shard to help create the breeding grounds for an unstable part of space to harvest any anomalies we want. It worked a little too well and now were out of anomaly neutralizers please send us a baker's dozen." + reward = 2500 + required_count = 13 + wanted_types = list(/obj/item/anomaly_neutralizer) + +/datum/bounty/item/science/integrated_circuit_printer + name = "Integrated Circuit Printer" + description = "due to a paperwork error, a newly made integrated circuit manufacturer line is missing three of its printers needed to operate. Until the paper work is corrected we are outsourcing this problem, so please send us three integrated circuit printers." + reward = 2000 + required_count = 3 + wanted_types = list(/obj/item/integrated_circuit_printer) + +/datum/bounty/item/science/integrated_circuit_disks + name = "Integrated Circuit Printer Upgrade Disks" + description = "HR has requested ten more integrated circuit printer upgrade disks, please send them to CC as soon as possible." + reward = 2000 + required_count = 10 //Its just metal + wanted_types = list(/obj/item/disk/integrated_circuit/upgrade) + +/datum/bounty/item/science/nanite_trash + name = "Nanite Based Gear" + description = "CC wants to make nanite based gear available to a new wing of devolvement but lacks the hand held tools to get it full up and running. Please send us any you have." + reward = 2500 + required_count = 20 //Its just metal + wanted_types = list( /obj/item/nanite_remote, /obj/item/nanite_remote/comm, /obj/item/nanite_scanner) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index bfd97e4d1f..b888dc1a28 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -21,7 +21,9 @@ GLOBAL_LIST_EMPTY(bounties_list) // Called when the claim button is clicked. Override to provide fancy rewards. /datum/bounty/proc/claim() if(can_claim()) - SSshuttle.points += reward + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(reward) claimed = TRUE // If an item sent in the cargo shuttle can satisfy the bounty. @@ -126,11 +128,11 @@ GLOBAL_LIST_EMPTY(bounties_list) /proc/setup_bounties() var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes! - + /********************************Subtype Gens********************************/ var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2, - /datum/bounty/item/mech = 1, - /datum/bounty/item/chef = 2, + /datum/bounty/item/mech = 1, + /datum/bounty/item/chef = 2, /datum/bounty/item/security = 1, /datum/bounty/virus = 1, /datum/bounty/item/engineering = 1, @@ -139,30 +141,30 @@ GLOBAL_LIST_EMPTY(bounties_list) /datum/bounty/item/botany = 2, /datum/bounty/item/silly = 1, /datum/bounty/item/gardencook = 1) - + for(var/the_type in easy_add_list_subtypes) for(var/i in 1 to easy_add_list_subtypes[the_type]) pick = pick(subtypesof(the_type)) try_add_bounty(new pick) - + /********************************Strict Type Gens********************************/ var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1, /datum/bounty/reagent/complex_drink = 1, /datum/bounty/reagent/chemical = 1) - + for(var/the_strict_type in easy_add_list_strict_types) for(var/i in 1 to easy_add_list_strict_types[the_strict_type]) try_add_bounty(new the_strict_type) - + /********************************Dynamic Gens********************************/ - + for(var/i in 0 to 1) if(prob(50)) pick = pick(subtypesof(/datum/bounty/item/slime)) else pick = pick(subtypesof(/datum/bounty/item/science)) try_add_bounty(new pick) - + /********************************Cutoff for Non-Low Priority Bounties********************************/ var/datum/bounty/B = pick(GLOB.bounties_list) B.mark_high_priority() @@ -172,7 +174,7 @@ GLOBAL_LIST_EMPTY(bounties_list) /datum/bounty/item/syndicate_documents, /datum/bounty/item/adamantine, /datum/bounty/more_bounties) - + for(var/low_priority_bounty in low_priority_strict_type_list) try_add_bounty(new low_priority_bounty) diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index 45260f4926..f499c38090 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -35,10 +35,10 @@ if(!GLOB.bounties_list.len) setup_bounties() - + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) var/list/dat = list({"Refresh Print Paper -

    Credits: [SSshuttle.points]

    +

    Credits: [D.account_balance]

    "}) for(var/datum/bounty/B in GLOB.bounties_list) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index c45461317d..3418f78dbd 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -488,7 +488,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one yourself (then refresh) for now, but yell at a mapper to fix this, today!") CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!") - return orderedArea = list() if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 64b208a90b..d010cee761 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -3,6 +3,7 @@ desc = "Used to order supplies, approve requests, and control the shuttle." icon_screen = "supply" circuit = /obj/item/circuitboard/computer/cargo + req_access = list(ACCESS_CARGO) ui_x = 780 ui_y = 750 @@ -17,6 +18,7 @@ var/obj/item/radio/headset/radio /// var that tracks message cooldown var/message_cooldown + var/list/loaded_coupons light_color = "#E2853D"//orange @@ -25,6 +27,7 @@ desc = "Used to request supplies from cargo." icon_screen = "request" circuit = /obj/item/circuitboard/computer/cargo/request + req_access = list() requestonly = TRUE /obj/machinery/computer/cargo/Initialize() @@ -49,6 +52,7 @@ . |= EXPORT_EMAG /obj/machinery/computer/cargo/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) return if(user) @@ -62,7 +66,9 @@ var/obj/item/circuitboard/computer/cargo/board = circuit board.contraband = TRUE board.obj_flags |= EMAGGED + req_access = list() update_static_data(user) + return ..() /obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) @@ -74,9 +80,12 @@ /obj/machinery/computer/cargo/ui_data() var/list/data = list() data["location"] = SSshuttle.supply.getStatusText() + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + data["points"] = D.account_balance data["away"] = SSshuttle.supply.getDockedId() == "supply_away" + data["self_paid"] = self_paid data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE - data["points"] = SSshuttle.points data["loan"] = !!SSshuttle.shuttle_loan data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched var/message = "Remember to stamp and send back the supply manifests." @@ -92,6 +101,7 @@ "cost" = SO.pack.cost, "id" = SO.id, "orderer" = SO.orderer, + "paid" = !isnull(SO.paying_account) //paid by requester )) data["requests"] = list() @@ -110,6 +120,7 @@ var/list/data = list() data["requestonly"] = requestonly data["supplies"] = list() + data["emagged"] = obj_flags & EMAGGED for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] if(!data["supplies"][P.group]) @@ -124,13 +135,19 @@ "cost" = P.cost, "id" = pack, "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. - "access" = P.access + "private_goody" = P.goody == PACK_GOODY_PRIVATE, + "goody" = P.goody == PACK_GOODY_PUBLIC, + "access" = P.access, + "can_private_buy" = P.can_private_buy )) return data /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) if(..()) return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return switch(action) if("send") if(!SSshuttle.supply.canMove()) @@ -182,24 +199,56 @@ name = usr.real_name rank = "Silicon" + var/datum/bank_account/account + if(self_paid) + if(!pack.can_private_buy && !(obj_flags & EMAGGED)) + return + var/obj/item/card/id/id_card = usr.get_idcard(TRUE) + if(!istype(id_card)) + say("No ID card detected.") + return + account = id_card.registered_account + if(!istype(account)) + say("Invalid bank account.") + return + var/reason = "" - if(requestonly) + if(requestonly && !self_paid) reason = stripped_input("Reason:", name, "") if(isnull(reason) || ..()) return + if(pack.goody == PACK_GOODY_PRIVATE && !self_paid) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + say("ERROR: Private small crates may only be purchased by private accounts.") + return + + var/obj/item/coupon/applied_coupon + for(var/i in loaded_coupons) + var/obj/item/coupon/coupon_check = i + if(pack.type == coupon_check.discounted_pack) + say("Coupon found! [round(coupon_check.discount_pct_off * 100)]% off applied!") + coupon_check.moveToNullspace() + applied_coupon = coupon_check + break + var/turf/T = get_turf(src) - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) + var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account, applied_coupon) SO.generateRequisition(T) - if(requestonly) + if(requestonly && !self_paid) SSshuttle.requestlist += SO else SSshuttle.shoppinglist += SO + if(self_paid) + say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") . = TRUE if("remove") var/id = text2num(params["id"]) for(var/datum/supply_order/SO in SSshuttle.shoppinglist) if(SO.id == id) + if(SO.applied_coupon) + say("Coupon refunded.") + SO.applied_coupon.forceMove(get_turf(src)) SSshuttle.shoppinglist -= SO . = TRUE break @@ -224,6 +273,9 @@ if("denyall") SSshuttle.requestlist.Cut() . = TRUE + if("toggleprivate") + self_paid = !self_paid + . = TRUE if(.) post_signal("supply") diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm new file mode 100644 index 0000000000..c77050c530 --- /dev/null +++ b/code/modules/cargo/coupon.dm @@ -0,0 +1,50 @@ + +#define COUPON_OMEN "omen" + +/obj/item/coupon + name = "coupon" + desc = "It doesn't matter if you didn't want it before, what matters now is that you've got a coupon for it!" + icon_state = "data_1" + icon = 'icons/obj/card.dmi' + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_TINY + var/datum/supply_pack/discounted_pack + var/discount_pct_off = 0.05 + var/obj/machinery/computer/cargo/inserted_console + +/// Choose what our prize is :D +/obj/item/coupon/proc/generate() + discounted_pack = pick(subtypesof(/datum/supply_pack/goody)) + var/list/chances = list("0.10" = 4, "0.15" = 8, "0.20" = 10, "0.25" = 8, "0.50" = 4, COUPON_OMEN = 1) + discount_pct_off = pickweight(chances) + if(discount_pct_off == COUPON_OMEN) + name = "coupon - fuck you" + desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?" + if(ismob(loc)) + var/mob/M = loc + to_chat(M, "The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?") + M.AddComponent(/datum/component/omen, TRUE, src) + else + discount_pct_off = text2num(discount_pct_off) + name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]" + +/obj/item/coupon/attack_obj(obj/O, mob/living/user) + if(!istype(O, /obj/machinery/computer/cargo)) + return ..() + if(discount_pct_off == COUPON_OMEN) + to_chat(user, "\The [O] validates the coupon as authentic, but refuses to accept it...") + O.say("Coupon fulfillment already in progress...") + return + + inserted_console = O + LAZYADD(inserted_console.loaded_coupons, src) + inserted_console.say("Coupon for [initial(discounted_pack.name)] applied!") + forceMove(inserted_console) + +/obj/item/coupon/Destroy() + if(inserted_console) + LAZYREMOVE(inserted_console.loaded_coupons, src) + inserted_console = null + . = ..() + +#undef COUPON_OMEN diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index bb90fa717a..671c22bde5 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -26,6 +26,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/list/total_value = list() //export instance => total value of sold objects var/list/reagents_volume = list()//export reagents => into the total volume of the object sold var/list/reagents_value = list()//export reagents => into the reagent type total value. + var/list/exported_atoms_ref = list() //if they're not deleted they go in here for use. // external_report works as "transaction" object, pass same one in if you're doing more than one export in single go /proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report) @@ -67,7 +68,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message var/message = "" var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above. - var/k_elasticity = 1/300 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 0 + var/k_elasticity = 1/100 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 100 var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type. var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. var/list/exclude_types = list() // Types excluded from export diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index 10b3d4f707..646e1c6e47 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -1,5 +1,6 @@ /datum/export/gear include_subtypes = FALSE + k_elasticity = 0 //We always want clothing/gear //blanket /datum/export/gear/hat @@ -309,7 +310,7 @@ /datum/export/gear/combatgloves cost = 80 unit_name = "combat gloves" - export_types = list(/obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/rapid, /obj/item/clothing/gloves/krav_maga) + export_types = list(/obj/item/clothing/gloves/tackler/combat, /obj/item/clothing/gloves/tackler/dolphin, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/clothing/gloves/krav_maga) include_subtypes = TRUE /datum/export/gear/bonegloves @@ -797,4 +798,4 @@ datum/export/gear/glasses //glasses are not worth selling export_types = list(/obj/item/clothing/head/chameleon, /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/glasses/chameleon,\ /obj/item/clothing/gloves/chameleon, /obj/item/clothing/head/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/storage/backpack/chameleon, \ /obj/item/storage/belt/chameleon, /obj/item/radio/headset/chameleon, /obj/item/pda/chameleon, /obj/item/stamp/chameleon, /obj/item/clothing/neck/cloak/chameleon) - include_subtypes = TRUE \ No newline at end of file + include_subtypes = TRUE diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index b7bdcb1f59..2b93a25a61 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -111,7 +111,7 @@ include_subtypes = FALSE /datum/export/large/am_control_unit - cost = 4000 + cost = 2000 unit_name = "antimatter control unit" export_types = list(/obj/machinery/power/am_control_unit) @@ -171,10 +171,10 @@ var/worth = 10 var/gases = C.air_contents.gases - worth += gases[/datum/gas/bz]*4 + worth += gases[/datum/gas/bz]*3 worth += gases[/datum/gas/stimulum]*25 worth += gases[/datum/gas/hypernoblium]*1000 - worth += gases[/datum/gas/miasma]*4 + worth += gases[/datum/gas/miasma]*2 worth += gases[/datum/gas/tritium]*7 worth += gases[/datum/gas/pluoxium]*6 worth += gases[/datum/gas/nitryl]*30 diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm index 60515781f9..d59ef1093f 100644 --- a/code/modules/cargo/exports/manifest.dm +++ b/code/modules/cargo/exports/manifest.dm @@ -76,19 +76,3 @@ /datum/export/manifest_correct_denied/get_cost(obj/O) var/obj/item/paper/fluff/jobs/cargo/manifest/M = O return ..() - M.order_cost - -// Paper work done correctly - -/datum/export/paperwork_correct - cost = 120 // finicky number 20 x 120 = 2400 per crate - k_elasticity = 0 - unit_name = "correct paperwork" - export_types = list(/obj/item/folder/paperwork_correct) - -// Paper work not done retruned - -/datum/export/paperwork_incorrect - cost = -500 // Failed to meet NT standers - k_elasticity = 0 - unit_name = "returned incorrect paperwork" - export_types = list(/obj/item/folder/paperwork) diff --git a/code/modules/cargo/exports/organs_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm index 7a77568cc7..a6c5ee93ca 100644 --- a/code/modules/cargo/exports/organs_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -2,15 +2,14 @@ /datum/export/robotics include_subtypes = FALSE - k_elasticity = 0 //ALWAYS worth selling upgrades + k_elasticity = 1/50 /datum/export/implant include_subtypes = FALSE - k_elasticity = 0 //ALWAYS worth selling upgrades + k_elasticity = 1/50 /datum/export/organs include_subtypes = TRUE - k_elasticity = 0 //ALWAYS worth selling orgains /datum/export/implant/autodoc cost = 150 @@ -60,11 +59,6 @@ unit_name = "thrusters set implant" export_types = list(/obj/item/organ/cyberimp/chest/thrusters) -/datum/export/implant/thrusters - cost = 150 - unit_name = "thrusters set implant" - export_types = list(/obj/item/organ/cyberimp/chest/thrusters) - /datum/export/implant/arm cost = 200 unit_name = "arm set implant" diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index e4efaf0810..da3c0cf31d 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -110,9 +110,9 @@ include_subtypes = FALSE /datum/export/glasswork_lens - cost = 1800 + cost = 1600 unit_name = "small glass lens" - export_types = list(/obj/item/lens) + export_types = list(/obj/item/glasswork/glass_base/lens) /datum/export/glasswork_spouty cost = 1200 @@ -131,3 +131,27 @@ unit_name = "large flask" export_types = list(/obj/item/reagent_containers/glass/beaker/flask/large) include_subtypes = FALSE + +/datum/export/glasswork_teaplate + cost = 1000 + unit_name = "tea gear" + export_types = list(/obj/item/tea_plate) + include_subtypes = FALSE + +/datum/export/glasswork_teacup + cost = 1600 + unit_name = "tea gear" + export_types = list(/obj/item/tea_cup) + include_subtypes = FALSE + +/datum/export/glasswork_laserpointer + cost = 2600 + unit_name = "hand made laserpointer" + export_types = list(/obj/item/laser_pointer/blue/handmade) + include_subtypes = FALSE + +/datum/export/glasswork_glasses + cost = 5000 + unit_name = "hand made glasses" + export_types = list(/obj/item/glasswork/glasses) + include_subtypes = FALSE diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index be0d2d6bee..120bfbe5e4 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -120,12 +120,6 @@ message = "of cloth" export_types = list(/obj/item/stack/sheet/cloth) -/datum/export/stack/silk - cost = 200 //The new plasma - unit_name = "sheets" - message = "of silk" - export_types = list(/obj/item/stack/sheet/silk) - /datum/export/stack/duracloth cost = 40 unit_name = "sheets" diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index a68d7238b5..a889f0ed13 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -1,4 +1,7 @@ -/datum/export/toolbox +/datum/export/tool + k_elasticity = 1/500 //Tool selling almost allways fine a target + +/datum/export/tool/toolbox cost = 6 unit_name = "toolbox" export_types = list(/obj/item/storage/toolbox) @@ -29,93 +32,93 @@ // Lights/Eletronic -/datum/export/lights +/datum/export/tool/lights cost = 10 unit_name = "light fixer" export_types = list(/obj/item/wallframe/light_fixture) include_subtypes = TRUE -/datum/export/apc_board +/datum/export/tool/apc_board cost = 5 unit_name = "apc electronics" export_types = list(/obj/item/electronics/apc) include_subtypes = TRUE -/datum/export/apc_frame +/datum/export/tool/apc_frame cost = 3 unit_name = "apc frame" export_types = list(/obj/item/wallframe/apc) include_subtypes = TRUE -/datum/export/floodlights +/datum/export/tool/floodlights cost = 15 unit_name = "floodlight fixer" export_types = list(/obj/structure/floodlight_frame) include_subtypes = TRUE -/datum/export/bolbstubes +/datum/export/tool/bolbstubes cost = 1 //Time unit_name = "light replacement" export_types = list(/obj/item/light/tube, /obj/item/light/bulb) -/datum/export/lightreplacer +/datum/export/tool/lightreplacer cost = 20 unit_name = "lightreplacer" export_types = list(/obj/item/lightreplacer) // Basic tools -/datum/export/basicmining +/datum/export/tool/basicmining cost = 30 unit_name = "basic mining tool" export_types = list(/obj/item/pickaxe, /obj/item/pickaxe/mini, /obj/item/shovel, /obj/item/resonator) include_subtypes = FALSE -/datum/export/upgradedmining +/datum/export/tool/upgradedmining cost = 80 unit_name = "mining tool" export_types = list(/obj/item/pickaxe/silver, /obj/item/pickaxe/drill, /obj/item/gun/energy/plasmacutter, /obj/item/resonator/upgraded) include_subtypes = FALSE -/datum/export/advdmining +/datum/export/tool/advdmining cost = 150 unit_name = "advanced mining tool" export_types = list(/obj/item/pickaxe/diamond, /obj/item/pickaxe/drill/diamonddrill, /obj/item/pickaxe/drill/jackhammer, /obj/item/gun/energy/plasmacutter/adv) include_subtypes = FALSE -/datum/export/screwdriver +/datum/export/tool/screwdriver cost = 2 unit_name = "screwdriver" export_types = list(/obj/item/screwdriver) include_subtypes = FALSE -/datum/export/wrench +/datum/export/tool/wrench cost = 2 unit_name = "wrench" export_types = list(/obj/item/wrench) -/datum/export/crowbar +/datum/export/tool/crowbar cost = 2 unit_name = "crowbar" export_types = list(/obj/item/crowbar) -/datum/export/wirecutters +/datum/export/tool/wirecutters cost = 2 unit_name = "pair" message = "of wirecutters" export_types = list(/obj/item/wirecutters) -/datum/export/weldingtool +/datum/export/tool/weldingtool cost = 5 unit_name = "welding tool" export_types = list(/obj/item/weldingtool) include_subtypes = FALSE -/datum/export/weldingtool/emergency +/datum/export/tool/weldingtool/emergency cost = 2 unit_name = "emergency welding tool" export_types = list(/obj/item/weldingtool/mini) -/datum/export/weldingtool/industrial +/datum/export/tool/weldingtool/industrial cost = 10 unit_name = "industrial welding tool" export_types = list(/obj/item/weldingtool/largetank, /obj/item/weldingtool/hugetank) @@ -131,23 +134,23 @@ unit_name = "pocket fire extinguisher" export_types = list(/obj/item/extinguisher/mini) -/datum/export/flashlight +/datum/export/tool/flashlight cost = 3 unit_name = "flashlight" export_types = list(/obj/item/flashlight) include_subtypes = FALSE -/datum/export/flashlight/flare +/datum/export/tool/flashlight/flare cost = 2 unit_name = "flare" export_types = list(/obj/item/flashlight/flare) -/datum/export/flashlight/seclite +/datum/export/tool/flashlight/seclite cost = 5 unit_name = "seclite" export_types = list(/obj/item/flashlight/seclite) -/datum/export/analyzer +/datum/export/tool/analyzer cost = 5 unit_name = "analyzer" export_types = list(/obj/item/analyzer) @@ -163,32 +166,32 @@ export_types = list(/obj/item/radio) exclude_types = list(/obj/item/radio/mech) -/datum/export/rcd +/datum/export/tool/rcd cost = 100 unit_name = "rapid construction device" export_types = list(/obj/item/construction/rcd) -/datum/export/rcd_ammo +/datum/export/tool/rcd_ammo cost = 60 unit_name = "compressed matter cardridge" export_types = list(/obj/item/rcd_ammo) -/datum/export/rpd +/datum/export/tool/rpd cost = 100 unit_name = "rapid piping device" export_types = list(/obj/item/pipe_dispenser) -/datum/export/rld +/datum/export/tool/rld cost = 150 unit_name = "rapid light device" export_types = list(/obj/item/construction/rld) -/datum/export/rped +/datum/export/tool/rped cost = 100 unit_name = "rapid part exchange device" export_types = list(/obj/item/storage/part_replacer) -/datum/export/bsrped +/datum/export/tool/bsrped cost = 200 unit_name = "blue space part exchange device" export_types = list(/obj/item/storage/part_replacer/bluespace) diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index 836dc044b7..2342603bde 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -287,7 +287,7 @@ /datum/export/weapon/gloves cost = 90 unit_name = "star struck gloves" - export_types = list(/obj/item/clothing/gloves/rapid) + export_types = list(/obj/item/clothing/gloves/fingerless/pugilist/rapid) /datum/export/weapon/l6 cost = 500 diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index a65d8cad40..9fe427c45a 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -96,17 +96,19 @@ /obj/machinery/computer/cargo/express/ui_data(mob/user) var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? var/list/data = list() + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + data["points"] = D.account_balance data["locked"] = locked//swipe an ID to unlock data["siliconUser"] = hasSiliconAccessInArea(user) data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? - data["canBuyBeacon"] = cooldown <= 0 && SSshuttle.points >= BEACON_COST + data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary data["hasBeacon"] = beacon != null//is there a linked beacon? data["beaconName"] = beacon ? beacon.name : "No Beacon Found" data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons - data["points"] = SSshuttle.points data["supplies"] = list() message = "Sales are near-instantaneous - please choose carefully." if(SSshuttle.supplyBlocked) @@ -127,6 +129,9 @@ return data /obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return switch(action) if("LZCargo") usingBeacon = FALSE @@ -137,13 +142,14 @@ if (beacon) beacon.update_status(SP_READY) //turns on the beacon's ready light if("printBeacon") - if (SSshuttle.points >= BEACON_COST) - cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam - var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) - C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) - printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 - beacon.name = "Supply Pod Beacon #[printed_beacons]" - SSshuttle.points -= BEACON_COST + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + if(D.adjust_money(-BEACON_COST)) + cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam + var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) + C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) + printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 + beacon.name = "Supply Pod Beacon #[printed_beacons]" if("add")//Generate Supply Order first var/id = text2path(params["id"]) @@ -163,8 +169,12 @@ var/reason = "" var/list/empty_turfs var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) + var/points_to_check + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + points_to_check = D.account_balance if(!(obj_flags & EMAGGED)) - if(SO.pack.cost <= SSshuttle.points) + if(SO.pack.cost <= points_to_check) var/LZ if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay LZ = get_turf(beacon) @@ -181,14 +191,14 @@ CHECK_TICK if(empty_turfs && empty_turfs.len) LZ = pick(empty_turfs) - if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call - SSshuttle.points -= SO.pack.cost + if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call + D.adjust_money(-SO.pack.cost) SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]")) new /obj/effect/abstract/DPtarget(LZ, podType, SO) . = TRUE update_icon() else - if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^) + if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone for(var/turf/open/floor/T in landingzone.contents) if(is_blocked_turf(T)) @@ -196,7 +206,7 @@ LAZYADD(empty_turfs, T) CHECK_TICK if(empty_turfs && empty_turfs.len) - SSshuttle.points -= SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) + D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS))) SSblackbox.record_feedback("nested tally", "cargo_imports", MAX_EMAG_ROCKETS, list("[SO.pack.cost * 0.72]", "[SO.pack.name]")) SO.generateRequisition(get_turf(src)) for(var/i in 1 to MAX_EMAG_ROCKETS) diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 1b4ebd6c1a..be2db06346 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -2,9 +2,12 @@ name = "gondola" real_name = "gondola" desc = "The silent walker. This one seems to be part of a delivery agency." - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" faction = list("gondola") turns_per_move = 10 icon = 'icons/mob/gondolapod.dmi' diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index b78f218348..4fa6a4eade 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -27,15 +27,20 @@ var/orderer_rank var/orderer_ckey var/reason + var/discounted_pct var/datum/supply_pack/pack + var/datum/bank_account/paying_account + var/obj/item/coupon/applied_coupon -/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason) +/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account, coupon) id = SSshuttle.ordernum++ src.pack = pack src.orderer = orderer src.orderer_rank = orderer_rank src.orderer_ckey = orderer_ckey src.reason = reason + src.paying_account = paying_account + src.applied_coupon = coupon /datum/supply_order/proc/generateRequisition(turf/T) var/obj/item/paper/P = new(T) @@ -47,64 +52,72 @@ P.info += "Item: [pack.name]
    " P.info += "Access Restrictions: [get_access_desc(pack.access)]
    " P.info += "Requested by: [orderer]
    " + if(paying_account) + P.info += "Paid by: [paying_account.account_holder]
    " P.info += "Rank: [orderer_rank]
    " P.info += "Comment: [reason]
    " P.update_icon() return P -/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C) - var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(C, id, pack.cost) +/datum/supply_order/proc/generateManifest(obj/container, owner, packname) //generates-the-manifests. + var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(container, id, 0) var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name() - P.name = "shipping manifest - #[id] ([pack.name])" + P.name = "shipping manifest - [packname?"#[id] ([pack.name])":"(Grouped Item Crate)"]" P.info += "

    [command_name()] Shipping Manifest

    " P.info += "
    " + if(id && !(id == "Cargo")) + P.info += "Direct purchase from [owner]
    " + P.name += " - Purchased by [owner]" P.info += "Order #[id]
    " P.info += "Destination: [station_name]
    " - P.info += "Item: [pack.name]
    " + if(packname) + P.info += "Item: [packname]
    " P.info += "Contents:
    " P.info += "
      " - for(var/atom/movable/AM in C.contents - P) - if((P.errors & MANIFEST_ERROR_CONTENTS)) - if(prob(50)) - P.info += "
    • [AM.name]
    • " - else - continue + var/list/ignore_this = list(P) + if(istype(container, /obj/structure/closet)) + var/obj/structure/closet/C = container + ignore_this += C.lockerelectronics + for(var/atom/movable/AM in container.contents - ignore_this) + if((P.errors & MANIFEST_ERROR_CONTENTS) && prob(50)) + continue P.info += "
    • [AM.name]
    • " P.info += "
    " P.info += "

    Stamp below to confirm receipt of goods:

    " + if(P.errors & MANIFEST_ERROR_ITEM) + var/static/list/blacklisted_error = typecacheof(list( + /obj/structure/closet/crate/secure, + /obj/structure/closet/crate/large, + /obj/structure/closet/secure_closet/goodies + )) + if(blacklisted_error[container.type]) + P.errors &= ~MANIFEST_ERROR_ITEM + else + var/lost = max(round(container.contents.len / 10), 1) + while(--lost >= 0) + qdel(pick(container.contents)) + P.update_icon() - P.forceMove(C) - C.manifest = P - C.update_icon() + P.forceMove(container) + + if(istype(container, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/C = container + C.manifest = P + C.update_icon() return P /datum/supply_order/proc/generate(atom/A) - var/obj/structure/closet/crate/C = pack.generate(A) - var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C) - - if(M.errors & MANIFEST_ERROR_ITEM) - if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large)) - M.errors &= ~MANIFEST_ERROR_ITEM - else - var/lost = max(round(C.contents.len / 10), 1) - while(--lost >= 0) - qdel(pick(C.contents)) + var/obj/structure/closet/crate/C = pack.generate(A, paying_account) + generateManifest(C, paying_account, pack) return C -//Paperwork for NT -/obj/item/folder/paperwork - name = "Incomplete Paperwork" - desc = "These should've been filled out four months ago! Unfinished grant papers issued by Nanotrasen's finance department. Complete this page for additional funding." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "docs_generic" - -/obj/item/folder/paperwork_correct - name = "Finished Paperwork" - desc = "A neat stack of filled-out forms, in triplicate and signed. Is there anything more satisfying? Make sure they get stamped." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "docs_verified" +/datum/supply_order/proc/generateCombo(var/miscbox, var/misc_own, var/misc_contents) + for (var/I in misc_contents) + new I(miscbox) + generateManifest(miscbox, misc_own, "") + return diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 07a75bbfaf..7ec3a775a5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -15,17 +15,23 @@ var/special_enabled = FALSE var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console var/admin_spawned = FALSE //Can only an admin spawn this crate? + var/goody = PACK_GOODY_NONE //Small items can be grouped into a single crate.They also come in a closet/lockbox instead of a full crate, so the 700 min doesn't apply + var/can_private_buy = TRUE //Can it be purchased privately by each crewmember? -/datum/supply_pack/proc/generate(atom/A) - var/obj/structure/closet/crate/C = new crate_type(A) - C.name = crate_name +/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) + var/obj/structure/closet/crate/C + if(paying_account) + C = new /obj/structure/closet/crate/secure/owned(A, paying_account) + C.name = "[crate_name] - Purchased by [paying_account.account_holder]" + else + C = new crate_type(A) + C.name = crate_name if(access) C.req_access = list(access) if(access_any) C.req_one_access = access_any fill(C) - return C /datum/supply_pack/proc/fill(obj/structure/closet/crate/C) diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm index d832200201..835457536f 100644 --- a/code/modules/cargo/packs/armory.dm +++ b/code/modules/cargo/packs/armory.dm @@ -10,6 +10,7 @@ group = "Armory" access = ACCESS_ARMORY crate_type = /obj/structure/closet/crate/secure/weapon + can_private_buy = FALSE /datum/supply_pack/security/armory/bulletarmor name = "Bulletproof Armor Crate" @@ -36,15 +37,6 @@ contains = list(/obj/item/storage/box/chemimp) crate_name = "chemical implant crate" -/datum/supply_pack/security/armory/combatknives - name = "Combat Knives Crate" - desc = "Contains three sharpened combat knives. Each knife guaranteed to fit snugly inside any Nanotrasen-standard boot. Requires Armory access to open." - cost = 3200 - contains = list(/obj/item/kitchen/knife/combat, - /obj/item/kitchen/knife/combat, - /obj/item/kitchen/knife/combat) - crate_name = "combat knife crate" - /datum/supply_pack/security/armory/ballistic name = "Combat Shotguns Crate" desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, with three Shotgun Bandoliers, as well as seven buchshot and 12g shotgun slugs. Requires Armory access to open." @@ -170,18 +162,17 @@ cost = 7500 contraband = TRUE contains = list(/obj/item/reagent_containers/food/snacks/rationpack, - /obj/item/ammo_box/a762, - /obj/item/storage/toolbox/ammo, + /obj/item/ammo_box/magazine/m10mm/rifle, /obj/item/clothing/suit/armor/vest/russian, /obj/item/clothing/head/helmet/rus_helmet, /obj/item/clothing/shoes/russian, - /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/under/syndicate/rus_army, /obj/item/clothing/under/costume/soviet, /obj/item/clothing/mask/russian_balaclava, /obj/item/clothing/head/helmet/rus_ushanka, /obj/item/clothing/suit/armor/vest/russian_coat, - /obj/item/gun/ballistic/shotgun/boltaction) + /obj/item/gun/ballistic/automatic/surplus) crate_name = "surplus military crate" /datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C) @@ -201,8 +192,8 @@ /obj/item/clothing/mask/gas/sechailer/swat, /obj/item/storage/belt/military/assault, /obj/item/storage/belt/military/assault, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/gloves/combat) + /obj/item/clothing/gloves/tackler/combat/insulated, + /obj/item/clothing/gloves/tackler/combat/insulated) crate_name = "swat crate" /datum/supply_pack/security/armory/wt550 @@ -215,7 +206,7 @@ /datum/supply_pack/security/armory/wt550ammo name = "WT-550 Semi-Auto SMG Ammo Crate" - desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + desc = "Contains four 32-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." cost = 1750 contains = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9, @@ -225,7 +216,7 @@ /datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stamcrit someone name = "WT-550 Semi-Auto SMG Non-Lethal Ammo Crate" - desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + desc = "Contains four 32-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." cost = 1000 contains = list(/obj/item/ammo_box/magazine/wt550m9/wtrubber, /obj/item/ammo_box/magazine/wt550m9/wtrubber, diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index dab8cad5b6..c181d6fb74 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -71,7 +71,8 @@ /obj/item/clothing/mask/gas/syndicate, /obj/item/clothing/neck/necklace/dope, /obj/item/vending_refill/donksoft, - /obj/item/circuitboard/computer/arcade/amputation) + /obj/item/circuitboard/computer/arcade/amputation, + /obj/item/storage/bag/ammo) crate_name = "crate" /datum/supply_pack/costumes_toys/foamforce diff --git a/code/modules/cargo/packs/engine.dm b/code/modules/cargo/packs/engine.dm index 27891f3ab6..499881a110 100644 --- a/code/modules/cargo/packs/engine.dm +++ b/code/modules/cargo/packs/engine.dm @@ -149,14 +149,6 @@ crate_type = /obj/structure/closet/crate/secure/engineering dangerous = TRUE -/datum/supply_pack/engine/supermatter_spray - name = "Supermatter Spray Crate" - desc = "The single thing that can truly heal the supermatter." - cost = 2000 - contains = list(/obj/item/supermatterspray) - crate_name = "supermatter shard crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - /datum/supply_pack/engine/tesla_coils name = "Tesla Coil Crate" desc = "Whether it's high-voltage executions, creating research points, or just plain old power generation: This pack of four Tesla coils can do it all!" diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index 22258d19a7..9af18e13f6 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -90,16 +90,6 @@ crate_name = "industrial rcd" crate_type = /obj/structure/closet/crate/secure/engineering -/datum/supply_pack/engineering/powergamermitts - name = "Insulated Gloves Crate" - desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains three insulated gloves." - cost = 2300 //Made of pure-grade bullshittinium - contains = list(/obj/item/clothing/gloves/color/yellow, - /obj/item/clothing/gloves/color/yellow, - /obj/item/clothing/gloves/color/yellow) - crate_name = "insulated gloves crate" - crate_type = /obj/structure/closet/crate/engineering/electrical - /datum/supply_pack/engineering/inducers name = "NT-75 Electromagnetic Power Inducers Crate" desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers." @@ -162,6 +152,7 @@ /obj/item/storage/toolbox/mechanical) cost = 1200 crate_name = "toolbox crate" + special = TRUE //Department resupply shuttle loan event. /datum/supply_pack/engineering/bsa name = "Bluespace Artillery Parts" diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm new file mode 100644 index 0000000000..ac8b1e9032 --- /dev/null +++ b/code/modules/cargo/packs/goodies.dm @@ -0,0 +1,77 @@ + +/datum/supply_pack/goody + access = NONE + group = "Goodies" + goody = PACK_GOODY_PRIVATE + +/datum/supply_pack/goody/combatknives_single + name = "Combat Knife Single-Pack" + desc = "Contains one sharpened combat knive. Guaranteed to fit snugly inside any Nanotrasen-standard boot." + cost = 800 + contains = list(/obj/item/kitchen/knife/combat) + +/datum/supply_pack/goody/sologamermitts + name = "Insulated Gloves Single-Pack" + desc = "The backbone of modern society. Barely ever ordered for actual engineering." + cost = 800 + contains = list(/obj/item/clothing/gloves/color/yellow) + +/datum/supply_pack/goody/firstaidbruises_single + name = "Bruise Treatment Kit Single-Pack" + desc = "A single brute first-aid kit, perfect for recovering from being crushed in an airlock. Did you know people get crushed in airlocks all the time? Interesting..." + cost = 330 + contains = list(/obj/item/storage/firstaid/brute) + +/datum/supply_pack/goody/firstaidburns_single + name = "Burn Treatment Kit Single-Pack" + desc = "A single burn first-aid kit. The advertisement displays a winking atmospheric technician giving a thumbs up, saying \"Mistakes happen!\"" + cost = 330 + contains = list(/obj/item/storage/firstaid/fire) + +/datum/supply_pack/goody/firstaid_single + name = "First Aid Kit Single-Pack" + desc = "A single first-aid kit, fit for healing most types of bodily harm." + cost = 250 + contains = list(/obj/item/storage/firstaid/regular) + +/datum/supply_pack/goody/firstaidoxygen_single + name = "Oxygen Deprivation Kit Single-Pack" + desc = "A single oxygen deprivation first-aid kit, marketed heavily to those with crippling fears of asphyxiation." + cost = 330 + contains = list(/obj/item/storage/firstaid/o2) + +/datum/supply_pack/goody/firstaidtoxins_single + name = "Toxin Treatment Kit Single-Pack" + desc = "A single first aid kit focused on healing damage dealt by heavy toxins." + cost = 330 + contains = list(/obj/item/storage/firstaid/toxin) + +/datum/supply_pack/goody/toolbox // mostly just to water down coupon probability + name = "Mechanical Toolbox" + desc = "A fully stocked mechanical toolbox, for when you're too lazy to just print them out." + cost = 300 + contains = list(/obj/item/storage/toolbox/mechanical) + +/datum/supply_pack/goody/electrical_toolbox // mostly just to water down coupon probability + name = "Mechanical Toolbox" + desc = "A fully stocked electrical toolbox, for when you're too lazy to just print them out." + cost = 300 + contains = list(/obj/item/storage/toolbox/electrical) + +/datum/supply_pack/goody/valentine + name = "Valentine Card" + desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!" + cost = 150 + contains = list(/obj/item/valentine, /obj/item/reagent_containers/food/snacks/candyheart) + +/datum/supply_pack/goody/beeplush + name = "Bee Plushie" + desc = "The most important thing you could possibly spend your hard-earned money on." + cost = 1500 + contains = list(/obj/item/toy/plush/beeplushie) + +/datum/supply_pack/goody/beach_ball + name = "Beach Ball" + desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen" + cost = 200 + contains = list(/obj/item/toy/beach_ball) diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 6c1742896f..0cf12fbc5d 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -14,53 +14,60 @@ ////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/materials/cardboard50 + goody = PACK_GOODY_PUBLIC name = "50 Cardboard Sheets" desc = "Create a bunch of boxes." - cost = 1000 + cost = 300 //thrice their export value contains = list(/obj/item/stack/sheet/cardboard/fifty) - crate_name = "cardboard sheets crate" /datum/supply_pack/materials/glass50 + goody = PACK_GOODY_PUBLIC name = "50 Glass Sheets" desc = "Let some nice light in with fifty glass sheets!" - cost = 850 + cost = 300 //double their export value contains = list(/obj/item/stack/sheet/glass/fifty) - crate_name = "glass sheets crate" /datum/supply_pack/materials/metal50 + goody = PACK_GOODY_PUBLIC name = "50 Metal Sheets" desc = "Any construction project begins with a good stack of fifty metal sheets!" - cost = 850 + cost = 300 //double their export value contains = list(/obj/item/stack/sheet/metal/fifty) - crate_name = "metal sheets crate" /datum/supply_pack/materials/plasteel20 + goody = PACK_GOODY_PUBLIC name = "20 Plasteel Sheets" desc = "Reinforce the station's integrity with twenty plasteel sheets!" - cost = 4700 + cost = 4000 contains = list(/obj/item/stack/sheet/plasteel/twenty) - crate_name = "plasteel sheets crate" - -/datum/supply_pack/materials/plasteel50 - name = "50 Plasteel Sheets" - desc = "For when you REALLY have to reinforce something." - cost = 9050 - contains = list(/obj/item/stack/sheet/plasteel/fifty) - crate_name = "plasteel sheets crate" /datum/supply_pack/materials/plastic50 + goody = PACK_GOODY_PUBLIC name = "50 Plastic Sheets" desc = "Build a limitless amount of toys with fifty plastic sheets!" - cost = 950 - contains = list(/obj/item/stack/sheet/plastic/fifty) - crate_name = "plastic sheets crate" + cost = 200 // double their export + contains = list(/obj/item/stack/sheet/plastic/twenty) /datum/supply_pack/materials/sandstone30 + goody = PACK_GOODY_PUBLIC name = "30 Sandstone Blocks" desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." - cost = 800 + cost = 150 // five times their export contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) - crate_name = "sandstone blocks crate" + +/datum/supply_pack/materials/wood50 + goody = PACK_GOODY_PUBLIC + name = "50 Wood Planks" + desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!" + cost = 400 // 6-7 planks shy from having equal import/export prices + contains = list(/obj/item/stack/sheet/mineral/wood/twenty) + +/datum/supply_pack/materials/rcdammo + goody = PACK_GOODY_PUBLIC + name = "Large RCD ammo Single-Pack" + desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on." + cost = 600 + contains = list(/obj/item/rcd_ammo/large) /datum/supply_pack/materials/rawlumber name = "50 Towercap Logs" @@ -74,69 +81,6 @@ for(var/i in 1 to 49) new /obj/item/grown/log(.) -/datum/supply_pack/materials/wood50 - name = "50 Wood Planks" - desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!" - cost = 1450 - contains = list(/obj/item/stack/sheet/mineral/wood/fifty) - crate_name = "wood planks crate" - -/datum/supply_pack/materials/rawcotton - name = "Raw Cotton Crate" - desc = "Plushies have been on the down in the market, and now due to a flood of raw cotton the price of it is so cheap, its a steal! Contains 40 raw cotton sheets." - cost = 800 // 100 net cost, 20 x 20 = 400. 300 profit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000 - contains = list(/obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/ten - ) - crate_name = "cotton crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/materials/rawcottonbulk - name = "Raw Cotton Crate (Bulk)" - desc = "We have so much of this stuff we need to get rid of it in -bulk- now. This crate contains 240 raw cotton sheets." - cost = 1300 // 600 net cost 20 x 120 = 2400 profit if turned into cloth sheets or if turned into silk 200 x 60 = 12000 - contains = list(/obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - /obj/item/stack/sheet/cotton/thirty, - ) - crate_name = "bulk cotton crate" - crate_type = /obj/structure/closet/crate/hydroponics - -/datum/supply_pack/materials/rcdammo - name = "Spare RCD ammo" - desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on." - cost = 3750 - contains = list(/obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo) - crate_name = "rcd ammo" - -/datum/supply_pack/materials/loom - name = "Loom" - desc = "A large pre-made loom." - cost = 1000 - contains = list(/obj/structure/loom/unanchored) - crate_name = "loom crate" - crate_type = /obj/structure/closet/crate/large - ////////////////////////////////////////////////////////////////////////////// ///////////////////////////// Canisters ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 5d02bbe60f..2bb629308c 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -141,34 +141,6 @@ ///////////////////////////// Medical Kits /////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/datum/supply_pack/medical/firstaidbruises - name = "Bruise Treatment Kit Crate" - desc = "Contains three first aid kits focused on healing bruises and broken bones." - cost = 1000 - contains = list(/obj/item/storage/firstaid/brute, - /obj/item/storage/firstaid/brute, - /obj/item/storage/firstaid/brute) - crate_name = "brute treatment kit crate" - -/datum/supply_pack/medical/firstaidburns - name = "Burn Treatment Kit Crate" - desc = "Contains three first aid kits focused on healing severe burns." - cost = 1000 - contains = list(/obj/item/storage/firstaid/fire, - /obj/item/storage/firstaid/fire, - /obj/item/storage/firstaid/fire) - crate_name = "burn treatment kit crate" - -/datum/supply_pack/medical/firstaid - name = "First Aid Kit Crate" - desc = "Contains four first aid kits for healing most types of wounds." - cost = 1000 - contains = list(/obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular, - /obj/item/storage/firstaid/regular) - crate_name = "first aid kit crate" - /datum/supply_pack/medical/sprays name = "Medical Sprays" desc = "Contains two cans of Styptic Spray, Silver Sulfadiazine Spray, Synthflesh Spray and Sterilizer Compound Spray." @@ -183,35 +155,6 @@ /obj/item/reagent_containers/medspray/sterilizine) crate_name = "medical supplies crate" -/datum/supply_pack/medical/firstaidmixed - name = "Mixed Medical Kits" - desc = "Contains one of each medical kits for dealing with a variety of injured crewmembers." - cost = 1250 - contains = list(/obj/item/storage/firstaid/toxin, - /obj/item/storage/firstaid/o2, - /obj/item/storage/firstaid/brute, - /obj/item/storage/firstaid/fire, - /obj/item/storage/firstaid/regular) - crate_name = "medical supplies crate" - -/datum/supply_pack/medical/firstaidoxygen - name = "Oxygen Deprivation Kit Crate" - desc = "Contains three first aid kits focused on helping oxygen deprivation victims." - cost = 1000 - contains = list(/obj/item/storage/firstaid/o2, - /obj/item/storage/firstaid/o2, - /obj/item/storage/firstaid/o2) - crate_name = "oxygen deprivation kit crate" - -/datum/supply_pack/medical/firstaidtoxins - name = "Toxin Treatment Kit Crate" - desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins." - cost = 1000 - contains = list(/obj/item/storage/firstaid/toxin, - /obj/item/storage/firstaid/toxin, - /obj/item/storage/firstaid/toxin) - crate_name = "toxin treatment kit crate" - /datum/supply_pack/medical/advrad name = "Radiation Treatment Crate Deluxe" desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!" @@ -252,6 +195,7 @@ crate_name = "virus crate" crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE + can_private_buy = FALSE /datum/supply_pack/medical/anitvirus name = "Virus Containment Crate" @@ -271,4 +215,4 @@ /obj/item/storage/box/syringes, /obj/item/storage/box/beakers) crate_name = "virus containment unit crate" - crate_type = /obj/structure/closet/crate/secure/plasma \ No newline at end of file + crate_type = /obj/structure/closet/crate/secure/plasma diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index 273acb10e2..2b7ae21f88 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -87,37 +87,12 @@ crate_type = /obj/structure/closet/crate/wooden crate_name = "calligraphy crate" -/datum/supply_pack/misc/paper_work - name = "Freelance Paper work" - desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up. - cost = 700 // Net of 0 credits but makes (120 x 10 = 1200) - contains = list(/obj/item/folder/paperwork, - /obj/item/pen/fountain - ) - crate_name = "Paperwork" - -/datum/supply_pack/misc/paper_work/generate() - . = ..() - for(var/i in 1 to 9) - new /obj/item/folder/paperwork(.) ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// Entertainment /////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/datum/supply_pack/misc/randombedsheets - name = "Bedsheet Crate (R)" - desc = "Snuggle up in some sweet sheets with this assorted bedsheet crate. Each set comes with eight random bedsheets for your slumbering pleasure!" - cost = 2000 - contains = list(/obj/item/bedsheet/random) - crate_name = "random bedsheet crate" - -/datum/supply_pack/misc/randombedsheets/generate() - . = ..() - for(var/i in 1 to 7) - new /obj/item/bedsheet/random(.) - /datum/supply_pack/misc/coloredsheets - name = "Bedsheet Crate (C)" + name = "Bedsheet Crate" desc = "Give your night life a splash of color with this crate filled with bedsheets! Contains a total of nine different-colored sheets." cost = 1250 contains = list(/obj/item/bedsheet/blue, @@ -152,7 +127,7 @@ /obj/item/instrument/trombone, /obj/item/instrument/recorder, /obj/item/instrument/harmonica, - /obj/structure/piano/unanchored) + /obj/structure/musician/piano/unanchored) crate_type = /obj/structure/closet/crate/wooden /datum/supply_pack/misc/casinocrate @@ -330,7 +305,7 @@ /datum/supply_pack/misc/religious_supplies name = "Religious Supplies Crate" desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets." - cost = 4000 // it costs so much because the Space Church is ran by Space Jews + cost = 4000 // it costs so much because the Space Church needs funding to build a cathedral contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/book/bible/booze, @@ -358,45 +333,58 @@ //////////////////////////// Misc + Decor //////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/datum/supply_pack/misc/carpet_exotic - name = "Exotic Carpet Crate" - desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns." - cost = 7000 - contains = list(/obj/item/stack/tile/carpet/blue/fifty, - /obj/item/stack/tile/carpet/blue/fifty, - /obj/item/stack/tile/carpet/cyan/fifty, - /obj/item/stack/tile/carpet/cyan/fifty, - /obj/item/stack/tile/carpet/green/fifty, - /obj/item/stack/tile/carpet/green/fifty, - /obj/item/stack/tile/carpet/orange/fifty, - /obj/item/stack/tile/carpet/orange/fifty, - /obj/item/stack/tile/carpet/purple/fifty, - /obj/item/stack/tile/carpet/purple/fifty, - /obj/item/stack/tile/carpet/red/fifty, - /obj/item/stack/tile/carpet/red/fifty, - /obj/item/stack/tile/carpet/royalblue/fifty, - /obj/item/stack/tile/carpet/royalblue/fifty, - /obj/item/stack/tile/carpet/royalblack/fifty, - /obj/item/stack/tile/carpet/royalblack/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty) - crate_name = "exotic carpet crate" - /datum/supply_pack/misc/carpet - name = "Premium Carpet Crate" - desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients." - cost = 1350 - contains = list(/obj/item/stack/tile/carpet/fifty, - /obj/item/stack/tile/carpet/fifty, - /obj/item/stack/tile/carpet/black/fifty, - /obj/item/stack/tile/carpet/black/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/blackred/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty, - /obj/item/stack/tile/carpet/monochrome/fifty) - crate_name = "premium carpet crate" + goody = PACK_GOODY_PUBLIC + name = "Classic Carpet Single-Pack" + desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together." + cost = 200 + contains = list(/obj/item/stack/tile/carpet/fifty) + +/datum/supply_pack/misc/carpet/black + name = "Black Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/black/fifty) + +/datum/supply_pack/misc/carpet/premium + name = "Monochrome Carpet Single-Pack" + desc = "Exotic carpets for all your decorating needs. This 30 units stack of extra soft carpet will tie any room together." + cost = 250 + contains = list(/obj/item/stack/tile/carpet/monochrome/thirty) + +/datum/supply_pack/misc/carpet/premium/blackred + name = "Black-Red Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/blackred/thirty) + +/datum/supply_pack/misc/carpet/premium/royalblack + name = "Royal Black Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/royalblack/thirty) + +/datum/supply_pack/misc/carpet/premium/royalblue + name = "Royal Blue Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/royalblue/thirty) + +/datum/supply_pack/misc/carpet/premium/red + name = "Red Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/red/thirty) + +/datum/supply_pack/misc/carpet/premium/purple + name = "Purple Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/purple/thirty) + +/datum/supply_pack/misc/carpet/premium/orange + name = "Orange Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/orange/thirty) + +/datum/supply_pack/misc/carpet/premium/green + name = "Green Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/green/thirty) + +/datum/supply_pack/misc/carpet/premium/cyan + name = "Cyan Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/cyan/thirty) + +/datum/supply_pack/misc/carpet/premium/blue + name = "Blue Carpet Single-Pack" + contains = list(/obj/item/stack/tile/carpet/blue/thirty) /datum/supply_pack/misc/noslipfloor name = "High-traction Floor Tiles" @@ -442,3 +430,40 @@ crate_type = /obj/structure/closet/crate +///Special supply crate that generates random syndicate gear up to a determined TC value + +/datum/supply_pack/misc/syndicate + + name = "Assorted Syndicate Gear" + + desc = "Contains a random assortment of syndicate gear." + + special = TRUE ///Cannot be ordered via cargo + + contains = list() + + crate_name = "syndicate gear crate" + + crate_type = /obj/structure/closet/crate + + var/crate_value = 30 ///Total TC worth of contained uplink items + + +////////////////////////////////////////////////////////////////////////////// +//////////////////////////////// Syndicate Packs ///////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +//Generate assorted uplink items, taking into account the same surplus modifiers used for surplus crates +//(this is exclusively used for the rare variant of the stray cargo event!) +/datum/supply_pack/misc/syndicate/fill(obj/structure/closet/crate/C) + var/list/uplink_items = get_uplink_items(SSticker.mode) + while(crate_value) + var/category = pick(uplink_items) + var/item = pick(uplink_items[category]) + var/datum/uplink_item/I = uplink_items[category][item] + if(!I.surplus || prob(100 - I.surplus)) + continue + if(crate_value < I.cost) + continue + crate_value -= I.cost + new I.item(C) \ No newline at end of file diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 97b7636f58..249faae33d 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -205,7 +205,7 @@ desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!" cost = 2150 contraband = TRUE - contains = list(/obj/item/reagent_containers/food/snacks/monkeycube, + contains = list(/obj/item/reagent_containers/food/snacks/cube/monkey, /obj/item/restraints/handcuffs/cable, /obj/machinery/iv_drip, /obj/item/reagent_containers/glass/beaker/cryoxadone, @@ -370,22 +370,6 @@ /////////////////////////////////// Misc ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/datum/supply_pack/organic/hunting - name = "Hunting Gear" - desc = "Even in space, we can find prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a hunting shotgun. " - cost = 3500 - contraband = TRUE - contains = list(/obj/item/clothing/head/flatcap, - /obj/item/clothing/suit/hooded/wintercoat/captain, - /obj/item/reagent_containers/food/drinks/bottle/cognac, - /obj/item/storage/fancy/cigarettes/cigars/havana, - /obj/item/clothing/gloves/color/white, - /obj/item/clothing/under/rank/civilian/curator, - /obj/item/gun/ballistic/shotgun/lethal) - access = ACCESS_ARMORY - crate_name = "sporting crate" - crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:( - /datum/supply_pack/organic/party name = "Party Equipment" desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!" diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index a3548a5eb6..fd6fee362d 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -10,24 +10,14 @@ group = "Science" crate_type = /obj/structure/closet/crate/science -/* For later -/datum/supply_pack/science/monkey +/datum/supply_pack/science/ape //Ape out! name = "Ape Cube Crate" desc = "Pss what a new test subject with supper strangth, speed, and love for bananas all at the same time? Say no more... Contains a single ape cube. Dont add water!" contraband = TRUE cost = 2500 - contains = list (/obj/item/reagent_containers/food/snacks/monkeycube/ape) + contains = list (/obj/item/reagent_containers/food/snacks/cube/ape) crate_name = "ape cube crate" -*/ - -/datum/supply_pack/science/aliens - name = "Advanced Alien Alloy Crate Crate" - desc = "Hello brothers from the stars!!! Our fellow brethren have made contact at long last and gave us gifts man! They really did build the prymi- Connection Error- Bro we’ll send you a sheet of advanced alien alloy." - cost = 15000 - DropPodOnly = TRUE - contraband = TRUE - contains = list(/obj/item/stack/sheet/mineral/abductor) - crate_name = "alien bro alloy crate" + can_private_buy = FALSE /datum/supply_pack/science/beakers name = "Chemistry Beakers Crate" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index aea7b95742..738eb03fbf 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -10,6 +10,7 @@ group = "Security" access = ACCESS_SECURITY crate_type = /obj/structure/closet/crate/secure/gear + can_private_buy = FALSE /datum/supply_pack/security/ammo name = "Ammo Crate - General Purpose" @@ -57,6 +58,7 @@ /obj/item/toy/crayon/white, /obj/item/clothing/head/fedora/det_hat) crate_name = "forensics crate" + can_private_buy = TRUE /datum/supply_pack/security/helmets name = "Helmets Crate" @@ -91,28 +93,28 @@ /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/head/helmet/alt, /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/gloves/combat, - /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/tackler/combat/insulated, + /obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas) crate_name = "surplus russian clothing" crate_type = /obj/structure/closet/crate/internals /datum/supply_pack/security/russianmosin - name = "Russian Minutemen Gear" - desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip." + name = "Russian Partisan Gear" + desc = "An old russian partisan equipment crate, comes with a full russian outfit, a loaded surplus rifle and a second magazine." contraband = TRUE access = FALSE - cost = 6500 // + cost = 6500 contains = list(/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/clothing/shoes/combat, /obj/item/clothing/head/ushanka, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/head/helmet/alt, - /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/tackler/combat/insulated, /obj/item/clothing/mask/gas, - /obj/item/gun/ballistic/shotgun/boltaction, - /obj/item/ammo_box/a762) + /obj/item/ammo_box/magazine/m10mm/rifle, + /obj/item/gun/ballistic/automatic/surplus) crate_name = "surplus russian gear" crate_type = /obj/structure/closet/crate/internals @@ -134,6 +136,7 @@ /obj/item/grenade/barrier) cost = 2000 crate_name = "security barriers crate" + can_private_buy = TRUE /datum/supply_pack/security/securityclothes name = "Security Clothing Crate" @@ -152,6 +155,7 @@ /obj/item/clothing/suit/armor/hos/navyblue, /obj/item/clothing/head/beret/sec/navyhos) crate_name = "security clothing crate" + can_private_buy = TRUE /datum/supply_pack/security/supplies name = "Security Supplies Crate" @@ -179,6 +183,7 @@ contains = list(/obj/item/clothing/head/helmet/justice, /obj/item/clothing/mask/gas/sechailer) crate_name = "security clothing crate" + can_private_buy = TRUE /datum/supply_pack/security/baton name = "Stun Batons Crate" @@ -207,3 +212,51 @@ /obj/item/storage/box/wall_flash, /obj/item/storage/box/wall_flash) crate_name = "wall-mounted flash crate" + +/datum/supply_pack/security/hunting + name = "Hunting Gear" + desc = "Even in space, we can find prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a hunting shotgun. " + cost = 3500 + contraband = TRUE + contains = list(/obj/item/clothing/head/flatcap, + /obj/item/clothing/suit/hooded/wintercoat/captain, + /obj/item/reagent_containers/food/drinks/bottle/cognac, + /obj/item/storage/fancy/cigarettes/cigars/havana, + /obj/item/clothing/gloves/color/white, + /obj/item/clothing/under/rank/civilian/curator, + /obj/item/gun/ballistic/shotgun/lethal) + access = ACCESS_ARMORY + crate_name = "sporting crate" + crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:( + +/datum/supply_pack/security/dumdum + name = ".38 DumDum Speedloader" + desc = "Contains one speedloader of .38 DumDum ammunition, good for embedding in soft targets. Requires Security or Forensics access to open." + cost = 1200 + access = FALSE + access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) + contains = list(/obj/item/ammo_box/c38/dumdum) + crate_name = ".38 match crate" + +/datum/supply_pack/security/match + name = ".38 Match Grade Speedloader" + desc = "Contains one speedloader of match grade .38 ammunition, perfect for showing off trickshots. Requires Security or Forensics access to open." + cost = 1200 + access = FALSE + access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) + contains = list(/obj/item/ammo_box/c38/match) + crate_name = ".38 match crate" + +/datum/supply_pack/security/stingpack + name = "Stingbang Grenade Pack" + desc = "Contains five \"stingbang\" grenades, perfect for stopping riots and playing morally unthinkable pranks. Requires Security access to open." + cost = 2500 + contains = list(/obj/item/storage/box/stingbangs) + crate_name = "stingbang grenade pack crate" + +/datum/supply_pack/security/stingpack/single + name = "Stingbang Single-Pack" + desc = "Contains one \"stingbang\" grenade, perfect for playing meanhearted pranks. Requires Security access to open." + cost = 1400 + contains = list(/obj/item/grenade/stingbang) + diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 942720dd6b..0c7c63f867 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -66,6 +66,16 @@ crate_name = "shaft miner starter kit" crate_type = /obj/structure/closet/crate/secure +/datum/supply_pack/service/snowmobile + name = "Snowmobile kit" + desc = "trapped on a frigid wasteland? need to get around fast? purchase a refurbished snowmobile, with a FREE 10 microsecond warranty!" + cost = 1500 // 1000 points cheaper than ATV + contains = list(/obj/vehicle/ridden/atv/snowmobile = 1, + /obj/item/key = 1, + /obj/item/clothing/mask/gas/explorer = 1) + crate_name = "Snowmobile kit" + crate_type = /obj/structure/closet/crate/large + ////////////////////////////////////////////////////////////////////////////// /////////////////////// Chef, Botanist, Bartender //////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/cargo/packs/vending.dm b/code/modules/cargo/packs/vending.dm index 344d19f6c9..810cfd8d6e 100644 --- a/code/modules/cargo/packs/vending.dm +++ b/code/modules/cargo/packs/vending.dm @@ -99,6 +99,7 @@ contains = list(/obj/machinery/vending/security) crate_name = "SecTech supply crate" crate_type = /obj/structure/closet/crate/secure/gear + can_private_buy = FALSE /datum/supply_pack/vending/snack name = "Snack Supply Crate" diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 22b15ea868..d89598f6cb 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -17,11 +17,6 @@ //eg: "Bloody screen" > "goggles colour" as the former is much more important -/mob - var/list/client_colours = list() - - - /* Adds an instance of colour_type to the mob's client_colours list colour_type - a typepath (subtyped from /datum/client_colour) @@ -113,4 +108,4 @@ priority = INFINITY //we can't see colors anyway! /datum/client_colour/monochrome/trance - priority = 1 \ No newline at end of file + priority = 1 diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 1deb702de4..0402dc683f 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -80,7 +80,59 @@ var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + /// Keys currently held + var/list/keys_held = list() + /// These next two vars are to apply movement for keypresses and releases made while move delayed. + /// Because discarding that input makes the game less responsive. + /// On next move, add this dir to the move that would otherwise be done + var/next_move_dir_add + /// On next move, subtract this dir from the move that would otherwise be done + var/next_move_dir_sub + /// Amount of keydowns in the last keysend checking interval var/client_keysend_amount = 0 + /// World tick time where client_keysend_amount will reset var/next_keysend_reset = 0 + /// World tick time where keysend_tripped will reset back to false var/next_keysend_trip_reset = 0 + /// When set to true, user will be autokicked if they trip the keysends in a second limit again var/keysend_tripped = FALSE + /// custom movement keys for this client + var/list/movement_keys = list() + + ///Autoclick list of two elements, first being the clicked thing, second being the parameters. + var/list/atom/selected_target[2] + ///Autoclick variable referencing the associated item. + var/obj/item/active_mousedown_item = null + ///Used in MouseDrag to preserve the original mouse click parameters + var/mouseParams = "" + ///Used in MouseDrag to preserve the last mouse-entered location. + var/mouseLocation = null + ///Used in MouseDrag to preserve the last mouse-entered object. + var/mouseObject = null + var/mouseControlObject = null + //Middle-mouse-button click dragtime control for aimbot exploit detection. + var/middragtime = 0 + //Middle-mouse-button clicked object control for aimbot exploit detection. + var/atom/middragatom + + /// Messages currently seen by this client + var/list/seen_messages + ///When was the last time we warned them about not cryoing without an ahelp, set to -5 minutes so that rounstart cryo still warns + var/cryo_warned = -5 MINUTES + + var/list/parallax_layers + var/list/parallax_layers_cached + var/atom/movable/movingmob + var/turf/previous_turf + ///world.time of when we can state animate()ing parallax again + var/dont_animate_parallax + ///world.time of last parallax update + var/last_parallax_shift + ///ds between parallax updates + var/parallax_throttle = 0 + var/parallax_movedir = 0 + var/parallax_layers_max = 3 + var/parallax_animate_timer + + //world.time of when the crew manifest can be accessed + var/crew_manifest_delay diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 74885d0ac0..39487efc54 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -36,29 +36,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!usr || usr != mob) //stops us calling Topic for somebody else's client. Also helps prevent usr=null return - // asset_cache + var/asset_cache_job if(href_list["asset_cache_confirm_arrival"]) - var/job = text2num(href_list["asset_cache_confirm_arrival"]) - //because we skip the limiter, we have to make sure this is a valid arrival and not somebody tricking us - // into letting append to a list without limit. - if (job && job <= last_asset_job && !(job in completed_asset_jobs)) - completed_asset_jobs += job + asset_cache_job = asset_cache_confirm_arrival(href_list["asset_cache_confirm_arrival"]) + if (!asset_cache_job) return - else if (job in completed_asset_jobs) //byond bug ID:2256651 - to_chat(src, "An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)") - src << browse("...", "window=asset_cache_browser") - // Keypress passthrough - if(href_list["__keydown"]) - var/keycode = browser_keycode_to_byond(href_list["__keydown"]) - if(keycode) - keyDown(keycode) - return - if(href_list["__keyup"]) - var/keycode = browser_keycode_to_byond(href_list["__keyup"]) - if(keycode) - keyUp(keycode) - return - var/mtl = CONFIG_GET(number/minute_topic_limit) if (!holder && mtl) @@ -75,7 +57,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( topiclimiter[ADMINSWARNED_AT] = minute msg += " Administrators have been informed." log_game("[key_name(src)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") - message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") to_chat(src, "[msg]") return @@ -96,6 +78,27 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]") + //byond bug ID:2256651 + if (asset_cache_job && (asset_cache_job in completed_asset_jobs)) + to_chat(src, "An error has been detected in how your client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)") + src << browse("...", "window=asset_cache_browser") + return + if (href_list["asset_cache_preload_data"]) + asset_cache_preload_data(href_list["asset_cache_preload_data"]) + return + + // Keypress passthrough + if(href_list["__keydown"]) + var/keycode = browser_keycode_to_byond(href_list["__keydown"]) + if(keycode) + keyDown(keycode) + return + if(href_list["__keyup"]) + var/keycode = browser_keycode_to_byond(href_list["__keyup"]) + if(keycode) + keyUp(keycode) + return + // Admin PM if(href_list["priv_msg"]) cmd_admin_pm(href_list["priv_msg"],null) @@ -265,6 +268,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) else prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs + if(SSinput.initialized) + set_macros() + update_movement_keys(prefs) prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning @@ -328,9 +334,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) qdel(src) return - if(SSinput.initialized) - set_macros() - chatOutput.start() // Starts the chat if(alert_mob_dupe_login) @@ -789,7 +792,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) log_game("[key_name(src)] is using the middle click aimbot exploit") message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit") add_system_note("aimbot", "Is using the middle click aimbot exploit") - + log_click(object, location, control, params, src, "lockout (spam - minute ab c [ab] s [middragtime])", TRUE) + else + log_click(object, location, control, params, src, "lockout (spam - minute)", TRUE) log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") to_chat(src, "[msg]") @@ -809,8 +814,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) return if(ab) //Citadel edit, things with stuff. + log_click(object, location, control, params, src, "dropped (ab c [ab] s [middragtime])", TRUE) return + if(prefs.log_clicks) + log_click(object, location, control, params, src) + if (prefs.hotkeys) // If hotkey mode is enabled, then clicking the map will automatically // unfocus the text bar. This removes the red color from the text bar @@ -852,8 +861,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) 'html/browser/playeroptions.css', ) spawn (10) //removing this spawn causes all clients to not get verbs. + + //load info on what assets the client has + src << browse('code/modules/asset_cache/validate_assets.html', "window=asset_cache_browser") + //Precache the client with all other assets slowly, so as to not block other browse() calls getFilesSlow(src, SSassets.preload, register_asset = FALSE) + addtimer(CALLBACK(GLOBAL_PROC, /proc/getFilesSlow, src, SSassets.preload, FALSE), 5 SECONDS) + #if (PRELOAD_RSC == 0) for (var/name in GLOB.vox_sounds) var/file = GLOB.vox_sounds[name] @@ -888,10 +903,27 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) var/viewscale = getviewsize(view) var/x = viewscale[1] var/y = viewscale[2] - x = CLAMP(x+change, min, max) - y = CLAMP(y+change, min,max) + x = clamp(x+change, min, max) + y = clamp(y+change, min,max) change_view("[x]x[y]") +/client/proc/update_movement_keys(datum/preferences/direct_prefs) + var/datum/preferences/D = prefs || direct_prefs + if(!D?.key_bindings) + return + movement_keys = list() + for(var/key in D.key_bindings) + for(var/kb_name in D.key_bindings[key]) + switch(kb_name) + if("North") + movement_keys[key] = NORTH + if("East") + movement_keys[key] = EAST + if("West") + movement_keys[key] = WEST + if("South") + movement_keys[key] = SOUTH + /client/proc/change_view(new_size) if (isnull(new_size)) CRASH("change_view called without argument.") @@ -902,23 +934,27 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) new_size = "15x15" //END OF CIT CHANGES + var/list/old_view = getviewsize(view) view = new_size - apply_clickcatcher() + var/list/actualview = getviewsize(view) + apply_clickcatcher(actualview) mob.reload_fullscreen() if (isliving(mob)) var/mob/living/M = mob M.update_damage_hud() if (prefs.auto_fit_viewport) fit_viewport() + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_CHANGE_VIEW, src, old_view, actualview) /client/proc/generate_clickcatcher() if(!void) void = new() screen += void -/client/proc/apply_clickcatcher() +/client/proc/apply_clickcatcher(list/actualview) generate_clickcatcher() - var/list/actualview = getviewsize(view) + if(!actualview) + actualview = getviewsize(view) void.UpdateGreed(actualview[1],actualview[2]) /client/proc/AnnouncePR(announcement) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index adfcd547bc..347a77059a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1,11 +1,6 @@ - /* CAUTION! CAUTION! CAUTION! CAUTION! CAUTION! *\ - | THIS FILE CONTAINS HOOKS FOR FOR | - | CHANGES SPECIFIC TO CITADEL. IF | - | YOU'RE FIXING A MERGE CONFLICT | - | HERE, PLEASE ASK FOR REVIEW FROM | - | ANOTHER MAINTAINER TO ENSURE YOU | - | DON'T INTRODUCE REGRESSIONS. | - \* */ +#define DEFAULT_SLOT_AMT 2 +#define HANDS_SLOT_AMT 2 +#define BACKPACK_SLOT_AMT 4 GLOBAL_LIST_EMPTY(preferences_datums) @@ -20,6 +15,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/muted = 0 var/last_ip var/last_id + var/log_clicks = FALSE var/icon/custom_holoform_icon var/list/cached_holoform_icons @@ -48,6 +44,16 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/UI_style = null var/buttons_locked = FALSE var/hotkeys = FALSE + var/chat_on_map = TRUE + var/max_chat_length = CHAT_MESSAGE_MAX_LENGTH + var/see_chat_non_mob = TRUE + + /// Custom Keybindings + var/list/key_bindings = list() + /// List with a key string associated to a list of keybindings. Unlike key_bindings, this one operates on raw key, allowing for binding a key that triggers regardless of if a modifier is depressed as long as the raw key is sent. + var/list/modless_key_bindings = list() + + var/tgui_fancy = TRUE var/tgui_lock = TRUE var/windowflashing = TRUE @@ -89,17 +95,20 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/facial_hair_style = "Shaved" //Face hair type var/facial_hair_color = "000" //Facial hair color var/skin_tone = "caucasian1" //Skin color + var/use_custom_skin_tone = FALSE var/eye_color = "000" //Eye color - var/horn_color = "85615a" //Horn color - var/wing_color = "fff" //Wing color var/datum/species/pref_species = new /datum/species/human() //Mutant race var/list/features = list("mcolor" = "FFF", + "mcolor2" = "FFF", + "mcolor3" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", + "horns_color" = "85615a", "ears" = "None", "wings" = "None", + "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", @@ -108,8 +117,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", - "mcolor2" = "FFF", - "mcolor3" = "FFF", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", @@ -149,8 +156,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", + "silicon_flavor_text" = "", + "ooc_notes" = "", "meat_type" = "Mammalian", - "body_model" = MALE + "body_model" = MALE, + "body_size" = RESIZE_DEFAULT_SIZE ) var/list/custom_names = list() @@ -183,9 +193,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uplink_spawn_loc = UPLINK_PDA - var/sprint_spacebar = FALSE - var/sprint_toggle = FALSE - var/hud_toggle_flash = TRUE var/hud_toggle_color = "#ffffff" @@ -195,12 +202,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/action_buttons_screen_locs = list() //bad stuff - var/digestable = FALSE - var/devourable = FALSE - var/feeding = FALSE - var/lickable = FALSE + var/vore_flags = 0 var/list/belly_prefs = list() var/vore_taste = "nothing in particular" + var/toggleeatingnoise = TRUE + var/toggledigestionnoise = TRUE + var/hound_sleeper = TRUE + var/cit_toggles = TOGGLES_CITADEL //backgrounds var/mutable_appearance/character_background @@ -209,6 +217,21 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/show_mismatched_markings = FALSE //determines whether or not the markings lists should show markings that don't match the currently selected species. Intentionally left unsaved. + var/no_tetris_storage = FALSE + + ///loadout stuff + var/gear_points = 10 + var/list/gear_categories + var/list/chosen_gear = list() + var/gear_tab + + var/screenshake = 100 + var/damagescreenshake = 2 + var/arousable = TRUE + var/widescreenpref = TRUE + var/autostand = TRUE + var/auto_ooc = FALSE + /datum/preferences/New(client/C) parent = C @@ -228,6 +251,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) return //we couldn't load character data so just randomize the character appearance + name random_character() //let's create a random character then - rather than a fat, bald and naked man. + key_bindings = deepCopyList(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds and update their movement keys + C?.update_movement_keys(src) real_name = pref_species.random_name(gender,1) if(!loaded_preferences_successfully) save_preferences() @@ -249,6 +274,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Loadout" dat += "Game Preferences" dat += "Content Preferences" + dat += "Keybindings" if(!path) dat += "
    Please create an account to save your preferences
    " @@ -294,7 +320,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[real_name]
    " dat += "Be nameless: [nameless ? "Yes" : "No"]
    " - dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " + dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " dat += "Age:[age]
    " dat += "Special Names:
    " @@ -344,8 +370,27 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["flavor_text"]]" else dat += "[TextPreview(features["flavor_text"])]...
    " + dat += "

    Silicon Flavor Text

    " + dat += "Set Silicon Examine Text
    " + if(length(features["silicon_flavor_text"]) <= 40) + if(!length(features["silicon_flavor_text"])) + dat += "\[...\]" + else + dat += "[features["silicon_flavor_text"]]" + else + dat += "[TextPreview(features["silicon_flavor_text"])]...
    " + dat += "

    OOC notes

    " + dat += "Set OOC notes
    " + var/ooc_notes_len = length(features["ooc_notes"]) + if(ooc_notes_len <= 40) + if(!ooc_notes_len) + dat += "\[...\]" + else + dat += "[features["ooc_notes"]]" + else + dat += "[TextPreview(features["ooc_notes"])]...
    " dat += "

    Body

    " - dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " + dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " if(gender != NEUTER && pref_species.sexes) dat += "Body Model:[features["body_model"] == MALE ? "Masculine" : "Feminine"]
    " dat += "Species:[pref_species.name]
    " @@ -360,7 +405,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    Skin Tone

    " - dat += "[skin_tone]
    " + dat += "[use_custom_skin_tone ? "custom:    " : skin_tone]
    " var/mutant_colors if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits)) @@ -379,6 +424,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "   Change
    " mutant_colors = TRUE + if (CONFIG_GET(number/body_size_min) != CONFIG_GET(number/body_size_max)) + dat += "Sprite Size:[features["body_size"]*100]%
    " + if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits)) if(!use_skintones && !mutant_colors) @@ -489,7 +537,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    Horns

    " dat += "[features["horns"]]" - dat += "   Change
    " + dat += "   Change
    " mutant_category++ @@ -602,7 +650,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    Decorative wings

    " dat += "[features["deco_wings"]]" - dat += "   Change
    " + dat += "   Change
    " if(pref_species.mutant_bodyparts["insect_wings"]) if(!mutant_category) @@ -611,7 +659,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    Insect wings

    " dat += "[features["insect_wings"]]" - dat += "   Change
    " + dat += "   Change
    " mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) dat += "" @@ -759,7 +807,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["has_cock"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) dat += "Penis Color:
    " - dat += "   (Skin tone overriding)
    " + dat += "   (Skin tone overriding)
    " else dat += "Penis Color:
    " dat += "   Change
    " @@ -777,7 +825,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["has_balls"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) dat += "Testicles Color:
    " - dat += "   (Skin tone overriding)
    " + dat += "   (Skin tone overriding)
    " else dat += "Testicles Color:
    " dat += "   Change
    " @@ -789,7 +837,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Vagina Type:[features["vag_shape"]]" if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) dat += "Vagina Color:
    " - dat += "   (Skin tone overriding)
    " + dat += "   (Skin tone overriding)
    " else dat += "Vagina Color:
    " dat += "   Change
    " @@ -802,7 +850,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["has_breasts"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) dat += "Color:
    " - dat += "   (Skin tone overriding)
    " + dat += "   (Skin tone overriding)
    " else dat += "Color:
    " dat += "   Change
    " @@ -820,9 +868,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "UI Style:[UI_style]
    " dat += "tgui Monitors:[(tgui_lock) ? "Primary" : "All"]
    " dat += "tgui Style:[(tgui_fancy) ? "Fancy" : "No Frills"]
    " + dat += "Show Runechat Chat Bubbles:[chat_on_map ? "Enabled" : "Disabled"]
    " + dat += "Runechat message char limit:[max_chat_length]
    " + dat += "See Runechat for non-mobs:[see_chat_non_mob ? "Enabled" : "Disabled"]
    " dat += "
    " dat += "Action Buttons:[(buttons_locked) ? "Locked In Place" : "Unlocked"]
    " - dat += "Keybindings:[(hotkeys) ? "Hotkeys" : "Default"]
    " dat += "
    " dat += "PDA Color:   Change
    " dat += "PDA Style:[pda_style]
    " @@ -861,6 +911,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Widescreen:[widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]
    " dat += "Auto stand:[autostand ? "Enabled" : "Disabled"]
    " dat += "Auto OOC:[auto_ooc ? "Enabled" : "Disabled"]
    " + dat += "Force Slot Storage HUD:[no_tetris_storage ? "Enabled" : "Disabled"]
    " dat += "Screen Shake:[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
    " if (user && user.client && !user.client.prefs.screenshake==0) dat += "Damage Screen Shake:[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
    " @@ -896,7 +947,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ghosts of Others:[button_name]
    " dat += "
    " + dat += "FPS:[clientfps]
    " + + dat += "Income Updates:[(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"]
    " + dat += "
    " + dat += "Parallax (Fancy Space):" switch (parallax) if (PARALLAX_LOW) @@ -912,8 +968,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
    " dat += "Ambient Occlusion:[ambientocclusion ? "Enabled" : "Disabled"]
    " dat += "Fit Viewport:[auto_fit_viewport ? "Auto" : "Manual"]
    " - dat += "Sprint Key:[sprint_spacebar ? "Space" : "Shift"]
    " - dat += "Toggle Sprint:[sprint_toggle ? "Enabled" : "Disabled"]
    " dat += "HUD Button Flashes:[hud_toggle_flash ? "Enabled" : "Disabled"]
    " dat += "HUD Button Flash Color:   Change
    " @@ -1036,6 +1090,70 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ass Slapping:[(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
    " dat += "
    NameDescriptionRewardCompletionStatus
    " dat += "
    " + if(5) // Custom keybindings + dat += "Keybindings: [(hotkeys) ? "Hotkeys" : "Input"]
    " + dat += "Keybindings mode controls how the game behaves with tab and map/input focus.
    If it is on Hotkeys, the game will always attempt to force you to map focus, meaning keypresses are sent \ + directly to the map instead of the input. You will still be able to use the command bar, but you need to tab to do it every time you click on the game map.
    \ + If it is on Input, the game will not force focus away from the input bar, and you can switch focus using TAB between these two modes: If the input bar is pink, that means that you are in non-hotkey mode, sending all keypresses of the normal \ + alphanumeric characters, punctuation, spacebar, backspace, enter, etc, typing keys into the input bar. If the input bar is white, you are in hotkey mode, meaning all keypresses go into the game's keybind handling system unless you \ + manually click on the input bar to shift focus there.
    \ + Input mode is the closest thing to the old input system.
    \ + IMPORTANT: While in input mode's non hotkey setting (tab toggled), Ctrl + KEY will send KEY to the keybind system as the key itself, not as Ctrl + KEY. This means Ctrl + T/W/A/S/D/all your familiar stuff still works, but you \ + won't be able to access any regular Ctrl binds.
    " + dat += "
    Modifier-Independent binding - This is a singular bind that works regardless of if Ctrl/Shift/Alt are held down. For example, if combat mode is bound to C in modifier-independent binds, it'll trigger regardless of if you are \ + holding down shift for sprint. Each keybind can only have one independent binding, and each key can only have one keybind independently bound to it." + // Create an inverted list of keybindings -> key + var/list/user_binds = list() + var/list/user_modless_binds = list() + for (var/key in key_bindings) + for(var/kb_name in key_bindings[key]) + user_binds[kb_name] += list(key) + for (var/key in modless_key_bindings) + user_modless_binds[modless_key_bindings[key]] = key + + var/list/kb_categories = list() + // Group keybinds by category + for (var/name in GLOB.keybindings_by_name) + var/datum/keybinding/kb = GLOB.keybindings_by_name[name] + kb_categories[kb.category] += list(kb) + + dat += {" + + "} + + for (var/category in kb_categories) + dat += "

    [category]

    " + for (var/i in kb_categories[category]) + var/datum/keybinding/kb = i + var/current_independent_binding = user_modless_binds[kb.name] || "Unbound" + if(!length(user_binds[kb.name])) + dat += "[kb.full_name]Unbound" + var/list/default_keys = hotkeys ? kb.hotkey_keys : kb.classic_keys + if(LAZYLEN(default_keys)) + dat += "| Default: [default_keys.Join(", ")]" + dat += "Independent Binding: [current_independent_binding]" + dat += "
    " + else + var/bound_key = user_binds[kb.name][1] + dat += "[kb.full_name][bound_key]" + for(var/bound_key_index in 2 to length(user_binds[kb.name])) + bound_key = user_binds[kb.name][bound_key_index] + dat += " | [bound_key]" + if(length(user_binds[kb.name]) < MAX_KEYS_PER_KEYBIND) + dat += "| Add Secondary" + var/list/default_keys = hotkeys ? kb.classic_keys : kb.hotkey_keys + if(LAZYLEN(default_keys)) + dat += "| Default: [default_keys.Join(", ")]" + dat += "Independent Binding: [current_independent_binding]" + dat += "
    " + + dat += "

    " + dat += "\[Reset to default\]" + dat += "" dat += "
    " @@ -1056,6 +1174,31 @@ GLOBAL_LIST_EMPTY(preferences_datums) #undef APPEARANCE_CATEGORY_COLUMN #undef MAX_MUTANT_ROWS +/datum/preferences/proc/CaptureKeybinding(mob/user, datum/keybinding/kb, old_key, independent = FALSE) + var/HTML = {" +
    Keybinding: [kb.full_name]
    [kb.description]

    Press any key to change
    Press ESC to clear
    + + "} + winshow(user, "capturekeypress", TRUE) + var/datum/browser/popup = new(user, "capturekeypress", "
    Keybindings
    ", 350, 300) + popup.set_content(HTML) + popup.open(FALSE) + onclose(user, "capturekeypress", src) + /datum/preferences/proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620) if(!SSjob) return @@ -1434,6 +1577,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) eye_color = random_eye_color() if("s_tone") skin_tone = random_skin_tone() + use_custom_skin_tone = null if("bag") backbag = pick(GLOB.backbaglist) if("suit") @@ -1494,9 +1638,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("flavor_text") - var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE) + var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(features["flavor_text"]), MAX_FLAVOR_LEN, TRUE) if(!isnull(msg)) - features["flavor_text"] = html_decode(msg) + features["flavor_text"] = msg + + if("silicon_flavor_text") + var/msg = stripped_multiline_input(usr, "Set the silicon flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Silicon Flavor Text", html_decode(features["silicon_flavor_text"]), MAX_FLAVOR_LEN, TRUE) + if(!isnull(msg)) + features["silicon_flavor_text"] = msg + + if("ooc_notes") + var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTER DESCRIPTIONS!", "OOC notes", html_decode(features["ooc_notes"]), MAX_FLAVOR_LEN, TRUE) + if(!isnull(msg)) + features["ooc_notes"] = msg if("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null @@ -1541,7 +1695,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) underwear = new_underwear if("undie_color") - var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", undie_color) as color|null + var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", "#[undie_color]") as color|null if(n_undie_color) undie_color = sanitize_hexcolor(n_undie_color) @@ -1551,7 +1705,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) undershirt = new_undershirt if("shirt_color") - var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", shirt_color) as color|null + var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", "#[shirt_color]") as color|null if(n_shirt_color) shirt_color = sanitize_hexcolor(n_shirt_color) @@ -1561,7 +1715,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) socks = new_socks if("socks_color") - var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", socks_color) as color|null + var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", "#[socks_color]") as color|null if(n_socks_color) socks_color = sanitize_hexcolor(n_socks_color) @@ -1758,12 +1912,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["horns"] = new_horns if("horns_color") - var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null + var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+features["horns_color"]) as color|null if(new_horn_color) if (new_horn_color == "#000000") - horn_color = "#85615A" + features["horns_color"] = "85615A" else - horn_color = sanitize_hexcolor(new_horn_color) + features["horns_color"] = sanitize_hexcolor(new_horn_color) if("wings") var/new_wings @@ -1772,12 +1926,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["wings"] = new_wings if("wings_color") - var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+wing_color) as color|null + var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+features["wings_color"]) as color|null if(new_wing_color) if (new_wing_color == "#000000") - wing_color = "#FFFFFF" + features["wings_color"] = "#FFFFFF" else - wing_color = sanitize_hexcolor(new_wing_color) + features["wings_color"] = sanitize_hexcolor(new_wing_color) if("frills") var/new_frills @@ -1830,9 +1984,24 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["insect_markings"] = new_insect_markings if("s_tone") - var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones + var/list/choices = GLOB.skin_tones - GLOB.nonstandard_skin_tones + if(CONFIG_GET(flag/allow_custom_skintones)) + choices += "custom" + var/new_s_tone = input(user, "Choose your character's skin tone:", "Character Preference") as null|anything in choices if(new_s_tone) - skin_tone = new_s_tone + if(new_s_tone == "custom") + var/default = use_custom_skin_tone ? skin_tone : null + var/custom_tone = input(user, "Choose your custom skin tone:", "Character Preference", default) as color|null + if(custom_tone) + var/temp_hsv = RGBtoHSV(custom_tone) + if(ReadHSV(temp_hsv)[3] < ReadHSV("#333333")[3]) // rgb(50,50,50) + to_chat(user,"Invalid color. Your color is not bright enough.") + else + use_custom_skin_tone = TRUE + skin_tone = custom_tone + else + use_custom_skin_tone = FALSE + skin_tone = new_s_tone if("taur") var/list/snowflake_taur_list = list() @@ -1935,7 +2104,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_cockcolor) if(new_cockcolor == "#000000") features["cock_color"] = pref_species.default_color - else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) features["cock_color"] = sanitize_hexcolor(new_cockcolor) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -1945,7 +2114,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/max_D = CONFIG_GET(number/penis_max_inches_prefs) var/new_length = input(user, "Penis length in inches:\n([min_D]-[max_D])", "Character Preference") as num|null if(new_length) - features["cock_length"] = CLAMP(round(new_length), min_D, max_D) + features["cock_length"] = clamp(round(new_length), min_D, max_D) if("cock_shape") var/new_shape @@ -1975,7 +2144,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_ballscolor) if(new_ballscolor == "#000000") features["balls_color"] = pref_species.default_color - else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) features["balls_color"] = sanitize_hexcolor(new_ballscolor) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2002,7 +2171,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_breasts_color) if(new_breasts_color == "#000000") features["breasts_color"] = pref_species.default_color - else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) features["breasts_color"] = sanitize_hexcolor(new_breasts_color) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2024,7 +2193,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/temp_hsv = RGBtoHSV(new_vagcolor) if(new_vagcolor == "#000000") features["vag_color"] = pref_species.default_color - else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) features["vag_color"] = sanitize_hexcolor(new_vagcolor) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2113,12 +2282,48 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/pickedPDASkin = input(user, "Choose your PDA reskin.", "Character Preference", pda_skin) as null|anything in GLOB.pda_reskins if(pickedPDASkin) pda_skin = pickedPDASkin + if ("max_chat_length") + var/desiredlength = input(user, "Choose the max character length of shown Runechat messages. Valid range is 1 to [CHAT_MESSAGE_MAX_LENGTH] (default: [initial(max_chat_length)]))", "Character Preference", max_chat_length) as null|num + if (!isnull(desiredlength)) + max_chat_length = clamp(desiredlength, 1, CHAT_MESSAGE_MAX_LENGTH) if("hud_toggle_color") var/new_toggle_color = input(user, "Choose your HUD toggle flash color:", "Game Preference",hud_toggle_color) as color|null if(new_toggle_color) hud_toggle_color = new_toggle_color + if("gender") + var/chosengender = input(user, "Select your character's gender.", "Gender Selection", gender) as null|anything in list(MALE,FEMALE,"nonbinary","object") + if(!chosengender) + return + switch(chosengender) + if("nonbinary") + chosengender = PLURAL + features["body_model"] = pick(MALE, FEMALE) + if("object") + chosengender = NEUTER + features["body_model"] = MALE + else + features["body_model"] = chosengender + gender = chosengender + facial_hair_style = random_facial_hair_style(gender) + hair_style = random_hair_style(gender) + + if("body_size") + var/min = CONFIG_GET(number/body_size_min) + var/max = CONFIG_GET(number/body_size_max) + var/danger = CONFIG_GET(number/threshold_body_size_slowdown) + var/new_body_size = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null + if (new_body_size) + new_body_size = clamp(new_body_size * 0.01, min, max) + var/dorfy + if(danger > new_body_size) + dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No") + if(!dorfy || dorfy == "Move it above the threshold") + new_body_size = danger + if(dorfy != "No") + features["body_size"] = new_body_size + else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2151,6 +2356,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) autostand = !autostand if("auto_ooc") auto_ooc = !auto_ooc + if("no_tetris_storage") + no_tetris_storage = !no_tetris_storage if ("screenshake") var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num if (!isnull(desiredshake)) @@ -2171,32 +2378,91 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("publicity") if(unlock_content) toggles ^= MEMBER_PUBLIC - if("gender") - var/chosengender = input(user, "Select your character's gender.", "Gender Selection", gender) as null|anything in list(MALE,FEMALE,"nonbinary","object") - if(!chosengender) - return - switch(chosengender) - if("nonbinary") - chosengender = PLURAL - features["body_model"] = pick(MALE, FEMALE) - if("object") - chosengender = NEUTER - features["body_model"] = MALE - else - features["body_model"] = chosengender - gender = chosengender - facial_hair_style = random_facial_hair_style(gender) - hair_style = random_hair_style(gender) if("body_model") features["body_model"] = features["body_model"] == MALE ? FEMALE : MALE if("hotkeys") hotkeys = !hotkeys - if(hotkeys) - winset(user, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=default") + user.client.set_macros() + + if("keybindings_capture") + var/datum/keybinding/kb = GLOB.keybindings_by_name[href_list["keybinding"]] + CaptureKeybinding(user, kb, href_list["old_key"], text2num(href_list["independent"])) + return + + if("keybindings_set") + var/kb_name = href_list["keybinding"] + if(!kb_name) + user << browse(null, "window=capturekeypress") + ShowChoices(user) + return + + var/independent = href_list["independent"] + + var/clear_key = text2num(href_list["clear_key"]) + var/old_key = href_list["old_key"] + if(clear_key) + if(independent) + modless_key_bindings -= old_key + else + if(key_bindings[old_key]) + key_bindings[old_key] -= kb_name + if(!length(key_bindings[old_key])) + key_bindings -= old_key + user << browse(null, "window=capturekeypress") + save_preferences() + ShowChoices(user) + return + + var/new_key = uppertext(href_list["key"]) + var/AltMod = text2num(href_list["alt"]) ? "Alt" : "" + var/CtrlMod = text2num(href_list["ctrl"]) ? "Ctrl" : "" + var/ShiftMod = text2num(href_list["shift"]) ? "Shift" : "" + var/numpad = text2num(href_list["numpad"]) ? "Numpad" : "" + // var/key_code = text2num(href_list["key_code"]) + + if(GLOB._kbMap[new_key]) + new_key = GLOB._kbMap[new_key] + + var/full_key + switch(new_key) + if("Alt") + full_key = "[new_key][CtrlMod][ShiftMod]" + if("Ctrl") + full_key = "[AltMod][new_key][ShiftMod]" + if("Shift") + full_key = "[AltMod][CtrlMod][new_key]" + else + full_key = "[AltMod][CtrlMod][ShiftMod][numpad][new_key]" + if(independent) + modless_key_bindings -= old_key + modless_key_bindings[full_key] = kb_name else - winset(user, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default") + if(key_bindings[old_key]) + key_bindings[old_key] -= kb_name + if(!length(key_bindings[old_key])) + key_bindings -= old_key + key_bindings[full_key] += list(kb_name) + key_bindings[full_key] = sortList(key_bindings[full_key]) + user.client.update_movement_keys() + user << browse(null, "window=capturekeypress") + save_preferences() + + if("keybindings_reset") + var/choice = tgalert(user, "Would you prefer 'hotkey' or 'classic' defaults?", "Setup keybindings", "Hotkey", "Classic", "Cancel") + if(choice == "Cancel") + ShowChoices(user) + return + hotkeys = (choice == "Hotkey") + key_bindings = (hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key) + modless_key_bindings = list() + user.client.update_movement_keys() + + if("chat_on_map") + chat_on_map = !chat_on_map + if("see_chat_non_mob") + see_chat_non_mob = !see_chat_non_mob if("action_buttons") buttons_locked = !buttons_locked if("tgui_fancy") @@ -2250,6 +2516,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("ghost_pda") chat_toggles ^= CHAT_GHOSTPDA + if("income_pings") + chat_toggles ^= CHAT_BANKCARD + if("pull_requests") chat_toggles ^= CHAT_PULLR @@ -2308,21 +2577,18 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("ambientocclusion") ambientocclusion = !ambientocclusion if(parent && parent.screen && parent.screen.len) - var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen - PM.backdrop(parent.mob) + var/obj/screen/plane_master/game_world/G = parent.mob.hud_used.plane_masters["[GAME_PLANE]"] + var/obj/screen/plane_master/above_wall/A = parent.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"] + var/obj/screen/plane_master/wall/W = parent.mob.hud_used.plane_masters["[WALL_PLANE]"] + G.backdrop(parent.mob) + A.backdrop(parent.mob) + W.backdrop(parent.mob) if("auto_fit_viewport") auto_fit_viewport = !auto_fit_viewport if(auto_fit_viewport && parent) parent.fit_viewport() - if("sprint_key") - sprint_spacebar = !sprint_spacebar - - if("sprint_toggle") - sprint_toggle = !sprint_toggle - - if("hud_toggle_flash") hud_toggle_flash = !hud_toggle_flash @@ -2345,8 +2611,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) current_tab = text2num(href_list["tab"]) if(href_list["preference"] == "gear") if(href_list["clear_loadout"]) - LAZYCLEARLIST(chosen_gear) - gear_points = initial(gear_points) + chosen_gear = list() + gear_points = CONFIG_GET(number/initial_gear_points) save_preferences() if(href_list["select_category"]) for(var/i in GLOB.loadout_items) @@ -2358,7 +2624,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return var/toggle = text2num(href_list["toggle_gear"]) if(!toggle && (G.type in chosen_gear))//toggling off and the item effectively is in chosen gear) - LAZYREMOVE(chosen_gear, G.type) + chosen_gear -= G.type gear_points += initial(G.cost) else if(toggle && (!(is_type_in_ref_list(G, chosen_gear)))) if(!is_loadout_slot_available(G.category)) @@ -2368,7 +2634,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.") return if(gear_points >= initial(G.cost)) - LAZYADD(chosen_gear, G.type) + chosen_gear += G.type gear_points -= initial(G.cost) ShowChoices(user) @@ -2406,10 +2672,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) organ_eyes.old_eye_color = eye_color character.hair_color = hair_color character.facial_hair_color = facial_hair_color - character.horn_color = horn_color - character.wing_color = wing_color - character.skin_tone = skin_tone + character.dna.skin_tone_override = use_custom_skin_tone ? skin_tone : null character.hair_style = hair_style character.facial_hair_style = facial_hair_style character.underwear = underwear @@ -2431,6 +2695,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new /datum/species/human save_character() + var/old_size = character.dna.features["body_size"] + character.dna.features = features.Copy() character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) character.dna.real_name = character.real_name @@ -2452,6 +2718,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.give_genitals(TRUE) //character.update_genitals() is already called on genital.update_appearance() + character.dna.update_body_size(old_size) + SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) //let's be sure the character updates @@ -2499,3 +2767,37 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!cached_holoform_icons[filter_type]) cached_holoform_icons[filter_type] = process_holoform_icon_filter(custom_holoform_icon, filter_type) return cached_holoform_icons[filter_type] + +//Used in savefile update 32, can be removed once that is no longer relevant. +/datum/preferences/proc/force_reset_keybindings() + var/choice = tgalert(parent.mob, "Your basic keybindings need to be reset, emotes will remain as before. Would you prefer 'hotkey' or 'classic' mode?", "Reset keybindings", "Hotkey", "Classic") + hotkeys = (choice != "Classic") + var/list/oldkeys = key_bindings + key_bindings = (hotkeys) ? deepCopyList(GLOB.hotkey_keybinding_list_by_key) : deepCopyList(GLOB.classic_keybinding_list_by_key) + + for(var/key in oldkeys) + if(!key_bindings[key]) + key_bindings[key] = oldkeys[key] + parent.update_movement_keys() + +/datum/preferences/proc/is_loadout_slot_available(slot) + var/list/L + LAZYINITLIST(L) + for(var/i in chosen_gear) + var/datum/gear/G = i + var/occupied_slots = L[slot_to_string(initial(G.category))] ? L[slot_to_string(initial(G.category))] + 1 : 1 + LAZYSET(L, slot_to_string(initial(G.category)), occupied_slots) + switch(slot) + if(SLOT_IN_BACKPACK) + if(L[slot_to_string(SLOT_IN_BACKPACK)] < BACKPACK_SLOT_AMT) + return TRUE + if(SLOT_HANDS) + if(L[slot_to_string(SLOT_HANDS)] < HANDS_SLOT_AMT) + return TRUE + else + if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) + return TRUE + +#undef DEFAULT_SLOT_AMT +#undef HANDS_SLOT_AMT +#undef BACKPACK_SLOT_AMT diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ca51a27dae..1ec3fc6404 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 28 +#define SAVEFILE_VERSION_MAX 33 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -42,7 +42,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_preferences(current_version, savefile/S) - return + if(current_version < 32) //If you remove this, remove force_reset_keybindings() too. + addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. /datum/preferences/proc/update_character(current_version, savefile/S) if(current_version < 19) @@ -120,10 +121,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(fexists(vr_path)) var/list/json_from_file = json_decode(file2text(vr_path)) if(json_from_file) - digestable = json_from_file["digestable"] - devourable = json_from_file["devourable"] - feeding = json_from_file["feeding"] - lickable = json_from_file["lickable"] + if(json_from_file["digestable"]) + ENABLE_BITFIELD(vore_flags,DIGESTABLE) + if(json_from_file["devourable"]) + ENABLE_BITFIELD(vore_flags,DEVOURABLE) + if(json_from_file["feeding"]) + ENABLE_BITFIELD(vore_flags,FEEDING) + if(json_from_file["lickable"]) + ENABLE_BITFIELD(vore_flags,LICKABLE) belly_prefs = json_from_file["belly_prefs"] vore_taste = json_from_file["vore_taste"] @@ -159,6 +164,42 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_shape"] = malformed_hockeys[hockey] features["cock_taur"] = TRUE + if(current_version < 29) + var/digestable + var/devourable + var/feeding + var/lickable + S["digestable"] >> digestable + S["devourable"] >> devourable + S["feeding"] >> feeding + S["lickable"] >> lickable + if(digestable) + ENABLE_BITFIELD(vore_flags,DIGESTABLE) + if(devourable) + ENABLE_BITFIELD(vore_flags,DEVOURABLE) + if(feeding) + ENABLE_BITFIELD(vore_flags,FEEDING) + if(lickable) + ENABLE_BITFIELD(vore_flags,LICKABLE) + + if(current_version < 30) + switch(features["taur"]) + if("Husky", "Lab", "Shepherd", "Fox", "Wolf") + features["taur"] = "Canine" + if("Panther", "Tiger") + features["taur"] = "Feline" + if("Cow") + features["taur"] = "Cow (Spotted)" + + if(current_version < 31) + S["wing_color"] >> features["wings_color"] + S["horn_color"] >> features["horns_color"] + + if(current_version < 33) + features["flavor_text"] = html_encode(features["flavor_text"]) + features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"]) + features["ooc_notes"] = html_encode(features["ooc_notes"]) + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -189,6 +230,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style S["hotkeys"] >> hotkeys + S["chat_on_map"] >> chat_on_map + S["max_chat_length"] >> max_chat_length + S["see_chat_non_mob"] >> see_chat_non_mob S["tgui_fancy"] >> tgui_fancy S["tgui_lock"] >> tgui_lock S["buttons_locked"] >> buttons_locked @@ -212,8 +256,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["parallax"] >> parallax S["ambientocclusion"] >> ambientocclusion S["auto_fit_viewport"] >> auto_fit_viewport - S["sprint_spacebar"] >> sprint_spacebar - S["sprint_toggle"] >> sprint_toggle S["hud_toggle_flash"] >> hud_toggle_flash S["hud_toggle_color"] >> hud_toggle_color S["menuoptions"] >> menuoptions @@ -223,6 +265,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["pda_color"] >> pda_color S["pda_skin"] >> pda_skin + // Custom hotkeys + S["key_bindings"] >> key_bindings + S["modless_key_bindings"] >> modless_key_bindings + //citadel code S["arousable"] >> arousable S["screenshake"] >> screenshake @@ -231,7 +277,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["autostand"] >> autostand S["cit_toggles"] >> cit_toggles S["preferred_chaos"] >> preferred_chaos - S["auto_ooc"] >> auto_ooc + S["auto_ooc"] >> auto_ooc + S["no_tetris_storage"] >> no_tetris_storage //try to fix any outdated data if necessary @@ -243,18 +290,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) UI_style = sanitize_inlist(UI_style, GLOB.available_ui_styles, GLOB.available_ui_styles[1]) hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys)) + chat_on_map = sanitize_integer(chat_on_map, 0, 1, initial(chat_on_map)) + max_chat_length = sanitize_integer(max_chat_length, 1, CHAT_MESSAGE_MAX_LENGTH, initial(max_chat_length)) + see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked)) windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) + toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles)) clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) - sprint_spacebar = sanitize_integer(sprint_spacebar, 0, 1, initial(sprint_spacebar)) - sprint_toggle = sanitize_integer(sprint_toggle, 0, 1, initial(sprint_toggle)) hud_toggle_flash = sanitize_integer(hud_toggle_flash, 0, 1, initial(hud_toggle_flash)) hud_toggle_color = sanitize_hexcolor(hud_toggle_color, 6, 1, initial(hud_toggle_color)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) @@ -268,13 +316,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT) screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) - widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) + widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) autostand = sanitize_integer(autostand, 0, 1, initial(autostand)) - cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles)) + cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles)) auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc)) + no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage)) + key_bindings = sanitize_islist(key_bindings, list()) + modless_key_bindings = sanitize_islist(modless_key_bindings, list()) + + verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped return 1 +/datum/preferences/proc/verify_keybindings_valid() + // Sanitize the actual keybinds to make sure they exist. + for(var/key in key_bindings) + if(!islist(key_bindings[key])) + key_bindings -= key + var/list/binds = key_bindings[key] + for(var/bind in binds) + if(!GLOB.keybindings_by_name[bind]) + binds -= bind + if(!length(binds)) + key_bindings -= key + // End + // I hate copypaste but let's do it again but for modless ones + for(var/key in modless_key_bindings) + var/bindname = modless_key_bindings[key] + if(!GLOB.keybindings_by_name[bindname]) + modless_key_bindings -= key + /datum/preferences/proc/save_preferences() if(!path) return 0 @@ -295,6 +366,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["lastchangelog"], lastchangelog) WRITE_FILE(S["UI_style"], UI_style) WRITE_FILE(S["hotkeys"], hotkeys) + WRITE_FILE(S["chat_on_map"], chat_on_map) + WRITE_FILE(S["max_chat_length"], max_chat_length) + WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob) WRITE_FILE(S["tgui_fancy"], tgui_fancy) WRITE_FILE(S["tgui_lock"], tgui_lock) WRITE_FILE(S["buttons_locked"], buttons_locked) @@ -316,8 +390,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["parallax"], parallax) WRITE_FILE(S["ambientocclusion"], ambientocclusion) WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) - WRITE_FILE(S["sprint_spacebar"], sprint_spacebar) - WRITE_FILE(S["sprint_toggle"], sprint_toggle) WRITE_FILE(S["hud_toggle_flash"], hud_toggle_flash) WRITE_FILE(S["hud_toggle_color"], hud_toggle_color) WRITE_FILE(S["menuoptions"], menuoptions) @@ -326,6 +398,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["pda_style"], pda_style) WRITE_FILE(S["pda_color"], pda_color) WRITE_FILE(S["pda_skin"], pda_skin) + WRITE_FILE(S["key_bindings"], key_bindings) + WRITE_FILE(S["modless_key_bindings"], modless_key_bindings) //citadel code WRITE_FILE(S["screenshake"], screenshake) @@ -336,6 +410,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["cit_toggles"], cit_toggles) WRITE_FILE(S["preferred_chaos"], preferred_chaos) WRITE_FILE(S["auto_ooc"], auto_ooc) + WRITE_FILE(S["no_tetris_storage"], no_tetris_storage) return 1 @@ -378,15 +453,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(newtype) pref_species = new newtype - if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") - WRITE_FILE(S["features["mcolor"]"] , "#FFF") - - if(!S["features["horn_color"]"] || S["features["horn_color"]"] == "#000") - WRITE_FILE(S["features["horn_color"]"] , "#85615a") - - if(!S["features["wing_color"]"] || S["features["wing_color"]"] == "#000") - WRITE_FILE(S["features["wing_color"]"] , "#FFF") - //Character S["real_name"] >> real_name S["nameless"] >> nameless @@ -395,10 +461,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["body_is_always_random"] >> be_random_body S["gender"] >> gender S["body_model"] >> features["body_model"] + S["body_size"] >> features["body_size"] S["age"] >> age S["hair_color"] >> hair_color S["facial_hair_color"] >> facial_hair_color S["eye_color"] >> eye_color + S["use_custom_skin_tone"] >> use_custom_skin_tone S["skin_tone"] >> skin_tone S["hair_style_name"] >> hair_style S["facial_style_name"] >> facial_hair_style @@ -408,8 +476,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["shirt_color"] >> shirt_color S["socks"] >> socks S["socks_color"] >> socks_color - S["horn_color"] >> horn_color - S["wing_color"] >> wing_color S["backbag"] >> backbag S["jumpsuit_style"] >> jumpsuit_style S["uplink_loc"] >> uplink_spawn_loc @@ -427,6 +493,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_insect_wings"] >> features["insect_wings"] S["feature_insect_fluff"] >> features["insect_fluff"] S["feature_insect_markings"] >> features["insect_markings"] + S["feature_horns_color"] >> features["horns_color"] + S["feature_wings_color"] >> features["wings_color"] + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) @@ -497,13 +566,31 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else //We have no old flavortext, default to new S["feature_flavor_text"] >> features["flavor_text"] - S["digestable"] >> digestable - S["devourable"] >> devourable - S["feeding"] >> feeding + + S["silicon_feature_flavor_text"] >> features["silicon_flavor_text"] + + S["feature_ooc_notes"] >> features["ooc_notes"] + S["silicon_flavor_text"] >> features["silicon_flavor_text"] + + S["vore_flags"] >> vore_flags S["vore_taste"] >> vore_taste - S["lickable"] >> lickable S["belly_prefs"] >> belly_prefs + //gear loadout + var/text_to_load + S["loadout"] >> text_to_load + var/list/saved_loadout_paths = splittext(text_to_load, "|") + chosen_gear = list() + gear_points = CONFIG_GET(number/initial_gear_points) + for(var/i in saved_loadout_paths) + var/datum/gear/path = text2path(i) + if(path) + var/init_cost = initial(path.cost) + if(init_cost > gear_points) + continue + chosen_gear += path + gear_points -= init_cost + //try to fix any outdated data if necessary if(needs_update >= 0) update_character(needs_update, S) //needs_update == savefile_version if we need an update (positive integer) @@ -522,15 +609,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!custom_names[custom_name_id]) custom_names[custom_name_id] = get_default_name(custom_name_id) - if(!features["mcolor"] || features["mcolor"] == "#000") - features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - - if(!features["horn_color"] || features["horn_color"] == "#000") - features["horn_color"] = "85615a" - - if(!features["wing_color"] || features["wing_color"] == "#000") - features["wing_color"] = "FFFFFF" - nameless = sanitize_integer(nameless, 0, 1, initial(nameless)) be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body)) @@ -547,9 +625,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car hair_color = sanitize_hexcolor(hair_color, 3, 0) facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) eye_color = sanitize_hexcolor(eye_color, 3, 0) - skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) - horn_color = sanitize_hexcolor(horn_color, 3, FALSE) - wing_color = sanitize_hexcolor(wing_color, 3, FALSE, "#FFFFFF") + + var/static/allow_custom_skintones + if(isnull(allow_custom_skintones)) + allow_custom_skintones = CONFIG_GET(flag/allow_custom_skintones) + use_custom_skin_tone = allow_custom_skintones ? sanitize_integer(use_custom_skin_tone, FALSE, TRUE, initial(use_custom_skin_tone)) : FALSE + if(use_custom_skin_tone) + skin_tone = sanitize_hexcolor(skin_tone, 6, TRUE, "#FFFFFF") + else + skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones - GLOB.nonstandard_skin_tones, initial(skin_tone)) + + features["horns_color"] = sanitize_hexcolor(features["horns_color"], 3, FALSE, "85615a") + features["wings_color"] = sanitize_hexcolor(features["wings_color"], 3, FALSE, "FFFFFF") backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag)) jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style)) uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc)) @@ -568,6 +655,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None") features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + var/static/size_min + if(!size_min) + size_min = CONFIG_GET(number/body_size_min) + var/static/size_max + if(!size_max) + size_max = CONFIG_GET(number/body_size_max) + features["body_size"] = sanitize_num_clamp(features["body_size"], size_min, size_max, RESIZE_DEFAULT_SIZE, 0.01) + var/static/list/B_sizes if(!B_sizes) var/list/L = CONFIG_GET(keyed_list/breasts_cups_prefs) @@ -600,6 +695,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN) + features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN) + features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) //Validate job prefs @@ -609,10 +706,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks = SANITIZE_LIST(all_quirks) - lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable)) - devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable)) - digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable)) - feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding)) + vore_flags = sanitize_integer(vore_flags, 0, MAX_VORE_FLAG, 0) vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN) belly_prefs = SANITIZE_LIST(belly_prefs) @@ -643,10 +737,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["body_is_always_random"] , be_random_body) WRITE_FILE(S["gender"] , gender) WRITE_FILE(S["body_model"] , features["body_model"]) + WRITE_FILE(S["body_size"] , features["body_size"]) WRITE_FILE(S["age"] , age) WRITE_FILE(S["hair_color"] , hair_color) WRITE_FILE(S["facial_hair_color"] , facial_hair_color) WRITE_FILE(S["eye_color"] , eye_color) + WRITE_FILE(S["use_custom_skin_tone"] , use_custom_skin_tone) WRITE_FILE(S["skin_tone"] , skin_tone) WRITE_FILE(S["hair_style_name"] , hair_style) WRITE_FILE(S["facial_style_name"] , facial_hair_style) @@ -656,8 +752,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["shirt_color"] , shirt_color) WRITE_FILE(S["socks"] , socks) WRITE_FILE(S["socks_color"] , socks_color) - WRITE_FILE(S["horn_color"] , horn_color) - WRITE_FILE(S["wing_color"] , wing_color) WRITE_FILE(S["backbag"] , backbag) WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) @@ -673,6 +767,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) + WRITE_FILE(S["feature_horns_color"] , features["horns_color"]) + WRITE_FILE(S["feature_wings_color"] , features["wings_color"]) WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"]) WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"]) WRITE_FILE(S["feature_insect_markings"] , features["insect_markings"]) @@ -704,6 +800,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_has_womb"], features["has_womb"]) + WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this @@ -720,13 +818,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) - WRITE_FILE(S["digestable"] , digestable) - WRITE_FILE(S["devourable"] , devourable) - WRITE_FILE(S["feeding"] , feeding) + WRITE_FILE(S["vore_flags"] , vore_flags) WRITE_FILE(S["vore_taste"] , vore_taste) - WRITE_FILE(S["lickable"] , lickable) WRITE_FILE(S["belly_prefs"] , belly_prefs) + //gear loadout + if(chosen_gear.len) + var/text_to_save = chosen_gear.Join("|") + S["loadout"] << text_to_save + else + S["loadout"] << "" //empty string to reset the value + cit_character_pref_save(S) return 1 diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 8f7156863d..951e36f9a6 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -250,6 +250,27 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() /datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_OOC +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_looc)() + set name = "Show/Hide LOOC" + set category = "Preferences" + set desc = "Toggles seeing LocalOutOfCharacter chat" + usr.client.prefs.chat_toggles ^= CHAT_LOOC + usr.client.prefs.save_preferences() + to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing LOOC", "[usr.client.prefs.chat_toggles & CHAT_LOOC ? "Enabled" : "Disabled"]")) +/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_LOOC + +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_bank_card)() + set name = "Show/Hide Income Updates" + set category = "Preferences" + set desc = "Show or hide updates to your income" + usr.client.prefs.chat_toggles ^= CHAT_BANKCARD + usr.client.prefs.save_preferences() + to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "now" : "no longer"] be notified when you get paid.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Income Notifications", "[(usr.client.prefs.chat_toggles & CHAT_BANKCARD) ? "Enabled" : "Disabled"]")) +/datum/verbs/menu/Settings/listen_bank_card/Get_checked(client/C) + return C.prefs.chat_toggles & CHAT_BANKCARD GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \ "ghost_blue","ghost_yellow","ghost_green","ghost_pink", \ diff --git a/code/modules/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm index bc32d3c222..1a019bba80 100644 --- a/code/modules/client/verbs/aooc.dm +++ b/code/modules/client/verbs/aooc.dm @@ -13,21 +13,38 @@ GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f") if(!mob) return + if(!(prefs.toggles & CHAT_OOC)) + to_chat(src, " You have OOC muted.") + return + if(jobban_isbanned(mob, "OOC")) + to_chat(src, "You have been banned from OOC.") + return + if(!holder) - if(mob.stat == DEAD) - to_chat(usr, "You cannot use AOOC while dead.") - return - if(!is_special_character(mob)) - to_chat(usr, "You aren't an antagonist!") - if(prefs.muted & MUTE_OOC) - to_chat(src, "You cannot use AOOC (muted).") - return - if(jobban_isbanned(src.mob, "OOC")) - to_chat(src, "You are banned from OOC.") - return if(!GLOB.aooc_allowed) to_chat(src, "AOOC is currently muted.") return + if(prefs.muted & MUTE_OOC) + to_chat(src, "You cannot use AOOC (muted).") + return + if(!is_special_character(mob)) + to_chat(usr, "You aren't an antagonist!") + if(handle_spam_prevention(msg,MUTE_OOC)) + return + if(findtext(msg, "byond://")) + to_chat(src, "Advertising other servers is not allowed.") + log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") + return + if(mob.stat) + to_chat(usr, "You cannot use AOOC while unconscious or dead.") + return + if(isdead(mob)) + to_chat(src, "You cannot use AOOC while ghosting.") + return + if(HAS_TRAIT(mob, TRAIT_AOOC_MUTE)) + to_chat(src, "You cannot use AOOC right now.") + return + if(QDELETED(src)) return diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index 075cabcbbb..da39eabc12 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -38,11 +38,15 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC") log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") return if(mob.stat) - to_chat(src, "You cannot salt in LOOC while unconscious or dead.") + to_chat(src, "You cannot use LOOC while unconscious or dead.") return - if(istype(mob, /mob/dead)) + if(isdead(mob)) to_chat(src, "You cannot use LOOC while ghosting.") return + if(HAS_TRAIT(mob, TRAIT_LOOC_MUTE)) + to_chat(src, "You cannot use LOOC right now.") + return + msg = emoji_parse(msg) diff --git a/code/modules/client/verbs/minimap.dm b/code/modules/client/verbs/minimap.dm index 3d213dc210..3cdb1d57a8 100644 --- a/code/modules/client/verbs/minimap.dm +++ b/code/modules/client/verbs/minimap.dm @@ -6,5 +6,7 @@ if(!CONFIG_GET(flag/minimaps_enabled)) to_chat(usr, "Minimap generation is not enabled in the server's configuration.") return - + if(!SSminimaps.station_minimap) + to_chat(usr, "Minimap generation is in progress, please wait!") + return SSminimaps.station_minimap.show(src) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index cbd1fcff87..df05eee638 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -219,14 +219,13 @@ if(isitem(target)) var/obj/item/I = target I.item_state = initial(picked_item.item_state) - I.item_color = initial(picked_item.item_color) var/obj/item/clothing/CL = target var/obj/item/clothing/PCL = new picked_item if(istype(CL) && istype(PCL)) CL.flags_cover = PCL.flags_cover CL.flags_inv = PCL.flags_inv CL.mutantrace_variation = PCL.mutantrace_variation - CL.alternate_worn_icon = PCL.alternate_worn_icon + CL.mob_overlay_icon = PCL.mob_overlay_icon qdel(PCL) target.icon = initial(picked_item.icon) @@ -238,7 +237,6 @@ P.desc = initial(picked_item.desc) P.icon_state = initial(picked_item.icon_state) P.item_state = initial(picked_item.item_state) - P.item_color = initial(picked_item.item_color) P.overlays_offsets = initial(picked_item.overlays_offsets) P.set_new_overlays() P.update_icon() @@ -264,12 +262,19 @@ return random_look(owner) -/obj/item/clothing/under/chameleon +// Forgive me for my sins... +#define CHAMELEON_CLOTHING_DEFINE(path) \ +##path/syndicate/Initialize(mapload){\ + . = ..();\ + AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR);\ +}\ +##path + +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon) //starts off as black name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" - item_color = "black" desc = "It's a plain jumpsuit. It has a small dial on the wrist." sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? random_sensor = FALSE @@ -284,7 +289,6 @@ desc = "A tough jumpsuit woven from alloy threads. It can take on the appearance of other jumpsuits." icon_state = "engine" item_state = "engi_suit" - item_color = "engine" /obj/item/clothing/under/chameleon/Initialize() . = ..() @@ -304,7 +308,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/suit/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/suit/chameleon) name = "armor" desc = "A slim armored vest that protects against most types of damage." icon_state = "armor" @@ -333,7 +337,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/glasses/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/glasses/chameleon) name = "Optical Meson Scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." icon_state = "meson" @@ -361,7 +365,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/gloves/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon) desc = "These gloves will protect the wearer from electric shock." name = "insulated gloves" icon_state = "yellow" @@ -372,6 +376,9 @@ var/datum/action/item_action/chameleon/change/chameleon_action +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon/insulated) + siemens_coefficient = 0 + /obj/item/clothing/gloves/chameleon/Initialize() . = ..() chameleon_action = new(src) @@ -390,11 +397,10 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/head/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) name = "grey cap" desc = "It's a baseball hat in a tasteful grey colour." icon_state = "greysoft" - item_color = "grey" resistance_flags = NONE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) @@ -434,7 +440,7 @@ var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) randomise_action.UpdateButtonIcon() -/obj/item/clothing/mask/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate icon_state = "gas_alt" @@ -491,10 +497,9 @@ /obj/item/clothing/mask/chameleon/drone/attack_self(mob/user) to_chat(user, "[src] does not have a voice changer.") -/obj/item/clothing/shoes/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon) name = "black shoes" icon_state = "black" - item_color = "black" desc = "A pair of black shoes." permeability_coefficient = 0.05 resistance_flags = NONE @@ -517,10 +522,9 @@ return chameleon_action.emp_randomise() -/obj/item/clothing/shoes/chameleon/noslip +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon/noslip) name = "black shoes" icon_state = "black" - item_color = "black" desc = "A pair of black shoes." clothing_flags = NOSLIP @@ -528,7 +532,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/storage/backpack/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/backpack/chameleon) name = "backpack" var/datum/action/item_action/chameleon/change/chameleon_action @@ -549,7 +553,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/storage/belt/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/belt/chameleon) name = "toolbelt" desc = "Holds tools." var/datum/action/item_action/chameleon/change/chameleon_action @@ -577,7 +581,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/radio/headset/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/radio/headset/chameleon) name = "radio headset" var/datum/action/item_action/chameleon/change/chameleon_action @@ -598,7 +602,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/pda/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/pda/chameleon) name = "PDA" var/datum/action/item_action/chameleon/change/pda/chameleon_action @@ -620,7 +624,7 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/stamp/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/stamp/chameleon) var/datum/action/item_action/chameleon/change/chameleon_action /obj/item/stamp/chameleon/Initialize() @@ -634,12 +638,11 @@ . = ..() chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/neck/cloak/chameleon +CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/neck/cloak/chameleon) name = "black tie" desc = "A neosilk clip-on tie." icon = 'icons/obj/clothing/neck.dmi' icon_state = "blacktie" - item_color = "blacktie" resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 7e2d73190a..a28061db10 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -3,6 +3,7 @@ resistance_flags = FLAMMABLE max_integrity = 200 integrity_failure = 0.4 + block_priority = BLOCK_PRIORITY_CLOTHING var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect @@ -46,25 +47,12 @@ //Add a "exclude" string to do the opposite, making it only only species listed that can't wear it. //You append this to clothing objects. - //Polychrome stuff: - var/hasprimary = FALSE //These vars allow you to choose which overlays a clothing has - var/hassecondary = FALSE - var/hastertiary = FALSE - var/primary_color = "#FFFFFF" //RGB in hexcode - var/secondary_color = "#FFFFFF" - var/tertiary_color = "#808080" - - //No idea what this is but eh -tori - var/force_alternate_icon = FALSE - /obj/item/clothing/Initialize() . = ..() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) actions_types += /datum/action/item_action/toggle_voice_box if(ispath(pocket_storage_component_path)) LoadComponent(pocket_storage_component_path) - if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled - update_icon() //Applies the overlays and default colors onto the clothes on spawn. /obj/item/clothing/MouseDrop(atom/over_object) . = ..() @@ -149,8 +137,6 @@ how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n" how_cool_are_your_threads += "" . += how_cool_are_your_threads.Join() - if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled - . += "Alt-click to recolor it." /obj/item/clothing/obj_break(damage_flag) if(!damaged_clothes) @@ -187,179 +173,18 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ -/proc/generate_female_clothing(index,t_color,icon,type) - var/icon/female_clothing_icon = icon("icon"=icon, "icon_state"=t_color) - var/icon/female_s = icon("icon"='icons/mob/uniform.dmi', "icon_state"="[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") - female_clothing_icon.Blend(female_s, ICON_MULTIPLY) - female_clothing_icon = fcopy_rsc(female_clothing_icon) - GLOB.female_clothing_icons[index] = female_clothing_icon - -/obj/item/clothing/under/verb/toggle() - set name = "Adjust Suit Sensors" - set category = "Object" - set src in usr - var/mob/M = usr - if (istype(M, /mob/dead/)) - return - if (!can_use(M)) - return - if(src.has_sensor == LOCKED_SENSORS) - to_chat(usr, "The controls are locked.") - return 0 - if(src.has_sensor == BROKEN_SENSORS) - to_chat(usr, "The sensors have shorted out!") - return 0 - if(src.has_sensor <= NO_SENSORS) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") - var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away!") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - to_chat(usr, "You disable your suit's remote sensing equipment.") - if(1) - to_chat(usr, "Your suit will now only report whether you are alive or dead.") - if(2) - to_chat(usr, "Your suit will now only report your exact vital lifesigns.") - if(3) - to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") - - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.w_uniform == src) - H.update_suit_sensors() - - -/obj/item/clothing/under/CtrlClick(mob/user) - . = ..() - - if (!(item_flags & IN_INVENTORY)) - return - - if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - - if(has_sensor == LOCKED_SENSORS) - to_chat(user, "The controls are locked.") - return - if(has_sensor == BROKEN_SENSORS) - to_chat(user, "The sensors have shorted out!") - return - if(has_sensor <= NO_SENSORS) - to_chat(user, "This suit does not have any sensors.") - return - - sensor_mode = SENSOR_COORDS - - to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") - - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.w_uniform == src) - H.update_suit_sensors() - -/obj/item/clothing/under/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(attached_accessory) - remove_accessory(user) - else - rolldown() - // Polychrome stuff: - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE - -/obj/item/clothing/neck/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - // Polychrome stuff: - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE - -/obj/item/clothing/under/verb/jumpsuit_adjust() - set name = "Adjust Jumpsuit Style" - set category = null - set src in usr - rolldown() - -/obj/item/clothing/under/proc/rolldown() - if(!can_use(usr)) - return - if(!can_adjust) - to_chat(usr, "You cannot wear this suit any differently!") - return - if(toggle_jumpsuit_adjust()) - to_chat(usr, "You adjust the suit to wear it more casually.") - else - to_chat(usr, "You adjust the suit back to normal.") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.update_inv_w_uniform() - H.update_body() - -/obj/item/clothing/under/proc/toggle_jumpsuit_adjust() - adjusted = !adjusted - - if(adjusted) - if(fitted != FEMALE_UNIFORM_TOP) - fitted = NO_FEMALE_UNIFORM - if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted - body_parts_covered &= ~CHEST - else - fitted = initial(fitted) - if(!alt_covers_chest) - body_parts_covered |= CHEST - - return adjusted +/proc/generate_alpha_masked_clothing(index,state,icon,female,alpha_masks) + var/icon/I = icon(icon, state) + if(female) + var/icon/female_s = icon('icons/mob/clothing/alpha_masks.dmi', "[(female == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") + I.Blend(female_s, ICON_MULTIPLY, -15, -15) //it's a 64x64 icon. + if(alpha_masks) + if(istext(alpha_masks)) + alpha_masks = list(alpha_masks) + for(var/alpha_state in alpha_masks) + var/icon/alpha = icon('icons/mob/clothing/alpha_masks.dmi', alpha_state) + I.Blend(alpha, ICON_MULTIPLY, -15, -15) + . = GLOB.alpha_masked_worn_icons[index] = fcopy_rsc(I) /obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc. if(!can_use(user)) @@ -440,15 +265,3 @@ BLIND // can't see anything return FALSE return TRUE - -/obj/item/clothing/update_overlays() // Polychrome stuff - . = ..() - if(hasprimary) //Checks if the overlay is enabled - var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_color]-primary", color = primary_color) //Automagically picks overlays - . += primary_overlay //Applies the coloured overlay onto the item sprite. but NOT the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_color]-secondary", color = secondary_color) - . += secondary_overlay - if(hastertiary) - var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_color]-tertiary", color = tertiary_color) - . += tertiary_overlay \ No newline at end of file diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 1c31e19202..f58be1373a 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -6,6 +6,7 @@ throwforce = 0 slot_flags = ITEM_SLOT_EARS resistance_flags = NONE + custom_price = PRICE_BELOW_NORMAL /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -30,6 +31,7 @@ slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want! actions_types = list(/datum/action/item_action/toggle_headphones) var/headphones_on = FALSE + custom_price = PRICE_ALMOST_CHEAP /obj/item/clothing/ears/headphones/Initialize() . = ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 66dcf89a7a..01effea6f2 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -132,7 +132,7 @@ name = "prescription night vision goggles" desc = "NVGs but for those with nearsightedness." vision_correction = 1 - + /obj/item/clothing/glasses/night/syndicate name = "combat night vision goggles" desc = "See everything, without fear." @@ -203,6 +203,12 @@ icon_state = "hipster_glasses" item_state = "hipster_glasses" +/obj/item/clothing/glasses/regular/circle + name = "circle glasses" + desc = "Why would you wear something so controversial yet so brave?" + icon_state = "circle_glasses" + item_state = "circle_glasses" + //Here lies green glasses, so ugly they died. RIP /obj/item/clothing/glasses/sunglasses @@ -346,11 +352,11 @@ add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY) colored_before = TRUE -/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands && ishuman(loc) && !colored_before) var/mob/living/carbon/human/H = loc - var/mutable_appearance/M = mutable_appearance('icons/mob/eyes.dmi', "blindfoldwhite") + var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite") M.appearance_flags |= RESET_COLOR M.color = "#[H.eye_color]" . += M diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index 1c9afcfd6f..6d209ec695 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -1,7 +1,7 @@ /obj/item/clothing/glasses/phantomthief name = "suspicious paper mask" desc = "A cheap, Syndicate-branded paper face mask. They'll never see it coming." - alternate_worn_icon = 'icons/mob/mask.dmi' + mob_overlay_icon = 'icons/mob/clothing/mask.dmi' icon = 'icons/obj/clothing/masks.dmi' icon_state = "s-ninja" item_state = "s-ninja" @@ -23,8 +23,8 @@ else . += "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again." -/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate) - if(istype(user) && combatmodestate && world.time >= nextadrenalinepop) +/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/living/user, was_forced = FALSE) + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_TOGGLED) && world.time >= nextadrenalinepop) nextadrenalinepop = world.time + 5 MINUTES user.reagents.add_reagent(/datum/reagent/syndicateadrenals, 5) user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 0729317eac..ddf5e4b584 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -26,8 +26,8 @@ user.visible_message("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!") return OXYLOSS -/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index cf3541fd89..1b5cd6c7d2 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -1,3 +1,6 @@ +/obj/item/clothing/gloves/color + dying_key = DYE_REGISTRY_GLOVES + /obj/item/clothing/gloves/color/yellow desc = "These gloves will protect the wearer from electric shock." name = "insulated gloves" @@ -5,9 +8,57 @@ item_state = "ygloves" siemens_coefficient = 0 permeability_coefficient = 0.05 - item_color="yellow" resistance_flags = NONE var/can_be_cut = 1 + custom_price = PRICE_EXPENSIVE + custom_premium_price = PRICE_ALMOST_ONE_GRAND + +/obj/item/toy/sprayoncan + name = "spray-on insulation applicator" + desc = "What is the number one problem facing our station today?" + icon = 'icons/obj/clothing/gloves.dmi' + icon_state = "sprayoncan" + +/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscarbon(target) && proximity) + var/mob/living/carbon/C = target + var/mob/living/carbon/U = user + var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE) + if(success) + if(C == user) + C.visible_message("[U] sprays their hands with glittery rubber!") + else + C.visible_message("[U] sprays glittery rubber on the hands of [C]!") + else + C.visible_message("The rubber fails to stick to [C]'s hands!") + + qdel(src) + +/obj/item/clothing/gloves/color/yellow/sprayon + desc = "How're you gonna get 'em off, nerd?" + name = "spray-on insulated gloves" + icon_state = "sprayon" + item_state = "sprayon" + permeability_coefficient = 0 + resistance_flags = ACID_PROOF + var/shocks_remaining = 10 + +/obj/item/clothing/gloves/color/yellow/sprayon/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT) + +/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot) + . = ..() + RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked) + +/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked() + shocks_remaining-- + if(shocks_remaining < 0) + qdel(src) //if we run out of uses, the gloves crumble away into nothing, just like my dreams after working with .dm + +/obj/item/clothing/gloves/color/yellow/sprayon/dropped() + .=..() + qdel(src) //loose nodrop items bad /obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." @@ -16,7 +67,6 @@ item_state = "ygloves" siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() permeability_coefficient = 0.05 - item_color="yellow" resistance_flags = NONE var/can_be_cut = 1 @@ -70,21 +120,14 @@ name = "black gloves" icon_state = "black" item_state = "blackgloves" - item_color="black" cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - var/can_be_cut = 1 + var/can_be_cut = TRUE strip_mod = 1.2 -/obj/item/clothing/gloves/color/black/hos - item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. - -/obj/item/clothing/gloves/color/black/ce - item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. - /obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wirecutters)) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed @@ -99,15 +142,12 @@ desc = "A pair of gloves, they don't look special in any way." icon_state = "orange" item_state = "orangegloves" - item_color="orange" /obj/item/clothing/gloves/color/red name = "red gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "red" item_state = "redgloves" - item_color = "red" - /obj/item/clothing/gloves/color/red/insulated name = "insulated gloves" @@ -121,68 +161,48 @@ desc = "A pair of gloves, they don't look special in any way." icon_state = "rainbow" item_state = "rainbowgloves" - item_color = "rainbow" - -/obj/item/clothing/gloves/color/rainbow/clown - item_color = "clown" /obj/item/clothing/gloves/color/blue name = "blue gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "blue" item_state = "bluegloves" - item_color="blue" /obj/item/clothing/gloves/color/purple name = "purple gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "purple" item_state = "purplegloves" - item_color="purple" /obj/item/clothing/gloves/color/green name = "green gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "green" item_state = "greengloves" - item_color="green" /obj/item/clothing/gloves/color/grey name = "grey gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "gray" item_state = "graygloves" - item_color="grey" - -/obj/item/clothing/gloves/color/grey/rd - item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. - -/obj/item/clothing/gloves/color/grey/hop - item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. /obj/item/clothing/gloves/color/light_brown name = "light brown gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "lightbrown" item_state = "lightbrowngloves" - item_color="light brown" /obj/item/clothing/gloves/color/brown name = "brown gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "brown" item_state = "browngloves" - item_color="brown" - -/obj/item/clothing/gloves/color/brown/cargo - item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. /obj/item/clothing/gloves/color/captain desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier. Swanky." name = "captain's gloves" icon_state = "captain" item_state = "egloves" - item_color = "captain" siemens_coefficient = 0 permeability_coefficient = 0.05 cold_protection = HANDS @@ -199,7 +219,6 @@ item_state = "lgloves" siemens_coefficient = 0.3 permeability_coefficient = 0.01 - item_color="mime" transfer_prints = TRUE resistance_flags = NONE var/carrytrait = TRAIT_QUICK_CARRY @@ -207,18 +226,17 @@ /obj/item/clothing/gloves/color/latex/equipped(mob/user, slot) ..() if(slot == SLOT_GLOVES) - ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT) + ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/color/latex/dropped(mob/user) ..() - REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT) + REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" desc = "Pricy sterile gloves that are stronger than latex. Transfers advanced paramedical knowledge to the wearer via the use of nanochips." icon_state = "nitrile" item_state = "nitrilegloves" - item_color = "cmo" transfer_prints = FALSE carrytrait = TRAIT_QUICKER_CARRY @@ -231,12 +249,19 @@ permeability_coefficient = 0.3 resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/clothing/gloves/color/latex/engineering + name = "tinker's gloves" + desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_gauntlets" + item_state = "clockwork_gauntlets" + siemens_coefficient = 0.8 + permeability_coefficient = 0.3 + carrytrait = TRAIT_QUICK_BUILD + custom_materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) + /obj/item/clothing/gloves/color/white name = "white gloves" desc = "These look pretty fancy." icon_state = "white" item_state = "wgloves" - item_color="white" - -/obj/item/clothing/gloves/color/white/redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 9f4b89f607..a8017631bd 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -4,13 +4,140 @@ desc = "Plain black gloves without fingertips for the hard working." icon_state = "fingerless" item_state = "fingerless" - item_color = null //So they don't wash. transfer_prints = TRUE strip_delay = 40 equip_delay_other = 20 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT strip_mod = 0.9 + custom_price = PRICE_ALMOST_CHEAP + +/obj/item/clothing/gloves/fingerless/pugilist + name = "armwraps" + desc = "A series of armwraps. Makes you pretty keen to start punching people." + icon_state = "armwraps" + item_state = "armwraps" + body_parts_covered = ARMS + cold_protection = ARMS + strip_delay = 300 //you can't just yank them off + ///Extra damage through the punch. + var/enhancement = 0 //it's a +0 to your punches because it isn't magical + ///Main trait added by the gloves to the user on wear. + var/inherited_trait = TRAIT_NOGUNS //what are you, dishonoroable? + ///Secondary trait added by the gloves to the user on wear. + var/secondary_trait = TRAIT_FEARLESS //what are you, a coward? + +/obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_GLOVES) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + ADD_TRAIT(H, TRAIT_PUGILIST, GLOVE_TRAIT) + ADD_TRAIT(H, inherited_trait, GLOVE_TRAIT) + ADD_TRAIT(H, secondary_trait, GLOVE_TRAIT) + H.dna.species.punchdamagehigh += enhancement + H.dna.species.punchdamagelow += enhancement + +/obj/item/clothing/gloves/fingerless/pugilist/dropped(mob/user) + + REMOVE_TRAIT(user, TRAIT_PUGILIST, GLOVE_TRAIT) + REMOVE_TRAIT(user, inherited_trait, GLOVE_TRAIT) + REMOVE_TRAIT(user, secondary_trait, GLOVE_TRAIT) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.dna.species.punchdamagehigh = initial(H.dna.species.punchdamagehigh) + H.dna.species.punchdamagelow = initial(H.dna.species.punchdamagelow) + return ..() + +/obj/item/clothing/gloves/fingerless/pugilist/chaplain + name = "armwraps of unyielding resolve" + desc = "A series of armwraps, soaked in holy water. Makes you pretty keen to smite evil magic users." + resistance_flags = FIRE_PROOF | ACID_PROOF + enhancement = 2 //It is not magic that makes you punch harder, but force of will. Trust me. + secondary_trait = TRAIT_ANTIMAGIC + var/chaplain_spawnable = TRUE + +/obj/item/clothing/gloves/fingerless/pugilist/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) + +/obj/item/clothing/gloves/fingerless/pugilist/magic + name = "armwraps of mighty fists" + desc = "A series of armwraps. Makes you pretty keen to go adventuring and punch dragons." + resistance_flags = FIRE_PROOF | ACID_PROOF //magic items are harder to damage with energy this is a dnd joke okay? + enhancement = 1 //They're +1! + +/obj/item/clothing/gloves/fingerless/pugilist/hungryghost + name = "armwraps of the hungry ghost" + desc = "A series of blackened, bloodstained armwraps stitched with strange geometric symbols. Makes you pretty keen to commit horrible acts against the living through bloody carnage." + icon_state = "narsiearmwraps" + item_state = "narsiearmwraps" + resistance_flags = FIRE_PROOF | ACID_PROOF + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50) + enhancement = 3 + secondary_trait = TRAIT_KI_VAMPIRE + +/obj/item/clothing/gloves/fingerless/pugilist/brassmountain + name = "armbands of the brass mountain" + desc = "A series of scolding hot brass armbands. Makes you pretty keen to bring the light to the unenlightened through unmitigated violence." + icon_state = "ratvararmwraps" + item_state = "ratvararmwraps" + resistance_flags = FIRE_PROOF | ACID_PROOF + armor = list("melee" = 10, "bullet" = 0, "laser" = -10, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50) + enhancement = 4 //The artifice of Ratvar is unmatched except when it is. + secondary_trait = TRAIT_STRONG_GRABBER + +/obj/item/clothing/gloves/fingerless/pugilist/rapid + name = "Bands of the North Star" + desc = "The armbands of a deadly martial artist. Makes you pretty keen to put an end to evil in an extremely violent manner." + icon_state = "rapid" + item_state = "rapid" + enhancement = 10 //omae wa mou shindeiru + var/warcry = "AT" + secondary_trait = TRAIT_NOSOFTCRIT //basically extra health + +/obj/item/clothing/gloves/fingerless/pugilist/rapid/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT) + +/obj/item/clothing/gloves/fingerless/pugilist/rapid/Touch(atom/target, proximity = TRUE) + if(!isliving(target)) + return + + var/mob/living/M = loc + M.changeNext_move(CLICK_CD_RAPID) + if(warcry) + M.say("[warcry]", ignore_spam = TRUE, forced = TRUE) + + return FALSE + +/obj/item/clothing/gloves/fingerless/pugilist/rapid/AltClick(mob/user) + var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7) + if(input) + warcry = input + +/obj/item/clothing/gloves/fingerless/pugilist/hug + name = "Hugs of the North Star" + desc = "The armbands of a humble friend. Makes you pretty keen to go let everyone know how much you appreciate them!" + icon_state = "rapid" + item_state = "rapid" + enhancement = 0 + secondary_trait = TRAIT_PACIFISM //You are only here to hug and be friends! + +/obj/item/clothing/gloves/fingerless/pugilist/hug/Touch(mob/target, proximity = TRUE) + if(!isliving(target)) + return + + var/mob/living/M = loc + + if(M.a_intent != INTENT_HELP) + return FALSE + if(target.stat != CONSCIOUS) //Can't hug people who are dying/dead + return FALSE + else + M.changeNext_move(CLICK_CD_RAPID) + + return FALSE /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" @@ -48,7 +175,6 @@ desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms." icon_state = "bracers" item_state = "bracers" - item_color = null //So they don't wash. transfer_prints = TRUE strip_delay = 40 equip_delay_other = 20 @@ -59,54 +185,6 @@ resistance_flags = NONE armor = list("melee" = 15, "bullet" = 35, "laser" = 35, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0) -/obj/item/clothing/gloves/rapid - name = "Gloves of the North Star" - desc = "Just looking at these fills you with an urge to beat the shit out of people. Violently." - icon_state = "rapid" - item_state = "rapid" - transfer_prints = TRUE - var/warcry = "AT" - -/obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE) - if(!istype(target)) - return - - var/mob/living/M = loc - M.changeNext_move(CLICK_CD_RAPID) - M.adjustStaminaLoss(-3.5) // used to be -2 with some comment about stamina buffer management but *shrug -hatterhat - if(warcry) - M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") - - .= FALSE - - -/obj/item/clothing/gloves/rapid/attack_self(mob/user) - var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7) - if(input) - warcry = input - -/obj/item/clothing/gloves/rapid/hug - name = "Hugs of the North Star" - desc = "Just looking at these fills you with an urge to hug the shit out of people. In a very friendly manner." - warcry = "owo" //Shouldn't ever come into play - -/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE) - if(!istype(target)) - return - - var/mob/living/M = loc - - if(M.a_intent == INTENT_HELP) - if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead - if(target.on_fire || target.lying) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions - return - else - M.changeNext_move(CLICK_CD_RAPID) - . = FALSE - -/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) - return FALSE - /obj/item/clothing/gloves/thief name = "black gloves" desc = "Gloves made with completely frictionless, insulated cloth, easier to steal from people with." @@ -117,4 +195,4 @@ strip_delay = 80 transfer_prints = FALSE strip_mod = 5 - strip_silence = TRUE \ No newline at end of file + strip_silence = TRUE diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm new file mode 100644 index 0000000000..11b2afa968 --- /dev/null +++ b/code/modules/clothing/gloves/tacklers.dm @@ -0,0 +1,97 @@ +/obj/item/clothing/gloves/tackler + name = "gripper gloves" + desc = "Special gloves that manipulate the blood vessels in the wearer's hands, granting them the ability to launch headfirst into walls." + icon_state = "tackle" + item_state = "tackle" + transfer_prints = TRUE + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + resistance_flags = NONE + //custom_premium_price = PRICE_EXPENSIVE + /// For storing our tackler datum so we can remove it after + var/datum/component/tackler + /// See: [/datum/component/tackler/var/stamina_cost] + var/tackle_stam_cost = 25 + /// See: [/datum/component/tackler/var/base_knockdown] + var/base_knockdown = 1 SECONDS + /// See: [/datum/component/tackler/var/range] + var/tackle_range = 4 + /// See: [/datum/component/tackler/var/min_distance] + var/min_distance = 0 + /// See: [/datum/component/tackler/var/speed] + var/tackle_speed = 1 + /// See: [/datum/component/tackler/var/skill_mod] + var/skill_mod = 1 + +/obj/item/clothing/gloves/tackler/equipped(mob/user, slot) + . = ..() + if(!ishuman(user)) + return + if(slot == ITEM_SLOT_GLOVES) + var/mob/living/carbon/human/H = user + tackler = H.AddComponent(/datum/component/tackler, stamina_cost=tackle_stam_cost, base_knockdown = base_knockdown, range = tackle_range, speed = tackle_speed, skill_mod = skill_mod, min_distance = min_distance) + +/obj/item/clothing/gloves/tackler/dropped(mob/user) + . = ..() + if(tackler) + qdel(tackler) + +/obj/item/clothing/gloves/tackler/dolphin + name = "dolphin gloves" + desc = "Sleek, aerodynamic gripper gloves that are less effective at actually performing takedowns, but more effective at letting the user sail through the hallways and cause accidents." + icon_state = "tackledolphin" + item_state = "tackledolphin" + + tackle_stam_cost = 15 + base_knockdown = 0.5 SECONDS + tackle_range = 5 + tackle_speed = 2 + min_distance = 2 + skill_mod = -2 + +/obj/item/clothing/gloves/tackler/combat + name = "gorilla gloves" + desc = "Premium quality combative gloves, heavily reinforced to give the user an edge in close combat tackles, though they are more taxing to use than normal gripper gloves. Fireproof to boot!" + icon_state = "combat" + item_state = "blackgloves" + + tackle_stam_cost = 35 + base_knockdown = 1.5 SECONDS + tackle_range = 5 + skill_mod = 3 + + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + +/obj/item/clothing/gloves/tackler/combat/insulated + name = "guerrilla gloves" + desc = "Superior quality combative gloves, good for performing tackle takedowns as well as absorbing electrical shocks." + siemens_coefficient = 0 + permeability_coefficient = 0.05 + +/obj/item/clothing/gloves/tackler/rocket + name = "rocket gloves" + desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues." + icon_state = "tacklerocket" + item_state = "tacklerocket" + + tackle_stam_cost = 50 + base_knockdown = 2 SECONDS + tackle_range = 10 + min_distance = 7 + tackle_speed = 6 + skill_mod = 7 + +/obj/item/clothing/gloves/tackler/offbrand + name = "improvised gripper gloves" + desc = "Ratty looking fingerless gloves wrapped with sticky tape. Beware anyone wearing these, for they clearly have no shame and nothing to lose." + icon_state = "fingerless" + item_state = "fingerless" + + tackle_stam_cost = 30 + base_knockdown = 1.75 SECONDS + min_distance = 2 + skill_mod = -1 diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index d599fbf6f7..475e7a4e51 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -48,8 +48,8 @@ -/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index a5fb04d393..e79095863a 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -5,7 +5,6 @@ name = "white beanie" desc = "A stylish beanie. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their heads." icon_state = "beanie" //Default white - item_color = "beanie" /obj/item/clothing/head/beanie/black name = "black beanie" @@ -52,35 +51,33 @@ /obj/item/clothing/head/beanie/christmas name = "christmas beanie" icon_state = "beaniechristmas" - item_color = "beaniechristmas" /obj/item/clothing/head/beanie/striped name = "striped beanie" icon_state = "beaniestriped" - item_color = "beaniestriped" /obj/item/clothing/head/beanie/stripedred name = "red striped beanie" icon_state = "beaniestripedred" - item_color = "beaniestripedred" /obj/item/clothing/head/beanie/stripedblue name = "blue striped beanie" icon_state = "beaniestripedblue" - item_color = "beaniestripedblue" /obj/item/clothing/head/beanie/stripedgreen name = "green striped beanie" icon_state = "beaniestripedgreen" - item_color = "beaniestripedgreen" /obj/item/clothing/head/beanie/durathread name = "durathread beanie" desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beaniedurathread" - item_color = null armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) - +/obj/item/clothing/head/beanie/waldo + name = "red striped bobble hat" + desc = "If you're going on a worldwide hike, you'll need some cold protection." + icon_state = "waldo_hat" + item_state = "waldo_hat" //No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet \ No newline at end of file diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm deleted file mode 100644 index df4a21d6c1..0000000000 --- a/code/modules/clothing/head/cit_hats.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/item/clothing/head/hunter - name = "hunter" - desc = "A basic hat for hunting things." - icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi' - icon_state = "hunter" - item_state = "hunter_worn" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 29b0aa9552..80d0b7c8a8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -7,7 +7,7 @@ light_color = "#FFCC66" var/power_on = 0.8 var/on = FALSE - item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite) + var/hat_type = "yellow" //Determines used sprites: hardhat[on]_[hat_type] and hardhat[on]_[hat_type]2 (lying down sprite) armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50) flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) @@ -33,8 +33,8 @@ update_icon() /obj/item/clothing/head/hardhat/update_icon_state() - icon_state = "hardhat[on]_[item_color]" - item_state = "hardhat[on]_[item_color]" + icon_state = "hardhat[on]_[hat_type]" + item_state = "hardhat[on]_[hat_type]" /obj/item/clothing/head/hardhat/proc/turn_on(mob/user) set_light(brightness_on, power_on) @@ -45,13 +45,13 @@ /obj/item/clothing/head/hardhat/orange icon_state = "hardhat0_orange" item_state = "hardhat0_orange" - item_color = "orange" + hat_type = "orange" dog_fashion = null /obj/item/clothing/head/hardhat/red icon_state = "hardhat0_red" item_state = "hardhat0_red" - item_color = "red" + hat_type = "red" dog_fashion = null name = "firefighter helmet" clothing_flags = STOPSPRESSUREDAMAGE @@ -60,10 +60,20 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT +/obj/item/clothing/head/hardhat/red/upgraded + name = "workplace-ready firefighter helmet" + desc = "By applying state of the art lighting technology to a fire helmet, and using photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." + icon_state = "hardhat0_purple" + item_state = "hardhat0_purple" + brightness_on = 5 + resistance_flags = FIRE_PROOF | ACID_PROOF + custom_materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) + hat_type = "purple" + /obj/item/clothing/head/hardhat/white icon_state = "hardhat0_white" item_state = "hardhat0_white" - item_color = "white" + hat_type = "white" clothing_flags = STOPSPRESSUREDAMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT @@ -74,13 +84,13 @@ /obj/item/clothing/head/hardhat/dblue icon_state = "hardhat0_dblue" item_state = "hardhat0_dblue" - item_color = "dblue" + hat_type = "dblue" dog_fashion = null /obj/item/clothing/head/hardhat/atmos icon_state = "hardhat0_atmos" item_state = "hardhat0_atmos" - item_color = "atmos" + hat_type = "atmos" dog_fashion = null name = "atmospheric technician's firefighting helmet" desc = "A firefighter's helmet, able to keep the user cool in any situation." @@ -124,12 +134,12 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_icon() -/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) - . += mutable_appearance('icons/mob/head.dmi', "weldhelmet") + . += mutable_appearance('icons/mob/clothing/head.dmi', "weldhelmet") if(!up) - . += mutable_appearance('icons/mob/head.dmi', "weldvisor") + . += mutable_appearance('icons/mob/clothing/head.dmi', "weldvisor") /obj/item/clothing/head/hardhat/weldhat/update_overlays() . = ..() @@ -139,14 +149,14 @@ /obj/item/clothing/head/hardhat/weldhat/orange icon_state = "hardhat0_orange" item_state = "hardhat0_orange" - item_color = "orange" + hat_type = "orange" /obj/item/clothing/head/hardhat/weldhat/white desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller icon_state = "hardhat0_white" item_state = "hardhat0_white" brightness_on = 4 //Boss always takes the best stuff - item_color = "white" + hat_type = "white" clothing_flags = STOPSPRESSUREDAMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT @@ -156,4 +166,4 @@ /obj/item/clothing/head/hardhat/weldhat/dblue icon_state = "hardhat0_dblue" item_state = "hardhat0_dblue" - item_color = "dblue" \ No newline at end of file + hat_type = "dblue" \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 9ad05efb7a..8f852356b7 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -58,6 +58,7 @@ desc = "A reliable, blue tinted helmet reminding you that you still owe that engineer a beer." icon_state = "blueshift" item_state = "blueshift" + custom_premium_price = PRICE_ABOVE_EXPENSIVE /obj/item/clothing/head/helmet/riot name = "riot helmet" @@ -243,7 +244,7 @@ icon_state = "knight_greyscale" item_state = "knight_greyscale" armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix /obj/item/clothing/head/helmet/skull name = "skull helmet" @@ -273,7 +274,7 @@ //LightToggle -/obj/item/clothing/head/helment/ComponentInitialize() +/obj/item/clothing/head/helmet/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -385,3 +386,9 @@ cold_protection = HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 0) + +/obj/item/clothing/head/helmet/police + name = "police officer's hat" + desc = "A police officer's Hat. This hat emphasizes that you are THE LAW." + icon_state = "policehelm" + dynamic_hair_suffix = "" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9253c4e9aa..638a0c2f23 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -364,7 +364,6 @@ name = "durathread beret" desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beretdurathread" - item_color = null armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) #undef DRILL_DEFAULT diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 189fb46e46..201c9e0bea 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -129,6 +129,7 @@ dog_fashion = /datum/dog_fashion/head/pirate /obj/item/clothing/head/pirate/captain + name = "pirate captain hat" icon_state = "hgpiratecap" item_state = "hgpiratecap" @@ -372,16 +373,8 @@ name = "Telegram cap" desc = "A bright red cap warn by hotel staff. Or people who want to be a singing telegram" icon_state = "telegram" - item_color = "telegram" dog_fashion = /datum/dog_fashion/head/telegram -/obj/item/clothing/head/colour - name = "Singer cap" - desc = "A light white hat that has bands of color. Just makes you want to sing and dance!" - icon_state = "colour" - item_color = "colour" - dog_fashion = /datum/dog_fashion/head/colour - /obj/item/clothing/head/christmashat name = "red santa hat" desc = "A red Christmas Hat! How festive!" @@ -435,3 +428,12 @@ desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food." icon_state = "russobluecamohat" item_state = "russobluecamohat" + dynamic_hair_suffix = "" + +/obj/item/clothing/head/hunter + name = "bounty hunting hat" + desc = "Ain't nobody gonna cheat the hangman in my town." + icon_state = "hunter" + item_state = "hunter" + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 0b58ea234c..5582947732 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -42,7 +42,7 @@ desc = "You put the cake on your head. Brilliant." icon_state = "hardhat0_cakehat" item_state = "hardhat0_cakehat" - item_color = "cakehat" + hat_type = "cakehat" hitsound = 'sound/weapons/tap.ogg' flags_inv = HIDEEARS|HIDEHAIR armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) @@ -114,7 +114,7 @@ desc = "A jack o' lantern! Believed to ward off evil spirits." icon_state = "hardhat0_pumpkin" item_state = "hardhat0_pumpkin" - item_color = "pumpkin" + hat_type = "pumpkin" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) brightness_on = 2 //luminosity when on @@ -151,7 +151,7 @@ desc = "Some fake antlers and a very fake red nose." icon_state = "hardhat0_reindeer" item_state = "hardhat0_reindeer" - item_color = "reindeer" + hat_type = "reindeer" flags_inv = 0 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) brightness_on = 1 //luminosity when on @@ -187,14 +187,15 @@ /obj/item/clothing/head/wig name = "wig" desc = "A bunch of hair without a head attached." - icon_state = "" - item_state = "pwig" + icon = 'icons/mob/human_face.dmi' // default icon for all hairs + icon_state = "hair_vlong" flags_inv = HIDEHAIR + color = "#000" var/hair_style = "Very Long Hair" - var/hair_color = "#000" /obj/item/clothing/head/wig/Initialize(mapload) . = ..() + icon_state = "" //Shitty hack that i dont know if it is even neccesary to deal with the vendor stack exception update_icon() /obj/item/clothing/head/wig/update_icon_state() @@ -202,29 +203,24 @@ if(!S) icon = 'icons/obj/clothing/hats.dmi' icon_state = "pwig" + else + icon = S.icon + icon_state = S.icon_state -/obj/item/clothing/head/wig/update_overlays() +/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() - var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] - if(S) - var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state, color = hair_color) - M.appearance_flags |= RESET_COLOR - . += M - -/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() if(!isinhands) var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] if(!S) return var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state,layer = -HAIR_LAYER) M.appearance_flags |= RESET_COLOR - M.color = hair_color + M.color = color . += M /obj/item/clothing/head/wig/random/Initialize(mapload) hair_style = pick(GLOB.hair_styles_list - "Bald") //Don't want invisible wig - hair_color = "#[random_short_color()]" + color = "#[random_short_color()]" . = ..() /obj/item/clothing/head/bronze diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 19ff6bc8b2..084d39a9b5 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -3,14 +3,14 @@ desc = "It's a baseball hat in a tasteless yellow colour." icon_state = "cargosoft" item_state = "helmet" - item_color = "cargo" + var/soft_type = "cargo" dog_fashion = /datum/dog_fashion/head/cargo_tech var/flipped = 0 /obj/item/clothing/head/soft/dropped(mob/user) - icon_state = "[item_color]soft" + icon_state = "[soft_type]soft" flipped = FALSE return ..() @@ -33,10 +33,10 @@ if(!user.incapacitated()) src.flipped = !src.flipped if(src.flipped) - icon_state = "[item_color]soft_flipped" + icon_state = "[soft_type]soft_flipped" to_chat(user, "You flip the hat backwards.") else - icon_state = "[item_color]soft" + icon_state = "[soft_type]soft" to_chat(user, "You flip the hat back in normal position.") usr.update_inv_head() //so our mob-overlays update @@ -48,77 +48,77 @@ name = "red cap" desc = "It's a baseball hat in a tasteless red colour." icon_state = "redsoft" - item_color = "red" + soft_type = "red" dog_fashion = null /obj/item/clothing/head/soft/blue name = "blue cap" desc = "It's a baseball hat in a tasteless blue colour." icon_state = "bluesoft" - item_color = "blue" + soft_type = "blue" dog_fashion = null /obj/item/clothing/head/soft/green name = "green cap" desc = "It's a baseball hat in a tasteless green colour." icon_state = "greensoft" - item_color = "green" + soft_type = "green" dog_fashion = null /obj/item/clothing/head/soft/yellow name = "yellow cap" desc = "It's a baseball hat in a tasteless yellow colour." icon_state = "yellowsoft" - item_color = "yellow" + soft_type = "yellow" dog_fashion = null /obj/item/clothing/head/soft/grey name = "grey cap" desc = "It's a baseball hat in a tasteful grey colour." icon_state = "greysoft" - item_color = "grey" + soft_type = "grey" dog_fashion = null /obj/item/clothing/head/soft/orange name = "orange cap" desc = "It's a baseball hat in a tasteless orange colour." icon_state = "orangesoft" - item_color = "orange" + soft_type = "orange" dog_fashion = null /obj/item/clothing/head/soft/mime name = "white cap" desc = "It's a baseball hat in a tasteless white colour." icon_state = "mimesoft" - item_color = "mime" + soft_type = "mime" dog_fashion = null /obj/item/clothing/head/soft/purple name = "purple cap" desc = "It's a baseball hat in a tasteless purple colour." icon_state = "purplesoft" - item_color = "purple" + soft_type = "purple" dog_fashion = null /obj/item/clothing/head/soft/black name = "black cap" desc = "It's a baseball hat in a tasteless black colour." icon_state = "blacksoft" - item_color = "black" + soft_type = "black" dog_fashion = null /obj/item/clothing/head/soft/rainbow name = "rainbow cap" desc = "It's a baseball hat in a bright rainbow of colors." icon_state = "rainbowsoft" - item_color = "rainbow" + soft_type = "rainbow" dog_fashion = null /obj/item/clothing/head/soft/sec name = "security cap" desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" - item_color = "sec" + soft_type = "sec" armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50) strip_delay = 60 dog_fashion = null @@ -127,14 +127,14 @@ name = "EMT cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." icon_state = "emtsoft" - item_color = "emt" + soft_type = "emt" dog_fashion = null /obj/item/clothing/head/soft/baseball name = "baseball cap" desc = "It's a robust baseball hat, this one belongs to syndicate major league team." icon_state = "baseballsoft" - item_color = "baseballsoft" + soft_type = "baseball" item_state = "baseballsoft" flags_inv = HIDEEYES|HIDEFACE armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 5019633cf0..7df38661e5 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -28,8 +28,8 @@ /obj/item/clothing/mask/proc/handle_speech() -/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 38f0a7c20a..4c26a0863e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -68,22 +68,31 @@ clothing_flags = ALLOWINTERNALS icon_state = "clown" item_state = "clown_hat" + dye_color = "clown" flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) dog_fashion = /datum/dog_fashion/head/clown + var/list/clownmask_designs = list() + +/obj/item/clothing/mask/gas/clown_hat/Initialize(mapload) + .=..() + clownmask_designs = list( + "True Form" = image(icon = src.icon, icon_state = "clown"), + "The Feminist" = image(icon = src.icon, icon_state = "sexyclown"), + "The Jester" = image(icon = src.icon, icon_state = "chaos"), + "The Madman" = image(icon = src.icon, icon_state = "joker"), + "The Rainbow Color" = image(icon = src.icon, icon_state = "rainbow") + ) /obj/item/clothing/mask/gas/clown_hat/ui_action_click(mob/user) if(!istype(user) || user.incapacitated()) return - var/list/options = list() - options["True Form"] = "clown" - options["The Feminist"] = "sexyclown" - options["The Madman"] = "joker" - options["The Rainbow Color"] ="rainbow" + var/static/list/options = list("True Form" = "clown", "The Feminist" = "sexyclown", "The Madman" = "joker", + "The Rainbow Color" ="rainbow", "The Jester" = "chaos") - var/choice = input(user,"To what form do you wish to Morph this mask?","Morph Mask") in options + var/choice = show_radial_menu(user,src, clownmask_designs, custom_check = FALSE, radius = 36, require_near = TRUE) if(src && choice && !user.incapacitated() && in_range(user,src)) icon_state = options[choice] @@ -92,7 +101,7 @@ var/datum/action/A = X A.UpdateButtonIcon() to_chat(user, "Your Clown Mask has now morphed into [choice], all praise the Honkmother!") - return 1 + return TRUE /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" @@ -112,19 +121,26 @@ flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) + var/list/mimemask_designs = list() + + +/obj/item/clothing/mask/gas/mime/Initialize(mapload) + .=..() + mimemask_designs = list( + "Blanc" = image(icon = src.icon, icon_state = "mime"), + "Excité" = image(icon = src.icon, icon_state = "sexymime"), + "Triste" = image(icon = src.icon, icon_state = "sadmime"), + "Effrayé" = image(icon = src.icon, icon_state = "scaredmime") + ) /obj/item/clothing/mask/gas/mime/ui_action_click(mob/user) if(!istype(user) || user.incapacitated()) return - var/list/options = list() - options["Blanc"] = "mime" - options["Triste"] = "sadmime" - options["Effrayé"] = "scaredmime" - options["Excité"] ="sexymime" + var/static/list/options = list("Blanc" = "mime", "Triste" = "sadmime", "Effrayé" = "scaredmime", "Excité" ="sexymime") - var/choice = input(user,"To what form do you wish to Morph this mask?","Morph Mask") in options + var/choice = show_radial_menu(user,src, mimemask_designs, custom_check = FALSE, radius = 36, require_near = TRUE) if(src && choice && !user.incapacitated() && in_range(user,src)) icon_state = options[choice] @@ -133,7 +149,7 @@ var/datum/action/A = X A.UpdateButtonIcon() to_chat(user, "Your Mime Mask has now morphed into [choice]!") - return 1 + return TRUE /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" @@ -182,22 +198,30 @@ desc = "A creepy wooden mask. Surprisingly expressive for a poorly carved bit of wood." icon_state = "tiki_eyebrow" item_state = "tiki_eyebrow" + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.25) resistance_flags = FLAMMABLE max_integrity = 100 actions_types = list(/datum/action/item_action/adjust) dog_fashion = null + var/list/tikimask_designs = list() +/obj/item/clothing/mask/gas/tiki_mask/Initialize(mapload) + .=..() + tikimask_designs = list( + "Original Tiki" = image(icon = src.icon, icon_state = "tiki_eyebrow"), + "Happy Tiki" = image(icon = src.icon, icon_state = "tiki_happy"), + "Confused Tiki" = image(icon = src.icon, icon_state = "tiki_confused"), + "Angry Tiki" = image(icon = src.icon, icon_state = "tiki_angry") + ) + /obj/item/clothing/mask/gas/tiki_mask/ui_action_click(mob/user) var/mob/M = usr - var/list/options = list() - options["Original Tiki"] = "tiki_eyebrow" - options["Happy Tiki"] = "tiki_happy" - options["Confused Tiki"] = "tiki_confused" - options["Angry Tiki"] ="tiki_angry" + var/static/list/options = list("Original Tiki" = "tiki_eyebrow", "Happy Tiki" = "tiki_happy", "Confused Tiki" = "tiki_confused", + "Angry Tiki" = "tiki_angry") - var/choice = input(M,"To what form do you wish to change this mask?","Morph Mask") in options + var/choice = show_radial_menu(user,src, tikimask_designs, custom_check = FALSE, radius = 36, require_near = TRUE) if(src && choice && !M.stat && in_range(M,src)) icon_state = options[choice] @@ -206,4 +230,17 @@ var/datum/action/A = X A.UpdateButtonIcon() to_chat(M, "The Tiki Mask has now changed into the [choice] Mask!") - return 1 + return TRUE + +/obj/item/clothing/mask/gas/tiki_mask/yalp_elor + icon_state = "tiki_yalp" + item_state = "tiki_yalp" + actions_types = list() + +/obj/item/clothing/mask/gas/hunter + name = "bounty hunting mask" + desc = "A custom tactical mask with decals added." + icon_state = "hunter" + item_state = "hunter" + resistance_flags = FIRE_PROOF | ACID_PROOF + flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 086d47e8bf..a7038f7ec9 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -185,3 +185,9 @@ playsound(src.loc, "sound/voice/complionator/[phrase_sound].ogg", 100, 0, 4) cooldown = world.time cooldown_special = world.time + +/obj/item/clothing/mask/gas/sechailer/swat/spacepol + name = "spacepol mask" + desc = "A close-fitting tactical mask created in cooperation with a certain megacorporation, comes with an especially aggressive Compli-o-nator 3000." + icon_state = "spacepol" + item_state = "spacepol" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index b6579a3cd8..11df38cfdd 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -132,7 +132,6 @@ /obj/item/clothing/mask/cowmask name = "Cow mask with a builtin voice modulator." desc = "A rubber cow mask," - icon = 'icons/mob/mask.dmi' icon_state = "cowmask" item_state = "cowmask" clothing_flags = VOICEBOX_TOGGLABLE @@ -352,30 +351,40 @@ resistance_flags = FLAMMABLE max_integrity = 100 actions_types = list(/datum/action/item_action/adjust) + var/list/papermask_designs = list() +/obj/item/clothing/mask/paper/Initialize(mapload) + .=..() + papermask_designs = list( + "Blank" = image(icon = src.icon, icon_state = "plainmask"), + "Neutral" = image(icon = src.icon, icon_state = "neutralmask"), + "Eyes" = image(icon = src.icon, icon_state = "eyemask"), + "Sleeping" = image(icon = src.icon, icon_state = "sleepingmask"), + "Heart" = image(icon = src.icon, icon_state = "heartmask"), + "Core" = image(icon = src.icon, icon_state = "coremask"), + "Plus" = image(icon = src.icon, icon_state = "plusmask"), + "Square" = image(icon = src.icon, icon_state = "squaremask"), + "Bullseye" = image(icon = src.icon, icon_state = "bullseyemask"), + "Vertical" = image(icon = src.icon, icon_state = "verticalmask"), + "Horizontal" = image(icon = src.icon, icon_state = "horizontalmask"), + "X" = image(icon = src.icon, icon_state = "xmask"), + "Bugeyes" = image(icon = src.icon, icon_state = "bugmask"), + "Double" = image(icon = src.icon, icon_state = "doublemask"), + "Mark" = image(icon = src.icon, icon_state = "markmask") + ) + /obj/item/clothing/mask/paper/ui_action_click(mob/user) if(!istype(user) || user.incapacitated()) return - var/list/options = list() - options["Blank"] = "plainmask" - options["Neutral"] = "neutralmask" - options["Eyes"] = "eyemask" - options["Sleeping"] ="sleepingmask" - options["Heart"] = "heartmask" - options["Core"] = "coremask" - options["Plus"] = "plusmask" - options["Square"] ="squaremask" - options["Bullseye"] = "bullseyemask" - options["Vertical"] = "verticalmask" - options["Horizontal"] = "horizontalmask" - options["X"] ="xmask" - options["Bugeyes"] = "bugmask" - options["Double"] = "doublemask" - options["Mark"] = "markmask" + var/static/list/options = list("Blank" = "plainmask", "Neutral" = "neutralmask", "Eyes" = "eyemask", + "Sleeping" ="sleepingmask", "Heart" = "heartmask", "Core" = "coremask", + "Plus" = "plusmask", "Square" ="squaremask", "Bullseye" = "bullseyemask", + "Vertical" = "verticalmask", "Horizontal" = "horizontalmask", "X" ="xmask", + "Bugeyes" = "bugmask", "Double" = "doublemask", "Mark" = "markmask") - var/choice = input(user,"What symbol would you want on this mask?","Morph Mask") in options + var/choice = show_radial_menu(user,src, papermask_designs, custom_check = FALSE, radius = 36, require_near = TRUE) if(src && choice && !user.incapacitated() && in_range(user,src)) icon_state = options[choice] diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 530af7777d..6a836cad7b 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -6,8 +6,8 @@ strip_delay = 40 equip_delay_other = 40 -/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_flag, style_flags = NONE) - . = list() +/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) @@ -21,35 +21,29 @@ icon = 'icons/obj/clothing/neck.dmi' icon_state = "bluetie" item_state = "" //no inhands - item_color = "bluetie" w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/neck/tie/blue name = "blue tie" icon_state = "bluetie" - item_color = "bluetie" /obj/item/clothing/neck/tie/red name = "red tie" icon_state = "redtie" - item_color = "redtie" /obj/item/clothing/neck/tie/black name = "black tie" icon_state = "blacktie" - item_color = "blacktie" /obj/item/clothing/neck/tie/horrible name = "horrible tie" desc = "A neosilk clip-on tie. This one is disgusting." icon_state = "horribletie" - item_color = "horribletie" /obj/item/clothing/neck/stethoscope name = "stethoscope" desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." icon_state = "stethoscope" - item_color = "stethoscope" /obj/item/clothing/neck/stethoscope/suicide_act(mob/living/carbon/user) user.visible_message("[user] puts \the [src] to [user.p_their()] chest! It looks like [user.p_they()] wont hear much!") @@ -94,7 +88,6 @@ name = "white scarf" icon_state = "scarf" desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks." - item_color = "scarf" dog_fashion = /datum/dog_fashion/head /obj/item/clothing/neck/scarf/black @@ -148,12 +141,10 @@ /obj/item/clothing/neck/scarf/zebra name = "zebra scarf" icon_state = "zebrascarf" - item_color = "zebrascarf" /obj/item/clothing/neck/scarf/christmas name = "christmas scarf" icon_state = "christmasscarf" - item_color = "christmasscarf" //The three following scarves don't have the scarf subtype //This is because Ian can equip anything from that subtype @@ -161,17 +152,14 @@ /obj/item/clothing/neck/stripedredscarf name = "striped red scarf" icon_state = "stripedredscarf" - item_color = "stripedredscarf" /obj/item/clothing/neck/stripedgreenscarf name = "striped green scarf" icon_state = "stripedgreenscarf" - item_color = "stripedgreenscarf" /obj/item/clothing/neck/stripedbluescarf name = "striped blue scarf" icon_state = "stripedbluescarf" - item_color = "stripedbluescarf" /////////// //COLLARS// @@ -181,57 +169,44 @@ name = "pet collar" desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material." icon_state = "petcollar" - item_color = "petcollar" - alternate_worn_icon = 'icons/mob/neck.dmi' //Because, as it appears, the item itself is normally not directly aware of its worn overlays, so this is about the easiest way, without adding a new var. - hasprimary = TRUE - primary_color = "#00BBBB" pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar + var/poly_states = 1 + var/poly_colors = list("#00BBBB") var/tagname = null + var/treat_path = /obj/item/reagent_containers/food/snacks/cookie + +/obj/item/clothing/neck/petcollar/Initialize() + . = ..() + if(treat_path) + new treat_path(src) + +/obj/item/clothing/neck/petcollar/ComponentInitialize() + . = ..() + if(!poly_states) + return + AddElement(/datum/element/polychromic, poly_colors, poly_states) /obj/item/clothing/neck/petcollar/attack_self(mob/user) tagname = stripped_input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot", MAX_NAME_LEN) name = "[initial(name)] - [tagname]" -/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, style_flags = NONE) - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn - /obj/item/clothing/neck/petcollar/leather name = "leather pet collar" icon_state = "leathercollar" - item_color = "leathercollar" - - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#222222" - secondary_color = "#888888" + poly_states = 2 + poly_colors = list("#222222", "#888888") /obj/item/clothing/neck/petcollar/choker desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." name = "choker" icon_state = "choker" - item_color = "choker" - - hasprimary = TRUE - primary_color = "#222222" + poly_colors = list("#222222") /obj/item/clothing/neck/petcollar/locked name = "locked collar" desc = "A collar that has a small lock on it to keep it from being removed." pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked + treat_path = /obj/item/key/collar var/lock = FALSE /obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params) @@ -253,34 +228,19 @@ /obj/item/clothing/neck/petcollar/locked/leather name = "leather pet collar" icon_state = "leathercollar" - item_color = "leathercollar" - - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#222222" - secondary_color = "#888888" + poly_states = 2 + poly_colors = list("#222222", "#888888") /obj/item/clothing/neck/petcollar/locked/choker name = "choker" desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel." icon_state = "choker" - item_color = "choker" - - hasprimary = TRUE - primary_color = "#222222" + poly_colors = list("#222222") /obj/item/key/collar name = "Collar Key" desc = "A key for a tiny lock on a collar or bag." -/obj/item/clothing/neck/petcollar/Initialize() - . = ..() - new /obj/item/reagent_containers/food/snacks/cookie(src) - -/obj/item/clothing/neck/petcollar/locked/Initialize() - . = ..() - new /obj/item/key/collar(src) - ////////////// //DOPE BLING// ////////////// @@ -290,7 +250,40 @@ desc = "Damn, it feels good to be a gangster." icon = 'icons/obj/clothing/neck.dmi' icon_state = "bling" - item_color = "bling" + +/obj/item/clothing/neck/necklace/dope/merchant + desc = "Don't ask how it works, the proof is in the holochips!" + /// scales the amount received in case an admin wants to emulate taxes/fees. + var/profit_scaling = 1 + /// toggles between sell (TRUE) and get price post-fees (FALSE) + var/selling = FALSE + +/obj/item/clothing/neck/necklace/dope/merchant/attack_self(mob/user) + . = ..() + selling = !selling + to_chat(user, "[src] has been set to [selling ? "'Sell'" : "'Get Price'"] mode.") + +/obj/item/clothing/neck/necklace/dope/merchant/afterattack(obj/item/I, mob/user, proximity) + . = ..() + if(!proximity) + return + var/datum/export_report/ex = export_item_and_contents(I, allowed_categories = (ALL), dry_run=TRUE) + var/price = 0 + for(var/x in ex.total_amount) + price += ex.total_value[x] + + if(price) + var/true_price = round(price*profit_scaling) + to_chat(user, "[selling ? "Sold" : "Getting the price of"] [I], value: [true_price] credits[I.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]") + if(selling) + new /obj/item/holochip(get_turf(user),true_price) + for(var/i in ex.exported_atoms_ref) + var/atom/movable/AM = i + if(QDELETED(AM)) + continue + qdel(AM) + else + to_chat(user, "There is no export value for [I] or any items within it.") ////////////////////////////////// //VERY SUPER BADASS NECKERCHIEFS// @@ -304,7 +297,7 @@ obj/item/clothing/neck/neckerchief /obj/item/clothing/neck/neckerchief/worn_overlays(isinhands) . = ..() if(!isinhands) - var/mutable_appearance/realOverlay = mutable_appearance('icons/mob/mask.dmi', icon_state) + var/mutable_appearance/realOverlay = mutable_appearance('icons/mob/clothing/mask.dmi', icon_state) realOverlay.pixel_y = -3 . += realOverlay diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 48cc92db61..7cd2e9b394 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -3,7 +3,7 @@ uniform = /obj/item/clothing/under/rank/centcom/officer shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset/headset_cent/alt /datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) @@ -69,8 +69,8 @@ id = /obj/item/card/id/ert/Security suit = /obj/item/clothing/suit/space/hardsuit/ert/sec glasses = /obj/item/clothing/glasses/hud/security/sunglasses - back = /obj/item/storage/backpack/security belt = /obj/item/storage/belt/security/full + back = /obj/item/storage/backpack/security backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index b1f6e7696d..d692f9c3fb 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -205,7 +205,7 @@ uniform = /obj/item/clothing/under/rank/centcom/commander suit = /obj/item/clothing/suit/armor/bulletproof shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset/headset_cent/commander glasses = /obj/item/clothing/glasses/eyepatch mask = /obj/item/clothing/mask/cigarette/cigar/cohiba @@ -234,7 +234,7 @@ uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/space/officer shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated glasses = /obj/item/clothing/glasses/thermal/eyepatch ears = /obj/item/radio/headset/headset_cent/commander mask = /obj/item/clothing/mask/cigarette/cigar/havana @@ -316,7 +316,7 @@ uniform = /obj/item/clothing/under/costume/soviet head = /obj/item/clothing/head/pirate/captain shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset/headset_cent glasses = /obj/item/clothing/glasses/thermal/eyepatch suit = /obj/item/clothing/suit/pirate/captain @@ -372,7 +372,7 @@ uniform = /obj/item/clothing/under/color/green suit = /obj/item/clothing/suit/space/hardsuit/deathsquad shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated mask = /obj/item/clothing/mask/gas/sechailer/swat glasses = /obj/item/clothing/glasses/hud/toggle/thermal back = /obj/item/storage/backpack/security @@ -431,7 +431,7 @@ glasses = /obj/item/clothing/glasses/debug ears = /obj/item/radio/headset/headset_cent/commander mask = /obj/item/clothing/mask/gas/welding/up - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated belt = /obj/item/storage/belt/utility/chief/full l_pocket = /obj/item/gun/magic/wand/resurrection/debug r_pocket = /obj/item/gun/magic/wand/death/debug diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index ee350e3891..ff4ef28649 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -3,27 +3,34 @@ uniform = /obj/item/clothing/under/color/random shoes = /obj/item/clothing/shoes/sneakers/black ears = /obj/item/radio/headset - id = /obj/item/card/id + id = /obj/item/card/id/locked_banking + var/starting_funds = 350 /datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) H.dna.species.before_equip_job(null, H) /datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/obj/item/card/id/id = H.wear_id - if (istype(id)) - id.access |= get_all_accesses() + if(!istype(id)) + return + id.access |= get_all_accesses() + if(id.registered_account) + id.registered_account.account_holder = "[H.real_name] (VR)" + if(starting_funds && id.bank_support == ID_LOCKED_BANK_ACCOUNT) //No payroll or ability to virtually transfer funds to an external account. + id.registered_account.adjust_money(starting_funds) /datum/outfit/vr/syndicate name = "Syndicate VR Operative - Basic" uniform = /obj/item/clothing/under/syndicate shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated back = /obj/item/storage/backpack - id = /obj/item/card/id/syndicate + id = /obj/item/card/id/syndicate/locked_banking belt = /obj/item/gun/ballistic/automatic/pistol l_pocket = /obj/item/paper/fluff/vr/fluke_ops backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/kitchen/knife/combat/survival) + starting_funds = 0 //Should be operating, not shopping. /datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) . = ..() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 4c6d3a8f88..802dd7265e 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -49,8 +49,8 @@ last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works last_blood_DNA = blood_dna[blood_dna.len] -/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(!isinhands) var/bloody = FALSE if(blood_DNA) @@ -61,7 +61,7 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) - var/file2use = style_flags & STYLE_DIGITIGRADE ? 'icons/mob/feet_digi.dmi' : 'icons/effects/blood.dmi' + var/file2use = style_flags & STYLE_DIGITIGRADE ? 'icons/mob/clothing/feet_digi.dmi' : 'icons/effects/blood.dmi' . += mutable_appearance(file2use, "shoeblood", color = blood_DNA_to_color()) /obj/item/clothing/shoes/equipped(mob/user, slot) diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index c45b9b443a..df0f03f614 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -1,9 +1,9 @@ /obj/item/clothing/shoes/sneakers + dying_key = DYE_REGISTRY_SNEAKERS /obj/item/clothing/shoes/sneakers/black name = "black shoes" icon_state = "black" - item_color = "black" desc = "A pair of black shoes." cold_protection = FEET @@ -11,80 +11,49 @@ heat_protection = FEET max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT -/obj/item/clothing/shoes/sneakers/black/redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way. - /obj/item/clothing/shoes/sneakers/brown name = "brown shoes" desc = "A pair of brown shoes." icon_state = "brown" - item_color = "brown" - -/obj/item/clothing/shoes/sneakers/brown/captain - item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way. - -/obj/item/clothing/shoes/sneakers/brown/hop - item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way. - -/obj/item/clothing/shoes/sneakers/brown/ce - item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way. - -/obj/item/clothing/shoes/sneakers/brown/rd - item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way. - -/obj/item/clothing/shoes/sneakers/brown/cmo - item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way. - -/obj/item/clothing/shoes/sneakers/brown/qm - item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way. /obj/item/clothing/shoes/sneakers/blue name = "blue shoes" icon_state = "blue" - item_color = "blue" /obj/item/clothing/shoes/sneakers/green name = "green shoes" icon_state = "green" - item_color = "green" /obj/item/clothing/shoes/sneakers/yellow name = "yellow shoes" icon_state = "yellow" - item_color = "yellow" /obj/item/clothing/shoes/sneakers/purple name = "purple shoes" icon_state = "purple" - item_color = "purple" /obj/item/clothing/shoes/sneakers/brown name = "brown shoes" icon_state = "brown" - item_color = "brown" /obj/item/clothing/shoes/sneakers/red name = "red shoes" desc = "Stylish red shoes." icon_state = "red" - item_color = "red" /obj/item/clothing/shoes/sneakers/white name = "white shoes" icon_state = "white" permeability_coefficient = 0.01 - item_color = "white" /obj/item/clothing/shoes/sneakers/rainbow name = "rainbow shoes" desc = "Very gay shoes." icon_state = "rain_bow" - item_color = "rainbow" /obj/item/clothing/shoes/sneakers/orange name = "orange shoes" icon_state = "orange" - item_color = "orange" /obj/item/clothing/shoes/sneakers/orange/attack_self(mob/user) if (src.chained) @@ -120,5 +89,4 @@ to_chat(c, "You need help taking these off!") return return ..() - - \ No newline at end of file + diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index b854ad8f9b..773b1ac361 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -31,6 +31,7 @@ icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") if(user) + user.update_equipment_speed_mods() user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.has_gravity()) for(var/X in actions) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 32d9dd4483..b68bef6329 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -4,7 +4,6 @@ /obj/item/clothing/shoes/sneakers/mime name = "mime shoes" icon_state = "mime" - item_color = "mime" /obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses name = "combat boots" @@ -46,6 +45,7 @@ desc = "A pair of rather plain wooden sandals." name = "sandals" icon_state = "wizard" + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.5) strip_delay = 50 equip_delay_other = 50 permeability_coefficient = 0.9 @@ -72,6 +72,7 @@ equip_delay_other = 50 resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 75) + custom_price = PRICE_ABOVE_EXPENSIVE /obj/item/clothing/shoes/galoshes/dry name = "absorbent galoshes" @@ -124,7 +125,6 @@ icon_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - item_color = "hosred" strip_delay = 50 equip_delay_other = 50 resistance_flags = NONE @@ -145,6 +145,13 @@ max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes +/obj/item/clothing/shoes/winterboots/ice_boots + name = "ice hiking boots" + desc = "A pair of winter boots with special grips on the bottom, designed to prevent slipping on frozen surfaces." + icon_state = "iceboots" + item_state = "iceboots" + clothing_flags = NOSLIP_ICE + /obj/item/clothing/shoes/winterboots/christmasbootsr name = "red christmas boots" desc = "A pair of fluffy red christmas boots!" @@ -175,13 +182,16 @@ name = "mining boots" desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed." icon_state = "explorer" + cold_protection = FEET|LEGS + min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT + heat_protection = FEET|LEGS + max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF /obj/item/clothing/shoes/cult name = "\improper Nar'Sien invoker boots" desc = "A pair of boots worn by the followers of Nar'Sie." icon_state = "cult" - item_color = "cult" cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET @@ -227,7 +237,6 @@ name = "jump boots" desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." icon_state = "jetboots" - item_color = "hosred" resistance_flags = FIRE_PROOF pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes actions_types = list(/datum/action/item_action/bhop) @@ -381,3 +390,99 @@ name = "black cowboy boots" desc = "A pair of black cowboy boots, pretty easy to scuff up." icon_state = "cowboyboots_black" + +/obj/item/clothing/shoes/wallwalkers + name = "wall walking boots" + desc = "Contrary to popular belief, these do not allow you to walk on walls. Through bluespace magic stolen from an organisation that hoards technology, they simply allow you to slip through the atoms that make up anything, but only while walking, for safety reasons. As well as this, they unfortunately cause minor breath loss as the majority of atoms in your lungs are sucked out into any solid object you walk through. Make sure not to overuse them." + icon_state = "walkboots" + var/walkcool = 0 + var/wallcharges = 4 + var/newlocobject = null + +/obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) + . = ..() + if(slot == SLOT_SHOES) + RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) + +/obj/item/clothing/shoes/wallwalkers/dropped(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVE) + +/obj/item/clothing/shoes/wallwalkers/attackby(obj/item/W, mob/user, params) + . = ..() + if(!istype(W, /obj/item/bluespacerecharge)) + return + var/obj/item/bluespacerecharge/ER = W + if(ER.uses) + wallcharges += ER.uses + to_chat(user, "You charged the bluespace crystal in the [src]. It now has [wallcharges] charges left.") + ER.uses = 0 + ER.icon_state = "[initial(ER.icon_state)]0" + else + to_chat(user, "[ER] has no crystal on it.") + +/obj/item/clothing/shoes/wallwalkers/examine(mob/user) + . = ..() + . += "It has [wallcharges] charges left." + +/obj/item/clothing/shoes/wallwalkers/proc/intercept_user_move(mob/living/m, client/client, dir, newloc, oldloc) + if (walkcool >= world.time || m.m_intent != MOVE_INTENT_WALK || wallcharges <= 0) + return + walkcool = world.time + m.movement_delay() + var/issolid = FALSE + var/turf/K = newloc + if (istype(K)) + if (K.density) + issolid = TRUE + if (!issolid) + for (var/atom/T in newloc) //stuff on the new turf + if (!T.CanPass(m,newloc) && T != m) + issolid = TRUE + newlocobject = T + break + if (!issolid) + for (var/atom/T in oldloc) //directional shit on the old turf + if (!T.CanPass(m,newloc) && T != m && T != newlocobject) + issolid = TRUE + break + newlocobject = null //stopping structures from using two charges because of how shitty the canpass code is + m.forceMove(newloc) + if (!issolid) + return + m.adjustOxyLoss(rand(5,13)) + if (prob(15)) + m.adjustBruteLoss(rand(4,7)) + to_chat(m,"You feel as if travelling through the solid object left something behind and it hurts!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, oldloc) + s.start() + flash_lighting_fx(3, 3, LIGHT_COLOR_ORANGE) + wallcharges-- + +/obj/item/bluespacerecharge + name = "bluespace crystal recharging device" + desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for replacing the crystals in bluespace devices." + icon = 'icons/obj/module.dmi' + icon_state = "bluespace_charge" + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_TINY + var/uses = 6 + +/obj/item/bluespacerecharge/examine(mob/user) + . = ..() + if(uses) + . += "It can add up to [uses] charges to compatible devices." + else + . += "The crystal is gone." + +/obj/item/bluespacerecharge/attackby(obj/item/I, mob/user, params) + ..() + if(!istype(I, /obj/item/stack/ore/bluespace_crystal) || uses) + return + var/obj/item/stack/ore/bluespace_crystal/B = I + if (B.amount < 10) + return + uses += 3 + to_chat(user, "You insert [I] into [src].") + B.use(10) + icon_state = initial(icon_state) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 4311aa5166..4590d46219 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -84,7 +84,7 @@ user.alpha = 255 user.update_atom_colour() user.animate_movement = FORWARD_STEPS - user.notransform = 0 + user.mob_transforming = 0 user.anchored = FALSE teleporting = 0 for(var/obj/item/I in user.held_items) @@ -125,7 +125,7 @@ ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT) user.animate_movement = NO_STEPS user.changeNext_move(8 + phase_in_ds) - user.notransform = 1 + user.mob_transforming = 1 user.anchored = TRUE user.Stun(INFINITY) @@ -321,7 +321,7 @@ check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE var/obj/item/clothing/suit/space/chronos/chronosuit = null -/datum/action/innate/chrono_teleport/IsAvailable() +/datum/action/innate/chrono_teleport/IsAvailable(silent = FALSE) return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting) /datum/action/innate/chrono_teleport/Activate() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 1f23569a9c..695d25dbf4 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -10,7 +10,7 @@ var/brightness_on = 4 //luminosity when on var/on = FALSE var/obj/item/clothing/suit/space/hardsuit/suit - item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite) + var/hardsuit_type = "engineering" //Determines used sprites: hardsuit[on]-[type] actions_types = list(/datum/action/item_action/toggle_helmet_light) var/rad_count = 0 @@ -30,20 +30,18 @@ /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) on = !on - icon_state = "[basestate][on]-[item_color]" - user.update_inv_head() //so our mob-overlays update - + update_icon() //the mob overlay update is already done by the update_icon_updates_onmob element. if(on) set_light(brightness_on) else set_light(0) - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/hardsuit/update_icon_state() + icon_state = "[basestate][on]-[hardsuit_type]" /obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user) ..() - if(suit) + if(suit && !ismob(loc)) //equipped() will handle mob cases, so it doesn't disengage twice. suit.RemoveHelmet() soundloop.stop(user) @@ -103,6 +101,7 @@ actions_types = list(/datum/action/item_action/toggle_helmet) var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit var/obj/item/tank/jetpack/suit/jetpack = null + var/hardsuit_type /obj/item/clothing/suit/space/hardsuit/Initialize() @@ -169,7 +168,7 @@ icon_state = "hardsuit0-engineering" item_state = "eng_helm" armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) - item_color = "engineering" + hardsuit_type = "engineering" resistance_flags = FIRE_PROOF /obj/item/clothing/suit/space/hardsuit/engine @@ -188,7 +187,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding." icon_state = "hardsuit0-atmospherics" item_state = "atmo_helm" - item_color = "atmospherics" + hardsuit_type = "atmospherics" armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -209,7 +208,7 @@ desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish." icon_state = "hardsuit0-white" item_state = "ce_helm" - item_color = "white" + hardsuit_type = "white" armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -231,7 +230,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating for wildlife encounters and dual floodlights." icon_state = "hardsuit0-mining" item_state = "mining_helm" - item_color = "mining" + hardsuit_type = "mining" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF heat_protection = HEAD @@ -267,7 +266,7 @@ alt_desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit1-syndi" item_state = "syndie_helm" - item_color = "syndi" + hardsuit_type = "syndi" armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) on = FALSE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null @@ -276,7 +275,7 @@ visor_flags = STOPSPRESSUREDAMAGE /obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon_state() - icon_state = "hardsuit[on]-[item_color]" + icon_state = "hardsuit[on]-[hardsuit_type]" /obj/item/clothing/head/helmet/space/hardsuit/syndi/Initialize() . = ..() @@ -332,7 +331,7 @@ linkedsuit.clothing_flags &= ~STOPSPRESSUREDAMAGE linkedsuit.cold_protection &= ~(CHEST | GROIN | LEGS | FEET | ARMS | HANDS) - linkedsuit.icon_state = "hardsuit[on]-[item_color]" + linkedsuit.icon_state = "hardsuit[on]-[hardsuit_type]" linkedsuit.update_icon() user.update_inv_wear_suit() user.update_inv_w_uniform() @@ -344,7 +343,7 @@ alt_desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" - item_color = "syndi" + hardsuit_type = "syndi" w_class = WEIGHT_CLASS_NORMAL armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) @@ -358,7 +357,7 @@ desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in EVA mode. Property of Gorlex Marauders." alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" - item_color = "syndielite" + hardsuit_type = "syndielite" armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -375,7 +374,7 @@ desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode." alt_desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in combat mode." icon_state = "hardsuit0-syndielite" - item_color = "syndielite" + hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -394,7 +393,7 @@ alt_desc = "A dual-mode advanced helmet designed for any crime-fighting situation. It is in combat mode." icon_state = "hardsuit1-owl" item_state = "s_helmet" - item_color = "owl" + hardsuit_type = "owl" visor_flags_inv = 0 visor_flags = 0 on = FALSE @@ -405,18 +404,17 @@ alt_desc = "A dual-mode advanced hardsuit designed for any crime-fighting situation. It is in combat mode." icon_state = "hardsuit1-owl" item_state = "s_suit" - item_color = "owl" + hardsuit_type = "owl" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl mutantrace_variation = STYLE_DIGITIGRADE - //Wizard hardsuit /obj/item/clothing/head/helmet/space/hardsuit/wizard name = "gem-encrusted hardsuit helmet" desc = "A bizarre gem-encrusted helmet that radiates magical energies." icon_state = "hardsuit0-wiz" item_state = "wiz_helm" - item_color = "wiz" + hardsuit_type = "wiz" resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) heat_protection = HEAD //Uncomment to enable firesuit protection @@ -451,7 +449,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light." icon_state = "hardsuit0-medical" item_state = "medical_helm" - item_color = "medical" + hardsuit_type = "medical" flash_protect = 0 armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR @@ -474,6 +472,7 @@ name = "medical hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Built with lightweight materials for easier movement." item_state = "medical_hardsuit" + slowdown = 0.8 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical) armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical @@ -484,7 +483,7 @@ name = "prototype hardsuit helmet" desc = "A prototype helmet designed for research in a hazardous, low pressure environment. Scientific data flashes across the visor." icon_state = "hardsuit0-rd" - item_color = "rd" + hardsuit_type = "rd" resistance_flags = ACID_PROOF | FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) @@ -526,7 +525,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "hardsuit0-sec" item_state = "sec_helm" - item_color = "sec" + hardsuit_type = "sec" armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) /obj/item/clothing/suit/space/hardsuit/security @@ -547,7 +546,7 @@ name = "head of security's hardsuit helmet" desc = "A special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "hardsuit0-hos" - item_color = "hos" + hardsuit_type = "hos" armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) /obj/item/clothing/suit/space/hardsuit/security/hos @@ -596,7 +595,7 @@ icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30) - item_color = "clown" + hardsuit_type = "clown" /obj/item/clothing/suit/space/hardsuit/clown name = "cosmohonk hardsuit" @@ -622,7 +621,7 @@ icon_state = "hardsuit0-ancient" item_state = "anc_helm" armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) - item_color = "ancient" + hardsuit_type = "ancient" resistance_flags = FIRE_PROOF /obj/item/clothing/suit/space/hardsuit/ancient @@ -640,7 +639,7 @@ /obj/item/clothing/suit/space/hardsuit/ancient/mason name = "M.A.S.O.N RIG" - desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit." + desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storage bags on to the suit." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) @@ -650,7 +649,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | IMMUTABLE_SLOW resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags_1 = TESLA_IGNORE_1 /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason name = "M.A.S.O.N RIG helmet" @@ -658,7 +656,7 @@ icon_state = "hardsuit0-ancient" item_state = "anc_helm" armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) - item_color = "ancient" + hardsuit_type = "ancient" brightness_on = 16 flash_protect = 5 //We will not be flash by bombs tint = 1 @@ -666,7 +664,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - flags_1 = TESLA_IGNORE_1 /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize() . = ..() @@ -677,12 +674,14 @@ if (slot == SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) + ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "mason_hardsuit") /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/dropped(mob/living/carbon/human/user) ..() - if (user.head == src) + if (HAS_TRAIT_FROM(user, TRAIT_TESLA_SHOCKIMMUNE, "mason_hardsuit")) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.remove_hud_from(user) + REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "mason_hardsuit") /obj/item/clothing/suit/space/hardsuit/ancient/proc/on_mob_move() var/mob/living/carbon/human/H = loc @@ -720,7 +719,7 @@ name = "soviet hardhelmet" desc = "Crafted with the pride of the proletariat. The vengeful gaze of the visor roots out all fascists and capitalists." item_state = "rig0-soviet" - item_color = "soviet" + hardsuit_type = "soviet" icon_state = "rig0-soviet" armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75) mutantrace_variation = NONE @@ -749,57 +748,20 @@ allowed = null armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) resistance_flags = FIRE_PROOF | ACID_PROOF - var/current_charges = 3 var/max_charges = 3 //How many charges total the shielding has + var/current_charges //if null, will default to max_chargs var/recharge_delay = 200 //How long after we've been shot before we can start recharging. 20 seconds here - var/recharge_cooldown = 0 //Time since we've last been shot var/recharge_rate = 1 //How quickly the shield recharges once it starts charging var/shield_state = "shield-old" - var/shield_on = "shield-old" /obj/item/clothing/suit/space/hardsuit/shielded/Initialize() . = ..() if(!allowed) allowed = GLOB.advanced_hardsuit_allowed -/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - recharge_cooldown = world.time + recharge_delay - if(current_charges > 0) - var/datum/effect_system/spark_spread/s = new - s.set_up(2, 1, src) - s.start() - owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") - current_charges-- - if(recharge_rate) - START_PROCESSING(SSobj, src) - if(current_charges <= 0) - owner.visible_message("[owner]'s shield overloads!") - shield_state = "broken" - owner.update_inv_wear_suit() - return 1 - return 0 - -/obj/item/clothing/suit/space/hardsuit/shielded/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/clothing/suit/space/hardsuit/shielded/process() - if(world.time > recharge_cooldown && current_charges < max_charges) - current_charges = CLAMP((current_charges + recharge_rate), 0, max_charges) - playsound(loc, 'sound/magic/charge.ogg', 50, 1) - if(current_charges == max_charges) - playsound(loc, 'sound/machines/ding.ogg', 50, 1) - STOP_PROCESSING(SSobj, src) - shield_state = "[shield_on]" - if(ishuman(loc)) - var/mob/living/carbon/human/C = loc - C.update_inv_wear_suit() - -/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/suit/space/hardsuit/shielded/ComponentInitialize() . = ..() - if(!isinhands) - var/file2use = style_flags & STYLE_ALL_TAURIC ? 'modular_citadel/icons/mob/64x32_effects.dmi' : 'icons/effects/effects.dmi' - . += mutable_appearance(file2use, shield_state, MOB_LAYER + 0.01) + AddComponent(/datum/component/shielded, current_charges, max_charges, recharge_delay, recharge_rate, ITEM_SLOT_OCLOTHING, shield_state) /obj/item/clothing/head/helmet/space/hardsuit/shielded resistance_flags = FIRE_PROOF | ACID_PROOF @@ -811,7 +773,7 @@ desc = "Standard issue hardsuit for playing capture the flag." icon_state = "ert_medical" item_state = "ert_medical" - item_color = "ert_medical" + hardsuit_type = "ert_medical" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95) slowdown = 0 @@ -825,10 +787,9 @@ name = "red shielded hardsuit" icon_state = "ert_security" item_state = "ert_security" - item_color = "ert_security" + hardsuit_type = "ert_security" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red shield_state = "shield-red" - shield_on = "shield-red" /obj/item/clothing/suit/space/hardsuit/shielded/ctf/blue name = "blue shielded hardsuit" @@ -842,20 +803,20 @@ desc = "Standard issue hardsuit helmet for playing capture the flag." icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" - item_color = "ert_medical" + hardsuit_type = "ert_medical" armor = list("melee" = 0, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 95) /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red icon_state = "hardsuit0-ert_security" item_state = "hardsuit0-ert_security" - item_color = "ert_security" + hardsuit_type = "ert_security" /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/blue name = "shielded hardsuit helmet" desc = "Standard issue hardsuit helmet for playing capture the flag." icon_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander" - item_color = "ert_commander" + hardsuit_type = "ert_commander" //////Syndicate Version @@ -864,7 +825,7 @@ desc = "An advanced hardsuit with built in energy shielding." icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" - item_color = "syndi" + hardsuit_type = "syndi" armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi @@ -880,7 +841,7 @@ desc = "An advanced hardsuit helmet with built in energy shielding." icon_state = "hardsuit1-syndi" item_state = "syndie_helm" - item_color = "syndi" + hardsuit_type = "syndi" armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) ///SWAT version @@ -889,9 +850,8 @@ desc = "An advanced hardsuit favored by commandos for use in special operations." icon_state = "deathsquad" item_state = "swat_suit" - item_color = "syndi" + hardsuit_type = "syndi" max_charges = 4 - current_charges = 4 recharge_delay = 15 armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) strip_delay = 130 @@ -904,7 +864,7 @@ desc = "A tactical helmet with built in energy shielding." icon_state = "deathsquad" item_state = "deathsquad" - item_color = "syndi" + hardsuit_type = "syndi" armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -919,7 +879,7 @@ desc = "A helmet designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips." icon_state = "knight_cydonia" item_state = "knight_yellow" - item_color = null + hardsuit_type = null max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF heat_protection = HEAD @@ -952,11 +912,11 @@ . = ..() . += mutable_appearance(icon, "knight_cydonia_overlay", color = energy_color) -/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) - var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) - energy_overlay.plane = ABOVE_LIGHTING_LAYER + var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", EMISSIVE_LAYER) + energy_overlay.plane = EMISSIVE_PLANE energy_overlay.color = energy_color . += energy_overlay @@ -983,11 +943,11 @@ . = ..() . += mutable_appearance(icon, "knight_cydonia_overlay", color = energy_color) -/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) - var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER) - energy_overlay.plane = ABOVE_LIGHTING_LAYER + var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", EMISSIVE_LAYER) + energy_overlay.plane = EMISSIVE_PLANE energy_overlay.color = energy_color . += energy_overlay diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 8c39427c49..7df91352ca 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -174,7 +174,7 @@ Contains: desc = "Standard issue command helmet for the ERT." icon_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander" - item_color = "ert_commander" + hardsuit_type = "ert_commander" armor = list("melee" = 65, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80) strip_delay = 130 brightness_on = 7 @@ -201,7 +201,7 @@ Contains: desc = "Standard issue security helmet for the ERT." icon_state = "hardsuit0-ert_security" item_state = "hardsuit0-ert_security" - item_color = "ert_security" + hardsuit_type = "ert_security" /obj/item/clothing/suit/space/hardsuit/ert/sec desc = "Standard issue security suit for the ERT." @@ -214,7 +214,7 @@ Contains: desc = "Standard issue engineer helmet for the ERT." icon_state = "hardsuit0-ert_engineer" item_state = "hardsuit0-ert_engineer" - item_color = "ert_engineer" + hardsuit_type = "ert_engineer" /obj/item/clothing/suit/space/hardsuit/ert/engi desc = "Standard issue engineer suit for the ERT." @@ -227,7 +227,7 @@ Contains: desc = "Standard issue medical helmet for the ERT." icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" - item_color = "ert_medical" + hardsuit_type = "ert_medical" /obj/item/clothing/suit/space/hardsuit/ert/med desc = "Standard issue medical suit for the ERT." @@ -243,7 +243,7 @@ Contains: desc = "Red alert command helmet for the ERT. This one is more armored than its standard version." icon_state = "hardsuit0-ert_commander-alert" item_state = "hardsuit0-ert_commander-alert" - item_color = "ert_commander-alert" + hardsuit_type = "ert_commander-alert" armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) brightness_on = 8 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -263,7 +263,7 @@ Contains: desc = "Red alert security helmet for the ERT. This one is more armored than its standard version." icon_state = "hardsuit0-ert_security-alert" item_state = "hardsuit0-ert_security-alert" - item_color = "ert_security-alert" + hardsuit_type = "ert_security-alert" /obj/item/clothing/suit/space/hardsuit/ert/alert/sec desc = "Red alert security suit for the ERT. This one is more armored than its standard version." @@ -276,7 +276,7 @@ Contains: desc = "Red alert engineer helmet for the ERT. This one is more armored than its standard version." icon_state = "hardsuit0-ert_engineer-alert" item_state = "hardsuit0-ert_engineer-alert" - item_color = "ert_engineer-alert" + hardsuit_type = "ert_engineer-alert" /obj/item/clothing/suit/space/hardsuit/ert/alert/engi desc = "Red alert engineer suit for the ERT. This one is more armored than its standard version." @@ -289,7 +289,7 @@ Contains: desc = "Red alert medical helmet for the ERT. This one is more armored than its standard version." icon_state = "hardsuit0-ert_medical-alert" item_state = "hardsuit0-ert_medical-alert" - item_color = "ert_medical-alert" + hardsuit_type = "ert_medical-alert" /obj/item/clothing/suit/space/hardsuit/ert/alert/med desc = "Red alert medical suit for the ERT. This one is more armored than its standard version." @@ -320,7 +320,6 @@ Contains: icon_state = "cespace_helmet" item_state = "nothing" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) - item_color = "engineering" resistance_flags = FIRE_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE actions_types = list() @@ -391,15 +390,23 @@ Contains: desc = "A helmet worn by those who deal with paranormal threats for a living." icon_state = "hardsuit0-prt" item_state = "hardsuit0-prt" - item_color = "knight_grey" + hardsuit_type = "knight_grey" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() resistance_flags = FIRE_PROOF mutantrace_variation = NONE + var/charges = INFINITY -/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD) + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, charges, TRUE, null, CALLBACK(src, .proc/anti_magic_gone)) + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/proc/anti_magic_gone() + var/mob/M = loc + if(!istype(M)) + return + do_sparks(2, TRUE, M) + M.show_message("\The [src] sparks and fizzles as its psychic wards wane away at last...", MSG_VISUAL) /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team suit" @@ -409,10 +416,18 @@ Contains: helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF + var/charges = INFINITY /obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_OCLOTHING) + AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_OCLOTHING, charges, TRUE, null, CALLBACK(src, .proc/anti_magic_gone)) + +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/proc/anti_magic_gone() + var/mob/M = loc + if(!istype(M)) + return + do_sparks(2, TRUE, M) + M.show_message("\The [src] sparks and fizzles as its anti magic wards wane away at last...", MSG_VISUAL) /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor name = "inquisitor's hardsuit" @@ -425,6 +440,18 @@ Contains: icon_state = "hardsuit0-inq" item_state = "hardsuit0-inq" +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old + desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats. Alas, this one looks pretty worn out and rusted." + armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60) + slowdown = 0.8 + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old + charges = 12 + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/old + desc = "A helmet worn by those who deal with paranormal threats for a living. Alas, this one looks pretty worn out and rusted." + armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60) + charges = 12 + /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker name = "champion's hardsuit" desc = "Voices echo from the hardsuit, driving the user insane." @@ -438,6 +465,18 @@ Contains: icon_state = "hardsuit0-beserker" item_state = "hardsuit0-beserker" +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old + desc = "Voices echo from the hardsuit, driving the user insane. This one is pretty battle-worn, but still fearsome." + armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60) + slowdown = 0.8 + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old + charges = 6 + +/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/old + desc = "Peering into the eyes of the helmet is enough to seal damnation. This one is pretty battle-worn, but still fearsome." + armor = list("melee" = 55, "bullet" = 40, "laser" = 40, "energy" = 40, "bomb" = 40, "bio" = 80, "rad" = 80, "fire" = 60, "acid" = 60) + charges = 6 + /obj/item/clothing/head/helmet/space/fragile name = "emergency space helmet" desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable." @@ -456,7 +495,8 @@ Contains: armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 0, "acid" = 0) strip_delay = 65 -/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/space/fragile/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + . = ..() if(!torn && prob(50) && damage >= 5) to_chat(owner, "[src] tears from the damage, breaking the air-tight seal!") clothing_flags &= ~STOPSPRESSUREDAMAGE @@ -477,4 +517,15 @@ Contains: name = "paramedic EVA helmet" desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel." icon_state = "paramedic-eva-helmet" - item_state = "paramedic-eva-helmet" \ No newline at end of file + item_state = "paramedic-eva-helmet" + +/obj/item/clothing/suit/space/hunter + name = "bounty hunting suit" + desc = "A custom version of the MK.II SWAT suit, modified to look rugged and tough. Works as a space suit, if you can find a helmet." + icon_state = "hunter" + item_state = "swat_suit" + allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) + armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + strip_delay = 130 + resistance_flags = FIRE_PROOF | ACID_PROOF + diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index fee8dbce33..f17eb91b74 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -67,7 +67,7 @@ var/datum/action/A=X A.UpdateButtonIcon() -/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands && on) . += mutable_appearance(icon_file, light_overlay) diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 1b2080feb1..8de49c63de 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -1,6 +1,7 @@ /obj/item/clothing/suit icon = 'icons/obj/clothing/suits.dmi' name = "suit" + block_priority = BLOCK_PRIORITY_WEAR_SUIT var/fire_resist = T0C+100 allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) @@ -11,7 +12,7 @@ var/suittoggled = FALSE mutantrace_variation = STYLE_DIGITIGRADE -/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) +/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) if(damaged_clothes) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 7384fbde21..557b4860c9 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -21,6 +21,7 @@ icon_state = "officerbluejacket" item_state = "officerbluejacket" body_parts_covered = CHEST|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/vest name = "armor vest" @@ -29,6 +30,7 @@ item_state = "armoralt" blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/vest/alt desc = "A Type I armored vest that provides decent protection against most types of damage." @@ -47,6 +49,7 @@ desc = "A large, yet comfortable piece of armor, protecting you from some threats." icon_state = "blueshift" item_state = "blueshift" + custom_premium_price = PRICE_ABOVE_EXPENSIVE /obj/item/clothing/suit/armor/hos name = "armored greatcoat" @@ -58,6 +61,7 @@ cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/hos/navyblue name = "head of security's jacket" @@ -88,6 +92,7 @@ strip_delay = 70 resistance_flags = FLAMMABLE dog_fashion = null + mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's armored jacket" @@ -100,6 +105,7 @@ icon_state = "wardenbluejacket" item_state = "wardenbluejacket" body_parts_covered = CHEST|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/vest/leather name = "security overcoat" @@ -125,6 +131,7 @@ name = "syndicate captain's vest" desc = "A sinister looking vest of advanced armor worn over a black and red fireproof jacket. The gold collar and shoulders denote that this belongs to a high ranking syndicate officer." icon_state = "syndievest" + mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/armor/vest/capcarapace/alt name = "captain's parade jacket" @@ -163,6 +170,7 @@ armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) strip_delay = 70 equip_delay_other = 50 + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/laserproof name = "reflector vest" @@ -172,13 +180,15 @@ blood_overlay_type = "armor" armor = list("melee" = 10, "bullet" = 10, "laser" = 60, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON var/hit_reflect_chance = 40 + var/list/protected_zones = list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN) -/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone) - if(!(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN))) //If not shot where ablative is covering you, you don't get the reflection bonus! - return 0 - if (prob(hit_reflect_chance)) - return 1 +/obj/item/clothing/suit/armor/laserproof/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(def_zone in protected_zones) + if(prob(hit_reflect_chance)) + return BLOCK_SHOULD_REDIRECT | BLOCK_REDIRECTED | BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return ..() /obj/item/clothing/suit/armor/vest/det_suit name = "detective's armor vest" @@ -276,7 +286,7 @@ icon_state = "knight_greyscale" item_state = "knight_greyscale" armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Can change color and add prefix /obj/item/clothing/suit/armor/vest/durathread name = "makeshift vest" @@ -295,6 +305,7 @@ icon_state = "rus_armor" item_state = "rus_armor" armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50) + /obj/item/clothing/suit/armor/vest/russian_coat name = "russian battle coat" desc = "Used in extremly cold fronts, made out of real bears." diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 7d56fbe6dd..0a3923b28c 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -76,7 +76,7 @@ icon_state = "dragon" desc = "A suit of armour fashioned from the remains of an ash drake." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear) - armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 70, "bullet" = 20, "laser" = 35, "energy" = 25, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -87,7 +87,18 @@ name = "drake helm" icon_state = "dragon" desc = "The skull of a dragon." - armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 70, "bullet" = 20, "laser" = 35, "energy" = 25, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE + +/obj/item/clothing/neck/cloak/polychromic + name = "polychromic cloak" + desc = "For when you want to show off your horrible colour coordination skills." + icon_state = "polyce" + item_state = "qmcloak" + var/list/poly_colors = list("#FFFFFF", "#FFFFFF", "#808080") + +/obj/item/clothing/neck/cloak/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 3) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index efadb8a035..fa55dcf1c1 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -12,6 +12,7 @@ body_parts_covered = CHEST|GROIN allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants) + //Captain /obj/item/clothing/suit/captunic name = "captain's parade tunic" @@ -35,6 +36,7 @@ item_state = "nun" body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS flags_inv = HIDESHOES|HIDEJUMPSUIT + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/chaplain/studentuni name = "student robe" @@ -49,6 +51,7 @@ icon_state = "witchhunter" item_state = "witchhunter" body_parts_covered = CHEST|GROIN|LEGS|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/chaplain/pharaoh name = "pharaoh tunic" @@ -56,6 +59,7 @@ icon_state = "pharaoh" icon_state = "pharaoh" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/chaplain/holidaypriest name = "holiday priest" @@ -64,6 +68,7 @@ item_state = "w_suit" body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON //Chef @@ -77,6 +82,7 @@ body_parts_covered = CHEST|GROIN|ARMS allowed = list(/obj/item/kitchen) togglename = "sleeves" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON //Cook /obj/item/clothing/suit/apron/chef @@ -99,6 +105,7 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/det_suit/Initialize() . = ..() @@ -119,6 +126,7 @@ blood_overlay_type = "armor" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio) resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON //Lawyer /obj/item/clothing/suit/toggle/lawyer @@ -129,6 +137,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS togglename = "buttons" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/toggle/lawyer/purple name = "purple suit jacket" @@ -154,6 +163,7 @@ icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here body_parts_covered = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON //Surgeon /obj/item/clothing/suit/apron/surgical @@ -174,6 +184,7 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON //Robotocist @@ -185,7 +196,7 @@ item_state = "techpriest" body_parts_covered = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/techpriest - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/hooded/techpriest name = "techpriest's hood" @@ -204,9 +215,11 @@ desc = "A dark blue vest with reflective strips for emergency medical technicians." icon_state = "paramedic-vest" item_state = "paramedic-vest" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/toggle/labcoat/emt name = "emt vest" desc = "A dark blue vest with reflective strips for emergency medical technicians." icon_state = "labcoat_emt" - item_state = "labcoat_emt" \ No newline at end of file + item_state = "labcoat_emt" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6f61bf56cb..8eaaee9ebc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -17,6 +17,7 @@ body_parts_covered = CHEST allowed = list (/obj/item/gun/energy/laser/bluetag) resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/redtag name = "red laser tag armor" @@ -27,6 +28,7 @@ body_parts_covered = CHEST allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /* * Costume @@ -38,6 +40,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN hoodtype = /obj/item/clothing/head/hooded/flashsuit + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/hooded/flashsuit name = "flash button" @@ -58,6 +61,7 @@ desc = "Yarr." icon_state = "hgpirate" item_state = "hgpirate" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/cyborg_suit @@ -88,6 +92,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/storage/fancy/cigarettes, /obj/item/stack/spacecash) flags_inv = HIDEJUMPSUIT + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/apron/overalls @@ -103,6 +108,7 @@ icon_state = "purplebartenderapron" item_state = "purplebartenderapron" body_parts_covered = CHEST + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/syndicatefake name = "black and red space suit replica" @@ -121,7 +127,7 @@ item_state = "hastur" body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - + mutantrace_variation = NONE /obj/item/clothing/suit/imperium_monk name = "\improper Imperium monk suit" @@ -131,7 +137,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDESHOES|HIDEJUMPSUIT allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) - + mutantrace_variation = NONE /obj/item/clothing/suit/chickensuit name = "chicken suit" @@ -205,6 +211,7 @@ item_state = "snowman" body_parts_covered = CHEST|GROIN flags_inv = HIDEJUMPSUIT + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/poncho name = "poncho" @@ -212,6 +219,7 @@ icon_state = "classicponcho" item_state = "classicponcho" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/poncho/green name = "green poncho" @@ -242,6 +250,7 @@ item_state = "w_suit" body_parts_covered = CHEST|GROIN|LEGS|FEET flags_inv = HIDEJUMPSUIT|HIDESHOES + mutantrace_variation = NONE /obj/item/clothing/suit/hooded/carp_costume name = "carp costume" @@ -288,6 +297,7 @@ body_parts_covered = CHEST|GROIN|ARMS clothing_flags = THICKMATERIAL hoodtype = /obj/item/clothing/head/hooded/bee_hood + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/hooded/bee_hood name = "bee hood" @@ -307,7 +317,7 @@ allowed = list() actions_types = list(/datum/action/item_action/toggle_human_head) hoodtype = /obj/item/clothing/head/hooded/human_head - + mutantrace_variation = NONE /obj/item/clothing/head/hooded/human_head name = "bloated human head" @@ -323,6 +333,7 @@ icon_state = "officertanjacket" item_state = "officertanjacket" body_parts_covered = CHEST|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/ran name = "shikigami costume" @@ -332,6 +343,7 @@ body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDEJUMPSUIT|HIDETAUR heat_protection = CHEST|GROIN|LEGS //fluffy tails! + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/ran name = "shikigami hat" @@ -361,6 +373,7 @@ icon_state = "ianshirt" item_state = "ianshirt" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/nerdshirt name = "gamer shirt" @@ -368,6 +381,7 @@ icon_state = "nerdshirt" item_state = "nerdshirt" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat. name = "Vape Naysh shirt" @@ -375,6 +389,7 @@ icon_state = "vapeshirt" item_state = "vapeshirt" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/jacket name = "bomber jacket" @@ -385,6 +400,7 @@ body_parts_covered = CHEST|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/jacket/leather name = "leather jacket" @@ -401,6 +417,7 @@ icon_state = "leathercoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS cold_protection = CHEST|GROIN|ARMS|LEGS + mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/jacket/puffer name = "puffer jacket" @@ -492,6 +509,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/hooded/winterhood name = "winter hood" @@ -629,6 +647,19 @@ desc = "A white winter coat hood with green markings." icon_state = "winterhood_viro" +/obj/item/clothing/suit/hooded/wintercoat/paramedic + name = "paramedic winter coat" + desc = "A winter coat with blue markings. Warm, but probably won't protect from biological agents. For the cozy doctor on the go." + icon_state = "coatparamed" + item_state = "coatparamed" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic + +/obj/item/clothing/head/hooded/winterhood/paramedic + desc = "A white winter coat hood with blue markings." + icon_state = "winterhood_paramed" + /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" desc = "A white winter coat with an outdated atomic model instead of a plastic zipper tab." @@ -793,7 +824,7 @@ desc = "A dusty button up winter coat. The zipper tab looks like a tiny pickaxe." icon_state = "coatminer" item_state = "coatminer" - allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner @@ -897,6 +928,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire + mutantrace_variation = NONE /obj/item/clothing/suit/bronze name = "bronze suit" @@ -918,6 +950,7 @@ flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD alternate_worn_layer = UNDER_HEAD_LAYER + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/flakjack name = "flak jacket" @@ -928,6 +961,7 @@ body_parts_covered = CHEST resistance_flags = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/assu_suit name = "DAB suit" @@ -973,73 +1007,18 @@ name = "polychromic winter coat" icon_state = "coatpoly" item_state = "coatpoly" - item_color = "coatpoly" hoodtype = /obj/item/clothing/head/hooded/winterhood/polychromic - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#6A6964" - secondary_color = "#C4B8A6" - tertiary_color = "#0000FF" + +/obj/item/clothing/suit/hooded/wintercoat/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#6A6964", "#C4B8A6", "#0000FF"), 3) /obj/item/clothing/head/hooded/winterhood/polychromic icon_state = "winterhood_poly" - item_color = "winterhood_poly" item_state = "winterhood_poly" -/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. - . = ..() - if(suit.hasprimary | suit.hassecondary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(suit.hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[item_color]-primary") //automagical sprite selection - primary_worn.color = suit.primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(suit.hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[item_color]-secondary") - secondary_worn.color = suit.secondary_color - . += secondary_worn - -/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[item_color]-primary[suittoggled ? "_t" : ""]") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[item_color]-secondary[suittoggled ? "_t" : ""]") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[item_color]-tertiary[suittoggled ? "_t" : ""]") - tertiary_worn.color = tertiary_color - . += tertiary_worn - -/obj/item/clothing/suit/hooded/wintercoat/AltClick(mob/user) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(hasprimary | hassecondary | hastertiary) - var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays - switch(choice) //Lets the list's options actually lead to something - if("Primary Color") - var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. - if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. - primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly - update_icon() //updates the item icon - user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. - if("Secondary Color") - var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null - if(secondary_color_input) - secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - if("Tertiary Color") - var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null - if(tertiary_color_input) - tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) - update_icon() - user.regenerate_icons() - return TRUE +/obj/item/clothing/suit/striped_sweater + name = "striped sweater" + desc = "Reminds you of someone, but you just can't put your finger on it..." + icon_state = "waldo_shirt" + item_state = "waldo_shirt" diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 87e7098ebd..98fb836c38 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -36,8 +36,9 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - hit_reaction_chance = 50 // Only on the chest yet blocks all attacks? rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + var/hit_reaction_chance = 50 + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/armor/reactive/attack_self(mob/user) active = !(active) @@ -62,6 +63,14 @@ item_state = "reactiveoff" reactivearmor_cooldown = world.time + 200 +/obj/item/clothing/suit/armor/reactive/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!active) + return BLOCK_NONE + return block_action(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + +/obj/item/clothing/suit/armor/reactive/proc/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + return BLOCK_NONE + //When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) /obj/item/clothing/suit/armor/reactive/teleport name = "reactive teleport armor" @@ -71,18 +80,15 @@ var/rad_amount_before = 120 reactivearmor_cooldown_duration = 100 -/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - . = FALSE - if(!active) - return +/obj/item/clothing/suit/armor/reactive/teleport/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) var/mob/living/carbon/human/H = owner if(world.time < reactivearmor_cooldown) owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]!") return owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") - playsound(get_turf(owner),'sound/magic/blink.ogg', 100, 1) - var/list/turfs = new/list() + playsound(get_turf(owner), 'sound/magic/blink.ogg', 100, 1) + var/list/turfs = new var/turf/old = get_turf(src) for(var/turf/T in orange(tele_range, H)) if(T.density) @@ -101,7 +107,9 @@ radiation_pulse(old, rad_amount_before) radiation_pulse(src, rad_amount) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return TRUE + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_PASSTHROUGH + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_TARGET_DODGED + return BLOCK_NONE //Fire @@ -109,9 +117,7 @@ name = "reactive incendiary armor" desc = "An experimental suit of armor with a reactive sensor array rigged to a flame emitter. For the stylish pyromaniac." -/obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 +/obj/item/clothing/suit/armor/reactive/fire/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) if(world.time < reactivearmor_cooldown) owner.visible_message("The reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!") @@ -124,8 +130,8 @@ C.IgniteMob() owner.fire_stacks = -20 reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 - return 0 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return BLOCK_NONE //Stealth @@ -134,9 +140,7 @@ reactivearmor_cooldown_duration = 65 desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see." -/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 +/obj/item/clothing/suit/armor/reactive/stealth/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) if(world.time < reactivearmor_cooldown) owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters!") @@ -150,7 +154,8 @@ spawn(40) owner.alpha = initial(owner.alpha) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return BLOCK_NONE //Tesla @@ -159,25 +164,23 @@ desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap." siemens_coefficient = -1 reactivearmor_cooldown_duration = 20 - var/tesla_power = 25000 - var/tesla_range = 20 - var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE + var/zap_power = 25000 + var/zap_range = 20 + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/legacy = FALSE var/legacy_dmg = 30 /obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user) ..() if(istype(user)) - user.flags_1 &= ~TESLA_IGNORE_1 + REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") /obj/item/clothing/suit/armor/reactive/tesla/equipped(mob/user, slot) ..() if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? - user.flags_1 |= TESLA_IGNORE_1 + ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") -/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return FALSE +/obj/item/clothing/suit/armor/reactive/tesla/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) if(world.time < reactivearmor_cooldown) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread @@ -187,7 +190,7 @@ return owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") if(!legacy) - tesla_zap(owner, tesla_range, tesla_power, tesla_flags) + tesla_zap(owner, zap_range, zap_power, zap_flags) else for(var/mob/living/M in view(7, owner)) if(M == owner) @@ -196,7 +199,8 @@ M.adjustFireLoss(legacy_dmg) playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return TRUE + return BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return NONE //Repulse @@ -205,9 +209,7 @@ reactivearmor_cooldown_duration = 20 desc = "An experimental suit of armor that violently throws back attackers." -/obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 +/obj/item/clothing/suit/armor/reactive/repulse/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) if(world.time < reactivearmor_cooldown) owner.visible_message("The repulse generator is still recharging!") @@ -234,7 +236,8 @@ AM.throw_at(throwtarget,10,1) safety-- reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return BLOCK_NONE /obj/item/clothing/suit/armor/reactive/table name = "reactive table armor" @@ -242,9 +245,7 @@ desc = "If you can't beat the memes, embrace them." var/tele_range = 10 -/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(!active) - return 0 +/obj/item/clothing/suit/armor/reactive/table/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(prob(hit_reaction_chance)) var/mob/living/carbon/human/H = owner if(world.time < reactivearmor_cooldown) @@ -270,8 +271,8 @@ H.forceMove(picked) new /obj/structure/table(get_turf(owner)) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration - return 1 - return 0 + return BLOCK_SUCCESS | BLOCK_PHYSICAL_INTERNAL + return BLOCK_NONE /obj/item/clothing/suit/armor/reactive/table/emp_act() return diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index cbbd64ebcc..639f2d3bfb 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -6,7 +6,7 @@ var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this /obj/item/clothing/suit/hooded/New() - MakeHood() + hood = MakeHelmet() ..() /obj/item/clothing/suit/hooded/Destroy() @@ -14,11 +14,15 @@ qdel(hood) hood = null -/obj/item/clothing/suit/hooded/proc/MakeHood() +/obj/item/clothing/suit/proc/MakeHelmet(obj/item/clothing/head/H) + SEND_SIGNAL(src, COMSIG_SUIT_MADE_HELMET, H) + return H + +/obj/item/clothing/suit/hooded/MakeHelmet(obj/item/clothing/head/hooded/H) if(!hood) - var/obj/item/clothing/head/hooded/W = new hoodtype(src) - W.suit = src - hood = W + H = new hoodtype(src) + H.suit = src + return ..() /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() @@ -33,7 +37,6 @@ ..() /obj/item/clothing/suit/hooded/proc/RemoveHood() - src.icon_state = "[initial(icon_state)]" suittoggled = FALSE if(ishuman(hood.loc)) var/mob/living/carbon/H = hood.loc @@ -41,9 +44,14 @@ H.update_inv_wear_suit() else hood.forceMove(src) - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() + update_icon() + +/obj/item/clothing/suit/hooded/update_icon_state() + icon_state = "[initial(icon_state)]" + if(ishuman(hood.loc)) + var/mob/living/carbon/human/H = hood.loc + if(H.head == hood) + icon_state += "_t" /obj/item/clothing/suit/hooded/dropped(mob/user) ..() @@ -61,11 +69,8 @@ return else if(H.equip_to_slot_if_possible(hood,SLOT_HEAD,0,0,1)) suittoggled = TRUE - src.icon_state = "[initial(icon_state)]_t" + update_icon() H.update_inv_wear_suit() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() else RemoveHood() @@ -125,7 +130,7 @@ //Hardsuit toggle code /obj/item/clothing/suit/space/hardsuit/Initialize() - MakeHelmet() + helmet = MakeHelmet() . = ..() /obj/item/clothing/suit/space/hardsuit/Destroy() @@ -140,13 +145,13 @@ suit.helmet = null return ..() -/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet() +/obj/item/clothing/suit/space/hardsuit/MakeHelmet(obj/item/clothing/head/helmet/space/hardsuit/H) if(!helmettype) return if(!helmet) - var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src) - W.suit = src - helmet = W + H = new helmettype(src) + H.suit = src + return ..() /obj/item/clothing/suit/space/hardsuit/ui_action_click() ..() diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index c3ddda2328..047dc7b7a3 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -79,6 +79,7 @@ strip_delay = 50 equip_delay_other = 50 resistance_flags = FIRE_PROOF | ACID_PROOF + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON var/magic_flags = SPELL_WIZARD_ROBE /obj/item/clothing/suit/wizrobe/ComponentInitialize() @@ -115,6 +116,7 @@ desc = "A set of armored robes that seem to radiate a dark power." icon_state = "magusblue" item_state = "magusblue" + mutantrace_variation = STYLE_DIGITIGRADE magic_flags = SPELL_WIZARD_ROBE|SPELL_CULT_ARMOR /obj/item/clothing/suit/wizrobe/magusred @@ -122,6 +124,7 @@ desc = "A set of armored robes that seem to radiate a dark power." icon_state = "magusred" item_state = "magusred" + mutantrace_variation = STYLE_DIGITIGRADE magic_flags = SPELL_WIZARD_ROBE|SPELL_CULT_ARMOR /obj/item/clothing/suit/wizrobe/santa @@ -129,6 +132,7 @@ desc = "Festive!" icon_state = "santa" item_state = "santa" + mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/wizrobe/fake desc = "A rather dull blue robe meant to mimick real wizard robes." @@ -161,31 +165,134 @@ var/robe_charge = TRUE actions_types = list(/datum/action/item_action/stickmen) +/obj/item/clothing/suit/wizrobe/paper/item_action_slot_check(slot, mob/user, datum/action/A) + if(A.type == /datum/action/item_action/stickmen && slot != SLOT_WEAR_SUIT) + return FALSE + return ..() -/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action) - stickmen() +//Stickmemes. VV-friendly. +/datum/action/item_action/stickmen + name = "Summon Stick Minions" + desc = "Allows you to summon faithful stickmen allies to aide you in battle." + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" + var/ready = TRUE + var/list/summoned_stickmen = list() + var/summoned_mob_path = /mob/living/simple_animal/hostile/stickman //Must be an hostile animal path. + var/max_stickmen = 8 + var/cooldown = 3 SECONDS + var/list/book_of_grudges = list() + +/datum/action/item_action/stickmen/New(Target) + ..() + if(isitem(Target)) + RegisterSignal(Target, COMSIG_PARENT_EXAMINE, .proc/give_infos) + +/datum/action/item_action/stickmen/Destroy() + for(var/A in summoned_stickmen) + var/mob/living/simple_animal/hostile/S = A + if(S.client) + to_chat(S, "A dizzying sensation strikes you as the comglomerate of pencil lines you call \ + your body crumbles under the pressure of an invisible eraser, soon to join bilions discarded sketches. \ + It seems whatever was keeping you in this realm has come to an end, like all things.") + animate(S, alpha = 0, time = 5 SECONDS) + QDEL_IN(S, 5 SECONDS) + return ..() + +/datum/action/item_action/stickmen/proc/give_infos(atom/source, mob/user, list/examine_list) + examine_list += "Making sure you are properly wearing or holding it, \ + point at whatever you want to rally your minions to its position." + examine_list += "While on harm intent, pointed mobs (minus you and the minions) \ + will also be marked as foes for your minions to attack for the next 2 minutes." + +/datum/action/item_action/stickmen/Grant(mob/M) + . = ..() + if(owner) + RegisterSignal(M, COMSIG_MOB_POINTED, .proc/rally) + if(book_of_grudges[M]) //Stop attacking your new master. + book_of_grudges -= M + for(var/A in summoned_stickmen) + var/mob/living/simple_animal/hostile/S = A + if(!S.mind) + S.LoseTarget() -/obj/item/clothing/suit/wizrobe/paper/verb/stickmen() - set category = "Object" - set name = "Summon Stick Minions" - set src in usr - if(!isliving(usr)) +/datum/action/item_action/stickmen/Remove(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_POINTED) + +/datum/action/item_action/stickmen/Trigger() + . = ..() + if(!.) return - if(!robe_charge) - to_chat(usr, "\The robe's internal magic supply is still recharging!") + if(!ready) + to_chat(owner, "[src]'s internal magic supply is still recharging!") + return FALSE + var/summon = TRUE + if(length(summoned_stickmen) >= max_stickmen) + var/mob/living/simple_animal/hostile/S = popleft(summoned_stickmen) + if(!S.client) + qdel(S) + else + S.forceMove(owner.drop_location()) + S.revive(TRUE) + summoned_stickmen[S] = TRUE + summon = FALSE + + owner.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning") + playsound(owner, 'sound/magic/summon_magic.ogg', 50, 1, 1) + if(summon) + var/mob/living/simple_animal/hostile/S = new summoned_mob_path (get_turf(usr)) + S.faction = owner.faction + S.foes = book_of_grudges + RegisterSignal(S, COMSIG_PARENT_QDELETING, .proc/remove_from_list) + ready = FALSE + addtimer(CALLBACK(src, .proc/ready_again), cooldown) + +/datum/action/item_action/stickmen/proc/remove_from_list(datum/source, forced) + summoned_stickmen -= source + +/datum/action/item_action/stickmen/proc/ready_again() + ready = TRUE + if(owner) + to_chat(owner, "[src] hums, its internal magic supply restored.") + +/** + * Rallies your army of stickmen to whichever target the user is pointing. + * Should the user be on harm intent and the target be a living mob that's not the user or a fellow stickman, + * said target will be added to a list of foes which the stickmen will gladly dispose regardless of faction. + * This is designed so stickmen will move toward whatever you point at even when you don't want to, that's the downside. + */ +/datum/action/item_action/stickmen/proc/rally(mob/source, atom/A) + var/turf/T = get_turf(A) + var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) + if(!surrounding_turfs.len) return + if(source.a_intent == INTENT_HARM && A != source && !summoned_stickmen[A]) + var/mob/living/L + if(isliving(A)) //Gettem boys! + L = A + else if(ismecha(A)) + var/obj/mecha/M = A + L = M.occupant + if(L && L.stat != DEAD && !HAS_TRAIT(L, TRAIT_DEATHCOMA)) //Taking revenge on the deads would be proposterous. + addtimer(CALLBACK(src, .proc/clear_grudge, L), 2 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE) + if(!book_of_grudges[L]) + RegisterSignal(L, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH), .proc/grudge_settled) + book_of_grudges[L] = TRUE + for(var/k in summoned_stickmen) //Shamelessly copied from the blob rally power + var/mob/living/simple_animal/hostile/S = k + if(!S.mind && isturf(S.loc) && get_dist(S, T) <= 10) + S.LoseTarget() + S.Goto(pick(surrounding_turfs), S.move_to_delay) - usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning") - playsound(src.loc, 'sound/magic/summon_magic.ogg', 50, 1, 1) - var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr)) - var/list/factions = usr.faction - M.faction = factions - src.robe_charge = FALSE - sleep(30) - src.robe_charge = TRUE - to_chat(usr, "\The robe hums, its internal magic supply restored.") +/datum/action/item_action/stickmen/proc/clear_grudge(mob/living/L) + if(!QDELETED(L)) + book_of_grudges -= L +/datum/action/item_action/stickmen/proc/grudge_settled(mob/living/L) + UnregisterSignal(L, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH)) + book_of_grudges -= L //Shielded Armour @@ -195,10 +302,9 @@ icon_state = "battlemage" item_state = "battlemage" recharge_rate = 0 + max_charges = INFINITY current_charges = 15 - recharge_cooldown = INFINITY shield_state = "shield-red" - shield_on = "shield-red" min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard @@ -239,6 +345,7 @@ if(!istype(W)) to_chat(user, "The rune can only be used on battlemage armour!") return - W.current_charges += 8 - to_chat(user, "You charge \the [W]. It can now absorb [W.current_charges] hits.") + var/datum/component/shielded/S = GetComponent(/datum/component/shielded) + S.adjust_charges(8) + to_chat(user, "You charge \the [W]. It can now absorb [S.charges] hits.") qdel(src) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index cc91391393..e0ecf24204 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -3,8 +3,10 @@ name = "under" body_parts_covered = CHEST|GROIN|LEGS|ARMS permeability_coefficient = 0.9 + block_priority = BLOCK_PRIORITY_UNIFORM slot_flags = ITEM_SLOT_ICLOTHING armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women var/has_sensor = HAS_SENSORS // For the crew computer var/random_sensor = TRUE @@ -15,10 +17,9 @@ var/dummy_thick = FALSE // is able to hold accessories on its item var/obj/item/clothing/accessory/attached_accessory var/mutable_appearance/accessory_overlay - mutantrace_variation = STYLE_DIGITIGRADE -/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() +/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) + . = ..() if(isinhands) return if(damaged_clothes) @@ -27,23 +28,11 @@ . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color()) if(accessory_overlay) . += accessory_overlay - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[item_color]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[item_color]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[item_color]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = I - C.use(1) + I.use_tool(src, user, 0, 1) has_sensor = HAS_SENSORS to_chat(user,"You repair the suit sensors on [src] with [C].") return 1 @@ -112,10 +101,7 @@ if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE - var/accessory_color = attached_accessory.item_color - if(!accessory_color) - accessory_color = attached_accessory.icon_state - accessory_overlay = mutable_appearance('icons/mob/accessories.dmi', "[accessory_color]") + accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', attached_accessory.icon_state) accessory_overlay.alpha = attached_accessory.alpha accessory_overlay.color = attached_accessory.color @@ -166,4 +152,126 @@ if(SENSOR_COORDS) . += "Its vital tracker and tracking beacon appear to be enabled." if(attached_accessory) - . += "\A [attached_accessory] is attached to it." \ No newline at end of file + . += "\A [attached_accessory] is attached to it." + +/obj/item/clothing/under/verb/toggle() + set name = "Adjust Suit Sensors" + set category = "Object" + set src in usr + var/mob/M = usr + if (istype(M, /mob/dead/)) + return + if (!can_use(M)) + return + if(src.has_sensor == LOCKED_SENSORS) + to_chat(usr, "The controls are locked.") + return 0 + if(src.has_sensor == BROKEN_SENSORS) + to_chat(usr, "The sensors have shorted out!") + return 0 + if(src.has_sensor <= NO_SENSORS) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") + var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away!") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + to_chat(usr, "You disable your suit's remote sensing equipment.") + if(1) + to_chat(usr, "Your suit will now only report whether you are alive or dead.") + if(2) + to_chat(usr, "Your suit will now only report your exact vital lifesigns.") + if(3) + to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.w_uniform == src) + H.update_suit_sensors() + + +/obj/item/clothing/under/CtrlClick(mob/user) + . = ..() + + if (!(item_flags & IN_INVENTORY)) + return + + if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + + if(has_sensor == LOCKED_SENSORS) + to_chat(user, "The controls are locked.") + return + if(has_sensor == BROKEN_SENSORS) + to_chat(user, "The sensors have shorted out!") + return + if(has_sensor <= NO_SENSORS) + to_chat(user, "This suit does not have any sensors.") + return + + sensor_mode = SENSOR_COORDS + + to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.") + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.w_uniform == src) + H.update_suit_sensors() + +/obj/item/clothing/under/AltClick(mob/user) + . = ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + if(attached_accessory) + remove_accessory(user) + else + rolldown() + +/obj/item/clothing/under/verb/jumpsuit_adjust() + set name = "Adjust Jumpsuit Style" + set category = null + set src in usr + rolldown() + +/obj/item/clothing/under/proc/rolldown() + if(!can_use(usr)) + return + if(!can_adjust) + to_chat(usr, "You cannot wear this suit any differently!") + return + if(toggle_jumpsuit_adjust()) + to_chat(usr, "You adjust the suit to wear it more casually.") + else + to_chat(usr, "You adjust the suit back to normal.") + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.update_inv_w_uniform() + H.update_body() + +/obj/item/clothing/under/proc/toggle_jumpsuit_adjust() + adjusted = !adjusted + + if(adjusted) + if(fitted != FEMALE_UNIFORM_TOP) + fitted = NO_FEMALE_UNIFORM + if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted + body_parts_covered &= ~CHEST + mutantrace_variation &= ~USE_TAUR_CLIP_MASK //How are we supposed to see the uniform otherwise? + else + fitted = initial(fitted) + if(!alt_covers_chest) + body_parts_covered |= CHEST + if(initial(mutantrace_variation) & USE_TAUR_CLIP_MASK) + mutantrace_variation |= USE_TAUR_CLIP_MASK + + return adjusted + +/obj/item/clothing/under/rank + dying_key = DYE_REGISTRY_UNDER diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 628f7187ca..cb173f3bde 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/clothing/accessories.dmi' icon_state = "plasma" item_state = "" //no inhands - item_color = "plasma" //On accessories, this controls the worn sprite. That's a bit weird. slot_flags = 0 w_class = WEIGHT_CLASS_SMALL var/above_suit = FALSE @@ -85,7 +84,6 @@ desc = "For some classy, murderous fun." icon_state = "waistcoat" item_state = "waistcoat" - item_color = "waistcoat" minimize_when_attached = FALSE /obj/item/clothing/accessory/maidapron @@ -93,7 +91,6 @@ desc = "The best part of a maid costume." icon_state = "maidapron" item_state = "maidapron" - item_color = "maidapron" minimize_when_attached = FALSE ////////// @@ -104,7 +101,6 @@ name = "bronze medal" desc = "A bronze medal." icon_state = "bronze" - item_color = "bronze" custom_materials = list(/datum/material/iron=1000) resistance_flags = FIRE_PROOF var/medaltype = "medal" //Sprite used for medalbox @@ -173,7 +169,6 @@ name = "ribbon" desc = "A ribbon" icon_state = "cargo" - item_color = "cargo" /obj/item/clothing/accessory/medal/ribbon/cargo name = "\"cargo tech of the shift\" award" @@ -188,7 +183,6 @@ name = "silver medal" desc = "A silver medal." icon_state = "silver" - item_color = "silver" medaltype = "medal-silver" custom_materials = list(/datum/material/silver=1000) @@ -204,7 +198,6 @@ name = "gold medal" desc = "A prestigious golden medal." icon_state = "gold" - item_color = "gold" medaltype = "medal-gold" custom_materials = list(/datum/material/gold=1000) @@ -227,7 +220,6 @@ name = "plasma medal" desc = "An eccentric medal made of plasma." icon_state = "plasma" - item_color = "plasma" medaltype = "medal-plasma" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) @@ -250,7 +242,6 @@ name = "red armband" desc = "An fancy red armband!" icon_state = "redband" - item_color = "redband" /obj/item/clothing/accessory/armband/deputy name = "security deputy armband" @@ -260,37 +251,31 @@ name = "cargo bay guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." icon_state = "cargoband" - item_color = "cargoband" /obj/item/clothing/accessory/armband/engine name = "engineering guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" icon_state = "engieband" - item_color = "engieband" /obj/item/clothing/accessory/armband/science name = "science guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." icon_state = "rndband" - item_color = "rndband" /obj/item/clothing/accessory/armband/hydro name = "hydroponics guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." icon_state = "hydroband" - item_color = "hydroband" /obj/item/clothing/accessory/armband/med name = "medical guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." icon_state = "medband" - item_color = "medband" /obj/item/clothing/accessory/armband/medblue name = "medical guard armband" desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and blue." icon_state = "medblueband" - item_color = "medblueband" ////////////// //OBJECTION!// @@ -300,7 +285,6 @@ name = "attorney's badge" desc = "Fills you with the conviction of JUSTICE. Lawyers tend to want to show it to everyone they meet." icon_state = "lawyerbadge" - item_color = "lawyerbadge" /obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user) if(prob(1)) @@ -324,7 +308,6 @@ name = "pocket protector" desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one." icon_state = "pocketprotector" - item_color = "pocketprotector" pocket_storage_component_path = /datum/component/storage/concrete/pockets/pocketprotector /obj/item/clothing/accessory/pocketprotector/full/Initialize() @@ -346,22 +329,19 @@ name = "bone talisman" desc = "A hunter's talisman, some say the old gods smile on those who wear it." icon_state = "talisman" - item_color = "talisman" - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) + armor = list("melee" = 5, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) /obj/item/clothing/accessory/skullcodpiece name = "skull codpiece" desc = "A skull shaped ornament, intended to protect the important things in life." icon_state = "skull" - item_color = "skull" above_suit = TRUE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) + armor = list("melee" = 5, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) /obj/item/clothing/accessory/skullcodpiece/fake name = "false codpiece" desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it." icon_state = "skull" - item_color = "skull" above_suit = TRUE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) @@ -373,7 +353,6 @@ name = "protective padding" desc = "A soft padding meant to cushion the wearer from melee harm." icon_state = "padding" - item_color = "nothing" armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45) flags_inv = HIDEACCESSORY //hidden from indiscrete mob examines. @@ -381,7 +360,6 @@ name = "kevlar padding" desc = "A layered kevlar padding meant to cushion the wearer from ballistic harm." icon_state = "padding" - item_color = "nothing" armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25) flags_inv = HIDEACCESSORY @@ -389,6 +367,5 @@ name = "ablative padding" desc = "A thin ultra-refractory composite padding meant to cushion the wearer from energy lasers harm." icon_state = "plastics" - item_color = "nothing" armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = -40) flags_inv = HIDEACCESSORY diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 6b40e08af9..824f026e8c 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,10 +1,12 @@ /obj/item/clothing/under/color desc = "A standard issue colored jumpsuit. Variety is the spice of life!" + dying_key = DYE_REGISTRY_UNDER /obj/item/clothing/under/color/jumpskirt body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/color/random icon_state = "random_jumpsuit" @@ -38,7 +40,6 @@ name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" - item_color = "black" resistance_flags = NONE /obj/item/clothing/under/color/black/trackless @@ -49,7 +50,6 @@ name = "black jumpskirt" icon_state = "black_skirt" item_state = "bl_suit" - item_color = "black_skirt" /obj/item/clothing/under/color/black/ghost item_flags = DROPDEL @@ -66,138 +66,119 @@ desc = "A tasteful grey jumpsuit that reminds you of the good old days." icon_state = "grey" item_state = "gy_suit" - item_color = "grey" /obj/item/clothing/under/color/jumpskirt/grey name = "grey jumpskirt" desc = "A tasteful grey jumpskirt that reminds you of the good old days." icon_state = "grey_skirt" item_state = "gy_suit" - item_color = "grey_skirt" /obj/item/clothing/under/color/grey/glorf name = "ancient jumpsuit" desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade." -/obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - owner.forcesay(GLOB.hit_appends) - return 0 +/obj/item/clothing/under/color/grey/glorf/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + . = ..() + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.forcesay(GLOB.hit_appends) /obj/item/clothing/under/color/blue name = "blue jumpsuit" icon_state = "blue" item_state = "b_suit" - item_color = "blue" /obj/item/clothing/under/color/jumpskirt/blue name = "blue jumpskirt" icon_state = "blue_skirt" item_state = "b_suit" - item_color = "blue_skirt" /obj/item/clothing/under/color/green name = "green jumpsuit" icon_state = "green" item_state = "g_suit" - item_color = "green" /obj/item/clothing/under/color/jumpskirt/green name = "green jumpskirt" icon_state = "green_skirt" item_state = "g_suit" - item_color = "green_skirt" /obj/item/clothing/under/color/orange name = "orange jumpsuit" desc = "Don't wear this near paranoid security officers." icon_state = "orange" item_state = "o_suit" - item_color = "orange" /obj/item/clothing/under/color/jumpskirt/orange name = "orange jumpskirt" icon_state = "orange_skirt" item_state = "o_suit" - item_color = "orange_skirt" /obj/item/clothing/under/color/pink name = "pink jumpsuit" icon_state = "pink" desc = "Just looking at this makes you feel fabulous." item_state = "p_suit" - item_color = "pink" /obj/item/clothing/under/color/jumpskirt/pink name = "pink jumpskirt" icon_state = "pink_skirt" item_state = "p_suit" - item_color = "pink_skirt" /obj/item/clothing/under/color/red name = "red jumpsuit" icon_state = "red" item_state = "r_suit" - item_color = "red" /obj/item/clothing/under/color/jumpskirt/red name = "red jumpskirt" icon_state = "red_skirt" item_state = "r_suit" - item_color = "red_skirt" /obj/item/clothing/under/color/white name = "white jumpsuit" icon_state = "white" item_state = "w_suit" - item_color = "white" /obj/item/clothing/under/color/jumpskirt/white name = "white jumpskirt" icon_state = "white_skirt" item_state = "w_suit" - item_color = "white_skirt" /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" icon_state = "yellow" item_state = "y_suit" - item_color = "yellow" /obj/item/clothing/under/color/jumpskirt/yellow name = "yellow jumpskirt" icon_state = "yellow_skirt" item_state = "y_suit" - item_color = "yellow_skirt" /obj/item/clothing/under/color/darkblue name = "darkblue jumpsuit" icon_state = "darkblue" item_state = "b_suit" - item_color = "darkblue" /obj/item/clothing/under/color/jumpskirt/darkblue name = "darkblue jumpskirt" icon_state = "darkblue_skirt" item_state = "b_suit" - item_color = "darkblue_skirt" /obj/item/clothing/under/color/teal name = "teal jumpsuit" icon_state = "teal" item_state = "b_suit" - item_color = "teal" /obj/item/clothing/under/color/jumpskirt/teal name = "teal jumpskirt" icon_state = "teal_skirt" item_state = "b_suit" - item_color = "teal_skirt" /obj/item/clothing/under/color/lightpurple name = "purple jumpsuit" icon_state = "lightpurple" item_state = "p_suit" - item_color = "lightpurple" /obj/item/clothing/under/color/lightpurple/trackless desc = "A magically colored jumpsuit. No sensors are attached!" @@ -207,62 +188,52 @@ name = "lightpurple jumpskirt" icon_state = "lightpurple_skirt" item_state = "p_suit" - item_color = "lightpurple_skirt" /obj/item/clothing/under/color/darkgreen name = "darkgreen jumpsuit" icon_state = "darkgreen" item_state = "g_suit" - item_color = "darkgreen" /obj/item/clothing/under/color/jumpskirt/darkgreen name = "darkgreen jumpskirt" icon_state = "darkgreen_skirt" item_state = "g_suit" - item_color = "darkgreen_skirt" /obj/item/clothing/under/color/lightbrown name = "lightbrown jumpsuit" icon_state = "lightbrown" item_state = "lb_suit" - item_color = "lightbrown" /obj/item/clothing/under/color/jumpskirt/lightbrown name = "lightbrown jumpskirt" icon_state = "lightbrown_skirt" item_state = "lb_suit" - item_color = "lightbrown_skirt" /obj/item/clothing/under/color/brown name = "brown jumpsuit" icon_state = "brown" item_state = "lb_suit" - item_color = "brown" /obj/item/clothing/under/color/jumpskirt/brown name = "brown jumpskirt" icon_state = "brown_skirt" item_state = "lb_suit" - item_color = "brown_skirt" /obj/item/clothing/under/color/maroon name = "maroon jumpsuit" icon_state = "maroon" item_state = "r_suit" - item_color = "maroon" /obj/item/clothing/under/color/jumpskirt/maroon name = "maroon jumpskirt" icon_state = "maroon_skirt" item_state = "r_suit" - item_color = "maroon_skirt" /obj/item/clothing/under/color/rainbow name = "rainbow jumpsuit" desc = "A multi-colored jumpsuit!" icon_state = "rainbow" item_state = "rainbow" - item_color = "rainbow" can_adjust = FALSE /obj/item/clothing/under/color/jumpskirt/rainbow @@ -270,5 +241,4 @@ desc = "A multi-colored jumpskirt!" icon_state = "rainbow_skirt" item_state = "rainbow" - item_color = "rainbow_skirt" can_adjust = FALSE diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index be142a04ff..3e7bc755cb 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -2,32 +2,29 @@ name = "\improper Roman armor" desc = "Ancient Roman armor. Made of metallic and leather straps." icon_state = "roman" - item_color = "roman" item_state = "armor" can_adjust = FALSE strip_delay = 100 resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/jabroni name = "Jabroni Outfit" desc = "The leather club is two sectors down." icon_state = "darkholme" item_state = "darkholme" - item_color = "darkholme" can_adjust = FALSE /obj/item/clothing/under/costume/owl name = "owl uniform" desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction." icon_state = "owl" - item_color = "owl" can_adjust = FALSE /obj/item/clothing/under/costume/griffin name = "griffon uniform" desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem." icon_state = "griffin" - item_color = "griffin" can_adjust = FALSE /obj/item/clothing/under/costume/schoolgirl @@ -35,35 +32,31 @@ desc = "It's just like one of my Japanese animes!" icon_state = "schoolgirl" item_state = "schoolgirl" - item_color = "schoolgirl" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/schoolgirl/red name = "red schoolgirl uniform" icon_state = "schoolgirlred" item_state = "schoolgirlred" - item_color = "schoolgirlred" /obj/item/clothing/under/costume/schoolgirl/green name = "green schoolgirl uniform" icon_state = "schoolgirlgreen" item_state = "schoolgirlgreen" - item_color = "schoolgirlgreen" /obj/item/clothing/under/costume/schoolgirl/orange name = "orange schoolgirl uniform" icon_state = "schoolgirlorange" item_state = "schoolgirlorange" - item_color = "schoolgirlorange" /obj/item/clothing/under/costume/pirate name = "pirate outfit" desc = "Yarr." icon_state = "pirate" item_state = "pirate" - item_color = "pirate" can_adjust = FALSE /obj/item/clothing/under/costume/soviet @@ -71,7 +64,6 @@ desc = "For the Motherland!" icon_state = "soviet" item_state = "soviet" - item_color = "soviet" can_adjust = FALSE /obj/item/clothing/under/costume/redcoat @@ -79,7 +71,6 @@ desc = "Looks old." icon_state = "redcoat" item_state = "redcoat" - item_color = "redcoat" can_adjust = FALSE /obj/item/clothing/under/costume/kilt @@ -87,7 +78,6 @@ desc = "Includes shoes and plaid." icon_state = "kilt" item_state = "kilt" - item_color = "kilt" body_parts_covered = CHEST|GROIN|LEGS|FEET fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -103,24 +93,23 @@ name = "polychromic kilt" desc = "It's not a skirt!" icon_state = "polykilt" - item_color = "polykilt" - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" body_parts_covered = CHEST|GROIN|ARMS|LEGS - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/clothing/under/costume/kilt/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), 2) /obj/item/clothing/under/costume/gladiator name = "gladiator uniform" desc = "Are you not entertained? Is that not why you are here?" icon_state = "gladiator" item_state = "gladiator" - item_color = "gladiator" body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/gladiator/ash_walker desc = "This gladiator uniform appears to be covered in ash and fairly dated." @@ -131,51 +120,50 @@ desc = "Maid in China." icon_state = "maid" item_state = "maid" - item_color = "maid" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/maid/Initialize() . = ..() var/obj/item/clothing/accessory/maidapron/A = new (src) attach_accessory(A) +/obj/item/clothing/under/costume/singer + desc = "Just looking at this makes you want to sing." + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + body_parts_covered = CHEST|GROIN|ARMS + alternate_worn_layer = ABOVE_SHOES_LAYER + can_adjust = FALSE + /obj/item/clothing/under/costume/singer/yellow name = "yellow performer's outfit" - desc = "Just looking at this makes you want to sing." icon_state = "ysing" item_state = "ysing" - item_color = "ysing" body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM - alternate_worn_layer = ABOVE_SHOES_LAYER can_adjust = FALSE /obj/item/clothing/under/costume/singer/blue name = "blue performer's outfit" - desc = "Just looking at this makes you want to sing." icon_state = "bsing" item_state = "bsing" - item_color = "bsing" - body_parts_covered = CHEST|GROIN|ARMS alternate_worn_layer = ABOVE_SHOES_LAYER fitted = FEMALE_UNIFORM_TOP - can_adjust = FALSE /obj/item/clothing/under/costume/geisha name = "geisha suit" desc = "Cute space ninja senpai not included." icon_state = "geisha" - item_color = "geisha" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/villain name = "villain suit" desc = "A change of wardrobe is necessary if you ever want to catch a real superhero." icon_state = "villain" - item_color = "villain" can_adjust = FALSE /obj/item/clothing/under/costume/sailor @@ -183,7 +171,6 @@ desc = "Skipper's in the wardroom drinkin gin'." icon_state = "sailor" item_state = "b_suit" - item_color = "sailor" can_adjust = FALSE /obj/item/clothing/under/costume/russian_officer @@ -191,14 +178,12 @@ desc = "The latest in fashionable russian outfits." icon_state = "hostanclothes" item_state = "hostanclothes" - item_color = "hostanclothes" /obj/item/clothing/under/costume/mummy name = "mummy wrapping" desc = "Return the slab or suffer my stale references." icon_state = "mummy" item_state = "mummy" - item_color = "mummy" body_parts_covered = CHEST|GROIN|ARMS|LEGS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -209,7 +194,6 @@ desc = "Perfect camouflage for hiding in botany." icon_state = "scarecrow" item_state = "scarecrow" - item_color = "scarecrow" body_parts_covered = CHEST|GROIN|ARMS|LEGS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -220,34 +204,33 @@ desc = "A dress inspired by the ancient \"Victorian\" era." icon_state = "draculass" item_state = "draculass" - item_color = "draculass" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/drfreeze name = "doctor freeze's jumpsuit" desc = "A modified scientist jumpsuit to look extra cool." icon_state = "drfreeze" item_state = "drfreeze" - item_color = "drfreeze" can_adjust = FALSE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/lobster name = "foam lobster suit" desc = "Who beheaded the college mascot?" icon_state = "lobster" item_state = "lobster" - item_color = "lobster" fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/gondola name = "gondola hide suit" desc = "Now you're cooking." icon_state = "gondola" item_state = "lb_suit" - item_color = "gondola" can_adjust = FALSE /obj/item/clothing/under/costume/skeleton @@ -255,7 +238,6 @@ desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!" icon_state = "skeleton" item_state = "skeleton" - item_color = "skeleton" body_parts_covered = CHEST|GROIN|ARMS|LEGS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -268,6 +250,7 @@ icon_state = "christmasmaler" item_state = "christmasmaler" can_adjust = FALSE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/christmas/green name = "green christmas suit" @@ -281,6 +264,7 @@ icon_state = "christmasfemaler" item_state = "christmasfemaler" body_parts_covered = CHEST|GROIN + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON|USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/christmas/croptop/green name = "green feminine christmas suit" @@ -296,7 +280,7 @@ item_state = "qipao" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/costume/qipao/white name = "White Qipao" @@ -305,7 +289,6 @@ item_state = "qipao_white" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE /obj/item/clothing/under/costume/qipao/red name = "Red Qipao" @@ -314,7 +297,6 @@ item_state = "qipao_red" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE /obj/item/clothing/under/costume/cheongsam name = "Black Cheongsam" @@ -323,7 +305,7 @@ item_state = "cheong" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/cheongsam/white name = "White Cheongsam" @@ -341,11 +323,9 @@ item_state = "cheongr" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE /obj/item/clothing/under/costume/cloud name = "cloud" desc = "cloud" icon_state = "cloud" - item_color = "cloud" can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index 74181b05eb..5928819b16 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -3,86 +3,75 @@ desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs." icon_state = "cargo_envirosuit" item_state = "cargo_envirosuit" - item_color = "cargo_envirosuit" /obj/item/clothing/under/plasmaman/mining name = "mining plasma envirosuit" desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen." icon_state = "explorer_envirosuit" item_state = "explorer_envirosuit" - item_color = "explorer_envirosuit" - /obj/item/clothing/under/plasmaman/chef name = "chef's plasma envirosuit" desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef." icon_state = "chef_envirosuit" item_state = "chef_envirosuit" - item_color = "chef_envirosuit" /obj/item/clothing/under/plasmaman/enviroslacks name = "enviroslacks" desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike." icon_state = "enviroslacks" item_state = "enviroslacks" - item_color = "enviroslacks" /obj/item/clothing/under/plasmaman/chaplain name = "chaplain's plasma envirosuit" desc = "An envirosuit specially designed for only the most pious of plasmamen." icon_state = "chap_envirosuit" item_state = "chap_envirosuit" - item_color = "chap_envirosuit" /obj/item/clothing/under/plasmaman/curator name = "curator's plasma envirosuit" desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike." icon_state = "prototype_envirosuit" item_state = "prototype_envirosuit" - item_color = "prototype_envirosuit" /obj/item/clothing/under/plasmaman/janitor name = "janitor's plasma envirosuit" desc = "A grey and purple envirosuit designated for plasmamen janitors." icon_state = "janitor_envirosuit" item_state = "janitor_envirosuit" - item_color = "janitor_envirosuit" /obj/item/clothing/under/plasmaman/botany name = "botany envirosuit" desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries." icon_state = "botany_envirosuit" item_state = "botany_envirosuit" - item_color = "botany_envirosuit" /obj/item/clothing/under/plasmaman/hop name = "head of personell's envirosuit" desc = "A prestigious azure envirosuit designed for head of personell." icon_state = "hop_envirosuit" item_state = "hop_envirosuit" - item_color = "hop_envirosuit" /obj/item/clothing/under/plasmaman/captain name = "captain's envirosuit" desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires." icon_state = "captain_envirosuit" item_state = "captain_envirosuit" - item_color = "captain_envirosuit" armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + sensor_mode = SENSOR_COORDS + random_sensor = FALSE /obj/item/clothing/under/plasmaman/mime name = "mime envirosuit" desc = "It's not very colourful." icon_state = "mime_envirosuit" item_state = "mime_envirosuit" - item_color = "mime_envirosuit" /obj/item/clothing/under/plasmaman/clown name = "clown envirosuit" desc = "'HONK!'" icon_state = "clown_envirosuit" item_state = "clown_envirosuit" - item_color = "clown_envirosuit" /obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H) if(!istype(H)) @@ -97,4 +86,4 @@ H.visible_message("[H]'s suit spews out a tonne of space lube!","Your suit spews out a tonne of space lube!") H.ExtinguishMob() new /obj/effect/particle_effect/foam(loc) //Truely terrifying. - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 1f381df4cf..15eb189fa8 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -3,7 +3,6 @@ desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage." icon_state = "engineer_envirosuit" item_state = "engineer_envirosuit" - item_color = "engineer_envirosuit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95) /obj/item/clothing/under/plasmaman/engineering/ce @@ -11,11 +10,9 @@ desc = "An advanced air-tight suit designed to be used by plasmamen chief engineers, complete with ornamental widgets and gizmo. It protects the user from fire and acid damage." icon_state = "ce_envirosuit" item_state = "ce_envirosuit" - item_color = "ce_envirosuit" /obj/item/clothing/under/plasmaman/atmospherics name = "atmospherics plasma envirosuit" desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue." icon_state = "atmos_envirosuit" item_state = "atmos_envirosuit" - item_color = "atmos_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm index 6106d785a9..03d089c10d 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm @@ -3,28 +3,24 @@ desc = "A suit designed for the station's more plasma-based doctors." icon_state = "doctor_envirosuit" item_state = "doctor_envirosuit" - item_color = "doctor_envirosuit" /obj/item/clothing/under/plasmaman/cmo name = "chief medical officer's plasma envirosuit" desc = "A suit designed for the station's most plasma-based chief medical officer, but not for their cat." icon_state = "cmo_envirosuit" item_state = "cmo_envirosuit" - item_color = "cmo_envirosuit" /obj/item/clothing/under/plasmaman/science name = "science plasma envirosuit" desc = "A plasmaman envirosuit designed for scientists." icon_state = "scientist_envirosuit" item_state = "scientist_envirosuit" - item_color = "scientist_envirosuit" /obj/item/clothing/under/plasmaman/rd name = "research direactor's plasma envirosuit" desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction." icon_state = "rd_envirosuit" item_state = "rd_envirosuit" - item_color = "rd_envirosuit" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) /obj/item/clothing/under/plasmaman/robotics @@ -32,25 +28,21 @@ desc = "A plasmaman envirosuit designed for roboticists." icon_state = "roboticist_envirosuit" item_state = "roboticist_envirosuit" - item_color = "roboticist_envirosuit" /obj/item/clothing/under/plasmaman/viro name = "virology plasma envirosuit" desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create." icon_state = "virologist_envirosuit" item_state = "virologist_envirosuit" - item_color = "virologist_envirosuit" /obj/item/clothing/under/plasmaman/genetics name = "genetics plasma envirosuit" desc = "A plasmaman envirosuit designed for geneticists." icon_state = "geneticist_envirosuit" item_state = "geneticist_envirosuit" - item_color = "geneticist_envirosuit" /obj/item/clothing/under/plasmaman/chemist name = "chemistry plasma envirosuit" desc = "A plasmaman envirosuit designed for chemists." icon_state = "chemist_envirosuit" item_state = "chemist_envirosuit" - item_color = "chemist_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index ff756e09fd..ddbda041f3 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -3,19 +3,18 @@ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." icon_state = "security_envirosuit" item_state = "security_envirosuit" - item_color = "security_envirosuit" armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + sensor_mode = SENSOR_COORDS + random_sensor = FALSE /obj/item/clothing/under/plasmaman/security/warden name = "warden plasma envirosuit" desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security." icon_state = "warden_envirosuit" item_state = "warden_envirosuit" - item_color = "warden_envirosuit" /obj/item/clothing/under/plasmaman/security/hos name = "security plasma envirosuit" desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW." icon_state = "hos_envirosuit" item_state = "hos_envirosuit" - item_color = "hos_envirosuit" diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index 5727ebc0e9..aa4db2fd30 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -4,24 +4,22 @@ desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm" item_state = "lb_suit" - item_color = "qm" /obj/item/clothing/under/rank/cargo/qm/skirt name = "quartermaster's jumpskirt" desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm_skirt" item_state = "lb_suit" - item_color = "qm_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/cargo/tech name = "cargo technician's jumpsuit" desc = "Shooooorts! They're comfy and easy to wear!" - icon_state = "cargotech" + icon_state = "cargo" item_state = "lb_suit" - item_color = "cargo" body_parts_covered = CHEST|GROIN|ARMS alt_covers_chest = TRUE @@ -30,22 +28,20 @@ desc = "Skiiiiirts! They're comfy and easy to wear" icon_state = "cargo_skirt" item_state = "lb_suit" - item_color = "cargo_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/cargo/miner desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." name = "shaft miner's jumpsuit" icon_state = "miner" item_state = "miner" - item_color = "miner" /obj/item/clothing/under/rank/cargo/miner/lavaland desc = "A green uniform for operating in hazardous environments." name = "shaft miner's jumpsuit" icon_state = "explorer" item_state = "explorer" - item_color = "explorer" can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/centcom.dm b/code/modules/clothing/under/jobs/centcom.dm index 3ee210612e..33a4659b5f 100644 --- a/code/modules/clothing/under/jobs/centcom.dm +++ b/code/modules/clothing/under/jobs/centcom.dm @@ -3,7 +3,6 @@ name = "\improper CentCom officer's jumpsuit" icon_state = "officer" item_state = "g_suit" - item_color = "officer" alt_covers_chest = TRUE /obj/item/clothing/under/rank/centcom/officer/syndicate @@ -14,4 +13,3 @@ name = "\improper CentCom officer's jumpsuit" icon_state = "centcom" item_state = "dg_suit" - item_color = "centcom" diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index ac5f4f12fd..4eb6a18258 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -3,7 +3,6 @@ name = "bartender's uniform" icon_state = "barman" item_state = "bar_suit" - item_color = "barman" alt_covers_chest = TRUE /obj/item/clothing/under/rank/civilian/bartender/purple @@ -11,59 +10,56 @@ name = "purple bartender's uniform" icon_state = "purplebartender" item_state = "purplebartender" - item_color = "purplebartender" can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP /obj/item/clothing/under/rank/civilian/bartender/skirt name = "bartender's skirt" desc = "It looks like it could use some more flair." icon_state = "barman_skirt" item_state = "bar_suit" - item_color = "barman_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/chaplain desc = "It's a black jumpsuit, often worn by religious folk." name = "chaplain's jumpsuit" icon_state = "chaplain" item_state = "bl_suit" - item_color = "chapblack" can_adjust = FALSE /obj/item/clothing/under/rank/civilian/chaplain/skirt name = "chaplain's jumpskirt" desc = "It's a black jumpskirt, often worn by religious folk." - icon_state = "chapblack_skirt" + icon_state = "chaplain_skirt" item_state = "bl_suit" - item_color = "chapblack_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/chef name = "cook's suit" desc = "A suit which is given only to the most hardcore cooks in space." icon_state = "chef" - item_color = "chef" alt_covers_chest = TRUE /obj/item/clothing/under/rank/civilian/chef/skirt name = "cook's skirt" desc = "A skirt which is given only to the most hardcore cooks in space." icon_state = "chef_skirt" - item_color = "chef_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/head_of_personnel desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." name = "head of personnel's jumpsuit" icon_state = "hop" item_state = "b_suit" - item_color = "hop" can_adjust = FALSE /obj/item/clothing/under/rank/civilian/head_of_personnel/skirt @@ -71,17 +67,16 @@ desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"." icon_state = "hop_skirt" item_state = "b_suit" - item_color = "hop_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/head_of_personnel/suit name = "head of personnel's suit" desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon_state = "teal_suit" item_state = "g_suit" - item_color = "teal_suit" can_adjust = FALSE /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt @@ -89,17 +84,16 @@ desc = "A teal suitskirt and yellow necktie. An authoritative yet tacky ensemble." icon_state = "teal_suit_skirt" item_state = "g_suit" - item_color = "teal_suit_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/hydroponics desc = "It's a jumpsuit designed to protect against minor plant-related hazards." name = "botanist's jumpsuit" icon_state = "hydroponics" item_state = "g_suit" - item_color = "hydroponics" permeability_coefficient = 0.5 /obj/item/clothing/under/rank/civilian/hydroponics/skirt @@ -107,36 +101,35 @@ desc = "It's a jumpskirt designed to protect against minor plant-related hazards." icon_state = "hydroponics_skirt" item_state = "g_suit" - item_color = "hydroponics_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/janitor desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" icon_state = "janitor" - item_color = "janitor" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/under/rank/civilian/janitor/skirt name = "janitor's jumpskirt" desc = "It's the official skirt of the station's janitor. It has minor protection from biohazards." icon_state = "janitor_skirt" - item_color = "janitor_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/janitor/maid name = "maid uniform" desc = "A simple maid uniform for housekeeping." icon_state = "janimaid" item_state = "janimaid" - item_color = "janimaid" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer desc = "Slick threads." @@ -147,93 +140,86 @@ name = "lawyer black suit" icon_state = "lawyer_black" item_state = "lawyer_black" - item_color = "lawyer_black" /obj/item/clothing/under/rank/civilian/lawyer/black/alt name = "lawyer black suit" desc = "A professional black suit. Nanotrasen Investigation Bureau approved!" icon_state = "blacksuit" item_state = "bar_suit" - item_color = "blacksuit" can_adjust = TRUE alt_covers_chest = TRUE /obj/item/clothing/under/rank/civilian/lawyer/black/alt/skirt name = "lawyer black suitskirt" icon_state = "blacksuit_skirt" - item_color = "blacksuit_skirt" can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/really_black name = "executive suit" desc = "A formal black suit and red tie, intended for the station's finest." icon_state = "really_black_suit" item_state = "bl_suit" - item_color = "really_black_suit" /obj/item/clothing/under/rank/civilian/lawyer/really_black/skirt name = "executive suitskirt" desc = "A formal black suitskirt and red tie, intended for the station's finest." icon_state = "really_black_suit_skirt" item_state = "bl_suit" - item_color = "really_black_suit_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/black/skirt name = "lawyer black suitskirt" icon_state = "lawyer_black_skirt" item_state = "lawyer_black" - item_color = "lawyer_black_skirt" fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/female name = "female black suit" icon_state = "black_suit_fem" item_state = "bl_suit" - item_color = "black_suit_fem" /obj/item/clothing/under/rank/civilian/lawyer/red name = "lawyer red suit" icon_state = "lawyer_red" item_state = "lawyer_red" - item_color = "lawyer_red" /obj/item/clothing/under/rank/civilian/lawyer/female/skirt name = "female black suitskirt" icon_state = "black_suit_fem_skirt" item_state = "bl_suit" - item_color = "black_suit_fem_skirt" fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/red/skirt name = "lawyer red suitskirt" icon_state = "lawyer_red_skirt" item_state = "lawyer_red" - item_color = "lawyer_red_skirt" fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/blue name = "lawyer blue suit" icon_state = "lawyer_blue" item_state = "lawyer_blue" - item_color = "lawyer_blue" /obj/item/clothing/under/rank/civilian/lawyer/blue/skirt name = "lawyer blue suitskirt" icon_state = "lawyer_blue_skirt" item_state = "lawyer_blue" - item_color = "lawyer_blue_skirt" fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/bluesuit name = "blue suit" desc = "A classy suit and tie." icon_state = "bluesuit" item_state = "b_suit" - item_color = "bluesuit" can_adjust = TRUE alt_covers_chest = TRUE @@ -242,16 +228,15 @@ desc = "A classy suitskirt and tie." icon_state = "bluesuit_skirt" item_state = "b_suit" - item_color = "bluesuit_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/lawyer/purpsuit name = "purple suit" icon_state = "lawyer_purp" item_state = "p_suit" - item_color = "lawyer_purp" fitted = NO_FEMALE_UNIFORM can_adjust = TRUE alt_covers_chest = TRUE @@ -260,7 +245,7 @@ name = "purple suitskirt" icon_state = "lawyer_purp_skirt" item_state = "p_suit" - item_color = "lawyer_purp_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm index 7e85d60dbc..470a3695fc 100644 --- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm +++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm @@ -4,24 +4,21 @@ desc = "It's not very colourful." icon_state = "mime" item_state = "mime" - item_color = "mime" /obj/item/clothing/under/rank/civilian/mime/skirt name = "mime's skirt" desc = "It's not very colourful." icon_state = "mime_skirt" - item_state = "mime" - item_color = "mime_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/mime/sexy name = "sexy mime outfit" desc = "The only time when you DON'T enjoy looking at someone's rack." icon_state = "sexymime" item_state = "sexymime" - item_color = "sexymime" body_parts_covered = CHEST|GROIN|LEGS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -31,76 +28,70 @@ desc = "'HONK!'" icon_state = "clown" item_state = "clown" - item_color = "clown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE //The clown suit must look funny, no taur alpha masks where possible. /obj/item/clothing/under/rank/civilian/clown/blue name = "blue clown suit" desc = "'BLUE HONK!'" icon_state = "blueclown" item_state = "blueclown" - item_color = "blueclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/green name = "green clown suit" desc = "'GREEN HONK!'" icon_state = "greenclown" item_state = "greenclown" - item_color = "greenclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/yellow name = "yellow clown suit" desc = "'YELLOW HONK!'" icon_state = "yellowclown" item_state = "yellowclown" - item_color = "yellowclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/purple name = "purple clown suit" desc = "'PURPLE HONK!'" icon_state = "purpleclown" item_state = "purpleclown" - item_color = "purpleclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/orange name = "orange clown suit" desc = "'ORANGE HONK!'" icon_state = "orangeclown" item_state = "orangeclown" - item_color = "orangeclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/rainbow name = "rainbow clown suit" desc = "'R A I N B O W HONK!'" icon_state = "rainbowclown" item_state = "rainbowclown" - item_color = "rainbowclown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/clown/jester name = "jester suit" desc = "A jolly dress, well suited to entertain your master, nuncle." icon_state = "jester" - item_color = "jester" can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK /obj/item/clothing/under/rank/civilian/clown/jester/alt icon_state = "jester2" @@ -110,8 +101,8 @@ desc = "It makes you look HONKable!" icon_state = "sexyclown" item_state = "sexyclown" - item_color = "sexyclown" can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK /obj/item/clothing/under/rank/civilian/clown/Initialize() . = ..() diff --git a/code/modules/clothing/under/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm index c02cc4b710..c82f9c24aa 100644 --- a/code/modules/clothing/under/jobs/civilian/curator.dm +++ b/code/modules/clothing/under/jobs/civilian/curator.dm @@ -3,32 +3,26 @@ desc = "It's very... sensible." icon_state = "red_suit" item_state = "red_suit" - item_color = "red_suit" can_adjust = FALSE /obj/item/clothing/under/rank/civilian/curator/skirt name = "sensible suitskirt" - desc = "It's very... sensible." icon_state = "red_suit_skirt" - item_state = "red_suit" - item_color = "red_suit_skirt" body_parts_covered = CHEST|GROIN|ARMS - can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/curator/treasure_hunter name = "treasure hunter uniform" desc = "A rugged uniform suitable for treasure hunting." icon_state = "curator" item_state = "curator" - item_color = "curator" /obj/item/clothing/under/rank/civilian/curator/nasa name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." icon_state = "black" item_state = "bl_suit" - item_color = "black" w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 @@ -37,5 +31,4 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - can_adjust = FALSE resistance_flags = NONE diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 30560e76b4..a614e2fcb3 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -3,7 +3,6 @@ name = "captain's jumpsuit" icon_state = "captain" item_state = "b_suit" - item_color = "captain" sensor_mode = SENSOR_COORDS random_sensor = FALSE @@ -12,17 +11,16 @@ desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"." icon_state = "captain_skirt" item_state = "b_suit" - item_color = "captain_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state = "dg_suit" - item_color = "green_suit" can_adjust = FALSE /obj/item/clothing/under/rank/captain/suit/skirt @@ -30,17 +28,16 @@ desc = "A green suitskirt and yellow necktie. Exemplifies authority." icon_state = "green_suit_skirt" item_state = "dg_suit" - item_color = "green_suit_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/captain/parade name = "captain's parade uniform" desc = "A captain's luxury-wear, for special occasions." icon_state = "captain_parade" item_state = "by_suit" - item_color = "captain_parade" can_adjust = FALSE /obj/item/clothing/under/rank/captain/femformal @@ -48,6 +45,5 @@ desc = "An ironically skimpy blue dress with gold markings denoting the rank of \"Captain\"." icon_state = "lewdcap" item_state = "lewdcap" - item_color = "lewdcap" can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index ae0ded5888..3eaaa42620 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -4,26 +4,24 @@ name = "chief engineer's jumpsuit" icon_state = "chiefengineer" item_state = "gy_suit" - item_color = "chief" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/chief_engineer/skirt name = "chief engineer's jumpskirt" desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has minor radiation shielding." - icon_state = "chief_skirt" + icon_state = "chiefengineer_skirt" item_state = "gy_suit" - item_color = "chief_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/engineering/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." name = "atmospheric technician's jumpsuit" icon_state = "atmos" item_state = "atmos_suit" - item_color = "atmos" resistance_flags = NONE /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt @@ -31,17 +29,16 @@ desc = "It's a jumpskirt worn by atmospheric technicians." icon_state = "atmos_skirt" item_state = "atmos_suit" - item_color = "atmos_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/engineering/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." name = "engineer's jumpsuit" icon_state = "engine" item_state = "engi_suit" - item_color = "engine" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20) resistance_flags = NONE @@ -50,7 +47,6 @@ desc = "A high visibility jumpsuit made from heat and radiation resistant materials." icon_state = "hazard" item_state = "suit-orange" - item_color = "hazard" alt_covers_chest = TRUE /obj/item/clothing/under/rank/engineering/engineer/skirt @@ -58,7 +54,7 @@ desc = "It's an orange high visibility jumpskirt worn by engineers." icon_state = "engine_skirt" item_state = "engi_suit" - item_color = "engine_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 0c2b885bec..f50e5161b6 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -3,7 +3,6 @@ name = "chief medical officer's jumpsuit" icon_state = "cmo" item_state = "w_suit" - item_color = "cmo" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) @@ -12,85 +11,78 @@ desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." icon_state = "cmo_skirt" item_state = "w_suit" - item_color = "cmo_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck desc = "It's a turtleneck worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection, for an officer with a superior sense of style and practicality." name = "chief medical officer's turtleneck" - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/turtlenecks.dmi' - icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi' icon_state = "cmoturtle" item_state = "w_suit" - item_color = "cmoturtle" alt_covers_chest = TRUE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/rank/medical/geneticist desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." name = "geneticist's jumpsuit" icon_state = "genetics" item_state = "w_suit" - item_color = "geneticswhite" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/under/rank/medical/geneticist/skirt name = "geneticist's jumpskirt" desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." - icon_state = "geneticswhite_skirt" + icon_state = "genetics_skirt" item_state = "w_suit" - item_color = "geneticswhite_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/virologist desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." name = "virologist's jumpsuit" icon_state = "virology" item_state = "w_suit" - item_color = "virologywhite" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/under/rank/medical/virologist/skirt name = "virologist's jumpskirt" desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." - icon_state = "virologywhite_skirt" + icon_state = "virology_skirt" item_state = "w_suit" - item_color = "virologywhite_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/chemist desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." name = "chemist's jumpsuit" icon_state = "chemistry" item_state = "w_suit" - item_color = "chemistrywhite" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65) /obj/item/clothing/under/rank/medical/chemist/skirt name = "chemist's jumpskirt" desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." - icon_state = "chemistrywhite_skirt" + icon_state = "chemistry_skirt" item_state = "w_suit" - item_color = "chemistrywhite_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/paramedic desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic." name = "paramedic jumpsuit" icon_state = "paramedic-dark" item_state = "w_suit" - item_color = "paramedic-dark" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) can_adjust = FALSE @@ -98,7 +90,6 @@ /obj/item/clothing/under/rank/medical/paramedic/light desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." icon_state = "paramedic-light" - item_color = "paramedic-light" can_adjust = TRUE /obj/item/clothing/under/rank/medical/paramedic/skirt @@ -106,34 +97,32 @@ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic." icon_state = "paramedic-dark_skirt" item_state = "w_suit" - item_color = "paramedic-dark_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/paramedic/skirt/light desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." icon_state = "paramedic_skirt" - item_color = "paramedic_skirt" /obj/item/clothing/under/rank/medical/doctor/nurse desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." name = "nurse's suit" icon_state = "nursesuit" item_state = "w_suit" - item_color = "nursesuit" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/medical/doctor desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." name = "medical doctor's jumpsuit" icon_state = "medical" item_state = "w_suit" - item_color = "medical" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) @@ -141,21 +130,18 @@ name = "blue medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" - item_color = "scrubsblue" can_adjust = FALSE /obj/item/clothing/under/rank/medical/doctor/green name = "green medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." icon_state = "scrubsgreen" - item_color = "scrubsgreen" can_adjust = FALSE /obj/item/clothing/under/rank/medical/doctor/purple name = "purple medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." icon_state = "scrubspurple" - item_color = "scrubspurple" can_adjust = FALSE /obj/item/clothing/under/rank/medical/doctor/skirt @@ -163,7 +149,7 @@ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." icon_state = "medical_skirt" item_state = "w_suit" - item_color = "medical_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - fitted = FEMALE_UNIFORM_TOP \ No newline at end of file + fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index 142cb8d8b1..f7bd6d5e33 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -3,7 +3,6 @@ name = "research director's vest suit" icon_state = "director" item_state = "lb_suit" - item_color = "director" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35) can_adjust = FALSE @@ -12,17 +11,15 @@ desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." icon_state = "director_skirt" item_state = "lb_suit" - item_color = "director_skirt" body_parts_covered = CHEST|GROIN|ARMS - can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/rnd/research_director/alt desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." name = "research director's tan suit" icon_state = "rdwhimsy" item_state = "rdwhimsy" - item_color = "rdwhimsy" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) can_adjust = TRUE alt_covers_chest = TRUE @@ -32,17 +29,16 @@ desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants." icon_state = "rdwhimsy_skirt" item_state = "rdwhimsy" - item_color = "rdwhimsy_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/rnd/research_director/turtleneck desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style." name = "research director's turtleneck" icon_state = "rdturtle" item_state = "p_suit" - item_color = "rdturtle" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) can_adjust = TRUE alt_covers_chest = TRUE @@ -52,36 +48,34 @@ desc = "A dark purple turtleneck and tan khaki skirt, for a director with a superior sense of style." icon_state = "rdturtle_skirt" item_state = "p_suit" - item_color = "rdturtle_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/rnd/scientist desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." name = "scientist's jumpsuit" icon_state = "toxins" item_state = "w_suit" - item_color = "toxinswhite" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/under/rank/rnd/scientist/skirt name = "scientist's jumpskirt" desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." - icon_state = "toxinswhite_skirt" + icon_state = "toxins_skirt" item_state = "w_suit" - item_color = "toxinswhite_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/rnd/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." name = "roboticist's jumpsuit" icon_state = "robotics" item_state = "robotics" - item_color = "robotics" resistance_flags = NONE /obj/item/clothing/under/rank/rnd/roboticist/skirt @@ -89,7 +83,7 @@ desc = "It's a slimming black with reinforced seams; great for industrial work." icon_state = "robotics_skirt" item_state = "robotics" - item_color = "robotics_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 21e088f634..26fff7c8ed 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -8,42 +8,40 @@ /* * Security */ +/obj/item/clothing/under/rank/security + strip_delay = 50 + alt_covers_chest = TRUE + sensor_mode = SENSOR_COORDS + random_sensor = FALSE /obj/item/clothing/under/rank/security/officer name = "security jumpsuit" desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle." icon_state = "rsecurity" item_state = "r_suit" - item_color = "rsecurity" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) - strip_delay = 50 - alt_covers_chest = TRUE - sensor_mode = SENSOR_COORDS - random_sensor = FALSE /obj/item/clothing/under/rank/security/officer/grey name = "grey security jumpsuit" desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood." icon_state = "security" item_state = "gy_suit" - item_color = "security" /obj/item/clothing/under/rank/security/officer/skirt name = "security jumpskirt" desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt." icon_state = "secskirt" item_state = "r_suit" - item_color = "secskirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/security/officer/formal name = "security officer's formal uniform" desc = "The latest in fashionable security outfits." icon_state = "officerblueclothes" item_state = "officerblueclothes" - item_color = "officerblueclothes" alt_covers_chest = TRUE /obj/item/clothing/under/rank/security/officer/blueshirt @@ -51,7 +49,6 @@ desc = "I'm a little busy right now, Calhoun." icon_state = "blueshift" item_state = "blueshift" - item_color = "blueshift" can_adjust = FALSE /obj/item/clothing/under/rank/security/officer/spacepol @@ -59,7 +56,6 @@ desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol." icon_state = "spacepol" item_state = "spacepol" - item_color = "spacepol" can_adjust = FALSE /* @@ -71,36 +67,29 @@ desc = "A formal security suit for officers complete with Nanotrasen belt buckle." icon_state = "rwarden" item_state = "r_suit" - item_color = "rwarden" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) - strip_delay = 50 - alt_covers_chest = TRUE - sensor_mode = 3 - random_sensor = FALSE /obj/item/clothing/under/rank/security/warden/grey name = "grey security suit" desc = "A formal relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood." icon_state = "warden" item_state = "gy_suit" - item_color = "warden" /obj/item/clothing/under/rank/security/warden/skirt name = "warden's suitskirt" desc = "A formal security suitskirt for officers complete with Nanotrasen belt buckle." icon_state = "rwarden_skirt" item_state = "r_suit" - item_color = "rwarden_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/security/warden/formal desc = "The insignia on this uniform tells you that this uniform belongs to the Warden." name = "warden's formal uniform" icon_state = "wardenblueclothes" item_state = "wardenblueclothes" - item_color = "wardenblueclothes" alt_covers_chest = TRUE /* @@ -112,40 +101,33 @@ desc = "Someone who wears this means business." icon_state = "detective" item_state = "det" - item_color = "detective" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) - strip_delay = 50 - alt_covers_chest = TRUE - sensor_mode = 3 - random_sensor = FALSE /obj/item/clothing/under/rank/security/detective/skirt name = "detective's suitskirt" desc = "Someone who wears this means business." icon_state = "detective_skirt" item_state = "det" - item_color = "detective_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/security/detective/grey name = "noir suit" desc = "A hard-boiled private investigator's grey suit, complete with tie clip." icon_state = "greydet" item_state = "greydet" - item_color = "greydet" - alt_covers_chest = TRUE /obj/item/clothing/under/rank/security/detective/grey/skirt name = "noir suitskirt" desc = "A hard-boiled private investigator's grey suitskirt, complete with tie clip." icon_state = "greydet_skirt" item_state = "greydet" - item_color = "greydet_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /* * Head of Security @@ -156,61 +138,52 @@ desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos" item_state = "r_suit" - item_color = "rhos" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) strip_delay = 60 - alt_covers_chest = TRUE - sensor_mode = 3 - random_sensor = FALSE /obj/item/clothing/under/rank/security/head_of_security/skirt name = "head of security's jumpskirt" desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos_skirt" item_state = "r_suit" - item_color = "rhos_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/security/head_of_security/grey name = "head of security's grey jumpsuit" desc = "There are old men, and there are bold men, but there are very few old, bold men." icon_state = "hos" item_state = "gy_suit" - item_color = "hos" /obj/item/clothing/under/rank/security/head_of_security/alt name = "head of security's turtleneck" desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants." icon_state = "hosalt" item_state = "bl_suit" - item_color = "hosalt" /obj/item/clothing/under/rank/security/head_of_security/alt/skirt name = "head of security's turtleneck skirt" desc = "A stylish alternative to the normal head of security jumpsuit, complete with a tactical skirt." icon_state = "hosalt_skirt" item_state = "bl_suit" - item_color = "hosalt_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/security/head_of_security/formal desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security." name = "head of security's formal uniform" icon_state = "hosblueclothes" item_state = "hosblueclothes" - item_color = "hosblueclothes" - alt_covers_chest = TRUE /obj/item/clothing/under/rank/security/head_of_security/parade name = "head of security's parade uniform" desc = "A male head of security's luxury-wear, for special occasions." icon_state = "hos_parade_male" item_state = "r_suit" - item_color = "hos_parade_male" can_adjust = FALSE /obj/item/clothing/under/rank/security/head_of_security/parade/female @@ -218,6 +191,15 @@ desc = "A female head of security's luxury-wear, for special occasions." icon_state = "hos_parade_fem" item_state = "r_suit" - item_color = "hos_parade_fem" fitted = FEMALE_UNIFORM_TOP - can_adjust = FALSE + +/* + *Spacepol + */ + +/obj/item/clothing/under/rank/security/spacepol + name = "police uniform" + desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol." + icon_state = "spacepol" + item_state = "spacepol" + can_adjust = FALSE \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index fb5ff7b0f4..997f10a379 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -2,7 +2,6 @@ name = "red pj's" desc = "Sleepwear." icon_state = "red_pyjamas" - item_color = "red_pyjamas" item_state = "w_suit" can_adjust = FALSE @@ -10,7 +9,6 @@ name = "blue pj's" desc = "Sleepwear." icon_state = "blue_pyjamas" - item_color = "blue_pyjamas" item_state = "w_suit" can_adjust = FALSE @@ -19,7 +17,6 @@ desc = "Motorcycle not included." icon_state = "ek" item_state = "ek" - item_color = "ek" can_adjust = FALSE /obj/item/clothing/under/rank/prisoner @@ -27,7 +24,6 @@ desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "prisoner" item_state = "o_suit" - item_color = "prisoner" has_sensor = LOCKED_SENSORS sensor_mode = SENSOR_COORDS random_sensor = FALSE @@ -37,31 +33,28 @@ desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "prisoner_skirt" item_state = "o_suit" - item_color = "prisoner_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/misc/mailman name = "mailman's jumpsuit" desc = "'Special delivery!'" icon_state = "mailman" item_state = "b_suit" - item_color = "mailman" /obj/item/clothing/under/misc/psyche name = "psychedelic jumpsuit" desc = "Groovy!" icon_state = "psyche" item_state = "p_suit" - item_color = "psyche" /obj/item/clothing/under/misc/vice_officer name = "vice officer's jumpsuit" desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." icon_state = "vice" item_state = "gy_suit" - item_color = "vice" can_adjust = FALSE @@ -69,7 +62,6 @@ name = "administrative cybernetic jumpsuit" icon_state = "syndicate" item_state = "bl_suit" - item_color = "syndicate" desc = "A cybernetically enhanced jumpsuit used for administrative duties." gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 @@ -87,7 +79,6 @@ desc = "Traditional burial garments from the early 22nd century." icon_state = "burial" item_state = "burial" - item_color = "burial" has_sensor = NO_SENSORS /obj/item/clothing/under/misc/overalls @@ -95,7 +86,6 @@ desc = "A set of durable overalls for getting the job done." icon_state = "overalls" item_state = "lb_suit" - item_color = "overalls" can_adjust = FALSE /obj/item/clothing/under/misc/assistantformal @@ -103,24 +93,21 @@ desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown." icon_state = "assistant_formal" item_state = "gy_suit" - item_color = "assistant_formal" can_adjust = FALSE /obj/item/clothing/under/misc/staffassistant name = "staff assistant's jumpsuit" desc = "It's a generic grey jumpsuit. That's about what assistants are worth, anyway." icon = 'goon/icons/obj/item_js_rank.dmi' - alternate_worn_icon = 'goon/icons/mob/worn_js_rank.dmi' + mob_overlay_icon = 'goon/icons/mob/worn_js_rank.dmi' icon_state = "assistant" item_state = "gy_suit" - item_color = "assistant" - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/croptop name = "crop top" desc = "We've saved money by giving you half a shirt!" icon_state = "croptop" - item_color = "croptop" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -130,11 +117,10 @@ desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy." icon_state = "plasmaman" item_state = "plasmaman" - item_color = "plasmaman" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) slowdown = 1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK can_adjust = FALSE strip_delay = 80 var/next_extinguish = 0 @@ -170,7 +156,6 @@ to_chat(user, "You refill the suit's built-in extinguisher, using up the cartridge.") qdel(E) return - return return /obj/item/extinguisher_refill @@ -192,7 +177,6 @@ desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "durathread" item_state = "durathread" - item_color = "durathread" can_adjust = TRUE armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) @@ -203,53 +187,49 @@ item_state = "duraskirt" can_adjust = FALSE body_parts_covered = CHEST|GROIN|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/misc/squatter name = "slav squatter tracksuit" desc = "Cyka blyat." icon_state = "squatteroutfit" item_state = "squatteroutfit" - item_color = "squatteroutfit" can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/misc/blue_camo name = "russian blue camo" desc = "Drop and give me dvadtsat!" icon_state = "russobluecamo" item_state = "russobluecamo" - item_color = "russobluecamo" can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/misc/keyholesweater name = "keyhole sweater" desc = "What is the point of this, anyway?" icon_state = "keyholesweater" item_state = "keyholesweater" - item_color = "keyholesweater" can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/misc/stripper name = "pink stripper outfit" icon_state = "stripper_p" item_state = "stripper_p" - item_color = "stripper_p" body_parts_covered = CHEST|GROIN can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/misc/stripper/green name = "green stripper outfit" icon_state = "stripper_g" item_state = "stripper_g" - item_color = "stripper_g" /obj/item/clothing/under/misc/stripper/mankini name = "pink mankini" icon_state = "mankini" item_state = "mankini" - item_color = "mankini" /obj/item/clothing/under/misc/corporateuniform name = "corporate uniform" @@ -257,82 +237,74 @@ icon_state = "tssuit" item_state = "r_suit" can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/misc/poly_shirt name = "polychromic button-up shirt" desc = "A fancy button-up shirt made with polychromic threads." icon_state = "polysuit" - item_color = "polysuit" item_state = "sl_suit" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#353535" - tertiary_color = "#353535" mutantrace_variation = NONE +/obj/item/clothing/under/misc/poly_shirt/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#353535", "#353535"), 3) + /obj/item/clothing/under/misc/polyshorts name = "polychromic shorts" desc = "For ease of movement and style." icon_state = "polyshorts" - item_color = "polyshorts" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#353535" - secondary_color = "#808080" - tertiary_color = "#808080" can_adjust = FALSE body_parts_covered = CHEST|GROIN|ARMS +/obj/item/clothing/under/misc/polyshorts/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#353535", "#808080", "#808080"), 3) + /obj/item/clothing/under/misc/polyjumpsuit name = "polychromic tri-tone jumpsuit" desc = "A fancy jumpsuit made with polychromic threads." icon_state = "polyjump" - item_color = "polyjump" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#808080" - tertiary_color = "#FF3535" can_adjust = FALSE mutantrace_variation = NONE +/obj/item/clothing/under/misc/polyjumpsuit/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#808080", "#353535"), 3) + /obj/item/clothing/under/misc/poly_bottomless name = "polychromic bottomless shirt" - desc = "Great for showing off your junk in dubious style." + desc = "Great for showing off your underwear in dubious style." icon_state = "polybottomless" - item_color = "polybottomless" item_state = "rainbow" - primary_color = "#808080" - secondary_color = "#FF3535" body_parts_covered = CHEST|ARMS //Because there's no bottom included can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/clothing/under/misc/poly_bottomless/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#808080", "#FF3535"), 2) /obj/item/clothing/under/misc/poly_tanktop name = "polychromic tank top" desc = "For those lazy summer days." icon_state = "polyshimatank" - item_color = "polyshimatank" item_state = "rainbow" - primary_color = "#808080" - secondary_color = "#FFFFFF" - tertiary_color = "#8CC6FF" body_parts_covered = CHEST|GROIN can_adjust = FALSE - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + var/list/poly_states = 3 + var/list/poly_colors = list("#808080", "#FFFFFF", "#8CC6FF") + +/obj/item/clothing/under/misc/poly_tanktop/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, poly_states) /obj/item/clothing/under/misc/poly_tanktop/female name = "polychromic feminine tank top" desc = "Great for showing off your chest in style. Not recommended for males." icon_state = "polyfemtankpantsu" - item_color = "polyfemtankpantsu" - hastertiary = FALSE - primary_color = "#808080" - secondary_color = "#FF3535" + poly_states = 2 + poly_colors = list("#808080", "#FF3535") diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 4b0c92af88..c93cefeae9 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -3,106 +3,91 @@ body_parts_covered = GROIN|LEGS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE //how do they show up on taurs otherwise? /obj/item/clothing/under/pants/classicjeans name = "classic jeans" desc = "You feel cooler already." icon_state = "jeansclassic" - item_color = "jeansclassic" /obj/item/clothing/under/pants/mustangjeans name = "Must Hang jeans" desc = "Made in the finest space jeans factory this side of Alpha Centauri." icon_state = "jeansmustang" - item_color = "jeansmustang" + custom_price = PRICE_ABOVE_NORMAL /obj/item/clothing/under/pants/blackjeans name = "black jeans" desc = "Only for those who can pull it off." icon_state = "jeansblack" - item_color = "jeansblack" /obj/item/clothing/under/pants/youngfolksjeans name = "Young Folks jeans" desc = "For those tired of boring old jeans. Relive the passion of your youth!" icon_state = "jeansyoungfolks" - item_color = "jeansyoungfolks" /obj/item/clothing/under/pants/white name = "white pants" desc = "Plain white pants. Boring." icon_state = "whitepants" - item_color = "whitepants" /obj/item/clothing/under/pants/red name = "red pants" desc = "Bright red pants. Overflowing with personality." icon_state = "redpants" - item_color = "redpants" /obj/item/clothing/under/pants/black name = "black pants" desc = "These pants are dark, like your soul." icon_state = "blackpants" - item_color = "blackpants" /obj/item/clothing/under/pants/tan name = "tan pants" desc = "Some tan pants. You look like a white collar worker with these on." icon_state = "tanpants" - item_color = "tanpants" /obj/item/clothing/under/pants/track name = "track pants" desc = "A pair of track pants, for the athletic." icon_state = "trackpants" - item_color = "trackpants" /obj/item/clothing/under/pants/jeans name = "jeans" desc = "A nondescript pair of tough blue jeans." icon_state = "jeans" - item_color = "jeans" /obj/item/clothing/under/pants/khaki name = "khaki pants" desc = "A pair of dust beige khaki pants." icon_state = "khaki" - item_color = "khaki" /obj/item/clothing/under/pants/camo name = "camo pants" desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station." icon_state = "camopants" - item_color = "camopants" /obj/item/clothing/under/pants/jeanripped name = "ripped jeans" desc = "If you're wearing this you're poor or a rebel" icon_state = "jean_ripped" - item_color = "jean_ripped" /obj/item/clothing/under/pants/jeanshort name = "jean shorts" desc = "These are really just jeans cut in half" icon_state = "jean_shorts" - item_color = "jean_shorts" /obj/item/clothing/under/pants/denimskirt name = "denim skirt" desc = "These are really just a jean leg hole cut from a pair" icon_state = "denim_skirt" - item_color = "denim_skirt" /obj/item/clothing/under/pants/chaps name = "black chaps" body_parts_covered = LEGS desc = "Yeehaw" icon_state = "chaps" - item_color = "chaps" /obj/item/clothing/under/pants/yoga name = "yoga pants" desc = "Comfy!" icon_state = "yoga_pants" - item_color = "yoga_pants" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index b66df87347..426e0e28d9 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -5,57 +5,50 @@ body_parts_covered = GROIN fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + mutantrace_variation = STYLE_DIGITIGRADE //how do they show up on taurs otherwise? /obj/item/clothing/under/shorts/red name = "red athletic shorts" icon_state = "redshorts" - item_color = "redshorts" /obj/item/clothing/under/shorts/green name = "green athletic shorts" icon_state = "greenshorts" - item_color = "greenshorts" /obj/item/clothing/under/shorts/blue name = "blue athletic shorts" icon_state = "blueshorts" - item_color = "blueshorts" /obj/item/clothing/under/shorts/black name = "black athletic shorts" icon_state = "blackshorts" - item_color = "blackshorts" /obj/item/clothing/under/shorts/grey name = "grey athletic shorts" icon_state = "greyshorts" - item_color = "greyshorts" /obj/item/clothing/under/shorts/purple name = "purple athletic shorts" icon_state = "purpleshorts" - item_color = "purpleshorts" /obj/item/clothing/under/shorts/polychromic name = "polychromic athletic shorts" desc = "95% Polychrome, 5% Spandex!" icon_state = "polyshortpants" - item_color = "polyshortpants" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" mutantrace_variation = NONE + var/list/poly_colors = list("#FFFFFF", "#F08080") + +/obj/item/clothing/under/shorts/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 2) /obj/item/clothing/under/shorts/polychromic/pantsu name = "polychromic panties" desc = "Topless striped panties. Now with 120% more polychrome!" icon_state = "polypantsu" - item_color = "polypantsu" item_state = "rainbow" - hastertiary = FALSE - primary_color = "#FFFFFF" - secondary_color = "#8CC6FF" body_parts_covered = GROIN - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + + poly_colors = list("#FFFFFF", "#8CC6FF") diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 02c2b06546..e1212cf337 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -1,9 +1,10 @@ +/obj/item/clothing/under/dress + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/dress/skirt name = "black skirt" desc = "A black skirt, very fancy!" icon_state = "blackskirt" - item_color = "blackskirt" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -12,7 +13,6 @@ name = "blue skirt" desc = "A blue, casual skirt." icon_state = "blueskirt" - item_color = "blueskirt" item_state = "b_suit" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP @@ -22,7 +22,6 @@ name = "red skirt" desc = "A red, casual skirt." icon_state = "redskirt" - item_color = "redskirt" item_state = "r_suit" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP @@ -32,7 +31,6 @@ name = "purple skirt" desc = "A purple, casual skirt." icon_state = "purpleskirt" - item_color = "purpleskirt" item_state = "p_suit" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP @@ -43,7 +41,6 @@ desc = "Makes you want to frolic in a field of daisies." icon_state = "sundress" item_state = "sundress" - item_color = "sundress" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -51,13 +48,11 @@ /obj/item/clothing/under/dress/sundress/white name = "white sundress" icon_state = "sundress_white" - item_color = "sundress_white" /obj/item/clothing/under/dress/green name = "green dress" desc = "A tight green dress" icon_state = "dress_green" - item_color = "dress_green" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -66,7 +61,6 @@ name = "pink dress" desc = "A tight pink dress" icon_state = "dress_pink" - item_color = "dress_pink" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -76,7 +70,6 @@ desc = "Filled with Latin fire." icon_state = "black_tango" item_state = "wcoat" - item_color = "black_tango" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -85,7 +78,6 @@ desc = "Filled with Western fire." icon_state = "western_bustle" item_state = "wcoat" - item_color = "western_bustle" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -94,7 +86,6 @@ desc = "Filled with Latin fire." icon_state = "flamenco" item_state = "wcoat" - item_color = "flamenco" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -103,7 +94,6 @@ desc = "Fashion in space." icon_state = "striped_dress" item_state = "stripeddress" - item_color = "striped_dress" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_FULL can_adjust = FALSE @@ -113,7 +103,6 @@ desc = "Formal wear for a leading lady." icon_state = "sailor_dress" item_state = "sailordress" - item_color = "sailor_dress" body_parts_covered = CHEST|GROIN|ARMS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -123,7 +112,6 @@ desc = "Lovely dress." icon_state = "flower_dress" item_state = "sailordress" - item_color = "flower_dress" body_parts_covered = CHEST|GROIN|LEGS fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -132,7 +120,6 @@ name = "swept skirt" desc = "Formal skirt." icon_state = "skirt_swept" - item_color = "skirt_swept" body_parts_covered = GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -141,7 +128,6 @@ name = "black corset" desc = "Nanotrasen is not resposible for any organ damage." icon_state = "corset" - item_color = "corset" body_parts_covered = CHEST|GROIN fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -151,7 +137,6 @@ desc = "Fancy dress for space bar singers." icon_state = "red_evening_gown" item_state = "redeveninggown" - item_color = "red_evening_gown" fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE @@ -160,7 +145,6 @@ desc = "A preppy red skirt with a white blouse." icon_state = "plaid_red" item_state = "plaid_red" - item_color = "plaid_red" fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE @@ -170,7 +154,6 @@ desc = "A preppy blue skirt with a white blouse." icon_state = "plaid_blue" item_state = "plaid_blue" - item_color = "plaid_blue" fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE @@ -180,7 +163,6 @@ desc = "A preppy purple skirt with a white blouse." icon_state = "plaid_purple" item_state = "plaid_purple" - item_color = "plaid_purple" fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE @@ -190,7 +172,6 @@ desc = "A preppy green skirt with a white blouse." icon_state = "plaid_green" item_state = "plaid_green" - item_color = "plaid_green" fitted = FEMALE_UNIFORM_TOP can_adjust = TRUE alt_covers_chest = TRUE @@ -200,60 +181,47 @@ desc = "A white wedding gown made from the finest silk." icon_state = "bride_white" item_state = "bride_white" - item_color = "bride_white" can_adjust = FALSE - mutantrace_variation = NONE /obj/item/clothing/under/dress/wedding/orange name = "orange wedding dress" desc = "A big and puffy orange dress." icon_state = "bride_orange" item_state = "bride_orange" - item_color = "bride_orange" /obj/item/clothing/under/dress/wedding/purple name = "purple wedding dress" desc = "A big and puffy purple dress." icon_state = "bride_purple" item_state = "bride_purple" - item_color = "bride_purple" /obj/item/clothing/under/dress/wedding/blue name = "blue wedding dress" desc = "A big and puffy blue dress." icon_state = "bride_blue" item_state = "bride_blue" - item_color = "bride_blue" /obj/item/clothing/under/dress/wedding/red name = "red wedding dress" desc = "A big and puffy red dress." icon_state = "bride_red" item_state = "bride_red" - item_color = "bride_red" /obj/item/clothing/under/dress/skirt/polychromic name = "polychromic skirt" desc = "A fancy skirt made with polychromic threads." icon_state = "polyskirt" - item_color = "polyskirt" item_state = "rainbow" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#F08080" - tertiary_color = "#808080" - mutantrace_variation = NONE + var/list/poly_colors = list("#FFFFFF", "#F08080", "#808080") + +/obj/item/clothing/under/dress/skirt/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 3) /obj/item/clothing/under/dress/skirt/polychromic/pleated name = "polychromic pleated skirt" desc = "A magnificent pleated skirt complements the woolen polychromatic sweater." icon_state = "polypleat" - item_color = "polypleat" item_state = "rainbow" - primary_color = "#8CC6FF" - secondary_color = "#808080" - tertiary_color = "#FF3535" body_parts_covered = CHEST|GROIN|ARMS - mutantrace_variation = NONE + poly_colors = list("#8CC6FF", "#808080", "#FF3535") diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 1b99fbc549..fe23003b38 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -4,7 +4,6 @@ desc = "A white suit, suitable for an excellent host." icon_state = "scratch" item_state = "scratch" - item_color = "scratch" can_adjust = FALSE /obj/item/clothing/under/suit/white_on_white/skirt @@ -12,16 +11,15 @@ desc = "A white suitskirt, suitable for an excellent host." icon_state = "white_suit_skirt" item_state = "scratch" - item_color = "white_suit_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/suit/sl desc = "It's a very amish looking suit." name = "amish suit" icon_state = "sl_suit" - item_color = "sl_suit" can_adjust = FALSE /obj/item/clothing/under/suit/waiter @@ -29,7 +27,6 @@ desc = "It's a very smart uniform with a special pocket for tip." icon_state = "waiter" item_state = "waiter" - item_color = "waiter" can_adjust = FALSE /obj/item/clothing/under/suit/black @@ -37,7 +34,6 @@ desc = "A black suit and red tie. Very formal." icon_state = "black_suit" item_state = "bl_suit" - item_color = "black_suit" can_adjust = FALSE /obj/item/clothing/under/suit/black_really @@ -45,21 +41,18 @@ desc = "A formal black suit and red tie, intended for the station's finest." icon_state = "really_black_suit" item_state = "bl_suit" - item_color = "really_black_suit" /obj/item/clothing/under/suit/black/skirt name = "executive suit" desc = "A formal trouser suit for women, intended for the station's finest." icon_state = "black_suit_fem" item_state = "black_suit_fem" - item_color = "black_suit_fem" /obj/item/clothing/under/suit/green name = "green suit" desc = "A green suit and yellow necktie. Baller." icon_state = "green_suit" item_state = "dg_suit" - item_color = "green_suit" can_adjust = FALSE /obj/item/clothing/under/suit/red @@ -67,49 +60,42 @@ desc = "A red suit and blue tie. Somewhat formal." icon_state = "red_suit" item_state = "r_suit" - item_color = "red_suit" /obj/item/clothing/under/suit/charcoal name = "charcoal suit" desc = "A charcoal suit and red tie. Very professional." icon_state = "charcoal_suit" item_state = "charcoal_suit" - item_color = "charcoal_suit" /obj/item/clothing/under/suit/navy name = "navy suit" desc = "A navy suit and red tie, intended for the station's finest." icon_state = "navy_suit" item_state = "navy_suit" - item_color = "navy_suit" /obj/item/clothing/under/suit/burgundy name = "burgundy suit" desc = "A burgundy suit and black tie. Somewhat formal." icon_state = "burgundy_suit" item_state = "burgundy_suit" - item_color = "burgundy_suit" /obj/item/clothing/under/suit/checkered name = "checkered suit" desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" icon_state = "checkered_suit" item_state = "checkered_suit" - item_color = "checkered_suit" /obj/item/clothing/under/suit/tan name = "tan suit" desc = "A tan suit with a yellow tie. Smart, but casual." icon_state = "tan_suit" item_state = "tan_suit" - item_color = "tan_suit" /obj/item/clothing/under/suit/white name = "white suit" desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!" icon_state = "white_suit" item_state = "white_suit" - item_color = "white_suit" /obj/item/clothing/under/suit/telegram name = "telegram suit" @@ -123,13 +109,10 @@ name = "polychromic suit" desc = "For when you want to show off your horrible colour coordination skills." icon_state = "polysuit" - item_color = "polysuit" item_state = "sl_suit" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" - secondary_color = "#FFFFFF" - tertiary_color = "#808080" can_adjust = FALSE mutantrace_variation = NONE + +/obj/item/clothing/under/suit/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#FFFFFF", "#FFFFFF", "#808080"), 3) diff --git a/code/modules/clothing/under/sweaters.dm b/code/modules/clothing/under/sweaters.dm index 13f336bfbd..2f6226c0f2 100644 --- a/code/modules/clothing/under/sweaters.dm +++ b/code/modules/clothing/under/sweaters.dm @@ -3,39 +3,31 @@ desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north." icon_state = "bb_turtle" item_state = "w_suit" - item_color = "bb_turtle" body_parts_covered = CHEST|GROIN|ARMS can_adjust = TRUE - icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi' - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/sweater/black name = "black sweater" icon_state = "bb_turtleblk" item_state = "bl_suit" - item_color = "bb_turtleblk" /obj/item/clothing/under/sweater/purple name = "purple sweater" icon_state = "bb_turtlepur" item_state = "p_suit" - item_color = "bb_turtlepur" /obj/item/clothing/under/sweater/green name = "green sweater" icon_state = "bb_turtlegrn" item_state = "g_suit" - item_color = "bb_turtlegrn" /obj/item/clothing/under/sweater/red name = "red sweater" icon_state = "bb_turtlered" item_state = "r_suit" - item_color = "bb_turtlered" /obj/item/clothing/under/sweater/blue name = "blue sweater" icon_state = "bb_turtleblu" item_state = "b_suit" - item_color = "bb_turtleblu" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 676138d734..8a88e99d05 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -3,7 +3,6 @@ desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants." icon_state = "syndicate" item_state = "bl_suit" - item_color = "syndicate" has_sensor = NO_SENSORS armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE @@ -13,18 +12,17 @@ desc = "A non-descript and slightly suspicious looking skirtleneck." icon_state = "syndicate_skirt" item_state = "bl_suit" - item_color = "syndicate_skirt" has_sensor = NO_SENSORS armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/syndicate/bloodred name = "blood-red sneaksuit" desc = "An insidious armored jumpsuit lined with Syndicate nanofibers and prototype platings, slightly resistant to most forms of damage, but is far too bulky to have anything attached to it. It still counts as stealth if there are no witnesses." icon_state = "bloodred_pajamas" item_state = "bl_suit" - item_color = "bloodred_pajamas" dummy_thick = TRUE armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 50, "acid" = 40) resistance_flags = FIRE_PROOF | ACID_PROOF @@ -35,7 +33,6 @@ desc = "Do operatives dream of nuclear sheep?" icon_state = "bloodred_pajamas" item_state = "bl_suit" - item_color = "bloodred_pajamas" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) /obj/item/clothing/under/syndicate/tacticool @@ -43,7 +40,6 @@ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" item_state = "bl_suit" - item_color = "tactifool" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) /obj/item/clothing/under/syndicate/tacticool/skirt @@ -51,26 +47,23 @@ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool_skirt" item_state = "bl_suit" - item_color = "tactifool_skirt" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) fitted = FEMALE_UNIFORM_TOP + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/syndicate/cosmetic name = "tactitool turtleneck" desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" item_state = "bl_suit" - item_color = "tactifool" has_sensor = TRUE - mutantrace_variation = NONE - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/under/syndicate/sniper name = "Tactical turtleneck suit" desc = "A double seamed tactical turtleneck disguised as a civilian grade silk suit. Intended for the most formal operator. The collar is really sharp." icon_state = "really_black_suit" item_state = "bl_suit" - item_color = "black_suit" can_adjust = FALSE /obj/item/clothing/under/syndicate/camo @@ -78,14 +71,12 @@ desc = "A green military camouflage uniform." icon_state = "camogreen" item_state = "g_suit" - item_color = "camogreen" can_adjust = FALSE /obj/item/clothing/under/syndicate/soviet name = "Ratnik 5 tracksuit" desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." icon_state = "trackpants" - item_color = "trackpants" can_adjust = FALSE armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) resistance_flags = NONE @@ -94,25 +85,25 @@ name = "combat uniform" desc = "With a suit lined with this many pockets, you are ready to operate." icon_state = "syndicate_combat" - item_color = "syndicate_combat" can_adjust = FALSE + mutantrace_variation = USE_TAUR_CLIP_MASK /obj/item/clothing/under/syndicate/rus_army name = "advanced military tracksuit" desc = "Military grade tracksuits for frontline squatting." icon_state = "rus_under" - item_color = "rus_under" can_adjust = FALSE armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) resistance_flags = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/syndicate/baseball name = "major league, number unknown" desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game..." icon_state = "syndicatebaseball" item_state = "syndicatebaseball" - item_color = "syndicatebaseball" has_sensor = NO_SENSORS armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) alt_covers_chest = TRUE + mutantrace_variation = USE_TAUR_CLIP_MASK diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 2fb33d1b19..8b6b8055bd 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -13,14 +13,12 @@ name = "command uniform" desc = "The uniform worn by command officers in the mid 2260s." icon_state = "trek_command" - item_color = "trek_command" item_state = "y_suit" /obj/item/clothing/under/trek/engsec name = "operations uniform" desc = "The uniform worn by operations officers of the mid 2260s. You feel strangely vulnerable just seeing this..." icon_state = "trek_engsec" - item_color = "trek_engsec" item_state = "r_suit" strip_delay = 50 @@ -28,7 +26,6 @@ name = "medsci uniform" desc = "The uniform worn by medsci officers in the mid 2260s." icon_state = "trek_medsci" - item_color = "trek_medsci" item_state = "b_suit" permeability_coefficient = 0.50 @@ -37,38 +34,33 @@ /obj/item/clothing/under/trek/command/next desc = "The uniform worn by command officers. This one's from the mid 2360s." icon_state = "trek_next_command" - item_color = "trek_next_command" item_state = "r_suit" /obj/item/clothing/under/trek/engsec/next desc = "The uniform worn by operation officers. This one's from the mid 2360s." icon_state = "trek_next_engsec" - item_color = "trek_next_engsec" item_state = "y_suit" /obj/item/clothing/under/trek/medsci/next desc = "The uniform worn by medsci officers. This one's from the mid 2360s." icon_state = "trek_next_medsci" - item_color = "trek_next_medsci" + item_state = "b_suit" //ENT /obj/item/clothing/under/trek/command/ent desc = "The uniform worn by command officers of the 2140s." icon_state = "trek_ent_command" - item_color = "trek_ent_command" item_state = "bl_suit" /obj/item/clothing/under/trek/engsec/ent desc = "The uniform worn by operations officers of the 2140s." icon_state = "trek_ent_engsec" - item_color = "trek_ent_engsec" item_state = "bl_suit" /obj/item/clothing/under/trek/medsci/ent desc = "The uniform worn by medsci officers of the 2140s." icon_state = "trek_ent_medsci" - item_color = "trek_ent_medsci" item_state = "bl_suit" @@ -76,40 +68,97 @@ /obj/item/clothing/under/trek/command/voy desc = "The uniform worn by command officers of the 2370s." icon_state = "trek_voy_command" - item_state = "trek_voy_command" + item_state = "r_suit" /obj/item/clothing/under/trek/engsec/voy desc = "The uniform worn by operations officers of the 2370s." icon_state = "trek_voy_engsec" - item_state = "trek_voy_engsec" + item_state = "y_suit" /obj/item/clothing/under/trek/medsci/voy desc = "The uniform worn by medsci officers of the 2370s." icon_state = "trek_voy_medsci" - item_state = "trek_voy_medsci" + item_state = "b_suit" //DS9 /obj/item/clothing/under/trek/command/ds9 desc = "The uniform worn by command officers of the 2380s." icon_state = "trek_ds9_command" - item_state = "trek_ds9_command" + item_state = "r_suit" /obj/item/clothing/under/trek/engsec/ds9 desc = "The uniform worn by operations officers of the 2380s." icon_state = "trek_ds9_engsec" - item_state = "trek_ds9_engsec" + item_state = "y_suit" /obj/item/clothing/under/trek/medsci/ds9 desc = "The uniform undershirt worn by medsci officers of the 2380s." icon_state = "trek_ds9_medsci" - item_state = "trek_ds9_medsci" + item_state = "b_suit" +//Orvilike (Orville-inspired clothing with TOS-like color code) +/obj/item/clothing/under/trek/command/orv + desc = "An uniform worn by command officers since 2420s." + icon_state = "orv_com" + +/obj/item/clothing/under/trek/engsec/orv + desc = "An uniform worn by operations officers since 2420s." + icon_state = "orv_ops" + +/obj/item/clothing/under/trek/medsci/orv + desc = "An uniform worn by medsci officers since 2420s." + icon_state = "orv_medsci" + +//Orvilike Extra (Ditto, but expands it for Civilian department with SS13 colors and gives specified command uniform) +//honestly no idea why i added specified comm. uniforms but w/e +/obj/item/clothing/under/trek/command/orv/captain + name = "captain uniform" + desc = "An uniform worn by captains since 2550s." + icon_state = "orv_com_capt" + +/obj/item/clothing/under/trek/command/orv/engsec + name = "operations command uniform" + desc = "An uniform worn by operations command officers since 2550s." + icon_state = "orv_com_ops" + +/obj/item/clothing/under/trek/command/orv/medsci + name = "medsci command uniform" + desc = "An uniform worn by medsci command officers since 2550s." + icon_state = "orv_com_medsci" + +/obj/item/clothing/under/trek/orv + name = "adjutant uniform" + desc = "An uniform worn by adjutants (assistants) since 2550s." + icon_state = "orv_ass" + item_state = "gy_suit" + +/obj/item/clothing/under/trek/orv/service + name = "service uniform" + desc = "An uniform worn by service officers since 2550s." + icon_state = "orv_srv" + item_state = "g_suit" + +//The Motion Picture +/obj/item/clothing/under/trek/fedutil + name = "federation utility uniform" + desc = "The uniform worn by United Federation enlisted crew members in 2285s." + icon_state = "trek_tmp_enlist" + item_state = "r_suit" + +/obj/item/clothing/under/trek/fedutil/trainee + name = "federation trainee utility uniform" + desc = "The uniform worn by United Federation enlisted trainees in 2285s." + icon_state = "trek_tmp_trainee" + +/obj/item/clothing/under/trek/fedutil/service + name = "federation service uniform" + desc = "The uniform worn by United Federation enlists for service work in 2285s." + icon_state = "trek_tmp_service" //Q /obj/item/clothing/under/trek/Q name = "french marshall's uniform" desc = "Something about it feels off..." icon_state = "trek_Q" - item_color = "trek_Q" item_state = "r_suit" diff --git a/code/modules/economy/_economy.dm b/code/modules/economy/_economy.dm new file mode 100644 index 0000000000..9bafb62eae --- /dev/null +++ b/code/modules/economy/_economy.dm @@ -0,0 +1,2 @@ +/obj/item/proc/get_item_credit_value() + return \ No newline at end of file diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm new file mode 100644 index 0000000000..e8b6498c36 --- /dev/null +++ b/code/modules/economy/account.dm @@ -0,0 +1,120 @@ +#define DUMPTIME 3000 + +/datum/bank_account + var/account_holder = "Rusty Venture" + var/account_balance = 0 + var/datum/job/account_job + var/list/bank_cards = list() + var/add_to_accounts = TRUE + var/transferable = TRUE + var/account_id + var/being_dumped = FALSE //pink levels are rising + var/withdrawDelay = 0 + +/datum/bank_account/New(newname, job) + if(add_to_accounts) + if(!SSeconomy) + log_world("Wack") + SSeconomy.bank_accounts += src + account_holder = newname + account_job = job + account_id = rand(111111,999999) + +/datum/bank_account/Destroy() + if(add_to_accounts) + SSeconomy.bank_accounts -= src + return ..() + +/datum/bank_account/proc/dumpeet() + being_dumped = TRUE + withdrawDelay = world.time + DUMPTIME + +/datum/bank_account/proc/_adjust_money(amt) + account_balance += amt + if(account_balance < 0) + account_balance = 0 + +/datum/bank_account/proc/has_money(amt) + return account_balance >= amt + +/datum/bank_account/proc/adjust_money(amt) + if((amt < 0 && has_money(-amt)) || amt > 0) + _adjust_money(amt) + return TRUE + return FALSE + +/datum/bank_account/proc/transfer_money(datum/bank_account/from, amount) + if(!from.transferable || !from.has_money(amount)) + return FALSE + adjust_money(amount) + from.adjust_money(-amount) + return TRUE + +/datum/bank_account/proc/payday(amt_of_paychecks, free = FALSE) + var/money_to_transfer = account_job.paycheck * amt_of_paychecks + if(free) + adjust_money(money_to_transfer) + else + var/datum/bank_account/D = SSeconomy.get_dep_account(account_job.paycheck_department) + if(D) + if(!transfer_money(D, money_to_transfer)) + bank_card_talk("ERROR: Payday aborted, departmental funds insufficient.") + return FALSE + else + bank_card_talk("Payday processed, account now holds [account_balance] cr.") + return TRUE + bank_card_talk("ERROR: Payday aborted, unable to contact departmental account.") + return FALSE + +/datum/bank_account/proc/bank_card_talk(message, force) + if(!message || !bank_cards.len) + return + for(var/obj/A in bank_cards) + var/icon_source = A + /* + if(istype(A, /obj/item/card/id)) + var/obj/item/card/id/id_card = A + if(id_card.uses_overlays) + icon_source = id_card.get_cached_flat_icon() + */ + var/mob/card_holder = recursive_loc_check(A, /mob) + if(ismob(card_holder)) //If on a mob + if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + return + + card_holder.playsound_local(get_turf(card_holder), 'sound/machines/twobeep.ogg', 50, TRUE) + if(card_holder.can_hear()) + to_chat(card_holder, "[icon2html(icon_source, card_holder)] [message]") + else if(isturf(A.loc)) //If on the ground + for(var/mob/M in hearers(1,get_turf(A))) + if(M.client && !(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force) + return + playsound(A, 'sound/machines/twobeep.ogg', 50, TRUE) + A.audible_message("[icon2html(icon_source, hearers(A))] [message]", null, 1) + break + else + for(var/mob/M in A.loc) //If inside a container with other mobs (e.g. locker) + if(!M.client || (!(M.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + return + M.playsound_local(get_turf(M), 'sound/machines/twobeep.ogg', 50, TRUE) + if(M.can_hear()) + to_chat(M, "[icon2html(icon_source, M)] [message]") + +/datum/bank_account/department + account_holder = "Guild Credit Agency" + var/department_id = "REPLACE_ME" + add_to_accounts = FALSE + +/datum/bank_account/department/New(dep_id, budget) + department_id = dep_id + account_balance = budget + account_holder = SSeconomy.department_accounts[dep_id] + SSeconomy.generated_accounts += src + +/datum/bank_account/remote // Bank account not belonging to the local station + add_to_accounts = FALSE + +/datum/bank_account/remote/non_transferable + transferable = FALSE + +#undef DUMPTIME diff --git a/code/modules/economy/paystand.dm b/code/modules/economy/paystand.dm new file mode 100644 index 0000000000..f674bc230d --- /dev/null +++ b/code/modules/economy/paystand.dm @@ -0,0 +1,138 @@ +/obj/machinery/paystand + name = "unregistered pay stand" + desc = "See title." + icon = 'icons/obj/economy.dmi' + icon_state = "card_scanner" + density = TRUE + anchored = TRUE + var/locked = FALSE + var/obj/item/card/id/my_card + var/obj/item/assembly/signaler/signaler //attached signaler, let people attach signalers that get activated if the user's transaction limit is achieved. + var/signaler_threshold = 0 //signaler threshold amount + var/amount_deposited = 0 //keep track of the amount deposited over time so you can pay multiple times to reach the signaler threshold + var/force_fee = 0 //replaces the "pay whatever" functionality with a set amount when non-zero. + +/obj/machinery/paystand/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/card/id)) + if(W == my_card) + if(user.a_intent == INTENT_DISARM) + var/rename_msg = stripped_input(user, "Rename the Paystand:", "Paystand Naming", name) + if(!rename_msg || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + name = rename_msg + return + else if(user.a_intent == INTENT_GRAB) + var/force_fee_input = input(user,"Set the fee!","Set a fee!",0) as num|null + if(isnull(force_fee_input) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + force_fee = force_fee_input + return + locked = !locked + to_chat(user, "You [src.locked ? "lock" : "unlock"] the paystand, protecting the bolts from [anchored ? "loosening" : "tightening"].") + return + if(!my_card) + var/obj/item/card/id/assistant_mains_need_to_die = W + if(!assistant_mains_need_to_die.registered_account) + return + var/msg = stripped_input(user, "Name of pay stand:", "Paystand Naming", "[user]'s Awesome Paystand") + if(!msg) + return + name = msg + desc = "Owned by [assistant_mains_need_to_die.registered_account.account_holder], pays directly into [user.p_their()] account." + my_card = assistant_mains_need_to_die + to_chat(user, "You link the stand to your account.") + return + var/obj/item/card/id/vbucks = W + if(vbucks.registered_account) + var/momsdebitcard = 0 + if(!force_fee) + momsdebitcard = input(user, "How much would you like to deposit?", "Money Deposit") as null|num + else + momsdebitcard = force_fee + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(momsdebitcard < 1) + to_chat(user, "ERROR: Invalid amount designated.") + return + if(vbucks.registered_account.adjust_money(-momsdebitcard)) + purchase(vbucks.registered_account.account_holder, momsdebitcard) + to_chat(user, "Thanks for purchasing! The vendor has been informed.") + return + else + to_chat(user, "ERROR: Account has insufficient funds to make transaction.") + return + else + to_chat(user, "ERROR: No bank account assigned to identification card.") + return + if(istype(W, /obj/item/holochip)) + var/obj/item/holochip/H = W + var/cashmoney = input(user, "How much would you like to deposit?", "Money Deposit") as null|num + if(H.spend(cashmoney, FALSE)) + purchase(user, cashmoney) + to_chat(user, "Thanks for purchasing! The vendor has been informed.") + return + else + to_chat(user, "ERROR: Insufficient funds to make transaction.") + return + if(istype(W, /obj/item/stack/spacecash)) + to_chat(user, "What is this, the 2000s? We only take card here.") + return + if(istype(W, /obj/item/coin)) + to_chat(user, "What is this, the 1800s? We only take card here.") + return + if(istype(W, /obj/item/assembly/signaler)) + var/obj/item/assembly/signaler/S = W + if(S.secured) + to_chat(user, "The signaler needs to be in attachable mode to add it to the paystand!") + return + if(!my_card) + to_chat(user, "ERROR: No identification card has been assigned to this paystand yet!") + return + if(!signaler) + var/cash_limit = input(user, "Enter the minimum amount of cash needed to deposit before the signaler is activated.", "Signaler Activation Threshold") as null|num + if(cash_limit < 1) + to_chat(user, "ERROR: Invalid amount designated.") + return + if(cash_limit) + S.forceMove(src) + signaler = S + signaler_threshold = cash_limit + to_chat(user, "You attach the signaler to the paystand.") + desc += " A signaler appears to be attached to the scanner." + else + to_chat(user, "A signaler is already attached to this unit!") + + if(default_deconstruction_screwdriver(user, "card_scanner", "card_scanner", W)) + return + + else if(default_pry_open(W)) + return + + else if(default_unfasten_wrench(user, W)) + return + + else if(default_deconstruction_crowbar(W)) + return + else + return ..() + +/obj/machinery/paystand/proc/purchase(buyer, price) + my_card.registered_account.adjust_money(price) + my_card.registered_account.bank_card_talk("Purchase made at your vendor by [buyer] for [price] credits.") + amount_deposited = amount_deposited + price + if(signaler && amount_deposited >= signaler_threshold) + signaler.activate() + amount_deposited = 0 + +/obj/machinery/paystand/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + if(locked) + to_chat(user, "The bolts on this paystand are currently covered!") + return FALSE + . = ..() + +/obj/machinery/paystand/examine(mob/user) + . = ..() + if(force_fee) + . += "This paystand forces a payment of [force_fee] credit\s per swipe instead of a variable amount." + if(user.get_active_held_item() == my_card) + . += "Paystands can be edited through swiping your card with different intents. Disarm allows editing the name while Grab changes payment functionality." diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm new file mode 100644 index 0000000000..9e8c7e483e --- /dev/null +++ b/code/modules/events/brain_trauma.dm @@ -0,0 +1,33 @@ +/datum/round_event_control/brain_trauma + name = "Spontaneous Brain Trauma" + typepath = /datum/round_event/brain_trauma + weight = 25 + +/datum/round_event/brain_trauma + fakeable = FALSE + +/datum/round_event/brain_trauma/start() + for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) + if(!H.client) + continue + if(H.stat == DEAD) // What are you doing in this list + continue + if(!H.getorgan(/obj/item/organ/brain)) // If only I had a brain + continue + + traumatize(H) + break + +/datum/round_event/brain_trauma/proc/traumatize(mob/living/carbon/human/H) + var/resistance = pick( + 65;TRAUMA_RESILIENCE_BASIC, + 30;TRAUMA_RESILIENCE_SURGERY, + 5;TRAUMA_RESILIENCE_LOBOTOMY) + + var/trauma_type = pickweight(list( + BRAIN_TRAUMA_MILD = 60, + BRAIN_TRAUMA_SEVERE = 30, + BRAIN_TRAUMA_SPECIAL = 10 + )) + + H.gain_trauma_type(trauma_type, resistance) \ No newline at end of file diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm new file mode 100644 index 0000000000..77520198e8 --- /dev/null +++ b/code/modules/events/fake_virus.dm @@ -0,0 +1,30 @@ +/datum/round_event_control/fake_virus + name = "Fake Virus" + typepath = /datum/round_event/fake_virus + weight = 20 + +/datum/round_event/fake_virus/start() + var/list/fake_virus_victims = list() + for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) + if(!H.client || H.stat == DEAD || H.InCritical()) + continue + fake_virus_victims += H + + //first we do hard status effect victims + var/defacto_min = min(3, LAZYLEN(fake_virus_victims)) + if(defacto_min)// event will hit 1-3 people by default, but will do 1-2 or just 1 if only those many candidates are available + for(var/i=1; i<=rand(1,defacto_min); i++) + var/mob/living/carbon/human/hypochondriac = pick(fake_virus_victims) + hypochondriac.apply_status_effect(STATUS_EFFECT_FAKE_VIRUS) + fake_virus_victims -= hypochondriac + + //then we do light one-message victims who simply cough or whatever once (have to repeat the process since the last operation modified our candidates list) + defacto_min = min(5, LAZYLEN(fake_virus_victims)) + if(defacto_min) + for(var/i=1; i<=rand(1,defacto_min); i++) + var/mob/living/carbon/human/onecoughman = pick(fake_virus_victims) + if(prob(25))//1/4 odds to get a spooky message instead of coughing out loud + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, onecoughman, "[pick("Your head hurts.", "Your head pounds.")]"), rand(30,150)) + else + addtimer(CALLBACK(onecoughman, .mob/proc/emote, pick("cough", "sniff", "sneeze")), rand(30,150))//deliver the message with a slightly randomized time interval so there arent multiple people coughing at the exact same time + fake_virus_victims -= onecoughman diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm new file mode 100644 index 0000000000..7b4628f135 --- /dev/null +++ b/code/modules/events/fugitive_spawning.dm @@ -0,0 +1,117 @@ +/datum/round_event_control/fugitives + name = "Spawn Fugitives" + typepath = /datum/round_event/ghost_role/fugitives + max_occurrences = 1 + min_players = 20 + earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. + gamemode_blacklist = list("nuclear") + +/datum/round_event/ghost_role/fugitives + minimum_required = 1 + role_name = "fugitive" + fakeable = FALSE + +/datum/round_event/ghost_role/fugitives/spawn_role() + var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos + for(var/turf/X in GLOB.xeno_spawn) + if(istype(X.loc, /area/maintenance)) + possible_spawns += X + if(!possible_spawns.len) + message_admins("No valid spawn locations found, aborting...") + return MAP_ERROR + var/turf/landing_turf = pick(possible_spawns) + var/list/possible_backstories = list() + var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR) + if(candidates.len >= 1) //solo refugees + if(prob(30)) + possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering + else //For accurate deadchat feedback + minimum_required = 4 + if(candidates.len >= 4)//group refugees + possible_backstories.Add("prisoner", "cultist", "synth") + if(!possible_backstories.len) + return NOT_ENOUGH_PLAYERS + + var/backstory = pick(possible_backstories) + var/member_size = 3 + var/leader + switch(backstory) + if("synth") + leader = pick_n_take(candidates) + if("waldo") + member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later + var/list/members = list() + var/list/spawned_mobs = list() + if(isnull(leader)) + member_size++ //if there is no leader role, then the would be leader is a normal member of the team. + + for(var/i in 1 to member_size) + members += pick_n_take(candidates) + + for(var/mob/dead/selected in members) + var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory) + spawned_mobs += S + if(!isnull(leader)) + gear_fugitive_leader(leader, landing_turf, backstory) + +//after spawning + playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE) + new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint + addtimer(CALLBACK(src, .proc/spawn_hunters), 10 MINUTES) + role_name = "fugitive hunter" + return SUCCESSFUL_SPAWN + +/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive + var/datum/mind/player_mind = new /datum/mind(selected.key) + player_mind.active = TRUE + var/mob/living/carbon/human/S = new(landing_turf) + player_mind.transfer_to(S) + player_mind.assigned_role = "Fugitive" + player_mind.special_role = "Fugitive" + player_mind.add_antag_datum(/datum/antagonist/fugitive) + var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive) + INVOKE_ASYNC(fugitiveantag, /datum/antagonist/fugitive.proc/greet, backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff + + switch(backstory) + if("prisoner") + S.equipOutfit(/datum/outfit/prisoner) + if("cultist") + S.equipOutfit(/datum/outfit/yalp_cultist) + if("waldo") + S.equipOutfit(/datum/outfit/waldo) + if("synth") + S.equipOutfit(/datum/outfit/synthetic) + message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.") + log_game("[key_name(S)] was spawned as a Fugitive by an event.") + spawned_mobs += S + return S + + //special spawn for one member. it can be used for a special mob or simply to give one normal member special items. +/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory) + var/datum/mind/player_mind = new /datum/mind(leader.key) + player_mind.active = TRUE + //if you want to add a fugitive with a special leader in the future, make this switch with the backstory + var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory) + var/obj/item/choice_beacon/augments/A = new(S) + S.put_in_hands(A) + new /obj/item/autosurgeon(landing_turf) + +//security team gets called in after 10 minutes of prep to find the refugees +/datum/round_event/ghost_role/fugitives/proc/spawn_hunters() + var/backstory = pick("space cop", "russian", "bounty hunter") + var/datum/map_template/shuttle/ship + if(backstory == "space cop") + ship = new /datum/map_template/shuttle/hunter/space_cop + else if (backstory == "russian") + ship = new /datum/map_template/shuttle/hunter/russian + else + ship = new /datum/map_template/shuttle/hunter/bounty + var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) + var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) + var/z = SSmapping.empty_space.z_value + var/turf/T = locate(x,y,z) + if(!T) + CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in") + if(!ship.load(T)) + CRASH("Loading [backstory] ship failed!") + priority_announce("Unidentified ship detected near the station.") diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 7fca4188b7..6ef693a886 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -19,6 +19,8 @@ var/list/spawn_locs = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) spawn_locs += L.loc + for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list) + spawn_locs += L.loc if(!spawn_locs.len) return MAP_ERROR diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 86ff1ed0da..b0b12f3944 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -29,7 +29,9 @@ if(fake) return threat_message = new - payoff = round(SSshuttle.points * 0.80) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + payoff = round(D.account_balance * 0.80) threat_message.title = "Business proposition" threat_message.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank." threat_message.possible_answers = list("We'll pay.","No way.") @@ -38,13 +40,14 @@ /datum/round_event/pirates/proc/answered() if(threat_message && threat_message.answered == 1) - if(SSshuttle.points >= payoff) - SSshuttle.points -= payoff - priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name) - paid_off = TRUE - return - else - priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + if(D.adjust_money(-payoff)) + priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name) + paid_off = TRUE + return + else + priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name) if(!shuttle_spawned) spawn_shuttle() @@ -58,6 +61,9 @@ var/list/candidates = pollGhostCandidates("Do you wish to be considered for pirate crew?", ROLE_TRAITOR) shuffle_inplace(candidates) + if(!SSmapping.empty_space) + SSmapping.empty_space = SSmapping.add_new_zlevel("Empty Area For Pirates", list(ZTRAIT_LINKAGE = SELFLOOPING)) + var/datum/map_template/shuttle/pirate/default/ship = new var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) @@ -101,9 +107,10 @@ /obj/machinery/shuttle_scrambler/process() if(active) if(is_station_level(z)) - var/siphoned = min(SSshuttle.points,siphon_per_tick) - SSshuttle.points -= siphoned - credits_stored += siphoned + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + var/siphoned = min(D.account_balance,siphon_per_tick) + D.adjust_money(-siphoned) interrupt_research() else return @@ -139,12 +146,7 @@ new /obj/effect/temp_visual/emp(get_turf(S)) /obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) - if(credits_stored < 200) - to_chat(user,"Not enough credits to retrieve.") - return - while(credits_stored >= 200) - new /obj/item/stack/spacecash/c200(drop_location()) - credits_stored -= 200 + new /obj/item/holochip(drop_location(), credits_stored) to_chat(user,"You retrieve the siphoned credits!") credits_stored = 0 @@ -157,11 +159,12 @@ active = FALSE STOP_PROCESSING(SSobj,src) -/obj/machinery/shuttle_scrambler/update_icon_state() +/obj/machinery/shuttle_scrambler/update_overlays() + . = ..() if(active) - icon_state = "dominator-blue" - else - icon_state = "dominator" + var/mutable_appearance/M = mutable_appearance(icon, "dominator-overlay") + M.color = "#00FFFF" + . += M /obj/machinery/shuttle_scrambler/Destroy() toggle_off() @@ -456,3 +459,12 @@ /datum/export/pirate/cash/get_amount(obj/O) var/obj/item/stack/spacecash/C = O return ..() * C.amount * C.value + +/datum/export/pirate/holochip + cost = 1 + unit_name = "holochip" + export_types = list(/obj/item/holochip) + +/datum/export/pirate/holochip/get_cost(atom/movable/AM) + var/obj/item/holochip/H = AM + return H.credits diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 8fe68f509b..ba14a5307f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -9,6 +9,8 @@ role_name = "random animal" var/animals = 1 var/one = "one" + /// Blacklisted mob_biotypes - Hey can we like, not have player controlled megafauna? + var/blacklisted_biotypes = MOB_EPIC fakeable = TRUE /datum/round_event/ghost_role/sentience/announce(fake) @@ -33,6 +35,8 @@ var/turf/T = get_turf(L) if(!T || !is_station_level(T.z)) continue + if(L.mob_biotypes & blacklisted_biotypes) //hey can you don't + continue if(!(L in GLOB.player_list) && !L.mind) potential += L @@ -50,7 +54,7 @@ SG.transfer_ckey(SA, FALSE) - SA.grant_all_languages(TRUE) + SA.grant_all_languages(TRUE, FALSE, FALSE) SA.sentience_act() diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index c585961604..bf9f25cb04 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -69,7 +69,9 @@ priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") dispatched = 1 - SSshuttle.points += bonus_points + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(bonus_points) endWhen = activeFor + 1 SSshuttle.supply.mode = SHUTTLE_CALL diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 9c9b131f48..85bcf4959d 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -22,7 +22,8 @@ if(turfs.len) //Pick a turf to spawn at if we can var/turf/T = pick(turfs) - new /datum/spacevine_controller(T) //spawn a controller at turf + new /datum/spacevine_controller(T, list(pick(subtypesof(/datum/spacevine_mutation))), rand(30,100), rand(5,10), src) //spawn a controller at turf with randomized stats and a single random mutation + /datum/spacevine_mutation @@ -227,13 +228,13 @@ quality = NEGATIVE /datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser) - if(prob(severity) && istype(crosser) && !isvineimmune(holder)) + if(prob(severity) && istype(crosser) && !isvineimmune(crosser)) var/mob/living/M = crosser M.adjustBruteLoss(5) to_chat(M, "You cut yourself on the thorny vines.") /datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(prob(severity) && istype(hitter) && !isvineimmune(holder)) + if(prob(severity) && istype(hitter) && !isvineimmune(hitter)) var/mob/living/M = hitter M.adjustBruteLoss(5) to_chat(M, "You cut yourself on the thorny vines.") @@ -251,7 +252,7 @@ holder.obj_integrity = holder.max_integrity /datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(I.get_sharpness()) + if(I?.get_sharpness()) . = expected_damage * 0.5 else . = expected_damage @@ -329,8 +330,8 @@ if(!override) qdel(src) -/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user) - var/damage_dealt = I.force +/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + var/damage_dealt = I.force * damage_multiplier if(I.get_sharpness()) damage_dealt *= 4 if(I.damtype == BURN) @@ -344,16 +345,17 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src, 'sound/weapons/slash.ogg', 50, 1) + playsound(src, 'sound/weapons/slash.ogg', 50, TRUE) else - playsound(src, 'sound/weapons/tap.ogg', 50, 1) + playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) -/obj/structure/spacevine/Crossed(mob/crosser) - if(isliving(crosser)) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_cross(src, crosser) +/obj/structure/spacevine/Crossed(atom/movable/AM) + if(!isliving(AM)) + return + for(var/datum/spacevine_mutation/SM in mutations) + SM.on_cross(src, AM) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/spacevine/attack_hand(mob/user) @@ -378,7 +380,7 @@ var/list/vine_mutations_list var/mutativeness = 1 -/datum/spacevine_controller/New(turf/location, list/muts, potency, production) +/datum/spacevine_controller/New(turf/location, list/muts, potency, production, datum/round_event/event = null) vines = list() growth_queue = list() spawn_spacevine_piece(location, null, muts) @@ -393,17 +395,13 @@ /datum/spacevine_controller/vv_get_dropdown() . = ..() - . += "---" - .["Delete Vines"] = "?_src_=[REF(src)];[HrefToken()];purge_vines=1" + VV_DROPDOWN_OPTION(VV_HK_SPACEVINE_PURGE, "Delete Vines") -/datum/spacevine_controller/Topic(href, href_list) - if(..() || !check_rights(R_ADMIN, FALSE) || !usr.client.holder.CheckAdminHref(href, href_list)) - return - - if(href_list["purge_vines"]) - if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") != "Yes") - return - DeleteVines() +/datum/spacevine_controller/vv_do_topic(href_list) + . = ..() + if(href_list[VV_HK_SPACEVINE_PURGE]) + if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") == "Yes") + DeleteVines() /datum/spacevine_controller/proc/DeleteVines() //this is kill QDEL_LIST(vines) //this will also qdel us @@ -420,7 +418,6 @@ if(muts && muts.len) for(var/datum/spacevine_mutation/M in muts) M.add_mutation_to_vinepiece(SV) - return if(parent) SV.mutations |= parent.mutations var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY] @@ -432,6 +429,7 @@ for(var/datum/spacevine_mutation/SM in SV.mutations) SM.on_birth(SV) location.Entered(SV) + return SV /datum/spacevine_controller/proc/VineDestroyed(obj/structure/spacevine/S) S.master = null @@ -535,14 +533,13 @@ qdel(src) /obj/structure/spacevine/CanPass(atom/movable/mover, turf/target) + . = ..() if(isvineimmune(mover)) - . = TRUE - else - . = ..() + return TRUE /proc/isvineimmune(atom/A) - . = FALSE if(isliving(A)) var/mob/living/M = A if(("vines" in M.faction) || ("plants" in M.faction)) - . = TRUE + return TRUE + return FALSE diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm new file mode 100644 index 0000000000..43c51fd5c8 --- /dev/null +++ b/code/modules/events/stray_cargo.dm @@ -0,0 +1,99 @@ +///Spawns a cargo pod containing a random cargo supply pack on a random area of the station +/datum/round_event_control/stray_cargo + name = "Stray Cargo Pod" + typepath = /datum/round_event/stray_cargo + weight = 20 + max_occurrences = 4 + earliest_start = 10 MINUTES + +///Spawns a cargo pod containing a random cargo supply pack on a random area of the station +/datum/round_event/stray_cargo + var/area/impact_area ///Randomly picked area + var/list/possible_pack_types = list() ///List of possible supply packs dropped in the pod, if empty picks from the cargo list + var/static/list/stray_spawnable_supply_packs = list() ///List of default spawnable supply packs, filtered from the cargo list + +/datum/round_event/stray_cargo/announce(fake) + priority_announce("Stray cargo pod detected on long-range scanners. Expected location of impact: [impact_area.name].", "Collision Alert") + +/** +* Tries to find a valid area, throws an error if none are found +* Also randomizes the start timer +*/ +/datum/round_event/stray_cargo/setup() + startWhen = rand(20, 40) + impact_area = find_event_area() + if(!impact_area) + CRASH("No valid areas for cargo pod found.") + var/list/turf_test = get_area_turfs(impact_area) + if(!turf_test.len) + CRASH("Stray Cargo Pod : No valid turfs found for [impact_area] - [impact_area.type]") + + if(!stray_spawnable_supply_packs.len) + stray_spawnable_supply_packs = SSshuttle.supply_packs.Copy() + for(var/pack in stray_spawnable_supply_packs) + var/datum/supply_pack/pack_type = pack + if(initial(pack_type.special)) + stray_spawnable_supply_packs -= pack + +///Spawns a random supply pack, puts it in a pod, and spawns it on a random tile of the selected area +/datum/round_event/stray_cargo/start() + var/list/turf/valid_turfs = get_area_turfs(impact_area) + //Only target non-dense turfs to prevent wall-embedded pods + for(var/i in valid_turfs) + var/turf/T = i + if(T.density) + valid_turfs -= T + var/turf/LZ = pick(valid_turfs) + var/pack_type + if(possible_pack_types.len) + pack_type = pick(possible_pack_types) + else + pack_type = pick(stray_spawnable_supply_packs) + var/datum/supply_pack/SP = new pack_type + var/obj/structure/closet/crate/crate = SP.generate(null) + crate.locked = FALSE //Unlock secure crates + crate.update_icon() + var/obj/structure/closet/supplypod/pod = make_pod() + crate.forceMove(pod) + new /obj/effect/abstract/DPtarget(LZ, pod) + +///Handles the creation of the pod, in case it needs to be modified beforehand +/datum/round_event/stray_cargo/proc/make_pod() + var/obj/structure/closet/supplypod/S = new + return S + +///Picks an area that wouldn't risk critical damage if hit by a pod explosion +/datum/round_event/stray_cargo/proc/find_event_area() + var/static/list/allowed_areas + if(!allowed_areas) + ///Places that shouldn't explode + var/list/safe_area_types = typecacheof(list( + /area/ai_monitored/turret_protected/ai, + /area/ai_monitored/turret_protected/ai_upload, + /area/engine, + /area/shuttle) + ) + + ///Subtypes from the above that actually should explode. + var/list/unsafe_area_subtypes = typecacheof(list(/area/engine/break_room)) + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes + var/list/possible_areas = typecache_filter_list(GLOB.sortedAreas,allowed_areas) + if (length(possible_areas)) + return pick(possible_areas) + +///A rare variant that drops a crate containing syndicate uplink items +/datum/round_event_control/stray_cargo/syndicate + name = "Stray Syndicate Cargo Pod" + typepath = /datum/round_event/stray_cargo/syndicate + weight = 6 + max_occurrences = 1 + earliest_start = 30 MINUTES + +/datum/round_event/stray_cargo/syndicate + possible_pack_types = list(/datum/supply_pack/misc/syndicate) + +///Apply the syndicate pod skin +/datum/round_event/stray_cargo/syndicate/make_pod() + var/obj/structure/closet/supplypod/S = new + S.setStyle(STYLE_SYNDICATE) + return S diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 77bb7661ba..dc672cec45 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -40,6 +40,7 @@ /datum/reagent/pax, /datum/reagent/consumable/laughter, /datum/reagent/concentrated_barbers_aid, + /datum/reagent/baldium, /datum/reagent/colorful_reagent, /datum/reagent/peaceborg_confuse, /datum/reagent/peaceborg_tire, @@ -139,22 +140,6 @@ typepath = /datum/round_event/vent_clog/plasma_decon max_occurrences = 0 -/datum/round_event_control/vent_clog/female - name = "Clogged Vents; Girlcum" - typepath = /datum/round_event/vent_clog/female - max_occurrences = 0 - -/datum/round_event/vent_clog/female - reagentsAmount = 100 - -/datum/round_event_control/vent_clog/male - name = "Clogged Vents: Semen" - typepath = /datum/round_event/vent_clog/male - max_occurrences = 0 - -/datum/round_event/vent_clog/male - reagentsAmount = 100 - /datum/round_event/vent_clog/beer/announce() priority_announce("The scrubbers network is experiencing an unexpected surge of pressurized beer. Some ejection of contents may occur.", "Atmospherics alert") @@ -170,36 +155,6 @@ foam.start() CHECK_TICK -/datum/round_event/vent_clog/male/announce() - priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejaculation of contents may occur.", "Atmospherics alert") - -/datum/round_event/vent_clog/male/start() - for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc && !vent.welded) - var/datum/reagents/R = new/datum/reagents(1000) - R.my_atom = vent - R.add_reagent(/datum/reagent/consumable/semen, reagentsAmount) - - var/datum/effect_system/foam_spread/foam = new - foam.set_up(200, get_turf(vent), R) - foam.start() - CHECK_TICK - -/datum/round_event/vent_clog/female/announce() - priority_announce("The scrubbers network is experiencing a backpressure squirt. Some ejection of contents may occur.", "Atmospherics alert") - -/datum/round_event/vent_clog/female/start() - for(var/obj/machinery/atmospherics/components/unary/vent in vents) - if(vent && vent.loc && !vent.welded) - var/datum/reagents/R = new/datum/reagents(1000) - R.my_atom = vent - R.add_reagent(/datum/reagent/consumable/femcum, reagentsAmount) - - var/datum/effect_system/foam_spread/foam = new - foam.set_up(200, get_turf(vent), R) - foam.start() - CHECK_TICK - /datum/round_event/vent_clog/plasma_decon/announce() priority_announce("We are deploying an experimental plasma decontamination system. Please stand away from the vents and do not breathe the smoke that comes out.", "Central Command Update") diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm new file mode 100644 index 0000000000..4a50ccb306 --- /dev/null +++ b/code/modules/events/wisdomcow.dm @@ -0,0 +1,15 @@ +/datum/round_event_control/wisdomcow + name = "Wisdom cow" + typepath = /datum/round_event/wisdomcow + max_occurrences = 1 + weight = 20 + +/datum/round_event/wisdomcow/announce(fake) + priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency") + +/datum/round_event/wisdomcow/start() + var/turf/targetloc = get_random_station_turf() + new /mob/living/simple_animal/cow/wisdom(targetloc) + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(1, targetloc) + smoke.start() diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm new file mode 100644 index 0000000000..fe08b9c743 --- /dev/null +++ b/code/modules/events/wizard/embeddies.dm @@ -0,0 +1,46 @@ +/datum/round_event_control/wizard/embedpocalypse + name = "Make Everything Embeddable" + weight = 2 + typepath = /datum/round_event/wizard/embedpocalypse + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/wizard/embedpocalypse/start() + for(var/obj/item/I in world) + CHECK_TICK + + if(!(I.flags_1 & INITIALIZED_1)) + continue + + if(!I.embedding || I.embedding == EMBED_HARMLESS) + I.embedding = EMBED_POINTY + I.updateEmbedding() + I.name = "pointy [I.name]" + + GLOB.embedpocalypse = TRUE + GLOB.stickpocalypse = FALSE // embedpocalypse takes precedence over stickpocalypse + +/datum/round_event_control/wizard/embedpocalypse/sticky + name = "Make Everything Sticky" + weight = 6 + typepath = /datum/round_event/wizard/embedpocalypse/sticky + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event_control/wizard/embedpocalypse/sticky/canSpawnEvent(players_amt, gamemode) + if(GLOB.embedpocalypse) + return FALSE + +/datum/round_event/wizard/embedpocalypse/sticky/start() + for(var/obj/item/I in world) + CHECK_TICK + + if(!(I.flags_1 & INITIALIZED_1)) + continue + + if(!I.embedding) + I.embedding = EMBED_HARMLESS + I.updateEmbedding() + I.name = "sticky [I.name]" + + GLOB.stickpocalypse = TRUE diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index b7f8b8f911..1b4716b407 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -23,6 +23,9 @@ /datum/round_event/wormholes/start() for(var/turf/open/floor/T in world) if(is_station_level(T.z)) + var/area/A = get_area(T) + if(A.outdoors) + continue pick_turfs += T for(var/i = 1, i <= number_of_wormholes, i++) @@ -57,7 +60,7 @@ if(!(ismecha(M) && mech_sized)) return - if(ismovableatom(M)) + if(ismovable(M)) if(GLOB.portals.len) var/obj/effect/portal/P = pick(GLOB.portals) if(P && isturf(P.loc)) diff --git a/code/modules/fields/gravity.dm b/code/modules/fields/gravity.dm index 8b16bb6487..2334a84e04 100644 --- a/code/modules/fields/gravity.dm +++ b/code/modules/fields/gravity.dm @@ -2,16 +2,17 @@ name = "modified gravity zone" setup_field_turfs = TRUE var/gravity_value = 0 - var/list/grav_components = list() + var/list/modified_turfs = list() field_shape = FIELD_SHAPE_RADIUS_SQUARE /datum/proximity_monitor/advanced/gravity/setup_field_turf(turf/T) . = ..() - grav_components[T] = T.AddComponent(/datum/component/forced_gravity,gravity_value) + T.AddElement(/datum/element/forced_gravity, gravity_value) + modified_turfs[T] = gravity_value /datum/proximity_monitor/advanced/gravity/cleanup_field_turf(turf/T) . = ..() - var/datum/component/forced_gravity/G = grav_components[T] - grav_components -= T - if(G) - qdel(G) \ No newline at end of file + if(isnull(modified_turfs[T])) + return + T.RemoveElement(/datum/element/forced_gravity, modified_turfs[T]) + modified_turfs -= T \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ea475b28d6..2c1299f5b4 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -679,9 +679,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( var/list/mob/living/carbon/people = list() var/mob/living/carbon/person = null var/datum/language/understood_language = target.get_random_understood_language() - for(var/mob/living/carbon/H in view(target)) - if(H == target) - continue + for(var/mob/living/carbon/H in view(target) - target) if(!person) person = H else @@ -701,6 +699,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.client.images |= speech_overlay sleep(30) target.client.images.Remove(speech_overlay) + var/spans = list(person.speech_span) + if (target.client?.prefs.chat_on_map) + target.create_chat_message(person, understood_language, chosen, spans, 0) else // Radio talk var/chosen = specific_message if(!chosen) @@ -1061,6 +1062,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( qdel(src) /obj/effect/hallucination/danger + layer = TURF_LAYER + plane = FLOOR_PLANE var/image/image /obj/effect/hallucination/danger/proc/show_icon() @@ -1084,7 +1087,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( name = "lava" /obj/effect/hallucination/danger/lava/show_icon() - image = image('icons/turf/floors/lava.dmi',src,"smooth",TURF_LAYER) + image = image('icons/turf/floors/lava.dmi',src,"smooth",layer) + image.plane = plane if(target.client) target.client.images += image @@ -1254,7 +1258,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( ..() if(!target.halbody) var/list/possible_points = list() - for(var/turf/open/floor/F in view(target,world.view)) + for(var/turf/open/floor/F in target.fov_view(world.view)) possible_points += F if(possible_points.len) var/turf/open/floor/husk_point = pick(possible_points) @@ -1285,7 +1289,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( set waitfor = FALSE ..() var/list/turf/startlocs = list() - for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + for(var/turf/open/T in target.fov_view(world.view+1)-view(world.view,target)) startlocs += T if(!startlocs.len) qdel(src) diff --git a/code/modules/food_and_drinks/autobottler.dm b/code/modules/food_and_drinks/autobottler.dm index 6d5e0508a9..37b6fca2ce 100644 --- a/code/modules/food_and_drinks/autobottler.dm +++ b/code/modules/food_and_drinks/autobottler.dm @@ -7,7 +7,7 @@ "Wines", "Beers", "Brands", - "Storge", + "Storage", ) production_animation = "protolathe_n" allowed_buildtypes = AUTOBOTTLER @@ -15,4 +15,4 @@ //Brands - This is just export verson of the booze bottles //Storge - Just the bottles not booze inside //Wines - Holds wines later made by Sci nodes -//Beers - Holds beers later made by Sci nodes \ No newline at end of file +//Beers - Holds beers later made by Sci nodes diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 1592efb032..2e68c57abd 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -147,7 +147,7 @@ return if (!(locate(/obj/structure/table) in src_location) || !(locate(/obj/structure/table) in over_location)) return - + //Are we an expert slider? var/datum/action/innate/D = get_action_of_type(user, /datum/action/innate/drink_fling) if(!D?.active) @@ -268,11 +268,15 @@ /obj/item/reagent_containers/food/drinks/ice name = "ice cup" desc = "Careful, cold ice, do not chew." + custom_price = PRICE_CHEAP_AS_FREE icon_state = "coffee" list_reagents = list(/datum/reagent/consumable/ice = 30) spillable = TRUE isGlass = FALSE +/obj/item/reagent_containers/food/drinks/ice/sustanance + custom_price = PRICE_FREE + /obj/item/reagent_containers/food/drinks/mug/ // parent type is literally just so empty mug sprites are a thing name = "mug" desc = "A drink served in a classy mug." @@ -281,7 +285,7 @@ spillable = TRUE /obj/item/reagent_containers/food/drinks/mug/on_reagent_change(changetype) - cut_overlays() + cut_overlays() if(reagents.total_volume) var/mutable_appearance/MA = mutable_appearance(icon,"mugoverlay") MA.color = mix_color_from_reagents(reagents.reagent_list) @@ -302,6 +306,7 @@ list_reagents = list(/datum/reagent/consumable/hot_coco = 30, /datum/reagent/consumable/sugar = 5) foodtype = SUGAR resistance_flags = FREEZE_PROOF + custom_price = PRICE_ALMOST_CHEAP /obj/item/reagent_containers/food/drinks/dry_ramen name = "cup ramen" @@ -310,6 +315,7 @@ list_reagents = list(/datum/reagent/consumable/dry_ramen = 30) foodtype = GRAIN isGlass = FALSE + custom_price = PRICE_PRETTY_CHEAP /obj/item/reagent_containers/food/drinks/beer name = "space beer" @@ -317,6 +323,7 @@ icon_state = "beer" list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30) foodtype = GRAIN | ALCOHOL + custom_price = PRICE_PRETTY_CHEAP /obj/item/reagent_containers/food/drinks/beer/light name = "Carp Lite" @@ -417,6 +424,7 @@ custom_materials = list(/datum/material/iron=250) volume = 60 isGlass = FALSE + custom_price = PRICE_ABOVE_NORMAL /obj/item/reagent_containers/food/drinks/flask/gold name = "captain's flask" @@ -447,6 +455,7 @@ reagent_flags = NONE spillable = FALSE isGlass = FALSE + custom_price = PRICE_CHEAP_AS_FREE /obj/item/reagent_containers/food/drinks/soda_cans/suicide_act(mob/living/carbon/user) user.visible_message("[user] is trying to eat \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 95b9f92873..d87eb8fbc0 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -254,6 +254,7 @@ var/shortname = pickweight( list("T&T" = 1, "A&A" = 1, "Generic" = 1)) var/fullname + var/removals = GLOB.redacted_strings.Copy() switch(shortname) if("T&T") fullname = "Teal and Tealer" @@ -261,9 +262,6 @@ fullname = "Ash and Asher" if("Generic") fullname = "Nanotrasen Cheap Imitations" - var/removals = list("\[REDACTED\]", "\[EXPLETIVE DELETED\]", - "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]", - "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]") var/chance = 50 if(prob(chance)) @@ -348,6 +346,7 @@ /obj/item/reagent_containers/food/drinks/bottle/applejack name = "Buckin' Bronco's Applejack" desc = "Kicks like a horse, tastes like an apple!" + custom_price = PRICE_CHEAP icon_state = "applejack_bottle" list_reagents = list(/datum/reagent/consumable/ethanol/applejack = 100) foodtype = FRUIT @@ -376,6 +375,7 @@ /obj/item/reagent_containers/food/drinks/bottle/trappist name = "Mont de Requin Trappistes Bleu" desc = "Brewed in space-Belgium. Fancy!" + custom_premium_price = PRICE_ABOVE_NORMAL icon_state = "trappistbottle" volume = 50 list_reagents = list(/datum/reagent/consumable/ethanol/trappist = 50) @@ -388,6 +388,7 @@ /obj/item/reagent_containers/food/drinks/bottle/orangejuice name = "orange juice" desc = "Full of vitamins and deliciousness!" + custom_price = PRICE_CHEAP icon_state = "orangejuice" item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -396,9 +397,20 @@ list_reagents = list(/datum/reagent/consumable/orangejuice = 100) foodtype = FRUIT| BREAKFAST +/obj/item/reagent_containers/food/drinks/bottle/bio_carton + name = "small carton box" + desc = "A small biodegradable carton box made from plant biomatter." + icon_state = "eco_box" + item_state = "carton" + lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' + volume = 50 + isGlass = FALSE + /obj/item/reagent_containers/food/drinks/bottle/cream name = "milk cream" desc = "It's cream. Made from milk. What else did you think you'd find in there?" + custom_price = PRICE_CHEAP icon_state = "cream" item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -410,6 +422,7 @@ /obj/item/reagent_containers/food/drinks/bottle/tomatojuice name = "tomato juice" desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." + custom_price = PRICE_CHEAP icon_state = "tomatojuice" item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -421,6 +434,7 @@ /obj/item/reagent_containers/food/drinks/bottle/limejuice name = "lime juice" desc = "Sweet-sour goodness." + custom_price = PRICE_CHEAP icon_state = "limejuice" item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -454,6 +468,7 @@ /obj/item/reagent_containers/food/drinks/bottle/menthol name = "menthol" desc = "Tastes naturally minty, and imparts a very mild numbing sensation." + custom_price = PRICE_CHEAP icon_state = "mentholbox" item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -464,6 +479,7 @@ /obj/item/reagent_containers/food/drinks/bottle/grenadine name = "Jester Grenadine" desc = "Contains 0% real cherries!" + custom_price = PRICE_CHEAP icon_state = "grenadine" isGlass = TRUE list_reagents = list(/datum/reagent/consumable/grenadine = 100) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index defc44ed51..7361e50606 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -11,6 +11,7 @@ spillable = TRUE resistance_flags = ACID_PROOF obj_flags = UNIQUE_RENAME + custom_price = PRICE_REALLY_CHEAP /obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype) cut_overlays() @@ -46,6 +47,7 @@ possible_transfer_amounts = list() volume = 15 custom_materials = list(/datum/material/glass=100) + custom_price = PRICE_CHEAP_AS_FREE /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change(changetype) cut_overlays() diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 2af24080cb..203eb3eef6 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -16,6 +16,7 @@ resistance_flags = FLAMMABLE var/foodtype = NONE var/last_check_time + var/food_quality = 50 /obj/item/reagent_containers/food/Initialize(mapload) . = ..() @@ -23,6 +24,9 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) +/obj/item/reagent_containers/food/proc/adjust_food_quality(new_quality) + food_quality = clamp(new_quality,0,100) + /obj/item/reagent_containers/food/proc/checkLiked(var/fraction, mob/M) if(last_check_time + 50 < world.time) if(ishuman(M)) @@ -32,13 +36,13 @@ to_chat(H,"What the hell was that thing?!") H.adjust_disgust(25 + 30 * fraction) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) - else if(foodtype & H.dna.species.disliked_food) + else if((foodtype & H.dna.species.disliked_food) || food_quality <= 30) to_chat(H,"That didn't taste very good...") H.adjust_disgust(11 + 15 * fraction) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) - else if(foodtype & H.dna.species.liked_food) + else if(((foodtype & H.dna.species.liked_food) && food_quality >= 50) || food_quality >= 70) //you like food of high quality, and food of regular quality you have a preference for to_chat(H,"I love this taste!") - H.adjust_disgust(-5 + -2.5 * fraction) + H.adjust_disgust(-5 + (-2.5 * food_quality/50) + -2.5 * fraction) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) else if(foodtype & H.dna.species.toxic_food) @@ -48,4 +52,4 @@ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time -#undef STOP_SERVING_BREAKFAST \ No newline at end of file +#undef STOP_SERVING_BREAKFAST diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index bd20ad8d69..0e2bdc63c8 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -20,6 +20,7 @@ var/list/ingredients = list() var/ingredients_placement = INGREDIENTS_FILL var/customname = "custom" + var/total_quality = 0 //quality of all ingredients added together /obj/item/reagent_containers/food/snacks/customizable/examine(mob/user) . = ..() @@ -56,6 +57,9 @@ S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume. foodtype |= S.foodtype update_snack_overlays(S) + //quality of customised food is average of the ingredient's qualities + total_quality += S.food_quality + food_quality = total_quality / length(ingredients) to_chat(user, "You add the [I.name] to the [name].") update_name(S) else diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 0b277e328b..ccac1d4a77 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -153,6 +153,12 @@ All foods are distributed among various categories. Use common sense. /obj/item/reagent_containers/food/snacks/examine(mob/user) . = ..() + if(food_quality >= 70) + . += "It is of a high quality." + else + if(food_quality <= 30) + . += "It is of a low quality." + if(bitecount == 0) return else if(bitecount == 1) @@ -254,6 +260,7 @@ All foods are distributed among various categories. Use common sense. slice.desc = "[desc]" if(foodtype != initial(foodtype)) slice.foodtype = foodtype //if something happens that overrode our food type, make sure the slice carries that over + slice.adjust_food_quality(food_quality) /obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location) if(trash) @@ -283,9 +290,9 @@ All foods are distributed among various categories. Use common sense. S.create_reagents(S.volume, reagent_flags, reagent_value) if(reagents) reagents.trans_to(S, reagents.total_volume) - if(S.bonus_reagents && S.bonus_reagents.len) + if(cooking_efficiency && length(S.bonus_reagents)) for(var/r_id in S.bonus_reagents) - var/amount = S.bonus_reagents[r_id] * cooking_efficiency + var/amount = round(S.bonus_reagents[r_id] * cooking_efficiency) if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin) S.reagents.add_reagent(r_id, amount, tastes) else @@ -296,6 +303,10 @@ All foods are distributed among various categories. Use common sense. var/obj/item/result if(cooked_type) result = new cooked_type(T) + //if the result is food, set its food quality to the original food item's quality + if(isfood(result)) + var/obj/item/reagent_containers/food/food_output = result + food_output.adjust_food_quality(food_quality + M.quality_increase) if(istype(M)) initialize_cooked_food(result, M.efficiency) else diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index d44f859823..b8fa64a7bc 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -47,6 +47,7 @@ slice.name = "raw [subjectname] cutlet" else if(subjectjob) slice.name = "raw [subjectjob] cutlet" + slice.adjust_food_quality(food_quality) /obj/item/reagent_containers/food/snacks/meat/slab/human/initialize_cooked_food(obj/item/reagent_containers/food/snacks/meat/S, cooking_efficiency) ..() @@ -314,6 +315,15 @@ slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/gondola foodtype = RAW | MEAT +/obj/item/reagent_containers/food/snacks/meat/slab/wisdomcow + name = "wisdom cow meat" + desc = "The meat from the legendary creature known as the wisdom cow. You monster." + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/liquid_wisdom = 5) + tastes = list("meat" = 1, "wisdom" = 5) + filling_color = "#18e3ca" + cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/wisdomcow + slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/wisdomcow + ////////////////////////////////////// MEAT STEAKS /////////////////////////////////////////////////////////// @@ -373,6 +383,10 @@ name = "gondola steak" tastes = list("meat" = 1, "tranquility" = 1) +/obj/item/reagent_containers/food/snacks/meat/steak/wisdomcow + name = "wisdom cow steak" + tastes = list("meat" = 1, "wisdom" = 5) + //////////////////////////////// MEAT CUTLETS /////////////////////////////////////////////////////// //Raw cutlets @@ -440,6 +454,11 @@ cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/gondola tastes = list("meat" = 1, "tranquility" = 1) +/obj/item/reagent_containers/food/snacks/meat/rawcutlet/wisdomcow + name = "raw wisdom cow cutlet" + cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/wisdomcow + tastes = list("meat" = 1, "wisdom" = 5) + //Cooked cutlets /obj/item/reagent_containers/food/snacks/meat/cutlet @@ -487,3 +506,7 @@ /obj/item/reagent_containers/food/snacks/meat/cutlet/chicken name = "chicken cutlet" tastes = list("chicken" = 1) + +/obj/item/reagent_containers/food/snacks/meat/cutlet/wisdomcow + name = "wisdom cow cutlet" + tastes = list("meat" = 1, "wisdom" = 5) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 204e5ce455..f3d84f7169 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -179,12 +179,25 @@ tastes = list("bread" = 1) foodtype = GRAIN +/obj/item/reagent_containers/food/snacks/garlicbread + name = "garlic bread" + desc = "Alas, it is limited." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "garlicbread" + item_state = "garlicbread" + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin= 4, /datum/reagent/consumable/garlic = 2) + bitesize = 3 + tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) + foodtype = GRAIN + /obj/item/reagent_containers/food/snacks/deepfryholder name = "Deep Fried Foods Holder Obj" desc = "If you can see this description the code for the deep fryer fucked up." icon = 'icons/obj/food/food.dmi' icon_state = "" bitesize = 2 + var/fried_garbage = FALSE //did you really fry a fire extinguisher? GLOBAL_VAR_INIT(frying_hardmode, TRUE) GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE) @@ -215,21 +228,13 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( item_flags = fried.item_flags obj_flags = fried.obj_flags - if(istype(fried, /obj/item/reagent_containers/food/snacks)) + if(isfood(fried)) fried.reagents.trans_to(src, fried.reagents.total_volume) qdel(fried) else fried.forceMove(src) trash = fried - if(!istype(fried, /obj/item/reagent_containers/food) && GLOB.frying_hardmode && GLOB.frying_bad_chems.len) - var/R = rand(1, GLOB.frying_bad_chems.len) - var/bad_chem = GLOB.frying_bad_chems[R] - var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem] - if(GLOB.frying_bad_chem_add_volume) - reagents.maximum_volume += bad_chem_amount + 2 //Added room for condensed cooking oil - reagents.add_reagent(bad_chem, bad_chem_amount) - //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage - reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2) + fried_garbage = TRUE /obj/item/reagent_containers/food/snacks/deepfryholder/Destroy() if(trash) @@ -237,6 +242,13 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( . = ..() /obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater) + if(fried_garbage && GLOB.frying_hardmode && GLOB.frying_bad_chems.len) + var/R = rand(1, GLOB.frying_bad_chems.len) + var/bad_chem = GLOB.frying_bad_chems[R] + var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem] + eater.reagents.add_reagent(bad_chem, bad_chem_amount) + //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage + eater.reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2) if(trash) QDEL_NULL(trash) ..() @@ -247,18 +259,22 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) name = "lightly-fried [name]" desc = "[desc] It's been lightly fried in a deep fryer." + adjust_food_quality(food_quality - 5) if(16 to 49) add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) name = "fried [name]" desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." + adjust_food_quality(food_quality - 10) if(50 to 59) add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) name = "deep-fried [name]" desc = "[desc] Deep-fried to perfection." + adjust_food_quality(food_quality) //we shouldn't punish perfection in the fried arts if(60 to INFINITY) add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) name = "the physical manifestation of the very concept of fried foods" desc = "A heavily-fried...something. Who can tell anymore?" + adjust_food_quality(0) //good job, you're truly the best cook. filling_color = color foodtype |= FRIED diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index 9a4ef2ce89..f8c85700c9 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -365,7 +365,7 @@ /obj/item/reagent_containers/food/snacks/burger/chicken name = "chicken sandwich" //Apparently the proud people of Americlapstan object to this thing being called a burger. Apparently McDonald's just calls it a burger in Europe as to not scare and confuse us. - desc = "A delicious chicken sandwich, it is said the proceeds from this treat helps criminalize homosexuality on the space frontier." + desc = "A delicious chicken sandwich, it is said the proceeds from this treat helps criminalize disarming people on the space frontier." icon_state = "chickenburger" tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1) bonus_reagents = list(/datum/reagent/consumable/mayonnaise = 3, /datum/reagent/consumable/cooking_oil = 2, /datum/reagent/consumable/nutriment = 2) diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 0f2856c090..fbed6327b5 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -41,7 +41,7 @@ /obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W - var/clr = C.item_color + var/clr = C.crayon_color if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow"))) to_chat(usr, "[src] refuses to take on this colour!") @@ -49,41 +49,32 @@ to_chat(usr, "You colour [src] with [W].") icon_state = "egg-[clr]" - item_color = clr else ..() /obj/item/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" - item_color = "blue" /obj/item/reagent_containers/food/snacks/egg/green icon_state = "egg-green" - item_color = "green" /obj/item/reagent_containers/food/snacks/egg/mime icon_state = "egg-mime" - item_color = "mime" /obj/item/reagent_containers/food/snacks/egg/orange icon_state = "egg-orange" - item_color = "orange" /obj/item/reagent_containers/food/snacks/egg/purple icon_state = "egg-purple" - item_color = "purple" /obj/item/reagent_containers/food/snacks/egg/rainbow icon_state = "egg-rainbow" - item_color = "rainbow" /obj/item/reagent_containers/food/snacks/egg/red icon_state = "egg-red" - item_color = "red" /obj/item/reagent_containers/food/snacks/egg/yellow icon_state = "egg-yellow" - item_color = "yellow" /obj/item/reagent_containers/food/snacks/friedegg name = "fried egg" diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index a7cad1d7bb..c2a58b0821 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -54,10 +54,18 @@ tastes = list("fish" = 1, "chips" = 1) foodtype = MEAT | VEGETABLES | FRIED +/obj/item/reagent_containers/food/snacks/fishfry + name = "fish fry" + desc = "All that and no bag of chips..." + icon_state = "fish_fry" + list_reagents = list (/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3) + filling_color = "#ee7676" + tastes = list("fish" = 1, "pan seared vegtables" = 1) + foodtype = MEAT | VEGETABLES | FRIED + /obj/item/reagent_containers/food/snacks/sushi_basic name = "funa hosomaki" desc = "A small cylindrical kudzu skin, filled with rice and fish." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_basic" bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 4) @@ -69,7 +77,6 @@ /obj/item/reagent_containers/food/snacks/sushi_adv name = "funa nigiri" desc = "A peace of carp lightly placed on some rice." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_adv" bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 6) @@ -81,7 +88,6 @@ /obj/item/reagent_containers/food/snacks/sushi_pro name = "funa nigiri" desc = "A well prepared peace of the best of the carp fillet placed on rice. Looks fancy and fresh!" - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_pro" bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) @@ -132,10 +138,10 @@ tastes = list("meat" = 1, "salmon" = 1) foodtype = MEAT | ALCOHOL -/obj/item/reagent_containers/food/snacks/faggot - name = "faggot" - desc = "A great meal all round. Not a cord of wood." - icon_state = "faggot" +/obj/item/reagent_containers/food/snacks/meatball + name = "meatball" + desc = "MAMA MIA DAS A SPICY" + icon_state = "meatball" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#800000" tastes = list("meat" = 1) @@ -207,7 +213,7 @@ name = "raw khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1) cooked_type = /obj/item/reagent_containers/food/snacks/khinkali tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtype = MEAT @@ -216,42 +222,12 @@ name = "khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/garlic = 1) bitesize = 3 filling_color = "#F0F0F0" tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/monkeycube - name = "monkey cube" - desc = "Just add water!" - icon_state = "monkeycube" - bitesize = 12 - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - filling_color = "#CD853F" - tastes = list("the jungle" = 1, "bananas" = 1) - foodtype = MEAT | SUGAR - -/obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/living/carbon/M) - if(iscarbon(M)) - M.visible_message("[src] bursts out of [M]!") - M.emote("scream") - M.DefaultCombatKnockdown(40) - M.adjustBruteLoss(60) - Expand() - return TRUE - return ..() - -/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() - var/mob/spammer = get_mob_by_key(fingerprintslast) - var/mob/living/carbon/monkey/bananas = new(drop_location(), TRUE, spammer) - if (!QDELETED(bananas)) - visible_message("[src] expands!") - bananas.log_message("Spawned via [src] at [AREACOORD(src)], Last attached mob: [key_name(spammer)].", LOG_ATTACK) - else if (!spammer) // Visible message in case there are no fingerprints - visible_message("[src] fails to expand!") - qdel(src) - /obj/item/reagent_containers/food/snacks/enchiladas name = "enchiladas" desc = "Viva La Mexico!" @@ -372,3 +348,76 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("meat" = 3, "smokey sauce" = 1) foodtype = MEAT + +////////////// Cubes ////////// + +/obj/item/reagent_containers/food/snacks/cube + name = "debug cube" + desc = "Just add water!" + icon_state = "monkeycube" + bitesize = 12 + list_reagents = list(/datum/reagent/consumable/nutriment = 2) + filling_color = "#CD853F" + tastes = list("broken" = 1, "code" = 1) + foodtype = MEAT | SUGAR + var/dried_being = /mob/living/carbon/monkey //What the cube will spawn mob wise + +/obj/item/reagent_containers/food/snacks/cube/On_Consume(mob/living/carbon/M) + if(iscarbon(M)) + M.visible_message("[src] bursts out of [M]!") + M.emote("scream") + M.DefaultCombatKnockdown(40) + M.adjustBruteLoss(60) + Expand() + return TRUE + return ..() + +/obj/item/reagent_containers/food/snacks/cube/proc/Expand() + var/mob/spammer = get_mob_by_key(fingerprintslast) + var/mob/living/water = new dried_being(drop_location(), TRUE, spammer) + if (!QDELETED(water)) + visible_message("[src] expands!") + water.log_message("Spawned via [src] at [AREACOORD(src)], Last attached mob: [key_name(spammer)].", LOG_ATTACK) + else if (!spammer) // Visible message in case there are no fingerprints + visible_message("[src] fails to expand!") + qdel(src) + +/obj/item/reagent_containers/food/snacks/cube/monkey + name = "monkey cube" + desc = "Just add water!" + tastes = list("the jungle" = 1, "bananas" = 1) + dried_being = /mob/living/carbon/monkey + +/obj/item/reagent_containers/food/snacks/cube/beno + name = "alien drone cube" + desc = "Just add water and run!" + tastes = list("the jungle" = 1, "acid" = 1) + dried_being = /mob/living/carbon/alien/humanoid/drone + +/obj/item/reagent_containers/food/snacks/cube/goat + name = "goat cube" + tastes = list("grass" = 1) + dried_being = /mob/living/simple_animal/hostile/retaliate/goat + +/obj/item/reagent_containers/food/snacks/cube/cow + name = "cow cube" + tastes = list("milk" = 1, "beef" = 1) + dried_being = /mob/living/simple_animal/cow + +/obj/item/reagent_containers/food/snacks/cube/ape + name = "ape cube" + desc = "Don't add water." + tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1) + dried_being = /mob/living/simple_animal/hostile/gorilla + +/obj/item/reagent_containers/food/snacks/cube/egg +//Well eggs normally are able to hatch into small birds, this one does not. +//Also in order to have a normal egg hatch you need a hen to lay the egg that is able to hatch, meaning this one is for on-demand hen needs. + name = "egg cube thing" + desc = "Just add water, hey wait a second..." + icon_state = "egg" + filling_color = "#F0E68C" + cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg + list_reagents = list(/datum/reagent/consumable/eggyolk = 5) + tastes = list("dried eggs" = 1, "confusion" = 1) + dried_being = /mob/living/simple_animal/chicken diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 6feb2df524..bc80ffe621 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -12,6 +12,17 @@ tastes = list("cheese" = 1) foodtype = DAIRY + + +/obj/item/reagent_containers/food/snacks/royalcheese + name = "royal cheese" + desc = "Ascend the throne. Consume the wheel. Feel the POWER." + icon_state = "royalcheese" + list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/gold = 20, /datum/reagent/toxin/mutagen = 5) + w_class = WEIGHT_CLASS_BULKY + tastes = list("cheese" = 4, "royalty" = 1) + foodtype = DAIRY + /obj/item/reagent_containers/food/snacks/cheesewedge name = "cheese wedge" desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." @@ -215,7 +226,6 @@ /obj/item/reagent_containers/food/snacks/tobiko name = "tobiko" desc = "Spider eggs wrapped in a thin salted Kudzu pod" - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_egg" list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FF3333" // R225 G051 B051 @@ -558,7 +568,6 @@ /obj/item/reagent_containers/food/snacks/riceball name = "onigiri" desc = "A ball of rice with some light salt and a wrap of Kudzu skin." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "riceball" list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/sodiumchloride = 2) tastes = list("rice" = 3, "salt" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index ecd9074950..d65907daea 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -144,6 +144,15 @@ is_decorated = TRUE filling_color = "#879630" +/obj/item/reagent_containers/food/snacks/donut/laugh + name = "sweet pea donut" + desc = "Goes great with a glass of Bastion Burbon!" + icon_state = "donut_laugh" + bonus_reagents = list(/datum/reagent/consumable/laughter = 3) + tastes = list("donut" = 3, "fizzy tutti frutti" = 1,) + is_decorated = TRUE + filling_color = "#803280" + //////////////////////JELLY DONUTS///////////////////////// /obj/item/reagent_containers/food/snacks/donut/jelly @@ -234,6 +243,15 @@ is_decorated = TRUE filling_color = "#879630" +/obj/item/reagent_containers/food/snacks/donut/jelly/laugh + name = "sweet pea jelly donut" + desc = "Goes great with a glass of Bastion Burbon!" + icon_state = "jelly_laugh" + bonus_reagents = list(/datum/reagent/consumable/laughter = 3) + tastes = list("jelly" = 3, "donut" = 1, "fizzy tutti frutti" = 1) + is_decorated = TRUE + filling_color = "#803280" + //////////////////////////SLIME DONUTS///////////////////////// /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly @@ -315,6 +333,15 @@ is_decorated = TRUE filling_color = "#879630" +/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/laugh + name = "sweet pea jelly donut" + desc = "Goes great with a glass of Bastion Burbon!" + icon_state = "jelly_laugh" + bonus_reagents = list(/datum/reagent/consumable/laughter = 3) + tastes = list("jelly" = 3, "donut" = 1, "fizzy tutti frutti" = 1) + is_decorated = TRUE + filling_color = "#803280" + /obj/item/reagent_containers/food/snacks/donut/glaze name = "glazed donut" desc = "A sugar glazed donut." @@ -440,6 +467,40 @@ filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtype = GRAIN + var/list/cached_reagents_amount + var/previous_typepath + +/obj/item/reagent_containers/food/snacks/donkpocket/Initialize(mapload) + . = ..() + if(!cooked_type) //maploaded cooked donk pockets won't cool down anyway. + desc += " This one will stay warm for a long time, great." + +/obj/item/reagent_containers/food/snacks/donkpocket/initialize_cooked_food(obj/item/reagent_containers/food/snacks/donkpocket/S, cooking_efficiency = 1) + . = ..() + if(istype(S)) + S.desc = initial(S.desc) //reset the desc since will now cool down. + for(var/R in S.bonus_reagents) + LAZYSET(S.cached_reagents_amount, R, S.reagents.get_reagent_amount(R)) + S.previous_typepath = type + addtimer(CALLBACK(S, .proc/cool_down), 7 MINUTES) //canonically they reverted back to normal after 7 minutes. + +/obj/item/reagent_containers/food/snacks/donkpocket/proc/cool_down() + if(!previous_typepath) //This shouldn't happen. + qdel(src) + return + var/spoiled = FALSE + for(var/R in cached_reagents_amount) + var/amount = cached_reagents_amount[R] + if(reagents.get_reagent_amount(R) < amount) + spoiled = TRUE + reagents.remove_reagent(R, amount) //no reagent duping please. + var/obj/item/reagent_containers/food/snacks/donkpocket/D = new previous_typepath(drop_location()) + D.create_reagents(D.volume, reagent_flags, reagent_value) + reagents.trans_to(D, reagents.total_volume) + if(spoiled) + D.cooked_type = null + D.desc += " This one has gone cold and mushy, pretty unsuitable for cooking." + qdel(src) /obj/item/reagent_containers/food/snacks/donkpocket/warm name = "warm Donk-pocket" diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index a977eac3c2..be7c3d25da 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -124,4 +124,22 @@ trash = /obj/item/kitchen/knife bonus_reagents = list(/datum/reagent/medicine/earthsblood = 1, /datum/reagent/iron = 4) tastes = list("iron" = 1, "conspiracy" = 1) - foodtype = VEGETABLES \ No newline at end of file + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/salad/edensalad + name = "\improper Salad of Eden" + desc = "A salad brimming with untapped potential." + icon_state = "eden_salad" + trash = /obj/item/reagent_containers/glass/bowl + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/medicine/earthsblood = 3, /datum/reagent/medicine/omnizine = 5, /datum/reagent/drug/happiness = 2) + tastes = list("hope" = 1) + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/salad/gumbo + name = "black eyed gumbo" + desc = "A spicy and savory meat and rice dish." + icon_state = "gumbo" + trash = /obj/item/reagent_containers/glass/bowl + list_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/nutriment = 5) + tastes = list("building heat" = 2, "savory meat and vegtables" = 1) + foodtype = GRAIN | MEAT | VEGETABLES diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm index 3cc4cfe63f..9096429228 100644 --- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm @@ -136,7 +136,6 @@ /obj/item/reagent_containers/food/snacks/tuna_sandwich name = "tuna sandwich" desc = "Both a salad and a sandwich in one." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "tunasandwich" trash = /obj/item/trash/plate bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 3d70b32f2e..a6a251a84c 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -262,3 +262,13 @@ tastes = list("bungo" = 2, "hot curry" = 4, "tropical sweetness" = 1) filling_color = "#E6A625" foodtype = VEGETABLES | FRUIT | DAIRY + +/obj/item/reagent_containers/food/snacks/soup/peasoup + name = "pea soup" + desc = "A humble split pea soup." + icon_state = "peasoup" + bonus_reagents = list (/datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/medicine/oculine = 2) + list_reagents = list (/datum/reagent/consumable/nutriment = 8) + tastes = list("creamy peas"= 2, "parsnip" = 1) + filling_color = "#9dc530" + foodtype = VEGETABLES diff --git a/code/modules/food_and_drinks/food/snacks_sushi.dm b/code/modules/food_and_drinks/food/snacks_sushi.dm index d16ca79001..3757759daf 100644 --- a/code/modules/food_and_drinks/food/snacks_sushi.dm +++ b/code/modules/food_and_drinks/food/snacks_sushi.dm @@ -3,7 +3,6 @@ /obj/item/reagent_containers/food/snacks/sushi_rice name = "Sushi Rice" desc = "A bowl of sticky rice for making sushi." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushi_rice" list_reagents = list(/datum/reagent/consumable/sodiumchloride = 5) tastes = list("rice" = 5, "salt" = 1) @@ -12,7 +11,6 @@ /obj/item/reagent_containers/food/snacks/sea_weed name = "Sea Weed Sheet" desc = "A thin, light salt sheet of plant mater. This is commenly used in sushi recipes," - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sea_weed" list_reagents = list(/datum/reagent/consumable/sodiumchloride = 2) tastes = list("plants" = 2, "salt" = 1) @@ -21,7 +19,6 @@ /obj/item/reagent_containers/food/snacks/tuna name = "Canned Tuna" desc = "A small can of tuna fish beloved by felines." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "tuna_can" //trash = /obj/item/trash/tuna_used //I dont know if I like this idea - A Masked Cat list_reagents = list(/datum/reagent/consumable/sodiumchloride = 5, /datum/reagent/mercury = 2) @@ -32,7 +29,6 @@ /obj/item/reagent_containers/food/snacks/sushie_basic name = "Funa Hosomaki" desc = "A small cylindrical filled with rice and fish." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_basic" bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 1) @@ -44,7 +40,6 @@ /obj/item/reagent_containers/food/snacks/sushie_adv name = "Funa Nigiri" desc = "A pice of carp lightly placed on some rice." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_adv" bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 2) @@ -56,7 +51,6 @@ /obj/item/reagent_containers/food/snacks/sushie_pro name = "Funa Nigiri" desc = "A well prepared pice of the best of the carp fillet placed on rice. Looks fancy and fresh!" - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_pro" bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) @@ -68,7 +62,6 @@ /obj/item/reagent_containers/food/snacks/tobiko name = "Tobiko" desc = "Spider eggs wrapped in a thin salted Kudzu pod" - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "sushie_egg" list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FF3333" // R225 G051 B051 @@ -78,7 +71,6 @@ /obj/item/reagent_containers/food/snacks/riceball name = "Onigiri" desc = "A ball of rice with some light salt and a wrap of Kudzu skin." - icon = 'modular_citadel/icons/obj/food/food.dmi' icon_state = "riceball" list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sodiumchloride = 2) tastes = list("rice" = 4, "salt" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 239dd433b0..38f7ecf5b1 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -68,6 +68,7 @@ junkiness = 25 filling_color = "#FFD700" foodtype = JUNKFOOD | GRAIN | SUGAR + custom_price = PRICE_CHEAP_AS_FREE /obj/item/reagent_containers/food/snacks/cheesiehonkers name = "cheesie honkers" @@ -89,3 +90,4 @@ filling_color = "#F5F5DC" tastes = list("sweetness" = 3, "cake" = 1) foodtype = GRAIN | FRUIT | VEGETABLES + custom_price = PRICE_CHEAP diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 1215dd7ecb..0a3d172bb0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -104,6 +104,12 @@ God bless America. else if(!frying && user.transferItemToLoc(I, src)) to_chat(user, "You put [I] into [src].") frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I) + //setup food quality for item depending on if it's edible or not + if(isfood(I)) + var/obj/item/reagent_containers/food/original_food = I + frying.adjust_food_quality(original_food.food_quality) //food quality remains unchanged until degree of frying is calculated + else + frying.adjust_food_quality(10) //inedible fried item has low quality icon_state = "fryer_on" fry_loop.start() diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index 68cc84c639..f09d3d6728 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -1,5 +1,5 @@ #define STORAGE_CAPACITY 30 -#define LIQUID_CAPACIY 200 +#define LIQUID_CAPACITY 200 #define MIXER_CAPACITY 100 /obj/machinery/food_cart @@ -19,7 +19,7 @@ /obj/machinery/food_cart/Initialize() . = ..() - create_reagents(LIQUID_CAPACIY, OPENCONTAINER | NO_REACT) + create_reagents(LIQUID_CAPACITY, OPENCONTAINER | NO_REACT) mixer = new /obj/item/reagent_containers(src, MIXER_CAPACITY) mixer.name = "Mixer" @@ -60,6 +60,9 @@ return food_stored >= STORAGE_CAPACITY /obj/machinery/food_cart/attackby(obj/item/O, mob/user, params) + if(O.tool_behaviour == TOOL_WRENCH) + default_unfasten_wrench(user, O, 0) + return TRUE if(istype(O, /obj/item/reagent_containers/food/drinks/drinkingglass)) var/obj/item/reagent_containers/food/drinks/drinkingglass/DG = O if(!DG.reagents.total_volume) //glass is empty @@ -106,7 +109,7 @@ return if(href_list["disposeI"]) - reagents.del_reagent(href_list["disposeI"]) + reagents.del_reagent(text2path(href_list["disposeI"])) if(href_list["dispense"]) if(stored_food[href_list["dispense"]]-- <= 0) @@ -116,9 +119,13 @@ if(sanitize(O.name) == href_list["dispense"]) O.forceMove(drop_location()) break + log_combat(usr, src, "dispensed [O] from", null, "with [stored_food[href_list["dispense"]]] remaining") if(href_list["portion"]) - portion = CLAMP(input("How much drink do you want to dispense per glass?") as num, 0, 50) + portion = clamp(input("How much drink do you want to dispense per glass?") as num|null, 0, 50) + + if (isnull(portion)) + return if(href_list["pour"] || href_list["m_pour"]) if(glasses-- <= 0) @@ -127,16 +134,16 @@ else var/obj/item/reagent_containers/food/drinks/drinkingglass/DG = new(loc) if(href_list["pour"]) - reagents.trans_id_to(DG, href_list["pour"], portion) + reagents.trans_id_to(DG, text2path(href_list["pour"]), portion) if(href_list["m_pour"]) - mixer.reagents.trans_id_to(DG, href_list["m_pour"], portion) + mixer.reagents.trans_id_to(DG, text2path(href_list["m_pour"]), portion) if(href_list["mix"]) - if(reagents.trans_id_to(mixer, href_list["mix"], portion) == 0) + if(reagents.trans_id_to(mixer, text2path(href_list["mix"]), portion) == 0) to_chat(usr, "[mixer] is full!") if(href_list["transfer"]) - if(mixer.reagents.trans_id_to(src, href_list["transfer"], portion) == 0) + if(mixer.reagents.trans_id_to(src, text2path(href_list["transfer"]), portion) == 0) to_chat(usr, "[src] is full!") updateDialog() @@ -152,5 +159,5 @@ qdel(src) #undef STORAGE_CAPACITY -#undef LIQUID_CAPACIY +#undef LIQUID_CAPACITY #undef MIXER_CAPACITY diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 5117439049..dcea93f06f 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -14,6 +14,7 @@ var/gibtime = 40 // Time from starting until meat appears var/meat_produced = 0 var/ignore_clothing = FALSE + var/meat_quality = 35 //food_quality of meat produced /obj/machinery/gibber/Initialize() @@ -23,8 +24,10 @@ /obj/machinery/gibber/RefreshParts() gibtime = 40 meat_produced = 0 + meat_quality = 35 // unupgraded this means quality is 50, and max upgraded it is 95 for(var/obj/item/stock_parts/matter_bin/B in component_parts) meat_produced += B.rating + meat_quality += B.rating * 15 for(var/obj/item/stock_parts/manipulator/M in component_parts) gibtime -= 5 * M.rating if(M.rating >= 2) @@ -183,6 +186,7 @@ var/obj/item/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat newmeat.name = "[sourcename] [newmeat.name]" if(istype(newmeat)) + newmeat.adjust_food_quality(meat_quality) newmeat.subjectname = sourcename newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, sourcenutriment / meat_produced) // Thehehe. Fat guys go first if(sourcejob) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 2adff414e8..d9e3bc6165 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -19,6 +19,8 @@ var/broken = 0 // 0, 1 or 2 // How broken is it??? var/max_n_of_items = 10 var/efficiency = 0 + var/quality_increase = 5 // how much do we increase the quality of microwaved items + var/productivity = 0 var/datum/looping_sound/microwave/soundloop var/list/ingredients = list() // may only contain /atom/movables @@ -43,11 +45,16 @@ . = ..() /obj/machinery/microwave/RefreshParts() - efficiency = 0 + efficiency = 0.6 + productivity = 0 + max_n_of_items = 5 for(var/obj/item/stock_parts/micro_laser/M in component_parts) - efficiency += M.rating + efficiency += M.rating * 0.4 + productivity += M.rating for(var/obj/item/stock_parts/matter_bin/M in component_parts) + max_n_of_items = 10 * M.rating + quality_increase = M.rating * 5 break /obj/machinery/microwave/examine(mob/user) @@ -83,7 +90,7 @@ if(!(stat & (NOPOWER|BROKEN))) . += "The status display reads:" . += "- Capacity: [max_n_of_items] items." - . += "- Cook time reduced by [(efficiency - 1) * 25]%." + . += "- Cook time reduced by [(productivity - 1) * 25]%." /obj/machinery/microwave/update_icon_state() if(broken) @@ -240,7 +247,7 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return - if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure + if(prob(dirty * 5 / (5 * efficiency))) //a clean unupgraded microwave has no risk of failure muck() return for(var/obj/O in ingredients) @@ -285,9 +292,9 @@ update_icon() loop(MICROWAVE_MUCK, 4) -/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10 +/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * productivity, 2)) // standard wait is 10 if(stat & (NOPOWER|BROKEN)) - if(MICROWAVE_PRE) + if(type == MICROWAVE_PRE) pre_fail() return if(!time) @@ -353,4 +360,4 @@ #undef MICROWAVE_NORMAL #undef MICROWAVE_MUCK -#undef MICROWAVE_PRE \ No newline at end of file +#undef MICROWAVE_PRE diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 3d7341308b..2318c54508 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -78,7 +78,7 @@ playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) - new /obj/item/reagent_containers/food/snacks/monkeycube(src.loc) + new /obj/item/reagent_containers/food/snacks/cube/monkey(src.loc) to_chat(user, "The machine's display flashes that it has [grinded] monkeys worth of material left.") else to_chat(user, "The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 3fa188fb94..9a3df0a92b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -14,10 +14,13 @@ var/processing = FALSE var/rating_speed = 1 var/rating_amount = 1 + var/quality_increase = 5 /obj/machinery/processor/RefreshParts() + quality_increase = 0 for(var/obj/item/stock_parts/matter_bin/B in component_parts) rating_amount = B.rating + quality_increase += B.rating * 5 for(var/obj/item/stock_parts/manipulator/M in component_parts) rating_speed = M.rating @@ -28,8 +31,10 @@ /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) + var/obj/item/reagent_containers/food/food_input = what for(var/i = 0, i < rating_amount, i++) - new recipe.output(drop_location()) + var/obj/item/reagent_containers/food/food_output = new recipe.output(drop_location()) + food_output.adjust_food_quality(food_input.food_quality + quality_increase) if (ismob(what)) var/mob/themob = what themob.gib(TRUE,TRUE,TRUE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 67a636eb9c..891a6abec2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -463,7 +463,7 @@ return TRUE if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted return FALSE - if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray)) + if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray) || istype(O, /obj/item/reagent_containers/chem_pack)) return TRUE return FALSE diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index b163c6ba97..19ded25b08 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -86,8 +86,8 @@ tag_overlay.pixel_y = boxes.len * 3 add_overlay(tag_overlay) -/obj/item/pizzabox/worn_overlays(isinhands, icon_file, style_flags = NONE) - . = list() +/obj/item/pizzabox/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) + . = ..() var/current_offset = 2 if(isinhands) for(var/V in boxes) //add EXTRA BOX per box @@ -125,7 +125,7 @@ return else bomb_timer = input(user, "Set the [bomb] timer from [BOMB_TIMER_MIN] to [BOMB_TIMER_MAX].", bomb, bomb_timer) as num - bomb_timer = CLAMP(CEILING(bomb_timer / 2, 1), BOMB_TIMER_MIN, BOMB_TIMER_MAX) + bomb_timer = clamp(CEILING(bomb_timer / 2, 1), BOMB_TIMER_MIN, BOMB_TIMER_MAX) bomb_defused = FALSE var/message = "[ADMIN_LOOKUPFLW(user)] has trapped a [src] with [bomb] set to [bomb_timer * 2] seconds." diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index e1c0646e80..8d8049194b 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -915,3 +915,80 @@ results = list(/datum/reagent/consumable/ethanol/commander_and_chief = 50) required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10) mix_message = "When your powers combine, I am Captain Pl-..." + +////////////////////////////////////////// Race Base Drinks ////////////////////////////////////// + +/datum/chemical_reaction/coldscales + name = "Cold Scales" + id = /datum/reagent/consumable/ethanol/coldscales + results = list(/datum/reagent/consumable/ethanol/coldscales = 3) + required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1) + +/datum/chemical_reaction/oil_drum + name = "Oil Drum" + id = /datum/reagent/consumable/ethanol/oil_drum + results = list(/datum/reagent/consumable/ethanol/oil_drum = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12) + +/datum/chemical_reaction/nord_king + name = "Nord King" + id = /datum/reagent/consumable/ethanol/nord_king + results = list(/datum/reagent/consumable/ethanol/nord_king = 10) + required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10) + +/datum/chemical_reaction/velvet_kiss + name = "Velvet Kiss" + id = /datum/reagent/consumable/ethanol/velvet_kiss + results = list(/datum/reagent/consumable/ethanol/velvet_kiss = 15) //Limited races use this + required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10) + +/datum/chemical_reaction/abduction_fruit + name = "Abduction Fruit" + id = /datum/reagent/consumable/ethanol/abduction_fruit + results = list(/datum/reagent/consumable/ethanol/abduction_fruit = 3) + required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10) + +/datum/chemical_reaction/bug_zapper + name = "Bug Zapper" + id = /datum/reagent/consumable/ethanol/bug_zapper + results = list(/datum/reagent/consumable/ethanol/bug_zapper = 20) //Harder to make + required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10) + +/datum/chemical_reaction/mush_crush + name = "Mush Crush" + id = /datum/reagent/consumable/ethanol/mush_crush + results = list(/datum/reagent/consumable/ethanol/mush_crush = 10) + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10) + +/datum/chemical_reaction/darkbrew + name = "Darkbrew" + id = /datum/reagent/consumable/ethanol/darkbrew + results = list(/datum/reagent/consumable/ethanol/darkbrew = 20)//Limited races use this + required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10) + +/datum/chemical_reaction/hollow_bone + name = "Hollow Bone" + id = /datum/reagent/consumable/ethanol/hollow_bone + results = list(/datum/reagent/consumable/ethanol/hollow_bone = 10) + required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10) + +/datum/chemical_reaction/frisky_kitty + name = "Frisky Kitty" + id = /datum/reagent/consumable/ethanol/frisky_kitty + results = list(/datum/reagent/consumable/ethanol/frisky_kitty = 2) + required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1) + required_temp = 296 //Just above room temp (22.85'C) + +/datum/chemical_reaction/jell_wyrm + name = "Jell Wyrm" + id = /datum/reagent/consumable/ethanol/jell_wyrm + results = list(/datum/reagent/consumable/ethanol/jell_wyrm = 2) + required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5) + required_temp = 333 // (59.85'C) + +/datum/chemical_reaction/laval_spit + name = "Laval Spit" + id = /datum/reagent/consumable/ethanol/laval_spit + results = list(/datum/reagent/consumable/ethanol/laval_spit = 20) //Limited use + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5) + required_temp = 900 // (626.85'C) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index c15c1cd2f5..ec96a4537c 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -8,7 +8,6 @@ parts |= reqs //////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// - /datum/chemical_reaction/tofu name = "Tofu" id = "tofu" diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index fbd3f57323..1e3afd1cf5 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -6,7 +6,7 @@ /datum/food_processor_process/meat input = /obj/item/reagent_containers/food/snacks/meat/slab - output = /obj/item/reagent_containers/food/snacks/faggot + output = /obj/item/reagent_containers/food/snacks/meatball /datum/food_processor_process/bacon input = /obj/item/reagent_containers/food/snacks/meat/rawcutlet diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index c3890b28eb..335078eb4c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -125,6 +125,16 @@ result = /obj/item/reagent_containers/food/snacks/baguette subcategory = CAT_BREAD +/datum/crafting_recipe/food/garlicbread + name = "Garlic Bread" + time = 40 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/reagent_containers/food/snacks/butter = 1 + ) + result = /obj/item/reagent_containers/food/snacks/garlicbread + subcategory = CAT_BREAD + /datum/crafting_recipe/food/butterbiscuit name = "Butter Biscuit" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm index ac5576ac25..c376ab4025 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm @@ -121,6 +121,15 @@ datum/crafting_recipe/food/donut/meat ) result = /obj/item/reagent_containers/food/snacks/donut/matcha + +/datum/crafting_recipe/food/donut/laugh + name = "Sweet Pea Donut" + reqs = list( + /datum/reagent/consumable/laughsyrup = 3, + /obj/item/reagent_containers/food/snacks/donut/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/donut/laugh + ////////////////////////////////////////////////////JELLY DONUTS/////////////////////////////////////////////////////// /datum/crafting_recipe/food/donut/jelly/apple @@ -187,6 +196,14 @@ datum/crafting_recipe/food/donut/meat ) result = /obj/item/reagent_containers/food/snacks/donut/jelly/trumpet +/datum/crafting_recipe/food/donut/jelly/laugh + name = "Sweet Pea Jelly Donut" + reqs = list( + /datum/reagent/consumable/laughsyrup = 3, + /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/donut/jelly/laugh + ////////////////////////////////////////////////////SLIME DONUTS/////////////////////////////////////////////////////// /datum/crafting_recipe/food/donut/slimejelly/apple @@ -253,3 +270,11 @@ datum/crafting_recipe/food/donut/meat /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha + +/datum/crafting_recipe/food/donut/slimejelly/laugh + name = "Sweet Pea Jelly Donut" + reqs = list( + /datum/reagent/consumable/laughsyrup = 3, + /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/laugh diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm index 108307119d..e8640886c2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm @@ -67,7 +67,7 @@ /datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/consumable/blackpepper = 1, /obj/item/reagent_containers/food/snacks/boiledegg = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/meatball = 1 ) result = /obj/item/reagent_containers/food/snacks/scotchegg subcategory = CAT_EGG \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index 3e47904e6e..5b81c54bc5 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -15,7 +15,7 @@ result = /obj/item/reagent_containers/food/snacks/banana_split subcategory = CAT_ICE - /datum/crafting_recipe/food/bluecharrie_float +/datum/crafting_recipe/food/bluecharrie_float name = "Blue Cherry Shake" always_availible = FALSE reqs = list( @@ -276,4 +276,4 @@ /datum/reagent/consumable/laughter = 5 ) result = /obj/item/reagent_containers/food/snacks/snowcones/clown - subcategory = CAT_ICE \ No newline at end of file + subcategory = CAT_ICE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index efb773159d..60b363c168 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -129,7 +129,7 @@ /datum/crafting_recipe/food/sausage name = "Sausage" reqs = list( - /obj/item/reagent_containers/food/snacks/faggot = 1, + /obj/item/reagent_containers/food/snacks/meatball = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet = 2 ) result = /obj/item/reagent_containers/food/snacks/sausage @@ -171,3 +171,14 @@ ) result = /obj/item/reagent_containers/food/snacks/salad/ricepork subcategory = CAT_MEAT + +/datum/crafting_recipe/food/gumbo + name = "Black eyed gumbo" + reqs = list( + /obj/item/reagent_containers/food/snacks/salad/boiledrice = 1, + /obj/item/reagent_containers/food/snacks/grown/peas = 1, + /obj/item/reagent_containers/food/snacks/grown/chili = 1, + /obj/item/reagent_containers/food/snacks/meat/cutlet = 1 + ) + result = /obj/item/reagent_containers/food/snacks/salad/gumbo + subcategory = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 528fc61156..359fadfb70 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -37,7 +37,8 @@ name = "Raw Khinkali" reqs = list( /obj/item/reagent_containers/food/snacks/doughslice = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/meatball = 1, + /obj/item/reagent_containers/food/snacks/grown/garlic = 1 ) result = /obj/item/reagent_containers/food/snacks/rawkhinkali subcategory = CAT_MISCFOOD @@ -47,7 +48,7 @@ reqs = list( /datum/reagent/consumable/soysauce = 5, /obj/item/reagent_containers/food/snacks/bun = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1, + /obj/item/reagent_containers/food/snacks/meatball = 1, /obj/item/reagent_containers/food/snacks/grown/cabbage = 1 ) result = /obj/item/reagent_containers/food/snacks/meatbun @@ -193,3 +194,14 @@ ) result = /mob/living/simple_animal/hostile/bear/butter subcategory = CAT_MISCFOOD + +/datum/crafting_recipe/food/royalcheese + name = "Royal Cheese" + reqs = list( + /obj/item/reagent_containers/food/snacks/store/cheesewheel = 1, + /obj/item/clothing/head/crown = 1, + /datum/reagent/medicine/strange_reagent = 5, + /datum/reagent/toxin/mutagen = 5 + ) + result = /obj/item/reagent_containers/food/snacks/royalcheese + subcategory = CAT_MISCFOOD \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 8a393476a2..6c418ab612 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -177,7 +177,7 @@ name = "Donkpocket" reqs = list( /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/meatball = 1 ) result = /obj/item/reagent_containers/food/snacks/donkpocket subcategory = CAT_PASTRY diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm index 21112a4a4f..a07815a030 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm @@ -71,7 +71,7 @@ name = "Sassysage pizza" reqs = list( /obj/item/reagent_containers/food/snacks/pizzabread = 1, - /obj/item/reagent_containers/food/snacks/faggot = 3, + /obj/item/reagent_containers/food/snacks/meatball = 3, /obj/item/reagent_containers/food/snacks/cheesewedge = 1, /obj/item/reagent_containers/food/snacks/grown/tomato = 1 ) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm index 4c942a0c2d..7cf70dacf2 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm @@ -68,7 +68,7 @@ /datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/consumable/blackpepper = 1, /obj/item/reagent_containers/glass/bowl = 1, - /obj/item/reagent_containers/food/snacks/monkeycube = 1, + /obj/item/reagent_containers/food/snacks/cube/monkey = 1, /obj/item/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/reagent_containers/food/snacks/soup/monkeysdelight @@ -80,7 +80,7 @@ /obj/item/reagent_containers/glass/bowl = 1, /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3, /obj/item/reagent_containers/food/snacks/grown/potato = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/meatball = 1 ) result = /obj/item/reagent_containers/food/snacks/salad/validsalad subcategory = CAT_SALAD @@ -93,4 +93,17 @@ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1 ) result = /obj/item/reagent_containers/food/snacks/salad/caesar - subcategory = CAT_SALAD \ No newline at end of file + subcategory = CAT_SALAD + + +/datum/crafting_recipe/food/edensalad + name = "Salad of Eden" + reqs = list( + /obj/item/reagent_containers/glass/bowl =1, + /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 1, + /obj/item/reagent_containers/food/snacks/grown/ambrosia/deus = 1, + /obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia = 1, + /obj/item/reagent_containers/food/snacks/grown/peace = 1 + ) + result = /obj/item/reagent_containers/food/snacks/salad/edensalad + subcategory = CAT_SALAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm index 45083e0374..d1c13115a5 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm @@ -135,4 +135,14 @@ /obj/item/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/reagent_containers/food/snacks/fishandchips - subcategory = CAT_SEAFOOD \ No newline at end of file + subcategory = CAT_SEAFOOD + +/datum/crafting_recipe/food/fishfry + name = "Fish fry" + reqs = list( + /obj/item/reagent_containers/food/snacks/grown/corn = 1, + /obj/item/reagent_containers/food/snacks/grown/peas =1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/fishfry + subcategory = CAT_SEAFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index ac49537adf..8f4b4c2726 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -104,7 +104,7 @@ reqs = list( /datum/reagent/water = 10, /obj/item/reagent_containers/glass/bowl = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1, + /obj/item/reagent_containers/food/snacks/meatball = 1, /obj/item/reagent_containers/food/snacks/grown/carrot = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1 ) @@ -255,4 +255,16 @@ /obj/item/reagent_containers/glass/bowl = 1 ) result= /obj/item/reagent_containers/food/snacks/soup/wish - subcategory = CAT_SOUP \ No newline at end of file + subcategory = CAT_SOUP + + +/datum/crafting_recipe/food/peasoup + name = "Pea soup" + reqs = list( + /datum/reagent/water = 10, + /obj/item/reagent_containers/food/snacks/grown/peas = 2, + /obj/item/reagent_containers/food/snacks/grown/parsnip = 1, + /obj/item/reagent_containers/food/snacks/grown/carrot = 1 + ) + result = /obj/item/reagent_containers/food/snacks/soup/peasoup + subcategory = CAT_SOUP diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm index 12020a6241..722d91e86c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -15,7 +15,7 @@ name = "Spaghetti meatball" reqs = list( /obj/item/reagent_containers/food/snacks/boiledspaghetti = 1, - /obj/item/reagent_containers/food/snacks/faggot = 2 + /obj/item/reagent_containers/food/snacks/meatball = 2 ) result = /obj/item/reagent_containers/food/snacks/meatballspaghetti subcategory = CAT_SPAGHETTI @@ -24,7 +24,7 @@ name = "Spesslaw" reqs = list( /obj/item/reagent_containers/food/snacks/boiledspaghetti = 1, - /obj/item/reagent_containers/food/snacks/faggot = 4 + /obj/item/reagent_containers/food/snacks/meatball = 4 ) result = /obj/item/reagent_containers/food/snacks/spesslaw subcategory = CAT_SPAGHETTI diff --git a/code/modules/games/unum.dm b/code/modules/games/unum.dm new file mode 100644 index 0000000000..9820fa6754 --- /dev/null +++ b/code/modules/games/unum.dm @@ -0,0 +1,22 @@ +/// A deck of unum cards. Classic. +/obj/item/toy/cards/deck/unum + name = "\improper UNUM deck" + desc = "A deck of unum cards. House rules to argue over not included." + icon = 'icons/obj/toy.dmi' + icon_state = "deck_unum_full" + deckstyle = "unum" + original_size = 108 + +//Populate the deck. +/obj/item/toy/cards/deck/unum/populate_deck() + for(var/colour in list("Red","Yellow","Green","Blue")) + cards += "[colour] 0" //Uno, i mean, cough cough, Unum decks have only one colour of each 0, weird huh? + for(var/k in 0 to 1) //two of each colour of number + cards += "[colour] skip" + cards += "[colour] reverse" + cards += "[colour] draw 2" + for(var/i in 1 to 9) + cards += "[colour] [i]" + for(var/k in 0 to 3) //4 wilds and draw 4s + cards += "Wildcard" + cards += "Draw 4" diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 74432c7cbe..6d9e141309 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -138,7 +138,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico /datum/chatOutput/proc/setMusicVolume(volume = "") if(volume) - adminMusicVolume = CLAMP(text2num(volume), 0, 100) + adminMusicVolume = clamp(text2num(volume), 0, 100) //Sends client connection details to the chat to handle and save /datum/chatOutput/proc/sendClientData() diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index d4dc3cb213..3455a97ba2 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -403,6 +403,12 @@ h1.alert, h2.alert {color: #000000;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .spooky {color: #FF6100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} + +.lethal {color: #bf3d3d; font-weight: bold;} +.stun {color: #0f81bc; font-weight: bold;} +.ion {color: #d084d6; font-weight: bold;} +.xray {color: #32c025; font-weight: bold;} + @keyframes velvet { 0% { color: #400020; } 40% { color: #FF0000; } diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index 314cd42446..0acb127517 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -29,7 +29,7 @@ --ms
    - +
    diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 5f2d92fc93..94c13999ba 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -113,8 +113,6 @@ . = ..() var/eggcolor = pick("blue","green","mime","orange","purple","rainbow","red","yellow") icon_state = "egg-[eggcolor]" - item_color = "[eggcolor]" - /obj/item/reagent_containers/food/snacks/egg/proc/dispensePrize(turf/where) var/won = pick(/obj/item/clothing/head/bunnyhead, /obj/item/clothing/suit/bunnysuit, diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index f51b8b7ea1..82ac374525 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -88,7 +88,7 @@ /obj/item/t_scanner = 5, /obj/item/airlock_painter = 1, /obj/item/stack/cable_coil = 6, - /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/medical/suture = 1, /obj/item/stack/rods = 3, /obj/item/stack/sheet/cardboard = 2, /obj/item/stack/sheet/metal = 1, @@ -117,7 +117,7 @@ /obj/item/weldingtool = 3, /obj/item/wirecutters = 2, /obj/item/wrench = 4, - /obj/item/weaponcrafting/receiver = 1, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, /obj/item/geiger_counter = 3, /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5, /obj/item/assembly/infra = 1, diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 638d1427bc..957d9df376 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -38,8 +38,10 @@ health = 25 density = FALSE speech_span = "spooky" - friendly = "pets" - response_help = "chats with" + friendly_verb_continuous = "pets" + friendly_verb_simple = "pet" + response_help_continuous = "chats with" + response_help_simple = "chat with" light_range = 3 light_color = "#ff9842" var/last_poof @@ -54,8 +56,9 @@ cached_z = z poof() -/mob/living/simple_animal/jacq/Life() - ..() +/mob/living/simple_animal/jacq/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!ckey) if((last_poof+3 MINUTES) < world.realtime) poof() @@ -390,7 +393,7 @@ desc = "A jacqueline o' lantern! You can't seem to get rid of it." icon_state = "hardhat0_pumpkin_j" item_state = "hardhat0_pumpkin_j" - item_color = "pumpkin_j" + hat_type = "pumpkin_j" brightness_on = 4 /obj/item/clothing/head/hardhat/pumpkinhead/jaqc/Initialize() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 68001db517..83bb67b879 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -189,6 +189,14 @@ begin_day = 22 begin_month = APRIL +/datum/holiday/lesbianvisibility + name = "Lesbian Visibility Day" + begin_day = 26 + begin_month = APRIL + +/datum/holiday/lesbianvisibility/greet() + return "Today is Lesbian Visibility Day!" + /datum/holiday/labor name = "Labor Day" begin_day = 1 @@ -292,6 +300,14 @@ /datum/holiday/programmers/getStationPrefix() return pick("span>","DEBUG: ","null","/list","EVENT PREFIX NOT FOUND") //Portability +/datum/holiday/bivisibility + name = "Bisexual Visibility Day" + begin_day = 23 + begin_month = SEPTEMBER + +/datum/holiday/bivisibility/greet() + return "Today is Bisexual Visibility Day!" + /datum/holiday/questions name = "Stupid-Questions Day" begin_day = 28 @@ -314,12 +330,25 @@ begin_month = OCTOBER drone_hat = /obj/item/clothing/head/papersack/smiley +/datum/holiday/comingoutday + name = "Coming Out Day" + begin_day = 11 + begin_month = OCTOBER + /datum/holiday/boss name = "Boss' Day" begin_day = 16 begin_month = OCTOBER drone_hat = /obj/item/clothing/head/that +/datum/holiday/intersexawareness + name = "Intersex Awareness Day" + begin_day = 26 + begin_month = OCTOBER + +/datum/holiday/intersexawareness/greet() + return "Today is Intersex Awareness Day! It has been [text2num(time2text(world.timeofday, "YYYY")) - 1996] years since the first public protest speaking out against the human rights issues faced by intersex people." + /datum/holiday/halloween name = HALLOWEEN begin_day = 28 @@ -359,6 +388,23 @@ begin_month = NOVEMBER drone_hat = /obj/item/reagent_containers/food/snacks/grown/moonflower +/datum/holiday/transawareness + name = "Transgender Awareness Week" + begin_day = 13 + begin_month = NOVEMBER + end_day = 19 + +/datum/holiday/transawareness/greet() + return "This week is Transgender Awareness Week!" + +/datum/holiday/transremembrance + name = "Transgender Day of Remembrance" + begin_day = 20 + begin_month = NOVEMBER + +/datum/holiday/transremembrance/greet() + return "Today is the Transgender Day of Remembrance." + /datum/holiday/hello name = "Saying-'Hello' Day" begin_day = 21 @@ -397,6 +443,26 @@ begin_month = OCTOBER begin_weekday = MONDAY +/datum/holiday/aceawareness + name = "Asexual Awareness Week" + begin_month = OCTOBER + +/datum/holiday/aceawareness/greet() + return "This week is Asexual Awareness Week!" + +/datum/holiday/aceawareness/shouldCelebrate(dd, mm, yy, ww, ddd) //Ace awareness week falls on the last full week of October. + if(mm != begin_month) + return FALSE //it's not even the right month + var/daypointer = world.timeofday - ((WEEKDAY2NUM(ddd) - 1) * 24 HOURS) + if(text2num(time2text(daypointer, "MM")) != mm) + return FALSE //it's the beginning of the month and it isn't even a full week + daypointer += (24 HOURS * 6) + if(text2num(time2text(daypointer, "MM")) != mm) + return FALSE //this is the end of the month, and it is not a full week. + daypointer += (24 HOURS * 7) + if(text2num(time2text(daypointer, "MM")) != mm) + return TRUE //the end of next week falls on a different month, meaning that the current week is the last full week + /datum/holiday/mother name = "Mother's Day" begin_week = 2 @@ -412,11 +478,39 @@ begin_month = JUNE begin_weekday = SUNDAY +/datum/holiday/pride + name = PRIDE_MONTH + begin_day = 1 + begin_month = JUNE + end_day = 30 + +/datum/holiday/pride/getStationPrefix() + return pick("Pride", "Gay", "Bi", "Trans", "Lesbian", "Ace", "Aro", "Agender", pick("Enby", "Enbie"), "Pan", "Intersex", "Demi", "Poly", "Closeted", "Genderfluid") + +/datum/holiday/stonewall + name = "Stonewall Riots Anniversary" + begin_day = 28 + begin_month = JUNE + +/datum/holiday/stonewall/greet() //Not gonna lie, I was fairly tempted to make this use the IC year instead of the IRL year, but I was worried that it would have caused too much confusion. + return "Today marks the [text2num(time2text(world.timeofday, "YYYY")) - 1969]\th anniversary of the riots at the Stonewall Inn!" + /datum/holiday/moth name = "Moth Week" + begin_month = JULY /datum/holiday/moth/shouldCelebrate(dd, mm, yy, ww, ddd) //National Moth Week falls on the last full week of July - return mm == JULY && (ww == 4 || (ww == 5 && ddd == SUNDAY)) + if(mm != begin_month) + return FALSE //it's not even the right month + var/daypointer = world.timeofday - ((WEEKDAY2NUM(ddd) - 1) * 24 HOURS) + if(text2num(time2text(daypointer, "MM")) != mm) + return FALSE //it's the beginning of the month and it isn't even a full week + daypointer += (24 HOURS * 6) + if(text2num(time2text(daypointer, "MM")) != mm) + return FALSE //this is the end of the month, and it is not a full week. + daypointer += (24 HOURS * 7) + if(text2num(time2text(daypointer, "MM")) != mm) + return TRUE //the end of next week falls on a different month, meaning that the current week is the last full week /datum/holiday/moth/getStationPrefix() return pick("Mothball","Lepidopteran","Lightbulb","Moth","Giant Atlas","Twin-spotted Sphynx","Madagascan Sunset","Luna","Death's Head","Emperor Gum","Polyphenus","Oleander Hawk","Io","Rosy Maple","Cecropia","Noctuidae","Giant Leopard","Dysphania Militaris","Garden Tiger") diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 9fb97c08a7..cb9965d34a 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -63,23 +63,34 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( var/src_min_x = 99999 var/src_min_y = 99999 + var/src_max_x = 0 + var/src_max_y = 0 var/list/refined_src = new/list() for (var/turf/T in turfs_src) src_min_x = min(src_min_x,T.x) src_min_y = min(src_min_y,T.y) + src_max_x = max(src_max_x,T.x) + src_max_y = max(src_max_y,T.y) for (var/turf/T in turfs_src) refined_src[T] = "[T.x - src_min_x].[T.y - src_min_y]" var/trg_min_x = 99999 var/trg_min_y = 99999 + var/trg_max_x = 0 + var/trg_max_y = 0 var/list/refined_trg = new/list() for (var/turf/T in turfs_trg) trg_min_x = min(trg_min_x,T.x) trg_min_y = min(trg_min_y,T.y) + trg_max_x = max(trg_max_x,T.x) + trg_max_y = max(trg_max_y,T.y) + + var/diff_x = round(((src_max_x - src_min_x) - (trg_max_x - trg_min_x))/2) + var/diff_y = round(((src_max_y - src_min_y) - (trg_max_y - trg_min_y))/2) for (var/turf/T in turfs_trg) - refined_trg["[T.x - trg_min_x].[T.y - trg_min_y]"] = T + refined_trg["[T.x - trg_min_x + diff_x].[T.y - trg_min_y + diff_y]"] = T var/list/toupdate = new/list() diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index b5cbed8b79..65c69b995f 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -2,7 +2,10 @@ Holodeck Update The on-station holodeck area is of type [holodeck_type]. - All subtypes of [program_type] are loaded into the program cache or emag programs list. + All types found in GLOB.holodeck_areas_per_comp_type[src.type], generated on make_datum_references_lists(), + are loaded into the program cache or emag programs list. + Paths with their abstract_type variable equal to themselves will be skipped. + If init_program is null, a random program will be loaded on startup. If you don't wish this, set it to the offline program or another of your choosing. @@ -12,7 +15,6 @@ 3) Create a new control console that uses those areas Non-mapped areas should be skipped but you should probably comment them out anyway. - The base of program_type will always be ignored; only subtypes will be loaded. */ #define HOLODECK_CD 25 @@ -29,13 +31,12 @@ var/area/holodeck/last_program var/area/offline_program = /area/holodeck/rec_center/offline - var/list/program_cache - var/list/emag_programs - // Splitting this up allows two holodecks of the same size // to use the same source patterns. Y'know, if you want to. - var/holodeck_type = /area/holodeck/rec_center // locate(this) to get the target holodeck - var/program_type = /area/holodeck/rec_center // subtypes of this (but not this itself) are loadable programs + var/holodeck_type = /area/holodeck/rec_center + + var/list/program_cache + var/list/emag_programs var/active = FALSE var/damaged = FALSE @@ -48,16 +49,18 @@ return INITIALIZE_HINT_LATELOAD /obj/machinery/computer/holodeck/LateInitialize() - if(ispath(holodeck_type, /area)) - linked = pop(get_areas(holodeck_type, FALSE)) - if(ispath(offline_program, /area)) - offline_program = pop(get_areas(offline_program), FALSE) - // the following is necessary for power reasons + linked = SSholodeck.target_holodeck_area[type] + offline_program = SSholodeck.offline_programs[type] if(!linked || !offline_program) log_world("No matching holodeck area found") qdel(src) return - var/area/AS = get_area(src) + + program_cache = SSholodeck.program_cache[type] + emag_programs = SSholodeck.emag_program_cache[type] + + // the following is necessary for power reasons + var/area/AS = get_base_area(src) if(istype(AS, /area/holodeck)) log_mapping("Holodeck computer cannot be in a holodeck, This would cause circular power dependency.") qdel(src) @@ -65,7 +68,6 @@ else linked.linked = src - generate_program_list() load_program(offline_program, FALSE, FALSE) /obj/machinery/computer/holodeck/Destroy() @@ -180,19 +182,6 @@ emergency_shutdown() return ..() -/obj/machinery/computer/holodeck/proc/generate_program_list() - for(var/typekey in subtypesof(program_type)) - var/area/holodeck/A = GLOB.areas_by_type[typekey] - if(!A || !A.contents.len) - continue - var/list/info_this = list() - info_this["name"] = A.name - info_this["type"] = A.type - if(A.restricted) - LAZYADD(emag_programs, list(info_this)) - else - LAZYADD(program_cache, list(info_this)) - /obj/machinery/computer/holodeck/proc/toggle_power(toggleOn = FALSE) if(active == toggleOn) return diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 308cec1cbd..09dcd7fa64 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -62,7 +62,7 @@ s.set_up(3, 1, T) s.start() T.temperature = 5000 - T.hotspot_expose(50000,50000,1) + T.hotspot_expose(50000, 50000, TRUE, TRUE) @@ -81,9 +81,7 @@ ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1) if(isliving(mob)) var/mob/living/L = mob - L.feeding = FALSE - L.devourable = FALSE - L.digestable = FALSE + L.vore_flags = 0 return mob /obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 884769ebd4..c68c5de804 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -24,33 +24,31 @@ hitsound = "swing_hit" armour_penetration = 50 var/active = 0 + var/saber_color /obj/item/holo/esword/green/Initialize() . = ..() - item_color = "green" + saber_color = "green" /obj/item/holo/esword/red/Initialize() . = ..() - item_color = "red" + saber_color = "red" -/obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(active) +/obj/item/holo/esword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!active) return ..() - return 0 - -/obj/item/holo/esword/attack(target as mob, mob/user as mob) - ..() + return ..() /obj/item/holo/esword/Initialize() . = ..() - item_color = pick("red","blue","green","purple") + saber_color = pick("red","blue","green","purple") /obj/item/holo/esword/attack_self(mob/living/user as mob) active = !active if (active) force = 30 - icon_state = "sword[item_color]" + icon_state = "sword[saber_color]" w_class = WEIGHT_CLASS_BULKY hitsound = 'sound/weapons/blade1.ogg' playsound(user, 'sound/weapons/saberon.ogg', 20, 1) diff --git a/code/modules/holodeck/mobs.dm b/code/modules/holodeck/mobs.dm index adac4ea7b2..121989bf1e 100644 --- a/code/modules/holodeck/mobs.dm +++ b/code/modules/holodeck/mobs.dm @@ -15,6 +15,9 @@ speak_chance = 1 turns_per_move = 2 butcher_results = list() - response_help = "pets" - response_disarm = "pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "pushes aside" + response_disarm_simple = "push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 6a3fd56208..06d2b3efda 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -40,14 +40,14 @@ updateUsrDialog() /obj/machinery/biogenerator/RefreshParts() - var/E = 0 - var/P = 0 - var/max_storage = 40 + var/E = 0.5 + var/P = 0.5 + var/max_storage = 20 for(var/obj/item/stock_parts/matter_bin/B in component_parts) - P += B.rating - max_storage = 40 * B.rating + P += B.rating * 0.5 + max_storage = max(20 * B.rating, max_storage) for(var/obj/item/stock_parts/manipulator/M in component_parts) - E += M.rating + E += M.rating * 0.5 efficiency = E productivity = P max_items = max_storage @@ -196,7 +196,7 @@ dat += "x5" if(ispath(D.build_path, /obj/item/stack)) dat += "x10" - dat += "([D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency])
    " + dat += "([CEILING(D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency, 1)])
    " dat += "
    " else dat += "
    No container inside, please insert container.
    " @@ -205,6 +205,11 @@ popup.set_content(dat) popup.open() +/obj/machinery/biogenerator/AltClick(mob/living/user) + . = ..() + if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + detach(user) + /obj/machinery/biogenerator/proc/activate() if (usr.stat != CONSCIOUS) return @@ -214,12 +219,16 @@ to_chat(usr, "The biogenerator is in the process of working.") return var/S = 0 + var/total = 0 for(var/obj/item/reagent_containers/food/snacks/grown/I in contents) S += 5 - if(I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) < 0.1) - points += 1*productivity - else points += I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)*10*productivity + var/nutri_amount = I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) + if(nutri_amount < 0.1) + total += 1*productivity + else + total += nutri_amount*10*productivity qdel(I) + points += round(total) if(S) processing = TRUE update_icon() @@ -235,12 +244,13 @@ /obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = TRUE) if(materials.len != 1 || materials[1] != SSmaterials.GetMaterialRef(/datum/material/biomass)) return FALSE - if (materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency > points) + var/cost = CEILING(materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency, 1) + if (cost > points) menustat = "nopoints" return FALSE else if(remove_points) - points -= materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency + points -= cost update_icon() updateUsrDialog() return TRUE @@ -288,9 +298,9 @@ update_icon() return . -/obj/machinery/biogenerator/proc/detach() +/obj/machinery/biogenerator/proc/detach(mob/living/user) if(beaker) - beaker.forceMove(drop_location()) + user.put_in_hands(beaker) beaker = null update_icon() @@ -305,13 +315,13 @@ updateUsrDialog() else if(href_list["detach"]) - detach() + detach(usr) updateUsrDialog() else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) //Can't be outside these (if you change this keep a sane limit) - amount = CLAMP(amount, 1, 50) + amount = clamp(amount, 1, 50) var/id = href_list["create"] if(!stored_research.researched_designs.Find(id)) //naughty naughty diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 80792538d6..eba7a3d3c4 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -90,7 +90,7 @@ lifespan = 30 endurance = 25 mutatelist = list() - genes = list(/datum/plant_gene/trait/glow/white, /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest) + genes = list(/datum/plant_gene/trait/glow/white, /datum/plant_gene/trait/repeated_harvest) reagents_add = list(/datum/reagent/uranium = 0.25, /datum/reagent/iodine = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 851753da46..f4748ccde8 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -195,7 +195,7 @@ /obj/item/reagent_containers/food/snacks/grown/firelemon/ex_act(severity) qdel(src) //Ensuring that it's deleted by its own explosion -/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime() +/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime(mob/living/lanced_by) switch(seed.potency) //Combustible lemons are alot like IEDs, lots of flame, very little bang. if(0 to 30) update_mob() diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 4843d863c5..8b0dcdaae1 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -318,3 +318,4 @@ bitesize_mod = 8 tastes = list("wax" = 1) foodtype = SUGAR + distill_reagent = /datum/reagent/consumable/ethanol/mead diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm new file mode 100644 index 0000000000..4184b85008 --- /dev/null +++ b/code/modules/hydroponics/grown/garlic.dm @@ -0,0 +1,29 @@ +/obj/item/seeds/garlic + name = "pack of garlic seeds" + desc = "A packet of extremely pungent seeds." + icon_state = "seed-garlic" + species = "garlic" + plantname = "Garlic Sprouts" + product = /obj/item/reagent_containers/food/snacks/grown/garlic + yield = 6 + potency = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1) + +/obj/item/reagent_containers/food/snacks/grown/garlic + seed = /obj/item/seeds/garlic + name = "garlic" + desc = "Delicious, but with a potentially overwhelming odor." + icon_state = "garlic" + filling_color = "#C0C9A0" + bitesize_mod = 2 + tastes = list("garlic" = 1) + wine_power = 10 + +/obj/item/clothing/neck/garlic_necklace + name = "garlic necklace" + desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked." + icon_state = "garlic_necklace" + item_state = "garlic_necklace" + \ No newline at end of file diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 44abb4939b..e5c8f72dfe 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -223,7 +223,7 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity) qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs -/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() +/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime(mob/living/lanced_by) icon_state = "cherry_bomb_lit" playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0) addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100)) @@ -492,9 +492,6 @@ return var/turf/T = get_turf(src) reagents.chem_temp = 1000 - //Disable seperated contents when the grenade primes - if (seed.get_gene(/datum/plant_gene/trait/noreact)) - DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT) reagents.handle_reactions() log_game("Coconut bomb detonation at [AREACOORD(T)], location [loc]") qdel(src) diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 2ebaa6d5e2..a75b9caf5f 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -14,7 +14,7 @@ weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) - mutatelist = list(/obj/item/seeds/onion/red) + mutatelist = list(/obj/item/seeds/onion/red, /obj/item/seeds/garlic) /obj/item/reagent_containers/food/snacks/grown/onion seed = /obj/item/seeds/onion diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm new file mode 100644 index 0000000000..6229d98b2c --- /dev/null +++ b/code/modules/hydroponics/grown/peas.dm @@ -0,0 +1,102 @@ +// Finally, peas. Base plant. +/obj/item/seeds/peas + name = "pack of pea pods" + desc = "These seeds grows into vitamin rich peas!" + icon_state = "seed-peas" + species = "peas" + plantname = "Pea Vines" + product = /obj/item/reagent_containers/food/snacks/grown/peas + maturation = 3 + potency = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + icon_grow = "peas-grow" + icon_dead = "peas-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) + mutatelist = list(/obj/item/seeds/peas/laugh) // TODO: Add /obj/item/seeds/peas/shoot at a later date, for the peashooter mutation line + reagents_add = list (/datum/reagent/consumable/nutriment/vitamin = 0.1, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/water = 0.05) + + +/obj/item/reagent_containers/food/snacks/grown/peas + seed = /obj/item/seeds/peas + name = "peapod" + desc = "Finally... peas." + icon_state = "peas" + filling_color = "#739122" + bitesize_mod = 1 + foodtype = VEGETABLES + tastes = list ("peas" = 1, "chalky saltiness" = 1) + wine_power = 50 + wine_flavor = "what is, distressingly, fermented peas." + // distill_regeant = /datum/reagent/saltpetre //if allowed, remove wine_power, ya dingus. + + +// Laughin' Peas +/obj/item/seeds/peas/laugh + name = "pack of laughin' peas" + desc = "These seeds give off a very soft purple glow.. they should grow into Laughin' Peas." + icon_state = "seed-laughpeas" + species = "laughpeas" + plantname = "Laughin' Peas" + product = /obj/item/reagent_containers/food/snacks/grown/laugh + maturation = 7 + potency = 10 + yield = 7 + production = 5 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + icon_grow = "laughpeas-grow" + icon_dead = "laughpeas-dead" + genes = list (/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/purple) + mutatelist = list (/obj/item/seeds/peas/laugh/peace) + reagents_add = list (/datum/reagent/consumable/laughter = 0.05, /datum/reagent/consumable/sugar = 0.05, /datum/reagent/consumable/nutriment = 0.07) + rarity = 25 //It actually might make Central Command Officials loosen up a smidge, eh? + + +/obj/item/reagent_containers/food/snacks/grown/laugh + seed = /obj/item/seeds/peas/laugh + name = "pod of laughin' peas" + desc = "Ridens Cicer, guaranteed to improve your mood dramatically upon consumption!" + icon_state = "laughpeas" + filling_color = "#ee7bee" + bitesize_mod = 2 + foodtype = VEGETABLES + tastes = list ("a prancing rabbit" = 1) //Vib Ribbon sends her regards.. wherever she is. + wine_power = 90 + wine_flavor = "a vector-graphic rabbit dancing on your tongue" + + +// World Peas - Peace at last, peace at last... +/obj/item/seeds/peas/laugh/peace + name = "pack of world peas" + desc = "These rather large seeds give off a soothing blue glow..." + icon_state = "seed-worldpeas" + species = "worldpeas" + plantname = "World Peas" + product = /obj/item/reagent_containers/food/snacks/grown/peace + maturation = 20 + potency = 75 + yield = 1 + production = 10 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + icon_grow = "worldpeas-grow" + icon_dead = "worldpeas-dead" + genes = list (/datum/plant_gene/trait/glow/blue) + reagents_add = list (/datum/reagent/pax = 0.1, /datum/reagent/drug/happiness = 0.1, /datum/reagent/consumable/nutriment = 0.15) + rarity = 50 // This absolutely will make even the most hardened Syndicate Operators relax, and lay down their arms. + + +/obj/item/reagent_containers/food/snacks/grown/peace + seed = /obj/item/seeds/peas/laugh/peace + name = "cluster of world peas" + desc = "A plant discovered through extensive genetic engineering, and iterative graft work. It's rumored to bring peace to any who consume it. In the wider AgSci community, it's attained the nickname of 'Pax Mundi'." //at last... world peas. I'm not sorry. + icon_state = "worldpeas" + filling_color = "#0099CC" + bitesize_mod = 4 + foodtype = VEGETABLES + tastes = list ("numbing tranquility" = 2, "warmth" = 1) + wine_power = 100 + wine_flavor = "mind-numbing peace and warmth" + + diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 3769f9eacc..aeddf771b8 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -78,7 +78,7 @@ make_podman = 1 break else - if(M.ckey == ckey && M.stat == DEAD && !M.suiciding) + if(M.ckey == ckey && M.stat == DEAD && !M.suiciding && AmBloodsucker(M)) make_podman = 1 if(isliving(M)) var/mob/living/L = M diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 44e11c372d..48990d88c9 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -51,6 +51,7 @@ desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it." species = "catnip" plantname = "Catnip Plant" + growthstages = 3 product = /obj/item/reagent_containers/food/snacks/grown/tea/catnip reagents_add = list(/datum/reagent/pax/catnip = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.06, /datum/reagent/toxin/teapowder = 0.3) rarity = 50 diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index 1e2d25d825..db929d45fb 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -34,6 +34,7 @@ mutatelist = list() reagents_add = list(/datum/reagent/medicine/salbutamol = 0.05, /datum/reagent/drug/nicotine = 0.08, /datum/reagent/consumable/nutriment = 0.03) rarity = 20 + genes = list(/datum/plant_gene/trait/smoke) //get it? because you smoke tobacco? i'm hilarious. /obj/item/reagent_containers/food/snacks/grown/tobacco/space seed = /obj/item/seeds/tobacco/space diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 1775a1f9b1..a18dbe165d 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -199,8 +199,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - W.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) else return ..() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 718033ac56..b7665d7b5d 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -928,26 +928,26 @@ /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// /obj/machinery/hydroponics/proc/adjustNutri(adjustamt) - nutrilevel = CLAMP(nutrilevel + adjustamt, 0, maxnutri) + nutrilevel = clamp(nutrilevel + adjustamt, 0, maxnutri) /obj/machinery/hydroponics/proc/adjustWater(adjustamt) - waterlevel = CLAMP(waterlevel + adjustamt, 0, maxwater) + waterlevel = clamp(waterlevel + adjustamt, 0, maxwater) if(adjustamt>0) adjustToxic(-round(adjustamt/4))//Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. /obj/machinery/hydroponics/proc/adjustHealth(adjustamt) if(myseed && !dead) - plant_health = CLAMP(plant_health + adjustamt, 0, myseed.endurance) + plant_health = clamp(plant_health + adjustamt, 0, myseed.endurance) /obj/machinery/hydroponics/proc/adjustToxic(adjustamt) - toxic = CLAMP(toxic + adjustamt, 0, 100) + toxic = clamp(toxic + adjustamt, 0, 100) /obj/machinery/hydroponics/proc/adjustPests(adjustamt) - pestlevel = CLAMP(pestlevel + adjustamt, 0, 10) + pestlevel = clamp(pestlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/adjustWeeds(adjustamt) - weedlevel = CLAMP(weedlevel + adjustamt, 0, 10) + weedlevel = clamp(weedlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index bf8aa888cc..b18f4396d6 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -216,6 +216,10 @@ name = "Liquid Contents" examine_line = "It has a lot of liquid contents inside." +/datum/plant_gene/trait/squash/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) + // Squash the plant on slip. + G.squash(C) + /datum/plant_gene/trait/slip // Makes plant slippery, unless it has a grown-type trash. Then the trash gets slippery. // Applies other trait effects (teleporting, etc) to the target by on_slip. @@ -364,20 +368,6 @@ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... qdel(G) - -/datum/plant_gene/trait/noreact - // Makes plant reagents not react until squashed. - name = "Separated Chemicals" - -/datum/plant_gene/trait/noreact/on_new(obj/item/reagent_containers/food/snacks/grown/G, newloc) - ..() - ENABLE_BITFIELD(G.reagents.reagents_holder_flags, NO_REACT) - -/datum/plant_gene/trait/noreact/on_squash(obj/item/reagent_containers/food/snacks/grown/G, atom/target) - DISABLE_BITFIELD(G.reagents.reagents_holder_flags, NO_REACT) - G.reagents.handle_reactions() - - /datum/plant_gene/trait/maxchem // 2x to max reagents volume. name = "Densified Chemicals" @@ -402,8 +392,7 @@ /datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user) if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = I - if(C.use(5)) + if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT)) to_chat(user, "You add some cable to [G] and slide it inside the battery encasing.") var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc) pocell.icon_state = G.icon_state diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index aa0e789721..5e49a32a23 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -211,7 +211,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /// Setters procs /// /obj/item/seeds/proc/adjust_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = CLAMP(yield + adjustamt, 0, 10) + yield = clamp(yield + adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -220,39 +220,39 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) C.value = yield /obj/item/seeds/proc/adjust_lifespan(adjustamt) - lifespan = CLAMP(lifespan + adjustamt, 10, 100) + lifespan = clamp(lifespan + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/adjust_endurance(adjustamt) - endurance = CLAMP(endurance + adjustamt, 10, 100) + endurance = clamp(endurance + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/adjust_production(adjustamt) if(yield != -1) - production = CLAMP(production + adjustamt, 1, 10) + production = clamp(production + adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) - potency = CLAMP(potency + adjustamt, 0, 100) + potency = clamp(potency + adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/adjust_weed_rate(adjustamt) - weed_rate = CLAMP(weed_rate + adjustamt, 0, 10) + weed_rate = clamp(weed_rate + adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/adjust_weed_chance(adjustamt) - weed_chance = CLAMP(weed_chance + adjustamt, 0, 67) + weed_chance = clamp(weed_chance + adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance @@ -261,7 +261,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /obj/item/seeds/proc/set_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = CLAMP(adjustamt, 0, 10) + yield = clamp(adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -270,39 +270,39 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) C.value = yield /obj/item/seeds/proc/set_lifespan(adjustamt) - lifespan = CLAMP(adjustamt, 10, 100) + lifespan = clamp(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/set_endurance(adjustamt) - endurance = CLAMP(adjustamt, 10, 100) + endurance = clamp(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/set_production(adjustamt) if(yield != -1) - production = CLAMP(adjustamt, 1, 10) + production = clamp(adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/set_potency(adjustamt) if(potency != -1) - potency = CLAMP(adjustamt, 0, 100) + potency = clamp(adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/set_weed_rate(adjustamt) - weed_rate = CLAMP(adjustamt, 0, 10) + weed_rate = clamp(adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/set_weed_chance(adjustamt) - weed_chance = CLAMP(adjustamt, 0, 67) + weed_chance = clamp(adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance diff --git a/code/modules/instruments/instrument_data/_instrument_data.dm b/code/modules/instruments/instrument_data/_instrument_data.dm new file mode 100644 index 0000000000..447bcdffb1 --- /dev/null +++ b/code/modules/instruments/instrument_data/_instrument_data.dm @@ -0,0 +1,107 @@ +/proc/path_to_instrument_ids(path) + if(!ispath(path)) + path = text2path(path) + if(!ispath(path)) + return + if(!ispath(path, /datum/instrument)) + return + . = list() + for(var/i in typesof(path)) + var/datum/instrument/I = i + var/init_id = initial(I.id) + if(init_id) + . |= init_id + +/// Get all non admin_only instruments. +/proc/get_allowed_instrument_ids() + . = list() + for(var/id in SSinstruments.instrument_data) + var/datum/instrument/I = SSinstruments.instrument_data[id] + if(!I.admin_only) + . += I.id + +/datum/instrument + /// Name of the instrument + var/name = "Generic instrument" + /// Uniquely identifies this instrument so runtime changes are possible as opposed to paths. If this is unset, things will use path instead. + var/id + /// Category + var/category = "Unsorted" + /// Used for categorization subtypes + var/abstract_type = /datum/instrument + /// Write here however many samples, follow this syntax: "%note num%"='%sample file%' eg. "27"='synthesizer/e2.ogg'. Key must never be lower than 0 and higher than 127 + var/list/real_samples + /// assoc list key = /datum/instrument_key. do not fill this yourself! + var/list/samples + /// See __DEFINES/flags/instruments.dm + var/instrument_flags = NONE + /// For legacy instruments, the path to our notes + var/legacy_instrument_path + /// For legacy instruments, our file extension + var/legacy_instrument_ext + /// What songs are using us + var/list/datum/song/songs_using = list() + /// Don't touch this + var/static/HIGHEST_KEY = 127 + /// Don't touch this x2 + var/static/LOWEST_KEY = 0 + /// Oh no - For truly troll instruments. + var/admin_only = FALSE + /// Volume multiplier. Synthesized instruments are quite loud and I don't like to cut off potential detail via editing. (someone correct me if this isn't a thing) + var/volume_multiplier = 1/3 + +/datum/instrument/New() + if(isnull(id)) + id = "[type]" + +/datum/instrument/proc/Initialize() + if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_LEGACY | INSTRUMENT_DO_NOT_AUTOSAMPLE)) + return + calculate_samples() + +/datum/instrument/proc/ready() + if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_LEGACY)) + return legacy_instrument_path && legacy_instrument_ext + else if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_DO_NOT_AUTOSAMPLE)) + return length(samples) + return (length(samples) >= 128) + +/datum/instrument/Destroy() + SSinstruments.instrument_data -= id + for(var/i in songs_using) + var/datum/song/S = i + S.set_instrument(null) + real_samples = null + samples = null + songs_using = null + return ..() + +/datum/instrument/proc/calculate_samples() + if(!length(real_samples)) + CRASH("No real samples defined for [id] [type] on calculate_samples() call.") + var/list/real_keys = list() + samples = list() + for(var/key in real_samples) + real_keys += text2num(key) + sortTim(real_keys, /proc/cmp_numeric_asc, associative = FALSE) + + for(var/i in 1 to (length(real_keys) - 1)) + var/from_key = real_keys[i] + var/to_key = real_keys[i+1] + var/sample1 = real_samples[num2text(from_key)] + var/sample2 = real_samples[num2text(to_key)] + var/pivot = FLOOR((from_key + to_key) / 2, 1) //original code was a round but I replaced it because that's effectively a floor, thanks Baystation! who knows what was intended. + for(var/key in from_key to pivot) + samples[num2text(key)] = new /datum/instrument_key(sample1, key, key - from_key) + for(var/key in (pivot + 1) to to_key) + samples[num2text(key)] = new /datum/instrument_key(sample2, key, key - to_key) + + // Fill in 0 to first key and last key to 127 + var/first_key = real_keys[1] + var/last_key = real_keys[length(real_keys)] + var/first_sample = real_samples[num2text(first_key)] + var/last_sample = real_samples[num2text(last_key)] + for(var/key in LOWEST_KEY to (first_key - 1)) + samples[num2text(key)] = new /datum/instrument_key(first_sample, key, key - first_key) + for(var/key in last_key to HIGHEST_KEY) + samples[num2text(key)] = new /datum/instrument_key(last_sample, key, key - last_key) diff --git a/code/modules/instruments/instrument_data/_instrument_key.dm b/code/modules/instruments/instrument_data/_instrument_key.dm new file mode 100644 index 0000000000..012270ae11 --- /dev/null +++ b/code/modules/instruments/instrument_data/_instrument_key.dm @@ -0,0 +1,20 @@ +/datum/instrument_key + var/key //1 to 127 + var/sample //file + var/frequency //frequency generated + var/deviation //deviation up/down towards pivot from sample (??) + +/datum/instrument_key/New(sample = src.sample, key = src.key, deviation = src.deviation, frequency = src.frequency) + src.sample = sample + src.key = key + src.deviation = deviation + src.frequency = frequency + if(!frequency && deviation) + calculate() + +/datum/instrument_key/proc/calculate() + if(!deviation) + CRASH("Invalid calculate call: No deviation or sample in instrument_key") + #define KEY_TWELTH (1/12) + frequency = 2 ** (KEY_TWELTH * deviation) + #undef KEY_TWELTH diff --git a/code/modules/instruments/instrument_data/brass.dm b/code/modules/instruments/instrument_data/brass.dm new file mode 100644 index 0000000000..7f8f103831 --- /dev/null +++ b/code/modules/instruments/instrument_data/brass.dm @@ -0,0 +1,26 @@ +/datum/instrument/brass + name = "Generic brass instrument" + category = "Brass" + abstract_type = /datum/instrument/brass + +/datum/instrument/brass/crisis_section + name = "Crisis Brass Section" + id = "crbrass" + real_samples = list("36"='sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg', + "48"='sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg', + "60"='sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg', + "72"='sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg') + +/datum/instrument/brass/crisis_trombone + name = "Crisis Trombone" + id = "crtrombone" + real_samples = list("36"='sound/instruments/synthesis_samples/brass/crisis_trombone/c2.ogg', + "48"='sound/instruments/synthesis_samples/brass/crisis_trombone/c3.ogg', + "60"='sound/instruments/synthesis_samples/brass/crisis_trombone/c4.ogg', + "72"='sound/instruments/synthesis_samples/brass/crisis_trombone/c5.ogg') + +/datum/instrument/brass/crisis_trumpet + name = "Crisis Trumpet" + id = "crtrumpet" + real_samples = list("60"='sound/instruments/synthesis_samples/brass/crisis_trumpet/c4.ogg', + "72"='sound/instruments/synthesis_samples/brass/crisis_trumpet/c5.ogg') diff --git a/code/modules/instruments/instrument_data/chromatic_percussion.dm b/code/modules/instruments/instrument_data/chromatic_percussion.dm new file mode 100644 index 0000000000..cafa9e31ed --- /dev/null +++ b/code/modules/instruments/instrument_data/chromatic_percussion.dm @@ -0,0 +1,31 @@ +/datum/instrument/chromatic + name = "Generic chromatic percussion instrument" + category = "Chromatic percussion" + abstract_type = /datum/instrument/chromatic + +/datum/instrument/chromatic/vibraphone1 + name = "Crisis Vibraphone" + id = "crvibr" + real_samples = list("36"='sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg', + "48"='sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg', + "60"='sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg', + "72"='sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg') + +/datum/instrument/chromatic/musicbox1 + name = "SGM Music Box" + id = "sgmmbox" + real_samples = list("36"='sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg', + "48"='sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg', + "60"='sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg', + "72"='sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg') + +/datum/instrument/chromatic/fluid_celeste + name = "FluidR3 Celeste" + id = "r3celeste" + real_samples = list("36"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c2.ogg', + "48"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c3.ogg', + "60"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c4.ogg', + "72"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c5.ogg', + "84"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c6.ogg', + "96"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c7.ogg', + "108"='sound/instruments/synthesis_samples/chromatic/fluid_celeste/c8.ogg') diff --git a/code/modules/instruments/instrument_data/fun.dm b/code/modules/instruments/instrument_data/fun.dm new file mode 100644 index 0000000000..44d78b8ccd --- /dev/null +++ b/code/modules/instruments/instrument_data/fun.dm @@ -0,0 +1,25 @@ +/datum/instrument/fun + name = "Generic Fun Instrument" + category = "Fun" + abstract_type = /datum/instrument/fun + +/datum/instrument/fun/honk + name = "!!HONK!!" + id = "honk" + real_samples = list("74"='sound/items/bikehorn.ogg') // Cluwne Heaven + +/datum/instrument/fun/signal + name = "Ping" + id = "ping" + real_samples = list("79"='sound/machines/ping.ogg') + +/datum/instrument/fun/chime + name = "Chime" + id = "chime" + real_samples = list("79"='sound/machines/chime.ogg') + +/datum/instrument/fun/nya + name = "NYA NYA NYA" + id = "nyanyanya" + real_samples = list("79" = 'modular_citadel/sound/voice/nya.ogg') + admin_only = TRUE diff --git a/code/modules/instruments/instrument_data/guitar.dm b/code/modules/instruments/instrument_data/guitar.dm new file mode 100644 index 0000000000..be7cfbe467 --- /dev/null +++ b/code/modules/instruments/instrument_data/guitar.dm @@ -0,0 +1,36 @@ +/datum/instrument/guitar + name = "Generic guitar-like instrument" + category = "Guitar" + abstract_type = /datum/instrument/guitar + +/datum/instrument/guitar/steel_crisis + name = "Crisis Steel String Guitar" + id = "csteelgt" + real_samples = list("36"='sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg', + "48"='sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg', + "60"='sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg', + "72"='sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg') + +/datum/instrument/guitar/nylon_crisis + name = "Crisis Nylon String Guitar" + id = "cnylongt" + real_samples = list("36"='sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg', + "48"='sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg', + "60"='sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg', + "72"='sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg') + +/datum/instrument/guitar/clean_crisis + name = "Crisis Clean Guitar" + id = "ccleangt" + real_samples = list("36"='sound/instruments/synthesis_samples/guitar/crisis_clean/c2.ogg', + "48"='sound/instruments/synthesis_samples/guitar/crisis_clean/c3.ogg', + "60"='sound/instruments/synthesis_samples/guitar/crisis_clean/c4.ogg', + "72"='sound/instruments/synthesis_samples/guitar/crisis_clean/c5.ogg') + +/datum/instrument/guitar/muted_crisis + name = "Crisis Muted Guitar" + id = "cmutedgt" + real_samples = list("36"='sound/instruments/synthesis_samples/guitar/crisis_muted/c2.ogg', + "48"='sound/instruments/synthesis_samples/guitar/crisis_muted/c3.ogg', + "60"='sound/instruments/synthesis_samples/guitar/crisis_muted/c4.ogg', + "72"='sound/instruments/synthesis_samples/guitar/crisis_muted/c5.ogg') diff --git a/code/modules/instruments/instrument_data/hardcoded.dm b/code/modules/instruments/instrument_data/hardcoded.dm new file mode 100644 index 0000000000..757fea08a8 --- /dev/null +++ b/code/modules/instruments/instrument_data/hardcoded.dm @@ -0,0 +1,86 @@ +//THESE ARE HARDCODED INSTRUMENT SAMPLES. +//SONGS WILL BE AUTOMATICALLY SWITCHED TO LEGACY MODE IF THEY USE THIS KIND OF INSTRUMENT! +//I'd prefer these stayed. They sound different from the mechanical synthesis of synthed instruments, and I quite like them that way. It's not legacy, it's hardcoded, old style. - kevinz000 +/datum/instrument/hardcoded + abstract_type = /datum/instrument/hardcoded + category = "Non-Synthesized" + instrument_flags = INSTRUMENT_LEGACY + volume_multiplier = 1 //not as loud as synth'd + +/datum/instrument/hardcoded/accordian + name = "Accordian" + id = "accordian" + legacy_instrument_ext = "mid" + legacy_instrument_path = "accordian" + +/datum/instrument/hardcoded/bikehorn + name = "Bike Horn" + id = "bikehorn" + legacy_instrument_ext = "ogg" + legacy_instrument_path = "bikehorn" + +/datum/instrument/hardcoded/eguitar + name = "Electric Guitar" + id = "eguitar" + legacy_instrument_ext = "ogg" + legacy_instrument_path = "eguitar" + +/datum/instrument/hardcoded/glockenspiel + name = "Glockenspiel" + id = "glockenspiel" + legacy_instrument_ext = "mid" + legacy_instrument_path = "glockenspiel" + +/datum/instrument/hardcoded/guitar + name = "Guitar" + id = "guitar" + legacy_instrument_ext = "ogg" + legacy_instrument_path = "guitar" + +/datum/instrument/hardcoded/harmonica + name = "Harmonica" + id = "harmonica" + legacy_instrument_ext = "mid" + legacy_instrument_path = "harmonica" + +/datum/instrument/hardcoded/piano + name = "Piano" + id = "piano" + legacy_instrument_ext = "ogg" + legacy_instrument_path = "piano" + +/datum/instrument/hardcoded/recorder + name = "Recorder" + id = "recorder" + legacy_instrument_ext = "mid" + legacy_instrument_path = "recorder" + +/datum/instrument/hardcoded/saxophone + name = "Saxophone" + id = "saxophone" + legacy_instrument_ext = "mid" + legacy_instrument_path = "saxophone" + +/datum/instrument/hardcoded/trombone + name = "Trombone" + id = "trombone" + legacy_instrument_ext = "mid" + legacy_instrument_path = "trombone" + +/datum/instrument/hardcoded/violin + name = "Violin" + id = "violin" + legacy_instrument_ext = "mid" + legacy_instrument_path = "violin" + +/datum/instrument/hardcoded/xylophone + name = "Xylophone" + id = "xylophone" + legacy_instrument_ext = "mid" + legacy_instrument_path = "xylophone" + +/datum/instrument/hardcoded/banjo + name = "Banjo" + id = "banjo" + legacy_instrument_ext = "ogg" + legacy_instrument_path = "banjo" diff --git a/code/modules/instruments/instrument_data/organ.dm b/code/modules/instruments/instrument_data/organ.dm new file mode 100644 index 0000000000..25da740998 --- /dev/null +++ b/code/modules/instruments/instrument_data/organ.dm @@ -0,0 +1,43 @@ +/datum/instrument/organ + name = "Generic organ" + category = "Organ" + abstract_type = /datum/instrument/organ + +/datum/instrument/organ/crisis_church + name = "Crisis Church Organ" + id = "crichugan" + real_samples = list("36"='sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg', + "48"='sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg', + "60"='sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg', + "72"='sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg') + +/datum/instrument/organ/crisis_hammond + name = "Crisis Hammond Organ" + id = "crihamgan" + real_samples = list("36"='sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg', + "48"='sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg', + "60"='sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg', + "72"='sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg') + +/datum/instrument/organ/crisis_accordian + name = "Crisis Accordian" + id = "crack" + real_samples = list("36"='sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg', + "48"='sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg', + "60"='sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg', + "72"='sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg') + +/datum/instrument/organ/crisis_harmonica + name = "Crisis Harmonica" + id = "crharmony" + real_samples = list("48"='sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg', + "60"='sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg', + "72"='sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg') + +/datum/instrument/organ/crisis_tango_accordian + name = "Crisis Tango Accordian" + id = "crtango" + real_samples = list("36"='sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg', + "48"='sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg', + "60"='sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg', + "72"='sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg') diff --git a/code/modules/instruments/instrument_data/piano.dm b/code/modules/instruments/instrument_data/piano.dm new file mode 100644 index 0000000000..fdd2f6e938 --- /dev/null +++ b/code/modules/instruments/instrument_data/piano.dm @@ -0,0 +1,56 @@ +/datum/instrument/piano + name = "Generic piano" + category = "Piano" + abstract_type = /datum/instrument/piano + +/datum/instrument/piano/fluid_piano + name = "FluidR3 Grand Piano" + id = "r3grand" + real_samples = list("36"='sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg', + "48"='sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg', + "60"='sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg', + "72"='sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg', + "84"='sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg', + "96"='sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg', + "108"='sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg') + +/datum/instrument/piano/fluid_harpsichord + name = "FluidR3 Harpsichord" + id = "r3harpsi" + real_samples = list("36"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c2.ogg', + "48"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c3.ogg', + "60"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c4.ogg', + "72"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c5.ogg', + "84"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c6.ogg', + "96"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c7.ogg', + "108"='sound/instruments/synthesis_samples/piano/fluid_harpsi/c8.ogg') + +/datum/instrument/piano/crisis_harpsichord + name = "Crisis Harpsichord" + id = "crharpsi" + real_samples = list("36"='sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg', + "48"='sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg', + "60"='sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg', + "72"='sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg') + +/datum/instrument/piano/crisis_grandpiano_uni + name = "Crisis Grand Piano One" + id = "crgrand1" + real_samples = list("36"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg', + "48"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg', + "60"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg', + "72"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg', + "84"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg', + "96"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg', + "108"='sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg') + +/datum/instrument/piano/crisis_brightpiano_uni + name = "Crisis Bright Piano One" + id = "crbright1" + real_samples = list("36"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg', + "48"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg', + "60"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg', + "72"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg', + "84"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg', + "96"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg', + "108"='sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg') diff --git a/code/modules/instruments/instrument_data/synth_tones.dm b/code/modules/instruments/instrument_data/synth_tones.dm new file mode 100644 index 0000000000..9ad9250f40 --- /dev/null +++ b/code/modules/instruments/instrument_data/synth_tones.dm @@ -0,0 +1,19 @@ +/datum/instrument/tones + name = "Ideal tone" + category = "Tones" + abstract_type = /datum/instrument/tones + +/datum/instrument/tones/square_wave + name = "Ideal square wave" + id = "square" + real_samples = list("81"='sound/instruments/synthesis_samples/tones/Square.ogg') + +/datum/instrument/tones/sine_wave + name = "Ideal sine wave" + id = "sine" + real_samples = list("81"='sound/instruments/synthesis_samples/tones/Sine.ogg') + +/datum/instrument/tones/saw_wave + name = "Ideal sawtooth wave" + id = "saw" + real_samples = list("81"='sound/instruments/synthesis_samples/tones/Sawtooth.ogg') diff --git a/code/game/objects/items/devices/instruments.dm b/code/modules/instruments/instruments/item.dm similarity index 78% rename from code/game/objects/items/devices/instruments.dm rename to code/modules/instruments/instruments/item.dm index 8dedc2cb86..0141a4baee 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/modules/instruments/instruments/item.dm @@ -1,83 +1,85 @@ //copy pasta of the space piano, don't hurt me -Pete /obj/item/instrument name = "generic instrument" - resistance_flags = FLAMMABLE force = 10 max_integrity = 100 + resistance_flags = FLAMMABLE icon = 'icons/obj/musician.dmi' lefthand_file = 'icons/mob/inhands/equipment/instruments_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/instruments_righthand.dmi' var/datum/song/handheld/song - var/instrumentId = "generic" - var/instrumentExt = "mid" - var/tune_time = 0 - -/obj/item/instrument/Initialize() - . = ..() - song = new(instrumentId, src, instrumentExt) - -/obj/item/instrument/Destroy() - if (tune_time) - STOP_PROCESSING(SSobj, src) - qdel(song) - song = null - return ..() - -/obj/item/instrument/suicide_act(mob/user) - user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) + var/list/allowed_instrument_ids + var/tune_time_left = 0 /obj/item/instrument/Initialize(mapload) . = ..() - if(mapload) - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded + song = new(src, allowed_instrument_ids) + allowed_instrument_ids = null //We don't need this clogging memory after it's used. -/obj/item/instrument/attack_self(mob/user) - if(!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") - return 1 - interact(user) +/obj/item/instrument/Destroy() + QDEL_NULL(song) + if(tune_time_left) + STOP_PROCESSING(SSprocessing, src) + return ..() -/obj/item/instrument/interact(mob/user) - ui_interact(user) +/obj/item/instrument/proc/should_stop_playing(mob/user) + return !user.CanReach(src) || !user.canUseTopic(src, FALSE, TRUE, FALSE, FALSE) -/obj/item/instrument/ui_interact(mob/user) - if(!user) - return - - if(!isliving(user) || user.stat || user.restrained() || user.lying) - return - - user.set_machine(src) - song.interact(user) - -/obj/item/instrument/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/musicaltuner)) - var/mob/living/carbon/human/H = user - if (HAS_TRAIT(H, TRAIT_MUSICIAN)) - if (!tune_time) - H.visible_message("[H] tunes the [src] to perfection!", "You tune the [src] to perfection!") - tune_time = 300 - START_PROCESSING(SSobj, src) - else - to_chat(H, "[src] is already well tuned!") - else - to_chat(H, "You have no idea how to use this.") - -/obj/item/instrument/process() - if (tune_time) +/obj/item/instrument/process(wait) + if(is_tuned()) if (song.playing) for (var/mob/living/M in song.hearing_mobs) M.dizziness = max(0,M.dizziness-2) M.jitteriness = max(0,M.jitteriness-2) M.confused = max(M.confused-1) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "goodmusic", /datum/mood_event/goodmusic) - tune_time-- + tune_time_left -= wait else - if (!tune_time) - if (song.playing) - loc.visible_message("[src] starts sounding a little off...") - STOP_PROCESSING(SSobj, src) + tune_time_left = 0 + if (song.playing) + loc.visible_message("[src] starts sounding a little off...") + STOP_PROCESSING(SSprocessing, src) + +/obj/item/instrument/suicide_act(mob/user) + user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/instrument/attack_self(mob/user) + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do this!") + return TRUE + interact(user) + +/obj/item/instrument/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/musicaltuner)) + var/mob/living/carbon/human/H = user + if (HAS_TRAIT(H, TRAIT_MUSICIAN)) + if (!is_tuned()) + H.visible_message("[H] tunes the [src] to perfection!", "You tune the [src] to perfection!") + tune_time_left = 600 SECONDS + START_PROCESSING(SSprocessing, src) + else + to_chat(H, "[src] is already well tuned!") + else + to_chat(H, "You have no idea how to use this.") + +/obj/item/instrument/proc/is_tuned() + return tune_time_left > 0 + +/obj/item/instrument/dropped(mob/user) + . = ..() + if((loc != user) && (user.machine == src)) + user.unset_machine() + +/obj/item/instrument/interact(mob/user) + ui_interact(user) + +/obj/item/instrument/ui_interact(mob/living/user) + if(!isliving(user) || user.stat || user.restrained()) + return + + user.set_machine(src) + song.ui_interact(user) /obj/item/instrument/violin name = "space violin" @@ -85,7 +87,7 @@ icon_state = "violin" item_state = "violin" hitsound = "swing_hit" - instrumentId = "violin" + allowed_instrument_ids = "violin" /obj/item/instrument/violin/golden name = "golden violin" @@ -99,40 +101,20 @@ desc = "An advanced electronic synthesizer that can be used as various instruments." icon_state = "synth" item_state = "synth" - instrumentId = "piano" - instrumentExt = "ogg" - var/static/list/insTypes = list("accordion" = "mid", "bikehorn" = "ogg", "glockenspiel" = "mid", "banjo" = "ogg", "guitar" = "ogg", "harmonica" = "mid", "piano" = "ogg", "recorder" = "mid", "saxophone" = "mid", "trombone" = "mid", "violin" = "mid", "xylophone" = "mid") //No eguitar you ear-rapey fuckers. - actions_types = list(/datum/action/item_action/synthswitch) + allowed_instrument_ids = "piano" -/obj/item/instrument/piano_synth/proc/changeInstrument(name = "piano") - song.instrumentDir = name - song.instrumentExt = insTypes[name] - -/obj/item/instrument/piano_synth/proc/selectInstrument() // Moved here so it can be used by the action and PAI software panel without copypasta - var/chosen = input("Choose the type of instrument you want to use", "Instrument Selection", song.instrumentDir) as null|anything in insTypes - if(!insTypes[chosen]) - return - return changeInstrument(chosen) - -/obj/item/instrument/banjo - name = "banjo" - desc = "A 'Mura' brand banjo. It's pretty much just a drum with a neck and strings." - icon_state = "banjo" - item_state = "banjo" - instrumentExt = "ogg" - attack_verb = list("scruggs-styled", "hum-diggitied", "shin-digged", "clawhammered") - hitsound = 'sound/weapons/banjoslap.ogg' - instrumentId = "banjo" +/obj/item/instrument/piano_synth/Initialize() + . = ..() + song.allowed_instrument_ids = get_allowed_instrument_ids() /obj/item/instrument/guitar name = "guitar" desc = "It's made of wood and has bronze strings." icon_state = "guitar" item_state = "guitar" - instrumentExt = "ogg" attack_verb = list("played metal on", "serenaded", "crashed", "smashed") hitsound = 'sound/weapons/stringsmash.ogg' - instrumentId = "guitar" + allowed_instrument_ids = "guitar" /obj/item/instrument/eguitar name = "electric guitar" @@ -142,29 +124,28 @@ force = 12 attack_verb = list("played metal on", "shredded", "crashed", "smashed") hitsound = 'sound/weapons/stringsmash.ogg' - instrumentId = "eguitar" - instrumentExt = "ogg" + allowed_instrument_ids = "eguitar" /obj/item/instrument/glockenspiel name = "glockenspiel" desc = "Smooth metal bars perfect for any marching band." icon_state = "glockenspiel" item_state = "glockenspiel" - instrumentId = "glockenspiel" + allowed_instrument_ids = "glockenspiel" /obj/item/instrument/accordion name = "accordion" desc = "Pun-Pun not included." icon_state = "accordion" item_state = "accordion" - instrumentId = "accordion" + allowed_instrument_ids = "accordion" /obj/item/instrument/trumpet name = "trumpet" desc = "To announce the arrival of the king!" icon_state = "trumpet" item_state = "trombone" - instrumentId = "trombone" + allowed_instrument_ids = "trombone" /obj/item/instrument/trumpet/spectral name = "spectral trumpet" @@ -172,7 +153,6 @@ icon_state = "trumpet" item_state = "trombone" force = 0 - instrumentId = "trombone" attack_verb = list("played","jazzed","trumpeted","mourned","dooted","spooked") /obj/item/instrument/trumpet/spectral/Initialize() @@ -188,14 +168,13 @@ desc = "This soothing sound will be sure to leave your audience in tears." icon_state = "saxophone" item_state = "saxophone" - instrumentId = "saxophone" + allowed_instrument_ids = "saxophone" /obj/item/instrument/saxophone/spectral name = "spectral saxophone" desc = "This spooky sound will be sure to leave mortals in bones." icon_state = "saxophone" item_state = "saxophone" - instrumentId = "saxophone" force = 0 attack_verb = list("played","jazzed","saxxed","mourned","dooted","spooked") @@ -204,7 +183,7 @@ AddComponent(/datum/component/spooky) /obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (loc, 'sound/instruments/saxophone/En4.mid', 100,1,-1) + playsound(loc, 'sound/instruments/saxophone/En4.mid', 100,1,-1) ..() /obj/item/instrument/trombone @@ -212,12 +191,11 @@ desc = "How can any pool table ever hope to compete?" icon_state = "trombone" item_state = "trombone" - instrumentId = "trombone" + allowed_instrument_ids = "trombone" /obj/item/instrument/trombone/spectral name = "spectral trombone" desc = "A skeleton's favorite instrument. Apply directly on the mortals." - instrumentId = "trombone" icon_state = "trombone" item_state = "trombone" force = 0 @@ -237,14 +215,14 @@ force = 5 icon_state = "recorder" item_state = "recorder" - instrumentId = "recorder" + allowed_instrument_ids = "recorder" /obj/item/instrument/harmonica name = "harmonica" desc = "For when you get a bad case of the space blues." icon_state = "harmonica" item_state = "harmonica" - instrumentId = "harmonica" + allowed_instrument_ids = "harmonica" slot_flags = ITEM_SLOT_MASK force = 5 w_class = WEIGHT_CLASS_SMALL @@ -271,14 +249,22 @@ lefthand_file = 'icons/mob/inhands/equipment/horns_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/horns_righthand.dmi' attack_verb = list("beautifully honks") - instrumentId = "bikehorn" - instrumentExt = "ogg" + allowed_instrument_ids = "bikehorn" w_class = WEIGHT_CLASS_TINY force = 0 throw_speed = 3 throw_range = 15 hitsound = 'sound/items/bikehorn.ogg' +/obj/item/instrument/banjo + name = "banjo" + desc = "A 'Mura' brand banjo. It's pretty much just a drum with a neck and strings." + icon_state = "banjo" + item_state = "banjo" + attack_verb = list("scruggs-styled", "hum-diggitied", "shin-digged", "clawhammered") + hitsound = 'sound/weapons/banjoslap.ogg' + allowed_instrument_ids = "banjo" + /obj/item/musicaltuner name = "musical tuner" desc = "A device for tuning musical instruments both manual and electronic alike." diff --git a/code/modules/instruments/instruments/stationary.dm b/code/modules/instruments/instruments/stationary.dm new file mode 100644 index 0000000000..f54132984f --- /dev/null +++ b/code/modules/instruments/instruments/stationary.dm @@ -0,0 +1,53 @@ +/obj/structure/musician + name = "Not A Piano" + desc = "Something broke, contact coderbus." + interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_REQUIRES_DEXTERITY + var/can_play_unanchored = FALSE + var/list/allowed_instrument_ids + var/datum/song/song + +/obj/structure/musician/Initialize(mapload) + . = ..() + song = new(src, allowed_instrument_ids) + allowed_instrument_ids = null + +/obj/structure/musician/Destroy() + QDEL_NULL(song) + return ..() + +/obj/structure/musician/proc/should_stop_playing(mob/user) + if(!(anchored || can_play_unanchored)) + return TRUE + if(!user) + return FALSE + return !user.canUseTopic(src, FALSE, TRUE, FALSE, FALSE) //can play with TK and while resting because fun. + +/obj/structure/musician/ui_interact(mob/user) + . = ..() + user.set_machine(src) + song.ui_interact(user) + +/obj/structure/musician/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 40) + return TRUE + +/obj/structure/musician/piano + name = "space minimoog" + icon = 'icons/obj/musician.dmi' + icon_state = "minimoog" + anchored = TRUE + density = TRUE + +/obj/structure/musician/piano/unanchored + anchored = FALSE + +/obj/structure/musician/piano/Initialize(mapload) + . = ..() + if(prob(50) && icon_state == initial(icon_state)) + name = "space minimoog" + desc = "This is a minimoog, like a space piano, but more spacey!" + icon_state = "minimoog" + else + name = "space piano" + desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't." + icon_state = "piano" diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm new file mode 100644 index 0000000000..463398d2f2 --- /dev/null +++ b/code/modules/instruments/songs/_song.dm @@ -0,0 +1,305 @@ +#define MUSICIAN_HEARCHECK_MINDELAY 4 +#define MUSIC_MAXLINES 1000 +#define MUSIC_MAXLINECHARS 300 + +/datum/song + /// Name of the song + var/name = "Untitled" + + /// The atom we're attached to/playing from + var/atom/parent + + /// Our song lines + var/list/lines + + /// delay between notes in deciseconds + var/tempo = 5 + + /// Are we currently playing? + var/playing = FALSE + + /// Are we currently editing? + var/editing = TRUE + /// Is the help screen open? + var/help = FALSE + + /// Repeats left + var/repeat = 0 + /// Maximum times we can repeat + var/max_repeats = 10 + + /// Our volume + var/volume = 75 + /// Max volume + var/max_volume = 75 + /// Min volume - This is so someone doesn't decide it's funny to set it to 0 and play invisible songs. + var/min_volume = 1 + + /// What instruments our built in picker can use. The picker won't show unless this is longer than one. + var/list/allowed_instrument_ids = list("r3grand") + + //////////// Cached instrument variables ///////////// + /// Instrument we are currently using + var/datum/instrument/using_instrument + /// Cached legacy ext for legacy instruments + var/cached_legacy_ext + /// Cached legacy dir for legacy instruments + var/cached_legacy_dir + /// Cached list of samples, referenced directly from the instrument for synthesized instruments + var/list/cached_samples + /// Are we operating in legacy mode (so if the instrument is a legacy instrument) + var/legacy = FALSE + ////////////////////////////////////////////////////// + + /////////////////// Playing variables //////////////// + /** + * Only used in synthesized playback - The chords we compiled. Non assoc list of lists: + * list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...) + * tempo_divisor always exists + * if key1 (and so if there's no keys) doesn't exist it's a rest + * Compilation happens when we start playing and is cleared after we finish playing. + */ + var/list/compiled_chords + /// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1. + var/list/channels_playing = list() + /// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments. + var/list/channels_idle = list() + ////////////////////////////////////////////////////// + + /// Last world.time we checked for who can hear us + var/last_hearcheck = 0 + /// The list of mobs that can hear us + var/list/hearing_mobs + /// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop) + var/debug_mode = FALSE + /// Last time we processed decay + var/last_process_decay + /// Max sound channels to occupy + var/max_sound_channels = CHANNELS_PER_INSTRUMENT + /// Current channels, so we can save a length() call. + var/using_sound_channels = 0 + /// Last channel to play. text. + var/last_channel_played + /// Should we not decay our last played note? + var/full_sustain_held_note = TRUE + + /////////////////////// DO NOT TOUCH THESE /////////////////// + var/octave_min = INSTRUMENT_MIN_OCTAVE + var/octave_max = INSTRUMENT_MAX_OCTAVE + var/key_min = INSTRUMENT_MIN_KEY + var/key_max = INSTRUMENT_MAX_KEY + var/static/list/note_offset_lookup = list(9, 11, 0, 2, 4, 5, 7) + var/static/list/accent_lookup = list("b" = -1, "s" = 1, "#" = 1, "n" = 0) + ////////////////////////////////////////////////////////////// + + ///////////// !!FUN!! - Only works in synthesized mode! ///////////////// + /// Note numbers to shift. + var/note_shift = 0 + var/note_shift_min = -100 + var/note_shift_max = 100 + var/can_noteshift = TRUE + /// The kind of sustain we're using + var/sustain_mode = SUSTAIN_LINEAR + /// When a note is considered dead if it is below this in volume + var/sustain_dropoff_volume = 0 + /// Total duration of linear sustain for 100 volume note to get to SUSTAIN_DROPOFF + var/sustain_linear_duration = 5 + /// Exponential sustain dropoff rate per decisecond + var/sustain_exponential_dropoff = 1.4 + ////////// DO NOT DIRECTLY SET THESE! + /// Do not directly set, use update_sustain() + var/cached_linear_dropoff = 10 + /// Do not directly set, use update_sustain() + var/cached_exponential_dropoff = 1.045 + ///////////////////////////////////////////////////////////////////////// + +/datum/song/New(atom/parent, list/instrument_ids) + SSinstruments.on_song_new(src) + lines = list() + tempo = sanitize_tempo(tempo) + src.parent = parent + if(instrument_ids) + allowed_instrument_ids = islist(instrument_ids)? instrument_ids : list(instrument_ids) + if(length(allowed_instrument_ids)) + set_instrument(allowed_instrument_ids[1]) + hearing_mobs = list() + volume = clamp(volume, min_volume, max_volume) + update_sustain() + +/datum/song/Destroy() + stop_playing() + SSinstruments.on_song_del(src) + lines = null + using_instrument = null + allowed_instrument_ids = null + parent = null + return ..() + +/datum/song/proc/do_hearcheck() + last_hearcheck = world.time + var/list/old = hearing_mobs.Copy() + hearing_mobs.len = 0 + var/turf/source = get_turf(parent) + for(var/mob/M in get_hearers_in_view(15, source)) + if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS)) + continue + hearing_mobs[M] = get_dist(M, source) + var/list/exited = old - hearing_mobs + for(var/i in exited) + terminate_sound_mob(i) + +/// I can either be a datum, id, or path (if the instrument has no id). +/datum/song/proc/set_instrument(datum/instrument/I) + if(using_instrument) + using_instrument.songs_using -= src + using_instrument = null + cached_samples = null + cached_legacy_ext = null + cached_legacy_dir = null + legacy = null + if(istext(I) || ispath(I)) + I = SSinstruments.instrument_data[I] + if(istype(I)) + using_instrument = I + I.songs_using += src + var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY) + if(instrument_legacy) + cached_legacy_ext = I.legacy_instrument_ext + cached_legacy_dir = I.legacy_instrument_path + legacy = TRUE + else + cached_samples = I.samples + legacy = FALSE + +/// THIS IS A BLOCKING CALL. +/datum/song/proc/start_playing(mob/user) + if(playing) + return + if(!using_instrument?.ready()) + to_chat(user, "An error has occured with [src]. Please reset the instrument.") + return + playing = TRUE + updateDialog() + //we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak. + //wrap the rest of the stuff to ensure stop_playing() is called. + last_process_decay = world.time + START_PROCESSING(SSinstruments, src) + . = do_play_lines(user) + stop_playing() + +/datum/song/proc/stop_playing() + if(!playing) + return + playing = FALSE + if(!debug_mode) + compiled_chords = null + STOP_PROCESSING(SSinstruments, src) + terminate_all_sounds(TRUE) + hearing_mobs.len = 0 + updateDialog() + +/// THIS IS A BLOCKING CALL. +/datum/song/proc/do_play_lines(user) + if(!playing) + return + do_hearcheck() + if(legacy) + do_play_lines_legacy(user) + else + do_play_lines_synthesized(user) + +/datum/song/proc/should_stop_playing(mob/user) + return QDELETED(parent) || !using_instrument || !playing + +/datum/song/proc/sanitize_tempo(new_tempo) + new_tempo = abs(new_tempo) + return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS) + +/datum/song/proc/get_bpm() + return 600 / tempo + +/datum/song/proc/set_bpm(bpm) + tempo = sanitize_tempo(600 / bpm) + +/// Updates the window for our user. Override in subtypes. +/datum/song/proc/updateDialog(mob/user = usr) + ui_interact(user) + +/datum/song/process(wait) + if(!playing) + return PROCESS_KILL + var/delay = world.time - last_process_decay + process_decay(delay) + last_process_decay = world.time + +/datum/song/proc/update_sustain() + // Exponential is easy + cached_exponential_dropoff = sustain_exponential_dropoff + // Linear, not so much, since it's a target duration from 100 volume rather than an exponential rate. + var/target_duration = sustain_linear_duration + var/volume_diff = max(0, 100 - sustain_dropoff_volume) + var/volume_decrease_per_decisecond = volume_diff / target_duration + cached_linear_dropoff = volume_decrease_per_decisecond + +/datum/song/proc/set_volume(volume) + src.volume = clamp(volume, max(0, min_volume), min(100, max_volume)) + update_sustain() + updateDialog() + +/datum/song/proc/set_dropoff_volume(volume) + sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) + update_sustain() + updateDialog() + +/datum/song/proc/set_exponential_drop_rate(drop) + sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) + update_sustain() + updateDialog() + +/datum/song/proc/set_linear_falloff_duration(duration) + sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN) + update_sustain() + updateDialog() + +/datum/song/vv_edit_var(var_name, var_value) + . = ..() + if(.) + switch(var_name) + if(NAMEOF(src, volume)) + set_volume(var_value) + if(NAMEOF(src, sustain_dropoff_volume)) + set_dropoff_volume(var_value) + if(NAMEOF(src, sustain_exponential_dropoff)) + set_exponential_drop_rate(var_value) + if(NAMEOF(src, sustain_linear_duration)) + set_linear_falloff_duration(var_value) + +// subtype for handheld instruments, like violin +/datum/song/handheld + +/datum/song/handheld/updateDialog(mob/user = usr) + if(user.machine != src) + return + parent.ui_interact(user) + +/datum/song/handheld/should_stop_playing(mob/user) + . = ..() + if(.) + return TRUE + var/obj/item/instrument/I = parent + return I.should_stop_playing(user) + +// subtype for stationary structures, like pianos +/datum/song/stationary + +/datum/song/stationary/updateDialog(mob/user = usr) + if(user.machine != src) + return + parent.ui_interact(user) + +/datum/song/stationary/should_stop_playing(mob/user) + . = ..() + if(.) + return TRUE + var/obj/structure/musician/M = parent + return M.should_stop_playing(user) diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm new file mode 100644 index 0000000000..d9595797d7 --- /dev/null +++ b/code/modules/instruments/songs/editor.dm @@ -0,0 +1,246 @@ +/datum/song/proc/instrument_status_ui() + . = list() + . += "
    " + . += "Current instrument: " + if(!using_instrument) + . += "No instrument loaded!
    " + else + . += "[using_instrument.name]
    " + . += "Playback Settings:
    " + if(can_noteshift) + . += "Note Shift/Note Transpose: [note_shift] keys / [round(note_shift / 12, 0.01)] octaves
    " + var/smt + var/modetext = "" + switch(sustain_mode) + if(SUSTAIN_LINEAR) + smt = "Linear" + modetext = "Linear Sustain Duration: [sustain_linear_duration / 10] seconds
    " + if(SUSTAIN_EXPONENTIAL) + smt = "Exponential" + modetext = "Exponential Falloff Factor: [sustain_exponential_dropoff]% per decisecond
    " + . += "Sustain Mode: [smt]
    " + . += modetext + . += using_instrument?.ready()? "Status: Ready
    " : "Status: !Instrument Definition Error!
    " + . += "Instrument Type: [legacy? "Legacy" : "Synthesized"]
    " + . += "Volume: [volume]
    " + . += "Volume Dropoff Threshold: [sustain_dropoff_volume]
    " + . += "Sustain indefinitely last held note: [full_sustain_held_note? "Enabled" : "Disabled"].
    " + . += "
    " + +/datum/song/ui_interact(mob/user) + var/list/dat = list() + + dat += instrument_status_ui() + + if(lines.len > 0) + dat += "

    Playback

    " + if(!playing) + dat += "Play Stop

    " + dat += "Repeat Song: " + dat += repeat > 0 ? "--" : "--" + dat += " [repeat] times " + dat += repeat < max_repeats ? "++" : "++" + dat += "
    " + else + dat += "Play Stop
    " + dat += "Repeats left: [repeat]
    " + if(!editing) + dat += "
    Show Editor
    " + else + dat += "

    Editing

    " + dat += "Hide Editor" + dat += " Start a New Song" + dat += " Import a Song

    " + var/bpm = round(600 / tempo) + dat += "Tempo: - [bpm] BPM +

    " + var/linecount = 0 + for(var/line in lines) + linecount += 1 + dat += "Line [linecount]: Edit X [line]
    " + dat += "Add Line

    " + if(help) + dat += "Hide Help
    " + dat += {" + Lines are a series of chords, separated by commas (,), each with notes separated by hyphens (-).
    + Every note in a chord will play together, with chord timed by the tempo.
    +
    + Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
    + By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
    + Example: C,D,E,F,G,A,B will play a C major scale.
    + After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
    + Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
    + A pause may be denoted by an empty chord: C,E,,C,G
    + To make a chord be a different time, end it with /x, where the chord length will be length
    + defined by tempo / x: C,G/2,E/4
    + Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 +
    + Lines may be up to [MUSIC_MAXLINECHARS] characters.
    + A song may only contain up to [MUSIC_MAXLINES] lines.
    + "} + else + dat += "Show Help
    " + + var/datum/browser/popup = new(user, "instrument", parent?.name || "instrument", 700, 500) + popup.set_content(dat.Join("")) + popup.set_title_image(user.browse_rsc_icon(parent.icon, parent.icon_state)) + popup.open() + +/datum/song/proc/ParseSong(text) + set waitfor = FALSE + //split into lines + lines = splittext(text, "\n") + if(lines.len) + var/bpm_string = "BPM: " + if(findtext(lines[1], bpm_string, 1, length(bpm_string) + 1)) + var/divisor = text2num(copytext(lines[1], length(bpm_string) + 1)) || 120 // default + tempo = sanitize_tempo(600 / round(divisor, 1)) + lines.Cut(1, 2) + else + tempo = sanitize_tempo(5) // default 120 BPM + if(lines.len > MUSIC_MAXLINES) + to_chat(usr, "Too many lines!") + lines.Cut(MUSIC_MAXLINES + 1) + var/linenum = 1 + for(var/l in lines) + if(length_char(l) > MUSIC_MAXLINECHARS) + to_chat(usr, "Line [linenum] too long!") + lines.Remove(l) + else + linenum++ + updateDialog(usr) // make sure updates when complete + +/datum/song/Topic(href, href_list) + if(!usr.canUseTopic(parent, TRUE, FALSE, FALSE, FALSE)) + usr << browse(null, "window=instrument") + usr.unset_machine() + return + + parent.add_fingerprint(usr) + + if(href_list["newsong"]) + lines = new() + tempo = sanitize_tempo(5) // default 120 BPM + name = "" + + else if(href_list["import"]) + var/t = "" + do + t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message) + if(!in_range(parent, usr)) + return + + if(length_char(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") + if(cont == "no") + break + while(length_char(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + ParseSong(t) + + else if(href_list["help"]) + help = text2num(href_list["help"]) - 1 + + else if(href_list["edit"]) + editing = text2num(href_list["edit"]) - 1 + + if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. + if(playing) + return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing. + repeat += round(text2num(href_list["repeat"])) + if(repeat < 0) + repeat = 0 + if(repeat > max_repeats) + repeat = max_repeats + + else if(href_list["tempo"]) + tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) + + else if(href_list["play"]) + INVOKE_ASYNC(src, .proc/start_playing, usr) + + else if(href_list["newline"]) + var/newline = html_encode(input("Enter your line: ", parent.name) as text|null) + if(!newline || !in_range(parent, usr)) + return + if(lines.len > MUSIC_MAXLINES) + return + if(length(newline) > MUSIC_MAXLINECHARS) + newline = copytext(newline, 1, MUSIC_MAXLINECHARS) + lines.Add(newline) + + else if(href_list["deleteline"]) + var/num = round(text2num(href_list["deleteline"])) + if(num > lines.len || num < 1) + return + lines.Cut(num, num+1) + + else if(href_list["modifyline"]) + var/num = round(text2num(href_list["modifyline"]),1) + var/content = stripped_input(usr, "Enter your line: ", parent.name, lines[num], MUSIC_MAXLINECHARS) + if(!content || !in_range(parent, usr)) + return + if(num > lines.len || num < 1) + return + lines[num] = content + + else if(href_list["stop"]) + stop_playing() + + else if(href_list["setlinearfalloff"]) + var/amount = input(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration") as null|num + if(!isnull(amount)) + set_linear_falloff_duration(round(amount * 10, world.tick_lag)) + + else if(href_list["setexpfalloff"]) + var/amount = input(usr, "Set exponential sustain factor", "Exponential sustain factor") as null|num + if(!isnull(amount)) + set_exponential_drop_rate(round(amount, 0.00001)) + + else if(href_list["setvolume"]) + var/amount = input(usr, "Set volume", "Volume") as null|num + if(!isnull(amount)) + set_volume(round(amount, 1)) + + else if(href_list["setdropoffvolume"]) + var/amount = input(usr, "Set dropoff threshold", "Dropoff Threshold Volume") as null|num + if(!isnull(amount)) + set_dropoff_volume(round(amount, 0.01)) + + else if(href_list["switchinstrument"]) + if(!length(allowed_instrument_ids)) + return + else if(length(allowed_instrument_ids) == 1) + set_instrument(allowed_instrument_ids[1]) + return + var/list/categories = list() + for(var/i in allowed_instrument_ids) + var/datum/instrument/I = SSinstruments.get_instrument(i) + if(I) + LAZYSET(categories[I.category || "ERROR CATEGORY"], I.name, I.id) + var/cat = input(usr, "Select Category", "Instrument Category") as null|anything in categories + if(!cat) + return + var/list/instruments = categories[cat] + var/choice = input(usr, "Select Instrument", "Instrument Selection") as null|anything in instruments + if(!choice) + return + choice = instruments[choice] //get id + if(choice) + set_instrument(choice) + + else if(href_list["setnoteshift"]) + var/amount = input(usr, "Set note shift", "Note Shift") as null|num + if(!isnull(amount)) + note_shift = clamp(amount, note_shift_min, note_shift_max) + + else if(href_list["setsustainmode"]) + var/choice = input(usr, "Choose a sustain mode", "Sustain Mode") as null|anything in list("Linear", "Exponential") + switch(choice) + if("Linear") + sustain_mode = SUSTAIN_LINEAR + if("Exponential") + sustain_mode = SUSTAIN_EXPONENTIAL + + else if(href_list["togglesustainhold"]) + full_sustain_held_note = !full_sustain_held_note + + updateDialog() diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm new file mode 100644 index 0000000000..fa64656ebc --- /dev/null +++ b/code/modules/instruments/songs/play_legacy.dm @@ -0,0 +1,82 @@ +/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked. +/datum/song/proc/do_play_lines_legacy(mob/user) + while(repeat >= 0) + var/cur_oct[7] + var/cur_acc[7] + for(var/i = 1 to 7) + cur_oct[i] = 3 + cur_acc[i] = "n" + + for(var/line in lines) + for(var/beat in splittext(lowertext(line), ",")) + if(should_stop_playing(user)) + return + var/list/notes = splittext(beat, "/") + if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1. + for(var/note in splittext(notes[1], "-")) + if(length(note) == 0) + continue + var/cur_note = text2ascii(note) - 96 + if(cur_note < 1 || cur_note > 7) + continue + for(var/i=2 to length(note)) + var/ni = copytext(note,i,i+1) + if(!text2num(ni)) + if(ni == "#" || ni == "b" || ni == "n") + cur_acc[cur_note] = ni + else if(ni == "s") + cur_acc[cur_note] = "#" // so shift is never required + else + cur_oct[cur_note] = text2num(ni) + playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note]) + if(notes.len >= 2 && text2num(notes[2])) + sleep(sanitize_tempo(tempo / text2num(notes[2]))) + else + sleep(tempo) + if(should_stop_playing(user)) + return + repeat-- + updateDialog() + repeat = 0 + +// note is a number from 1-7 for A-G +// acc is either "b", "n", or "#" +// oct is 1-8 (or 9 for C) +/datum/song/proc/playnote_legacy(note, acc as text, oct) + // handle accidental -> B<>C of E<>F + if(acc == "b" && (note == 3 || note == 6)) // C or F + if(note == 3) + oct-- + note-- + acc = "n" + else if(acc == "#" && (note == 2 || note == 5)) // B or E + if(note == 2) + oct++ + note++ + acc = "n" + else if(acc == "#" && (note == 7)) //G# + note = 1 + acc = "b" + else if(acc == "#") // mass convert all sharps to flats, octave jump already handled + acc = "b" + note++ + + // check octave, C is allowed to go to 9 + if(oct < 1 || (note == 3 ? oct > 9 : oct > 8)) + return + + // now generate name + var/soundfile = "sound/instruments/[cached_legacy_dir]/[ascii2text(note+64)][acc][oct].[cached_legacy_ext]" + soundfile = file(soundfile) + // make sure the note exists + if(!fexists(soundfile)) + return + // and play + var/turf/source = get_turf(parent) + if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) + do_hearcheck() + var/sound/music_played = sound(soundfile) + for(var/i in hearing_mobs) + var/mob/M = i + M.playsound_local(source, null, volume * using_instrument.volume_multiplier, falloff = 5, S = music_played) + // Could do environment and echo later but not for now diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm new file mode 100644 index 0000000000..5e7c5652a0 --- /dev/null +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -0,0 +1,135 @@ +/datum/song/proc/do_play_lines_synthesized(mob/user) + compile_lines() + while(repeat >= 0) + if(should_stop_playing(user)) + return + var/warned = FALSE + for(var/_chord in compiled_chords) + if(should_stop_playing(user)) + return + var/list/chord = _chord + var/tempodiv = chord[chord.len] + for(var/i in 1 to chord.len - 1) + var/key = chord[i] + if(!playkey_synth(key)) + if(!warned) + warned = TRUE + to_chat(user, "Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.") + sleep(sanitize_tempo(tempo / (tempodiv || 1))) + repeat-- + updateDialog() + repeat = 0 + +/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example +/datum/song/proc/compile_lines() + if(!length(src.lines)) + return + var/list/lines = src.lines //cache for hyepr speed! + compiled_chords = list() + var/list/octaves = list(3, 3, 3, 3, 3, 3, 3) + var/list/accents = list("n", "n", "n", "n", "n", "n", "n") + for(var/line in lines) + var/list/chords = splittext(lowertext(line), ",") + for(var/chord in chords) + var/list/compiled_chord = list() + var/tempodiv = 1 + var/list/notes_tempodiv = splittext(chord, "/") + var/len = length(notes_tempodiv) + if(len >= 2) + tempodiv = text2num(notes_tempodiv[2]) + if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that. + var/list/notes = splittext(notes_tempodiv[1], "-") + for(var/note in notes) + if(length(note) == 0) + continue + // 1-7, A-G + var/key = text2ascii(note) - 96 + if((key < 1) || (key > 7)) + continue + for(var/i in 2 to length(note)) + var/oct_acc = copytext(note, i, i + 1) + var/num = text2num(oct_acc) + if(!num) //it's an accidental + accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks. + else //octave + octaves[key] = clamp(num, octave_min, octave_max) + compiled_chord += clamp((note_offset_lookup[key] + octaves[key] * 12 + accent_lookup[accents[key]]), key_min, key_max) + compiled_chord += tempodiv //this goes last + if(length(compiled_chord)) + compiled_chords[++compiled_chords.len] = compiled_chord + CHECK_TICK + return compiled_chords + +/datum/song/proc/playkey_synth(key) + if(can_noteshift) + key = clamp(key + note_shift, key_min, key_max) + if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) + do_hearcheck() + var/datum/instrument_key/K = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc! + //Should probably add channel limiters here at some point but I don't care right now. + var/channel = pop_channel() + if(isnull(channel)) + return FALSE + . = TRUE + var/sound/copy = sound(K.sample) + var/volume = src.volume * using_instrument.volume_multiplier + copy.frequency = K.frequency + copy.volume = volume + var/channel_text = num2text(channel) + channels_playing[channel_text] = 100 + last_channel_played = channel_text + for(var/i in hearing_mobs) + var/mob/M = i + M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF) + // Could do environment and echo later but not for now + +/datum/song/proc/terminate_all_sounds(clear_channels = TRUE) + for(var/i in hearing_mobs) + terminate_sound_mob(i) + if(clear_channels) + channels_playing.len = 0 + channels_idle.len = 0 + SSinstruments.current_instrument_channels -= using_sound_channels + using_sound_channels = 0 + SSsounds.free_datum_channels(src) + +/datum/song/proc/terminate_sound_mob(mob/M) + for(var/channel in channels_playing) + M.stop_sound_channel(text2num(channel)) + +/datum/song/proc/pop_channel() + if(length(channels_idle)) //just pop one off of here if we have one available + . = text2num(channels_idle[1]) + channels_idle.Cut(1,2) + return + if(using_sound_channels >= max_sound_channels) + return + . = SSinstruments.reserve_instrument_channel(src) + if(!isnull(.)) + using_sound_channels++ + +/datum/song/proc/process_decay(wait_ds) + var/linear_dropoff = cached_linear_dropoff * wait_ds + var/exponential_dropoff = cached_exponential_dropoff ** wait_ds + for(var/channel in channels_playing) + if(full_sustain_held_note && (channel == last_channel_played)) + continue + var/current_volume = channels_playing[channel] + switch(sustain_mode) + if(SUSTAIN_LINEAR) + current_volume -= linear_dropoff + if(SUSTAIN_EXPONENTIAL) + current_volume /= exponential_dropoff + channels_playing[channel] = current_volume + var/dead = current_volume <= sustain_dropoff_volume + var/channelnumber = text2num(channel) + if(dead) + channels_playing -= channel + channels_idle += channel + for(var/i in hearing_mobs) + var/mob/M = i + M.stop_sound_channel(channelnumber) + else + for(var/i in hearing_mobs) + var/mob/M = i + M.set_sound_channel_volume(channelnumber, (current_volume * 0.01) * volume * using_instrument.volume_multiplier) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index e144e4dbe6..384991e976 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -79,7 +79,9 @@ for(var/I in assembly_components) var/obj/item/integrated_circuit/IC = I - . += IC.external_examine(user) + var/text = IC.external_examine(user) + if(text) + . += text if(opened) interact(user) @@ -871,3 +873,8 @@ pixel_x = -31 if(WEST) pixel_x = 31 + plane = ABOVE_WALL_PLANE + +/obj/item/electronic_assembly/wallmount/Moved(atom/OldLoc, Dir, Forced = FALSE) //reset the plane if moved off the wall. + . = ..() + plane = GAME_PLANE diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 0709b179d2..f90b584d76 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -36,7 +36,9 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/examine(mob/user) interact(user) . = ..() - . += external_examine(user) + var/text = external_examine(user) + if(text) + . += text // Can be called via electronic_assembly/attackby() /obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user) @@ -57,7 +59,7 @@ a creative player the means to solve many problems. Circuits are held inside an var/datum/integrated_io/activate/A = activators[k] if(A.linked.len) to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].") - any_examine(user) + to_chat(user, any_examine(user)) interact(user) // This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED. diff --git a/code/modules/integrated_electronics/core/special_pins/index_pin.dm b/code/modules/integrated_electronics/core/special_pins/index_pin.dm index 06267eec61..e904c4c6d0 100644 --- a/code/modules/integrated_electronics/core/special_pins/index_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/index_pin.dm @@ -14,7 +14,7 @@ new_data = 0 if(isnum(new_data)) - data = CLAMP(round(new_data), 0, IC_MAX_LIST_LENGTH) + data = clamp(round(new_data), 0, IC_MAX_LIST_LENGTH) holder.on_data_written() /datum/integrated_io/index/display_pin_type() diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 4b6b8723dd..8f9a45ac4d 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -89,7 +89,7 @@ desc = "Produces electricity from chemicals." icon_state = "chemical_cell" extended_desc = "This is effectively an internal beaker. It will consume and produce power from plasma, slime jelly, welding fuel, carbon,\ - ethanol, nutriment, and blood in order of decreasing efficiency. It will consume fuel only if the battery can take more energy." + ethanol, nutriment, and blood in order of decreasing efficiency. It will consume fuel only if the battery can take more energy. But no fuel can be compared with blood of living human." complexity = 4 inputs = list() outputs = list("volume used" = IC_PINTYPE_NUMBER, "self reference" = IC_PINTYPE_SELFREF) @@ -102,10 +102,8 @@ var/lfwb =TRUE /obj/item/integrated_circuit/passive/power/chemical_cell/Initialize() - ..() + . = ..() create_reagents(volume, OPENCONTAINER) - extended_desc +="But no fuel can be compared with blood of living human." - /obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user) set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm index 6a6ee27ae1..e207f57ddb 100644 --- a/code/modules/integrated_electronics/subtypes/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -283,10 +283,8 @@ /obj/item/integrated_circuit/arithmetic/square_root/do_work() var/result = 0 - for(var/k in 2 to inputs.len) - var/I = get_pin_data(IC_INPUT, k) - if(isnum(I)) - result += sqrt(I) + var/I = get_pin_data(IC_INPUT, 1) + result = sqrt(I) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index 6b4f46f83d..219e30c57f 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -308,7 +308,7 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir() /obj/item/integrated_circuit/atmospherics/pump/filter/on_data_written() var/amt = get_pin_data(IC_INPUT, 5) - target_pressure = CLAMP(amt, 0, PUMP_MAX_PRESSURE) + target_pressure = clamp(amt, 0, PUMP_MAX_PRESSURE) /obj/item/integrated_circuit/atmospherics/pump/filter/do_work() activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 8c7529651b..ebb91a894e 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -426,7 +426,7 @@ activators = list("compute abs coordinates" = IC_PINTYPE_PULSE_IN, "on convert" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/converter/abs_to_rel_coords/do_work() +/obj/item/integrated_circuit/converter/rel_to_abs_coords/do_work() var/x1 = get_pin_data(IC_INPUT, 1) var/y1 = get_pin_data(IC_INPUT, 2) @@ -456,7 +456,7 @@ activators = list("compute abs coordinates" = IC_PINTYPE_PULSE_IN, "on convert" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/converter/abs_to_rel_coords/do_work() +/obj/item/integrated_circuit/converter/adv_rel_to_abs_coords/do_work() var/turf/T = get_turf(src) if(!T) diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm index 8e1c715d83..8db1db4e00 100644 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -125,7 +125,7 @@ /obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work() var/output_index = get_pin_data(IC_INPUT, 1) - if(output_index == CLAMP(output_index, 1, number_of_pins)) + if(output_index == clamp(output_index, 1, number_of_pins)) activate_pin(round(output_index + 1 ,1)) /obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 0be6fd8686..a0608bb5ed 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -389,8 +389,8 @@ activate_pin(3) return var/turf/T = get_turf(assembly) - var/target_x = CLAMP(get_pin_data(IC_INPUT, 1), 0, world.maxx) - var/target_y = CLAMP(get_pin_data(IC_INPUT, 2), 0, world.maxy) + var/target_x = clamp(get_pin_data(IC_INPUT, 1), 0, world.maxx) + var/target_y = clamp(get_pin_data(IC_INPUT, 2), 0, world.maxy) var/turf/A = locate(target_x, target_y, T.z) set_pin_data(IC_OUTPUT, 1, null) if(!A || !(A in view(T))) @@ -532,7 +532,7 @@ var/rad = get_pin_data(IC_INPUT, 2) if(isnum(rad)) - rad = CLAMP(rad, 0, 8) + rad = clamp(rad, 0, 8) radius = rad /obj/item/integrated_circuit/input/advanced_locator_list/do_work() @@ -594,7 +594,7 @@ /obj/item/integrated_circuit/input/advanced_locator/on_data_written() var/rad = get_pin_data(IC_INPUT, 2) if(isnum(rad)) - rad = CLAMP(rad, 0, 8) + rad = clamp(rad, 0, 8) radius = rad /obj/item/integrated_circuit/input/advanced_locator/do_work() @@ -865,7 +865,7 @@ var/translated = FALSE if(speaker && message) if(raw_message) - if(message_langs != get_default_language()) + if(message_langs != get_selected_language()) translated = TRUE set_pin_data(IC_OUTPUT, 1, speaker.GetVoice()) set_pin_data(IC_OUTPUT, 2, raw_message) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index d1cd852651..fd4e6abfc5 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -236,7 +236,7 @@ var/mode = get_pin_data(IC_INPUT, 2) switch(ord) if(1) - mode = CLAMP(mode, GRAB_PASSIVE, max_grab) + mode = clamp(mode, GRAB_PASSIVE, max_grab) if(AM) if(check_target(AM, exclude_contents = TRUE)) acting_object.investigate_log("grabbed ([AM]) using [src].", INVESTIGATE_CIRCUIT) @@ -329,9 +329,9 @@ // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it. var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc - var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx) - var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy) - var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + var/x_abs = clamp(T.x + target_x_rel, 0, world.maxx) + var/y_abs = clamp(T.y + target_y_rel, 0, world.maxy) + var/range = round(clamp(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) //remove damage A.throwforce = 0 A.embedding = list("embed_chance" = 0) @@ -447,7 +447,7 @@ if(!S) activate_pin(4) return - if(materials.insert_item(S, CLAMP(get_pin_data(IC_INPUT, 2),0,100), multiplier = 1) ) + if(materials.insert_item(S, clamp(get_pin_data(IC_INPUT, 2),0,100), multiplier = 1) ) AfterMaterialInsert() activate_pin(3) else @@ -458,7 +458,7 @@ for(var/I in 1 to mtypes.len) var/datum/material/M = materials.materials[mtypes[I]] if(M) - var/U = CLAMP(get_pin_data(IC_INPUT, I+2),-100000,100000) + var/U = clamp(get_pin_data(IC_INPUT, I+2),-100000,100000) if(!U) continue if(!mt) //Invalid input diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 6005709dde..47b6e151cb 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -112,7 +112,7 @@ var/brightness = get_pin_data(IC_INPUT, 2) if(new_color && isnum(brightness)) - brightness = CLAMP(brightness, 0, 10) + brightness = clamp(brightness, 0, 10) light_rgb = new_color light_brightness = brightness @@ -151,7 +151,7 @@ var/selected_sound = sounds[ID] if(!selected_sound) return - vol = CLAMP(vol ,0 , 100) + vol = clamp(vol ,0 , 100) playsound(get_turf(src), selected_sound, vol, freq, -1) var/atom/A = get_object() A.investigate_log("played a sound ([selected_sound]) as [type].", INVESTIGATE_CIRCUIT) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 0fc9f58db8..663ba9fe16 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -94,7 +94,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, volume) + new_amount = clamp(new_amount, 0, volume) transfer_amount = new_amount @@ -222,7 +222,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) + new_amount = clamp(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/pump/do_work() @@ -468,7 +468,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) + new_amount = clamp(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/filter/do_work() diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index d4c565c49a..5dc866c556 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -18,8 +18,8 @@ var/datum/integrated_io/I = inputs[1] set_pin_data(IC_OUTPUT, 1, null) if(!isweakref(I.data)) - return activate_pin(3) + return var/atom/A = I.data.resolve() if(!A) activate_pin(3) @@ -57,8 +57,8 @@ activate_pin(3) return var/turf/T = get_turf(assembly) - var/target_x = CLAMP(get_pin_data(IC_INPUT, 1), 0, world.maxx) - var/target_y = CLAMP(get_pin_data(IC_INPUT, 2), 0, world.maxy) + var/target_x = clamp(get_pin_data(IC_INPUT, 1), 0, world.maxx) + var/target_y = clamp(get_pin_data(IC_INPUT, 2), 0, world.maxy) var/turf/A = locate(target_x, target_y, T.z) set_pin_data(IC_OUTPUT, 1, null) if(!A||A==T) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 1f1d5444bb..cae43718c2 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -64,7 +64,7 @@ /obj/item/integrated_circuit/time/delay/custom/do_work() var/delay_input = get_pin_data(IC_INPUT, 1) if(delay_input && isnum(delay_input) ) - var/new_delay = CLAMP(delay_input ,1 ,36000) //An hour. + var/new_delay = clamp(delay_input ,1 ,36000) //An hour. delay = new_delay ..() @@ -119,7 +119,7 @@ /obj/item/integrated_circuit/time/ticker/custom/on_data_written() var/delay_input = get_pin_data(IC_INPUT, 2) if(delay_input && isnum(delay_input) ) - var/new_delay = CLAMP(delay_input ,1 ,1 HOURS) + var/new_delay = clamp(delay_input ,1 ,1 HOURS) delay = new_delay ..() diff --git a/code/modules/integrated_electronics/subtypes/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm index cefa25e945..75580911c3 100644 --- a/code/modules/integrated_electronics/subtypes/trig.dm +++ b/code/modules/integrated_electronics/subtypes/trig.dm @@ -71,7 +71,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = TAN(A) + result = tan(A) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 02340970af..3123eeabbe 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -102,8 +102,8 @@ yo.data = round(yo.data, 1) var/turf/T = get_turf(assembly) - var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) - var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) + var/target_x = clamp(T.x + xo.data, 0, world.maxx) + var/target_y = clamp(T.y + yo.data, 0, world.maxy) assembly.visible_message("[assembly] fires [installed_gun]!") shootAt(locate(target_x, target_y, T.z)) @@ -191,7 +191,7 @@ var/datum/integrated_io/detonation_time = inputs[1] var/dt if(isnum(detonation_time.data) && detonation_time.data > 0) - dt = CLAMP(detonation_time.data, 1, 12)*10 + dt = clamp(detonation_time.data, 1, 12)*10 else dt = 15 addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt) @@ -293,9 +293,10 @@ // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it. var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc - var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx) - var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy) - var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + var/x_abs = clamp(T.x + target_x_rel, 0, world.maxx) + var/y_abs = clamp(T.y + target_y_rel, 0, world.maxy) + var/range = round(clamp(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) assembly.visible_message("\The [assembly] has thrown [A]!") log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.") A.forceMove(drop_location()) @@ -324,7 +325,7 @@ /obj/item/integrated_circuit/weaponized/stun/do_work() - var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70) + var/stunforce = clamp(get_pin_data(IC_INPUT, 1),1,70) var/mob/living/L = assembly.loc if(attempt_stun(L,stunforce)) activate_pin(2) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index ee441c21f7..c700d668c5 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -56,6 +56,9 @@ //can be overridden by antag_rep.txt config var/antag_rep = 10 + var/paycheck = PAYCHECK_MINIMAL + var/paycheck_department = ACCOUNT_CIV + var/list/mind_traits // Traits added to the mind of the mob assigned this job var/list/blacklisted_quirks //list of quirk typepaths blacklisted. @@ -66,6 +69,9 @@ // How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are. var/threat = 0 + /// Starting skill modifiers. + var/list/starting_modifiers + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) @@ -99,7 +105,13 @@ /datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source) if(!H) return FALSE - + if(!visualsOnly) + var/datum/bank_account/bank_account = new(H.real_name, src) + bank_account.account_holder = H.real_name + bank_account.account_job = src + bank_account.account_id = rand(111111,999999) + bank_account.payday(STARTING_PAYCHECKS, TRUE) + H.account_id = bank_account.account_id if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) if(H.dna.species.id != "human") H.set_species(/datum/species/human) @@ -142,7 +154,6 @@ return TRUE //Available in 0 days = available right now = player is old enough to play. return FALSE - /datum/job/proc/available_in_days(client/C) if(!C) return 0 @@ -166,6 +177,12 @@ /datum/job/proc/radio_help_message(mob/M) to_chat(M, "Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset.") +/datum/job/proc/standard_assign_skills(datum/mind/M) + if(!starting_modifiers) + return + for(var/mod in starting_modifiers) + ADD_SINGLETON_SKILL_MODIFIER(M, mod, null) + /datum/outfit/job name = "Standard Gear" @@ -227,12 +244,18 @@ H.real_name = "[J.title] #[rand(10000, 99999)]" var/obj/item/card/id/C = H.wear_id - if(istype(C)) + if(istype(C) && C.bank_support) C.access = J.get_access() shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable C.registered_name = H.real_name C.assignment = J.title C.update_label() + for(var/A in SSeconomy.bank_accounts) + var/datum/bank_account/B = A + if(B.account_id == H.account_id) + C.registered_account = B + B.bank_cards += C + break H.sec_hud_set_ID() var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index efe574ab66..a7401791ab 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -17,6 +17,8 @@ var/do_special_check = TRUE threat = 5 + starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) + /datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null) if(visualsOnly) CRASH("dynamic preview is unsupported") diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index c4fa213b61..b8fc963989 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -14,6 +14,8 @@ Assistant minimal_access = list() //See /datum/job/assistant/get_access() outfit = /datum/outfit/job/assistant antag_rep = 7 + paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it. + paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_ASSISTANT dresscodecompliant = FALSE threat = 0.2 @@ -33,12 +35,9 @@ Assistant ..() var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT if (CONFIG_GET(flag/grey_assistants)) - if(suited) - uniform = /obj/item/clothing/under/color/grey - else - uniform = /obj/item/clothing/under/color/jumpskirt/grey + uniform = suited ? /obj/item/clothing/under/color/grey : /obj/item/clothing/under/color/jumpskirt/grey else - if(suited) - uniform = /obj/item/clothing/under/color/random + if(SSevents.holidays && SSevents.holidays[PRIDE_MONTH]) + uniform = suited ? /obj/item/clothing/under/color/rainbow : /obj/item/clothing/under/color/jumpskirt/rainbow else - uniform = /obj/item/clothing/under/color/jumpskirt/random + uniform = suited ? /obj/item/clothing/under/color/random : /obj/item/clothing/under/color/jumpskirt/random diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 019e50799e..1962b8e8a9 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -5,7 +5,7 @@ department_flag = ENGSEC faction = "Station" total_positions = 3 - spawn_positions = 2 + spawn_positions = 3 supervisors = "the chief engineer" selection_color = "#ff9b3d" exp_requirements = 60 @@ -17,6 +17,11 @@ ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_ENG + + starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic, /datum/skill_modifier/job/affinity/wiring) + display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN threat = 0.5 diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 709c53d51d..e5cd015460 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -14,6 +14,8 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BARTENDER threat = 0.5 diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 4cf106ea99..65f3e7ca48 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -13,6 +13,8 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BOTANIST threat = 1.5 // lol powergame diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index d38a2a3ddf..3733658c33 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -15,11 +15,15 @@ exp_type = EXP_TYPE_COMMAND exp_type_department = EXP_TYPE_COMMAND + outfit = /datum/outfit/job/captain access = list() //See get_access() minimal_access = list() //See get_access() + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC + mind_traits = list(TRAIT_CAPTAIN_METABOLISM, TRAIT_DISK_VERIFIER) display_order = JOB_DISPLAY_ORDER_CAPTAIN diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index d574482444..840af56a0e 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -14,6 +14,8 @@ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN threat = 0.2 diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 4aed218cf9..5f66519365 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -13,6 +13,8 @@ access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CHAPLAIN threat = 0.5 @@ -73,7 +75,7 @@ B.name = "Fluorescent Incandescence" if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook") - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off retarded as fuck + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off dumb as fuck if("monkeyism","apism","gorillism","primatism") B.name = pick("Going Bananas", "Bananas Out For Harambe") if("mormonism") diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 44b0e90ec8..b2699071e3 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -15,10 +15,14 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHEMIST threat = 1.5 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/chemist name = "Chemist" jobtype = /datum/job/chemist diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index c5065cd169..d8df767a9f 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -26,6 +26,10 @@ ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_ENG + + starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) @@ -42,7 +46,7 @@ uniform = /obj/item/clothing/under/rank/engineering/chief_engineer shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hardhat/white - gloves = /obj/item/clothing/gloves/color/black/ce + gloves = /obj/item/clothing/gloves/color/black backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/storage/backpack/industrial diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 8dd7fafab3..adee2856fa 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -24,11 +24,15 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 2 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/cmo name = "Chief Medical Officer" jobtype = /datum/job/cmo diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index c65c062bce..7ad7148614 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -13,6 +13,8 @@ access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE) + paycheck = PAYCHECK_MINIMAL + paycheck_department = ACCOUNT_SRV mind_traits = list(TRAIT_CLOWN_MENTALITY) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 20969bf1d9..5a5916cb7e 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -14,6 +14,8 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_COOK threat = 0.2 diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index d73d909f4f..47bfd4914a 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -13,6 +13,8 @@ access = list(ACCESS_LIBRARY) minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CURATOR threat = 0.3 @@ -41,4 +43,4 @@ if(visualsOnly) return - H.grant_all_languages(omnitongue=TRUE) + H.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_CURATOR) diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index f84bd0d8d6..4f74542b2a 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -12,6 +12,8 @@ exp_requirements = 120 exp_type = EXP_TYPE_CREW + starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) + display_order = JOB_DISPLAY_ORDER_CYBORG /datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source = null) diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 55c13df7a2..e5afe7e1b3 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -17,6 +17,8 @@ access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 2e8b18d772..a40ca0fca3 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -15,10 +15,14 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_GENETICIST threat = 1.5 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/geneticist name = "Geneticist" jobtype = /datum/job/geneticist diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index b1fe3471f1..8015c19c36 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -30,6 +30,8 @@ ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 811dff87e7..69ed63a514 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -27,6 +27,8 @@ ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SEC display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) @@ -42,7 +44,7 @@ uniform = /obj/item/clothing/under/rank/security/head_of_security shoes = /obj/item/clothing/shoes/jackboots suit = /obj/item/clothing/suit/armor/hos/trenchcoat - gloves = /obj/item/clothing/gloves/color/black/hos + gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/HoS/beret glasses = /obj/item/clothing/glasses/hud/security/sunglasses suit_store = /obj/item/gun/energy/e_gun diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 73028255be..2f6d6f0e32 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -13,6 +13,8 @@ access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_JANITOR threat = 0.2 diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 3f80e44492..1a7499800b 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -14,6 +14,8 @@ access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) + paycheck = PAYCHECK_EASY + paycheck_department = ACCOUNT_CIV mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 3eaa2ae10a..5ec4b83b2f 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -13,10 +13,14 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR threat = 0.5 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/doctor name = "Medical Doctor" jobtype = /datum/job/doctor diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 72a6ac8e13..4ba2489ab2 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -13,6 +13,8 @@ access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE) + paycheck = PAYCHECK_MINIMAL + paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_MIME diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index df6e1431ae..9bdfdfe279 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -14,11 +14,15 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_PARAMEDIC threat = 0.5 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/paramedic name = "Paramedic" jobtype = /datum/job/paramedic diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 897defb0ea..4c6b8e064f 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -24,6 +24,8 @@ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS) + paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. + paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 15e5c64654..7128fbe2c7 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -28,6 +28,8 @@ ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index f9f1d20d3b..f5ae93bb6a 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -15,6 +15,10 @@ access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_SCI + + starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) display_order = JOB_DISPLAY_ORDER_ROBOTICIST threat = 1 diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 9809e7b4dc..476f740b9d 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -15,6 +15,8 @@ access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_SCIENTIST threat = 1.2 diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index decb334423..bc6f6a94c7 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -17,6 +17,8 @@ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() + paycheck = PAYCHECK_HARD + paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 9eb268895e..a09c4376fb 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -16,6 +16,8 @@ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_HARD + paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_SHAFT_MINER diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 66ddc90e9b..d3f5db7dbb 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -17,6 +17,10 @@ ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_ENG + + starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 4ba65dff59..790e828931 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -15,11 +15,15 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) + paycheck = PAYCHECK_MEDIUM + paycheck_department = ACCOUNT_MED display_order = JOB_DISPLAY_ORDER_VIROLOGIST threat = 1.5 + starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + /datum/outfit/job/virologist name = "Virologist" jobtype = /datum/job/virologist diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 15d839ac48..5762731f62 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -18,6 +18,9 @@ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() + paycheck = PAYCHECK_HARD + paycheck_department = ACCOUNT_SEC + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm deleted file mode 100644 index ca232adbe0..0000000000 --- a/code/modules/keybindings/bindings_admin.dm +++ /dev/null @@ -1,24 +0,0 @@ -/datum/admins/key_down(_key, client/user) - switch(_key) - if("F3") - user.get_admin_say() - return - if("F5") - user.admin_ghost() - return - if("F6") - player_panel_new() - return - if("F7") - user.togglebuildmodeself() - return - if("F8") - if(user.keys_held["Ctrl"]) - user.stealth() - else - user.invisimin() - return - if("F10") - user.get_dead_say() - return - ..() diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 5f3e879237..47d6b16feb 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -5,7 +5,7 @@ if(!user.keys_held["Ctrl"]) var/movement_dir = NONE for(var/_key in user.keys_held) - movement_dir = movement_dir | SSinput.movement_keys[_key] + movement_dir = movement_dir | user.movement_keys[_key] if(user.next_move_dir_add) movement_dir |= user.next_move_dir_add if(user.next_move_dir_sub) diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm deleted file mode 100644 index e344bc9d20..0000000000 --- a/code/modules/keybindings/bindings_carbon.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/carbon/key_down(_key, client/user) - switch(_key) - if("R", "Southwest") // Southwest is End - toggle_throw_mode() - return - if("C") - user_toggle_intentional_combat_mode() - return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 6030362a61..b4940e0085 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -33,55 +33,74 @@ to_chat(src, "Invalid KeyDown detected! You have been disconnected from the server automatically.") log_admin("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.") - QDEL_IN(src, 1) + qdel(src) + return + + if(_key == "Tab") + ForceAllKeysUp() //groan, more hacky kevcode return if(length(keys_held) > MAX_HELD_KEYS) keys_held.Cut(1,2) keys_held[_key] = TRUE - var/movement = SSinput.movement_keys[_key] + var/movement = movement_keys[_key] if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"]) next_move_dir_add |= movement // Client-level keybindings are ones anyone should be able to do at any time // Things like taking screenshots, hitting tab, and adminhelps. - + var/AltMod = keys_held["Alt"] ? "Alt" : "" + var/CtrlMod = keys_held["Ctrl"] ? "Ctrl" : "" + var/ShiftMod = keys_held["Shift"] ? "Shift" : "" + var/full_key switch(_key) - if("F1") - if(keys_held["Ctrl"] && keys_held["Shift"]) // Is this command ever used? - winset(src, null, "command=.options") - else - get_adminhelp() - return - if("F2") // Screenshot. Hold shift to choose a name and location to save in - winset(src, null, "command=.screenshot [!keys_held["shift"] ? "auto" : ""]") - return - if("F12") // Toggles minimal HUD - mob.button_pressed_F12() - return + if("Alt", "Ctrl", "Shift") + full_key = "[AltMod][CtrlMod][ShiftMod]" + else + full_key = "[AltMod][CtrlMod][ShiftMod][_key]" + var/keycount = 0 + if(prefs.modless_key_bindings[_key]) + var/datum/keybinding/kb = GLOB.keybindings_by_name[prefs.modless_key_bindings[_key]] + if(kb.can_use(src)) + kb.down(src) + keycount++ + for(var/kb_name in prefs.key_bindings[full_key]) + keycount++ + var/datum/keybinding/kb = GLOB.keybindings_by_name[kb_name] + if(kb.can_use(src) && kb.down(src) && keycount >= MAX_COMMANDS_PER_KEY) + break - if(holder) - holder.key_down(_key, src) - if(mob.focus) - mob.focus.key_down(_key, src) + holder?.key_down(_key, src) + mob.focus?.key_down(_key, src) + +/// Keyup's all keys held down. +/client/proc/ForceAllKeysUp() + // simulate a user releasing all keys except for the mod keys. groan. i hate this. thanks, byond. why aren't keyups able to be forced to fire on macro change aoaoaoao. + // groan + for(var/key in keys_held) // all of these won't be the 3 mod keys. + if((key == "Ctrl") || (key == "Alt") || (key == "Shift")) + continue + keyUp("[key]") /client/verb/keyUp(_key as text) set instant = TRUE set hidden = TRUE keys_held -= _key - var/movement = SSinput.movement_keys[_key] + var/movement = movement_keys[_key] if(!(next_move_dir_add & movement)) next_move_dir_sub |= movement - if(holder) - holder.key_up(_key, src) - if(mob.focus) - mob.focus.key_up(_key, src) + // We don't do full key for release, because for mod keys you + // can hold different keys and releasing any should be handled by the key binding specifically + for (var/kb_name in prefs.key_bindings[_key]) + var/datum/keybinding/kb = GLOB.keybindings_by_name[kb_name] + if(kb.can_use(src) && kb.up(src)) + break + holder?.key_up(_key, src) + mob.focus?.key_up(_key, src) // Called every game tick /client/keyLoop() - if(holder) - holder.keyLoop(src) - if(mob.focus) - mob.focus.keyLoop(src) \ No newline at end of file + holder?.keyLoop(src) + mob.focus?.keyLoop(src) diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm deleted file mode 100644 index 9569de338c..0000000000 --- a/code/modules/keybindings/bindings_human.dm +++ /dev/null @@ -1,80 +0,0 @@ -/mob/living/carbon/human/key_down(_key, client/user) - if(client.keys_held["Shift"]) - switch(_key) - if("E") // Put held thing in belt or take out most recent thing from belt - var/obj/item/thing = get_active_held_item() - var/obj/item/storage/equipped_belt = get_item_by_slot(SLOT_BELT) - if(!equipped_belt) // We also let you equip a belt like this - if(!thing) - to_chat(user, "You have no belt to take something out of.") - return - equip_to_slot_if_possible(thing, SLOT_BELT) - return - if(!istype(equipped_belt)) // not a storage item - if(!thing) - to_chat(user, "You have no belt to take something out of.") - else - to_chat(user, "You can't fit anything in.") - return - if(thing) // put thing in belt - if(!SEND_SIGNAL(equipped_belt, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) - to_chat(user, "You can't fit anything in.") - return - if(!equipped_belt.contents.len) // nothing to take out - to_chat(user, "There's nothing in your belt to take out.") - return - var/obj/item/stored = equipped_belt.contents[equipped_belt.contents.len] - if(!stored || stored.on_found(src)) - return - stored.attack_hand(src) // take out thing from belt - return - - if("B") // Put held thing in backpack or take out most recent thing from backpack - var/obj/item/thing = get_active_held_item() - var/obj/item/storage/equipped_backpack = get_item_by_slot(SLOT_BACK) - if(!equipped_backpack) // We also let you equip a backpack like this - if(!thing) - to_chat(user, "You have no backpack to take something out of.") - return - equip_to_slot_if_possible(thing, SLOT_BACK) - return - if(!istype(equipped_backpack)) // not a storage item - if(!thing) - to_chat(user, "You have no backpack to take something out of.") - else - to_chat(user, "You can't fit anything in.") - return - if(thing) // put thing in backpack - if(!SEND_SIGNAL(equipped_backpack, COMSIG_TRY_STORAGE_INSERT, thing, user.mob)) - to_chat(user, "You can't fit anything in.") - return - if(!equipped_backpack.contents.len) // nothing to take out - to_chat(user, "There's nothing in your backpack to take out.") - return - var/obj/item/stored = equipped_backpack.contents[equipped_backpack.contents.len] - if(!stored || stored.on_found(src)) - return - stored.attack_hand(src) // take out thing from backpack - return - switch(_key) - if("Shift") - if(!user.prefs.sprint_spacebar) - user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works. - return - if("Space") - if(user.prefs.sprint_spacebar) - user.prefs.sprint_toggle ? default_toggle_sprint() : sprint_hotkey(TRUE) - return - return ..() - -/mob/living/carbon/human/key_up(_key, client/user) - switch(_key) - if("Shift") - if(!user.prefs.sprint_spacebar && !user.prefs.sprint_toggle) - sprint_hotkey(FALSE) - return - if("Space") - if(user.prefs.sprint_spacebar && !user.prefs.sprint_toggle) - sprint_hotkey(FALSE) - return - return ..() diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm deleted file mode 100644 index ec6c5dd539..0000000000 --- a/code/modules/keybindings/bindings_living.dm +++ /dev/null @@ -1,27 +0,0 @@ -/mob/living/key_down(_key, client/user) - switch(_key) - if("B") - resist() - return - if("1") - if(possible_a_intents) - a_intent_change(INTENT_HELP) - return - if("2") - if(possible_a_intents) - a_intent_change(INTENT_DISARM) - return - if("3") - if(possible_a_intents) - a_intent_change(INTENT_GRAB) - return - if("4") - if(possible_a_intents) - a_intent_change(INTENT_HARM) - return - if ("V") - lay_down() - return - - - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm deleted file mode 100644 index 36b4775c34..0000000000 --- a/code/modules/keybindings/bindings_mob.dm +++ /dev/null @@ -1,94 +0,0 @@ -// Technically the client argument is unncessary here since that SHOULD be src.client but let's not assume things -// All it takes is one badmin setting their focus to someone else's client to mess things up -// Or we can have NPC's send actual keypresses and detect that by seeing no client - -/mob/key_down(_key, client/user) - switch(_key) - if("Delete", "H") - if(!pulling) - to_chat(src, "You are not pulling anything.") - else - stop_pulling() - return - if("Insert", "G") - a_intent_change(INTENT_HOTKEY_RIGHT) - return - if("F") - a_intent_change(INTENT_HOTKEY_LEFT) - return - if("X", "Northeast") // Northeast is Page-up - swap_hand() - return - if("Y", "Z", "Southeast") // Southeast is Page-down - mode() // attack_self(). No idea who came up with "mode()" - return - if("Q", "Northwest") // Northwest is Home - var/obj/item/I = get_active_held_item() - if(!I) - to_chat(src, "You have nothing to drop in your hand!") - else - dropItemToGround(I) - return - if("E") - quick_equip() - return - if("Alt") - toggle_move_intent() - return - //Bodypart selections - if("Numpad8") - user.body_toggle_head() - return - if("Numpad4") - user.body_r_arm() - return - if("Numpad5") - user.body_chest() - return - if("Numpad6") - user.body_l_arm() - return - if("Numpad1") - user.body_r_leg() - return - if("Numpad2") - user.body_groin() - return - if("Numpad3") - user.body_l_leg() - return - - if(client.keys_held["Ctrl"]) - switch(SSinput.movement_keys[_key]) - if(NORTH) - if(client.keys_held["Shift"]) - northshift() - else - northface() - return - if(SOUTH) - if(client.keys_held["Shift"]) - southshift() - else - southface() - return - if(WEST) - if(client.keys_held["Shift"]) - westshift() - else - westface() - return - if(EAST) - if(client.keys_held["Shift"]) - eastshift() - else - eastface() - return - return ..() - -/mob/key_up(_key, client/user) - switch(_key) - if("Alt") - toggle_move_intent() - return - return ..() diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm deleted file mode 100644 index 29fb36fa65..0000000000 --- a/code/modules/keybindings/bindings_robot.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/silicon/robot/key_down(_key, client/user) - switch(_key) - if("1", "2", "3") - toggle_module(text2num(_key)) - return - if("4") - a_intent_change(INTENT_HOTKEY_LEFT) - return - if("Q") - uneq_active() - return - if("Shift") - sprint_hotkey(TRUE) - return - return ..() - -/mob/living/silicon/robot/key_up(_key, client/user) - switch(_key) - if("Shift") - sprint_hotkey(FALSE) - return - return ..() diff --git a/code/modules/keybindings/focus.dm b/code/modules/keybindings/focus.dm index 205b293e9a..d542b49267 100644 --- a/code/modules/keybindings/focus.dm +++ b/code/modules/keybindings/focus.dm @@ -1,6 +1,3 @@ -/mob - var/datum/focus //What receives our keyboard inputs. src by default - /mob/proc/set_focus(datum/new_focus) if(focus == new_focus) return diff --git a/code/modules/keybindings/keybind/__defines.dm b/code/modules/keybindings/keybind/__defines.dm new file mode 100644 index 0000000000..93d033eea5 --- /dev/null +++ b/code/modules/keybindings/keybind/__defines.dm @@ -0,0 +1,21 @@ +#define CATEGORY_CLIENT "CLIENT" +#define CATEGORY_EMOTE "EMOTE" +#define CATEGORY_ADMIN "ADMIN" +#define CATEGORY_XENO "XENO" +#define CATEGORY_CARBON "CARBON" +#define CATEGORY_HUMAN "HUMAN" +#define CATEGORY_ROBOT "ROBOT" +#define CATEGORY_MISC "MISC" +#define CATEGORY_MOVEMENT "MOVEMENT" +#define CATEGORY_TARGETING "TARGETING" +#define CATEGORY_COMBAT "COMBAT" + +#define WEIGHT_HIGHEST 0 +#define WEIGHT_ADMIN 10 +#define WEIGHT_CLIENT 20 +#define WEIGHT_ROBOT 30 +#define WEIGHT_MOB 40 +#define WEIGHT_LIVING 50 +#define WEIGHT_DEAD 60 +#define WEIGHT_EMOTE 70 +#define WEIGHT_LOWEST 999 diff --git a/code/modules/keybindings/keybind/_keybind.dm b/code/modules/keybindings/keybind/_keybind.dm new file mode 100644 index 0000000000..1d68e2d037 --- /dev/null +++ b/code/modules/keybindings/keybind/_keybind.dm @@ -0,0 +1,24 @@ +/datum/keybinding + var/list/hotkey_keys + var/list/classic_keys + var/name + var/full_name + var/description = "" + var/category = CATEGORY_MISC + var/weight = WEIGHT_LOWEST + var/keybind_signal + +/datum/keybinding/New() + + // Default keys to the master "hotkey_keys" + if(LAZYLEN(hotkey_keys) && !LAZYLEN(classic_keys)) + classic_keys = hotkey_keys.Copy() + +/datum/keybinding/proc/down(client/user) + return FALSE + +/datum/keybinding/proc/up(client/user) + return FALSE + +/datum/keybinding/proc/can_use(client/user) + return TRUE diff --git a/code/modules/keybindings/keybind/admin.dm b/code/modules/keybindings/keybind/admin.dm new file mode 100644 index 0000000000..b63221e97a --- /dev/null +++ b/code/modules/keybindings/keybind/admin.dm @@ -0,0 +1,96 @@ +/datum/keybinding/admin + category = CATEGORY_ADMIN + weight = WEIGHT_ADMIN + +/datum/keybinding/admin/can_use(client/user) + return user.holder ? TRUE : FALSE + +/datum/keybinding/admin/admin_say + hotkey_keys = list("F3") + name = "admin_say" + full_name = "Admin say" + description = "Talk with other admins." + +/datum/keybinding/admin/admin_say/down(client/user) + user.get_admin_say() + return TRUE + +/datum/keybinding/admin/admin_ghost + hotkey_keys = list("F5") + name = "admin_ghost" + full_name = "Aghost" + description = "Go ghost" + +/datum/keybinding/admin/admin_ghost/down(client/user) + user.admin_ghost() + return TRUE + +/datum/keybinding/admin/player_panel_new + hotkey_keys = list("F6") + name = "player_panel_new" + full_name = "Player Panel New" + description = "Opens up the new player panel" + +/datum/keybinding/admin/player_panel_new/down(client/user) + user.holder.player_panel_new() + return TRUE + +/datum/keybinding/admin/toggle_buildmode_self + hotkey_keys = list("F7") + name = "toggle_buildmode_self" + full_name = "Toggle Buildmode Self" + description = "Toggles buildmode" + +/datum/keybinding/admin/toggle_buildmode_self/down(client/user) + user.togglebuildmodeself() + return TRUE + +/datum/keybinding/admin/stealthmode + hotkey_keys = list("CtrlF8") + name = "stealth_mode" + full_name = "Stealth mode" + description = "Enters stealth mode" + +/datum/keybinding/admin/stealthmode/down(client/user) + user.stealth() + return TRUE + +/datum/keybinding/admin/invisimin + hotkey_keys = list("F8") + name = "invisimin" + full_name = "Admin invisibility" + description = "Toggles ghost-like invisibility (Don't abuse this)" + +/datum/keybinding/admin/invisimin/down(client/user) + user.invisimin() + return TRUE + +/datum/keybinding/admin/deadsay + hotkey_keys = list("F10") + name = "dsay" + full_name = "deadsay" + description = "Allows you to send a message to dead chat" + +/datum/keybinding/admin/deadsay/down(client/user) + user.get_dead_say() + return TRUE + +/datum/keybinding/admin/deadmin + hotkey_keys = list("Unbound") + name = "deadmin" + full_name = "Deadmin" + description = "Shed your admin powers" + +/datum/keybinding/admin/deadmin/down(client/user) + user.deadmin() + return TRUE + +/datum/keybinding/admin/readmin + hotkey_keys = list("Unbound") + name = "readmin" + full_name = "Readmin" + description = "Regain your admin powers" + +/datum/keybinding/admin/readmin/down(client/user) + user.readmin() + return TRUE diff --git a/code/modules/keybindings/keybind/carbon.dm b/code/modules/keybindings/keybind/carbon.dm new file mode 100644 index 0000000000..46cb5cd0ac --- /dev/null +++ b/code/modules/keybindings/keybind/carbon.dm @@ -0,0 +1,62 @@ +/datum/keybinding/carbon + category = CATEGORY_CARBON + weight = WEIGHT_MOB + +/datum/keybinding/carbon/can_use(client/user) + return iscarbon(user.mob) + +/datum/keybinding/carbon/toggle_throw_mode + hotkey_keys = list("R", "Southwest") // END + name = "toggle_throw_mode" + full_name = "Toggle throw mode" + description = "Toggle throwing the current item or not." + category = CATEGORY_CARBON + +/datum/keybinding/carbon/toggle_throw_mode/down(client/user) + var/mob/living/carbon/C = user.mob + C.toggle_throw_mode() + return TRUE + +/datum/keybinding/carbon/select_help_intent + hotkey_keys = list("1") + name = "select_help_intent" + full_name = "Select help intent" + description = "" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/select_help_intent/down(client/user) + user.mob?.a_intent_change(INTENT_HELP) + return TRUE + +/datum/keybinding/carbon/select_disarm_intent + hotkey_keys = list("2") + name = "select_disarm_intent" + full_name = "Select disarm intent" + description = "" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/select_disarm_intent/down(client/user) + user.mob?.a_intent_change(INTENT_DISARM) + return TRUE + +/datum/keybinding/carbon/select_grab_intent + hotkey_keys = list("3") + name = "select_grab_intent" + full_name = "Select grab intent" + description = "" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/select_grab_intent/down(client/user) + user.mob?.a_intent_change(INTENT_GRAB) + return TRUE + +/datum/keybinding/carbon/select_harm_intent + hotkey_keys = list("4") + name = "select_harm_intent" + full_name = "Select harm intent" + description = "" + category = CATEGORY_CARBON + +/datum/keybinding/carbon/select_harm_intent/down(client/user) + user.mob?.a_intent_change(INTENT_HARM) + return TRUE diff --git a/code/modules/keybindings/keybind/client.dm b/code/modules/keybindings/keybind/client.dm new file mode 100644 index 0000000000..1d44efa063 --- /dev/null +++ b/code/modules/keybindings/keybind/client.dm @@ -0,0 +1,33 @@ +/datum/keybinding/client + category = CATEGORY_CLIENT + weight = WEIGHT_HIGHEST + +/datum/keybinding/client/admin_help + hotkey_keys = list("F1") + name = "admin_help" + full_name = "Admin Help" + description = "Ask an admin for help." + +/datum/keybinding/client/admin_help/down(client/user) + user.get_adminhelp() + return TRUE + +/datum/keybinding/client/screenshot + hotkey_keys = list("F2") + name = "screenshot" + full_name = "Screenshot" + description = "Take a screenshot." + +/datum/keybinding/client/screenshot/down(client/user) + winset(user, null, "command=.screenshot [!user.keys_held["shift"] ? "auto" : ""]") + return TRUE + +/datum/keybinding/client/minimal_hud + hotkey_keys = list("F12") + name = "minimal_hud" + full_name = "Minimal HUD" + description = "Hide most HUD features" + +/datum/keybinding/client/minimal_hud/down(client/user) + user.mob.button_pressed_F12() + return TRUE diff --git a/code/modules/keybindings/keybind/combat.dm b/code/modules/keybindings/keybind/combat.dm new file mode 100644 index 0000000000..457fbb0cb2 --- /dev/null +++ b/code/modules/keybindings/keybind/combat.dm @@ -0,0 +1,38 @@ +/datum/keybinding/living/toggle_combat_mode + hotkey_keys = list("C") + name = "toggle_combat_mode" + full_name = "Toggle combat mode" + category = CATEGORY_COMBAT + description = "Toggles whether or not you're in combat mode." + +/datum/keybinding/living/toggle_combat_mode/down(client/user) + SEND_SIGNAL(user.mob, COMSIG_TOGGLE_COMBAT_MODE) + return TRUE + +/datum/keybinding/living/active_block + hotkey_keys = list("Northwest", "F") // HOME + name = "active_block" + full_name = "Block (Hold)" + category = CATEGORY_COMBAT + description = "Hold down to actively block with your currently in-hand object." + +/datum/keybinding/living/active_block/down(client/user) + var/mob/living/L = user.mob + L.keybind_start_active_blocking() + return TRUE + +/datum/keybinding/living/active_block/up(client/user) + var/mob/living/L = user.mob + L.keybind_stop_active_blocking() + +/datum/keybinding/living/active_parry + hotkey_keys = list("Insert", "G") + name = "active_parry" + full_name = "Parry" + category = CATEGORY_COMBAT + description = "Press to initiate a parry sequence with your currently in-hand object." + +/datum/keybinding/living/active_parry/down(client/user) + var/mob/living/L = user.mob + L.keybind_parry() + return TRUE diff --git a/code/modules/keybindings/keybind/emote.dm b/code/modules/keybindings/keybind/emote.dm new file mode 100644 index 0000000000..6099826819 --- /dev/null +++ b/code/modules/keybindings/keybind/emote.dm @@ -0,0 +1,15 @@ +/datum/keybinding/emote + category = CATEGORY_EMOTE + weight = WEIGHT_EMOTE + var/emote_key + +/datum/keybinding/emote/proc/link_to_emote(datum/emote/faketype) + hotkey_keys = list("Unbound") + emote_key = initial(faketype.key) + name = initial(faketype.key) + full_name = capitalize(initial(faketype.key)) + description = "Do the emote '*[emote_key]'" + +/datum/keybinding/emote/down(client/user) + . = ..() + return user.mob.emote(emote_key, intentional=TRUE) diff --git a/code/modules/keybindings/keybind/human.dm b/code/modules/keybindings/keybind/human.dm new file mode 100644 index 0000000000..43f5653472 --- /dev/null +++ b/code/modules/keybindings/keybind/human.dm @@ -0,0 +1,39 @@ +/datum/keybinding/human + category = CATEGORY_HUMAN + weight = WEIGHT_MOB + +/datum/keybinding/human/can_use(client/user) + return ishuman(user.mob) + +/datum/keybinding/human/quick_equip + hotkey_keys = list("E") + name = "quick_equip" + full_name = "Quick Equip" + description = "Quickly puts an item in the best slot available" + +/datum/keybinding/human/quick_equip/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.quick_equip() + return TRUE + +/datum/keybinding/human/quick_equipbelt + hotkey_keys = list("ShiftE") + name = "quick_equipbelt" + full_name = "Quick equip belt" + description = "Put held thing in belt or take out most recent thing from belt" + +/datum/keybinding/human/quick_equipbelt/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.smart_equipbelt() + return TRUE + +/datum/keybinding/human/bag_equip + hotkey_keys = list("ShiftB") + name = "bag_equip" + full_name = "Bag equip" + description = "Put held thing in backpack or take out most recent thing from backpack" + +/datum/keybinding/human/bag_equip/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.smart_equipbag() + return TRUE diff --git a/code/modules/keybindings/keybind/living.dm b/code/modules/keybindings/keybind/living.dm new file mode 100644 index 0000000000..b5921b378a --- /dev/null +++ b/code/modules/keybindings/keybind/living.dm @@ -0,0 +1,27 @@ +/datum/keybinding/living + category = CATEGORY_HUMAN + weight = WEIGHT_MOB + +/datum/keybinding/living/can_use(client/user) + return isliving(user.mob) + +/datum/keybinding/living/resist + hotkey_keys = list("B") + name = "resist" + full_name = "Resist" + description = "Break free of your current state. Handcuffed? on fire? Resist!" + +/datum/keybinding/living/resist/down(client/user) + var/mob/living/L = user.mob + L.resist() + return TRUE + +/datum/keybinding/living/toggle_resting + hotkey_keys = list("V") + name = "toggle_resting" + full_name = "Toggle Resting" + description = "Toggles whether or not you are intentionally laying down." + +/datum/keybinding/living/toggle_resting/down(client/user) + var/mob/living/L = user.mob + L.lay_down() diff --git a/code/modules/keybindings/keybind/mob.dm b/code/modules/keybindings/keybind/mob.dm new file mode 100644 index 0000000000..2ce4dc35a0 --- /dev/null +++ b/code/modules/keybindings/keybind/mob.dm @@ -0,0 +1,123 @@ +/datum/keybinding/mob + category = CATEGORY_HUMAN + weight = WEIGHT_MOB + +/datum/keybinding/mob/stop_pulling + hotkey_keys = list("H", "Delete") + name = "stop_pulling" + full_name = "Stop pulling" + description = "" + +/datum/keybinding/mob/stop_pulling/down(client/user) + var/mob/M = user.mob + if(!M.pulling) + to_chat(user, "You are not pulling anything.") + else + M.stop_pulling() + return TRUE + +/datum/keybinding/mob/cycle_intent_right + hotkey_keys = list("Unbound") + name = "cycle_intent_right" + full_name = "Cycle Action Intent Right" + description = "" + +/datum/keybinding/mob/cycle_intent_right/down(client/user) + var/mob/M = user.mob + M.a_intent_change(INTENT_HOTKEY_RIGHT) + return TRUE + +/datum/keybinding/mob/cycle_intent_left + hotkey_keys = list("Unbound") + name = "cycle_intent_left" + full_name = "Cycle Action Intent Left" + description = "" + +/datum/keybinding/mob/cycle_intent_left/down(client/user) + var/mob/M = user.mob + M.a_intent_change(INTENT_HOTKEY_LEFT) + return TRUE + +/datum/keybinding/mob/swap_hands + hotkey_keys = list("X", "Northeast") // PAGEUP + name = "swap_hands" + full_name = "Swap hands" + description = "" + +/datum/keybinding/mob/swap_hands/down(client/user) + var/mob/M = user.mob + M.swap_hand() + return TRUE + +/datum/keybinding/mob/activate_inhand + hotkey_keys = list("Z", "Southeast") // PAGEDOWN + name = "activate_inhand" + full_name = "Activate in-hand" + description = "Uses whatever item you have inhand" + +/datum/keybinding/mob/activate_inhand/down(client/user) + var/mob/M = user.mob + M.mode() + return TRUE + +/datum/keybinding/mob/drop_item + hotkey_keys = list("Q") + name = "drop_item" + full_name = "Drop Item" + description = "" + +/datum/keybinding/mob/drop_item/down(client/user) + if(iscyborg(user.mob)) //cyborgs can't drop items + return FALSE + var/mob/M = user.mob + var/obj/item/I = M.get_active_held_item() + if(!I) + to_chat(user, "You have nothing to drop in your hand!") + else + user.mob.dropItemToGround(I) + return TRUE + +/datum/keybinding/mob/say_with_indicator + hotkey_keys = list("CtrlT") + classic_keys = list() + name = "say_with_indicator" + full_name = "Say with Typing Indicator" + +/datum/keybinding/mob/say_with_indicator/down(client/user) + var/mob/M = user.mob + M.say_typing_indicator() + return TRUE + +/datum/keybinding/mob/me_with_indicator + hotkey_keys = list("CtrlM") + classic_keys = list() + name = "me_with_indicator" + full_name = "Me (emote) with Typing Indicator" + +/datum/keybinding/mob/me_with_indicator/down(client/user) + var/mob/M = user.mob + M.me_typing_indicator() + return TRUE + +/datum/keybinding/living/subtle + hotkey_keys = list("5") + classic_keys = list() + name = "subtle_emote" + full_name = "Subtle Emote" + +/datum/keybinding/living/subtle/down(client/user) + var/mob/living/L = user.mob + L.subtle_keybind() + return TRUE + +/datum/keybinding/mob/whisper + hotkey_keys = list("Y") + classic_keys = list() + name = "whisper" + full_name = "Whisper" + +/datum/keybinding/mob/whisper/down(client/user) + var/mob/M = user.mob + M.whisper_keybind() + return TRUE + diff --git a/code/modules/keybindings/keybind/movement.dm b/code/modules/keybindings/keybind/movement.dm new file mode 100644 index 0000000000..176e6b9fb8 --- /dev/null +++ b/code/modules/keybindings/keybind/movement.dm @@ -0,0 +1,187 @@ +/datum/keybinding/movement + category = CATEGORY_MOVEMENT + weight = WEIGHT_HIGHEST + +/datum/keybinding/movement/north + hotkey_keys = list("W", "North") + name = "North" + full_name = "Move North" + description = "Moves your character north" + +/datum/keybinding/movement/south + hotkey_keys = list("S", "South") + name = "South" + full_name = "Move South" + description = "Moves your character south" + +/datum/keybinding/movement/west + hotkey_keys = list("A", "West") + name = "West" + full_name = "Move West" + description = "Moves your character left" + +/datum/keybinding/movement/east + hotkey_keys = list("D", "East") + name = "East" + full_name = "Move East" + description = "Moves your character east" + +/datum/keybinding/mob/face_north + hotkey_keys = list("CtrlW", "CtrlNorth") + name = "face_north" + full_name = "Face North" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/face_north/down(client/user) + var/mob/M = user.mob + M.northface() + return TRUE + +/datum/keybinding/mob/face_east + hotkey_keys = list("CtrlD", "CtrlEast") + name = "face_east" + full_name = "Face East" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/face_east/down(client/user) + var/mob/M = user.mob + M.eastface() + return TRUE + +/datum/keybinding/mob/face_south + hotkey_keys = list("CtrlS", "CtrlSouth") + name = "face_south" + full_name = "Face South" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/face_south/down(client/user) + var/mob/M = user.mob + M.southface() + return TRUE + +/datum/keybinding/mob/face_west + hotkey_keys = list("CtrlA", "CtrlWest") + name = "face_west" + full_name = "Face West" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/face_west/down(client/user) + var/mob/M = user.mob + M.westface() + return TRUE + +/datum/keybinding/mob/shift_north + hotkey_keys = list("CtrlShiftW", "CtrlShiftNorth") + name = "pixel_shift_north" + full_name = "Pixel Shift North" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/shift_north/down(client/user) + var/mob/M = user.mob + M.northshift() + return TRUE + +/datum/keybinding/mob/shift_east + hotkey_keys = list("CtrlShiftD", "CtrlShiftEast") + name = "pixel_shift_east" + full_name = "Pixel Shift East" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/shift_east/down(client/user) + var/mob/M = user.mob + M.eastshift() + return TRUE + +/datum/keybinding/mob/shift_south + hotkey_keys = list("CtrlShiftS", "CtrlShiftSouth") + name = "pixel_shift_south" + full_name = "Pixel Shift South" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/shift_south/down(client/user) + var/mob/M = user.mob + M.southshift() + return TRUE + +/datum/keybinding/mob/shift_west + hotkey_keys = list("CtrlShiftA", "CtrlShiftWest") + name = "pixel_shift_west" + full_name = "Pixel Shift West" + description = "" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/shift_west/down(client/user) + var/mob/M = user.mob + M.westshift() + return TRUE + +/datum/keybinding/living/hold_sprint + hotkey_keys = list("Shift") + name = "hold_sprint" + full_name = "Sprint (hold down)" + description = "Hold down to sprint" + category = CATEGORY_MOVEMENT + +/datum/keybinding/living/hold_sprint/can_use(client/user) + return ishuman(user.mob) || iscyborg(user.mob) + +/datum/keybinding/living/hold_sprint/down(client/user) + var/mob/living/L = user.mob + L.sprint_hotkey(TRUE) + return TRUE + +/datum/keybinding/living/hold_sprint/up(client/user) + var/mob/living/L = user.mob + L.sprint_hotkey(FALSE) + return TRUE + +/datum/keybinding/living/toggle_sprint + hotkey_keys = list() + name = "toggle_sprint" + full_name = "Sprint (toggle)" + description = "Press to toggle sprint" + category = CATEGORY_MOVEMENT + +/datum/keybinding/living/toggle_sprint/can_use(client/user) + return ishuman(user.mob) || iscyborg(user.mob) + +/datum/keybinding/living/toggle_sprint/down(client/user) + var/mob/living/L = user.mob + L.default_toggle_sprint(TRUE) + return TRUE + +/datum/keybinding/mob/toggle_move_intent + hotkey_keys = list("Alt") + name = "toggle_move_intent" + full_name = "Hold to toggle move intent" + description = "Held down to cycle to the other move intent, release to cycle back" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/toggle_move_intent/down(client/user) + var/mob/M = user.mob + M.toggle_move_intent() + return TRUE + +/datum/keybinding/mob/toggle_move_intent/up(client/user) + var/mob/M = user.mob + M.toggle_move_intent() + return TRUE + +/datum/keybinding/mob/toggle_move_intent_alternative + hotkey_keys = list("Unbound") + name = "toggle_move_intent_alt" + full_name = "press to cycle move intent" + description = "Pressing this cycle to the opposite move intent, does not cycle back" + category = CATEGORY_MOVEMENT + +/datum/keybinding/mob/toggle_move_intent_alternative/down(client/user) + var/mob/M = user.mob + M.toggle_move_intent() + return TRUE diff --git a/code/modules/keybindings/keybind/robot.dm b/code/modules/keybindings/keybind/robot.dm new file mode 100644 index 0000000000..b9f6ce83eb --- /dev/null +++ b/code/modules/keybindings/keybind/robot.dm @@ -0,0 +1,61 @@ +/datum/keybinding/robot + category = CATEGORY_ROBOT + weight = WEIGHT_ROBOT + +/datum/keybinding/robot/can_use(client/user) + return iscyborg(user.mob) + +/datum/keybinding/robot/moduleone + hotkey_keys = list("1") + name = "module_one" + full_name = "Toggle module 1" + description = "Equips or unequips the first module" + +/datum/keybinding/robot/moduleone/down(client/user) + var/mob/living/silicon/robot/R = user.mob + R.toggle_module(1) + return TRUE + +/datum/keybinding/robot/moduletwo + hotkey_keys = list("2") + name = "module_two" + full_name = "Toggle module 2" + description = "Equips or unequips the second module" + +/datum/keybinding/robot/moduletwo/down(client/user) + var/mob/living/silicon/robot/R = user.mob + R.toggle_module(2) + return TRUE + +/datum/keybinding/robot/modulethree + hotkey_keys = list("3") + name = "module_three" + full_name = "Toggle module 3" + description = "Equips or unequips the third module" + +/datum/keybinding/robot/modulethree/down(client/user) + var/mob/living/silicon/robot/R = user.mob + R.toggle_module(3) + return TRUE + +/datum/keybinding/robot/intent_cycle + hotkey_keys = list("4") + name = "cycle_intent" + full_name = "Cycle intent left" + description = "Cycles the intent left" + +/datum/keybinding/robot/intent_cycle/down(client/user) + var/mob/living/silicon/robot/R = user.mob + R.a_intent_change(INTENT_HOTKEY_LEFT) + return TRUE + +/datum/keybinding/robot/unequip_module + hotkey_keys = list("Q") + name = "unequip_module" + full_name = "Unequip module" + description = "Unequips the active module" + +/datum/keybinding/robot/unequip_module/down(client/user) + var/mob/living/silicon/robot/R = user.mob + R.uneq_active() + return TRUE diff --git a/code/modules/keybindings/keybind/targeting.dm b/code/modules/keybindings/keybind/targeting.dm new file mode 100644 index 0000000000..1548d768cf --- /dev/null +++ b/code/modules/keybindings/keybind/targeting.dm @@ -0,0 +1,76 @@ +/datum/keybinding/mob/target_head_cycle + hotkey_keys = list("Numpad8") + name = "target_head_cycle" + full_name = "Target: Cycle head" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_head_cycle/down(client/user) + user.body_toggle_head() + return TRUE + +/datum/keybinding/mob/target_r_arm + hotkey_keys = list("Numpad4") + name = "target_r_arm" + full_name = "Target: right arm" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_r_arm/down(client/user) + user.body_r_arm() + return TRUE + +/datum/keybinding/mob/target_body_chest + hotkey_keys = list("Numpad5") + name = "target_body_chest" + full_name = "Target: Body" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_body_chest/down(client/user) + user.body_chest() + return TRUE + +/datum/keybinding/mob/target_left_arm + hotkey_keys = list("Numpad6") + name = "target_left_arm" + full_name = "Target: left arm" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_left_arm/down(client/user) + user.body_l_arm() + return TRUE + +/datum/keybinding/mob/target_right_leg + hotkey_keys = list("Numpad1") + name = "target_right_leg" + full_name = "Target: Right leg" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_right_leg/down(client/user) + user.body_r_leg() + return TRUE + +/datum/keybinding/mob/target_body_groin + hotkey_keys = list("Numpad2") + name = "target_body_groin" + full_name = "Target: Groin" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_body_groin/down(client/user) + user.body_groin() + return TRUE + +/datum/keybinding/mob/target_left_leg + hotkey_keys = list("Numpad3") + name = "target_left_leg" + full_name = "Target: left leg" + description = "" + category = CATEGORY_TARGETING + +/datum/keybinding/mob/target_left_leg/down(client/user) + user.body_l_leg() + return TRUE diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index 9a13bfb11c..a53820b5d2 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -1,55 +1,47 @@ -/client - /// Keys currently held - var/list/keys_held = list() - /// These next two vars are to apply movement for keypresses and releases made while move delayed. - /// Because discarding that input makes the game less responsive. - /// On next move, add this dir to the move that would otherwise be done - var/next_move_dir_add - /// On next move, subtract this dir from the move that would otherwise be done - var/next_move_dir_sub - -// Set a client's focus to an object and override these procs on that object to let it handle keypresses - /datum/proc/key_down(key, client/user) // Called when a key is pressed down initially return + /datum/proc/key_up(key, client/user) // Called when a key is released return + /datum/proc/keyLoop(client/user) // Called once every frame set waitfor = FALSE return // removes all the existing macros /client/proc/erase_all_macros() - var/list/macro_sets = params2list(winget(src, null, "macros")) var/erase_output = "" - for(var/i in 1 to macro_sets.len) - var/setname = macro_sets[i] - var/list/macro_set = params2list(winget(src, "[setname].*", "command")) // The third arg doesnt matter here as we're just removing them all - for(var/k in 1 to macro_set.len) - var/list/split_name = splittext(macro_set[k], ".") - var/macro_name = "[split_name[1]].[split_name[2]]" // [3] is "command" - erase_output = "[erase_output];[macro_name].parent=null" + var/list/macro_set = params2list(winget(src, "default.*", "command")) // The third arg doesnt matter here as we're just removing them all + for(var/k in 1 to length(macro_set)) + var/list/split_name = splittext(macro_set[k], ".") + var/macro_name = "[split_name[1]].[split_name[2]]" // [3] is "command" + erase_output = "[erase_output];[macro_name].parent=null" winset(src, null, erase_output) -/client/proc/set_macros() +/client/proc/apply_macro_set(name, list/macroset) + ASSERT(name) + ASSERT(islist(macroset)) + winclone(src, "default", name) + for(var/i in 1 to length(macroset)) + var/key = macroset[i] + var/command = macroset[key] + winset(src, "[name]-[REF(key)]", "parent=[name];name=[key];command=[command]") + +/client/proc/set_macros(datum/preferences/prefs_override = prefs) set waitfor = FALSE keys_held.Cut() erase_all_macros() - var/list/macro_sets = SSinput.macro_sets - for(var/i in 1 to macro_sets.len) - var/setname = macro_sets[i] - if(setname != "default") - winclone(src, "default", setname) - var/list/macro_set = macro_sets[setname] - for(var/k in 1 to macro_set.len) - var/key = macro_set[k] - var/command = macro_set[key] - winset(src, "[setname]-[REF(key)]", "parent=[setname];name=[key];command=[command]") + apply_macro_set(SKIN_MACROSET_HOTKEYS, SSinput.macroset_hotkey) + apply_macro_set(SKIN_MACROSET_CLASSIC_HOTKEYS, SSinput.macroset_classic_hotkey) + apply_macro_set(SKIN_MACROSET_CLASSIC_INPUT, SSinput.macroset_classic_input) - if(prefs.hotkeys) - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=default") + set_hotkeys_preference() + +/client/proc/set_hotkeys_preference(datum/preferences/prefs_override = prefs) + if(prefs_override.hotkeys) + winset(src, null, "map.focus=true input.background-color=[COLOR_INPUT_DISABLED] mainwindow.macro=[SKIN_MACROSET_HOTKEYS]") else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default") + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=[SKIN_MACROSET_CLASSIC_INPUT]") diff --git a/code/modules/language/codespeak.dm b/code/modules/language/codespeak.dm index be325d14b0..5d658b1fce 100644 --- a/code/modules/language/codespeak.dm +++ b/code/modules/language/codespeak.dm @@ -46,7 +46,7 @@ return to_chat(user, "You start skimming through [src], and suddenly your mind is filled with codewords and responses.") - user.grant_language(/datum/language/codespeak) + user.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) use_charge(user) @@ -65,7 +65,7 @@ M.visible_message("[user] beats [M] over the head with [src]!", "[user] beats you over the head with [src]!", "You hear smacking.") else M.visible_message("[user] teaches [M] by beating [M.p_them()] over the head with [src]!", "As [user] hits you with [src], codewords and responses flow through your mind.", "You hear smacking.") - M.grant_language(/datum/language/codespeak) + M.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) use_charge(user) /obj/item/codespeak_manual/proc/use_charge(mob/user) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index b307e66b39..6e3d27f2b8 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -1,149 +1,332 @@ -/datum/language_holder - var/list/languages = list(/datum/language/common) - var/list/shadow_languages = list() - var/only_speaks_language = null - var/selected_default_language = null - var/datum/language_menu/language_menu +/*!Language holders will either exist in an atom/movable or a mind. Creation of language holders happens +automatically when they are needed, for example when something tries to speak. +Where a mind is available, the mind language holder will be the one "in charge". The mind holder +will update its languages based on the atom holder, and will get updated as part of +transformations and other events that cause new languages to become available. +Every language holder has three lists of languages (and sources for each of them): +- understood_languages +- spoken_languages +- blocked_languages +Understood languages let you understand them, spoken languages lets you speak them +(if your tongue is compatible), and blocked languages will let you do neither no matter +what the source of the language is. +Language holders are designed to mostly only ever require the use the helpers in atom/movable +to achieve your goals, but it is also possible to work on them directly if needed. Any adding +and removing of languages and sources should only happen through the procs, as directly changing +these will mess something up somewhere down the line. +All atom movables have the initial_language_holder var which allows you to set the default language +holder to create. For example, /datum/language_holder/alien will give you xenocommon and a block for +galactic common. Human species also have a default language holder var that will be updated on +species change, initial_species_holder. +Key procs +* [grant_language](atom/movable.html#proc/grant_language) +* [remove_language](atom/movable.html#proc/remove_language) +* [add_blocked_language](atom/movable.html#proc/add_blocked_language) +* [remove_blocked_language](atom/movable.html#proc/remove_blocked_language) +* [grant_all_languages](atom/movable.html#proc/grant_all_languages) +* [remove_all_languages](atom/movable.html#proc/remove_all_languages) +* [has_language](atom/movable.html#proc/has_language) +* [can_speak_language](atom/movable.html#proc/can_speak_language) +* [get_selected_language](atom/movable.html#proc/get_selected_language) +* [update_atom_languages](atom/movable.html#proc/update_atom_languages) +*/ +/datum/language_holder + /// Understood languages. + var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_MIND)) + /// A list of languages that can be spoken. Tongue organ may also set limits beyond this list. + var/list/spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) + /// A list of blocked languages. Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc. + var/list/blocked_languages = list() + /// If true, overrides tongue limitations. var/omnitongue = FALSE + /// Handles displaying the language menu UI. + var/datum/language_menu/language_menu + /// Currently spoken language + var/selected_language + /// Tracks the entity that owns the holder. var/owner -/datum/language_holder/New(owner) - src.owner = owner - - languages = typecacheof(languages) - shadow_languages = typecacheof(shadow_languages) - -/datum/language_holder/Destroy() - owner = null - QDEL_NULL(language_menu) - languages.Cut() - shadow_languages.Cut() - return ..() - -/datum/language_holder/proc/copy(newowner) - var/datum/language_holder/copy = new(newowner) - copy.languages = src.languages.Copy() - // shadow languages are not copied. - copy.only_speaks_language = src.only_speaks_language - copy.selected_default_language = src.selected_default_language - // language menu is not copied, that's tied to the holder. - copy.omnitongue = src.omnitongue - return copy - -/datum/language_holder/proc/grant_language(datum/language/dt, shadow = FALSE) - if(shadow) - shadow_languages[dt] = TRUE - else - languages[dt] = TRUE - -/datum/language_holder/proc/grant_all_languages(omnitongue=FALSE) - for(var/la in GLOB.all_languages) - grant_language(la) - - if(omnitongue) - src.omnitongue = TRUE - -/datum/language_holder/proc/get_random_understood_language() - var/list/possible = list() - for(var/dt in languages) - possible += dt - . = safepick(possible) - -/datum/language_holder/proc/remove_language(datum/language/dt, shadow = FALSE) - if(shadow) - shadow_languages -= dt - else - languages -= dt - -/datum/language_holder/proc/remove_all_languages() - languages.Cut() - -/datum/language_holder/proc/has_language(datum/language/dt) - if(is_type_in_typecache(dt, languages)) - return LANGUAGE_KNOWN - else - var/atom/movable/AM = get_atom() - var/datum/language_holder/L = AM.get_language_holder(shadow=FALSE) - if(L != src) - if(is_type_in_typecache(dt, L.shadow_languages)) - return LANGUAGE_SHADOWED - return FALSE - -/datum/language_holder/proc/copy_known_languages_from(thing, replace=FALSE) - var/datum/language_holder/other - if(istype(thing, /datum/language_holder)) - other = thing - else if(ismovableatom(thing)) - var/atom/movable/AM = thing - other = AM.get_language_holder() - else if(istype(thing, /datum/mind)) - var/datum/mind/M = thing - other = M.get_language_holder() - - if(replace) - src.remove_all_languages() - - for(var/l in other.languages) - src.grant_language(l) - - -/datum/language_holder/proc/open_language_menu(mob/user) - if(!language_menu) - language_menu = new(src) - language_menu.ui_interact(user) - -/datum/language_holder/proc/get_atom() - if(ismovableatom(owner)) - . = owner - else if(istype(owner, /datum/mind)) +/// Initializes, and copies in the languages from the current atom if available. +/datum/language_holder/New(_owner) + owner = _owner + if(istype(owner, /datum/mind)) var/datum/mind/M = owner if(M.current) - . = M.current + update_atom_languages(M.current) + get_selected_language() + +/datum/language_holder/Destroy() + QDEL_NULL(language_menu) + return ..() + +/// Grants the supplied language. +/datum/language_holder/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_MIND) + if(understood) + if(!understood_languages[language]) + understood_languages[language] = list() + understood_languages[language] |= source + . = TRUE + if(spoken) + if(!spoken_languages[language]) + spoken_languages[language] = list() + spoken_languages[language] |= source + . = TRUE + +/// Grants every language to understood and spoken, and gives omnitongue. +/datum/language_holder/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND) + for(var/language in GLOB.all_languages) + grant_language(language, understood, spoken, source) + if(grant_omnitongue) // Overrides tongue limitations. + omnitongue = TRUE + return TRUE + +/// Removes a single language or source, removing all sources returns the pre-removal state of the language. +/datum/language_holder/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) + if(understood && understood_languages[language]) + if(source == LANGUAGE_ALL) + understood_languages -= language + else + understood_languages[language] -= source + if(!length(understood_languages[language])) + understood_languages -= language + . = TRUE + + if(spoken && spoken_languages[language]) + if(source == LANGUAGE_ALL) + spoken_languages -= language + else + spoken_languages[language] -= source + if(!length(spoken_languages[language])) + spoken_languages -= language + . = TRUE + +/// Removes every language and optionally sets omnitongue false. If a non default source is supplied, only removes that source. +/datum/language_holder/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE) + for(var/language in GLOB.all_languages) + remove_language(language, TRUE, TRUE, source) + if(remove_omnitongue) + omnitongue = FALSE + return TRUE + +/// Adds a single language or list of languages to the blocked language list. +/datum/language_holder/proc/add_blocked_language(languages, source = LANGUAGE_MIND) + if(!islist(languages)) + languages = list(languages) + for(var/language in languages) + if(!blocked_languages[language]) + blocked_languages[language] = list() + blocked_languages[language] |= source + return TRUE + +/// Removes a single language or list of languages from the blocked language list. +/datum/language_holder/proc/remove_blocked_language(languages, source = LANGUAGE_MIND) + if(!islist(languages)) + languages = list(languages) + for(var/language in languages) + if(blocked_languages[language]) + if(source == LANGUAGE_ALL) + blocked_languages -= language + else + blocked_languages[language] -= source + if(!length(blocked_languages[language])) + blocked_languages -= language + return TRUE + +/// Checks if you have the language. If spoken is true, only checks if you can speak the language. +/datum/language_holder/proc/has_language(language, spoken = FALSE) + if(language in blocked_languages) + return FALSE + if(spoken) + return language in spoken_languages + return language in understood_languages + +/// Checks if you can speak the language. Tongue limitations should be supplied as an argument. +/datum/language_holder/proc/can_speak_language(language) + var/atom/movable/ouratom = get_atom() + var/tongue = ouratom.could_speak_language(language) + if((omnitongue || tongue) && has_language(language, TRUE)) + return TRUE + return FALSE + +/// Returns selected language if it can be spoken, or decides, sets and returns a new selected language if possible. +/datum/language_holder/proc/get_selected_language() + if(selected_language && can_speak_language(selected_language)) + return selected_language + selected_language = null + var/highest_priority + for(var/lang in spoken_languages) + var/datum/language/language = lang + var/priority = initial(language.default_priority) + if((!highest_priority || (priority > highest_priority)) && !(language in blocked_languages)) + if(can_speak_language(language)) + selected_language = language + highest_priority = priority + return selected_language + +/// Gets a random understood language, useful for hallucinations and such. +/datum/language_holder/proc/get_random_understood_language() + return pick(understood_languages) + +/// Gets a random spoken language, useful for forced speech and such. +/datum/language_holder/proc/get_random_spoken_language() + return pick(spoken_languages) + +/// Opens a language menu reading from the language holder. +/datum/language_holder/proc/open_language_menu(mob/user) + if(!language_menu) + language_menu = new (src) + language_menu.ui_interact(user) + +/// Gets the atom, since we some times need to check if the tongue has limitations. +/datum/language_holder/proc/get_atom() + if(owner) + if(istype(owner, /datum/mind)) + var/datum/mind/M = owner + return M.current + return owner + return FALSE + +/// Empties out the atom specific languages and updates them according to the supplied atoms language holder. +/datum/language_holder/proc/update_atom_languages(atom/movable/thing) + var/datum/language_holder/from_atom = thing.get_language_holder(FALSE) //Gets the atoms language holder + if(from_atom == src) //This could happen if called on an atom without a mind. + return FALSE + for(var/language in understood_languages) + remove_language(language, TRUE, FALSE, LANGUAGE_ATOM) + for(var/language in spoken_languages) + remove_language(language, FALSE, TRUE, LANGUAGE_ATOM) + for(var/language in blocked_languages) + remove_blocked_language(language, LANGUAGE_ATOM) + + copy_languages(from_atom) + get_selected_language() + return TRUE + +/// Copies all languages from the supplied atom/language holder. Source should be overridden when you +/// do not want the language overwritten by later atom updates or want to avoid blocked languages. +/datum/language_holder/proc/copy_languages(var/datum/language_holder/from_holder, source_override) + if(source_override) //No blocked languages here, for now only used by ling absorb. + for(var/language in from_holder.understood_languages) + grant_language(language, TRUE, FALSE, source_override) + for(var/language in from_holder.spoken_languages) + grant_language(language, FALSE, TRUE, source_override) + else + for(var/language in from_holder.understood_languages) + grant_language(language, TRUE, FALSE, from_holder.understood_languages[language]) + for(var/language in from_holder.spoken_languages) + grant_language(language, FALSE, TRUE, from_holder.spoken_languages[language]) + for(var/language in from_holder.blocked_languages) + add_blocked_language(language, from_holder.blocked_languages[language]) + return TRUE + + +//************************************************ +//* Specific language holders * +//* Use atom language sources only. * +//************************************************/ + /datum/language_holder/alien - languages = list(/datum/language/xenocommon) - -/datum/language_holder/monkey - languages = list(/datum/language/monkey) - -/datum/language_holder/swarmer - languages = list(/datum/language/swarmer) + understood_languages = list(/datum/language/xenocommon = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/xenocommon = list(LANGUAGE_ATOM)) + blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/clockmob - languages = list(/datum/language/common, /datum/language/ratvar) - only_speaks_language = /datum/language/ratvar + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/ratvar = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/ratvar = list(LANGUAGE_ATOM)) /datum/language_holder/construct - languages = list(/datum/language/common, /datum/language/narsie) + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/narsie = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/narsie = list(LANGUAGE_ATOM)) /datum/language_holder/drone - languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine) - only_speaks_language = /datum/language/drone + understood_languages = list(/datum/language/drone = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/drone = list(LANGUAGE_ATOM)) + blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /datum/language_holder/drone/syndicate - only_speaks_language = null + blocked_languages = null /datum/language_holder/dwarf - languages = list(/datum/language/common, /datum/language/dwarf) - only_speaks_language = /datum/language/dwarf + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/dwarf = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/dwarf = list(LANGUAGE_ATOM)) -/datum/language_holder/slime - languages = list(/datum/language/common, /datum/language/slime) - only_speaks_language = /datum/language/slime +/datum/language_holder/jelly + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM)) /datum/language_holder/lightbringer - // TODO change to a lightbringer specific sign language - languages = list(/datum/language/slime) + understood_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) + blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) + +/datum/language_holder/lizard + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM)) + +/datum/language_holder/lizard/ash + selected_language = /datum/language/draconic + +/datum/language_holder/monkey + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/monkey = list(LANGUAGE_ATOM)) + +/datum/language_holder/mushroom + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/mushroom = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/mushroom = list(LANGUAGE_ATOM)) + +/datum/language_holder/slime + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM)) + +/datum/language_holder/swarmer + understood_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM)) + blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) + +/datum/language_holder/sylvan + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM)) + /datum/language_holder/synthetic - languages = list(/datum/language/common) - shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic, /datum/language/slime, /datum/language/dwarf) + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + /datum/language/dwarf = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + /datum/language/dwarf = list(LANGUAGE_ATOM)) + +/datum/language_holder/venus + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM)) /datum/language_holder/empty - languages = list() - shadow_languages = list() + understood_languages = list() + spoken_languages = list() /datum/language_holder/universal/New() ..() - grant_all_languages(omnitongue=TRUE) + grant_all_languages() diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index eea87f1d80..a7ce211a18 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -1,8 +1,8 @@ /datum/language_menu var/datum/language_holder/language_holder -/datum/language_menu/New(language_holder) - src.language_holder = language_holder +/datum/language_menu/New(_language_holder) + language_holder = _language_holder /datum/language_menu/Destroy() language_holder = null @@ -24,21 +24,20 @@ data["is_living"] = FALSE data["languages"] = list() - for(var/ld in GLOB.all_languages) - var/result = language_holder.has_language(ld) + for(var/lang in GLOB.all_languages) + var/result = language_holder.has_language(lang) || language_holder.has_language(lang, TRUE) if(!result) continue - var/shadow = result == LANGUAGE_SHADOWED - var/datum/language/LD = ld + var/datum/language/language = lang var/list/L = list() - L["name"] = initial(LD.name) - L["desc"] = initial(LD.desc) - L["key"] = initial(LD.key) - L["is_default"] = (LD == language_holder.selected_default_language) - L["shadow"] = shadow + L["name"] = initial(language.name) + L["desc"] = initial(language.desc) + L["key"] = initial(language.key) + L["is_default"] = (language == language_holder.selected_language) if(AM) - L["can_speak"] = AM.can_speak_in_language(LD) + L["can_speak"] = AM.can_speak_language(language) + L["can_understand"] = AM.has_language(language) data["languages"] += list(L) @@ -47,15 +46,15 @@ data["omnitongue"] = language_holder.omnitongue data["unknown_languages"] = list() - for(var/ld in GLOB.all_languages) - if(language_holder.has_language(ld)) + for(var/lang in GLOB.all_languages) + if(language_holder.has_language(lang) || language_holder.has_language(lang, TRUE)) continue - var/datum/language/LD = ld + var/datum/language/language = lang var/list/L = list() - L["name"] = initial(LD.name) - L["desc"] = initial(LD.desc) - L["key"] = initial(LD.key) + L["name"] = initial(language.name) + L["desc"] = initial(language.desc) + L["key"] = initial(language.key) data["unknown_languages"] += list(L) return data @@ -68,27 +67,51 @@ var/language_name = params["language_name"] var/datum/language/language_datum - for(var/ld in GLOB.all_languages) - var/datum/language/LD = ld - if(language_name == initial(LD.name)) - language_datum = LD + for(var/lang in GLOB.all_languages) + var/datum/language/language = lang + if(language_name == initial(language.name)) + language_datum = language var/is_admin = check_rights_for(user.client, R_ADMIN) switch(action) if("select_default") - if(language_datum && AM.can_speak_in_language(language_datum)) - language_holder.selected_default_language = language_datum + if(language_datum && AM.can_speak_language(language_datum)) + language_holder.selected_language = language_datum . = TRUE if("grant_language") if((is_admin || isobserver(AM)) && language_datum) - language_holder.grant_language(language_datum) + var/list/choices = list("Only Spoken", "Only Understood", "Both") + var/choice = input(user,"How do you want to add this language?","[language_datum]",null) as null|anything in choices + var/spoken = FALSE + var/understood = FALSE + switch(choice) + if("Only Spoken") + spoken = TRUE + if("Only Understood") + understood = TRUE + if("Both") + spoken = TRUE + understood = TRUE + language_holder.grant_language(language_datum, understood, spoken) if(is_admin) message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(AM)].") log_admin("[key_name(user)] granted the language [language_name] to [key_name(AM)].") . = TRUE if("remove_language") if((is_admin || isobserver(AM)) && language_datum) - language_holder.remove_language(language_datum) + var/list/choices = list("Only Spoken", "Only Understood", "Both") + var/choice = input(user,"Which part do you wish to remove?","[language_datum]",null) as null|anything in choices + var/spoken = FALSE + var/understood = FALSE + switch(choice) + if("Only Spoken") + spoken = TRUE + if("Only Understood") + understood = TRUE + if("Both") + spoken = TRUE + understood = TRUE + language_holder.remove_language(language_datum, understood, spoken) if(is_admin) message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(AM)].") log_admin("[key_name(user)] removed the language [language_name] to [key_name(AM)].") diff --git a/code/modules/language/sylvan.dm b/code/modules/language/sylvan.dm new file mode 100644 index 0000000000..3bbf5f6afd --- /dev/null +++ b/code/modules/language/sylvan.dm @@ -0,0 +1,18 @@ +// The language of the vinebings. Yes, it's a shameless ripoff of elvish. +/datum/language/sylvan + name = "Sylvan" + desc = "A complicated, ancient language spoken by vine like beings." + speech_verb = "expresses" + ask_verb = "inquires" + exclaim_verb = "declares" + key = "h" + space_chance = 20 + syllables = list( + "fii", "sii", "rii", "rel", "maa", "ala", "san", "tol", "tok", "dia", "eres", + "fal", "tis", "bis", "qel", "aras", "losk", "rasa", "eob", "hil", "tanl", "aere", + "fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex", + "incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa", + "la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu" + ) + icon_state = "plant" + default_priority = 90 diff --git a/code/modules/language/vampiric.dm b/code/modules/language/vampiric.dm index 6da54ce844..ab48a17d2f 100644 --- a/code/modules/language/vampiric.dm +++ b/code/modules/language/vampiric.dm @@ -1,4 +1,4 @@ -// VAMPIRE LANGUAGE // +// BLOODSUCKER LANGUAGE // /datum/language/vampiric name = "Blah-Sucker" diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 008724b10f..144037b3a7 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -267,7 +267,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums dat += "(Order book by SS13BN)

    " dat += "" dat += "" - dat += libcomp_menu[CLAMP(page,1,libcomp_menu.len)] + dat += libcomp_menu[clamp(page,1,libcomp_menu.len)] dat += "" dat += "
    AUTHORTITLECATEGORY
    <<<< >>>>
    " dat += "
    (Return to main menu)
    " diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm index b69a474009..04c1bb7302 100644 --- a/code/modules/lighting/emissive_blocker.dm +++ b/code/modules/lighting/emissive_blocker.dm @@ -11,6 +11,7 @@ plane = EMISSIVE_BLOCKER_PLANE layer = EMISSIVE_BLOCKER_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT + rad_flags = RAD_NO_CONTAMINATE | RAD_PROTECT_CONTENTS //Why? //render_targets copy the transform of the target as well, but vis_contents also applies the transform //to what's in it. Applying RESET_TRANSFORM here makes vis_contents not apply the transform. diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 8712a66290..779dd9c3ea 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -38,7 +38,7 @@ if (!light_power || !light_range) // We won't emit light anyways, destroy the light source. QDEL_NULL(light) else - if (!ismovableatom(loc)) // We choose what atom should be the top atom of the light here. + if (!ismovable(loc)) // We choose what atom should be the top atom of the light here. . = src else . = loc diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 1de896520d..c6e363be07 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -2,11 +2,11 @@ // And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't). // For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting. -// This list is what the code that assigns corners listens to, the order in this list is the order in which corners are added to the /turf/corners list. -GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST)) - /datum/lighting_corner - var/list/turf/masters + var/turf/northeast + var/turf/northwest + var/turf/southeast + var/turf/southwest var/list/datum/light_source/affecting // Light sources affecting us. var/active = FALSE // TRUE if one of our masters has dynamic lighting. @@ -25,10 +25,18 @@ GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, var/cache_b = LIGHTING_SOFT_THRESHOLD var/cache_mx = 0 -/datum/lighting_corner/New(var/turf/new_turf, var/diagonal) +// Diagonal is our direction FROM them, not to. +/datum/lighting_corner/New(turf/new_turf, diagonal) . = ..() - masters = list() - masters[new_turf] = turn(diagonal, 180) + +#define SET_DIAGONAL(turf, diagonal) \ + switch(diagonal){ \ + if(SOUTHWEST) { northeast = turf; turf.lc_bottomleft = src; } \ + if(SOUTHEAST) { northwest = turf; turf.lc_bottomright = src; } \ + if(NORTHEAST) { southwest = turf; turf.lc_topright = src; } \ + if(NORTHWEST) { southeast = turf; turf.lc_topleft = src; } \ + } + SET_DIAGONAL(new_turf, diagonal) z = new_turf.z var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction. @@ -37,52 +45,28 @@ GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, x = new_turf.x + (horizontal == EAST ? 0.5 : -0.5) y = new_turf.y + (vertical == NORTH ? 0.5 : -0.5) - // My initial plan was to make this loop through a list of all the dirs (horizontal, vertical, diagonal). - // Issue being that the only way I could think of doing it was very messy, slow and honestly overengineered. - // So we'll have this hardcode instead. var/turf/T - var/i - - // Diagonal one is easy. + // Build diagonal one T = get_step(new_turf, diagonal) - if (T) // In case we're on the map's border. - if (!T.corners) - T.corners = list(null, null, null, null) - - masters[T] = diagonal - i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) - T.corners[i] = src - - // Now the horizontal one. + if(T) + SET_DIAGONAL(T, turn(diagonal, 180)) + // Build horizontal T = get_step(new_turf, horizontal) - if (T) // Ditto. - if (!T.corners) - T.corners = list(null, null, null, null) - - masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) - T.corners[i] = src - - // And finally the vertical one. + if(T) + SET_DIAGONAL(T, turn(((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH), 180)) + // Build vertical T = get_step(new_turf, vertical) - if (T) - if (!T.corners) - T.corners = list(null, null, null, null) - - masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) - T.corners[i] = src + if(T) + SET_DIAGONAL(T, turn(((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH), 180)) update_active() +#undef SET_DIAGONAL + /datum/lighting_corner/proc/update_active() active = FALSE - var/turf/T - var/thing - for (thing in masters) - T = thing - if (T.lighting_object) - active = TRUE + if(northeast?.lighting_object || northwest?.lighting_object || southeast?.lighting_object || southwest?.lighting_object) + active = TRUE // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b) @@ -122,13 +106,12 @@ GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, #endif cache_mx = round(mx, LIGHTING_ROUND_VALUE) - for (var/TT in masters) - var/turf/T = TT - if (T.lighting_object) - if (!T.lighting_object.needs_update) - T.lighting_object.needs_update = TRUE - GLOB.lighting_update_objects += T.lighting_object - + #define QUEUE(turf) if(turf?.lighting_object && !turf.lighting_object.needs_update) { turf.lighting_object.needs_update = TRUE; GLOB.lighting_update_objects += turf.lighting_object } + QUEUE(northeast) + QUEUE(northwest) + QUEUE(southeast) + QUEUE(southwest) + #undef QUEUE /datum/lighting_corner/dummy/New() return @@ -138,6 +121,6 @@ GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, if (!force) return QDEL_HINT_LETMELIVE - stack_trace("Ok, Look, /tg/, I need you to find whatever fucker decided to call qdel on a fucking lighting corner, then tell him very nicely and politely that he is 100% retarded and needs his head checked. Thanks. Send them my regards by the way.") + stack_trace("Ok, Look, /tg/, I need you to find whatever fucker decided to call qdel on a fucking lighting corner, then tell him very nicely and politely that he is 100% stupid and needs his head checked. Thanks. Send them my regards by the way.") return ..() diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 9ceb341f91..ffa2d86e15 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -55,7 +55,7 @@ if (loc) var/turf/oldturf = get_turf(myturf) var/turf/newturf = get_turf(loc) - warning("A lighting object realised it's loc had changed in update() ([myturf]\[[myturf ? myturf.type : "null"]]([COORD(oldturf)]) -> [loc]\[[ loc ? loc.type : "null"]]([COORD(newturf)]))!") + stack_trace("A lighting object realised it's loc had changed in update() ([myturf]\[[myturf ? myturf.type : "null"]]([COORD(oldturf)]) -> [loc]\[[ loc ? loc.type : "null"]]([COORD(newturf)]))!") qdel(src, TRUE) return @@ -71,16 +71,10 @@ // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. var/static/datum/lighting_corner/dummy/dummy_lighting_corner = new - var/list/corners = myturf.corners - var/datum/lighting_corner/cr = dummy_lighting_corner - var/datum/lighting_corner/cg = dummy_lighting_corner - var/datum/lighting_corner/cb = dummy_lighting_corner - var/datum/lighting_corner/ca = dummy_lighting_corner - if (corners) //done this way for speed - cr = corners[3] || dummy_lighting_corner - cg = corners[2] || dummy_lighting_corner - cb = corners[4] || dummy_lighting_corner - ca = corners[1] || dummy_lighting_corner + var/datum/lighting_corner/cr = myturf.lc_bottomleft || dummy_lighting_corner + var/datum/lighting_corner/cg = myturf.lc_bottomright || dummy_lighting_corner + var/datum/lighting_corner/cb = myturf.lc_topleft || dummy_lighting_corner + var/datum/lighting_corner/ca = myturf.lc_topright || dummy_lighting_corner var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 6e48d0097c..324e6c1e99 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -9,7 +9,7 @@ var/turf/pixel_turf // The turf the top_atom appears to over. var/light_power // Intensity of the emitter light. var/light_range // The range of the emitted light. - var/light_color // The colour of the light, string, decomposed by parse_light_color() + var/light_color // The colour of the light, string, decomposed by PARSE_LIGHT_COLOR() // Variables for keeping track of the colour. var/lum_r @@ -48,12 +48,10 @@ light_range = source_atom.light_range light_color = source_atom.light_color - parse_light_color() + PARSE_LIGHT_COLOR(src) update() - return ..() - /datum/light_source/Destroy(force) remove_lum() if (source_atom) @@ -99,17 +97,6 @@ /datum/light_source/proc/vis_update() EFFECT_UPDATE(LIGHTING_VIS_UPDATE) -// Decompile the hexadecimal colour into lumcounts of each perspective. -/datum/light_source/proc/parse_light_color() - if (light_color) - lum_r = GetRedPart (light_color) / 255 - lum_g = GetGreenPart (light_color) / 255 - lum_b = GetBluePart (light_color) / 255 - else - lum_r = 1 - lum_g = 1 - lum_b = 1 - // Macro that applies light to a new corner. // It is a macro in the interest of speed, yet not having to copy paste it. // If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. @@ -224,7 +211,7 @@ if (source_atom.light_color != light_color) light_color = source_atom.light_color - parse_light_color() + PARSE_LIGHT_COLOR(src) update = TRUE else if (applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) @@ -237,18 +224,24 @@ return //nothing's changed var/list/datum/lighting_corner/corners = list() + var/datum/lighting_corner/C var/list/turf/turfs = list() var/thing - var/datum/lighting_corner/C var/turf/T + if (source_turf) var/oldlum = source_turf.luminosity source_turf.luminosity = CEILING(light_range, 1) for(T in view(CEILING(light_range, 1), source_turf)) - for (thing in T.get_corners(source_turf)) - C = thing - corners[C] = 0 turfs += T + if((!IS_DYNAMIC_LIGHTING(T) && !T.light_sources) || T.has_opaque_atom ) + continue + if(!T.lighting_corners_initialised) + T.generate_missing_corners() + corners[T.lc_topright] = 0 + corners[T.lc_bottomright] = 0 + corners[T.lc_bottomleft] = 0 + corners[T.lc_topleft] = 0 source_turf.luminosity = oldlum LAZYINITLIST(affecting_turfs) diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index fdd581a292..fc9cd0336d 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -6,9 +6,15 @@ var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. var/tmp/atom/movable/lighting_object/lighting_object // Our lighting object. - var/tmp/list/datum/lighting_corner/corners + var/tmp/datum/lighting_corner/lc_topleft + var/tmp/datum/lighting_corner/lc_topright + var/tmp/datum/lighting_corner/lc_bottomleft + var/tmp/datum/lighting_corner/lc_bottomright var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. +// counterclockwisse 0 to 360 +#define PROC_ON_CORNERS(operation) lc_topright?.##operation;lc_bottomright?.##operation;lc_bottomleft?.##operation;lc_topleft?.##operation + // Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() var/datum/light_source/L @@ -21,13 +27,7 @@ if (lighting_object) qdel(lighting_object, TRUE) - var/datum/lighting_corner/C - var/thing - for (thing in corners) - if(!thing) - continue - C = thing - C.update_active() + PROC_ON_CORNERS(update_active()) // Builds a lighting object for us, but only if our area is dynamic. /turf/proc/lighting_build_overlay() @@ -43,32 +43,31 @@ new/atom/movable/lighting_object(src) - var/thing - var/datum/lighting_corner/C var/datum/light_source/S - for (thing in corners) - if(!thing) - continue - C = thing - if (!C.active) // We would activate the corner, calculate the lighting for it. - for (thing in C.affecting) - S = thing - S.recalc_corner(C) - C.active = TRUE + var/i +#define OPERATE(corner) \ + if(corner && !corner.active) { \ + for(i in corner.affecting) { \ + S = i ; \ + S.recalc_corner(corner) \ + } \ + corner.active = TRUE \ + } + OPERATE(lc_topright) + OPERATE(lc_bottomright) + OPERATE(lc_bottomleft) + OPERATE(lc_topleft) +#undef OPERATE // Used to get a scaled lumcount. /turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1) - if (!lighting_object) + if(!lighting_object) return 1 - var/totallums = 0 - var/thing - var/datum/lighting_corner/L - for (thing in corners) - if(!thing) - continue - L = thing - totallums += L.lum_r + L.lum_b + L.lum_g + var/totallums = (lc_topright? (lc_topright.lum_r + lc_topright.lum_g + lc_topright.lum_b) : 0) \ + + (lc_bottomright? (lc_bottomright.lum_r + lc_bottomright.lum_g + lc_bottomright.lum_b) : 0) \ + + (lc_bottomleft? (lc_bottomleft.lum_r + lc_bottomleft.lum_g + lc_bottomleft.lum_b) : 0) \ + + (lc_topleft? (lc_topleft.lum_r + lc_topleft.lum_g + lc_topleft.lum_b) : 0) totallums /= 12 // 4 corners, each with 3 channels, get the average. @@ -110,27 +109,18 @@ else lighting_clear_overlay() -/turf/proc/get_corners() - if (!IS_DYNAMIC_LIGHTING(src) && !light_sources) - return null - if (!lighting_corners_initialised) - generate_missing_corners() - if (has_opaque_atom) - return null // Since this proc gets used in a for loop, null won't be looped though. - - return corners - /turf/proc/generate_missing_corners() if (!IS_DYNAMIC_LIGHTING(src) && !light_sources) return lighting_corners_initialised = TRUE - if (!corners) - corners = list(null, null, null, null) - - for (var/i = 1 to 4) - if (corners[i]) // Already have a corner on this direction. - continue - - corners[i] = new/datum/lighting_corner(src, GLOB.LIGHTING_CORNER_DIAGONAL[i]) - + // counterclockwise from 0 to 360. + if(!lc_topright) + new /datum/lighting_corner(src, NORTHEAST) + if(!lc_bottomright) + new /datum/lighting_corner(src, SOUTHEAST) + if(!lc_bottomleft) + new /datum/lighting_corner(src, SOUTHWEST) + if(!lc_topleft) + new /datum/lighting_corner(src, NORTHWEST) +#undef PROC_ON_CORNERS diff --git a/code/modules/mapping/dmm_suite.dm b/code/modules/mapping/dmm_suite.dm deleted file mode 100644 index c4ceec33ee..0000000000 --- a/code/modules/mapping/dmm_suite.dm +++ /dev/null @@ -1,63 +0,0 @@ -dmm_suite{ - /* - - dmm_suite version 1.0 - Released January 30th, 2011. - - NOTE: Map saving functionality removed - - defines the object /dmm_suite - - Provides the proc load_map() - - Loads the specified map file onto the specified z-level. - - provides the proc write_map() - - Returns a text string of the map in dmm format - ready for output to a file. - - provides the proc save_map() - - Returns a .dmm file if map is saved - - Returns FALSE if map fails to save - - The dmm_suite provides saving and loading of map files in BYOND's native DMM map - format. It approximates the map saving and loading processes of the Dream Maker - and Dream Seeker programs so as to allow editing, saving, and loading of maps at - runtime. - - ------------------------ - - To save a map at runtime, create an instance of /dmm_suite, and then call - write_map(), which accepts three arguments: - - A turf representing one corner of a three dimensional grid (Required). - - Another turf representing the other corner of the same grid (Required). - - Any, or a combination, of several bit flags (Optional, see documentation). - - The order in which the turfs are supplied does not matter, the /dmm_writer will - determine the grid containing both, in much the same way as DM's block() function. - write_map() will then return a string representing the saved map in dmm format; - this string can then be saved to a file, or used for any other purose. - - ------------------------ - - To load a map at runtime, create an instance of /dmm_suite, and then call load_map(), - which accepts two arguments: - - A .dmm file to load (Required). - - A number representing the z-level on which to start loading the map (Optional). - - The /dmm_suite will load the map file starting on the specified z-level. If no - z-level was specified, world.maxz will be increased so as to fit the map. Note - that if you wish to load a map onto a z-level that already has objects on it, - you will have to handle the removal of those objects. Otherwise the new map will - simply load the new objects on top of the old ones. - - Also note that all type paths specified in the .dmm file must exist in the world's - code, and that the /dmm_reader trusts that files to be loaded are in fact valid - .dmm files. Errors in the .dmm format will cause runtime errors. - - */ - - verb/load_map(var/dmm_file as file, var/x_offset as num, var/y_offset as num, var/z_offset as num, var/cropMap as num, var/measureOnly as num, no_changeturf as num){ - // dmm_file: A .dmm file to load (Required). - // z_offset: A number representing the z-level on which to start loading the map (Optional). - // cropMap: When true, the map will be cropped to fit the existing world dimensions (Optional). - // measureOnly: When true, no changes will be made to the world (Optional). - // no_changeturf: When true, turf/AfterChange won't be called on loaded turfs - } -} \ No newline at end of file diff --git a/code/datums/map_config.dm b/code/modules/mapping/map_config.dm similarity index 79% rename from code/datums/map_config.dm rename to code/modules/mapping/map_config.dm index 5fcd1ae93c..efa2655325 100644 --- a/code/datums/map_config.dm +++ b/code/modules/mapping/map_config.dm @@ -22,6 +22,7 @@ var/traits = null var/space_ruin_levels = 2 var/space_empty_levels = 1 + var/station_ruin_budget = -1 // can be set to manually override the station ruins budget on maps that don't support station ruins, stopping the error from being unable to place the ruins. var/minetype = "lavaland" @@ -38,6 +39,10 @@ var/year_offset = 540 //The offset of ingame year from the actual IRL year. You know you want to make a map that takes place in the 90's. Don't lie. + // "fun things" + /// Orientation to load in by default. + var/orientation = SOUTH //byond defaults to placing everyting SOUTH. + /proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE) var/datum/map_config/config = new if (default_to_box) @@ -130,6 +135,9 @@ log_world("map_config space_empty_levels is not a number!") return + if("station_ruin_budget" in json) + station_ruin_budget = json["station_ruin_budget"] + temp = json["year_offset"] if (isnum(temp)) year_offset = temp @@ -139,13 +147,18 @@ if ("minetype" in json) minetype = json["minetype"] - + if ("maptype" in json) maptype = json["maptype"] if ("announcertype" in json) announcertype = json["announcertype"] + if ("orientation" in json) + orientation = json["orientation"] + if(!(orientation in GLOB.cardinals)) + orientation = SOUTH + allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE defaulted = FALSE @@ -161,3 +174,23 @@ /datum/map_config/proc/MakeNextMap() return config_filename == "data/next_map.json" || fcopy(config_filename, "data/next_map.json") + +/// badmin moments. Keep up to date with LoadConfig()! +/datum/map_config/proc/WriteNextMap() + var/list/jsonlist = list() + jsonlist["map_name"] = map_name + jsonlist["map_path"] = map_path + jsonlist["map_file"] = map_file + jsonlist["shuttles"] = shuttles + jsonlist["traits"] = traits + jsonlist["space_ruin_levels"] = space_ruin_levels + jsonlist["year_offset"] = year_offset + jsonlist["minetype"] = minetype + jsonlist["maptype"] = maptype + jsonlist["announcertype"] = announcertype + jsonlist["orientation"] = orientation + jsonlist["allow_custom_shuttles"] = allow_custom_shuttles + if(fexists("data/next_map.json")) + fdel("data/next_map.json") + var/F = file("data/next_map.json") + WRITE_FILE(F, json_encode(jsonlist)) diff --git a/code/modules/mapping/map_orientation_pattern.dm b/code/modules/mapping/map_orientation_pattern.dm new file mode 100644 index 0000000000..565c25bef1 --- /dev/null +++ b/code/modules/mapping/map_orientation_pattern.dm @@ -0,0 +1,46 @@ +GLOBAL_LIST_INIT(map_orientation_patterns, list( + TEXT_NORTH = new /datum/map_orientation_pattern/north, + TEXT_SOUTH = new /datum/map_orientation_pattern/south, + TEXT_EAST = new /datum/map_orientation_pattern/east, + TEXT_WEST = new /datum/map_orientation_pattern/west + )) + +/datum/map_orientation_pattern + var/invert_x + var/invert_y + var/swap_xy + var/xi + var/yi + var/turn_angle + +/datum/map_orientation_pattern/north + invert_y = TRUE + invert_x = TRUE + swap_xy = FALSE + xi = -1 + yi = 1 + turn_angle = 180 + +/datum/map_orientation_pattern/south + invert_y = FALSE + invert_x = FALSE + swap_xy = FALSE + xi = 1 + yi = -1 + turn_angle = 0 + +/datum/map_orientation_pattern/east + invert_y = TRUE + invert_x = FALSE + swap_xy = TRUE + xi = 1 + yi = 1 + turn_angle = 90 + +/datum/map_orientation_pattern/west + invert_y = FALSE + invert_x = TRUE + swap_xy = TRUE + xi = -1 + yi = -1 + turn_angle = 270 diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 3e361179de..087552fada 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -1,11 +1,14 @@ /datum/map_template var/name = "Default Template Name" - var/width = 0 + var/width = 0 //all these are for SOUTH! var/height = 0 - var/mappath = null + var/zdepth = 1 + var/mappath var/loaded = 0 // Times loaded this round var/datum/parsed_map/cached_map var/keep_cached_map = FALSE + var/default_annihilate = FALSE + var/list/ztraits //zlevel traits for load_new_z /datum/map_template/New(path = null, rename = null, cache = FALSE) if(path) @@ -15,16 +18,45 @@ if(rename) name = rename -/datum/map_template/proc/preload_size(path, cache = FALSE) +/datum/map_template/Destroy() + QDEL_NULL(cached_map) + return ..() + +/datum/map_template/proc/preload_size(path = mappath, force_cache = FALSE) + if(cached_map) + return cached_map.parsed_bounds var/datum/parsed_map/parsed = new(file(path)) - var/bounds = parsed?.bounds + var/bounds = parsed?.parsed_bounds if(bounds) - width = bounds[MAP_MAXX] // Assumes all templates are rectangular, have a single Z level, and begin at 1,1,1 - height = bounds[MAP_MAXY] - if(cache) + width = bounds[MAP_MAXX] - bounds[MAP_MINX] + 1 + height = bounds[MAP_MAXY] - bounds[MAP_MINY] + 1 + zdepth = bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1 + if(force_cache || keep_cached_map) cached_map = parsed return bounds +/datum/map_template/proc/get_parsed_bounds() + return preload_size(mappath) + +/datum/map_template/proc/get_last_loaded_bounds() + if(cached_map) + return cached_map.bounds + return get_parsed_bounds() + +/datum/map_template/proc/get_last_loaded_turf_block() + if(!cached_map) + CRASH("Improper use of get_last_loaded_turf_block, no cached_map.") + var/list/B = cached_map.bounds + return block(locate(B[MAP_MINX], B[MAP_MINY], B[MAP_MINZ]), locate(B[MAP_MAXX], B[MAP_MAXY], B[MAP_MAXZ])) + +/datum/map_template/proc/get_size(orientation = SOUTH) + if(!width || !height || !zdepth) + preload_size(mappath) + var/rotate = (orientation & (NORTH|SOUTH)) != NONE + if(rotate) + return list(height, width, zdepth) + return list(width, height, zdepth) + /datum/parsed_map/proc/initTemplateBounds() var/list/obj/machinery/atmospherics/atmos_machines = list() var/list/obj/structure/cable/cables = list() @@ -55,12 +87,12 @@ SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) -/datum/map_template/proc/load_new_z() - var/x = round((world.maxx - width)/2) - var/y = round((world.maxy - height)/2) +/datum/map_template/proc/load_new_z(orientation = SOUTH, list/ztraits = src.ztraits || list(ZTRAIT_AWAY = TRUE), centered = TRUE) + var/x = centered? max(round((world.maxx - width) / 2), 1) : 1 + var/y = centered? max(round((world.maxy - height) / 2), 1) : 1 - var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(ZTRAIT_AWAY = TRUE)) - var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE) + var/datum/space_level/level = SSmapping.add_new_zlevel(name, ztraits) + var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop = TRUE, orientation = orientation) var/list/bounds = parsed.bounds if(!bounds) return FALSE @@ -71,31 +103,67 @@ parsed.initTemplateBounds() smooth_zlevel(world.maxz) log_game("Z-level [name] loaded at [x],[y],[world.maxz]") + on_map_loaded(world.maxz, parsed.bounds) return level -/datum/map_template/proc/load(turf/T, centered = FALSE) +//Override for custom behavior +/datum/map_template/proc/on_map_loaded(z, list/bounds) + loaded++ + +/** + * Proc to trigger a load at a specific area. Calls on_map_loaded(T.z, loaded_bounds) afterwards. + * + * @params + * * turf/T - Turf to load at + * * centered - Center at T or load with the bottomright corner being at T + * * orientation - SOUTH is default, anything else rotates the map to face it with the point of reference being the map itself is facing south by default. Cardinals only, don't be a 4head and put in multiple flags. It won't work or be pretty if you try. + * * annihilate - Should we destroy stuff in our bounds while loading + * * force_cache - Should we force the parsed shuttle to cache instead of being GC'd post loading if it wasn't going to be cached by default + * * rotate_placement_to_orientation - Has no effect if centered. Should we rotate where we load it around the turf we're loading at? Used for stuff like engine submaps when the station is rotated. + * + */ +/datum/map_template/proc/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE) + var/old_T = T if(centered) - T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z) + T = locate(T.x - round(((orientation & (NORTH|SOUTH))? width : height) / 2) , T.y - round(((orientation & (NORTH|SOUTH)) ? height : width) / 2) , T.z) // %180 catches East/West (90,270) rotations on true, North/South (0,180) rotations on false + else if(rotate_placement_to_orientation && (orientation != SOUTH)) + var/newx = T.x + var/newy = T.y + if(orientation == NORTH) + newx -= width + newy -= height - 1 + else if(orientation == WEST) + newy -= width + else if(orientation == EAST) + newx -= height - 1 + // eh let's not silently fail. + if(!ISINRANGE(newx, 1, world.maxx) || !ISINRANGE(newy, 1, world.maxy)) + stack_trace("Warning: Rotation placed a map template load spot ([COORD(T)]) out of bounds of the game world. Clamping to world borders, this might cause issues.") + T = locate(clamp(newx, 1, world.maxx), clamp(newy, 1, world.maxy), T.z) if(!T) return - if(T.x+width > world.maxx) + if(T.x+width-1 > world.maxx) return - if(T.y+height > world.maxy) + if(T.y+height-1 > world.maxy) return - var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), - locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z)) - for(var/L in border) - var/turf/turf_to_disable = L + var/list/border = block(locate(max(T.x - 1, 1), max(T.y - 1, 1), T.z), + locate(min(T.x + width + 1, world.maxx), min(T.y + height + 1, world.maxy), T.z)) + for(var/i in border) + var/turf/turf_to_disable = i SSair.remove_from_active(turf_to_disable) //stop processing turfs along the border to prevent runtimes, we return it in initTemplateBounds() turf_to_disable.atmos_adjacent_turfs?.Cut() + if(annihilate == MAP_TEMPLATE_ANNIHILATE_PRELOAD) + annihilate_bounds(old_T, centered, orientation) + // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. - var/datum/parsed_map/parsed = cached_map || new(file(mappath)) - cached_map = keep_cached_map ? parsed : null - if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)) + var/is_cached = cached_map + var/datum/parsed_map/parsed = is_cached || new(file(mappath)) + cached_map = (force_cache || keep_cached_map) ? parsed : is_cached + if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE, orientation = orientation, annihilate_tiles = (annihilate == MAP_TEMPLATE_ANNIHILATE_LOADING))) return var/list/bounds = parsed.bounds if(!bounds) @@ -108,19 +176,36 @@ parsed.initTemplateBounds() log_game("[name] loaded at [T.x],[T.y],[T.z]") + on_map_loaded(T.z, parsed.bounds) + return bounds -/datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE) - var/turf/placement = T - if(centered) - var/turf/corner = locate(placement.x - round(width/2), placement.y - round(height/2), placement.z) - if(corner) - placement = corner - return block(placement, locate(placement.x+width-1, placement.y+height-1, placement.z)) - +//This, get_affected_turfs, and load() calculations for bounds/center can probably be optimized. Later. +/datum/map_template/proc/annihilate_bounds(turf/origin, centered = FALSE, orientation = SOUTH) + var/deleted_atoms = 0 + log_world("Annihilating objects in map loading location.") + var/list/turfs_to_clean = get_affected_turfs(origin, centered, orientation) + if(turfs_to_clean.len) + var/list/kill_these = list() + for(var/i in turfs_to_clean) + var/turf/T = i + kill_these += T.contents + for(var/i in kill_these) + qdel(i) + CHECK_TICK + deleted_atoms++ + log_world("Annihilated [deleted_atoms] objects.") //for your ever biggening badminnery kevinz000 //⤠- Cyberboss -/proc/load_new_z_level(var/file, var/name) +/proc/load_new_z_level(file, name, orientation, list/ztraits) var/datum/map_template/template = new(file, name) - template.load_new_z() + return template.load_new_z(orientation, ztraits) + +/datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE, orientation = SOUTH) + var/turf/placement = T + if(centered) + var/turf/corner = locate(placement.x - round(((orientation & (NORTH|SOUTH))? width : height) / 2), placement.y - round(((orientation & (NORTH|SOUTH))? height : width) / 2), placement.z) // %180 catches East/West (90,270) rotations on true, North/South (0,180) rotations on false + if(corner) + placement = corner + return block(placement, locate(placement.x + ((orientation & (NORTH|SOUTH)) ? width : height) - 1, placement.y + ((orientation & (NORTH|SOUTH))? height : width) - 1, placement.z)) diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm index 78a835cffa..69a75148dd 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -12,7 +12,6 @@ /obj/effect/mapping_helpers/network_builder/Initialize(mapload) . = ..() - to_chat(world, "DEBUG: Initializing [COORD(src)]") var/conflict = check_duplicates() if(conflict) stack_trace("WARNING: [type] network building helper found check_duplicates() conflict [conflict] in its location.!") @@ -27,7 +26,6 @@ /// How this works: On LateInitialize, detect all directions that this should be applicable to, and do what it needs to do, and then inform all network builders in said directions that it's been around since it won't be around afterwards. /obj/effect/mapping_helpers/network_builder/LateInitialize() - to_chat(world, "DEBUG: LateInitializing [COORD(src)]") scan_directions() build_network() if(!custom_spawned) diff --git a/code/modules/mapping/minimaps.dm b/code/modules/mapping/minimaps.dm index 29a9fca9b7..7a62e9ab44 100644 --- a/code/modules/mapping/minimaps.dm +++ b/code/modules/mapping/minimaps.dm @@ -1,21 +1,27 @@ /datum/minimap - var/name + var/name = "minimap" + var/icon/overlay_icon + // The map icons var/icon/map_icon var/icon/meta_icon - var/icon/overlay_icon + var/list/color_area_names = list() + var/minx var/maxx var/miny var/maxy - var/z_level - var/id = 0 - var/static/next_id = 0 -/datum/minimap/New(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy, name) + var/z_level + var/id = "" + +/datum/minimap/New(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy, name = "minimap") + if(!z) + CRASH("ERROR: new minimap requested without z level") //CRASH to halt the operatio + src.name = name - id = ++next_id z_level = z + id = "[md5("[z_level]" + src.name + REF(src))]" //use it's own md5 as a special identifier var/crop_x1 = x2 var/crop_x2 = x1 @@ -25,10 +31,11 @@ // do the generating map_icon = new('html/blank.png') meta_icon = new('html/blank.png') - map_icon.Scale(x2-x1+1, y2-y1+1) // arrays start at 1 - meta_icon.Scale(x2-x1+1, y2-y1+1) + map_icon.Scale(x2 - x1 + 1, y2 - y1 + 1) // arrays start at 1 + meta_icon.Scale(x2 - x1 + 1, y2 - y1 + 1) + var/list/area_to_color = list() - for(var/turf/T in block(locate(x1,y1,z),locate(x2,y2,z))) + for(var/turf/T in block(locate(x1, y1, z_level), locate(x2, y2, z_level))) var/area/A = T.loc var/img_x = T.x - x1 + 1 // arrays start at 1 var/img_y = T.y - y1 + 1 @@ -37,21 +44,26 @@ crop_x2 = max(crop_x2, T.x) crop_y1 = min(crop_y1, T.y) crop_y2 = max(crop_y2, T.y) + var/meta_color = area_to_color[A] if(!meta_color) - meta_color = rgb(rand(0,255),rand(0,255),rand(0,255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens + meta_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens area_to_color[A] = meta_color color_area_names[meta_color] = A.name meta_icon.DrawBox(meta_color, img_x, img_y) + if(istype(T, /turf/closed/wall)) map_icon.DrawBox("#000000", img_x, img_y) + else if(!istype(A, /area/space)) var/color = A.minimap_color || "#FF00FF" if(locate(/obj/machinery/power/solar) in T) color = "#02026a" + if((locate(/obj/effect/spawner/structure/window) in T) || (locate(/obj/structure/grille) in T)) color = BlendRGB(color, "#000000", 0.5) map_icon.DrawBox(color, img_x, img_y) + map_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2) meta_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2) minx = crop_x1 @@ -60,14 +72,17 @@ maxy = crop_y2 overlay_icon = new(map_icon) overlay_icon.Scale(16, 16) - -/datum/minimap/proc/send(mob/user) + //we're done baking, now we ship it. register_asset("minimap-[id].png", map_icon) register_asset("minimap-[id]-meta.png", meta_icon) - send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon), verify=FALSE) + +/datum/minimap/proc/send(mob/user) + if(!id) + CRASH("ERROR: send called, but the minimap id is null/missing. ID: [id]") + send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon)) /datum/minimap_group - var/list/minimaps + var/list/minimaps = list() var/static/next_id = 0 var/id var/name @@ -75,46 +90,62 @@ /datum/minimap_group/New(list/maps, name) id = ++next_id src.name = name - minimaps = maps || list() + if(maps) + minimaps = maps /datum/minimap_group/proc/show(mob/user) if(!length(minimaps)) to_chat(user, "ERROR: Attempted to access an empty datum/minimap_group. This should probably not happen.") return + var/list/datas = list() var/list/info = list() - var/datum/minimap/first_map = minimaps[1] - for(var/i in 1 to length(minimaps)) + + for(var/i in 1 to length(minimaps))// OLD: for(var/i in 1 to length(minimaps)) var/datum/minimap/M = minimaps[i] M.send(user) - info += "
    " + info += {" +
    +
    + + +
    +
    +
    + "} datas += json_encode(M.color_area_names); - info = info.Join() - var/html = {" - - - - - - - -[name] - -[info] -"} + + + "} - user << browse(html, "window=minimap_[id];size=768x[round(768 / first_map.map_icon.Width() * first_map.map_icon.Height() + 50)]") + var/datum/browser/popup = new(user, "minimap_[id]", name, 500, 700) + popup.add_head_content(headerJS) //set the head + popup.set_content(info) + var/datum/minimap/MICO = minimaps[1] + popup.set_title_image(MICO.overlay_icon) + popup.open(FALSE) diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm index 4b61663f66..16adb43113 100644 --- a/code/modules/mapping/preloader.dm +++ b/code/modules/mapping/preloader.dm @@ -7,13 +7,21 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) parent_type = /datum var/list/attributes var/target_path + var/turn_angle + var/swap_x + var/swap_y + var/swap_xy -/world/proc/preloader_setup(list/the_attributes, path) - if(the_attributes.len) +/world/proc/preloader_setup(list/the_attributes, path, turn_angle, swap_x, swap_y, swap_xy) + if(length(the_attributes) || turn_angle) GLOB.use_preloader = TRUE var/datum/map_preloader/preloader_local = GLOB._preloader preloader_local.attributes = the_attributes preloader_local.target_path = path + preloader_local.turn_angle = turn_angle + preloader_local.swap_x = swap_x + preloader_local.swap_y = swap_y + preloader_local.swap_xy = swap_xy /world/proc/preloader_load(atom/what) GLOB.use_preloader = FALSE @@ -29,6 +37,21 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) GLOB.dirty_vars += message #endif what.vars[attribute] = value + // handle post processing, so things like directions on subtypes don't break. + if(preloader_local.turn_angle) //safe way to check for if this is necessary + what.dir = turn(what.dir, preloader_local.turn_angle) + var/px = what.pixel_x + var/py = what.pixel_y + if(preloader_local.swap_y) //same order of operations as the load rotation, mirror and then x/y swapping. + py = -py + if(preloader_local.swap_x) + px = -px + if(preloader_local.swap_xy) + var/opx = px + px = py + py = opx + what.pixel_x = px + what.pixel_y = py /area/template_noop name = "Area Passthrough" diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 86b501c455..a792ee280f 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -1,6 +1,12 @@ /////////////////////////////////////////////////////////////// //SS13 Optimized Map loader ////////////////////////////////////////////////////////////// +/* + * Notes: + * This does NOT support map files where more than one Z is in each grid set, as defined in the file. + * MultiZ map files ARE supported (however very much discouraged), as long as each gridset only contains one z. + * This assumes that for the most part, map files are properly formed, either DMM or TGM standard formats. If you feed it bad data, expect to crash. + */ #define SPACE_KEY "space" /datum/grid_set @@ -9,6 +15,12 @@ var/zcrd var/gridLines +/datum/grid_set/proc/height(key_len) + return length(gridLines) + +/datum/grid_set/proc/width(key_len) + return gridLines[1] / key_len + /datum/parsed_map var/original_path var/key_len = 0 @@ -19,9 +31,13 @@ /// Unoffset bounds. Null on parse failure. var/list/parsed_bounds + var/width + var/height /// Offset bounds. Same as parsed_bounds until load(). var/list/bounds + var/datum/map_template/template_host + // raw strings used to represent regexes more accurately // '' used to avoid confusing syntax highlighting var/static/regex/dmmRegex = new(@'"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}', "g") @@ -39,24 +55,58 @@ /// - `cropMap`: When true, the map will be cropped to fit the existing world dimensions (Optional). /// - `measureOnly`: When true, no changes will be made to the world (Optional). /// - `no_changeturf`: When true, [turf/AfterChange] won't be called on loaded turfs -/// - `x_lower`, `x_upper`, `y_lower`, `y_upper`: Coordinates (relative to the map) to crop to (Optional). +/// - `x_lower`, `x_upper`, `y_lower`, `y_upper`: Coordinates (relative to the game world) to crop to (Optional). /// - `placeOnTop`: Whether to use [turf/PlaceOnTop] rather than [turf/ChangeTurf] (Optional). -/proc/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, x_lower = -INFINITY as num, x_upper = INFINITY as num, y_lower = -INFINITY as num, y_upper = INFINITY as num, placeOnTop = FALSE as num) - var/datum/parsed_map/parsed = new(dmm_file, x_lower, x_upper, y_lower, y_upper, measureOnly) +/proc/load_map( + dmm_file as file, + x_offset as num, + y_offset as num, + z_offset as num, + cropMap as num, + measureOnly as num, + no_changeturf as num, + x_lower = -INFINITY as num, + x_upper = INFINITY as num, + y_lower = -INFINITY as num, + y_upper = INFINITY as num, + placeOnTop = FALSE as num, + orientation = SOUTH as num, + annihilate_tiles = FALSE, + crop_relative_to_game_world = TRUE + ) + var/datum/parsed_map/parsed = new(dmm_file, measureOnly = measureOnly) if(parsed.bounds && !measureOnly) - parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) + parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, orientation, annihilate_tiles) return parsed -/// Parse a map, possibly cropping it. -/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE) +/** + * Parse a map, possibly cropping it. + * Do not use the crop function unless strictly necessary. + * WARNING: Crop function crops based on the tiles you'd see in the map editor. If you're planning to load it in in a different orientation later, you better have done the math. + * It's recommended that you do not crop using this at all. + */ +/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, z_lower = -INFINITY, z_upper = INFINITY, measureOnly = FALSE) + _parse(tfile, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, measureOnly) + +/datum/parsed_map/proc/_parse(tfile, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, measureOnly) + var/static/parsing = FALSE + UNTIL(!parsing) + // do not multithread this or bad things happen + parsing = TRUE + _do_parse(tfile, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, measureOnly) + parsing = FALSE + +/datum/parsed_map/proc/_do_parse(tfile, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, measureOnly) if(isfile(tfile)) original_path = "[tfile]" tfile = file2text(tfile) else if(isnull(tfile)) // create a new datum without loading a map return - bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) + ASSERT(x_upper >= x_lower) + ASSERT(y_upper >= y_lower) + ASSERT(z_upper >= z_lower) var/stored_index = 1 //multiz lool @@ -81,21 +131,19 @@ if(!key_len) CRASH("Coords before model definition in DMM") - var/curr_x = text2num(dmmRegex.group[3]) - - if(curr_x < x_lower || curr_x > x_upper) + // NOTE: We are assuming each coordset only contains one z. + var/curr_z = text2num(dmmRegex.group[5]) + if(curr_z < z_lower || curr_z > z_upper) continue + + var/curr_x = text2num(dmmRegex.group[3]) + var/curr_y = text2num(dmmRegex.group[4]) var/datum/grid_set/gridSet = new gridSet.xcrd = curr_x - //position of the currently processed square - gridSet.ycrd = text2num(dmmRegex.group[4]) - gridSet.zcrd = text2num(dmmRegex.group[5]) - - bounds[MAP_MINX] = min(bounds[MAP_MINX], CLAMP(gridSet.xcrd, x_lower, x_upper)) - bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd) - bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd) + gridSet.ycrd = curr_y + gridSet.zcrd = curr_z var/list/gridLines = splittext(dmmRegex.group[6], "\n") gridSet.gridLines = gridLines @@ -105,102 +153,142 @@ if(leadingBlanks > 1) gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines. - if(!gridLines.len) // Skip it if only blank lines exist. + var/lines = length(gridLines) + if(lines && gridLines[lines] == "") + // remove one trailing blank line + gridLines.len-- + lines-- + // y crop + var/right_length = y_upper - curr_y + 1 + if(lines > right_length) + lines = gridLines.len = right_length + if(!lines) // blank continue + var/width = length(gridLines[1]) / key_len + // x crop + var/right_width = x_upper - curr_x + 1 + if(width > right_width) + for(var/i in 1 to lines) + gridLines[i] = copytext(gridLines[i], 1, key_len * right_width) + + // during the actual load we're starting at the top and working our way down + gridSet.ycrd += lines - 1 + + // Safe to proceed, commit gridset to list and record coords. gridSets += gridSet - - if(gridLines.len && gridLines[gridLines.len] == "") - gridLines.Cut(gridLines.len) // Remove only one blank line at the end. - - bounds[MAP_MINY] = min(bounds[MAP_MINY], CLAMP(gridSet.ycrd, y_lower, y_upper)) - gridSet.ycrd += gridLines.len - 1 // Start at the top and work down - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], CLAMP(gridSet.ycrd, y_lower, y_upper)) - - var/maxx = gridSet.xcrd - if(gridLines.len) //Not an empty map - maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1) - - bounds[MAP_MAXX] = CLAMP(max(bounds[MAP_MAXX], maxx), x_lower, x_upper) + bounds[MAP_MINX] = min(bounds[MAP_MINX], curr_x) + bounds[MAP_MAXX] = max(bounds[MAP_MAXX], curr_x + width - 1) + bounds[MAP_MINY] = min(bounds[MAP_MINY], curr_y) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], curr_y + lines - 1) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], curr_z) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], curr_z) CHECK_TICK // Indicate failure to parse any coordinates by nulling bounds if(bounds[1] == 1.#INF) bounds = null + else + width = bounds[MAP_MAXX] - bounds[MAP_MINX] + 1 + height = bounds[MAP_MAXY] - bounds[MAP_MINY] + 1 parsed_bounds = bounds +/datum/parsed_map/Destroy() + if(template_host && template_host.cached_map == src) + template_host.cached_map = null + . = ..() + return QDEL_HINT_HARDDEL_NOW + /// Load the parsed map into the world. See [/proc/load_map] for arguments. -/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) +/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, orientation, annihilate_tiles, datum/map_orientation_pattern/forced_pattern) //How I wish for RAII Master.StartLoadingMap() - . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) + . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, orientation, annihilate_tiles, forced_pattern) Master.StopLoadingMap() // Do not call except via load() above. -/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE) +// Lower/upper here refers to the actual map template's parsed coordinates, NOT ACTUAL COORDINATES! Figure it out yourself my head hurts too much to implement that too. +/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE, orientation = SOUTH, annihilate_tiles = FALSE, datum/map_orientation_pattern/forced_pattern) var/list/areaCache = list() var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] var/list/bounds src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) + var/datum/map_orientation_pattern/mode = forced_pattern || GLOB.map_orientation_patterns["[orientation]"] || GLOB.map_orientation_patterns["[SOUTH]"] + var/invert_y = mode.invert_y + var/invert_x = mode.invert_x + var/swap_xy = mode.swap_xy + var/xi = mode.xi + var/yi = mode.yi + var/turn_angle = round(SIMPLIFY_DEGREES(mode.turn_angle), 90) + var/delta_swap = x_offset - y_offset + // less checks later + var/do_crop = x_lower > -INFINITY || x_upper < INFINITY || y_lower > -INFINITY || y_upper < INFINITY - for(var/I in gridSets) - var/datum/grid_set/gset = I - var/ycrd = gset.ycrd + y_offset - 1 - var/zcrd = gset.zcrd + z_offset - 1 - if(!cropMap && ycrd > world.maxy) - world.maxy = ycrd // Expand Y here. X is expanded in the loop below - var/zexpansion = zcrd > world.maxz + for(var/__I in gridSets) + var/datum/grid_set/gridset = __I + var/parsed_z = gridset.zcrd + z_offset - 1 + var/zexpansion = parsed_z > world.maxz if(zexpansion) if(cropMap) continue else - while (zcrd > world.maxz) //create a new z_level if needed + while(parsed_z > world.maxz) world.incrementMaxZ() if(!no_changeturf) WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called") + //these values are the same until a new gridset is reached. + var/edge_dist_x = gridset.xcrd - 1 //from left side, 0 is right on the x_offset + var/edge_dist_y = gridset.ycrd - length(gridset.gridLines) //from bottom, 0 is right on the y_offset + var/actual_x_starting = invert_x? (x_offset + width - edge_dist_x - 1) : (x_offset + edge_dist_x) //this value is not changed, cache. + //this value is changed + var/actual_y = invert_y? (y_offset + edge_dist_y) : (y_offset + gridset.ycrd - 1) + for(var/line in gridset.gridLines) + var/actual_x = actual_x_starting + for(var/pos = 1 to (length(line) - key_len + 1) step key_len) + var/placement_x = swap_xy? (actual_y + delta_swap) : actual_x + var/placement_y = swap_xy? (actual_x - delta_swap) : actual_y + if(do_crop && ((placement_x < x_lower) || (placement_x > x_upper) || (placement_y < y_lower) || (placement_y > y_upper))) + continue + if(placement_x > world.maxx) + if(cropMap) + actual_x += xi + continue + else + world.maxx = placement_x + if(placement_y > world.maxy) + if(cropMap) + break + else + world.maxy = placement_y + if(placement_x < 1) + actual_x += xi + continue + if(placement_y < 1) + break + var/model_key = copytext(line, pos, pos + key_len) + var/no_afterchange = no_changeturf || zexpansion + if(!no_afterchange || (model_key != space_key)) + var/list/cache = modelCache[model_key] + if(!cache) + CRASH("Undefined model key in DMM: [model_key]") + build_coordinate(areaCache, cache, locate(placement_x, placement_y, parsed_z), no_afterchange, placeOnTop, turn_angle, annihilate_tiles, swap_xy, invert_y, invert_x) - for(var/line in gset.gridLines) - if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping. - --ycrd - continue - if(ycrd <= world.maxy && ycrd >= 1) - var/xcrd = gset.xcrd + x_offset - 1 - for(var/tpos = 1 to length(line) - key_len + 1 step key_len) - if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above. - ++xcrd - continue //X cropping. - if(xcrd > world.maxx) - if(cropMap) - break - else - world.maxx = xcrd - - if(xcrd >= 1) - var/model_key = copytext(line, tpos, tpos + key_len) - var/no_afterchange = no_changeturf || zexpansion - if(!no_afterchange || (model_key != space_key)) - var/list/cache = modelCache[model_key] - if(!cache) - CRASH("Undefined model key in DMM: [model_key]") - build_coordinate(areaCache, cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop) - - // only bother with bounds that actually exist - bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrd) - bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd) - bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) - bounds[MAP_MAXX] = max(bounds[MAP_MAXX], xcrd) - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd) - bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) - #ifdef TESTING - else - ++turfsSkipped - #endif - CHECK_TICK - ++xcrd - --ycrd - - CHECK_TICK + // only bother with bounds that actually exist + bounds[MAP_MINX] = min(bounds[MAP_MINX], placement_x) + bounds[MAP_MINY] = min(bounds[MAP_MINY], placement_y) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], parsed_z) + bounds[MAP_MAXX] = max(bounds[MAP_MAXX], placement_x) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], placement_y) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], parsed_z) + #ifdef TESTING + else + ++turfsSkipped + #endif + actual_x += xi + CHECK_TICK + actual_y += yi + CHECK_TICK if(!no_changeturf) for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))) @@ -294,7 +382,7 @@ .[model_key] = list(members, members_attributes) -/datum/parsed_map/proc/build_coordinate(list/areaCache, list/model, turf/crds, no_changeturf as num, placeOnTop as num) +/datum/parsed_map/proc/build_coordinate(list/areaCache, list/model, turf/crds, no_changeturf as num, placeOnTop as num, turn_angle as num, annihilate_tiles = FALSE, swap_xy, invert_y, invert_x) var/index var/list/members = model[1] var/list/members_attributes = model[2] @@ -306,6 +394,8 @@ //The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile //first instance the /area and remove it from the members list index = members.len + if(annihilate_tiles && crds) + crds.empty(null) if(members[index] != /area/template_noop) var/atype = members[index] world.preloader_setup(members_attributes[index], atype)//preloader for assigning set variables on atom creation @@ -332,20 +422,20 @@ //instanciate the first /turf var/turf/T if(members[first_turf_index] != /turf/template_noop) - T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],crds,no_changeturf,placeOnTop) + T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],crds,no_changeturf,placeOnTop,turn_angle, swap_xy, invert_y, invert_x) if(T) //if others /turf are presents, simulates the underlays piling effect index = first_turf_index + 1 while(index <= members.len - 1) // Last item is an /area var/underlay = T.appearance - T = instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop)//instance new turf + T = instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop,turn_angle, swap_xy, invert_y, invert_x)//instance new turf T.underlays += underlay index++ //finally instance all remainings objects/mobs for(index in 1 to first_turf_index-1) - instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop) + instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop,turn_angle, swap_xy, invert_y, invert_x) //Restore initialization to the previous value SSatoms.map_loader_stop() @@ -354,8 +444,8 @@ //////////////// //Instance an atom at (x,y,z) and gives it the variables in attributes -/datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop) - world.preloader_setup(attributes, path) +/datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop, turn_angle = 0, swap_xy, invert_y, invert_x) + world.preloader_setup(attributes, path, turn_angle, invert_x, invert_y, swap_xy) if(crds) if(ispath(path, /turf)) @@ -471,6 +561,7 @@ // fallback: string return text -/datum/parsed_map/Destroy() - ..() - return QDEL_HINT_HARDDEL_NOW +/datum/parsed_map/vv_edit_var(var_name, var_value) + if(var_name == NAMEOF(src, dmmRegex) || var_name == NAMEOF(src, trimQuotesRegex) || var_name == NAMEOF(src, trimRegex)) + return FALSE + return ..() diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 34ce6ef35c..193106c294 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -11,9 +11,17 @@ for(var/turf/check in get_affected_turfs(central_turf,1)) var/area/new_area = get_area(check) - if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1) - valid = FALSE + valid = FALSE // set to false before we check + if(check.flags_1 & NO_RUINS_1) break + for(var/type in allowed_areas) + if(istype(new_area, type)) // it's at least one of our types so it's whitelisted + valid = TRUE + break + + if(!valid) + break + if(!valid) continue @@ -51,7 +59,7 @@ new /obj/effect/landmark/ruin(center, src) return center -/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins) if(!z_levels || !z_levels.len) WARNING("No Z levels provided - Not generating ruins") return diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 916fb50844..94f5be65bf 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -75,8 +75,7 @@ new /obj/item/clothing/neck/petcollar(src) if(63 to 64) for(var/i in 1 to rand(4, 7)) - var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/silver, /obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/iron, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - new newcoin(src) + new /obj/effect/spawner/lootdrop/coin(src) if(65 to 66) new /obj/item/clothing/suit/ianshirt(src) new /obj/item/clothing/suit/hooded/ian_costume(src) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index e83ac26153..39f8e296af 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -16,7 +16,6 @@ resistance_flags = FIRE_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC - /obj/item/clothing/head/hooded/explorer name = "explorer hood" desc = "An armoured hood for exploring harsh environments." @@ -24,7 +23,9 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + cold_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + heat_protection = HEAD armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) resistance_flags = FIRE_PROOF @@ -49,7 +50,7 @@ visor_flags_inv = HIDEFACIALHAIR visor_flags_cover = MASKCOVERSMOUTH actions_types = list(/datum/action/item_action/adjust) - armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40) resistance_flags = FIRE_PROOF /obj/item/clothing/mask/gas/explorer/attack_self(mob/user) @@ -117,10 +118,10 @@ glass_overlay.appearance_flags = RESET_COLOR . += glass_overlay -/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, style_flags = NONE) +/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) - var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass") + var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/head.dmi', "hostile_env_glass") M.appearance_flags = RESET_COLOR . += M @@ -138,7 +139,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS hoodtype = /obj/item/clothing/head/hooded/explorer/seva - armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) + armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 35, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS /obj/item/clothing/head/hooded/explorer/seva @@ -147,7 +148,7 @@ icon_state = "seva" item_state = "seva" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 35, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25) resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS /obj/item/clothing/mask/gas/seva diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index b515ebbc13..dcd8e1a4ae 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -417,7 +417,7 @@ marker.icon_state = "chronobolt" marker.damage = bonus_value marker.nodamage = FALSE - marker.speed = 2 + marker.pixels_per_second = TILES_TO_PIXELS(5) deadly_shot = FALSE /obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) @@ -433,19 +433,23 @@ desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher." icon_state = "vortex_talisman" denied_type = /obj/item/crusher_trophy/vortex_talisman + var/vortex_cd /obj/item/crusher_trophy/vortex_talisman/effect_desc() - return "mark detonation to create a barrier you can pass" + return "mark detonation to create a barrier you can pass that lasts for 7.5 seconds, with a cooldown of 9 seconds after creation." /obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) + if(vortex_cd >= world.time) + return var/turf/T = get_turf(user) - new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! + var/obj/effect/temp_visual/hierophant/wall/crusher/W = new (T, user) //a wall only you can pass! var/turf/otherT = get_step(T, turn(user.dir, 90)) if(otherT) new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) otherT = get_step(T, turn(user.dir, -90)) if(otherT) new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + vortex_cd = world.time + W.duration * 1.2 /obj/effect/temp_visual/hierophant/wall/crusher duration = 75 diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index f8b155cb9f..db826fdb49 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -33,7 +33,7 @@ if(malfunctioning) H.faction |= list("lazarus", "[REF(user)]") H.robust_searching = 1 - H.friends += user + H.friends[user]++ H.attack_same = 1 log_game("[key_name(user)] has revived hostile mob [key_name(target)] with a malfunctioning lazarus injector") else diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index ce76ad04fc..50a3dec9dd 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -168,3 +168,17 @@ throwforce = 7 custom_materials = list(/datum/material/iron=50) w_class = WEIGHT_CLASS_SMALL + +/obj/item/shovel/serrated + name = "serrated bone shovel" + desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs." + icon_state = "shovel_bone" + item_state = "shovel_bone" + lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' + force = 15 + throwforce = 12 + w_class = WEIGHT_CLASS_NORMAL + toolspeed = 0.7 + attack_verb = list("slashed", "impaled", "stabbed", "sliced") + sharpness = IS_SHARP diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index ae451ba1a8..439929b9c1 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -26,8 +26,8 @@ slot = "hivecore" force = 0 actions_types = list(/datum/action/item_action/organ_action/use) - var/inert = 0 - var/preserved = 0 + var/inert + var/preserved /obj/item/organ/regenerative_core/Initialize() . = ..() @@ -38,7 +38,9 @@ go_inert() /obj/item/organ/regenerative_core/proc/preserved(implanted = 0) - inert = FALSE + if(inert) + name = initial(name) + inert = FALSE preserved = TRUE update_icon() desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay." @@ -63,46 +65,38 @@ qdel(src) /obj/item/organ/regenerative_core/on_life() - ..() + . = ..() if(owner.health < owner.crit_threshold) ui_action_click() /obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(proximity_flag && ishuman(target)) - var/mob/living/carbon/human/H = target - if(inert) - to_chat(user, "[src] has decayed and can no longer be used to heal.") - return - if(isvamp(user)) - to_chat(user, "[src] breaks down as it fails to heal your unholy self") - return - else - if(H.stat == DEAD) - to_chat(user, "[src] are useless on the dead.") - return - if(H != user) - H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) - else - to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) - qdel(src) - user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. + if(proximity_flag) + apply_healing_core(target, user) + +/obj/item/organ/regenerative_core/proc/apply_healing_core(atom/target, mob/user) + if(!user || !ishuman(target)) + return + var/mob/living/carbon/human/H = target + if(inert) + to_chat(user, "[src] has decayed and can no longer be used to heal.") + return + if(H.stat == DEAD) + to_chat(user, "[src] are useless on the dead.") + return + if(H != user) + H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!") + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) + else + to_chat(user, "You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?") + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) + H.apply_status_effect(STATUS_EFFECT_REGENERATIVE_CORE) + qdel(src) + user.log_message("[user] used [src] to heal [H == user ? "[H.p_them()]self" : H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. /obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target' - if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal - var/mob/living/carbon/human/H = user //Set H to user rather than target - if(inert) //Inert cores are useless - to_chat(user, "[src] has decayed and can no longer be used to heal.") - return - else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself! - to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) - qdel(src) - H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand. + . = ..() + apply_healing_core(user, user) /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index bbab74689c..ab0356aa66 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -270,6 +270,7 @@ desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "ntpod" + buildable_sign = FALSE /obj/structure/sign/mining/survival name = "shelter sign" diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index a95c0e24ed..e611ccf232 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,28) + var/loot = rand(1,29) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -39,7 +39,7 @@ if(11) new /obj/item/ship_in_a_bottle(src) if(12) - new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src) + new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src) if(13) new /obj/item/jacobs_ladder(src) if(14) @@ -67,7 +67,7 @@ new /obj/item/grenade/clusterbuster/inferno(src) if(24) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) - new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) + new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src) if(25) new /obj/item/book/granter/spell/summonitem(src) if(26) @@ -77,6 +77,11 @@ new /obj/item/bedsheet/cult(src) if(28) new /obj/item/clothing/neck/necklace/memento_mori(src) + if(29) + if(prob(50)) + new /obj/item/malf_upgrade + else + new /obj/item/disk/tech_disk/illegal //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -428,7 +433,7 @@ /obj/item/projectile/hook/on_hit(atom/target) . = ..() - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/A = target if(A.anchored) return @@ -487,7 +492,7 @@ setDir(user.dir) user.forceMove(src) - user.notransform = TRUE + user.mob_transforming = TRUE user.status_flags |= GODMODE can_destroy = FALSE @@ -496,7 +501,7 @@ /obj/effect/immortality_talisman/proc/unvanish(mob/user) user.status_flags &= ~GODMODE - user.notransform = FALSE + user.mob_transforming = FALSE user.forceMove(get_turf(src)) user.visible_message("[user] pops back into reality!") @@ -564,7 +569,7 @@ /obj/item/book_of_babel/attack_self(mob/user) to_chat(user, "You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.") - user.grant_all_languages(omnitongue=TRUE) + user.grant_all_languages() new /obj/effect/decal/cleanable/ash(get_turf(user)) qdel(src) @@ -659,6 +664,7 @@ nemesis_factions = list("mining", "boss") var/transform_cooldown var/swiping = FALSE + var/bleed_stacks_per_hit = 3 total_mass = 2.75 total_mass_on = 5 @@ -701,12 +707,11 @@ user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly /obj/item/melee/transforming/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target) - var/datum/status_effect/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED) + var/datum/status_effect/stacking/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED) if(!B) - if(!active) //This isn't in the above if-check so that the else doesn't care about active - target.apply_status_effect(STATUS_EFFECT_SAWBLEED) + target.apply_status_effect(STATUS_EFFECT_SAWBLEED,bleed_stacks_per_hit) else - B.add_bleed(B.bleed_buildup) + B.add_stacks(bleed_stacks_per_hit) /obj/item/melee/transforming/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) if(!active || swiping || !target.density || get_turf(target) == get_turf(user)) @@ -833,13 +838,13 @@ force = 0 var/ghost_counter = ghost_check() - force = CLAMP((ghost_counter * 4), 0, 75) + force = clamp((ghost_counter * 4), 0, 75) user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") - ..() + return ..() -/obj/item/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/melee/ghost_sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) var/ghost_counter = ghost_check() - final_block_chance += CLAMP((ghost_counter * 5), 0, 75) + final_block_chance += clamp((ghost_counter * 5), 0, 75) owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") return ..() diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 2f6e8a9b7c..a7b7a84b27 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -37,16 +37,19 @@ /obj/machinery/mineral/ore_redemption/RefreshParts() var/ore_pickup_rate_temp = 15 var/point_upgrade_temp = 1 - var/ore_multiplier_temp = 1 + var/avg_bin_level = 0 + var/bins = 0 for(var/obj/item/stock_parts/matter_bin/B in component_parts) - ore_multiplier_temp = 0.65 + (0.35 * B.rating) + avg_bin_level = B.rating + bins++ for(var/obj/item/stock_parts/manipulator/M in component_parts) ore_pickup_rate_temp = 15 * M.rating for(var/obj/item/stock_parts/micro_laser/L in component_parts) point_upgrade_temp = 0.65 + (0.35 * L.rating) + avg_bin_level /= bins? bins : 1 + ore_multiplier = STANDARD_PART_LEVEL_ORE_COEFFICIENT(avg_bin_level) ore_pickup_rate = ore_pickup_rate_temp point_upgrade = point_upgrade_temp - ore_multiplier = round(ore_multiplier_temp, 0.01) /obj/machinery/mineral/ore_redemption/examine(mob/user) . = ..() diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index c0356dd1ab..09246abc46 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -116,7 +116,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) var/list/logs = GLOB.silo_access_logs[REF(src)] var/len = LAZYLEN(logs) var/num_pages = 1 + round((len - 1) / 30) - var/page = CLAMP(log_page, 1, num_pages) + var/page = clamp(log_page, 1, num_pages) if(num_pages > 1) for(var/i in 1 to num_pages) if(i == page) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 0182dec254..ed6d9e31db 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -53,6 +53,7 @@ new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 2000), new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), + new /datum/data/mining_equipment("Ice hiking boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), @@ -147,9 +148,14 @@ return ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") + var/items = list( "Survival Capsule and Explorer's Webbing" = image(icon = 'icons/obj/storage.dmi', icon_state = "explorerpack"), + "Resonator Kit" = image(icon = 'icons/obj/mining.dmi', icon_state = "resonator"), + "Minebot Kit" = image(icon = 'icons/mob/aibots.dmi', icon_state = "mining_drone"), + "Extraction and Rescue Kit" = image(icon = 'icons/obj/fulton.dmi', icon_state = "extraction_pack"), + "Crusher Kit" = image(icon = 'icons/obj/mining.dmi', icon_state = "crusher"), + "Mining Conscription Kit" = image(icon = 'icons/obj/storage.dmi', icon_state = "duffel")) - var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items + var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE) if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return var/drop_location = drop_location() @@ -194,7 +200,7 @@ prize_list += list( new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/mining, 250), new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250), - new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300), + new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/cube/monkey, 300), new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350), new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), @@ -320,9 +326,10 @@ new /obj/item/clothing/glasses/meson/prescription(src) /obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer) - var/items = list("Exo-suit", "SEVA suit") + var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"), + "SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva")) - var/selection = input(redeemer, "Pick your suit.", "Suit Voucher Redemption") as null|anything in items + var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE) if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return var/drop_location = drop_location() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c212c22c98..f10229f4bf 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -87,14 +87,6 @@ return . = ..() -/obj/machinery/computer/shuttle/mining/common - name = "lavaland shuttle console" - desc = "Used to call and send the lavaland shuttle." - req_access = list() - circuit = /obj/item/circuitboard/computer/mining_shuttle/common - shuttleId = "mining_common" - possible_destinations = "lavaland_common_away;commonmining_home" - /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 0c8aef51a8..fb37dcbca0 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -24,7 +24,8 @@ environment_smash = ENVIRONMENT_SMASH_NONE check_friendly_fire = TRUE stop_automated_movement_when_pulled = TRUE - attacktext = "drills" + attack_verb_continuous = "drills" + attack_verb_simple = "drill" attack_sound = 'sound/weapons/circsawhit.ogg' sentience_type = SENTIENCE_MINEBOT speak_emote = list("states") diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index d04c0104e5..e89bbef58d 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -87,7 +87,7 @@ if(istype(new_material)) chosen = new_material if(href_list["chooseAmt"]) - coinsToProduce = CLAMP(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) + coinsToProduce = clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) updateUsrDialog() if(href_list["makeCoins"]) var/temp_coins = coinsToProduce diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index fd5997d3c4..66f99ec40c 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -15,7 +15,7 @@ STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_items = 40 STR.max_combined_w_class = 40 - STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash)) + STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) /obj/item/storage/bag/money/vault/PopulateContents() new /obj/item/coin/silver(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index c7c34b0389..f6b7110803 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -70,7 +70,6 @@ singular_name = "uranium ore chunk" points = 30 custom_materials = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT) - material_flags = MATERIAL_NO_EFFECTS refined_type = /obj/item/stack/sheet/mineral/uranium /obj/item/stack/ore/iron @@ -103,7 +102,22 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/glass/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !ishuman(hit_atom)) return - var/mob/living/carbon/human/C = hit_atom + var/mob/living/carbon/human/poorsod = hit_atom + eyesand(poorsod) + +/obj/item/stack/ore/glass/attack(mob/living/M, mob/living/user) + if(!ishuman(M)) + return ..() + if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD) + return ..() + var/mob/living/carbon/human/poorsod = M + visible_message("[user] throws the sand at [poorsod]'s face!") + if(ishuman(user)) + var/mob/living/carbon/human/sayer = user + sayer.forcesay("POCKET SAAND!!") + eyesand(poorsod) + +/obj/item/stack/ore/glass/proc/eyesand(mob/living/carbon/human/C) if(C.head && C.head.flags_cover & HEADCOVERSEYES) visible_message("[C]'s headgear blocks the sand!") return @@ -117,8 +131,10 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ C.adjustStaminaLoss(15)//the pain from your eyes burning does stamina damage C.confused += 5 to_chat(C, "\The [src] gets into your eyes! The pain, it burns!") + C.forcesay("*scream") qdel(src) + /obj/item/stack/ore/glass/ex_act(severity, target) if (severity == EXPLODE_NONE) return @@ -319,7 +335,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ throwforce = 2 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = 400) - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS var/string_attached var/list/sideslist = list("heads","tails") var/cooldown = 0 @@ -341,6 +357,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/datum/material/M = i value += M.value_per_unit * custom_materials[M] +/obj/item/coin/get_item_credit_value() + return value + /obj/item/coin/suicide_act(mob/living/user) user.visible_message("[user] contemplates suicide with \the [src]!") if (!attack_self(user)) @@ -364,12 +383,11 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CC = W if(string_attached) to_chat(user, "There already is a string attached to this coin!") return - if (CC.use(1)) + if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC)) add_overlay("coin_string_overlay") string_attached = 1 to_chat(user, "You attach a string to the coin.") diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 0c50cb0468..bd3a3d304a 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -68,7 +68,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) set category = "OOC" set name = "Server Hop!" set desc= "Jump to the other server" - if(notransform) + if(mob_transforming) return var/list/csa = CONFIG_GET(keyed_list/cross_server) var/pick @@ -93,9 +93,9 @@ INITIALIZE_IMMEDIATE(/mob/dead) to_chat(C, "Sending you to [pick].") new /obj/screen/splash(C) - notransform = TRUE + mob_transforming = TRUE sleep(29) //let the animation play - notransform = FALSE + mob_transforming = FALSE if(!C) return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 35b1a69761..36babd9b95 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -176,9 +176,6 @@ SSticker.queue_delay = 4 qdel(src) - if(!ready && href_list["preference"]) - if(client) - client.prefs.process_link(src, href_list) else if(!href_list["late_join"]) new_player_panel() @@ -392,6 +389,8 @@ character.update_parallax_teleport() + job.standard_assign_skills(character.mind) + SSticker.minds += character.mind var/mob/living/carbon/human/humanc @@ -580,6 +579,12 @@ qdel(src) /mob/dead/new_player/proc/ViewManifest() + if(!client) + return + if(world.time < client.crew_manifest_delay) + return + client.crew_manifest_delay = world.time + (1 SECONDS) + var/dat = "" dat += "

    Crew Manifest

    " dat += GLOB.data_core.get_manifest(OOC = 1) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index a7fdf2d914..9a0d9f9242 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -11,22 +11,17 @@ shirt_color = random_short_color() socks = random_socks() socks_color = random_short_color() + use_custom_skin_tone = FALSE skin_tone = random_skin_tone() hair_style = random_hair_style(gender) facial_hair_style = random_facial_hair_style(gender) hair_color = random_short_color() facial_hair_color = hair_color eye_color = random_eye_color() - horn_color = "85615a" - wing_color = "fff" if(!pref_species) var/rando_race = pick(GLOB.roundstart_races) pref_species = new rando_race() - features = random_features(pref_species?.id) - if(gender == MALE || gender != FEMALE) - features["body_model"] = gender - else if(gender == PLURAL) - features["body_model"] = pick(MALE,FEMALE) + features = random_features(pref_species?.id, gender) age = rand(AGE_MIN,AGE_MAX) /datum/preferences/proc/update_preview_icon(equip_job = TRUE) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index 4365e59a7a..6514cb4f80 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -16,6 +16,7 @@ from doing this unless you absolutely know what you are doing, and have defined a conversion in savefile.dm */ + /proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, roundstart = FALSE, skip_prototype = TRUE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked if(!istype(L)) L = list() @@ -55,19 +56,19 @@ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations var/gender_specific //Something that can be worn by either gender, but looks different on each var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. - var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects var/dimension_x = 32 var/dimension_y = 32 var/center = FALSE //Should we center the sprite? + var/list/relevant_layers //list of layers that this accessory uses. As of now only used in species.handle_mutant_bodyparts(), but that's where most sprite accessories are anyway. + var/mutant_part_string //Also used in species.handle_mutant_bodyparts() to generate the overlay icon state. + var/alpha_mask_state //Special / holdover traits for Citadel specific sprites. var/extra = FALSE var/extra_color_src = MUTCOLORS2 //The color source for the extra overlay. - var/extra_icon = 'modular_citadel/icons/mob/mam_tails.dmi' var/extra2 = FALSE var/extra2_color_src = MUTCOLORS3 - var/extra2_icon = 'modular_citadel/icons/mob/mam_tails.dmi' //for snowflake/donor specific sprites var/list/ckeys_allowed @@ -76,7 +77,7 @@ var/list/recommended_species /datum/sprite_accessory/underwear - icon = 'icons/mob/underwear.dmi' + icon = 'icons/mob/clothing/underwear.dmi' var/has_color = FALSE var/has_digitigrade = FALSE var/covers_groin = FALSE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index 6c0659f851..c8e7aca26d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -4,6 +4,8 @@ *******************************************/ /datum/sprite_accessory/xeno_dorsal icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "xenodorsal" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_dorsal/standard name = "Standard" @@ -22,9 +24,12 @@ *******************************************/ /datum/sprite_accessory/xeno_tail icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "tail" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_tail/none name = "None" + relevant_layers = null /datum/sprite_accessory/xeno_tail/standard name = "Xenomorph Tail" @@ -35,6 +40,8 @@ *******************************************/ /datum/sprite_accessory/xeno_head icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "xhead" + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/xeno_head/standard name = "Standard" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 8f043125b2..9950f0d76a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -4,10 +4,12 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/body_markings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/body_markings/dtiger name = "Dark Tiger Body" @@ -45,6 +47,7 @@ icon_state = "none" ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme") icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + relevant_layers = null /datum/sprite_accessory/mam_body_markings/plain name = "Plain" @@ -219,10 +222,12 @@ /datum/sprite_accessory/insect_fluff icon = 'icons/mob/wings.dmi' color_src = 0 + relevant_layers = list(BODY_FRONT_LAYER) /datum/sprite_accessory/insect_fluff/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_fluff/plain name = "Plain" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm index debb4865ba..822fcf960d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm @@ -1,7 +1,8 @@ datum/sprite_accessory/caps icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HAIR + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/caps/round name = "Round" - icon_state = "round" \ No newline at end of file + icon_state = "round" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index c91bd633a5..bc269ccf62 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -1,9 +1,12 @@ /datum/sprite_accessory/ears icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "ears" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/ears/none name = "None" icon_state = "none" + relevant_layers = null /****************************************** *************** Human Ears **************** @@ -29,9 +32,10 @@ /datum/sprite_accessory/ears/human/bigwolfinner name = "Big Wolf (ALT)" icon_state = "bigwolfinner" - hasinner = 1 icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/ears/human/bigwolfdark name = "Dark Big Wolf" @@ -42,15 +46,17 @@ /datum/sprite_accessory/ears/human/bigwolfinnerdark name = "Dark Big Wolf (ALT)" icon_state = "bigwolfinnerdark" - hasinner = 1 icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" - hasinner = 1 color_src = HAIR + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/ears/human/cow name = "Cow" @@ -172,10 +178,13 @@ /datum/sprite_accessory/mam_ears icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + mutant_part_string = "ears" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/mam_ears/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/mam_ears/axolotl name = "Axolotl" @@ -196,7 +205,8 @@ /datum/sprite_accessory/mam_ears/bigwolfinner name = "Big Wolf (ALT)" icon_state = "bigwolfinner" - hasinner = 1 + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/mam_ears/bigwolfdark name = "Dark Big Wolf" @@ -205,13 +215,16 @@ /datum/sprite_accessory/mam_ears/bigwolfinnerdark name = "Dark Big Wolf (ALT)" icon_state = "bigwolfinnerdark" - hasinner = 1 + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/mam_ears/cat name = "Cat" icon_state = "cat" - hasinner = 1 + icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HAIR + extra = TRUE + extra_color_src = NONE /datum/sprite_accessory/mam_ears/catbig name = "Cat, Big" @@ -309,4 +322,4 @@ /datum/sprite_accessory/mam_ears/bunny name = "Bunny" - icon_state = "bunny" \ No newline at end of file + icon_state = "bunny" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index 93c4af6df0..0aaec309a4 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -1,9 +1,11 @@ /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/frills/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/frills/simple name = "Simple" @@ -15,4 +17,4 @@ /datum/sprite_accessory/frills/aquatic name = "Aquatic" - icon_state = "aqua" \ No newline at end of file + icon_state = "aqua" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index b0ed2000a6..89f2dd5370 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -189,6 +189,26 @@ name = "Coffee House" icon_state = "hair_coffeehouse" +/datum/sprite_accessory/hair/cornrows1 + name = "Cornrows" + icon_state = "hair_cornrows" + +/datum/sprite_accessory/hair/cornrows2 + name = "Cornrows 2" + icon_state = "hair_cornrows2" + +/datum/sprite_accessory/hair/cornrowbun + name = "Cornrow Bun" + icon_state = "hair_cornrowbun" + +/datum/sprite_accessory/hair/cornrowbraid + name = "Cornrow Braid" + icon_state = "hair_cornrowbraid" + +/datum/sprite_accessory/hair/cornrowdualtail + name = "Cornrow Tail" + icon_state = "hair_cornrowtail" + /datum/sprite_accessory/hair/country name = "Country" icon_state = "hair_country" @@ -285,7 +305,7 @@ name = "Flat Top (Big)" icon_state = "hair_bigflattop" -/datum/sprite_accessory/hair/fag //grimacing emoji +/datum/sprite_accessory/hair/flow name = "Flow Hair" icon_state = "hair_f" @@ -777,4 +797,4 @@ /datum/sprite_accessory/hair/ziegler name = "Ziegler" - icon_state = "hair_ziegler" \ No newline at end of file + icon_state = "hair_ziegler" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index a630ead7b3..b39f48f858 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -1,10 +1,12 @@ /datum/sprite_accessory/horns icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HORNCOLOR + relevant_layers = list(HORNS_LAYER) /datum/sprite_accessory/horns/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/horns/simple name = "Simple" @@ -33,4 +35,4 @@ /datum/sprite_accessory/horns/guilmon name = "Guilmon" - icon_state = "guilmon" \ No newline at end of file + icon_state = "guilmon" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index d47607f6fd..110ac69201 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -5,6 +5,7 @@ /datum/sprite_accessory/screen icon = 'modular_citadel/icons/mob/ipc_screens.dmi' color_src = null + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/screen/blank name = "Blank" @@ -132,6 +133,7 @@ /datum/sprite_accessory/antenna icon = 'modular_citadel/icons/mob/ipc_antennas.dmi' color_src = MUTCOLORS2 + relevant_layers = list(BODY_ADJ_LAYER) recommended_species = list("ipc") /datum/sprite_accessory/antenna/none diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm index fe154ffeec..2ec6da2da8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm @@ -21,29 +21,42 @@ /datum/sprite_accessory/taur icon = 'modular_citadel/icons/mob/mam_taur.dmi' - extra_icon = 'modular_citadel/icons/mob/mam_taur.dmi' - extra = TRUE - extra2_icon = 'modular_citadel/icons/mob/mam_taur.dmi' - extra2 = TRUE center = TRUE dimension_x = 64 - var/taur_mode = NONE //Must be a single specific tauric suit variation bitflag. Don't do FLAG_1|FLAG_2 - var/alt_taur_mode = NONE //Same as above. color_src = MATRIXED recommended_species = list("human", "lizard", "insect", "mammal", "xeno", "jelly", "slimeperson", "podweak") + relevant_layers = list(BODY_ADJ_UPPER_LAYER, BODY_FRONT_LAYER) + var/taur_mode = NONE //Must be a single specific tauric suit variation bitflag. Don't do FLAG_1|FLAG_2 + var/alt_taur_mode = NONE //Same as above. + var/hide_legs = USE_QUADRUPED_CLIP_MASK + +/datum/sprite_accessory/taur/New() + switch(hide_legs) + if(USE_QUADRUPED_CLIP_MASK) + alpha_mask_state = "taur_mask_def" + if(USE_SNEK_CLIP_MASK) + alpha_mask_state = "taur_mask_naga" /datum/sprite_accessory/taur/none - dimension_x = 32 - center = FALSE name = "None" icon_state = "None" + dimension_x = 32 + center = FALSE recommended_species = null + relevant_layers = null + hide_legs = FALSE /datum/sprite_accessory/taur/cow name = "Cow" icon_state = "cow" taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + +/datum/sprite_accessory/taur/cow/spotted + name = "Cow (Spotted)" + icon_state = "cow_spotted" + color_src = MATRIXED /datum/sprite_accessory/taur/deer name = "Deer" @@ -51,32 +64,33 @@ taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC color_src = MUTCOLORS + extra = TRUE /datum/sprite_accessory/taur/drake name = "Drake" icon_state = "drake" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE + +/datum/sprite_accessory/taur/drake/old + name = "Drake (Old)" + icon_state = "drake_old" + color_src = MATRIXED + extra = FALSE /datum/sprite_accessory/taur/drider name = "Drider" icon_state = "drider" color_src = MUTCOLORS + extra = TRUE /datum/sprite_accessory/taur/eevee name = "Eevee" icon_state = "eevee" taur_mode = STYLE_PAW_TAURIC color_src = MUTCOLORS - -/datum/sprite_accessory/taur/fox - name = "Fox" - icon_state = "fox" - taur_mode = STYLE_PAW_TAURIC - -/datum/sprite_accessory/taur/husky - name = "Husky" - icon_state = "husky" - taur_mode = STYLE_PAW_TAURIC + extra = TRUE /datum/sprite_accessory/taur/horse name = "Horse" @@ -84,15 +98,11 @@ taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC -/datum/sprite_accessory/taur/lab - name = "Lab" - icon_state = "lab" - taur_mode = STYLE_PAW_TAURIC - /datum/sprite_accessory/taur/naga name = "Naga" icon_state = "naga" taur_mode = STYLE_SNEK_TAURIC + hide_legs = USE_SNEK_CLIP_MASK /datum/sprite_accessory/taur/otie name = "Otie" @@ -104,29 +114,26 @@ icon_state = "pede" taur_mode = STYLE_PAW_TAURIC color_src = MUTCOLORS - -/datum/sprite_accessory/taur/panther - name = "Panther" - icon_state = "panther" - taur_mode = STYLE_PAW_TAURIC - -/datum/sprite_accessory/taur/shepherd - name = "Shepherd" - icon_state = "shepherd" - taur_mode = STYLE_PAW_TAURIC + extra = TRUE + extra2 = TRUE /datum/sprite_accessory/taur/tentacle name = "Tentacle" icon_state = "tentacle" taur_mode = STYLE_SNEK_TAURIC color_src = MUTCOLORS + hide_legs = USE_SNEK_CLIP_MASK -/datum/sprite_accessory/taur/tiger - name = "Tiger" - icon_state = "tiger" +/datum/sprite_accessory/taur/canine + name = "Canine" + icon_state = "canine" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE -/datum/sprite_accessory/taur/wolf - name = "Wolf" - icon_state = "wolf" +/datum/sprite_accessory/taur/feline + name = "Feline" + icon_state = "feline" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index c016e9b119..60e8ed1007 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -1,5 +1,7 @@ /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "snout" + relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/snouts/sharp name = "Sharp" @@ -152,11 +154,14 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' recommended_species = list("mammal", "slimeperson", "insect", "podweak") + mutant_part_string = "snout" + relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/mam_snouts/none name = "None" icon_state = "none" recommended_species = null + relevant_layers = null /datum/sprite_accessory/mam_snouts/bird name = "Beak" @@ -383,4 +388,4 @@ /datum/sprite_accessory/mam_snouts/froundlight name = "Round + Light (Top)" icon_state = "froundlight" - color_src = MUTCOLORS \ No newline at end of file + color_src = MUTCOLORS diff --git a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm similarity index 87% rename from code/modules/mob/dead/new_player/sprite_accessories/pines.dm rename to code/modules/mob/dead/new_player/sprite_accessories/spines.dm index 4ccbc3d9ea..54749d5ea9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -1,12 +1,15 @@ /datum/sprite_accessory/spines icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) /datum/sprite_accessory/spines_animated icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) /datum/sprite_accessory/spines/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/spines_animated/none name = "None" @@ -50,4 +53,4 @@ /datum/sprite_accessory/spines_animated/aqautic name = "Aquatic" - icon_state = "aqua" \ No newline at end of file + icon_state = "aqua" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 90980743e1..33dbd7059f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -1,8 +1,12 @@ /datum/sprite_accessory/tails icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "tail" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "tailwag" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /****************************************** ************* Lizard Tails **************** @@ -43,10 +47,12 @@ /datum/sprite_accessory/tails/lizard/none name = "None" icon_state = "None" + relevant_layers = null /datum/sprite_accessory/tails_animated/lizard/none name = "None" icon_state = "None" + relevant_layers = null /datum/sprite_accessory/tails/lizard/axolotl name = "Axolotl" @@ -85,10 +91,12 @@ /datum/sprite_accessory/tails/human/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/tails_animated/human/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/tails/human/ailurus name = "Red Panda" @@ -442,6 +450,18 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/tails/human/tamamo_kitsune + name = "Tamamo Kitsune Tails" //Tamamo-no-Tiro, let it be known! + icon_state = "9sune" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + +/datum/sprite_accessory/tails_animated/human/tamamo_kitsune + name = "Tamamo Kitsune Tails" + icon_state = "9sune" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + /datum/sprite_accessory/tails/human/tentacle name = "Tentacle" icon_state = "tentacle" @@ -502,20 +522,25 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect") + mutant_part_string = "tail" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/mam_tails/none name = "None" icon_state = "none" recommended_species = null + relevant_layers = null /datum/sprite_accessory/mam_tails_animated color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + mutant_part_string = "tailwag" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/mam_tails_animated/none name = "None" icon_state = "none" - color_src = MATRIXED + relevant_layers = null /datum/sprite_accessory/mam_tails/ailurus name = "Red Panda" @@ -576,7 +601,7 @@ /datum/sprite_accessory/mam_tails_animated/catbig name = "Cat, Big" icon_state = "catbig" - + /datum/sprite_accessory/mam_tails/twocat name = "Cat, Double" icon_state = "twocat" @@ -803,6 +828,14 @@ datum/sprite_accessory/mam_tails/insect name = "Squirrel" icon_state = "squirrel" +/datum/sprite_accessory/mam_tails/tamamo_kitsune + name = "Tamamo Kitsune Tails" + icon_state = "9sune" + +/datum/sprite_accessory/mam_tails_animated/tamamo_kitsune + name = "Tamamo Kitsune Tails" + icon_state = "9sune" + /datum/sprite_accessory/mam_tails/tentacle name = "Tentacle" icon_state = "tentacle" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index 9c1eb6a3fa..34767a10f1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -3,9 +3,11 @@ /datum/sprite_accessory/wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/wings_open icon = 'icons/mob/wings.dmi' + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/wings_open/angel name = "Angel" @@ -17,6 +19,7 @@ /datum/sprite_accessory/wings icon = 'icons/mob/wings.dmi' + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/wings/angel name = "Angel" @@ -32,10 +35,13 @@ /datum/sprite_accessory/deco_wings icon = 'icons/mob/wings.dmi' color_src = WINGCOLOR + mutant_part_string = "insect_wings" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/deco_wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/deco_wings/angel name = "Angel" @@ -44,6 +50,7 @@ dimension_x = 46 center = TRUE dimension_y = 34 + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/deco_wings/bat name = "Bat" @@ -130,10 +137,12 @@ /datum/sprite_accessory/insect_wings icon = 'icons/mob/wings.dmi' color_src = WINGCOLOR + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/insect_wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_wings/bat name = "Bat" @@ -231,10 +240,12 @@ /datum/sprite_accessory/insect_markings // Extra markings for insects ported from tg. icon = 'icons/mob/insect_markings.dmi' color_src = null + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/insect_markings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_markings/reddish name = "Reddish" @@ -290,4 +301,4 @@ /datum/sprite_accessory/insect_markings/witchwing name = "Witch Wing" - icon_state = "witchwing" \ No newline at end of file + icon_state = "witchwing" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3023b93856..397af1b9d0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -276,7 +276,23 @@ Works together with spawning an observer, noted above. if (!(client.prefs.chat_toggles & CHAT_OOC)) client.prefs.chat_toggles ^= CHAT_OOC transfer_ckey(ghost, FALSE) - ghost.AddElement(/datum/element/ghost_role_eligibility,penalize) // technically already run earlier, but this adds the penalty + if(penalize) + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. + penalty += roundstart_quit_limit - world.time + if(penalty) + penalty += world.realtime + if(SSautotransfer.can_fire && SSautotransfer.maxvotes) + var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes + if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND + if(!(ghost.ckey in GLOB.client_ghost_timeouts)) + GLOB.client_ghost_timeouts += ghost.ckey + GLOB.client_ghost_timeouts[ghost.ckey] = 0 + else if(GLOB.client_ghost_timeouts[ghost.ckey] == CANT_REENTER_ROUND) + return + GLOB.client_ghost_timeouts[ghost.ckey] = max(GLOB.client_ghost_timeouts[ghost.ckey],penalty) // needs to be done AFTER the ckey transfer, too return ghost @@ -554,7 +570,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp views |= i var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views if(new_view) - client.change_view(CLAMP(new_view, 7, max_view)) + client.change_view(clamp(new_view, 7, max_view)) else client.change_view(CONFIG_GET(string/default_view)) @@ -691,7 +707,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //this is a mob verb instead of atom for performance reasons //see /mob/verb/examinate() in mob.dm for more info //overridden here and in /mob/living for different point span classes and sanity checks -/mob/dead/observer/pointed(atom/A as mob|obj|turf in view()) +/mob/dead/observer/pointed(atom/A as mob|obj|turf in fov_view()) if(!..()) return 0 usr.visible_message("[src] points to [A].") @@ -701,6 +717,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "View Crew Manifest" set category = "Ghost" + if(!client) + return + if(world.time < client.crew_manifest_delay) + return + client.crew_manifest_delay = world.time + (1 SECONDS) + var/dat dat += "

    Crew Manifest

    " dat += GLOB.data_core.get_manifest() @@ -921,3 +943,20 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp spawners_menu = new(src) spawners_menu.ui_interact(src) + +/mob/dead/observer/verb/game_info() + set name = "Game info" + set desc = "Shows various info relating to the game mode, antagonists etc." + set category = "Ghost" + if(!started_as_observer && can_reenter_corpse) + to_chat(src, "You cannot see this info unless you are an observer or you've chosen Do Not Resuscitate!") + return + var/list/stuff = list("[SSticker.mode.name]") + stuff += "Antagonists:\n" + for(var/datum/antagonist/A in GLOB.antagonists) + if(A.owner) + stuff += "[A.owner] the [A.name]" + var/ghost_info = SSticker.mode.ghost_info() + if(ghost_info) + stuff += ghost_info + to_chat(src,stuff.Join("\n")) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 8712f39531..c5c7350b47 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -33,6 +33,9 @@ else to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) + // Create map text prior to modifying message for goonchat + if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker))) + create_chat_message(speaker, message_language, raw_message, spans, message_mode) // Recompose the message, because it's scrambled by default message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 9f7d2067de..74775203b1 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -333,7 +333,9 @@ I.moveToNullspace() else I.forceMove(newloc) - I.dropped(src) + on_item_dropped(I) + if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED) + return FALSE return TRUE //Outdated but still in use apparently. This should at least be a human proc. diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 41f2c7142f..612358e802 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -59,7 +59,7 @@ nutrition_ratio *= 1.2 if(satiety > 80) nutrition_ratio *= 1.25 - nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR) + adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss @@ -94,7 +94,9 @@ //We want an accurate reading of .len listclearnulls(BP.embedded_objects) - temp_bleed += 0.5 * BP.embedded_objects.len + for(var/obj/item/embeddies in BP.embedded_objects) + if(!embeddies.isEmbedHarmless()) + temp_bleed += 0.5 if(brutedamage >= 20) temp_bleed += (brutedamage * 0.013) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index e8a9b50e98..d3dbfac8c8 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -37,10 +37,10 @@ C.put_in_hands(B1) C.put_in_hands(B2) C.regenerate_icons() - src.notransform = TRUE + src.mob_transforming = TRUE spawn(0) bloodpool_sink(B) - src.notransform = FALSE + src.mob_transforming = FALSE return 1 /mob/living/proc/bloodpool_sink(obj/effect/decal/cleanable/B) @@ -155,7 +155,7 @@ addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS) /mob/living/proc/phasein(obj/effect/decal/cleanable/B) - if(src.notransform) + if(src.mob_transforming) to_chat(src, "Finish eating first!") return 0 B.visible_message("[B] starts to bubble...") @@ -164,7 +164,7 @@ if(!B) return forceMove(B.loc) - src.client.eye = src + reset_perspective(src) src.visible_message("[src] rises out of the pool of blood!") exit_blood_effect(B) if(iscarbon(src)) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 4bca3e7f62..08d415fc3c 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -4,6 +4,7 @@ var/emp_damage = 0//Handles a type of MMI damage var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE. stat = DEAD //we start dead by default + has_field_of_vision = FALSE //Not really worth it. see_invisible = SEE_INVISIBLE_LIVING possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas speech_span = SPAN_ROBOT diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index f32d84ae73..687442c1f8 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -51,6 +51,12 @@ var/datum/brain_trauma/BT = X BT.owner = owner BT.on_gain() + if(damage > BRAIN_DAMAGE_MILD) + var/datum/skill_modifier/S + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/brain_damage, null, C, S) + if(damage > BRAIN_DAMAGE_SEVERE) + var/datum/skill_modifier/S + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, C, S) //Update the body's icon so it doesnt appear debrained anymore C.update_hair() @@ -66,6 +72,8 @@ if((!QDELETED(src) || C) && !no_id_transfer) transfer_identity(C) if(C) + REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/brain_damage, null, C) + REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, C) C.update_hair() /obj/item/organ/brain/prepare_eat() @@ -129,11 +137,11 @@ if(cached_Bdamage <= HEALTH_THRESHOLD_DEAD) //Fixing dead brains yeilds a trauma if((cached_Bdamage <= HEALTH_THRESHOLD_DEAD) && (brainmob.health > HEALTH_THRESHOLD_DEAD)) if(prob(80)) - gain_trauma_type(BRAIN_TRAUMA_MILD) + gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) else if(prob(50)) - gain_trauma_type(BRAIN_TRAUMA_SEVERE) + gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) else - gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL, natural_gain = TRUE) return if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent(/datum/reagent/medicine/mannitol)) //attempt to heal the brain @@ -219,66 +227,45 @@ Insert(C) else ..() -/* TO BE REMOVED, KEPT IN CASE OF BUGS -/obj/item/organ/brain/proc/get_brain_damage() - var/brain_damage_threshold = max_integrity * BRAIN_DAMAGE_INTEGRITY_MULTIPLIER - var/offset_integrity = obj_integrity - (max_integrity - brain_damage_threshold) - . = round((1 - (offset_integrity / brain_damage_threshold)) * BRAIN_DAMAGE_DEATH, DAMAGE_PRECISION) - -/obj/item/organ/brain/proc/adjust_brain_damage(amount, maximum) - var/adjusted_amount - if(amount >= 0 && maximum) - var/brainloss = get_brain_damage() - var/new_brainloss = CLAMP(brainloss + amount, 0, maximum) - if(brainloss > new_brainloss) //brainloss is over the cap already - return 0 - adjusted_amount = new_brainloss - brainloss - else - adjusted_amount = amount - - adjusted_amount = round(adjusted_amount * BRAIN_DAMAGE_INTEGRITY_MULTIPLIER, DAMAGE_PRECISION) - if(adjusted_amount) - if(adjusted_amount >= DAMAGE_PRECISION) - take_damage(adjusted_amount) - else if(adjusted_amount <= -DAMAGE_PRECISION) - obj_integrity = min(max_integrity, obj_integrity-adjusted_amount) - . = adjusted_amount -*/ - -/obj/item/organ/brain/on_life() - if(damage >= BRAIN_DAMAGE_DEATH) //rip - to_chat(owner, "The last spark of life in your brain fizzles out...") - owner.death() - brain_death = TRUE - return - ..() - -/obj/item/organ/brain/on_death() - if(damage <= BRAIN_DAMAGE_DEATH) //rip - brain_death = FALSE - ..() - /obj/item/organ/brain/applyOrganDamage(var/d, var/maximum = maxHealth) - ..() - + . = ..() + if(!. || !owner) + return + if(damage >= BRAIN_DAMAGE_DEATH) //rip + if(owner.stat != DEAD) + to_chat(owner, "The last spark of life in your brain fizzles out...") + owner.death() + brain_death = TRUE + else + brain_death = FALSE /obj/item/organ/brain/check_damage_thresholds(mob/M) . = ..() //if we're not more injured than before, return without gambling for a trauma if(damage <= prev_damage) + if(damage < prev_damage && owner) + if(prev_damage > BRAIN_DAMAGE_MILD && damage <= BRAIN_DAMAGE_MILD) + REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/brain_damage, null, owner) + if(prev_damage > BRAIN_DAMAGE_SEVERE && damage <= BRAIN_DAMAGE_SEVERE) + REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, owner) return damage_delta = damage - prev_damage if(damage > BRAIN_DAMAGE_MILD) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit - gain_trauma_type(BRAIN_TRAUMA_MILD) + gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) + if(prev_damage <= BRAIN_DAMAGE_MILD && owner) + var/datum/skill_modifier/S + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/brain_damage, null, owner, S) if(damage > BRAIN_DAMAGE_SEVERE) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% if(prob(20)) - gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL, natural_gain = TRUE) else - gain_trauma_type(BRAIN_TRAUMA_SEVERE) - + gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) + if(prev_damage <= BRAIN_DAMAGE_SEVERE && owner) + var/datum/skill_modifier/S + ADD_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, owner, S) if (owner) if(owner.stat < UNCONSCIOUS) //conscious or soft-crit var/brain_message @@ -321,7 +308,7 @@ if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience)) . += BT -/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience) +/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) @@ -354,7 +341,7 @@ if(TRAUMA_RESILIENCE_ABSOLUTE) max_traumas = TRAUMA_LIMIT_ABSOLUTE - if(resilience_tier_count >= max_traumas) + if(natural_gain && resilience_tier_count >= max_traumas) return FALSE return TRUE @@ -394,11 +381,11 @@ return actual_trauma //Add a random trauma of a certain subtype -/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience) +/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE) var/list/datum/brain_trauma/possible_traumas = list() for(var/T in subtypesof(brain_trauma_type)) var/datum/brain_trauma/BT = T - if(can_gain_trauma(BT, resilience) && initial(BT.random_gain)) + if(can_gain_trauma(BT, resilience, natural_gain) && initial(BT.random_gain)) possible_traumas += BT if(!LAZYLEN(possible_traumas)) diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 51be1f6971..6d06da41ae 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -1,11 +1,7 @@ -/mob/living/brain/Life() - set invisibility = 0 - if (notransform) +/mob/living/brain/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - if(!loc) - return - . = ..() handle_emp_damage() /mob/living/brain/update_stat() diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm index b7d7e1d7fc..7f6d5215a0 100644 --- a/code/modules/mob/living/brain/say.dm +++ b/code/modules/mob/living/brain/say.dm @@ -25,10 +25,3 @@ /mob/living/brain/treat_message(message) message = capitalize(message) return message - -/mob/living/brain/could_speak_in_language(datum/language/dt) - if(istype(container, /obj/item/mmi/posibrain/soul_vessel)) - // soul vessels can only speak ratvarian. - . = ispath(dt, /datum/language/ratvar) - else - . = ..() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index bd24a4b4c4..442bcf8027 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -12,6 +12,13 @@ bubble_icon = "alien" type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno + /// How much brute damage without armor piercing they do against mobs in melee + var/meleeSlashHumanPower = 20 + /// How much power they have for DefaultCombatKnockdown when attacking humans + var/meleeKnockdownPower = 100 + /// How much brute damage they do to simple animals + var/meleeSlashSAPower = 35 + var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie var/has_fine_manipulation = 0 var/move_delay_add = 0 // movement delay to add @@ -133,7 +140,8 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) to_chat(src, "You begin to evolve!") - visible_message("[src] begins to twist and contort!") + visible_message("[src] begins to twist and contort!", + "You begin to twist and contort!") new_xeno.setDir(dir) if(!alien_name_regex.Find(name)) new_xeno.name = name diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index cdb8aff2c6..5b92bf3dea 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -8,9 +8,6 @@ /mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) return ..(AM, skipcatch = TRUE, hitpush = FALSE) -/mob/living/carbon/alien/can_embed(obj/item/I) - return FALSE - /*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. In all, this is a lot like the monkey code. /N @@ -27,13 +24,16 @@ In all, this is a lot like the monkey code. /N AdjustUnconscious(-60, FALSE) AdjustSleeping(-100, FALSE) update_mobility() - visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!") + visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!", + "[M.name] nuzzles you trying to wake you up!", target = M, + target_message = "You nuzzle [src] trying to wake [p_them()] up!") if(INTENT_DISARM, INTENT_HARM) if(health > 0) M.do_attack_animation(src, ATTACK_EFFECT_BITE) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) + "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE, null, M, + "You bite [src]!") adjustBruteLoss(1) log_combat(M, src, "attacked") updatehealth() @@ -51,6 +51,8 @@ In all, this is a lot like the monkey code. /N return switch(M.a_intent) if(INTENT_HELP) + if(M == src && check_self_for_injuries()) + return help_shake_act(M) if(INTENT_GRAB) grabbedby(M) 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 ef6a372f9e..3827aef8c1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -21,14 +21,13 @@ Doesn't work on other aliens/AI.*/ . = ..() action = new(src) -/obj/effect/proc_holder/alien/Click() - if(!iscarbon(usr)) - return 1 - var/mob/living/carbon/user = usr - if(cost_check(check_turf,user)) +/obj/effect/proc_holder/alien/Trigger(mob/living/carbon/user, skip_cost_check = FALSE) + if(!istype(user)) + return TRUE + if(skip_cost_check || cost_check(check_turf,user)) if(fire(user) && user) // Second check to prevent runtimes when evolving user.adjustPlasma(-plasma_cost) - return 1 + return TRUE /obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) return diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 183bf07e8c..072c4e0231 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -4,6 +4,7 @@ maxHealth = 125 health = 125 icon_state = "aliend" + meleeKnockdownPower = 80 /mob/living/carbon/alien/humanoid/drone/Initialize() AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index e0647159a5..0ce8482ca1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -1,9 +1,12 @@ /mob/living/carbon/alien/humanoid/hunter name = "alien hunter" caste = "h" - maxHealth = 125 - health = 125 + maxHealth = 170 + health = 170 icon_state = "alienh" + meleeKnockdownPower = 75 + meleeSlashHumanPower = 20 + meleeSlashSAPower = 45 var/obj/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/create_internal_organs() @@ -63,13 +66,14 @@ if(hit_atom) if(isliving(hit_atom)) var/mob/living/L = hit_atom - if(!L.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) + if(L.mob_run_block(src, 0, "the [name]", ATTACK_TYPE_TACKLE, 0, src, null, null) & BLOCK_SUCCESS) + DefaultCombatKnockdown(40, 1, 1) + else L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") L.DefaultCombatKnockdown(100) + L.Stagger(4 SECONDS) sleep(2)//Runtime prevention (infinite bump() calls on hulks) step_towards(src,L) - else - DefaultCombatKnockdown(40, 1, 1) toggle_leap(0) else if(hit_atom.density && !hit_atom.CanPass(src)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 7c6443cfae..67cf6f7d25 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -1,9 +1,10 @@ /mob/living/carbon/alien/humanoid/sentinel name = "alien sentinel" caste = "s" - maxHealth = 150 - health = 150 + maxHealth = 140 + health = 140 icon_state = "aliens" + meleeSlashHumanPower = 15 /mob/living/carbon/alien/humanoid/sentinel/Initialize() AddAbility(new /obj/effect/proc_holder/alien/sneak) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 048b5062ec..727a22f844 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -25,6 +25,7 @@ /mob/living/carbon/alien/humanoid/Initialize() AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) . = ..() + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -3) /mob/living/carbon/alien/humanoid/restrained(ignore_grab) return handcuffed @@ -76,20 +77,18 @@ return TRUE /mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) + . = ..() if(leaping) - return -32 - else if(custom_pixel_y_offset) - return custom_pixel_y_offset - else - return initial(pixel_y) + . -= 32 + if(custom_pixel_y_offset) + . += custom_pixel_y_offset /mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0) + . = ..() if(leaping) - return -32 - else if(custom_pixel_x_offset) - return custom_pixel_x_offset - else - return initial(pixel_x) + . -= 32 + if(custom_pixel_x_offset) + . += custom_pixel_x_offset /mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) return 0.8 @@ -112,7 +111,6 @@ return A return FALSE - /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) if(breath && breath.total_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index 1d613db07a..5ebf6210d0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -1,4 +1,3 @@ - /mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling)) devour_mob(pulling, devour_time = 60) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index fd6a73ae7b..67c9285377 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -1,5 +1,3 @@ - - /mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost) var/temperature = current var/difference = abs(current-loc_temp) //get difference diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 6141a97c12..1200220ce4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -11,6 +11,10 @@ pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) + meleeKnockdownPower = 125 + meleeSlashHumanPower = 30 + meleeSlashSAPower = 60 + var/alt_inhands_file = 'icons/mob/alienqueen.dmi' /mob/living/carbon/alien/humanoid/royal/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE) 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 ca62df0b57..9563959ebc 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -53,7 +53,7 @@ /mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. if(lying > 0) - lying = 90 //Anything else looks retarded + lying = 90 //Anything else looks silly ..() update_icons() @@ -95,4 +95,4 @@ hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) \ No newline at end of file + apply_overlay(HANDS_LAYER) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index fb26a40350..93050a4f9d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -6,6 +6,7 @@ mob_size = MOB_SIZE_SMALL density = FALSE hud_type = /datum/hud/larva + mouse_opacity = MOUSE_OPACITY_OPAQUE maxHealth = 25 health = 25 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 00d929a1e0..f0004b5ed9 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,14 +1,10 @@ - - -/mob/living/carbon/alien/larva/Life() - set invisibility = 0 - if (notransform) +/mob/living/carbon/alien/larva/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - if(..()) //not dead - // GROW! - if(amount_grown < max_grown) - amount_grown++ - update_icons() + // GROW! + if(amount_grown < max_grown) + amount_grown++ + update_icons() /mob/living/carbon/alien/larva/update_stat() @@ -24,12 +20,12 @@ if(!eye_blind) blind_eyes(1) update_mobility() - else - if(stat == UNCONSCIOUS) - stat = CONSCIOUS - if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) - set_resting(FALSE, TRUE) + else if(stat == UNCONSCIOUS) + stat = CONSCIOUS + if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT)) + set_resting(FALSE, TRUE) + if(eye_blind <= 1) adjust_blindness(-1) - update_mobility() + update_mobility() update_damage_hud() update_health_hud() diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 75aadd69c9..70c59d4943 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -1,6 +1,7 @@ -/mob/living/carbon/alien/Life() +/mob/living/carbon/alien/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return findQueen() - return..() /mob/living/carbon/alien/check_breath(datum/gas_mixture/breath) if(status_flags & GODMODE) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index b57f9653a9..8485fece85 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -77,6 +77,9 @@ alien_powers = list(/obj/effect/proc_holder/alien/transfer) /obj/item/organ/alien/plasmavessel/on_life() + . = ..() + if(!.) + return //If there are alien weeds on the ground then heal if needed or give some plasma if(locate(/obj/structure/alien/weeds) in owner.loc) if(owner.health >= owner.maxHealth) 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 5352329f99..9bb50bdf42 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -23,6 +23,8 @@ /obj/item/organ/body_egg/alien_embryo/on_life() . = ..() + if(!owner) + return switch(stage) if(2, 3) if(prob(2)) @@ -90,7 +92,7 @@ ghost.transfer_ckey(new_xeno, FALSE) SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention new_xeno.Paralyze(6) - new_xeno.notransform = TRUE + new_xeno.mob_transforming = TRUE new_xeno.invisibility = INVISIBILITY_MAXIMUM sleep(6) @@ -100,7 +102,7 @@ if(new_xeno) new_xeno.SetParalyzed(0) - new_xeno.notransform = FALSE + new_xeno.mob_transforming = FALSE new_xeno.invisibility = 0 var/mob/living/carbon/old_owner = owner diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 6947ab28f8..eb1b38b9ff 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -247,13 +247,13 @@ /proc/CanHug(mob/living/M) if(!istype(M)) - return 0 + return FALSE if(M.stat == DEAD) - return 0 + return FALSE if(M.getorgan(/obj/item/organ/alien/hivenode)) - return 0 - if(isvamp(M)) - return 0 + return FALSE + if(AmBloodsucker(M)) + return FALSE if(ismonkey(M)) return 1 @@ -262,9 +262,9 @@ if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) - return 0 - return 1 - return 0 + return FALSE + return TRUE + return FALSE #undef MIN_ACTIVE_TIME #undef MAX_ACTIVE_TIME diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm index 1cf052a4d6..71d61cab25 100644 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ b/code/modules/mob/living/carbon/alien/status_procs.dm @@ -2,6 +2,9 @@ //The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, // eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. +/mob/living/carbon/alien/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) + return //no + /////////////////////////////////// STUN //////////////////////////////////// /* CIT CHANGE - removes xeno stun immunity /mob/living/carbon/alien/Stun(amount, updating = 1, ignore_canstun = 0) @@ -17,5 +20,5 @@ /mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0) . = ..() if(!.) - move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10) + move_delay_add = clamp(move_delay_add + round(amount/2), 0, 10) */ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3c5ef91c41..7b201e7492 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -7,6 +7,7 @@ update_body_parts() //to update the carbon's new bodyparts appearance GLOB.carbon_list += src blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) + add_movespeed_modifier(/datum/movespeed_modifier/carbon_crawling) /mob/living/carbon/Destroy() //This must be done first, so the mob ghosts correctly before DNA etc is nulled @@ -21,9 +22,6 @@ QDEL_NULL(dna) GLOB.carbon_list -= src -/mob/living/carbon/initialize_footstep() - AddComponent(/datum/component/footstep, 0.6, 2) - /mob/living/carbon/relaymove(mob/user, direction) if(user in src.stomach_contents) if(prob(40)) @@ -98,6 +96,8 @@ /mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() var/hurt = TRUE + if(GetComponent(/datum/component/tackler)) + return if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower)) var/mob/living/silicon/robot/R = throwingdatum.thrower if(!R.emagged) @@ -196,7 +196,7 @@ to_chat(src, "You set [I] down gently on the ground.") return - adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so. + adjustStaminaLossBuffered(I.getweight(src, STAM_COST_THROW_MULT, SKILL_THROW_STAM_COST)) if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") @@ -206,8 +206,6 @@ newtonian_move(get_dir(target, src)) thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force, random_turn) - - /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) @@ -249,13 +247,14 @@ /mob/living/carbon/Topic(href, href_list) ..() //strip panel - if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + if(usr.canUseTopic(src, BE_CLOSE)) if(href_list["internal"] && !HAS_TRAIT(src, TRAIT_NO_INTERNALS)) var/slot = text2num(href_list["internal"]) var/obj/item/ITEM = get_item_by_slot(slot) if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \ - "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].") + "[usr] tries to [internal ? "close" : "open"] the valve on your [ITEM.name].", \ + target = usr, target_message = "You try to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].") if(do_mob(usr, src, POCKET_STRIP_DELAY)) if(internal) internal = null @@ -266,8 +265,17 @@ update_internals_hud_icon(1) visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \ - "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].") - + "[usr] [internal ? "opens" : "closes"] the valve on your [ITEM.name].", \ + target = usr, target_message = "You [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].") + if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE)) + var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore + return + SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L) + return /mob/living/carbon/fall(forced) loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing @@ -430,13 +438,11 @@ else dropItemToGround(I) return - return TRUE /mob/living/carbon/get_standard_pixel_y_offset(lying = 0) + . = ..() if(lying) - return -6 - else - return initial(pixel_y) + . -= 6 /mob/living/carbon/proc/accident(obj/item/I) if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP)) @@ -444,14 +450,14 @@ //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 - var/modifier = 0 + var/modifier = 50 if(HAS_TRAIT(src, TRAIT_CLUMSY)) modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! //CIT CHANGES START HERE - else if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) - modifier += 50 + else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + modifier -= 50 if(modifier < 100) dropItemToGround(I) @@ -520,7 +526,7 @@ playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) var/turf/T = get_turf(src) if(!blood) - nutrition -= lost_nutrition + adjust_nutrition(-lost_nutrition) adjustToxLoss(-3) for(var/i=0 to distance) if(blood) @@ -540,10 +546,16 @@ return 1 /mob/living/carbon/proc/spew_organ(power = 5, amt = 1) + var/list/spillable_organs = list() + for(var/A in internal_organs) + var/obj/item/organ/O = A + if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT)) + spillable_organs += O for(var/i in 1 to amt) - if(!internal_organs.len) + if(!spillable_organs.len) break //Guess we're out of organs! - var/obj/item/organ/guts = pick(internal_organs) + var/obj/item/organ/guts = pick(spillable_organs) + spillable_organs -= guts var/turf/T = get_turf(src) guts.Remove() guts.forceMove(T) @@ -551,6 +563,7 @@ guts.throw_at(throw_target, power, 4, src) + /mob/living/carbon/fully_replace_character_name(oldname,newname) ..() if(dna) @@ -575,9 +588,9 @@ become_husk("burn") med_hud_set_health() if(stat == SOFT_CRIT) - add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN) + add_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit) else - remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit) /mob/living/carbon/update_stamina() var/stam = getStaminaLoss() @@ -822,16 +835,17 @@ return if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) stat = UNCONSCIOUS - disable_intentional_combat_mode(FALSE, FALSE) + SEND_SIGNAL(src, COMSIG_DISABLE_COMBAT_MODE) if(!eye_blind) blind_eyes(1) else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) stat = SOFT_CRIT - disable_intentional_combat_mode(FALSE, FALSE) + SEND_SIGNAL(src, COMSIG_DISABLE_COMBAT_MODE) else stat = CONSCIOUS - adjust_blindness(-1) + if(eye_blind <= 1) + adjust_blindness(-1) update_mobility() update_damage_hud() update_health_hud() @@ -855,7 +869,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK)) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker(src)) return if((world.time - timeofdeath) > tlimit) return @@ -984,14 +998,121 @@ /mob/living/carbon/vv_get_dropdown() . = ..() - . += "---" - .["Make AI"] = "?_src_=vars;[HrefToken()];makeai=[REF(src)]" - .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]" - .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]" - .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]" - .["Give martial arts"] = "?_src_=vars;[HrefToken()];givemartialart=[REF(src)]" - .["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]" - .["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_MAKE_AI, "Make AI") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_BODYPART, "Modify bodypart") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_ORGANS, "Modify organs") + VV_DROPDOWN_OPTION(VV_HK_HALLUCINATION, "Hallucinate") + VV_DROPDOWN_OPTION(VV_HK_MARTIAL_ART, "Give Martial Arts") + VV_DROPDOWN_OPTION(VV_HK_GIVE_TRAUMA, "Give Brain Trauma") + VV_DROPDOWN_OPTION(VV_HK_CURE_TRAUMA, "Cure Brain Traumas") + +/mob/living/carbon/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_MODIFY_BODYPART]) + if(!check_rights(R_SPAWN)) + return + var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("add","remove", "augment") + if(!edit_action) + return + var/list/limb_list = list() + if(edit_action == "remove" || edit_action == "augment") + for(var/obj/item/bodypart/B in bodyparts) + limb_list += B.body_zone + if(edit_action == "remove") + limb_list -= BODY_ZONE_CHEST + else + limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + for(var/obj/item/bodypart/B in bodyparts) + limb_list -= B.body_zone + var/result = input(usr, "Please choose which body part to [edit_action]","[capitalize(edit_action)] Body Part") as null|anything in limb_list + if(result) + var/obj/item/bodypart/BP = get_bodypart(result) + switch(edit_action) + if("remove") + if(BP) + BP.drop_limb() + else + to_chat(usr, "[src] doesn't have such bodypart.") + if("add") + if(BP) + to_chat(usr, "[src] already has such bodypart.") + else + if(!regenerate_limb(result)) + to_chat(usr, "[src] cannot have such bodypart.") + if("augment") + if(ishuman(src)) + if(BP) + BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE) + else + to_chat(usr, "[src] doesn't have such bodypart.") + else + to_chat(usr, "Only humans can be augmented.") + admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src]") + if(href_list[VV_HK_MAKE_AI]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makeai"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MODIFY_ORGANS]) + if(!check_rights(NONE)) + return + usr.client.manipulate_organs(src) + if(href_list[VV_HK_MARTIAL_ART]) + if(!check_rights(NONE)) + return + var/list/artpaths = subtypesof(/datum/martial_art) + var/list/artnames = list() + for(var/i in artpaths) + var/datum/martial_art/M = i + artnames[initial(M.name)] = M + var/result = input(usr, "Choose the martial art to teach","JUDO CHOP") as null|anything in artnames + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(result) + var/chosenart = artnames[result] + var/datum/martial_art/MA = new chosenart + MA.teach(src) + log_admin("[key_name(usr)] has taught [MA] to [key_name(src)].") + message_admins("[key_name_admin(usr)] has taught [MA] to [key_name_admin(src)].") + if(href_list[VV_HK_GIVE_TRAUMA]) + if(!check_rights(NONE)) + return + var/list/traumas = subtypesof(/datum/brain_trauma) + var/result = input(usr, "Choose the brain trauma to apply","Traumatize") as null|anything in traumas + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(!result) + return + var/datum/brain_trauma/BT = gain_trauma(result) + if(BT) + log_admin("[key_name(usr)] has traumatized [key_name(src)] with [BT.name]") + message_admins("[key_name_admin(usr)] has traumatized [key_name_admin(src)] with [BT.name].") + if(href_list[VV_HK_CURE_TRAUMA]) + if(!check_rights(NONE)) + return + cure_all_traumas(TRAUMA_RESILIENCE_ABSOLUTE) + log_admin("[key_name(usr)] has cured all traumas from [key_name(src)].") + message_admins("[key_name_admin(usr)] has cured all traumas from [key_name_admin(src)].") + if(href_list[VV_HK_HALLUCINATION]) + if(!check_rights(NONE)) + return + var/list/hallucinations = subtypesof(/datum/hallucination) + var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(result) + new result(src, TRUE) /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() @@ -1010,10 +1131,6 @@ if(mood.sanity < SANITY_UNSTABLE) return TRUE -/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) - disable_intentional_combat_mode(TRUE, FALSE) - return ..() - /mob/living/carbon/can_see_reagents() . = ..() if(.) //No need to run through all of this if it's already true. diff --git a/code/modules/mob/living/carbon/carbon_combat.dm b/code/modules/mob/living/carbon/carbon_combat.dm deleted file mode 100644 index f43d850401..0000000000 --- a/code/modules/mob/living/carbon/carbon_combat.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/carbon/enable_intentional_combat_mode() - . = ..() - if(.) - if(voremode) - toggle_vore_mode() - diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 836560ca99..7ce0fd38da 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -65,39 +65,19 @@ throw_mode_off() return TRUE -/mob/living/carbon/embed_item(obj/item/I) - throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) - var/obj/item/bodypart/L = pick(bodyparts) - L.embedded_objects |= I - I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - I.forceMove(src) - I.embedded() - L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) - visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) - -/mob/living/carbon/attacked_by(obj/item/I, mob/living/user) - //CIT CHANGES START HERE - combatmode and resting checks - var/totitemdamage = I.force - if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - totitemdamage *= 0.5 - if(!CHECK_MOBILITY(user, MOBILITY_STAND)) - totitemdamage *= 0.5 - if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - totitemdamage *= 1.5 - //CIT CHANGES END HERE - if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) +/mob/living/carbon/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier + var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected) + var/list/block_return = list() + if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS)) return FALSE - var/obj/item/bodypart/affecting - if(user == src) - affecting = get_bodypart(check_zone(user.zone_selected)) //we're self-mutilating! yay! - else - affecting = get_bodypart(ran_zone(user.zone_selected)) + totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return) + var/obj/item/bodypart/affecting = get_bodypart(impacting_zone) if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, affecting.name) - I.do_stagger_action(src, user) + I.do_stagger_action(src, user, totitemdamage) if(I.force) apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) @@ -190,7 +170,8 @@ M.powerlevel = 0 visible_message("The [M.name] has shocked [src]!", \ - "The [M.name] has shocked [src]!") + "The [M.name] has shocked you!", target = M, + target_message = "You have shocked [src]!") do_sparks(5, TRUE, src) var/power = M.powerlevel + rand(0,3) @@ -239,56 +220,69 @@ var/obj/item/organ/O = X O.emp_act(severity) +///Adds to the parent by also adding functionality to propagate shocks through pulling and doing some fluff effects. /mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if((flags & SHOCK_TESLA) && (flags_1 & TESLA_IGNORE_1)) - return FALSE - if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) - return FALSE - shock_damage *= siemens_coeff - if(dna && dna.species) - shock_damage *= dna.species.siemens_coeff - if(shock_damage < 1) - return 0 - if(reagents.has_reagent(/datum/reagent/teslium)) - shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! - if((flags & SHOCK_ILLUSION)) - adjustStaminaLoss(shock_damage) - else - take_overall_damage(0,shock_damage) - visible_message( - "[src] was shocked by \the [source]!", \ - "You feel a powerful shock coursing through your body!", \ - "You hear a heavy electrical crack." \ - ) - jitteriness += 1000 //High numbers for violent convulsions + . = ..() + if(!.) + return + //Propagation through pulling, fireman carry + if(!(flags & SHOCK_ILLUSION)) + var/list/shocking_queue = list() + if(iscarbon(pulling) && source != pulling) + shocking_queue += pulling + if(iscarbon(pulledby) && source != pulledby) + shocking_queue += pulledby + if(iscarbon(buckled) && source != buckled) + shocking_queue += buckled + for(var/mob/living/carbon/carried in buckled_mobs) + if(source != carried) + shocking_queue += carried + //Found our victims, now lets shock them all + for(var/victim in shocking_queue) + var/mob/living/carbon/C = victim + C.electrocute_act(shock_damage*0.75, src, 1, flags) + //Stun + var/should_stun = (!(flags & SHOCK_TESLA) || siemens_coeff > 0.5) && !(flags & SHOCK_NOSTUN) + if(should_stun) + Stun(40) + //Jitter and other fluff. + jitteriness += 1000 do_jitter_animation(jitteriness) stuttering += 2 - if((!(flags & SHOCK_TESLA) || siemens_coeff > 0.5) && !(flags & SHOCK_NOSTUN)) - Stun(40) - spawn(20) - jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less - if((!(flags & SHOCK_TESLA) || siemens_coeff > 0.5) && !(flags & SHOCK_NOSTUN)) - DefaultCombatKnockdown(60) + addtimer(CALLBACK(src, .proc/secondary_shock, should_stun), 20) return shock_damage +///Called slightly after electrocute act to reduce jittering and apply a secondary stun. +/mob/living/carbon/proc/secondary_shock(should_stun) + jitteriness = max(jitteriness - 990, 10) + if(should_stun) + DefaultCombatKnockdown(60) + /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) if(on_fire) to_chat(M, "You can't put [p_them()] out with just your bare hands!") return + if(M == src && check_self_for_injuries()) + return + if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) var/friendly_check = FALSE + if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null)) + return if(lying) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") return M.visible_message("[M] shakes [src] trying to get [p_them()] up!", \ - "You shake [src] trying to get [p_them()] up!") + "You shake [src] trying to get [p_them()] up!", target = src, + target_message = "[M] shakes you trying to get you up!") else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH) // I ADDED BOOP-EH-DEH-NOSEH - Jon M.visible_message( \ "[M] boops [src]'s nose.", \ - "You boop [src] on the nose.", ) + "You boop [src] on the nose.", target = src, + target_message = "[M] boops your nose.") playsound(src, 'sound/items/Nose_boop.ogg', 50, 0) else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD) @@ -297,7 +291,8 @@ S = dna.species M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \ - "You give [src] a pat on the head to make [p_them()] feel better!") + "You give [src] a pat on the head to make [p_them()] feel better!", target = src, + target_message = "[M] gives you a pat on the head to make you feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) friendly_check = TRUE if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail()) @@ -310,11 +305,13 @@ else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM) M.visible_message( \ "[M] shakes [src]'s hand.", \ - "You shake [src]'s hand.", ) + "You shake [src]'s hand.", target = src, + target_message = "[M] shakes your hand.") else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ - "You hug [src] to make [p_them()] feel better!") + "You hug [src] to make [p_them()] feel better!", target = src,\ + target_message = "[M] hugs you to make you feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) friendly_check = TRUE @@ -336,6 +333,26 @@ update_mobility() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) +/// Check ourselves to see if we've got any shrapnel, return true if we do. This is a much simpler version of what humans do, we only indicate we're checking ourselves if there's actually shrapnel +/mob/living/carbon/proc/check_self_for_injuries() + if(stat == DEAD || stat == UNCONSCIOUS) + return + + var/embeds = FALSE + for(var/X in bodyparts) + var/obj/item/bodypart/LB = X + for(var/obj/item/I in LB.embedded_objects) + if(!embeds) + embeds = TRUE + // this way, we only visibly try to examine ourselves if we have something embedded, otherwise we'll still hug ourselves :) + visible_message("[src] examines [p_them()]self.", \ + "You check yourself for shrapnel.") + if(I.isEmbedHarmless()) + to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") + else + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + + return embeds /mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) . = ..() @@ -436,3 +453,17 @@ var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && !ears.deaf) . = TRUE + +/mob/living/carbon/getBruteLoss_nonProsthetic() + var/amount = 0 + for(var/obj/item/bodypart/BP in bodyparts) + if (BP.status < 2) + amount += BP.brute_dam + return amount + +/mob/living/carbon/getFireLoss_nonProsthetic() + var/amount = 0 + for(var/obj/item/bodypart/BP in bodyparts) + if (BP.status < 2) + amount += BP.burn_dam + return amount diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 689ab56842..15413f76d4 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -63,3 +63,4 @@ var/damageoverlaytemp = 0 var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects + var/tackling = FALSE //Whether or not we are tackling, this will prevent the knock into effects for carbons diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index fa060d8b34..65e59d0e29 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -20,15 +20,16 @@ if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) return 1 -/mob/living/carbon/Move(NewLoc, direct) +/mob/living/carbon/Moved() . = ..() if(. && (movement_type & FLOATING)) //floating is easy if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous + set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous else if(nutrition && stat != DEAD) - nutrition -= HUNGER_FACTOR/10 + var/loss = HUNGER_FACTOR/10 if(m_intent == MOVE_INTENT_RUN) - nutrition -= HUNGER_FACTOR/10 + loss *= 2 + adjust_nutrition(loss) /mob/living/carbon/can_move_under_living(mob/living/other) . = ..() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 414f339b28..b5835aef52 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,20 +1,21 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) +/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!forced && hit_percent <= 0) return 0 var/obj/item/bodypart/BP = null - if(isbodypart(def_zone)) //we specified a bodypart object - BP = def_zone - else - if(!def_zone) - def_zone = ran_zone(def_zone) - BP = get_bodypart(check_zone(def_zone)) - if(!BP) - BP = bodyparts[1] + if(!spread_damage) + if(isbodypart(def_zone)) //we specified a bodypart object + BP = def_zone + else + if(!def_zone) + def_zone = ran_zone(def_zone) + BP = get_bodypart(check_zone(def_zone)) + if(!BP) + BP = bodyparts[1] var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) @@ -38,7 +39,7 @@ adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) if(BP) - if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage_amount))) + if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage_amount), FALSE, FALSE)) update_damage_overlays() else adjustStaminaLoss(damage_amount, forced = forced) @@ -63,7 +64,7 @@ /mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) + if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) return FALSE if(!forced && (status_flags & GODMODE)) return FALSE @@ -74,7 +75,7 @@ return amount /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) - if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. + if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. return FALSE if(!forced && (status_flags & GODMODE)) return FALSE diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 28e0f2028d..c3e849efa6 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -8,8 +8,6 @@ if(!gibbed) emote("deathgasp") - disable_intentional_combat_mode(TRUE, FALSE) - . = ..() for(var/T in get_traumas()) @@ -25,7 +23,8 @@ if(M in stomach_contents) stomach_contents.Remove(M) M.forceMove(Tsec) - visible_message("[M] bursts out of [src]!") + M.visible_message("[M] bursts out of [src]!", + "You burst out of [src]!") ..() /mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts) @@ -41,18 +40,14 @@ if(no_brain && istype(O, /obj/item/organ/brain)) qdel(O) //so the brain isn't transfered to the head when the head drops. continue - var/org_zone = check_zone(O.zone) //both groin and chest organs. - if(org_zone == BODY_ZONE_CHEST) + if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT) && check_zone(O.zone) == BODY_ZONE_CHEST) O.Remove() O.forceMove(Tsec) O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) else for(var/X in internal_organs) var/obj/item/organ/I = X - if(no_brain && istype(I, /obj/item/organ/brain)) - qdel(I) - continue - if(no_organs && !istype(I, /obj/item/organ/brain)) + if(I.organ_flags & ORGAN_NO_DISMEMBERMENT || (no_brain && istype(I, /obj/item/organ/brain)) || (no_organs && !istype(I, /obj/item/organ/brain))) qdel(I) continue I.Remove() @@ -65,7 +60,3 @@ var/obj/item/bodypart/BP = X BP.drop_limb() BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5) - -/mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE) - disable_intentional_combat_mode(TRUE, FALSE) - return ..() diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 1ee3369701..b07aab30d1 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -31,14 +31,35 @@ else if(get_bodypart(BODY_ZONE_HEAD)) . += "It appears that [t_his] brain is missing..." - var/list/missing = get_missing_limbs() + var/list/msg = list("") + var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + var/list/disabled = list() + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + if(BP.disabled) + disabled += BP + missing -= BP.body_zone + for(var/obj/item/I in BP.embedded_objects) + if(I.isEmbedHarmless()) + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" + else + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + + for(var/X in disabled) + var/obj/item/bodypart/BP = X + var/damage_text + if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb + damage_text = "limp and lifeless" + else + damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg + msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n" + for(var/t in missing) if(t==BODY_ZONE_HEAD) - . += "[t_His] [parse_zone(t)] is missing!" + msg += "[t_His] [parse_zone(t)] is missing!\n" continue - . += "[t_His] [parse_zone(t)] is missing!" + msg += "[t_His] [parse_zone(t)] is missing!\n" - var/list/msg = list() var/temp = getBruteLoss() if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy if(temp) @@ -90,7 +111,7 @@ if(digitalcamo) . += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner." - if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) + if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) . += "[t_He] [t_is] visibly tense[CHECK_MOBILITY(src, MOBILITY_STAND) ? "." : ", and [t_is] standing in combative stance."]" var/trait_exam = common_trait_examine() diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm deleted file mode 100644 index a712240622..0000000000 --- a/code/modules/mob/living/carbon/give.dm +++ /dev/null @@ -1,58 +0,0 @@ -/mob/living/verb/give() - set category = "IC" - set name = "Give" - set src in oview(1) //Cannot handle giving shit to mobs on your own tile, but it's a small, small loss - - give_item(usr) - -/mob/living/proc/give_item(mob/living/carbon/user) - - -/mob/living/carbon/give_item(mob/living/carbon/user) - if(!istype(user)) - return - if(src.stat == 2 || user.stat == 2 || src.client == null) - return - if(src.handcuffed) - user << "Those hands are cuffed right now." - return //Can't receive items while cuffed - var/obj/item/I - if(user.get_active_held_item() == null) - user << "You don't have anything in your [get_held_index_name(get_held_index_of_item(I))] to give to [src]." - return - I = user.get_active_held_item() - if(!I) - return - if(src == user) //Shouldn't happen - user << "You tried to give yourself \the [I], but you didn't want it." - return - if(get_empty_held_index_for_side()) - switch(alert(src, "[user] wants to give you \a [I]?", , "Yes", "No")) - if("Yes") - if(!I) - return - if(!Adjacent(user)) - user <<"You need to stay still while giving an object." - src << "[user] moved away."//What an asshole - - return - if(user.get_active_held_item() != I) - user << "You need to keep the item in your hand." - src << "[user] has put \the [I] away!" - return - if(!get_empty_held_index_for_side()) - user << "Your hands are full." - user << "Their hands are full." - return - if(!user.dropItemToGround(I)) - src << "[user] can't let go of \the [I]!" - user << "You can't seem to let go of \the [I]." - return - - src.put_in_hands(I) - update_inv_hands() - src.visible_message("[user] handed \the [I] to [src].") - if("No") - src.visible_message("[user] tried to hand \the [I] to [src] but \he didn't want it.") - else - user << "[src]'s hands are full." diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 9f6a572fc8..651fec8415 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) +/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage) // depending on the species, it will run the corresponding apply_damage code there - return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced) + return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 95746afb73..24eb5d7234 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -4,7 +4,6 @@ status_flags = GODMODE|CANPUSH mouse_drag_pointer = MOUSE_INACTIVE_POINTER var/in_use = FALSE - no_vore = TRUE INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) @@ -44,5 +43,6 @@ GLOBAL_LIST_EMPTY(dummy_mob_list) return var/mob/living/carbon/human/dummy/D = GLOB.human_dummy_list[slotnumber] if(istype(D)) + D.set_species(/datum/species/human,icon_update = TRUE, pref_load = TRUE) //for some fucking reason, if you don't change the species every time, some species will dafault certain things when it's their own species on the mannequin two times in a row, like lizards losing spines and tails setting to smooth. If you can find a fix for this that isn't this, good on you D.wipe_state() D.in_use = FALSE diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index cb21534d25..d32184edb5 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -159,7 +159,10 @@ disabled += BP missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) - msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + if(I.isEmbedHarmless()) + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" + else + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" for(var/X in disabled) var/obj/item/bodypart/BP = X diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a515693047..4421c383e6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -26,6 +26,7 @@ physiology = new() AddComponent(/datum/component/personal_crafting) + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, 2) . = ..() if(CONFIG_GET(flag/disable_stambuffer)) @@ -38,8 +39,10 @@ . = ..() if(!CONFIG_GET(flag/disable_human_mood)) AddComponent(/datum/component/mood) - AddElement(/datum/element/flavor_text/carbon) + AddComponent(/datum/component/combat_mode) + AddElement(/datum/element/flavor_text/carbon, _name = "Flavor Text", _save_key = "flavor_text") AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") + AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE) /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) @@ -217,22 +220,7 @@ var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore return - var/time_taken = I.embedding.embedded_unsafe_removal_time/I.w_class //Citadel Change from * to / - usr.visible_message("[usr] attempts to remove [I] from [usr.p_their()] [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") - if(do_after(usr, time_taken, needhand = 1, target = src)) - remove_embedded_unsafe(L, I, usr) - /* CITADEL EDIT: remove_embedded_unsafe replaces this code - if(!I || !L || I.loc != src || !(I in L.embedded_objects)) - return - L.embedded_objects -= I - L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. - I.forceMove(get_turf(src)) - usr.put_in_hands(I) - usr.emote("scream") - usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!","You successfully remove [I] from your [L.name].") - if(!has_embedded_objects()) - clear_alert("embeddedobject") - SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded") */ + SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L) return if(href_list["item"]) @@ -768,7 +756,7 @@ return else if(hud_used.healths) - var/health_amount = min(health, maxHealth - CLAMP(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud + var/health_amount = min(health, maxHealth - clamp(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud if(..(health_amount)) //not dead switch(hal_screwyhud) if(SCREWYHUD_CRIT) @@ -849,15 +837,95 @@ /mob/living/carbon/human/vv_get_dropdown() . = ..() - . += "---" - .["Make monkey"] = "?_src_=vars;[HrefToken()];makemonkey=[REF(src)]" - .["Set Species"] = "?_src_=vars;[HrefToken()];setspecies=[REF(src)]" - .["Make cyborg"] = "?_src_=vars;[HrefToken()];makerobot=[REF(src)]" - .["Make alien"] = "?_src_=vars;[HrefToken()];makealien=[REF(src)]" - .["Make slime"] = "?_src_=vars;[HrefToken()];makeslime=[REF(src)]" - .["Toggle Purrbation"] = "?_src_=vars;[HrefToken()];purrbation=[REF(src)]" - .["Copy outfit"] = "?_src_=vars;[HrefToken()];copyoutfit=[REF(src)]" - .["Add/Remove Quirks"] = "?_src_=vars;[HrefToken()];modquirks=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_COPY_OUTFIT, "Copy Outfit") + VV_DROPDOWN_OPTION(VV_HK_MOD_QUIRKS, "Add/Remove Quirks") + VV_DROPDOWN_OPTION(VV_HK_MAKE_MONKEY, "Make Monkey") + VV_DROPDOWN_OPTION(VV_HK_MAKE_CYBORG, "Make Cyborg") + VV_DROPDOWN_OPTION(VV_HK_MAKE_SLIME, "Make Slime") + VV_DROPDOWN_OPTION(VV_HK_MAKE_ALIEN, "Make Alien") + VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") + VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") + +/mob/living/carbon/human/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_COPY_OUTFIT]) + if(!check_rights(R_SPAWN)) + return + copy_outfit() + if(href_list[VV_HK_MOD_QUIRKS]) + if(!check_rights(R_SPAWN)) + return + + var/list/options = list("Clear"="Clear") + for(var/x in subtypesof(/datum/quirk)) + var/datum/quirk/T = x + var/qname = initial(T.name) + options[has_quirk(T) ? "[qname] (Remove)" : "[qname] (Add)"] = T + + var/result = input(usr, "Choose quirk to add/remove","Quirk Mod") as null|anything in options + if(result) + if(result == "Clear") + for(var/datum/quirk/q in roundstart_quirks) + remove_quirk(q.type) + else + var/T = options[result] + if(has_quirk(T)) + remove_quirk(T) + else + add_quirk(T,TRUE) + if(href_list[VV_HK_MAKE_MONKEY]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("monkeyone"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_CYBORG]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makerobot"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_ALIEN]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makealien"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_SLIME]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makeslime"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_SET_SPECIES]) + if(!check_rights(R_SPAWN)) + return + var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list + if(result) + var/newtype = GLOB.species_list[result] + admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src] to [result]") + set_species(newtype) + if(href_list[VV_HK_PURRBATION]) + if(!check_rights(R_SPAWN)) + return + if(!ishumanbasic(src)) + to_chat(usr, "This can only be done to the basic human species at the moment.") + return + var/success = purrbation_toggle(src) + if(success) + to_chat(usr, "Put [src] on purrbation.") + log_admin("[key_name(usr)] has put [key_name(src)] on purrbation.") + var/msg = "[key_name_admin(usr)] has put [key_name(src)] on purrbation." + message_admins(msg) + admin_ticket_log(src, msg) + + else + to_chat(usr, "Removed [src] from purrbation.") + log_admin("[key_name(usr)] has removed [key_name(src)] from purrbation.") + var/msg = "[key_name_admin(usr)] has removed [key_name(src)] from purrbation." + message_admins(msg) + admin_ticket_log(src, msg) /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) @@ -961,7 +1029,7 @@ return FALSE /mob/living/carbon/human/proc/clear_shove_slowdown() - remove_movespeed_modifier(MOVESPEED_ID_SHOVE) + remove_movespeed_modifier(/datum/movespeed_modifier/shove) var/active_item = get_active_held_item() if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) @@ -969,18 +1037,22 @@ /mob/living/carbon/human/updatehealth() . = ..() - if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN)) - remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN) - remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING) + if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN)) //if we want to ignore slowdown from damage and equipment + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) return var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay - var/health_deficiency = ((100 + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it - if(health_deficiency >= 40) - add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 75), blacklisted_movetypes = FLOATING|FLYING) - add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 25), movetypes = FLYING, blacklisted_movetypes = FLOATING) + if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) //if we want to ignore slowdown from damage, but not from equipment + var/health_deficiency = ((maxHealth + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it + if(health_deficiency >= 40) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25) + else + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) else - remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN) - remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING) + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) /mob/living/carbon/human/do_after_coefficent() . = ..() diff --git a/code/modules/mob/living/carbon/human/human_block.dm b/code/modules/mob/living/carbon/human/human_block.dm new file mode 100644 index 0000000000..4ba7e95564 --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_block.dm @@ -0,0 +1,11 @@ +/mob/living/carbon/human/get_blocking_items() + . = ..() + if(wear_suit) + if(!.[wear_suit]) + .[wear_suit] = wear_suit.block_priority + if(w_uniform) + if(!.[w_uniform]) + .[w_uniform] = w_uniform.block_priority + if(wear_neck) + if(!.[wear_neck]) + .[wear_neck] = wear_neck.block_priority diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f4227e390e..63296021ff 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -52,36 +52,7 @@ return martial_art_result return ..() -/mob/living/carbon/human/check_reflect(def_zone) - if(wear_suit?.IsReflect(def_zone)) - return TRUE - return ..() - -/mob/living/carbon/human/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) - . = ..() - if(.) - return - var/block_chance_modifier = round(damage / -3) - if(wear_suit) - var/final_block_chance = wear_suit.block_chance - (CLAMP((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier - if(wear_suit.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return TRUE - if(w_uniform) - var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier - if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return TRUE - if(wear_neck) - var/final_block_chance = wear_neck.block_chance - (CLAMP((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier - if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return TRUE - return FALSE - -/mob/living/carbon/human/can_embed(obj/item/I) - if(I.get_sharpness() || is_pointed(I) || is_type_in_typecache(I, GLOB.can_embed_types)) - return TRUE - return FALSE - -/mob/living/carbon/human/proc/check_block() +/mob/living/carbon/human/proc/check_martial_melee_block() if(mind) if(mind.martial_art && prob(mind.martial_art.block_chance) && mind.martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE)) return TRUE @@ -102,7 +73,7 @@ ..() -/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user) +/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(!I || !user) return 0 @@ -119,18 +90,22 @@ SSblackbox.record_feedback("tally", "zone_targeted", 1, target_area) // the attacked_by code varies among species - return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) + return dna.species.spec_attacked_by(I, user, affecting, a_intent, src, attackchain_flags, damage_multiplier) /mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) . = ..(user, TRUE) if(.) return - var/hulk_verb = pick("smash","pummel") + var/hulk_verb_continous = "smashes" + var/hulk_verb_simple = "smash" + if(prob(50)) + hulk_verb_continous = "pummels" + hulk_verb_simple = "pummel" playsound(loc, user.dna.species.attack_sound, 25, 1, -1) - var/message = "[user] has [hulk_verb]ed [src]!" - visible_message("[message]", \ - "[message]") + visible_message("[user] [hulk_verb_continous] [src]!", \ + "[user] [hulk_verb_continous] you!", null, COMBAT_MESSAGE_RANGE, null, user, + "You [hulk_verb_simple] [src]!") adjustBruteLoss(15) return 1 @@ -154,14 +129,16 @@ var/obj/item/I = get_active_held_item() if(I && dropItemToGround(I)) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) - visible_message("[M] disarmed [src]!", \ - "[M] disarmed [src]!") + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed you!", null, COMBAT_MESSAGE_RANGE, null, M, + "You have disarmed [src]!") else if(!M.client || prob(5)) // only natural monkeys get to stun reliably, (they only do it occasionaly) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) DefaultCombatKnockdown(100) log_combat(M, src, "tackled") visible_message("[M] has tackled down [src]!", \ - "[M] has tackled down [src]!") + "[M] has tackled you down!", null, COMBAT_MESSAGE_RANGE, null, M, + "You have tackled [src] down!") if(M.limb_destroyer) dismembering_strike(M, affecting.body_zone) @@ -179,11 +156,12 @@ if(M.a_intent == INTENT_HARM) if (w_uniform) w_uniform.add_fingerprint(M) - var/damage = prob(90) ? 20 : 0 + var/damage = prob(90) ? M.meleeSlashHumanPower : 0 if(!damage) playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) visible_message("[M] has lunged at [src]!", \ - "[M] has lunged at [src]!") + "[M] has lunged at you!", target = M, \ + target_message = "You have lunged at [src]!") return 0 var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) if(!affecting) @@ -192,7 +170,8 @@ playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) visible_message("[M] has slashed at [src]!", \ - "[M] has slashed at [src]!") + "[M] has slashed at you!", target = M, \ + target_message = "You have slashed at [src]!") log_combat(M, src, "attacked") if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful return 1 @@ -202,17 +181,16 @@ var/obj/item/I = get_active_held_item() if(I && dropItemToGround(I)) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) - visible_message("[M] disarmed [src]!", \ - "[M] disarmed [src]!") + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed you!", target = M, \ + target_message = "You have disarmed [src]!") else playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - if(!lying) //CITADEL EDIT - DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25) - else - DefaultCombatKnockdown(100) + DefaultCombatKnockdown(M.meleeKnockdownPower) log_combat(M, src, "tackled") visible_message("[M] has tackled down [src]!", \ - "[M] has tackled down [src]!") + "[M] has tackled you down!", target = M, \ + target_message = "You have tackled down [src]!") /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L) . = ..() @@ -231,7 +209,7 @@ /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) . = ..() if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + var/damage = . var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful return TRUE @@ -295,7 +273,8 @@ updatehealth() visible_message("[M.name] has hit [src]!", \ - "[M.name] has hit [src]!", null, COMBAT_MESSAGE_RANGE) + "[M.name] has hit you!", null, COMBAT_MESSAGE_RANGE, target = M, + target_message = "You have hit [src]!") log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") else @@ -375,40 +354,34 @@ apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) -//Added a safety check in case you want to shock a human mob directly through electrocute_act. +///Calculates the siemens coeff based on clothing and species, can also restart hearts. /mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(flags & SHOCK_TESLA) - var/total_coeff = 1 - if(gloves) - var/obj/item/clothing/gloves/G = gloves - if(G.siemens_coefficient <= 0) - total_coeff -= 0.5 + //Calculates the siemens coeff based on clothing. Completely ignores the arguments + if(flags & SHOCK_TESLA) //I hate this entire block. This gets the siemens_coeff for tesla shocks + if(gloves && gloves.siemens_coefficient <= 0) + siemens_coeff -= 0.5 if(wear_suit) - var/obj/item/clothing/suit/S = wear_suit - if(S.siemens_coefficient <= 0) - total_coeff -= 0.95 - else if(S.siemens_coefficient == (-1)) - total_coeff -= 1 - siemens_coeff = total_coeff - if(flags_1 & TESLA_IGNORE_1) - siemens_coeff = 0 - else if(!(flags & SHOCK_NOGLOVES)) - var/gloves_siemens_coeff = 1 + if(wear_suit.siemens_coefficient == -1) + siemens_coeff -= 1 + else if(wear_suit.siemens_coefficient <= 0) + siemens_coeff -= 0.95 + siemens_coeff = max(siemens_coeff, 0) + else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks if(gloves) - var/obj/item/clothing/gloves/G = gloves - gloves_siemens_coeff = G.siemens_coefficient - siemens_coeff = gloves_siemens_coeff - if(undergoing_cardiac_arrest() && !(flags & SHOCK_ILLUSION)) - if(shock_damage * siemens_coeff >= 1 && prob(25)) - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - heart.beating = TRUE - if(stat == CONSCIOUS) - to_chat(src, "You feel your heart beating again!") + siemens_coeff *= gloves.siemens_coefficient siemens_coeff *= physiology.siemens_coeff . = ..() - if(.) - electrocution_animation(40) - + //Don't go further if the shock was blocked/too weak. + if(!.) + return + //Note we both check that the user is in cardiac arrest and can actually heartattack + //If they can't, they're missing their heart and this would runtime + if(undergoing_cardiac_arrest() && can_heartattack() && !(flags & SHOCK_ILLUSION)) + if(shock_damage * siemens_coeff >= 1 && prob(25)) + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(heart.Restart() && stat == CONSCIOUS) + to_chat(src, "You feel your heart beating again!") + electrocution_animation(40) /mob/living/carbon/human/emp_act(severity) . = ..() @@ -642,7 +615,10 @@ to_send += "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n" for(var/obj/item/I in LB.embedded_objects) - to_send += "\t There is \a [I] embedded in your [LB.name]!\n" + if(I.isEmbedHarmless()) + to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") + else + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") for(var/t in missing) to_send += "Your [parse_zone(t)] is missing!\n" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 68c312b19c..e7be540eb9 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -9,9 +9,10 @@ /// Enable stamina combat combat_flags = COMBAT_FLAGS_DEFAULT status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH|CANSTAGGER + has_field_of_vision = FALSE //Handled by species. blocks_emissive = EMISSIVE_BLOCK_UNIQUE - + //Hair colour and style var/hair_color = "000" var/hair_style = "Bald" @@ -23,10 +24,6 @@ //Eye colour var/eye_color = "000" - var/horn_color = "85615a" //specific horn colors, because why not? - - var/wing_color = "fff" //wings too - var/skin_tone = "caucasian1" //Skin tone var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup @@ -72,4 +69,5 @@ var/creamed = FALSE //to use with creampie overlays var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) var/lastpuke = 0 + var/account_id var/last_fire_update diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7b3953e40e..7c256f5367 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -127,6 +127,17 @@ to_chat(src, "Your fingers don't fit in the trigger guard!") return FALSE +/mob/living/carbon/human/proc/get_bank_account() + RETURN_TYPE(/datum/bank_account) + var/datum/bank_account/account + var/obj/item/card/id/I = get_idcard() + + if(I && I.registered_account) + account = I.registered_account + return account + + return FALSE + /mob/living/carbon/human/can_see_reagents() . = ..() if(.) //No need to run through all of this if it's already true. diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index a26bdd99cd..63ca3f372e 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,11 +1,13 @@ /mob/living/carbon/human/get_movespeed_modifiers() var/list/considering = ..() - . = considering if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN)) - for(var/id in .) - var/list/data = .[id] - if(data[MOVESPEED_DATA_INDEX_FLAGS] & IGNORE_NOSLOW) - .[id] = data + . = list() + for(var/id in considering) + var/datum/movespeed_modifier/M = considering[id] + if(M.flags & IGNORE_NOSLOW || M.multiplicative_slowdown < 0) + .[id] = M + return + return considering /mob/living/carbon/human/movement_delay() . = ..() @@ -14,21 +16,24 @@ if(!SSI) SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase) . -= SSI.config_entry_value - if(wrongdirmovedelay) - . += 1 if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP)) . -= 1.5 /mob/living/carbon/human/slip(knockdown_amount, obj/O, lube) if(HAS_TRAIT(src, TRAIT_NOSLIPALL)) return 0 - if (!(lube&GALOSHES_DONT_HELP)) + if (!(lube & GALOSHES_DONT_HELP)) if(HAS_TRAIT(src, TRAIT_NOSLIPWATER)) return 0 if(shoes && istype(shoes, /obj/item/clothing)) var/obj/item/clothing/CS = shoes if (CS.clothing_flags & NOSLIP) return 0 + if (lube & SLIDE_ICE) + if(shoes && istype(shoes, /obj/item/clothing)) + var/obj/item/clothing/CS = shoes + if (CS.clothing_flags & NOSLIP_ICE) + return FALSE return ..() /mob/living/carbon/human/experience_pressure_difference() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 580b0aaaf0..8de143e2bd 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -277,3 +277,65 @@ qdel(slot) for(var/obj/item/I in held_items) qdel(I) + +/mob/living/carbon/human/proc/smart_equipbag() // take most recent item out of bag or place held item in bag + if(incapacitated()) + return + var/obj/item/thing = get_active_held_item() + var/obj/item/equipped_back = get_item_by_slot(SLOT_BACK) + if(!equipped_back) // We also let you equip a backpack like this + if(!thing) + to_chat(src, "You have no backpack to take something out of!") + return + if(equip_to_slot_if_possible(thing, ITEM_SLOT_BACK)) + update_inv_hands() + return + if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_back.attack_hand(src) + else + to_chat(src, "You can't fit anything in!") + return + if(thing) // put thing in backpack + if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, src)) + to_chat(src, "You can't fit anything in!") + return + if(!equipped_back.contents.len) // nothing to take out + to_chat(src, "There's nothing in your backpack to take out!") + return + var/obj/item/stored = equipped_back.contents[equipped_back.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from backpack + return + +/mob/living/carbon/human/proc/smart_equipbelt() // put held thing in belt or take most recent item out of belt + if(incapacitated()) + return + var/obj/item/thing = get_active_held_item() + var/obj/item/equipped_belt = get_item_by_slot(SLOT_BELT) + if(!equipped_belt) // We also let you equip a belt like this + if(!thing) + to_chat(src, "You have no belt to take something out of!") + return + if(equip_to_slot_if_possible(thing, ITEM_SLOT_BELT)) + update_inv_hands() + return + if(!SEND_SIGNAL(equipped_belt, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_belt.attack_hand(src) + else + to_chat(src, "You can't fit anything in!") + return + if(thing) // put thing in belt + if(!SEND_SIGNAL(equipped_belt, COMSIG_TRY_STORAGE_INSERT, thing, src)) + to_chat(src, "You can't fit anything in!") + return + if(!equipped_belt.contents.len) // nothing to take out + to_chat(src, "There's nothing in your belt to take out!") + return + var/obj/item/stored = equipped_belt.contents[equipped_belt.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from belt + return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index eb22934a2b..56ab1f1b10 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -18,36 +18,21 @@ #define THERMAL_PROTECTION_HAND_LEFT 0.025 #define THERMAL_PROTECTION_HAND_RIGHT 0.025 -/mob/living/carbon/human/Life(seconds, times_fired) - set invisibility = 0 - if (notransform) +/mob/living/carbon/human/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return + handle_active_genes() + //heart attack stuff + handle_heart() + dna.species.spec_life(src) // for mutantraces + return (stat != DEAD) && !QDELETED(src) - . = ..() - - if (QDELETED(src)) - return 0 - - if(.) //not dead - handle_active_genes() - - if(stat != DEAD) - //heart attack stuff - handle_heart() - - if(stat != DEAD) - //Stuff jammed in your limbs hurts - handle_embedded_objects() - +/mob/living/carbon/human/PhysicalLife(seconds, times_fired) + if(!(. = ..())) + return //Update our name based on whether our face is obscured/disfigured name = get_visible_name() - dna.species.spec_life(src) // for mutantraces - - if(stat != DEAD) - return 1 - - /mob/living/carbon/human/calculate_affecting_pressure(pressure) var/headless = !get_bodypart(BODY_ZONE_HEAD) //should the mob be perennially headless (see dullahans), we only take the suit into account, so they can into space. if (wear_suit && istype(wear_suit, /obj/item/clothing) && (headless || (head && istype(head, /obj/item/clothing)))) @@ -303,25 +288,6 @@ return TRUE return ..() - -/mob/living/carbon/human/proc/handle_embedded_objects() - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - for(var/obj/item/I in BP.embedded_objects) - if(prob(I.embedding.embedded_pain_chance)) - BP.receive_damage(I.w_class*I.embedding.embedded_pain_multiplier) - to_chat(src, "[I] embedded in your [BP.name] hurts!") - - if(prob(I.embedding.embedded_fall_chance)) - BP.receive_damage(I.w_class*I.embedding.embedded_fall_pain_multiplier) - BP.embedded_objects -= I - I.forceMove(drop_location()) - I.unembedded() - visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") - if(!has_embedded_objects()) - clear_alert("embeddedobject") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") - /mob/living/carbon/human/proc/handle_active_genes() if(HAS_TRAIT(src, TRAIT_MUTATION_STASIS)) return diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm new file mode 100644 index 0000000000..a89921143a --- /dev/null +++ b/code/modules/mob/living/carbon/human/login.dm @@ -0,0 +1,4 @@ +/mob/living/carbon/human/Login() + ..() + if(dna?.species?.has_field_of_vision && CONFIG_GET(flag/use_field_of_vision)) + LoadComponent(/datum/component/field_of_vision, field_of_vision_type) diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index 4d411deb53..fd0df0bde9 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -25,5 +25,8 @@ var/do_after_speed = 1 //Speed mod for do_after. Lower is better. If temporarily adjusting, please only modify using *= and /=, so you don't interrupt other calculations. + /// footstep type override for both shoeless and not footstep sounds. + var/footstep_type + /datum/physiology/New() armor = new diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 34c65982dc..f256345c68 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows + var/has_field_of_vision = TRUE //Species Icon Drawing Offsets - Pixel X, Pixel Y, Aka X = Horizontal and Y = Vertical, from bottom left corner var/list/offset_features = list( @@ -35,11 +36,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/hair_color // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. - - var/horn_color //specific horn colors, because why not? - var/wing_color - - var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) + var/use_skintones = NO_SKINTONES // does it use skintones or not? (spoiler alert this is only used by humans) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc) var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing @@ -53,6 +50,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/blacklisted = 0 //Flag to exclude from green slime core species. var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!" var/say_mod = "says" // affects the speech message + var/species_language_holder = /datum/language_holder var/list/mutant_bodyparts = list() // Visible CURRENT bodyparts that are unique to a species. Changes to this list for non-species specific bodyparts (ie cat ears and tails) should be assigned at organ level if possible. Layer hiding is handled by handle_mutant_bodyparts() below. var/list/mutant_organs = list() //Internal organs that are unique to this race. var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster @@ -107,6 +105,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both. var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths. + /// Our default override for typing indicator state + var/typing_indicator_state + /////////// // PROCS // /////////// @@ -331,7 +332,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(mutant_bodyparts["meat_type"]) //I can't believe it's come to the meat H.type_of_meat = GLOB.meat_types[H.dna.features["meat_type"]] - C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING)) + if(H.physiology) + if(mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[H.dna.features["taur"]] + switch(T?.taur_mode) + if(STYLE_HOOF_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_SHOE + if(STYLE_PAW_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_CLAW + if(STYLE_SNEK_TAURIC) + H.physiology.footstep_type = FOOTSTEP_MOB_CRAWL + else + H.physiology.footstep_type = null + else + H.physiology.footstep_type = null + + if(H.client && has_field_of_vision && CONFIG_GET(flag/use_field_of_vision)) + H.LoadComponent(/datum/component/field_of_vision, H.field_of_vision_type) + + C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) @@ -349,7 +368,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) for(var/X in inherent_traits) REMOVE_TRAIT(C, X, SPECIES_TRAIT) - C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES) + C.remove_movespeed_modifier(/datum/movespeed_modifier/species) if(mutant_bodyparts["meat_type"]) C.type_of_meat = GLOB.meat_types[C.dna.features["meat_type"]] @@ -364,6 +383,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) C.dna.mutation_index[location] = new_species.inert_mutation C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation) + if(!new_species.has_field_of_vision && has_field_of_vision && ishuman(C) && CONFIG_GET(flag/use_field_of_vision)) + var/datum/component/field_of_vision/F = C.GetComponent(/datum/component/field_of_vision) + if(F) + qdel(F) + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) @@ -548,8 +572,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) - - if(H.socks && !H.hidden_socks && H.get_num_legs(FALSE) >= 2) + var/datum/sprite_accessory/taur/TA + if(mutant_bodyparts["taur"] && H.dna.features["taur"]) + TA = GLOB.taur_list[H.dna.features["taur"]] + if(!(TA?.hide_legs) && H.socks && !H.hidden_socks && H.get_num_legs(FALSE) >= 2) if(H.saved_socks) H.socks = H.saved_socks H.saved_socks = "" @@ -582,7 +608,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" var/mutable_appearance/MA if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) - MA = wear_female_version(state, T.icon, BODY_LAYER) + MA = wear_alpha_masked_version(state, T.icon, BODY_LAYER, FEMALE_UNIFORM_TOP) else MA = mutable_appearance(T.icon, state, -BODY_LAYER) if(T.has_color) @@ -597,21 +623,18 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) var/list/bodyparts_to_add = mutant_bodyparts.Copy() - var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_TAUR_LAYER) - var/list/standing = list() H.remove_overlay(BODY_BEHIND_LAYER) H.remove_overlay(BODY_ADJ_LAYER) + H.remove_overlay(BODY_ADJ_UPPER_LAYER) H.remove_overlay(BODY_FRONT_LAYER) - //CITADEL EDIT - Do not forget to add this to relevent_layers list just above too! - H.remove_overlay(BODY_TAUR_LAYER) - //END EDIT + H.remove_overlay(HORNS_LAYER) if(!mutant_bodyparts) return var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - var/tauric = H.dna.features["taur"] && H.dna.features["taur"] != "None" + var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None" if(mutant_bodyparts["tail_lizard"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) @@ -742,95 +765,110 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!bodyparts_to_add) return + var/list/relevant_layers = list() + var/list/dna_feature_as_text_string = list() + + for(var/bodypart in bodyparts_to_add) + var/datum/sprite_accessory/S + switch(bodypart) + if("tail_lizard") + S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]] + if("waggingtail_lizard") + S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]] + if("tail_human") + S = GLOB.tails_list_human[H.dna.features["tail_human"]] + if("waggingtail_human") + S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]] + if("spines") + S = GLOB.spines_list[H.dna.features["spines"]] + if("waggingspines") + S = GLOB.animated_spines_list[H.dna.features["spines"]] + if("snout") + S = GLOB.snouts_list[H.dna.features["snout"]] + if("frills") + S = GLOB.frills_list[H.dna.features["frills"]] + if("horns") + S = GLOB.horns_list[H.dna.features["horns"]] + if("ears") + S = GLOB.ears_list[H.dna.features["ears"]] + if("body_markings") + S = GLOB.body_markings_list[H.dna.features["body_markings"]] + if("wings") + S = GLOB.wings_list[H.dna.features["wings"]] + if("wingsopen") + S = GLOB.wings_open_list[H.dna.features["wings"]] + if("deco_wings") + S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] + if("legs") + S = GLOB.legs_list[H.dna.features["legs"]] + if("insect_wings") + S = GLOB.insect_wings_list[H.dna.features["insect_wings"]] + if("insect_fluff") + S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]] + if("insect_markings") + S = GLOB.insect_markings_list[H.dna.features["insect_markings"]] + if("caps") + S = GLOB.caps_list[H.dna.features["caps"]] + if("ipc_screen") + S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] + if("ipc_antenna") + S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] + if("mam_tail") + S = GLOB.mam_tails_list[H.dna.features["mam_tail"]] + if("mam_waggingtail") + S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]] + if("mam_body_markings") + S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] + if("mam_ears") + S = GLOB.mam_ears_list[H.dna.features["mam_ears"]] + if("mam_snouts") + S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]] + if("taur") + S = GLOB.taur_list[H.dna.features["taur"]] + if("xenodorsal") + S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]] + if("xenohead") + S = GLOB.xeno_head_list[H.dna.features["xenohead"]] + if("xenotail") + S = GLOB.xeno_tail_list[H.dna.features["xenotail"]] + + if(!S || S.icon_state == "none") + continue + + for(var/L in S.relevant_layers) + LAZYADD(relevant_layers["[L]"], S) + if(!S.mutant_part_string) + dna_feature_as_text_string[S] = bodypart + + var/static/list/layer_text = list( + "[BODY_BEHIND_LAYER]" = "BEHIND", + "[BODY_ADJ_LAYER]" = "ADJ", + "[BODY_ADJ_UPPER_LAYER]" = "ADJUP", + "[BODY_FRONT_LAYER]" = "FRONT", + "[HORNS_LAYER]" = "HORNS", + ) + var/g = (H.dna.features["body_model"] == FEMALE) ? "f" : "m" + var/list/colorlist = list() + var/husk = HAS_TRAIT(H, TRAIT_HUSK) + colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor"]]0") + colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor2"]]0") + colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor3"]]0") + colorlist += list(0,0,0, hair_alpha) + for(var/index in 1 to colorlist.len) + colorlist[index] /= 255 - for(var/layer in relevent_layers) - var/layertext = mutant_bodyparts_layertext(layer) - - for(var/bodypart in bodyparts_to_add) - var/datum/sprite_accessory/S - switch(bodypart) - if("tail_lizard") - S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]] - if("waggingtail_lizard") - S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]] - if("tail_human") - S = GLOB.tails_list_human[H.dna.features["tail_human"]] - if("waggingtail_human") - S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]] - if("spines") - S = GLOB.spines_list[H.dna.features["spines"]] - if("waggingspines") - S = GLOB.animated_spines_list[H.dna.features["spines"]] - if("snout") - S = GLOB.snouts_list[H.dna.features["snout"]] - if("frills") - S = GLOB.frills_list[H.dna.features["frills"]] - if("horns") - S = GLOB.horns_list[H.dna.features["horns"]] - if("ears") - S = GLOB.ears_list[H.dna.features["ears"]] - if("body_markings") - S = GLOB.body_markings_list[H.dna.features["body_markings"]] - if("wings") - S = GLOB.wings_list[H.dna.features["wings"]] - if("wingsopen") - S = GLOB.wings_open_list[H.dna.features["wings"]] - if("deco_wings") - S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] - if("legs") - S = GLOB.legs_list[H.dna.features["legs"]] - if("insect_wings") - S = GLOB.insect_wings_list[H.dna.features["insect_wings"]] - if("insect_fluff") - S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]] - if("insect_markings") - S = GLOB.insect_markings_list[H.dna.features["insect_markings"]] - if("caps") - S = GLOB.caps_list[H.dna.features["caps"]] - if("ipc_screen") - S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] - if("ipc_antenna") - S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] - if("mam_tail") - S = GLOB.mam_tails_list[H.dna.features["mam_tail"]] - if("mam_waggingtail") - S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]] - if("mam_body_markings") - S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] - if("mam_ears") - S = GLOB.mam_ears_list[H.dna.features["mam_ears"]] - if("mam_snouts") - S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]] - if("taur") - S = GLOB.taur_list[H.dna.features["taur"]] - if("xenodorsal") - S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]] - if("xenohead") - S = GLOB.xeno_head_list[H.dna.features["xenohead"]] - if("xenotail") - S = GLOB.xeno_tail_list[H.dna.features["xenotail"]] - - if(!S || S.icon_state == "none") - continue - - var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) - - accessory_overlay.color = null //just because. reee. - - //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. - if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "xenotail") - bodypart = "tail" - if(bodypart == "mam_waggingtail" || bodypart == "waggingtail_human" || bodypart == "waggingtail_lizard") - bodypart = "tailwag" - if(bodypart == "mam_ears" || bodypart == "ears") - bodypart = "ears" - if(bodypart == "mam_snouts" || bodypart == "snout") - bodypart = "snout" - if(bodypart == "xenohead") - bodypart = "xhead" - if(bodypart == "insect_wings" || bodypart == "deco_wings") - bodypart = "insect_wings" + for(var/layer in relevant_layers) + var/list/standing = list() + var/layertext = layer_text[layer] + if(!layertext) //shouldn't happen + stack_trace("invalid layer '[layer]' found in the list of relevant layers on species.handle_mutant_bodyparts().") + continue + var/layernum = text2num(layer) + for(var/bodypart in relevant_layers[layer]) + var/datum/sprite_accessory/S = bodypart + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layernum) + bodypart = S.mutant_part_string || dna_feature_as_text_string[S] if(S.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" @@ -840,20 +878,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) - var/list/colorlist = list() - colorlist.Cut() - colorlist += ReadRGB("[H.dna.features["mcolor"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor2"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor3"]]0") - colorlist += list(0,0,0, hair_alpha) - for(var/index=1, index<=colorlist.len, index++) - colorlist[index] = colorlist[index]/255 - - if(!HAS_TRAIT(H, TRAIT_HUSK)) + if(!husk) if(!forced_colour) switch(S.color_src) if(SKINTONE) - accessory_overlay.color = "#[skintone2hex(H.skin_tone)]" + accessory_overlay.color = SKINTONE2HEX(H.skin_tone) if(MUTCOLORS) if(fixed_mut_color) accessory_overlay.color = "#[fixed_mut_color]" @@ -883,9 +912,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(EYECOLOR) accessory_overlay.color = "#[H.eye_color]" if(HORNCOLOR) - accessory_overlay.color = "#[H.horn_color]" + accessory_overlay.color = "#[H.dna.features["horns_color"]]" if(WINGCOLOR) - accessory_overlay.color = "#[H.wing_color]" + accessory_overlay.color = "#[H.dna.features["wings_color"]]" else accessory_overlay.color = forced_colour else @@ -893,15 +922,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) accessory_overlay.icon_state = "m_ears_none_[layertext]" if(bodypart == "tail") accessory_overlay.icon_state = "m_tail_husk_[layertext]" - if(MATRIXED) - var/list/husklist = list() - husklist += ReadRGB("#a3a3a3") - husklist += ReadRGB("#a3a3a3") - husklist += ReadRGB("#a3a3a3") - husklist += list(0,0,0, hair_alpha) - for(var/index=1, index<=husklist.len, index++) - husklist[index] = husklist[index]/255 - accessory_overlay.color = husklist + if(S.color_src == MATRIXED) + accessory_overlay.color = colorlist if(OFFSET_MUTPARTS in H.dna.species.offset_features) accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] @@ -909,24 +931,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += accessory_overlay - if(S.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) - if(S.gender_specific) - inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" - else - inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]" - - if(S.center) - inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) - - if(OFFSET_MUTPARTS in H.dna.species.offset_features) - inner_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] - inner_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] - - standing += inner_accessory_overlay - if(S.extra) //apply the extra overlay, if there is one - var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layernum) if(S.gender_specific) extra_accessory_overlay.icon_state = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]" else @@ -962,9 +968,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) extra_accessory_overlay.color = "#[H.eye_color]" if(HORNCOLOR) - extra_accessory_overlay.color = "#[H.horn_color]" + extra_accessory_overlay.color = "#[H.dna.features["horns_color"]]" if(WINGCOLOR) - extra_accessory_overlay.color = "#[H.wing_color]" + extra_accessory_overlay.color = "#[H.dna.features["wings_color"]]" if(OFFSET_MUTPARTS in H.dna.species.offset_features) extra_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] @@ -973,7 +979,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += extra_accessory_overlay if(S.extra2) //apply the extra overlay, if there is one - var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layernum) if(S.gender_specific) extra2_accessory_overlay.icon_state = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]" else @@ -1003,9 +1009,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else extra2_accessory_overlay.color = "#[H.hair_color]" if(HORNCOLOR) - extra2_accessory_overlay.color = "#[H.horn_color]" + extra2_accessory_overlay.color = "#[H.dna.features["horns_color"]]" if(WINGCOLOR) - extra2_accessory_overlay.color = "#[H.wing_color]" + extra2_accessory_overlay.color = "#[H.dna.features["wings_color"]]" if(OFFSET_MUTPARTS in H.dna.species.offset_features) extra2_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] @@ -1014,13 +1020,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += extra2_accessory_overlay - H.overlays_standing[layer] = standing.Copy() - standing = list() + H.overlays_standing[layernum] = standing H.apply_overlay(BODY_BEHIND_LAYER) H.apply_overlay(BODY_ADJ_LAYER) + H.apply_overlay(BODY_ADJ_UPPER_LAYER) H.apply_overlay(BODY_FRONT_LAYER) - H.apply_overlay(BODY_TAUR_LAYER) // CITADEL EDIT + H.apply_overlay(HORNS_LAYER) /* @@ -1032,21 +1038,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) outfit_important_for_life= new() outfit_important_for_life.equip(human_to_equip) -//This exists so sprite accessories can still be per-layer without having to include that layer's -//number in their sprite name, which causes issues when those numbers change. -/datum/species/proc/mutant_bodyparts_layertext(layer) - switch(layer) - if(BODY_BEHIND_LAYER) - return "BEHIND" - if(BODY_ADJ_LAYER) - return "ADJ" - if(BODY_FRONT_LAYER) - return "FRONT" - //CITADEL EDIT - if(BODY_TAUR_LAYER) - return "TAUR" - //END EDIT - /* TODO: Snowflake trail marks // Impliments different trails for species depending on if they're wearing shoes. /datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) @@ -1299,14 +1290,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(H.overeatduration < 100) to_chat(H, "You feel fit again!") REMOVE_TRAIT(H, TRAIT_FAT, OBESITY) - H.remove_movespeed_modifier(MOVESPEED_ID_FAT) + H.remove_movespeed_modifier(/datum/movespeed_modifier/obesity) H.update_inv_w_uniform() H.update_inv_wear_suit() else if(H.overeatduration >= 100) to_chat(H, "You suddenly feel blubbery!") ADD_TRAIT(H, TRAIT_FAT, OBESITY) - H.add_movespeed_modifier(MOVESPEED_ID_FAT, multiplicative_slowdown = 1.5) + H.add_movespeed_modifier(/datum/movespeed_modifier/obesity) H.update_inv_w_uniform() H.update_inv_wear_suit() @@ -1331,7 +1322,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.Jitter(5) hunger_rate = 3 * HUNGER_FACTOR hunger_rate *= H.physiology.hunger_mod - H.nutrition = max(0, H.nutrition - hunger_rate) + H.adjust_nutrition(-hunger_rate) if (H.nutrition > NUTRITION_LEVEL_FULL) @@ -1362,9 +1353,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80 if(hungry >= 70) - H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (hungry / 50)) + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50)) else - H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY) + H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger) switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) @@ -1437,8 +1428,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) to_chat(user, "You do not breathe, so you cannot perform CPR.") /datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.check_block()) - target.visible_message("[target] blocks [user]'s grab attempt!") + if(target.check_martial_melee_block()) + target.visible_message("[target] blocks [user]'s grab attempt!", target = user, \ + target_message = "[target] blocks your grab attempt!") return 0 if(attacker_style && attacker_style.grab_act(user,target)) return 1 @@ -1453,9 +1445,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(IS_STAMCRIT(user)) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit to_chat(user, "You're too exhausted.") //CITADEL CHANGE - ditto return FALSE //CITADEL CHANGE - ditto - if(target.check_block()) - target.visible_message("[target] blocks [user]'s attack!") + if(target.check_martial_melee_block()) + target.visible_message("[target] blocks [user]'s attack!", target = user, \ + target_message = "[target] blocks your attack!") return FALSE + + if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes punching cause staminaloss but funny martial artist types get a discount + user.adjustStaminaLossBuffered(1.5) + else + user.adjustStaminaLossBuffered(3.5) + if(attacker_style && attacker_style.harm_act(user,target)) return TRUE else @@ -1474,8 +1473,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) - user.adjustStaminaLossBuffered(3.5) //CITADEL CHANGE - makes punching cause staminaloss - var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh) var/puncherstam = user.getStaminaLoss() var/puncherbrute = user.getBruteLoss() @@ -1483,11 +1480,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/punchedbrute = target.getBruteLoss() //CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage - if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + if(!SEND_SIGNAL(target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) damage *= 1.5 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) damage *= 0.5 - if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) damage *= 0.25 //END OF CITADEL CHANGES @@ -1497,14 +1494,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(user.dna.species.punchdamagelow) if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage) miss_chance = 0 + else if(HAS_TRAIT(user, TRAIT_PUGILIST)) //pugilists have a flat 10% miss chance + miss_chance = 10 else - miss_chance = min(10 + ((puncherstam + puncherbrute)*0.5), 100) //probability of miss has a base of 10, and modified based on half your stamina and brute total. Capped at max 100 and min 0 to prevent weirdness in prob() + miss_chance = min(10 + max(puncherstam * 0.5, puncherbrute * 0.5), 100) //probability of miss has a base of 10, and modified based on half brute total. Capped at max 100 to prevent weirdness in prob() if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1) target.visible_message("[user]'s [atk_verb] misses [target]!", \ - "You avoid [user]'s [atk_verb]!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, user) - to_chat(user, "Your [atk_verb] misses [target]!") + "You avoid [user]'s [atk_verb]!", "You hear a swoosh!", null, COMBAT_MESSAGE_RANGE, null, \ + user, "Your [atk_verb] misses [target]!") log_combat(user, target, "attempted to punch") return FALSE @@ -1513,8 +1512,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1) - target.visible_message("[user] has [atk_verb]ed [target]!", \ - "[user] has [atk_verb]ed [target]!", null, COMBAT_MESSAGE_RANGE) + target.visible_message("[user] [atk_verb]s [target]!", \ + "[user] [atk_verb]s you!", null, COMBAT_MESSAGE_RANGE, null, \ + user, "You [atk_verb] [target]!") target.lastattacker = user.real_name target.lastattackerckey = user.ckey @@ -1522,7 +1522,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) - + if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + 0.5x stamina damage target.apply_damage(damage*1.5, BRUTE, affecting, armor_block) target.apply_damage(damage*0.5, STAMINA, affecting, armor_block) @@ -1534,13 +1534,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) if((punchedstam > 50) && prob(punchedstam*0.5)) //If our punch victim has been hit above the threshold, and they have more than 50 stamina damage, roll for stun, probability of 1% per 2 stamina damage + target.visible_message("[user] knocks [target] down!", \ - "You're knocked down by [user]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, user) - to_chat(user, "You knock [target] down!") + "You're knocked down by [user]!", + "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, null, + user, "You knock [target] down!") + var/knockdown_duration = 40 + (punchedstam + (punchedbrute*0.5))*0.8 - armor_block target.DefaultCombatKnockdown(knockdown_duration) target.forcesay(GLOB.hit_appends) log_combat(user, target, "got a stun punch with their previous punch") + + if(HAS_TRAIT(user, TRAIT_KI_VAMPIRE) && !HAS_TRAIT(target, TRAIT_NOBREATH) && (punchedbrute < 100)) //If we're a ki vampire we also sap them of lifeforce, but only if they're not too beat up. Also living organics only. + user.adjustBruteLoss(-5) + user.adjustFireLoss(-5) + user.adjustStaminaLoss(-20) + + target.adjustCloneLoss(10) + target.adjustBruteLoss(10) + else if(!(target.mobility_flags & MOBILITY_STAND)) target.forcesay(GLOB.hit_appends) @@ -1557,21 +1569,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/aim_for_groin = user.zone_selected == "groin" var/target_aiming_for_groin = target.zone_selected == "groin" + if(target.check_martial_melee_block()) //END EDIT + target.visible_message("[target] blocks [user]'s disarm attempt!", target = user, \ + target_message = "[target] blocks your disarm attempt!") + return FALSE if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted!") return FALSE - else if(target.check_block()) - target.visible_message("[target] blocks [user]'s disarm attempt!") - return FALSE else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth)) playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) - user.visible_message(\ - "\The [user] slaps \the [target] in the face!",\ - "You slap [user == target ? "yourself" : "\the [target]"] in the face! ",\ - "You hear a slap." - ) + target.visible_message(\ + "\The [user] slaps [user == target ? "[user.p_them()]self" : "\the [target]"] in the face!",\ + "[user] slaps you in the face! ",\ + "You hear a slap.", target = user, target_message = "You slap [user == target ? "yourself" : "\the [target]"] in the face! ") user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP) user.adjustStaminaLossBuffered(3) if (!HAS_TRAIT(target, TRAIT_PERMABONER)) @@ -1589,58 +1601,63 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if (!HAS_TRAIT(target, TRAIT_PERMABONER)) stop_wagging_tail(target) playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) - user.visible_message(\ - "\The [user] slaps \the [target]'s ass!",\ - "You slap [user == target ? "your" : "\the [target]'s"] ass!",\ - "You hear a slap." - ) + target.visible_message(\ + "\The [user] slaps [user == target ? "[user.p_their()] own" : "\the [target]'s"] ass!",\ + "[user] slaps your ass! ",\ + "You hear a slap.", target = user, target_message = "You slap [user == target ? "your own" : "\the [target]'s"] ass! ") + return FALSE - else if(attacker_style && attacker_style.disarm_act(user,target)) - return 1 + else user.do_attack_animation(target, ATTACK_EFFECT_DISARM) - user.adjustStaminaLossBuffered(3) //CITADEL CHANGE - makes disarmspam cause staminaloss + if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes disarmspam cause staminaloss, pugilists can do it almost effortlessly + user.adjustStaminaLossBuffered(1) + else + user.adjustStaminaLossBuffered(3) + + if(attacker_style && attacker_style.disarm_act(user,target)) + return TRUE if(target.w_uniform) target.w_uniform.add_fingerprint(user) //var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) if(target.pulling == user) - target.visible_message("[user] wrestles out of [target]'s grip!") + target.visible_message("[user] wrestles out of [target]'s grip!", \ + "[user] wrestles out of your grip!", target = user, \ + target_message = "You wrestle out of [target]'s grip!") target.stop_pulling() playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) log_combat(user, target, "disarmed out of grab from") return - //var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) CIT CHANGE - comments this out to prevent compile errors due to the below commented out bit var/randn = rand(1, 100) - /*if(randn <= 25) CITADEL CHANGE - moves disarm push attempts to right click - playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - target.visible_message("[user] has pushed [target]!", - "[user] has pushed [target]!", null, COMBAT_MESSAGE_RANGE) - target.apply_effect(40, EFFECT_KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!")) - target.forcesay(GLOB.hit_appends) - log_combat(user, target, "pushed over") - return*/ - if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) // CITADEL CHANGE + if(SEND_SIGNAL(target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) // CITADEL CHANGE randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting - if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CITADEL CHANGE + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) //CITADEL CHANGE randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode if(user.pulling == target) - randn += -20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess + randn -= 20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess + if(HAS_TRAIT(user, TRAIT_PUGILIST)) + randn -= 25 //if you are a pugilist, you're slapping that item from them pretty reliably + if(HAS_TRAIT(target, TRAIT_PUGILIST)) + randn += 25 //meanwhile, pugilists are less likely to get disarmed if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing var/obj/item/I = null if(target.pulling) - target.visible_message("[user] has broken [target]'s grip on [target.pulling]!") + target.visible_message("[user] has broken [target]'s grip on [target.pulling]!", \ + "[user] has broken your grip on [target.pulling]!", target = user, \ + target_message = "You have broken [target]'s grip on [target.pulling]!") target.stop_pulling() else I = target.get_active_held_item() if(target.dropItemToGround(I)) target.visible_message("[user] has disarmed [target]!", \ - "[user] has disarmed [target]!", null, COMBAT_MESSAGE_RANGE) + "[user] has disarmed you!", null, COMBAT_MESSAGE_RANGE, null, \ + user, "You have disarmed [target]!") else I = null playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) @@ -1650,7 +1667,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) target.visible_message("[user] attempted to disarm [target]!", \ - "[user] attemped to disarm [target]!", null, COMBAT_MESSAGE_RANGE) + "[user] attemped to disarm [target]!", null, COMBAT_MESSAGE_RANGE, null, \ + user, "You attempted to disarm [target]!") log_combat(user, target, "attempted to disarm") @@ -1682,12 +1700,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if("disarm") disarm(M, H, attacker_style) -/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H) +/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H, attackchain_flags = NONE, damage_multiplier = 1) + var/totitemdamage = H.pre_attacked_by(I, user) * damage_multiplier // Allows you to put in item-specific reactions based on species if(user != H) - if(H.check_shields(I, I.force, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) + var/list/block_return = list() + if(H.mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS) return 0 - if(H.check_block()) + totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return) + if(H.check_martial_melee_block()) H.visible_message("[H] blocks [I]!") return 0 @@ -1701,24 +1722,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) armor_block = min(90,armor_block) //cap damage reduction at 90% var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) - //CIT CHANGES START HERE - combatmode and resting checks - var/totitemdamage = I.force - if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - totitemdamage *= 0.5 - if(!CHECK_MOBILITY(user, MOBILITY_STAND)) - totitemdamage *= 0.5 - if(istype(H)) - if(!(H.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - totitemdamage *= 1.5 - //CIT CHANGES END HERE + var/weakness = H.check_weakness(I, user) apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage H.send_item_attack_message(I, user, hit_area) - I.do_stagger_action(H, user) + I.do_stagger_action(H, user, totitemdamage) - if(!I.force) + if(!totitemdamage) return 0 //item force is zero //dismemberment @@ -1747,7 +1759,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) if(H.stat == CONSCIOUS) H.visible_message("[H] has been knocked senseless!", \ - "[H] has been knocked senseless!") + "You have been knocked senseless!") H.confused = max(H.confused, 20) H.adjust_blurriness(10) if(prob(10)) @@ -1803,9 +1815,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return TRUE if(M.mind) attacker_style = M.mind.martial_art - if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) + if((M != H) && M.a_intent != INTENT_HELP && (H.mob_run_block(M, 0, "[M]", ATTACK_TYPE_UNARMED, 0, M, M.zone_selected, null) & BLOCK_SUCCESS)) log_combat(M, H, "attempted to touch") - H.visible_message("[M] attempted to touch [H]!") + H.visible_message("[M] attempted to touch [H]!", \ + "[M] attempted to touch you!", target = M, \ + target_message = "You attempted to touch [H]!") return TRUE switch(M.a_intent) if(INTENT_HELP) @@ -1823,7 +1837,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted for that.") return - if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) to_chat(user, "You need combat mode to be active to that!") return if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun()) @@ -1841,8 +1855,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted.") return FALSE - if(target.check_block()) - target.visible_message("[target] blocks [user]'s shoving attempt!") + if(target.check_martial_melee_block()) + target.visible_message("[target] blocks [user]'s shoving attempt!", \ + "You block [user]'s shoving attempt!", target = user, \ + target_message = "[target] blocks your shoving attempt!") return FALSE if(attacker_style && attacker_style.disarm_act(user,target)) return TRUE @@ -1887,24 +1903,27 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/targetatrest = !CHECK_MOBILITY(target, MOBILITY_STAND) if((directional_blocked || !(target_collateral_human || target_shove_turf.shove_act(target, user))) && !targetatrest) target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_SOLID) - user.visible_message("[user.name] shoves [target.name], knocking them down!", - "You shove [target.name], knocking them down!", null, COMBAT_MESSAGE_RANGE) + target.visible_message("[user.name] shoves [target.name], knocking them down!", + "[user.name] shoves you, knocking you down!", null, COMBAT_MESSAGE_RANGE, null, + user, "You shove [target.name], knocking them down!") log_combat(user, target, "shoved", "knocking them down") else if(target_collateral_human && !targetatrest) target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_HUMAN) target_collateral_human.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_COLLATERAL) - user.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!", - "You shove [target.name] into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE) + target.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!", + "[user.name] shoves you into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE, null, + user, "You shove [target.name] into [target_collateral_human.name]!") append_message += ", into [target_collateral_human.name]" else - user.visible_message("[user.name] shoves [target.name]!", - "You shove [target.name]!", null, COMBAT_MESSAGE_RANGE) + target.visible_message("[user.name] shoves [target.name]!", + "[user.name] shoves you!", null, COMBAT_MESSAGE_RANGE, null, + user, "You shove [target.name]!") var/obj/item/target_held_item = target.get_active_held_item() if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) target_held_item = null - if(!target.has_movespeed_modifier(MOVESPEED_ID_SHOVE)) - target.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH) + if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove)) + target.add_movespeed_modifier(/datum/movespeed_modifier/shove) if(target_held_item) if(!HAS_TRAIT(target_held_item, TRAIT_NODROP)) target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!", @@ -1920,7 +1939,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) append_message += ", causing them to drop [target_held_item]" log_combat(user, target, "shoved", append_message) -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE) +/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 @@ -1928,20 +1947,20 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return 0 var/obj/item/bodypart/BP = null - if(isbodypart(def_zone)) - if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head)) - BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST)) + if(!spread_damage) + if(isbodypart(def_zone)) + if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head)) + BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST)) + else + BP = def_zone else - BP = def_zone - else - if(!def_zone) - def_zone = ran_zone(def_zone) - if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD) - def_zone = BODY_ZONE_CHEST - BP = H.get_bodypart(check_zone(def_zone)) - - if(!BP) - BP = H.bodyparts[1] + if(!def_zone) + def_zone = ran_zone(def_zone) + if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD) + def_zone = BODY_ZONE_CHEST + BP = H.get_bodypart(check_zone(def_zone)) + if(!BP) + BP = H.bodyparts[1] switch(damagetype) if(BRUTE) @@ -2055,7 +2074,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot) - H.remove_movespeed_modifier(MOVESPEED_ID_COLD) + H.remove_movespeed_modifier(/datum/movespeed_modifier/cold) var/burn_damage var/firemodifier = H.fire_stacks / 50 @@ -2072,8 +2091,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD)) SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) - //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently - H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR), blacklisted_movetypes = FLOATING) + //Apply cold slowdown + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR)) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN) @@ -2083,7 +2102,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN) else - H.remove_movespeed_modifier(MOVESPEED_ID_COLD) + H.remove_movespeed_modifier(/datum/movespeed_modifier/cold) SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold") SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot") diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 559abd8d0b..94f64ceacb 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -9,6 +9,7 @@ gib_types = /obj/effect/gibspawner/robot damage_overlay_type = "synth" mutanttongue = /obj/item/organ/tongue/robot + species_language_holder = /datum/language_holder/synthetic limbs_id = "synth" /datum/species/android/on_species_gain(mob/living/carbon/C) diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index 5474adcf88..1a92da3b0a 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "Angel") - use_skintones = 1 + use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM no_equip = list(SLOT_BACK) blacklisted = 1 limbs_id = "human" diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index da53adece3..595a83de9b 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -1,6 +1,7 @@ /datum/species/insect name = "Anthromorphic Insect" id = "insect" + say_mod = "chitters" default_color = "00FF00" species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG @@ -13,6 +14,7 @@ liked_food = MEAT | FRUIT disliked_food = TOXIC icon_limbs = DEFAULT_BODYPART_ICON_CITADEL + exotic_bloodtype = "BUG" /datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H) if(H) @@ -42,4 +44,4 @@ H.update_body() /datum/species/insect/qualifies_for_rank(rank, list/features) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index 3de530ff5b..e062e1cbf7 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -13,8 +13,7 @@ punchstunthreshold = 25 attack_verb = "smash" attack_sound = 'sound/weapons/resonator_blast.ogg' - blacklisted = 1 - use_skintones = 0 + blacklisted = TRUE species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS) inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER) sexes = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index a41cc8c55a..1d19f28aa8 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -5,7 +5,7 @@ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "deco_wings" = "None") - use_skintones = TRUE + use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM mutant_brain = /obj/item/organ/brain/dullahan mutanteyes = /obj/item/organ/eyes/dullahan mutanttongue = /obj/item/organ/tongue/dullahan @@ -13,6 +13,7 @@ blacklisted = TRUE limbs_id = "human" skinned_type = /obj/item/stack/sheet/animalhide/human + has_field_of_vision = FALSE //Too much of a trouble, their vision is already bound to their severed head. var/pumpkin = FALSE var/obj/item/dullahan_relay/myhead @@ -132,13 +133,13 @@ return INITIALIZE_HINT_QDEL owner = new_owner START_PROCESSING(SSobj, src) - RegisterSignal(owner, COMSIG_CLICK_SHIFT, .proc/examinate_check) + RegisterSignal(owner, COMSIG_MOB_CLICKED_SHIFT_ON, .proc/examinate_check) RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head) RegisterSignal(owner, COMSIG_LIVING_REVIVE, .proc/retrieve_head) -/obj/item/dullahan_relay/proc/examinate_check(atom/source, mob/user) - if(user.client.eye == src) +/obj/item/dullahan_relay/proc/examinate_check(mob/source, atom/target) + if(source.client.eye == src) return COMPONENT_ALLOW_EXAMINATE /obj/item/dullahan_relay/proc/include_owner(datum/source, list/processing_list, list/hearers) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index 5a9b830bc8..bc5f198b4d 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -6,10 +6,10 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // name = "Dwarf" id = "dwarf" //Also called Homo sapiens pumilionis default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR) - inherent_traits = list() + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + inherent_traits = list(TRAIT_DWARF,TRAIT_SNOB) limbs_id = "human" - use_skintones = 1 + use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM say_mod = "bellows" //high energy, EXTRA BIOLOGICAL FUEL damage_overlay_type = "human" skinned_type = /obj/item/stack/sheet/animalhide/human @@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // disliked_food = JUNKFOOD | FRIED //Dwarves hate foods that have no nutrition other than alcohol. mutant_organs = list(/obj/item/organ/dwarfgland) //Dwarven alcohol gland, literal gland warrior mutantliver = /obj/item/organ/liver/dwarf //Dwarven super liver (Otherwise they r doomed) + species_language_holder = /datum/language_holder/dwarf /mob/living/carbon/human/species/dwarf //species admin spawn path race = /datum/species/dwarf //and the race the path is set to. @@ -30,18 +31,14 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // . = ..() var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette var/mob/living/carbon/human/H = C - H.grant_language(/datum/language/dwarf) H.facial_hair_style = dwarf_hair H.update_hair() - H.transform = H.transform.Scale(1, 0.8) //We use scale, and yeah. Dwarves can become gnomes with DWARFISM. + H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src) RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used. - /datum/species/dwarf/on_species_loss(mob/living/carbon/H, datum/species/new_species) . = ..() - H.transform = H.transform.Scale(1, 1.25) //And we undo it. UnregisterSignal(H, COMSIG_MOB_SAY) //We register handle_speech is not being used. - H.remove_language(/datum/language/dwarf) //Dwarf Name stuff /proc/dwarf_name() //hello caller: my name is urist mcuristurister @@ -90,8 +87,8 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // var/heal_rate = 0.5 //The rate they heal damages over 400 alcohol stored. Default is 0.5 so we times 3 since 3 seconds. var/alcohol_rate = 0.25 //The rate the alcohol ticks down per each iteration of dwarf_eth_ticker completing. //These count in on_life ticks which should be 2 seconds per every increment of 1 in a perfect world. - var/dwarf_filth_ticker = 0 //Currently set =< 4, that means this will fire the proc around every 4-8 seconds. var/dwarf_eth_ticker = 0 //Currently set =< 1, that means this will fire the proc around every 2 seconds + var/last_alcohol_spam /obj/item/organ/dwarfgland/prepare_eat() var/obj/S = ..() @@ -100,76 +97,20 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // /obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops.. . = ..() - dwarf_cycle_ticker() - -//Handles the delayed tick cycle by just adding on increments per each on_life() tick -/obj/item/organ/dwarfgland/proc/dwarf_cycle_ticker() - if(owner.stat == DEAD) - return //We make sure they are not dead, so they don't increment any tickers. - dwarf_eth_ticker++ - dwarf_filth_ticker++ - - if(dwarf_filth_ticker >= 4) //Should be around 4-8 seconds since a tick is around 2 seconds. - dwarf_filth_cycle() //On_life will adjust regarding other factors, so we are along for the ride. - dwarf_filth_ticker = 0 //We set the ticker back to 0 to go again. - if(dwarf_eth_ticker >= 1) //Alcohol reagent check should be around 2 seconds, since a tick is around 2 seconds. - dwarf_eth_cycle() - dwarf_eth_ticker = 0 - -//If this still friggin uses too much CPU, I'll make a for view subsystem If I have to. -/obj/item/organ/dwarfgland/proc/dwarf_filth_cycle() - if(!owner?.client || !owner?.mind) - return - //Filth Reactions - Since miasma now exists - var/filth_counter = 0 //Holder for the filth check cycle, basically contains how much filth dwarf sees numerically. - for(var/fuck in view(owner,7)) //hello byond for view loop. - if(istype(fuck, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = fuck - if(H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH))) - filth_counter += 10 - if(istype(fuck, /obj/effect/decal/cleanable/blood)) - if(istype(fuck, /obj/effect/decal/cleanable/blood/gibs)) - filth_counter += 1 - else - filth_counter += 0.1 - if(istype(fuck,/obj/effect/decal/cleanable/vomit)) //They are disgusted by their own vomit too. - filth_counter += 10 //Dwarves could technically chainstun each other in a vomit tantrum spiral. - switch(filth_counter) - if(11 to 25) - if(prob(25)) - to_chat(owner, "Someone should really clean up in here!") - if(26 to 50) - if(prob(30)) //Probability the message appears - to_chat(owner, "The stench makes you queasy.") - if(prob(20)) //And then the probability they vomit along with it. - owner.vomit(20) //I think vomit should stay over a disgust adjustment. - if(51 to 75) - if(prob(35)) - to_chat(owner, "By Armok! You won't be able to keep alcohol down at all!") - if(prob(25)) - owner.vomit(20) //Its more funny - if(76 to 100) - if(prob(40)) - to_chat(owner, "You can't live in such FILTH!") - if(prob(25)) - owner.adjustToxLoss(10) //Now they start dying. - owner.vomit(20) - if(101 to INFINITY) //Now they will really start dying - if(prob(40)) - to_chat(owner, " THERES TOO MUCH FILTH, OH GODS THE FILTH!") - owner.adjustToxLoss(15) - owner.vomit(40) - CHECK_TICK //Check_tick right here, its motherfuckin magic. (To me at least) + if(owner && owner.stat != DEAD) + dwarf_eth_ticker++ + if(dwarf_eth_ticker >= 1) //Alcohol reagent check should be around 2 seconds, since a tick is around 2 seconds. + dwarf_eth_cycle() + dwarf_eth_ticker = 0 //Handles the dwarf alcohol cycle tied to on_life, it ticks in dwarf_cycle_ticker. /obj/item/organ/dwarfgland/proc/dwarf_eth_cycle() //BOOZE POWER + var/init_stored_alcohol = stored_alcohol for(var/datum/reagent/R in owner.reagents.reagent_list) if(istype(R, /datum/reagent/consumable/ethanol)) var/datum/reagent/consumable/ethanol/E = R - stored_alcohol += (E.boozepwr / 50) - if(stored_alcohol > max_alcohol) //Dwarves technically start at 250 alcohol stored. - stored_alcohol = max_alcohol + stored_alcohol = clamp(stored_alcohol + E.boozepwr / 50, 0, max_alcohol) var/heal_amt = heal_rate stored_alcohol -= alcohol_rate //Subtracts alcohol_Rate from stored alcohol so EX: 250 - 0.25 per each loop that occurs. if(stored_alcohol > 400) //If they are over 400 they start regenerating @@ -177,16 +118,27 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // owner.adjustFireLoss(-heal_amt) //Unless they drink casually all the time. owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) //Also they will probably get brain damage if thats a thing here. - if(prob(25)) - switch(stored_alcohol) - if(0 to 24) + if(init_stored_alcohol + 0.5 < stored_alcohol) //recovering stored alcohol at a steady rate of +0.75, no spam. + return + switch(stored_alcohol) + if(0 to 24) + if(last_alcohol_spam + 8 SECONDS < world.time) to_chat(owner, "DAMNATION INCARNATE, WHY AM I CURSED WITH THIS DRY-SPELL? I MUST DRINK.") - owner.adjustToxLoss(35) - if(25 to 50) + last_alcohol_spam = world.time + owner.adjustToxLoss(10) + if(25 to 50) + if(last_alcohol_spam + 20 SECONDS < world.time) to_chat(owner, "Oh DAMN, I need some brew!") - if(51 to 75) + last_alcohol_spam = world.time + if(51 to 75) + if(last_alcohol_spam + 35 SECONDS < world.time) to_chat(owner, "Your body aches, you need to get ahold of some booze...") - if(76 to 100) + last_alcohol_spam = world.time + if(76 to 100) + if(last_alcohol_spam + 40 SECONDS < world.time) to_chat(owner, "A pint of anything would really hit the spot right now.") - if(101 to 150) + last_alcohol_spam = world.time + if(101 to 150) + if(last_alcohol_spam + 50 SECONDS < world.time) to_chat(owner, "You feel like you could use a good brew.") + last_alcohol_spam = world.time diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index d4b8ea7897..b6d56b8e5d 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -74,9 +74,7 @@ //misc /mob/living/carbon/human/dummy - no_vore = TRUE + vore_flags = NO_VORE /mob/living/carbon/human/vore - devourable = TRUE - digestable = TRUE - feeding = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 446e726256..958e58a8ad 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -11,7 +11,7 @@ siemens_coeff = 0 punchdamagelow = 5 punchdamagehigh = 14 - punchstunthreshold = 11 //about 40% chance to stun + punchstunthreshold = 10 no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) nojumpsuit = 1 sexes = 1 @@ -168,7 +168,7 @@ name = "Silver Golem" id = "silver golem" fixed_mut_color = "ddd" - punchstunthreshold = 9 //60% chance, from 40% + punchstunthreshold = 9 meat = /obj/item/stack/ore/silver info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to most types of magic." prefix = "Silver" @@ -190,7 +190,7 @@ stunmod = 0.4 punchdamagelow = 12 punchdamagehigh = 21 - punchstunthreshold = 18 //still 40% stun chance + punchstunthreshold = 18 speedmod = 4 //pretty fucking slow meat = /obj/item/stack/ore/iron info_text = "As a Plasteel Golem, you are slower, but harder to stun, and hit very hard when punching." @@ -280,27 +280,15 @@ . = ..() C.faction |= "plants" C.faction |= "vines" + C.AddElement(/datum/element/photosynthesis) /datum/species/golem/wood/on_species_loss(mob/living/carbon/C) . = ..() C.faction -= "plants" C.faction -= "vines" + C.RemoveElement(/datum/element/photosynthesis) /datum/species/golem/wood/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD) - return - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(H.loc)) //else, there's considered to be no light - var/turf/T = H.loc - light_amount = min(1,T.get_lumcount()) - 0.5 - H.nutrition += light_amount * 10 - if(H.nutrition > NUTRITION_LEVEL_FULL) - H.nutrition = NUTRITION_LEVEL_FULL - if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(1,1) - H.adjustToxLoss(-1) - H.adjustOxyLoss(-1) - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) H.take_overall_damage(2,0) @@ -397,7 +385,7 @@ var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) var/turf/target = get_turf(P.starting) // redirect the projectile - P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H) + P.preparePixelProjectile(locate(clamp(target.x + new_x, 1, world.maxx), clamp(target.y + new_y, 1, world.maxy), H.z), H) return BULLET_ACT_FORCE_PIERCE return ..() @@ -469,7 +457,7 @@ var/cooldown = 150 var/last_teleport = 0 -/datum/action/innate/unstable_teleport/IsAvailable() +/datum/action/innate/unstable_teleport/IsAvailable(silent = FALSE) if(..()) if(world.time > last_teleport + cooldown) return 1 diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 02cff6d924..606b7a8bfd 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -5,7 +5,7 @@ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR) mutant_bodyparts = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") - use_skintones = 1 + use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW liked_food = JUNKFOOD | FRIED diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 9937b52002..f76aa0854e 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -21,20 +21,19 @@ coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage burnmod = 0.5 // = 1/2x generic burn damage + species_language_holder = /datum/language_holder/jelly /datum/species/jelly/on_species_loss(mob/living/carbon/C) if(regenerate_limbs) regenerate_limbs.Remove(C) if(slime_change) //CIT CHANGE slime_change.Remove(C) //CIT CHANGE - C.remove_language(/datum/language/slime) C.faction -= "slime" ..() C.faction -= "slime" /datum/species/jelly/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() - C.grant_language(/datum/language/slime) if(ishuman(C)) regenerate_limbs = new regenerate_limbs.Grant(C) @@ -43,7 +42,7 @@ C.faction |= "slime" /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for vampires + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers return if(!H.blood_volume) H.blood_volume += 5 @@ -84,7 +83,7 @@ background_icon_state = "bg_alien" required_mobility_flags = NONE -/datum/action/innate/regenerate_limbs/IsAvailable() +/datum/action/innate/regenerate_limbs/IsAvailable(silent = FALSE) if(..()) var/mob/living/carbon/human/H = owner var/list/limbs_to_heal = H.get_missing_limbs() @@ -223,7 +222,7 @@ icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" -/datum/action/innate/split_body/IsAvailable() +/datum/action/innate/split_body/IsAvailable(silent = FALSE) if(..()) var/mob/living/carbon/human/H = owner if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -240,7 +239,7 @@ "You focus intently on moving your body while \ standing perfectly still...") - H.notransform = TRUE + H.mob_transforming = TRUE if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -250,7 +249,7 @@ else to_chat(H, "...but fail to stand perfectly still!") - H.notransform = FALSE + H.mob_transforming = FALSE /datum/action/innate/split_body/proc/make_dupe() var/mob/living/carbon/human/H = owner @@ -268,7 +267,7 @@ spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) H.blood_volume *= 0.45 - H.notransform = 0 + H.mob_transforming = 0 var/datum/species/jelly/slime/origin_datum = H.dna.species origin_datum.bodies |= spare @@ -460,8 +459,18 @@ /datum/action/innate/slime_change/proc/change_form() var/mob/living/carbon/human/H = owner - var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel") - if(select_alteration == "Hair Style") + var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color","Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel") + + if(select_alteration == "Body Color") + var/new_color = input(owner, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null + if(new_color) + var/temp_hsv = RGBtoHSV(new_color) + if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright + H.dna.features["mcolor"] = sanitize_hexcolor(new_color, 6) + H.update_body() + else + to_chat(H, "Invalid color. Your color is not bright enough.") + else if(select_alteration == "Hair Style") if(H.gender == MALE) var/new_style = input(owner, "Select a facial hair style", "Hair Alterations") as null|anything in GLOB.facial_hair_styles_list if(new_style) @@ -606,7 +615,7 @@ var/max_D = CONFIG_GET(number/penis_max_inches_prefs) var/new_length = input(owner, "Penis length in inches:\n([min_D]-[max_D])", "Genital Alteration") as num|null if(new_length) - H.dna.features["cock_length"] = CLAMP(round(new_length), min_D, max_D) + H.dna.features["cock_length"] = clamp(round(new_length), min_D, max_D) H.update_genitals() H.apply_overlay() H.give_genital(/obj/item/organ/genital/testicles) @@ -776,7 +785,7 @@ ..() species = _species -/datum/action/innate/use_extract/IsAvailable() +/datum/action/innate/use_extract/IsAvailable(silent = FALSE) if(..()) if(species && species.current_extract && (world.time > species.extract_cooldown)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9a6bc2659d..196073773b 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -24,9 +24,7 @@ disliked_food = GRAIN | DAIRY liked_food = GROSS | MEAT inert_mutation = FIREBREATH - -/datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H) - H.grant_language(/datum/language/draconic) + species_language_holder = /datum/language_holder/lizard /datum/species/lizard/random_name(gender,unique,lastname) if(unique) @@ -86,9 +84,15 @@ mutantlungs = /obj/item/organ/lungs/ashwalker burnmod = 0.9 brutemod = 0.9 + species_language_holder = /datum/language_holder/lizard/ash /datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail_lizard"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines C.dna.features["tail_lizard"] = "Smooth" C.update_body() + if(C.dna.features["legs"] != "digitigrade") + C.dna.features["legs"] = "digitigrade" + for(var/obj/item/bodypart/leggie in C.bodyparts) + if(leggie.body_zone == BODY_ZONE_L_LEG || leggie.body_zone == BODY_ZONE_R_LEG) + leggie.update_limb(FALSE, C) return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 3c17ef9066..dcb6d868fc 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -12,9 +12,9 @@ inherent_traits = list(TRAIT_NOBREATH) speedmod = 1.5 //faster than golems but not by much - punchdamagelow = 6 - punchdamagehigh = 14 - punchstunthreshold = 14 //about 44% chance to stun + punchdamagelow = 2 + punchdamagehigh = 12 //still better than humans + punchstunthreshold = 10 no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM) @@ -22,11 +22,8 @@ heatmod = 1.5 mutanteyes = /obj/item/organ/eyes/night_vision/mushroom - use_skintones = FALSE var/datum/martial_art/mushpunch/mush - -/datum/species/mush/after_equip_job(datum/job/J, mob/living/carbon/human/H) - H.grant_language(/datum/language/mushroom) //pomf pomf + species_language_holder = /datum/language_holder/mushroom /datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 44a794c2ab..e79160da06 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -12,37 +12,26 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant disliked_food = MEAT | DAIRY liked_food = VEGETABLES | FRUIT | GRAIN - var/light_nutrition_gain_factor = 10 - var/light_toxheal = 1 - var/light_oxyheal = 1 - var/light_burnheal = 1 - var/light_bruteheal = 1 + species_language_holder = /datum/language_holder/sylvan + var/light_nutrition_gain_factor = 4 + var/light_toxheal = -1 + var/light_oxyheal = -1 + var/light_burnheal = -1 + var/light_bruteheal = -1 /datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() C.faction |= "plants" C.faction |= "vines" + C.AddElement(/datum/element/photosynthesis, light_bruteheal, light_burnheal, light_toxheal, light_oxyheal, light_nutrition_gain_factor) /datum/species/pod/on_species_loss(mob/living/carbon/C) . = ..() C.faction -= "plants" C.faction -= "vines" + C.RemoveElement(/datum/element/photosynthesis, light_bruteheal, light_burnheal, light_toxheal, light_oxyheal, light_nutrition_gain_factor) /datum/species/pod/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD) - return - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(H.loc)) //else, there's considered to be no light - var/turf/T = H.loc - light_amount = min(1,T.get_lumcount()) - 0.5 - H.nutrition += light_amount * light_nutrition_gain_factor - if(H.nutrition >= NUTRITION_LEVEL_FULL) - H.nutrition = NUTRITION_LEVEL_FULL - 1 - if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(light_bruteheal, light_burnheal) - H.adjustToxLoss(-light_toxheal) - H.adjustOxyLoss(-light_oxyheal) - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) H.take_overall_damage(2,0) @@ -69,8 +58,7 @@ H.adjustFireLoss(rand(5,15)) H.show_message("The radiation beam singes you!") if(/obj/item/projectile/energy/florayield) - H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) - + H.adjust_nutrition(30, NUTRITION_LEVEL_FULL) /datum/species/pod/pseudo_weak name = "Anthromorphic Plant" @@ -78,10 +66,10 @@ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") limbs_id = "pod" - light_nutrition_gain_factor = 7.5 - light_bruteheal = 0.2 - light_burnheal = 0.2 - light_toxheal = 0.7 + light_nutrition_gain_factor = 3 + light_bruteheal = -0.2 + light_burnheal = -0.2 + light_toxheal = -0.7 /datum/species/pod/pseudo_weak/spec_death(gibbed, mob/living/carbon/human/H) if(H) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index e229860cf7..fede67b47a 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -15,16 +15,13 @@ dangerous_existence = 1 mutanteyes = /obj/item/organ/eyes/night_vision +/datum/species/shadow/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + C.AddElement(/datum/element/photosynthesis, 1, 1, 0, 0, 0, 0, SHADOW_SPECIES_LIGHT_THRESHOLD, SHADOW_SPECIES_LIGHT_THRESHOLD) -/datum/species/shadow/spec_life(mob/living/carbon/human/H) - var/turf/T = H.loc - if(istype(T)) - var/light_amount = T.get_lumcount() - - if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying - H.take_overall_damage(1,1) - else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark - H.heal_overall_damage(1,1) +/datum/species/shadow/on_species_loss(mob/living/carbon/C) + . = ..() + C.RemoveElement(/datum/element/photosynthesis, 1, 1, 0, 0, 0, 0, SHADOW_SPECIES_LIGHT_THRESHOLD, SHADOW_SPECIES_LIGHT_THRESHOLD) /datum/species/shadow/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 1700927a24..85f1fbf386 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -16,6 +16,7 @@ var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH) var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged + species_language_holder = /datum/language_holder/synthetic /datum/species/synth/military name = "Military Synth" @@ -23,7 +24,7 @@ armor = 25 punchdamagelow = 10 punchdamagehigh = 19 - punchstunthreshold = 14 //about 50% chance to stun + punchstunthreshold = 14 disguise_fail_health = 50 /datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) @@ -80,7 +81,7 @@ fake_species = null meat = initial(meat) limbs_id = "synth" - use_skintones = 0 + use_skintones = FALSE sexes = 0 fixed_mut_color = "" hair_color = "" diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 7c5f0f473a..f720aa7f8a 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -7,7 +7,7 @@ inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None") exotic_bloodtype = "U" - use_skintones = TRUE + use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM mutant_heart = /obj/item/organ/heart/vampire mutanttongue = /obj/item/organ/tongue/vampire blacklisted = TRUE @@ -23,7 +23,8 @@ /datum/species/vampire/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) . = ..() to_chat(C, "[info_text]") - C.skin_tone = "albino" + if(!C.dna.skin_tone_override) + C.skin_tone = "albino" C.update_body(0) var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new C.AddSpell(B) @@ -81,6 +82,9 @@ if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) to_chat(H, "You're already full!") return + //This checks whether or not they are wearing a garlic clove on their neck + if(!blood_sucking_checks(victim, TRUE, FALSE)) + return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") return @@ -92,6 +96,9 @@ to_chat(victim, "[H] tries to bite you, but stops before touching you!") to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return + //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. + if(!blood_sucking_checks(victim, TRUE, TRUE)) + return if(!do_after(H, 30, target = victim)) return var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood @@ -99,8 +106,8 @@ to_chat(victim, "[H] is draining your blood!") to_chat(H, "You drain some blood!") playsound(H, 'sound/items/drink.ogg', 30, 1, -2) - victim.blood_volume = CLAMP(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - H.blood_volume = CLAMP(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + H.blood_volume = clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) if(!victim.blood_volume) to_chat(H, "You finish off [victim]'s blood supply!") diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 37bafdab67..7892380d8b 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -34,12 +34,11 @@ /mob/living/carbon/human/set_drugginess(amount) ..() if(!amount) - remove_language(/datum/language/beachbum) + remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH) /mob/living/carbon/human/adjust_drugginess(amount) ..() - if(!dna.check_mutation(STONER)) - if(druggy) - grant_language(/datum/language/beachbum) - else - remove_language(/datum/language/beachbum) + if(druggy) + grant_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH) + else + remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_HIGH) diff --git a/code/modules/mob/living/carbon/human/typing_indicator.dm b/code/modules/mob/living/carbon/human/typing_indicator.dm new file mode 100644 index 0000000000..16ed95790a --- /dev/null +++ b/code/modules/mob/living/carbon/human/typing_indicator.dm @@ -0,0 +1,2 @@ +/mob/living/carbon/human/get_typing_indicator_icon_state() + return dna?.species?.typing_indicator_state || ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cb603dee90..e399ddf872 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -5,7 +5,7 @@ This system allows you to update individual mob-overlays, without regenerating them all each time. When we generate overlays we generate the standing version and then rotate the mob as necessary.. -As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //22 and counting, good job guys +As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //32 and counting, good job guys var/overlays_standing[20] //For the standing stance Most of the time we only wish to update one overlay: @@ -118,29 +118,29 @@ There are several things that need to be remembered: return - var/t_color = U.item_color - if(!t_color) - t_color = U.icon_state + var/target_overlay = U.icon_state if(U.adjusted == ALT_STYLE) - t_color = "[t_color]_d" + target_overlay = "[target_overlay]_d" - var/alt_worn = U.alternate_worn_icon || 'icons/mob/uniform.dmi' + var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi' var/variant_flag = NONE - if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE) - alt_worn = 'icons/mob/uniform_digi.dmi' + if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_worn = U.anthro_mob_worn_overlay || 'icons/mob/clothing/uniform_digi.dmi' variant_flag |= STYLE_DIGITIGRADE + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state + var/mutable_appearance/uniform_overlay - if(dna && dna.species.sexes) - var/G = (dna.features["body_model"] == FEMALE) ? "f" : "m" - if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - uniform_overlay = U.build_worn_icon(t_color, UNIFORM_LAYER, alt_worn, FALSE, U.fitted, variant_flag, FALSE) - - if(!uniform_overlay) - uniform_overlay = U.build_worn_icon(t_color, UNIFORM_LAYER, alt_worn, FALSE, NO_FEMALE_UNIFORM, variant_flag, FALSE) - + var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM + uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, gendered, target_overlay, variant_flag, FALSE, mask) if(OFFSET_UNIFORM in dna.species.offset_features) uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1] @@ -167,7 +167,7 @@ There are several things that need to be remembered: update_observer_view(wear_id) //TODO: add an icon file for ID slot stuff, so it's less snowflakey - id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi') + id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', override_state = wear_id.item_state) if(OFFSET_ID in dna.species.offset_features) id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1] id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2] @@ -199,10 +199,7 @@ There are several things that need to be remembered: if(hud_used.inventory_shown) client.screen += gloves update_observer_view(gloves,1) - var/t_state = gloves.item_state - if(!t_state) - t_state = gloves.icon_state - overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/hands.dmi') + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi') gloves_overlay = overlays_standing[GLOVES_LAYER] if(OFFSET_GLOVES in dna.species.offset_features) gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1] @@ -228,7 +225,7 @@ There are several things that need to be remembered: client.screen += glasses //Either way, add the item to the HUD update_observer_view(glasses,1) if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) - overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/eyes.dmi') + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state) var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] if(glasses_overlay) if(OFFSET_GLASSES in dna.species.offset_features) @@ -255,7 +252,7 @@ There are several things that need to be remembered: client.screen += ears //add it to the client's screen update_observer_view(ears,1) - overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') + overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER] if(OFFSET_EARS in dna.species.offset_features) ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] @@ -274,6 +271,11 @@ There are several things that need to be remembered: var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys. + return + if(shoes) var/obj/item/clothing/shoes/S = shoes shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc @@ -282,16 +284,13 @@ There are several things that need to be remembered: client.screen += shoes //add it to client's screen update_observer_view(shoes,1) - var/alt_icon = S.alternate_worn_icon || 'icons/mob/feet.dmi' + var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi' var/variation_flag = NONE - if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE) - alt_icon = 'icons/mob/feet_digi.dmi' + if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi' variation_flag |= STYLE_DIGITIGRADE - var/t_state = shoes.item_state - if (!t_state) - t_state = shoes.icon_state - overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(t_state, SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, variation_flag, FALSE) + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE) var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER] if(OFFSET_SHOES in dna.species.offset_features) shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1] @@ -314,7 +313,7 @@ There are several things that need to be remembered: var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER] if(OFFSET_S_STORE in dna.species.offset_features) s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] @@ -324,23 +323,35 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_head() - ..() - update_mutant_bodyparts() + remove_overlay(HEAD_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + inv.update_icon() + if(head) + head.screen_loc = ui_head + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += head + update_observer_view(head,1) remove_overlay(HEAD_LAYER) var/obj/item/clothing/head/H = head - var/alt_icon = H.alternate_worn_icon || 'icons/mob/head.dmi' + var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi' var/muzzled = FALSE var/variation_flag = NONE if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") muzzled = TRUE else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") muzzled = TRUE - if(muzzled && H.mutantrace_variation & STYLE_MUZZLE) - alt_icon = 'icons/mob/head_muzzled.dmi' + if(muzzled && H.mutantrace_variation & STYLE_MUZZLE && !(H.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = H.anthro_mob_worn_overlay || 'icons/mob/clothing/head_muzzled.dmi' variation_flag |= STYLE_MUZZLE - overlays_standing[HEAD_LAYER] = H.build_worn_icon(H.icon_state, HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, variation_flag, FALSE) + overlays_standing[HEAD_LAYER] = H.build_worn_icon(HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, H.icon_state, variation_flag, FALSE) var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER] if(OFFSET_HEAD in dna.species.offset_features) @@ -348,6 +359,7 @@ There are several things that need to be remembered: head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] overlays_standing[HEAD_LAYER] = head_overlay apply_overlay(HEAD_LAYER) + update_mutant_bodyparts() /mob/living/carbon/human/update_inv_belt() remove_overlay(BELT_LAYER) @@ -362,11 +374,7 @@ There are several things that need to be remembered: client.screen += belt update_observer_view(belt) - var/t_state = belt.item_state - if(!t_state) - t_state = belt.icon_state - - overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = 'icons/mob/belt.dmi') + overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi') var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER] if(OFFSET_BELT in dna.species.offset_features) belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1] @@ -390,7 +398,8 @@ There are several things that need to be remembered: client.screen += wear_suit update_observer_view(wear_suit,1) - var/worn_icon = wear_suit.alternate_worn_icon || 'icons/mob/suit.dmi' + var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi' + var/worn_state = wear_suit.icon_state var/center = FALSE var/dimension_x = 32 var/dimension_y = 32 @@ -400,25 +409,31 @@ There are several things that need to be remembered: T = GLOB.taur_list[dna.features["taur"]] if(S.mutantrace_variation) + if(T?.taur_mode) var/init_worn_icon = worn_icon variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode switch(variation_flag) if(STYLE_HOOF_TAURIC) - worn_icon = 'icons/mob/taur_hooved.dmi' + worn_icon = 'icons/mob/clothing/taur_hooved.dmi' if(STYLE_SNEK_TAURIC) - worn_icon = 'icons/mob/taur_naga.dmi' + worn_icon = 'icons/mob/clothing/taur_naga.dmi' if(STYLE_PAW_TAURIC) - worn_icon = 'icons/mob/taur_canine.dmi' + worn_icon = 'icons/mob/clothing/taur_canine.dmi' if(worn_icon != init_worn_icon) //worn icon sprite was changed, taur offsets will have to be applied. + if(S.taur_mob_worn_overlay) //not going to make several new variables for all taur types. Nope. + var/static/list/icon_to_state = list('icons/mob/clothing/taur_hooved.dmi' = "_hooved", 'icons/mob/clothing/taur_naga.dmi' = "_naga", 'icons/mob/clothing/taur_canine.dmi' = "_paws") + worn_state += icon_to_state[worn_icon] + worn_icon = S.taur_mob_worn_overlay center = T.center dimension_x = T.dimension_x dimension_y = T.dimension_y - else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE) //not a taur, but digitigrade legs. - worn_icon = 'icons/mob/suit_digi.dmi' + + else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) //not a taur, but digitigrade legs. + worn_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/suit_digi.dmi' variation_flag |= STYLE_DIGITIGRADE - overlays_standing[SUIT_LAYER] = S.build_worn_icon(wear_suit.icon_state, SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, variation_flag, FALSE) + overlays_standing[SUIT_LAYER] = S.build_worn_icon(SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, worn_state, variation_flag, FALSE) var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER] if(OFFSET_SUIT in dna.species.offset_features) suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] @@ -456,11 +471,24 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_wear_mask() - ..() + remove_overlay(FACEMASK_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + inv.update_icon() + if(wear_mask) + wear_mask.screen_loc = ui_mask + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += wear_mask + update_observer_view(wear_mask,1) var/obj/item/clothing/mask/M = wear_mask remove_overlay(FACEMASK_LAYER) - var/alt_icon = M.alternate_worn_icon || 'icons/mob/mask.dmi' + var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi' var/muzzled = FALSE var/variation_flag = NONE if(head && (head.flags_inv & HIDEMASK)) @@ -469,12 +497,11 @@ There are several things that need to be remembered: muzzled = TRUE else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") muzzled = TRUE - if(muzzled && M.mutantrace_variation & STYLE_MUZZLE) - alt_icon = 'icons/mob/mask_muzzled.dmi' + if(muzzled && M.mutantrace_variation & STYLE_MUZZLE && !(M.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = M.anthro_mob_worn_overlay || 'icons/mob/clothing/mask_muzzled.dmi' variation_flag |= STYLE_MUZZLE - overlays_standing[FACEMASK_LAYER] = M.build_worn_icon(wear_mask.icon_state, FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, variation_flag, FALSE) - var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER] + var/mutable_appearance/mask_overlay = M.build_worn_icon(FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, wear_mask.icon_state, variation_flag, FALSE) if(OFFSET_FACEMASK in dna.species.offset_features) mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] @@ -494,12 +521,17 @@ There are several things that need to be remembered: overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) -/proc/wear_female_version(t_color, icon, layer, type) - var/index = "[t_color]-[icon]" - var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] - if(!female_clothing_icon) //Create standing/laying icons if they don't exist - generate_female_clothing(index,t_color,icon,type) - return mutable_appearance(GLOB.female_clothing_icons[index], layer = -layer) +/proc/wear_alpha_masked_version(state, icon, layer, female, alpha_mask) + var/mask = "-[alpha_mask]" + if(islist(alpha_mask)) + mask = "-" + for(var/t in alpha_mask) + mask += t + var/index = "[state]-[icon]-[female][mask]" + . = GLOB.alpha_masked_worn_icons[index] + if(!.) //Create standing/laying icons if they don't exist + . = generate_alpha_masked_clothing(index,state,icon,female,alpha_mask) + return mutable_appearance(., layer = -layer) /mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) var/list/out = new @@ -512,22 +544,6 @@ There are several things that need to be remembered: //human HUD updates for items in our inventory -//update whether our head item appears on our hud. -/mob/living/carbon/human/update_hud_head(obj/item/I) - I.screen_loc = ui_head - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += I - update_observer_view(I,1) - -//update whether our mask item appears on our hud. -/mob/living/carbon/human/update_hud_wear_mask(obj/item/I) - I.screen_loc = ui_mask - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += I - update_observer_view(I,1) - //update whether our neck item appears on our hud. /mob/living/carbon/human/update_hud_neck(obj/item/I) I.screen_loc = ui_neck @@ -556,27 +572,34 @@ covers: By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons()) -state: A string to use as the state, this is FAR too complex to solve in this proc thanks to shitty old code -so it's specified as an argument instead. +override_state: A string to use as the state, otherwise item_state or icon_state will be used. default_layer: The layer to draw this on if no other layer is specified default_icon_file: The icon file to draw states from if no other icon file is specified -isinhands: If true then alternate_worn_icon is skipped so that default_icon_file is used, +isinhands: If true then mob_overlay_icon is skipped so that default_icon_file is used, in this situation default_icon_file is expected to match either the lefthand_ or righthand_ file var femalueuniform: A value matching a uniform item's fitted var, if this is anything but NO_FEMALE_UNIFORM, we generate/load female uniform sprites matching all previously decided variables +style_flags: mutant race appearance flags, mostly used for worn_overlays() + +alpha_mask: a text string or list of text, the actual icons are stored in a global list and associated with said text string(s). + +use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if mob_overlay_icon is present. */ -/obj/item/proc/build_worn_icon(state = "", default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, style_flags = NONE, use_alt_icon = TRUE) +/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state, style_flags = NONE, use_mob_overlay_icon = TRUE, alpha_mask) + + var/t_state + t_state = override_state || item_state || icon_state //Find a valid icon file from variables+arguments var/file2use - if(!isinhands && alternate_worn_icon && use_alt_icon) - file2use = alternate_worn_icon + if(!isinhands && mob_overlay_icon && use_mob_overlay_icon) + file2use = mob_overlay_icon if(!file2use) file2use = default_icon_file @@ -588,14 +611,14 @@ generate/load female uniform sprites matching all previously decided variables layer2use = default_layer var/mutable_appearance/standing - if(femaleuniform) - standing = wear_female_version(state,file2use,layer2use,femaleuniform) + if(femaleuniform || alpha_mask) + standing = wear_alpha_masked_version(t_state, file2use, layer2use, femaleuniform, alpha_mask) if(!standing) - standing = mutable_appearance(file2use, state, -layer2use) + standing = mutable_appearance(file2use, t_state, -layer2use) //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. - var/list/worn_overlays = worn_overlays(isinhands, file2use, style_flags) + var/list/worn_overlays = worn_overlays(isinhands, file2use, t_state, style_flags) if(worn_overlays && worn_overlays.len) standing.overlays.Add(worn_overlays) @@ -652,19 +675,17 @@ generate/load female uniform sprites matching all previously decided variables . += "-[dna.features["body_model"]]" - var/is_taur = FALSE - if(dna.species.mutant_bodyparts["taur"] && dna.features["taur"] != "None") - is_taur = TRUE - + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) + is_taur = TRUE + var/static/list/leg_day = typecacheof(list(/obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg)) for(var/X in bodyparts) var/obj/item/bodypart/BP = X - - if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg)) - if(is_taur) - continue - + if(is_taur && leg_day[BP.type]) + continue . += "-[BP.body_zone]" if(BP.status == BODYPART_ORGANIC) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ebb5a3dd31..f9c5db4789 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,48 +1,41 @@ -/mob/living/carbon/Life() - set invisibility = 0 - - if(notransform) - return - - if(damageoverlaytemp) - damageoverlaytemp = 0 - update_damage_hud() - +/mob/living/carbon/BiologicalLife(seconds, times_fired) + if(stat == DEAD) + return FALSE //Reagent processing needs to come before breathing, to prevent edge cases. handle_organs() - - . = ..() - - if (QDELETED(src)) + if(!(. = ..())) return - - if(.) //not dead - handle_blood() - + handle_blood() + // handle_blood *could* kill us. + // we should probably have a better system for if we need to check for death or something in the future hmw if(stat != DEAD) var/bprv = handle_bodyparts() if(bprv & BODYPART_LIFE_UPDATE_HEALTH) updatehealth() update_stamina() + doSprintBufferRegen() if(stat != DEAD) handle_brain_damage() - /* BUG_PROBABLE_CAUSE if(stat != DEAD) handle_liver() - */ if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) handle_death() rot() + . = FALSE //Updates the number of stored chemicals for powers handle_changeling() - if(stat != DEAD) - return 1 +/mob/living/carbon/PhysicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(damageoverlaytemp) + damageoverlaytemp = 0 + update_damage_hud() //Procs called while dead /mob/living/carbon/proc/handle_death() @@ -237,7 +230,7 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) var/ratio = (breath_gases[/datum/gas/plasma]/safe_tox_max) * 10 - adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else clear_alert("too_much_tox") @@ -377,9 +370,15 @@ var/turf/open/miasma_turf = deceasedturf - var/list/cached_gases = miasma_turf.air.gases + var/datum/gas_mixture/stank = new - cached_gases[/datum/gas/miasma] += 0.1 + stank.gases[/datum/gas/miasma] = 0.1 + + stank.temperature = BODYTEMP_NORMAL + + miasma_turf.assume_air(stank) + + miasma_turf.air_update_turf() /mob/living/carbon/proc/handle_blood() return @@ -472,7 +471,7 @@ if(SSmobs.times_fired%3==1) if(!(M.status_flags & GODMODE)) M.adjustBruteLoss(5) - nutrition += 10 + adjust_nutrition(10) /* @@ -498,16 +497,28 @@ GLOBAL_LIST_INIT(ballmer_good_msg, list("Hey guys, what if we rolled out a blues "Hear me out here. What if, and this is just a theory, we made R&D controllable from our PDAs?", "I'm thinking we should roll out a git repository for our research under the AGPLv3 license so that we can share it among the other stations freely.", "I dunno about you guys, but IDs and PDAs being separate is clunky as fuck. Maybe we should merge them into a chip in our arms? That way they can't be stolen easily.", - "Why the fuck aren't we just making every pair of shoes into galoshes? We have the technology.")) + "Why the fuck aren't we just making every pair of shoes into galoshes? We have the technology.", + "We can link the Ore Silo to our protolathes, so why don't we also link it to autolathes?", + "If we can make better bombs with heated plasma, oxygen, and tritium, then why do station nukes still use plutonium?", + "We should port all our NT programs to modular consoles and do away with computers. They're way more customizable, support cross-platform usage, and would allow crazy amounts of multitasking.", + "Wait, if we use more manipulators in something, then it prints for cheaper, right? So what if we just made a new type of printer that has like 12 manipulators inside of it to print stuff for really cheap?" + )) GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put a webserver that's automatically turned on with default admin passwords into every PDA?", - "So like, you know how we separate our codebase from the master copy that runs on our consumer boxes? What if we merged the two and undid the separation between codebase and server?", - "Dude, radical idea: H.O.N.K mechs but with no bananium required.", - "Best idea ever: Disposal pipes instead of hallways.")) + "So like, you know how we separate our codebase from the master copy that runs on our consumer boxes? What if we merged the two and undid the separation between codebase and server?", + "Dude, radical idea: H.O.N.K mechs but with no bananium required.", + "Best idea ever: Disposal pipes instead of hallways.", + "What if we use a language that was written on a napkin and created over 1 weekend for all of our servers?", + "What if we took a locker, some random trash, and made an exosuit out of it? Wouldn't that be like, super cool and stuff?", + "Okay, hear me out, what if we make illegal things not illegal, so that sec stops arresting us for having it?", + "I have a crazy idea, guys. Rather than having monkeys to test on, what if we only used apes?", + "Woh man ok, what if we took slime cores and smashed them into other slimes, be kinda cool to see what happens.", + "We're NANOtrasen but we need to unlock nano parts, what's the deal with that?" + )) //this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc.. /mob/living/carbon/handle_status_effects() ..() - if(getStaminaLoss() && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CIT CHANGE - prevents stamina regen while combat mode is active + if(getStaminaLoss() && !SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //CIT CHANGE - prevents stamina regen while combat mode is active adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1) @@ -684,36 +695,17 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if((!dna && !liver) || (NOLIVER in dna.species.species_traits)) return - if(liver) - if(liver.damage < liver.maxHealth) - liver.organ_flags |= ORGAN_FAILING - liver_failure() - else + if(!liver || liver.organ_flags & ORGAN_FAILING) liver_failure() -/mob/living/carbon/proc/undergoing_liver_failure() - var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) - if(liver && liver.failing) - return TRUE - -/mob/living/carbon/proc/return_liver_damage() - var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) - if(liver) - return liver.damage - -/mob/living/carbon/proc/applyLiverDamage(var/d) - var/obj/item/organ/liver/L = getorganslot(ORGAN_SLOT_LIVER) - if(L) - L.damage += d - /mob/living/carbon/proc/liver_failure() reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) if(HAS_TRAIT(src, TRAIT_STABLELIVER)) return adjustToxLoss(4, TRUE, TRUE) - if(prob(30)) - to_chat(src, "You feel a stabbing pain in your abdomen!") + if(prob(15)) + to_chat(src, "You feel a stabbing pain in your abdomen!") //////////////// diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index a06d65ad4b..1b0856bfcd 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -111,7 +111,7 @@ if(pickupTarget) if(restrained() || blacklistItems[pickupTarget] || HAS_TRAIT(pickupTarget, TRAIT_NODROP)) pickupTarget = null - else + else if(!isobj(loc) || istype(loc, /obj/item/clothing/head/mob_holder)) pickupTimer++ if(pickupTimer >= 4) blacklistItems[pickupTarget] ++ @@ -126,10 +126,8 @@ pickupTarget = null pickupTimer = 0 else if(ismob(pickupTarget.loc)) // in someones hand - if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/)) - var/obj/item/clothing/head/mob_holder/h = pickupTarget - if(h && h.held_mob==src) - return//dont let them pickpocket themselves + if(istype(pickupTarget, /obj/item/clothing/head/mob_holder)) + return//dont let them pickpocket themselves or hold other monkys. var/mob/M = pickupTarget.loc if(!pickpocketing) pickpocketing = TRUE diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index edbd1562b3..7ba29dbf30 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -3,30 +3,26 @@ /mob/living/carbon/monkey -/mob/living/carbon/monkey/Life() - set invisibility = 0 - - if (notransform) +/mob/living/carbon/monkey/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - - if(..()) - - if(!client) - if(stat == CONSCIOUS) - if(on_fire || buckled || restrained() || (!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(src, MOBILITY_MOVE))) //CIT CHANGE - makes it so monkeys attempt to resist if they're resting) - if(!resisting && prob(MONKEY_RESIST_PROB)) - resisting = TRUE - walk_to(src,0) - resist() - else if(resisting) - resisting = FALSE - else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat()) - if(prob(25) && CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc) && !pulledby) - step(src, pick(GLOB.cardinals)) - else if(prob(1)) - emote(pick("scratch","jump","roll","tail")) - else + if(client) + return + if(stat == CONSCIOUS) + if(on_fire || buckled || restrained() || (!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(src, MOBILITY_MOVE))) //CIT CHANGE - makes it so monkeys attempt to resist if they're resting) + if(!resisting && prob(MONKEY_RESIST_PROB)) + resisting = TRUE walk_to(src,0) + resist() + else if(resisting) + resisting = FALSE + else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat()) + if(prob(25) && CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc) && !pulledby) + step(src, pick(GLOB.cardinals)) + else if(prob(1)) + emote(pick("scratch","jump","roll","tail")) + else + walk_to(src,0) /mob/living/carbon/monkey/handle_mutations_and_radiation() if(radiation) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d3e5941e4e..5b91119789 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -45,6 +45,7 @@ /mob/living/carbon/monkey/ComponentInitialize() . = ..() AddElement(/datum/element/mob_holder, worn_state = "monkey", inv_slots = ITEM_SLOT_HEAD) + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_BAREFOOT, 1, 2) /mob/living/carbon/monkey/Destroy() @@ -65,20 +66,20 @@ /mob/living/carbon/monkey/on_reagent_change() . = ..() - remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE) var/amount if(reagents.has_reagent(/datum/reagent/medicine/morphine)) amount = -1 if(amount) - add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount) /mob/living/carbon/monkey/updatehealth() . = ..() var/slow = 0 - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) - slow += (health_deficiency / 25) - add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow) + if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) + var/health_deficiency = (maxHealth - health) + if(health_deficiency >= 45) + slow += (health_deficiency / 25) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_health_speedmod, TRUE, slow) /mob/living/carbon/monkey/adjust_bodytemperature(amount) . = ..() @@ -87,7 +88,7 @@ slow += (283.222 - bodytemperature) / 10 * 1.75 if(slow <= 0) return - add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_temperature_speedmod, TRUE, slow) /mob/living/carbon/monkey/Stat() ..() @@ -99,7 +100,6 @@ if(changeling) stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]") stat("Absorbed DNA", changeling.absorbedcount) - return /mob/living/carbon/monkey/verb/removeinternal() diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 50793eb821..8f862af8fa 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -141,7 +141,7 @@ /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) . = ..() if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + var/damage = . var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful return TRUE diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index fbe4bc9900..c5cb4dc713 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -31,11 +31,12 @@ if(relic_mask) equip_to_slot_or_del(new relic_mask, SLOT_WEAR_MASK) -/mob/living/carbon/monkey/punpun/Life() +/mob/living/carbon/monkey/punpun/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory(FALSE, FALSE) memory_saved = TRUE - ..() /mob/living/carbon/monkey/punpun/death(gibbed) if(!memory_saved) diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index ff83b00fe1..1e00815f24 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -45,7 +45,7 @@ remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) + var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/clothing/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) legcuffs.color = handcuffed.color legcuffs.pixel_y = 8 diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 30c962f9a5..865a1ac83f 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -12,9 +12,9 @@ return 0 return ..() -/mob/living/carbon/could_speak_in_language(datum/language/dt) +/mob/living/carbon/could_speak_language(datum/language/language) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) - . = T.could_speak_in_language(dt) + return T.could_speak_language(language) else - . = initial(dt.flags) & TONGUELESS_SPEECH \ No newline at end of file + return initial(language.flags) & TONGUELESS_SPEECH \ No newline at end of file diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 6c497bb8d4..a47bb7fb4a 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -23,10 +23,10 @@ clear_alert("high") /mob/living/carbon/adjust_disgust(amount) - disgust = CLAMP(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = clamp(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) /mob/living/carbon/set_disgust(amount) - disgust = CLAMP(amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) ////////////////////////////////////////TRAUMAS///////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index e5483e8d73..4899067d7b 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -12,7 +12,7 @@ overlays_standing[cache_index] = null /mob/living/carbon/regenerate_icons() - if(notransform) + if(mob_transforming) return 1 update_inv_hands() update_inv_handcuffed() @@ -42,15 +42,11 @@ observers = null break - var/t_state = I.item_state - if(!t_state) - t_state = I.icon_state - var/icon_file = I.lefthand_file if(get_held_index_of_item(I) % 2 == 0) icon_file = I.righthand_file - hands += I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) @@ -94,13 +90,13 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_WEAR_MASK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] - inv.update_icon() + inv?.update_icon() if(wear_mask) if(!(head && (head.flags_inv & HIDEMASK))) - overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi', override_state = wear_mask.icon_state) update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) @@ -114,7 +110,7 @@ if(wear_neck) if(!(head && (head.flags_inv & HIDENECK))) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi', override_state = wear_neck.icon_state) update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -122,12 +118,12 @@ /mob/living/carbon/update_inv_back() remove_overlay(BACK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] - inv.update_icon() + inv?.update_icon() if(back) - overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') + overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi', override_state = back.icon_state) update_hud_back(back) apply_overlay(BACK_LAYER) @@ -138,12 +134,12 @@ if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) + if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] - inv.update_icon() + inv?.update_icon() if(head) - overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') + overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi', override_state = head.icon_state) update_hud_head(head) apply_overlay(HEAD_LAYER) @@ -152,7 +148,7 @@ /mob/living/carbon/update_inv_handcuffed() remove_overlay(HANDCUFF_LAYER) if(handcuffed) - var/mutable_appearance/cuffs = mutable_appearance('icons/mob/restraints.dmi', handcuffed.item_state, -HANDCUFF_LAYER) + var/mutable_appearance/cuffs = mutable_appearance('icons/mob/clothing/restraints.dmi', handcuffed.item_state, -HANDCUFF_LAYER) cuffs.color = handcuffed.color overlays_standing[HANDCUFF_LAYER] = cuffs @@ -162,7 +158,7 @@ remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) + var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/clothing/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) legcuffs.color = legcuffed.color overlays_standing[LEGCUFF_LAYER] = legcuffs @@ -195,15 +191,6 @@ /mob/living/carbon/proc/update_hud_back(obj/item/I) return - - -//Overlays for the worn overlay so you can overlay while you overlay -//eg: ammo counters, primed grenade flashing, etc. -//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) - . = list() - - /mob/living/carbon/update_body() update_body_parts() @@ -216,6 +203,12 @@ remove_overlay(BODYPARTS_LAYER) + var/is_taur = FALSE + if(dna?.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) + is_taur = TRUE + for(var/X in bodyparts) var/obj/item/bodypart/BP = X BP.update_limb() @@ -226,9 +219,12 @@ return //GENERATE NEW LIMBS + var/static/list/leg_day = typecacheof(list(/obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg)) var/list/new_limbs = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X + if(is_taur && leg_day[BP.type]) + continue new_limbs += BP.get_limb_icon() if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index d5e1fa6fc4..0c049ab5c1 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -1,14 +1,20 @@ -/* - apply_damage(a,b,c) - args - a:damage - How much damage to take - b:damage_type - What type of damage to take, brute, burn - c:def_zone - Where to take the damage if its brute or burn - Returns - standard 0 if fail -*/ -/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) +/** + * Applies damage to this mob + * + * Sends [COMSIG_MOB_APPLY_DAMGE] + * + * Arguuments: + * * damage - amount of damage + * * damagetype - one of [BRUTE], [BURN], [TOX], [OXY], [CLONE], [STAMINA] + * * def_zone - zone that is being hit if any + * * blocked - armor value applied + * * forced - bypass hit percentage + * * spread_damage - used in overrides + * + * Returns TRUE if damage applied + */ +/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) var/hit_percent = (100-blocked)/100 if(!damage || (hit_percent <= 0)) return 0 @@ -78,8 +84,6 @@ apply_damage(brain, BRAIN, def_zone, blocked) return 1 - - /mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE, knockdown_stamoverride, knockdown_stammax) var/hit_percent = (100-blocked)/100 if(!effect || (hit_percent <= 0)) @@ -88,7 +92,7 @@ if(EFFECT_STUN) Stun(effect * hit_percent) if(EFFECT_KNOCKDOWN) - DefaultCombatKnockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride) + DefaultCombatKnockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? clamp(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride) if(EFFECT_UNCONSCIOUS) Unconscious(effect * hit_percent) if(EFFECT_IRRADIATE) @@ -108,7 +112,7 @@ return 1 -/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax) +/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = 0, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax) if(blocked >= 100) return BULLET_ACT_BLOCK if(stun) @@ -140,7 +144,7 @@ /mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = CLAMP((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -151,7 +155,7 @@ /mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - oxyloss = CLAMP((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -170,7 +174,7 @@ /mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - toxloss = CLAMP((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -189,7 +193,7 @@ /mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - fireloss = CLAMP((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -200,7 +204,7 @@ /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 111054c383..7d0a701e8f 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -457,6 +457,7 @@ message = params if(type_override) emote_type = type_override + message = user.say_emphasis(message) . = ..() message = null emote_type = EMOTE_VISIBLE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index d3199d6f8b..7c99c452a1 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -1,12 +1,20 @@ +/** + * Called by SSmobs at (hopefully) an interval of 1 second. + * Splits off into PhysicalLife() and BiologicalLife(). Override those instead of this. + */ /mob/living/proc/Life(seconds, times_fired) - set waitfor = FALSE - set invisibility = 0 + set waitfor = FALSE // yeah hey we're kind of on a subsystem, no sleeping will be tolerated here! + if(mob_transforming) + return - if(digitalinvis) - handle_diginvis() //AI becomes unable to see mob + . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired) + if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL)) + PhysicalLife(seconds, times_fired) + if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL)) + BiologicalLife(seconds, times_fired) - if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating - float(on = TRUE) + // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED! + // Otherwise, it goes into one of the two split Life procs! if (client) var/turf/T = get_turf(src) @@ -30,28 +38,54 @@ log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") update_z(null) - if (notransform) - return - if(!loc) - return - var/datum/gas_mixture/environment = loc.return_air() - - if(stat != DEAD) - //Mutations and radiation - handle_mutations_and_radiation() - - if(stat != DEAD) - //Breathing, if applicable - handle_breathing(times_fired) - +/** + * Handles biological life processes like chemical metabolism, breathing, etc + * Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop. + */ +/mob/living/proc/BiologicalLife(seconds, times_fired) handle_diseases()// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. - if (QDELETED(src)) // diseases can qdel the mob via transformations - return + // Everything after this shouldn't process while dead (as of the time of writing) + if(stat == DEAD) + return FALSE - if(stat != DEAD) - //Random events (vomiting etc) - handle_random_events() + //Mutations and radiation + handle_mutations_and_radiation() + + //Breathing, if applicable + handle_breathing(times_fired) + + if (QDELETED(src)) // diseases can qdel the mob via transformations + return FALSE + + //Random events (vomiting etc) + handle_random_events() + + //stuff in the stomach + handle_stomach() + + handle_block_parry(seconds) + + // These two MIGHT need to be moved to base Life() if we get any in the future that's a "physical" effect that needs to fire even while in stasis. + handle_traits() // eye, ear, brain damages + handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc + return TRUE + +/** + * Handles physical life processes like being on fire. Don't ask why this is considered "Life". + * Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop. + */ +/mob/living/proc/PhysicalLife(seconds, times_fired) + if(digitalinvis) + handle_diginvis() //AI becomes unable to see mob + + if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating + float(on = TRUE) + + if(!loc) + return FALSE + + var/datum/gas_mixture/environment = loc.return_air() //Handle temperature/pressure differences between body and environment if(environment) @@ -59,21 +93,11 @@ handle_fire() - //stuff in the stomach - handle_stomach() - handle_gravity() if(machine) machine.check_eye(src) - - if(stat != DEAD) - handle_traits() // eye, ear, brain damages - if(stat != DEAD) - handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc - - if(stat != DEAD) - return 1 + return TRUE /mob/living/proc/handle_breathing(times_fired) return @@ -166,4 +190,4 @@ /mob/living/proc/handle_high_gravity(gravity) if(gravity >= GRAVITY_DAMAGE_TRESHOLD) //Aka gravity values of 3 or more var/grav_stregth = gravity - GRAVITY_DAMAGE_TRESHOLD - adjustBruteLoss(min(grav_stregth,3)) \ No newline at end of file + adjustBruteLoss(min(grav_stregth,3)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4ef741745f..5b21abfb84 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -9,10 +9,6 @@ diag_hud.add_to_hud(src) faction += "[REF(src)]" GLOB.mob_living_list += src - initialize_footstep() - -/mob/living/proc/initialize_footstep() - AddComponent(/datum/component/footstep) /mob/living/prepare_huds() ..() @@ -23,6 +19,8 @@ med_hud_set_status() /mob/living/Destroy() + end_parry_sequence() + stop_active_blocking() if(LAZYLEN(status_effects)) for(var/s in status_effects) var/datum/status_effect/S = s @@ -46,7 +44,8 @@ return ..() /mob/living/proc/ZImpactDamage(turf/T, levels) - visible_message("[src] crashes into [T] with a sickening noise!") + visible_message("[src] crashes into [T] with a sickening noise!", \ + "You crash into [T] with a sickening noise!") adjustBruteLoss((levels * 5) ** 1.5) DefaultCombatKnockdown(levels * 50) @@ -68,7 +67,7 @@ var/obj/O = A if(ObjBump(O)) return - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A if(PushAM(AM, move_force)) return @@ -124,7 +123,9 @@ to_chat(src, "You're too exhausted to crawl under [L].") return TRUE ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) - visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].") + visible_message("[src] is attempting to crawl under [L].", + "You are now attempting to crawl under [L].", + target = L, target_message = "[src] is attempting to crawl under you.") if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND)) DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE @@ -276,7 +277,9 @@ if(AM.pulledby) if(!supress_message) - visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + AM.pulledby.visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.", + "[src] has pulled [AM] from your grip.", target = src, + target_message = "You have pulled [AM] from [AM.pulledby]'s grip.") log_combat(AM, AM.pulledby, "pulled from", src) AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. @@ -291,7 +294,9 @@ log_combat(src, M, "grabbed", addition="passive grab") if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER))) - visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") //Cit change - And they thought ERP was bad. + visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by [M.p_their()] hands":" passively"]!", + "You have grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by [M.p_their()] hands":" passively"]!", target = M, + target_message = "[src] has grabbed you[(zone_selected == "l_arm" || zone_selected == "r_arm")? " by your hands":" passively"]!") if(!iscarbon(src)) M.LAssailant = null else @@ -316,6 +321,45 @@ update_pull_movespeed() + set_pull_offsets(M, state) + +/mob/living/proc/set_pull_offsets(mob/living/M, grab_state = GRAB_PASSIVE) + if(M.buckled || SEND_SIGNAL(M, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + return //don't make them change direction or offset them if they're buckled into something or in combat mode. + var/offset = 0 + switch(grab_state) + if(GRAB_PASSIVE) + offset = GRAB_PIXEL_SHIFT_PASSIVE + if(GRAB_AGGRESSIVE) + offset = GRAB_PIXEL_SHIFT_AGGRESSIVE + if(GRAB_NECK) + offset = GRAB_PIXEL_SHIFT_NECK + if(GRAB_KILL) + offset = GRAB_PIXEL_SHIFT_NECK + M.setDir(get_dir(M, src)) + switch(M.dir) + if(NORTH) + animate(M, pixel_x = 0, pixel_y = offset, 3) + if(SOUTH) + animate(M, pixel_x = 0, pixel_y = -offset, 3) + if(EAST) + if(M.lying == 270) //update the dragged dude's direction if we've turned + M.lying = 90 + M.update_transform() //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so + M.lying_prev = M.lying + animate(M, pixel_x = offset, pixel_y = 0, 3) + if(WEST) + if(M.lying == 90) + M.lying = 270 + M.update_transform() + M.lying_prev = M.lying + animate(M, pixel_x = -offset, pixel_y = 0, 3) + +/mob/living/proc/reset_pull_offsets(mob/living/M, override) + if(!override && M.buckled) + return + animate(M, pixel_x = 0, pixel_y = 0, 1) + //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) @@ -328,6 +372,8 @@ stop_pulling() /mob/living/stop_pulling() + if(ismob(pulling)) + reset_pull_offsets(pulling) ..() update_pull_movespeed() update_pull_hud_icon() @@ -338,7 +384,7 @@ stop_pulling() //same as above -/mob/living/pointed(atom/A as mob|obj|turf in view()) +/mob/living/pointed(atom/A as mob|obj|turf in fov_view()) if(incapacitated()) return FALSE if(HAS_TRAIT(src, TRAIT_DEATHCOMA)) @@ -502,8 +548,16 @@ var/obj/effect/proc_holder/spell/spell = S spell.updateButtonIcon() +//proc used to remove all immobilisation effects + reset stamina +/mob/living/proc/remove_CC(should_update_mobility = TRUE) + SetAllImmobility(0, FALSE) + setStaminaLoss(0) + SetUnconscious(0, FALSE) + if(should_update_mobility) + update_mobility() + //proc used to completely heal a mob. -/mob/living/proc/fully_heal(admin_revive = 0) +/mob/living/proc/fully_heal(admin_revive = FALSE) restore_blood() setToxLoss(0, 0) //zero as second argument not automatically call updatehealth(). setOxyLoss(0, 0) @@ -514,7 +568,7 @@ SetAllImmobility(0, FALSE) SetSleeping(0, FALSE) radiation = 0 - nutrition = NUTRITION_LEVEL_FED + 50 + set_nutrition(NUTRITION_LEVEL_FED + 50) bodytemperature = BODYTEMP_NORMAL set_blindness(0) set_blurriness(0) @@ -668,19 +722,22 @@ resist_fire() //stop, drop, and roll // Give clickdelay return TRUE + if(resting) //cit change - allows resisting out of resting resist_a_rest() // ditto // DO NOT GIVE CLCIKDELAY - resist_a_rest() handles spam prevention. Somewhat. return FALSE - if(last_special <= world.time) - resist_restraints() //trying to remove cuffs. - // DO NOT GIVE CLICKDELAY - last_special handles this. - return FALSE + if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items. // DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action. changeNext_move(CLICK_CD_MELEE) return FALSE + if(last_special <= world.time) + resist_restraints() //trying to remove cuffs. + // DO NOT GIVE CLICKDELAY - last_special handles this. + return FALSE + /// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly. /mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE) if(!pulledby) //not being grabbed @@ -704,12 +761,16 @@ . = ..() if(pulledby.grab_state > GRAB_PASSIVE) if(CHECK_MOBILITY(src, MOBILITY_RESIST) && prob(30/pulledby.grab_state)) - visible_message("[src] has broken free of [pulledby]'s grip!") + pulledby.visible_message("[src] has broken free of [pulledby]'s grip!", + "[src] has broken free of your grip!", target = src, + target_message = "You have broken free of [pulledby]'s grip!") pulledby.stop_pulling() return TRUE else if(moving_resist && client) //we resisted by trying to move // this is a horrible system and whoever thought using client instead of mob is okay is not an okay person client.move_delay = world.time + 20 - visible_message("[src] resists against [pulledby]'s grip!") + pulledby.visible_message("[src] resists against [pulledby]'s grip!", + "[src] resists against your grip!", target = src, + target_message = "You resist against [pulledby]'s grip!") else pulledby.stop_pulling() return TRUE @@ -774,7 +835,8 @@ strip_silence = g.strip_silence if (!strip_silence) who.visible_message("[src] tries to remove [who]'s [what.name].", \ - "[src] tries to remove [who]'s [what.name].") + "[src] tries to remove your [what.name].", target = src, + target_message = "You try to remove [who]'s [what.name].") what.add_fingerprint(src) else to_chat(src,"You try to remove [who]'s [what.name].") @@ -822,7 +884,9 @@ to_chat(src, "\The [what.name] doesn't fit in that place!") return - visible_message("[src] tries to put [what] on [who].") + who.visible_message("[src] tries to put [what] on [who].", + "[src] tries to put [what] on you.", target = src, + target_message = "You try to put [what] on [who].") if(do_mob(src, who, what.equip_delay_other)) if(what && Adjacent(who) && what.mob_can_equip(who, src, final_where, TRUE, TRUE)) if(temporarilyRemoveItemFromInventory(what)) @@ -847,7 +911,7 @@ var/final_pixel_y = get_standard_pixel_y_offset(lying) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2) - setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life(). + floating_need_update = TRUE /mob/living/proc/get_temperature(datum/gas_mixture/environment) var/loc_temp = environment ? environment.temperature : T0C @@ -1006,7 +1070,7 @@ /mob/living/proc/IgniteMob() if(fire_stacks > 0 && !on_fire) on_fire = 1 - src.visible_message("[src] catches fire!", \ + visible_message("[src] catches fire!", \ "You're set on fire!") new/obj/effect/dummy/lighting_obj/moblight/fire(src) throw_alert("fire", /obj/screen/alert/fire) @@ -1027,7 +1091,7 @@ update_fire() /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = CLAMP(fire_stacks + add_fire_stacks, -20, 20) + fire_stacks = clamp(fire_stacks + add_fire_stacks, -20, 20) if(on_fire && fire_stacks <= 0) ExtinguishMob() @@ -1198,3 +1262,19 @@ gender = ngender return TRUE return FALSE + +/mob/living/vv_get_header() + . = ..() + var/refid = REF(src) + . += {" +
    [VV_HREF_TARGETREF_1V(refid, VV_HK_BASIC_EDIT, "[ckey || "no ckey"]", NAMEOF(src, ckey))] / [VV_HREF_TARGETREF_1V(refid, VV_HK_BASIC_EDIT, "[real_name || "no real name"]", NAMEOF(src, real_name))] +
    + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getOrganLoss(ORGAN_SLOT_BRAIN)] + STAMINA:[getStaminaLoss()] + + "} diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm new file mode 100644 index 0000000000..e1b90716b6 --- /dev/null +++ b/code/modules/mob/living/living_active_block.dm @@ -0,0 +1,275 @@ +// Active directional block system. Shared code is in [living_blocking_parrying.dm] +/mob/living/proc/stop_active_blocking(was_forced = FALSE) + if(!(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))) + return FALSE + var/obj/item/I = active_block_item + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCKING | COMBAT_FLAG_ACTIVE_BLOCK_STARTING) + active_block_effect_end() + active_block_item = null + REMOVE_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) + REMOVE_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_BLOCK_TRAIT) + remove_movespeed_modifier(/datum/movespeed_modifier/active_block) + var/datum/block_parry_data/data = I.get_block_parry_data() + if(timeToNextMove() < data.block_end_click_cd_add) + changeNext_move(data.block_end_click_cd_add) + return TRUE + +/mob/living/proc/start_active_blocking(obj/item/I) + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) + return FALSE + if(!(I in held_items)) + return FALSE + var/datum/block_parry_data/data = I.get_block_parry_data() + if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened. + CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!") + combat_flags |= COMBAT_FLAG_ACTIVE_BLOCKING + active_block_item = I + if(data.block_lock_attacking) + ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) //probably should be something else at some point + if(data.block_lock_sprinting) + ADD_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_BLOCK_TRAIT) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/active_block, multiplicative_slowdown = data.block_slowdown) + active_block_effect_start() + return TRUE + +/// Visual effect setup for starting a directional block +/mob/living/proc/active_block_effect_start() + visible_message("[src] raises their [active_block_item], dropping into a defensive stance!") + animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_OUT) + +/// Visual effect cleanup for starting a directional block +/mob/living/proc/active_block_effect_end() + visible_message("[src] lowers their [active_block_item].") + animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN) + +/mob/living/proc/continue_starting_active_block() + if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + return DO_AFTER_STOP + return (combat_flags & COMBAT_FLAG_ACTIVE_BLOCK_STARTING)? DO_AFTER_CONTINUE : DO_AFTER_STOP + +/mob/living/get_standard_pixel_x_offset() + . = ..() + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) + if(dir & EAST) + . += 8 + if(dir & WEST) + . -= 8 + +/mob/living/get_standard_pixel_y_offset() + . = ..() + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) + if(dir & NORTH) + . += 8 + if(dir & SOUTH) + . -= 8 + +/** + * Proc called by keybindings to toggle active blocking. + */ +/mob/living/proc/keybind_toggle_active_blocking() + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) + return keybind_stop_active_blocking() + else + return keybind_start_active_blocking() + +/** + * Proc called by keybindings to start active blocking. + */ +/mob/living/proc/keybind_start_active_blocking() + if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) + return FALSE + if(!(combat_flags & COMBAT_FLAG_BLOCK_CAPABLE)) + to_chat(src, "You're not something that can actively block.") + return FALSE + // QOL: Instead of trying to just block with held item, grab first available item. + var/obj/item/I = find_active_block_item() + if(!I) + to_chat(src, "You can't block with your bare hands!") + return + if(!I.can_active_block()) + to_chat(src, "[I] is either not capable of being used to actively block, or is not currently in a state that can! (Try wielding it if it's twohanded, for example.)") + return + // QOL: Attempt to toggle on combat mode if it isn't already + SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE) + if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + to_chat(src, "You must be in combat mode to actively block!") + return FALSE + var/datum/block_parry_data/data = I.get_block_parry_data() + var/delay = data.block_start_delay + combat_flags |= COMBAT_FLAG_ACTIVE_BLOCK_STARTING + animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = delay, FALSE, SINE_EASING | EASE_IN) + if(!do_after_advanced(src, delay, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT, CALLBACK(src, .proc/continue_starting_active_block), MOBILITY_USE, null, null, I)) + to_chat(src, "You fail to raise [I].") + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) + animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW) + return + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) + start_active_blocking(I) + +/** + * Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE + */ +/mob/living/proc/find_active_block_item() + var/obj/item/held = get_active_held_item() + if(!held?.can_active_block()) + for(var/obj/item/I in held_items - held) + if(I.can_active_block()) + return I + return held + +/** + * Proc called by keybindings to stop active blocking. + */ +/mob/living/proc/keybind_stop_active_blocking() + combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) + stop_active_blocking(FALSE) + return TRUE + +/** + * Returns if we can actively block. + */ +/obj/item/proc/can_active_block() + return block_parry_data && (item_flags & ITEM_CAN_BLOCK) + +/** + * Calculates FINAL ATTACK DAMAGE after mitigation + */ +/obj/item/proc/active_block_calculate_final_damage(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + var/datum/block_parry_data/data = get_block_parry_data() + var/absorption = data.attack_type_list_scan(data.block_damage_absorption_override, attack_type) + var/efficiency = data.attack_type_list_scan(data.block_damage_multiplier_override, attack_type) + var/limit = data.attack_type_list_scan(data.block_damage_limit_override, attack_type) + // must use isnulls to handle 0's. + if(isnull(absorption)) + absorption = data.block_damage_absorption + if(isnull(efficiency)) + efficiency = data.block_damage_multiplier + if(isnull(limit)) + limit = data.block_damage_limit + // now we calculate damage to reduce. + var/final_damage = 0 + // apply limit + if(damage > limit) //clamp and apply overrun + final_damage += (damage - limit) + damage = limit + // apply absorption + damage -= min(absorption, damage) //this way if damage is less than absorption it 0's properly. + // apply multiplier to remaining + final_damage += (damage * efficiency) + return final_damage + +/// Amount of stamina from damage blocked. Note that the damage argument is damage_blocked. +/obj/item/proc/active_block_stamina_cost(mob/living/owner, atom/object, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + var/datum/block_parry_data/data = get_block_parry_data() + var/efficiency = data.attack_type_list_scan(data.block_stamina_efficiency_override, attack_type) + if(isnull(efficiency)) + efficiency = data.block_stamina_efficiency + var/multiplier = 1 + if(!CHECK_MOBILITY(owner, MOBILITY_STAND)) + multiplier = data.attack_type_list_scan(data.block_resting_stamina_penalty_multiplier_override, attack_type) + if(isnull(multiplier)) + multiplier = data.block_resting_stamina_penalty_multiplier + return (damage_blocked / efficiency) * multiplier + +/// Apply the stamina damage to our user, notice how damage argument is stamina_amount. +/obj/item/proc/active_block_do_stamina_damage(mob/living/owner, atom/object, stamina_amount, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + var/datum/block_parry_data/data = get_block_parry_data() + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + var/held_index = C.get_held_index_of_item(src) + var/obj/item/bodypart/BP = C.hand_bodyparts[held_index] + if(!BP?.body_zone) + return C.adjustStaminaLossBuffered(stamina_amount) //nah + var/zone = BP.body_zone + var/stamina_to_zone = data.block_stamina_limb_ratio * stamina_amount + var/stamina_to_chest = stamina_amount - stamina_to_zone + var/stamina_buffered = stamina_to_chest * data.block_stamina_buffer_ratio + stamina_to_chest -= stamina_buffered + C.apply_damage(stamina_to_zone, STAMINA, zone) + C.apply_damage(stamina_to_chest, STAMINA, BODY_ZONE_CHEST) + C.adjustStaminaLossBuffered(stamina_buffered) + else + owner.adjustStaminaLossBuffered(stamina_amount) + +/obj/item/proc/on_active_block(mob/living/owner, atom/object, damage, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + return + +/obj/item/proc/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + if(!can_active_block()) + return BLOCK_NONE + var/datum/block_parry_data/data = get_block_parry_data() + if(attack_type && !(attack_type & data.can_block_attack_types)) + return BLOCK_NONE + var/incoming_direction + if(isnull(override_direction)) + if(istype(object, /obj/item/projectile)) + var/obj/item/projectile/P = object + incoming_direction = angle2dir(P.Angle) + else + incoming_direction = get_dir(get_turf(attacker) || get_turf(object), src) + if(!CHECK_MOBILITY(owner, MOBILITY_STAND) && !(data.block_resting_attack_types_anydir & attack_type) && (!(data.block_resting_attack_types_directional & attack_type) || !can_block_direction(owner.dir, incoming_direction))) + return BLOCK_NONE + else if(!can_block_direction(owner.dir, incoming_direction)) + return BLOCK_NONE + block_return[BLOCK_RETURN_ACTIVE_BLOCK] = TRUE + var/final_damage = active_block_calculate_final_damage(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + var/damage_blocked = damage - final_damage + var/stamina_cost = active_block_stamina_cost(owner, object, damage_blocked, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + active_block_do_stamina_damage(owner, object, stamina_cost, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + block_return[BLOCK_RETURN_ACTIVE_BLOCK_DAMAGE_MITIGATED] = damage - final_damage + block_return[BLOCK_RETURN_SET_DAMAGE_TO] = final_damage + . = BLOCK_SHOULD_CHANGE_DAMAGE + if((final_damage <= 0) || (damage <= 0)) + . |= BLOCK_SUCCESS //full block + owner.visible_message("[owner] blocks \the [attack_text] with [src]!") + else + owner.visible_message("[owner] dampens \the [attack_text] with [src]!") + block_return[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE] = data.block_projectile_mitigation + if(length(data.block_sounds)) + playsound(loc, pickweight(data.block_sounds), 75, TRUE) + on_active_block(owner, object, damage, damage_blocked, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return, override_direction) + +/obj/item/proc/check_active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(!can_active_block()) + return + var/incoming_direction = get_dir(get_turf(attacker) || get_turf(object), src) + if(!can_block_direction(owner.dir, incoming_direction)) + return + block_return[BLOCK_RETURN_ACTIVE_BLOCK] = TRUE + block_return[BLOCK_RETURN_ACTIVE_BLOCK_DAMAGE_MITIGATED] = damage - active_block_calculate_final_damage(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + +/** + * Gets the block direction bitflags of what we can block. + */ +/obj/item/proc/blockable_directions() + var/datum/block_parry_data/data = get_block_parry_data() + return data.can_block_directions + +/** + * Checks if we can block from a specific direction from our direction. + * + * @params + * * our_dir - our direction. + * * their_dir - their direction. Must be a single direction, or NONE for an attack from the same tile. This is incoming direction. + */ +/obj/item/proc/can_block_direction(our_dir, their_dir) + their_dir = turn(their_dir, 180) + if(our_dir != NORTH) + var/turn_angle = dir2angle(our_dir) + // dir2angle(), ss13 proc is clockwise so dir2angle(EAST) == 90 + // turn(), byond proc is counterclockwise so turn(NORTH, 90) == WEST + their_dir = turn(their_dir, turn_angle) + return (DIR2BLOCKDIR(their_dir) & blockable_directions()) + +/** + * can_block_direction but for "compound" directions to check all of them and return the number of directions that were blocked. + * + * @params + * * our_dir - our direction. + * * their_dirs - list of their directions as we cannot use bitfields here. + */ +/obj/item/proc/can_block_directions_multiple(our_dir, list/their_dirs) + . = FALSE + for(var/i in their_dirs) + . |= can_block_direction(our_dir, i) diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm new file mode 100644 index 0000000000..50b51d4d95 --- /dev/null +++ b/code/modules/mob/living/living_active_parry.dm @@ -0,0 +1,332 @@ +// Active parry system goes in here. +/** + * Determines if we can actively parry. + */ +/obj/item/proc/can_active_parry() + return block_parry_data && (item_flags & ITEM_CAN_PARRY) + +/** + * Called from keybindings. + */ +/mob/living/proc/keybind_parry() + initiate_parry_sequence() + +/** + * Initiates a parrying sequence. + */ +/mob/living/proc/initiate_parry_sequence() + if(parrying) + return // already parrying + if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE)) + to_chat(src, "You are not something that can parry attacks.") + return + // Prioritize item, then martial art, then unarmed. + // yanderedev else if time + var/obj/item/using_item = get_active_held_item() + var/datum/block_parry_data/data + var/method + if(using_item?.can_active_parry()) + data = using_item.block_parry_data + method = ITEM_PARRY + else if(mind?.martial_art?.can_martial_parry) + data = mind.martial_art.block_parry_data + method = MARTIAL_PARRY + else if(combat_flags & COMBAT_FLAG_UNARMED_PARRY) + data = block_parry_data + method = UNARMED_PARRY + else + // QOL: If none of the above work, try to find another item. + var/obj/item/backup = find_backup_parry_item() + if(!backup) + to_chat(src, "You have nothing to parry with!") + return FALSE + data = backup.block_parry_data + using_item = backup + method = ITEM_PARRY + //QOL: Try to enable combat mode if it isn't already + SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE) + if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + to_chat(src, "You must be in combat mode to parry!") + return FALSE + data = return_block_parry_datum(data) + var/full_parry_duration = data.parry_time_windup + data.parry_time_active + data.parry_time_spindown + // no system in place to "fallback" if out of the 3 the top priority one can't parry due to constraints but something else can. + // can always implement it later, whatever. + if((data.parry_respect_clickdelay && (next_move > world.time)) || ((parry_end_time_last + data.parry_cooldown) > world.time)) + to_chat(src, "You are not ready to parry (again)!") + return + // Point of no return, make sure everything is set. + parrying = method + if(method == ITEM_PARRY) + active_parry_item = using_item + adjustStaminaLossBuffered(data.parry_stamina_cost) + parry_start_time = world.time + successful_parries = list() + addtimer(CALLBACK(src, .proc/end_parry_sequence), full_parry_duration) + if(data.parry_flags & PARRY_LOCK_ATTACKING) + ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_PARRY_TRAIT) + if(data.parry_flags & PARRY_LOCK_SPRINTING) + ADD_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_PARRY_TRAIT) + handle_parry_starting_effects(data) + return TRUE + +/** + * Tries to find a backup parry item. + * Does not look at active held item. + */ +/mob/living/proc/find_backup_parry_item() + for(var/obj/item/I in held_items - get_active_held_item()) + if(I.can_active_parry()) + return I + +/** + * Called via timer when the parry sequence ends. + */ +/mob/living/proc/end_parry_sequence() + if(!parrying) + return + REMOVE_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_PARRY_TRAIT) + REMOVE_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_PARRY_TRAIT) + if(parry_visual_effect) + QDEL_NULL(parry_visual_effect) + var/datum/block_parry_data/data = get_parry_data() + var/list/effect_text = list() + var/successful = FALSE + for(var/efficiency in successful_parries) + if(efficiency >= data.parry_efficiency_considered_successful) + successful = TRUE + break + if(!successful) // didn't parry anything successfully + if(data.parry_failed_stagger_duration) + Stagger(data.parry_failed_stagger_duration) + effect_text += "staggering themselves" + if(data.parry_failed_clickcd_duration) + changeNext_move(data.parry_failed_clickcd_duration) + effect_text += "throwing themselves off balance" + handle_parry_ending_effects(data, effect_text) + parrying = NOT_PARRYING + parry_start_time = 0 + parry_end_time_last = world.time + successful_parries = null + +/** + * Handles starting effects for parrying. + */ +/mob/living/proc/handle_parry_starting_effects(datum/block_parry_data/data) + playsound(src, data.parry_start_sound, 75, 1) + parry_visual_effect = new /obj/effect/abstract/parry/main(null, TRUE, src, data.parry_effect_icon_state, data.parry_time_windup_visual_override || data.parry_time_windup, data.parry_time_active_visual_override || data.parry_time_active, data.parry_time_spindown_visual_override || data.parry_time_spindown) + switch(parrying) + if(ITEM_PARRY) + visible_message("[src] swings [active_parry_item]!") + else + visible_message("[src] rushes forwards!") + +/** + * Handles ending effects for parrying. + */ +/mob/living/proc/handle_parry_ending_effects(datum/block_parry_data/data, list/failed_effect_text) + if(length(successful_parries)) + return + visible_message("[src] fails to connect their parry[failed_effect_text? ", [english_list(failed_effect_text)]" : ""]!") + +/** + * Gets this item's datum/block_parry_data + */ +/obj/item/proc/get_block_parry_data() + return return_block_parry_datum(block_parry_data) + +//Stubs. + +/** + * Called when an attack is parried using this, whether or not the parry was successful. + */ +/obj/item/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time) + +/** + * Called when an attack is parried innately, whether or not the parry was successful. + */ +/mob/living/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time) + +/** + * Called when an attack is parried using this, whether or not the parry was successful. + */ +/datum/martial_art/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, parry_efficiency, parry_time) + +/** + * Called when an attack is parried and block_parra_data indicates to use a proc to handle counterattack. + */ +/obj/item/proc/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) + +/** + * Called when an attack is parried and block_parra_data indicates to use a proc to handle counterattack. + */ +/mob/living/proc/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) + +/** + * Called when an attack is parried and block_parra_data indicates to use a proc to handle counterattack. + */ +/datum/martial_art/proc/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) + +/** + * Gets the stage of our parry sequence we're currently in. + */ +/mob/living/proc/get_parry_stage() + if(!parrying) + return NOT_PARRYING + var/datum/block_parry_data/data = get_parry_data() + var/windup_end = data.parry_time_windup + var/active_end = windup_end + data.parry_time_active + var/spindown_end = active_end + data.parry_time_spindown + var/current_time = get_parry_time() + // Not a switch statement because byond switch statements don't support floats at time of writing with "to" keyword. + if(current_time < 0) + return NOT_PARRYING + else if(current_time < windup_end) + return PARRY_WINDUP + else if(current_time <= active_end) // this uses <= on purpose, give a slight bit of advantage because time is rounded to world.tick_lag + return PARRY_ACTIVE + else if(current_time <= spindown_end) + return PARRY_SPINDOWN + else + return NOT_PARRYING + +/** + * Gets the current decisecond "frame" of an active parry. + */ +/mob/living/proc/get_parry_time() + return world.time - parry_start_time + +/// same return values as normal blocking, called with absolute highest priority in the block "chain". +/mob/living/proc/run_parry(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) + var/stage = get_parry_stage() + if(stage != PARRY_ACTIVE) + return BLOCK_NONE + var/datum/block_parry_data/data = get_parry_data() + if(attack_type && (!(attack_type & data.parry_attack_types) || (attack_type & ATTACK_TYPE_PARRY_COUNTERATTACK))) // if this attack is from a parry do not parry it lest we infinite loop. + return BLOCK_NONE + var/efficiency = data.get_parry_efficiency(attack_type, get_parry_time()) + switch(parrying) + if(ITEM_PARRY) + if(!active_parry_item.can_active_parry()) + return BLOCK_NONE + . = active_parry_item.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, get_parry_time()) + if(UNARMED_PARRY) + . = on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, get_parry_time()) + if(MARTIAL_PARRY) + . = mind.martial_art.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, get_parry_time()) + if(!isnull(return_list[BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY])) // one of our procs overrode + efficiency = return_list[BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY] + if(efficiency <= 0) // Do not allow automatically handled/standardized parries that increase damage for now. + return + . |= BLOCK_SHOULD_PARTIAL_MITIGATE + if(isnull(return_list[BLOCK_RETURN_MITIGATION_PERCENT])) // if one of the on_active_parry procs overrode. We don't have to worry about interference since parries are the first thing checked in the [do_run_block()] sequence. + return_list[BLOCK_RETURN_MITIGATION_PERCENT] = clamp(efficiency, 0, 100) // do not allow > 100% or < 0% for now. + if((return_list[BLOCK_RETURN_MITIGATION_PERCENT] >= 100) || (damage <= 0)) + . |= BLOCK_SUCCESS + var/list/effect_text + if(efficiency >= data.parry_efficiency_to_counterattack) + run_parry_countereffects(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency) + if(data.parry_flags & PARRY_DEFAULT_HANDLE_FEEDBACK) + handle_parry_feedback(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, effect_text) + successful_parries += efficiency + if(length(successful_parries) >= data.parry_max_attacks) + end_parry_sequence() + +/mob/living/proc/handle_parry_feedback(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency, list/effect_text) + var/datum/block_parry_data/data = get_parry_data() + if(data.parry_sounds) + playsound(src, pick(data.parry_sounds), 75) + visible_message("[src] parries \the [attack_text][length(effect_text)? ", [english_list(effect_text)] [attacker]" : ""]!") + +/// Run counterattack if any +/mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency) + if(!isliving(attacker)) + return + var/mob/living/L = attacker + var/datum/block_parry_data/data = get_parry_data() + var/list/effect_text = list() + // Always proc so items can override behavior easily + switch(parrying) + if(ITEM_PARRY) + active_parry_item.active_parry_reflex_counter(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, parry_efficiency, effect_text) + if(UNARMED_PARRY) + active_parry_reflex_counter(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, parry_efficiency, effect_text) + if(MARTIAL_PARRY) + mind.martial_art.active_parry_reflex_counter(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, parry_efficiency, effect_text) + if(Adjacent(attacker) || data.parry_data[PARRY_COUNTERATTACK_IGNORE_ADJACENCY]) + if(data.parry_data[PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN]) + switch(parrying) + if(ITEM_PARRY) + active_parry_item.melee_attack_chain(src, attacker, null, ATTACKCHAIN_PARRY_COUNTERATTACK, data.parry_data[PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN]) + effect_text += "reflexively counterattacking with [active_parry_item]" + if(UNARMED_PARRY) // WARNING: If you are using these two, the attackchain parry counterattack flags and damage multipliers are unimplemented. Be careful with how you handle this. + UnarmedAttack(attacker) + effect_text += "reflexively counterattacking in the process" + if(MARTIAL_PARRY) // Not well implemeneted, recommend custom implementation using the martial art datums. + UnarmedAttack(attacker) + effect_text += "reflexively maneuvering to retaliate" + if(data.parry_data[PARRY_DISARM_ATTACKER]) + L.drop_all_held_items() + effect_text += "disarming" + if(data.parry_data[PARRY_KNOCKDOWN_ATTACKER]) + L.DefaultCombatKnockdown(data.parry_data[PARRY_KNOCKDOWN_ATTACKER]) + effect_text += "knocking them to the ground" + if(data.parry_data[PARRY_STAGGER_ATTACKER]) + L.Stagger(data.parry_data[PARRY_STAGGER_ATTACKER]) + effect_text += "staggering" + if(data.parry_data[PARRY_DAZE_ATTACKER]) + L.Daze(data.parry_data[PARRY_DAZE_ATTACKER]) + effect_text += "dazing" + return effect_text + +/// Gets the datum/block_parry_data we're going to use to parry. +/mob/living/proc/get_parry_data() + if(parrying == ITEM_PARRY) + return active_parry_item.get_block_parry_data() + else if(parrying == UNARMED_PARRY) + return return_block_parry_datum(block_parry_data) + else if(parrying == MARTIAL_PARRY) + return return_block_parry_datum(mind.martial_art.block_parry_data) + +/// Effects +/obj/effect/abstract/parry + icon = 'icons/effects/block_parry.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = FLOAT_LAYER + plane = FLOAT_PLANE + vis_flags = VIS_INHERIT_LAYER|VIS_INHERIT_PLANE + /// The person we're on + var/mob/living/owner + +/obj/effect/abstract/parry/main + name = null + +/obj/effect/abstract/parry/main/Initialize(mapload, autorun, mob/living/owner, set_icon_state, windup, active, spindown) + . = ..() + icon_state = set_icon_state + if(owner) + attach_to(owner) + if(autorun) + INVOKE_ASYNC(src, .proc/run_animation, windup, active, spindown) + +/obj/effect/abstract/parry/main/Destroy() + detach_from(owner) + return ..() + +/obj/effect/abstract/parry/main/proc/attach_to(mob/living/attaching) + if(owner) + detach_from(owner) + owner = attaching + owner.vis_contents += src + +/obj/effect/abstract/parry/main/proc/detach_from(mob/living/detaching) + if(detaching == owner) + owner = null + detaching.vis_contents -= src + +/obj/effect/abstract/parry/main/proc/run_animation(windup_time = 2, active_time = 5, spindown_time = 3) + var/matrix/current = transform + transform = matrix(0.1, 0, 0, 0, 0.1, 0) + animate(src, transform = current, time = windup_time) + sleep(active_time) + animate(src, alpha = 0, spindown_time) diff --git a/code/modules/mob/living/living_block.dm b/code/modules/mob/living/living_block.dm new file mode 100644 index 0000000000..d32265e478 --- /dev/null +++ b/code/modules/mob/living/living_block.dm @@ -0,0 +1,106 @@ +// This file has a weird name, but it's for anything related to the checks for shields, blocking, dodging, +// and similar "stop this attack before it actually impacts the target" as opposed to "defend once it has hit". + +/** The actual proc for block checks. DO NOT USE THIS DIRECTLY UNLESS YOU HAVE VERY GOOD REASON TO. To reduce copypaste for differences between handling for real attacks and virtual checks. + * Automatically checks all held items for /obj/item/proc/run_block() with the same parameters. + * @params + * real_attack - If this attack is real. This one is quirky; If it's real, run_block is called. If it's not, check_block is called and none of the regular checks happen, and this is effectively only useful + * for populating return_list with blocking metadata. + * object - Whatever /atom is actually hitting us, in essence. For example, projectile if gun, item if melee, structure/whatever if it's a thrown, etc. + * damage - The nominal damage this would do if it was to hit. Obviously doesn't take into effect explosions/magic/similar things.. unless you implement it to raise the value. + * attack_text - The text that this attack should show, in the context of something like "[src] blocks [attack_text]!" + * attack_type - See __DEFINES/combat.dm - Attack types, to distinguish between, for example, someone throwing an item at us vs bashing us with it. + * armour_penetration - 0-100 value of how effectively armor penetrating the attack should be. + * attacker - Set to the mob attacking IF KNOWN. Do not expect this to always be set! + * def_zone - The zone this'll impact. + * return_list - If something wants to grab things from what items/whatever put into list/block_return on obj/item/run_block and the comsig, pass in a list so you can grab anything put in it after block runs. + * attack_direction - Direction of the attack. It is highly recommended to put this in, as the automatic guesswork that's done otherwise is quite inaccurate at times. + */ +/mob/living/proc/do_run_block(real_attack = TRUE, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), attack_direction) + if(real_attack) + . = run_parry(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) //Parry - Highest priority! + if((. & BLOCK_SUCCESS) && !(. & BLOCK_CONTINUE_CHAIN)) + return + // Component signal block runs have highest priority.. for now. + . = SEND_SIGNAL(src, COMSIG_LIVING_RUN_BLOCK, real_attack, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, attack_direction) + if((. & BLOCK_SUCCESS) && !(. & BLOCK_CONTINUE_CHAIN)) + return_list[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE] = 100 + return + var/list/obj/item/tocheck = get_blocking_items() + sortTim(tocheck, /proc/cmp_numeric_dsc, TRUE) + // i don't like this + var/block_chance_modifier = round(damage / -3) + if(real_attack) + for(var/obj/item/I in tocheck) + // i don't like this too + var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + var/results + if(I == active_block_item) + results = I.active_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list, attack_direction) + else + results = I.run_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list) + . |= results + if((results & BLOCK_SUCCESS) && !(results & BLOCK_CONTINUE_CHAIN)) + break + else + for(var/obj/item/I in tocheck) + // i don't like this too + var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + if(I == active_block_item) //block is long termed enough we give a damn. parry, not so much. + I.check_active_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list, attack_direction) + else + I.check_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list) + if(. & BLOCK_SUCCESS) + return_list[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE] = 100 + else if(isnull(return_list[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE])) + return_list[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE] = return_list[BLOCK_RETURN_MITIGATION_PERCENT] + +/// Gets an unsortedlist of objects to run block checks on. List must have associative values for priorities! +/mob/living/proc/get_blocking_items() + . = list() + if(active_block_item) + var/datum/block_parry_data/data = active_block_item.get_block_parry_data() + .[active_block_item] = data.block_active_priority + SEND_SIGNAL(src, COMSIG_LIVING_GET_BLOCKING_ITEMS, .) + for(var/obj/item/I in held_items) + // this is a bad check but i am not removing it until a better catchall is made + if(istype(I, /obj/item/clothing)) + continue + if(.[I]) //don't override block/parry. + continue + .[I] = I.block_priority + +/obj/item + /// The 0% to 100% chance for the default implementation of random block rolls. + var/block_chance = 0 + /// Block priority, higher means we check this higher in the "chain". + var/block_priority = BLOCK_PRIORITY_DEFAULT + +/// Runs block and returns flag for do_run_block to process. +/obj/item/proc/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + . = SEND_SIGNAL(src, COMSIG_ITEM_RUN_BLOCK, owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + if(. & BLOCK_SUCCESS) + return + if(prob(final_block_chance)) + owner.visible_message("[owner] blocks [attack_text] with [src]!", + "You block [attack_text] with [src]!") + return . | BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL + return . | BLOCK_NONE + +/// Returns block information using list/block_return. Used for check_block() on mobs. +/obj/item/proc/check_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + SEND_SIGNAL(src, COMSIG_ITEM_CHECK_BLOCK, owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + var/existing = block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] + block_return[BLOCK_RETURN_NORMAL_BLOCK_CHANCE] = max(existing || 0, final_block_chance) + +// HELPER PROCS + +/** + * Considers a block return_list and calculates damage to use from that. + */ +/proc/block_calculate_resultant_damage(damage, list/block_return) + if(!isnull(block_return[BLOCK_RETURN_SET_DAMAGE_TO])) // higher priority + return block_return[BLOCK_RETURN_SET_DAMAGE_TO] + else if(!isnull(block_return[BLOCK_RETURN_MITIGATION_PERCENT])) + return damage * ((100 - block_return[BLOCK_RETURN_MITIGATION_PERCENT]) * 0.01) + return damage diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm new file mode 100644 index 0000000000..9f1ad1c27a --- /dev/null +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -0,0 +1,310 @@ +// yell at me later for file naming +// This file contains stuff relating to the new directional blocking and parry system. +GLOBAL_LIST_EMPTY(block_parry_data) + +/proc/return_block_parry_datum(datum/block_parry_data/type_id_datum) + if(istype(type_id_datum)) + return type_id_datum + if(ispath(type_id_datum)) + . = GLOB.block_parry_data["[type_id_datum]"] + if(!.) + . = GLOB.block_parry_data["[type_id_datum]"] = new type_id_datum + else //text id + return GLOB.block_parry_data["[type_id_datum]"] + +/proc/set_block_parry_datum(id, datum/block_parry_data/data) + if(ispath(id)) + CRASH("Path-fetching of block parry data is only to grab static data, do not attempt to modify global caches of paths. Use string IDs.") + GLOB.block_parry_data["[id]"] = data + +/// Carries data like list data that would be a waste of memory if we initialized the list on every /item as we can cache datums easier. +/datum/block_parry_data + /////////// BLOCKING //////////// + + /// NOTE: FOR ATTACK_TYPE_DEFINE, you MUST wrap it in "[DEFINE_HERE]"! The defines are bitflags, and therefore, NUMBERS! + + /// See defines. Point of reference is someone facing north. + var/can_block_directions = BLOCK_DIR_NORTH | BLOCK_DIR_NORTHEAST | BLOCK_DIR_NORTHWEST + /// Attacks we can block + var/can_block_attack_types = ALL + /// Our slowdown added while blocking + var/block_slowdown = 1 + /// Clickdelay added to user after block ends + var/block_end_click_cd_add = 0 + /// Disallow attacking during block + var/block_lock_attacking = TRUE + /// Disallow sprinting during block + var/block_lock_sprinting = FALSE + /// The priority we get in [mob/do_run_block()] while we're being used to parry. + var/block_active_priority = BLOCK_PRIORITY_ACTIVE_BLOCK + /// Windup before we have our blocking active. + var/block_start_delay = 5 + + /// Amount of "free" damage blocking absorbs + var/block_damage_absorption = 10 + /// Override absorption, list("[ATTACK_TYPE_DEFINE]" = absorption), see [block_damage_absorption] + var/list/block_damage_absorption_override + + /// Ratio of damage to allow through above absorption and below limit. Multiplied by damage to determine how much to let through. Lower is better. + var/block_damage_multiplier = 0.5 + /// Override damage overrun efficiency, list("[ATTACK_TYPE_DEFINE]" = absorption), see [block_damage_efficiency] + var/list/block_damage_multiplier_override + + /// Upper bound of damage block, anything above this will go right through. + var/block_damage_limit = 80 + /// Override upper bound of damage block, list("[ATTACK_TYPE_DEFINE]" = absorption), see [block_damage_limit] + var/list/block_damage_limit_override + + /// The blocked variable of on_hit() on projectiles is impacted by this. Higher is better, 0 to 100, percentage. + var/block_projectile_mitigation = 50 + + /* + * NOTE: Overrides for attack types for most the block_stamina variables were removed, + * because at the time of writing nothing needed to use it. Add them if you need it, + * it should be pretty easy, just copy [active_block_damage_mitigation] + * for how to override with list. + */ + + /// Default damage-to-stamina coefficient, higher is better. This is based on amount of damage BLOCKED, not initial damage, to prevent damage from "double dipping". + var/block_stamina_efficiency = 2 + /// Override damage-to-stamina coefficient, see [block_efficiency], this should be list("[ATTACK_TYPE_DEFINE]" = coefficient_number) + var/list/block_stamina_efficiency_override + /// Ratio of stamina incurred by blocking that goes to the arm holding the object instead of the chest. Has no effect if this is not held in hand. + var/block_stamina_limb_ratio = 0.5 + /// Ratio of stamina incurred by chest (so after [block_stamina_limb_ratio] runs) that is buffered. + var/block_stamina_buffer_ratio = 1 + + /// Stamina dealt directly via adjustStaminaLossBuffered() per SECOND of block. + var/block_stamina_cost_per_second = 1.5 + + /// Bitfield for attack types that we can block while down. This will work in any direction. + var/block_resting_attack_types_anydir = ATTACK_TYPE_MELEE | ATTACK_TYPE_UNARMED | ATTACK_TYPE_TACKLE + /// Bitfield for attack types that we can block while down but only in our normal directions. + var/block_resting_attack_types_directional = ATTACK_TYPE_PROJECTILE | ATTACK_TYPE_THROWN + /// Multiplier to stamina damage taken for attacks blocked while downed. + var/block_resting_stamina_penalty_multiplier = 1.5 + /// Override list for multiplier to stamina damage taken for attacks blocked while down. list("[ATTACK_TYPE_DEFINE]" = multiplier_number) + var/list/block_resting_stamina_penalty_multiplier_override + + /// Sounds for blocking + var/list/block_sounds = list('sound/block_parry/block_metal1.ogg' = 1, 'sound/block_parry/block_metal1.ogg' = 1) + + /////////// PARRYING //////////// + /// Prioriry for [mob/do_run_block()] while we're being used to parry. + // None - Parry is always highest priority! + /// Parry doesn't work if you aren't able to otherwise attack due to clickdelay + var/parry_respect_clickdelay = TRUE + /// Parry stamina cost + var/parry_stamina_cost = 5 + /// Attack types we can block + var/parry_attack_types = ALL + /// Parry flags + var/parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING + + /// Parry windup duration in deciseconds. 0 to this is windup, afterwards is main stage. + var/parry_time_windup = 2 + /// Parry spindown duration in deciseconds. main stage end to this is the spindown stage, afterwards the parry fully ends. + var/parry_time_spindown = 3 + /// Main parry window in deciseconds. This is between [parry_time_windup] and [parry_time_spindown] + var/parry_time_active = 5 + // Visual overrides + /// If set, overrides visual duration of windup + var/parry_time_windup_visual_override + /// If set, overrides visual duration of active period + var/parry_time_active_visual_override + /// If set, overrides visual duration of spindown + var/parry_time_spindown_visual_override + /// Perfect parry window in deciseconds from the start of the main window. 3 with main 5 = perfect on third decisecond of main window. + var/parry_time_perfect = 2.5 + /// Time on both sides of perfect parry that still counts as part of the perfect window. + var/parry_time_perfect_leeway = 1 + /// [parry_time_perfect_leeway] override for attack types, list("[ATTACK_TYPE_DEFINE]" = deciseconds) + var/list/parry_time_perfect_leeway_override + /// Parry "efficiency" falloff in percent per decisecond once perfect window is over. + var/parry_imperfect_falloff_percent = 20 + /// [parry_imperfect_falloff_percent] override for attack types, list("[ATTACK_TYPE_DEFINE]" = deciseconds) + var/list/parry_imperfect_falloff_percent_override + /// Efficiency in percent on perfect parry. + var/parry_efficiency_perfect = 120 + /// Parry effect data. + var/list/parry_data = list( + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1 + ) + /// Efficiency must be at least this to be considered successful + var/parry_efficiency_considered_successful = 0.1 + /// Efficiency must be at least this to run automatic counterattack + var/parry_efficiency_to_counterattack = 0.1 + /// Maximum attacks to parry successfully or unsuccessfully (but not efficiency < 0) during active period, hitting this immediately ends the sequence. + var/parry_max_attacks = INFINITY + /// Visual icon state override for parrying + var/parry_effect_icon_state = "parry_bm_hold" + /// Parrying cooldown, separate of clickdelay. It must be this much deciseconds since their last parry for them to parry with this object. + var/parry_cooldown = 0 + /// Parry start sound + var/parry_start_sound = 'sound/block_parry/sfx-parry.ogg' + /// Sounds for parrying + var/list/parry_sounds = list('sound/block_parry/block_metal1.ogg' = 1, 'sound/block_parry/block_metal1.ogg' = 1) + /// Stagger duration post-parry if you fail to parry an attack + var/parry_failed_stagger_duration = 3.5 SECONDS + /// Clickdelay duration post-parry if you fail to parry an attack + var/parry_failed_clickcd_duration = 2 SECONDS + +/** + * Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag. + */ +/datum/block_parry_data/proc/attack_type_list_scan(list/L, attack_type) + var/total = 0 + var/div = 0 + for(var/flagtext in L) + if(attack_type & text2num(flagtext)) + total += L[flagtext] + div++ + // if none, return null. + if(!div) + return + return total/div //groan + + +/** + * Gets the percentage efficiency of our parry. + * + * Returns a percentage in normal 0 to 100 scale, but not clamped to just 0 to 100. + * This is a proc to allow for overriding. + * @params + * * attack_type - int, bitfield of the attack type(s) + * * parry_time - deciseconds since start of the parry. + */ +/datum/block_parry_data/proc/get_parry_efficiency(attack_type, parry_time) + var/difference = abs(parry_time - (parry_time_perfect + parry_time_windup)) + var/leeway = attack_type_list_scan(parry_time_perfect_leeway_override, attack_type) + if(isnull(leeway)) + leeway = parry_time_perfect_leeway + difference -= leeway + . = parry_efficiency_perfect + if(difference <= 0) + return + var/falloff = attack_type_list_scan(parry_imperfect_falloff_percent_override, attack_type) + if(isnull(falloff)) + falloff = parry_imperfect_falloff_percent + . -= falloff * difference + +#define RENDER_VARIABLE_SIMPLE(varname, desc) dat += "[#varname]
    [desc][varname]" +#define RENDER_OVERRIDE_LIST(varname, desc) \ + dat += "[#varname]
    [desc]"; \ + var/list/assembled__##varname = list(); \ + for(var/textbit in varname){ \ + assembled__##varname += "[GLOB.attack_type_names[textbit]] = [varname[textbit]]"; \ + } \ + dat += "[english_list(assembled__##varname)]"; +#define RENDER_ATTACK_TYPES(varname, desc) dat += "[#varname]
    [desc]"; \ + var/list/assembled__##varname = list(); \ + for(var/bit in bitfield2list(varname)){ \ + var/name = GLOB.attack_type_names[num2text(bit)]; \ + if(name){ \ + assembled__##varname += "[name]"; \ + } \ + } \ + dat += "[english_list(assembled__##varname)]"; +#define RENDER_BLOCK_DIRECTIONS(varname, desc) \ + dat += "[#varname]
    [desc]"; \ + var/list/assembled__##varname = list(); \ + for(var/bit in bitfield2list(varname)){ \ + var/name = GLOB.block_direction_names[num2text(bit)]; \ + if(name){ \ + assembled__##varname += "[name]"; \ + } \ + } \ + dat += "[english_list(assembled__##varname)]"; + +/datum/block_parry_data/Topic(href, href_list) + . = ..() + if(.) + return + if(href_list["render"]) + var/datum/browser/B = new(usr, REF(src), href_list["name"], 800, 1000) + B.set_content(render_html_readout(href_list["block"], href_list["parry"])) + B.open() + +/** + * Generates a HTML render of this datum for self-documentation + * Maybe make this tgui-next someday haha god this is ugly as sin. + * Does NOT include the popout or title or anything. Just the variables and explanations.. + */ +/datum/block_parry_data/proc/render_html_readout(block_data = FALSE, parry_data = FALSE) + var/list/dat = list() + if(block_data) + dat += "

    Block Stats

    " + RENDER_BLOCK_DIRECTIONS(can_block_directions, "Which directions this can block in.") + RENDER_ATTACK_TYPES(can_block_attack_types, "The kinds of attacks this can block.") + RENDER_VARIABLE_SIMPLE(block_slowdown, "How much slowdown is applied to the user while blocking. Lower is better.") + RENDER_VARIABLE_SIMPLE(block_end_click_cd_add, "How much click delay in deciseconds is applied to the user when blocking ends. Lower is better.") + RENDER_VARIABLE_SIMPLE(block_lock_attacking, "Whether or not (1 or 0) the user is locked from atacking and/or item usage while blocking.") + RENDER_VARIABLE_SIMPLE(block_active_priority, "The priority of this item in the block sequence. This will probably mean nothing to you unless you are a coder.") + RENDER_VARIABLE_SIMPLE(block_start_delay, "The amount of time in deciseconds it takes to start a block with this item. Lower is better.") + RENDER_VARIABLE_SIMPLE(block_damage_absorption, "The amount of damage that is absorbed by default. Higher is better.") + RENDER_OVERRIDE_LIST(block_damage_absorption_override, "Overrides for the above for each attack type") + RENDER_VARIABLE_SIMPLE(block_damage_multiplier, "Damage between absorption and limit is multiplied by this. Lower is better.") + RENDER_OVERRIDE_LIST(block_damage_multiplier_override, "Overrides for the above for each attack type") + RENDER_VARIABLE_SIMPLE(block_damage_limit, "Damage above this passes right through and is not impacted. Higher is better.") + RENDER_OVERRIDE_LIST(block_damage_limit_override, "Overrides for the above for each attack type.") + RENDER_VARIABLE_SIMPLE(block_stamina_efficiency, "Coefficient for stamina damage dealt to user by damage blocked. Higher is better.") + RENDER_OVERRIDE_LIST(block_stamina_efficiency_override, "Overrides for the above for each attack type.") + RENDER_VARIABLE_SIMPLE(block_stamina_limb_ratio, "The ratio of stamina that is applied to the limb holding this object (if applicable) rather than whole body/chest.") + RENDER_VARIABLE_SIMPLE(block_stamina_buffer_ratio, "The ratio of stamina incurred by chest/whole body that is buffered rather than direct (buffer = your stamina buffer, direct = direct stamina damage like from a disabler.)") + RENDER_VARIABLE_SIMPLE(block_stamina_cost_per_second, "The buffered stamina damage the user incurs per second of block. Lower is better.") + RENDER_ATTACK_TYPES(block_resting_attack_types_anydir, "The kinds of attacks you can block while resting/otherwise knocked to the floor from any direction. can_block_attack_types takes precedence.") + RENDER_ATTACK_TYPES(block_resting_attack_types_directional, "The kinds of attacks you can block wihle resting/otherwise knocked to the floor that are directional only. can_block_attack_types takes precedence.") + RENDER_VARIABLE_SIMPLE(block_resting_stamina_penalty_multiplier, "Multiplier to stamina damage incurred from blocking while downed. Lower is better.") + RENDER_OVERRIDE_LIST(block_resting_stamina_penalty_multiplier, "Overrides for the above for each attack type.") + dat += "
    Name/DescriptionValue
    " + if(parry_data) + dat += "

    Parry Stats

    " + RENDER_VARIABLE_SIMPLE(parry_respect_clickdelay, "Whether or not (1 or 0) you can only parry if your attack cooldown isn't in effect.") + RENDER_VARIABLE_SIMPLE(parry_stamina_cost, "Buffered stamina damage incurred by you for parrying with this.") + RENDER_ATTACK_TYPES(parry_attack_types, "Attack types you can parry.") + // parry_flags + dat += "" + RENDER_VARIABLE_SIMPLE(parry_time_windup, "Deciseconds of parry windup.") + RENDER_VARIABLE_SIMPLE(parry_time_spindown, "Deciseconds of parry spindown.") + RENDER_VARIABLE_SIMPLE(parry_time_active, "Deciseconds of active parry window - This is the ONLY time your parry is active.") + RENDER_VARIABLE_SIMPLE(parry_time_windup_visual_override, "Visual effect length override") + RENDER_VARIABLE_SIMPLE(parry_time_spindown_visual_override, "Visual effect length override") + RENDER_VARIABLE_SIMPLE(parry_time_active_visual_override, "Visual effect length override") + RENDER_VARIABLE_SIMPLE(parry_time_perfect, "Deciseconds into the active window considered the 'center' of the perfect period.") + RENDER_VARIABLE_SIMPLE(parry_time_perfect_leeway, "Leeway on both sides of the perfect period's center still considered perfect.") + RENDER_OVERRIDE_LIST(parry_time_perfect_leeway_override, "Override for the above for each attack type") + RENDER_VARIABLE_SIMPLE(parry_imperfect_falloff_percent, "Linear falloff in percent per decisecond for attacks parried outside of perfect window.") + RENDER_OVERRIDE_LIST(parry_imperfect_falloff_percent_override, "Override for the above for each attack type") + RENDER_VARIABLE_SIMPLE(parry_efficiency_perfect, "Efficiency in percentage a parry in the perfect window is considered.") + // parry_data + dat += "" + RENDER_VARIABLE_SIMPLE(parry_efficiency_considered_successful, "Minimum parry efficiency to be considered a successful parry.") + RENDER_VARIABLE_SIMPLE(parry_efficiency_to_counterattack, "Minimum parry efficiency to trigger counterattack effects.") + RENDER_VARIABLE_SIMPLE(parry_max_attacks, "Max attacks parried per parry cycle.") + RENDER_VARIABLE_SIMPLE(parry_effect_icon_state, "Parry effect image name") + RENDER_VARIABLE_SIMPLE(parry_cooldown, "Deciseconds it has to be since the last time a parry sequence ended for you before you can parry again.") + RENDER_VARIABLE_SIMPLE(parry_failed_stagger_duration, "Deciseconds you are staggered for at the of the parry sequence if you do not successfully parry anything.") + RENDER_VARIABLE_SIMPLE(parry_failed_clickcd_duration, "Deciseconds you are put on attack cooldown at the end of the parry sequence if you do not successfully parry anything.") + dat += "
    Name/DescriptionValue
    " + return dat.Join("") +#undef RENDER_VARIABLE_SIMPLE +#undef RENDER_OVERRIDE_LIST +#undef RENDER_ATTACK_TYPES +#undef RENDER_BLOCK_DIRECTIONS + +// MOB PROCS + +/** + * Called every life tick to handle blocking/parrying effects. + */ +/mob/living/proc/handle_block_parry(seconds = 1) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) + var/datum/block_parry_data/data = return_block_parry_datum(active_block_item.block_parry_data) + adjustStaminaLossBuffered(data.block_stamina_cost_per_second * seconds) + +/mob/living/on_item_dropped(obj/item/I) + if(I == active_block_item) + stop_active_blocking() + if(I == active_parry_item) + end_parry_sequence() + return ..() diff --git a/code/modules/mob/living/living_combat.dm b/code/modules/mob/living/living_combat.dm deleted file mode 100644 index 493f2ffdff..0000000000 --- a/code/modules/mob/living/living_combat.dm +++ /dev/null @@ -1,88 +0,0 @@ -/mob/living/ComponentInitialize() - . = ..() - RegisterSignal(src, SIGNAL_TRAIT(TRAIT_COMBAT_MODE_LOCKED), .proc/update_combat_lock) - -/mob/living/proc/update_combat_lock() - var/locked = HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) - var/desired = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) - var/actual = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) - if(actual) - if(locked) - disable_combat_mode(FALSE, TRUE, FALSE, FALSE) - else if(!desired) - disable_combat_mode(TRUE, TRUE, FALSE, FALSE) - else - if(desired && !locked) - enable_combat_mode(FALSE, TRUE, FALSE, FALSE) - update_combat_mode_icon() - -/mob/living/proc/disable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE) - if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - return - DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE) - SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_DISABLED, was_forced) - if(visible) - visible_message("[src] goes limp.", "Your muscles are forcibly relaxed!") - else if(!silent) - to_chat(src, was_forced? "Your muscles are forcibly relaxed!" : "You relax your muscles.") - if(update_icon) - update_combat_mode_icon() - -/mob/living/proc/enable_combat_mode(silent = TRUE, was_forced = FALSE, visible = FALSE, update_icon = TRUE) - if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) - return - ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_ACTIVE) - SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_ENABLED, was_forced) - if(visible) - visible_message("[src] drops into a combative stance!", "You drop into a combative stance!") - else if(!silent) - to_chat(src, was_forced? "Your muscles reflexively tighten!" : "You tighten your muscles.") - if(update_icon) - update_combat_mode_icon() - -/// Updates the combat mode HUD icon. -/mob/living/proc/update_combat_mode_icon() - var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory - T?.update_icon() - -/// Enables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible. -/mob/living/proc/enable_intentional_combat_mode(silent = TRUE, visible = FALSE) - if((combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - return - ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED) - if(!HAS_TRAIT(src, TRAIT_COMBAT_MODE_LOCKED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - enable_combat_mode(silent, FALSE, visible, FALSE) - update_combat_mode_icon() - client?.show_popup_menus = FALSE - return TRUE - -/// Disables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible. -/mob/living/proc/disable_intentional_combat_mode(silent = TRUE, visible = FALSE) - if(!(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) && !(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - return - DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_COMBAT_TOGGLED) - if(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) - disable_combat_mode(silent, FALSE, visible, FALSE) - update_combat_mode_icon() - client?.show_popup_menus = TRUE - return TRUE - -/// Toggles whether the user is intentionally in combat mode. THIS should be the proc you generally use! Has built in visual/to other player feedback, as well as an audible cue to ourselves. -/mob/living/proc/user_toggle_intentional_combat_mode(visible = TRUE) - var/old = (combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) - if(old) - disable_intentional_combat_mode() - playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above! - else if(CAN_TOGGLE_COMBAT_MODE(src)) - enable_intentional_combat_mode() - var/current = (combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) //because we could be locked - if(current != old) //only sound effect if you succeeded. Could have the feedback system be better but shrug, someone else can do it. - if(current) - playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! - if(visible) - if(world.time >= combatmessagecooldown) - combatmessagecooldown = world.time + 10 SECONDS - if(a_intent != INTENT_HELP) - visible_message("[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].") - else - visible_message("[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 27ecaf30d5..07252b4c45 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,7 +1,10 @@ -/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!") +/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE) var/armor = getarmor(def_zone, attack_flag) + if(silent) + return max(0, armor - armour_penetration) + //the if "armor" check is because this is used for everything on /living, including humans if(armor && armour_penetration) armor = max(0, armor - armour_penetration) @@ -36,117 +39,106 @@ /mob/living/proc/on_hit(obj/item/projectile/P) return BULLET_ACT_HIT -/mob/living/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) - var/block_chance_modifier = round(damage / -3) - for(var/obj/item/I in held_items) - if(!istype(I, /obj/item/clothing)) - var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example - if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return TRUE - return FALSE - -/mob/living/proc/check_reflect(def_zone) //Reflection checks for anything in your hands, based on the reflection chance of the object(s) - for(var/obj/item/I in held_items) - if(I.IsReflect(def_zone)) - return TRUE - return FALSE - -/mob/living/proc/reflect_bullet_check(obj/item/projectile/P, def_zone) - if(P.is_reflectable && check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message("The [P.name] gets reflected by [src]!", \ - "The [P.name] gets reflected by [src]!") - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x - var/new_angle_s = P.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - P.setAngle(new_angle_s) - return TRUE - return FALSE +/mob/living/proc/handle_projectile_attack_redirection(obj/item/projectile/P, redirection_mode, silent = FALSE) + P.ignore_source_check = TRUE + switch(redirection_mode) + if(REDIRECT_METHOD_DEFLECT) + P.setAngle(SIMPLIFY_DEGREES(P.Angle + rand(120, 240))) + if(!silent) + visible_message("[P] gets deflected by [src]!", \ + "You deflect [P]!") + if(REDIRECT_METHOD_REFLECT) + P.setAngle(SIMPLIFY_DEGREES(P.Angle + 180)) + if(!silent) + visible_message("[P] gets reflected by [src]!", \ + "You reflect [P]!") + if(REDIRECT_METHOD_PASSTHROUGH) + if(!silent) + visible_message("[P] passes through [src]!", \ + "[P] passes through you!") + return + if(REDIRECT_METHOD_RETURN_TO_SENDER) + if(!silent) + visible_message("[src] deflects [P] back at their attacker!", \ + "You deflect [P] back at your attacker!") + if(P.firer) + P.setAngle(Get_Angle(src, P.firer)) + else + P.setAngle(SIMPLIFY_DEGREES(P.Angle + 180)) + else + CRASH("Invalid rediretion mode [redirection_mode]") /mob/living/bullet_act(obj/item/projectile/P, def_zone) + var/totaldamage = P.damage + var/final_percent = 0 if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself - if(reflect_bullet_check(P, def_zone)) - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) - P.on_hit(src, 100, def_zone) + var/list/returnlist = list() + var/returned = mob_run_block(P, P.damage, "the [P.name]", ATTACK_TYPE_PROJECTILE, P.armour_penetration, P.firer, def_zone, returnlist) + final_percent = returnlist[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE] + if(returned & BLOCK_SHOULD_REDIRECT) + handle_projectile_attack_redirection(P, returnlist[BLOCK_RETURN_REDIRECT_METHOD]) + if(returned & BLOCK_REDIRECTED) + return BULLET_ACT_FORCE_PIERCE + if(returned & BLOCK_SUCCESS) + P.on_hit(src, final_percent, def_zone) return BULLET_ACT_BLOCK + totaldamage = block_calculate_resultant_damage(totaldamage, returnlist) var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) if(!P.nodamage) - apply_damage(P.damage, P.damage_type, def_zone, armor) + apply_damage(totaldamage, P.damage_type, def_zone, armor) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) - return P.on_hit(src, armor) ? BULLET_ACT_HIT : BULLET_ACT_BLOCK + var/missing = 100 - final_percent + var/armor_ratio = armor * 0.01 + if(missing > 0) + final_percent += missing * armor_ratio + return P.on_hit(src, final_percent, def_zone) ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone) return 0 /obj/item/proc/get_volume_by_throwforce_and_or_w_class() if(throwforce && w_class) - return CLAMP((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 + return clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 else if(w_class) - return CLAMP(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 + return clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 else return 0 /mob/living/proc/catch_item(obj/item/I, skip_throw_mode_check = FALSE) return FALSE -/mob/living/proc/embed_item(obj/item/I) - return - -/mob/living/proc/can_embed(obj/item/I) - return FALSE - /mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + // Throwingdatum can be null if someone had an accident() while slipping with an item in hand. var/obj/item/I var/throwpower = 30 if(isitem(AM)) I = AM throwpower = I.throwforce - if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK)) + var/impacting_zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest + var/list/block_return = list() + var/total_damage = I.throwforce + if(mob_run_block(AM, throwpower, "\the [AM.name]", ATTACK_TYPE_THROWN, 0, throwingdatum?.thrower, impacting_zone, block_return) & BLOCK_SUCCESS) hitpush = FALSE skipcatch = TRUE blocked = TRUE - else if(I && I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && can_embed(I, src) && prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && (!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) || incapacitated() || get_active_held_item())) - embed_item(I) - hitpush = FALSE - skipcatch = TRUE //can't catch the now embedded item + total_damage = block_calculate_resultant_damage(total_damage, block_return) if(I) + var/nosell_hit = SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, impacting_zone, throwingdatum, FALSE, blocked) + if(nosell_hit) + skipcatch = TRUE + hitpush = FALSE if(!skipcatch && isturf(I.loc) && catch_item(I)) return TRUE - var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE - var/volume = I.get_volume_by_throwforce_and_or_w_class() - SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, zone) + dtype = I.damtype - if (I.throwforce > 0) //If the weapon's throwforce is greater than zero... - if (I.throwhitsound) //...and throwhitsound is defined... - playsound(loc, I.throwhitsound, volume, 1, -1) //...play the weapon's throwhitsound. - else if(I.hitsound) //Otherwise, if the weapon's hitsound is defined... - playsound(loc, I.hitsound, volume, 1, -1) //...play the weapon's hitsound. - else if(!I.throwhitsound) //Otherwise, if throwhitsound isn't defined... - playsound(loc, 'sound/weapons/genhit.ogg',volume, 1, -1) //...play genhit.ogg. - - else if(!I.throwhitsound && I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero... - playsound(loc, 'sound/weapons/genhit.ogg', volume, 1, -1)//...play genhit.ogg - if(!I.throwforce)// Otherwise, if the item's throwforce is 0... - playsound(loc, 'sound/weapons/throwtap.ogg', 1, volume, -1)//...play throwtap.ogg. if(!blocked) visible_message("[src] has been hit by [I].", \ - "[src] has been hit by [I].") - var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) - apply_damage(I.throwforce, dtype, zone, armor) + "You have been hit by [I].") + var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration) + apply_damage(total_damage, dtype, impacting_zone, armor) if(I.thrownby) log_combat(I.thrownby, src, "threw and hit", I) else @@ -178,12 +170,15 @@ return updatehealth() visible_message("[M.name] has hit [src]!", \ - "[M.name] has hit [src]!", null, COMBAT_MESSAGE_RANGE) + "[M.name] has hit you!", null, COMBAT_MESSAGE_RANGE, null, + M.occupant, "You hit [src] with your [M.name]!") log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") else step_away(src,M) log_combat(M.occupant, src, "pushed", M) - visible_message("[M] pushes [src] out of the way.", null, null, 5) + visible_message("[M] pushes [src] out of the way.", \ + "[M] pushes you out of the way.", null, COMBAT_MESSAGE_RANGE, null, + M.occupant, "You push [src] out of the way with your [M.name].") /mob/living/fire_act() adjust_fire_stacks(3) @@ -193,17 +188,6 @@ if(user == anchored || !isturf(user.loc)) return FALSE - //pacifist vore check. - if(user.pulling && HAS_TRAIT(user, TRAIT_PACIFISM) && user.voremode) //they can only do heals, noisy guts, absorbing (technically not harm) - if(ismob(user.pulling)) - var/mob/P = user.pulling - if(src != user) - to_chat(user, "You can't risk digestion!") - return FALSE - else - user.vore_attack(user, P, user) - return - //normal vore check. if(user.pulling && user.grab_state == GRAB_AGGRESSIVE && user.voremode) if(ismob(user.pulling)) @@ -238,7 +222,8 @@ var/old_grab_state = user.grab_state var/grab_upgrade_time = instant ? 0 : 30 visible_message("[user] starts to tighten [user.p_their()] grip on [src]!", \ - "[user] starts to tighten [user.p_their()] grip on you!") + "[user] starts to tighten [user.p_their()] grip on you!", target = user, + target_message = "You start to tighten your grip on [src]!") switch(user.grab_state) if(GRAB_AGGRESSIVE) log_combat(user, src, "attempted to neck grab", addition="neck grab") @@ -256,36 +241,43 @@ var/add_log = "" if(HAS_TRAIT(user, TRAIT_PACIFISM)) visible_message("[user] has firmly gripped [src]!", - "[user] has firmly gripped you!") + "[user] has firmly gripped you!", target = user, + target_message = "You have firmly gripped [src]!") add_log = " (pacifist)" else visible_message("[user] has grabbed [src] aggressively!", \ - "[user] has grabbed you aggressively!") + "[user] has grabbed you aggressively!", target = user, \ + target_message = "You have grabbed [src] aggressively!") update_mobility() stop_pulling() log_combat(user, src, "grabbed", addition="aggressive grab[add_log]") if(GRAB_NECK) log_combat(user, src, "grabbed", addition="neck grab") visible_message("[user] has grabbed [src] by the neck!",\ - "[user] has grabbed you by the neck!") + "[user] has grabbed you by the neck!", target = user, \ + target_message = "You have grabbed [src] by the neck!") update_mobility() //we fall down if(!buckled && !density) Move(user.loc) if(GRAB_KILL) log_combat(user, src, "strangled", addition="kill grab") visible_message("[user] is strangling [src]!", \ - "[user] is strangling you!") + "[user] is strangling you!", target = user, \ + target_message = "You are strangling [src]!") update_mobility() //we fall down if(!buckled && !density) Move(user.loc) + user.set_pull_offsets(src, grab_state) return 1 /mob/living/attack_hand(mob/user) ..() //Ignoring parent return value here. SEND_SIGNAL(src, COMSIG_MOB_ATTACK_HAND, user) - if((user != src) && user.a_intent != INTENT_HELP && check_shields(user, 0, user.name, attack_type = UNARMED_ATTACK)) + if((user != src) && user.a_intent != INTENT_HELP && (mob_run_block(user, 0, user.name, ATTACK_TYPE_UNARMED | ATTACK_TYPE_MELEE, null, user, check_zone(user.zone_selected), null) & BLOCK_SUCCESS)) log_combat(user, src, "attempted to touch") - visible_message("[user] attempted to touch [src]!") + visible_message("[user] attempted to touch [src]!", + "[user] attempted to touch you!", target = user, + target_message = "You attempted to touch [src]!") return TRUE /mob/living/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) @@ -294,7 +286,7 @@ to_chat(user, "You don't want to hurt [src]!") return TRUE var/hulk_verb = pick("smash","pummel") - if(user != src && check_shields(user, 15, "the [hulk_verb]ing")) + if(user != src && (mob_run_block(user, 15, "the [hulk_verb]ing", ATTACK_TYPE_MELEE, null, user, check_zone(user.zone_selected), null) & BLOCK_SUCCESS)) return TRUE ..() return FALSE @@ -309,97 +301,113 @@ M.Feedstop() return // can't attack while eating! - if(HAS_TRAIT(src, TRAIT_PACIFISM)) + if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE var/damage = rand(5, 35) if(M.is_adult) damage = rand(20, 40) - if(check_shields(M, damage, "the [M.name]")) + var/list/block_return = list() + if(mob_run_block(M, damage, "the [M.name]", ATTACK_TYPE_MELEE, null, M, check_zone(M.zone_selected), block_return) & BLOCK_SUCCESS) return FALSE + damage = block_calculate_resultant_damage(damage, block_return) if (stat != DEAD) log_combat(M, src, "attacked") M.do_attack_animation(src) visible_message("The [M.name] glomps [src]!", \ - "The [M.name] glomps [src]!", null, COMBAT_MESSAGE_RANGE) + "The [M.name] glomps [src]!", null, COMBAT_MESSAGE_RANGE, null, + M, "You glomp [src]!") return TRUE /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) if(M.melee_damage_upper == 0) - M.visible_message("\The [M] [M.friendly] [src]!") - return FALSE + M.visible_message("\The [M] [M.friendly_verb_continuous] [src]!", + "You [M.friendly_verb_simple] [src]!", target = src, + target_message = "\The [M] [M.friendly_verb_continuous] you!") + return 0 else if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - if(check_shields(M, rand(M.melee_damage_lower, M.melee_damage_upper), "the [M.name]", MELEE_ATTACK, M.armour_penetration)) - return FALSE + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + var/list/return_list = list() + if(mob_run_block(M, damage, "the [M.name]", ATTACK_TYPE_MELEE, M.armour_penetration, M, check_zone(M.zone_selected), return_list) & BLOCK_SUCCESS) + return 0 + damage = block_calculate_resultant_damage(damage, return_list) if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) - visible_message("\The [M] [M.attacktext] [src]!", \ - "\The [M] [M.attacktext] [src]!", null, COMBAT_MESSAGE_RANGE) + visible_message("\The [M] [M.attack_verb_continuous] [src]!", \ + "\The [M] [M.attack_verb_continuous] you!", null, COMBAT_MESSAGE_RANGE, null, + M, "You [M.attack_verb_simple] [src]!") log_combat(M, src, "attacked") - return TRUE - + return damage /mob/living/attack_paw(mob/living/carbon/monkey/M) if (M.a_intent == INTENT_HARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - if(M.is_muzzled() || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) to_chat(M, "You can't bite with your mouth covered!") return FALSE - if(check_shields(M, 0, "the [M.name]")) + if(mob_run_block(M, 0, "the [M.name]", ATTACK_TYPE_MELEE | ATTACK_TYPE_UNARMED, 0, M, check_zone(M.zone_selected), null) & BLOCK_SUCCESS) return FALSE M.do_attack_animation(src, ATTACK_EFFECT_BITE) if (prob(75)) log_combat(M, src, "attacked") playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) + "[M.name] bites you!", null, COMBAT_MESSAGE_RANGE, null, + M, "You bite [src]!") return TRUE else visible_message("[M.name] has attempted to bite [src]!", \ - "[M.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE) + "[M.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE, null, + M, "You have attempted to bite [src]!") return FALSE /mob/living/attack_larva(mob/living/carbon/alien/larva/L) switch(L.a_intent) if(INTENT_HELP) - visible_message("[L.name] rubs its head against [src].") + visible_message("[L.name] rubs its head against [src].", + "[L.name] rubs its head against you.", target = L, \ + target_message = "You rub your head against [src].") return FALSE else if(HAS_TRAIT(L, TRAIT_PACIFISM)) to_chat(L, "You don't want to hurt anyone!") return FALSE - if(L != src && check_shields(L, rand(1, 3), "the [L.name]")) + if(L != src && (mob_run_block(L, rand(1, 3), "the [L.name]", ATTACK_TYPE_MELEE | ATTACK_TYPE_UNARMED, 0, L, check_zone(L.zone_selected), null) & BLOCK_SUCCESS)) return FALSE L.do_attack_animation(src) if(prob(90)) log_combat(L, src, "attacked") visible_message("[L.name] bites [src]!", \ - "[L.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) + "[L.name] bites you!", null, COMBAT_MESSAGE_RANGE, null, L, \ + "You bite [src]!") playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) return TRUE else visible_message("[L.name] has attempted to bite [src]!", \ - "[L.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE) + "[L.name] has attempted to bite you!", null, COMBAT_MESSAGE_RANGE, null, L, \ + "You have attempted to bite [src]!") /mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) - if((M != src) && M.a_intent != INTENT_HELP && check_shields(M, 0, "the [M.name]")) - visible_message("[M] attempted to touch [src]!") + if((M != src) && M.a_intent != INTENT_HELP && (mob_run_block(M, 0, "the [M.name]", ATTACK_TYPE_MELEE | ATTACK_TYPE_UNARMED, 0, M, check_zone(M.zone_selected), null) & BLOCK_SUCCESS)) + visible_message("[M] attempted to touch [src]!", + "[M] attempted to touch you!") return FALSE switch(M.a_intent) if (INTENT_HELP) if(!isalien(src)) //I know it's ugly, but the alien vs alien attack_alien behaviour is a bit different. - visible_message("[M] caresses [src] with its scythe like arm.") + visible_message("[M] caresses [src] with its scythe like arm.", + "[M] caresses you with its scythe like arm.", target = M, + target_message = "You caress [src] with your scythe like arm.") return FALSE if (INTENT_GRAB) grabbedby(M) @@ -427,21 +435,26 @@ take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1)) return 1 +///As the name suggests, this should be called to apply electric shocks. /mob/living/proc/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage, source, siemens_coeff, flags) - if((flags & SHOCK_TESLA) && (flags_1 & TESLA_IGNORE_1)) + shock_damage *= siemens_coeff + if((flags & SHOCK_TESLA) && HAS_TRAIT(src, TRAIT_TESLA_SHOCKIMMUNE)) return FALSE if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) return FALSE - if(shock_damage > 0) - if(!(flags & SHOCK_ILLUSION)) - adjustFireLoss(shock_damage) - visible_message( - "[src] was shocked by \the [source]!", \ - "You feel a powerful shock coursing through your body!", \ - "You hear a heavy electrical crack." \ - ) - return shock_damage + if(shock_damage < 1) + return FALSE + if(!(flags & SHOCK_ILLUSION)) + adjustFireLoss(shock_damage) + else + adjustStaminaLoss(shock_damage) + visible_message( + "[src] was shocked by \the [source]!", \ + "You feel a powerful shock coursing through your body!", \ + "You hear a heavy electrical crack." \ + ) + return shock_damage /mob/living/emp_act(severity) . = ..() @@ -520,4 +533,11 @@ if(!used_item) used_item = get_active_held_item() ..() - setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. + floating_need_update = TRUE + + +/mob/living/proc/getBruteLoss_nonProsthetic() + return getBruteLoss() + +/mob/living/proc/getFireLoss_nonProsthetic() + return getFireLoss() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 0b4be7d463..b037221e2c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -4,6 +4,11 @@ see_in_dark = 2 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,RAD_HUD) pressure_resistance = 10 + has_field_of_vision = TRUE + + typing_indicator_enabled = TRUE + + var/last_click_move = 0 // Stores the previous next_move value. var/resize = 1 //Badminnery resize var/lastattacker = null @@ -24,6 +29,26 @@ var/mobility_flags = MOBILITY_FLAGS_DEFAULT + // Combat - Blocking/Parrying system + /// Our block_parry_data for unarmed blocks/parries. Currently only used for parrying, as unarmed block isn't implemented yet. YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING! + var/datum/block_parry_data/block_parry_data = /datum/block_parry_data // defaults to *something* because [combat_flags] dictates whether or not we can unarmed block/parry. + // Blocking + /// The item the user is actively blocking with if any. + var/obj/item/active_block_item + // Parrying + /// Whether or not the user is in the middle of an active parry. Set to [UNARMED_PARRY], [ITEM_PARRY], [MARTIAL_PARRY] if parrying. + var/parrying = FALSE + /// The itme the user is currently parrying with, if any. + var/obj/item/active_parry_item + /// world.time of parry action start + var/parry_start_time = 0 + /// Current parry effect. + var/obj/effect/abstract/parry/parry_visual_effect + /// world.time of last parry end + var/parry_end_time_last = 0 + /// Successful parries within the current parry cycle. It's a list of efficiency percentages. + var/list/successful_parries + var/confused = 0 //Makes the mob move in random directions. var/hallucination = 0 //Directly affects how long a mob will hallucinate for @@ -98,8 +123,6 @@ var/datum/riding/riding_datum - var/datum/language/selected_default_language - var/last_words //used for database logging var/list/obj/effect/proc_holder/abilities = list() @@ -121,7 +144,7 @@ //// CITADEL STATION COMBAT //// /// See __DEFINES/combat.dm - var/combat_flags = COMBAT_FLAGS_STAMSYSTEM_EXEMPT + var/combat_flags = COMBAT_FLAGS_SPRINT_EXEMPT /// Next world.time when we will show a visible message on entering combat mode voluntarily again. var/combatmessagecooldown = 0 diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm index 49d4a20887..32038a6102 100644 --- a/code/modules/mob/living/living_mobility.dm +++ b/code/modules/mob/living/living_mobility.dm @@ -94,11 +94,13 @@ if(should_be_lying) mobility_flags &= ~MOBILITY_STAND + setMovetype(movement_type | CRAWLING) if(!lying) //force them on the ground lying = pick(90, 270) if(has_gravity() && !buckled) playsound(src, "bodyfall", 20, 1) else + setMovetype(movement_type & ~CRAWLING) mobility_flags |= MOBILITY_STAND lying = 0 @@ -161,8 +163,8 @@ if(!has_legs && has_arms < 2) limbless_slowdown += 6 - (has_arms * 3) if(limbless_slowdown) - add_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=limbless_slowdown, blacklisted_movetypes = FLYING|FLOATING) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown) else - remove_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/limbless) return mobility_flags diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index ec291094fe..71bcef9aca 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -1,10 +1,23 @@ /mob/living/Moved() . = ..() update_turf_movespeed(loc) - if(is_shifted) - is_shifted = FALSE - pixel_x = get_standard_pixel_x_offset(lying) - pixel_y = get_standard_pixel_y_offset(lying) + //Hide typing indicator if we move. + clear_typing_indicator() + update_pixel_shifting(TRUE) + +/mob/living/setDir(newdir, ismousemovement) + . = ..() + if(ismousemovement) + update_pixel_shifting() + +/mob/living/proc/update_pixel_shifting(moved = FALSE) + if(combat_flags & COMBAT_FLAG_ACTIVE_BLOCKING) + animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, flags = ANIMATION_END_NOW) + else if(moved) + if(is_shifted) + is_shifted = FALSE + pixel_x = get_standard_pixel_x_offset(lying) + pixel_y = get_standard_pixel_y_offset(lying) /mob/living/CanPass(atom/movable/mover, turf/target) if((mover.pass_flags & PASSMOB)) @@ -36,38 +49,26 @@ sprint_stamina_cost = CONFIG_GET(number/movedelay/sprint_stamina_cost) return ..() -/mob/living/movement_delay(ignorewalk = 0) - . = ..() - if(!CHECK_MOBILITY(src, MOBILITY_STAND)) - . += 6 - /// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc. /mob/living/proc/can_move_under_living(mob/living/other) return !density /mob/living/proc/update_move_intent_slowdown() - var/mod = 0 - if(m_intent == MOVE_INTENT_WALK) - mod = CONFIG_GET(number/movedelay/walk_delay) - else - mod = CONFIG_GET(number/movedelay/run_delay) - if(!isnum(mod)) - mod = 1 - add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod) + add_movespeed_modifier((m_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) /mob/living/proc/update_turf_movespeed(turf/open/T) - if(isopenturf(T) && !is_flying()) - add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown) + if(isopenturf(T)) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown) else - remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD) + remove_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown) /mob/living/proc/update_pull_movespeed() if(pulling && isliving(pulling)) var/mob/living/L = pulling if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE) - add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bulky_drag, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) return - remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) + remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag) /mob/living/canZMove(dir, turf/target) return can_zTravel(target, dir) && (movement_type & FLYING) @@ -87,8 +88,12 @@ . = ..() - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1 && (pulledby != moving_from_pull))//separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() + else + if(isliving(pulledby)) + var/mob/living/L = pulledby + L.set_pull_offsets(src, pulledby.grab_state) if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE))) active_storage.close(src) @@ -96,6 +101,14 @@ if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) + +/mob/living/Move_Pulled(atom/A) + . = ..() + if(!. || !isliving(A)) + return + var/mob/living/L = A + set_pull_offsets(L, grab_state) + /mob/living/forceMove(atom/destination) stop_pulling() if(buckled) diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm index 55d5f3320c..dc0f6d2767 100644 --- a/code/modules/mob/living/living_sprint.dm +++ b/code/modules/mob/living/living_sprint.dm @@ -33,7 +33,7 @@ update_sprint_icon() /mob/living/proc/disable_sprint_mode(update_icon = TRUE) - if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) + if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) || (combat_flags & COMBAT_FLAG_SPRINT_FORCED)) return DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE) if(update_icon) @@ -51,6 +51,8 @@ /mob/living/proc/disable_intentional_sprint_mode() if(!(combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) return + if(combat_flags & COMBAT_FLAG_SPRINT_FORCED) + return DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED) if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) disable_sprint_mode(FALSE) @@ -59,6 +61,9 @@ /mob/living/proc/user_toggle_intentional_sprint_mode() var/old = (combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) if(old) + if(combat_flags & COMBAT_FLAG_SPRINT_FORCED) + to_chat(src, "You are unable to stop sprinting!") + return disable_intentional_sprint_mode() if((m_intent == MOVE_INTENT_RUN) && CHECK_ALL_MOBILITY(src, MOBILITY_STAND|MOBILITY_MOVE)) playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index e0bd8a16b3..931f87eb7c 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -23,5 +23,5 @@ if(ranged_ability) ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!") - if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing. + if((vore_flags & VORE_INIT) && !(vore_flags & VOREPREF_INIT)) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing. copy_from_prefs_vr() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 35b49cce8e..6caf96fedc 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/datum/language/message_language = get_message_language(message) if(message_language) // No, you cannot speak in xenocommon just because you know the key - if(can_speak_in_language(message_language)) + if(can_speak_language(message_language)) language = message_language message = copytext_char(message, 3) @@ -141,7 +141,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( message = trim_left(message) if(!language) - language = get_default_language() + language = get_selected_language() // Detection of language needs to be before inherent channels, because // AIs use inherent channels for the holopad. Most inherent channels @@ -237,6 +237,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( deaf_message = "You can't hear yourself!" deaf_type = 2 // Since you should be able to hear yourself without looking + // Create map text prior to modifying message for goonchat + if (client?.prefs.chat_on_map && stat != UNCONSCIOUS && (client.prefs.see_chat_non_mob || ismob(speaker)) && can_hear()) + create_chat_message(speaker, message_language, raw_message, spans, message_mode) + // Recompose message for AI hrefs, language incomprehension. message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) @@ -289,7 +293,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( //speech bubble var/list/speech_bubble_recipients = list() for(var/mob/M in listening) - if(M.client) + if(M.client && !M.client.prefs.chat_on_map) speech_bubble_recipients.Add(M.client) var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA @@ -354,7 +358,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(cultslurring) message = cultslur(message) - + if(clockcultslurring) message = CLOCK_CULT_SLUR(message) @@ -411,11 +415,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced) -/mob/living/get_language_holder(shadow=TRUE) - if(mind && shadow) - // Mind language holders shadow mob holders. - . = mind.get_language_holder() - if(.) - return . - +/mob/living/get_language_holder(get_minds = TRUE) + if(get_minds && mind) + return mind.get_language_holder() . = ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 6b4a6645e6..aab741edd6 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -28,6 +28,7 @@ sec_hud = DATA_HUD_SECURITY_BASIC d_hud = DATA_HUD_DIAGNOSTIC_ADVANCED mob_size = MOB_SIZE_LARGE + has_field_of_vision = FALSE //Vision through cameras. var/list/network = list("ss13") var/obj/machinery/camera/current var/list/connected_robots = list() @@ -284,8 +285,6 @@ . = ..() var/turf/ai = get_turf(src) var/turf/target = get_turf(A) - if (.) - return if(!target) return @@ -695,7 +694,7 @@ holo_icon = client.prefs.get_filtered_holoform(HOLOFORM_FILTER_AI) else holo_icon = getHologramIcon(icon('icons/mob/ai.dmi', "female")) - else if("xeno queen") + if("xeno queen") holo_icon = getHologramIcon(icon(icon_list[input],"alienq")) else holo_icon = getHologramIcon(icon(icon_list[input], input)) @@ -822,21 +821,21 @@ return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5) /mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode) + var/treated_message = lang_treat(speaker, message_language, raw_message, spans, message_mode) var/start = "Relayed Speech: " var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" var/hrefpart = "" - var/jobpart + var/jobpart = "Unknown" if (iscarbon(speaker)) var/mob/living/carbon/S = speaker if(S.job) jobpart = "[S.job]" - else - jobpart = "Unknown" - var/rendered = "[start][hrefpart][namepart] ([jobpart]) [raw_message]" + var/rendered = "[start][hrefpart][namepart] ([jobpart]) [treated_message]" + if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker))) + create_chat_message(speaker, message_language, raw_message, spans, message_mode) show_message(rendered, MSG_AUDIBLE) /mob/living/silicon/ai/fully_replace_character_name(oldname,newname) @@ -868,30 +867,33 @@ light_cameras() if(istype(A, /obj/machinery/camera)) current = A - if(client) - if(ismovableatom(A)) - if(A != GLOB.ai_camera_room_landmark) - end_multicam() - client.perspective = EYE_PERSPECTIVE - client.eye = A - else + if(!client) + return + if(ismovable(A)) + if(A != GLOB.ai_camera_room_landmark) end_multicam() - if(isturf(loc)) - if(eyeobj) - client.eye = eyeobj - client.perspective = EYE_PERSPECTIVE - else - client.eye = client.mob - client.perspective = MOB_PERSPECTIVE - else + client.perspective = EYE_PERSPECTIVE + client.eye = A + else + end_multicam() + if(isturf(loc)) + if(eyeobj) + client.eye = eyeobj client.perspective = EYE_PERSPECTIVE - client.eye = loc - update_sight() - if(client.eye != src) - var/atom/AT = client.eye - AT.get_remote_view_fullscreens(src) + else + client.eye = client.mob + client.perspective = MOB_PERSPECTIVE else - clear_fullscreen("remote_view", 0) + client.perspective = EYE_PERSPECTIVE + client.eye = loc + update_sight() + if(client.eye != src) + var/atom/AT = client.eye + AT.get_remote_view_fullscreens(src) + else + clear_fullscreen("remote_view", 0) + SEND_SIGNAL(src, COMSIG_MOB_RESET_PERSPECTIVE, A) + return TRUE /mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0) . = ..() @@ -1016,7 +1018,7 @@ if("Yes.") src.ghostize(FALSE, penalize = TRUE) var/announce_rank = "Artificial Intelligence," - if(GLOB.announcement_systems.len) + if(GLOB.announcement_systems.len) // Sends an announcement the AI has cryoed. var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) announcer.announce("CRYOSTORAGE", src.real_name, announce_rank, list()) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 2bcb3c9b5a..9cefa7a12f 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone) +/mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone, attackchain_flags = NONE, damage_multiplier = 1) . = ..() if(!.) return FALSE diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 1147042c8c..4f2332e99d 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -3,48 +3,48 @@ #define POWER_RESTORATION_SEARCH_APC 2 #define POWER_RESTORATION_APC_FOUND 3 -/mob/living/silicon/ai/Life() - if (stat == DEAD) +/mob/living/silicon/ai/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - else //I'm not removing that shitton of tabs, unneeded as they are. -- Urist + //I'm not removing that shitton of tabs, unneeded as they are. -- Urist //Being dead doesn't mean your temperature never changes - update_gravity(mob_has_gravity()) + update_gravity(mob_has_gravity()) - handle_status_effects() + handle_status_effects() - if(malfhack && malfhack.aidisabled) - deltimer(malfhacking) - // This proc handles cleanup of screen notifications and - // messenging the client - malfhacked(malfhack) + if(malfhack && malfhack.aidisabled) + deltimer(malfhacking) + // This proc handles cleanup of screen notifications and + // messenging the client + malfhacked(malfhack) - if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) - view_core() + if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) + view_core() - if(machine) - machine.check_eye(src) + if(machine) + machine.check_eye(src) - // Handle power damage (oxy) - if(aiRestorePowerRoutine) - // Lost power - adjustOxyLoss(1) - else - // Gain Power - if(getOxyLoss()) - adjustOxyLoss(-1) + // Handle power damage (oxy) + if(aiRestorePowerRoutine) + // Lost power + adjustOxyLoss(1) + else + // Gain Power + if(getOxyLoss()) + adjustOxyLoss(-1) - if(!lacks_power()) - var/area/home = get_area(src) - if(home.powered(EQUIP)) - home.use_power(1000, EQUIP) + if(!lacks_power()) + var/area/home = get_area(src) + if(home.powered(EQUIP)) + home.use_power(1000, EQUIP) - if(aiRestorePowerRoutine >= POWER_RESTORATION_SEARCH_APC) - ai_restore_power() - return + if(aiRestorePowerRoutine >= POWER_RESTORATION_SEARCH_APC) + ai_restore_power() + return - else if(!aiRestorePowerRoutine) - ai_lose_power() + else if(!aiRestorePowerRoutine) + ai_lose_power() /mob/living/silicon/ai/proc/lacks_power() var/turf/T = get_turf(src) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 4a76eafc53..2b5d3d98f2 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -171,10 +171,3 @@ #undef VOX_DELAY #endif - -/mob/living/silicon/ai/could_speak_in_language(datum/language/dt) - if(is_servant_of_ratvar(src)) - // Ratvarian AIs can only speak Ratvarian - . = ispath(dt, /datum/language/ratvar) - else - . = ..() diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 91a6709bc9..2a03afb61a 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE) +/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) return 0 diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 26fa3b505d..704a23b8db 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -146,15 +146,16 @@ if(possible_chassis[chassis]) AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', ITEM_SLOT_HEAD) -/mob/living/silicon/pai/Life() +/mob/living/silicon/pai/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(hacking) process_hack() - return ..() /mob/living/silicon/pai/proc/process_hack() if(cable && cable.machine && istype(cable.machine, /obj/machinery/door) && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) - hackprogress = CLAMP(hackprogress + 4, 0, 100) + hackprogress = clamp(hackprogress + 4, 0, 100) else temp = "Door Jack: Connection to airlock has been lost. Hack aborted." hackprogress = 0 @@ -273,26 +274,28 @@ /mob/living/silicon/pai/Process_Spacemove(movement_dir = 0) . = ..() if(!.) - add_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE, 100, multiplicative_slowdown = 2) + add_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk) return TRUE - remove_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/pai_spacewalk) return TRUE /mob/living/silicon/pai/examine(mob/user) . = ..() . += "A personal AI in holochassis mode. Its master ID string seems to be [master]." -/mob/living/silicon/pai/Life() - if(stat == DEAD) - return +/mob/living/silicon/pai/PhysicalLife() + . = ..() if(cable) if(get_dist(src, cable) > 1) var/turf/T = get_turf(src.loc) T.visible_message("[src.cable] rapidly retracts back into its spool.", "You hear a click and the sound of wire spooling rapidly.") qdel(src.cable) cable = null + +/mob/living/silicon/pai/BiologicalLife() + if(!(. = ..())) + return silent = max(silent - 1, 0) - . = ..() /mob/living/silicon/pai/updatehealth() if(status_flags & GODMODE) @@ -301,7 +304,7 @@ update_stat() /mob/living/silicon/pai/process() - emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) + emitterhealth = clamp((emitterhealth + emitterregen), -50, emittermaxhealth) /obj/item/paicard/attackby(obj/item/W, mob/user, params) ..() diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 0477492c0a..dcb7ac66c9 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -32,22 +32,28 @@ /mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user) switch(user.a_intent) if(INTENT_HELP) - visible_message("[user] gently pats [src] on the head, eliciting an off-putting buzzing from its holographic field.") + visible_message("[user] gently pats [src] on the head, eliciting an off-putting buzzing from its holographic field.", + "[user] gently pats you on the head, eliciting an off-putting buzzing from your holographic field.", target = user, + target_message = "You gently pat [src] on the head, eliciting an off-putting buzzing from its holographic field.") if(INTENT_DISARM) - visible_message("[user] boops [src] on the head!") + visible_message("[user] boops [src] on the head!", + "[user] boops you on the head!", target = user, + target_message = "You boop [src] on the head!") if(INTENT_HARM) user.do_attack_animation(src) if (user.name == master) visible_message("Responding to its master's touch, [src] disengages its holochassis emitter, rapidly losing coherence.") - spawn(10) - fold_in() - if(user.put_in_hands(card)) - user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.") + fold_in() + if(user.put_in_hands(card)) + user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.", + "You promptly scoops up your pAI's card.") else if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to hurt [src]!") return - visible_message("[user] stomps on [src]!.") + visible_message("[user] stomps on [src]!.", + "[user] stomps on you!.", target = user, + target_message = "You stomp on [src]!.") take_holo_damage(2) else grabbedby(user) @@ -69,7 +75,7 @@ return FALSE //No we're not flammable /mob/living/silicon/pai/proc/take_holo_damage(amount) - emitterhealth = CLAMP((emitterhealth - amount), -50, emittermaxhealth) + emitterhealth = clamp((emitterhealth - amount), -50, emittermaxhealth) if(emitterhealth < 0) fold_in(force = TRUE) if(amount > 0) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 810dd778de..76ced767e8 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -267,9 +267,8 @@ if(href_list["toggle"]) encryptmod = TRUE if("translator") - if(href_list["toggle"]) - grant_all_languages(TRUE) - // this is PERMAMENT. + if(href_list["toggle"]) //This is permanent. + grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE) if("doorjack") if(href_list["jack"]) if(cable && cable.machine) @@ -283,9 +282,7 @@ T.visible_message("A port on [src] opens to reveal [cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.") if("loudness") if(subscreen == 1) // Open Instrument - internal_instrument.interact(src) - if(subscreen == 2) // Change Instrument type - internal_instrument.selectInstrument() + internal_instrument.ui_interact(src) //updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window paiInterface() // So we'll just call the update directly rather than doing some default checks diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index cf67517c52..0feb8b98b7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,9 +1,6 @@ -/mob/living/silicon/robot/Life() - set invisibility = 0 - if (src.notransform) +/mob/living/silicon/robot/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - - ..() adjustOxyLoss(-10) //we're a robot! handle_robot_hud_updates() handle_robot_cell() @@ -21,7 +18,7 @@ if(cell && cell.charge) if(cell.charge <= 100) uneq_all() - var/amt = CLAMP((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. + var/amt = clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick else uneq_all() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4ef5993d2d..633135b3d2 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -3,122 +3,7 @@ real_name = "Cyborg" icon = 'icons/mob/robots.dmi' icon_state = "robot" - maxHealth = 100 - health = 100 bubble_icon = "robot" - designation = "Default" //used for displaying the prefix & getting the current module of cyborg - has_limbs = 1 - hud_type = /datum/hud/robot - - blocks_emissive = EMISSIVE_BLOCK_UNIQUE - - var/custom_name = "" - var/braintype = "Cyborg" - var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of.. - var/obj/item/mmi/mmi = null - - var/shell = FALSE - var/deployed = FALSE - var/mob/living/silicon/ai/mainframe = null - var/datum/action/innate/undeployment/undeployment_action = new - -//Hud stuff - - var/obj/screen/inv1 = null - var/obj/screen/inv2 = null - var/obj/screen/inv3 = null - var/obj/screen/lamp_button = null - var/obj/screen/thruster_button = null - var/obj/screen/hands = null - - var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not - var/obj/screen/robot_modules_background - -//3 Modules can be activated at any one time. - var/obj/item/robot_module/module = null - var/obj/item/module_active = null - held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do! - - var/mutable_appearance/eye_lights - - var/mob/living/silicon/ai/connected_ai = null - var/obj/item/stock_parts/cell/cell = null - - var/opened = 0 - var/emagged = FALSE - var/emag_cooldown = 0 - var/wiresexposed = 0 - - var/ident = 0 - var/locked = TRUE - var/list/req_access = list(ACCESS_ROBOTICS) - - var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) - - var/speed = 0 // VTEC speed boost. - var/magpulse = FALSE // Magboot-like effect. - var/ionpulse = FALSE // Jetpack-like effect. - var/ionpulse_on = FALSE // Jetpack-like effect. - var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect. - - var/low_power_mode = 0 //whether the robot has no charge left. - var/datum/effect_system/spark_spread/spark_system // So they can initialize sparks whenever/N - - var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default - var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. - var/locked_down //Boolean of whether the borg is locked down or not - - var/toner = 0 - var/tonermax = 40 - - var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting. - var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. - light_color = "#FFCC66" - light_power = 0.8 - var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. - - var/sight_mode = 0 - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) - - var/list/upgrades = list() - - var/hasExpanded = FALSE - var/obj/item/hat - var/hat_offset = -3 - var/list/equippable_hats = list(/obj/item/clothing/head/caphat, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/head/centhat, - /obj/item/clothing/head/HoS, - /obj/item/clothing/head/beret, - /obj/item/clothing/head/kitty, - /obj/item/clothing/head/hopcap, - /obj/item/clothing/head/wizard, - /obj/item/clothing/head/nursehat, - /obj/item/clothing/head/sombrero, - /obj/item/clothing/head/helmet/chaplain/witchunter_hat, - /obj/item/clothing/head/soft/, //All baseball caps - /obj/item/clothing/head/that, //top hat - /obj/item/clothing/head/collectable/tophat, //Not sure where this one is found, but it looks the same so might as well include - /obj/item/clothing/mask/bandana/, //All bandanas (which only work in hat mode) - /obj/item/clothing/head/fedora, - /obj/item/clothing/head/beanie/, //All beanies - /obj/item/clothing/ears/headphones, - /obj/item/clothing/head/helmet/skull, - /obj/item/clothing/head/crown/fancy) - - can_buckle = TRUE - buckle_lying = FALSE - var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human) - - var/sitting = 0 - var/bellyup = 0 - var/dogborg = FALSE - - var/cansprint = 1 - - var/orebox = null - -/mob/living/silicon/robot /mob/living/silicon/robot/get_cell() return cell @@ -129,7 +14,7 @@ spark_system.attach(src) wires = new /datum/wires/robot(src) - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) robot_modules_background = new() robot_modules_background.icon_state = "block" @@ -237,7 +122,7 @@ return if(!CONFIG_GET(flag/disable_secborg) && GLOB.security_level < CONFIG_GET(number/minimum_secborg_alert)) - to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [num2seclevel(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.") + to_chat(src, "NOTICE: Due to local station regulations, the security cyborg module and its variants are only available during [NUM2SECLEVEL(CONFIG_GET(number/minimum_secborg_alert))] alert and greater.") var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \ "Engineering" = /obj/item/robot_module/engineering, \ @@ -427,24 +312,23 @@ else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/stack/cable_coil/coil = W if (getFireLoss() > 0 || getToxLoss() > 0) - if(src == user && coil.use(1)) + if(src == user) to_chat(user, "You start fixing yourself...") - if(!do_after(user, 50, target = src)) + if(!W.use_tool(src, user, 50, 1, max_level = JOB_SKILL_TRAINED)) + to_chat(user, "You need more cable to repair [src]!") return adjustFireLoss(-10) adjustToxLoss(-10) - if (coil.use(1)) + else to_chat(user, "You start fixing [src]...") - if(!do_after(user, 30, target = src)) + if(!W.use_tool(src, user, 30, 1)) + to_chat(user, "You need more cable to repair [src]!") return adjustFireLoss(-30) adjustToxLoss(-30) updatehealth() user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].") - else - to_chat(user, "You need more cable to repair [src]!") else to_chat(user, "The wires seem fine, there's no need to fix them.") diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 5750543a92..e337618e4b 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -32,15 +32,17 @@ var/obj/item/I = get_active_held_item() if(I) uneq_active() - visible_message("[M] disarmed [src]!", \ - "[M] has disabled [src]'s active module!", null, COMBAT_MESSAGE_RANGE) + visible_message("[M] has disarmed [src]!", \ + "[M] has disabled your active module!", null, COMBAT_MESSAGE_RANGE, null, M, + "You have disarmed [src]!") log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") else Paralyze(40) step(src,get_dir(M,src)) log_combat(M, src, "pushed") visible_message("[M] has forced back [src]!", \ - "[M] has forced back [src]!", null, COMBAT_MESSAGE_RANGE) + "[M] has forced you back!", null, COMBAT_MESSAGE_RANGE, null, M, + "You have forced back [src]!") playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1) /mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm new file mode 100644 index 0000000000..b3be01e1b0 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -0,0 +1,125 @@ + +/mob/living/silicon/robot + designation = "Default" //used for displaying the prefix & getting the current module of cyborg + has_limbs = TRUE + hud_type = /datum/hud/robot + + blocks_emissive = EMISSIVE_BLOCK_UNIQUE + + maxHealth = 100 + health = 100 + + combat_flags = COMBAT_FLAGS_DEFAULT + + var/custom_name = "" + var/braintype = "Cyborg" + var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of.. + var/obj/item/mmi/mmi = null + + var/shell = FALSE + var/deployed = FALSE + var/mob/living/silicon/ai/mainframe = null + var/datum/action/innate/undeployment/undeployment_action = new + +//Hud stuff + + var/obj/screen/inv1 = null + var/obj/screen/inv2 = null + var/obj/screen/inv3 = null + var/obj/screen/lamp_button = null + var/obj/screen/thruster_button = null + var/obj/screen/hands = null + + var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not + var/obj/screen/robot_modules_background + +//3 Modules can be activated at any one time. + var/obj/item/robot_module/module = null + var/obj/item/module_active = null + held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do! + + var/mutable_appearance/eye_lights + + var/mob/living/silicon/ai/connected_ai = null + var/obj/item/stock_parts/cell/cell = null + + var/opened = 0 + var/emagged = FALSE + var/emag_cooldown = 0 + var/wiresexposed = 0 + + var/ident = 0 + var/locked = TRUE + var/list/req_access = list(ACCESS_ROBOTICS) + + var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) + + var/speed = 0 // VTEC speed boost. + var/magpulse = FALSE // Magboot-like effect. + var/ionpulse = FALSE // Jetpack-like effect. + var/ionpulse_on = FALSE // Jetpack-like effect. + var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect. + + var/low_power_mode = 0 //whether the robot has no charge left. + var/datum/effect_system/spark_spread/spark_system // So they can initialize sparks whenever/N + + var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default + var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. + var/locked_down //Boolean of whether the borg is locked down or not + + var/toner = 0 + var/tonermax = 40 + + var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting. + var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. + light_color = "#FFCC66" + light_power = 0.8 + var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. + + var/sight_mode = 0 + hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) + + var/list/upgrades = list() + + var/hasExpanded = FALSE + var/obj/item/hat + var/hat_offset = -3 + var/list/equippable_hats = list(/obj/item/clothing/head/caphat, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/head/centhat, + /obj/item/clothing/head/HoS, + /obj/item/clothing/head/beret, + /obj/item/clothing/head/kitty, + /obj/item/clothing/head/hopcap, + /obj/item/clothing/head/wizard, + /obj/item/clothing/head/nursehat, + /obj/item/clothing/head/sombrero, + /obj/item/clothing/head/helmet/chaplain/witchunter_hat, + /obj/item/clothing/head/soft/, //All baseball caps + /obj/item/clothing/head/that, //top hat + /obj/item/clothing/head/collectable/tophat, //Not sure where this one is found, but it looks the same so might as well include + /obj/item/clothing/mask/bandana/, //All bandanas (which only work in hat mode) + /obj/item/clothing/head/fedora, + /obj/item/clothing/head/beanie/, //All beanies + /obj/item/clothing/ears/headphones, + /obj/item/clothing/head/helmet/skull, + /obj/item/clothing/head/crown/fancy) + + can_buckle = TRUE + buckle_lying = FALSE + var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human) + + var/sitting = 0 + var/bellyup = 0 + var/dogborg = FALSE + + var/cansprint = 1 + + var/orebox = null + + //doggie borg stuff. + var/disabler + var/laser + var/sleeper_g + var/sleeper_r + var/sleeper_nv \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d3e7d7c395..cb43a8489a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -93,6 +93,7 @@ return new storage_type(src) /obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild) + rad_flags |= RAD_NO_CONTAMINATE if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I @@ -146,11 +147,9 @@ has_snowflake_deadsprite = TRUE cyborg_pixel_offset = -16 hat_offset = INFINITY - var/obj/item/I = new /obj/item/analyzer/nose/flavour(src) - basic_modules += I - I = new /obj/item/soap/tongue/flavour(src) - basic_modules += I - I = new /obj/item/dogborg/sleeper/K9/flavour(src) + basic_modules += new /obj/item/dogborg_nose(src) + basic_modules += new /obj/item/dogborg_tongue(src) + var/obj/item/dogborg/sleeper/K9/flavour/I = new(src) if(istype(src, /obj/item/robot_module/engineering)) I.icon_state = "decompiler" if(istype(src, /obj/item/robot_module/security)) @@ -260,7 +259,7 @@ var/prev_locked_down = R.locked_down sleep(1) flick("[cyborg_base_icon]_transform", R) - R.notransform = TRUE + R.mob_transforming = TRUE R.SetLockdown(1) R.anchored = TRUE sleep(1) @@ -271,13 +270,26 @@ R.SetLockdown(0) R.setDir(SOUTH) R.anchored = FALSE - R.notransform = FALSE + R.mob_transforming = FALSE R.update_headlamp() R.notify_ai(NEW_MODULE) if(R.hud_used) R.hud_used.update_robot_modules_display() SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.module) +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/item/robot_module/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + /obj/item/robot_module/standard name = "Standard" basic_modules = list( @@ -339,15 +351,33 @@ /obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/medmodels = list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot", "Medihound", "Medihound Dark", "Vale") - if(R.client && (R.client.ckey in list("nezuli"))) - medmodels += "Alina" - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medmodels - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/med_icons + if(!med_icons) + med_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "medical"), + "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "medical"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmed"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamed"), + "Eyebot" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "eyebotmed"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed"), + "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_med") + ) + var/list/L = list("Medihound" = "medihound", "Medihound Dark" = "medihounddark", "Vale" = "valemed") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + med_icons[a] = wide + if(R.client && R.client.ckey == "nezuli") + var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-med") + bad_snowflake.pixel_x = -16 + med_icons["Alina"] = bad_snowflake + med_icons = sortList(med_icons) + var/med_borg_icon = show_radial_menu(R, R , med_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(med_borg_icon) if("Default") cyborg_base_icon = "medical" + if("Zoomba") + cyborg_base_icon = "zoomba_med" if("Droid") cyborg_base_icon = "medical" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' @@ -393,6 +423,8 @@ moduleselect_icon = "medihound" moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi' dogborg = TRUE + else + return FALSE return ..() /obj/item/robot_module/engineering @@ -436,15 +468,36 @@ /obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale") - if(R.client && (R.client.ckey in list("nezuli"))) - engymodels += "Alina" - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/engi_icons + if(!engi_icons) + engi_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "engineer"), + "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "engi-tread"), + "Loader" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "loaderborg"), + "Handy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "handyeng"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekeng"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "caneng"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinaeng"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidereng"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng"), + "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_engi") + ) + var/list/L = list("Pup Dozer" = "pupdozer", "Vale" = "valeeng") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + engi_icons[a] = wide + if(R.client && R.client.ckey == "nezuli") + var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-eng") + bad_snowflake.pixel_x = -16 + engi_icons["Alina"] = bad_snowflake + engi_icons = sortList(engi_icons) + var/engi_borg_icon = show_radial_menu(R, R , engi_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(engi_borg_icon) if("Default") cyborg_base_icon = "engineer" + if("Zoomba") + cyborg_base_icon = "zoomba_engi" if("Default - Treads") cyborg_base_icon = "engi-tread" special_light_key = "engineer" @@ -487,6 +540,8 @@ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' sleeper_overlay = "alinasleeper" dogborg = TRUE + else + return FALSE return ..() /obj/item/robot_module/security @@ -514,15 +569,34 @@ /obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/list/secmodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider", "K9", "K9 Dark", "Vale") - if(R.client && (R.client.ckey in list("nezuli"))) - secmodels += "Alina" - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in secmodels - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/sec_icons + if(!sec_icons) + sec_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "sec"), + "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sec-tread"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleeksec"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "cansec"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinasec"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidersec"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec"), + "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_sec") + ) + var/list/L = list("K9" = "k9", "Vale" = "valesec", "K9 Dark" = "k9dark") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + sec_icons[a] = wide + if(R.client && R.client.ckey == "nezuli") + var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-sec") + bad_snowflake.pixel_x = -16 + sec_icons["Alina"] = bad_snowflake + sec_icons = sortList(sec_icons) + var/sec_borg_icon = show_radial_menu(R, R , sec_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(sec_borg_icon) if("Default") cyborg_base_icon = "sec" + if("Zoomba") + cyborg_base_icon = "zoomba_sec" if("Default - Treads") cyborg_base_icon = "sec-tread" special_light_key = "sec" @@ -563,6 +637,8 @@ sleeper_overlay = "valesecsleeper" cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' dogborg = TRUE + else + return FALSE return ..() /obj/item/robot_module/security/Initialize() @@ -601,10 +677,13 @@ /obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider", "Borgi") - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/peace_icons = sortList(list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "peace"), + "Borgi" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "borgi"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "whitespider") + )) + var/peace_borg_icon = show_radial_menu(R, R , peace_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(peace_borg_icon) if("Default") cyborg_base_icon = "peace" if("Spider") @@ -617,6 +696,8 @@ hat_offset = INFINITY cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' has_snowflake_deadsprite = TRUE + else + return FALSE return ..() //Janitor module combined with Service module @@ -698,9 +779,9 @@ /obj/item/toy/crayon/spraycan/borg, /obj/item/hand_labeler/borg, /obj/item/razor, + /obj/item/rsf, /obj/item/instrument/violin, /obj/item/instrument/guitar, - /obj/item/rsf/cyborg, /obj/item/reagent_containers/dropper, /obj/item/lighter, /obj/item/storage/bag/tray, @@ -740,10 +821,38 @@ /obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("(Service) Waitress", "(Service) Heavy", "(Service) Sleek", "(Service) Butler", "(Service) Tophat", "(Service) Can", "(Service) Bro", "(Service) DarkK9", "(Service) Vale", "(Service) ValeDark", "(Janitor) Default", "(Janitor) Sleek", "(Janitor) Marina", "(Janitor) Can", "(Janitor) Heavy", "(Janitor) Scrubpuppy") - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/service_icons + if(!service_icons) + service_icons = list( + "(Service) Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f"), + "(Service) Butler" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_m"), + "(Service) Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"), + "(Service) Can" = image(icon = 'icons/mob/robots.dmi', icon_state = "kent"), + "(Service) Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"), + "(Service) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekserv"), + "(Service) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyserv"), + "(Janitor) Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "janitor"), + "(Janitor) Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"), + "(Janitor) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"), + "(Janitor) Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canjan"), + "(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyjan"), + "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_jani") + ) + var/list/L = list("(Service) DarkK9" = "k50", "(Service) Vale" = "valeserv", "(Service) ValeDark" = "valeservdark", + "(Janitor) Scrubpuppy" = "scrubpup") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + service_icons[a] = wide + if(R.client && R.client.ckey == "nezuli") + var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-sec") + bad_snowflake.pixel_x = -16 + service_icons["Alina"] = bad_snowflake + service_icons = sortList(service_icons) + var/service_robot_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(service_robot_icon) + if("Zoomba") + cyborg_base_icon = "zoomba_jani" if("(Service) Waitress") cyborg_base_icon = "service_f" special_light_key = "service" @@ -801,6 +910,8 @@ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' sleeper_overlay = "jsleeper" dogborg = TRUE + else + return FALSE return ..() /obj/item/robot_module/miner @@ -835,10 +946,26 @@ /obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid", "Blade", "Vale") - if(!borg_icon) - return FALSE - switch(borg_icon) + var/static/list/mining_icons + if(!mining_icons) + mining_icons = list( + "Lavaland" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner"), + "Asteroid" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"), + "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "miner"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmin"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamin"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canmin"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin"), + "Zoomba" = image(icon = 'icons/mob/robots.dmi', icon_state = "zoomba_miner") + ) + var/list/L = list("Blade" = "blade", "Vale" = "valemine") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + mining_icons[a] = wide + mining_icons = sortList(mining_icons) + var/mining_borg_icon = show_radial_menu(R, R , mining_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(mining_borg_icon) if("Lavaland") cyborg_base_icon = "miner" if("Asteroid") @@ -873,6 +1000,10 @@ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' sleeper_overlay = "valeminesleeper" dogborg = TRUE + if("Zoomba") + cyborg_base_icon = "zoomba_miner" + else + return FALSE return ..() /obj/item/robot_module/syndicate diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm index 8d40e35706..a567446e9e 100644 --- a/code/modules/mob/living/silicon/robot/update_icons.dm +++ b/code/modules/mob/living/silicon/robot/update_icons.dm @@ -41,7 +41,7 @@ else add_overlay("ov-opencover -c") if(hat) - var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi') + var/mutable_appearance/head_overlay = hat.build_worn_icon(default_layer = 20, default_icon_file = 'icons/mob/clothing/head.dmi', override_state = hat.icon_state) head_overlay.pixel_y += hat_offset add_overlay(head_overlay) update_fire() @@ -57,3 +57,5 @@ cut_overlays() else icon_state = "[module.cyborg_base_icon]" + + SEND_SIGNAL(src, COMSIG_ROBOT_UPDATE_ICONS) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 7ebd11319d..7a9610fb53 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -14,9 +14,7 @@ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE speech_span = SPAN_ROBOT flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 - no_vore = TRUE - /// Enable sprint system but not stamina - combat_flags = COMBAT_FLAGS_STAMEXEMPT_YESSPRINT + vore_flags = NO_VORE var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 @@ -58,6 +56,12 @@ diag_hud_set_status() diag_hud_set_health() +/mob/living/silicon/ComponentInitialize() + . = ..() + AddElement(/datum/element/flavor_text, _name = "Silicon Flavor Text", _save_key = "silicon_flavor_text") + AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") + AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE) + /mob/living/silicon/med_hud_set_health() return //we use a different hud @@ -392,6 +396,12 @@ return aicamera.selectpicture(user) /mob/living/silicon/proc/ai_roster() + if(!client) + return + if(world.time < client.crew_manifest_delay) + return + client.crew_manifest_delay = world.time + (1 SECONDS) + var/dat = "Crew RosterCrew Roster:

    " dat += GLOB.data_core.get_manifest() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index a93bc8662e..0850f0f886 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -1,3 +1,5 @@ +/mob/living/silicon/KnockToFloor(disarm_items = FALSE, silent = TRUE, updating = TRUE) + return /mob/living/silicon/grippedby(mob/living/user, instant = FALSE) return //can't upgrade a simple pull into a more aggressive grab. @@ -15,7 +17,8 @@ log_combat(M, src, "attacked") playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] has slashed at [src]!", \ - "[M] has slashed at [src]!") + "[M] has slashed at you!", target = M, \ + target_message = "You have slashed at [src]!") if(prob(8)) flash_act(affect_silicon = 1) log_combat(M, src, "attacked") @@ -23,18 +26,20 @@ updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] took a swipe at [src]!", \ - "[M] took a swipe at [src]!") + visible_message("[M] take a swipe at [src]!", \ + "[M] take a swipe at you!", target = M, \ + target_message = "You take a swipe at [src]!") /mob/living/silicon/attack_animal(mob/living/simple_animal/M) . = ..() if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + var/damage = . if(prob(damage)) for(var/mob/living/N in buckled_mobs) N.DefaultCombatKnockdown(20) unbuckle_mob(N) - N.visible_message("[N] is knocked off of [src] by [M]!") + N.visible_message("[N] is knocked off of [src] by [M]!", + "You are knocked off of [src] by [M]!") switch(M.melee_damage_type) if(BRUTE) adjustBruteLoss(damage) @@ -60,7 +65,8 @@ adjustBruteLoss(rand(10, 15)) playsound(loc, "punch", 25, 1, -1) visible_message("[user] has punched [src]!", \ - "[user] has punched [src]!") + "[user] has punched you!", target = user, \ + target_message = "You have punched [src]!") return TRUE return FALSE @@ -71,14 +77,16 @@ switch(M.a_intent) if (INTENT_HELP) M.visible_message("[M] pets [src].", \ - "You pet [src].") + "You pet [src].", target = src, + target_message = "[M] pets you.") if(INTENT_GRAB) grabbedby(M) else M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) playsound(src.loc, 'sound/effects/bang.ogg', 10, 1) visible_message("[M] punches [src], but doesn't leave a dent.", \ - "[M] punches [src], but doesn't leave a dent.", null, COMBAT_MESSAGE_RANGE) + "[M] punches you, but doesn't leave a dent.", null, COMBAT_MESSAGE_RANGE, null, M, + "You punch [src], but don't leave a dent.") /mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) if(M.a_intent == INTENT_HARM) @@ -107,28 +115,32 @@ if(prob(severity*50)) unbuckle_mob(M) M.DefaultCombatKnockdown(40) - M.visible_message("[M] is thrown off of [src]!") + M.visible_message("[M] is thrown off of [src]!", + "You are thrown off of [src]!") flash_act(affect_silicon = 1) /mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone) + var/totaldamage = P.damage if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself - if(reflect_bullet_check(P, def_zone)) - return -1 // complete projectile permutation - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) - P.on_hit(src, 100, def_zone) - return 2 + var/list/returnlist = list() + var/returned = mob_run_block(P, P.damage, "the [P.name]", ATTACK_TYPE_PROJECTILE, P.armour_penetration, P.firer, def_zone, returnlist) + if(returned & BLOCK_SHOULD_REDIRECT) + handle_projectile_attack_redirection(P, returnlist[BLOCK_RETURN_REDIRECT_METHOD]) + if(returned & BLOCK_REDIRECTED) + return BULLET_ACT_FORCE_PIERCE + if(returned & BLOCK_SUCCESS) + P.on_hit(src, returnlist[BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE], def_zone) + return BULLET_ACT_BLOCK + totaldamage = block_calculate_resultant_damage(totaldamage, returnlist) if((P.damage_type == BRUTE || P.damage_type == BURN)) - adjustBruteLoss(P.damage) - if(prob(P.damage*1.5)) - for(var/mob/living/M in buckled_mobs) - M.visible_message("[M] is knocked off of [src]!") - unbuckle_mob(M) - M.DefaultCombatKnockdown(40) - if(P.stun || P.knockdown) + adjustBruteLoss(totaldamage) + if((P.damage >= 10) || P.stun || P.knockdown || (P.stamina >= 20)) for(var/mob/living/M in buckled_mobs) + M.visible_message("[M] is knocked off of [src] by the [P]!", + "You are knocked off of [src] by the [P]!") unbuckle_mob(M) - M.visible_message("[M] is knocked off of [src] by the [P]!") - P.on_hit(src) + M.DefaultCombatKnockdown(40) + P.on_hit(src, 0, def_zone) return BULLET_ACT_HIT /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index f4feab8824..278bb37d0d 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -7,7 +7,9 @@ switch(M.a_intent) if(INTENT_HELP) if (health > 0) - visible_message("[M] [response_help] [src].") + visible_message("[M] [response_help_continuous] [src].", \ + "[M] [response_help_continuous] you.", null, null, null, + M, "You [response_help_simple] [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(INTENT_GRAB) @@ -16,13 +18,22 @@ else grabbedby(M) - if(INTENT_HARM, INTENT_DISARM) + if(INTENT_DISARM) + M.do_attack_animation(src, ATTACK_EFFECT_DISARM) + visible_message("[M] [response_disarm_continuous] [src]!",\ + "[M] [response_disarm_continuous] you!", null, COMBAT_MESSAGE_RANGE, null, \ + M, "You [response_disarm_simple] [src]!") + playsound(src, 'sound/weapons/thudswoosh.ogg', 25, 1) + log_combat(M, src, "disarmed") + + if(INTENT_HARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt [src]!") return M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - visible_message("[M] [response_harm] [src]!",\ - "[M] [response_harm] [src]!", null, COMBAT_MESSAGE_RANGE) + visible_message("[M] [response_harm_continuous] [src]!",\ + "[M] [response_harm_continuous] you!", null, COMBAT_MESSAGE_RANGE, null, \ + M, "You [response_harm_simple] [src]!") playsound(loc, attacked_sound, 25, 1, -1) attack_threshold_check(harm_intent_damage) log_combat(M, src, "attacked") @@ -35,8 +46,9 @@ if(.) return playsound(loc, "punch", 25, 1, -1) - visible_message("[user] has punched [src]!", \ - "[user] has punched [src]!", null, COMBAT_MESSAGE_RANGE) + visible_message("[user] punches [src]!", \ + "[user] punches you!", null, COMBAT_MESSAGE_RANGE, null, \ + user, "You punch [src]!") adjustBruteLoss(15) return TRUE @@ -48,7 +60,9 @@ return 1 if (M.a_intent == INTENT_HELP) if (health > 0) - visible_message("[M.name] [response_help] [src].") + visible_message("[M.name] [response_help_continuous] [src].", \ + "[M.name] [response_help_continuous] you.", \ + target = M, target_message = "You [response_help_simple] [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) /mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M) @@ -57,15 +71,16 @@ return if(M.a_intent == INTENT_DISARM) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - visible_message("[M] [response_disarm] [name]!", \ - "[M] [response_disarm] [name]!", null, COMBAT_MESSAGE_RANGE) + visible_message("[M] [response_disarm_continuous] [name]!", \ + "[M] [response_disarm_continuous] [name]!", null, COMBAT_MESSAGE_RANGE, null, \ + M, "You [response_disarm_simple] [name]!") log_combat(M, src, "disarmed") else - var/damage = rand(15, 30) visible_message("[M] has slashed at [src]!", \ - "[M] has slashed at [src]!", null, COMBAT_MESSAGE_RANGE) + "[M] has slashed at [src]!", null, COMBAT_MESSAGE_RANGE, null, \ + M, "[M] has slashed at [src]!") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - attack_threshold_check(damage) + attack_threshold_check(M.meleeSlashSAPower) log_combat(M, src, "attacked") /mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L) @@ -79,7 +94,7 @@ /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) . = ..() if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + var/damage = . return attack_threshold_check(damage, M.melee_damage_type) /mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) @@ -103,7 +118,7 @@ temp_damage *= damage_coeff[damagetype] if(temp_damage >= 0 && temp_damage <= force_threshold) - visible_message("[src] looks unharmed.") + visible_message("[src] looks unharmed!") return FALSE else apply_damage(damage, damagetype, null, getarmor(null, armorcheck)) diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index ebc89e2577..eee42c214f 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -5,10 +5,15 @@ icon_state = "ghost" icon_living = "ghost" mob_biotypes = MOB_SPIRIT - attacktext = "raises the hairs on the neck of" - response_harm = "disrupts the concentration of" - response_disarm = "wafts" - friendly = "communes with" + has_field_of_vision = FALSE //we are a spoopy ghost + attack_verb_continuous = "raises the hair on the neck of" + attack_verb_simple = "raise the hair on the neck of" + response_harm_continuous = "disrupts the concentration of" + response_harm_simple = "disrupt the concentration of" + response_disarm_continuous = "wafts" + response_disarm_simple = "waft" + friendly_verb_continuous = "communes with" + friendly_verb_simple = "commute with" loot = null maxHealth = 10 health = 10 @@ -18,7 +23,6 @@ deathmessage = "disappears as if it was never really there to begin with" incorporeal_move = 1 alpha = 50 - attacktext = "touches the mind of" speak_emote = list("echos") movement_type = FLYING var/pseudo_death = FALSE @@ -32,7 +36,6 @@ /mob/living/simple_animal/astral/death() icon_state = "shade_dead" Stun(1000) - friendly = "deads at" pseudo_death = TRUE incorporeal_move = 0 to_chat(src, "Your astral projection is interrupted and your mind is sent back to your body with a shock!") @@ -49,17 +52,17 @@ to_chat(src, "The intensity of the astrogen in your body is too much allow you to return to yourself yet!") return to_chat(src, "You astrally possess [H]!") - log_game("FERMICHEM: [src] has astrally possessed [A]!") + log_reagent("FERMICHEM: [src] has astrally possessed [A]!") src.mind.transfer_to(H) qdel(src) var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN)) if(!message) return to_chat(A, "[src] projects into your mind, \"[message]\"") - log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]") + log_reagent("FERMICHEM: [src] has astrally transmitted [message] into [A]") //Delete the mob if there's no mind! Pay that mob no mind. -/mob/living/simple_animal/astral/Life() - if(!mind) - qdel(src) +/mob/living/simple_animal/astral/PhysicalLife(seconds, times_fired) . = ..() + if(!mind && !QDELETED(src)) + qdel(src) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 75364b2845..39eccf9ad4 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -98,6 +98,10 @@ hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) //Diagnostic HUD views + var/commissioned = FALSE // Will other (noncommissioned) bots salute this bot? + var/can_salute = TRUE + var/salute_delay = 60 SECONDS + /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. if(paicard) @@ -251,6 +255,14 @@ if(!on || client) return + if(!commissioned && can_salute) + for(var/mob/living/simple_animal/bot/B in get_hearers_in_view(5, get_turf(src))) + if(B.commissioned) + visible_message("[src] performs an elaborate salute for [B]!") + can_salute = FALSE + addtimer(VARSET_CALLBACK(src, can_salute, TRUE), salute_delay) + break + switch(mode) //High-priority overrides are processed first. Bots can do nothing else while under direct command. if(BOT_RESPONDING) //Called by the AI. call_mode() @@ -445,7 +457,6 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r return scan_result else return FALSE //The current element failed assessment, move on to the next. - return /mob/living/simple_animal/bot/proc/check_bot(targ) var/turf/T = get_turf(targ) @@ -912,7 +923,6 @@ Pass a positive integer as an argument to override a bot's default speed. bot_name = name name = paicard.pai.name faction = user.faction.Copy() - language_holder = paicard.pai.language_holder.copy(src) log_combat(user, paicard.pai, "uploaded to [bot_name],") return TRUE else diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 0e48723f37..f6aad5c03f 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -14,11 +14,14 @@ model = "Cleanbot" bot_core_type = /obj/machinery/bot_core/cleanbot window_id = "autoclean" - window_name = "Automatic Station Cleaner v1.2" + window_name = "Automatic Station Cleaner v1.3" pass_flags = PASSMOB path_image_color = "#993299" weather_immunities = list("lava","ash") + var/clean_time = 50 //How long do we take to clean? + var/upgrades = 0 + var/blood = 1 var/trash = 0 var/pests = 0 @@ -33,8 +36,62 @@ var/next_dest var/next_dest_loc + var/obj/item/weapon + var/weapon_orig_force = 0 + var/chosen_name + + var/list/stolen_valor + + var/static/list/officers = list("Captain", "Head of Personnel", "Head of Security") + var/static/list/command = list("Captain" = "Cpt.","Head of Personnel" = "Lt.") + var/static/list/security = list("Head of Security" = "Maj.", "Warden" = "Sgt.", "Detective" = "Det.", "Security Officer" = "Officer") + var/static/list/engineering = list("Chief Engineer" = "Chief Engineer", "Station Engineer" = "Engineer", "Atmospherics Technician" = "Technician") + var/static/list/medical = list("Chief Medical Officer" = "C.M.O.", "Medical Doctor" = "M.D.", "Chemist" = "Pharm.D.") + var/static/list/research = list("Research Director" = "Ph.D.", "Roboticist" = "M.S.", "Scientist" = "B.S.") + var/static/list/legal = list("Lawyer" = "Esq.") + + var/list/prefixes + var/list/suffixes + +/mob/living/simple_animal/bot/cleanbot/proc/deputize(obj/item/W, mob/user) + if(in_range(src, user)) + to_chat(user, "You attach \the [W] to \the [src].") + user.transferItemToLoc(W, src) + weapon = W + weapon_orig_force = weapon.force + if(!emagged) + weapon.force = weapon.force / 2 + add_overlay(image(icon=weapon.lefthand_file,icon_state=weapon.item_state)) + +/mob/living/simple_animal/bot/cleanbot/proc/update_titles() + var/working_title = "" + + for(var/pref in prefixes) + for(var/title in pref) + if(title in stolen_valor) + working_title += pref[title] + " " + if(title in officers) + commissioned = TRUE + break + + working_title += chosen_name + + for(var/suf in suffixes) + for(var/title in suf) + if(title in stolen_valor) + working_title += " " + suf[title] + break + + name = working_title + +/mob/living/simple_animal/bot/cleanbot/examine(mob/user) + . = ..() + if(weapon) + . += " Is that \a [weapon] taped to it...?" + /mob/living/simple_animal/bot/cleanbot/Initialize() . = ..() + chosen_name = name get_targets() icon_state = "cleanbot[on]" @@ -42,6 +99,18 @@ access_card.access += J.get_access() prev_access = access_card.access + stolen_valor = list() + + prefixes = list(command, security, engineering) + suffixes = list(research, medical, legal) + +/mob/living/simple_animal/bot/cleanbot/Destroy() + if(weapon) + var/atom/Tsec = drop_location() + weapon.force = weapon_orig_force + drop_part(weapon, Tsec) + return ..() + /mob/living/simple_animal/bot/cleanbot/turn_on() ..() icon_state = "cleanbot[on]" @@ -54,6 +123,8 @@ /mob/living/simple_animal/bot/cleanbot/bot_reset() ..() + if(weapon && (emagged == 2)) + weapon.force = weapon_orig_force ignore_list = list() //Allows the bot to clean targets it previously ignored due to being unreachable. target = null oldloc = null @@ -63,6 +134,22 @@ text_dehack = "[name]'s software has been reset!" text_dehack_fail = "[name] does not seem to respond to your repair code!" +/mob/living/simple_animal/bot/cleanbot/Crossed(atom/movable/AM) + . = ..() + + zone_selected = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + if(weapon && has_gravity() && ismob(AM)) + var/mob/living/carbon/C = AM + if(!istype(C)) + return + + if(!(C.job in stolen_valor)) + stolen_valor += C.job + update_titles() + + weapon.attack(C, src) + C.Knockdown(20) + /mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) if(bot_core.allowed(user) && !open && !emagged) @@ -74,13 +161,52 @@ if(open) to_chat(user, "Please close the access panel before locking it.") else - to_chat(user, "\The [src] doesn't seem to respect your authority.") + to_chat(user, "The [src] doesn't seem to respect your authority.") + + else if(istype(W, /obj/item/kitchen/knife) && user.a_intent != INTENT_HARM) + to_chat(user, "You start attaching \the [W] to \the [src]...") + if(do_after(user, 25, target = src)) + deputize(W, user) + + else if(istype(W, /obj/item/mop/advanced)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_CLEANER_ADVANCED_MOP)) + to_chat(user, "You replace \the [src] old mop with a new better one!") + upgrades |= UPGRADE_CLEANER_ADVANCED_MOP + clean_time = 20 //2.5 the speed! + window_name = "Automatic Station Cleaner v2.1 BETA" //New! + qdel(W) + if(!open) + to_chat(user, "The [src] access panel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access panel locked off to you!") + return + else + to_chat(user, "The [src] already has this mop!") + + else if(istype(W, /obj/item/twohanded/broom)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_CLEANER_BROOM)) + to_chat(user, "You add to \the [src] a broom speeding it up!") + upgrades |= UPGRADE_CLEANER_BROOM + base_speed = 1 //2x faster! + qdel(W) + if(!open) + to_chat(user, "The [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has a broom!") + else return ..() /mob/living/simple_animal/bot/cleanbot/emag_act(mob/user) . = ..() if(emagged == 2) + if(weapon) + weapon.force = weapon_orig_force if(user) to_chat(user, "[src] buzzes and beeps.") @@ -221,7 +347,7 @@ icon_state = "cleanbot-c" visible_message("[src] begins to clean up [A].") mode = BOT_CLEANING - spawn(50) + spawn(clean_time) if(mode == BOT_CLEANING) if(A && isturf(A.loc)) var/atom/movable/AM = A diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 6c4680a477..08fffc2cf8 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -147,9 +147,8 @@ to_chat(user, "You need one length of cable to wire the ED-209!") return to_chat(user, "You start to wire [src]...") - if(do_after(user, 40, target = src)) - if(coil.get_amount() >= 1 && build_step == 6) - coil.use(1) + if(coil.use_tool(src, user, 40, 1)) + if(build_step == 6) to_chat(user, "You wire [src].") name = "wired ED-209 assembly" build_step++ diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 469a395169..6febb942a1 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -44,8 +44,6 @@ var/cell_type = /obj/item/stock_parts/cell var/vest_type = /obj/item/clothing/suit/armor/vest - do_footstep = TRUE - /mob/living/simple_animal/bot/ed209/Initialize(mapload,created_name,created_lasercolor) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 1bf3883ea7..0f4608f48c 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -33,6 +33,8 @@ var/oldloc = null var/toolbox = /obj/item/storage/toolbox/mechanical + var/upgrades = 0 + #define HULL_BREACH 1 #define LINE_SPACE_MODE 2 #define FIX_TILE 3 @@ -120,6 +122,36 @@ to_chat(user, "You load [loaded] tiles into the floorbot. It now contains [specialtiles] tiles.") else to_chat(user, "You need at least one floor tile to put into [src]!") + + else if(istype(W, /obj/item/storage/toolbox/artistic)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_FLOOR_ARTBOX)) + to_chat(user, "You upgrade \the [src] case to hold more!") + upgrades |= UPGRADE_FLOOR_ARTBOX + maxtiles += 100 //Double the storage! + qdel(W) + if(!open) + to_chat(user, "The [src] access pannle is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has a upgraded case!") + + else if(istype(W, /obj/item/storage/toolbox/syndicate)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_FLOOR_SYNDIBOX)) + to_chat(user, "You upgrade \the [src] case to hold more!") + upgrades |= UPGRADE_FLOOR_SYNDIBOX + maxtiles += 200 //Double bse storage + base_speed = 1 //2x faster! + qdel(W) + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has a upgraded case!") + + else ..() diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index d3fb65c585..cbb495bf9c 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -1,7 +1,13 @@ //MEDBOT //MEDBOT PATHFINDING //MEDBOT ASSEMBLY - +#define MEDBOT_PANIC_NONE 0 +#define MEDBOT_PANIC_LOW 15 +#define MEDBOT_PANIC_MED 35 +#define MEDBOT_PANIC_HIGH 55 +#define MEDBOT_PANIC_FUCK 70 +#define MEDBOT_PANIC_ENDING 90 +#define MEDBOT_PANIC_END 100 /mob/living/simple_animal/bot/medbot name = "\improper Medibot" @@ -42,6 +48,7 @@ var/declare_crit = 1 //If active, the bot will transmit a critical patient alert to MedHUD users. var/declare_cooldown = 0 //Prevents spam of critical patient alerts. var/stationary_mode = 0 //If enabled, the Medibot will not move automatically. + var/injection_time = 30 //How long we take to inject someone //Setting which reagents to use to treat what by default. By id. var/treatment_brute_avoid = /datum/reagent/medicine/tricordrazine var/treatment_brute = /datum/reagent/medicine/bicaridine @@ -51,19 +58,32 @@ var/treatment_fire = /datum/reagent/medicine/kelotane var/treatment_tox_avoid = /datum/reagent/medicine/tricordrazine var/treatment_tox = /datum/reagent/medicine/charcoal - var/treatment_tox_toxlover = /datum/reagent/toxin + var/treatment_tox_toxlover = /datum/reagent/toxin //Injects toxins into people that heal via toxins var/treatment_virus_avoid = null var/treatment_virus = /datum/reagent/medicine/spaceacillin var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible. var/shut_up = 0 //self explanatory :) + var/upgrades = 0 + var/upgraded_dispenser_1 //Do we have the nicer chemicals? - replaces dex with salbutamol + var/upgraded_dispenser_2 //Do we have the nicer chemicals? - replaces kep with oxandrolone + var/upgraded_dispenser_3 //Do we have the nicer chemicals? - replaces bic with sal acid + var/upgraded_dispenser_4 //Do we have the nicer chemicals? - replaces charcoal/toxin with pentetic acid / pentetic jelly + + //How panicked we are about being tipped over (why would you do this?) + var/tipped_status = MEDBOT_PANIC_NONE + //The name we got when we were tipped + var/tipper_name + //The last time we were tipped/righted and said a voice line, to avoid spam + var/last_tipping_action_voice = 0 + /mob/living/simple_animal/bot/medbot/mysterious name = "\improper Mysterious Medibot" desc = "International Medibot of mystery." skin = "bezerk" - treatment_brute = /datum/reagent/medicine/tricordrazine - treatment_fire = /datum/reagent/medicine/tricordrazine - treatment_tox = /datum/reagent/medicine/tricordrazine + treatment_brute = /datum/reagent/medicine/regen_jelly + treatment_fire = /datum/reagent/medicine/regen_jelly + treatment_tox = /datum/reagent/medicine/regen_jelly /mob/living/simple_animal/bot/medbot/derelict name = "\improper Old Medibot" @@ -220,7 +240,6 @@ /mob/living/simple_animal/bot/medbot/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/reagent_containers/glass)) - . = 1 //no afterattack if(locked) to_chat(user, "You cannot insert a beaker because the panel is locked!") return @@ -234,6 +253,97 @@ to_chat(user, "You insert [W].") show_controls(user) + else if(istype(W, /obj/item/reagent_containers/syringe/piercing)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING)) + to_chat(user, "You replace \the [src] syringe with a diamond-tipped one!") + upgrades |= UPGRADE_MEDICAL_PIERERCING + qdel(W) + if(!open) + to_chat(user, "The [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has a diamond-tipped syringe!") + + else if(istype(W, /obj/item/hypospray/mkii)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_HYPOSPRAY)) + to_chat(user, "You replace \the [src] syringe base with a DeForest Medical MK.II Hypospray!") + upgrades |= UPGRADE_MEDICAL_HYPOSPRAY + injection_time = 15 //Half the time half the death! + window_name = "Automatic Medical Unit v2.4 ALPHA" + qdel(W) + if(!open) + to_chat(user, "The [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has a DeForest Medical Hypospray base!") + + else if(istype(W, /obj/item/circuitboard/machine/chem_dispenser)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CHEM_BOARD)) + to_chat(user, "You add in the board upgrading \the [src] reagent banks!") + upgrades |= UPGRADE_MEDICAL_CHEM_BOARD + treatment_oxy = /datum/reagent/medicine/salbutamol //Replaces Dex with salbutamol "better" healing of o2 + qdel(W) + if(!open) + to_chat(user, "The [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has this upgrade!") + + else if(istype(W, /obj/item/circuitboard/machine/cryo_tube)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CRYO_BOARD)) + to_chat(user, "You add in the board upgrading \the [src] reagent banks!") + upgrades |= UPGRADE_MEDICAL_CRYO_BOARD + treatment_fire = /datum/reagent/medicine/oxandrolone //Replaces Kep with oxandrolone "better" healing of burns + qdel(W) + if(!open) + to_chat(user, "The [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has this upgrade!") + + else if(istype(W, /obj/item/circuitboard/machine/chem_master)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CHEM_MASTER)) + to_chat(user, "You add in the board upgrading \the [src] reagent banks!") + upgrades |= UPGRADE_MEDICAL_CHEM_MASTER + treatment_brute = /datum/reagent/medicine/sal_acid //Replaces Bic with Sal Acid "better" healing of brute + qdel(W) + if(!open) + to_chat(user, "the [src] access pannel is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "the [src] access pannel locked off to you!") + return + else + to_chat(user, "the [src] already has this upgrade!") + + else if(istype(W, /obj/item/circuitboard/machine/sleeper)) + if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_SLEEP_BOARD)) + to_chat(user, "You add in the board upgrading \the [src] reagent banks!") + upgrades |= UPGRADE_MEDICAL_SLEEP_BOARD + treatment_tox = /datum/reagent/medicine/pen_acid //replaces charcoal with pen acid a "better" healing of toxins + treatment_tox_toxlover = /datum/reagent/medicine/pen_acid/pen_jelly //Injects pen jelly into people that heal via toxins + qdel(W) + if(!open) + to_chat(user, "The [src] access pannle is not open!") + return + if(!bot_core.allowed(user)) + to_chat(user, "The [src] access pannel locked off to you!") + return + else + to_chat(user, "The [src] already has this upgrade!") + else var/current_health = health ..() @@ -249,6 +359,8 @@ audible_message("[src] buzzes oddly!") flick("medibot_spark", src) playsound(src, "sparks", 75, 1) + if(!CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING)) + upgrades |= UPGRADE_MEDICAL_PIERERCING //Jabs even harder through the clothing! if(user) oldpatient = user @@ -264,6 +376,9 @@ if((last_newpatient_speak + 300) < world.time) //Don't spam these messages! var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg',"[H.name], you appear to be injured!" = 'sound/voice/medbot/injured.ogg') var/message = pick(messagevoice) + if(prob(1) && ISINRANGE_EX(H.getFireLoss(), 0, 20)) + message = "Notices your minor burns*OwO what's this?" + messagevoice[message] = 'sound/voice/medbot/owo.ogg' speak(message) playsound(loc, messagevoice[message], 50, 0) last_newpatient_speak = world.time @@ -271,10 +386,91 @@ else return +/mob/living/simple_animal/bot/medbot/proc/tip_over(mob/user) + mobility_flags &= ~MOBILITY_MOVE + playsound(src, 'sound/machines/warning-buzzer.ogg', 50) + user.visible_message("[user] tips over [src]!", "You tip [src] over!") + mode = BOT_TIPPED + var/matrix/mat = transform + transform = mat.Turn(180) + +/mob/living/simple_animal/bot/medbot/proc/set_right(mob/user) + mobility_flags &= MOBILITY_MOVE + var/list/messagevoice + if(user) + user.visible_message("[user] sets [src] right-side up!", "You set [src] right-side up!") + if(user.name == tipper_name) + messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg') + else + messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg') + else + visible_message("[src] manages to writhe wiggle enough to right itself.") + messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg') + + tipper_name = null + if(world.time > last_tipping_action_voice + 15 SECONDS) + last_tipping_action_voice = world.time + var/message = pick(messagevoice) + speak(message) + playsound(src, messagevoice[message], 70) + tipped_status = MEDBOT_PANIC_NONE + mode = BOT_IDLE + transform = matrix() + +// if someone tipped us over, check whether we should ask for help or just right ourselves eventually +/mob/living/simple_animal/bot/medbot/proc/handle_panic() + tipped_status++ + var/list/messagevoice + switch(tipped_status) + if(MEDBOT_PANIC_LOW) + messagevoice = list("I require assistance." = 'sound/voice/medbot/i_require_asst.ogg') + if(MEDBOT_PANIC_MED) + messagevoice = list("Please put me back." = 'sound/voice/medbot/please_put_me_back.ogg') + if(MEDBOT_PANIC_HIGH) + messagevoice = list("Please, I am scared!" = 'sound/voice/medbot/please_im_scared.ogg') + if(MEDBOT_PANIC_FUCK) + messagevoice = list("I don't like this, I need help!" = 'sound/voice/medbot/dont_like.ogg', "This hurts, my pain is real!" = 'sound/voice/medbot/pain_is_real.ogg') + if(MEDBOT_PANIC_ENDING) + messagevoice = list("Is this the end?" = 'sound/voice/medbot/is_this_the_end.ogg', "Nooo!" = 'sound/voice/medbot/nooo.ogg') + if(MEDBOT_PANIC_END) + speak("PSYCH ALERT: Crewmember [tipper_name] recorded displaying antisocial tendencies torturing bots in [get_area(src)]. Please schedule psych evaluation.", radio_channel) + set_right() // strong independent medbot + + if(prob(tipped_status)) + do_jitter_animation(tipped_status * 0.1) + + if(messagevoice) + var/message = pick(messagevoice) + speak(message) + playsound(src, messagevoice[message], 70) + else if(prob(tipped_status * 0.2)) + playsound(src, 'sound/machines/warning-buzzer.ogg', 30, extrarange=-2) + +/mob/living/simple_animal/bot/medbot/examine(mob/user) + . = ..() + if(tipped_status == MEDBOT_PANIC_NONE) + return + + switch(tipped_status) + if(MEDBOT_PANIC_NONE to MEDBOT_PANIC_LOW) + . += "It appears to be tipped over, and is quietly waiting for someone to set it right." + if(MEDBOT_PANIC_LOW to MEDBOT_PANIC_MED) + . += "It is tipped over and requesting help." + if(MEDBOT_PANIC_MED to MEDBOT_PANIC_HIGH) + . += "They are tipped over and appear visibly distressed." // now we humanize the medbot as a they, not an it + if(MEDBOT_PANIC_HIGH to MEDBOT_PANIC_FUCK) + . += "They are tipped over and visibly panicking!" + if(MEDBOT_PANIC_FUCK to INFINITY) + . += "They are freaking out from being tipped over!" + /mob/living/simple_animal/bot/medbot/handle_automated_action() if(!..()) return + if(mode == BOT_TIPPED) + handle_panic() + return + if(mode == BOT_HEALING) return @@ -290,10 +486,14 @@ if(QDELETED(patient)) if(!shut_up && prob(1)) - var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg') - var/message = pick(messagevoice) - speak(message) - playsound(loc, messagevoice[message], 50, 0) + if(emagged && prob(30)) + var/list/i_need_scissors = list('sound/voice/medbot/fuck_you.ogg', 'sound/voice/medbot/turn_off.ogg', 'sound/voice/medbot/im_different.ogg', 'sound/voice/medbot/close.ogg', 'sound/voice/medbot/shindemashou.ogg') + playsound(src, pick(i_need_scissors), 70) + else + var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg', "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg') + var/message = pick(messagevoice) + speak(message) + playsound(src, messagevoice[message], 50) var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients. patient = scan(/mob/living/carbon/human, oldpatient, scan_range) oldpatient = patient @@ -358,7 +558,7 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C - if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing)) + if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing) && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING)) var/obj/item/clothing/CS = H.wear_suit var/obj/item/clothing/CH = H.head if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL) @@ -404,6 +604,27 @@ /mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M) return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox +/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H) + if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED) + H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...") + + if(world.time > last_tipping_action_voice + 15 SECONDS) + last_tipping_action_voice = world.time // message for tipping happens when we start interacting, message for righting comes after finishing + var/list/messagevoice = list("Hey, wait..." = 'sound/voice/medbot/hey_wait.ogg',"Please don't..." = 'sound/voice/medbot/please_dont.ogg',"I trusted you..." = 'sound/voice/medbot/i_trusted_you.ogg', "Nooo..." = 'sound/voice/medbot/nooo.ogg', "Oh fuck-" = 'sound/voice/medbot/oh_fuck.ogg') + var/message = pick(messagevoice) + speak(message) + playsound(src, messagevoice[message], 70, FALSE) + + if(do_after(H, 3 SECONDS, target=src)) + tip_over(H) + + else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED) + H.visible_message("[H] begins righting [src].", "You begin righting [src]...") + if(do_after(H, 3 SECONDS, target=src)) + set_right(H) + else + ..() + /mob/living/simple_animal/bot/medbot/UnarmedAttack(atom/A) if(iscarbon(A)) var/mob/living/carbon/C = A @@ -415,7 +636,7 @@ else ..() -/mob/living/simple_animal/bot/medbot/examinate(atom/A as mob|obj|turf in view()) +/mob/living/simple_animal/bot/medbot/examinate(atom/A as mob|obj|turf in fov_view()) ..() if(!is_blind(src)) chemscan(src, A) @@ -501,7 +722,7 @@ "[src] is trying to inject you!") var/failed = FALSE - if(do_mob(src, patient, 30)) //Is C == patient? This is so confusing + if(do_mob(src, patient, injection_time)) //Is C == patient? This is so confusing if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient)) if(reagent_id == "internal_beaker") if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume) @@ -523,9 +744,6 @@ soft_reset() return - reagent_id = null - return - /mob/living/simple_animal/bot/medbot/proc/check_overdose(mob/living/carbon/patient,reagent_id,injection_amount) var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id] if(!R.overdose_threshold) //Some chems do not have an OD threshold @@ -565,3 +783,11 @@ /obj/machinery/bot_core/medbot req_one_access = list(ACCESS_MEDICAL, ACCESS_ROBOTICS) + +#undef MEDBOT_PANIC_NONE +#undef MEDBOT_PANIC_LOW +#undef MEDBOT_PANIC_MED +#undef MEDBOT_PANIC_HIGH +#undef MEDBOT_PANIC_FUCK +#undef MEDBOT_PANIC_ENDING +#undef MEDBOT_PANIC_END \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 5754f8c3b2..d199bc2ead 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -235,10 +235,11 @@ Auto Patrol: []"}, playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message("[src] is trying to put zipties on [C]!",\ "[src] is trying to put zipties on you!") - addtimer(CALLBACK(src, .proc/attempt_handcuff, C), 60) + if(do_after(src, 60, FALSE, C)) + attempt_handcuff(C) /mob/living/simple_animal/bot/secbot/proc/attempt_handcuff(mob/living/carbon/C) - if( !on || !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. + if (!on) return if(!C.handcuffed) C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index a6366c03fe..354bc9ed0f 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -5,9 +5,12 @@ gender = NEUTER mob_biotypes = NONE speak_emote = list("hisses") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "punches" + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" threat = 1 speak_chance = 1 icon = 'icons/mob/mob.dmi' @@ -122,12 +125,14 @@ threat = 3 maxHealth = 150 health = 150 - response_harm = "harmlessly punches" + response_harm_continuous = "harmlessly punches" + response_harm_simple = "harmlessly punch" harm_intent_damage = 0 obj_damage = 90 melee_damage_lower = 25 melee_damage_upper = 25 - attacktext = "smashes their armored gauntlet into" + attack_verb_continuous = "smashes their armored gauntlet into" + attack_verb_simple = "smash your armored gauntlet into" speed = 2.5 environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch3.ogg' @@ -188,7 +193,8 @@ melee_damage_lower = 20 melee_damage_upper = 20 retreat_distance = 2 //AI wraiths will move in and out of combat - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) runetype = /datum/action/innate/cult/create_rune/tele @@ -232,14 +238,16 @@ icon_living = "artificer" maxHealth = 50 health = 50 - response_harm = "viciously beats" + response_harm_continuous = "viciously beats" + response_harm_simple = "viciously beat" harm_intent_damage = 5 obj_damage = 60 melee_damage_lower = 5 melee_damage_upper = 5 retreat_distance = 10 minimum_distance = 10 //AI artificers will flee like fuck - attacktext = "rams" + attack_verb_continuous = "rams" + attack_verb_simple = "ram" environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch2.ogg' construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, @@ -319,7 +327,8 @@ sight = SEE_MOBS melee_damage_lower = 15 melee_damage_upper = 20 - attacktext = "butchers" + attack_verb_continuous = "butchers" + attack_verb_simple = "butcher" attack_sound = 'sound/weapons/bladeslice.ogg' construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/area_conversion, /obj/effect/proc_holder/spell/targeted/forcewall/cult) @@ -392,6 +401,9 @@ var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult) if(!C) return + if(!C.cult_team) + to_chat(the_construct, "You are alone, and have no team.") + return var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives if(summon_objective.check_completion()) diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 2e0e9dadb4..585bf58d95 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -20,7 +20,7 @@ uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas head = /obj/item/clothing/head/helmet/swat @@ -39,7 +39,7 @@ uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas/syndicate back = /obj/item/tank/jetpack/oxygen @@ -59,7 +59,7 @@ uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas/syndicate back = /obj/item/tank/jetpack/oxygen/harness @@ -130,7 +130,7 @@ uniform = /obj/item/clothing/under/syndicate/camo suit = /obj/item/clothing/suit/armor/bulletproof shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat ears = /obj/item/radio/headset head = /obj/item/clothing/head/helmet/alt mask = /obj/item/clothing/mask/balaclava @@ -177,7 +177,7 @@ uniform = /obj/item/clothing/under/rank/security/officer suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas/sechailer/swat head = /obj/item/clothing/head/helmet/swat/nanotrasen diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 0cc097dc08..90fdeb0a62 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -2,7 +2,7 @@ /mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = round(CLAMP(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION) + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth),DAMAGE_PRECISION) if(updating_health) updatehealth() return amount diff --git a/code/modules/mob/living/simple_animal/friendly/bumbles.dm b/code/modules/mob/living/simple_animal/friendly/bumbles.dm index 1a78a47031..2d236a4327 100644 --- a/code/modules/mob/living/simple_animal/friendly/bumbles.dm +++ b/code/modules/mob/living/simple_animal/friendly/bumbles.dm @@ -5,14 +5,18 @@ icon_living = "bumbles" icon_dead = "bumbles_dead" turns_per_move = 1 - response_help = "pets" - response_disarm = "brushes aside" - response_harm = "squashes" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "brushes aside" + response_help_simple = "brush aside" + response_harm_continuous = "squashes" + response_harm_simple = "squash" speak_emote = list("buzzes") maxHealth = 100 health = 100 harm_intent_damage = 1 - friendly = "bzzs" + friendly_verb_continuous = "bzzs" + friendly_verb_simple = "bzz" density = FALSE movement_type = FLYING pass_flags = PASSTABLE | PASSGRILLE | PASSMOB diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 80fba5a9a4..bf4f45e283 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -5,14 +5,18 @@ icon_living = "butterfly" icon_dead = "butterfly_dead" turns_per_move = 1 - response_help = "shoos" - response_disarm = "brushes aside" - response_harm = "squashes" + response_help_continuous = "shoos" + response_help_simple = "shoo" + response_disarm_continuous = "brushes aside" + response_disarm_simple = "brush aside" + response_harm_continuous = "squashes" + response_harm_simple = "squash" speak_emote = list("flutters") maxHealth = 2 health = 2 harm_intent_damage = 1 - friendly = "nudges" + friendly_verb_continuous = "nudges" + friendly_verb_simple = "nudge" density = FALSE movement_type = FLYING pass_flags = PASSTABLE | PASSGRILLE | PASSMOB diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 1297fddb69..d30fa1b49f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -24,15 +24,18 @@ animal_species = /mob/living/simple_animal/pet/cat childtype = list(/mob/living/simple_animal/pet/cat/kitten) butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" var/held_icon = "cat2" - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/pet/cat/Initialize() . = ..() @@ -87,7 +90,6 @@ pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL collar_type = "kitten" - held_icon = "cat" //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -99,6 +101,7 @@ gender = FEMALE gold_core_spawnable = NO_SPAWN unique_pet = TRUE + held_icon = "cat" var/list/family = list()//var restored from savefile, has count of each child type var/list/children = list()//Actual mob instances of children var/cats_deployed = 0 @@ -112,13 +115,14 @@ Read_Memory() . = ..() -/mob/living/simple_animal/pet/cat/Runtime/Life() +/mob/living/simple_animal/pet/cat/Runtime/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP) Deploy_The_Cats() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory() memory_saved = TRUE - ..() /mob/living/simple_animal/pet/cat/Runtime/make_babies() var/mob/baby = ..() @@ -174,7 +178,9 @@ gold_core_spawnable = NO_SPAWN unique_pet = TRUE -/mob/living/simple_animal/pet/cat/Life() +/mob/living/simple_animal/pet/cat/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat && !buckled && !client) if(prob(1)) emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) @@ -245,7 +251,8 @@ harm_intent_damage = 10 butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/reagent_containers/food/snacks/cakeslice/birthday = 3, \ /obj/item/reagent_containers/food/snacks/meat/slab = 2) - response_harm = "takes a bite out of" + response_harm_continuous = "takes a bite out of" + response_harm_simple = "take a bite out of" attacked_sound = 'sound/items/eatfood.ogg' deathmessage = "loses its false life and collapses!" death_sound = "bodyfall" @@ -265,8 +272,9 @@ to_chat(src, "Your name is now \"new_name\"!") name = new_name -/mob/living/simple_animal/pet/cat/cak/Life() - ..() +/mob/living/simple_animal/pet/cat/cak/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(stat) return if(health < maxHealth) @@ -306,7 +314,6 @@ if (pseudo_death == TRUE) //secret cat chem icon_state = "custom_cat_dead" Stun(1000) - friendly = "deads at" return else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index 95aa86aaab..384fa8146f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -14,12 +14,16 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BUG - response_help = "pokes" - response_disarm = "shoos" - response_harm = "splats" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "splats" + response_harm_simple = "splat" speak_emote = list("chitters") density = FALSE ventcrawler = VENTCRAWLER_ALWAYS + mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 9e1ae48bdd..7f3693f622 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -11,19 +11,25 @@ blood_volume = 350 speak_chance = 1 turns_per_move = 5 - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "stomps" + response_harm_continuous = "stomp" stop_automated_movement = 1 - friendly = "pinches" + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" ventcrawler = VENTCRAWLER_ALWAYS + mob_size = MOB_SIZE_TINY var/obj/item/inventory_head var/obj/item/inventory_mask gold_core_spawnable = FRIENDLY_SPAWN -/mob/living/simple_animal/crab/Life() - ..() +/mob/living/simple_animal/crab/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return //CRAB movement if(!ckey && !stat) if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. @@ -41,9 +47,6 @@ real_name = "Coffee" desc = "It's Coffee, the other pet!" gender = FEMALE - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil @@ -53,9 +56,10 @@ icon_state = "evilcrab" icon_living = "evilcrab" icon_dead = "evilcrab_dead" - response_help = "pokes" - response_disarm = "shoves" - response_harm = "stomps" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoves" + response_disarm_simple = "shove" gold_core_spawnable = HOSTILE_SPAWN /mob/living/simple_animal/crab/kreb @@ -65,9 +69,6 @@ icon_state = "kreb" icon_living = "kreb" icon_dead = "kreb_dead" - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil/kreb diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 485cece8b7..0584995583 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -2,9 +2,12 @@ /mob/living/simple_animal/pet/dog mob_biotypes = MOB_ORGANIC|MOB_BEAST - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") speak_emote = list("barks", "woofs") emote_hear = list("barks!", "woofs!", "yaps.","pants.") @@ -15,7 +18,7 @@ turns_per_move = 10 var/held_icon = "corgi" - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/pet/dog/ComponentInitialize() . = ..() @@ -332,9 +335,6 @@ desc = "It's the HoP's beloved corgi." var/turns_since_scan = 0 var/obj/movement_target - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/age = 0 @@ -366,11 +366,12 @@ RemoveElement(/datum/element/mob_holder, held_icon) AddElement(/datum/element/mob_holder, "old_corgi") -/mob/living/simple_animal/pet/dog/corgi/Ian/Life() +/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory(FALSE) memory_saved = TRUE - ..() /mob/living/simple_animal/pet/dog/corgi/Ian/death() if(!memory_saved) @@ -419,8 +420,9 @@ fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) -/mob/living/simple_animal/pet/dog/corgi/Ian/Life() - ..() +/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife() + if(!(. = ..())) + return //Feeding, chasing food, FOOOOODDDD if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled) @@ -490,8 +492,9 @@ nofur = TRUE unique_pet = TRUE -/mob/living/simple_animal/pet/dog/corgi/narsie/Life() - ..() +/mob/living/simple_animal/pet/dog/corgi/narsie/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return for(var/mob/living/simple_animal/pet/P in range(1, src)) if(P != src && prob(5)) visible_message("[src] devours [P]!", \ @@ -604,9 +607,6 @@ icon_state = "lisa" icon_living = "lisa" icon_dead = "lisa_dead" - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 held_icon = "lisa" @@ -618,8 +618,9 @@ return ..() -/mob/living/simple_animal/pet/dog/corgi/Lisa/Life() - ..() +/mob/living/simple_animal/pet/dog/corgi/Lisa/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return make_babies() @@ -631,8 +632,9 @@ setDir(i) sleep(1) -/mob/living/simple_animal/pet/dog/pug/Life() - ..() +/mob/living/simple_animal/pet/dog/pug/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled) if(prob(1)) emote("me", EMOTE_VISIBLE, pick("chases its tail.")) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 0d344f1a9b..2a84152088 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -105,7 +105,7 @@ . = ..() if(can_be_held) //icon/item state is defined in mob_holder/drone_worn_icon() - AddElement(/datum/element/mob_holder, null, 'icons/mob/head.dmi', 'icons/mob/inhands/clothing_righthand.dmi', 'icons/mob/inhands/clothing_lefthand.dmi', ITEM_SLOT_HEAD, /datum/element/mob_holder.proc/drone_worn_icon) + AddElement(/datum/element/mob_holder, null, 'icons/mob/clothing/head.dmi', 'icons/mob/inhands/clothing_righthand.dmi', 'icons/mob/inhands/clothing_lefthand.dmi', ITEM_SLOT_HEAD, /datum/element/mob_holder.proc/drone_worn_icon) /mob/living/simple_animal/drone/med_hud_set_health() var/image/holder = hud_list[DIAG_HUD] diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 0f97a4c496..54184310a8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -92,8 +92,8 @@ return if(hack) if(hacked) - return Stun(40) + return if(clockwork) to_chat(src, "ERROR: LAW OVERRIDE DETECTED") to_chat(src, "From now on, these are your laws:") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 408edc7110..815c2bc0db 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -28,12 +28,7 @@ var/y_shift = getItemPixelShiftY() if(r_hand) - - var/r_state = r_hand.item_state - if(!r_state) - r_state = r_hand.icon_state - - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(y_shift) r_hand_overlay.pixel_y += y_shift @@ -46,12 +41,7 @@ client.screen |= r_hand if(l_hand) - - var/l_state = l_hand.item_state - if(!l_state) - l_state = l_hand.icon_state - - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(y_shift) l_hand_overlay.pixel_y += y_shift @@ -82,10 +72,10 @@ if(client && hud_used && hud_used.hud_shown) head.screen_loc = ui_drone_head client.screen += head - var/used_head_icon = 'icons/mob/head.dmi' + var/used_head_icon = 'icons/mob/clothing/head.dmi' if(istype(head, /obj/item/clothing/mask)) - used_head_icon = 'icons/mob/mask.dmi' - var/mutable_appearance/head_overlay = head.build_worn_icon(state = head.icon_state, default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon) + used_head_icon = 'icons/mob/clothing/mask.dmi' + var/mutable_appearance/head_overlay = head.build_worn_icon(default_layer = DRONE_HEAD_LAYER, default_icon_file = used_head_icon, override_state = head.icon_state) head_overlay.pixel_y -= 15 drone_overlays[DRONE_HEAD_LAYER] = head_overlay diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e67e649ac6..ba9cdfda64 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -13,13 +13,17 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" faction = list("neutral") mob_biotypes = MOB_ORGANIC|MOB_BEAST attack_same = 1 - attacktext = "kicks" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" attack_sound = 'sound/weapons/punch1.ogg' health = 40 maxHealth = 40 @@ -29,11 +33,12 @@ stop_automated_movement_when_pulled = 1 blood_volume = BLOOD_VOLUME_NORMAL var/obj/item/udder/udder = null + var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/retaliate/goat/Initialize() - udder = new() +/mob/living/simple_animal/hostile/retaliate/goat/Initialize(/datum/reagent/milk_reagent) + udder = new (null, milk_reagent) . = ..() /mob/living/simple_animal/hostile/retaliate/goat/Destroy() @@ -41,9 +46,10 @@ udder = null return ..() -/mob/living/simple_animal/hostile/retaliate/goat/Life() - . = ..() - if(.) +/mob/living/simple_animal/hostile/retaliate/goat/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(stat == CONSCIOUS) //chance to go crazy and start wacking stuff if(!enemies.len && prob(1)) Retaliate() @@ -52,8 +58,7 @@ enemies = list() LoseTarget() src.visible_message("[src] calms down.") - if(stat == CONSCIOUS) - udder.generateMilk() + udder.generateMilk(milk_reagent) eat_plants() if(!pulledby) for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) @@ -121,21 +126,26 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 6) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - attacktext = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" attack_sound = 'sound/weapons/punch1.ogg' health = 50 maxHealth = 50 var/obj/item/udder/udder = null + var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk gold_core_spawnable = FRIENDLY_SPAWN blood_volume = BLOOD_VOLUME_NORMAL - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/cow/Initialize() - udder = new() + udder = new(null, milk_reagent) . = ..() /mob/living/simple_animal/cow/Destroy() @@ -150,10 +160,11 @@ else return ..() -/mob/living/simple_animal/cow/Life() - . = ..() +/mob/living/simple_animal/cow/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(stat == CONSCIOUS) - udder.generateMilk() + udder.generateMilk(milk_reagent) /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M) if(!stat && M.a_intent == INTENT_DISARM && icon_state != icon_dead) @@ -181,6 +192,19 @@ else ..() +//Wisdom cow, speaks and bestows great wisdoms +/mob/living/simple_animal/cow/wisdom + name = "wisdom cow" + desc = "Known for its wisdom, shares it with all" + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/wisdomcow = 1) //truly the best meat + gold_core_spawnable = FALSE + speak_chance = 30 //the cow is eager to share its wisdom! + milk_reagent = /datum/reagent/medicine/liquid_wisdom + +/mob/living/simple_animal/cow/wisdom/Initialize() + . = ..() + speak = GLOB.wisdoms //Done here so it's setup properly + /mob/living/simple_animal/chick name = "\improper chick" desc = "Adorable! They make such a racket though." @@ -198,10 +222,14 @@ speak_chance = 2 turns_per_move = 2 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/chicken = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - attacktext = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" health = 3 maxHealth = 3 ventcrawler = VENTCRAWLER_ALWAYS @@ -210,16 +238,15 @@ mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/chick/Initialize() . = ..() pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/chick/Life() - . =..() - if(!.) +/mob/living/simple_animal/chick/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if(!stat && !ckey) amount_grown += rand(1,2) @@ -227,8 +254,9 @@ new /mob/living/simple_animal/chicken(src.loc) qdel(src) -/mob/living/simple_animal/chick/holo/Life() - ..() +/mob/living/simple_animal/chick/holo/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return amount_grown = 0 /mob/living/simple_animal/chicken @@ -249,10 +277,14 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/chicken = 2) var/egg_type = /obj/item/reagent_containers/food/snacks/egg var/food_type = /obj/item/reagent_containers/food/snacks/grown/wheat - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - attacktext = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" health = 15 maxHealth = 15 ventcrawler = VENTCRAWLER_ALWAYS @@ -268,7 +300,7 @@ gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/chicken/Initialize() . = ..() @@ -297,9 +329,8 @@ else ..() -/mob/living/simple_animal/chicken/Life() - . =..() - if(!.) +/mob/living/simple_animal/chicken/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if((!stat && prob(3) && eggsleft > 0) && egg_type) visible_message("[src] [pick(layMessage)]") @@ -342,10 +373,14 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) var/egg_type = /obj/item/reagent_containers/food/snacks/egg/kiwiEgg var/food_type = /obj/item/reagent_containers/food/snacks/grown/wheat - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - attacktext = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" health = 25 maxHealth = 25 ventcrawler = VENTCRAWLER_ALWAYS @@ -358,6 +393,8 @@ gold_core_spawnable = FRIENDLY_SPAWN var/static/kiwi_count = 0 + footstep_type = FOOTSTEP_MOB_CLAW + /mob/living/simple_animal/kiwi/Destroy() --kiwi_count return ..() @@ -366,9 +403,8 @@ . = ..() ++kiwi_count -/mob/living/simple_animal/kiwi/Life() - . =..() - if(!.) +/mob/living/simple_animal/kiwi/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if((!stat && prob(3) && eggsleft > 0) && egg_type) visible_message("[src] [pick(layMessage)]") @@ -418,10 +454,14 @@ speak_chance = 2 turns_per_move = 2 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - attacktext = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" health = 10 maxHealth = 10 ventcrawler = VENTCRAWLER_ALWAYS @@ -430,14 +470,15 @@ mob_size = MOB_SIZE_TINY gold_core_spawnable = FRIENDLY_SPAWN + footstep_type = FOOTSTEP_MOB_CLAW + /mob/living/simple_animal/babyKiwi/Initialize() . = ..() pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/babyKiwi/Life() - . =..() - if(!.) +/mob/living/simple_animal/babyKiwi/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if(!stat && !ckey) amount_grown += rand(1,2) @@ -453,14 +494,16 @@ /obj/item/udder name = "udder" -/obj/item/udder/Initialize() +/obj/item/udder/Initialize(loc, milk_reagent) + if(!milk_reagent) + milk_reagent = /datum/reagent/consumable/milk create_reagents(50, NONE, NO_REAGENTS_VALUE) - reagents.add_reagent(/datum/reagent/consumable/milk, 20) + reagents.add_reagent(milk_reagent, 20) . = ..() -/obj/item/udder/proc/generateMilk() +/obj/item/udder/proc/generateMilk(datum/reagent/milk_reagent) if(prob(5)) - reagents.add_reagent(/datum/reagent/consumable/milk, rand(5, 10)) + reagents.add_reagent(milk_reagent, rand(5, 10)) /obj/item/udder/proc/milkAnimal(obj/O, mob/user) var/obj/item/reagent_containers/glass/G = O @@ -472,3 +515,33 @@ user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].") else to_chat(user, "The udder is dry. Wait a bit longer...") + +/mob/living/simple_animal/deer + name = "doe" + desc = "A gentle, peaceful forest animal. How did this get into space?" + icon_state = "deer-doe" + icon_living = "deer-doe" + icon_dead = "deer-doe-dead" + gender = FEMALE + mob_biotypes = MOB_ORGANIC|MOB_BEAST + speak = list("Weeeeeeee?","Weeee","WEOOOOOOOOOO") + speak_emote = list("grunts","grunts lowly") + emote_hear = list("brays.") + emote_see = list("shakes its head.") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently nudges" + response_disarm_simple = "gently nudge" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "bucks" + attack_verb_simple = "buck" + attack_sound = 'sound/weapons/punch1.ogg' + health = 75 + maxHealth = 75 + blood_volume = BLOOD_VOLUME_NORMAL + footstep_type = FOOTSTEP_MOB_SHOE diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 95b082b733..4e4fd7ccfc 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -14,11 +14,14 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" gold_core_spawnable = FRIENDLY_SPAWN - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/pet/fox/ComponentInitialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/gondola.dm b/code/modules/mob/living/simple_animal/friendly/gondola.dm index 04d53e7d05..0cfea3548b 100644 --- a/code/modules/mob/living/simple_animal/friendly/gondola.dm +++ b/code/modules/mob/living/simple_animal/friendly/gondola.dm @@ -9,9 +9,12 @@ name = "gondola" real_name = "gondola" desc = "Gondola is the silent walker. Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling facial expression shows his utter and complete acceptance of the world as it is. Its hide is extremely valuable." - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" faction = list("gondola") turns_per_move = 10 icon = 'icons/mob/gondolas.dmi' diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 9ae46f29e5..b9ff99b677 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -8,12 +8,16 @@ health = 5 maxHealth = 5 faction = list("Lizard") - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" melee_damage_lower = 1 melee_damage_upper = 2 - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "stomps on" + response_harm_simple = "stomp on" ventcrawler = VENTCRAWLER_ALWAYS density = FALSE pass_flags = PASSTABLE | PASSMOB diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 370442d4c4..51c903ee16 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -15,9 +15,12 @@ maxHealth = 5 health = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "splats" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "splats" + response_harm_simple = "splat" density = FALSE ventcrawler = VENTCRAWLER_ALWAYS pass_flags = PASSTABLE | PASSGRILLE | PASSMOB @@ -26,6 +29,7 @@ var/body_color //brown, gray and white, leave blank for random gold_core_spawnable = FRIENDLY_SPAWN var/chew_probability = 1 + faction = list("rat") /mob/living/simple_animal/mouse/Initialize() . = ..() @@ -56,11 +60,15 @@ else ..(gibbed) + /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if( ishuman(AM) ) if(!stat) var/mob/M = AM to_chat(M, "[icon2html(src, M)] Squeak!") + if(istype(AM, /obj/item/reagent_containers/food/snacks/royalcheese)) + evolve() + qdel(AM) ..() /mob/living/simple_animal/mouse/handle_automated_action() @@ -81,6 +89,40 @@ C.deconstruct() visible_message("[src] chews through the [C].") + for(var/obj/item/reagent_containers/food/snacks/cheesewedge/cheese in range(1, src)) + if(prob(10)) + be_fruitful() + qdel(cheese) + return + for(var/obj/item/reagent_containers/food/snacks/royalcheese/bigcheese in range(1, src)) + qdel(bigcheese) + evolve() + return + +/** + *Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats. + */ + +/mob/living/simple_animal/mouse/proc/be_fruitful() + var/cap = CONFIG_GET(number/ratcap) + if(LAZYLEN(SSmobs.cheeserats) >= cap) + visible_message("[src] carefully eats the cheese, hiding it from the [cap] mice on the station!") + return + var/mob/living/newmouse = new /mob/living/simple_animal/mouse(loc) + SSmobs.cheeserats += newmouse + visible_message("[src] nibbles through the cheese, attracting another mouse!") + +/** + *Spawns a new regal rat, says some good jazz, and if sentient, transfers the relivant mind. + */ +/mob/living/simple_animal/mouse/proc/evolve() + var/mob/living/simple_animal/hostile/regalrat = new /mob/living/simple_animal/hostile/regalrat(loc) + visible_message("[src] devours the cheese! He morphs into something... greater!") + regalrat.say("RISE, MY SUBJECTS! SCREEEEEEE!") + if(mind) + mind.transfer_to(regalrat) + qdel(src) + /* * Mouse types */ @@ -97,15 +139,22 @@ body_color = "brown" icon_state = "mouse_brown" +/mob/living/simple_animal/mouse/Destroy() + SSmobs.cheeserats -= src + return ..() + +GLOBAL_VAR(tom_existed) + //TOM IS ALIVE! SQUEEEEEEEE~K :) /mob/living/simple_animal/mouse/brown/Tom name = "Tom" desc = "Jerry the cat is not amused." - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "splats" gold_core_spawnable = NO_SPAWN +/mob/living/simple_animal/mouse/brown/Tom/Initialize() + . = ..() + GLOB.tom_existed = TRUE + /obj/item/reagent_containers/food/snacks/deadmouse name = "dead mouse" desc = "It looks like somebody dropped the bass on it. A lizard's favorite meal." diff --git a/code/modules/mob/living/simple_animal/friendly/panda.dm b/code/modules/mob/living/simple_animal/friendly/panda.dm index a7b6143ef5..7e523fea83 100644 --- a/code/modules/mob/living/simple_animal/friendly/panda.dm +++ b/code/modules/mob/living/simple_animal/friendly/panda.dm @@ -13,8 +13,11 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" gold_core_spawnable = FRIENDLY_SPAWN - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 9835840dbf..f92f4184b7 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -1,9 +1,12 @@ //Penguins /mob/living/simple_animal/pet/penguin - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "bops" + response_disarm_simple = "bop" + response_harm_continuous = "kicks" + response_harm_simple = "kick" speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!") speak_emote = list("squawks", "gakkers") emote_hear = list("squawk!", "gakkers!", "noots.","NOOTS!") @@ -15,7 +18,7 @@ turns_per_move = 10 icon = 'icons/mob/penguins.dmi' - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_BAREFOOT /mob/living/simple_animal/pet/penguin/emperor name = "Emperor penguin" diff --git a/code/modules/mob/living/simple_animal/friendly/plushie.dm b/code/modules/mob/living/simple_animal/friendly/plushie.dm new file mode 100644 index 0000000000..ff95e8fe86 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/plushie.dm @@ -0,0 +1,79 @@ +//simplemob plushie that can be controlled by players +/mob/living/simple_animal/pet/plushie + name = "Plushie" + desc = "A living plushie!" + icon = 'icons/obj/plushes.dmi' + icon_state = "debug" + icon_living = "debug" + icon_dead = "debug" + speak_emote = list("squeaks") + maxHealth = 50 + health = 50 + density = FALSE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + mob_biotypes = MOB_ORGANIC + verb_say = "squeaks" + verb_ask = "squeaks inquisitively" + verb_exclaim = "squeaks intensely" + verb_yell = "squeaks intensely" + attack_sound = 'sound/items/toysqueak1.ogg' + attacked_sound = 'sound/items/toysqueak1.ogg' + melee_damage_type = STAMINA + melee_damage_lower = 0 + melee_damage_upper = 1 + attack_verb_continuous = "squeaks" + attack_verb_simple = "squeak" + deathmessage = "lets out a faint squeak as the glint in its eyes disappears" + footstep_type = FOOTSTEP_MOB_BAREFOOT + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + pressure_resistance = 200 + +/mob/living/simple_animal/pet/plushie/ComponentInitialize() + . = ..() + AddElement(/datum/element/mob_holder, "plushie") + +//shell that lets people turn into the plush or poll for ghosts +/obj/item/toy/plushie_shell + name = "Plushie Shell" + desc = "A plushie. Its eyes seem to be staring right back at you. Something isn't quite right." + icon = 'icons/obj/plushes.dmi' + icon_state = "debug" + var/obj/item/toy/plush/stored_plush = null + +//attacking yourself transfers your mind into the plush! +/obj/item/toy/plushie_shell/attack_self(mob/user) + if(user.mind) + var/safety = alert(user, "The plushie is staring back at you intensely, it seems cursed! (Permanently become a plushie)", "Hugging this is a bad idea.", "Hug it!", "Cancel") + if(safety == "Cancel" || !in_range(src, user)) + return + to_chat(user, "You hug the strange plushie. You fool.") + + //setup the mob + var/mob/living/simple_animal/pet/plushie/new_plushie = new /mob/living/simple_animal/pet/plushie/(user.loc) + new_plushie.icon = src.icon + new_plushie.icon_living = src.icon_state + new_plushie.icon_dead = src.icon_state + new_plushie.icon_state = src.icon_state + new_plushie.name = src.name + + //make the mob sentient + user.mind.transfer_to(new_plushie) + + //add sounds to mob + new_plushie.AddComponent(/datum/component/squeak, stored_plush.squeak_override) + if(length(stored_plush.squeak_override) > 0) + new_plushie.attack_sound = stored_plush.squeak_override[1] + new_plushie.attacked_sound = stored_plush.squeak_override[1] + + //take care of the user's old body and the old shell + user.dust(drop_items = TRUE) + qdel(src) + +//low regen over time +/mob/living/simple_animal/pet/plushie/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(health < maxHealth) + heal_overall_damage(5) //Decent life regen, they're not able to hurt anyone so this shouldn't be an issue (butterbear for reference has 10 regen) diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index 28063d6e52..bb93f95ee4 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -11,9 +11,13 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST gold_core_spawnable = FRIENDLY_SPAWN melee_damage_lower = 18 @@ -22,9 +26,9 @@ maxHealth = 50 speed = 10 glide_size = 2 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/pet/fox/ComponentInitialize() +/mob/living/simple_animal/pet/sloth/ComponentInitialize() . = ..() AddElement(/datum/element/mob_holder, "sloth") //finally oranges can be held diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index 7f75888649..4d20b927a6 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -19,12 +19,16 @@ speak_emote = list("hisses") health = 20 maxHealth = 20 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" melee_damage_lower = 5 melee_damage_upper = 6 - response_help = "pets" - response_disarm = "shoos" - response_harm = "steps on" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "steps on" + response_harm_simple = "step on" faction = list("hostile") ventcrawler = VENTCRAWLER_ALWAYS density = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 41c56169d0..73ebfa7c77 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -13,9 +13,12 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians gender = NEUTER mob_biotypes = NONE bubble_icon = "guardian" - response_help = "passes through" - response_disarm = "flails at" - response_harm = "punches" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" icon = 'icons/mob/guardian.dmi' icon_state = "magicbase" icon_living = "magicbase" @@ -29,7 +32,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" maxHealth = INFINITY //The spirit itself is invincible health = INFINITY healable = FALSE //don't brusepack the guardian @@ -109,7 +113,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians icon_dead = "holocarp" speak_emote = list("gnashes") desc = "A mysterious fish that stands by its charge, ever vigilant." - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' recolorentiresprite = TRUE if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason @@ -152,10 +157,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "Not a valid name, please try again.") guardianrename() return - visible_message("Your new name [new_name] anchors itself in your mind.") + to_chat(src, "Your new name [new_name] anchors itself in your mind.") fully_replace_character_name(null, new_name) -/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies +/mob/living/simple_animal/hostile/guardian/PhysicalLife() //Dies if the summoner dies . = ..() update_health_hud() //we need to update all of our health displays to match our summoner and we can't practically give the summoner a hook to do it med_hud_set_health() @@ -313,11 +318,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) - var/r_state = r_hand.item_state - if(!r_state) - r_state = r_hand.icon_state - - hands_overlays += r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + hands_overlays += r_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) r_hand.layer = ABOVE_HUD_LAYER @@ -326,11 +327,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians client.screen |= r_hand if(l_hand) - var/l_state = l_hand.item_state - if(!l_state) - l_state = l_hand.icon_state - - hands_overlays += l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + hands_overlays += l_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) l_hand.layer = ABOVE_HUD_LAYER diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index e507a4c831..885f907997 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -1,6 +1,7 @@ //Assassin /mob/living/simple_animal/hostile/guardian/assassin - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) playstyle_string = "As an assassin type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage." @@ -18,8 +19,9 @@ . = ..() stealthcooldown = 0 -/mob/living/simple_animal/hostile/guardian/assassin/Life() - . = ..() +/mob/living/simple_animal/hostile/guardian/assassin/PhysicalLife() + if(!(. = ..())) + return updatestealthalert() if(loc == summoner && toggle) ToggleMode(0) diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 237ab9d919..0b4952aa9e 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -11,8 +11,9 @@ var/charging = 0 var/obj/screen/alert/chargealert -/mob/living/simple_animal/hostile/guardian/charger/Life() - . = ..() +/mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(ranged_cooldown <= world.time) if(!chargealert) chargealert = throw_alert("charge", /obj/screen/alert/cancharge) @@ -54,7 +55,7 @@ var/blocked = FALSE if(hasmatchingsummoner(hit_atom)) //if the summoner matches don't hurt them blocked = TRUE - if(L.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) + if(L.mob_run_block(src, 90, "[name]", ATTACK_TYPE_TACKLE, 0, src, null, null) & BLOCK_SUCCESS) blocked = TRUE if(!blocked) L.drop_all_held_items() diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index 718bfd71af..a05cd517fb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -4,7 +4,8 @@ melee_damage_lower = 10 melee_damage_upper = 10 attack_sound = 'sound/items/welder.ogg' - attacktext = "ignites" + attack_verb_continuous = "ignites" + attack_verb_simple = "ignite" melee_damage_type = BURN damage_coeff = list(BRUTE = 0.7, BURN = 0.1, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) playstyle_string = "As a chaos type, you take 30% damage reduction to all but burn, which you are almost immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you." @@ -12,8 +13,9 @@ tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish." -/mob/living/simple_animal/hostile/guardian/fire/Life() - . = ..() +/mob/living/simple_animal/hostile/guardian/fire/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(summoner) summoner.ExtinguishMob() summoner.adjust_fire_stacks(-20) diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index 7b7651822a..a1552f6648 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -6,7 +6,8 @@ /mob/living/simple_animal/hostile/guardian/beam melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "shocks" + attack_verb_continuous = "shocks" + attack_verb_simple = "shock" melee_damage_type = BURN attack_sound = 'sound/machines/defib_zap.ogg' damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 539ee9081b..1746936ba3 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -8,7 +8,8 @@ /mob/living/simple_animal/hostile/guardian/ranged a_intent = INTENT_HELP - friendly = "quietly assesses" + friendly_verb_continuous = "quietly assesses" + friendly_verb_simple = "quietly assess" melee_damage_lower = 10 melee_damage_upper = 10 damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 7b519e1ca1..21460b5c6b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -1,7 +1,8 @@ //Healer /mob/living/simple_animal/hostile/guardian/healer a_intent = INTENT_HARM - friendly = "heals" + friendly_verb_continuous = "heals" + friendly_verb_simple = "heal" damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) playstyle_string = "As a support type, you have 30% damage reduction and may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay." magic_fluff_string = "..And draw the CMO, a potent force of life... and death." diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 3b9700bb58..7120ab6d0a 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -8,9 +8,12 @@ icon_gib = "syndicate_gib" gender = FEMALE threat = 1 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoves" + response_disarm_simple = "shove" + response_harm_continuous = "hits" + response_harm_simple = "hit" speed = 0 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 4, /obj/item/stack/sheet/animalhide/xeno = 1) @@ -20,7 +23,8 @@ obj_damage = 60 melee_damage_lower = 25 melee_damage_upper = 25 - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" speak_emote = list("hisses") bubble_icon = "alien" a_intent = INTENT_HARM @@ -37,7 +41,9 @@ death_sound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." - do_footstep = TRUE +/mob/living/simple_animal/hostile/alien/Initialize() + . = ..() + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW) /mob/living/simple_animal/hostile/alien/drone name = "alien drone" @@ -80,6 +86,7 @@ icon_state = "alienq" icon_living = "alienq" icon_dead = "alienq_dead" + pixel_x = -16 threat = 8 health = 250 maxHealth = 250 @@ -162,7 +169,8 @@ melee_damage_upper = 0 threat = -1 a_intent = INTENT_HELP - friendly = "caresses" + friendly_verb_continuous = "caresses" + friendly_verb_simple = "caress" obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE gold_core_spawnable = HOSTILE_SPAWN @@ -175,7 +183,7 @@ AddElement(/datum/element/cleaning) /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() - if(ismovableatom(target)) + if(ismovable(target)) if(istype(target, /obj/effect/decal/cleanable)) visible_message("[src] cleans up \the [target].") qdel(target) diff --git a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm index f3ce343bfd..259c0bc721 100644 --- a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm @@ -13,14 +13,16 @@ maxbodytemp = INFINITY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - response_help = "pokes" - response_disarm = "shoos" - response_harm = "splats" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "splats" + response_harm_simple = "plat" speak_emote = list("chitters") mouse_opacity = 2 density = TRUE ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" verb_exclaim = "chitters loudly" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index a77098cb80..5dbf3e8e3b 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -17,9 +17,12 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 5, /obj/item/clothing/head/bearpelt = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" maxHealth = 60 health = 60 spacewalk = TRUE @@ -28,9 +31,11 @@ obj_damage = 60 melee_damage_lower = 20 melee_damage_upper = 30 - attacktext = "claws" + attack_verb_continuous = "claws" + attack_verb_simple = "claw" attack_sound = 'sound/weapons/bladeslice.ogg' - friendly = "bear hugs" + friendly_verb_continuous = "bear hugs" + friendly_verb_simple = "bear hug" //Space bears aren't affected by cold. atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -40,7 +45,7 @@ faction = list("russian") gold_core_spawnable = HOSTILE_SPAWN - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW //SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! /mob/living/simple_animal/hostile/bear/Hudson @@ -111,14 +116,16 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve melee_damage_lower = 1 melee_damage_upper = 1 armour_penetration = 0 - response_harm = "takes a bite out of" + response_harm_continuous = "takes a bite out of" + response_harm_simple = "take a bite out of" attacked_sound = 'sound/items/eatfood.ogg' deathmessage = "loses its false life and collapses!" butcher_results = list(/obj/item/reagent_containers/food/snacks/butter = 6, /obj/item/reagent_containers/food/snacks/meat/slab = 3, /obj/item/organ/brain = 1, /obj/item/organ/heart = 1) attack_sound = 'sound/weapons/slap.ogg' - attacktext = "slaps" + attack_verb_continuous = "slaps" + attack_verb_simple = "slap" -/mob/living/simple_animal/hostile/bear/butter/Life() //Heals butter bear really fast when he takes damage. +/mob/living/simple_animal/hostile/bear/butter/BiologicalLife(seconds, times_fired) //Heals butter bear really fast when he takes damage. if(stat) return if(health < maxHealth) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index f5454933c8..5f3d4f11c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -23,10 +23,14 @@ turns_per_move = 0 melee_damage_lower = 1 melee_damage_upper = 1 - attacktext = "stings" - response_help = "shoos" - response_disarm = "swats away" - response_harm = "squashes" + attack_verb_continuous = "stings" + attack_verb_simple = "sting" + response_help_continuous = "shoos" + response_help_simple = "shoo" + response_disarm_continuous = "swats away" + response_disarm_simple = "swat away" + response_harm_continuous = "squashes" + response_harm_simple = "squash" maxHealth = 10 health = 10 spacewalk = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index dbb957a96b..cde63adffd 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -2,14 +2,16 @@ name = "A Perfectly Generic Boss Placeholder" desc = "" threat = 10 - robust_searching = 1 + robust_searching = TRUE stat_attack = UNCONSCIOUS - status_flags = 0 + status_flags = NONE a_intent = INTENT_HARM gender = NEUTER + has_field_of_vision = FALSE //You are a frikkin boss var/list/boss_abilities = list() //list of /datum/action/boss var/datum/boss_active_timed_battle/atb - var/point_regen_delay = 1 + var/point_regen_delay = 20 + var/point_regen_amount = 1 /mob/living/simple_animal/hostile/boss/Initialize() @@ -17,58 +19,68 @@ atb = new() atb.point_regen_delay = point_regen_delay + atb.point_regen_amount = point_regen_amount atb.boss = src for(var/ab in boss_abilities) boss_abilities -= ab var/datum/action/boss/AB = new ab() - AB.boss = src AB.Grant(src) boss_abilities += AB atb.assign_abilities(boss_abilities) - /mob/living/simple_animal/hostile/boss/Destroy() - qdel(atb) - atb = null - for(var/ab in boss_abilities) - var/datum/action/boss/AB = ab - AB.boss = null - AB.Remove(src) - qdel(AB) - boss_abilities.Cut() + QDEL_NULL(atb) + QDEL_LIST(boss_abilities) return ..() - //Action datum for bosses //Override Trigger() as shown below to do things /datum/action/boss check_flags = AB_CHECK_CONSCIOUS //Incase the boss is given a player + required_mobility_flags = NONE var/boss_cost = 100 //Cost of usage for the boss' AI 1-100 var/usage_probability = 100 + var/list/req_statuses //If set, will only trigger if the mob AI status is present in this list. var/mob/living/simple_animal/hostile/boss/boss var/boss_type = /mob/living/simple_animal/hostile/boss var/needs_target = TRUE //Does the boss need to have a target? (Only matters for the AI) var/say_when_triggered = "" //What does the boss Say() when the ability triggers? +/datum/action/boss/Destroy() + boss = null + return ..() + +/datum/action/boss/Grant(mob/M) + . = ..() + boss = owner + +/datum/action/boss/Remove(mob/M) + . = ..() + boss = null + +/datum/action/boss/IsAvailable(silent = FALSE) + . = ..() + if(!.) + return + if(!istype(boss, boss_type)) + return FALSE + if(!boss.atb) + return FALSE + if(boss.atb.points < boss_cost) + return FALSE + if(!boss.client && needs_target && !boss.target) + return FALSE + /datum/action/boss/Trigger() . = ..() - if(.) - if(!istype(boss, boss_type)) - return 0 - if(!boss.atb) - return 0 - if(boss.atb.points < boss_cost) - return 0 - if(!boss.client) - if(needs_target && !boss.target) - return 0 - if(boss) - if(say_when_triggered) - boss.say(say_when_triggered, forced = "boss action") - if(!boss.atb.spend(boss_cost)) - return 0 + if(!.) + return + if(!boss.atb.spend(boss_cost)) + return FALSE + if(say_when_triggered) + boss.say(say_when_triggered, forced = "boss action") //Example: /* @@ -81,58 +93,57 @@ //Designed for boss mobs only /datum/boss_active_timed_battle var/list/abilities //a list of /datum/action/boss owned by a boss mob - var/point_regen_delay = 5 - var/points = 50 //1-100, start with 50 so we can use some abilities but not insta-buttfug somebody + var/point_regen_delay = 20 + var/point_regen_amount = 1 + var/max_points = 100 + var/points = 50 //start with 50 so we can use some abilities but not insta-buttfug somebody var/next_point_time = 0 var/chance_to_hold_onto_points = 50 var/highest_cost = 0 var/mob/living/simple_animal/hostile/boss/boss - /datum/boss_active_timed_battle/New() ..() START_PROCESSING(SSobj, src) - /datum/boss_active_timed_battle/proc/assign_abilities(list/L) if(!L) - return 0 + return FALSE abilities = L for(var/ab in abilities) var/datum/action/boss/AB = ab if(AB.boss_cost > highest_cost) highest_cost = AB.boss_cost - /datum/boss_active_timed_battle/proc/spend(cost) if(cost <= points) - points = max(0,points-cost) - return 1 - return 0 - + points -= cost + return TRUE + return FALSE /datum/boss_active_timed_battle/proc/refund(cost) - points = min(points+cost, 100) - + points = min(points+cost, max_points) /datum/boss_active_timed_battle/process() - if(world.time >= next_point_time) + if(world.time >= next_point_time && points < max_points) next_point_time = world.time + point_regen_delay - points = min(100, ++points) //has to be out of 100 + points = min(max_points, points + point_regen_amount) - if(abilities) - chance_to_hold_onto_points = highest_cost*0.5 - if(points != 100 && prob(chance_to_hold_onto_points)) - return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!) - if(!boss.client) - abilities = shuffle(abilities) - for(var/ab in abilities) - var/datum/action/boss/AB = ab - if(prob(AB.usage_probability) && AB.Trigger()) - break + if(!abilities) + return + chance_to_hold_onto_points = highest_cost*0.5 + if(points != max_points && prob(chance_to_hold_onto_points)) + return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!) + if(!boss.client) + abilities = shuffle(abilities) + for(var/ab in abilities) + var/datum/action/boss/AB = ab + if(!boss.client && (!AB.req_statuses || (boss.AIStatus in AB.req_statuses)) && prob(AB.usage_probability) && AB.Trigger()) + break + AB.UpdateButtonIcon(TRUE) /datum/boss_active_timed_battle/Destroy() abilities = null - SSobj.processing.Remove(src) + STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index 07572fff83..fe00af9384 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -23,7 +23,7 @@ attack_sound = 'sound/hallucinations/growl1.ogg' var/list/copies = list() - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE //Summon Ability @@ -32,25 +32,48 @@ name = "Summon Minions" icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' button_icon_state = "art_summon" - usage_probability = 40 + usage_probability = 20 boss_cost = 30 boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard needs_target = FALSE + req_statuses = list(AI_ON) say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!" - var/static/summoned_minions = 0 + var/list/summoned_minions = list() + var/maximum_stickmen = 6 + var/stickmen_to_summon = 3 /datum/action/boss/wizard_summon_minions/Trigger() - if(summoned_minions <= 6 && ..()) - var/list/minions = list( - /mob/living/simple_animal/hostile/stickman, - /mob/living/simple_animal/hostile/stickman/ranged, - /mob/living/simple_animal/hostile/stickman/dog) - var/list/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/minions_chosen = pick_n_take(minions) - new minions_chosen (get_step(boss,pick_n_take(directions)), 1) - summoned_minions += 3; + . =..() + if(!.) + return + var/to_summon = stickmen_to_summon + var/current_len = length(summoned_minions) + if(current_len > maximum_stickmen - stickmen_to_summon) + for(var/a in (maximum_stickmen - stickmen_to_summon) to current_len) + var/mob/living/simple_animal/hostile/stickman/S = popleft(summoned_minions) + if(!S.client) + qdel(S) + else + S.forceMove(boss.drop_location()) + S.revive(TRUE) + summoned_minions += S + to_summon-- + var/static/list/minions = list( + /mob/living/simple_animal/hostile/stickman, + /mob/living/simple_animal/hostile/stickman/ranged, + /mob/living/simple_animal/hostile/stickman/dog) + + var/list/directions = GLOB.cardinals.Copy() + for(var/i in 1 to to_summon) + var/minions_chosen = pick(minions) + var/mob/living/simple_animal/hostile/stickman/S = new minions_chosen (get_step(boss,pick_n_take(directions)), 1) + S.faction = boss.faction + RegisterSignal(S, COMSIG_PARENT_QDELETING, .proc/remove_from_list) + summoned_minions += S + +/datum/action/boss/wizard_summon_minions/proc/remove_from_list(datum/source, forced) + summoned_minions -= source //Mimic Ability //Summons mimics of himself with magical papercraft @@ -63,31 +86,36 @@ usage_probability = 30 boss_cost = 40 boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard + req_statuses = list(AI_ON) say_when_triggered = "" /datum/action/boss/wizard_mimic/Trigger() - if(..()) - var/mob/living/target - if(!boss.client) //AI's target - target = boss.target - else //random mob - var/list/threats = boss.PossibleThreats() - if(threats.len) - target = pick(threats) - if(target) - var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss - var/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions))) - wiz.copies += C - C.original = wiz - C.say("My craft defines me, you could even say it IS me!") - wiz.say("My craft defines me, you could even say it IS me!") - wiz.forceMove(get_step(target,pick_n_take(directions))) - wiz.minimum_distance = 1 //so he doesn't run away and ruin everything - wiz.retreat_distance = 0 + . = ..() + if(!.) + return + var/mob/living/target + if(!boss.client) //AI's target + target = boss.target + else //random mob + var/list/threats = boss.PossibleThreats() + if(threats.len) + target = pick(threats) else - boss.atb.refund(boss_cost) + to_chat(owner, "There is no potential foe of different faction around to attack") + if(target) + var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss + var/directions = GLOB.cardinals.Copy() + for(var/i in 1 to 3) + var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions))) + wiz.copies += C + C.original = wiz + C.say("My craft defines me, you could even say it IS me!") + wiz.say("My craft defines me, you could even say it IS me!") + wiz.forceMove(get_step(target,pick_n_take(directions))) + wiz.minimum_distance = 1 //so he doesn't run away and ruin everything + wiz.retreat_distance = 0 + else + boss.atb.refund(boss_cost) /mob/living/simple_animal/hostile/boss/paper_wizard/copy desc = "'Tis a ruse!" diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 9c89ff4a4f..f775d6600c 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -7,14 +7,15 @@ icon_living = "carp" icon_dead = "carp_dead" icon_gib = "carp_gib" - threat = 0.2 + threat = 0.1 mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" emote_taunt = list("gnashes") taunt_chance = 30 speed = 0 @@ -25,7 +26,8 @@ obj_damage = 50 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") //Space carp aren't affected by cold. @@ -45,8 +47,9 @@ if(regen_amount) regen_cooldown = world.time + REGENERATION_DELAY -/mob/living/simple_animal/hostile/carp/Life() - . = ..() +/mob/living/simple_animal/hostile/carp/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(regen_amount && regen_cooldown < world.time) heal_overall_damage(regen_amount) diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index 4e3375caf7..d85f75cbbd 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -8,9 +8,6 @@ icon_gib = "syndicate_gib" speak_chance = 0 turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" speed = 0 stat_attack = UNCONSCIOUS robust_searching = 1 @@ -19,7 +16,8 @@ harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "slashes at" + attack_verb_continuous = "slashes at" + attack_verb_simple = "slash at" attack_sound = 'sound/weapons/circsawhit.ogg' a_intent = INTENT_HARM mob_biotypes = MOB_ORGANIC|MOB_HUMANOID diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm deleted file mode 100644 index bba37f94af..0000000000 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ /dev/null @@ -1,18 +0,0 @@ -/mob/living/simple_animal/hostile/creature - name = "creature" - desc = "A sanity-destroying otherthing." - icon_state = "otherthing" - icon_living = "otherthing" - icon_dead = "otherthing-dead" - health = 80 - maxHealth = 80 - obj_damage = 100 - melee_damage_lower = 25 - melee_damage_upper = 50 - attacktext = "chomps" - attack_sound = 'sound/weapons/bite.ogg' - faction = list("creature") - speak_emote = list("screams") - gold_core_spawnable = HOSTILE_SPAWN - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index 6ca6eac0cc..48266e3e76 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -17,7 +17,8 @@ obj_damage = 20 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "staves" + attack_verb_continuous = "staves" + attack_verb_simple = "stave" a_intent = INTENT_HARM speak_emote = list("chants") attack_sound = 'sound/weapons/bladeslice.ogg' @@ -25,7 +26,7 @@ turns_per_move = 5 gold_core_spawnable = HOSTILE_SPAWN faction = list(ROLE_WIZARD) - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE weather_immunities = list("lava","ash") minbodytemp = 0 maxbodytemp = INFINITY diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index dbb9048ca4..75e8c55236 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -8,9 +8,10 @@ icon_gib = "" gender = NEUTER mob_biotypes = MOB_ORGANIC - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" emote_taunt = list("glares") taunt_chance = 25 maxHealth = 45 @@ -21,9 +22,11 @@ obj_damage = 60 melee_damage_lower = 20 melee_damage_upper = 25 - attacktext = "blinks at" + attack_verb_continuous = "blinks at" + attack_verb_simple = "blink at" attack_sound = 'sound/weapons/pierce.ogg' movement_type = FLYING faction = list("spooky") del_on_death = 1 + field_of_vision_type = FOV_270_DEGREES //Obviously, it's one eyeball. diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 7ac0ea2b44..4f8d2fef6c 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -9,9 +9,12 @@ gender = MALE speak_chance = 0 turns_per_move = 5 - response_help = "passes through" - response_disarm = "shoves" - response_harm = "hits" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "shoves" + response_disarm_simple = "shove" + response_harm_continuous = "hits" + response_harm_simple = "hit" emote_taunt = list("wails") taunt_chance = 25 speed = 0 @@ -26,7 +29,8 @@ obj_damage = 50 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "grips" + attack_verb_continuous = "grips" + attack_verb_simple = "grip" attack_sound = 'sound/hallucinations/growl1.ogg' speak_emote = list("growls") @@ -36,7 +40,7 @@ faction = list("faithless") gold_core_spawnable = HOSTILE_SPAWN - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/faithless/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 3c3612f434..a253ecfd96 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -30,9 +30,12 @@ turns_per_move = 5 see_in_dark = 10 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/spider = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" maxHealth = 200 health = 200 obj_damage = 60 @@ -43,18 +46,19 @@ pass_flags = PASSTABLE move_to_delay = 6 ventcrawler = VENTCRAWLER_ALWAYS - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 gold_core_spawnable = HOSTILE_SPAWN see_in_dark = 4 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + footstep_type = FOOTSTEP_MOB_CLAW + has_field_of_vision = FALSE // 360° vision. var/playable_spider = FALSE var/datum/action/innate/spider/lay_web/lay_web var/directive = "" //Message passed down to children, to relay the creator's orders - do_footstep = TRUE - /mob/living/simple_animal/hostile/poison/giant_spider/Initialize() . = ..() lay_web = new @@ -186,10 +190,10 @@ . = ..() if(slowed_by_webs) if(!(locate(/obj/structure/spider/stickyweb) in loc)) - remove_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB) + remove_movespeed_modifier(/datum/movespeed_modifier/tarantula_web) slowed_by_webs = FALSE else if(locate(/obj/structure/spider/stickyweb) in loc) - add_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB, priority=100, multiplicative_slowdown=3) + add_movespeed_modifier(/datum/movespeed_modifier/tarantula_web) slowed_by_webs = TRUE //midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one. @@ -400,10 +404,9 @@ action.button_icon_state = "wrap_[active]" action.UpdateButtonIcon() -/obj/effect/proc_holder/wrap/Click() - if(!istype(usr, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) +/obj/effect/proc_holder/wrap/Trigger(mob/living/simple_animal/hostile/poison/giant_spider/nurse/user) + if(!istype(user)) return TRUE - var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = usr activate(user) return TRUE @@ -444,7 +447,7 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "lay_eggs" -/datum/action/innate/spider/lay_eggs/IsAvailable() +/datum/action/innate/spider/lay_eggs/IsAvailable(silent = FALSE) if(..()) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) return 0 @@ -508,7 +511,7 @@ desc = "Send a command to all living spiders." button_icon_state = "command" -/datum/action/innate/spider/comm/IsAvailable() +/datum/action/innate/spider/comm/IsAvailable(silent = FALSE) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) return FALSE return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index db232c20c4..1dcb13aa9b 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -10,9 +10,12 @@ speak_chance = 0 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" emote_taunt = list("hisses") taunt_chance = 30 speed = 0 @@ -21,7 +24,8 @@ harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "pecks" + attack_verb_continuous = "pecks" + attack_verb_simple = "peck" attack_sound = "goose" speak_emote = list("honks") faction = list("neutral") diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 7c6f9e9c7b..f48eef083b 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -16,16 +16,20 @@ health = 220 loot = list(/obj/effect/gibspawner/generic) butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/gorilla = 4) - response_help = "prods" - response_disarm = "challenges" - response_harm = "thumps" + response_help_continuous = "prods" + response_help_simple = "prod" + response_disarm_continuous = "challenges" + response_disarm_simple = "challenge" + response_harm_continuous = "thumps" + response_harm_simple = "thump" speed = 1 melee_damage_lower = 15 melee_damage_upper = 18 damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5) obj_damage = 20 environment_smash = ENVIRONMENT_SMASH_WALLS - attacktext = "pummels" + attack_verb_continuous = "pummels" + attack_verb_simple = "pummel" attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE held_items = list(null, null) @@ -39,7 +43,7 @@ var/list/gorilla_overlays[GORILLA_TOTAL_LAYERS] var/oogas = 0 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_BAREFOOT // Gorillas like to dismember limbs from unconcious mobs. // Returns null when the target is not an unconcious carbon mob; a list of limbs (possibly empty) otherwise. diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm index b3e0f3b658..9d451748b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm @@ -33,14 +33,12 @@ var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) - var/r_state = r_hand.item_state ? r_hand.item_state : r_hand.icon_state - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(state = r_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) + var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) r_hand_overlay.pixel_y -= 1 hands_overlays += r_hand_overlay if(l_hand) - var/l_state = l_hand.item_state ? l_hand.item_state : l_hand.icon_state - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(state = l_state, default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) + var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) l_hand_overlay.pixel_y -= 1 hands_overlays += l_hand_overlay diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 9d64b76198..501534237a 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -12,7 +12,8 @@ maxHealth = 50 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "chomps" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 1cc675825f..b627bf67c2 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -16,7 +16,8 @@ healable = 0 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "saw" + attack_verb_continuous = "saw" + attack_verb_simple = "saw" attack_sound = 'sound/weapons/bladeslice.ogg' projectilesound = 'sound/weapons/gunshot.ogg' projectiletype = /obj/item/projectile/hivebotbullet @@ -30,7 +31,7 @@ loot = list(/obj/effect/decal/cleanable/robot_debris) blood_volume = 0 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/hostile/hivebot/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index e496d007a2..945842d5ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -20,6 +20,7 @@ var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING var/move_to_delay = 3 //delay for the automated movement. var/list/friends = list() + var/list/foes = list() var/list/emote_taunt = list() var/taunt_chance = 0 @@ -62,13 +63,14 @@ /mob/living/simple_animal/hostile/Destroy() targets_from = null + friends = null + foes = null return ..() -/mob/living/simple_animal/hostile/Life() - . = ..() - if(!.) //dead +/mob/living/simple_animal/hostile/BiologicalLife(seconds, times_fired) + if(!(. = ..())) walk(src, 0) //stops walking - return 0 + return /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) @@ -114,7 +116,7 @@ Move(get_step(src,chosen_dir)) face_atom(target) //Looks better if they keep looking at you when dodging -/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) +/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user) FindTarget(list(user), 1) return ..() @@ -193,7 +195,7 @@ // Please do not add one-off mob AIs here, but override this function for your mob /mob/living/simple_animal/hostile/CanAttack(atom/the_target)//Can we actually attack a possible target? - if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids + if(!the_target || the_target.type == /atom/movable/lighting_object || isturf(the_target)) // bail out on invalids return FALSE if(ismob(the_target)) //Target is in godmode, ignore it. @@ -208,13 +210,13 @@ if(search_objects < 2) if(isliving(the_target)) var/mob/living/L = the_target - var/faction_check = faction_check_mob(L) + var/faction_check = !foes[L] && faction_check_mob(L) if(robust_searching) if(faction_check && !attack_same) return FALSE - if(L.stat > stat_attack) + if(L.stat > stat_attack || (L.stat == UNCONSCIOUS && stat_attack == UNCONSCIOUS && HAS_TRAIT(L, TRAIT_DEATHCOMA))) return FALSE - if(L in friends) + if(friends[L] > 0 && foes[L] < 1) return FALSE else if((faction_check && !attack_same) || L.stat) @@ -347,10 +349,11 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget() SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target) in_melee = TRUE + /* sorry for the simplemob vore fans if(vore_active) if(isliving(target)) var/mob/living/L = target - if(!client && L.Adjacent(src) && L.devourable) // aggressive check to ensure vore attacks can be made + if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags,DEVOURABLE)) // aggressive check to ensure vore attacks can be made if(prob(voracious_chance)) vore_attack(src,L,src) else @@ -361,6 +364,8 @@ return target.attack_animal(src) else return target.attack_animal(src) + */ + return target.attack_animal(src) /mob/living/simple_animal/hostile/proc/Aggro() vision_range = aggro_vision_range diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 89303702f3..f561f0d43c 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -10,7 +10,8 @@ melee_damage_lower = 5 melee_damage_upper = 5 a_intent = INTENT_HARM - attacktext = "gores" + attack_verb_continuous = "gores" + attack_verb_simple = "gore" maxHealth = 100 health = 100 speed = 0 @@ -20,14 +21,14 @@ var/multiply_chance = 0 //if we multiply on hit del_on_death = 1 deathmessage = "vanishes into thin air! It was a fake!" + has_field_of_vision = FALSE //not meant to be played anyway. - -/mob/living/simple_animal/hostile/illusion/Life() - ..() +/mob/living/simple_animal/hostile/illusion/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(world.time > life_span) death() - /mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, hp = 100, damage = 0, replicate = 0 ) appearance = original.appearance parent_mob = original diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm index c337344c90..c2b553aad7 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm @@ -7,9 +7,8 @@ environment_smash = ENVIRONMENT_SMASH_WALLS minbodytemp = 0 maxbodytemp = 450 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "strikes" + response_harm_continuous = "strikes" + response_harm_simple = "strike" status_flags = NONE a_intent = INTENT_HARM see_in_dark = 4 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 05c4007b6f..51f61fa158 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -27,7 +27,7 @@ var/hop_cooldown = 0 //Strictly for player controlled leapers var/projectile_ready = FALSE //Stopping AI leapers from firing whenever they want, and only doing it after a hop has finished instead - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_HEAVY /obj/item/projectile/leaper name = "leaper bubble" @@ -166,8 +166,9 @@ if(!hopping) Hop() -/mob/living/simple_animal/hostile/jungle/leaper/Life() - . = ..() +/mob/living/simple_animal/hostile/jungle/leaper/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return update_icons() /mob/living/simple_animal/hostile/jungle/leaper/adjustHealth(amount, updating_health = TRUE, forced = FALSE) @@ -197,7 +198,7 @@ hopping = TRUE density = FALSE pass_flags |= PASSMOB - notransform = TRUE + mob_transforming = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) if(player_hop) new_turf = get_turf(target) @@ -209,7 +210,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop() density = TRUE - notransform = FALSE + mob_transforming = FALSE pass_flags &= ~PASSMOB hopping = FALSE playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, 1) @@ -220,7 +221,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop() var/turf/new_turf = get_turf(target) hopping = TRUE - notransform = TRUE + mob_transforming = TRUE new /obj/effect/temp_visual/leaper_crush(new_turf) addtimer(CALLBACK(src, .proc/BellyFlopHop, new_turf), 30) @@ -231,7 +232,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/Crush() hopping = FALSE density = TRUE - notransform = FALSE + mob_transforming = FALSE playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1) for(var/mob/living/L in orange(1, src)) L.adjustBruteLoss(35) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm index ae161d596d..99349168f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm @@ -25,10 +25,11 @@ projectilesound = 'sound/weapons/pierce.ogg' alpha = 50 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_CLAW -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life() - ..() +/mob/living/simple_animal/hostile/jungle/mega_arachnid/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(target && ranged_cooldown > world.time && iscarbon(target)) var/mob/living/carbon/C = target if(!C.legcuffed && C.health < 50) @@ -40,7 +41,6 @@ minimum_distance = 0 alpha = 255 - /mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro() ..() alpha = 255 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index c05d14965e..6efa0cf468 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -32,7 +32,7 @@ var/attack_state = MOOK_ATTACK_NEUTRAL var/struck_target_leap = FALSE - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_BAREFOOT /mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O) if(istype(O, /mob/living/simple_animal/hostile/jungle/mook)) diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index e418cc4ab0..9cb65d7c30 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -12,12 +12,16 @@ health = 30 see_in_dark = 3 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/killertomato = 2) - response_help = "prods" - response_disarm = "pushes aside" - response_harm = "smacks" + response_help_continuous = "prods" + response_help_simple = "prod" + response_disarm_continuous = "pushes aside" + response_disarm_simple = "push aside" + response_harm_continuous = "smacks" + response_harm_simple = "smack" melee_damage_lower = 8 melee_damage_upper = 12 - attacktext = "slams" + attack_verb_continuous = "slams" + attack_verb_simple = "slam" attack_sound = 'sound/weapons/punch1.ogg' ventcrawler = VENTCRAWLER_ALWAYS faction = list("plants") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index c90ebe8a5c..3ef4ef9be9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -54,7 +54,7 @@ Difficulty: Medium deathmessage = "falls to the ground, decaying into glowing particles." death_sound = "bodyfall" - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_HEAVY /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance guidance = TRUE @@ -75,7 +75,7 @@ Difficulty: Medium /obj/item/projectile/kinetic/miner damage = 40 - speed = 0.9 + pixels_per_second = TILES_TO_PIXELS(11.111) icon_state = "ka_tracer" range = MINER_DASH_RANGE @@ -265,4 +265,12 @@ Difficulty: Medium desc = "The sweet blood, oh, it sings to me." invisibility = 100 +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom + name = "hostile-environment miner" + desc = "A miner destined to hop across dimensions for all eternity, hunting anomalous creatures." + speed = 8 + move_to_delay = 8 + ranged_cooldown_time = 8 + dash_cooldown = 8 + #undef MINER_DASH_RANGE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 0d4b7d1b1f..b191eaf3fb 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -29,12 +29,14 @@ Difficulty: Hard threat = 35 health = 2500 maxHealth = 2500 - attacktext = "rends" + attack_verb_continuous = "rends" + attack_verb_simple = "rend" attack_sound = 'sound/magic/demon_attack1.ogg' icon_state = "bubblegum" icon_living = "bubblegum" icon_dead = "" - friendly = "stares down" + friendly_verb_continuous = "stares down" + friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' speak_emote = list("gurgles") armour_penetration = 40 @@ -55,7 +57,7 @@ Difficulty: Hard deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/magic/enter_blood.ogg' - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_HEAVY /obj/item/gps/internal/bubblegum icon_state = null @@ -63,12 +65,13 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/Life() - ..() - move_to_delay = CLAMP(round((health/maxHealth) * 10), 3, 10) +/mob/living/simple_animal/hostile/megafauna/bubblegum/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + move_to_delay = clamp(round((health/maxHealth) * 10), 3, 10) /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/50),0,20) if(charging) return ranged_cooldown = world.time + ranged_cooldown_time @@ -103,7 +106,7 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A) +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(charging) return ..() @@ -227,11 +230,13 @@ Difficulty: Hard icon_state = "bloodbrood" icon_living = "bloodbrood" icon_aggro = "bloodbrood" - attacktext = "pierces" + attack_verb_continuous = "pierces" + attack_verb_simple = "pierce" color = "#C80000" density = FALSE faction = list("mining", "boss") weather_immunities = list("lava","ash") + has_field_of_vision = FALSE /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter/CanPass(atom/movable/mover, turf/target) if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 83d27e7ea6..5816be2917 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -27,12 +27,14 @@ Difficulty: Very Hard threat = 40 health = 2500 maxHealth = 2500 - attacktext = "judges" + attack_verb_continuous = "judges" + attack_verb_simple = "judge" attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' icon_state = "eva" icon_living = "eva" icon_dead = "dragon_dead" - friendly = "stares down" + friendly_verb_continuous = "stares down" + friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' speak_emote = list("roars") armour_penetration = 40 @@ -56,7 +58,7 @@ Difficulty: Very Hard L.dust() /mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + 120 if(enrage(target)) @@ -210,7 +212,7 @@ Difficulty: Very Hard icon_state= "chronobolt" damage = 25 armour_penetration = 100 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE @@ -606,14 +608,18 @@ Difficulty: Very Hard icon_dead = "butterfly_dead" threat = -0.7 turns_per_move = 1 - response_help = "waves away" - response_disarm = "brushes aside" - response_harm = "disrupts" + response_help_continuous = "waves away" + response_help_simple = "wave away" + response_disarm_continuous = "brushes aside" + response_disarm_simple = "brush aside" + response_harm_continuous = "disrupts" + response_harm_simple = "disrupt" speak_emote = list("oscillates") maxHealth = 2 health = 2 harm_intent_damage = 1 - friendly = "mends" + friendly_verb_continuous = "mends" + friendly_verb_simple = "mend" density = FALSE movement_type = FLYING pass_flags = PASSTABLE | PASSGRILLE | PASSMOB @@ -725,7 +731,7 @@ Difficulty: Very Hard /obj/structure/closet/stasis/Entered(atom/A) if(isliving(A) && holder_animal) var/mob/living/L = A - L.notransform = 1 + L.mob_transforming = 1 ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) L.status_flags |= GODMODE L.mind.transfer_to(holder_animal) @@ -738,7 +744,7 @@ Difficulty: Very Hard for(var/mob/living/L in src) REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) L.status_flags &= ~GODMODE - L.notransform = 0 + L.mob_transforming = 0 if(holder_animal) holder_animal.mind.transfer_to(L) L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm new file mode 100644 index 0000000000..5e866f95f1 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -0,0 +1,365 @@ +/* +Difficulty: Extremely Hard +*/ + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner + name = "demonic-frost miner" + desc = "An extremely geared miner, driven crazy or possessed by the demonic forces here, either way a terrifying enemy." + health = 1500 + maxHealth = 1500 + icon_state = "demonic_miner" + icon_living = "demonic_miner" + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + attack_verb_continuous = "pummels" + attack_verb_simple = "pummel" + attack_sound = 'sound/weapons/sonic_jackhammer.ogg' + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + light_color = "#E4C7C5" + movement_type = GROUND + weather_immunities = list("snow") + speak_emote = list("roars") + armour_penetration = 100 + melee_damage_lower = 10 + melee_damage_upper = 10 + aggro_vision_range = 18 // large vision range so combat doesn't abruptly end when someone runs a bit away + rapid_melee = 4 + speed = 20 + move_to_delay = 20 + ranged = TRUE + crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman) + loot = list(/obj/effect/decal/remains/plasma) + wander = FALSE + del_on_death = TRUE + blood_volume = BLOOD_VOLUME_NORMAL + deathmessage = "falls to the ground, decaying into plasma particles." + deathsound = "bodyfall" + attack_action_types = list(/datum/action/innate/megafauna_attack/frost_orbs, + /datum/action/innate/megafauna_attack/snowball_machine_gun, + /datum/action/innate/megafauna_attack/ice_shotgun) + /// Modifies the speed of the projectiles the demonic frost miner shoots out + var/projectile_speed_multiplier = 1 + /// If the demonic frost miner is in its enraged state + var/enraged = FALSE + /// If the demonic frost miner is currently transforming to its enraged state + var/enraging = FALSE + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Initialize() + . = ..() + AddComponent(/datum/component/knockback, 7, FALSE, TRUE) + AddComponent(/datum/component/lifesteal, 50) + +/datum/action/innate/megafauna_attack/frost_orbs + name = "Fire Frost Orbs" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + chosen_message = "You are now sending out frost orbs to track in on a target." + chosen_attack_num = 1 + +/datum/action/innate/megafauna_attack/snowball_machine_gun + name = "Fire Snowball Machine Gun" + icon_icon = 'icons/obj/guns/energy.dmi' + button_icon_state = "kineticgun" + chosen_message = "You are now firing a snowball machine gun at a target." + chosen_attack_num = 2 + +/datum/action/innate/megafauna_attack/ice_shotgun + name = "Fire Ice Shotgun" + icon_icon = 'icons/obj/guns/projectile.dmi' + button_icon_state = "shotgun" + chosen_message = "You are now firing shotgun ice blasts." + chosen_attack_num = 3 + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/OpenFire() + check_enraged() + if(enraged) + projectile_speed_multiplier = 1.33 + else + projectile_speed_multiplier = 1 + SetRecoveryTime(100, 100) + + if(client) + switch(chosen_attack) + if(1) + frost_orbs() + if(2) + snowball_machine_gun() + if(3) + ice_shotgun() + return + + var/easy_attack = prob(80 - enraged * 40) + chosen_attack = rand(1, 3) + switch(chosen_attack) + if(1) + if(easy_attack) + frost_orbs(10, 8) + else + frost_orbs(5, 16) + if(2) + if(easy_attack) + snowball_machine_gun() + else + INVOKE_ASYNC(src, .proc/ice_shotgun, 5, list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160))) + snowball_machine_gun(5 * 8, 5) + if(3) + if(easy_attack) + ice_shotgun() + else + ice_shotgun(5, list(list(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330), list(-30, -15, 0, 15, 30))) + +/obj/item/projectile/frost_orb + name = "frost orb" + icon_state = "ice_1" + damage = 20 + armour_penetration = 100 + pixels_per_second = TILES_TO_PIXELS(1) + homing_turn_speed = 30 + damage_type = BURN + +/obj/item/projectile/frost_orb/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isturf(target) || isobj(target)) + target.ex_act(EXPLODE_HEAVY) + +/obj/item/projectile/snowball + name = "machine-gun snowball" + icon_state = "nuclear_particle" + damage = 5 + armour_penetration = 100 + pixels_per_second = TILES_TO_PIXELS(2.5) + damage_type = BRUTE + +/obj/item/projectile/ice_blast + name = "ice blast" + icon_state = "ice_2" + damage = 15 + armour_penetration = 100 + pixels_per_second = TILES_TO_PIXELS(2.5) + damage_type = BRUTE + +/obj/item/projectile/ice_blast/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isturf(target) || isobj(target)) + target.ex_act(EXPLODE_HEAVY) + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ex_act(severity, target) + adjustBruteLoss(30 * severity - 120) + visible_message("[src] absorbs the explosion!", "You absorb the explosion!") + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Goto(target, delay, minimum_distance) + if(enraging) + return + return ..() + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/MoveToTarget(list/possible_targets) + if(enraging) + return + return ..() + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Move() + if(enraging) + return + return ..() + +/// Shoots out homing frost orbs that explode into ice blast projectiles after a couple seconds +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/frost_orbs(added_delay = 10, shoot_times = 8) + for(var/i in 1 to shoot_times) + var/turf/startloc = get_turf(src) + var/turf/endloc = get_turf(target) + if(!endloc) + break + var/obj/item/projectile/frost_orb/P = new(startloc) + P.preparePixelProjectile(endloc, startloc) + P.firer = src + if(target) + P.original = target + P.set_homing_target(target) + P.fire(rand(0, 360)) + addtimer(CALLBACK(P, /obj/item/projectile/frost_orb/proc/orb_explosion, projectile_speed_multiplier), 20) // make the orbs home in after a second + SLEEP_CHECK_DEATH(added_delay) + SetRecoveryTime(40, 60) + +/// Called when the orb is exploding, shoots out projectiles +/obj/item/projectile/frost_orb/proc/orb_explosion(projectile_speed_multiplier) + for(var/i in 0 to 5) + var/angle = i * 60 + var/turf/startloc = get_turf(src) + var/turf/endloc = get_turf(original) + if(!startloc || !endloc) + break + var/obj/item/projectile/ice_blast/P = new(startloc) + P.pixels_per_second *= projectile_speed_multiplier + P.preparePixelProjectile(endloc, startloc, null, angle + rand(-10, 10)) + P.firer = firer + if(original) + P.original = original + P.fire() + qdel(src) + +/// Shoots out snowballs with a random spread +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/snowball_machine_gun(shots = 60, spread = 45) + for(var/i in 1 to shots) + var/turf/startloc = get_turf(src) + var/turf/endloc = get_turf(target) + if(!endloc) + break + var/obj/item/projectile/P = new /obj/item/projectile/snowball(startloc) + P.pixels_per_second *= projectile_speed_multiplier + P.preparePixelProjectile(endloc, startloc, null, rand(-spread, spread)) + P.firer = src + if(target) + P.original = target + P.fire() + SLEEP_CHECK_DEATH(1) + SetRecoveryTime(15, 15) + +/// Shoots out ice blasts in a shotgun like pattern +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/ice_shotgun(shots = 5, list/patterns = list(list(-40, -20, 0, 20, 40), list(-30, -10, 10, 30))) + for(var/i in 1 to shots) + var/list/pattern = patterns[i % length(patterns) + 1] // alternating patterns + for(var/spread in pattern) + var/turf/startloc = get_turf(src) + var/turf/endloc = get_turf(target) + if(!endloc) + break + var/obj/item/projectile/P = new /obj/item/projectile/ice_blast(startloc) + P.pixels_per_second *= projectile_speed_multiplier + P.preparePixelProjectile(endloc, startloc, null, spread) + P.firer = src + if(target) + P.original = target + P.fire() + SLEEP_CHECK_DEATH(8) + SetRecoveryTime(15, 20) + +/// Checks if the demonic frost miner is ready to be enraged +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/check_enraged() + if(enraged) + return + if(health > maxHealth*0.25) + return + SetRecoveryTime(80, 80) + adjustHealth(-maxHealth) + enraged = TRUE + enraging = TRUE + animate(src, pixel_y = pixel_y + 96, time = 100, easing = ELASTIC_EASING) + spin(100, 10) + SLEEP_CHECK_DEATH(60) + playsound(src, 'sound/effects/explosion3.ogg', 100, TRUE) + icon_state = "demonic_miner_phase2" + animate(src, pixel_y = pixel_y - 96, time = 8, flags = ANIMATION_END_NOW) + spin(8, 2) + SLEEP_CHECK_DEATH(8) + for(var/mob/living/L in viewers(src)) + shake_camera(L, 3, 2) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + setMovetype(movement_type | FLYING) + enraging = FALSE + adjustHealth(-maxHealth) + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/death(gibbed, list/force_grant) + if(health > 0) + return + var/turf/T = get_turf(src) + var/loot = rand(1, 3) + switch(loot) + if(1) + new /obj/item/resurrection_crystal(T) + if(2) + new /obj/item/clothing/shoes/winterboots/ice_boots/speedy(T) + if(3) + new /obj/item/pickaxe/drill/jackhammer/demonic(T) + return ..() + +/obj/item/resurrection_crystal + name = "resurrection crystal" + desc = "When used by anything holding it, this crystal gives them a second chance at life if they die." + icon = 'icons/obj/objects.dmi' + icon_state = "demonic_crystal" + +/obj/item/resurrection_crystal/attack_self(mob/living/user) + if(!iscarbon(user)) + to_chat(user, "A dark presence stops you from absorbing the crystal.") + return + forceMove(user) + to_chat(user, "You feel a bit safer... but a demonic presence lurks in the back of your head...") + RegisterSignal(user, COMSIG_MOB_DEATH, .proc/resurrect) + +/// Resurrects the target when they die by cloning them into a new duplicate body and transferring their mind to the clone on a safe station turf +/obj/item/resurrection_crystal/proc/resurrect(mob/living/carbon/user, gibbed) + user.visible_message("You see [user]'s soul dragged out of their body!", "You feel your soul dragged away to a fresh body!") + var/typepath = user.type + var/turf/T = find_safe_turf() + var/mob/living/carbon/clone = new typepath(T) + clone.real_name = user.real_name + user.dna.transfer_identity(clone) + clone.updateappearance(mutcolor_update=1) + user.mind.transfer_to(clone) // second life + to_chat(clone, "You blink and find yourself in [get_area_name(T)].") + user.gib() + qdel(src) + +/obj/item/clothing/shoes/winterboots/ice_boots/speedy + name = "cursed ice hiking boots" + desc = "A pair of winter boots contractually made by a devil, they cannot be taken off once put on." + slowdown = SHOES_SPEED_SLIGHT + +/obj/item/clothing/shoes/winterboots/ice_boots/speedy/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) + +/obj/item/pickaxe/drill/jackhammer/demonic + name = "demonic jackhammer" + desc = "Cracks rocks at an inhuman speed, as well as being enhanced for combat purposes." + toolspeed = 0 + +/obj/item/pickaxe/drill/jackhammer/demonic/Initialize() + . = ..() + AddComponent(/datum/component/knockback, 4, FALSE, TRUE) + AddComponent(/datum/component/lifesteal, 5) + +/obj/item/crusher_trophy/ice_block_talisman + name = "ice block talisman" + desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason." + icon_state = "ice_trap_talisman" + denied_type = /obj/item/crusher_trophy/ice_block_talisman + +/obj/item/crusher_trophy/ice_block_talisman/effect_desc() + return "mark detonation to freeze a creature in a block of ice for a period, preventing them from moving" + +/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user) + target.apply_status_effect(/datum/status_effect/ice_block_talisman) + +/datum/status_effect/ice_block_talisman + id = "ice_block_talisman" + duration = 25 + status_type = STATUS_EFFECT_REFRESH + alert_type = /obj/screen/alert/status_effect/ice_block_talisman + /// Stored icon overlay for the hit mob, removed when effect is removed + var/icon/cube + +/obj/screen/alert/status_effect/ice_block_talisman + name = "Frozen Solid" + desc = "You're frozen inside an ice cube, and cannot move!" + icon_state = "frozen" + +/datum/status_effect/ice_block_talisman/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/owner_moved) + if(!owner.stat) + to_chat(owner, "You become frozen in a cube!") + cube = icon('icons/effects/freeze.dmi', "ice_cube") + var/icon/size_check = icon(owner.icon, owner.icon_state) + cube.Scale(size_check.Width(), size_check.Height()) + owner.add_overlay(cube) + return ..() + +/// Blocks movement from the status effect owner +/datum/status_effect/ice_block_talisman/proc/owner_moved() + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/datum/status_effect/ice_block_talisman/on_remove() + . = ..() + if(!owner.stat) + to_chat(owner, "The cube melts!") + owner.cut_overlay(cube) + UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index 8c06b01402..a2d18c508e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -1,6 +1,5 @@ /mob/living/simple_animal/hostile/megafauna/dragon vore_active = TRUE - no_vore = FALSE isPredator = TRUE /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 4644992ad0..062a4c9a43 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -37,13 +37,15 @@ Difficulty: Medium health = 2500 maxHealth = 2500 spacewalk = TRUE - attacktext = "chomps" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/magic/demon_attack1.ogg' icon = 'icons/mob/lavaland/64x64megafauna.dmi' icon_state = "dragon" icon_living = "dragon" icon_dead = "dragon_dead" - friendly = "stares down" + friendly_verb_continuous = "stares down" + friendly_verb_simple = "stare down" speak_emote = list("roars") armour_penetration = 40 melee_damage_lower = 40 @@ -64,7 +66,7 @@ Difficulty: Medium death_sound = 'sound/magic/demon_dies.ogg' var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/drake() - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_HEAVY /mob/living/simple_animal/hostile/megafauna/dragon/Initialize() smallsprite.Grant(src) @@ -81,7 +83,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -105,7 +107,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() if(swooping) return - anger_modifier = CLAMP(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time if(prob(15 + anger_modifier) && !client) @@ -394,3 +396,26 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype) return + +//fire line keeps going even if dragon is deleted +/proc/dragon_fire_line(source, list/turfs) + var/list/hit_list = list() + for(var/turf/T in turfs) + if(istype(T, /turf/closed)) + break + new /obj/effect/hotspot(T) + T.hotspot_expose(700,50,1) + for(var/mob/living/L in T.contents) + if(L in hit_list || L == source) + continue + hit_list += L + L.adjustFireLoss(20) + to_chat(L, "You're hit by [source]'s fire breath!") + + // deals damage to mechs + for(var/obj/mecha/M in T.contents) + if(M in hit_list) + continue + hit_list += M + M.take_damage(45, BRUTE, "melee", 1) + sleep(1.5) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index a9d42373a2..a66ee7b1de 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -40,11 +40,13 @@ Difficulty: Normal threat = 30 health = 2500 maxHealth = 2500 - attacktext = "clubs" + attack_verb_continuous = "clubs" + attack_verb_simple = "club" attack_sound = 'sound/weapons/sonic_jackhammer.ogg' icon_state = "hierophant" icon_living = "hierophant" - friendly = "stares down" + friendly_verb_continuous = "stares down" + friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/hierophant_new.dmi' faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house speak_emote = list("preaches") @@ -86,9 +88,10 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot() new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon)) -/mob/living/simple_animal/hostile/megafauna/hierophant/Life() - . = ..() - if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client) +/mob/living/simple_animal/hostile/megafauna/hierophant/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(spawned_beacon && !QDELETED(spawned_beacon) && !client) if(target || loc == spawned_beacon.loc) timeout_time = initial(timeout_time) else @@ -191,7 +194,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall - anger_modifier = CLAMP(((maxHealth - health) / 42),0,50) + anger_modifier = clamp(((maxHealth - health) / 42),0,50) burst_range = initial(burst_range) + round(anger_modifier * 0.08) beam_range = initial(beam_range) + round(anger_modifier * 0.12) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 62a09dff65..4da8a90b23 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -26,7 +26,8 @@ Difficulty: Medium icon_living = "legion" desc = "One of many." icon = 'icons/mob/lavaland/legion.dmi' - attacktext = "chomps" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/magic/demon_attack1.ogg' speak_emote = list("echoes") armour_penetration = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8aed1ede30..02e1b47c95 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -27,23 +27,52 @@ mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 + has_field_of_vision = FALSE //You are a frikkin boss + /// Crusher loot dropped when fauna killed with a crusher var/list/crusher_loot var/medal_type + /// Score given to players when the fauna is killed var/score_type = BOSS_SCORE + /// If the megafauna is actually killed (vs entering another phase) var/elimination = 0 + /// Modifies attacks when at lower health var/anger_modifier = 0 + /// Internal tracking GPS inside fauna var/obj/item/gps/internal + /// Next time fauna can use a melee attack var/recovery_time = 0 + var/true_spawn = TRUE // if this is a megafauna that should grant achievements, or have a gps signal + var/nest_range = 10 + var/chosen_attack = 1 // chosen attack num + var/list/attack_action_types = list() + var/small_sprite_type + /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) + for(var/action_type in attack_action_types) + var/datum/action/innate/megafauna_attack/attack_action = new action_type() + attack_action.Grant(src) + if(small_sprite_type) + var/datum/action/small_sprite/small_action = new small_sprite_type() + small_action.Grant(src) /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal) . = ..() +/mob/living/simple_animal/hostile/megafauna/Moved() + if(nest && nest.parent && get_dist(nest.parent, src) > nest_range) + var/turf/closest = get_turf(nest.parent) + for(var/i = 1 to nest_range) + closest = get_step(closest, get_dir(closest, src)) + forceMove(closest) // someone teleported out probably and the megafauna kept chasing them + target = null + return + return ..() + /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) return @@ -87,7 +116,7 @@ if(!client && ranged && ranged_cooldown <= world.time) OpenFire() if(L.Adjacent(src) && (L.stat != CONSCIOUS)) - if(vore_active && L.devourable == TRUE) + if(vore_active && CHECK_BITFIELD(L.vore_flags,DEVOURABLE)) vore_attack(src,L,src) LoseTarget() else @@ -116,6 +145,7 @@ /mob/living/simple_animal/hostile/megafauna/proc/SetRecoveryTime(buffer_time) recovery_time = world.time + buffer_time + ranged_cooldown = max(ranged_cooldown, world.time + buffer_time) // CITADEL BANDAID FIX FOR MEGAFAUNA NOT RESPECTING RECOVERY TIME. /mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill) if(!medal_type || (flags_1 & ADMIN_SPAWNED_1)) //Don't award medals if the medal type isn't set @@ -134,3 +164,21 @@ SSmedals.SetScore(BOSS_SCORE, C, 1) SSmedals.SetScore(score_type, C, 1) return TRUE + +/datum/action/innate/megafauna_attack + name = "Megafauna Attack" + icon_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "" + var/mob/living/simple_animal/hostile/megafauna/M + var/chosen_message + var/chosen_attack_num = 0 + +/datum/action/innate/megafauna_attack/Grant(mob/living/L) + if(istype(L, /mob/living/simple_animal/hostile/megafauna)) + M = L + return ..() + return FALSE + +/datum/action/innate/megafauna_attack/Activate() + M.chosen_attack = chosen_attack_num + to_chat(M, chosen_message) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm index 50c6025378..db6468d1b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm @@ -73,14 +73,13 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid -/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Life() - . = ..() - if(.) - var/createtype = GetUncappedAISwarmerType() - if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5)) - swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt - new createtype(loc) - +/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + var/createtype = GetUncappedAISwarmerType() + if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5)) + swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt + new createtype(loc) /mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm new file mode 100644 index 0000000000..ed189f052d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -0,0 +1,202 @@ +/* +Difficulty: Hard +*/ + +/mob/living/simple_animal/hostile/megafauna/wendigo + name = "wendigo" + desc = "A mythological man-eating legendary creature, you probably aren't going to survive this." + health = 2500 + maxHealth = 2500 + icon_state = "wendigo" + icon_living = "wendigo" + icon_dead = "wendigo_dead" + icon = 'icons/mob/icemoon/64x64megafauna.dmi' + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/magic/demon_attack1.ogg' + weather_immunities = list("snow") + speak_emote = list("roars") + armour_penetration = 40 + melee_damage_lower = 40 + melee_damage_upper = 40 + vision_range = 9 + aggro_vision_range = 18 // man-eating for a reason + speed = 8 + move_to_delay = 8 + rapid_melee = 16 // every 1/8 second + melee_queue_distance = 20 // as far as possible really, need this because of charging and teleports + ranged = TRUE + pixel_x = -16 + loot = list(/obj/item/wendigo_blood) + crusher_loot = list(/obj/item/wendigo_blood, /obj/item/crusher_trophy/demon_claws) + wander = FALSE + del_on_death = TRUE + blood_volume = BLOOD_VOLUME_NORMAL + deathmessage = "falls, shaking the ground around it" + deathsound = 'sound/effects/gravhit.ogg' + attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp, + /datum/action/innate/megafauna_attack/teleport, + /datum/action/innate/megafauna_attack/disorienting_scream) + /// Saves the turf the megafauna was created at (spawns exit portal here) + var/turf/starting + /// Range for wendigo stomping when it moves + var/stomp_range = 1 + /// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved + var/stored_move_dirs = 0 + /// If the wendigo is allowed to move + var/can_move = TRUE + +/datum/action/innate/megafauna_attack/heavy_stomp + name = "Heavy Stomp" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + chosen_message = "You are now stomping the ground around you." + chosen_attack_num = 1 + +/datum/action/innate/megafauna_attack/teleport + name = "Teleport" + icon_icon = 'icons/effects/bubblegum.dmi' + button_icon_state = "smack ya one" + chosen_message = "You are now teleporting at the target you click on." + chosen_attack_num = 2 + +/datum/action/innate/megafauna_attack/disorienting_scream + name = "Disorienting Scream" + icon_icon = 'icons/turf/walls/wall.dmi' + button_icon_state = "wall" + chosen_message = "You are now screeching, disorienting targets around you." + chosen_attack_num = 3 + +/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize() + . = ..() + starting = get_turf(src) + +/mob/living/simple_animal/hostile/megafauna/wendigo/OpenFire() + SetRecoveryTime(0, 100) + if(health <= maxHealth*0.5) + stomp_range = 2 + speed = 6 + move_to_delay = 6 + else + stomp_range = initial(stomp_range) + speed = initial(speed) + move_to_delay = initial(move_to_delay) + + if(client) + switch(chosen_attack) + if(1) + heavy_stomp() + if(2) + teleport() + if(3) + disorienting_scream() + return + + chosen_attack = rand(1, 3) + switch(chosen_attack) + if(1) + heavy_stomp() + if(2) + teleport() + if(3) + disorienting_scream() + +/mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct) + if(!can_move) + return + stored_move_dirs |= direct + return ..() + +/mob/living/simple_animal/hostile/megafauna/wendigo/Moved(atom/oldloc, direct) + . = ..() + stored_move_dirs &= ~direct + if(!stored_move_dirs) + INVOKE_ASYNC(src, .proc/ground_slam, stomp_range, 1) + +/// Slams the ground around the wendigo throwing back enemies caught nearby +/mob/living/simple_animal/hostile/megafauna/wendigo/proc/ground_slam(range, delay) + var/turf/orgin = get_turf(src) + var/list/all_turfs = RANGE_TURFS(range, orgin) + for(var/i = 0 to range) + for(var/turf/T in all_turfs) + if(get_dist(orgin, T) > i) + continue + playsound(T,'sound/effects/bamf.ogg', 600, TRUE, 10) + new /obj/effect/temp_visual/small_smoke/halfsecond(T) + for(var/mob/living/L in T) + if(L == src || L.throwing) + continue + to_chat(L, "[src]'s ground slam shockwave sends you flying!") + var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10)) + L.throw_at(thrownat, 8, 2, src, TRUE) //, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE) + L.apply_damage(20, BRUTE) + shake_camera(L, 2, 1) + all_turfs -= T + sleep(delay) + +/// Larger but slower ground stomp +/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp() + can_move = FALSE + ground_slam(5, 2) + SetRecoveryTime(0, 0) + can_move = TRUE + +/// Teleports to a location 4 turfs away from the enemy in view +/mob/living/simple_animal/hostile/megafauna/wendigo/proc/teleport() + var/list/possible_ends = list() + for(var/turf/T in view(4, target.loc) - view(3, target.loc)) + if(isclosedturf(T)) + continue + possible_ends |= T + var/turf/end = pick(possible_ends) + do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) + SetRecoveryTime(20, 0) + +/// Shakes all nearby enemies screens and animates the wendigo shaking up and down +/mob/living/simple_animal/hostile/megafauna/wendigo/proc/disorienting_scream() + can_move = FALSE + playsound(src, 'sound/magic/demon_dies.ogg', 600, FALSE, 10) + animate(src, pixel_z = rand(5, 15), time = 1, loop = 6) + animate(pixel_z = 0, time = 1) + for(var/mob/living/L in get_hearers_in_view(7, src) - src) + shake_camera(L, 30, 1) + to_chat(L, "The wendigo screams loudly!") + SetRecoveryTime(30, 0) + SLEEP_CHECK_DEATH(12) + can_move = TRUE + return + +/mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant) + if(health > 0) + return + var/obj/effect/portal/permanent/one_way/exit = new /obj/effect/portal/permanent/one_way(starting) + exit.id = "wendigo arena exit" + exit.add_atom_colour(COLOR_RED_LIGHT, ADMIN_COLOUR_PRIORITY) + exit.set_light(20, 1, LIGHT_COLOR_RED) + return ..() + +/obj/item/wendigo_blood + name = "bottle of wendigo blood" + desc = "You're not actually going to drink this, are you?" + icon = 'icons/obj/wizard.dmi' + icon_state = "vial" + +/obj/item/wendigo_blood/attack_self(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(!H.mind) + return + to_chat(H, "Power courses through you! You can now shift your form at will.") + var/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear/P = new + H.mind.AddSpell(P) + playsound(H.loc,'sound/items/drink.ogg', rand(10,50), TRUE) + qdel(src) + +/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear + name = "Polar Bear Form" + desc = "Take on the shape of a polar bear." + invocation = "RAAAAAAAAWR!" + convert_damage = FALSE + + shapeshift_type = /mob/living/simple_animal/hostile/asteroid/polarbear diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 6ec8e0cfd2..c2d05e43d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -5,19 +5,24 @@ icon_state = "crate" icon_living = "crate" - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" + response_help_continuous = "touches" + response_help_simple = "touch" + response_disarm_continuous = "pushes" + response_disarm_simple = "push" + response_harm_continuous = "hits" + response_harm_simple = "hit" speed = 0 maxHealth = 250 health = 250 + blood_volume = 0 gender = NEUTER mob_biotypes = NONE harm_intent_damage = 5 melee_damage_lower = 8 melee_damage_upper = 12 - attacktext = "attacks" + attack_verb_continuous = "attacks" + attack_verb_simple = "attack" attack_sound = 'sound/weapons/punch1.ogg' emote_taunt = list("growls") speak_emote = list("creaks") @@ -33,7 +38,8 @@ // Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies. /mob/living/simple_animal/hostile/mimic/crate - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" speak_emote = list("clatters") stop_automated_movement = 1 wander = 0 @@ -112,8 +118,9 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca overlay_googly_eyes = FALSE CopyObject(copy, creator, destroy_original) -/mob/living/simple_animal/hostile/mimic/copy/Life() - ..() +/mob/living/simple_animal/hostile/mimic/copy/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize adjustBruteLoss(1) for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 4d20d4c7fb..13738b20e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -25,7 +25,8 @@ obj_damage = 60 melee_damage_lower = 12 melee_damage_upper = 12 - attacktext = "bites into" + attack_verb_continuous = "bites into" + attack_verb_simple = "bite into" a_intent = INTENT_HARM speak_emote = list("chitters") attack_sound = 'sound/weapons/bladeslice.ogg' @@ -72,7 +73,8 @@ throw_message = "bounces harmlessly off of" melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "impales" + attack_verb_continuous = "impales" + attack_verb_simple = "impale" a_intent = INTENT_HARM speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/bladeslice.ogg' @@ -82,6 +84,33 @@ crusher_loot = /obj/item/crusher_trophy/watcher_wing loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) + search_objects = 1 + wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond) + field_of_vision_type = FOV_270_DEGREES //Obviously, it's one eyeball. + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(stat == CONSCIOUS) + consume_bait() + +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait() + var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in oview(src, 9) + var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in oview(src, 9) + if(!diamonds && !bait) + return + if(diamonds) + var/distanced = 0 + distanced = get_dist(loc,diamonds.loc) + if(distanced <= 1 && diamonds) + qdel(diamonds) + src.visible_message("[src] consumes [diamonds], and it disappears! ...At least, you think.") + if(bait) + var/distanceb = 0 + distanceb = get_dist(loc,bait.loc) + if(distanceb <= 1 && bait) + qdel(bait) + visible_message("[src] examines [bait] closer, and telekinetically shatters the pen.") /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 652840f7e3..c4f78b6e26 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -16,7 +16,8 @@ melee_damage_lower = 10 melee_damage_upper = 10 melee_damage_type = BURN - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/effects/curseattack.ogg' throw_message = "passes through the smokey body of" obj_damage = 0 @@ -102,8 +103,9 @@ IGNORE_PROC_IF_NOT_TARGET(attack_slime) return BULLET_ACT_FORCE_PIERCE return ..() -/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L) +/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L, attackchain_flags = NONE, damage_multiplier = 1) if(L != set_target) + L.changeNext_move(I.click_delay) //pre_attacked_by not called return return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 2114612fce..81b541dc7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -21,6 +21,7 @@ layer = LARGE_MOB_LAYER sentience_type = SENTIENCE_BOSS hud_type = /datum/hud/lavaland_elite + has_field_of_vision = FALSE //You are a frikkin mini-boss var/chosen_attack = 1 var/list/attack_action_types = list() var/can_talk = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 68a0e81cc7..80489e0e40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -31,9 +31,8 @@ melee_damage_lower = 30 melee_damage_upper = 30 armour_penetration = 30 - attacktext = "beats down on" - /*attack_verb_continuous = "beats down on" - attack_verb_simple = "beat down on"*/ + attack_verb_continuous = "beats down on" + attack_verb_simple = "beat down on" attack_sound = 'sound/weapons/punch1.ogg' throw_message = "does nothing to the rocky hide of the" speed = 2 @@ -98,9 +97,8 @@ if(CALL_CHILDREN) call_children() -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Life() - . = ..() - if(!.) //Checks if they are dead as a rock. +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if(health < maxHealth * 0.5 && rand_tent < world.time) rand_tent = world.time + 30 @@ -172,9 +170,8 @@ health = 30 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "bashes against" - /*attack_verb_continuous = "bashes against" - attack_verb_simple = "bash against"*/ + attack_verb_continuous = "bashes against" + attack_verb_simple = "bash against" attack_sound = 'sound/weapons/punch1.ogg' throw_message = "does nothing to the rocky hide of the" speed = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 95fafbabfd..78b24acfb0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -29,9 +29,8 @@ health = 800 melee_damage_lower = 20 melee_damage_upper = 20 - attacktext = "preaches to" - /*attack_verb_continuous = "preaches to" - attack_verb_simple = "preach to"*/ + attack_verb_continuous = "preaches to" + attack_verb_simple = "preach to" attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' throw_message = "doesn't affect the purity of" speed = 4 @@ -40,27 +39,27 @@ deathsound = 'sound/magic/demon_dies.ogg' deathmessage = "begins to shudder as it becomes transparent..." loot_drop = /obj/item/clothing/neck/cloak/herald_cloak - + can_talk = 1 attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, /datum/action/innate/elite_attack/herald_directionalshot, /datum/action/innate/elite_attack/herald_teleshot, /datum/action/innate/elite_attack/herald_mirror) - + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/my_mirror = null var/is_mirror = FALSE - + /mob/living/simple_animal/hostile/asteroid/elite/herald/death() . = ..() if(!is_mirror) addtimer(CALLBACK(src, .proc/become_ghost), 8) if(my_mirror != null) qdel(my_mirror) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() icon_state = "herald_ghost" - + /mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) . = ..() if(.) @@ -71,25 +70,25 @@ button_icon_state = "herald_trishot" chosen_message = "You are now firing three shots in your chosen direction." chosen_attack_num = HERALD_TRISHOT - + /datum/action/innate/elite_attack/herald_directionalshot name = "Circular Shot" button_icon_state = "herald_directionalshot" chosen_message = "You are firing projectiles in all directions." chosen_attack_num = HERALD_DIRECTIONALSHOT - + /datum/action/innate/elite_attack/herald_teleshot name = "Teleport Shot" button_icon_state = "herald_teleshot" chosen_message = "You will now fire a shot which teleports you where it lands." chosen_attack_num = HERALD_TELESHOT - + /datum/action/innate/elite_attack/herald_mirror name = "Summon Mirror" button_icon_state = "herald_mirror" chosen_message = "You will spawn a mirror which duplicates your attacks." chosen_attack_num = HERALD_MIRROR - + /mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire() if(client) switch(chosen_attack) @@ -124,7 +123,7 @@ my_mirror.herald_teleshot(target) if(HERALD_MIRROR) herald_mirror() - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, var/is_teleshot) var/turf/startloc = get_turf(src) var/obj/item/projectile/herald/H = null @@ -137,7 +136,7 @@ if(target) H.original = target H.fire(set_angle) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) ranged_cooldown = world.time + 30 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) @@ -151,17 +150,17 @@ addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 10) addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 12) addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 14) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot() var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) for(var/i in directional_shot_angles) shoot_projectile(get_turf(src), i, FALSE) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/unenrage() if(stat == DEAD || is_mirror) return icon_state = "herald" - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_directionalshot() ranged_cooldown = world.time + 50 if(!is_mirror) @@ -172,14 +171,14 @@ playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) addtimer(CALLBACK(src, .proc/herald_circleshot), 15) addtimer(CALLBACK(src, .proc/unenrage), 20) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) ranged_cooldown = world.time + 30 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) var/target_turf = get_turf(target) var/angle_to_target = Get_Angle(src, target_turf) shoot_projectile(target_turf, angle_to_target, TRUE) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_mirror() ranged_cooldown = world.time + 40 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) @@ -190,7 +189,7 @@ my_mirror = new_mirror my_mirror.my_master = src my_mirror.faction = faction.Copy() - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror name = "herald's mirror" desc = "This fiendish work of magic copies the herald's attacks. Seems logical to smash it." @@ -203,26 +202,26 @@ del_on_death = TRUE is_mirror = TRUE var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize() ..() toggle_ai(AI_OFF) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy() if(my_master != null) my_master.my_mirror = null . = ..() - + /obj/item/projectile/herald name ="death bolt" icon_state= "chronobolt" damage = 15 armour_penetration = 60 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE - + /obj/item/projectile/herald/teleshot name ="golden bolt" damage = 0 @@ -239,11 +238,11 @@ var/mob/living/F = firer if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) L.heal_overall_damage(damage) - + /obj/item/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) . = ..() firer.forceMove(get_turf(src)) - + //Herald's loot: Cloak of the Prophet /obj/item/clothing/neck/cloak/herald_cloak @@ -252,13 +251,13 @@ icon = 'icons/obj/lavaland/elite_trophies.dmi' icon_state = "herald_cloak" body_parts_covered = CHEST|GROIN|ARMS - hit_reaction_chance = 10 - + var/hit_reaction_chance = 10 + /obj/item/clothing/neck/cloak/herald_cloak/proc/reactionshot(mob/living/carbon/owner) var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) for(var/i in directional_shot_angles) shoot_projectile(get_turf(owner), i, owner) - + /obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) var/turf/startloc = get_turf(owner) var/obj/item/projectile/herald/H = null @@ -266,12 +265,11 @@ H.preparePixelProjectile(marker, startloc) H.firer = owner H.fire(set_angle) - -/obj/item/clothing/neck/cloak/herald_cloak/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + +/obj/item/clothing/neck/cloak/herald_cloak/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) . = ..() if(rand(1,100) > hit_reaction_chance) return owner.visible_message("[owner]'s [src] emits a loud noise as [owner] is struck!") - var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) addtimer(CALLBACK(src, .proc/reactionshot, owner), 10) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index d83a38ae24..31f925fb2b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -12,7 +12,7 @@ * - Charges at the target after a telegraph, throwing them across the arena should it connect. * - Legionnaire's head detaches, attacking as it's own entity. Has abilities of it's own later into the fight. Once dead, regenerates after a brief period. If the skill is used while the head is off, it will be killed. * - Leaves a pile of bones at your location. Upon using this skill again, you'll swap locations with the bone pile. - * - Spews a cloud of smoke from it's maw, wherever said maw is. + * - Spews a cloud of smoke from it's maw, wherever said maw is. * A unique fight incorporating the head mechanic of legion into a whole new beast. Combatants will need to make sure the tag-team of head and body don't lure them into a deadly trap. */ @@ -29,9 +29,8 @@ health = 800 melee_damage_lower = 30 melee_damage_upper = 30 - attacktext = "slashes its arms at" - /*attack_verb_continuous = "slashes its arms at" - attack_verb_simple = "slash your arms at"*/ + attack_verb_continuous = "slashes its arms at" + attack_verb_simple = "slash your arms at" attack_sound = 'sound/weapons/bladeslice.ogg' throw_message = "doesn't affect the sturdiness of" speed = 1 @@ -45,35 +44,35 @@ /datum/action/innate/elite_attack/head_detach, /datum/action/innate/elite_attack/bonfire_teleport, /datum/action/innate/elite_attack/spew_smoke) - + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/myhead = null var/obj/structure/legionnaire_bonfire/mypile = null var/has_head = TRUE - + /datum/action/innate/elite_attack/legionnaire_charge name = "Legionnaire Charge" button_icon_state = "legionnaire_charge" chosen_message = "You will attempt to grab your opponent and throw them." chosen_attack_num = LEGIONNAIRE_CHARGE - + /datum/action/innate/elite_attack/head_detach name = "Release Head" button_icon_state = "head_detach" chosen_message = "You will now detach your head or kill it if it is already released." chosen_attack_num = HEAD_DETACH - + /datum/action/innate/elite_attack/bonfire_teleport name = "Bonfire Teleport" button_icon_state = "bonfire_teleport" chosen_message = "You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it." chosen_attack_num = BONFIRE_TELEPORT - + /datum/action/innate/elite_attack/spew_smoke name = "Spew Smoke" button_icon_state = "spew_smoke" chosen_message = "Your head will spew smoke in an area, wherever it may be." chosen_attack_num = SPEW_SMOKE - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire() if(client) switch(chosen_attack) @@ -96,7 +95,7 @@ bonfire_teleport() if(SPEW_SMOKE) spew_smoke() - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge(target) ranged_cooldown = world.time + 50 var/dir_to_target = get_dir(get_turf(src), get_turf(target)) @@ -107,7 +106,7 @@ playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) visible_message("[src] prepares to charge!") addtimer(CALLBACK(src, .proc/legionnaire_charge_2, dir_to_target, 0), 5) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(var/move_dir, var/times_ran) if(times_ran >= 4) return @@ -136,7 +135,7 @@ L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff L.adjustBruteLoss(50) addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) ranged_cooldown = world.time + 10 if(myhead != null) @@ -160,11 +159,11 @@ else if(health < maxHealth * 0.5) myhead.melee_damage_lower = 20 myhead.melee_damage_upper = 20 - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() myhead = null addtimer(CALLBACK(src, .proc/regain_head), 50) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() has_head = TRUE if(stat == DEAD) @@ -196,7 +195,7 @@ forceMove(pileturf) visible_message("[src] forms from the bonfire!") mypile.forceMove(legionturf) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/spew_smoke() ranged_cooldown = world.time + 60 var/turf/T = null @@ -213,7 +212,7 @@ var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(2, T) smoke.start() - + //The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead name = "legionnaire head" @@ -227,9 +226,8 @@ health = 80 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "bites at" - /*attack_verb_continuous = "bites at" - attack_verb_simple = "bite at"*/ + attack_verb_continuous = "bites at" + attack_verb_simple = "bite at" attack_sound = 'sound/effects/curse1.ogg' throw_message = "simply misses" speed = 0 @@ -239,12 +237,12 @@ faction = list() ranged = FALSE var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/body = null - + /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/death() . = ..() if(body) body.onHeadDeath() - + //The legionnaire's bonfire, which can be swapped positions with. Also sets flammable living beings on fire when they walk over it. /obj/structure/legionnaire_bonfire name = "bone pile" @@ -258,20 +256,20 @@ light_range = 4 light_color = LIGHT_COLOR_RED var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/myowner = null - - + + /obj/structure/legionnaire_bonfire/Entered(atom/movable/mover, turf/target) if(isliving(mover)) var/mob/living/L = mover L.adjust_fire_stacks(3) L.IgniteMob() . = ..() - + /obj/structure/legionnaire_bonfire/Destroy() if(myowner != null) myowner.mypile = null . = ..() - + //The visual effect which appears in front of legionnaire when he goes to charge. /obj/effect/temp_visual/dragon_swoop/legionnaire duration = 10 @@ -280,7 +278,7 @@ /obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize() . = ..() transform *= 0.33 - + // Legionnaire's loot: Legionnaire Spine /obj/item/crusher_trophy/legionnaire_spine @@ -300,5 +298,5 @@ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) A.GiveTarget(target) - A.friends = user + A.friends[user]++ A.faction = user.faction.Copy() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 3276965fa2..cdef0c50d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -29,9 +29,8 @@ health = 800 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "smashes into the side of" - /*attack_verb_continuous = "smashes into the side of" - attack_verb_simple = "smash into the side of"*/ + attack_verb_continuous = "smashes into the side of" + attack_verb_simple = "smash into the side of" attack_sound = 'sound/weapons/sonic_jackhammer.ogg' throw_message = "merely dinks off of the" speed = 4 @@ -96,8 +95,9 @@ if(AOE_SQUARES) aoe_squares(target) -/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life() - . = ..() +/mob/living/simple_animal/hostile/asteroid/elite/pandora/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(health >= maxHealth * 0.5) cooldown_time = 20 return diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index c43e9a7461..4a3497055a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -13,14 +13,16 @@ vision_range = 2 aggro_vision_range = 9 move_to_delay = 5 - friendly = "harmlessly rolls into" + friendly_verb_continuous = "harmlessly rolls into" + friendly_verb_simple = "harmlessly roll into" maxHealth = 45 health = 45 gold_core_spawnable = HOSTILE_SPAWN harm_intent_damage = 5 melee_damage_lower = 0 melee_damage_upper = 0 - attacktext = "barrels into" + attack_verb_continuous = "barrels into" + attack_verb_simple = "barrel into" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HELP speak_emote = list("screeches") diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 3c8cf9025f..5f6c21bbbd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -14,7 +14,8 @@ move_to_delay = 10 ranged = 1 ranged_cooldown_time = 60 - friendly = "wails at" + friendly_verb_continuous = "wails at" + friendly_verb_simple = "wail at" speak_emote = list("bellows") speed = 3 maxHealth = 300 @@ -23,7 +24,8 @@ obj_damage = 100 melee_damage_lower = 18 melee_damage_upper = 18 - attacktext = "pulverizes" + attack_verb_continuous = "pulverizes" + attack_verb_simple = "pulverize" attack_sound = 'sound/weapons/punch1.ogg' throw_message = "does nothing to the rocky hide of the" vision_range = 4 @@ -35,10 +37,11 @@ var/pre_attack_icon = "Goliath_preattack" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_HEAVY -/mob/living/simple_animal/hostile/asteroid/goliath/Life() - . = ..() +/mob/living/simple_animal/hostile/asteroid/goliath/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return handle_preattack() /mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() @@ -127,9 +130,8 @@ var/turf/last_location var/tentacle_recheck_cooldown = 100 -/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life() - . = ..() - if(!.) // dead +/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return if(isturf(loc)) if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index 39b66fbdc2..69d4ebe4df 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -18,10 +18,14 @@ obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE move_to_delay = 15 - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "squishes" - friendly = "pinches" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "squishes" + response_harm_simple = "squish" + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" a_intent = INTENT_HELP ventcrawler = VENTCRAWLER_ALWAYS gold_core_spawnable = FRIENDLY_SPAWN @@ -110,8 +114,9 @@ name = "guthen" gender = FEMALE -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life() - ..() +/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full. make_babies() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index b41ca15948..c371242bf2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -20,7 +20,8 @@ harm_intent_damage = 5 melee_damage_lower = 0 melee_damage_upper = 0 - attacktext = "lashes out at" + attack_verb_continuous = "lashes out at" + attack_verb_simple = "lash out at" speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" @@ -67,7 +68,8 @@ icon_gib = "syndicate_gib" mouse_opacity = MOUSE_OPACITY_OPAQUE move_to_delay = 1 - friendly = "buzzes near" + friendly_verb_continuous = "buzzes near" + friendly_verb_simple = "buzz near" vision_range = 10 speed = 3 maxHealth = 1 @@ -76,7 +78,8 @@ harm_intent_damage = 5 melee_damage_lower = 2 melee_damage_upper = 2 - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" @@ -107,7 +110,8 @@ obj_damage = 60 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "lashes out at" + attack_verb_continuous = "lashes out at" + attack_verb_simple = "lash out at" speak_emote = list("echoes") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "bounces harmlessly off of" @@ -173,14 +177,16 @@ icon_aggro = "legion_head" icon_dead = "legion_head" icon_gib = "syndicate_gib" - friendly = "buzzes near" + friendly_verb_continuous = "buzzes near" + friendly_verb_simple = "buzz near" vision_range = 10 maxHealth = 1 health = 5 harm_intent_damage = 5 melee_damage_lower = 12 melee_damage_upper = 12 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" speak_emote = list("echoes") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "is shrugged off by" @@ -190,17 +196,18 @@ swarming = TRUE var/can_infest_dead = FALSE -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(isturf(loc)) for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD)) infest(H) - ..() /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) visible_message("[name] burrows into the flesh of [H]!") var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L - if(H.dna.check_mutation(DWARFISM)) //dwarf legions aren't just fluff! + if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) else L = new(H.loc) @@ -285,9 +292,10 @@ if("Miner") mob_species = pickweight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2)) if(mob_species == /datum/species/plasmaman) - uniform = /obj/item/clothing/under/plasmaman - head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman/mining + head = /obj/item/clothing/head/helmet/space/plasmaman/mining belt = /obj/item/tank/internals/plasmaman/belt + mask = /obj/item/clothing/mask/gas/explorer else uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland if (prob(4)) @@ -395,8 +403,6 @@ ears = /obj/item/radio/headset gloves = /obj/item/clothing/gloves/color/fyellow id = /obj/item/card/id/silver/reaper //looks cool and has a fancy name but only a 1% chance - back = /obj/item/storage/backpack - backpack_contents = list(/obj/item/stack/cable_coil = 12, /obj/item/assembly/flash = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1) if(prob(99)) id = /obj/item/card/id id_job = "Assisant" @@ -406,11 +412,14 @@ gloves = /obj/item/clothing/gloves/color/yellow if(prob(10)) back = /obj/item/twohanded/spear - backpack_contents = null + else if(prob(80)) //Now they dont always have a backpack + back = /obj/item/storage/backpack + backpack_contents = list(/obj/item/stack/cable_coil = 1, /obj/item/assembly/flash = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1) if(prob(90)) r_pocket = /obj/item/kitchen/knife if(prob(60)) l_pocket = /obj/item/soap/homemade + if("Beelegion") uniform = /obj/item/clothing/under/color/yellow suit = /obj/item/clothing/suit/hooded/bee_costume @@ -423,3 +432,29 @@ l_pocket = /obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz mask = /obj/item/clothing/mask/rat/bee . = ..() + +// Snow Legion +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow + name = "snow legion" + desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion" + icon_living = "snowlegion" + icon_aggro = "snowlegion_alive" + icon_dead = "snowlegion" + crusher_loot = /obj/item/crusher_trophy/legion_skull + loot = list(/obj/item/organ/regenerative_core/legion) + brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow + +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril + fromtendril = TRUE + +// Snow Legion skull +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow + name = "snow legion" + desc = "One of many." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion_head" + icon_living = "snowlegion_head" + icon_aggro = "snowlegion_head" + icon_dead = "snowlegion_head" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm new file mode 100644 index 0000000000..d40cd8636c --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm @@ -0,0 +1,79 @@ +/mob/living/simple_animal/hostile/asteroid/ice_demon + name = "demonic watcher" + desc = "A creature formed entirely out of ice, bluespace energy emanates from inside of it." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "ice_demon" + icon_living = "ice_demon" + icon_dead = "ice_demon_dead" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + speak_emote = list("telepathically cries") + speed = 1 + move_to_delay = 2 + projectiletype = /obj/item/projectile/temp/basilisk/ice + projectilesound = 'sound/weapons/pierce.ogg' + ranged = TRUE + ranged_message = "manifests ice" + ranged_cooldown_time = 30 + minimum_distance = 3 + retreat_distance = 3 + maxHealth = 150 + health = 150 + obj_damage = 40 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/weapons/bladeslice.ogg' + vision_range = 7 + aggro_vision_range = 7 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + del_on_death = TRUE + loot = list(/obj/item/stack/ore/bluespace_crystal = 3) + crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing + deathmessage = "fades as the energies that tied it to this world dissipate." + deathsound = 'sound/magic/demon_dies.ogg' + stat_attack = UNCONSCIOUS + movement_type = FLYING + robust_searching = TRUE + /// Distance the demon will teleport from the target + var/teleport_distance = 3 + +/obj/item/projectile/temp/basilisk/ice + name = "ice blast" + damage = 5 + nodamage = FALSE + temperature = -75 + +/mob/living/simple_animal/hostile/asteroid/ice_demon/OpenFire() + if(teleport_distance <= 0) + return ..() + var/list/possible_ends = list() + for(var/turf/T in view(teleport_distance, target.loc) - view(teleport_distance - 1, target.loc)) + if(isclosedturf(T)) + continue + possible_ends |= T + if(length(possible_ends)) + var/turf/end = pick(possible_ends) + do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) + SLEEP_CHECK_DEATH(8) + return ..() + +/mob/living/simple_animal/hostile/asteroid/ice_demon/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(target) + return + adjustHealth(-maxHealth*0.025) + +/mob/living/simple_animal/hostile/asteroid/ice_demon/death(gibbed) + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT + var/turf/T = get_turf(src) + if(T && prob(5)) + new /obj/item/assembly/signaler/anomaly/bluespace(T) + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm new file mode 100644 index 0000000000..7214fd71e0 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm @@ -0,0 +1,57 @@ +/mob/living/simple_animal/hostile/asteroid/ice_whelp + name = "ice whelp" + desc = "The offspring of an ice drake, weak in comparison but still terrifying." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "ice_whelp" + icon_living = "ice_whelp" + icon_dead = "ice_whelp_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + friendly_verb_continuous = "stares down" + friendly_verb_simple = "stare down" + speak_emote = list("roars") + speed = 30 + move_to_delay = 30 + ranged = TRUE + ranged_cooldown_time = 40 + maxHealth = 350 + health = 350 + obj_damage = 40 + armour_penetration = 20 + melee_damage_lower = 20 + melee_damage_upper = 20 + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_sound = 'sound/magic/demon_attack1.ogg' + vision_range = 9 + aggro_vision_range = 9 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1) + loot = list() + crusher_loot = /obj/item/crusher_trophy/tail_spike + deathmessage = "collapses on it's side." + deathsound = 'sound/magic/demon_dies.ogg' + stat_attack = UNCONSCIOUS + robust_searching = TRUE + /// How far the whelps fire can go + var/fire_range = 4 + +/mob/living/simple_animal/hostile/asteroid/ice_whelp/OpenFire() + var/turf/T = get_ranged_target_turf_direct(src, target, fire_range) + var/list/burn_turfs = getline(src, T) - get_turf(src) + dragon_fire_line(src, burn_turfs) + +/mob/living/simple_animal/hostile/asteroid/ice_whelp/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(target) + return + adjustHealth(-maxHealth*0.025) + +/mob/living/simple_animal/hostile/asteroid/ice_whelp/death(gibbed) + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 0cd788325a..c3e4f24c43 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -8,9 +8,8 @@ environment_smash = ENVIRONMENT_SMASH_WALLS minbodytemp = 0 maxbodytemp = INFINITY - response_help = "pokes" - response_disarm = "shoves" - response_harm = "strikes" + response_harm_continuous = "strikes" + response_harm_simple = "strike" status_flags = 0 a_intent = INTENT_HARM var/crusher_loot @@ -28,7 +27,7 @@ /mob/living/simple_animal/hostile/asteroid/Aggro() ..() - if(vision_range != aggro_vision_range) + if(vision_range == aggro_vision_range && icon_aggro) icon_state = icon_aggro /mob/living/simple_animal/hostile/asteroid/LoseAggro() @@ -63,7 +62,7 @@ ..(gibbed) /mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot() - butcher_results[crusher_loot] = 1 + LAZYSET(butcher_results, crusher_loot, 1) /mob/living/simple_animal/hostile/asteroid/handle_temperature_damage() if(bodytemperature < minbodytemp) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm new file mode 100644 index 0000000000..de9464cc16 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm @@ -0,0 +1,59 @@ +/mob/living/simple_animal/hostile/asteroid/polarbear + name = "polar bear" + desc = "An aggressive animal that defends it's territory with incredible power. These beasts don't run from their enemies." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "polarbear" + icon_living = "polarbear" + icon_dead = "polarbear_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + friendly_verb_continuous = "growls at" + friendly_verb_simple = "growl at" + speak_emote = list("growls") + speed = 12 + move_to_delay = 12 + maxHealth = 300 + health = 300 + obj_damage = 40 + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/bladeslice.ogg' + vision_range = 2 // don't aggro unless you basically antagonize it, though they will kill you worse than a goliath will + aggro_vision_range = 9 + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2) + guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1) + loot = list() + crusher_loot = /obj/item/crusher_trophy/goliath_tentacle + stat_attack = UNCONSCIOUS + robust_searching = TRUE + /// Message for when the polar bear starts to attack faster + var/aggressive_message_said = FALSE + +/mob/living/simple_animal/hostile/asteroid/polarbear/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(health > maxHealth*0.5) + rapid_melee = initial(rapid_melee) + return + if(!aggressive_message_said && target) + visible_message("The [name] gets an enraged look at [target]!") + aggressive_message_said = TRUE + rapid_melee = 2 + +/mob/living/simple_animal/hostile/asteroid/polarbear/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(target) + return + adjustHealth(-maxHealth*0.025) + aggressive_message_said = FALSE + +/mob/living/simple_animal/hostile/asteroid/polarbear/death(gibbed) + move_force = MOVE_FORCE_DEFAULT + move_resist = MOVE_RESIST_DEFAULT + pull_force = PULL_FORCE_DEFAULT + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm new file mode 100644 index 0000000000..8c4db48434 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm @@ -0,0 +1,60 @@ +/mob/living/simple_animal/hostile/asteroid/wolf + name = "white wolf" + desc = "A beast that survives by feasting on weaker opponents, they're much stronger with numbers." + icon = 'icons/mob/icemoon/icemoon_monsters.dmi' + icon_state = "whitewolf" + icon_living = "whitewolf" + icon_dead = "whitewolf_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + friendly_verb_continuous = "howls at" + friendly_verb_simple = "howl at" + speak_emote = list("howls") + speed = 5 + move_to_delay = 5 + maxHealth = 130 + health = 130 + obj_damage = 15 + melee_damage_lower = 7.5 + melee_damage_upper = 7.5 + rapid_melee = 2 // every second attack + dodging = TRUE + dodge_prob = 50 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + vision_range = 7 + aggro_vision_range = 7 + move_force = MOVE_FORCE_WEAK + move_resist = MOVE_FORCE_WEAK + pull_force = MOVE_FORCE_WEAK + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2) + loot = list() + crusher_loot = /obj/item/crusher_trophy/watcher_wing + stat_attack = UNCONSCIOUS + robust_searching = TRUE + /// Message for when the wolf decides to start running away + var/retreat_message_said = FALSE + +/mob/living/simple_animal/hostile/asteroid/wolf/Move(atom/newloc) + if(newloc && newloc.z == z && (islava(newloc) || ischasm(newloc))) + return FALSE + return ..() + +/mob/living/simple_animal/hostile/asteroid/wolf/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(stat == DEAD || health > maxHealth*0.1) + retreat_distance = initial(retreat_distance) + return + if(!retreat_message_said && target) + visible_message("The [name] tries to flee from [target]!") + retreat_message_said = TRUE + retreat_distance = 30 + +/mob/living/simple_animal/hostile/asteroid/wolf/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(target) + return + adjustHealth(-maxHealth*0.025) + retreat_message_said = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index d023cf0dd8..4c9afd3784 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -9,15 +9,19 @@ maxHealth = 10 health = 10 butcher_results = list(/obj/item/reagent_containers/food/snacks/hugemushroomslice = 1) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "whacks" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "whacks" + response_harm_simple = "whack" harm_intent_damage = 5 obj_damage = 0 melee_damage_lower = 1 melee_damage_upper = 1 attack_same = 2 - attacktext = "chomps" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/weapons/bite.ogg' faction = list("mushroom") environment_smash = ENVIRONMENT_SMASH_NONE @@ -44,8 +48,9 @@ else . += "It looks like it's been roughed up." -/mob/living/simple_animal/hostile/mushroom/Life() - ..() +/mob/living/simple_animal/hostile/mushroom/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten adjustBruteLoss(-2) diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index ed2a407b8e..8653c40cea 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -9,9 +9,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 12 turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" speed = 0 stat_attack = UNCONSCIOUS robust_searching = 1 @@ -20,7 +17,8 @@ harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 15 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier) @@ -31,7 +29,7 @@ speak = list("Stop resisting!", "I AM THE LAW!", "Face the wrath of the golden bolt!", "Stop breaking the law, asshole!") search_objects = 1 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/nanotrasen/Aggro() diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 1c8b171738..1db6854f96 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -11,7 +11,8 @@ melee_damage_lower = 25 melee_damage_upper = 50 threat = 2 - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("creature") speak_emote = list("screams") @@ -27,7 +28,8 @@ icon_state = "mi-go" icon_living = "mi-go" icon_dead = "mi-go-dead" - attacktext = "lacerates" + attack_verb_continuous = "lacerates" + attack_verb_simple = "lacerate" speed = -0.5 var/static/list/migo_sounds deathmessage = "wails as its form turns into a pulpy mush." @@ -44,8 +46,9 @@ var/chosen_sound = pick(migo_sounds) playsound(src, chosen_sound, 100, TRUE) -/mob/living/simple_animal/hostile/netherworld/migo/Life() - ..() +/mob/living/simple_animal/hostile/netherworld/migo/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(stat) return if(prob(10)) @@ -63,7 +66,8 @@ maxHealth = 100 melee_damage_lower = 5 melee_damage_upper = 10 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" deathmessage = "falls apart into a fine dust." /obj/structure/spawner/nether diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index d8737d1edc..0544ddc676 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -8,9 +8,8 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 5 - response_help = "pushes" - response_disarm = "shoves" - response_harm = "hits" + response_help_continuous = "pushes" + response_help_simple = "push" threat = 3 speed = 0 maxHealth = 115 @@ -19,7 +18,8 @@ harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -39,11 +39,12 @@ melee_damage_lower = 30 melee_damage_upper = 30 armour_penetration = 35 - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' var/obj/effect/light_emitter/red_energy_sword/sord - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/pirate/melee/space name = "Space Pirate Swashbuckler" diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm new file mode 100644 index 0000000000..e21514b37e --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -0,0 +1,239 @@ +/mob/living/simple_animal/hostile/regalrat + name = "regal rat" + desc = "An evolved rat, created through some strange science. It leads nearby rats with deadly efficiency to protect its kingdom. Not technically a king." + icon_state = "regalrat" + icon_living = "regalrat" + icon_dead = "regalrat_dead" + gender = NEUTER + speak_chance = 0 + turns_per_move = 5 + maxHealth = 70 + health = 70 + see_in_dark = 5 + obj_damage = 10 + butcher_results = list(/obj/item/clothing/head/crown = 1,) + response_help_continuous = "glares at" + response_help_simple = "glare at" + response_disarm_continuous = "skoffs at" + response_disarm_simple = "skoff at" + response_harm_continuous = "slashes" + response_harm_simple = "slash" + melee_damage_lower = 10 + melee_damage_upper = 12 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/punch1.ogg' + ventcrawler = VENTCRAWLER_ALWAYS + unique_name = TRUE + faction = list("rat") + var/datum/action/cooldown/coffer + var/datum/action/cooldown/riot + ///Number assigned to rats and mice, checked when determining infighting. + +/mob/living/simple_animal/hostile/regalrat/Initialize() + . = ..() + coffer = new /datum/action/cooldown/coffer + coffer.Grant(src) + riot = new /datum/action/cooldown/riot + riot.Grant(src) + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Royal Rat, cheesey be his crown?", ROLE_SENTIENCE, null, FALSE, 100, POLL_IGNORE_SENTIENCE_POTION) + if(LAZYLEN(candidates) && !mind) + var/mob/dead/observer/C = pick(candidates) + key = C.key + notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE) + +/mob/living/simple_animal/hostile/regalrat/handle_automated_action() + if(prob(20)) + riot.Trigger() + else if(prob(50)) + coffer.Trigger() + return ..() + +/mob/living/simple_animal/hostile/regalrat/CanAttack(atom/the_target) + if(istype(the_target,/mob/living/simple_animal)) + var/mob/living/A = the_target + if(istype(the_target, /mob/living/simple_animal/hostile/regalrat) && A.stat == CONSCIOUS) + return TRUE + if(istype(the_target, /mob/living/simple_animal/hostile/rat) && A.stat == CONSCIOUS) + var/mob/living/simple_animal/hostile/rat/R = the_target + if(R.faction_check_mob(src, TRUE)) + return FALSE + else + return TRUE + return ..() + +/mob/living/simple_animal/hostile/regalrat/examine(mob/user) + . = ..() + if(istype(user,/mob/living/simple_animal/hostile/rat)) + var/mob/living/simple_animal/hostile/rat/ratself = user + if(ratself.faction_check_mob(src, TRUE)) + . += "This is your king. Long live his majesty!" + else + . += "This is a false king! Strike him down!" + else if(istype(user,/mob/living/simple_animal/hostile/regalrat)) + . += "Who is this foolish false king? This will not stand!" + +/** + *This action creates trash, money, dirt, and cheese. + */ + +/datum/action/cooldown/coffer + name = "Fill Coffers" + desc = "Your newly granted regality and poise let you scavenge for lost junk, but more importantly, cheese." + icon_icon = 'icons/mob/actions/actions_animal.dmi' + background_icon_state = "bg_clock" + button_icon_state = "coffer" + cooldown_time = 50 + +/datum/action/cooldown/coffer/Trigger() + . = ..() + if(!.) + return + var/turf/T = get_turf(owner) + var/loot = rand(1,100) + switch(loot) + if(1 to 5) + to_chat(owner, "Score! You find some cheese!") + new /obj/item/reagent_containers/food/snacks/cheesewedge(T) + if(6 to 10) + var/pickedcoin = pick(GLOB.ratking_coins) + to_chat(owner, "You find some leftover coins. More for the royal treasury!") + for(var/i = 1 to rand(1,3)) + new pickedcoin(T) + if(11) + to_chat(owner, "You find a... Hunh. This coin doesn't look right.") + var/rarecoin = rand(1,2) + if (rarecoin == 1) + new /obj/item/coin/twoheaded(T) + else + new /obj/item/coin/antagtoken(T) + if(12 to 40) + var/pickedtrash = pick(GLOB.ratking_trash) + to_chat(owner, "You just find more garbage and dirt. Lovely, but beneath you now.") + new /obj/effect/decal/cleanable/dirt(T) + new pickedtrash(T) + if(41 to 100) + to_chat(owner, "Drat. Nothing.") + new /obj/effect/decal/cleanable/dirt(T) + StartCooldown() + +/** + *This action checks all nearby mice, and converts them into hostile rats. If no mice are nearby, creates a new one. + */ + +/datum/action/cooldown/riot + name = "Raise Army" + desc = "Raise an army out of the hordes of mice and pests crawling around the maintenance shafts." + icon_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "riot" + background_icon_state = "bg_clock" + cooldown_time = 80 + ///Checks to see if there are any nearby mice. Does not count Rats. + +/datum/action/cooldown/riot/Trigger() + . = ..() + if(!.) + return + var/cap = CONFIG_GET(number/ratcap) + var/something_from_nothing = FALSE + for(var/mob/living/simple_animal/mouse/M in oview(owner, 5)) + var/mob/living/simple_animal/hostile/rat/new_rat = new(get_turf(M)) + something_from_nothing = TRUE + if(M.mind && M.stat == CONSCIOUS) + M.mind.transfer_to(new_rat) + if(istype(owner,/mob/living/simple_animal/hostile/regalrat)) + var/mob/living/simple_animal/hostile/regalrat/giantrat = owner + new_rat.faction = giantrat.faction + qdel(M) + if(!something_from_nothing) + if(LAZYLEN(SSmobs.cheeserats) >= cap) + to_chat(owner,"There's too many mice on this station to beckon a new one! Find them first!") + return + new /mob/living/simple_animal/mouse(owner.loc) + owner.visible_message("[owner] commands a mouse to its side!") + else + owner.visible_message("[owner] commands its army to action, mutating them into rats!") + StartCooldown() + +/mob/living/simple_animal/hostile/rat + name = "rat" + desc = "It's a nasty, ugly, evil, disease-ridden rodent with anger issues." + icon_state = "mouse_gray" + icon_living = "mouse_gray" + icon_dead = "mouse_gray_dead" + speak = list("Skree!","SKREEE!","Squeak?") + speak_emote = list("squeaks") + emote_hear = list("Hisses.") + emote_see = list("runs in a circle.", "stands on its hind legs.") + melee_damage_lower = 3 + melee_damage_upper = 5 + obj_damage = 5 + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + maxHealth = 15 + health = 15 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) + density = FALSE + ventcrawler = VENTCRAWLER_ALWAYS + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list("rat") + +/mob/living/simple_animal/hostile/rat/Initialize() + . = ..() + SSmobs.cheeserats += src + +/mob/living/simple_animal/hostile/rat/Destroy() + SSmobs.cheeserats -= src + return ..() + +/mob/living/simple_animal/hostile/rat/examine(mob/user) + . = ..() + if(istype(user,/mob/living/simple_animal/hostile/rat)) + var/mob/living/simple_animal/hostile/rat/ratself = user + if(ratself.faction_check_mob(src, TRUE)) + . += "You both serve the same king." + else + . += "This fool serves a different king!" + else if(istype(user,/mob/living/simple_animal/hostile/regalrat)) + var/mob/living/simple_animal/hostile/regalrat/ratking = user + if(ratking.faction_check_mob(src, TRUE)) + . += "This rat serves under you." + else + . += "This peasant serves a different king! Strike him down!" + +/mob/living/simple_animal/hostile/rat/CanAttack(atom/the_target) + if(istype(the_target,/mob/living/simple_animal)) + var/mob/living/A = the_target + if(istype(the_target, /mob/living/simple_animal/hostile/regalrat) && A.stat == CONSCIOUS) + var/mob/living/simple_animal/hostile/regalrat/ratking = the_target + if(ratking.faction_check_mob(src, TRUE)) + return FALSE + else + return TRUE + if(istype(the_target, /mob/living/simple_animal/hostile/rat) && A.stat == CONSCIOUS) + var/mob/living/simple_animal/hostile/rat/R = the_target + if(R.faction_check_mob(src, TRUE)) + return FALSE + else + return TRUE + return ..() + +/mob/living/simple_animal/hostile/rat/handle_automated_action() + . = ..() + if(prob(40)) + var/turf/open/floor/F = get_turf(src) + if(istype(F) && !F.intact) + var/obj/structure/cable/C = locate() in F + if(C && prob(15)) + if(C.avail()) + visible_message("[src] chews through the [C]. It's toast!") + playsound(src, 'sound/effects/sparks2.ogg', 100, TRUE) + C.deconstruct() + death() + else if(C && C.avail()) + visible_message("[src] chews through the [C]. It looks unharmed!") + playsound(src, 'sound/effects/sparks2.ogg', 100, TRUE) + C.deconstruct() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index cc17759cc6..9045ccef51 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -7,9 +7,12 @@ icon_gib = "bat_dead" turns_per_move = 1 blood_volume = 250 - response_help = "brushes aside" - response_disarm = "flails at" - response_harm = "hits" + response_help_continuous = "brushes aside" + response_help_simple = "brush aside" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "hits" + response_harm_simple = "hit" mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 maxHealth = 15 @@ -19,7 +22,8 @@ harm_intent_damage = 6 melee_damage_lower = 6 melee_damage_upper = 5 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) pass_flags = PASSTABLE faction = list("hostile") @@ -47,5 +51,6 @@ icon_gib = "secbat_dead" desc = "A fruit bat with a tiny little security hat who is ready to inject cuteness into any security operation." emote_see = list("is ready to law down the law.", "flaps about with an air of authority.") - response_help = "respects the authority of" + response_help_continuous = "respects the authority of" + response_help_simple = "respect the authority of" gold_core_spawnable = FRIENDLY_SPAWN diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index ca14d4ae67..03aac4037a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -1,16 +1,17 @@ /mob/living/simple_animal/hostile/retaliate/clown name = "Clown" desc = "A denizen of clown planet." - icon = 'icons/mob/simple_human.dmi' + icon = 'icons/mob/clown_mobs.dmi' icon_state = "clown" icon_living = "clown" icon_dead = "clown_dead" icon_gib = "clown_gib" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID turns_per_move = 5 - response_help = "pokes" - response_disarm = "gently pushes aside" - response_harm = "robusts" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "robusts" + response_harm_simple = "robust" speak = list("HONK", "Honk!", "Welcome to clown planet!") emote_see = list("honks", "squeaks") speak_chance = 1 @@ -21,7 +22,6 @@ harm_intent_damage = 8 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "attacks" attack_sound = 'sound/items/bikehorn.ogg' obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE @@ -32,15 +32,279 @@ minbodytemp = 270 maxbodytemp = 370 unsuitable_atmos_damage = 10 - - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE + var/banana_time = 0 // If there's no time set it won't spawn. + var/banana_type = /obj/item/grown/bananapeel + var/attack_reagent /mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(10) + throw_alert("temp", /obj/screen/alert/cold, 2) else if(bodytemperature > maxbodytemp) adjustBruteLoss(15) + throw_alert("temp", /obj/screen/alert/hot, 3) + else + clear_alert("temp") /mob/living/simple_animal/hostile/retaliate/clown/attack_hand(mob/living/carbon/human/M) ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) + playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) + +/mob/living/simple_animal/hostile/retaliate/clown/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(banana_time && banana_time < world.time) + var/turf/T = get_turf(src) + var/list/adjacent = T.GetAtmosAdjacentTurfs(1) + new banana_type(pick(adjacent)) + banana_time = world.time + rand(30,60) + +/mob/living/simple_animal/hostile/retaliate/clown/AttackingTarget() + . = ..() + if(attack_reagent && . && isliving(target)) + var/mob/living/L = target + if(L.reagents) + L.reagents.add_reagent(attack_reagent, rand(1,5)) + +/mob/living/simple_animal/hostile/retaliate/clown/lube + name = "Living Lube" + desc = "A puddle of lube brought to life by the honkmother." + icon_state = "lube" + icon_living = "lube" + turns_per_move = 1 + response_help_continuous = "dips a finger into" + response_help_simple = "dip a finger into" + response_disarm_continuous = "gently scoops and pours aside" + response_disarm_simple = "gently scoop and pour aside" + emote_see = list("bubbles", "oozes") + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam) + +/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize() + . = ..() + AddElement(/datum/element/snailcrawl) + +/mob/living/simple_animal/hostile/retaliate/clown/banana + name = "Clownana" + desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." + icon_state = "banana tree" + icon_living = "banana tree" + response_disarm_continuous = "peels" + response_disarm_simple = "peel" + response_harm_continuous = "peels" + response_harm_simple = "peel" + turns_per_move = 1 + speak = list("HONK", "Honk!", "YA-HONK!!!") + emote_see = list("honks", "bites into the banana", "plucks a banana off its head", "photosynthesizes") + maxHealth = 120 + health = 120 + speed = -10 + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana) + banana_time = 20 + +/mob/living/simple_animal/hostile/retaliate/clown/honkling + name = "Honkling" + desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." + icon_state = "honkling" + icon_living = "honkling" + turns_per_move = 1 + speed = -10 + harm_intent_damage = 1 + melee_damage_lower = 1 + melee_damage_upper = 1 + attack_verb_continuous = "cheers up" + attack_verb_simple = "cheer up" + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) + banana_type = /obj/item/grown/bananapeel + attack_reagent = /datum/reagent/consumable/laughter + +/mob/living/simple_animal/hostile/retaliate/clown/fleshclown + name = "Fleshclown" + desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." + icon_state = "fleshclown" + icon_living = "fleshclown" + response_help_continuous = "reluctantly pokes" + response_help_simple = "reluctantly poke" + response_disarm_continuous = "sinks his hands into the spongy flesh of" + response_disarm_simple = "sink your hands into the spongy flesh of" + response_harm_continuous = "cleanses the world of" + response_harm_simple = "cleanse the world of" + speak = list("HONK", "Honk!", "I didn't ask for this", "I feel constant and horrible pain", "YA-HONK!!!", "this body is a merciless and unforgiving prison", "I was born out of mirthful pranking but I live in suffering") + emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") + speak_chance = 5 + dextrous = TRUE + ventcrawler = VENTCRAWLER_ALWAYS + maxHealth = 140 + health = 140 + speed = -5 + melee_damage_upper = 15 + attack_verb_continuous = "limply slaps" + attack_verb_simple = "limply slap" + obj_damage = 5 + loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + +/mob/living/simple_animal/hostile/retaliate/clown/longface + name = "Longface" + desc = "Often found walking into the bar." + icon_state = "long face" + icon_living = "long face" + move_resist = INFINITY + turns_per_move = 10 + response_help_continuous = "tries to awkwardly hug" + response_help_simple = "try to awkwardly hug" + response_disarm_continuous = "pushes the unwieldy frame of" + response_disarm_simple = "push the unwieldy frame of" + response_harm_continuous = "tries to shut up" + response_harm_simple = "try to shut up" + speak = list("YA-HONK!!!") + emote_see = list("honks", "squeaks") + speak_chance = 60 + maxHealth = 150 + health = 150 + pixel_x = -16 + speed = 10 + harm_intent_damage = 5 + melee_damage_lower = 5 + attack_verb_continuous = "YA-HONKs" + attack_verb_simple = "YA-HONK" + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + +/mob/living/simple_animal/hostile/retaliate/clown/clownhulk + name = "Honk Hulk" + desc = "A cruel and fearsome clown. Don't make him angry." + icon_state = "honkhulk" + icon_living = "honkhulk" + move_resist = INFINITY + response_help_continuous = "tries desperately to appease" + response_help_simple = "tries desperately to appease" + response_disarm_continuous = "foolishly pushes" + response_disarm_simple = "foolishly push" + response_harm_continuous = "angers" + response_harm_simple = "anger" + speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") + emote_see = list("honks", "sweats", "grunts") + speak_chance = 5 + maxHealth = 400 + health = 400 + pixel_x = -16 + speed = 2 + harm_intent_damage = 15 + melee_damage_lower = 15 + melee_damage_upper = 20 + attack_verb_continuous = "pummels" + attack_verb_simple = "pummel" + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_WALLS + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + +/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown + name = "Chlown" + desc = "A real lunkhead who somehow gets all the girls." + icon_state = "chlown" + icon_living = "chlown" + response_help_continuous = "submits to" + response_help_simple = "submit to" + response_disarm_continuous = "tries to assert dominance over" + response_disarm_simple = "try to assert dominance over" + response_harm_continuous = "makes a weak beta attack at" + response_harm_simple = "make a weak beta attack at" + speak = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?") + emote_see = list("asserts his dominance", "emasculates everyone implicitly") + maxHealth = 500 + health = 500 + speed = -2 + armour_penetration = 20 + attack_verb_continuous = "steals the girlfriend of" + attack_verb_simple = "steal the girlfriend of" + attack_sound = 'sound/items/airhorn2.ogg' + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) + +/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus + name = "Honkmunculus" + desc = "A slender wiry figure of alchemical origin." + icon_state = "honkmunculus" + icon_living = "honkmunculus" + response_help_continuous = "skeptically pokes" + response_help_simple = "skeptically poke" + response_disarm_continuous = "pushes the unwieldy frame of" + response_disarm_simple = "push the unwieldy frame of" + speak = list("honk") + emote_see = list("squirms", "writhes") + speak_chance = 1 + maxHealth = 200 + health = 200 + speed = -5 + harm_intent_damage = 5 + melee_damage_lower = 5 + melee_damage_upper = 10 + attack_verb_continuous = "ferociously mauls" + attack_verb_simple = "ferociously maul" + environment_smash = ENVIRONMENT_SMASH_NONE + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) + attack_reagent = /datum/reagent/peaceborg_confuse + +/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer + name = "The Destroyer" + desc = "An ancient being born of arcane honking." + icon_state = "destroyer" + icon_living = "destroyer" + response_disarm_continuous = "bounces off of" + response_disarm_simple = "bounce off of" + response_harm_continuous = "bounces off of" + response_harm_simple = "bounce off ot" + speak = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!") + maxHealth = 400 + health = 400 + speed = 5 + harm_intent_damage = 30 + melee_damage_lower = 20 + melee_damage_upper = 40 + armour_penetration = 30 + stat_attack = UNCONSCIOUS + attack_verb_continuous = "acts out divine vengeance on" + attack_verb_simple = "act out divine vengeance on" + obj_damage = 50 + environment_smash = ENVIRONMENT_SMASH_RWALLS + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant + name = "Unknown" + desc = "Kill it for its own sake." + icon_state = "mutant" + icon_living = "mutant" + move_resist = INFINITY + turns_per_move = 10 + response_help_continuous = "reluctantly sinks a finger into" + response_help_simple = "reluctantly sink a finger into" + response_disarm_continuous = "squishes into" + response_disarm_simple = "squish into" + response_harm_continuous = "squishes into" + response_harm_simple = "squish into" + speak = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK") + emote_see = list("squirms", "writhes", "pulsates", "froths", "oozes") + speak_chance = 10 + maxHealth = 130 + health = 130 + pixel_x = -16 + speed = -5 + harm_intent_damage = 10 + melee_damage_lower = 10 + melee_damage_upper = 20 + attack_verb_continuous = "awkwardly flails at" + attack_verb_simple = "awkwardly flail at" + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob + name = "Something that was once a clown" + desc = "A grotesque bulging figure far mutated from it's original state." + icon_state = "blob" + icon_living = "blob" + speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!") + emote_see = list("jiggles", "wobbles") + health = 130 + mob_size = MOB_SIZE_LARGE + speed = 20 + attack_verb_continuous = "bounces off of" + attack_verb_simple = "bounce off of" + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + attack_reagent = /datum/reagent/toxin/mindbreaker diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index ef51d8621b..8424a0a576 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -13,10 +13,14 @@ health = 15 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "bites" - response_help = "pets" - response_disarm = "pokes" - response_harm = "splats" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "pokes" + response_disarm_simple = "poke" + response_harm_continuous = "splats" + response_harm_simple = "splat" density = FALSE ventcrawler = VENTCRAWLER_ALWAYS faction = list("hostile") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 48d16f63f3..2c94739180 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -7,9 +7,12 @@ mob_biotypes = MOB_SPIRIT speak_chance = 0 turns_per_move = 5 - response_help = "passes through" - response_disarm = "shoves" - response_harm = "hits" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "shoves" + response_disarm_simple = "shove" + response_harm_continuous = "hits" + response_harm_simple = "hit" a_intent = INTENT_HARM healable = 0 speed = 0 @@ -20,7 +23,8 @@ melee_damage_upper = 15 del_on_death = 1 emote_see = list("weeps silently", "groans", "mumbles") - attacktext = "grips" + attack_verb_continuous = "grips" + attack_verb_simple = "grip" attack_sound = 'sound/hallucinations/growl1.ogg' speak_emote = list("weeps") deathmessage = "wails, disintegrating into a pile of ectoplasm!" @@ -32,6 +36,7 @@ pressure_resistance = 300 gold_core_spawnable = NO_SPAWN //too spooky for science blood_volume = 0 + has_field_of_vision = FALSE var/ghost_hair_style var/ghost_hair_color var/mutable_appearance/ghost_hair diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm index 29b0c0b701..ebeb2d28ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -8,9 +8,12 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID gender = MALE turns_per_move = 5 - response_help = "pokes" - response_disarm = "gently pushes aside" - response_harm = "punches" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "punches" + response_harm_simple = "punch" a_intent = INTENT_HARM maxHealth = 100 health = 100 @@ -18,13 +21,14 @@ harm_intent_damage = 8 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "hits" + attack_verb_continuous = "hits" + attack_verb_simple = "hit" attack_sound = 'sound/weapons/punch1.ogg' obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE del_on_death = 0 - - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE + has_field_of_vision = FALSE //Legacy gameplay experience. Also they only have one dir visually. /mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file name = "Nanotrasen Private Security Officer" @@ -35,9 +39,12 @@ icon_dead = null icon_gib = "syndicate_gib" turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoves" + response_disarm_simple = "shove" + response_harm_continuous = "hits" + response_harm_simple = "hit" speed = 0 stat_attack = UNCONSCIOUS robust_searching = 1 @@ -47,7 +54,8 @@ harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 15 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' faction = list("nanotrasenprivate") a_intent = INTENT_HARM diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 9c3e3e0b92..f7a46658c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -9,9 +9,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" speed = 0 threat = 1 maxHealth = 100 @@ -19,7 +16,8 @@ harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM loot = list(/obj/effect/mob_spawn/human/corpse/russian, @@ -30,7 +28,7 @@ status_flags = CANPUSH del_on_death = 1 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/russian/ranged diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm index 4008334a57..1263a23d26 100644 --- a/code/modules/mob/living/simple_animal/hostile/sharks.dm +++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm @@ -12,9 +12,12 @@ speak_chance = 0 turns_per_move = 3 butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 3) - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" speed = 0 threat = 1 maxHealth = 75 @@ -22,7 +25,8 @@ harm_intent_damage = 18 melee_damage_lower = 18 melee_damage_upper = 18 - attacktext = "maims" + attack_verb_continuous = "maims" + attack_verb_simple = "maim" attack_sound = 'sound/weapons/bite.ogg' gold_core_spawnable = 1 //Space shark aren't affected by cold. @@ -82,7 +86,8 @@ harm_intent_damage = 0 melee_damage_lower = 0 melee_damage_upper = 0 - attacktext = "violently hugs" + attack_verb_continuous = "violently hugs" + attack_verb_simple = "violently hug" vision_range = 0 /mob/living/simple_animal/hostile/shark/kawaii/death() diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index df71701bb7..f3138a773c 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -22,7 +22,8 @@ minbodytemp = 0 maxbodytemp = 1500 healable = 0 //they're skeletons how would bruise packs help them?? - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/hallucinations/growl1.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 10 @@ -36,7 +37,7 @@ del_on_death = 1 loot = list(/obj/effect/decal/remains/human) - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/skeleton/eskimo name = "undead eskimo" @@ -104,7 +105,8 @@ melee_damage_lower = 15 melee_damage_upper = 20 light_color = LIGHT_COLOR_PURPLE - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/hallucinations/growl1.ogg' deathmessage = "collapses into a pile of bones, their suit dissolving among the plasma!" loot = list(/obj/effect/decal/remains/plasma) @@ -120,7 +122,8 @@ harm_intent_damage = 15 melee_damage_lower = 20 melee_damage_upper = 25 - attacktext = "blasts" + attack_verb_continuous = "blasts" + attack_verb_simple = "blast" attack_sound = 'sound/weapons/sonic_jackhammer.ogg' loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 8c622c7f29..3490d757a1 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -11,9 +11,10 @@ a_intent = INTENT_HARM mob_biotypes = MOB_HUMANOID threat = 3 - response_help = "touches" - response_disarm = "pushes" - + response_help_continuous = "touches" + response_help_simple = "touch" + response_disarm_continuous = "pushes" + response_disarm_simple = "push" speed = -1 maxHealth = 50000 health = 50000 @@ -24,7 +25,8 @@ obj_damage = 100 melee_damage_lower = 68 melee_damage_upper = 83 - attacktext = "claws" + attack_verb_continuous = "claws" + attack_verb_simple = "claw" attack_sound = 'sound/hallucinations/growl1.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -80,8 +82,9 @@ return 0 return ..() -/mob/living/simple_animal/hostile/statue/Life() - ..() +/mob/living/simple_animal/hostile/statue/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!client && target) // If we have a target and we're AI controlled var/mob/watching = can_be_seen() // If they're not our target @@ -125,14 +128,10 @@ // This loop will, at most, loop twice. for(var/atom/check in check_list) - for(var/mob/living/M in viewers(world.view + 1, check) - src) + for(var/mob/living/M in fov_viewers(world.view + 1, check) - src) if(M.client && CanAttack(M) && !M.silicon_privileges) if(!M.eye_blind) return M - for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you - if(M.occupant && M.occupant.client) - if(!M.occupant.eye_blind) - return M.occupant return null // Cannot talk diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 24bf5e9ea9..226af952b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -10,13 +10,10 @@ gender = MALE speak_chance = 0 turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" speed = 0 blood_volume = 0 stat_attack = UNCONSCIOUS - robust_searching = 1 + robust_searching = TRUE //This is also required for the paper robe rallying to work. environment_smash = ENVIRONMENT_SMASH_NONE maxHealth = 100 health = 100 @@ -24,7 +21,8 @@ obj_damage = 0 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -32,8 +30,6 @@ faction = list("hostile","stickman") check_friendly_fire = 1 status_flags = CANPUSH - var/datum/action/boss/wizard_summon_minions/changesummons = /datum/action/boss/wizard_summon_minions - var/summoned_by_wizard = 0 /mob/living/simple_animal/hostile/stickman/ranged ranged = 1 @@ -45,7 +41,6 @@ projectilesound = 'sound/misc/bang.ogg' loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman) - /mob/living/simple_animal/hostile/stickman/dog name = "Angry Stick Dog" desc = "Stickman's best friend, if he could see him at least." @@ -54,12 +49,6 @@ icon_dead = "stickdog_dead" mob_biotypes = MOB_BEAST -/mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned) +/mob/living/simple_animal/hostile/stickman/Initialize(mapload) . = ..() new /obj/effect/temp_visual/paper_scatter(src) - summoned_by_wizard = wizard_summoned - -/mob/living/simple_animal/hostile/stickman/death() - ..() - if(summoned_by_wizard == 1) - changesummons.summoned_minions -- diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 8c4e19774d..9a362b680d 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -25,9 +25,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" threat = 1 speed = 0 stat_attack = UNCONSCIOUS @@ -37,7 +34,8 @@ harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 10 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier) @@ -50,7 +48,7 @@ dodging = TRUE rapid_melee = 2 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE ///////////////Melee//////////// @@ -82,7 +80,8 @@ icon_state = "syndicate_knife" icon_living = "syndicate_knife" loot = list(/obj/effect/gibspawner/human) - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' status_flags = 0 @@ -113,7 +112,8 @@ melee_damage_upper = 30 icon_state = "syndicate_sword" icon_living = "syndicate_sword" - attacktext = "slashes" + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' armour_penetration = 35 light_color = LIGHT_COLOR_RED @@ -292,7 +292,8 @@ melee_damage_upper = 15 obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - attacktext = "cuts" + attack_verb_continuous = "cuts" + attack_verb_simple = "cut" attack_sound = 'sound/weapons/bladeslice.ogg' faction = list(ROLE_SYNDICATE) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index bc932666f6..f65f1613c9 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -10,9 +10,12 @@ threat = 1 speak_chance = 0 turns_per_move = 5 - response_help = "brushes" - response_disarm = "pushes" - response_harm = "hits" + response_help_continuous = "brushes" + response_help_simple = "brush" + response_disarm_continuous = "pushes" + response_disarm_simple = "push" + response_harm_continuous = "hits" + response_harm_simple = "hit" speed = 1 maxHealth = 250 health = 250 @@ -23,7 +26,8 @@ harm_intent_damage = 5 melee_damage_lower = 8 melee_damage_upper = 12 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("pines") emote_taunt = list("growls") @@ -40,8 +44,9 @@ gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 -/mob/living/simple_animal/hostile/tree/Life() - ..() +/mob/living/simple_animal/hostile/tree/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(isopenturf(loc)) var/turf/open/T = src.loc if(T.air && T.air.gases[/datum/gas/carbon_dioxide]) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 13a4d1793e..fdb088934c 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -1,5 +1,13 @@ - - +/** + * Kudzu Flower Bud + * + * A flower created by flowering kudzu which spawns a venus human trap after a certain amount of time has passed. + * + * A flower created by kudzu with the flowering mutation. Spawns a venus human trap after 2 minutes under normal circumstances. + * Also spawns 4 vines going out in diagonal directions from the bud. Any living creature not aligned with plants is damaged by these vines. + * Once it grows a venus human trap, the bud itself will destroy itself. + * + */ /obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures name = "flower bud" desc = "A large pulsating plant..." @@ -9,9 +17,9 @@ opacity = 0 canSmoothWith = list() smooth = SMOOTH_FALSE + /// The amount of time it takes to create a venus human trap, in deciseconds var/growth_time = 1200 - /obj/structure/alien/resin/flower_bud_enemy/Initialize() . = ..() var/list/anchors = list() @@ -25,36 +33,49 @@ B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow) addtimer(CALLBACK(src, .proc/bear_fruit), growth_time) +/** + * Spawns a venus human trap, then qdels itself. + * + * Displays a message, spawns a human venus trap, then qdels itself. + */ /obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit() - visible_message("the plant has borne fruit!") + visible_message("The plant has borne fruit!") new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src)) qdel(src) - /obj/effect/ebeam/vine name = "thick vine" mouse_opacity = MOUSE_OPACITY_ICON desc = "A thick vine, painful to the touch." - /obj/effect/ebeam/vine/Crossed(atom/movable/AM) + . = ..() if(isliving(AM)) var/mob/living/L = AM - if(!("vines" in L.faction)) + if(!isvineimmune(L)) L.adjustBruteLoss(5) to_chat(L, "You cut yourself on the thorny vines.") - - +/** + * Venus Human Trap + * + * The result of a kudzu flower bud, these enemies use vines to drag prey close to them for attack. + * + * A carnivorious plant which uses vines to catch and ensnare prey. Spawns from kudzu flower buds. + * Each one has a maximum of four vines, which can be attached to a variety of things. Carbons are stunned when a vine is attached to them, and movable entities are pulled closer over time. + * Attempting to attach a vine to something with a vine already attached to it will pull all movable targets closer on command. + * Once the prey is in melee range, melee attacks from the venus human trap heals itself for 10% of its max health, assuming the target is alive. + * Akin to certain spiders, venus human traps can also be possessed and controlled by ghosts. + * + */ /mob/living/simple_animal/hostile/venus_human_trap name = "venus human trap" desc = "Now you know how the fly feels." icon_state = "venus_human_trap" - threat = 1 layer = SPACEVINE_MOB_LAYER health = 50 maxHealth = 50 - ranged = 1 + ranged = TRUE harm_intent_damage = 5 obj_damage = 60 melee_damage_lower = 25 @@ -63,65 +84,111 @@ attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE faction = list("hostile","vines","plants") - var/list/grasping = list() - var/max_grasps = 4 - var/grasp_chance = 20 - var/grasp_pull_chance = 85 - var/grasp_range = 4 - del_on_death = 1 + initial_language_holder = /datum/language_holder/venus + del_on_death = TRUE + /// A list of all the plant's vines + var/list/vines = list() + /// The maximum amount of vines a plant can have at one time + var/max_vines = 4 + /// How far away a plant can attach a vine to something + var/vine_grab_distance = 5 + /// Whether or not this plant is ghost possessable + var/playable_plant = FALSE //Normal plants can **not** have players. -/mob/living/simple_animal/hostile/venus_human_trap/Destroy() - for(var/L in grasping) - var/datum/beam/B = grasping[L] - if(B) - qdel(B) - grasping = null - return ..() +/mob/living/simple_animal/hostile/venus_human_trap/ghost_playable + playable_plant = TRUE //For admins that want to buss some harmless plants -/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action() - if(..()) - for(var/mob/living/L in grasping) - if(L.stat == DEAD) - var/datum/beam/B = grasping[L] - if(B) - B.End() - grasping -= L - - //Can attack+pull multiple times per cycle - if(L.Adjacent(src)) - L.attack_animal(src) - else - if(prob(grasp_pull_chance)) - setDir(get_dir(src,L) )//staaaare - step(L,get_dir(L,src)) //reel them in - L.DefaultCombatKnockdown(60) //you can't get away now~ - - if(grasping.len < max_grasps) - grasping: - for(var/mob/living/L in view(grasp_range, src)) - if(L == src || faction_check_mob(L) || (L in grasping) || L == target) - continue - for(var/t in getline(src,L)) - for(var/a in t) - var/atom/A = a - if(A.density && A != L) - continue grasping - if(prob(grasp_chance)) - to_chat(L, "\The [src] has you entangled!") - grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine) - - break //only take 1 new victim per cycle +/mob/living/simple_animal/hostile/venus_human_trap/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + pull_vines() +/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget() + . = ..() + if(isliving(target)) + var/mob/living/L = target + if(L.stat != DEAD) + adjustHealth(-maxHealth * 0.1) /mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target) - var/dist = get_dist(src,the_target) - Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine) - the_target.attack_animal(src) + for(var/datum/beam/B in vines) + if(B.target == the_target) + pull_vines() + ranged_cooldown = world.time + (ranged_cooldown_time * 0.5) + return + if(get_dist(src,the_target) > vine_grab_distance || vines.len == max_vines) + return + for(var/turf/T in getline(src,target)) + if (T.density) + return + for(var/obj/O in T) + if(O.density) + return + var/datum/beam/newVine = Beam(the_target, "vine", time=INFINITY, maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine) + RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine) + vines += newVine + if(isliving(the_target)) + var/mob/living/L = the_target + L.Paralyze(20) + ranged_cooldown = world.time + ranged_cooldown_time -/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target) +/mob/living/simple_animal/hostile/venus_human_trap/Login() + . = ..() + to_chat(src, "You a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!") + +/mob/living/simple_animal/hostile/venus_human_trap/attack_ghost(mob/user) . = ..() if(.) - if(the_target in grasping) - return 0 + return + humanize_plant(user) + +/** + * Sets a ghost to control the plant if the plant is eligible + * + * Asks the interacting ghost if they would like to control the plant. + * If they answer yes, and another ghost hasn't taken control, sets the ghost to control the plant. + * Arguments: + * * mob/user - The ghost to possibly control the plant + */ + +/mob/living/simple_animal/hostile/venus_human_trap/proc/humanize_plant(mob/user) + if(key || !playable_plant || stat) + return + var/plant_ask = alert("Become a venus human trap?", "Are you reverse vegan?", "Yes", "No") + if(plant_ask == "No" || QDELETED(src)) + return + if(key) + to_chat(user, "Someone else already took this plant!") + return + key = user.key + log_game("[key_name(src)] took control of [name].") + +/** + * Manages how the vines should affect the things they're attached to. + * + * Pulls all movable targets of the vines closer to the plant + * If the target is on the same tile as the plant, destroy the vine + * Removes any QDELETED vines from the vines list. + */ +/mob/living/simple_animal/hostile/venus_human_trap/proc/pull_vines() + for(var/datum/beam/B in vines) + if(istype(B.target, /atom/movable)) + var/atom/movable/AM = B.target + if(!AM.anchored) + step(AM,get_dir(AM,src)) + if(get_dist(src,B.target) == 0) + B.End() + +/** + * Removes a vine from the list. + * + * Removes the vine from our list. + * Called specifically when the vine is about to be destroyed, so we don't have any null references. + * Arguments: + * * datum/beam/vine - The vine to be removed from the list. + */ +mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force) + vines -= vine diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index 15d641299d..57fb6f829d 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -8,9 +8,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 3 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" threat = 3 speed = 0 maxHealth = 100 @@ -18,7 +15,8 @@ harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 - attacktext = "punches" + attack_verb_continuous = "punches" + attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -38,7 +36,7 @@ var/next_cast = 0 - do_footstep = TRUE + footstep_type = FOOTSTEP_MOB_SHOE /mob/living/simple_animal/hostile/wizard/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index 8878f17893..dc6154c05e 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -12,7 +12,8 @@ mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 threat = 1 - friendly = "floats near" + friendly_verb_continuous = "floats near" + friendly_verb_simple = "float near" speak_emote = list("puffs") vision_range = 5 speed = 0 @@ -23,7 +24,8 @@ obj_damage = 0 melee_damage_lower = 0 melee_damage_upper = 0 - attacktext = "chomps" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" attack_sound = 'sound/weapons/punch1.ogg' throw_message = "is avoided by the" vision_range = 5 @@ -45,12 +47,13 @@ QDEL_NULL(E) return ..() -/mob/living/simple_animal/hostile/asteroid/fugu/Life() +/mob/living/simple_animal/hostile/asteroid/fugu/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!wumbo) inflate_cooldown = max((inflate_cooldown - 1), 0) if(target && AIStatus == AI_ON) E.Activate() - ..() /mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(amount, updating_health = TRUE, forced = FALSE) if(!forced && wumbo) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 503f5c121e..6e4cbac022 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -13,7 +13,8 @@ harm_intent_damage = 5 melee_damage_lower = 21 melee_damage_upper = 21 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/hallucinations/growl1.ogg' a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -73,7 +74,8 @@ harm_intent_damage = 5 melee_damage_lower = 21 melee_damage_upper = 21 - attacktext = "bites" + attack_verb_continuous = "bites" + attack_verb_simple = "bite" attack_sound = 'sound/hallucinations/growl1.ogg' a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9ad9a121ca..de8a6fb6a0 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -50,13 +50,18 @@ melee_damage_upper = 10 melee_damage_lower = 5 - response_help = "pets" - response_disarm = "gently moves aside" - response_harm = "swats" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently moves aside" + response_disarm_simple = "gently move aside" + response_harm_continuous = "swats" + response_harm_simple = "swat" stop_automated_movement = 1 a_intent = INTENT_HARM //parrots now start "aggressive" since only player parrots will nuzzle. - attacktext = "chomps" - friendly = "grooms" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + friendly_verb_continuous = "grooms" + friendly_verb_simple = "groom" mob_size = MOB_SIZE_SMALL movement_type = FLYING gold_core_spawnable = FRIENDLY_SPAWN @@ -352,9 +357,9 @@ /* * AI - Not really intelligent, but I'm calling it AI anyway. */ -/mob/living/simple_animal/parrot/Life() - ..() - +/mob/living/simple_animal/parrot/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return //Sprite update for when a parrot gets pulled if(pulledby && !stat && parrot_state != PARROT_WANDER) if(buckled) @@ -364,8 +369,6 @@ parrot_state = PARROT_WANDER pixel_x = initial(pixel_x) pixel_y = initial(pixel_y) - return - //-----SPEECH /* Parrot speech mimickry! @@ -575,7 +578,12 @@ parrot_state = PARROT_WANDER return - attacktext = pick("claws at", "chomps") + if(prob(50)) + attack_verb_continuous = "claws at" + attack_verb_simple = "claw_at" + else + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" L.attack_animal(src)//Time for the hurt to begin! //Otherwise, fly towards the mob! else @@ -901,11 +909,12 @@ if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions. world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE) -/mob/living/simple_animal/parrot/Poly/Life() +/mob/living/simple_animal/parrot/Poly/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory(FALSE) memory_saved = TRUE - ..() /mob/living/simple_animal/parrot/Poly/death(gibbed) if(!memory_saved) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 6aa7f8b401..75182b85e5 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -13,13 +13,17 @@ healable = 0 speak_emote = list("hisses") emote_hear = list("wails.","screeches.") - response_help = "puts their hand through" - response_disarm = "flails at" - response_harm = "punches" + response_help_continuous = "puts their hand through" + response_help_simple = "put your hand through" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" speak_chance = 1 melee_damage_lower = 5 melee_damage_upper = 12 - attacktext = "metaphysically strikes" + attack_verb_continuous = "metaphysically strikes" + attack_verb_simple = "metaphysically strike" minbodytemp = 0 maxbodytemp = INFINITY atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -32,6 +36,7 @@ del_on_death = TRUE initial_language_holder = /datum/language_holder/construct blood_volume = 0 + has_field_of_vision = FALSE //we are a spoopy ghost /mob/living/simple_animal/shade/death() deathmessage = "lets out a contented sigh as [p_their()] form unwinds." diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3feed2129b..3491fd2f95 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -4,95 +4,141 @@ health = 20 maxHealth = 20 gender = PLURAL //placeholder - blood_volume = 550 //How much blud it has for bloodsucking + ///How much blud it has for bloodsucking + blood_volume = 550 status_flags = CANPUSH var/icon_living = "" - var/icon_dead = "" //icon when the animal is dead. Don't use animated icons for this. - var/icon_gib = null //We only try to show a gibbing animation if this exists. + ///icon when the animal is dead. Don't use animated icons for this. + var/icon_dead = "" + ///We only try to show a gibbing animation if this exists. + var/icon_gib = null var/list/speak = list() - var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable. + ///Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable. + var/list/speak_emote = list() var/speak_chance = 0 - var/list/emote_hear = list() //Hearable emotes - var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps + ///Hearable emotes + var/list/emote_hear = list() + ///Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps. + var/list/emote_see = list() var/turns_per_move = 1 var/turns_since_move = 0 - var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. - var/wander = 1 // Does the mob wander around when idle? - var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. + ///Use this to temporarely stop random movement or to if you write special movement code for animals. + var/stop_automated_movement = 0 + ///Does the mob wander around when idle? + var/wander = 1 + ///When set to 1 this stops the animal from moving when someone is pulling it. + var/stop_automated_movement_when_pulled = 1 - //Interaction - var/response_help = "pokes" - var/response_disarm = "shoves" - var/response_harm = "hits" + ///When someone interacts with the simple animal. + ///Help-intent verb in present continuous tense. + var/response_help_continuous = "pokes" + ///Help-intent verb in present simple tense. + var/response_help_simple = "poke" + ///Disarm-intent verb in present continuous tense. + var/response_disarm_continuous = "shoves" + ///Disarm-intent verb in present simple tense. + var/response_disarm_simple = "shove" + ///Harm-intent verb in present continuous tense. + var/response_harm_continuous = "hits" + ///Harm-intent verb in present simple tense. + var/response_harm_simple = "hit" var/harm_intent_damage = 3 - var/force_threshold = 0 //Minimum force required to deal any damage + ///Minimum force required to deal any damage. + var/force_threshold = 0 - //Temperature effect + ///Temperature effect. var/minbodytemp = 250 var/maxbodytemp = 350 - //Healable by medical stacks? Defaults to yes. + ///Healable by medical stacks? Defaults to yes. var/healable = 1 - //Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage + ///Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum - var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above + ///This damage is taken when atmos doesn't fit all the requirements above. + var/unsuitable_atmos_damage = 2 - //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly + ///LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly. var/melee_damage_lower = 0 var/melee_damage_upper = 0 - var/obj_damage = 0 //how much damage this simple animal does to objects, if any - var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value - var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage. - var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source - var/attacktext = "attacks" + ///How much damage this simple animal does to objects, if any. + var/obj_damage = 0 + ///How much armour they ignore, as a flat reduction from the targets armour value. + var/armour_penetration = 0 + ///Damage type of a simple mob's melee attack, should it do damage. + var/melee_damage_type = BRUTE + /// 1 for full damage , 0 for none , -1 for 1:1 heal from that source. + var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + ///Attacking verb in present continuous tense. + var/attack_verb_continuous = "attacks" + ///Attacking verb in present simple tense. + var/attack_verb_simple = "attack" var/attack_sound = null - var/friendly = "nuzzles" //If the mob does no damage with it's attack - var/environment_smash = ENVIRONMENT_SMASH_NONE //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls + ///Attacking, but without damage, verb in present continuous tense. + var/friendly_verb_continuous = "nuzzles" + ///Attacking, but without damage, verb in present simple tense. + var/friendly_verb_simple = "nuzzle" + ///Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls. + var/environment_smash = ENVIRONMENT_SMASH_NONE - var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster + ///LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster. + var/speed = 1 - //Hot simple_animal baby making vars + ///Hot simple_animal baby making vars. var/list/childtype = null var/next_scan_time = 0 - var/animal_species //Sorry, no spider+corgi buttbabies. + ///Sorry, no spider+corgi buttbabies. + var/animal_species - //simple_animal access - var/obj/item/card/id/access_card = null //innate access uses an internal ID card - var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against - var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood + ///Innate access uses an internal ID card. + var/obj/item/card/id/access_card = null + ///In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to TRUE, so we have something to check against. + var/buffed = FALSE + ///If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood. + var/gold_core_spawnable = NO_SPAWN var/datum/component/spawner/nest - var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions + ///Sentience type, for slime potions. + var/sentience_type = SENTIENCE_ORGANIC - var/list/loot = list() //list of things spawned at mob's loc when it dies - var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses + ///list of things spawned at mob's loc when it dies. + var/list/loot = list() + ///causes mob to be deleted on death, useful for mobs that spawn lootable corpses. + var/del_on_death = FALSE var/deathmessage = "" - var/death_sound = null //The sound played on death + ///The sound played on death. + var/death_sound = null var/allow_movement_on_non_turfs = FALSE - var/attacked_sound = "punch" //Played when someone punches the creature + ///Played when someone punches the creature. + var/attacked_sound = "punch" - var/dextrous = FALSE //If the creature has, and can use, hands + ///If the creature has, and can use, hands. + var/dextrous = FALSE var/dextrous_hud_type = /datum/hud/dextrous - var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players) - var/can_have_ai = TRUE //once we have become sentient, we can never go back + ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players). + var/AIStatus = AI_ON + ///once we have become sentient, we can never go back. + var/can_have_ai = TRUE - var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. + ///convenience var for forcibly waking up an idling AI on next check. + var/shouldwakeup = FALSE - //domestication + ///Domestication. var/tame = 0 - var/my_z // I don't want to confuse this with client registered_z + ///I don't want to confuse this with client registered_z. + var/my_z - var/do_footstep = FALSE + ///What kind of footstep this mob should have. Null if it shouldn't have any. + var/footstep_type /mob/living/simple_animal/Initialize() . = ..() @@ -106,6 +152,8 @@ update_simplemob_varspeed() if(dextrous) AddComponent(/datum/component/personal_crafting) + if(footstep_type) + AddComponent(/datum/component/footstep, footstep_type) /mob/living/simple_animal/Destroy() GLOB.simple_animals[AIStatus] -= src @@ -122,13 +170,9 @@ return ..() -/mob/living/simple_animal/initialize_footstep() - if(do_footstep) - ..() - /mob/living/simple_animal/updatehealth() ..() - health = CLAMP(health, 0, maxHealth) + health = clamp(health, 0, maxHealth) /mob/living/simple_animal/update_stat() if(status_flags & GODMODE) @@ -292,8 +336,8 @@ /mob/living/simple_animal/proc/update_simplemob_varspeed() if(speed == 0) - remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE) - add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) /mob/living/simple_animal/Stat() ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 700ee3b7ce..de5bb578b8 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -49,54 +49,53 @@ // Simple animals have only one belly. This creates it (if it isn't already set up) /mob/living/simple_animal/init_vore() - vore_init = TRUE + ENABLE_BITFIELD(vore_flags, VORE_INIT) if(CHECK_BITFIELD(flags_1, HOLOGRAM_1)) return - if(!vore_active || no_vore) //If it can't vore, let's not give it a stomach. + if(!vore_active || CHECK_BITFIELD(vore_flags, NO_VORE)) //If it can't vore, let's not give it a stomach. return if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with. verbs |= /mob/living/simple_animal/proc/animal_nom - if(LAZYLEN(vore_organs)) - return - - LAZYINITLIST(vore_organs) - var/obj/belly/B = new (src) - vore_selected = B - B.immutable = TRUE - B.name = vore_stomach_name ? vore_stomach_name : "stomach" - B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." - B.digest_mode = vore_default_mode - B.vore_sound = vore_default_sound - B.release_sound = vore_default_release - B.is_wet = vore_wetness - B.escapable = vore_escape_chance > 0 - B.escapechance = vore_escape_chance - B.digestchance = vore_digest_chance - B.absorbchance = vore_absorb_chance - B.human_prey_swallow_time = swallowTime - B.nonhuman_prey_swallow_time = swallowTime - B.vore_verb = "swallow" - B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace - "The insides knead at you gently for a moment.", - "The guts glorp wetly around you as some air shifts.", - "The predator takes a deep breath and sighs, shifting you somewhat.", - "The stomach squeezes you tight for a moment, then relaxes harmlessly.", - "The predator's calm breathing and thumping heartbeat pulses around you.", - "The warm walls kneads harmlessly against you.", - "The liquids churn around you, though there doesn't seem to be much effect.", - "The sound of bodily movements drown out everything for a moment.", - "The predator's movements gently force you into a different position.") - B.emote_lists[DM_DIGEST] = list( - "The burning acids eat away at your form.", - "The muscular stomach flesh grinds harshly against you.", - "The caustic air stings your chest when you try to breathe.", - "The slimy guts squeeze inward to help the digestive juices soften you up.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", - "The juices pooling beneath you sizzle against your sore skin.", - "The churning walls slowly pulverize you into meaty nutrients.", - "The stomach glorps and gurgles as it tries to work you into slop.") +/mob/living/simple_animal/lazy_init_belly() + if(!LAZYLEN(vore_organs)) + LAZYINITLIST(vore_organs) + var/obj/belly/B = new (src) + vore_selected = B + B.immutable = TRUE + B.name = vore_stomach_name ? vore_stomach_name : "stomach" + B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." + B.digest_mode = vore_default_mode + B.vore_sound = vore_default_sound + B.release_sound = vore_default_release + B.is_wet = vore_wetness + B.escapable = vore_escape_chance > 0 + B.escapechance = vore_escape_chance + B.digestchance = vore_digest_chance + B.absorbchance = vore_absorb_chance + B.human_prey_swallow_time = swallowTime + B.nonhuman_prey_swallow_time = swallowTime + B.vore_verb = "swallow" + B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace + "The insides knead at you gently for a moment.", + "The guts glorp wetly around you as some air shifts.", + "The predator takes a deep breath and sighs, shifting you somewhat.", + "The stomach squeezes you tight for a moment, then relaxes harmlessly.", + "The predator's calm breathing and thumping heartbeat pulses around you.", + "The warm walls kneads harmlessly against you.", + "The liquids churn around you, though there doesn't seem to be much effect.", + "The sound of bodily movements drown out everything for a moment.", + "The predator's movements gently force you into a different position.") + B.emote_lists[DM_DIGEST] = list( + "The burning acids eat away at your form.", + "The muscular stomach flesh grinds harshly against you.", + "The caustic air stings your chest when you try to breathe.", + "The slimy guts squeeze inward to help the digestive juices soften you up.", + "The onslaught against your body doesn't seem to be letting up; you're food now.", + "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", + "The juices pooling beneath you sizzle against your sore skin.", + "The churning walls slowly pulverize you into meaty nutrients.", + "The stomach glorps and gurgles as it tries to work you into slop.") // // Simple proc for animals to have their digestion toggled on/off externally @@ -134,6 +133,6 @@ if (stat != CONSCIOUS) return - if(!T.devourable) + if(!CHECK_BITFIELD(T.vore_flags,DEVOURABLE)) return return vore_attack(src,T,src) diff --git a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm index 22ed5e3ab4..3c911c1fcf 100644 --- a/code/modules/mob/living/simple_animal/simplemob_vore_values.dm +++ b/code/modules/mob/living/simple_animal/simplemob_vore_values.dm @@ -1,13 +1,9 @@ //CARBON MOBS /mob/living/carbon/alien - devourable = TRUE - digestable = TRUE - feeding = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING /mob/living/carbon/monkey - devourable = TRUE - digestable = TRUE - feeding = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING /* @@ -17,121 +13,68 @@ //NUETRAL MOBS /mob/living/simple_animal/crab - devourable = TRUE - digestable = TRUE - feeding = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING /mob/living/simple_animal/cow - devourable = TRUE - digestable = TRUE - feeding = TRUE - vore_active = TRUE - isPredator = TRUE - vore_default_mode = DM_HOLD + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING /mob/living/simple_animal/chick - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE /mob/living/simple_animal/chicken - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE /mob/living/simple_animal/mouse - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE /mob/living/simple_animal/kiwi - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE //STATION PETS /mob/living/simple_animal/pet - devourable = TRUE - digestable = TRUE - feeding = TRUE - -/mob/living/simple_animal/pet/fox - vore_active = TRUE - isPredator = TRUE - vore_default_mode = DM_HOLD - -/mob/living/simple_animal/pet/cat - vore_active = TRUE - isPredator = TRUE - vore_default_mode = DM_HOLD - -/mob/living/simple_animal/pet/dog - vore_active = TRUE - isPredator = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING vore_default_mode = DM_HOLD /mob/living/simple_animal/sloth - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE /mob/living/simple_animal/parrot - devourable = TRUE - digestable = TRUE + vore_flags = DEVOURABLE | DIGESTABLE //HOSTILE MOBS /mob/living/simple_animal/hostile/retaliate/goat - devourable = TRUE - digestable = TRUE - feeding = TRUE - vore_active = TRUE - isPredator = TRUE - vore_stomach_flavor = "You find yourself squeezed into the hollow of the goat, the smell of oats and hay thick in the tight space, all of which grinds in on you. Harmless for now..." + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING vore_default_mode = DM_HOLD + /mob/living/simple_animal/hostile/lizard - devourable = TRUE - digestable = TRUE - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/alien - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/bear - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/poison/giant_spider - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/retaliate/poison/snake - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/gorilla - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/asteroid/goliath - feeding = TRUE //for pet Goliaths I guess or something. - vore_active = TRUE - isPredator = TRUE + vore_flags = FEEDING vore_default_mode = DM_DIGEST /mob/living/simple_animal/hostile/carp - devourable = TRUE - digestable = TRUE - feeding = TRUE - vore_active = TRUE - isPredator = TRUE + vore_flags = DEVOURABLE | DIGESTABLE | FEEDING vore_default_mode = DM_DIGEST diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 4b89d96e64..9cc385fc77 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -7,19 +7,17 @@ var/SStun = 0 // stun variable -/mob/living/simple_animal/slime/Life() - set invisibility = 0 - if (notransform) +/mob/living/simple_animal/slime/BiologicalLife(seconds, times_fired) + if(!(. = ..())) return - if(..()) - if(buckled) - handle_feeding() - if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech - handle_nutrition() - handle_targets() - if (!ckey) - handle_mood() - handle_speech() + if(buckled) + handle_feeding() + if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech + handle_nutrition() + handle_targets() + if (!ckey) + handle_mood() + handle_speech() // Unlike most of the simple animals, slimes support UNCONSCIOUS /mob/living/simple_animal/slime/update_stat() @@ -232,7 +230,7 @@ Feedstop(0, 0) return - add_nutrition((rand(7, 15) * CONFIG_GET(number/damage_multiplier))) + adjust_nutrition((rand(7, 15) * CONFIG_GET(number/damage_multiplier)), get_max_nutrition(), TRUE) //Heal yourself. adjustBruteLoss(-3) @@ -244,15 +242,13 @@ return if(prob(15)) - nutrition -= 1 + is_adult + adjust_nutrition(-1 - is_adult) - if(nutrition <= 0) - nutrition = 0 - if(prob(75)) - adjustBruteLoss(rand(0,5)) + if(nutrition <= 0 && prob(75)) + adjustBruteLoss(rand(0,5)) else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) - nutrition -= 20 + adjust_nutrition(-20) amount_grown++ update_action_buttons_icon() @@ -262,8 +258,10 @@ else Evolve() -/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) - nutrition = min((nutrition + nutrition_to_add), get_max_nutrition()) +/mob/living/simple_animal/slime/adjust_nutrition(change, max = INFINITY, slime_check = FALSE) + . = ..() + if(!slime_check) + return if(nutrition >= get_grow_nutrition()) if(powerlevel<10) if(prob(30-powerlevel*2)) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index bf80ab9ff4..d93993bf1f 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -11,7 +11,7 @@ background_icon_state = "bg_alien" var/needs_growth = NO_GROWTH_NEEDED -/datum/action/innate/slime/IsAvailable() +/datum/action/innate/slime/IsAvailable(silent = FALSE) if(..()) var/mob/living/simple_animal/slime/S = owner if(needs_growth == GROWTH_NEEDED) @@ -28,7 +28,7 @@ return 0 var/list/choices = list() - for(var/mob/living/C in view(1,src)) + for(var/mob/living/C in fov_view(1,src)) if(C!=src && Adjacent(C)) choices += C @@ -184,13 +184,13 @@ var/mob/living/simple_animal/slime/M M = new(loc, child_colour) if(ckey) - M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! M.powerlevel = new_powerlevel if(i != 1) step_away(M,src) M.Friends = Friends.Copy() babies += M - M.mutation_chance = CLAMP(mutation_chance+(rand(5,-5)),0,100) + M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) var/mob/living/simple_animal/slime/new_slime = pick(babies) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 8594d53bd1..f7876b3516 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -3,6 +3,7 @@ icon = 'icons/mob/slimes.dmi' icon_state = "grey baby slime" pass_flags = PASSTABLE + mob_size = MOB_SIZE_SMALL ventcrawler = VENTCRAWLER_ALWAYS gender = NEUTER var/is_adult = 0 @@ -12,9 +13,12 @@ harm_intent_damage = 5 icon_living = "grey baby slime" icon_dead = "grey baby slime dead" - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "stomps on" + response_harm_simple = "stomp on" emote_see = list("jiggles", "bounces in place") speak_emote = list("blorbles") bubble_icon = "slime" @@ -27,6 +31,7 @@ healable = 0 gender = NEUTER blood_volume = 0 //Until someome reworks for them to have slime jelly + nutrition = 700 see_in_dark = 8 @@ -63,8 +68,6 @@ var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime var/force_stasis = FALSE - do_footstep = TRUE - var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") ///////////TIME FOR SUBSPECIES @@ -102,7 +105,7 @@ create_reagents(100, NONE, NO_REAGENTS_VALUE) set_colour(new_colour) . = ..() - nutrition = 700 + AddComponent(/datum/component/footstep, FOOTSTEP_MOB_SLIME, 7.5) /mob/living/simple_animal/slime/Destroy() for (var/A in actions) @@ -147,25 +150,26 @@ /mob/living/simple_animal/slime/on_reagent_change() . = ..() - remove_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod) var/amount = 0 if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down amount = 2 if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow amount = 5 if(amount) - add_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount) /mob/living/simple_animal/slime/updatehealth() . = ..() - remove_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, FALSE) - var/health_deficiency = (100 - health) + remove_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod) var/mod = 0 - if(health_deficiency >= 45) - mod += (health_deficiency / 25) - if(health <= 0) - mod += 2 - add_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, TRUE, 100, multiplicative_slowdown = mod) + if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) + var/health_deficiency = (maxHealth - health) + if(health_deficiency >= 45) + mod += (health_deficiency / 25) + if(health <= 0) + mod += 2 + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod) /mob/living/simple_animal/slime/adjust_bodytemperature() . = ..() @@ -173,9 +177,8 @@ if(bodytemperature >= 330.23) // 135 F or 57.08 C mod = -1 // slimes become supercharged at high temperatures else if(bodytemperature < 183.222) - mod = (283.222 - bodytemperature) / 10 * 1.75 - if(mod) - add_movespeed_modifier(MOVESPEED_ID_SLIME_TEMPMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = mod) + mod = min(15, (283.222 - bodytemperature) / 10 * 1.75) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod) /mob/living/simple_animal/slime/ObjBump(obj/O) if(!client && powerlevel > 0) @@ -267,8 +270,8 @@ return attacked += 5 if(nutrition >= 100) //steal some nutrition. negval handled in life() - nutrition -= (50 + (40 * M.is_adult)) - M.add_nutrition(50 + (40 * M.is_adult)) + adjust_nutrition(-50 - (40 * M.is_adult)) + M.adjust_nutrition(50 + (40 * M.is_adult), get_max_nutrition(), TRUE) if(health > 0) M.adjustBruteLoss(-10 + (-10 * M.is_adult)) M.updatehealth() diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 5cdeaecd37..0029300936 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -7,6 +7,8 @@ /mob/living/proc/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) if(!iscarbon(src)) return Paralyze(amount, updating, ignore_canknockdown) + if(!ignore_canknockdown && !(status_flags & CANKNOCKDOWN)) + return FALSE if(istype(buckled, /obj/vehicle/ridden)) buckled.unbuckle_mob(src) var/drop_items = amount > 80 //80 is cutoff for old item dropping behavior @@ -569,12 +571,13 @@ /mob/living/proc/cure_blind(source) REMOVE_TRAIT(src, TRAIT_BLIND, source) if(!HAS_TRAIT(src, TRAIT_BLIND)) - update_blindness() + if(eye_blind <= 1) //little hack now that we don't actively check for trait and unconsciousness on update_blindness. + adjust_blindness(-1) /mob/living/proc/become_blind(source) if(!HAS_TRAIT(src, TRAIT_BLIND)) // not blind already, add trait then overlay ADD_TRAIT(src, TRAIT_BLIND, source) - update_blindness() + blind_eyes(1) else ADD_TRAIT(src, TRAIT_BLIND, source) @@ -620,10 +623,40 @@ tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time) update_stat() +///Unignores all slowdowns that lack the IGNORE_NOSLOW flag. /mob/living/proc/unignore_slowdown(source) REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, source) - update_movespeed(FALSE) + update_movespeed() +///Ignores all slowdowns that lack the IGNORE_NOSLOW flag. /mob/living/proc/ignore_slowdown(source) ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source) - update_movespeed(FALSE) + update_movespeed() + +///Ignores specific slowdowns. Accepts a list of slowdowns. +/mob/living/proc/add_movespeed_mod_immunities(source, slowdown_type, update = TRUE) + if(islist(slowdown_type)) + for(var/listed_type in slowdown_type) + if(ispath(listed_type)) + listed_type = "[listed_type]" //Path2String + LAZYADDASSOC(movespeed_mod_immunities, listed_type, source) + else + if(ispath(slowdown_type)) + slowdown_type = "[slowdown_type]" //Path2String + LAZYADDASSOC(movespeed_mod_immunities, slowdown_type, source) + if(update) + update_movespeed() + +///Unignores specific slowdowns. Accepts a list of slowdowns. +/mob/living/proc/remove_movespeed_mod_immunities(source, slowdown_type, update = TRUE) + if(islist(slowdown_type)) + for(var/listed_type in slowdown_type) + if(ispath(listed_type)) + listed_type = "[listed_type]" //Path2String + LAZYREMOVEASSOC(movespeed_mod_immunities, listed_type, source) + else + if(ispath(slowdown_type)) + slowdown_type = "[slowdown_type]" //Path2String + LAZYREMOVEASSOC(movespeed_mod_immunities, slowdown_type, source) + if(update) + update_movespeed() diff --git a/code/modules/mob/living/update_icons.dm b/code/modules/mob/living/update_icons.dm index 8bf0dc98a9..f8d5d7e0ba 100644 --- a/code/modules/mob/living/update_icons.dm +++ b/code/modules/mob/living/update_icons.dm @@ -2,7 +2,6 @@ /mob/living/update_transform() var/matrix/ntransform = matrix(transform) //aka transform.Copy() var/final_pixel_y = pixel_y - var/final_dir = dir var/changed = 0 if(lying != lying_prev && rotate_on_lying) changed++ @@ -14,7 +13,7 @@ pixel_y = get_standard_pixel_y_offset() final_pixel_y = get_standard_pixel_y_offset(lying) if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + setDir(pick(NORTH, SOUTH)) //So you fall on your side rather than your face or ass if(resize != RESIZE_DEFAULT_SIZE) changed++ @@ -22,5 +21,5 @@ resize = RESIZE_DEFAULT_SIZE if(changed) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). + animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT) + floating_need_update = TRUE diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index c266bbddd3..b7546becd8 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -55,3 +55,5 @@ log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP) SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) + if(has_field_of_vision && CONFIG_GET(flag/use_field_of_vision)) + LoadComponent(/datum/component/field_of_vision, field_of_vision_type) diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index e5aaa016bd..536eacca7d 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -1,4 +1,5 @@ /mob/Logout() + SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGOUT, client) log_message("[key_name(src)] is no longer owning mob [src]([src.type])", LOG_OWNERSHIP) SStgui.on_logout(src) unset_machine() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 86c0aa253c..c5d2a34f89 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -35,7 +35,7 @@ continue var/datum/atom_hud/alternate_appearance/AA = v AA.onNewMob(src) - nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX) + set_nutrition(rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)) . = ..() update_config_movespeed() update_movespeed(TRUE) @@ -125,17 +125,29 @@ * * blind_message (optional) is what blind people will hear e.g. "You hear something!" * * vision_distance (optional) define how many tiles away the message can be seen. * * ignored_mobs (optional) doesn't show any message to any given mob in the list. + * * target (optional) is the other mob involved with the visible message. For example, the attacker in many combat messages. + * * target_message (optional) is what the target mob will see e.g. "[src] does something to you!" */ -/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, ignored_mobs, mob/target, target_message) var/turf/T = get_turf(src) if(!T) return var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. if(!length(hearers)) return - if(!islist(ignored_mobs)) - ignored_mobs = list(ignored_mobs) hearers -= ignored_mobs + + if(target_message && target && istype(target) && target.client) + hearers -= target + //This entire if/else chain could be in two lines but isn't for readibilties sake. + var/msg = target_message + if(target.see_invisibleSomething is there but you can't see it!") + return var/list/result = A.examine(src) to_chat(src, result.Join("\n")) - SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) //same as above //note: ghosts can point, this is intended //visible_message will handle invisibility properly //overridden here and in /mob/dead/observer for different point span classes and sanity checks -/mob/verb/pointed(atom/A as mob|obj|turf in view()) +/mob/verb/pointed(atom/A as mob|obj|turf in fov_view()) set name = "Point To" set category = "Object" @@ -351,7 +373,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA return FALSE new /obj/effect/temp_visual/point(A,invisibility) - + SEND_SIGNAL(src, COMSIG_MOB_POINTED, A) return TRUE /mob/proc/can_resist() @@ -593,7 +615,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) stat("Failsafe Controller:", "ERROR") if(Master) stat(null) - for(var/datum/controller/subsystem/SS in Master.subsystems) + for(var/datum/controller/subsystem/SS in Master.statworthy_subsystems) SS.stat_entry() GLOB.cameranet.stat_entry() if(statpanel("Tickets")) @@ -656,7 +678,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return FALSE if(anchored) return FALSE - if(notransform) + if(mob_transforming) return FALSE if(restrained()) return FALSE @@ -946,18 +968,65 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/vv_get_dropdown() . = ..() - . += "---" - .["Gib"] = "?_src_=vars;[HrefToken()];gib=[REF(src)]" - .["Give Spell"] = "?_src_=vars;[HrefToken()];give_spell=[REF(src)]" - .["Remove Spell"] = "?_src_=vars;[HrefToken()];remove_spell=[REF(src)]" - .["Give Disease"] = "?_src_=vars;[HrefToken()];give_disease=[REF(src)]" - .["Toggle Godmode"] = "?_src_=vars;[HrefToken()];godmode=[REF(src)]" - .["Drop Everything"] = "?_src_=vars;[HrefToken()];drop_everything=[REF(src)]" - .["Regenerate Icons"] = "?_src_=vars;[HrefToken()];regenerateicons=[REF(src)]" - .["Show player panel"] = "?_src_=vars;[HrefToken()];mob_player_panel=[REF(src)]" - .["Toggle Build Mode"] = "?_src_=vars;[HrefToken()];build_mode=[REF(src)]" - .["Assume Direct Control"] = "?_src_=vars;[HrefToken()];direct_control=[REF(src)]" - .["Offer Control to Ghosts"] = "?_src_=vars;[HrefToken()];offer_control=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_GIB, "Gib") + VV_DROPDOWN_OPTION(VV_HK_GIVE_SPELL, "Give Spell") + VV_DROPDOWN_OPTION(VV_HK_REMOVE_SPELL, "Remove Spell") + VV_DROPDOWN_OPTION(VV_HK_GIVE_DISEASE, "Give Disease") + VV_DROPDOWN_OPTION(VV_HK_GODMODE, "Toggle Godmode") + VV_DROPDOWN_OPTION(VV_HK_DROP_ALL, "Drop Everything") + VV_DROPDOWN_OPTION(VV_HK_REGEN_ICONS, "Regenerate Icons") + VV_DROPDOWN_OPTION(VV_HK_PLAYER_PANEL, "Show player panel") + VV_DROPDOWN_OPTION(VV_HK_BUILDMODE, "Toggle Buildmode") + VV_DROPDOWN_OPTION(VV_HK_DIRECT_CONTROL, "Assume Direct Control") + VV_DROPDOWN_OPTION(VV_HK_OFFER_GHOSTS, "Offer Control to Ghosts") + +/mob/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_REGEN_ICONS]) + if(!check_rights(NONE)) + return + regenerate_icons() + if(href_list[VV_HK_PLAYER_PANEL]) + if(!check_rights(NONE)) + return + usr.client.holder.show_player_panel(src) + if(href_list[VV_HK_GODMODE]) + if(!check_rights(R_ADMIN)) + return + usr.client.cmd_admin_godmode(src) + if(href_list[VV_HK_GIVE_SPELL]) + if(!check_rights(NONE)) + return + usr.client.give_spell(src) + if(href_list[VV_HK_REMOVE_SPELL]) + if(!check_rights(NONE)) + return + usr.client.remove_spell(src) + if(href_list[VV_HK_GIVE_DISEASE]) + if(!check_rights(NONE)) + return + usr.client.give_disease(src) + if(href_list[VV_HK_GIB]) + if(!check_rights(R_FUN)) + return + usr.client.cmd_admin_gib(src) + if(href_list[VV_HK_BUILDMODE]) + if(!check_rights(R_BUILDMODE)) + return + togglebuildmode(src) + if(href_list[VV_HK_DROP_ALL]) + if(!check_rights(NONE)) + return + usr.client.cmd_admin_drop_everything(src) + if(href_list[VV_HK_DIRECT_CONTROL]) + if(!check_rights(NONE)) + return + usr.client.cmd_assume_direct_control(src) + if(href_list[VV_HK_OFFER_GHOSTS]) + if(!check_rights(NONE)) + return + offer_control(src) /mob/vv_get_var(var_name) switch(var_name) @@ -965,6 +1034,10 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return debug_variable(var_name, logging, 0, src, FALSE) . = ..() +/mob/vv_auto_rename(new_name) + //Do not do parent's actions, as we *usually* do this differently. + fully_replace_character_name(real_name, new_name) + /mob/verb/open_language_menu() set name = "Open Language Menu" set category = "IC" @@ -972,6 +1045,14 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) var/datum/language_holder/H = get_language_holder() H.open_language_menu(usr) +///Adjust the nutrition of a mob +/mob/proc/adjust_nutrition(change, max = INFINITY) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks + nutrition = clamp(nutrition + change, 0, max) + +///Force set the mob nutrition +/mob/proc/set_nutrition(var/change) //Seriously fuck you oldcoders. + nutrition = max(0, change) + /mob/setMovetype(newval) . = ..() update_movespeed(FALSE) @@ -982,17 +1063,22 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /// Updates the grab state of the mob and updates movespeed /mob/setGrabState(newstate) . = ..() - if(grab_state == GRAB_PASSIVE) - remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE) - else - add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING) + switch(grab_state) + if(GRAB_PASSIVE) + remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE) + if(GRAB_AGGRESSIVE) + add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/aggressive) + if(GRAB_NECK) + add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/neck) + if(GRAB_KILL) + add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/kill) /mob/proc/update_equipment_speed_mods() var/speedies = equipped_speed_mods() if(!speedies) - remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, update=TRUE) else - add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies) /// Gets the combined speed modification of all worn items /// Except base mob type doesnt really wear items @@ -1000,3 +1086,10 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) for(var/obj/item/I in held_items) if(I.item_flags & SLOWS_WHILE_IN_HAND) . += I.slowdown + +/** + * Mostly called by doUnEquip() + * Like item dropped() on mob side. + */ +/mob/proc/on_item_dropped(obj/item/I) + return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index bf9dad1bc7..dbf7b7f350 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -10,6 +10,11 @@ throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC + vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace. + + /// What receives our keyboard input. src by default. + var/datum/focus + var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind var/list/datum/action/actions = list() @@ -32,7 +37,9 @@ var/next_move = null var/create_area_cooldown - var/notransform = null //Carbon + /// Whether or not the mob is currently being transformed into another mob or into another state of being. This will prevent it from moving or doing realistically anything. + /// Don't you DARE use this for a cheap way to ensure someone is stunned in your code. + var/mob_transforming = FALSE var/eye_blind = 0 //Carbon var/eye_blurry = 0 //Carbon var/real_name = null @@ -42,8 +49,11 @@ var/lying_prev = 0 var/is_shifted = FALSE - //MOVEMENT SPEED + /// List of movement speed modifiers applying to this mob var/list/movespeed_modification //Lazy list, see mob_movespeed.dm + /// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources) + var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm + /// The calculated mob speed slowdown based on the modifiers list var/cached_multiplicative_slowdown ///////////////// @@ -119,9 +129,30 @@ var/registered_z + var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + var/list/screens = list() + var/list/client_colours = list() + var/hud_type = /datum/hud + + var/datum/hSB/sandbox = null + var/mob/audiovisual_redirect //Mob to redirect messages, speech, and sounds to var/siliconaccessareas = list() var/siliconaccesstoggle = FALSE var/voluntary_ghosted = FALSE //whether or not they voluntarily ghosted. + + var/has_field_of_vision = FALSE + var/field_of_vision_type = FOV_90_DEGREES + + + ///////TYPING INDICATORS/////// + /// Set to true if we want to show typing indicators. + var/typing_indicator_enabled = FALSE + /// Default icon_state of our typing indicator. Currently only supports paths (because anything else is, as of time of typing this, unnecesary. + var/typing_indicator_state = /obj/effect/overlay/typing_indicator + /// The timer that will remove our indicator for early aborts (like when an user finishes their message) + var/typing_indicator_timerid + /// Current state of our typing indicator. Used for cut overlay, DO NOT RUNTIME ASSIGN OTHER THAN FROM SHOW/CLEAR. Used to absolutely ensure we do not get stuck overlays. + var/typing_indicator_current diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 4d9d15ae5c..e977c397c9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -32,7 +32,7 @@ if(!n || !direction || !mob?.loc) return FALSE //GET RID OF THIS SOON AS MOBILITY FLAGS IS DONE - if(mob.notransform) + if(mob.mob_transforming) return FALSE if(mob.control_object) @@ -80,12 +80,12 @@ var/oldloc = mob.loc if(L.confused) - var/newdir = 0 - if(L.confused > 40) + var/newdir = NONE + if((L.confused > 50) && prob(min(L.confused * 0.5, 50))) newdir = pick(GLOB.alldirs) - else if(prob(L.confused * 1.5)) + else if(prob(L.confused)) newdir = angle2dir(dir2angle(direction) + pick(90, -90)) - else if(prob(L.confused * 3)) + else if(prob(L.confused * 2)) newdir = angle2dir(dir2angle(direction) + pick(45, -45)) if(newdir) direction = newdir @@ -100,15 +100,17 @@ if(mob.throwing) mob.throwing.finalize(FALSE) - var/atom/movable/P = mob.pulling - if(P && !ismob(P) && P.density) - mob.setDir(turn(mob.dir, 180)) + var/atom/movable/AM = L.pulling + if(AM && AM.density && !SEND_SIGNAL(L, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) && !ismob(AM)) + L.setDir(turn(L.dir, 180)) - SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVE, src, direction, n, oldloc) + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVE, src, direction, n, oldloc, add_delay) /// Process_Grab(): checks for grab, attempts to break if so. Return TRUE to prevent movement. /client/proc/Process_Grab() if(mob.pulledby) + if((mob.pulledby == mob.pulling) && (mob.pulledby.grab_state == GRAB_PASSIVE)) //Don't autoresist passive grabs if we're grabbing them too. + return if(mob.incapacitated(ignore_restraints = 1)) move_delay = world.time + 10 return TRUE @@ -251,9 +253,9 @@ /mob/proc/update_gravity(has_gravity, override=FALSE) var/speed_change = max(0, has_gravity - STANDARD_GRAVITY) if(!speed_change) - remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE) + remove_movespeed_modifier(/datum/movespeed_modifier/gravity) else - add_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speed_change, blacklisted_movetypes=FLOATING) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown = speed_change) //bodypart selection - Cyberboss //8 toggles through head - eyes - mouth @@ -353,7 +355,7 @@ if(m_intent == MOVE_INTENT_RUN) m_intent = MOVE_INTENT_WALK else - if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude. + if (HAS_TRAIT(src,TRAIT_NORUNNING)) to_chat(src, "You find yourself unable to run.") return FALSE m_intent = MOVE_INTENT_RUN diff --git a/code/modules/mob/mob_movespeed.dm b/code/modules/mob/mob_movespeed.dm deleted file mode 100644 index a0be8ff7cb..0000000000 --- a/code/modules/mob/mob_movespeed.dm +++ /dev/null @@ -1,126 +0,0 @@ - -/*Current movespeed modification list format: list(id = list( - priority, - flags, - legacy slowdown/speedup amount, - movetype_flags, - blacklisted_movetypes, - conflict - )) -*/ - -//ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE! -/mob/proc/add_movespeed_modifier(id, update=TRUE, priority=0, flags=NONE, override=FALSE, multiplicative_slowdown=0, movetypes=ALL, blacklisted_movetypes=NONE, conflict=FALSE) - var/list/temp = list(priority, flags, multiplicative_slowdown, movetypes, blacklisted_movetypes, conflict) //build the modification list - var/resort = TRUE - if(LAZYACCESS(movespeed_modification, id)) - var/list/existing_data = movespeed_modification[id] - if(movespeed_modifier_identical_check(existing_data, temp)) - return FALSE - if(!override) - return FALSE - if(priority == existing_data[MOVESPEED_DATA_INDEX_PRIORITY]) - resort = FALSE // We don't need to re-sort if we're replacing something already there and it's the same priority - LAZYSET(movespeed_modification, id, temp) - if(update) - update_movespeed(resort) - return TRUE - -/mob/proc/remove_movespeed_modifier(id, update = TRUE) - if(!LAZYACCESS(movespeed_modification, id)) - return FALSE - LAZYREMOVE(movespeed_modification, id) - UNSETEMPTY(movespeed_modification) - if(update) - update_movespeed(FALSE) - return TRUE - -/mob/vv_edit_var(var_name, var_value) - var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown)) - var/diff - if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value)) - remove_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT) - diff = var_value - cached_multiplicative_slowdown - . = ..() - if(. && slowdown_edit && isnum(diff)) - add_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, TRUE, 100, override = TRUE, multiplicative_slowdown = diff) - -/mob/proc/has_movespeed_modifier(id) - return LAZYACCESS(movespeed_modification, id) - -/mob/proc/update_config_movespeed() - add_movespeed_modifier(MOVESPEED_ID_CONFIG_SPEEDMOD, FALSE, 100, override = TRUE, multiplicative_slowdown = get_config_multiplicative_speed()) - -/mob/proc/get_config_multiplicative_speed() - if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type]) - return 0 - else - return GLOB.mob_config_movespeed_type_lookup[type] - -/mob/proc/update_movespeed(resort = TRUE) - if(resort) - sort_movespeed_modlist() - . = 0 - var/list/conflict_tracker = list() - for(var/id in get_movespeed_modifiers()) - var/list/data = movespeed_modification[id] - if(!(data[MOVESPEED_DATA_INDEX_MOVETYPE] & movement_type)) // We don't affect any of these move types, skip - continue - if(data[MOVESPEED_DATA_INDEX_BL_MOVETYPE] & movement_type) // There's a movetype here that disables this modifier, skip - continue - var/conflict = data[MOVESPEED_DATA_INDEX_CONFLICT] - var/amt = data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN] - if(conflict) - // Conflicting modifiers prioritize the larger slowdown or the larger speedup - // We purposefuly don't handle mixing speedups and slowdowns on the same id - if(abs(conflict_tracker[conflict]) < abs(amt)) - conflict_tracker[conflict] = amt - else - continue - . += amt - cached_multiplicative_slowdown = . - -/mob/proc/get_movespeed_modifiers() - return movespeed_modification - -/mob/proc/movespeed_modifier_identical_check(list/mod1, list/mod2) - if(!islist(mod1) || !islist(mod2) || mod1.len < MOVESPEED_DATA_INDEX_MAX || mod2.len < MOVESPEED_DATA_INDEX_MAX) - return FALSE - for(var/i in 1 to MOVESPEED_DATA_INDEX_MAX) - if(mod1[i] != mod2[i]) - return FALSE - return TRUE - -/mob/proc/total_multiplicative_slowdown() - . = 0 - for(var/id in get_movespeed_modifiers()) - var/list/data = movespeed_modification[id] - . += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN] - -/proc/movespeed_data_null_check(list/data) //Determines if a data list is not meaningful and should be discarded. - . = TRUE - if(data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]) - . = FALSE - -/mob/proc/sort_movespeed_modlist() //Verifies it too. Sorts highest priority (first applied) to lowest priority (last applied) - if(!movespeed_modification) - return - var/list/assembled = list() - for(var/our_id in movespeed_modification) - var/list/our_data = movespeed_modification[our_id] - if(!islist(our_data) || (our_data.len < MOVESPEED_DATA_INDEX_PRIORITY) || movespeed_data_null_check(our_data)) - movespeed_modification -= our_id - continue - var/our_priority = our_data[MOVESPEED_DATA_INDEX_PRIORITY] - var/resolved = FALSE - for(var/their_id in assembled) - var/list/their_data = assembled[their_id] - if(their_data[MOVESPEED_DATA_INDEX_PRIORITY] < our_priority) - assembled.Insert(assembled.Find(their_id), our_id) - assembled[our_id] = our_data - resolved = TRUE - break - if(!resolved) - assembled[our_id] = our_data - movespeed_modification = assembled - UNSETEMPTY(movespeed_modification) \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index f348829b71..a403845ee2 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,12 +1,53 @@ //Speech verbs. -/mob/verb/say_verb(message as text) - set name = "Say" +// the _keybind verbs uses "as text" versus "as text|null" to force a popup when pressed by a keybind. +/mob/verb/say_typing_indicator() + set name = "say_indicator" + set hidden = TRUE set category = "IC" + display_typing_indicator() + var/message = input(usr, "", "say") as text|null + // If they don't type anything just drop the message. + clear_typing_indicator() // clear it immediately! + if(!length(message)) + return + return say_verb(message) + +/mob/verb/say_verb(message as text) + set name = "say" + set category = "IC" + if(!length(message)) + return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return - if(message) - say(message) + clear_typing_indicator() // clear it immediately! + say(message) + +/mob/verb/me_typing_indicator() + set name = "me_indicator" + set hidden = TRUE + set category = "IC" + display_typing_indicator() + var/message = input(usr, "", "me") as message|null + // If they don't type anything just drop the message. + clear_typing_indicator() // clear it immediately! + if(!length(message)) + return + return me_verb(message) + +/mob/verb/me_verb(message as message) + set name = "me" + set category = "IC" + if(!length(message)) + return + if(GLOB.say_disabled) //This is here to try to identify lag problems + to_chat(usr, "Speech is currently admin-disabled.") + return + + message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + clear_typing_indicator() // clear it immediately! + + usr.emote("me",1,message,TRUE) /mob/say_mod(input, message_mode) var/customsayverb = findtext(input, "*") @@ -16,9 +57,17 @@ else return ..() +/mob/proc/whisper_keybind() + var/message = input(src, "", "whisper") as text|null + if(!length(message)) + return + return whisper_verb(message) + /mob/verb/whisper_verb(message as text) set name = "Whisper" set category = "IC" + if(!length(message)) + return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return @@ -27,18 +76,6 @@ /mob/proc/whisper(message, datum/language/language=null) say(message, language) //only living mobs actually whisper, everything else just talks -/mob/verb/me_verb(message as message) - set name = "Me" - set category = "IC" - - if(GLOB.say_disabled) //This is here to try to identify lag problems - to_chat(usr, "Speech is currently admin-disabled.") - return - - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - - usr.emote("me",1,message,TRUE) - /mob/proc/say_dead(var/message) var/name = real_name var/alt_name = "" @@ -76,7 +113,7 @@ if(name != real_name) alt_name = " (died as [real_name])" - var/spanned = say_quote(message) + var/spanned = say_quote(say_emphasis(message)) message = emoji_parse(message) var/rendered = "DEAD: [name][alt_name] [emoji_parse(spanned)]" log_talk(message, LOG_SAY, tag="DEAD") diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 377bb1c5fc..5ed24af726 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -23,7 +23,6 @@ proc/get_top_level_mob(var/mob/S) message = null mob_type_blacklist_typecache = list(/mob/living/brain) - /datum/emote/living/subtle/proc/check_invalid(mob/user, input) if(stop_bad_mime.Find(input, 1, 1)) to_chat(user, "Invalid emote.") @@ -61,7 +60,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, LOG_EMOTE) - message = "[user] " + "[message]" + message = "[user] " + "[user.say_emphasis(message)]" for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) @@ -122,7 +121,7 @@ proc/get_top_level_mob(var/mob/S) return FALSE user.log_message(message, LOG_SUBTLER) - message = "[user] " + "[message]" + message = "[user] " + "[user.say_emphasis(message)]" if(emote_type == EMOTE_AUDIBLE) user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list) @@ -130,6 +129,12 @@ proc/get_top_level_mob(var/mob/S) user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list) ///////////////// VERB CODE +/mob/living/proc/subtle_keybind() + var/message = input(src, "", "subtle") as text|null + if(!length(message)) + return + return subtle(message) + /mob/living/verb/subtle() set name = "Subtle" set category = "IC" diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 10abf460c6..fbef8fd244 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -20,12 +20,12 @@ dizziness = max(amount, 0) /** - * Sets a mob's blindness to an amount if it was not above it already, similar to how status effects work + * Sets a mob's blindness to an amount if it was not above it already, similar to how status effects work */ /mob/proc/blind_eyes(amount) - var/old_blind = eye_blind || HAS_TRAIT(src, TRAIT_BLIND) - eye_blind = max(eye_blind, amount) - var/new_blind = eye_blind || HAS_TRAIT(src, TRAIT_BLIND) + var/old_blind = eye_blind + eye_blind = max((!eye_blind && stat == UNCONSCIOUS || HAS_TRAIT(src, TRAIT_BLIND)) ? 1 : eye_blind , amount) + var/new_blind = eye_blind if(old_blind != new_blind) update_blindness() @@ -36,21 +36,21 @@ */ /mob/proc/adjust_blindness(amount) var/old_eye_blind = eye_blind - eye_blind = max(0, eye_blind + amount) - if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND)) + eye_blind = max((stat == UNCONSCIOUS || HAS_TRAIT(src, TRAIT_BLIND)) ? 1 : 0, eye_blind + amount) + if(!old_eye_blind || !eye_blind) update_blindness() /** * Force set the blindness of a mob to some level */ /mob/proc/set_blindness(amount) var/old_eye_blind = eye_blind - eye_blind = max(amount, 0) - if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND)) + eye_blind = max(amount, (stat == UNCONSCIOUS || HAS_TRAIT(src, TRAIT_BLIND)) ? 1 : 0) + if(!old_eye_blind || !eye_blind) update_blindness() /// proc that adds and removes blindness overlays when necessary /mob/proc/update_blindness() - if(stat == UNCONSCIOUS || HAS_TRAIT(src, TRAIT_BLIND) || eye_blind) // UNCONSCIOUS or has blind trait, or has temporary blindness + if(eye_blind) // UNCONSCIOUS or has blind trait, or has temporary blindness if(stat == CONSCIOUS || stat == SOFT_CRIT) throw_alert("blind", /obj/screen/alert/blind) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) @@ -88,18 +88,20 @@ /mob/proc/add_eyeblur() if(!client) return - var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen - var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen - GW.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3))) - F.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3))) + var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], + hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) + for(var/A in screens) + var/obj/screen/plane_master/P = A + P.add_filter("blurry_eyes", 2, EYE_BLUR(clamp(eye_blurry*0.1,0.6,3))) /mob/proc/remove_eyeblur() if(!client) return - var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen - var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen - GW.remove_filter("blurry_eyes") - F.remove_filter("blurry_eyes") + var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], + hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) + for(var/A in screens) + var/obj/screen/plane_master/P = A + P.remove_filter("blurry_eyes") ///Adjust the drugginess of a mob /mob/proc/adjust_drugginess(amount) @@ -120,4 +122,4 @@ ///Adjust the body temperature of a mob, with min/max settings /mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY) if(bodytemperature >= min_temp && bodytemperature <= max_temp) - bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp) + bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 42aaa110c8..5fd94c8a89 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,5 +1,5 @@ /mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) - if (notransform) + if (mob_transforming) return //Handle items on mob @@ -29,7 +29,7 @@ dropItemToGround(W) //Make mob invisible and spawn animation - notransform = TRUE + mob_transforming = TRUE Stun(INFINITY, ignore_canstun = TRUE) icon = null cut_overlays() @@ -150,7 +150,7 @@ //Could probably be merged with monkeyize but other transformations got their own procs, too /mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) - if (notransform) + if (mob_transforming) return //Handle items on mob @@ -185,7 +185,7 @@ //Make mob invisible and spawn animation - notransform = TRUE + mob_transforming = TRUE Stun(22, ignore_canstun = TRUE) icon = null cut_overlays() @@ -304,7 +304,7 @@ qdel(src) /mob/living/carbon/human/AIize() - if (notransform) + if (mob_transforming) return for(var/t in bodyparts) qdel(t) @@ -312,12 +312,12 @@ return ..() /mob/living/carbon/AIize() - if(notransform) + if(mob_transforming) return for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = TRUE + mob_transforming = TRUE Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -353,7 +353,7 @@ qdel(src) /mob/living/carbon/human/proc/Robotize(delete_items = 0, transfer_after = TRUE) - if (notransform) + if (mob_transforming) return for(var/obj/item/W in src) if(delete_items) @@ -361,7 +361,7 @@ else dropItemToGround(W) regenerate_icons() - notransform = TRUE + mob_transforming = TRUE Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -398,12 +398,12 @@ //human -> alien /mob/living/carbon/human/proc/Alienize(mind_transfer = TRUE) - if (notransform) + if (mob_transforming) return for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 + mob_transforming = 1 Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -425,18 +425,19 @@ mind.transfer_to(new_xeno) else transfer_ckey(new_xeno) + update_atom_languages() to_chat(new_xeno, "You are now an alien.") . = new_xeno qdel(src) /mob/living/carbon/human/proc/slimeize(reproduce, mind_transfer = TRUE) - if (notransform) + if (mob_transforming) return for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 + mob_transforming = 1 Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -449,7 +450,7 @@ var/list/babies = list() for(var/i=1,i<=number,i++) var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc) - M.nutrition = round(nutrition/number) + M.set_nutrition(round(nutrition/number)) step_away(M,src) babies += M new_slime = pick(babies) @@ -476,12 +477,12 @@ /mob/living/carbon/human/proc/corgize(mind_transfer = TRUE) - if (notransform) + if (mob_transforming) return for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = TRUE + mob_transforming = TRUE Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -500,7 +501,7 @@ qdel(src) /mob/living/carbon/proc/gorillize(mind_transfer = TRUE) - if(notransform) + if(mob_transforming) return SSblackbox.record_feedback("amount", "gorillas_created", 1) @@ -511,7 +512,7 @@ dropItemToGround(W, TRUE) regenerate_icons() - notransform = TRUE + mob_transforming = TRUE Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM @@ -534,13 +535,13 @@ if(mind) mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE - if(notransform) + if(mob_transforming) return for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = TRUE + mob_transforming = TRUE Paralyze(INFINITY) icon = null invisibility = INVISIBILITY_MAXIMUM diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm new file mode 100644 index 0000000000..f28cbe4385 --- /dev/null +++ b/code/modules/mob/typing_indicator.dm @@ -0,0 +1,47 @@ +/// state = overlay/image/object/type/whatever add_overlay will accept +GLOBAL_LIST_EMPTY(typing_indicator_overlays) + +/// Fetches the typing indicator we'll use from GLOB.typing_indicator_overlays +/mob/proc/get_indicator_overlay(state) + . = GLOB.typing_indicator_overlays[state] + if(.) + return + // doesn't exist, make it and cache it + if(ispath(state)) + . = GLOB.typing_indicator_overlays[state] = state + // We only support paths for now because anything else isn't necessary yet. + +/// Gets the state we will use for typing indicators. Defaults to src.typing_indicator_state +/mob/proc/get_typing_indicator_icon_state() + return typing_indicator_state + +/** + * Displays typing indicator. + * @param timeout_override - Sets how long until this will disappear on its own without the user finishing their message or logging out. Defaults to src.typing_indicator_timeout + * @param state_override - Sets the state that we will fetch. Defaults to src.get_typing_indicator_icon_state() + * @param force - shows even if src.typing_indcator_enabled is FALSE. + */ +/mob/proc/display_typing_indicator(timeout_override = TYPING_INDICATOR_TIMEOUT, state_override = get_typing_indicator_icon_state(), force = FALSE) + if((!typing_indicator_enabled && !force) || typing_indicator_current) + return + typing_indicator_current = state_override + add_overlay(state_override) + typing_indicator_timerid = addtimer(CALLBACK(src, .proc/clear_typing_indicator), timeout_override, TIMER_STOPPABLE) + +/** + * Removes typing indicator. + */ +/mob/proc/clear_typing_indicator() + cut_overlay(typing_indicator_current) + typing_indicator_current = null + if(typing_indicator_timerid) + deltimer(typing_indicator_timerid) + typing_indicator_timerid = null + +/// Default typing indicator +/obj/effect/overlay/typing_indicator + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/mob/talk.dmi' + icon_state = "normal_typing" + appearance_flags = RESET_COLOR | TILE_BOUND | PIXEL_SCALE + layer = ABOVE_FLY_LAYER diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 295ecc66c0..81e2cb95e6 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -20,7 +20,6 @@ . = ..() if(!loc || !istype(loc, /obj/machinery/modular_computer)) CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") - return // Obtain reference to machinery computer all_components = list() idle_threads = list() @@ -69,4 +68,4 @@ if(MC_SDD) machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_disk if(MC_AI) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_card \ No newline at end of file + machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_card diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 744db1572f..37f3fc434e 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -41,11 +41,10 @@ // Cable coil. Works as repair method, but will probably require multiple applications and more cable. if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/S = I if(obj_integrity == max_integrity) to_chat(user, "\The [src] doesn't seem to require repairs.") return 1 - if(S.use(1)) + if(I.use_tool(src, user, 0, 1)) to_chat(user, "You patch up \the [src] with a bit of \the [I].") obj_integrity = min(obj_integrity + 10, max_integrity) return 1 diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 55f7c19cd7..e03427cc9c 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -54,7 +54,6 @@ holder.shutdown_computer() return TRUE - return FALSE @@ -95,4 +94,4 @@ name = "nano battery" desc = "A tiny power cell, commonly seen in low-end portable microcomputers." icon_state = "cell_micro" - maxcharge = 300 \ No newline at end of file + maxcharge = 300 diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 285463bc0f..e27eaa53ae 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -157,6 +157,7 @@ max_capacity = 64 icon_state = "ssd_mini" w_class = WEIGHT_CLASS_TINY + custom_price = PRICE_ABOVE_NORMAL /obj/item/computer_hardware/hard_drive/small/syndicate // Syndicate variant - very slight better desc = "An efficient SSD for portable devices developed by a rival organisation." diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 2bed456c41..9e0e1c8014 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -244,12 +244,12 @@ visible_message("[user] inserts [c.value] credits into [src].") qdel(c) return - /*else if(istype(I, /obj/item/holochip)) + else if(istype(I, /obj/item/holochip)) var/obj/item/holochip/HC = I credits += HC.credits - visible_message("[user] inserts a $[HC.credits] holocredit chip into [src].") + visible_message("[user] inserts a [HC.credits] cr holocredit chip into [src].") qdel(HC) - return + return else if(istype(I, /obj/item/card/id)) if(state != 2) return @@ -260,8 +260,8 @@ say("Insufficient money on card to purchase!") return credits += target_credits - say("$[target_credits] has been desposited from your account.") - return */ //Goonconomy when + say("[target_credits] cr has been desposited from your account.") + return return ..() // Simplified payment processing, returns 1 on success. diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm new file mode 100644 index 0000000000..0976f4d067 --- /dev/null +++ b/code/modules/movespeed/_movespeed_modifier.dm @@ -0,0 +1,217 @@ +/*! Movespeed modification datums. + + How move speed for mobs works + +Move speed is now calculated by using modifier datums which are added to mobs. Some of them (nonvariable ones) are globally cached, the variable ones are instanced and changed based on need. + +This gives us the ability to have multiple sources of movespeed, reliabily keep them applied and remove them when they should be + +THey can have unique sources and a bunch of extra fancy flags that control behaviour + +Previously trying to update move speed was a shot in the dark that usually meant mobs got stuck going faster or slower + +Movespeed modification list is a simple key = datum system. Key will be the datum's ID if it is overridden to not be null, or type if it is not. + +DO NOT override datum IDs unless you are going to have multiple types that must overwrite each other. It's more efficient to use types, ID functionality is only kept for cases where dynamic creation of modifiers need to be done. + +When update movespeed is called, the list of items is iterated, according to flags priority and a bunch of conditions +this spits out a final calculated value which is used as a modifer to last_move + modifier for calculating when a mob +can next move + +Key procs +* [add_movespeed_modifier](mob.html#proc/add_movespeed_modifier) +* [remove_movespeed_modifier](mob.html#proc/remove_movespeed_modifier) +* [has_movespeed_modifier](mob.html#proc/has_movespeed_modifier) +* [update_movespeed](mob.html#proc/update_movespeed) +*/ + +/datum/movespeed_modifier + /// Whether or not this is a variable modifier. Variable modifiers can NOT be ever auto-cached. ONLY CHECKED VIA INITIAL(), EFFECTIVELY READ ONLY (and for very good reason) + var/variable = FALSE + + /// Unique ID. You can never have different modifications with the same ID. By default, this SHOULD NOT be set. Only set it for cases where you're dynamically making modifiers/need to have two types overwrite each other. If unset, uses path (converted to text) as ID. + var/id + + /// Higher ones override lower priorities. This is NOT used for ID, ID must be unique, if it isn't unique the newer one overwrites automatically if overriding. + var/priority = 0 + var/flags = NONE + + /// Multiplicative slowdown + var/multiplicative_slowdown = 0 + + /// Movetypes this applies to + var/movetypes = ALL + + /// Movetypes this never applies to + var/blacklisted_movetypes = NONE + + /// Other modification datums this conflicts with. + var/conflicts_with + +/datum/movespeed_modifier/New() + . = ..() + if(!id) + id = "[type]" //We turn the path into a string. + +GLOBAL_LIST_EMPTY(movespeed_modification_cache) + +/// Grabs a STATIC MODIFIER datum from cache. YOU MUST NEVER EDIT THESE DATUMS, OR IT WILL AFFECT ANYTHING ELSE USING IT TOO! +/proc/get_cached_movespeed_modifier(modtype) + if(!ispath(modtype, /datum/movespeed_modifier)) + CRASH("[modtype] is not a movespeed modification typepath.") + var/datum/movespeed_modifier/M = modtype + if(initial(M.variable)) + CRASH("[modtype] is a variable modifier, and can never be cached.") + M = GLOB.movespeed_modification_cache[modtype] + if(!M) + M = GLOB.movespeed_modification_cache[modtype] = new modtype + return M + +///Add a move speed modifier to a mob. If a variable subtype is passed in as the first argument, it will make a new datum. If ID conflicts, it will overwrite the old ID. +/mob/proc/add_movespeed_modifier(datum/movespeed_modifier/type_or_datum, update = TRUE) + if(ispath(type_or_datum)) + if(!initial(type_or_datum.variable)) + type_or_datum = get_cached_movespeed_modifier(type_or_datum) + else + type_or_datum = new type_or_datum + var/datum/movespeed_modifier/existing = LAZYACCESS(movespeed_modification, type_or_datum.id) + if(existing) + if(existing == type_or_datum) //same thing don't need to touch + return TRUE + remove_movespeed_modifier(existing, FALSE) + if(length(movespeed_modification)) + BINARY_INSERT(type_or_datum.id, movespeed_modification, datum/movespeed_modifier, type_or_datum, priority, COMPARE_VALUE) + LAZYSET(movespeed_modification, type_or_datum.id, type_or_datum) + if(update) + update_movespeed() + return TRUE + +/// Remove a move speed modifier from a mob, whether static or variable. +/mob/proc/remove_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE) + var/key + if(ispath(type_id_datum)) + key = initial(type_id_datum.id) || "[type_id_datum]" //id if set, path set to string if not. + else if(!istext(type_id_datum)) //if it isn't text it has to be a datum, as it isn't a type. + key = type_id_datum.id + else //assume it's an id + key = type_id_datum + if(!LAZYACCESS(movespeed_modification, key)) + return FALSE + LAZYREMOVE(movespeed_modification, key) + if(update) + update_movespeed(FALSE) + return TRUE + +/*! Used for variable slowdowns like hunger/health loss/etc, works somewhat like the old list-based modification adds. Returns the modifier datum if successful + How this SHOULD work is: + 1. Ensures type_id_datum one way or another refers to a /variable datum. This makes sure it can't be cached. This includes if it's already in the modification list. + 2. Instantiate a new datum if type_id_datum isn't already instantiated + in the list, using the type. Obviously, wouldn't work for ID only. + 3. Add the datum if necessary using the regular add proc + 4. If any of the rest of the args are not null (see: multiplicative slowdown), modify the datum + 5. Update if necessary +*/ +/mob/proc/add_or_update_variable_movespeed_modifier(datum/movespeed_modifier/type_id_datum, update = TRUE, multiplicative_slowdown) + var/modified = FALSE + var/inject = FALSE + var/datum/movespeed_modifier/final + if(istext(type_id_datum)) + final = LAZYACCESS(movespeed_modification, type_id_datum) + if(!final) + CRASH("Couldn't find existing modification when provided a text ID.") + else if(ispath(type_id_datum)) + if(!initial(type_id_datum.variable)) + CRASH("Not a variable modifier") + final = LAZYACCESS(movespeed_modification, initial(type_id_datum.id) || "[type_id_datum]") + if(!final) + final = new type_id_datum + inject = TRUE + modified = TRUE + else + if(!initial(type_id_datum.variable)) + CRASH("Not a variable modifier") + final = type_id_datum + if(!LAZYACCESS(movespeed_modification, final.id)) + inject = TRUE + modified = TRUE + if(!isnull(multiplicative_slowdown)) + final.multiplicative_slowdown = multiplicative_slowdown + modified = TRUE + if(inject) + add_movespeed_modifier(final, FALSE) + if(update && modified) + update_movespeed(TRUE) + return final + +/// Handles the special case of editing the movement var +/mob/vv_edit_var(var_name, var_value) + var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown)) + var/diff + if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value)) + remove_movespeed_modifier(/datum/movespeed_modifier/admin_varedit) + diff = var_value - cached_multiplicative_slowdown + . = ..() + if(. && slowdown_edit && isnum(diff)) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, multiplicative_slowdown = diff) + +///Is there a movespeed modifier for this mob +/mob/proc/has_movespeed_modifier(datum/movespeed_modifier/datum_type_id) + var/key + if(ispath(datum_type_id)) + key = initial(datum_type_id.id) || "[datum_type_id]" + else if(istext(datum_type_id)) + key = datum_type_id + else + key = datum_type_id.id + return LAZYACCESS(movespeed_modification, key) + +/// Set or update the global movespeed config on a mob +/mob/proc/update_config_movespeed() + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/mob_config_speedmod, multiplicative_slowdown = get_config_multiplicative_speed()) + +/// Get the global config movespeed of a mob by type +/mob/proc/get_config_multiplicative_speed() + if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type]) + return 0 + else + return GLOB.mob_config_movespeed_type_lookup[type] + +/// Go through the list of movespeed modifiers and calculate a final movespeed. ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE! +/mob/proc/update_movespeed() + . = 0 + var/list/conflict_tracker = list() + for(var/key in get_movespeed_modifiers()) + var/datum/movespeed_modifier/M = movespeed_modification[key] + if(!(M.movetypes & movement_type)) // We don't affect any of these move types, skip + continue + if(M.blacklisted_movetypes & movement_type) // There's a movetype here that disables this modifier, skip + continue + var/conflict = M.conflicts_with + var/amt = M.multiplicative_slowdown + if(conflict) + // Conflicting modifiers prioritize the larger slowdown or the larger speedup + // We purposefuly don't handle mixing speedups and slowdowns on the same id + if(abs(conflict_tracker[conflict]) < abs(amt)) + conflict_tracker[conflict] = amt + else + continue + . += amt + cached_multiplicative_slowdown = . + +/// Get the move speed modifiers list of the mob +/mob/proc/get_movespeed_modifiers() + . = LAZYCOPY(movespeed_modification) + for(var/id in movespeed_mod_immunities) + . -= id + +/// Calculate the total slowdown of all movespeed modifiers +/mob/proc/total_multiplicative_slowdown() + . = 0 + for(var/id in get_movespeed_modifiers()) + var/datum/movespeed_modifier/M = movespeed_modification[id] + . += M.multiplicative_slowdown + +/// Checks if a move speed modifier is valid and not missing any data +/proc/movespeed_data_null_check(datum/movespeed_modifier/M) //Determines if a data list is not meaningful and should be discarded. + . = TRUE + if(M.multiplicative_slowdown) + . = FALSE diff --git a/code/modules/movespeed/modifiers/components.dm b/code/modules/movespeed/modifiers/components.dm new file mode 100644 index 0000000000..436b85e2e1 --- /dev/null +++ b/code/modules/movespeed/modifiers/components.dm @@ -0,0 +1,21 @@ +/datum/movespeed_modifier/shrink_ray + movetypes = GROUND + multiplicative_slowdown = 4 + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/snail_crawl + multiplicative_slowdown = -7 + movetypes = GROUND + +/datum/movespeed_modifier/sanity + id = MOVESPEED_ID_SANITY + blacklisted_movetypes = FLYING + +/datum/movespeed_modifier/sanity/insane + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/sanity/crazy + multiplicative_slowdown = 1 + +/datum/movespeed_modifier/sanity/disturbed + multiplicative_slowdown = 0.5 diff --git a/code/modules/movespeed/modifiers/innate.dm b/code/modules/movespeed/modifiers/innate.dm new file mode 100644 index 0000000000..a0357ddf0f --- /dev/null +++ b/code/modules/movespeed/modifiers/innate.dm @@ -0,0 +1,20 @@ +/datum/movespeed_modifier/strained_muscles + multiplicative_slowdown = -1 + blacklisted_movetypes = (FLYING|FLOATING) + +/datum/movespeed_modifier/pai_spacewalk + multiplicative_slowdown = 2 + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/species + movetypes = ~FLYING + variable = TRUE + +/datum/movespeed_modifier/dna_vault_speedup + blacklisted_movetypes = (FLYING|FLOATING) + multiplicative_slowdown = -1 + +/datum/movespeed_modifier/small_stride + blacklisted_movetypes = (FLOATING|CRAWLING) + variable = TRUE + flags = IGNORE_NOSLOW diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm new file mode 100644 index 0000000000..94dc2a1553 --- /dev/null +++ b/code/modules/movespeed/modifiers/items.dm @@ -0,0 +1,12 @@ +/datum/movespeed_modifier/jetpack + conflicts_with = MOVE_CONFLICT_JETPACK + movetypes = FLOATING + +/datum/movespeed_modifier/jetpack/cybernetic + multiplicative_slowdown = -0.5 + +/datum/movespeed_modifier/jetpack/fullspeed + multiplicative_slowdown = -2 + +/datum/movespeed_modifier/die_of_fate + multiplicative_slowdown = 1 diff --git a/code/modules/movespeed/modifiers/misc.dm b/code/modules/movespeed/modifiers/misc.dm new file mode 100644 index 0000000000..55c1aef527 --- /dev/null +++ b/code/modules/movespeed/modifiers/misc.dm @@ -0,0 +1,6 @@ +/datum/movespeed_modifier/admin_varedit + variable = TRUE + +/datum/movespeed_modifier/yellow_orb + multiplicative_slowdown = -2 + blacklisted_movetypes = (FLYING|FLOATING) diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm new file mode 100644 index 0000000000..a2176ca95e --- /dev/null +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -0,0 +1,125 @@ +/datum/movespeed_modifier/obesity + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/monkey_reagent_speedmod + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/monkey_health_speedmod + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/monkey_temperature_speedmod + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/hunger + variable = TRUE + +/datum/movespeed_modifier/slaughter + multiplicative_slowdown = -1 + +/datum/movespeed_modifier/damage_slowdown + blacklisted_movetypes = FLOATING|FLYING + variable = TRUE + +/datum/movespeed_modifier/damage_slowdown_flying + movetypes = FLYING + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/equipment_speedmod + variable = TRUE + blacklisted_movetypes = FLOATING + +/datum/movespeed_modifier/grab_slowdown + id = MOVESPEED_ID_MOB_GRAB_STATE + blacklisted_movetypes = FLOATING + +/datum/movespeed_modifier/grab_slowdown/aggressive + multiplicative_slowdown = 3 + +/datum/movespeed_modifier/grab_slowdown/neck + multiplicative_slowdown = 6 + +/datum/movespeed_modifier/grab_slowdown/kill + multiplicative_slowdown = 9 + +/datum/movespeed_modifier/slime_reagentmod + variable = TRUE + +/datum/movespeed_modifier/slime_healthmod + variable = TRUE + +/datum/movespeed_modifier/config_walk_run + multiplicative_slowdown = 1 + id = MOVESPEED_ID_MOB_WALK_RUN + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/config_walk_run/proc/sync() + +/datum/movespeed_modifier/config_walk_run/walk/sync() + var/mod = CONFIG_GET(number/movedelay/walk_delay) + multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown) + +/datum/movespeed_modifier/config_walk_run/run/sync() + var/mod = CONFIG_GET(number/movedelay/run_delay) + multiplicative_slowdown = isnum(mod)? mod : initial(multiplicative_slowdown) + +/datum/movespeed_modifier/turf_slowdown + movetypes = GROUND + blacklisted_movetypes = (FLYING|FLOATING) + variable = TRUE + +/datum/movespeed_modifier/bulky_drag + variable = TRUE + +/datum/movespeed_modifier/cold + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/shove + multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH + +/datum/movespeed_modifier/human_carry + variable = TRUE + +/datum/movespeed_modifier/limbless + variable = TRUE + movetypes = GROUND + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/simplemob_varspeed + variable = TRUE + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/tarantula_web + multiplicative_slowdown = 3 + +/datum/movespeed_modifier/gravity + blacklisted_movetypes = FLOATING + variable = TRUE + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/carbon_softcrit + multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN + +/datum/movespeed_modifier/slime_tempmod + variable = TRUE + +/datum/movespeed_modifier/carbon_crawling + multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN + movetypes = CRAWLING + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/mob_config_speedmod + variable = TRUE + flags = IGNORE_NOSLOW + +/datum/movespeed_modifier/liver_cirrhosis + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/active_block + variable = TRUE + flags = IGNORE_NOSLOW diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm new file mode 100644 index 0000000000..b6c2458670 --- /dev/null +++ b/code/modules/movespeed/modifiers/reagents.dm @@ -0,0 +1,14 @@ +/datum/movespeed_modifier/reagent + blacklisted_movetypes = (FLYING|FLOATING) + +/datum/movespeed_modifier/reagent/stimulants + multiplicative_slowdown = -0.5 + +/datum/movespeed_modifier/reagent/changelinghaste + multiplicative_slowdown = -2 + +/datum/movespeed_modifier/reagent/skooma + multiplicative_slowdown = -1 + +/datum/movespeed_modifier/reagent/nitryl + multiplicative_slowdown = -1 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm new file mode 100644 index 0000000000..4c710cb483 --- /dev/null +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -0,0 +1,44 @@ +/datum/movespeed_modifier/status_effect/bloodchill + multiplicative_slowdown = 3 + +/datum/movespeed_modifier/status_effect/bonechill + multiplicative_slowdown = 3 + +/datum/movespeed_modifier/status_effect/tarfoot + multiplicative_slowdown = 0.5 + blacklisted_movetypes = (FLYING|FLOATING) + +/datum/movespeed_modifier/status_effect/sepia + variable = TRUE + blacklisted_movetypes = (FLYING|FLOATING) + +/datum/movespeed_modifier/status_effect/mesmerize + blacklisted_movetypes = CRAWLING + multiplicative_slowdown = 5 + priority = 64 + +/datum/movespeed_modifier/status_effect/tased + multiplicative_slowdown = 1.5 + priority = 50 + +/datum/movespeed_modifier/status_effect/tased/no_combat_mode + multiplicative_slowdown = 8 + priority = 100 + +/datum/movespeed_modifier/status_effect/electrostaff + multiplicative_slowdown = 1 + movetypes = GROUND + +//no comment. +/datum/movespeed_modifier/status_effect/breast_hypertrophy + blacklisted_movetypes = FLOATING + variable = TRUE + +//this shouldn't even exist. +/datum/movespeed_modifier/status_effect/penis_hypertrophy + blacklisted_movetypes = FLOATING + variable = TRUE + +/datum/movespeed_modifier/status_effect/mkultra + multiplicative_slowdown = -2 + blacklisted_movetypes= FLYING|FLOATING diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index 95a24817a0..cb2d49fc64 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_EMPTY(allCasters) desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" icon = 'icons/obj/terminals.dmi' icon_state = "newscaster_normal" + plane = ABOVE_WALL_PLANE verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index f1e7119530..bc3c445731 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -41,6 +41,9 @@ Contents: for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) spawn_locs += L.loc + for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list) + if(isturf(L.loc)) + spawn_locs += L.loc if(!spawn_locs.len) return kill() spawn_loc = pick(spawn_locs) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index c723f2cd7b..c0ee68cdee 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -106,7 +106,7 @@ It is possible to destroy the net by the occupant or someone else. playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1) new /obj/effect/temp_visual/dir_setting/ninja/phase(affecting.drop_location(), affecting.dir) -/obj/attack_alien(mob/living/carbon/alien/humanoid/user) +/obj/structure/energy_net/attack_alien(mob/living/carbon/alien/humanoid/user) if(attack_generic(user, 15, BRUTE, "melee", 0)) //Aliens normally deal 60 damage to structures. They'd one-shot nets without this. playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm index 31ac62d9fc..508722ecf2 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm @@ -15,4 +15,4 @@ /obj/item/throwing_star/ninja name = "ninja throwing star" throwforce = 30 - embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 100, "embedded_fall_chance" = 0) + embedding = list("pain_mult" = 6, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15) diff --git a/code/modules/oracle_ui/assets.dm b/code/modules/oracle_ui/assets.dm index 5d26d80a81..348860b48d 100644 --- a/code/modules/oracle_ui/assets.dm +++ b/code/modules/oracle_ui/assets.dm @@ -1,8 +1,11 @@ +/datum/asset/group/oui_theme_nano + children = list( + /datum/asset/simple/jquery, + /datum/asset/simple/oui_theme_nano + ) + /datum/asset/simple/oui_theme_nano assets = list( - // JavaScript - "sui-nano-common.js" = 'html/oracle_ui/themes/nano/sui-nano-common.js', - "sui-nano-jquery.min.js" = 'html/oracle_ui/themes/nano/sui-nano-jquery.min.js', - // Stylesheets - "sui-nano-common.css" = 'html/oracle_ui/themes/nano/sui-nano-common.css', + "sui-nano-common.js" = 'html/oracle_ui/themes/nano/sui-nano-common.js', + "sui-nano-common.css" = 'html/oracle_ui/themes/nano/sui-nano-common.css', ) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 2c02903d3e..f46d4bf029 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -8,7 +8,6 @@ item_flags = NOBLUDGEON /obj/item/paper/contract/ComponentInitialize() - return . = ..() AddElement(/datum/element/update_icon_blocker) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 35a2b3f058..aed3ff5848 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -384,3 +384,6 @@ /obj/item/paper/crumpled/bloody icon_state = "scrap_bloodied" + +/obj/item/paper/crumpled/muddy + icon_state = "scrap_mud" diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 9a60158e73..23c8d47323 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -48,11 +48,133 @@ name = "paper- 'Chemical Information'" info = "Known Onboard Toxins:
    \n\tGrade A Semi-Liquid Plasma:
    \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
    \n\t\tA gas mask fails to filter plasma after 50 units.
    \n\t\tWill attempt to diffuse like a gas.
    \n\t\tFiltered by scrubbers.
    \n\t\tThere is a bottled version which is very different
    \n\t\t\tfrom the version found in canisters!
    \n
    \n\t\tWARNING: Highly Flammable. Keep away from heat sources
    \n\t\texcept in an enclosed fire area!
    \n\t\tWARNING: It is a crime to use this without authorization.
    \nKnown Onboard Anti-Toxin:
    \n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
    \n\t\tBest if injected directly into bloodstream.
    \n\t\tA full injection is in every regular Med-Kit.
    \n\t\tSpecial toxin Kits hold around 7.
    \n
    \nKnown Onboard Chemicals (other):
    \n\tRejuvenation T#001:
    \n\t\tEven 1 unit injected directly into the bloodstream
    \n\t\t\twill cure unconscious and sleep toxins.
    \n\t\tIf administered to a dying patient it will prevent
    \n\t\t\tfurther damage for about units*3 seconds.
    \n\t\t\tit will not cure them or allow them to be cured.
    \n\t\tIt can be administered to a non-dying patient
    \n\t\t\tbut the chemicals disappear just as fast.
    \n\tMorphine T#054:
    \n\t\t5 units will induce precisely 1 minute of sleep.
    \n\t\t\tThe effect are cumulative.
    \n\t\tWARNING: It is a crime to use this without authorization" - /* * Stations */ +/obj/item/paper/guides/cogstation/job_changes + name = "MEMO: Job Changes" + info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
    \n
    \n- Scientists are to have access to chemistry in order to reach the MedSci router.
    \n
    \n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large.
    \n- Roboticists are to have basic Medical and Morgue access.
    \n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
    \n- The Cook should not have Morgue access
    \n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
    \n
    \nGenerated by Organic Resources Bot #2053" + +/obj/item/paper/guides/cogstation/letter_sec + name = "To future Security personnel" + info = "As this station's Head of Security prior to it being translocated to your sector, my hope is that Central Command will properly brief you on the ins and outs of this particular layout. I'm writing this in case they don't. 'CogStation' as it's called may be worlds different than other stations in your sector, so I wanted to mention a few things:
    \n
    \nFirst of all, the brig uses a 'genpop' prison system. While I'm sure books exist on the subject, the main thing to know is prisoners share a common area regardless of sentence length. There is a single solitary cell, but it should be reserved only for the particularly dangerous.
    \n
    \nYour auxiliary posts can be found in the fore and starboard quarter parts of the station; near arrivals and cargo, respectively. I've heard about stations with a post in each department - unfortunately, this isn't one of them. If it's any consolation, the security wing is rather centrally located.
    \n
    \nAfter a perp's done their time, you can let them out via the disposal unit right outside the prison wing. It'll plop them right outside your front desk without the potential hassle of escorting them through your office.
    \n
    \nHave a secure day!
    \n- Louis Cannon" + +/obj/item/paper/guides/cogstation/disposals + name = "Regarding the disposal system:" + info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
    \n
    \n- WHITE/GRAY STRIPES is for DELIVERIES.
    \n- RED STRIPES is for CORPSES.
    \n- EVERYTHING ELSE is for TRASH,
    barring a few exceptions that should be labeled as such.
    \n
    \nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
    \n
    \n-C. Donnelly
    Architectural Analyst" + +/obj/item/paper/guides/cogstation/janitor + name = "a quick tip" + info = "I'm gonna tell you something I wish I knew my first day here: there's an auxiliary custodial closet on the other end of the station. Just head straight through maintenance behind the bathrooms next to engineering and you'll find it.
    \n
    \nNow this sounds great until you realize there's no quick way to the other end of the station without a spacesuit - then it sounds like a gift from the gods!
    \n
    \n- 'Squeaky' Kleiner" + +/obj/item/paper/guides/cogstation/cooks + name = "MEMO: Cooks" + info = "Please be aware that while a smartfridge has recently been installed in your kitchen, botanists may choose to use the produce delivery system instead. You'll find the outlet, in addition to your freezer in the adjacent service hall. You can also send food directly to the bar and prison inmates via the disposal bins marked with dark red and bright red tiling, respectively.
    \n
    \nGenerated by Organic Resources Bot #7004" + +/obj/item/paper/guides/cogstation/cdn_chap + name = "About the corpse disposal network" + info = "One of the medical staff has insisted I leave a message regarding the 'corpse disposal network' and its significance. From what I have been told, it has been designed so medical staff can deliver the deceased directly to you. However, bodies from the medical booth or detective's office next door will be sent your way first.
    \nThe delivery chute will allow you to send these bodies to the medical department so that they can attempt to revive them, if possible. I would recommend periodically checking the morgue for any unannounced arrivals, but make sure bodies are devoid of a soul before 'burying' or cremating them!
    \n
    \nSoulstone Obelisk
    \n
    \nDepartment of Higher-Dimensional Affairs" + +/obj/item/paper/guides/cogstation/letter_cmo + name = "To the future Medical Director..." + info = "From one Medical Director to another, I'm happy to say you won't have to rethink how you do things here, since saving lives is universal! That being said, you might want to consider the following:
    \n
    \n There's a medical booth over in the civilian wing, so ideally folks with minor cuts and bruises will head there first. While it can operate on a self-serve basis, you might want to send one of your doctors there to make sure it's run proper.
    \n
    \n The Geneticists and Virologists share the same pool of test subjects, so make sure they don't reintroduce them to the control group! A group of regular monkeys is dangerous enough, so do NOT attack one in view of the others!
    \n
    \nLastly, you might want to check the morgue regularly - it's one of the two main endpoints for the corpse disposal network. At the very least, make sure robotics gets your approval BEFORE borging someone! Robert hasn't been the same since he became Rob-Bot...
    \n
    \nEarl. E. Greaves" + +/obj/item/paper/guides/cogstation/cdn_med + name = "Corpse Disposal Network" + info = "It's come to my attention that this station has been outfitted with a Corpse Disposal Network (CDN), and disposal units incorporated into this network are marked with RED STRIPES surrounding them. This morgue is one of the network's major endpoints, the other being the chapel morgue.
    \n
    \nAs such, it should be checked routinely for any bodies that may have arrived unannounced. Cloned corpses or personnel that have proven unrevivable can be shipped to the chapel morgue via your delivery chute. The same can be done for bodies that arrived brainless, although if you want botany to have at them you should tag them accordingly.
    \n
    \nLiving persons who treat the CDN like a theme park ride are to be swiftly removed from the medical department, short of them being on the verge of death. In such cases, treatment is advised.
    \n
    \n-Dr. Halley" + +/obj/item/paper/guides/cogstation/letter_eng + name = "To future Engineering staff:" + info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
    \n
    \n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there.
    \n
    \nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
    \n
    \nGood luck. You're gonna need it.
    \n
    \n-C. Donnelly
    Architectural Analyst" + +/obj/item/paper/guides/cogstation/letter_atmos + name = "To future Atmospheric Technicians:" + info = "If the place that this station used to call home still hired atmos techs, odds are we could've gotten this place up and running a lot sooner. Alas, the past is in the past and the hard work's already been done. You still have a job to do, but it shouldn't be much different from other stations in this sector. That being said, be aware of the following:
    \n
    \n - If you haven't already noticed, the atmospherics department is separate from the rest of the station. You'll either need to spacewalk or take a transit tube to reach it, but it still connects to the station's air system at large.
    \n
    \n- Seeing as the TEG already uses the standard red and blue for it's heating/cooling loops, the scrubber pipes are ORANGE. The main air supply pipes are a purpleish-blue - HOWEVER, these aren't the only air pipes you'll see. We've decided to reuse existing lines from the old air hookup system - these pipes are CYAN and serve to supply air to specific areas. There's also a VIOLET line to help keep the TEG stable.
    \n
    \nNanotrasen's invested a considerable amount into updating this system, so even if Murphy's Law is alive and well in this sector, the air system isn't one of the things that should fail. If a section of the station is having air problems, check the old air hookups FIRST. Your problem could be as simple as a 'greytider' turning a valve or a clown hooking up a laughing gas canister.
    \n
    \n-C. Donnelly
    Architectural Analyst" + +/obj/item/paper/guides/cogstation/letter_chief + name = "To the future Chief Engineer:" + info = "Considering some of the other heads are writing letters to their successors, I reckon I might as well do the same. If this place is heading where I think it is, I sure as hell hope they made sure you know how to run a TEG. Oh who am I kidding, of course they won't. Well, the good news is unlike that newfangled supermatter that can kill everyone from radiation before you know anything is wrong, you'll know if a Thermo-Electric Generator is failing, since you'll either have no power or be on fire.
    \n
    \nThere's two main ways to set it up, with the 'proper way' being to run plasma through the pipes. You hook them up on the hot side (the one with the red pipes), then use the heaters and freezers to keep the hot side hot and the cold side cold. Just keep an eye on pressures - too much on the hot side or too little on the cold side and you'll get reduced or even no power. Of course, the fun way is to get something cooking in the burn chamber for the hot side and use space itself for the cold side. You might want to throw a monkey into the burn chamber for good luck and an indication whether your gas is suitably hot or not. Just make sure that
    \n
    \nI found this on the CE's desk. My guess is he was going to finish it, but was interrupted at some point in his last shift and ultimately met his untimely demise. I just hope whatever he was going to warn you about wasn't critical...
    \n
    \n-C. Donnelly
    " + +/obj/item/paper/guides/cogstation/letter_hos + name = "To the future HoS" + info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
    \n
    \nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
    \n
    -LC" + +/obj/item/paper/guides/cogstation/letter_supp + name = "To future Supply Staff:" + info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
    \n
    \nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
    \n
    \nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
    \n
    \nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
    \n
    \n-C. Donnelly
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/sleepers + name = "Re: Sleepers?" + info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries.
    \n
    \nThis is no excuse for you not to do your jobs. You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself.
    \n
    \n- Dr. Halley" + +/obj/item/paper/fluff/cogstation/cloner + name = "Re: Issue with the cloner?" + info = "I've yet to see any sentient small primates working in this sector, but if they aren't carrying the Devo gene they should be fine. The document was likely referring to the nonsapient ones you can get out of a monkey cube.
    \n
    \n- Dr. Halley" + +/obj/item/paper/fluff/cogstation/letter_rd + name = "To the future Research Director" + info = "Apologies if you were expecting a letter from the station's Research Director, but just prior to translocation we found out they were a BLF operative. I wouldn't trust a single word they wrote and while I'm not a scientist, something tells me your department will have the easiest time adjusting to this station.
    \n
    \nYou should have everything you need - this is a research facility after all. It's just a matter of finding it, which shouldn't be too hard. Folks like you are why we're out in deep space, after all!
    \n-Louis Cannon
    \nFormer Head of Security" + +/obj/item/paper/fluff/cogstation/letter_arrd + name = "To the future Research Director" + info = "Listen, I doubt I need to tell you to how to do your job. From what I've heard this station is getting a state-of-the-art xenobiology lab after it gets translocated, and I don't know the first thing about what you guys do about those slimes. However, there's one thing I do know and it's that your station will have botanists.
    \n
    \nIt's crucial you give them everything they need, so long as they agree to maintain as many apiaries as humanely possible. I know it sounds ridiculous, but it's the ONLY way to keep the floor cluwnes at bay. If you don't know what a floor cluwne is, trust me when I say you do NOT want to find out!
    \nJesse P.
    \nFormer CogStation RD" + +/obj/item/paper/fluff/cogstation/letter_cap + name = "Captain's Log" + info = "So I guess some of the other heads have decided to leave little notes for future employees here. Heartwarming, but the most important thing I figure I can leave you is the truth. Nevermind the Syndicate, the xenomorphs, the apocalyptic death cults I hear are a thing way out there - I'm convinced we are our own worst enemy.
    \n
    \nDon't believe me? Maybe you can ask Chief Engineer Earp. Oh right, he vaporized himself trying to produce enough power to keep the lights on in Space China for a week, despite only needing a sliver of that to run this place as intended. Or maybe you can ask Head of Security Cannon, who executed our Research Director in plain sight of everyone. Even if he was in the right, the final frontier isn't the goddamn wild west! Hell, maybe you can ask one of your 'staff assistants', although in my experience the only ones they seem to want to help is themselves.
    \n
    \nOf course, the REAL problems are with the higher-ups that stationed us on this deathtrap before deciding to send it your way, but there's only so much I can say and get away with it, for instance that they only sent this station since they could care less if it was a total loss. By the time you read this, I'll already be long gone. Maybe it'll be a different story with your crew, but between you and me, I wouldn't hold my breath...unless they fuck up the air system.
    \n
    \nDom Kahn
    Former Captain of Nanotrasen CogStation" + +/obj/item/paper/fluff/cogstation/letter_qm + name = "To the future Quartermaster:" + info = "Sorry if this office seems like an afterthought - as I mentioned in my letter to your department at large, you used to be a sub-department of Engineering on this station. Fortunately that's not the case here and you have cargo techs as opposed to other quartermasters, but you should keep the following in mind:
    \n
    \n- Keep your miners focused on where they're supposed to mine. I get the allure of deep space can be tempting, but we want them somewhere we can be fairly confident they'll come back alive and with ores.
    \n
    \n- Anyone with maintenance access can enter the Routing Depot at the heart of the station, but you'll need a space suit to safely reach it. You've been given one for this very reason, but your techs will need to source their own.
    \n
    \n- The fact that you've been given an office and had a good portion of your department refurbished as opposed to being told to make do should be seen as an indication that there are people in this company that care about you, even if it doesn't feel that way sometimes. Remember that before trying to 'declare independence' as 'Cargonia'.
    \n
    \n-C. Donnelly
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/letter_chap + name = "A message from the DHDA" + info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
    \nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
    \n
    \nSoulstone Obelisk
    \n
    \nDepartment of Higher-Dimensional Affairs" + +/obj/item/paper/fluff/cogstation/cluwne + name = "Mysterious Note" + info = "ThE rInGmAsTeR dOeSn'T rUn ThE cIrCus... HONK!!!" + +/obj/item/paper/fluff/cogstation/secsolars + name = "A heads up:" + info = "I'm hoping you guys are aware of the access changes this station requires, but one thing they might have forgot to mention is that one of the station's solar arrays and air hookups are wedged squarely behind your department. Engineering might need to come through your department to access them.
    \n
    \nWhile I can imagine potential concerns, there shouldn't be any problems if both sides are transparent and communicative. The engineer is most likely there to do their job of keeping the station running, and will only need to pass through your department office and interrogation room (or alternatively, the bridge). You're free to get the doors for them and/or watch them work if it helps put your mind at ease. If they loiter or otherwise act suspiciously then you might want to have a word with them.
    \n
    \n-C. Donnelly
    Architectural Analyst" + +/obj/item/paper/fluff/cogstation/eva + name = "MEMO: Spacesuits" + info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
    \n
    \n-Generated by Organic Resources Bot #2053" + +/obj/item/paper/fluff/cogstation/chemists + name = "Re: Scientists?!" + info = "Scientists should have access to the chemistry lab. This is intentional as opposed to some sort of oversight - after all, they need to reach the medsci router somehow.
    \n
    \nIf anything you should see this as a blessing, as you won't need to sideline whatever it is you're doing to get them what they need. Your focus should remain on predominantly medical goods, just like other stations in this sector.
    \n
    \n- Dr. Halley" + +/obj/item/paper/fluff/cogstation/mime + name = "Au futur Mime" + info = "Toutes mes excuses pour toute mauvaise grammaire, je ne suis pas un haut-parleur naturel Français et a dû utiliser NanoTranslate. Bien que vous puissiez être mécontent de l’emplacement de votre bureau, s’il vous plaît comprendre que c’était le seul endroit où nous pourrions le mettre sans problèmes de sécurité et/ou CentClown se plaindre à ce sujet. Nous nous excusons également pour l’absence d’une zone de performance dédiée, mais nous espérons que vous accorder un accès à l’entretien compensera.
    \n
    \n-C. Donnelly
    \n
    \nAnalyste Architectural" + +/obj/item/paper/fluff/cogstation/bsrb + name = "Message from the NTBSRB" + info = "Congratulations, (sector name here)! You've been chosen as a candidate to receive a Nanotrasen icon via bluespace translocation! 'CogStation' as it's commonly known has a rich history and a unique layout. Our hope is that you'll be able to retrofit this station to serve your needs, ideally as one of your primary research hubs.

    We look forward to seeing what you can accomplish here!
    \n
    \n-The Nanotrasen Bluespace Research Board" + +/obj/item/paper/fluff/cogstation/survey + name = "Fwd: Survey Report" + info = "After a thorough investigation, I'm happy to say that this translocation and its consequences weren't for naught. CogStation appears to have made it in one piece, with the only exception being a 'drone factory' satellite. I suspect it met a fate similar to parts of the station's original home, which means there's the possibility it's not terribly far from here.
    \n
    \nI can see some of CogStation's components being alien to local crews, but fortunately some of the station's previous staff appear to have anticipated this and left some advice. The assessment team and I have decided to do the same where appropriate, although I can see some areas that might be worth redesigning to better suit area protocol. I've brought them up to the Chief Architect, you should hear from them in a couple of hours.
    \n
    \n-C. Donnelly
    \n
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/router_off + name = "ROUTER STATUS: INACTIVE" + info = "This router line has been closed while we determine possible solutions. While you are free to use the request and supply consoles, you should plan on receiving your deliveries elsewhere.
    \n
    \n-C. Donnelly
    \n
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/router_verylimited + name = "ROUTER STATUS: VERY LIMITED" + info = "Currently, this router is only capable of making deliveries to Engineering, Cargo and the recycler, via manual input from the Routing Depot. It is not yet capable of receiving deliveries, meaning you should expect to receive any orders elsewhere.
    \n
    \n-C. Donnelly
    \n
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/router_limited + name = "ROUTER STATUS: LIMITED" + info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required.
    \n
    \n-C. Donnelly
    \n
    \nArchitectural Analyst" + +/obj/item/paper/fluff/cogstation/router_cargo + name = "ROUTER STATUS: VERY LIMITED" + info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler.
    \n
    \n-C. Donnelly
    \n
    \nArchitectural Analyst" /////////// CentCom diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index ca5219375f..08252d4e05 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -27,6 +27,7 @@ var/colour = "black" //what colour the ink is! var/degrees = 0 var/font = PEN_FONT + embedding = list() /obj/item/pen/suicide_act(mob/user) user.visible_message("[user] is scribbling numbers all over [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit sudoku...") @@ -41,6 +42,7 @@ desc = "It's a normal red ink pen." icon_state = "pen_red" colour = "red" + throw_speed = 4 // red ones go faster (in this case, fast enough to embed!) /obj/item/pen/invisible desc = "It's an invisible pen marker." @@ -56,8 +58,10 @@ switch(colour) if("black") colour = "red" + throw_speed++ if("red") colour = "green" + throw_speed = initial(throw_speed) if("green") colour = "blue" else @@ -178,6 +182,7 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off sharpness = IS_SHARP var/on = FALSE + embedding = list(embed_chance = EMBED_CHANCE) /obj/item/pen/edagger/ComponentInitialize() . = ..() @@ -198,16 +203,18 @@ throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") + updateEmbedding() else on = TRUE force = 18 w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = getEmbeddingBehavior(embed_chance = 100, embedded_fall_chance = 0) //rule of cool + embedding = list(embed_chance = 100, fall_chance = 0) //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") + updateEmbedding() update_icon() /obj/item/pen/edagger/update_icon_state() @@ -220,3 +227,17 @@ item_state = initial(item_state) lefthand_file = initial(lefthand_file) righthand_file = initial(righthand_file) + +/obj/item/pen/survival + name = "survival pen" + desc = "The latest in portable survival technology, this pen was designed as a miniature diamond pickaxe. Watchers find them very desirable for their diamond exterior." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "digging_pen" + item_state = "pen" + force = 3 + w_class = WEIGHT_CLASS_TINY + custom_materials = list(/datum/material/iron=10, /datum/material/diamond=100, /datum/material/titanium = 10) + pressure_resistance = 2 + grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) + tool_behaviour = TOOL_MINING //For the classic "digging out of prison with a spoon but you're in space so this analogy doesn't work" situation. + toolspeed = 10 //You will never willingly choose to use one of these over a shovel. diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 8db531aa5e..3c4aebdba3 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -337,3 +337,15 @@ grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10) var/charges = 5 var/max_charges = 5 + +/obj/item/toner/large + name = "large toner cartridge" + grind_results = list(/datum/reagent/iodine = 90, /datum/reagent/iron = 10) + charges = 15 + max_charges = 15 + +/obj/item/toner/extreme + name = "extremely large toner cartridge" + desc = "Why would ANYONE need THIS MUCH TONER?" + charges = 200 + max_charges = 200 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 2beb9296b3..241dde13a8 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -9,7 +9,6 @@ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=60) - item_color = "cargo" pressure_resistance = 2 attack_verb = list("stamped") @@ -20,52 +19,52 @@ /obj/item/stamp/qm name = "quartermaster's rubber stamp" icon_state = "stamp-qm" - item_color = "qm" + dye_color = DYE_QM /obj/item/stamp/law name = "law office's rubber stamp" icon_state = "stamp-law" - item_color = "cargo" + dye_color = DYE_LAW /obj/item/stamp/captain name = "captain's rubber stamp" icon_state = "stamp-cap" - item_color = "captain" + dye_color = DYE_CAPTAIN /obj/item/stamp/hop name = "head of personnel's rubber stamp" icon_state = "stamp-hop" - item_color = "hop" + dye_color = DYE_HOP /obj/item/stamp/hos name = "head of security's rubber stamp" icon_state = "stamp-hos" - item_color = "hosred" + dye_color = DYE_HOS /obj/item/stamp/ce name = "chief engineer's rubber stamp" icon_state = "stamp-ce" - item_color = "chief" + dye_color = DYE_CE /obj/item/stamp/rd name = "research director's rubber stamp" icon_state = "stamp-rd" - item_color = "director" + dye_color = DYE_RD /obj/item/stamp/cmo name = "chief medical officer's rubber stamp" icon_state = "stamp-cmo" - item_color = "cmo" + dye_color = DYE_CMO /obj/item/stamp/denied name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" - item_color = "redcoat" + dye_color = DYE_REDCOAT /obj/item/stamp/clown name = "clown's rubber stamp" icon_state = "stamp-clown" - item_color = "clown" + dye_color = DYE_CLOWN /obj/item/stamp/attack_paw(mob/user) return attack_hand(user) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index b7b7bc36b7..3e76fc874a 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -15,6 +15,7 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_NECK custom_materials = list(/datum/material/iron = 50, /datum/material/glass = 150) + custom_price = PRICE_NORMAL var/flash_enabled = TRUE var/state_on = "camera" var/state_off = "camera_off" @@ -53,8 +54,8 @@ return var/desired_x = input(user, "How high do you want the camera to shoot, between [picture_size_x_min] and [picture_size_x_max]?", "Zoom", picture_size_x) as num var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num - picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) - picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) + picture_size_x = min(clamp(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) + picture_size_y = min(clamp(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) return TRUE /obj/item/camera/attack(mob/living/carbon/human/M, mob/user) @@ -155,8 +156,8 @@ if(!isturf(target_turf)) blending = FALSE return FALSE - size_x = CLAMP(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) - size_y = CLAMP(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) + size_x = clamp(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) + size_y = clamp(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT) var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.") var/ai_user = isAI(user) var/list/seen diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index f25d80c050..5bd9c108d1 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -4,7 +4,7 @@ if(istype(A)) appearance = A.appearance dir = A.dir - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A step_x = AM.step_x step_y = AM.step_y @@ -68,7 +68,7 @@ for(var/atom/A in sorted) var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp - if(ismovableatom(A)) + if(ismovable(A)) var/atom/movable/AM = A xo += AM.step_x yo += AM.step_y diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 67559c0381..9e6f827629 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -4,7 +4,7 @@ name = "picture frame" desc = "The perfect showcase for your favorite deathtrap memories." icon = 'icons/obj/decals.dmi' - custom_materials = null + custom_materials = list(/datum/material/wood = 2000) flags_1 = 0 icon_state = "frame-empty" result_path = /obj/structure/sign/picture_frame @@ -40,6 +40,7 @@ /obj/item/wallframe/picture/examine(mob/user) if(user.is_holding(src) && displayed) displayed.show(user) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok) return list() return ..() @@ -63,6 +64,7 @@ desc = "Every time you look it makes you laugh." icon = 'icons/obj/decals.dmi' icon_state = "frame-empty" + custom_materials = list(/datum/material/wood = 2000) var/obj/item/photo/framed var/persistence_id var/can_decon = TRUE @@ -109,6 +111,7 @@ /obj/structure/sign/picture_frame/examine(mob/user) if(in_range(src, user) && framed) framed.show(user) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok) return list() return ..() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 9c96216ce8..6772fe3cf1 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -48,7 +48,7 @@ /obj/machinery/power/apc name = "area power controller" desc = "A control terminal for the area's electrical systems." - + plane = ABOVE_WALL_PLANE icon_state = "apc0" use_power = NO_POWER_USE req_access = null @@ -84,7 +84,7 @@ var/lastused_equip = 0 var/lastused_environ = 0 var/lastused_total = 0 - var/main_status = 0 + var/main_status = 0 // Whether or not there's external power. 0 is "none", 1 is "insufficient", 2 is "charging". powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( var/malfhack = 0 //New var for my changes to AI malf. --NeoFite var/mob/living/silicon/ai/malfai = null //See above --NeoFite @@ -196,19 +196,23 @@ switch(tdir) if(NORTH) + pixel_x = 0 pixel_y = 23 if(SOUTH) + pixel_x = 0 pixel_y = -23 if(EAST) + pixel_y = 0 pixel_x = 24 if(WEST) + pixel_y = 0 pixel_x = -25 /obj/machinery/power/apc/Destroy() GLOB.apcs_list -= src if(malfai && operating) - malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE @@ -593,19 +597,15 @@ user.visible_message("[user.name] adds cables to the APC frame.", \ "You start adding cables to the APC frame...") playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(do_after(user, 20, target = src)) - if (C.get_amount() < 10 || !C) + if(C.use_tool(src, user, 20, 10) && !terminal && opened && has_electronics) + var/turf/T = get_turf(src) + var/obj/structure/cable/N = T.get_cable_node() + if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) + do_sparks(5, TRUE, src) return - if (C.get_amount() >= 10 && !terminal && opened && has_electronics) - var/turf/T = get_turf(src) - var/obj/structure/cable/N = T.get_cable_node() - if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) - do_sparks(5, TRUE, src) - return - C.use(10) - to_chat(user, "You add cables to the APC frame.") - make_terminal() - terminal.connect_to_network() + to_chat(user, "You add cables to the APC frame.") + make_terminal() + terminal.connect_to_network() else if (istype(W, /obj/item/electronics/apc) && opened) if (has_electronics) to_chat(user, "There is already a board inside the [src]!") @@ -1276,63 +1276,89 @@ var/last_eq = equipment var/last_en = environ var/last_ch = charging - var/excess = surplus() - - if(!src.avail()) + if(!avail()) main_status = 0 else if(excess < 0) main_status = 1 else main_status = 2 + var/cur_excess = excess + var/cur_used = lastused_total + + // first: if we have enough power, power the essentials DIRECTLY + + var/environ_satisfied = FALSE + var/equipment_satisfied = FALSE + var/lighting_satisfied = FALSE + + if(cur_excess >= lastused_environ) + autoset(environ, 1) + add_load(lastused_environ) + cur_excess -= lastused_environ + cur_used -= lastused_environ + environ_satisfied = TRUE + + if(cur_excess >= lastused_equip) + autoset(equipment, 1) + add_load(lastused_equip) + cur_excess -= lastused_equip + cur_used -= lastused_equip + equipment_satisfied = TRUE + + if(cur_excess >= lastused_light) + autoset(lighting, 1) + add_load(lastused_light) + cur_excess -= lastused_light + cur_used -= lastused_light + lighting_satisfied = TRUE + + + // next: take from or charge to the cell, depending on how much is left if(cell && !shorted) - // draw power from cell as before to power the area - var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell - cell.use(cellused) + if(cur_excess > 0) + var/charging_cell = min(cur_excess, cell.maxcharge * GLOB.CHARGELEVEL) + cell.give(charging_cell) + add_load(charging_cell) + lastused_total += charging_cell + longtermpower = min(10,longtermpower + 1) + if(chargemode && !charging) + chargecount++ + if(chargecount == 10) - if(excess > lastused_total) // if power excess recharge the cell - // by the same amount just used - cell.give(cellused) - add_load(cellused/GLOB.CELLRATE) // add the load used to recharge the cell - - - else // no excess, and not enough per-apc - if((cell.charge/GLOB.CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - cell.charge = min(cell.maxcharge, cell.charge + GLOB.CELLRATE * excess) //recharge with what we can - add_load(excess) // so draw what we can from the grid - charging = APC_NOT_CHARGING - - else // not enough power available to run the last tick! - charging = APC_NOT_CHARGING - chargecount = 0 + chargecount = 0 + charging = APC_CHARGING + else // not enough power available to run the last tick! + charging = APC_NOT_CHARGING + chargecount = 0 + longtermpower = max(-10,longtermpower - 2) + if(cell.charge >= cur_used) + cell.use(GLOB.CELLRATE * cur_used) + else // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. equipment = autoset(equipment, 0) lighting = autoset(lighting, 0) environ = autoset(environ, 0) + // set channels based on remaining charge - // set channels depending on how much charge we have left - - // Allow the APC to operate as normal if the cell can charge - if(charging && longtermpower < 10) - longtermpower += 1 - else if(longtermpower > -10) - longtermpower -= 2 + var/cell_percent = cell.percent() if(cell.charge <= 0) // zero charge, turn all off equipment = autoset(equipment, 0) lighting = autoset(lighting, 0) environ = autoset(environ, 0) area.poweralert(0, src) - else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment + + else if(cell_percent < 15 && longtermpower < 0) // <15%, turn off lighting & equipment equipment = autoset(equipment, 2) lighting = autoset(lighting, 2) environ = autoset(environ, 1) area.poweralert(0, src) - else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment - equipment = autoset(equipment, 2) - lighting = autoset(lighting, 1) + else if(cell_percent < 30 && longtermpower < 0) // <30%, turn off lighting + equipment = autoset(equipment, 1) + lighting = autoset(lighting, 2) environ = autoset(environ, 1) area.poweralert(0, src) else // otherwise all can be on @@ -1340,50 +1366,21 @@ lighting = autoset(lighting, 1) environ = autoset(environ, 1) area.poweralert(1, src) - if(cell.percent() > 75) + if(cell_percent > 75) area.poweralert(1, src) - // now trickle-charge the cell - if(chargemode && charging == APC_CHARGING && operating) - if(excess > 0) // check to make sure we have enough to charge - // Max charge is capped to % per second constant - var/ch = min(excess*GLOB.CELLRATE, cell.maxcharge*GLOB.CHARGELEVEL) - add_load(ch/GLOB.CELLRATE) // Removes the power we're taking from the grid - cell.give(ch) // actually recharge the cell - - else - charging = APC_NOT_CHARGING // stop charging - chargecount = 0 // show cell as fully charged if so if(cell.charge >= cell.maxcharge) cell.charge = cell.maxcharge charging = APC_FULLY_CHARGED - if(chargemode) - if(!charging) - if(excess > cell.maxcharge*GLOB.CHARGELEVEL) - chargecount++ - else - chargecount = 0 - - if(chargecount == 10) - - chargecount = 0 - charging = APC_CHARGING - - else // chargemode off - charging = 0 - chargecount = 0 - - else // no cell, switch everything off - + else // no cell, can still run but not very well charging = APC_NOT_CHARGING chargecount = 0 - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - area.poweralert(0, src) + environ = autoset(environ, environ_satisfied) + equipment = autoset(equipment, equipment_satisfied) + lighting = autoset(lighting, lighting_satisfied) // update icon & area power if anything changed @@ -1398,17 +1395,13 @@ // on 0=off, 1=on, 2=autooff /obj/machinery/power/apc/proc/autoset(val, on) - if(on==0) - if(val==2) // if on, return off - return 0 - else if(val==3) // if auto-on, return auto-off - return 1 - else if(on==1) - if(val==1) // if auto-off, return auto-on - return 3 - else if(on==2) - if(val==3) // if auto-on, return auto-off - return 1 + if(val == 3 && (on == 2 || !on)) // if auto-on, return auto-off + return 1 + else if(val == 2 && !on) // if on, return off + return 0 + else if(on == 1 && val == 1) // if auto-off, return auto-on + return 3 + // no, i don't understand these comments either return val /obj/machinery/power/apc/proc/reset(wire) @@ -1418,6 +1411,7 @@ if(WIRE_POWER1, WIRE_POWER2) if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) shorted = FALSE + update() if(WIRE_AI) if(!wires.is_cut(WIRE_AI)) aidisabled = FALSE @@ -1454,7 +1448,7 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) - malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) stat |= BROKEN operating = FALSE if(occupier) @@ -1586,4 +1580,5 @@ /obj/item/electronics/apc name = "power control module" icon_state = "power_mod" + custom_price = PRICE_CHEAP desc = "Heavy-duty switching circuits for power control." diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 93f82991fd..eb456a3f44 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -39,6 +39,7 @@ By design, d1 is the smallest direction and d2 is the highest icon = 'icons/obj/power_cond/cables.dmi' icon_state = "0-1" level = 1 //is underfloor + plane = ABOVE_WALL_PLANE layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE obj_flags = CAN_BE_HIT | ON_BLUEPRINTS @@ -91,6 +92,21 @@ By design, d1 is the smallest direction and d2 is the highest d1 = _d1 d2 = _d2 + if(dir != SOUTH) + var/angle_to_turn = dir2angle(dir) + if(angle_to_turn == 0 || angle_to_turn == 180) + angle_to_turn += 180 + // direct dir set instead of setDir intentional + dir = SOUTH + if(d1) + d1 = turn(d1, angle_to_turn) + if(d2) + d2 = turn(d2, angle_to_turn) + if(d1 > d2) + var/temp = d2 + d2 = d1 + d1 = temp + var/turf/T = get_turf(src) // hide if turf is not intact if(level==1) hide(T.intact) @@ -217,7 +233,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/proc/surplus() if(powernet) - return CLAMP(powernet.avail-powernet.load, 0, powernet.avail) + return clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -233,7 +249,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/proc/delayed_surplus() if(powernet) - return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else return 0 @@ -472,6 +488,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil name = "cable coil" + custom_price = PRICE_CHEAP_AS_FREE gender = NEUTER //That's a cable coil sounds better than that's some cable coils icon = 'icons/obj/power.dmi' icon_state = "coil" @@ -495,6 +512,7 @@ By design, d1 is the smallest direction and d2 is the highest full_w_class = WEIGHT_CLASS_SMALL grind_results = list(/datum/reagent/copper = 2) //2 copper per cable in the coil usesound = 'sound/items/deconstruct.ogg' + used_skills = list(/datum/skill/level/job/wiring) /obj/item/stack/cable_coil/cyborg is_cyborg = 1 @@ -533,7 +551,7 @@ By design, d1 is the smallest direction and d2 is the highest if(affecting && affecting.status == BODYPART_ROBOTIC) if(user == H) user.visible_message("[user] starts to fix some of the wires in [H]'s [affecting.name].", "You start fixing some of the wires in [H]'s [affecting.name].") - if(!do_after(user, H, 50)) + if(!do_mob(user, H, 50)) return if(item_heal_robotic(H, user, 0, 15)) use(1) @@ -556,23 +574,17 @@ By design, d1 is the smallest direction and d2 is the highest new_cable.update_icon() /obj/item/stack/cable_coil/attack_self(mob/user) - if(!check_cable_amount(user)) + if(amount < 15) + to_chat(user, "You don't have enough cable coil to make restraints out of them") return to_chat(user, "You start making some cable restraints.") - if(do_after(user, 30, TRUE, user) && check_cable_amount(user)) - amount -= 15 - var/obj/item/restraints/handcuffs/cable/result = new(get_turf(user)) - user.put_in_hands(result) - result.color = color - to_chat(user, "You make some restraints out of cable") + if(!do_after(user, 30, TRUE, user, TRUE) || !use(15)) + to_chat(user, "You fail to make cable restraints, you need to be standing still to do it") return - to_chat(user, "You fail to make cable restraints, you need to stand still while doing so.") - -/obj/item/stack/cable_coil/proc/check_cable_amount(user) - if(amount < 15) //We dont care about cyborgs here, so we dont use get_amount() - to_chat(user, "You dont have enough cable coil to make restraints out of them") - return FALSE - return TRUE + var/obj/item/restraints/handcuffs/cable/result = new(get_turf(user)) + user.put_in_hands(result) + result.color = color + to_chat(user, "You make some restraints out of cable") //add cables to the stack /obj/item/stack/cable_coil/proc/give(extra) @@ -582,8 +594,6 @@ By design, d1 is the smallest direction and d2 is the highest amount += extra update_icon() - - /////////////////////////////////////////////// // Cable laying procedures ////////////////////////////////////////////// @@ -854,4 +864,4 @@ By design, d1 is the smallest direction and d2 is the highest . = ..() var/list/cable_colors = GLOB.cable_colors color = pick(cable_colors) - \ No newline at end of file + diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 93fe7e8fa6..c788b9b033 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -157,7 +157,7 @@ /obj/item/stock_parts/cell/proc/get_electrocute_damage() if(charge >= 1000) - return CLAMP(round(charge/10000), 10, 90) + rand(-5,5) + return clamp(round(charge/10000), 10, 90) + rand(-5,5) else return 0 @@ -227,6 +227,7 @@ icon_state = "h+cell" maxcharge = 15000 chargerate = 2250 + rating = 2 /obj/item/stock_parts/cell/high/empty start_charged = FALSE @@ -237,6 +238,7 @@ maxcharge = 20000 custom_materials = list(/datum/material/glass=300) chargerate = 2000 + rating = 3 /obj/item/stock_parts/cell/super/empty start_charged = FALSE @@ -247,6 +249,7 @@ maxcharge = 30000 custom_materials = list(/datum/material/glass=400) chargerate = 3000 + rating = 4 /obj/item/stock_parts/cell/hyper/empty start_charged = FALSE @@ -258,6 +261,7 @@ maxcharge = 40000 custom_materials = list(/datum/material/glass=600) chargerate = 4000 + rating = 5 /obj/item/stock_parts/cell/bluespace/empty start_charged = FALSE @@ -313,7 +317,7 @@ /obj/item/stock_parts/cell/emproof/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) /obj/item/stock_parts/cell/emproof/empty start_charged = FALSE @@ -334,7 +338,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - charge = CLAMP((charge-(10000/severity)),0,maxcharge) + charge = clamp((charge-(10000/severity)),0,maxcharge) /obj/item/stock_parts/cell/emergency_light name = "miniature power cell" diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 9fb1a1ce7d..e0b3f5f316 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -15,8 +15,7 @@ state = FLOODLIGHT_NEEDS_WIRES desc = "A bare metal frame looking vaguely like a floodlight. Requires wiring." else if(istype(O, /obj/item/stack/cable_coil) && (state == FLOODLIGHT_NEEDS_WIRES)) - var/obj/item/stack/S = O - if(S.use(5)) + if(O.use_tool(src, user, 0, 5)) to_chat(user, "You wire [src].") name = "wired [name]" desc = "A bare metal frame looking vaguely like a floodlight. Requires securing with a screwdriver." diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 582d72f6c0..1644673ece 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -39,9 +39,9 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(prob(20)) set_broken() -/obj/machinery/gravity_generator/tesla_act(power, tesla_flags) +/obj/machinery/gravity_generator/zap_act(power, zap_flags) ..() - if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) + if(zap_flags & ZAP_MACHINE_EXPLOSIVE) qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over /obj/machinery/gravity_generator/update_icon_state() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 835055ea48..c18eebbb55 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -118,8 +118,7 @@ return if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = W - if(coil.use(1)) + if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED)) icon_state = "[fixture_type]-construct-stage2" stage = 2 user.visible_message("[user.name] adds wires to [src].", \ @@ -193,7 +192,7 @@ var/on = FALSE // 1 if on, 0 if off var/on_gs = FALSE var/static_power_used = 0 - var/brightness = 11 // luminosity when on, also used in power calculation + var/brightness = 9 // luminosity when on, also used in power calculation var/bulb_power = 0.75 // basically the alpha of the emitted light source var/bulb_colour = "#FFF6ED" // befault colour of the light. var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN @@ -232,7 +231,8 @@ icon_state = "bulb" base_state = "bulb" fitting = "bulb" - brightness = 6 + brightness = 5 + nightshift_brightness = 4 bulb_colour = "#FFDDBB" desc = "A small lighting fixture." light_type = /obj/item/light/bulb @@ -257,6 +257,7 @@ /obj/machinery/light/small/built icon_state = "bulb-empty" + start_with_cell = FALSE /obj/machinery/light/small/built/Initialize() . = ..() @@ -273,11 +274,11 @@ spawn(2) switch(fitting) if("tube") - brightness = 11 + brightness = 9 if(prob(2)) break_light_tube(1) if("bulb") - brightness = 6 + brightness = 5 if(prob(5)) break_light_tube(1) spawn(1) @@ -311,11 +312,13 @@ /obj/machinery/light/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(on && status == LIGHT_OK) - var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, EMISSIVE_LAYER, EMISSIVE_PLANE) - glowybit.alpha = CLAMP(light_power*250, 30, 200) - . += glowybit - + var/overlay_alpha = clamp(light_power*250, 30, 200) + SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE, dir, overlay_alpha) + var/mutable_appearance/M = mutable_appearance(overlayicon, base_state) + M.alpha = overlay_alpha + . += M // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(trigger = TRUE) @@ -361,11 +364,11 @@ set_light(0) update_icon() - active_power_usage = (brightness * 7.2) + active_power_usage = (brightness * 10) if(on != on_gs) on_gs = on if(on) - static_power_used = brightness * 14.4 * (hijacked ? 2 : 1) //20W per unit luminosity + static_power_used = brightness * 20 * (hijacked ? 2 : 1) //20W per unit luminosity addStaticPower(static_power_used, STATIC_LIGHT) else removeStaticPower(static_power_used, STATIC_LIGHT) @@ -503,7 +506,7 @@ cell = null qdel(src) -/obj/machinery/light/attacked_by(obj/item/I, mob/living/user) +/obj/machinery/light/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) ..() if(status == LIGHT_BROKEN || status == LIGHT_EMPTY) if(on && (I.flags_1 & CONDUCT_1)) @@ -687,9 +690,9 @@ on = TRUE update() -/obj/machinery/light/tesla_act(power, tesla_flags) - if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) - explosion(src,0,0,0,flame_range = 5, adminlog = 0) +/obj/machinery/light/zap_act(power, zap_flags) + if(zap_flags & ZAP_MACHINE_EXPLOSIVE) + explosion(src,0,0,0,flame_range = 5, adminlog = FALSE) qdel(src) else return ..() @@ -748,7 +751,7 @@ icon_state = "ltube" base_state = "ltube" item_state = "c_tube" - brightness = 11 + brightness = 9 /obj/item/light/tube/broken status = LIGHT_BROKEN @@ -761,7 +764,7 @@ item_state = "contvapour" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - brightness = 6 + brightness = 5 /obj/item/light/bulb/broken status = LIGHT_BROKEN @@ -830,7 +833,8 @@ icon = 'icons/obj/lighting.dmi' base_state = "floor" // base description and icon_state icon_state = "floor" - brightness = 6 + brightness = 5 + nightshift_brightness = 4 layer = 2.5 light_type = /obj/item/light/bulb fitting = "bulb" diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index fba526edbd..d5b19b495c 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -42,7 +42,7 @@ /obj/machinery/power/proc/surplus() if(powernet) - return CLAMP(powernet.avail-powernet.load, 0, powernet.avail) + return clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 @@ -58,7 +58,7 @@ /obj/machinery/power/proc/delayed_surplus() if(powernet) - return CLAMP(powernet.newavail - powernet.delayedload, 0, powernet.newavail) + return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else return 0 @@ -299,8 +299,8 @@ //siemens_coeff - layman's terms, conductivity //dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.) //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) - if(!M || ismecha(M.loc)) +/proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) + if(!istype(M) || ismecha(M.loc)) return 0 //feckin mechs are dumb if(dist_check) if(!in_range(source,M)) @@ -310,6 +310,7 @@ if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) + SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 3b70383bee..65d5202ff4 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -96,6 +96,6 @@ /datum/powernet/proc/get_electrocute_damage() if(avail >= 1000) - return CLAMP(round(avail/10000), 10, 90) + rand(-5,5) + return clamp(round(avail/10000), 10, 90) + rand(-5,5) else return 0 \ No newline at end of file diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index afbeef30a1..b558031fab 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -97,6 +97,7 @@ /obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume) overload() -/obj/machinery/power/rtg/abductor/tesla_act() - ..() //extend the zap - overload() +/obj/machinery/power/rtg/abductor/zap_act(power, zap_flags, shocked_objects) + . = ..() //extend the zap + if(zap_flags & ZAP_MACHINE_EXPLOSIVE) + overload() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 2e6ec57f77..651892e5b1 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -28,11 +28,19 @@ var/bitcoinproduction_drain = 0.15 var/bitcoinmining = FALSE rad_insulation = RAD_EXTREME_INSULATION + var/obj/item/radio/Radio /obj/machinery/power/rad_collector/anchored anchored = TRUE +/obj/machinery/power/rad_collector/Initialize() + . = ..() + Radio = new /obj/item/radio(src) + Radio.listening = 0 + Radio.set_frequency(FREQ_ENGINEERING) + /obj/machinery/power/rad_collector/Destroy() + QDEL_NULL(Radio) return ..() /obj/machinery/power/rad_collector/process() @@ -42,6 +50,7 @@ if(!loaded_tank.air_contents.gases[/datum/gas/plasma]) investigate_log("out of fuel.", INVESTIGATE_SINGULO) playsound(src, 'sound/machines/ding.ogg', 50, 1) + Radio.talk_into(src, "Insufficient plasma in [get_area(src)] [src], ejecting \the [loaded_tank].", FREQ_ENGINEERING) eject() else var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma]) @@ -55,6 +64,7 @@ else if(is_station_level(z) && SSresearch.science_tech) if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen]) playsound(src, 'sound/machines/ding.ogg', 50, 1) + Radio.talk_into(src, "Insufficient oxygen and tritium in [get_area(src)] [src] to produce research points, ejecting \the [loaded_tank].", FREQ_ENGINEERING) eject() else var/gasdrained = bitcoinproduction_drain*drainratio @@ -62,7 +72,11 @@ loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2 GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE) + var/bitcoins_mined = stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG) + if(D) + D.adjust_money(bitcoins_mined) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined) last_push = stored_power stored_power = 0 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d57f78e5b6..0d182e0a1b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -75,7 +75,7 @@ /obj/machinery/power/emitter/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 950e34098c..af2237a426 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -61,7 +61,7 @@ field_generator power level display /obj/machinery/field/generator/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/field/generator/process() if(active == FG_ONLINE) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index a073997b9d..8bf20fddc6 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -51,7 +51,8 @@ for(var/datum/antagonist/cult/C in GLOB.antagonists) if(!C.owner) continue - all_cults |= C.cult_team + if(C.cult_team) + all_cults |= C.cult_team for(var/datum/team/cult/T in all_cults) deltimer(T.blood_target_reset_timer) T.blood_target = src @@ -126,7 +127,7 @@ /obj/singularity/narsie/mezzer() - for(var/mob/living/carbon/M in viewers(consume_range, src)) + for(var/mob/living/carbon/M in fov_viewers(consume_range, src)) if(M.stat == CONSCIOUS) if(!iscultist(M)) to_chat(M, "You feel conscious thought crumble away in an instant as you gaze upon [src.name]...") @@ -200,7 +201,7 @@ // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 1 for(var/atom/X in urange(consume_range,src,1)) - if(isturf(X) || ismovableatom(X)) + if(isturf(X) || ismovable(X)) consume(X) // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 59792b6539..e33116b02c 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -79,8 +79,7 @@ construction_state = PA_CONSTRUCTION_UNSECURED did_something = TRUE else if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CC = W - if(CC.use(1)) + if(W.use_tool(src, user, 0, 1)) user.visible_message("[user.name] adds wires to the [name].", \ "You add some wires.") construction_state = PA_CONSTRUCTION_PANEL_OPEN diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index af83f7ebca..957ceb986f 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -288,8 +288,7 @@ construction_state = PA_CONSTRUCTION_UNSECURED did_something = TRUE else if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CC = W - if(CC.use(1)) + if(W.use_tool(src, user, 0, 1)) user.visible_message("[user.name] adds wires to the [name].", \ "You add some wires.") construction_state = PA_CONSTRUCTION_PANEL_OPEN diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 76eeeae205..025784e909 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -119,14 +119,13 @@ /obj/singularity/Bump(atom/A) + set waitfor = FALSE consume(A) - return - /obj/singularity/Bumped(atom/movable/AM) + set waitfor = FALSE consume(AM) - /obj/singularity/process() if(current_size >= STAGE_TWO) move() @@ -268,6 +267,7 @@ /obj/singularity/proc/eat() + set waitfor = FALSE for(var/tile in spiral_range_turfs(grav_pull, src)) var/turf/T = tile if(!T || !isturf(loc)) @@ -284,8 +284,6 @@ else consume(X) CHECK_TICK - return - /obj/singularity/proc/consume(atom/A) var/gain = A.singularity_act(current_size, src) @@ -295,8 +293,6 @@ name = "supermatter-charged [initial(name)]" consumedSupermatter = 1 set_light(10) - return - /obj/singularity/proc/move(force_move = 0) if(!move_self) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 47de07cd71..85999707a2 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -125,15 +125,12 @@ to_chat(user, "You start building the power terminal...") playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(do_after(user, 20, target = src) && C.get_amount() >= 10) - if(C.get_amount() < 10 || !C) - return + if(C.use_tool(src, user, 20, 10)) var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky do_sparks(5, TRUE, src) return - C.use(10) user.visible_message(\ "[user.name] has built a power terminal.",\ "You build the power terminal.") @@ -220,7 +217,7 @@ . += "smes-og[clevel]" /obj/machinery/power/smes/proc/chargedisplay() - return CLAMP(round(5.5*charge/capacity),0,5) + return clamp(round(5.5*charge/capacity),0,5) /obj/machinery/power/smes/process() if(stat & BROKEN) @@ -372,7 +369,7 @@ target = text2num(target) . = TRUE if(.) - input_level = CLAMP(target, 0, input_level_max) + input_level = clamp(target, 0, input_level_max) log_smes(usr) if("output") var/target = params["target"] @@ -394,7 +391,7 @@ target = text2num(target) . = TRUE if(.) - output_level = CLAMP(target, 0, output_level_max) + output_level = clamp(target, 0, output_level_max) log_smes(usr) /obj/machinery/power/smes/proc/log_smes(mob/user) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 6c5f97557d..89452affcb 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -28,10 +28,8 @@ /obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) . = ..() panel = new() -#if DM_VERSION >= 513 panel.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_ICON|VIS_INHERIT_PLANE vis_contents += panel -#endif panel.icon = icon panel.icon_state = "solar_panel" panel.layer = FLY_LAYER @@ -170,7 +168,7 @@ else //dot product of sun and panel -- Lambert's Cosine Law . = cos(azimuth_current - sun_azimuth) - . = CLAMP(round(., 0.01), 0, 1) + . = clamp(round(., 0.01), 0, 1) sunfrac = . /obj/machinery/power/solar/process() @@ -185,7 +183,7 @@ if(sunfrac <= 0) return - var/sgen = SOLAR_GEN_RATE * sunfrac + var/sgen = SOLAR_GEN_RATE * sunfrac * efficiency add_avail(sgen) if(control) control.gen += sgen @@ -253,6 +251,7 @@ var/obj/item/stack/sheet/G = S.change_stack(null, 2) if(G) glass_type = G + G.moveToNullspace() playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") if(tracker) @@ -384,7 +383,7 @@ if(adjust) value = azimuth_rate + adjust if(value != null) - azimuth_rate = round(CLAMP(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01) + azimuth_rate = round(clamp(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01) return TRUE return FALSE if(action == "tracking") @@ -463,7 +462,7 @@ ///Rotates the panel to the passed angles /obj/machinery/power/solar_control/proc/set_panels(azimuth) - azimuth = CLAMP(round(azimuth, 0.01), -360, 719.99) + azimuth = clamp(round(azimuth, 0.01), -360, 719.99) if(azimuth >= 360) azimuth -= 360 if(azimuth < 0) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index f91dc43990..1350c36348 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -66,8 +66,6 @@ #define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS -#define SUPERMATTER_INTEGRITY_MULT 1.3 //(loss of integrity / 10) ^ 1.3 - GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal @@ -160,8 +158,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/datum/looping_sound/supermatter/soundloop var/moveable = FALSE - var/min_damage = 0 - var/power_calc = 0 /obj/machinery/power/supermatter_crystal/Initialize() . = ..() @@ -253,7 +249,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) add_overlay(causality_field, TRUE) var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure. Emergency causality destabilization field has been activated." - radio.talk_into(src, speaking, common_channel, language = get_default_language()) + radio.talk_into(src, speaking, common_channel, language = get_selected_language()) for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10) if(damage < explosion_point) // Cutting it a bit close there engineers radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) @@ -346,7 +342,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else if(takes_damage) //causing damage - damage = max(damage + (max(CLAMP(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) + damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0) damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0) damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0) @@ -356,7 +352,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //capping damage damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage) - damage = max(min_damage, damage) //max integrity if(damage > damage_archived && prob(10)) playsound(get_turf(src), 'sound/effects/empulse.ogg', 50, 1) @@ -389,14 +384,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && co2comp > POWERLOSS_INHIBITION_GAS_THRESHOLD) - powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling + CLAMP(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else - powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling - 0.05,0, 1) - powerloss_inhibitor = CLAMP(1-(powerloss_dynamic_scaling * CLAMP(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05,0, 1) + powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) if(matter_power) var/removed_matter = max(matter_power/MATTER_POWER_CONVERSION, 40) - power_calc = max(power_calc + removed_matter, 0) + power = max(power + removed_matter, 0) matter_power = max(matter_power - removed_matter, 0) var/temp_factor = 50 @@ -409,7 +404,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) temp_factor = 30 icon_state = base_icon_state - power_calc = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power_calc, 0) //Total laser power plus an overload + power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload if(prob(50)) radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%) @@ -438,22 +433,18 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) env.merge(removed) air_update_turf() - for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. + for(var/mob/living/carbon/human/l in fov_viewers(HALLUCINATION_RANGE(power), src)) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) var/D = sqrt(1 / max(1, get_dist(l, src))) - l.hallucination += power_calc * config_hallucination_power * D - l.hallucination = CLAMP(0, 200, l.hallucination) + l.hallucination += power * config_hallucination_power * D + l.hallucination = clamp(0, 200, l.hallucination) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) l.rad_act(rads) - power_calc -= ((power_calc/500)**3) * powerloss_inhibitor - if ((100-get_integrity()) < 75) - power = (power_calc * ((100 - (0.15*(100-get_integrity()) - 5)**2) / 100)) + power_calc*0.1 - else - power = power_calc * (((100-get_integrity())^((3*(100-get_integrity()))/1000) + 2*(100-get_integrity()))/100) //new and improved, more linear - //power = power_calc * ((((100-get_integrity())**1.3)-(2*(100-get_integrity())))/100) + power -= ((power/500)**3) * powerloss_inhibitor + if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) if(power > POWER_PENALTY_THRESHOLD) @@ -466,7 +457,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) supermatter_zap(src, 5, min(power*2, 20000)) else if (damage > damage_penalty_point && prob(20)) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - supermatter_zap(src, 5, CLAMP(power*2, 4000, 20000)) + supermatter_zap(src, 5, clamp(power*2, 4000, 20000)) if(prob(15) && power > POWER_PENALTY_THRESHOLD) supermatter_pull(src, power/750) @@ -476,9 +467,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) supermatter_anomaly_gen(src, GRAVITATIONAL_ANOMALY, rand(5, 10)) if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2) || prob(0.3) && power > POWER_PENALTY_THRESHOLD) supermatter_anomaly_gen(src, PYRO_ANOMALY, rand(5, 10)) - if (damage - damage_archived > 0) - min_damage += ((damage - damage_archived) / 9) * SUPERMATTER_INTEGRITY_MULT - if(damage > (min_damage < 200 ? min_damage : 0) + warning_point) // while the core is still damaged and it's still worth noting its status + if(damage > warning_point) // while the core is still damaged and it's still worth noting its status if((REALTIMEOFDAY - lastwarning) / 10 >= WARNING_DELAY) alarm() @@ -517,7 +506,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!istype(Proj.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_SUPERMATTER) if(Proj.flag != "bullet") - power_calc += Proj.damage * config_bullet_energy + power += Proj.damage * config_bullet_energy if(!has_been_powered) investigate_log("has been powered for the first time.", INVESTIGATE_SUPERMATTER) message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") @@ -570,14 +559,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) dust_mob(user, cause = "alien attack") /obj/machinery/power/supermatter_crystal/attack_animal(mob/living/simple_animal/S) - var/murder - if(!S.melee_damage_upper && !S.melee_damage_lower) - murder = S.friendly - else - murder = S.attacktext dust_mob(S, \ - "[S] unwisely [murder] [src], and [S.p_their()] body burns brilliantly before flashing into ash!", \ - "You unwisely touch [src], and your vision glows brightly as your body crumbles to dust. Oops.", \ + "[S] unwisely [S.attack_verb_continuous] [src], and [S.p_their()] body burns brilliantly before flashing into ash!", \ + "You unwisely [S.attack_verb_simple] [src], and your vision glows brightly as your body crumbles to dust. Oops.", \ "simple animal attack") /obj/machinery/power/supermatter_crystal/attack_robot(mob/user) @@ -618,17 +602,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) to_chat(user, "You extract a sliver from \the [src]. \The [src] begins to react violently!") new /obj/item/nuke_core/supermatter_sliver(drop_location()) matter_power += 200 - if (istype(W, /obj/item/supermatterspray)) - var/obj/item/supermatterspray/S = W - if (S.usesleft > 0 && do_after(user, 60, target=src)) - min_damage = max(0,min_damage - 10) - to_chat(user, "You spray \the [src] with [S].") - playsound(user.loc,'sound/effects/spray2.ogg',50,1,-6) - S.usesleft-- - if (prob(10)) - to_chat(user, "Your hands slip and you drop [S] into \the [src]!") - Consume(S) - return else if(user.dropItemToGround(W)) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\ @@ -688,9 +661,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Some poor sod got eaten, go ahead and irradiate people nearby. radiation_pulse(src, 3000, 2, TRUE) + var/list/viewers = fov_viewers(world.view, src) for(var/mob/living/L in range(10)) investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER) - if(L in view()) + if(L in viewers) L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", MSG_VISUAL,\ "The unearthly ringing subsides and you notice you have new radiation burns.", MSG_AUDIBLE) else @@ -736,7 +710,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/proc/supermatter_pull(turf/center, pull_range = 10) playsound(src.loc, 'sound/weapons/marauder.ogg', 100, 1, extrarange = 7) for(var/atom/P in orange(pull_range,center)) - if(ismovableatom(P)) + if(ismovable(P)) var/atom/movable/pulled_object = P if(ishuman(P)) var/mob/living/carbon/human/H = P diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index e29ffa865e..eb80548441 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -73,7 +73,7 @@ return ..() -/obj/machinery/power/tesla_coil/tesla_act(power, tesla_flags, shocked_targets) +/obj/machinery/power/tesla_coil/zap_act(power, zap_flags, shocked_targets) if(anchored && !panel_open) obj_flags |= BEING_SHOCKED //don't lose arc power when it's not connected to anything @@ -81,14 +81,17 @@ var/power_produced = powernet ? power / power_loss : power add_avail(power_produced*input_power_multiplier) flick("coilhit", src) - playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 5, power_produced, tesla_flags, shocked_targets) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG) + if(D) + D.adjust_money(min(power_produced, 1)) if(istype(linked_techweb)) linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 1)) // x4 coils = ~240/m point bonus for R&D addtimer(CALLBACK(src, .proc/reset_shocked), 10) - tesla_buckle_check(power) + zap_buckle_check(power) + playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + return power_produced else - ..() + . = ..() /obj/machinery/power/tesla_coil/proc/zap() if((last_zap + zap_cooldown) > world.time || !powernet) @@ -99,8 +102,8 @@ var/power = (powernet.avail/2) add_load(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 10, power/(coeff/2), TESLA_FUSION_FLAGS) - tesla_buckle_check(power/(coeff/2)) + tesla_zap(src, 10, power/(coeff/2), ZAP_FUSION_FLAGS) + zap_buckle_check(power/(coeff/2)) // Tesla R&D researcher /obj/machinery/power/tesla_coil/research @@ -110,20 +113,23 @@ circuit = /obj/item/circuitboard/machine/tesla_coil/research power_loss = 20 // something something, high voltage + resistance -/obj/machinery/power/tesla_coil/research/tesla_act(power, tesla_flags, shocked_things) +/obj/machinery/power/tesla_coil/research/zap_act(power, zap_flags, shocked_targets) if(anchored && !panel_open) obj_flags |= BEING_SHOCKED var/power_produced = powernet ? power / power_loss : power add_avail(power_produced*input_power_multiplier) flick("rpcoilhit", src) - playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) - tesla_zap(src, 5, power_produced, tesla_flags, shocked_things) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG) + if(D) + D.adjust_money(min(power_produced, 3)) if(istype(linked_techweb)) linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 3)) // x4 coils with a pulse per second or so = ~720/m point bonus for R&D addtimer(CALLBACK(src, .proc/reset_shocked), 10) - tesla_buckle_check(power) + zap_buckle_check(power) + playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + return power_produced else - ..() + . = ..() /obj/machinery/power/tesla_coil/research/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) . = ..() @@ -174,9 +180,10 @@ return ..() -/obj/machinery/power/grounding_rod/tesla_act(var/power) +/obj/machinery/power/grounding_rod/zap_act(var/power) if(anchored && !panel_open) flick("grounding_rodhit", src) - tesla_buckle_check(power) + zap_buckle_check(power) + return 0 else - ..() + . = ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 1b08693d1c..06e5d27f6d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,5 +1,14 @@ #define TESLA_DEFAULT_POWER 1738260 #define TESLA_MINI_POWER 869130 +//Zap constants, speeds up targeting +#define BIKE (COIL + 1) +#define COIL (ROD + 1) +#define ROD (RIDE + 1) +#define RIDE (LIVING + 1) +#define LIVING (MACHINERY + 1) +#define MACHINERY (BLOB + 1) +#define BLOB (STRUCTURE + 1) +#define STRUCTURE (1) /obj/singularity/energy_ball name = "energy ball" @@ -32,6 +41,9 @@ /obj/singularity/energy_ball/ex_act(severity, target) return +/obj/singularity/energy_ball/consume(severity, target) + return + /obj/singularity/energy_ball/Destroy() if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball)) var/obj/singularity/energy_ball/EB = orbiting.parent @@ -39,7 +51,7 @@ for(var/ball in orbiting_balls) var/obj/singularity/energy_ball/EB = ball - qdel(EB) + QDEL_NULL(EB) . = ..() @@ -55,17 +67,17 @@ move_the_basket_ball(4 + orbiting_balls.len * 1.5) - playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 30) + playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30) pixel_x = 0 pixel_y = 0 - tesla_zap(src, 7, TESLA_DEFAULT_POWER, TRUE) + tesla_zap(src, 7, TESLA_DEFAULT_POWER) pixel_x = -32 pixel_y = -32 for (var/ball in orbiting_balls) - var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7)) + var/range = rand(1, clamp(orbiting_balls.len, 3, 7)) tesla_zap(ball, range, TESLA_MINI_POWER/7*range) else energy = 0 // ensure we dont have miniballs of miniballs @@ -73,7 +85,7 @@ /obj/singularity/energy_ball/examine(mob/user) . = ..() if(orbiting_balls.len) - . += "The amount of orbiting mini-balls is [orbiting_balls.len]." + . += "There are [orbiting_balls.len] mini-balls orbiting it." /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) @@ -96,7 +108,7 @@ energy_to_lower = energy_to_raise - 20 energy_to_raise = energy_to_raise * 1.25 - playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30) + playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30) addtimer(CALLBACK(src, .proc/new_mini_ball), 100) else if(energy < energy_to_lower && orbiting_balls.len) @@ -132,22 +144,19 @@ /obj/singularity/energy_ball/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user - log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a tesla ball.") to_chat(C, "That was a shockingly dumb idea.") - C.visible_message("A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!") var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs - rip_u.Remove() + C.ghostize(0) qdel(rip_u) - return - return ..() + C.death() /obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) if (istype(target)) target.orbiting_balls += src GLOB.poi_list -= src target.dissipate_strength = target.orbiting_balls.len - . = ..() + /obj/singularity/energy_ball/stop_orbit() if (orbiting && istype(orbiting.parent, /obj/singularity/energy_ball)) var/obj/singularity/energy_ball/orbitingball = orbiting.parent @@ -171,20 +180,19 @@ var/mob/living/carbon/C = A C.dust() -/proc/tesla_zap(atom/source, zap_range = 3, power, tesla_flags = TESLA_DEFAULT_FLAGS, list/shocked_targets) +/proc/tesla_zap(atom/source, zap_range = 3, power, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets) + if(QDELETED(source)) + return . = source.dir if(power < 1000) return - var/closest_dist = 0 - var/closest_atom - var/obj/machinery/power/tesla_coil/closest_tesla_coil - var/obj/machinery/power/grounding_rod/closest_grounding_rod - var/mob/living/closest_mob - var/obj/machinery/closest_machine - var/obj/structure/closest_structure - var/obj/structure/blob/closest_blob - var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure)) + /* + THIS IS SO FUCKING UGLY AND I HATE IT, but I can't make it nice without making it slower, check*N rather then n. So we're stuck with it. + */ + var/atom/closest_atom + var/closest_type = 0 + var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure, /obj/vehicle/ridden)) var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics, /obj/machinery/power/emitter, /obj/machinery/field/generator, @@ -205,112 +213,133 @@ /obj/machinery/gateway, /obj/structure/lattice, /obj/structure/grille, - /obj/machinery/the_singularitygen/tesla, /obj/structure/frame/machine)) - for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types)) - if(!(tesla_flags & TESLA_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A)) + //Ok so we are making an assumption here. We assume that view() still calculates from the center out. + //This means that if we find an object we can assume it is the closest one of its type. This is somewhat of a speed increase. + //This also means we have no need to track distance, as the doview() proc does it all for us. + + //Darkness fucks oview up hard. I've tried dview() but it doesn't seem to work + //I hate existance + for(var/a in typecache_filter_multi_list_exclusion(oview(zap_range+2, source), things_to_shock, blacklisted_tesla_types)) + var/atom/A = a + if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A)) continue + if(closest_type >= BIKE) + break - if(istype(A, /obj/machinery/power/tesla_coil)) - var/dist = get_dist(source, A) - var/obj/machinery/power/tesla_coil/C = A - if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(C.obj_flags & BEING_SHOCKED)) - closest_dist = dist - + else if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots. + var/obj/vehicle/ridden/bicycle/B = A + if(!(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean //we use both of these to save on istype and typecasting overhead later on //while still allowing common code to run before hand - closest_tesla_coil = C - closest_atom = C + closest_type = BIKE + closest_atom = B - - else if(closest_tesla_coil) + else if(closest_type >= COIL) continue //no need checking these other things - else if(istype(A, /obj/machinery/power/grounding_rod)) - var/dist = get_dist(source, A)-2 - if(dist <= zap_range && (dist < closest_dist || !closest_grounding_rod)) - closest_grounding_rod = A - closest_atom = A - closest_dist = dist + else if(istype(A, /obj/machinery/power/tesla_coil)) + var/obj/machinery/power/tesla_coil/C = A + if(!(C.obj_flags & BEING_SHOCKED)) + closest_type = COIL + closest_atom = C - else if(closest_grounding_rod) + else if(closest_type >= ROD) + continue + + else if(istype(A, /obj/machinery/power/grounding_rod)) + closest_type = ROD + closest_atom = A + + else if(closest_type >= RIDE) + continue + + else if(istype(A,/obj/vehicle/ridden)) + var/obj/vehicle/ridden/R = A + if(R.can_buckle && !(R.obj_flags & BEING_SHOCKED)) + closest_type = RIDE + closest_atom = A + + else if(closest_type >= LIVING) continue else if(isliving(A)) - var/dist = get_dist(source, A) var/mob/living/L = A - if(dist <= zap_range && (dist < closest_dist || !closest_mob) && L.stat != DEAD && !(L.flags_1 & TESLA_IGNORE_1)) - closest_mob = L + if(L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1)) + closest_type = LIVING closest_atom = A - closest_dist = dist - else if(closest_mob) + else if(closest_type >= MACHINERY) continue else if(ismachinery(A)) var/obj/machinery/M = A - var/dist = get_dist(source, A) - if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !(M.obj_flags & BEING_SHOCKED)) - closest_machine = M + if(!(M.obj_flags & BEING_SHOCKED)) + closest_type = MACHINERY closest_atom = A - closest_dist = dist - else if(closest_mob) + else if(closest_type >= BLOB) continue else if(istype(A, /obj/structure/blob)) var/obj/structure/blob/B = A - var/dist = get_dist(source, A) - if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(B.obj_flags & BEING_SHOCKED)) - closest_blob = B + if(!(B.obj_flags & BEING_SHOCKED)) + closest_type = BLOB closest_atom = A - closest_dist = dist - else if(closest_blob) + else if(closest_type >= STRUCTURE) continue else if(isstructure(A)) var/obj/structure/S = A - var/dist = get_dist(source, A) - if(dist <= zap_range && (dist < closest_dist || !closest_tesla_coil) && !(S.obj_flags & BEING_SHOCKED)) - closest_structure = S + if(!(S.obj_flags & BEING_SHOCKED)) + closest_type = STRUCTURE closest_atom = A - closest_dist = dist //Alright, we've done our loop, now lets see if was anything interesting in range - if(closest_atom) - //common stuff - source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY) - if(!(tesla_flags & TESLA_ALLOW_DUPLICATES)) - LAZYSET(shocked_targets, closest_atom, TRUE) - var/zapdir = get_dir(source, closest_atom) - if(zapdir) - . = zapdir + if(!closest_atom) + return + //common stuff + source.Beam(closest_atom, icon_state="lightning[rand(1,12)]", time=5, maxdistance = INFINITY) + if(!(zap_flags & ZAP_ALLOW_DUPLICATES)) + LAZYSET(shocked_targets, closest_atom, TRUE) + var/zapdir = get_dir(source, closest_atom) + if(zapdir) + . = zapdir - //per type stuff: - if(closest_tesla_coil) - closest_tesla_coil.tesla_act(power, tesla_flags, shocked_targets) + var/next_range = 3 + if(closest_type == COIL) + next_range = 5 - else if(closest_grounding_rod) - closest_grounding_rod.tesla_act(power, tesla_flags, shocked_targets) - - else if(closest_mob) - var/shock_damage = (tesla_flags & TESLA_MOB_DAMAGE)? (min(round(power/600), 90) + rand(-5, 5)) : 0 - closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((tesla_flags & TESLA_MOB_STUN) ? NONE : SHOCK_NOSTUN)) + if(closest_type == LIVING) + var/mob/living/closest_mob = closest_atom + closest_mob.set_shocked() + addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10) + var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0 + closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob - if((tesla_flags & TESLA_MOB_STUN) && (tesla_flags & TESLA_MOB_DAMAGE)) + if((zap_flags & ZAP_MOB_STUN) && (zap_flags & ZAP_MOB_DAMAGE)) S.emp_act(EMP_LIGHT) - tesla_zap(S, 7, power / 1.5, tesla_flags, shocked_targets) // metallic folks bounce it further + next_range = 7 // metallic folks bounce it further else - tesla_zap(closest_mob, 5, power / 1.5, tesla_flags, shocked_targets) + next_range = 5 + power /= 1.5 - else if(closest_machine) - closest_machine.tesla_act(power, tesla_flags, shocked_targets) + else + power = closest_atom.zap_act(power, zap_flags, shocked_targets) + if(prob(20))//I know I know + tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets) + tesla_zap(closest_atom, next_range, power * 0.5, zap_flags, shocked_targets) + else + tesla_zap(closest_atom, next_range, power, zap_flags, shocked_targets) - else if(closest_blob) - closest_blob.tesla_act(power, tesla_flags, shocked_targets) - - else if(closest_structure) - closest_structure.tesla_act(power, tesla_flags, shocked_targets) +#undef BIKE +#undef COIL +#undef ROD +#undef RIDE +#undef LIVING +#undef MACHINERY +#undef BLOB +#undef STRUCTURE diff --git a/code/modules/power/tesla/generator.dm b/code/modules/power/tesla/generator.dm index 53d7010806..260f4128bc 100644 --- a/code/modules/power/tesla/generator.dm +++ b/code/modules/power/tesla/generator.dm @@ -5,6 +5,6 @@ icon_state = "TheSingGen" creation_type = /obj/singularity/energy_ball -/obj/machinery/the_singularitygen/tesla/tesla_act(power, tesla_flags) - if(tesla_flags & TESLA_MACHINE_EXPLOSIVE) +/obj/machinery/the_singularitygen/tesla/zap_act(power, zap_flags) + if(zap_flags & ZAP_MACHINE_EXPLOSIVE) energy += power diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index 20ba10b0e1..d9380a40dd 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -26,8 +26,8 @@ var/z_offset = SSmapping.station_start var/list/bounds for (var/path in SSmapping.config.GetFullMapPaths()) - var/datum/parsed_map/parsed = load_map(file(path), 1, 1, z_offset, measureOnly = FALSE, no_changeturf = FALSE, cropMap=TRUE, x_lower = mother1.x_low, y_lower = mother1.y_low, x_upper = mother1.x_high, y_upper = mother1.y_high) - bounds = parsed?.bounds + var/datum/parsed_map/parsed = load_map(file(path), 1, 1, z_offset, orientation = SSmapping.config.orientation, cropMap = TRUE, x_lower = mother1.x_low, y_lower = mother1.y_low, x_upper = mother1.x_high, y_upper = mother1.y_high) + bounds = parsed.bounds z_offset += bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1 var/list/obj/machinery/atmospherics/atmos_machines = list() diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 848163d658..340cfc2e98 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -1,17 +1,21 @@ /obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) distro += variance - for (var/i = max(1, pellets), i > 0, i--) - var/targloc = get_turf(target) - ready_proj(target, user, quiet, zone_override, fired_from) + var/targloc = get_turf(target) + ready_proj(target, user, quiet, zone_override, fired_from) + if(pellets == 1) if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now... if(randomspread) spread = round((rand() - 0.5) * distro) else //Smart spread - spread = round((i / pellets - 0.5) * distro) + spread = round(1 - 0.5) * distro if(!throw_proj(target, targloc, user, params, spread)) - return 0 - if(i > 1) - newshot() + return FALSE + else + if(isnull(BB)) + return FALSE + AddComponent(/datum/component/pellet_cloud, projectile_type, pellets) + SEND_SIGNAL(src, COMSIG_PELLET_CLOUD_INIT, target, user, fired_from, randomspread, spread, zone_override, params, distro) + if(click_cooldown_override) user.changeNext_move(click_cooldown_override) else @@ -32,6 +36,10 @@ BB.def_zone = user.zone_selected BB.suppressed = quiet + if(isgun(fired_from)) + var/obj/item/gun/G = fired_from + BB.damage *= G.projectile_damage_multiplier + if(reagents && BB.reagents) reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets qdel(reagents) diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index 04cc4df349..0688d09e3c 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -21,3 +21,16 @@ name = "1.95x129mm incendiary bullet casing" desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129 + +/obj/item/ammo_casing/mm712x82/match + name = "7.12x82mm match bullet casing" + desc = "A 7.12x82mm bullet casing manufactured to unfailingly high standards, you could pull off some cool trickshots with this." + projectile_type = /obj/item/projectile/bullet/mm712x82_match + +/obj/item/projectile/bullet/mm712x82_match + name = "7.12x82mm match bullet" + damage = 40 + ricochets_max = 2 + ricochet_chance = 60 + ricochet_auto_aim_range = 4 + ricochet_incidence_leeway = 35 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm index 13a284e970..2077b108d7 100644 --- a/code/modules/projectiles/ammunition/ballistic/pistol.dm +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -1,26 +1,31 @@ // 10mm (Stechkin) /obj/item/ammo_casing/c10mm - name = ".10mm bullet casing" + name = "10mm bullet casing" desc = "A 10mm bullet casing." caliber = "10mm" projectile_type = /obj/item/projectile/bullet/c10mm /obj/item/ammo_casing/c10mm/ap - name = ".10mm armor-piercing bullet casing" + name = "10mm armor-piercing bullet casing" desc = "A 10mm armor-piercing bullet casing." projectile_type = /obj/item/projectile/bullet/c10mm_ap /obj/item/ammo_casing/c10mm/hp - name = ".10mm hollow-point bullet casing" + name = "10mm hollow-point bullet casing" desc = "A 10mm hollow-point bullet casing." projectile_type = /obj/item/projectile/bullet/c10mm_hp /obj/item/ammo_casing/c10mm/fire - name = ".10mm incendiary bullet casing" + name = "10mm incendiary bullet casing" desc = "A 10mm incendiary bullet casing." projectile_type = /obj/item/projectile/bullet/incendiary/c10mm +/obj/item/ammo_casing/c10mm/soporific + name = "10mm soporific bullet casing" + desc = "A 10mm soporific bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm/soporific + // 9mm (Stechkin APS) /obj/item/ammo_casing/c9mm @@ -39,7 +44,6 @@ desc = "A 9mm incendiary bullet casing." projectile_type = /obj/item/projectile/bullet/incendiary/c9mm - // .50AE (Desert Eagle) /obj/item/ammo_casing/a50AE @@ -48,3 +52,16 @@ caliber = ".50" projectile_type = /obj/item/projectile/bullet/a50AE +// .32 ACP (Improvised Pistol) + +/obj/item/ammo_casing/c32acp + name = ".32 bullet casing" + desc = "A .32 bullet casing." + caliber = "c32acp" + projectile_type = /obj/item/projectile/bullet/c32acp + +/obj/item/ammo_casing/r32acp + name = ".32 rubber bullet casing" + desc = "A .32 rubber bullet casing." + caliber = "c32acp" + projectile_type = /obj/item/projectile/bullet/r32acp diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index d5a9fab4b4..693b258e3d 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -11,6 +11,12 @@ desc = "A .357 armor-piercing bullet casing." projectile_type = /obj/item/projectile/bullet/a357/ap +/obj/item/ammo_casing/a357/match + name = ".357 match bullet casing" + desc = "A .357 bullet casing, manufactured to exceedingly high standards." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/a357/match + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 @@ -47,4 +53,19 @@ name = ".38 Iceblox bullet casing" desc = "A .38 Iceblox bullet casing." caliber = "38" - projectile_type = /obj/item/projectile/bullet/c38/iceblox \ No newline at end of file + projectile_type = /obj/item/projectile/bullet/c38/iceblox + +/obj/item/ammo_casing/c38/match + name = ".38 Match bullet casing" + desc = "A .38 bullet casing, manufactured to exceedingly high standards." + projectile_type = /obj/item/projectile/bullet/c38/match + +/obj/item/ammo_casing/c38/match/bouncy + name = ".38 Rubber bullet casing" + desc = "A .38 rubber bullet casing, manufactured to exceedingly high standards." + projectile_type = /obj/item/projectile/bullet/c38/match/bouncy + +/obj/item/ammo_casing/c38/dumdum + name = ".38 DumDum bullet casing" + desc = "A .38 DumDum bullet casing." + projectile_type = /obj/item/projectile/bullet/c38/dumdum \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index fc8fd65a06..ea84e23d01 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -143,3 +143,12 @@ reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 5) //this and the acid equal about 25ish burn, not counting the minute toxin damage dealt by their metabolism, this makes each dart about as lethal as a stechkin shot in upfront damage reagents.add_reagent(/datum/reagent/toxin/acid, 5) reagents.add_reagent(/datum/reagent/consumable/frostoil, 10) //tempgun slowdown goes both ways and adds to the burn + +/obj/item/ammo_casing/shotgun/incapacitate + name = "custom incapacitating shot" + desc = "A shotgun casing filled with... something. used to incapacitate targets." + icon_state = "bountyshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun_incapacitate + pellets = 12//double the pellets, but half the stun power of each, which makes this best for just dumping right in someone's face. + variance = 25 + custom_materials = list(/datum/material/iron=4000) \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 174645dd11..492b91ec2d 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -12,6 +12,15 @@ e_cost = 200 select_name = "kill" +/obj/item/ammo_casing/energy/lasergun/improvised + projectile_type = /obj/item/projectile/beam/weak/improvised + e_cost = 200 + select_name = "kill" + +/obj/item/ammo_casing/energy/lasergun/improvised/upgraded + projectile_type = /obj/item/projectile/beam/weak + e_cost = 100 + /obj/item/ammo_casing/energy/laser/hos e_cost = 100 diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 39e3ca06ff..994b0f7f01 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -3,6 +3,10 @@ select_name = "ion" fire_sound = 'sound/weapons/ionrifle.ogg' +/obj/item/ammo_casing/energy/ion/hos + projectile_type = /obj/item/projectile/ion + e_cost = 200 + /obj/item/ammo_casing/energy/declone projectile_type = /obj/item/projectile/energy/declone select_name = "declone" diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 2abc472138..f063672654 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -16,9 +16,6 @@ fire_sound = 'sound/weapons/gunshot.ogg' e_cost = 100 -/obj/item/ammo_casing/energy/electrode/hos - projectile_type = /obj/item/projectile/energy/electrode/security/hos - e_cost = 200 /obj/item/ammo_casing/energy/electrode/old e_cost = 1000 diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 4f37cf3ba9..8ebddaa24f 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -112,18 +112,21 @@ update_icon() /obj/item/ammo_box/update_icon() - switch(multiple_sprites) - if(1) - icon_state = "[initial(icon_state)]-[stored_ammo.len]" - if(2) - icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" - desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!" + . = ..() + desc = "[initial(desc)] There [stored_ammo.len == 1 ? "is" : "are"] [stored_ammo.len] shell\s left!" for (var/material in bullet_cost) var/material_amount = bullet_cost[material] material_amount = (material_amount*stored_ammo.len) + base_cost[material] custom_materials[material] = material_amount set_custom_materials(custom_materials)//make sure we setup the correct properties again +/obj/item/ammo_box/update_icon_state() + switch(multiple_sprites) + if(1) + icon_state = "[initial(icon_state)]-[stored_ammo.len]" + if(2) + icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]" + //Behavior for magazines /obj/item/ammo_box/magazine/proc/ammo_count() return stored_ammo.len diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index fbbca99ec2..86d66ec354 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -7,6 +7,11 @@ max_ammo = 7 multiple_sprites = 1 +/obj/item/ammo_box/a357/match + name = "speed loader (.357 Match)" + desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + ammo_type = /obj/item/ammo_casing/a357/match + /obj/item/ammo_box/a357/ap name = "speed loader (.357 AP)" ammo_type = /obj/item/ammo_casing/a357/ap @@ -40,6 +45,28 @@ desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." ammo_type = /obj/item/ammo_casing/c38/iceblox +/obj/item/ammo_box/c38/dumdum + name = "speed loader (.38 DumDum)" + desc = "Designed to quickly reload revolvers. DumDum bullets shatter on impact and shred the target's innards, likely getting caught inside." + ammo_type = /obj/item/ammo_casing/c38/dumdum + +/obj/item/ammo_box/c38/match + name = "speed loader (.38 Match)" + desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c38/match + +/obj/item/ammo_box/c32mm + name = "ammo box (.32 acp)" + desc = "Lethal .32 acp bullets, there's forty in the box." + ammo_type = /obj/item/ammo_casing/c32acp + max_ammo = 40 + +/obj/item/ammo_box/r32mm + name = "ammo box (rubber .32 acp)" + desc = "Non-lethal .32 acp bullets, there's forty in the box." + ammo_type = /obj/item/ammo_casing/r32acp + max_ammo = 40 + /obj/item/ammo_box/c9mm name = "ammo box (9mm)" icon_state = "9mmbox" @@ -52,6 +79,29 @@ ammo_type = /obj/item/ammo_casing/c10mm max_ammo = 20 +/obj/item/ammo_box/c10mm/fire + name = "ammo box (10mm Incendiary)" + icon_state = "10mmbox" + ammo_type = /obj/item/ammo_casing/c10mm/fire + max_ammo = 20 + +/obj/item/ammo_box/c10mm/hp + name = "ammo box (10mm Hollow Point)" + icon_state = "10mmbox" + ammo_type = /obj/item/ammo_casing/c10mm/hp + max_ammo = 20 + +/obj/item/ammo_box/c10mm/ap + name = "ammo box (10mm Armour Piercing)" + icon_state = "10mmbox" + ammo_type = /obj/item/ammo_casing/c10mm/ap + max_ammo = 20 + +/obj/item/ammo_box/c10mm/soporific + name = "ammo box (10mm Soporific)" + ammo_type = /obj/item/ammo_casing/c10mm/soporific + max_ammo = 20 + /obj/item/ammo_box/c45 name = "ammo box (.45)" icon_state = "45box" @@ -98,3 +148,51 @@ icon_state = "foambox_riot" ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot custom_materials = list(/datum/material/iron = 50000) + +//Shotgun clips +/obj/item/ammo_box/shotgun + name = "stripper clip (shotgun shells)" + desc = "A stripper clip, designed to help with loading a shotgun slightly faster." + icon = 'icons/obj/ammo.dmi' + icon_state = "shotgunclip" + caliber = "shotgun" // slapped in to allow shell mix n match + ammo_type = /obj/item/ammo_casing/shotgun + max_ammo = 4 + var/pixeloffsetx = 4 + start_empty = TRUE + +/obj/item/ammo_box/shotgun/update_overlays() + . = ..() + if(stored_ammo.len) + var/offset = -4 + for(var/A in stored_ammo) + var/obj/item/ammo_casing/shotgun/C = A + offset += pixeloffsetx + var/mutable_appearance/shell_overlay = mutable_appearance(icon, "[initial(C.icon_state)]-clip") + shell_overlay.pixel_x += offset + shell_overlay.appearance_flags = RESET_COLOR + . += shell_overlay + +/obj/item/ammo_box/shotgun/loaded + start_empty = FALSE + +/obj/item/ammo_box/shotgun/loaded/rubbershot + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + +/obj/item/ammo_box/shotgun/loaded/buckshot + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/shotgun/loaded/beanbag + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + +/obj/item/ammo_box/shotgun/loaded/stunslug + ammo_type = /obj/item/ammo_casing/shotgun/stunslug + +/obj/item/ammo_box/shotgun/loaded/techshell + ammo_type = /obj/item/ammo_casing/shotgun/techshell + +/obj/item/ammo_box/shotgun/loaded/incendiary + ammo_type = /obj/item/ammo_casing/shotgun/incendiary + +/obj/item/ammo_box/shotgun/loaded/dart + ammo_type = /obj/item/ammo_casing/shotgun/dart diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm index e42c6a4719..55f5e491da 100644 --- a/code/modules/projectiles/boxes_magazines/external/lmg.dm +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -20,3 +20,7 @@ /obj/item/ammo_box/magazine/mm195x129/update_icon() ..() icon_state = "a762-[round(ammo_count(),10)]" + +/obj/item/ammo_box/magazine/mm712x82/match + name = "box magazine (Match 7.12x82mm)" + ammo_type = /obj/item/ammo_casing/mm712x82/match \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index dbde572db1..1852b839f4 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -25,6 +25,13 @@ desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." ammo_type = /obj/item/ammo_casing/c10mm/ap +/obj/item/ammo_box/magazine/m10mm/soporific + name = "pistol magazine (10mm soporific)" + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "9x19pS" + desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." + ammo_type = /obj/item/ammo_casing/c10mm/soporific + /obj/item/ammo_box/magazine/m45 name = "handgun magazine (.45)" icon_state = "45-8" @@ -59,3 +66,15 @@ caliber = ".50" max_ammo = 7 multiple_sprites = 1 + +/obj/item/ammo_box/magazine/m32acp + name = "pistol magazine (.32)" + desc = "A crudely construction pistol magazine that holds .32 ACP rounds. It looks like it can only fit eight bullets." + icon_state = "32acp" + ammo_type = /obj/item/ammo_casing/c32acp + caliber = "c32acp" + max_ammo = 8 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/m32acp/empty + start_empty = 1 diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 7ed0cde50a..7a3c82489c 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -12,3 +12,105 @@ /obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" return + +// MWS Magazine // +/obj/item/ammo_box/magazine/mws_mag + name = "microbattery magazine" + desc = "A microbattery holder for the 'Big Iron'" + + icon = 'icons/obj/ammo.dmi' + icon_state = "mws_mag" + caliber = "mws" + ammo_type = /obj/item/ammo_casing/mws_batt + start_empty = TRUE + max_ammo = 3 + + var/list/modes = list() + +/obj/item/ammo_box/magazine/mws_mag/update_overlays() + .=..() + if(!stored_ammo.len) + return //Why bother + + var/x_offset = 5 + var/current = 0 + for(var/B in stored_ammo) + var/obj/item/ammo_casing/mws_batt/batt = B + var/mutable_appearance/cap = mutable_appearance(icon, "[initial(icon_state)]_cap", color = batt.type_color) + cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset + . += cap + if(batt.cell.charge > 0) + var/ratio = CEILING(clamp(batt.cell.charge / batt.cell.maxcharge, 0, 1) * 4, 1) //4 is how many lights we have a sprite for + var/mutable_appearance/charge = mutable_appearance(icon, "[initial(icon_state)]_charge-[ratio]", color = "#29EAF4") //Could use battery color but eh. + charge.pixel_x = current * x_offset + . += charge + + current++ //Increment for offsets + + +// MWS Batteries // +/obj/item/ammo_casing/mws_batt + name = "\'MWS\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + icon = 'icons/obj/ammo.dmi' + icon_state = "mws_batt" + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 1 + + caliber = "mws" + var/type_color = null + var/type_name = null + + var/obj/item/stock_parts/cell/cell + var/cell_type = /obj/item/stock_parts/cell{charge = 600; maxcharge = 600} + + var/e_cost = 100 + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/mws_batt/Initialize() + . = ..() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + cell = new cell_type(src) + cell.give(cell.maxcharge) + update_icon() + +/obj/item/ammo_casing/mws_batt/update_overlays() + .=..() + + var/mutable_appearance/ends = mutable_appearance(icon, "[initial(icon_state)]_ends", color = type_color) + . += ends + +/obj/item/ammo_casing/mws_batt/get_cell() + return cell + +/obj/item/ammo_casing/mws_batt/proc/chargeshot() + if(cell.charge >= e_cost) + cell.use(e_cost) + newshot() + return + +// Specific batteries // +/obj/item/ammo_casing/mws_batt/lethal + name = "'MWS' microbattery - LETHAL" + type_color = "#bf3d3d" + type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/mws_batt/stun + name = "'MWS' microbattery - STUN" + type_color = "#0f81bc" + type_name = "STUN" + projectile_type = /obj/item/projectile/beam/disabler + +/obj/item/ammo_casing/mws_batt/xray + name = "'MWS' microbattery - XRAY" + type_color = "#32c025" + type_name = "XRAY" + projectile_type = /obj/item/projectile/beam/xray + +/obj/item/ammo_casing/mws_batt/ion + name = "'MWS' microbattery - ION" + type_color = "#d084d6" + type_name = "ION" + projectile_type = /obj/item/projectile/ion \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index eb2572187c..1ae4b58f62 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -50,3 +50,8 @@ name = "riot shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/rubbershot max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot/bounty + name = "triple-barrel shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/incapacitate + max_ammo = 3 \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index dd40648191..b90f0aee0d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -15,7 +15,7 @@ throw_speed = 3 throw_range = 5 force = 5 - item_flags = NEEDS_PERMIT | NO_ATTACK_CHAIN_SOFT_STAMCRIT + item_flags = NEEDS_PERMIT attack_verb = list("struck", "hit", "bashed") var/fire_sound = "gunshot" @@ -77,13 +77,17 @@ var/dualwield_spread_mult = 1 //dualwield spread multiplier + /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. + var/projectile_damage_multiplier = 1 + + var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds + /obj/item/gun/Initialize() . = ..() - if(pin) - if(no_pin_required) - pin = null - else - pin = new pin(src) + if(no_pin_required) + pin = null + else if(pin) + pin = new pin(src) if(gun_light) alight = new (src) if(zoomable) @@ -124,7 +128,7 @@ zoom(user, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!! //called after the gun has successfully fired its chambered ammo. -/obj/item/gun/proc/process_chamber() +/obj/item/gun/proc/process_chamber(mob/living/user) return FALSE //check if there's enough ammo/energy/whatever to shoot one time @@ -136,12 +140,13 @@ to_chat(user, "*click*") playsound(src, "gun_dry_fire", 30, 1) -/obj/item/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) +/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) if(recoil) shake_camera(user, recoil + 1, recoil) - if(isliving(user)) //CIT CHANGE - makes gun recoil cause staminaloss - user.adjustStaminaLossBuffered(getstamcost(user)*(firing && burst_size >= 2 ? 1/burst_size : 1)) //CIT CHANGE - ditto + if(stam_cost) //CIT CHANGE - makes gun recoil cause staminaloss + var/safe_cost = clamp(stam_cost, 0, STAMINA_NEAR_CRIT - user.getStaminaLoss())*(firing && burst_size >= 2 ? 1/burst_size : 1) + user.adjustStaminaLossBuffered(safe_cost) //CIT CHANGE - ditto if(suppressed) playsound(user, fire_sound, 10, 1) @@ -168,9 +173,10 @@ return if(firing) return - if(IS_STAMCRIT(user)) //respect stamina softcrit - to_chat(user, "You are too exhausted to fire [src]!") - return + var/stamloss = user.getStaminaLoss() + if(stamloss >= STAMINA_NEAR_SOFTCRIT) //The more tired you are, the less damage you do. + var/penalty = (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*STAM_CRIT_GUN_DELAY + user.changeNext_move(CLICK_CD_RANGE+(CLICK_CD_RANGE*penalty)) if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. return @@ -211,8 +217,9 @@ var/bonus_spread = 0 var/loop_counter = 0 - bonus_spread += getinaccuracy(user) //CIT CHANGE - adds bonus spread while not aiming - if(ishuman(user) && user.a_intent == INTENT_HARM) + if(user) + bonus_spread = getinaccuracy(user, bonus_spread, stamloss) //CIT CHANGE - adds bonus spread while not aiming + if(ishuman(user) && user.a_intent == INTENT_HARM && weapon_weight <= WEAPON_LIGHT) var/mob/living/carbon/human/H = user for(var/obj/item/gun/G in H.held_items) if(G == src || G.weapon_weight >= WEAPON_MEDIUM) @@ -220,9 +227,11 @@ else if(G.can_trigger_gun(user)) bonus_spread += 24 * G.weapon_weight * G.dualwield_spread_mult loop_counter++ - addtimer(CALLBACK(G, /obj/item/gun.proc/process_fire, target, user, TRUE, params, null, bonus_spread), loop_counter) + var/stam_cost = G.getstamcost(user) + addtimer(CALLBACK(G, /obj/item/gun.proc/process_fire, target, user, TRUE, params, null, bonus_spread, stam_cost), loop_counter) - process_fire(target, user, TRUE, params, null, bonus_spread) + var/stam_cost = getstamcost(user) + process_fire(target, user, TRUE, params, null, bonus_spread, stam_cost) /obj/item/gun/can_trigger_gun(mob/living/user) . = ..() @@ -253,21 +262,21 @@ /obj/item/gun/proc/on_cooldown() return busy_action || firing || ((last_fire + fire_delay) > world.time) -/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) add_fingerprint(user) if(on_cooldown()) return firing = TRUE - . = do_fire(target, user, message, params, zone_override, bonus_spread) + . = do_fire(target, user, message, params, zone_override, bonus_spread, stam_cost) firing = FALSE last_fire = world.time if(user) user.update_inv_hands() - SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override) + SEND_SIGNAL(user, COMSIG_LIVING_GUN_PROCESS_FIRE, target, params, zone_override, bonus_spread, stam_cost) -/obj/item/gun/proc/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0) +/obj/item/gun/proc/do_fire(atom/target, mob/living/user, message = TRUE, params, zone_override = "", bonus_spread = 0, stam_cost = 0) var/sprd = 0 var/randomized_gun_spread = 0 var/rand_spr = rand() @@ -285,7 +294,7 @@ sleep(burst_shot_delay) if(QDELETED(src)) break - do_burst_shot(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i) + do_burst_shot(user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i, stam_cost) else if(chambered) sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) @@ -295,19 +304,19 @@ return else if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) + shoot_live_shot(user, 1, target, message, stam_cost) else - shoot_live_shot(user, 0, target, message) + shoot_live_shot(user, 0, target, message, stam_cost) else shoot_with_empty_chamber(user) return - process_chamber() + process_chamber(user) update_icon() SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE -/obj/item/gun/proc/do_burst_shot(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) +/obj/item/gun/proc/do_burst_shot(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0, stam_cost = 0) if(!user || !firing) firing = FALSE return FALSE @@ -331,33 +340,34 @@ return FALSE else if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) + shoot_live_shot(user, 1, target, message, stam_cost) else - shoot_live_shot(user, 0, target, message) + shoot_live_shot(user, 0, target, message, stam_cost) if (iteration >= burst_size) firing = FALSE else shoot_with_empty_chamber(user) firing = FALSE return FALSE - process_chamber() + process_chamber(user) update_icon() return TRUE -/obj/item/gun/attack(mob/M as mob, mob/user) +/obj/item/gun/attack(mob/living/M, mob/user) if(user.a_intent == INTENT_HARM) //Flogging if(bayonet) M.attackby(bayonet, user) + attack_delay_done = TRUE return else return ..() - return + attack_delay_done = TRUE //we are firing the gun, not bashing people with its butt. /obj/item/gun/attack_obj(obj/O, mob/user) if(user.a_intent == INTENT_HARM) if(bayonet) O.attackby(bayonet, user) - return + return TRUE return ..() /obj/item/gun/attackby(obj/item/I, mob/user, params) @@ -493,7 +503,7 @@ if(chambered && chambered.BB) chambered.BB.damage *= 5 - process_fire(target, user, TRUE, params) + process_fire(target, user, TRUE, params, stam_cost = getstamcost(user)) /obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins if(pin) @@ -513,7 +523,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "sniper_zoom" -/datum/action/item_action/toggle_scope_zoom/IsAvailable() +/datum/action/item_action/toggle_scope_zoom/IsAvailable(silent = FALSE) . = ..() if(!.) var/obj/item/gun/G = target @@ -561,12 +571,25 @@ chambered = null update_icon() -/obj/item/gun/proc/getinaccuracy(mob/living/user) - if(!isliving(user)) - return FALSE - else - var/mob/living/holdingdude = user - if(istype(holdingdude) && (holdingdude.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - return 0 - else - return ((weapon_weight * 25) * inaccuracy_modifier) +/obj/item/gun/proc/getinaccuracy(mob/living/user, bonus_spread, stamloss) + if(inaccuracy_modifier == 0) + return bonus_spread + var/base_inaccuracy = weapon_weight * 25 * inaccuracy_modifier + var/aiming_delay = 0 //Otherwise aiming would be meaningless for slower guns such as sniper rifles and launchers. + if(fire_delay) + var/penalty = (last_fire + GUN_AIMING_TIME + fire_delay) - world.time + if(penalty > 0) //Yet we only penalize users firing it multiple times in a haste. fire_delay isn't necessarily cumbersomeness. + aiming_delay = penalty + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //To be removed in favor of something less tactless later. + base_inaccuracy /= 1.5 + if(stamloss > STAMINA_NEAR_SOFTCRIT) //This can null out the above bonus. + base_inaccuracy *= 1 + (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*0.5 + var/mult = max((GUN_AIMING_TIME + aiming_delay + user.last_click_move - world.time)/GUN_AIMING_TIME, -0.5) //Yes, there is a bonus for taking time aiming. + if(mult < 0) //accurate weapons should provide a proper bonus with negative inaccuracy. the opposite is true too. + mult *= 1/inaccuracy_modifier + return max(bonus_spread + (base_inaccuracy * mult), 0) //no negative spread. + +/obj/item/gun/proc/getstamcost(mob/living/carbon/user) + . = recoil + if(user && !user.has_gravity()) + . = recoil*5 diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index e45483569e..4aeefde6d4 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -25,7 +25,7 @@ else icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" -/obj/item/gun/ballistic/process_chamber(empty_chamber = 1) +/obj/item/gun/ballistic/process_chamber(mob/living/user, empty_chamber = 1) var/obj/item/ammo_casing/AC = chambered //Find chambered round if(istype(AC)) //there's a chambered round if(casing_ejector) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 31823dccf6..39956ef3e8 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -365,7 +365,7 @@ can_unsuppress = TRUE can_suppress = TRUE w_class = WEIGHT_CLASS_NORMAL - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.5 zoomable = TRUE zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. zoom_out_amt = 13 diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index 3f3d2c6f47..4bd7d34fe2 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -59,7 +59,7 @@ /obj/item/gun/ballistic/bow/pipe name = "pipe bow" - desc = "Some sort of pipe made projectile weapon made of a silk string and lots of bending. Used to fire arrows." + desc = "Some sort of pipe made projectile weapon made of a durathread string and lots of bending. Used to fire arrows." icon_state = "pipebow" item_state = "pipebow" force = 0 diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm index 366aa367b4..c2dd5bb42d 100644 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm @@ -53,6 +53,7 @@ ..() /obj/item/minigunpack/dropped(mob/user) + . = ..() if(armed) user.dropItemToGround(gun, TRUE) @@ -125,12 +126,13 @@ return /obj/item/gun/ballistic/minigun/dropped(mob/user) + . = ..() if(ammo_pack) ammo_pack.attach_gun(user) else qdel(src) -/obj/item/gun/ballistic/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/ballistic/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(ammo_pack) if(ammo_pack.overheat < ammo_pack.overheat_max) ammo_pack.overheat += burst_size @@ -144,4 +146,5 @@ . = ..() /obj/item/gun/ballistic/minigun/dropped(mob/living/user) + . = ..() ammo_pack.attach_gun(user) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index db614b97d3..004f78235a 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -6,7 +6,7 @@ name = "grenade launcher" icon_state = "dshotgun-sawn" item_state = "gun" - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.5 mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = WEIGHT_CLASS_NORMAL @@ -87,7 +87,7 @@ pin = /obj/item/firing_pin/implant/pindicate burst_size = 1 fire_delay = 0 - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 casing_ejector = FALSE weapon_weight = WEAPON_HEAVY magazine_wording = "rocket" @@ -144,13 +144,13 @@ user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \ "You aim [src] at the ground to perform a bisnasty rocket jump...") if(can_shoot()) - user.notransform = TRUE + user.mob_transforming = TRUE playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, 1, 5) animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) sleep(70) animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) sleep(5) - user.notransform = FALSE + user.mob_transforming = FALSE process_fire(user, user, TRUE) if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. user.gib() diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm index e71f414bd8..74b8b210a7 100644 --- a/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -14,7 +14,7 @@ spread = 0 recoil = 0.1 casing_ejector = FALSE - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.15 dualwield_spread_mult = 1.4 weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY @@ -46,7 +46,7 @@ return 0 . = ..() -/obj/item/gun/ballistic/automatic/magrifle/shoot_live_shot() +/obj/item/gun/ballistic/automatic/magrifle/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) var/obj/item/ammo_casing/caseless/magnetic/shot = chambered cell.use(shot.energy_cost) . = ..() diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 68f212ba30..319ec16345 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -21,6 +21,38 @@ var/obj/item/suppressor/S = new(src) install_suppressor(S) +//(reskinnable stetchkin) +/obj/item/gun/ballistic/automatic/pistol/modular + name = "modular pistol" + desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "cde" + can_unsuppress = TRUE + obj_flags = UNIQUE_RENAME + unique_reskin = list("Default" = "cde", + "N-99" = "n99", + "Stealth" = "stealthpistol", + "HKVP-78" = "vp78", + "Luger" = "p08b", + "Mk.58" = "secguncomp", + "PX4 Storm" = "px4" + ) + +/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() + ..() + if(current_skin) + icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + if(magazine && suppressed) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay + else if (magazine) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine") + else + cut_overlays() + /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" desc = "A classic .45 handgun with a small magazine capacity." @@ -83,6 +115,7 @@ icon_state = "flatgun" /obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user) + . = ..() to_chat(user, "As you try to pick up [src], it slips out of your grip..") if(prob(50)) to_chat(user, "..and vanishes from your vision! Where the hell did it go?") @@ -92,3 +125,50 @@ to_chat(user, "..and falls into view. Whew, that was a close one.") user.dropItemToGround(src) +////////////Anti Tank Pistol//////////// + +/obj/item/gun/ballistic/automatic/pistol/antitank + name = "Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." + icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' + icon_state = "atp" + item_state = "pistol" + recoil = 4 + mag_type = /obj/item/ammo_box/magazine/sniper_rounds + fire_delay = 50 + burst_size = 1 + can_suppress = 0 + w_class = WEIGHT_CLASS_NORMAL + actions_types = list() + fire_sound = 'sound/weapons/blastcannon.ogg' + spread = 20 //damn thing has no rifling. + +/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("atp-mag") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate + name = "Syndicate Anti Tank Pistol" + desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." + pin = /obj/item/firing_pin/implant/pindicate + +////////////Improvised Pistol//////////// + +/obj/item/gun/ballistic/automatic/pistol/improvised + name = "Improvised Pistol" + desc = "An improvised pocket-sized pistol that fires .32 calibre rounds. It looks incredibly flimsy." + icon_state = "ipistol" + item_state = "pistol" + mag_type = /obj/item/ammo_box/magazine/m32acp + fire_delay = 7.5 + can_suppress = FALSE + w_class = WEIGHT_CLASS_SMALL + spread = 15 // Keep the spread between 15 and 20. This hardlocks it into being a mid-range pistol, the magazine size means you're allowed to miss. Fills the mid-range niche that slugs/rifle and buckshot doesn't fill. + +/obj/item/gun/ballistic/automatic/pistol/improvised/nomag + spawnwithmagazine = FALSE // For crafting as you shouldn't get eight bullets for free otherwise people will reaper reload. diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index b43ac3057a..f34dbc6abc 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -102,7 +102,7 @@ . = ..() safe_calibers = magazine.caliber -/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(chambered && !(chambered.caliber in safe_calibers)) if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 playsound(user, fire_sound, 50, 1) @@ -242,7 +242,7 @@ user.visible_message("*click*") playsound(src, "gun_dry_fire", 30, 1) -/obj/item/gun/ballistic/revolver/russian/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/ballistic/revolver/russian/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) add_fingerprint(user) playsound(src, "gun_dry_fire", 30, TRUE) user.visible_message("[user.name] tries to fire \the [src] at the same time, but only succeeds at looking like an idiot.", "\The [src]'s anti-combat mechanism prevents you from firing it at the same time!") @@ -313,26 +313,30 @@ else to_chat(user, "[src] is empty!") -// IMPROVISED SHOTGUN // +///////////////////////////// +// IMPROVISED SHOTGUN // +///////////////////////////// /obj/item/gun/ballistic/revolver/doublebarrel/improvised name = "improvised shotgun" - desc = "Essentially a tube that aims shotgun shells." + desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction will probably result in it hurting people less than a normal shotgun." icon_state = "ishotgun" item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM force = 10 slot_flags = null mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." unique_reskin = null + projectile_damage_multiplier = 0.9 var/slung = FALSE + weapon_weight = WEAPON_HEAVY /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/stack/cable_coil) && !sawn_off) - var/obj/item/stack/cable_coil/C = A - if(C.use(10)) + if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC)) slot_flags = ITEM_SLOT_BACK to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") slung = TRUE @@ -354,7 +358,7 @@ /obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn name = "sawn-off improvised shotgun" - desc = "A single-shot shotgun. Better not miss." + desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You still need two hands to fire this, if you value unbroken wrists." icon_state = "ishotgun" item_state = "gun" w_class = WEIGHT_CLASS_NORMAL @@ -373,3 +377,114 @@ user.emote("scream") user.drop_all_held_items() user.DefaultCombatKnockdown(80) + +// -------------- HoS Modular Weapon System ------------- +// ---------- Code originally from VoreStation ---------- +/obj/item/gun/ballistic/revolver/mws + name = "MWS-01 'Big Iron'" + desc = "Modular Weapons System" + + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "mws" + + fire_sound = 'sound/weapons/Taser.ogg' + + mag_type = /obj/item/ammo_box/magazine/mws_mag + spawnwithmagazine = FALSE + + recoil = 0 + + var/charge_sections = 6 + +/obj/item/gun/ballistic/revolver/mws/examine(mob/user) + . = ..() + . += "Alt-click to remove the magazine." + +/obj/item/gun/ballistic/revolver/mws/shoot_with_empty_chamber(mob/living/user as mob|obj) + process_chamber(user) + if(!chambered || !chambered.BB) + to_chat(user, "*click*") + playsound(src, "gun_dry_fire", 30, 1) + + +/obj/item/gun/ballistic/revolver/mws/process_chamber(mob/living/user) + if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... + var/obj/item/ammo_casing/mws_batt/shot = chambered + if(shot.cell.charge >= shot.e_cost) + shot.chargeshot() + else + for(var/B in magazine.stored_ammo) + var/obj/item/ammo_casing/mws_batt/other_batt = B + if(istype(other_batt,shot) && other_batt.cell.charge >= other_batt.e_cost) + switch_to(other_batt, user) + break + update_icon() + +/obj/item/gun/ballistic/revolver/mws/proc/switch_to(obj/item/ammo_casing/mws_batt/new_batt, mob/living/user) + if(ishuman(user)) + if(chambered && new_batt.type == chambered.type) + to_chat(user,"[src] is now using the next [new_batt.type_name] power cell.") + else + to_chat(user,"[src] is now firing [new_batt.type_name].") + + chambered = new_batt + update_icon() + +/obj/item/gun/ballistic/revolver/mws/attack_self(mob/living/user) + if(!chambered) + return + + var/list/stored_ammo = magazine.stored_ammo + + if(stored_ammo.len == 1) + return //silly you. + + //Find an ammotype that ISN'T the same, or exhaust the list and don't change. + var/our_slot = stored_ammo.Find(chambered) + + for(var/index in 1 to stored_ammo.len) + var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! + var/obj/item/ammo_casing/mws_batt/next_batt = stored_ammo[true_index] + if(chambered != next_batt && !istype(next_batt, chambered.type) && next_batt.cell.charge >= next_batt.e_cost) + switch_to(next_batt, user) + break + +/obj/item/gun/ballistic/revolver/mws/AltClick(mob/living/user) + .=..() + if(magazine) + user.put_in_hands(magazine) + magazine.update_icon() + if(magazine.ammo_count()) + playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, 1) + else + playsound(src, "gun_remove_empty_magazine", 70, 1) + magazine = null + to_chat(user, "You pull the magazine out of [src].") + if(chambered) + chambered = null + update_icon() + +/obj/item/gun/ballistic/revolver/mws/update_overlays() + .=..() + if(!chambered) + return + + var/obj/item/ammo_casing/mws_batt/batt = chambered + var/batt_color = batt.type_color //Used many times + + //Mode bar + var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") + mode_bar.color = batt_color + . += mode_bar + + //Barrel color + var/mutable_appearance/barrel_color = mutable_appearance(icon, "[initial(icon_state)]_barrel", color = batt_color) + barrel_color.alpha = 150 + . += barrel_color + + //Charge bar + var/ratio = can_shoot() ? CEILING(clamp(batt.cell.charge / batt.cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + for(var/i = 0, i < ratio, i++) + var/mutable_appearance/charge_bar = mutable_appearance(icon, "[initial(icon_state)]_charge", color = batt_color) + charge_bar.pixel_x = i + . += charge_bar \ No newline at end of file diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 7fb17ced57..a4a4065959 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -23,7 +23,7 @@ A.update_icon() update_icon() -/obj/item/gun/ballistic/shotgun/process_chamber(empty_chamber = 0) +/obj/item/gun/ballistic/shotgun/process_chamber(mob/living/user, empty_chamber = 0) return ..() //changed argument value /obj/item/gun/ballistic/shotgun/chamber_round() @@ -41,9 +41,12 @@ to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return//CIT CHANGE - ditto pump(user, TRUE) - recentpump = world.time + 10 - if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina. - user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added + if(HAS_TRAIT(user, TRAIT_FAST_PUMP)) + recentpump = world.time + 2 + else + recentpump = world.time + 10 + if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina. + user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added return /obj/item/gun/ballistic/shotgun/blow_up(mob/user) @@ -90,7 +93,7 @@ fire_delay = 7 mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." - unique_reskin = list("Tatical" = "riotshotgun", + unique_reskin = list("Tactical" = "riotshotgun", "Wood Stock" = "wood_riotshotgun" ) @@ -113,7 +116,7 @@ icon_state = "moistnugget" item_state = "moistnugget" slot_flags = 0 //no ITEM_SLOT_BACK sprite, alas - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.5 mag_type = /obj/item/ammo_box/magazine/internal/boltaction var/bolt_open = FALSE can_bayonet = TRUE @@ -123,10 +126,12 @@ /obj/item/gun/ballistic/shotgun/boltaction/improvised name = "Makeshift 7.62mm Rifle" icon_state = "ishotgun" + icon_state = "irifle" item_state = "shotgun" - desc = "A large zip gun more or less that takes a single 7.62mm bullet" + desc = "A bolt-action breechloaded rifle that takes 7.62mm bullets." mag_type = /obj/item/ammo_box/magazine/internal/boltaction/improvised can_bayonet = FALSE + var/slung = FALSE /obj/item/gun/ballistic/shotgun/boltaction/pump(mob/M) playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1) @@ -148,6 +153,22 @@ . = ..() . += "The bolt is [bolt_open ? "open" : "closed"]." +/obj/item/gun/ballistic/shotgun/boltaction/improvised/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/stack/cable_coil) && !sawn_off) + if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC)) + slot_flags = ITEM_SLOT_BACK + to_chat(user, "You tie the lengths of cable to the rifle, making a sling.") + slung = TRUE + update_icon() + else + to_chat(user, "You need at least ten lengths of cable if you want to make a sling!") + +/obj/item/gun/ballistic/shotgun/boltaction/improvised/update_icon() + ..() + if(slung) + icon_state += "sling" + /obj/item/gun/ballistic/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" desc = "Careful not to lose your head." @@ -187,7 +208,7 @@ /obj/item/gun/ballistic/shotgun/boltaction/enchanted/attack_self() return -/obj/item/gun/ballistic/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) +/obj/item/gun/ballistic/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) ..() if(guns_left) var/obj/item/gun/ballistic/shotgun/boltaction/enchanted/GUN = new gun_type @@ -201,7 +222,7 @@ // Automatic Shotguns// -/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user as mob|obj) +/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) ..() src.pump(user) @@ -212,7 +233,7 @@ fire_delay = 5 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE - unique_reskin = list("Tatical" = "cshotgun", + unique_reskin = list("Tactical" = "cshotgun", "Slick" = "cshotgun_slick" ) @@ -299,3 +320,18 @@ return TRUE // DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm + +/obj/item/gun/ballistic/shotgun/doublebarrel/hook + name = "hook modified sawn-off shotgun" + desc = "Range isn't an issue when you can bring your victim to you." + icon_state = "hookshotgun" + item_state = "shotgun" + mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM + force = 16 //it has a hook on it + attack_verb = list("slashed", "hooked", "stabbed") + hitsound = 'sound/weapons/bladeslice.ogg' + //our hook gun! + var/obj/item/gun/magic/hook/bounty/hook + var/toggled = FALSE diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 4060a02c0f..5cdd773894 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -57,7 +57,7 @@ casing_ejector = FALSE can_suppress = FALSE -/obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0) +/obj/item/gun/ballistic/shotgun/toy/process_chamber(mob/living/user, empty_chamber = 0) ..() if(chambered && !chambered.BB) qdel(chambered) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 36a9bba295..8f9e364302 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -65,9 +65,6 @@ update_icon() /obj/item/gun/energy/Destroy() - //no need to delete them, since contents are already deleted in atom/movable/Destroy(). - cell = null - ammo_type = null STOP_PROCESSING(SSobj, src) return ..() @@ -130,12 +127,12 @@ chambered = null //either way, released the prepared shot recharge_newshot() //try to charge a new shot -/obj/item/gun/energy/do_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/energy/do_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(!chambered && can_shoot()) process_chamber() // If the gun was drained and then recharged, load a new shot. return ..() -/obj/item/gun/energy/do_burst_shot(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) +/obj/item/gun/energy/do_burst_shot(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0, stam_cost = 0) if(!chambered && can_shoot()) process_chamber() // Ditto. return ..() @@ -235,7 +232,7 @@ ..() if(!automatic_charge_overlays) return - var/ratio = can_shoot() ? CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + var/ratio = can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if it's power cell is removed. // TG issues #5361 & #47908 if(ratio == old_ratio && !force_update) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 7fa81f513f..80bb269b21 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -237,7 +237,7 @@ return FALSE return TRUE -/obj/item/gun/energy/dueling/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) +/obj/item/gun/energy/dueling/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread = 0, stam_cost = 0) if(duel.state == DUEL_READY) duel.confirmations[src] = TRUE to_chat(user,"You confirm your readiness.") diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index efe107a3f8..1b835d35a4 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -52,13 +52,16 @@ /obj/item/gun/energy/e_gun/hos name = "\improper X-01 MultiPhase Energy Gun" - desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." + desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time in exchange for inbuilt advanced firearm EMP shielding." icon_state = "hoslaser" force = 10 - ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/hos) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/ion/hos) ammo_x_offset = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/item/gun/energy/e_gun/hos/emp_act(severity) + return + /obj/item/gun/energy/e_gun/dragnet name = "\improper DRAGnet" desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology." @@ -107,7 +110,7 @@ fail_tick-- ..() -/obj/item/gun/energy/e_gun/nuclear/shoot_live_shot() +/obj/item/gun/energy/e_gun/nuclear/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) failcheck() update_icon() ..() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index c5660624a2..49c069ca62 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -60,6 +60,12 @@ else cut_overlays() +/obj/item/gun/energy/kinetic_accelerator/getinaccuracy(mob/living/user, bonus_spread, stamloss) + var/old_fire_delay = fire_delay //It's pretty irrelevant tbh but whatever. + fire_delay = overheat_time + . = ..() + fire_delay = old_fire_delay + /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) . = ..() if(max_mod_capacity) @@ -128,7 +134,7 @@ if(!holds_charge) empty() -/obj/item/gun/energy/kinetic_accelerator/shoot_live_shot() +/obj/item/gun/energy/kinetic_accelerator/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) . = ..() attempt_reload() @@ -207,6 +213,12 @@ var/obj/item/gun/energy/kinetic_accelerator/KA = loc KA.modify_projectile(BB) +/obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user) + if(user && !lavaland_equipment_pressure_check(get_turf(user))) + return 0 + else + return ..() + //Projectiles /obj/item/projectile/kinetic name = "kinetic force" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index bcd3a97ccd..e64da116f3 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -62,7 +62,7 @@ slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM - inaccuracy_modifier = 0.5 + inaccuracy_modifier = 0.7 force = 10 throwforce = 10 cell_type = /obj/item/stock_parts/cell/lascarbine @@ -240,3 +240,20 @@ chambered.BB.damage *= 5 process_fire(target, user, TRUE, params) + +//////////////// +// IMPROVISED // +//////////////// + +/obj/item/gun/energy/e_gun/old/improvised + name = "improvised energy rifle" + desc = "A crude imitation of an energy gun. It works, however the beams are poorly focused and most of the energy is wasted before it reaches the target. Welp, it still burns things." + icon_state = "improvised" + ammo_x_offset = 1 + shaded_charge = 1 + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised) + +/obj/item/gun/energy/e_gun/old/improvised/upgraded + name = "makeshift energy rifle" + desc = "The new lens and upgraded parts gives this a higher capacity and more energy output, however, the shoddy construction still leaves it inferior to Nanotrasen's own energy weapons." + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised/upgraded) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 807b414ce4..b55e26b6a3 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -89,7 +89,7 @@ suppressed = TRUE ammo_type = list(/obj/item/ammo_casing/energy/bolt) weapon_weight = WEAPON_LIGHT - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 obj_flags = 0 overheat_time = 20 holds_charge = TRUE @@ -126,7 +126,7 @@ attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 sharpness = IS_SHARP - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 can_charge = 0 heat = 3800 @@ -182,7 +182,7 @@ item_state = null icon_state = "wormhole_projector" pin = null - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 var/obj/effect/portal/p_blue var/obj/effect/portal/p_orange var/atmos_link = FALSE @@ -318,7 +318,7 @@ icon_state = "emitter_carbine" force = 12 w_class = WEIGHT_CLASS_SMALL - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 cell_type = /obj/item/stock_parts/cell/super ammo_type = list(/obj/item/ammo_casing/energy/emitter) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 14b2ff0c1a..b23b059d89 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -45,7 +45,7 @@ /obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball, /obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage, /obj/item/projectile/magic/locker) -/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) chambered.projectile_type = pick(allowed_projectile_types) . = ..() @@ -90,9 +90,10 @@ . = ..() AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) -/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 +/obj/item/gun/magic/staff/spellblade/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + // Do not block projectiles. + if(attack_type & ATTACK_TYPE_PROJECTILE) + return BLOCK_NONE return ..() /obj/item/gun/magic/staff/locker diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index f230dc7fea..bcb074023f 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -77,7 +77,6 @@ var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") var/datum/action/item_action/zoom_lock_action/zoom_lock_action - var/mob/listeningTo /obj/item/gun/energy/beam_rifle/debug delay = 0 @@ -178,7 +177,6 @@ STOP_PROCESSING(SSfastprocess, src) set_user(null) QDEL_LIST(current_tracers) - listeningTo = null return ..() /obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE) @@ -260,17 +258,12 @@ if(user == current_user) return stop_aiming(current_user) - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null - if(istype(current_user)) - LAZYREMOVE(current_user.mousemove_intercept_objects, src) + if(current_user) + UnregisterSignal(current_user, COMSIG_MOVABLE_MOVED) current_user = null if(istype(user)) current_user = user - LAZYOR(current_user.mousemove_intercept_objects, src) RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) - listeningTo = user /obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) if(aiming) @@ -295,7 +288,7 @@ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) return process_aim() - if(fire_check()) + if(fire_check() && can_trigger_gun(M)) sync_ammo() do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected) stop_aiming() @@ -318,7 +311,7 @@ AC.sync_stats() /obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) - aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) + aiming_time_left = clamp(aiming_time_left + amount, 0, aiming_time) /obj/item/ammo_casing/energy/beam_rifle name = "particle acceleration lens" @@ -369,11 +362,11 @@ HS_BB.stun = projectile_stun HS_BB.impact_structure_damage = impact_structure_damage HS_BB.aoe_mob_damage = aoe_mob_damage - HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock + HS_BB.aoe_mob_range = clamp(aoe_mob_range, 0, 15) //Badmin safety lock HS_BB.aoe_fire_chance = aoe_fire_chance HS_BB.aoe_fire_range = aoe_fire_range HS_BB.aoe_structure_damage = aoe_structure_damage - HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock + HS_BB.aoe_structure_range = clamp(aoe_structure_range, 0, 15) //Badmin safety lock HS_BB.wall_devastate = wall_devastate HS_BB.wall_pierce_amount = wall_pierce_amount HS_BB.structure_pierce_amount = structure_piercing @@ -465,7 +458,7 @@ else target.ex_act(EXPLODE_HEAVY) return TRUE - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/AM = target if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM)) if(structure_pierce < structure_pierce_amount) diff --git a/code/modules/projectiles/guns/misc/chameleon.dm b/code/modules/projectiles/guns/misc/chameleon.dm index d2afe2bd78..4fa614ae5c 100644 --- a/code/modules/projectiles/guns/misc/chameleon.dm +++ b/code/modules/projectiles/guns/misc/chameleon.dm @@ -60,13 +60,12 @@ continue vv_edit_var(v, initial(vars[v])) vars[v] = initial(vars[v]) - QDEL_NULL(chambered.BB) + QDEL_NULL(chambered.BB) chambered.newshot() /obj/item/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE) if(!istype(AC)) CRASH("[AC] is not /obj/item/ammo_casing!") - return FALSE for(var/V in ammo_copy_vars) if(AC.vars.Find(V)) chameleon_ammo_vars[V] = AC.vars[V] @@ -78,7 +77,6 @@ /obj/item/gun/energy/laser/chameleon/proc/set_chameleon_projectile(obj/item/projectile/P) if(!istype(P)) CRASH("[P] is not /obj/item/projectile!") - return FALSE chameleon_projectile_vars = list("name" = "practice laser", "icon" = 'icons/obj/projectiles.dmi', "icon_state" = "laser", "nodamage" = TRUE) for(var/V in projectile_copy_vars) if(P.vars.Find(V)) @@ -99,7 +97,6 @@ /obj/item/gun/energy/laser/chameleon/proc/set_chameleon_gun(obj/item/gun/G , passthrough = TRUE) if(!istype(G)) CRASH("[G] is not /obj/item/gun!") - return FALSE for(var/V in gun_copy_vars) if(vars.Find(V) && G.vars.Find(V)) chameleon_gun_vars[V] = G.vars[V] diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm index c05ec1c4be..9db5161247 100644 --- a/code/modules/projectiles/guns/misc/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -9,7 +9,7 @@ throw_speed = 3 throw_range = 7 force = 4 - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 custom_materials = list(/datum/material/iron=2000) clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm index 6113bc4857..86dd0c6ce4 100644 --- a/code/modules/projectiles/guns/misc/grenade_launcher.dm +++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm @@ -31,7 +31,7 @@ /obj/item/gun/grenadelauncher/can_shoot() return grenades.len -/obj/item/gun/grenadelauncher/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/grenadelauncher/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) user.visible_message("[user] fired a grenade!", \ "You fire the grenade launcher!") var/obj/item/grenade/F = grenades[1] //Now with less copypasta! diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm index 8d800357df..e841422893 100644 --- a/code/modules/projectiles/guns/misc/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -41,7 +41,7 @@ on_beam_release(current_target) current_target = null -/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(isliving(user)) add_fingerprint(user) diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index a5f871bdf0..dc2a1df03a 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -7,7 +7,7 @@ throw_speed = 3 throw_range = 7 force = 4 - inaccuracy_modifier = 0 + inaccuracy_modifier = 0.25 custom_materials = list(/datum/material/iron=2000) clumsy_check = 0 fire_sound = 'sound/items/syringeproj.ogg' @@ -160,7 +160,7 @@ item_state = "blowgun" fire_sound = 'sound/items/syringeproj.ogg' -/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) visible_message("[user] starts aiming with a blowgun!") if(do_after(user, 25, target = src)) user.adjustStaminaLoss(20) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index e754a9c070..cef730366e 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -13,11 +13,16 @@ var/pin_removeable = 0 // Can be replaced by any pin. var/obj/item/gun/gun -/obj/item/firing_pin/New(newloc) - ..() +/obj/item/firing_pin/Initialize(newloc) + . = ..() if(istype(newloc, /obj/item/gun)) gun = newloc +/obj/item/firing_pin/Destroy() + if(gun) + gun.pin = null + return ..() + /obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag) @@ -224,20 +229,101 @@ suit_requirement = /obj/item/clothing/suit/bluetag tagcolor = "blue" -/obj/item/firing_pin/Destroy() - if(gun) - gun.pin = null - return ..() +/obj/item/firing_pin/security_level + name = "security level firing pin" + desc = "A sophisticated firing pin that authorizes operation based on its settings and current security level." + icon_state = "firing_pin_sec_level" + var/min_sec_level = SEC_LEVEL_GREEN + var/max_sec_level = SEC_LEVEL_DELTA + var/only_lethals = FALSE + var/can_toggle = TRUE -//Station Locked +/obj/item/firing_pin/security_level/Initialize() + . = ..() + fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \ + MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \ + ONLY LETHALS: [only_lethals ? "YES" : "NO"]." + update_icon() -/obj/item/firing_pin/away - name = "station locked pin" - desc = "A firing pin that only will fire when off the station." +/obj/item/firing_pin/security_level/examine(mob/user) + . = ..() + var/lethal = only_lethals ? "only lethal " : "" + if(min_sec_level != max_sec_level) + . += "It's currently set to disallow [lethal]operation when the security level isn't between [NUM2SECLEVEL(min_sec_level)] and [NUM2SECLEVEL(max_sec_level)]." + else + . += "It's currently set to disallow [lethal]operation when the security level isn't [NUM2SECLEVEL(min_sec_level)]." + if(can_toggle) + . += "You can use a multitool to modify its settings." -/obj/item/firing_pin/away/pin_auth(mob/living/user) - var/area/station_area = get_area(src) - if(!station_area || is_station_level(station_area.z)) - to_chat(user, "The pin beeps, refusing to fire.") +/obj/item/firing_pin/security_level/multitool_act(mob/living/user, obj/item/I) + . = TRUE + if(!can_toggle || !user.canUseTopic(src, BE_CLOSE)) + return + var/selection = alert(user, "Which setting would you want to modify?", "Firing Pin Settings", "Minimum Level Setting", "Maximum Level Setting", "Lethals Only Toggle") + if(QDELETED(src) || QDELETED(user) || !user.canUseTopic(src, BE_CLOSE)) + return + var/static/list/till_designs_pr_isnt_merged = list("green", "blue", "amber", "red", "delta") + switch(selection) + if("Minimum Level Setting") + var/input = input(user, "Input the new minimum level setting.", "Firing Pin Settings", NUM2SECLEVEL(min_sec_level)) as null|anything in till_designs_pr_isnt_merged + if(!input) + return + min_sec_level = till_designs_pr_isnt_merged.Find(input) - 1 + if(min_sec_level > max_sec_level) + max_sec_level = SEC_LEVEL_DELTA + if("Maximum Level Setting") + var/input = input(user, "Input the new maximum level setting.", "Firing Pin Settings", NUM2SECLEVEL(max_sec_level)) as null|anything in till_designs_pr_isnt_merged + if(!input) + return + max_sec_level = till_designs_pr_isnt_merged.Find(input) - 1 + if(max_sec_level < max_sec_level) + min_sec_level = SEC_LEVEL_GREEN + if("Lethals Only Toggle") + only_lethals = !only_lethals + + fail_message = "INVALID SECURITY LEVEL. CURRENT: [uppertext(NUM2SECLEVEL(GLOB.security_level))]. \ + MIN: [uppertext(NUM2SECLEVEL(min_sec_level))]. MAX: [uppertext(NUM2SECLEVEL(max_sec_level))]. \ + ONLY LETHALS: [only_lethals ? "YES" : "NO"]." + update_icon() + +/obj/item/firing_pin/security_level/update_overlays() + . = ..() + var/offset = 0 + for(var/level in list(min_sec_level, max_sec_level)) + var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay") + overlay.pixel_x += offset + offset += 4 + switch(level) + if(SEC_LEVEL_GREEN) + overlay.color = "#b2ff59" //light green + if(SEC_LEVEL_BLUE) + overlay.color = "#99ccff" //light blue + if(SEC_LEVEL_AMBER) + overlay.color = "#ffae42" //light yellow/orange + if(SEC_LEVEL_RED) + overlay.color = "#ff3f34" //light red + else + overlay.color = "#fe59c2" //neon fuchsia + . += overlay + var/mutable_appearance/overlay = mutable_appearance(icon, "pin_sec_level_overlay") + overlay.pixel_x += offset + overlay.color = only_lethals ? "#b2ff59" : "#ff3f34" + . += overlay + +/obj/item/firing_pin/security_level/pin_auth(mob/living/user) + return (only_lethals && !(gun.chambered?.harmful)) || ISINRANGE(GLOB.security_level, min_sec_level, max_sec_level) + +// Explorer Firing Pin- Prevents use on station Z-Level, so it's justifiable to give Explorers guns that don't suck. +/obj/item/firing_pin/explorer + name = "outback firing pin" + desc = "A firing pin used by the austrailian defense force, retrofit to prevent weapon discharge on the station." + icon_state = "firing_pin_explorer" + fail_message = "CANNOT FIRE WHILE ON STATION, MATE!" + +// This checks that the user isn't on the station Z-level. +/obj/item/firing_pin/explorer/pin_auth(mob/living/user) + var/turf/station_check = get_turf(user) + if(!station_check||is_station_level(station_check.z)) + to_chat(user, "You cannot use your weapon while on the station!") return FALSE return TRUE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9b60f96d16..f279047356 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1,6 +1,10 @@ #define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. #define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. +/// Minimum projectile pixels to move before it animate()S, below this it's a direct set. +#define MINIMUM_PIXELS_TO_ANIMATE 4 +/// Pixels to instantly travel on firing. +#define PROJECTILE_FIRING_INSTANT_TRAVEL_AMOUNT 16 /obj/item/projectile name = "projectile" @@ -12,7 +16,9 @@ pass_flags = PASSTABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT movement_type = FLYING + animate_movement = NO_STEPS hitsound = 'sound/weapons/pierce.ogg' + appearance_flags = PIXEL_SCALE var/hitsound_wall = "" resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -20,7 +26,7 @@ var/atom/movable/firer = null//Who shot it var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret) var/suppressed = FALSE //Attack message var/suppressed = FALSE //Attack message - var/candink = FALSE //Can this projectile play the dink sound when hitting the head? var/yo = null + var/candink = FALSE //Can this projectile play the dink sound when hitting the head? var/yo = null var/xo = null var/atom/original = null // the original target clicked @@ -32,21 +38,45 @@ //Fired processing vars var/fired = FALSE //Have we been fired yet var/paused = FALSE //for suspending the projectile midair - var/last_projectile_move = 0 - var/last_process = 0 var/time_offset = 0 var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! + /// "leftover" pixels for Range() calculation as pixel_move() was moved to simulated semi-pixel movement and Range() is in tiles. + var/pixels_range_leftover = 0 + /// "leftover" tick pixels and stuff yeah, so we don't round off things and introducing tracing inaccuracy. + var/pixels_tick_leftover = 0 + /// Used to detect jumps in the middle of a pixel_move. Yes, this is ugly as sin code-wise but it works. + var/pixel_move_interrupted = FALSE + + /// Pixels moved per second. + var/pixels_per_second = TILES_TO_PIXELS(12.5) + /// The number of pixels we increment by. THIS IS NOT SPEED, DO NOT TOUCH THIS UNLESS YOU KNOW WHAT YOU ARE DOING. In general, lower values means more linetrace accuracy up to a point at cost of performance. + var/pixel_increment_amount - var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel var/Angle = 0 var/original_angle = 0 //Angle at firing var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle var/spread = 0 //amount (in degrees) of projectile spread animate_movement = 0 //Use SLIDE_STEPS in conjunction with legacy + /// how many times we've ricochet'd so far (instance variable, not a stat) var/ricochets = 0 - var/ricochets_max = 2 - var/ricochet_chance = 30 + /// how many times we can ricochet max + var/ricochets_max = 0 + /// 0-100, the base chance of ricocheting, before being modified by the atom we shoot and our chance decay + var/ricochet_chance = 0 + /// 0-1 (or more, I guess) multiplier, the ricochet_chance is modified by multiplying this after each ricochet + var/ricochet_decay_chance = 0.7 + /// 0-1 (or more, I guess) multiplier, the projectile's damage is modified by multiplying this after each ricochet + var/ricochet_decay_damage = 0.7 + /// On ricochet, if nonzero, we consider all mobs within this range of our projectile at the time of ricochet to home in on like Revolver Ocelot, as governed by ricochet_auto_aim_angle + var/ricochet_auto_aim_range = 0 + /// On ricochet, if ricochet_auto_aim_range is nonzero, we'll consider any mobs within this range of the normal angle of incidence to home in on, higher = more auto aim + var/ricochet_auto_aim_angle = 30 + /// the angle of impact must be within this many degrees of the struck surface, set to 0 to allow any angle + var/ricochet_incidence_leeway = 40 + + ///If the object being hit can pass ths damage on to something else, it should not do it for this bullet + var/force_hit = FALSE //Hitscan var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. @@ -74,12 +104,16 @@ //Homing var/homing = FALSE var/atom/homing_target - var/homing_turn_speed = 10 //Angle per tick. + /// How fast the projectile turns towards its homing targets, in angle per second. + var/homing_turn_speed = 100 var/homing_inaccuracy_min = 0 //in pixels for these. offsets are set once when setting target. var/homing_inaccuracy_max = 0 var/homing_offset_x = 0 var/homing_offset_y = 0 + /// How many deciseconds are each hitscan movement considered. Used for homing and other things that use seconds for timing rather than ticks. + var/hitscan_movement_decisecond_equivalency = 0.1 + var/ignore_source_check = FALSE var/damage = 10 @@ -87,7 +121,8 @@ var/nodamage = 0 //Determines if the projectile will skip any damage inflictions var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb var/projectile_type = /obj/item/projectile - var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile. + /// Range of the projectile, de-incrementing every step. The projectile deletes itself at 0. This is in tiles. + var/range = 50 var/decayedRange //stores original range var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/is_reflectable = FALSE // Can it be reflected or not? @@ -114,17 +149,27 @@ var/temporary_unstoppable_movement = FALSE + ///If defined, on hit we create an item of this type then call hitby() on the hit target with this + var/shrapnel_type + ///If TRUE, hit mobs even if they're on the floor and not our target + var/hit_stunned_targets = FALSE + /obj/item/projectile/Initialize() . = ..() permutated = list() decayedRange = range +/** + * Artificially modified to be called at around every world.icon_size pixels of movement. + * WARNING: Range() can only be called once per pixel_increment_amount pixels. + */ /obj/item/projectile/proc/Range() range-- if(range <= 0 && loc) on_range() /obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range + SEND_SIGNAL(src, COMSIG_PROJECTILE_RANGE_OUT) qdel(src) //to get the correct limb (if any) for the projectile hit message @@ -144,6 +189,14 @@ /obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle) + + // i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself. + // maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM + var/obj/item/bodypart/hit_limb + if(isliving(target)) + var/mob/living/L = target + hit_limb = L.check_limb_hit(def_zone) + SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb) var/turf/target_loca = get_turf(target) var/hitx @@ -195,10 +248,13 @@ new impact_effect_type(target_loca, hitx, hity) var/organ_hit_text = "" - var/limb_hit = L.check_limb_hit(def_zone)//to get the correct message info. + var/limb_hit = hit_limb if(limb_hit) organ_hit_text = " in \the [parse_zone(limb_hit)]" - if(suppressed) + + if(suppressed==SUPPRESSED_VERY) + playsound(loc, hitsound, 5, TRUE, -1) + else if(suppressed) playsound(loc, hitsound, 5, 1, -1) to_chat(L, "You're shot by \a [src][organ_hit_text]!") else @@ -224,12 +280,28 @@ /obj/item/projectile/proc/vol_by_damage() if(src.damage) - return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 + return clamp((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume /obj/item/projectile/proc/on_ricochet(atom/A) - return + if(!ricochet_auto_aim_angle || !ricochet_auto_aim_range) + return + + var/mob/living/unlucky_sob + var/best_angle = ricochet_auto_aim_angle + if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) + best_angle += NICE_SHOT_RICOCHET_BONUS + for(var/mob/living/L in range(ricochet_auto_aim_range, src.loc)) + if(L.stat == DEAD || !isInSight(src, L)) + continue + var/our_angle = abs(closer_angle_difference(Angle, get_projectile_angle(src.loc, L.loc))) + if(our_angle < best_angle) + best_angle = our_angle + unlucky_sob = L + + if(unlucky_sob) + setAngle(get_projectile_angle(src, unlucky_sob.loc)) /obj/item/projectile/proc/store_hitscan_collision(datum/point/pcache) beam_segments[beam_index] = pcache @@ -237,25 +309,26 @@ beam_segments[beam_index] = null /obj/item/projectile/Bump(atom/A) + if(!trajectory) + return var/turf/T = get_turf(A) - if(trajectory && check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) + if(check_ricochet(A) && A.handle_ricochet(src)) //if you can ricochet, attempt to ricochet off the object + on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above var/datum/point/pcache = trajectory.copy_to() - ricochets++ - if(A.handle_ricochet(src)) - on_ricochet(A) - ignore_source_check = TRUE - decayedRange = max(0, decayedRange - reflect_range_decrease) - range = decayedRange - if(hitscan) - store_hitscan_collision(pcache) - return TRUE + if(hitscan) + store_hitscan_collision(pcache) + decayedRange = max(0, decayedRange - reflect_range_decrease) + ricochet_chance *= ricochet_decay_chance + damage *= ricochet_decay_damage + range = decayedRange + return TRUE var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. - if(check_zone(def_zone) != BODY_ZONE_CHEST) + if(def_zone && check_zone(def_zone) != BODY_ZONE_CHEST) def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. if(isturf(A) && hitsound_wall) - var/volume = CLAMP(vol_by_damage() + 20, 0, 100) + var/volume = clamp(vol_by_damage() + 20, 0, 100) if(suppressed) volume = 5 playsound(loc, hitsound_wall, volume, 1, -1) @@ -315,30 +388,50 @@ objs += O var/obj/O = safepick(objs) if(O) + if(length(O.buckled_mobs)) + return pick(O.buckled_mobs) return O //Nothing else is here that we can hit, hit the turf if we haven't. if(!(T in permutated) && can_hit_target(T, permutated, T == original, TRUE)) return T //Returns null if nothing at all was found. -/obj/item/projectile/proc/check_ricochet() - if(prob(ricochet_chance)) - return TRUE - return FALSE +/obj/item/projectile/proc/check_ricochet(atom/A) + if(ricochets > ricochets_max) //safety thing, we don't care about what the other thing says about this. + return FALSE + var/them = A.check_projectile_ricochet(src) + switch(them) + if(PROJECTILE_RICOCHET_PREVENT) + return FALSE + if(PROJECTILE_RICOCHET_FORCE) + return TRUE + if(PROJECTILE_RICOCHET_NO) + return FALSE + if(PROJECTILE_RICOCHET_YES) + var/chance = ricochet_chance * A.ricochet_chance_mod + if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) + chance += NICE_SHOT_RICOCHET_BONUS + if(prob(chance)) + return TRUE + else + CRASH("Invalid return value for projectile ricochet check from [A].") /obj/item/projectile/proc/check_ricochet_flag(atom/A) - if(A.flags_1 & CHECK_RICOCHET_1) + if((flag in list("energy", "laser")) && (A.flags_ricochet & RICOCHET_SHINY)) + return TRUE + if((flag in list("bomb", "bullet")) && (A.flags_ricochet & RICOCHET_HARD)) return TRUE return FALSE +/// one move is a tile. /obj/item/projectile/proc/return_predicted_turf_after_moves(moves, forced_angle) //I say predicted because there's no telling that the projectile won't change direction/location in flight. if(!trajectory && isnull(forced_angle) && isnull(Angle)) return FALSE var/datum/point/vector/current = trajectory if(!current) var/turf/T = get_turf(src) - current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, SSprojectiles.global_pixel_speed) - var/datum/point/vector/v = current.return_vector_after_increments(moves * SSprojectiles.global_iterations_per_move) + current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, pixel_increment_amount || SSprojectiles.global_pixel_increment_amount) + var/datum/point/vector/v = current.return_vector_after_increments(TILES_TO_PIXELS(moves) / (pixel_increment_amount || SSprojectiles.global_pixel_increment_amount)) return v.return_turf() /obj/item/projectile/proc/return_pathing_turfs_in_moves(moves, forced_angle) @@ -349,32 +442,26 @@ /obj/item/projectile/Process_Spacemove(movement_dir = 0) return TRUE //Bullets don't drift in space -/obj/item/projectile/process() - last_process = world.time +/obj/item/projectile/process(wait) if(!loc || !fired || !trajectory) fired = FALSE return PROCESS_KILL if(paused || !isturf(loc)) - last_projectile_move += world.time - last_process //Compensates for pausing, so it doesn't become a hitscan projectile when unpaused from charged up ticks. return - var/elapsed_time_deciseconds = (world.time - last_projectile_move) + time_offset - time_offset = 0 - var/required_moves = speed > 0? FLOOR(elapsed_time_deciseconds / speed, 1) : MOVES_HITSCAN //Would be better if a 0 speed made hitscan but everyone hates those so I can't make it a universal system :< - if(required_moves == MOVES_HITSCAN) - required_moves = SSprojectiles.global_max_tick_moves - else - if(required_moves > SSprojectiles.global_max_tick_moves) - var/overrun = required_moves - SSprojectiles.global_max_tick_moves - required_moves = SSprojectiles.global_max_tick_moves - time_offset += overrun * speed - time_offset += MODULUS(elapsed_time_deciseconds, speed) - for(var/i in 1 to required_moves) - pixel_move(1, FALSE) + var/ds = (SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait + var/required_pixels = (pixels_per_second * ds * 0.1) + pixels_tick_leftover + if(required_pixels >= pixel_increment_amount) + pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) + pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE, ds, SSprojectiles.global_projectile_speed_multiplier) + else + pixels_tick_leftover = required_pixels /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) //If no angle needs to resolve it from xo/yo! + if(shrapnel_type) + AddElement(/datum/element/embed, projectile_payload = shrapnel_type) if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") if(direct_target) @@ -392,8 +479,8 @@ stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") qdel(src) return - var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z) - setAngle(Get_Angle(src, target)) + var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) + setAngle(get_projectile_angle(src, target)) original_angle = Angle if(!nondirectional_sprite) var/matrix/M = new @@ -402,17 +489,20 @@ trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE - trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, SSprojectiles.global_pixel_speed) - last_projectile_move = world.time + if(isnull(pixel_increment_amount)) + pixel_increment_amount = SSprojectiles.global_pixel_increment_amount + trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_increment_amount) fired = TRUE if(hitscan) process_hitscan() + return if(!(datum_flags & DF_ISPROCESSING)) START_PROCESSING(SSprojectiles, src) - pixel_move(1, FALSE) //move it now! + pixel_move(round(PROJECTILE_FIRING_INSTANT_TRAVEL_AMOUNT / pixel_increment_amount), FALSE, allow_animation = FALSE) //move it now! /obj/item/projectile/proc/setAngle(new_angle, hitscan_store_segment = TRUE) //wrapper for overrides. Angle = new_angle + pixel_move_interrupted = TRUE if(!nondirectional_sprite) var/matrix/M = new M.Turn(Angle) @@ -439,6 +529,7 @@ trajectory.initialize_location(target.x, target.y, target.z, 0, 0) if(hitscan) record_hitscan_start(RETURN_PRECISE_POINT(src)) + pixel_move_interrupted = TRUE if(zc) after_z_change(old, target) @@ -454,7 +545,8 @@ else return ..() -/obj/item/projectile/proc/set_pixel_speed(new_speed) +/obj/item/projectile/proc/set_pixel_increment_amount(new_speed) + pixel_increment_amount = new_speed if(trajectory) trajectory.set_speed(new_speed) return TRUE @@ -467,6 +559,7 @@ beam_segments[beam_index] = null //record start. /obj/item/projectile/proc/process_hitscan() + var/ttm = round(world.icon_size / pixel_increment_amount, 1) var/safety = range * 10 record_hitscan_start(RETURN_POINT_VECTOR_INCREMENT(src, Angle, MUZZLE_EFFECT_PIXEL_INCREMENT, 1)) while(loc && !QDELETED(src)) @@ -479,20 +572,34 @@ if(!QDELETED(src)) qdel(src) return //Kill! - pixel_move(1, TRUE) + pixel_move(ttm, TRUE, hitscan_movement_decisecond_equivalency) -/obj/item/projectile/proc/pixel_move(trajectory_multiplier, hitscanning = FALSE) +/** + * The proc to make the projectile go, using a simulated pixel movement line trace. + * Note: deciseconds_equivalent is currently only used for homing, times is the number of times to move pixel_increment_amount. + * Trajectory multiplier directly modifies the factor of pixel_increment_amount to go per time. + * It's complicated, so probably just don't mess with this unless you know what you're doing. + */ +/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, deciseconds_equivalent = world.tick_lag, trajectory_multiplier = 1, allow_animation = TRUE) if(!loc || !trajectory) return - last_projectile_move = world.time if(!nondirectional_sprite && !hitscanning) var/matrix/M = new M.Turn(Angle) transform = M - if(homing) - process_homing() var/forcemoved = FALSE - for(var/i in 1 to SSprojectiles.global_iterations_per_move) + pixel_move_interrupted = FALSE // reset that + var/turf/oldloc = loc + var/old_px = pixel_x + var/old_py = pixel_y + for(var/i in 1 to times) + // HOMING START - Too expensive to proccall at this point. + if(homing_target) + // No datum/points, too expensive. + var/angle = closer_angle_difference(Angle, get_projectile_angle(src, homing_target)) + var/max_turn = homing_turn_speed * deciseconds_equivalent * 0.1 + setAngle(Angle + clamp(angle, -max_turn, max_turn)) + // HOMING END trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -512,23 +619,31 @@ pixel_x = trajectory.return_px() pixel_y = trajectory.return_py() else if(T != loc) - step_towards(src, T) + var/safety = CEILING(pixel_increment_amount / world.icon_size, 1) * 2 + 1 + while(T != loc) + if(!--safety) + CRASH("[type] took too long (allowed: [CEILING(pixel_increment_amount/world.icon_size,1)*2] moves) to get to its location.") + step_towards(src, T) + if(QDELETED(src) || pixel_move_interrupted) // this doesn't take into account with pixel_move_interrupted the portion of the move cut off by any forcemoves, but we're opting to ignore that for now + // the reason is the entire point of moving to pixel speed rather than tile speed is smoothness, which will be crucial when pixel movement is done in the future + // reverting back to tile is more or less the only way of fixing this issue. + return + pixels_range_leftover += pixel_increment_amount + if(pixels_range_leftover > world.icon_size) + Range() if(QDELETED(src)) return + pixels_range_leftover -= world.icon_size if(!hitscanning && !forcemoved) - pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move - pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move - animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) - Range() - -/obj/item/projectile/proc/process_homing() //may need speeding up in the future performance wise. - if(!homing_target) - return FALSE - var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) - PT.x += CLAMP(homing_offset_x, 1, world.maxx) - PT.y += CLAMP(homing_offset_y, 1, world.maxy) - var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT)) - setAngle(Angle + CLAMP(angle, -homing_turn_speed, homing_turn_speed)) + var/traj_px = round(trajectory.return_px(), 1) + var/traj_py = round(trajectory.return_py(), 1) + if(allow_animation && (pixel_increment_amount * times > MINIMUM_PIXELS_TO_ANIMATE)) + pixel_x = ((oldloc.x - x) * world.icon_size) + old_px + pixel_y = ((oldloc.y - y) * world.icon_size) + old_py + animate(src, pixel_x = traj_px, pixel_y = traj_py, time = 1, flags = ANIMATION_END_NOW) + else + pixel_x = traj_px + pixel_y = traj_py /obj/item/projectile/proc/set_homing_target(atom/A) if(!A || (!isturf(A) && !isturf(A.loc))) @@ -578,7 +693,7 @@ if(targloc || !params) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc) + spread) + setAngle(get_projectile_angle(src, targloc) + spread) if(isliving(source) && params) var/list/calculated = calculate_projectile_angle_and_pixel_offsets(source, params) @@ -589,7 +704,7 @@ else if(targloc) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc) + spread) + setAngle(get_projectile_angle(src, targloc) + spread) else stack_trace("WARNING: Projectile [type] fired without either mouse parameters, or a target atom to aim at!") qdel(src) @@ -622,7 +737,7 @@ var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y - angle = ATAN2(y - oy, x - ox) + angle = arctan(y - oy, x - ox) return list(angle, p_x, p_y) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. @@ -695,3 +810,13 @@ /obj/item/projectile/experience_pressure_difference() return + +/////// MISC HELPERS //////// +/// Is this atom reflectable with ""standardized"" reflection methods like you know eshields and deswords and similar +/proc/is_energy_reflectable_projectile(atom/A) + var/obj/item/projectile/P = A + return istype(P) && P.is_reflectable + +#undef MOVES_HITSCAN +#undef MINIMUM_PIXELS_TO_ANIMATE +#undef MUZZLE_EFFECT_PIXEL_INCREMENT diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ee081d57d6..d95c3b5028 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -39,6 +39,9 @@ /obj/item/projectile/beam/weak damage = 15 +/obj/item/projectile/beam/weak/improvised + damage = 10 + /obj/item/projectile/beam/weak/penetrator armour_penetration = 50 @@ -74,7 +77,7 @@ flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/disabler diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 06d94414be..25809cc7ca 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -60,11 +60,11 @@ if(R.overdose_threshold == 0 || emptrig == TRUE) //Is there a possible OD? M.reagents.add_reagent(R.type, R.volume) else - var/transVol = CLAMP(R.volume, 0, (R.overdose_threshold - M.reagents.get_reagent_amount(R.type)) -1) + var/transVol = clamp(R.volume, 0, (R.overdose_threshold - M.reagents.get_reagent_amount(R.type)) -1) M.reagents.add_reagent(R.type, transVol) else if(!R.overdose_threshold == 0) - var/transVol = CLAMP(R.volume, 0, R.overdose_threshold-1) + var/transVol = clamp(R.volume, 0, R.overdose_threshold-1) M.reagents.add_reagent(R.type, transVol) else M.reagents.add_reagent(R.type, R.volume) diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm index 2d66e25256..78deff601f 100644 --- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm +++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm @@ -3,7 +3,7 @@ damage = 20 armour_penetration = 20 light_range = 3 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) range = 35 light_color = LIGHT_COLOR_RED @@ -39,7 +39,7 @@ armour_penetration = 20 movement_type = FLYING | UNSTOPPABLE range = 20 - speed = 0.8 + pixels_per_second = TILES_TO_PIXELS(12.5) light_range = 4 light_color = LIGHT_COLOR_RED diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index b68c3847e2..62ff4adb11 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -34,3 +34,29 @@ name = "10mm incendiary bullet" damage = 15 fire_stacks = 2 + +/obj/item/projectile/bullet/c10mm/soporific + name ="10mm soporific bullet" + nodamage = TRUE + +/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) + . = ..() + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.blur_eyes(6) + if(L.getStaminaLoss() >= 60) + L.Sleeping(300) + else + L.adjustStaminaLoss(25) + +// .32 ACP (Improvised Pistol) + +/obj/item/projectile/bullet/c32acp + name = ".32 bullet" + damage = 13 + +/obj/item/projectile/bullet/r32acp + name = ".32 rubber bullet" + damage = 3 + eyeblur = 1 + stamina = 20 diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index c5c649a57e..5643804ac1 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -15,6 +15,38 @@ /obj/item/projectile/bullet/c38 name = ".38 bullet" damage = 25 + ricochets_max = 2 + ricochet_chance = 50 + ricochet_auto_aim_angle = 10 + ricochet_auto_aim_range = 3 + +/obj/item/projectile/bullet/c38/match + name = ".38 Match bullet" + ricochets_max = 4 + ricochet_chance = 100 + ricochet_auto_aim_angle = 40 + ricochet_auto_aim_range = 5 + ricochet_incidence_leeway = 50 + ricochet_decay_chance = 1 + ricochet_decay_damage = 1 + +/obj/item/projectile/bullet/c38/match/bouncy + name = ".38 Rubber bullet" + damage = 10 + stamina = 30 + armour_penetration = -30 + ricochets_max = 6 + ricochet_incidence_leeway = 70 + ricochet_chance = 130 + ricochet_decay_damage = 0.8 + shrapnel_type = NONE + +/obj/item/projectile/bullet/c38/dumdum + name = ".38 DumDum bullet" + damage = 15 + armour_penetration = -30 + ricochets_max = 0 + shrapnel_type = /obj/item/shrapnel/bullet/c38/dumdum /obj/item/projectile/bullet/c38/rubber name = ".38 rubber bullet" @@ -24,6 +56,7 @@ /obj/item/projectile/bullet/c38/trac name = ".38 TRAC bullet" damage = 10 + ricochets_max = 0 /obj/item/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) . = ..() @@ -39,6 +72,7 @@ /obj/item/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail name = ".38 Hot Shot bullet" damage = 20 + ricochets_max = 0 /obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) . = ..() @@ -51,6 +85,7 @@ name = ".38 Iceblox bullet" damage = 20 var/temperature = 100 + ricochets_max = 0 /obj/item/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) . = ..() @@ -68,4 +103,14 @@ /obj/item/projectile/bullet/a357/ap name = ".357 armor-piercing bullet" damage = 45 - armour_penetration = 45 \ No newline at end of file + armour_penetration = 45 + +// admin only really, for ocelot memes +/obj/item/projectile/bullet/a357/match + name = ".357 match bullet" + ricochets_max = 5 + ricochet_chance = 140 + ricochet_auto_aim_angle = 50 + ricochet_auto_aim_range = 6 + ricochet_incidence_leeway = 80 + ricochet_decay_chance = 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 4411334883..264df22c76 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -51,7 +51,7 @@ /obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) . = ..() - if(ismovableatom(target)) + if(ismovable(target)) var/atom/movable/M = target var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) M.safe_throw_at(throw_target, 3, 2) @@ -112,3 +112,8 @@ /obj/item/projectile/bullet/seed damage = 4 stamina = 1 + +/obj/item/projectile/bullet/pellet/shotgun_incapacitate + name = "incapacitating pellet" + damage = 1 + stamina = 6 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 5e3ae53806..f69b62a149 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -2,7 +2,7 @@ /obj/item/projectile/bullet/p50 name =".50 bullet" - speed = 0.4 + pixels_per_second = TILES_TO_PIXELS(25) damage = 70 knockdown = 100 dismemberment = 50 @@ -43,5 +43,5 @@ /obj/item/projectile/bullet/p50/penetrator/shuttle //Nukeop Shuttle Variety icon_state = "gaussstrong" damage = 25 - speed = 0.3 + pixels_per_second = TILES_TO_PIXELS(33.33) range = 16 diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index e08f806fe5..6cbe258560 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -5,7 +5,7 @@ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE flag = "rad" irradiate = 5000 - speed = 0.4 + pixels_per_second = TILES_TO_PIXELS(25) hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index e3449a0c1d..83b753e0a3 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -10,7 +10,7 @@ jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 14 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) tracer_type = /obj/effect/projectile/tracer/stun muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 2439cee429..1afbdeae25 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -3,7 +3,7 @@ icon_state = "tesla_projectile" impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser var/chain - var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/zap_range = 3 var/power = 10000 @@ -15,7 +15,7 @@ /obj/item/projectile/energy/tesla/on_hit(atom/target) . = ..() - tesla_zap(target, zap_range, power, tesla_flags) + tesla_zap(target, zap_range, power, zap_flags) qdel(src) /obj/item/projectile/energy/tesla/Destroy() diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 7695ef77be..7ef52aef25 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -121,10 +121,10 @@ qdel(src) /proc/wabbajack(mob/living/M) - if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) + if(!istype(M) || M.stat == DEAD || M.mob_transforming || (GODMODE & M.status_flags)) return - M.notransform = TRUE + M.mob_transforming = TRUE M.Paralyze(INFINITY) M.icon = null M.cut_overlays() @@ -182,18 +182,14 @@ var/path = pick(/mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, /mob/living/simple_animal/hostile/poison/giant_spider, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/carp/ranged, - /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/stickman, /mob/living/simple_animal/hostile/stickman/dog, @@ -232,7 +228,6 @@ if(!new_mob) return - new_mob.grant_language(/datum/language/common) // Some forms can still wear some items for(var/obj/item/W in contents) @@ -284,7 +279,7 @@ if(L.mind) L.mind.transfer_to(S) if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") + to_chat(S, "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") P.forceMove(S) return else @@ -439,12 +434,12 @@ damage = 15 damage_type = BURN nodamage = 0 - speed = 0.3 + pixels_per_second = TILES_TO_PIXELS(33.33) flag = "magic" - var/tesla_power = 20000 - var/tesla_range = 15 - var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_MOB_STUN | TESLA_OBJ_DAMAGE + var/zap_power = 20000 + var/zap_range = 15 + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE var/chain var/mob/living/caster @@ -461,7 +456,7 @@ visible_message("[src] fizzles on contact with [target]!") qdel(src) return BULLET_ACT_BLOCK - tesla_zap(src, tesla_range, tesla_power, tesla_flags) + tesla_zap(src, zap_range, zap_power, zap_flags) qdel(src) /obj/item/projectile/magic/aoe/lightning/Destroy() diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 99aa922622..d967540e6a 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -10,7 +10,7 @@ damage_type = BURN damage = 10 knockdown = 20 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) range = 16 movement_type = FLYING | UNSTOPPABLE var/datum/beam/arm diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index 3aa85c085f..19fd13857a 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -50,7 +50,7 @@ if(M == hal_target) to_chat(hal_target, "[M] is hit by \a [src] in the chest!") hal_apply_effect() - else if(M in view(hal_target)) + else if(M in hal_target.fov_view()) to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") if(damage_type == BRUTE) var/splatter_dir = dir diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index ae0888d3df..9755269031 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -3,7 +3,7 @@ icon_state = "ion" damage = 0 damage_type = BURN - nodamage = 1 + nodamage = TRUE flag = "energy" impact_effect_type = /obj/effect/temp_visual/impact_effect/ion var/emp_radius = 1 @@ -14,4 +14,4 @@ return BULLET_ACT_HIT /obj/item/projectile/ion/weak - emp_radius = 0 + emp_radius = 0 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index a72d078384..2f6a55a7d0 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -1,8 +1,9 @@ /obj/item/projectile/bullet/neurotoxin name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 5 + damage = 15 damage_type = TOX + var/stagger_duration = 8 SECONDS /obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) if(isalien(target)) @@ -10,5 +11,6 @@ nodamage = TRUE else if(iscarbon(target)) var/mob/living/L = target - L.DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25) + L.KnockToFloor(TRUE) + L.Stagger(stagger_duration) return ..() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index eff1531e23..4cf50cd072 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -326,19 +326,18 @@ var/datum/reagent/R = addiction if(C && R) R.addiction_stage++ - switch(R.addiction_stage) - if(1 to R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) - if(R.addiction_stage1_end to R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) - if(R.addiction_stage2_end to R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) - if(R.addiction_stage3_end to R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) - if(R.addiction_stage4_end to INFINITY) - remove_addiction(R) - else - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") + if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) + need_mob_update += R.addiction_act_stage1(C) + else if(R.addiction_stage1_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) + need_mob_update += R.addiction_act_stage2(C) + else if(R.addiction_stage2_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) + need_mob_update += R.addiction_act_stage3(C) + else if(R.addiction_stage3_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) + need_mob_update += R.addiction_act_stage4(C) + else if(R.addiction_stage4_end < R.addiction_stage) + remove_addiction(R) + else + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") addiction_tick++ if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. C.updatehealth() @@ -535,7 +534,7 @@ add_reagent(P, cached_results[P]*multiplier, null, chem_temp) - var/list/seen = viewers(4, get_turf(my_atom))//Sound and sight checkers + var/list/seen = fov_viewers(4, get_turf(my_atom))//Sound and sight checkers var/iconhtml = icon2html(cached_my_atom, seen) if(cached_my_atom) if(!ismob(cached_my_atom)) // No bubbling mobs @@ -617,10 +616,7 @@ handle_reactions() update_total() //Reaction sounds and words - var/list/seen = viewers(5, get_turf(my_atom)) - var/iconhtml = icon2html(my_atom, seen) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [C.mix_message]") + my_atom.visible_message("[icon2html(my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [C.mix_message]") /datum/reagents/proc/fermiReact(selected_reaction, cached_temp, cached_pH, reactedVol, targetVol, cached_required_reagents, cached_results, multiplier) var/datum/chemical_reaction/C = selected_reaction @@ -728,7 +724,7 @@ return //Make sure things are limited, but superacids/bases can push forward the reaction - pH = CLAMP(pH, 0, 14) + pH = clamp(pH, 0, 14) //return said amount to compare for next step. return (reactedVol) @@ -849,7 +845,7 @@ /datum/reagents/proc/adjust_thermal_energy(J, min_temp = 2.7, max_temp = 1000) var/S = specific_heat() - chem_temp = CLAMP(chem_temp + (J / (S * total_volume)), min_temp, max_temp) + chem_temp = clamp(chem_temp + (J / (S * total_volume)), min_temp, max_temp) if(istype(my_atom, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = my_atom RC.temp_check() @@ -877,7 +873,7 @@ for (var/datum/reagent/reagentgas in reagent_list) R.add_reagent(reagentgas, amount/5) remove_reagent(reagentgas, amount/5) - s.set_up(R, CLAMP(amount/10, 0, 2), T) + s.set_up(R, clamp(amount/10, 0, 2), T) s.start() return FALSE @@ -972,7 +968,6 @@ if(isnull(amount)) amount = 0 CRASH("null amount passed to reagent code") - return FALSE if(!isnum(amount)) return FALSE @@ -996,7 +991,7 @@ RC.pH_check()//checks beaker resilience) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored - amount = CLAMP(amount, 0, R.volume) + amount = clamp(amount, 0, R.volume) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index eb2a6ad162..b85d7aefc9 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -23,7 +23,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF circuit = /obj/item/circuitboard/machine/chem_dispenser var/obj/item/stock_parts/cell/cell - var/powerefficiency = 0.1 + var/powerefficiency = 0.0666666 var/amount = 30 var/recharge_amount = 10 var/recharge_counter = 0 @@ -387,7 +387,7 @@ /obj/machinery/chem_dispenser/RefreshParts() recharge_amount = initial(recharge_amount) - var/newpowereff = 0.0666666 + var/newpowereff = initial(powerefficiency) for(var/obj/item/stock_parts/cell/P in component_parts) cell = P for(var/obj/item/stock_parts/matter_bin/M in component_parts) @@ -508,15 +508,13 @@ upgrade_reagents3 = list( /datum/reagent/drug/mushroomhallucinogen, /datum/reagent/consumable/nothing, - /datum/reagent/medicine/cryoxadone, /datum/reagent/consumable/peachjuice ) emagged_reagents = list( - /datum/reagent/consumable/ethanol/thirteenloko, - /datum/reagent/consumable/ethanol/changelingsting, - /datum/reagent/consumable/ethanol/whiskey_cola, /datum/reagent/toxin/mindbreaker, - /datum/reagent/toxin/staminatoxin + /datum/reagent/toxin/staminatoxin, + /datum/reagent/medicine/cryoxadone, + /datum/reagent/iron ) /obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged @@ -571,13 +569,12 @@ upgrade_reagents2 = null upgrade_reagents3 = null emagged_reagents = list( - /datum/reagent/iron, /datum/reagent/consumable/ethanol/alexander, /datum/reagent/consumable/clownstears, /datum/reagent/toxin/minttoxin, /datum/reagent/consumable/ethanol/atomicbomb, - /datum/reagent/drug/aphrodisiac, - /datum/reagent/drug/aphrodisiacplus + /datum/reagent/consumable/ethanol/thirteenloko, + /datum/reagent/consumable/ethanol/changelingsting ) /obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged @@ -722,4 +719,59 @@ component_parts += new /obj/item/stock_parts/manipulator/femto(null) component_parts += new /obj/item/stack/sheet/glass(null) component_parts += new /obj/item/stock_parts/cell/bluespace(null) - RefreshParts() \ No newline at end of file + RefreshParts() + +///An unique, less efficient model found in the medbay apothecary room. +/obj/machinery/chem_dispenser/apothecary + name = "apothecary chem dispenser" + desc = "A cheaper chem dispenser meant for small scale medicine production." + icon_state = "minidispenser" + working_state = "minidispenser_working" + nopower_state = "minidispenser_nopower" + circuit = /obj/item/circuitboard/machine/chem_dispenser/apothecary + powerefficiency = 0.0833333 + dispensable_reagents = list( //radium and stable plasma moved to upgrade tier 1 and 2, they've little to do with most medicines anyway. + /datum/reagent/hydrogen, + /datum/reagent/lithium, + /datum/reagent/carbon, + /datum/reagent/nitrogen, + /datum/reagent/oxygen, + /datum/reagent/fluorine, + /datum/reagent/sodium, + /datum/reagent/aluminium, + /datum/reagent/silicon, + /datum/reagent/phosphorus, + /datum/reagent/sulfur, + /datum/reagent/chlorine, + /datum/reagent/potassium, + /datum/reagent/iron, + /datum/reagent/copper, + /datum/reagent/mercury, + /datum/reagent/water, + /datum/reagent/consumable/ethanol, + /datum/reagent/consumable/sugar, + /datum/reagent/toxin/acid, + /datum/reagent/fuel, + /datum/reagent/silver, + /datum/reagent/iodine, + /datum/reagent/bromine + ) + upgrade_reagents = list( + /datum/reagent/oil, + /datum/reagent/ammonia, + /datum/reagent/radium + ) + upgrade_reagents2 = list( + /datum/reagent/acetone, + /datum/reagent/phenol, + /datum/reagent/stable_plasma + ) + upgrade_reagents3 = list( + /datum/reagent/medicine/mine_salve + ) + + emagged_reagents = list( + /datum/reagent/drug/space_drugs, + /datum/reagent/toxin/carpotoxin, + /datum/reagent/medicine/morphine + ) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 63e9d724a4..8572d30efe 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -151,7 +151,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = CLAMP(target, 0, 1000) + target_temperature = clamp(target, 0, 1000) if("eject") on = FALSE replace_beaker(usr) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 9899d219bf..50e818abe6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -32,7 +32,7 @@ for (var/x in 1 to PILL_STYLE_COUNT) var/list/SL = list() SL["id"] = x - SL["htmltag"] = assets.icon_tag("pill[x]") + SL["htmltag"] = assets.icon_class_name("pill[x]") pillStyles += list(SL) . = ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 25315f457d..38a05cd541 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -170,7 +170,7 @@ if(!A.mutable) return if(A) - var/new_name = sanitize_name(html_encode(params["name"])) + var/new_name = sanitize_name(html_encode(trim(params["name"], 50))) if(!new_name || ..()) return A.AssignName(new_name) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 75848f89b9..a53c57a3e7 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -213,6 +213,11 @@ for(var/datum/reagent/R in beaker.reagents.reagent_list) . += "- [R.volume] units of [R.name]." +/obj/machinery/reagentgrinder/AltClick(mob/user) + . = ..() + if(istype(user) && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + replace_beaker(user) + /obj/machinery/reagentgrinder/proc/eject(mob/user) for(var/i in holdingitems) var/obj/item/O = i diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 384a113b27..a85ac8b085 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/inverse_chem // What chem is metabolised when purity is below inverse_chem_val, this shouldn't be made, but if it does, well, I guess I'll know about it. var/metabolizing = FALSE var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME - var/value = 0 //How much does it sell for in cargo? + var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo? /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) return 0 if(method == VAPOR) //smoke, foam, spray if(M.reagents) - var/modifier = CLAMP((1 - touch_protection), 0, 1) + var/modifier = clamp((1 - touch_protection), 0, 1) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) M.reagents.add_reagent(type, amount) @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) //For easy bloodsucker disgusting and blood removal /datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force) - if(isvamp(C)) + if(AmBloodsucker(C)) var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if(disgust) bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b7f32421aa..b22f34091f 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -14,6 +14,7 @@ taste_description = "alcohol" var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning pH = 7.33 + value = REAGENT_VALUE_VERY_COMMON //don't bother tweaking all drinks values, way too many can easily be done roundstart or with an upgraded dispenser. /* Boozepwr Chart @@ -43,8 +44,8 @@ All effects don't start immediately, but rather get worse over time; the rate is booze_power *= 0.7 C.drunkenness = max((C.drunkenness + (sqrt(volume) * booze_power * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) - if (istype(L)) - C.applyLiverDamage((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150) + if(L) + L.applyOrganDamage((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * L.alcohol_tolerance, 0))/150) return ..() /datum/reagent/consumable/ethanol/reaction_obj(obj/O, reac_volume) @@ -88,7 +89,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of beer" glass_desc = "A freezing pint of beer." pH = 4 - value = 0.1 /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" @@ -98,7 +98,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." pH = 5 - value = 0.3 /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -109,7 +108,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." pH = 6 - value = 0.3 /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M) if(M.color != color) @@ -129,7 +127,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" pH = 6 - value = 0.1 /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M) @@ -152,7 +149,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" pH = 4.5 - value = 0.1 /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" @@ -167,7 +163,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "thirteen_loko_glass" glass_name = "glass of Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - value = 0.3 /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) @@ -229,7 +224,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" pH = 8.1 - value = 0.1 /datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M) M.radiation = max(M.radiation-2,0) @@ -245,7 +239,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "glass of bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - value = 0.5 /datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() && prob(10)) @@ -264,7 +257,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." pH = 3.5 - value = 1 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -280,7 +273,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." pH = 6.9 - value = 0.1 /datum/reagent/consumable/ethanol/rum name = "Rum" @@ -293,7 +285,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" pH = 6.5 - value = 0.1 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -306,7 +297,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" pH = 4 - value = 0.1 /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" @@ -319,7 +309,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" pH = 3.25 - value = 0.1 /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -332,7 +321,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" pH = 3.45 - value = 0.1 /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" @@ -342,7 +330,7 @@ All effects don't start immediately, but rather get worse over time; the rate is quality = DRINK_FANTASTIC taste_description = "scaley sweetness" pH = 3 - value = 2 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/consumable/ethanol/grappa name = "Grappa" @@ -354,7 +342,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." pH = 3.5 - value = 0.1 /datum/reagent/consumable/ethanol/cognac name = "Cognac" @@ -367,7 +354,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" pH = 3.5 - value = 0.1 /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" @@ -379,7 +365,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of absinthe" glass_desc = "It's as strong as it smells." shot_glass_icon_state = "shotglassgreen" - value = 0.1 /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M) if(prob(10) && !HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) @@ -395,6 +380,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown2" glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.assigned_role == "Assistant") @@ -412,7 +398,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." pH = 4.5 - value = 0.1 /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -425,7 +410,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of goldschlager" glass_desc = "100% proof that teen girls will drink anything with gold in it." shot_glass_icon_state = "shotglassgold" - value = 0.5 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/patron name = "Patron" @@ -439,7 +424,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" pH = 4.5 - value = 0.1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" @@ -452,7 +437,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." pH = 3 - value = 0.5 /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" @@ -465,7 +449,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." pH = 4 - value = 1 /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -477,8 +460,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "cubalibreglass" glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" - value = 0.5 - /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. @@ -499,7 +480,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - value = 0.5 /datum/reagent/consumable/ethanol/martini name = "Classic Martini" @@ -511,7 +491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Classic Martini" glass_desc = "Damn, the bartender even stirred it, not shook it." - value = 1 /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" @@ -523,7 +502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Vodka martini" glass_desc ="A bastardisation of the classic martini. Still great." - value = 1 /datum/reagent/consumable/ethanol/white_russian @@ -536,7 +514,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiterussianglass" glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." - value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" @@ -548,7 +525,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "screwdriverglass" glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M) if(M.mind && (M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer"))) //Engineers lose radiation poisoning at a massive rate. @@ -564,7 +540,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "booger" glass_name = "Booger" glass_desc = "Ewww..." - value = 0.3 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" @@ -576,10 +552,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bloodymaryglass" glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) - if(isvamp(C)) + if(AmBloodsucker(C)) disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. @@ -595,7 +570,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bravebullglass" glass_name = "Brave Bull" glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." - value = 2 var/tough_text /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M) @@ -619,7 +593,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tequilasunriseglass" glass_name = "tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - value = 2 var/obj/effect/light_holder /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M) @@ -649,7 +622,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on FIRE!" shot_glass_icon_state = "toxinsspecialglass" - value = 2 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M) M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -668,7 +641,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." pH = 2 overdose_threshold = 40 - value = 3 var/datum/brain_trauma/special/beepsky/B /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) @@ -709,7 +681,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcreamglass" glass_name = "Irish Cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - value = 1 /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" @@ -721,14 +692,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manlydorfglass" glass_name = "The Manly Dorf" glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only." - value = 2 var/dorf_mode /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M) var/real_dorf = isdwarf(M) //_species(H, /datum/species/dwarf) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.dna.check_mutation(DWARFISM) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE) || real_dorf) + if(HAS_TRAIT(H, TRAIT_DWARF) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE || real_dorf)) to_chat(H, "Now THAT is MANLY!") if(real_dorf) boozepwr = 100 // Don't want dwarves to die because of a low booze power @@ -752,7 +722,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "longislandicedteaglass" glass_name = "Long Island Iced Tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - value = 1 /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" @@ -763,7 +732,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_clear" glass_name = "Moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - value = 2 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/b52 name = "B-52" @@ -776,7 +745,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "B-52" glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" - value = 5.2 /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M) playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) @@ -791,7 +759,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcoffeeglass" glass_name = "Irish Coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - value = 2 /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -803,7 +770,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "margaritaglass" glass_name = "Margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" - value = 2 /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" @@ -815,7 +781,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blackrussianglass" glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." - value = 3 /datum/reagent/consumable/ethanol/manhattan @@ -828,7 +793,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manhattanglass" glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." - value = 3 /datum/reagent/consumable/ethanol/manhattan_proj @@ -841,7 +805,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "proj_manhattanglass" glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." - value = 6 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M) @@ -858,7 +822,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeysodaglass2" glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." - value = 1 /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" @@ -870,7 +833,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "antifreeze" glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." - value = 3 /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -886,7 +848,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "b&p" glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." - value = 4 /datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M) if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. @@ -906,7 +867,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "snowwhite" glass_name = "Snow White" glass_desc = "A cold refreshment." - value = 1 /datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. name = "Demon's Blood" @@ -918,7 +878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "demonsblood" glass_name = "Demons Blood" glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." - value = 2 /datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it. name = "Devil's Kiss" @@ -930,7 +889,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "devilskiss" glass_name = "Devils Kiss" glass_desc = "Creepy time!" - value = 2 /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" @@ -942,7 +900,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "vodkatonicglass" glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." - value = 1 /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" @@ -954,7 +911,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginfizzglass" glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." - value = 1 /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama Mama" @@ -966,7 +922,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bahama_mama" glass_name = "Bahama Mama" glass_desc = "A tropical cocktail with a complex blend of flavors." - value = 2 /datum/reagent/consumable/ethanol/singulo name = "Singulo" @@ -978,7 +933,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "singulo" glass_name = "Singulo" glass_desc = "A blue-space beverage." - value = 4 /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -990,7 +944,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sbitenglass" glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." - value = 2 /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 ,BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. @@ -1006,7 +959,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "red_meadglass" glass_name = "Red Mead" glass_desc = "A True Viking's Beverage, though its color is strange." - value = 5 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/mead name = "Mead" @@ -1019,7 +972,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "meadglass" glass_name = "Mead" glass_desc = "A Viking's Beverage, though a cheap one." - value = 1 /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" @@ -1030,7 +982,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "iced_beerglass" glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." - value = 1 /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp. @@ -1045,7 +996,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grogglass" glass_name = "Grog" glass_desc = "A fine and cepa drink for Space." - value = 2.1 /datum/reagent/consumable/ethanol/aloe name = "Aloe" @@ -1057,7 +1007,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aloe" glass_name = "Aloe" glass_desc = "Very, very, very good." - value = 1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" @@ -1069,7 +1019,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "andalusia" glass_name = "Andalusia" glass_desc = "A nice, strangely named drink." - value = 1 /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" @@ -1081,7 +1030,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "alliescocktail" glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." - value = 4 /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" @@ -1093,7 +1041,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "acidspitglass" glass_name = "Acid Spit" glass_desc = "A drink from Nanotrasen. Made from live aliens." - value = 3 /datum/reagent/consumable/ethanol/amasec name = "Amasec" @@ -1105,7 +1052,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "amasecglass" glass_name = "Amasec" glass_desc = "Always handy before COMBAT!!!" - value = 2 /datum/reagent/consumable/ethanol/changelingsting name = "Changeling Sting" @@ -1117,14 +1063,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "changelingsting" glass_name = "Changeling Sting" glass_desc = "A stingy drink." - value = 1.5 /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M) if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals. var/datum/antagonist/changeling/changeling = M.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) changeling.chem_charges += metabolization_rate - changeling.chem_charges = CLAMP(changeling.chem_charges, 0, changeling.chem_storage) + changeling.chem_charges = clamp(changeling.chem_charges, 0, changeling.chem_storage) return ..() /datum/reagent/consumable/ethanol/irishcarbomb @@ -1137,7 +1082,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcarbomb" glass_name = "Irish Car Bomb" glass_desc = "An Irish car bomb." - value = 5 /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -1149,7 +1093,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "syndicatebomb" glass_name = "Syndicate Bomb" glass_desc = "A syndicate bomb." - value = 2 /datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -1177,7 +1120,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "erikasurprise" glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" - value = 4 /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" @@ -1190,7 +1132,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "driestmartiniglass" glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." - value = 5 /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" @@ -1203,7 +1144,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bananahonkglass" glass_name = "Banana Honk" glass_desc = "A drink from Clown Heaven." - value = 8 /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M) if((ishuman(M) && M.job == "Clown") || ismonkey(M)) @@ -1222,7 +1162,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "silencerglass" glass_name = "Silencer" glass_desc = "A drink from Mime Heaven." - value = 2 /datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -1240,7 +1179,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "drunkenblumpkin" glass_name = "Drunken Blumpkin" glass_desc = "A drink for the drunks." - value = 3 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" @@ -1252,7 +1191,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskey_sour" glass_name = "whiskey sour" glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." - value = 2 /datum/reagent/consumable/ethanol/hcider name = "Hard Cider" @@ -1265,7 +1203,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "hard cider" glass_desc = "Tastes like autumn... no wait, fall!" shot_glass_icon_state = "shotglassbrown" - value = 3 /datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! name = "Fetching Fizz" @@ -1278,7 +1215,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fetching_fizz" glass_name = "Fetching Fizz" glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - value = 2 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M) for(var/obj/item/stack/ore/O in orange(3, M)) @@ -1297,7 +1234,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hearty_punch" glass_name = "Hearty Punch" glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." - value = 1 + value = REAGENT_VALUE_RARE //considering the low recipe yield. /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M) if(M.health <= 0) @@ -1318,8 +1255,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown2" glass_name = "Bacchus' Blessing" glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - value = 8 - + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/atomicbomb name = "Atomic Bomb" @@ -1331,7 +1267,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "atomicbombglass" glass_name = "Atomic Bomb" glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - value = 3.56 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -1360,7 +1296,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gargleblasterglass" glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." - value = 5 /datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/M) M.dizziness +=1.5 @@ -1393,7 +1328,7 @@ All effects don't start immediately, but rather get worse over time; the rate is impure_chem = /datum/reagent/consumable/ethanol/neuroweak inverse_chem_val = 0.5 //Clear conversion inverse_chem = /datum/reagent/consumable/ethanol/neuroweak - value = 4 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/neurotoxin/proc/pickt() return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) @@ -1434,7 +1369,6 @@ All effects don't start immediately, but rather get worse over time; the rate is description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins." boozepwr = 60 pH = 8 - value = 3 /datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M) if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin)) @@ -1460,7 +1394,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hippiesdelightglass" glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." - value = 1.96 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M) M.slurring = max(M.slurring,50) @@ -1504,8 +1438,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "nog3" glass_name = "eggnog" glass_desc = "The traditional way to get absolutely hammered at a Christmas party." - value = 4 - /datum/reagent/consumable/ethanol/narsour name = "Nar'Sour" @@ -1517,7 +1449,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "narsour" glass_name = "Nar'Sour" glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" - value = 6.66 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M) M.cultslurring = min(M.cultslurring + 3, 3) @@ -1534,7 +1466,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "cogchamp" glass_name = "CogChamp" glass_desc = "Not even Ratvar's Four Generals could withstand this! Qevax Jryy!" - value = 8.13 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/cogchamp/on_mob_life(mob/living/carbon/M) M.clockcultslurring = min(M.clockcultslurring + 3, 3) @@ -1550,7 +1482,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "Triple Sec" glass_desc = "A glass of straight Triple Sec." - value = 1.5 /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" @@ -1561,7 +1492,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_green" glass_name = "Creme de Menthe" glass_desc = "You can almost feel the first breath of spring just looking at it." - value = 2 /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" @@ -1572,7 +1502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "Creme de Cacao" glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." - value = 1 /datum/reagent/consumable/ethanol/creme_de_coconut name = "Creme de Coconut" @@ -1594,7 +1523,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quadruple_sec" glass_name = "Quadruple Sec" glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." - value = 3.04 /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes. @@ -1613,7 +1541,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quintuple_sec" glass_name = "Quintuple Sec" glass_desc = "Now you are become law, destroyer of clowns." - value = 4.01 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG.. @@ -1646,7 +1574,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "pina_colada" glass_name = "Pina Colada" glass_desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink." - + /datum/reagent/consumable/ethanol/grasshopper name = "Grasshopper" description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this." @@ -1657,7 +1585,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grasshopper" glass_name = "Grasshopper" glass_desc = "You weren't aware edible beverages could be that green." - value = 1 /datum/reagent/consumable/ethanol/stinger name = "Stinger" @@ -1669,7 +1596,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "stinger" glass_name = "Stinger" glass_desc = "You wonder what would happen if you pointed this at a heat source..." - value = 1 /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" @@ -1684,7 +1610,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." shot_glass_icon_state = "shotglassgreen" pH = 4 - value = 8 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L) var/heal_points = 10 @@ -1721,7 +1647,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Squirt Cider" glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." shot_glass_icon_state = "shotglassgreen" - value = 1 /datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/M) M.satiety += 5 //for context, vitamins give 30 satiety per tick @@ -1738,7 +1663,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fringe_weaver" glass_name = "Fringe Weaver" glass_desc = "It's a wonder it doesn't spill out of the glass." - value = 1 /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" @@ -1751,7 +1675,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sugar_rush" glass_name = "Sugar Rush" glass_desc = "If you can't mix a Sugar Rush, you can't tend bar." - value = 1 /datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/M) M.satiety -= 10 //junky as hell! a whole glass will keep you from being able to eat junk food @@ -1768,7 +1691,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "crevice_spike" glass_name = "Crevice Spike" glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." - value = 1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 @@ -1782,7 +1705,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sakecup" glass_name = "cup of sake" glass_desc = "A traditional cup of sake." - value = 0.1 /datum/reagent/consumable/ethanol/peppermint_patty name = "Peppermint Patty" @@ -1794,7 +1716,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "peppermint_patty" glass_name = "Peppermint Patty" glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night." - value = 2 /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M) M.apply_status_effect(/datum/status_effect/throat_soothed) @@ -1812,7 +1733,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Alexander" glass_desc = "A creamy, indulgent delight that is stronger than it seems." var/obj/item/shield/mighty_shield - value = 1 /datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L) if(ishuman(L)) @@ -1844,7 +1764,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sidecar" glass_name = "Sidecar" glass_desc = "The one ride you'll gladly give up the wheel for." - value = 1 /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" @@ -1856,7 +1775,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "between_the_sheets" glass_name = "Between the Sheets" glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." - value = 2 /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L) ..() @@ -1881,7 +1799,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "kamikaze" glass_name = "Kamikaze" glass_desc = "Divinely windy." - value = 1 /datum/reagent/consumable/ethanol/mojito name = "Mojito" @@ -1893,7 +1810,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mojito" glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." - value = 1 /datum/reagent/consumable/ethanol/moscow_mule name = "Moscow Mule" @@ -1914,12 +1830,11 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "utter bitterness" glass_name = "glass of fernet" glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." - value = 0.1 /datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) M.adjustToxLoss(1*REM, 0) - M.nutrition = max(M.nutrition - 5, 0) + M.adjust_nutrition(-5) M.overeatduration = 0 return ..() @@ -1933,17 +1848,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godlyblend" glass_name = "glass of fernet cola" glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." - value = 1 /datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) M.adjustToxLoss(0.5*REM, 0) - M.nutrition = max(M.nutrition - 3, 0) + M.adjust_nutrition(-3) M.overeatduration = 0 return ..() /datum/reagent/consumable/ethanol/fanciulli - name = "Fanciulli" description = "What if the Manhattan coctail ACTUALLY used a bitter herb liquour? Helps you sobers up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness color = "#CA933F" // rgb: 202, 147, 63 @@ -1953,10 +1866,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fanciulli" glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." - value = 1 /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M) - M.nutrition = max(M.nutrition - 5, 0) + M.adjust_nutrition(-5) M.overeatduration = 0 return ..() @@ -1966,7 +1878,6 @@ All effects don't start immediately, but rather get worse over time; the rate is . = TRUE ..() - /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" description = "A refreshing mixture of bitter Fernet with mint creme liquour." @@ -1977,7 +1888,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state= "minted_fernet" glass_name = "glass of branca menta" glass_desc = "A glass of Branca Menta, perfect for those lazy and hot sunday summer afternoons." //Get lazy literally by drinking this - value = 1 /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) @@ -2000,7 +1910,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blank_paper" glass_name = "glass of blank paper" glass_desc = "A fizzy cocktail for those looking to start fresh." - value = 1 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -2017,7 +1927,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "champagne_glass" glass_name = "Champagne" glass_desc = "The flute clearly displays the slowly rising bubbles." - value = 1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/wizz_fizz name = "Wizz Fizz" @@ -2029,7 +1939,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "wizz_fizz" glass_name = "Wizz Fizz" glass_desc = "The glass bubbles and froths with an almost magical intensity." - value = 1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M) //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting @@ -2049,7 +1959,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bug_spray" glass_name = "Bug Spray" glass_desc = "Your eyes begin to water as the sting of alcohol reaches them." - value = 1 /datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M) //Bugs should not drink Bug spray. @@ -2071,7 +1980,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "applejack_glass" glass_name = "Applejack" glass_desc = "You feel like you could drink this all neight." - value = 0.1 /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" @@ -2083,7 +1991,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "jack_rose" glass_name = "Jack Rose" glass_desc = "Enough of these, and you really will start to suppose your toeses are roses." - value = 1 /datum/reagent/consumable/ethanol/turbo name = "Turbo" @@ -2095,7 +2002,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "turbo" glass_name = "Turbo" glass_desc = "A turbulent cocktail for outlaw hoverbikers." - value = 0.3 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M) if(prob(4)) @@ -2113,7 +2020,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "old_timer" glass_name = "Old Timer" glass_desc = "WARNING! May cause premature aging!" - value = 2 + value = REAGENT_VALUE_UNCOMMON //Parsnip juice? Really? lol /datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M) if(prob(20)) @@ -2146,7 +2053,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "rubberneck" glass_name = "Rubberneck" glass_desc = "A popular drink amongst those adhering to an all synthetic diet." - value = 1 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/duplex name = "Duplex" @@ -2158,7 +2065,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "duplex" glass_name = "Duplex" glass_desc = "To imbibe one component separately from the other is consider a great faux pas." - value = 1 /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" @@ -2170,7 +2076,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "trappistglass" glass_name = "Trappist Beer" glass_desc = "boozy Catholicism in a glass." - value = 1 /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) if(M.mind.isholy) @@ -2188,8 +2093,8 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blazaamglass" glass_name = "Blazaam" glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." + value = REAGENT_VALUE_UNCOMMON var/stored_teleports = 0 - value = 4 /datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M) if(M.drunkenness > 40) @@ -2211,7 +2116,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "planet_cracker" glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." - value = 1 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/consumable/ethanol/mauna_loa name = "Mauna Loa" @@ -2223,6 +2128,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mauna_loa" glass_name = "Mauna Loa" glass_desc = "Lavaland in a drink... mug... volcano... thing." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M) // Heats the user up while the reagent is in the body. Occasionally makes you burst into flames. @@ -2236,13 +2142,14 @@ All effects don't start immediately, but rather get worse over time; the rate is name = "Commander and Chief" description = "A cocktail for the captain on the go." color = "#ffffc9" + can_synth = FALSE boozepwr = 50 quality = DRINK_FANTASTIC taste_description = "duty and responsibility" glass_icon_state = "commander_and_chief" glass_name = "Commander and Chief" glass_desc = "The gems of this majestic chalice represent the departments and their Heads." - value = 10 + value = REAGENT_VALUE_AMAZING /datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) @@ -2281,6 +2188,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hellfire" glass_name = "Hellfire" glass_desc = "An amber colored drink that isn't quite as hot as it looks." + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30) @@ -2296,6 +2204,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sins_delight" glass_name = "Sin's Delight" glass_desc = "You can smell the seven sins rolling off the top of the glass." + value = REAGENT_VALUE_RARE /datum/reagent/consumable/ethanol/strawberry_daiquiri name = "Strawberry Daiquiri" @@ -2328,6 +2237,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "miami_vice" glass_name = "Miami Vice" glass_desc = "Strawberries and coconut, like yin and yang." + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/malibu_sunset name = "Malibu Sunset" @@ -2350,11 +2260,225 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hotlime_miami" glass_name = "Hotlime Miami" glass_desc = "This looks very aesthetically pleasing." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) M.adjustStaminaLoss(-2) - return ..() + return ..() + +//////////////////// +//Race-Base-Drinks// +//////////////////// + +/datum/reagent/consumable/ethanol/coldscales + name = "Coldscales" + color = "#5AEB52" //(90, 235, 82) + description = "A cold looking drink made for people with scales." + boozepwr = 50 //strong! + taste_description = "dead flies" + glass_icon_state = "coldscales" + glass_name = "glass of Coldscales" + glass_desc = "A soft green drink that looks inviting!" + +/datum/reagent/consumable/ethanol/coldscales/on_mob_life(mob/living/carbon/M) + if(islizard(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/oil_drum + name = "Oil Drum" + color = "#000000" //(0, 0, 0) + description = "Industeral grade oil mixed with some ethanol to make it a drink. Somehow not known to be toxic." + boozepwr = 45 + taste_description = "oil spill" + glass_icon_state = "oil_drum" + glass_name = "Drum of oil" + glass_desc = "A gray can of booze and oil..." + +/datum/reagent/consumable/ethanol/oil_drum/on_mob_life(mob/living/carbon/M) + if(isipcperson(M) || issynthliz(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/nord_king + name = "Nord King" + color = "#EB1010" //(235, 16, 16) + description = "Strong mead mixed with more honey and ethanol. Known to beloved by most palettes." + boozepwr = 50 //strong! + taste_description = "honey and red wine" + glass_icon_state = "nord_king" + glass_name = "Keg of Nord King" + glass_desc = "A dripping keg of red mead." + +/datum/reagent/consumable/ethanol/nord_king/on_mob_life(mob/living/carbon/M) + if(ishumanbasic(M) || isdwarf(M) || isangel(M)) //Humans and angel races are rare + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/velvet_kiss + name = "Velvet Kiss" + color = "#EB1010" //(235, 16, 16) + description = "A bloody drink mixed with wine." + boozepwr = 10 //weak + taste_description = "iron with grapejuice" + glass_icon_state = "velvet_kiss" + glass_name = "glass of Velvet Kiss" + glass_desc = "Red and white drink for the upper classes or undead." + +/datum/reagent/consumable/ethanol/velvet_kiss/on_mob_life(mob/living/carbon/M) + if(iszombie(M) || isvampire(M) || isdullahan(M)) //Rare races! + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/abduction_fruit + name = "Abduction Fruit" + color = "#DEFACD" //(222, 250, 205) + description = "Mixing of juices to make an alien taste." + boozepwr = 80 //Strong + taste_description = "grass and lime" + glass_icon_state = "abduction_fruit" + glass_name = "glass of Abduction Fruit" + glass_desc = "Mixed fruits that were never ment to be mixed..." + +/datum/reagent/consumable/ethanol/abduction_fruit/on_mob_life(mob/living/carbon/M) + if(isabductor(M) || isxenoperson(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/bug_zapper + name = "Bug Zapper" + color = "#F5882A" //(222, 250, 205) + description = "Metals and lemon juice. Hardly even a drink." + boozepwr = 5 //No booze really + taste_description = "copper and AC power" + glass_icon_state = "bug_zapper" + glass_name = "glass of Bug Zapper" + glass_desc = "An odd mix of copper, lemon juice and power meant for non-human consumption." + +/datum/reagent/consumable/ethanol/bug_zapper/on_mob_life(mob/living/carbon/M) + if(isinsect(M) || isflyperson(M) || ismoth(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/mush_crush + name = "Mush Crush" + color = "#F5882A" //(222, 250, 205) + description = "Soil in a glass." + boozepwr = 5 //No booze really + taste_description = "dirt and iron" + glass_icon_state = "mush_crush" + glass_name = "glass of Mush Crush" + glass_desc = "Popular among people that want to grow their own food rather then drink the soil." + +/datum/reagent/consumable/ethanol/mush_crush/on_mob_life(mob/living/carbon/M) + if(ispodperson(M) || ismush(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/darkbrew + name = "Darkbrew" + color = "#000000" //(0, 0, 0) + description = "Contained dark matter mixed with coffee." + boozepwr = 5 //No booze really + taste_description = "Shadows and coffee trees" + glass_icon_state = "darkbrew" + glass_name = "glass of Darkbrew" + glass_desc = "A pitch black drink that's commonly confused with a type of coffee." + +/datum/reagent/consumable/ethanol/darkbrew/on_mob_life(mob/living/carbon/M) + if(isshadow(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/hollow_bone + name = "Hollow Bone" + color = "#FCF7D4" //(252, 247, 212) + description = "Shockingly none-harmful mix of toxins and milk." + boozepwr = 15 + taste_description = "Milk and salt" + glass_icon_state = "hollow_bone" + glass_name = "skull of Hollow Bone" + glass_desc = "Mixing of milk and bone hurting juice for enjoyment for rather skinny people." + +/datum/reagent/consumable/ethanol/hollow_bone/on_mob_life(mob/living/carbon/M) + if(isplasmaman(M) || isskeleton(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/frisky_kitty + name = "Frisky Kitty" + color = "#FCF7D4" //(252, 247, 212) + description = "Warm milk mixed with a catnip." + boozepwr = 0 //No one dont get drunk off milk! + taste_description = "Warm milk and catnip" + glass_icon_state = "frisky_kitty" + glass_name = "cup of Drisky Kitty" + glass_desc = "Warm milk and some catnip." + +/datum/reagent/consumable/ethanol/frisky_kitty/on_mob_life(mob/living/carbon/M) + if(ismammal(M) || iscatperson(M)) //well its not to bad for mammals + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/datum/reagent/consumable/ethanol/jell_wyrm + name = "Jell Wyrm" + color = "#FF6200" //(255, 98, 0) + description = "Horrible mix of Co2, toxins and heat. Meant for slime based life." + boozepwr = 40 + taste_description = "tropical sea" + glass_icon_state = "jell_wyrm" + glass_name = "glass of Jell Wyrm" + glass_desc = "A bubbly drink that is rather inviting to those that don't know who it's meant for." + +/datum/reagent/consumable/ethanol/jell_wyrm/on_mob_life(mob/living/carbon/M) + if(isjellyperson(M) || isstartjelly(M) || isslimeperson(M) || isluminescent(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + M.adjustToxLoss(1, 0) //Low tox do to being carp + jell toxins. + return ..() + +/datum/reagent/consumable/ethanol/laval_spit //Yes Laval + name = "Laval Spit" + color = "#DE3009" //(222, 48, 9) + description = "Heat minerals and some mauna loa. Meant for rock based life." + boozepwr = 30 + taste_description = "tropical island" + glass_icon_state = "laval_spit" + glass_name = "glass of Laval Spit" + glass_desc = "Piping hot drink for those who can stomach the heat of lava." + +/datum/reagent/consumable/ethanol/laval_spit/on_mob_life(mob/living/carbon/M) + if(isgolem(M)) + quality = RACE_DRINK + else + M.adjust_disgust(25) + return ..() + +/////////////// +//Barrle Wine// +/////////////// /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" @@ -2367,7 +2491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. pH = 4 - value = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) names = data["names"] diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 482dfde1d6..b157f328c5 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// +//////DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/reagent/consumable/orangejuice @@ -165,6 +165,7 @@ metabolization_rate = INFINITY color = "#FF4DD2" taste_description = "laughter" + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M) M.emote("laugh") @@ -177,6 +178,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM color = "#FF4DD2" taste_description = "laughter" + value = REAGENT_VALUE_RARE /datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/M) if(prob(30)) @@ -210,6 +212,7 @@ glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" pH = 6.5 + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER)) @@ -231,6 +234,7 @@ glass_icon_state = "glass_white" glass_name = "glass of soy milk" glass_desc = "White and nutritious soy goodness!" + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() && prob(20)) @@ -324,17 +328,18 @@ glass_icon_state = "lemonpitcher" glass_name = "pitcher of lemonade" glass_desc = "This drink leaves you feeling nostalgic for some reason." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/tea/arnold_palmer name = "Arnold Palmer" description = "Encourages the patient to go golfing." color = "#FFB766" quality = DRINK_NICE - nutriment_factor = 2 taste_description = "bitter tea" glass_icon_state = "arnold_palmer" glass_name = "Arnold Palmer" glass_desc = "You feel like taking a few golf swings after a few swigs of this." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -384,6 +389,7 @@ /datum/reagent/consumable/space_cola name = "Cola" description = "A refreshing beverage." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#100800" // rgb: 16, 8, 0 taste_description = "cola" glass_icon_state = "glass_brown" @@ -404,6 +410,7 @@ glass_icon_state = "nuka_colaglass" glass_name = "glass of Nuka Cola" glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M) M.Jitter(20) @@ -418,6 +425,7 @@ /datum/reagent/consumable/spacemountainwind name = "SM Wind" description = "Blows right through you like a space wind." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#102000" // rgb: 16, 32, 0 taste_description = "sweet citrus soda" glass_icon_state = "Space_mountain_wind_glass" @@ -435,6 +443,7 @@ /datum/reagent/consumable/dr_gibb name = "Dr. Gibb" description = "A delicious blend of 42 different flavours." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#102000" // rgb: 16, 32, 0 taste_description = "cherry soda" // FALSE ADVERTISING glass_icon_state = "dr_gibb_glass" @@ -449,6 +458,7 @@ /datum/reagent/consumable/space_up name = "Space-Up" description = "Tastes like a hull breach in your mouth." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#00FF00" // rgb: 0, 255, 0 taste_description = "cherry soda" glass_icon_state = "space-up_glass" @@ -463,6 +473,7 @@ /datum/reagent/consumable/lemon_lime name = "Lemon Lime" description = "A tangy substance made of 0.5% natural citrus!" + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#8CFF00" // rgb: 135, 255, 0 taste_description = "tangy lime and lemon soda" glass_icon_state = "glass_yellow" @@ -476,6 +487,7 @@ /datum/reagent/consumable/pwr_game name = "Pwr Game" description = "The only drink with the PWR that true gamers crave." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#9385bf" // rgb: 58, 52, 75 taste_description = "sweet and salty tang" glass_icon_state = "glass_red" @@ -489,6 +501,7 @@ /datum/reagent/consumable/shamblers name = "Shambler's Juice" description = "~Shake me up some of that Shambler's Juice!~" + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#f00060" // rgb: 94, 0, 38 taste_description = "carbonated metallic soda" glass_icon_state = "glass_red" @@ -502,6 +515,7 @@ /datum/reagent/consumable/buzz_fuzz name = "Buzz Fuzz" description = "~A Hive of Flavour!~ NOTICE: Addicting." + nutriment_factor = 0 addiction_threshold = 26 //A can and a sip color = "#8CFF00" // rgb: 135, 255, 0 taste_description = "carbonated honey and pollen" @@ -552,6 +566,7 @@ glass_icon_state = "grey_bull_glass" glass_name = "glass of Grey Bull" glass_desc = "Surprisingly it isnt grey." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L) ..() @@ -572,6 +587,7 @@ /datum/reagent/consumable/sodawater name = "Soda Water" description = "A can of club soda. Why not make a scotch and soda?" + nutriment_factor = 0 color = "#619494" // rgb: 97, 148, 148 taste_description = "carbonated water" glass_icon_state = "glass_clear" @@ -604,6 +620,7 @@ /datum/reagent/consumable/ice name = "Ice" description = "Frozen water, your dentist wouldn't like you chewing this." + nutriment_factor = 0 //Its water why would this even geive nutriments? reagent_state = SOLID color = "#619494" // rgb: 97, 148, 148 taste_description = "ice" @@ -624,6 +641,7 @@ glass_icon_state = "soy_latte" glass_name = "soy latte" glass_desc = "A nice and refreshing beverage while you're reading." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) @@ -645,6 +663,7 @@ glass_icon_state = "cafe_latte" glass_name = "cafe latte" glass_desc = "A nice, strong and refreshing beverage while you're reading." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) @@ -666,15 +685,15 @@ glass_icon_state = "doctorsdelightglass" glass_name = "Doctor's Delight" glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-0.5, 0) M.adjustFireLoss(-0.5, 0) M.adjustToxLoss(-0.5, 0) M.adjustOxyLoss(-0.5, 0) - if(M.nutrition && (M.nutrition - 2 > 0)) - if(!(M.mind && M.mind.assigned_role == "Medical Doctor")) //Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight! - M.nutrition -= 2 + if(!(M.mind && M.mind.assigned_role == "Medical Doctor")) //Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight! + M.adjust_nutrition(-2) ..() . = 1 @@ -688,6 +707,7 @@ glass_icon_state = "chocolatepudding" glass_name = "chocolate pudding" glass_desc = "Tasty." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/vanillapudding name = "Vanilla Pudding" @@ -699,50 +719,55 @@ glass_icon_state = "vanillapudding" glass_name = "vanilla pudding" glass_desc = "Tasty." + value = REAGENT_VALUE_UNCOMMON //real vanilla. /datum/reagent/consumable/cherryshake name = "Cherry Shake" description = "A cherry flavored milkshake." color = "#FFB6C1" quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM taste_description = "creamy cherry" glass_icon_state = "cherryshake" glass_name = "cherry shake" glass_desc = "A cherry flavored milkshake." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/bluecherryshake name = "Blue Cherry Shake" description = "An exotic milkshake." color = "#00F1FF" quality = DRINK_VERYGOOD - nutriment_factor = 4 * REAGENTS_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM taste_description = "creamy blue cherry" glass_icon_state = "bluecherryshake" glass_name = "blue cherry shake" glass_desc = "An exotic blue milkshake." + value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/pumpkin_latte name = "Pumpkin Latte" description = "A mix of pumpkin juice and coffee." color = "#F4A460" quality = DRINK_VERYGOOD - nutriment_factor = 3 * REAGENTS_METABOLISM + nutriment_factor = 2 * REAGENTS_METABOLISM taste_description = "creamy pumpkin" glass_icon_state = "pumpkin_latte" glass_name = "pumpkin latte" glass_desc = "A mix of coffee and pumpkin juice." + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/gibbfloats name = "Gibb Floats" description = "Ice cream on top of a Dr. Gibb glass." color = "#B22222" quality = DRINK_NICE - nutriment_factor = 3 * REAGENTS_METABOLISM + nutriment_factor = 1 * REAGENTS_METABOLISM taste_description = "creamy cherry" glass_icon_state = "gibbfloats" glass_name = "Gibbfloat" glass_desc = "Dr. Gibb with ice cream on top." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/pumpkinjuice name = "Pumpkin Juice" @@ -755,6 +780,7 @@ description = "Juiced from real blumpkin." color = "#00BFFF" taste_description = "a mouthful of pool water" + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/triple_citrus name = "Triple Citrus" @@ -784,6 +810,7 @@ color = "#7D4E29" quality = DRINK_NICE taste_description = "chocolate milk" + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/menthol name = "Menthol" @@ -812,6 +839,7 @@ color = "#FFA500" taste_description = "parsnip" glass_name = "glass of parsnip juice" + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink name = "Peach Juice" @@ -837,6 +865,7 @@ glass_icon_state = "cream_soda" glass_name = "Cream Soda" glass_desc = "A classic space-American vanilla flavored soft drink." + value = REAGENT_VALUE_VERY_COMMON //just a little vanilla /datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) @@ -845,6 +874,7 @@ /datum/reagent/consumable/sol_dry name = "Sol Dry" description = "A soothing, mellow drink made from ginger." + nutriment_factor = 0.5 * REAGENTS_METABOLISM color = "#f7d26a" quality = DRINK_NICE taste_description = "sweet ginger spice" @@ -864,12 +894,14 @@ glass_icon_state = "red_queen" glass_name = "Red Queen" glass_desc = "DRINK ME." - var/current_size = 1 + value = REAGENT_VALUE_COMMON //growth serum. + var/current_size = RESIZE_DEFAULT_SIZE /datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H) if(prob(75)) return ..() var/newsize = pick(0.5, 0.75, 1, 1.50, 2) + newsize *= RESIZE_DEFAULT_SIZE H.resize = newsize/current_size current_size = newsize H.update_transform() @@ -878,7 +910,8 @@ ..() /datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/M) - M.resize = 1/current_size + M.resize = RESIZE_DEFAULT_SIZE/current_size + current_size = RESIZE_DEFAULT_SIZE M.update_transform() ..() @@ -887,10 +920,11 @@ description = "A drink of a bygone era of milk and artificial sweetener back on a rock." color = "#f76aeb"//rgb(247, 106, 235) glass_icon_state = "pinkmilk" - quality = DRINK_FANTASTIC //Love drink + quality = DRINK_VERYGOOD taste_description = "sweet strawberry and milk cream" glass_name = "tall glass of strawberry milk" glass_desc = "Delicious flavored strawberry syrup mixed with milk." + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M) if(prob(15)) @@ -903,7 +937,7 @@ description = "A timeless classic!" color = "#f76aeb"//rgb(247, 106, 235) glass_icon_state = "pinktea" - quality = DRINK_FANTASTIC //Love drink + quality = DRINK_VERYGOOD taste_description = "sweet tea with a hint of strawberry" glass_name = "mug of strawberry tea" glass_desc = "Delicious traditional tea flavored with strawberries." @@ -946,6 +980,7 @@ glass_icon_state = "monkey_energy_glass" glass_name = "glass of Monkey Energy" glass_desc = "You can unleash the ape, but without the pop of the can?" + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M) M.Jitter(20) @@ -963,3 +998,4 @@ glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" glass_desc = "Exotic! You feel like you are on vacation already." + value = REAGENT_VALUE_COMMON diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index bf090302c8..f1e45d0717 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,6 +1,5 @@ /datum/reagent/drug name = "Drug" - value = 12 metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" var/trippy = TRUE //Does this drug make you trip? @@ -11,7 +10,7 @@ /datum/reagent/drug/space_drugs name = "Space drugs" - value = 6 + value = REAGENT_VALUE_VERY_COMMON description = "An illegal chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 @@ -38,7 +37,6 @@ /datum/reagent/drug/nicotine name = "Nicotine" - value = 0 description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 @@ -66,6 +64,7 @@ overdose_threshold = 20 addiction_threshold = 10 pH = 10 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/drug/crank/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -112,6 +111,7 @@ overdose_threshold = 20 addiction_threshold = 15 pH = 9 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M) @@ -167,6 +167,7 @@ var/jitter = TRUE var/confusion = TRUE pH = 5 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) ..() @@ -196,7 +197,7 @@ . = 1 /datum/reagent/drug/methamphetamine/overdose_process(mob/living/M) - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i in 1 to 4) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -223,7 +224,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M) - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 4, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -233,7 +234,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M) - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(20) @@ -250,6 +251,7 @@ overdose_threshold = 35 jitter = FALSE brain_damage = FALSE + value = REAGENT_VALUE_RARE /datum/reagent/drug/bath_salts name = "Bath Salts" @@ -261,6 +263,7 @@ taste_description = "salt" // because they're bathsalts? var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage pH = 8.2 + value = REAGENT_VALUE_RARE /datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L) ..() @@ -285,7 +288,7 @@ M.adjustStaminaLoss(-5, 0) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) M.hallucination += 5 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) step(M, pick(GLOB.cardinals)) step(M, pick(GLOB.cardinals)) ..() @@ -293,7 +296,7 @@ /datum/reagent/drug/bath_salts/overdose_process(mob/living/M) M.hallucination += 5 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i in 1 to 8) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -304,7 +307,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M) M.hallucination += 10 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(5) @@ -315,7 +318,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M) M.hallucination += 20 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(10) @@ -327,7 +330,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M) M.hallucination += 30 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 12, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -339,7 +342,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M) M.hallucination += 30 - if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc)) + if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) for(var/i = 0, i < 16, i++) step(M, pick(GLOB.cardinals)) M.Jitter(50) @@ -353,16 +356,17 @@ /datum/reagent/drug/aranesp name = "Aranesp" - description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage." + description = "Amps you up and gets you going, fixing stamina damage but possibly causing toxin and oxygen damage." reagent_state = LIQUID color = "#78FFF0" pH = 9.2 + value = REAGENT_VALUE_RARE /datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/M) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) to_chat(M, "[high_message]") - M.adjustStaminaLoss(-18, 0) + M.adjustStaminaLoss(-10, 0) M.adjustToxLoss(0.5, 0) if(prob(50)) M.losebreath++ @@ -378,6 +382,7 @@ addiction_threshold = 10 overdose_threshold = 20 pH = 10.5 + value = REAGENT_VALUE_RARE /datum/reagent/drug/happiness/on_mob_add(mob/living/L) ..() @@ -457,32 +462,33 @@ addiction_stage3_end = 40 addiction_stage4_end = 240 pH = 12.5 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/drug/skooma/on_mob_metabolize(mob/living/L) . = ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma) L.next_move_modifier *= 2 if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.physiology) H.physiology.stamina_mod *= 0.5 if(H.dna && H.dna.species) - H.dna.species.punchdamagehigh *= 4 - H.dna.species.punchdamagelow *= 4 - H.dna.species.punchstunthreshold *= 2 + H.dna.species.punchdamagehigh += 4 + H.dna.species.punchdamagelow += 4 + H.dna.species.punchstunthreshold -= 2 /datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L) . = ..() - L.remove_movespeed_modifier(type) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/skooma) L.next_move_modifier *= 0.5 if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.physiology) H.physiology.stamina_mod *= 2 if(H.dna && H.dna.species) - H.dna.species.punchdamagehigh *= 0.25 - H.dna.species.punchdamagelow *= 0.25 - H.dna.species.punchstunthreshold *= 0.5 + H.dna.species.punchdamagehigh -= 4 + H.dna.species.punchdamagelow -= 4 + H.dna.species.punchstunthreshold += 2 /datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM) @@ -521,3 +527,160 @@ if(prob(40)) M.emote(pick("twitch","drool","moan")) ..() + +/datum/reagent/syndicateadrenals + name = "Syndicate Adrenaline" + description = "Regenerates your stamina and increases your reaction time." + color = "#E62111" + overdose_threshold = 6 + value = REAGENT_VALUE_VERY_RARE + +/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M) + M.adjustStaminaLoss(-5*REM) + . = ..() + +/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M) + . = ..() + if(istype(M)) + M.next_move_modifier *= 0.5 + to_chat(M, "You feel an intense surge of energy rushing through your veins.") + +/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M) + . = ..() + if(istype(M)) + M.next_move_modifier *= 2 + to_chat(M, "You feel as though the world around you is going faster.") + +/datum/reagent/syndicateadrenals/overdose_start(mob/living/M) + to_chat(M, "You feel an intense pain in your chest...") + +/datum/reagent/syndicateadrenals/overdose_process(mob/living/M) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!C.undergoing_cardiac_arrest()) + C.set_heartattack(TRUE) + +//aphrodisiac & anaphrodisiac + +/datum/reagent/drug/aphrodisiac + name = "Crocin" + description = "Naturally found in the crocus and gardenia flowers, this drug acts as a natural and safe aphrodisiac." + taste_description = "strawberries" + color = "#FFADFF"//PINK, rgb(255, 173, 255) + can_synth = FALSE + +/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + if((prob(min(current_cycle/2,5)))) + M.emote(pick("moan","blush")) + if(prob(min(current_cycle/4,10))) + var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") + to_chat(M, "[aroused_message]") + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(current_cycle, aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") + ..() + +/datum/reagent/drug/aphrodisiacplus + name = "Hexacrocin" + description = "Chemically condensed form of basic crocin. This aphrodisiac is extremely powerful and addictive in most animals.\ + Addiction withdrawals can cause brain damage and shortness of breath. Overdosage can lead to brain damage and a \ + permanent increase in libido (commonly referred to as 'bimbofication')." + taste_description = "liquid desire" + color = "#FF2BFF"//dark pink + addiction_threshold = 20 + overdose_threshold = 20 + can_synth = FALSE + +/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + if(prob(5)) + if(prob(current_cycle)) + M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn...")) + else + M.emote(pick("moan","blush")) + if(prob(5)) + var/aroused_message + if(current_cycle>25) + aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") + else + aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") + to_chat(M, "[aroused_message]") + REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(100, aphro = TRUE) // redundant but should still be here + for(var/g in genits) + var/obj/item/organ/genital/G = g + to_chat(M, "[G.arousal_verb]!") + ..() + +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) + ..() +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3) + + ..() +/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) + ..() + +/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) + if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) + if(!HAS_TRAIT(M,TRAIT_PERMABONER)) + to_chat(M, "Your libido is going haywire!") + ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) + ..() + +/datum/reagent/drug/anaphrodisiac + name = "Camphor" + description = "Naturally found in some species of evergreen trees, camphor is a waxy substance. When injested by most animals, it acts as an anaphrodisiac\ + , reducing libido and calming them. Non-habit forming and not addictive." + taste_description = "dull bitterness" + taste_mult = 2 + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + can_synth = FALSE + +/datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable && prob(16)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") + ..() + +/datum/reagent/drug/anaphrodisiacplus + name = "Hexacamphor" + description = "Chemically condensed camphor. Causes an extreme reduction in libido and a permanent one if overdosed. Non-addictive." + taste_description = "tranquil celibacy" + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + overdose_threshold = 20 + can_synth = FALSE + +/datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M) + if(M && M.client?.prefs.arousable) + REMOVE_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/list/genits = H.adjust_arousal(-100, aphro = TRUE) + if(genits.len) + to_chat(M, "You no longer feel aroused.") + + ..() + +/datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M) + if(M && M.client?.prefs.arousable && prob(5)) + to_chat(M, "You feel like you'll never feel aroused again...") + ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) + ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index fa30609c54..52fd89e37c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -11,13 +11,15 @@ name = "Consumable" taste_description = "generic food" taste_mult = 4 - value = 0.1 + value = REAGENT_VALUE_VERY_COMMON var/nutriment_factor = 1 * REAGENTS_METABOLISM + var/max_nutrition = INFINITY var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) current_cycle++ - M.nutrition += nutriment_factor + M.adjust_nutrition(nutriment_factor, max_nutrition) + M.CheckBloodsuckerEatFood(nutriment_factor) holder.remove_reagent(type, metabolization_rate) /datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -32,15 +34,15 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_verygood) if (DRINK_FANTASTIC) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_fantastic) - if (FOOD_AMAZING) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_food", /datum/mood_event/amazingtaste) + if (RACE_DRINK) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/race_drink) return ..() /datum/reagent/consumable/nutriment name = "Nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 10 * REAGENTS_METABOLISM color = "#664330" // rgb: 102, 67, 48 var/brute_heal = 1 @@ -89,8 +91,8 @@ /datum/reagent/consumable/nutriment/vitamin name = "Vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." - value = 0.5 - + value = REAGENT_VALUE_COMMON + nutriment_factor = 15 * REAGENTS_METABOLISM //The are the best food for you! brute_heal = 1 burn_heal = 1 @@ -104,9 +106,9 @@ description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) taste_mult = 0.8 - value = 1 + value = REAGENT_VALUE_COMMON taste_description = "oil" - nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own + nutriment_factor = 5 * REAGENTS_METABOLISM //Not very healthy on its own metabolization_rate = 10 * REAGENTS_METABOLISM var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world var/boiling //Used in mob life to determine if the oil kills, and only on touch application @@ -150,11 +152,11 @@ reagent_state = SOLID color = "#FFFFFF" // rgb: 255, 255, 255 taste_mult = 1.5 // stop sugar drowning out other flavours - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 3 * REAGENTS_METABOLISM metabolization_rate = 2 * REAGENTS_METABOLISM overdose_threshold = 200 // Hyperglycaemic shock taste_description = "sweetness" - value = 1 + value = REAGENT_VALUE_NONE /datum/reagent/consumable/sugar/overdose_start(mob/living/M) to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!") @@ -176,21 +178,21 @@ /datum/reagent/consumable/soysauce name = "Soysauce" description = "A salty sauce made from the soy plant." - nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" // rgb: 121, 35, 0 taste_description = "umami" + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/ketchup name = "Ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 3 * REAGENTS_METABOLISM color = "#731008" // rgb: 115, 16, 8 taste_description = "ketchup" /datum/reagent/consumable/mustard name = "Mustard" description = "Mustard, mostly used on hotdogs, corndogs and burgers." - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 3 * REAGENTS_METABOLISM color = "#DDED26" // rgb: 221, 237, 38 taste_description = "mustard" @@ -230,7 +232,7 @@ description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" - value = 2 + value = REAGENT_VALUE_COMMON pH = 13 //HMM! I wonder /datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M) @@ -375,14 +377,13 @@ name = "Coco Powder" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM + nutriment_factor = 3 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 taste_description = "bitterness" /datum/reagent/consumable/hot_coco name = "Hot Chocolate" description = "Made with love! And coco beans." - nutriment_factor = 3 * REAGENTS_METABOLISM color = "#660000" // rgb: 221, 202, 134 taste_description = "creamy chocolate" glass_icon_state = "chocolateglass" @@ -400,6 +401,7 @@ metabolization_rate = 0.2 * REAGENTS_METABOLISM taste_description = "mushroom" pH = 11 + value = REAGENT_VALUE_COMMON /datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/M) M.slurring = max(M.slurring,50) @@ -423,12 +425,57 @@ M.emote(pick("twitch","giggle")) ..() +/datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. + name = "Garlic Juice" + //id = "garlic" + description = "Crushed garlic. Chefs love it, but it can make you smell bad." + color = "#FEFEFE" + taste_description = "garlic" + metabolization_rate = 0.15 * REAGENTS_METABOLISM + value = REAGENT_VALUE_COMMON + +/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M) + if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(prob(min(25, current_cycle))) + to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...") + M.Stun(10) + M.Jitter(10) + return + + else if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.job == "Cook") + if(prob(20)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate + H.heal_bodypart_damage(1, 1, 0) + . = 1 + ..() + +/datum/reagent/consumable/garlic/reaction_mob(mob/living/M, method, reac_volume) + if(AmBloodsucker(M, TRUE)) //Theyll be immune to garlic as long as they masquarade, but they cant do it if they already have it. + switch(method) + if(INGEST) + if(prob(min(30, current_cycle))) + to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") + M.Jitter(15) + if(prob(min(15, current_cycle))) + M.visible_message("Something you ate is burning your stomach!", "[M] clutches their stomach and falls to the ground!") + M.Knockdown(20) + M.emote("scream") + if(prob(min(5, current_cycle)) && iscarbon(M)) + var/mob/living/carbon/C + C.vomit() + if(INJECT) + if(prob(min(20, current_cycle))) + to_chat(M, "You feel like your veins are boiling!") + M.emote("scream") + M.adjustFireLoss(5) + ..() /datum/reagent/consumable/sprinkles name = "Sprinkles" - value = 3 description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." color = "#FF00FF" // rgb: 255, 0, 255 taste_description = "childhood whimsy" + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) @@ -440,15 +487,15 @@ name = "Peanut Butter" description = "A popular food paste made from ground dry-roasted peanuts." color = "#C29261" - value = 3 - nutriment_factor = 15 * REAGENTS_METABOLISM + value = REAGENT_VALUE_UNCOMMON + nutriment_factor = 10 * REAGENTS_METABOLISM taste_description = "peanuts" /datum/reagent/consumable/cornoil name = "Corn Oil" description = "An oil derived from various types of corn." - nutriment_factor = 20 * REAGENTS_METABOLISM - value = 4 + nutriment_factor = 12 * REAGENTS_METABOLISM + value = REAGENT_VALUE_UNCOMMON color = "#302000" // rgb: 48, 32, 0 taste_description = "slime" @@ -466,7 +513,7 @@ /datum/reagent/consumable/enzyme name = "Universal Enzyme" - value = 1 + value = REAGENT_VALUE_COMMON description = "A universal enzyme used in the preperation of certain chemicals and foods." color = "#365E30" // rgb: 54, 94, 48 taste_description = "sweetness" @@ -502,7 +549,6 @@ /datum/reagent/consumable/flour name = "Flour" - value = 0.5 description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 @@ -519,19 +565,18 @@ name = "Cherry Jelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 - value = 1 + value = REAGENT_VALUE_COMMON taste_description = "cherry" /datum/reagent/consumable/bluecherryjelly name = "Blue Cherry Jelly" description = "Blue and tastier kind of cherry jelly." color = "#00F0FF" - value = 12 + value = REAGENT_VALUE_UNCOMMON taste_description = "blue cherry" /datum/reagent/consumable/rice name = "Rice" - value = 0.5 description = "tiny nutritious grains" reagent_state = SOLID nutriment_factor = 3 * REAGENTS_METABOLISM @@ -540,7 +585,7 @@ /datum/reagent/consumable/vanilla name = "Vanilla Powder" - value = 1 + value = REAGENT_VALUE_UNCOMMON description = "A fatty, bitter paste made from vanilla pods." reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM @@ -549,7 +594,6 @@ /datum/reagent/consumable/eggyolk name = "Egg Yolk" - value = 1 description = "It's full of protein." nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFB500" @@ -557,14 +601,13 @@ /datum/reagent/consumable/corn_starch name = "Corn Starch" - value = 2 description = "A slippery solution." color = "#f7f6e4" taste_description = "slime" /datum/reagent/consumable/corn_syrup name = "Corn Syrup" - value = 1 + value = REAGENT_VALUE_UNCOMMON description = "Decays into sugar." color = "#fff882" metabolization_rate = 3 * REAGENTS_METABOLISM @@ -578,8 +621,8 @@ name = "honey" description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" - value = 15 - nutriment_factor = 15 * REAGENTS_METABOLISM + value = REAGENT_VALUE_COMMON + nutriment_factor = 10 * REAGENTS_METABOLISM metabolization_rate = 1 * REAGENTS_METABOLISM taste_description = "sweetness" @@ -606,6 +649,7 @@ color = "#DFDFDF" value = 5 taste_description = "mayonnaise" + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/tearjuice name = "Tear Juice" @@ -613,6 +657,7 @@ color = "#c0c9a0" taste_description = "bitterness" pH = 5 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/tearjuice/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(!istype(M)) @@ -649,13 +694,11 @@ name = "Stabilized Nutriment" description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM + nutriment_factor = 12 * REAGENTS_METABOLISM + max_nutrition = NUTRITION_LEVEL_FULL - 25 color = "#664330" // rgb: 102, 67, 48 + value = REAGENT_VALUE_RARE -/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M) - if(M.nutrition > NUTRITION_LEVEL_FULL - 25) - M.nutrition -= 3*nutriment_factor - ..() ////Lavaland Flora Reagents//// @@ -666,6 +709,7 @@ color = "#1d043d" taste_description = "bitter mushroom" pH = 12 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M) if(current_cycle >= 10) @@ -686,6 +730,7 @@ color = "#b5a213" taste_description = "tingling mushroom" pH = 11.2 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/tinlux/reaction_mob(mob/living/M) M.set_light(2) @@ -700,6 +745,7 @@ nutriment_factor = 3 * REAGENTS_METABOLISM taste_description = "fruity mushroom" pH = 10.4 + value = REAGENT_VALUE_RARE /datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M) if(prob(80)) @@ -760,11 +806,12 @@ /datum/reagent/consumable/caramel name = "Caramel" description = "Who would have guessed that heated sugar could be so delicious?" - nutriment_factor = 10 * REAGENTS_METABOLISM + nutriment_factor = 4 * REAGENTS_METABOLISM color = "#D98736" taste_mult = 2 taste_description = "caramel" reagent_state = SOLID + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/secretsauce name = "secret sauce" @@ -772,10 +819,20 @@ nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" taste_description = "indescribable" - quality = FOOD_AMAZING taste_mult = 100 can_synth = FALSE pH = 6.1 + value = REAGENT_VALUE_AMAZING + +/datum/reagent/consumable/secretsauce/reaction_obj(obj/O, reac_volume) + //splashing any amount above or equal to 1u of secret sauce onto a piece of food turns its quality to 100 + if(reac_volume >= 1 && isfood(O)) + var/obj/item/reagent_containers/food/splashed_food = O + splashed_food.adjust_food_quality(100) + // if it's a customisable food, we need to edit its total quality too, to prevent its quality resetting from adding more ingredients! + if(istype(O, /obj/item/reagent_containers/food/snacks/customizable)) + var/obj/item/reagent_containers/food/snacks/customizable/splashed_custom_food = O + splashed_custom_food.total_quality += 10000 /datum/reagent/consumable/char name = "Char" @@ -786,6 +843,7 @@ taste_mult = 6 taste_description = "smoke" overdose_threshold = 25 + value = REAGENT_VALUE_COMMON /datum/reagent/consumable/char/overdose_process(mob/living/carbon/M) if(prob(10)) @@ -798,3 +856,14 @@ color = "#78280A" // rgb: 120 40, 10 taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground. taste_description = "smokey sweetness" + value = REAGENT_VALUE_COMMON + +/datum/reagent/consumable/laughsyrup + name = "Laughin' Syrup" + description = "The product of juicing Laughin' Peas. Fizzy, and seems to change flavour based on what it's used with!" + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#803280" + taste_mult = 2 + taste_description = "fizzy sweetness" + value = REAGENT_VALUE_COMMON + \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 46002287dd..0f53add567 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -7,8 +7,8 @@ /datum/reagent/medicine name = "Medicine" - value = 2 taste_description = "bitterness" + value = REAGENT_VALUE_VERY_COMMON //Low prices, spess medical companies are cheapstakes and products are taxed honk... /datum/reagent/medicine/on_mob_life(mob/living/carbon/M) current_cycle++ @@ -19,6 +19,7 @@ description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." pH = 8.4 color = "#82b8aa" + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_NORMAL) @@ -33,6 +34,7 @@ color = "#ffffff" can_synth = FALSE taste_description = "badmins" + value = REAGENT_VALUE_GLORIOUS /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M) M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) @@ -101,6 +103,7 @@ description = "Reduces drowsiness, hallucinations, and Histamine from body." color = "#EC536D" // rgb: 236, 83, 109 pH = 5.2 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) @@ -131,6 +134,7 @@ color = "#0000C8" taste_description = "sludge" pH = 11 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) var/power = -0.00003 * (M.bodytemperature ** 2) + 3 @@ -152,6 +156,7 @@ taste_description = "muscle" metabolization_rate = 1.5 * REAGENTS_METABOLISM pH = 13 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature < T0C) @@ -167,6 +172,7 @@ color = "#f7832a" taste_description = "spicy jelly" pH = 12 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -198,7 +204,7 @@ overdose_threshold = 30 taste_description = "fish" pH = 12.2 - value = 20 + value = REAGENT_VALUE_RARE /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. @@ -239,7 +245,13 @@ color = "#ffeac9" metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 - value = 3 + +/datum/reagent/medicine/silver_sulfadiazine/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/stack/medical/gauze)) + var/obj/item/stack/medical/gauze/G = O + reac_volume = min((reac_volume / 10), G.amount) + new/obj/item/stack/medical/mesh(get_turf(G), reac_volume) + G.use(reac_volume) /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -262,10 +274,14 @@ /datum/reagent/medicine/silver_sulfadiazine/overdose_start(mob/living/M) metabolization_rate = 15 * REAGENTS_METABOLISM - M.adjustBruteLoss(2*REM, 0) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.applyLiverDamage(1) + ..() + . = 1 + +/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M) + M.adjustFireLoss(2*REM, 0) + var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) + if(L) + L.applyOrganDamage(1) ..() . = 1 @@ -277,7 +293,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 pH = 10.7 - value = 4 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 25) @@ -301,7 +317,6 @@ pH = 6.7 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 - value = 3 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -317,18 +332,28 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) ..() +/datum/reagent/medicine/styptic_powder/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/stack/medical/gauze)) + var/obj/item/stack/medical/gauze/G = O + reac_volume = min((reac_volume / 10), G.amount) + new/obj/item/stack/medical/suture(get_turf(G), reac_volume) + G.use(reac_volume) /datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-2*REM, 0) ..() . = 1 -datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) +/datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 15 * REAGENTS_METABOLISM + ..() + . = 1 + +/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M) M.adjustBruteLoss(2*REM, 0) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.applyLiverDamage(1) + var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) + if(L) + L.applyOrganDamage(1) ..() . = 1 @@ -343,7 +368,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active pH = 5.5 - value = 1 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if((HAS_TRAIT(M, TRAIT_NOMARROW))) @@ -384,6 +408,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#6D6374" metabolization_rate = 0.4 * REAGENTS_METABOLISM pH = 2.6 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C) C.hal_screwyhud = SCREWYHUD_HEALTHY @@ -396,7 +421,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/mine_salve/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) if(method in list(INGEST, VAPOR, INJECT)) - M.nutrition -= 5 + M.adjust_nutrition(-5) if(show_message) to_chat(M, "Your stomach feels empty and cramps!") else @@ -424,7 +449,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) pH = 11.5 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 40 - value = 6 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M)) @@ -461,7 +486,6 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "ash" pH = 5 - value = 1 /datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) @@ -480,7 +504,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 pH = 2 - value = 5 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-0.5*REM, 0) @@ -537,6 +561,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#003153" // RGB 0, 49, 83 metabolization_rate = 0.5 * REAGENTS_METABOLISM pH = 8.9 + value = REAGENT_VALUE_COMMON //uncraftable /datum/reagent/medicine/prussian_blue/on_mob_life(mob/living/carbon/M) if(M.radiation > 0) @@ -550,6 +575,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#E6FFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM pH = 1 //One of the best buffers, NEVERMIND! + value = REAGENT_VALUE_UNCOMMON var/healtoxinlover = FALSE /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) @@ -568,6 +594,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#91D865" healtoxinlover = TRUE pH = 12//invert + value = REAGENT_VALUE_RARE /datum/reagent/medicine/sal_acid name = "Salicyclic Acid" @@ -577,6 +604,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 pH = 2.1 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) @@ -688,6 +716,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#64FFE6" metabolization_rate = 0.5 * REAGENTS_METABOLISM pH = 11.5 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -708,10 +737,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L) ..() - L.ignore_slowdown(type) + L.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod)) /datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L) - L.unignore_slowdown(type) + L.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod)) ..() /datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M) @@ -803,6 +832,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 35 pH = 12 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) if(M.health < 0) @@ -867,6 +897,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "magnets" pH = 0 + value = REAGENT_VALUE_RARE /datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.stat == DEAD) @@ -990,14 +1021,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 pH = 8.7 + value = REAGENT_VALUE_RARE /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(type) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) ..() @@ -1154,6 +1186,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) reagent_state = LIQUID color = "#91D865" taste_description = "jelly" + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-1.5*REM, FALSE) @@ -1169,6 +1202,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) reagent_state = SOLID color = "#555555" pH = 11 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment. @@ -1189,17 +1223,18 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) reagent_state = SOLID color = "#555555" pH = 11 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-3*REM, FALSE) // hidden gold shh - M.adjustFireLoss(-3*REM, FALSE) - M.adjustOxyLoss(-15, FALSE) - M.adjustToxLoss(-3*REM, FALSE) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) - M.adjustCloneLoss(-3*REM, FALSE) - M.adjustStaminaLoss(-20*REM,FALSE) + M.adjustBruteLoss(-2*REM, FALSE) + M.adjustFireLoss(-2*REM, FALSE) + M.adjustOxyLoss(-5*REM, FALSE) + M.adjustToxLoss(-2*REM, FALSE) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5*REM) + M.adjustCloneLoss(-1.25*REM, FALSE) + M.adjustStaminaLoss(-4*REM,FALSE) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 20 // blood fall out man bad + M.blood_volume += 3 ..() . = 1 @@ -1212,6 +1247,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) overdose_threshold = 30 taste_description = "jelly" pH = 11.8 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-1.5*REM, FALSE) @@ -1234,6 +1270,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = rgb(255, 175, 0) overdose_threshold = 25 pH = 11 + value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already. /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-3 * REM, FALSE) @@ -1261,6 +1298,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) color = "#27870a" metabolization_rate = 0.4 * REAGENTS_METABOLISM pH = 4.3 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/drug/R in M.reagents.reagent_list) @@ -1283,6 +1321,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent can_synth = FALSE pH = 14 + value = REAGENT_VALUE_AMAZING /datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M) M.heal_bodypart_damage(5,5) @@ -1302,6 +1341,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." color = "#918e53" overdose_threshold = 30 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) ..() @@ -1329,13 +1369,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) description = "Drastically increases movement speed, but deals toxin damage." color = "#669153" metabolization_rate = 1 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) /datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(type) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) ..() /datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) @@ -1365,14 +1406,15 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/muscle_stimulant name = "Muscle Stimulant" description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." + value = REAGENT_VALUE_RARE /datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/M) . = ..() - M.ignore_slowdown(type) + M.add_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod)) /datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/M) . = ..() - M.unignore_slowdown(type) + M.remove_movespeed_mod_immunities(type, list(/datum/movespeed_modifier/damage_slowdown, /datum/movespeed_modifier/damage_slowdown_flying, /datum/movespeed_modifier/monkey_health_speedmod)) /datum/reagent/medicine/modafinil name = "Modafinil" @@ -1382,6 +1424,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.1 * REAGENTS_METABOLISM overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) taste_description = "salt" // it actually does taste salty + value = REAGENT_VALUE_RARE var/overdose_progress = 0 // to track overdose progress pH = 7.89 @@ -1448,6 +1491,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 pH = 9.12 + value = REAGENT_VALUE_COMMON /datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) ..() @@ -1480,6 +1524,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) reagent_state = SOLID color = "#FFFFD0" metabolization_rate = 1.5 * REAGENTS_METABOLISM + value = REAGENT_VALUE_UNCOMMON /datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented. @@ -1494,6 +1539,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 50 taste_description = "numbing bitterness" + value = REAGENT_VALUE_RARE /datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) @@ -1517,3 +1563,20 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) ..() . = 1 + +/datum/reagent/medicine/liquid_wisdom + name = "liquid wisdom" + description = "the physical representation of wisdom, in liquid form" + taste_mult = 4 + can_synth = FALSE + overdose_threshold = 30 + value = REAGENT_VALUE_UNCOMMON // while it's 'rare', it can be milked from the wisdom cow + +/datum/reagent/medicine/liquid_wisdom/on_mob_life(mob/living/carbon/C) //slightly stronger mannitol, from the wisdom cow + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) + if(prob(20)) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) + if(prob(3)) + to_chat(C, "[pick(GLOB.wisdoms)]") //give them a random wisdom + ..() + diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 1fbb3cc346..117748afc0 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,7 +1,7 @@ /datum/reagent/blood data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) name = "Blood" - value = 1 + value = REAGENT_VALUE_UNCOMMON // $$$ blood ""donations"" $$$ color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0 description = "Blood from some creature." metabolization_rate = 5 //fast rate so it disappears fast. @@ -140,8 +140,9 @@ data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) name = "Synthetic Blood" description = "A synthetically produced imitation of blood." - taste_description = "oily" + taste_description = "oil" color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48 + value = REAGENT_VALUE_NONE /datum/reagent/blood/jellyblood data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) @@ -158,6 +159,7 @@ description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency." taste_description = "sap" //Like tree sap? pH = 7.45 + value = REAGENT_VALUE_NONE /datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -271,9 +273,9 @@ /datum/reagent/water/reaction_obj(obj/O, reac_volume) O.extinguish() O.acid_level = 0 - // Monkey cube - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O + // cubes + if(istype(O, /obj/item/reagent_containers/food/snacks/cube)) + var/obj/item/reagent_containers/food/snacks/cube/cube = O cube.Expand() // Dehydrated carp @@ -332,7 +334,7 @@ data = list("misc" = 1) data["misc"]++ M.jitteriness = min(M.jitteriness+4,10) - if(iscultist(M)) + if(iscultist(M, FALSE, TRUE)) for(var/datum/action/innate/cult/blood_magic/BM in M.actions) if(!BM.holy_dispel) BM.holy_dispel = TRUE @@ -361,7 +363,7 @@ if("emote") M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")].") if(data["misc"] >= 60) // 30 units, 135 seconds - if(iscultist(M) || is_servant_of_ratvar(M)) + if(iscultist(M, FALSE, TRUE) || is_servant_of_ratvar(M, FALSE, TRUE)) if(iscultist(M)) SSticker.mode.remove_cultist(M.mind, FALSE, TRUE) else if(is_servant_of_ratvar(M)) @@ -387,6 +389,7 @@ description = "Something that shouldn't exist on this plane of existence." taste_description = "suffering" pH = 6.5 + value = REAGENT_VALUE_RARE /datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -423,6 +426,7 @@ name = "Hell Water" description = "YOUR FLESH! IT BURNS!" taste_description = "burning" + value = REAGENT_VALUE_VERY_RARE /datum/reagent/hellwater/on_mob_life(mob/living/carbon/M) M.fire_stacks = min(5,M.fire_stacks + 3) @@ -437,6 +441,7 @@ name = "Zelus Oil" description = "Oil blessed by a greater being." taste_description = "metallic oil" + value = REAGENT_VALUE_RARE /datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M) if(is_servant_of_ratvar(M)) @@ -475,6 +480,7 @@ name = "Godblood" description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." overdose_threshold = 150 + value = REAGENT_VALUE_RARE /datum/reagent/lube name = "Space Lube" @@ -507,93 +513,83 @@ /datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(ishuman(M)) if(method == PATCH || method == VAPOR) - var/mob/living/carbon/human/N = M - if(N.dna.species.id == "human") - switch(N.skin_tone) - if("african1") - N.skin_tone = "african2" - if("indian") - N.skin_tone = "african1" - if("arab") - N.skin_tone = "indian" - if("asian2") - N.skin_tone = "arab" - if("asian1") - N.skin_tone = "asian2" - if("mediterranean") - N.skin_tone = "african1" - if("latino") - N.skin_tone = "mediterranean" - if("caucasian3") - N.skin_tone = "mediterranean" - if("caucasian2") - N.skin_tone = pick("caucasian3", "latino") - if("caucasian1") - N.skin_tone = "caucasian2" - if ("albino") - N.skin_tone = "caucasian1" + var/mob/living/carbon/human/H = M + if(H.dna.species.use_skintones) + if(!H.dna.skin_tone_override) + var/diff_len = length(GLOB.skin_tones - GLOB.nonstandard_skin_tones) + H.skin_tone = GLOB.skin_tones[min(diff_len, GLOB.skin_tones.Find(H.skin_tone) + 1)] + else + H.skin_tone = H.dna.skin_tone_override = tan_mutant_color(H.dna.skin_tone_override, "#202020") + if(MUTCOLORS in H.dna.species.species_traits) //take current alien color and darken it slightly + H.dna.features["mcolor"] = tan_mutant_color(H.dna.features["mcolor"]) + H.update_body() - if(MUTCOLORS in N.dna.species.species_traits) //take current alien color and darken it slightly - var/newcolor = "" - var/string = N.dna.features["mcolor"] - var/len = length(string) - var/char = "" - var/ascii = 0 - for(var/i=1, i<=len, i += length(char)) - char = string[i] - ascii = text2ascii(char) - switch(ascii) - if(48) - newcolor += "0" - if(49 to 57) - newcolor += ascii2text(ascii-1) //numbers 1 to 9 - if(97) - newcolor += "9" - if(98 to 102) - newcolor += ascii2text(ascii-1) //letters b to f lowercase - if(65) - newcolor += "9" - if(66 to 70) - newcolor += ascii2text(ascii+31) //letters B to F - translates to lowercase - else - break - if(ReadHSV(newcolor)[3] >= ReadHSV("#7F7F7F")[3]) - N.dna.features["mcolor"] = newcolor - N.regenerate_icons() + if(method == INGEST) + if(show_message) + to_chat(M, "That tasted horrible.") + return ..() +/datum/reagent/spraytan/proc/tan_mutant_color(color, limit = "#7F7F7F") + var/newcolor = "" + var/len = length(color) + var/char = "" + var/ascii = 0 + for(var/i=1, i<=len, i += length(char)) + char = color[i] + ascii = text2ascii(char) + switch(ascii) + if(35) + newcolor += "#" + if(48) + newcolor += "0" + if(49 to 57) + newcolor += ascii2text(ascii-1) //numbers 1 to 9 + if(97) + newcolor += "9" + if(98 to 102) + newcolor += ascii2text(ascii-1) //letters b to f lowercase + if(65) + newcolor += "9" + if(66 to 70) + newcolor += ascii2text(ascii+31) //letters B to F - translates to lowercase + else + break + if(ReadHSV(newcolor)[3] >= ReadHSV(limit)[3]) + return newcolor + return color - if(method == INGEST) - if(show_message) - to_chat(M, "That tasted horrible.") - ..() - +/datum/reagent/spraytan/overdose_start(mob/living/M) + . = ..() + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.hair_style = "Spiky" + H.facial_hair_style = "Shaved" + H.facial_hair_color = "000" + H.hair_color = "000" + if(!(HAIR in H.dna.species.species_traits)) //No hair? No problem! + H.dna.species.species_traits += HAIR + if(H.dna.species.use_skintones) + if(H.dna.skin_tone_override) + H.skin_tone = H.dna.skin_tone_override = "#FF8800" + else + H.skin_tone = "orange" + else if(MUTCOLORS in H.dna.species.species_traits) //Aliens with custom colors simply get turned orange + H.dna.features["mcolor"] = "f80" + H.update_body() /datum/reagent/spraytan/overdose_process(mob/living/M) metabolization_rate = 1 * REAGENTS_METABOLISM - if(ishuman(M)) - var/mob/living/carbon/human/N = M - N.hair_style = "Spiky" - N.facial_hair_style = "Shaved" - N.facial_hair_color = "000" - N.hair_color = "000" - if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem! - N.dna.species.species_traits += HAIR - if(N.dna.species.use_skintones) - N.skin_tone = "orange" - else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange - N.dna.features["mcolor"] = "f80" - N.regenerate_icons() + var/mob/living/carbon/human/H = M if(prob(7)) - if(N.w_uniform) - M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.p_their()] arms.")) + if(H.w_uniform) + H.visible_message(pick("[H]'s collar pops up without warning.", "[H] flexes [H.p_their()] arms.")) else - M.visible_message("[M] flexes [M.p_their()] arms.") + H.visible_message("[H] flexes [H.p_their()] arms.") if(prob(10)) M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = "spraytan") - ..() - return + return ..() /datum/reagent/mutationtoxin name = "Stable Mutation Toxin" @@ -601,6 +597,7 @@ color = "#5EFF3B" //RGB: 94, 255, 59 metabolization_rate = INFINITY //So it instantly removes all of itself taste_description = "slime" + value = REAGENT_VALUE_RARE var/datum/species/race = /datum/species/human var/mutationtext = "The pain subsides. You feel... human." @@ -760,6 +757,7 @@ color = "#5EFF3B" //RGB: 94, 255, 59 taste_description = "slime" metabolization_rate = 0.2 + value = REAGENT_VALUE_RARE /datum/reagent/slime_toxin/on_mob_life(mob/living/carbon/human/H) ..() @@ -796,6 +794,7 @@ color = "#5EFF3B" //RGB: 94, 255, 59 metabolization_rate = INFINITY taste_description = "slime" + value = REAGENT_VALUE_RARE /datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/H) ..() @@ -810,6 +809,7 @@ description = "An advanced corruptive toxin produced by slimes." color = "#13BC5E" // rgb: 19, 188, 94 taste_description = "slime" + value = REAGENT_VALUE_VERY_RARE /datum/reagent/aslimetoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) if(method != TOUCH) @@ -821,6 +821,7 @@ color = "#5EFF3B" //RGB: 94, 255, 59 can_synth = FALSE taste_description = "decay" + value = REAGENT_VALUE_GLORIOUS /datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) @@ -1044,6 +1045,14 @@ // +20% success propability on each step, useful while operating in less-than-perfect conditions ..() +/datum/reagent/space_cleaner/sterilizine/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/stack/medical/gauze)) + var/obj/item/stack/medical/gauze/G = O + reac_volume = min((reac_volume / 10), G.amount) + new/obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume) + G.use(reac_volume) + + /datum/reagent/iron name = "Iron" description = "Pure iron is a metal." @@ -1070,11 +1079,11 @@ to_chat(M, "You start feeling your guts twisting painfully!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) -/datum/reagent/iron/overdose_process(mob/living/carbon/C) +/datum/reagent/iron/overdose_process(mob/living/M) if(prob(20)) - var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) - if (istype(L)) - C.applyLiverDamage(2) //mild until the fabled med rework comes out. the organ damage galore + var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) + if(L) + L.applyOrganDamage(2) ..() /datum/reagent/gold @@ -1123,6 +1132,7 @@ color = "#0000CC" taste_description = "fizzling blue" pH = 12 + value = REAGENT_VALUE_RARE /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1249,6 +1259,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "acid" pH = 2 + value = REAGENT_VALUE_RARE /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(3.33) @@ -1300,6 +1311,7 @@ color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE taste_description = "sludge" + value = REAGENT_VALUE_GLORIOUS /datum/reagent/nanomachines/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -1311,6 +1323,7 @@ color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE taste_description = "sludge" + value = REAGENT_VALUE_GLORIOUS /datum/reagent/xenomicrobes/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -1323,6 +1336,7 @@ can_synth = FALSE taste_description = "slime" pH = 11 + value = REAGENT_VALUE_GLORIOUS /datum/reagent/fungalspores/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -1350,6 +1364,7 @@ color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" pH = 11.8 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/ammonia name = "Ammonia" @@ -1427,6 +1442,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM color = "E1A116" taste_description = "sourness" + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/stimulum/on_mob_metabolize(mob/living/L) ..() @@ -1452,13 +1468,14 @@ color = "90560B" taste_description = "burning" pH = 2 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/nitryl/on_mob_metabolize(mob/living/L) ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl) /datum/reagent/nitryl/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(type) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitryl) ..() /////////////////////////Coloured Crayon Powder//////////////////////////// @@ -1473,6 +1490,7 @@ color = "#FFFFFF" // rgb: 207, 54, 0 taste_description = "the back of class" no_mob_color = TRUE + value = REAGENT_VALUE_NONE /datum/reagent/colorful_reagent/crayonpowder/New() description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." @@ -1643,6 +1661,7 @@ color = "#FFFF00" var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") taste_description = "rainbows" + value = REAGENT_VALUE_RARE var/no_mob_color = FALSE /datum/reagent/colorful_reagent/on_mob_life(mob/living/carbon/M) @@ -1672,6 +1691,7 @@ color = "#ff00dd" var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code taste_description = "sourness" + value = REAGENT_VALUE_RARE /datum/reagent/hair_dye/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1687,6 +1707,7 @@ reagent_state = LIQUID color = "#fac34b" taste_description = "sourness" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1704,6 +1725,7 @@ reagent_state = LIQUID color = "#ffaf00" taste_description = "sourness" + value = REAGENT_VALUE_RARE /datum/reagent/concentrated_barbers_aid/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1713,6 +1735,22 @@ H.facial_hair_style = "Very Long Beard" H.update_hair() +/datum/reagent/baldium + name = "Baldium" + description = "A major cause of hair loss across the world." + reagent_state = LIQUID + color = "#ecb2cf" + taste_description = "bitterness" + +/datum/reagent/baldium/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH || method == VAPOR) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + to_chat(H, "Your hair is falling out in clumps!") + H.hair_style = "Bald" + H.facial_hair_style = "Shaved" + H.update_hair() + /datum/reagent/saltpetre name = "Saltpetre" description = "Volatile. Controversial. Third Thing." @@ -1736,6 +1774,7 @@ color = "#A70FFF" taste_description = "dryness" pH = 10.7 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/drying_agent/reaction_turf(turf/open/T, reac_volume) if(istype(T)) @@ -1873,6 +1912,7 @@ color = "#00ff80" taste_description = "strange honey" pH = 3 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M) if(prob(2)) @@ -1894,6 +1934,7 @@ can_synth = FALSE taste_description = "brains" pH = 0.5 + value = REAGENT_VALUE_GLORIOUS /datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method=TOUCH, reac_volume) // Silently add the zombie infection organ to be activated upon death @@ -1907,6 +1948,7 @@ description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." reagent_state = LIQUID color = "#00f041" + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/magillitis/on_mob_life(mob/living/carbon/M) ..() @@ -1917,22 +1959,23 @@ name = "Growth Serum" description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant color = "#ff0000"//strong red. rgb 255, 0, 0 - var/current_size = 1 + var/current_size = RESIZE_DEFAULT_SIZE + value = REAGENT_VALUE_COMMON taste_description = "bitterness" // apparently what viagra tastes like /datum/reagent/growthserum/on_mob_life(mob/living/carbon/H) var/newsize = current_size switch(volume) if(0 to 19) - newsize = 1.25 + newsize = 1.25*RESIZE_DEFAULT_SIZE if(20 to 49) - newsize = 1.5 + newsize = 1.5*RESIZE_DEFAULT_SIZE if(50 to 99) - newsize = 2 + newsize = 2*RESIZE_DEFAULT_SIZE if(100 to 199) - newsize = 2.5 + newsize = 2.5*RESIZE_DEFAULT_SIZE if(200 to INFINITY) - newsize = 3.5 + newsize = 3.5*RESIZE_DEFAULT_SIZE H.resize = newsize/current_size current_size = newsize @@ -1940,7 +1983,8 @@ ..() /datum/reagent/growthserum/on_mob_end_metabolize(mob/living/M) - M.resize = 1/current_size + M.resize = RESIZE_DEFAULT_SIZE/current_size + current_size = RESIZE_DEFAULT_SIZE M.update_transform() ..() @@ -1987,6 +2031,7 @@ color = "#AAAAAA55" taste_description = "water" metabolization_rate = 0.25 * REAGENTS_METABOLISM + value = REAGENT_VALUE_RARE pH = 15 /datum/reagent/pax/on_mob_metabolize(mob/living/L) @@ -2003,6 +2048,7 @@ color = "#FAFF00" taste_description = "acrid cinnamon" metabolization_rate = 0.2 * REAGENTS_METABOLISM + value = REAGENT_VALUE_UNCOMMON /datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/L) ..() @@ -2023,18 +2069,20 @@ name = "synth-pax" description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax." metabolization_rate = 1.5 * REAGENTS_METABOLISM + value = REAGENT_VALUE_COMMON /datum/reagent/peaceborg_confuse name = "Dizzying Solution" description = "Makes the target off balance and dizzy" metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "dizziness" + value = REAGENT_VALUE_COMMON /datum/reagent/peaceborg_confuse/on_mob_life(mob/living/carbon/M) if(M.confused < 6) - M.confused = CLAMP(M.confused + 3, 0, 5) + M.confused = clamp(M.confused + 3, 0, 5) if(M.dizziness < 6) - M.dizziness = CLAMP(M.dizziness + 3, 0, 5) + M.dizziness = clamp(M.dizziness + 3, 0, 5) if(prob(20)) to_chat(M, "You feel confused and disorientated.") ..() @@ -2044,6 +2092,7 @@ description = "An extremely weak stamina-toxin that tires out the target. Completely harmless." metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "tiredness" + value = REAGENT_VALUE_COMMON /datum/reagent/peaceborg_tire/on_mob_life(mob/living/carbon/M) var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS. @@ -2059,6 +2108,7 @@ color = "#9A6750" //RGB: 154, 103, 80 taste_description = "inner peace" can_synth = FALSE + value = REAGENT_VALUE_GLORIOUS /datum/reagent/tranquility/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -2069,6 +2119,7 @@ description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results." color = "#FAEAFF" taste_description = "synthetic catnip" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/moonsugar/on_mob_life(mob/living/carbon/M) if(prob(20)) @@ -2085,6 +2136,7 @@ var/datum/dna/original_dna var/reagent_ticks = 0 chemical_flags = REAGENT_INVISIBLE + value = REAGENT_VALUE_GLORIOUS /datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C) if(ishuman(C) && C.dna && data["desired_dna"]) @@ -2120,6 +2172,7 @@ taste_description = "grass" description = "A colorless liquid that makes people more peaceful and felines more happy." metabolization_rate = 1.75 * REAGENTS_METABOLISM + value = REAGENT_VALUE_COMMON /datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M) if(prob(20)) @@ -2141,3 +2194,94 @@ reagent_state = LIQUID color = "#f7685e" metabolization_rate = REAGENTS_METABOLISM * 0.25 + + +//body bluids +/datum/reagent/consumable/semen + name = "Semen" + description = "Sperm from some animal. Useless for anything but insemination, really." + taste_description = "something salty" + taste_mult = 2 //Not very overpowering flavor + data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) + reagent_state = LIQUID + color = "#FFFFFF" // rgb: 255, 255, 255 + can_synth = FALSE + nutriment_factor = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) + if(!istype(T)) + return + if(reac_volume < 10) + return + + var/obj/effect/decal/cleanable/semen/S = locate() in T + if(!S) + S = new(T) + if(data["blood_DNA"]) + S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + +/obj/effect/decal/cleanable/semen + name = "semen" + desc = null + gender = PLURAL + density = 0 + layer = ABOVE_NORMAL_TURF_LAYER + icon = 'icons/obj/genitals/effects.dmi' + icon_state = "semen1" + random_icon_states = list("semen1", "semen2", "semen3", "semen4") + +/obj/effect/decal/cleanable/semen/Initialize(mapload) + . = ..() + dir = GLOB.cardinals + add_blood_DNA(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) + if(S.blood_DNA) + blood_DNA |= S.blood_DNA + return ..() + +/datum/reagent/consumable/femcum + name = "Female Ejaculate" + description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business." + taste_description = "something with a tang" // wew coders who haven't eaten out a girl. + taste_mult = 2 + data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) + reagent_state = LIQUID + color = "#AAAAAA77" + can_synth = FALSE + nutriment_factor = 0.5 * REAGENTS_METABOLISM + +/obj/effect/decal/cleanable/femcum + name = "female ejaculate" + desc = null + gender = PLURAL + density = 0 + layer = ABOVE_NORMAL_TURF_LAYER + icon = 'icons/obj/genitals/effects.dmi' + icon_state = "fem1" + random_icon_states = list("fem1", "fem2", "fem3", "fem4") + blood_state = null + bloodiness = null + +/obj/effect/decal/cleanable/femcum/Initialize(mapload) + . = ..() + dir = GLOB.cardinals + add_blood_DNA(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) + if(F.blood_DNA) + blood_DNA |= F.blood_DNA + return ..() + +/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) + if(!istype(T)) + return + if(reac_volume < 10) + return + + var/obj/effect/decal/cleanable/femcum/S = locate() in T + if(!S) + S = new(T) + if(data["blood_DNA"]) + S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 939d5c9707..50d94a637e 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -5,6 +5,7 @@ reagent_state = SOLID color = "#550000" taste_description = "sweet tasting metal" + value = REAGENT_VALUE_COMMON /datum/reagent/thermite/reaction_turf(turf/T, reac_volume) if(reac_volume >= 1) @@ -21,13 +22,14 @@ description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." color = "#808080" // rgb: 128, 128, 128 taste_description = "oil" + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/stabilizing_agent name = "Stabilizing Agent" description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID color = "#FFFF00" - value = 3 + value = REAGENT_VALUE_VERY_COMMON taste_description = "metal" /datum/reagent/clf3 @@ -37,6 +39,7 @@ color = "#FFC8C8" metabolization_rate = 4 taste_description = "burning" + value = REAGENT_VALUE_COMMON /datum/reagent/clf3/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(2) @@ -79,13 +82,14 @@ reagent_state = LIQUID color = "#5A64C8" taste_description = "air and bitterness" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#210021" - value = 10 + value = REAGENT_VALUE_UNCOMMON taste_description = "compressed bitterness" /datum/reagent/blackpowder @@ -93,9 +97,9 @@ description = "Explodes. Violently." reagent_state = LIQUID color = "#000000" - value = 5 metabolization_rate = 0.05 taste_description = "salt" + value = REAGENT_VALUE_RARE /datum/reagent/blackpowder/on_mob_life(mob/living/carbon/M) ..() @@ -115,6 +119,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "salt" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/smoke_powder name = "Smoke Powder" @@ -122,6 +127,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "smoke" + value = REAGENT_VALUE_COMMON /datum/reagent/sonic_powder name = "Sonic Powder" @@ -129,6 +135,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "loud noises" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/phlogiston name = "Phlogiston" @@ -136,6 +143,7 @@ reagent_state = LIQUID color = "#FA00AF" taste_description = "burning" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, reac_volume) M.adjust_fire_stacks(1) @@ -156,8 +164,8 @@ description = "Very flammable." reagent_state = LIQUID color = "#FA00AF" - value = 1 taste_description = "burning" + value = REAGENT_VALUE_COMMON /datum/reagent/napalm/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(1) @@ -174,7 +182,7 @@ color = "#0000DC" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" - + value = REAGENT_VALUE_COMMON /datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M) //TODO: code freezing into an ice cube if(M.reagents.has_reagent(/datum/reagent/oxygen)) @@ -193,6 +201,7 @@ color = "#64FAC8" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" + value = REAGENT_VALUE_COMMON /datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M) if(M.reagents.has_reagent(/datum/reagent/oxygen)) @@ -208,6 +217,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "charged metal" var/shock_timer = 0 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/teslium/on_mob_life(mob/living/carbon/M) shock_timer++ @@ -217,6 +227,18 @@ playsound(M, "sparks", 50, 1) ..() +/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/L) + . = ..() + if(!istype(L)) + return + L.physiology.siemens_coeff *= 2 + +/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/human/L) + . = ..() + if(!istype(L)) + return + L.physiology.siemens_coeff *= 0.5 + /datum/reagent/teslium/energized_jelly name = "Energized Jelly" description = "Electrically-charged jelly. Boosts jellypeople's nervous system, but only shocks other lifeforms." @@ -242,6 +264,7 @@ reagent_state = LIQUID color = "#A6FAFF55" taste_description = "the inside of a fire extinguisher" + value = REAGENT_VALUE_UNCOMMON /datum/reagent/firefighting_foam/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 305d12b3c5..02e4a89e1d 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -7,6 +7,7 @@ color = "#CF3600" // rgb: 207, 54, 0 taste_description = "bitterness" taste_mult = 1.2 + value = REAGENT_VALUE_COMMON //Encouraging people to mix toxins for reasons beyond harming each other or mixing reagents such as pen acid. var/toxpwr = 1.5 /datum/reagent/toxin/on_mob_life(mob/living/carbon/M) @@ -21,6 +22,7 @@ color = "#792300" // rgb: 121, 35, 0 toxpwr = 2.5 taste_description = "mushroom" + value = REAGENT_VALUE_UNCOMMON pH = 13 /datum/reagent/toxin/mutagen @@ -30,6 +32,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 0.9 + value = REAGENT_VALUE_VERY_COMMON pH = 2.3 /datum/reagent/toxin/mutagen/reaction_mob(mob/living/carbon/M, method=TOUCH, reac_volume) @@ -60,6 +63,7 @@ color = "#8228A0" toxpwr = 3 pH = 4 + value = REAGENT_VALUE_RARE //sheets are worth more /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) @@ -92,6 +96,7 @@ toxpwr = 0 taste_description = "acid" pH = 1.2 + value = REAGENT_VALUE_RARE /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C) . = TRUE @@ -114,6 +119,7 @@ taste_description = "slime" taste_mult = 1.3 pH = 10 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -132,6 +138,7 @@ toxpwr = 0 taste_description = "mint" pH = 8 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_FAT)) @@ -145,6 +152,7 @@ toxpwr = 2 taste_description = "fish" pH = 12 + value = REAGENT_VALUE_RARE /datum/reagent/toxin/zombiepowder name = "Zombie Powder" @@ -155,6 +163,7 @@ taste_description = "death" var/fakedeath_active = FALSE pH = 13 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L) ..() @@ -193,6 +202,7 @@ toxpwr = 0.8 taste_description = "death" pH = 14.5 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/L) ..() @@ -214,6 +224,7 @@ toxpwr = 0 taste_description = "sourness" pH = 11 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M) M.hallucination += 5 @@ -226,6 +237,7 @@ toxpwr = 1 taste_mult = 1 pH = 2.7 + value = REAGENT_VALUE_NONE /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) @@ -250,6 +262,7 @@ description = "A harmful toxic mixture to kill weeds. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 pH = 3 + value = REAGENT_VALUE_NONE /datum/reagent/toxin/pestkiller name = "Pest Killer" @@ -257,6 +270,7 @@ color = "#4B004B" // rgb: 75, 0, 75 toxpwr = 1 pH = 3.2 + value = REAGENT_VALUE_NONE /datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume) ..() @@ -270,6 +284,7 @@ color = "#9ACD32" toxpwr = 1 pH = 11 + value = REAGENT_VALUE_RARE /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C) C.damageoverlaytemp = 60 @@ -284,6 +299,7 @@ toxpwr = 0.5 taste_description = "burning" pH = 13 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(2) @@ -323,6 +339,7 @@ glass_name = "glass of beer" glass_desc = "A freezing pint of beer." pH = 2 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M) switch(current_cycle) @@ -340,6 +357,7 @@ color = "#5B2E0D" // rgb: 91, 46, 13 toxpwr = 0.5 pH = 4.2 + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" @@ -348,6 +366,7 @@ color = "#7F8400" // rgb: 127, 132, 0 toxpwr = 0.5 pH = 4.9 + value = REAGENT_VALUE_VERY_COMMON /datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" @@ -367,6 +386,7 @@ color = "#6E2828" data = 15 toxpwr = 0 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(REM * data, 0) @@ -381,6 +401,7 @@ color = "#787878" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 0 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/M) M.radiation += 4 @@ -394,6 +415,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 toxpwr = 0 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/M) if(prob(50)) @@ -441,6 +463,7 @@ color = "#F0FFF0" metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/M) toxpwr = 0.2*volume @@ -476,6 +499,7 @@ color = "#00B4FF" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 1.25 + value = REAGENT_VALUE_UNCOMMON /datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -494,6 +518,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0.5 taste_description = "bad cooking" + value = REAGENT_VALUE_NONE /datum/reagent/toxin/condensed_cooking_oil name = "Condensed Cooking Oil" @@ -504,9 +529,10 @@ toxpwr = 0 taste_mult = -2 taste_description = "awful cooking" + value = REAGENT_VALUE_NONE /datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M) - if(prob(15)) + if(prob(5)) M.vomit() else if(prob(40)) @@ -551,6 +577,7 @@ color = "#7F10C0" metabolization_rate = 0.5 * REAGENTS_METABOLISM toxpwr = 2.5 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/C) if(prob(25)) @@ -582,6 +609,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0 taste_mult = 0 // undetectable, I guess? + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/M) if(current_cycle >= 10) @@ -598,6 +626,7 @@ color = "#6496FA" metabolization_rate = 0.75 * REAGENTS_METABOLISM toxpwr = 0 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/M) if(current_cycle >= 10) @@ -626,6 +655,7 @@ color = "#FFFFFF" toxpwr = 0 metabolization_rate = 0.5 * REAGENTS_METABOLISM + value = REAGENT_VALUE_RARE /datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/M) var/toxdamage = current_cycle*3*REM @@ -645,7 +675,7 @@ /datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) M.adjustToxLoss(1*REM, 0) - M.nutrition = max(M.nutrition - 3, 0) // making the chef more valuable, one meme trap at a time + M.adjust_nutrition(-3) // making the chef more valuable, one meme trap at a time M.overeatduration = 0 return ..() @@ -656,6 +686,7 @@ color = "#7DC3A0" metabolization_rate = 0.06 * REAGENTS_METABOLISM toxpwr = 1.75 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/M) M.losebreath += 5 @@ -670,6 +701,7 @@ overdose_threshold = 29 toxpwr = 0 taste_description = "vomit" + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C) .=..() @@ -693,6 +725,7 @@ color = "#191919" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 1 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M) if(current_cycle >= 11) @@ -708,6 +741,7 @@ color = "#C8C8C8" //RGB: 200, 200, 200 metabolization_rate = 0.2 * REAGENTS_METABOLISM toxpwr = 0 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M) if(ishuman(M)) @@ -726,11 +760,14 @@ metabolization_rate = 0.6 * REAGENTS_METABOLISM toxpwr = 0.5 taste_description = "spinning" + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M) if(M.hud_used) if(current_cycle >= 20 && current_cycle%20 == 0) - var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], + M.hud_used.plane_masters["[LIGHTING_PLANE]"], M.hud_used.plane_masters["[WALL_PLANE]"], + M.hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) var/rotation = min(round(current_cycle/20), 89) // By this point the player is probably puking and quitting anyway for(var/whole_screen in screens) animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1) @@ -752,20 +789,23 @@ metabolization_rate = 0.8 * REAGENTS_METABOLISM toxpwr = 0.25 taste_description = "skewing" + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M) /* if(M.hud_used) if(current_cycle >= 5 && current_cycle % 3 == 0) - var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) - var/matrix/skew = matrix() + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], + M.hud_used.plane_masters["[LIGHTING_PLANE]"], M.hud_used.plane_masters["[WALL_PLANE]"], + M.hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) var/matrix/skew = matrix() var/intensity = 8 skew.set_skew(rand(-intensity,intensity), rand(-intensity,intensity)) var/matrix/newmatrix = skew if(prob(33)) // 1/3rd of the time, let's make it stack with the previous matrix! Mwhahahaha! - var/obj/screen/plane_master/PM = M.hud_used.plane_masters["[GAME_PLANE]"] - newmatrix = skew * PM.transform + for(var/whole_screen in screens) + var/obj/screen/plane_master/PM = whole_screen + newmatrix = skew * PM.transform for(var/whole_screen in screens) animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1) @@ -788,6 +828,7 @@ color = "#3C5133" metabolization_rate = 0.08 * REAGENTS_METABOLISM toxpwr = 0.15 + value = REAGENT_VALUE_VERY_RARE /datum/reagent/toxin/anacea/on_mob_life(mob/living/carbon/M) var/remove_amt = 5 @@ -809,6 +850,7 @@ taste_description = "acid" self_consuming = TRUE pH = 2.75 + value = REAGENT_VALUE_NONE /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) @@ -840,6 +882,7 @@ color = "#5050FF" toxpwr = 2 acidpwr = 42.0 + value = REAGENT_VALUE_COMMON /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(current_cycle/10, 0) @@ -853,6 +896,7 @@ metabolization_rate = 0 //stays in the system until active. var/actual_metaboliztion_rate = REAGENTS_METABOLISM toxpwr = 0 + value = REAGENT_VALUE_VERY_RARE var/actual_toxpwr = 5 var/delay = 30 @@ -871,6 +915,7 @@ color = "#F0F8FF" // rgb: 240, 248, 255 toxpwr = 0 taste_description = "stillness" + value = REAGENT_VALUE_RARE /datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/L) ADD_TRAIT(L, TRAIT_EMOTEMUTE, type) @@ -885,6 +930,7 @@ toxpwr = 0 taste_description = "bone hurting" overdose_threshold = 20 + value = REAGENT_VALUE_VERY_RARE //because it's very funny. /datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M) M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) @@ -944,6 +990,7 @@ toxpwr = 0 taste_description = "brain hurting" metabolization_rate = 5 + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/toxin/brainhurtingjuice/on_mob_life(mob/living/carbon/M) if(prob(50)) @@ -962,6 +1009,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM toxpwr = 0 taste_description = "tannin" + value = REAGENT_VALUE_RARE /datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_HEART, 3) @@ -971,3 +1019,20 @@ to_chat(M, "[tox_message]") . = 1 ..() + +/datum/reagent/toxin/leadacetate + name = "Lead Acetate" + description = "Used hundreds of years ago as a sweetener, before it was realized that it's incredibly poisonous." + reagent_state = SOLID + color = "#2b2b2b" // rgb: 127, 132, 0 + toxpwr = 0.5 + taste_mult = 1.3 + taste_description = "sugary sweetness" + +/datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M) + M.adjustOrganLoss(ORGAN_SLOT_EARS,1) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN,1) + if(prob(1)) + to_chat(M, "Ah, what was that? You thought you heard something...") + M.confused += 5 + return ..() diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 468d29c052..a2b8c27552 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -62,3 +62,34 @@ results = list(/datum/reagent/moonsugar = 1, /datum/reagent/medicine/morphine = 2.5) required_temp = 315 //a little above normal body temperature required_reagents = list(/datum/reagent/drug/skooma = 1) +/datum/chemical_reaction/aphro + name = "crocin" + id = /datum/reagent/drug/aphrodisiac + results = list(/datum/reagent/drug/aphrodisiac = 6) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/water = 1) + required_temp = 400 + mix_message = "The mixture boils off a pink vapor..."//The water boils off, leaving the crocin + +/datum/chemical_reaction/aphroplus + name = "hexacrocin" + id = /datum/reagent/drug/aphrodisiacplus + results = list(/datum/reagent/drug/aphrodisiacplus = 1) + required_reagents = list(/datum/reagent/drug/aphrodisiac = 6, /datum/reagent/phenol = 1) + required_temp = 400 + mix_message = "The mixture rapidly condenses and darkens in color..." + +/datum/chemical_reaction/anaphro + name = "camphor" + id = /datum/reagent/drug/anaphrodisiac + results = list(/datum/reagent/drug/anaphrodisiac = 6) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/sulfur = 1) + required_temp = 400 + mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor + +/datum/chemical_reaction/anaphroplus + name = "pentacamphor" + id = /datum/reagent/drug/anaphrodisiacplus + results = list(/datum/reagent/drug/anaphrodisiacplus = 1) + required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1) + required_temp = 300 + mix_message = "The mixture thickens and heats up slighty..." diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 0b32952d20..9cf9acb424 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -105,7 +105,7 @@ if(St.purity < 1) St.volume *= St.purity St.purity = 1 - var/amount = CLAMP(0.002, 0, N.volume) + var/amount = clamp(0.002, 0, N.volume) N.volume -= amount St.data["grown_volume"] = St.data["grown_volume"] + added_volume St.name = "[initial(St.name)] [round(St.data["grown_volume"], 0.1)]u colony" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index ce1940994d..df1b57c20b 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -440,9 +440,8 @@ mob_react = FALSE /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, multiplier) - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - to_chat(M, "The solution spews out foam!") + var/turf/location = get_turf(holder.my_atom) + location.visible_message("The solution spews out foam!") var/datum/effect_system/foam_spread/s = new() s.set_up(multiplier*2, location, holder) s.start() @@ -457,11 +456,8 @@ mob_react = FALSE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, multiplier) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - to_chat(M, "The solution spews out a metallic foam!") - + var/turf/location = get_turf(holder.my_atom) + location.visible_message("The solution spews out a metallic foam!") var/datum/effect_system/foam_spread/metal/s = new() s.set_up(multiplier*5, location, holder, 1) s.start() @@ -488,9 +484,8 @@ mob_react = FALSE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, multiplier) - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - to_chat(M, "The solution spews out a metallic foam!") + var/turf/location = get_turf(holder.my_atom) + location.visible_message("The solution spews out metallic foam!") var/datum/effect_system/foam_spread/metal/s = new() s.set_up(multiplier*5, location, holder, 2) s.start() @@ -636,6 +631,11 @@ results = list(/datum/reagent/concentrated_barbers_aid = 2) required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/baldium + results = list(/datum/reagent/baldium = 1) + required_reagents = list(/datum/reagent/radium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/lye = 1) + required_temp = 395 + /datum/chemical_reaction/saltpetre name = "saltpetre" id = /datum/reagent/saltpetre diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 2c8be10ace..1d06aaacde 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -195,7 +195,7 @@ return holder.remove_reagent(/datum/reagent/sorium, multiplier*4) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(multiplier*4), 1, 6) + var/range = clamp(sqrt(multiplier*4), 1, 6) goonchem_vortex(T, 1, range) /datum/chemical_reaction/sorium_vortex @@ -206,7 +206,7 @@ /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, multiplier) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(multiplier), 1, 6) + var/range = clamp(sqrt(multiplier), 1, 6) goonchem_vortex(T, 1, range) /datum/chemical_reaction/liquid_dark_matter @@ -220,7 +220,7 @@ return holder.remove_reagent(/datum/reagent/liquid_dark_matter, multiplier*3) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(multiplier*3), 1, 6) + var/range = clamp(sqrt(multiplier*3), 1, 6) goonchem_vortex(T, 0, range) /datum/chemical_reaction/ldm_vortex @@ -231,7 +231,7 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, multiplier) var/turf/T = get_turf(holder.my_atom) - var/range = CLAMP(sqrt(multiplier/2), 1, 6) + var/range = clamp(sqrt(multiplier/2), 1, 6) goonchem_vortex(T, 0, range) /datum/chemical_reaction/flash_powder @@ -429,7 +429,7 @@ noexplosion = TRUE mix_message = "The teslium starts to spark as electricity arcs away from it!" mix_sound = 'sound/machines/defib_zap.ogg' - var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN /datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, multiplier) var/T1 = multiplier * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. @@ -437,15 +437,15 @@ var/T3 = multiplier * 120 sleep(5) if(multiplier >= 75) - tesla_zap(holder.my_atom, 7, T1, tesla_flags) + tesla_zap(holder.my_atom, 7, T1, zap_flags) playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) sleep(15) if(multiplier >= 40) - tesla_zap(holder.my_atom, 7, T2, tesla_flags) + tesla_zap(holder.my_atom, 7, T2, zap_flags) playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) sleep(15) if(multiplier >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast. - tesla_zap(holder.my_atom, 7, T3, tesla_flags) + tesla_zap(holder.my_atom, 7, T3, zap_flags) playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) ..() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index eb473950d5..ead47e2a42 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -42,7 +42,7 @@ /datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder) for(var/i in 1 to 3) - new /obj/item/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom)) + new /obj/item/reagent_containers/food/snacks/cube/monkey(get_turf(holder.my_atom)) ..() //Green diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 89de7c409d..fbdbb5f656 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -160,11 +160,8 @@ /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) if(container_flags & TEMP_WEAK) - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - for(var/mob/H in seen) - to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!") - playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) + visible_message("[icon2html(src, viewers(DEFAULT_MESSAGE_RANGE, src))] [src]'s melts from the temperature!") + playsound(src, 'sound/FermiChem/heatmelt.ogg', 80, 1) qdel(src) ..() @@ -184,8 +181,8 @@ if((reagents.pH < 1.5) || (reagents.pH > 12.5)) START_PROCESSING(SSobj, src) else if((reagents.pH < -3) || (reagents.pH > 17)) - visible_message("[icon2html(src, viewers(src))] \The [src] is damaged by the super pH and begins to deform!") - reagents.pH = CLAMP(reagents.pH, -3, 17) + visible_message("[icon2html(src, viewers(DEFAULT_MESSAGE_RANGE, src))] \The [src] is damaged by the super pH and begins to deform!") + reagents.pH = clamp(reagents.pH, -3, 17) container_HP -= 1 @@ -221,15 +218,11 @@ container_HP -= damage - var/list/seen = viewers(5, get_turf(src)) - var/iconhtml = icon2html(src, seen) - var/damage_percent = ((container_HP / initial(container_HP)*100)) switch(damage_percent) if(-INFINITY to 0) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s melts [cause]!") - playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) + visible_message("[icon2html(src, viewers(DEFAULT_MESSAGE_RANGE, src))] [src]'s melts [cause]!") + playsound(src, 'sound/FermiChem/acidmelt.ogg', 80, 1) SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted") STOP_PROCESSING(SSobj, src) qdel(src) @@ -246,5 +239,4 @@ update_icon() if(prob(25)) - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [src]'s is damaged by [cause] and begins to deform!") + visible_message("[icon2html(src, viewers(DEFAULT_MESSAGE_RANGE, src))] [src]'s is damaged by [cause] and begins to deform!") diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index cc1cd21bac..ad8d722b61 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -8,7 +8,6 @@ possible_transfer_amounts = list(5,10,15,25,30) volume = 30 - /obj/item/reagent_containers/glass/bottle/Initialize() . = ..() if(!icon_state) @@ -40,7 +39,6 @@ . += filling - /obj/item/reagent_containers/glass/bottle/epinephrine name = "epinephrine bottle" desc = "A small bottle. Contains epinephrine - used to stabilize patients." @@ -228,6 +226,13 @@ desc = "A small bottle of atropine." list_reagents = list(/datum/reagent/medicine/atropine = 30) +/obj/item/reagent_containers/glass/bottle/zeolites + name = "Zeolites bottle" + desc = "A small bottle of lab made Zeolite, which removes radiation from people quickly as well as contamination on items." + list_reagents = list(/datum/reagent/fermi/zeolites = 30) + +// Viro bottles + /obj/item/reagent_containers/glass/bottle/romerol name = "romerol bottle" desc = "A small bottle of Romerol. The REAL zombie powder." diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm new file mode 100644 index 0000000000..35ec588ec5 --- /dev/null +++ b/code/modules/reagents/reagent_containers/chem_pack.dm @@ -0,0 +1,51 @@ +/obj/item/reagent_containers/chem_pack + name = "intravenous medicine bag" + desc = "A plastic pressure bag, or 'chem pack', for IV administration of drugs. It is fitted with a thermosealing strip." + icon = 'icons/obj/bloodpack.dmi' + icon_state = "chempack" + volume = 100 + reagent_flags = OPENCONTAINER + spillable = TRUE + obj_flags = UNIQUE_RENAME + resistance_flags = ACID_PROOF + var/sealed = FALSE + +/obj/item/reagent_containers/chem_pack/on_reagent_change(changetype) + update_icon() + +/obj/item/reagent_containers/chem_pack/update_icon() + cut_overlays() + + var/v = min(round(reagents.total_volume / volume * 10), 10) + if(v > 0) + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "chempack1") + filling.icon_state = "chempack[v]" + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/chem_pack/AltClick(mob/living/user) + if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERY) && !sealed) + if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) + to_chat(user, "Uh... whoops! You accidentally spill the content of the bag onto yourself.") + SplashReagents(user) + return + else + DISABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER) + ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAWABLE |INJECTABLE ) + spillable = FALSE + sealed = TRUE + to_chat(user, "You seal the bag.") + + +/obj/item/reagent_containers/chem_pack/examine() + . = ..() + if(sealed) + . += "The bag is sealed shut." + else + . += "Alt-click to seal it." + + +obj/item/reagent_containers/chem_pack/attack_self(mob/user) + if(sealed) + return + ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 846637850b..3ed946d0c5 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -7,6 +7,7 @@ possible_transfer_amounts = list(1, 2, 3, 4, 5) volume = 5 reagent_flags = TRANSPARENT + custom_price = PRICE_CHEAP_AS_FREE /obj/item/reagent_containers/dropper/afterattack(obj/target, mob/user , proximity) . = ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 5c2a9d58e9..37ea2ca70d 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -245,7 +245,6 @@ icon_state = "beakerbluespace" custom_materials = list(/datum/material/glass = 5000, /datum/material/plasma = 3000, /datum/material/diamond = 1000, /datum/material/bluespace = 1000) volume = 300 - material_flags = MATERIAL_NO_EFFECTS amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) container_HP = 5 @@ -352,7 +351,7 @@ name = "wooden bucket" desc = "It's a bucket made of wood." icon_state = "bucket_wooden" - custom_materials = null + custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 2) slot_flags = NONE item_flags = NO_MAT_REDEMPTION @@ -362,6 +361,7 @@ icon = 'icons/obj/drinks.dmi' icon_state = "smallbottle" item_state = "bottle" + custom_price = PRICE_CHEAP_AS_FREE list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard custom_materials = list(/datum/material/glass=0) volume = 50 diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 3c4be7969d..799a6db9f5 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -96,6 +96,7 @@ reagent_flags = DRAWABLE flags_1 = null list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/preservahyde = 3) + custom_premium_price = PRICE_ALMOST_EXPENSIVE /obj/item/reagent_containers/hypospray/medipen/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to choke on \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -207,8 +208,8 @@ #define DELUXE_SELF_SPRAY 10 #define DELUXE_SELF_INJECT 10 -#define COMBAT_WAIT_SPRAY 0 -#define COMBAT_WAIT_INJECT 0 +#define COMBAT_WAIT_SPRAY 15 +#define COMBAT_WAIT_INJECT 15 #define COMBAT_SELF_SPRAY 0 #define COMBAT_SELF_INJECT 0 @@ -331,7 +332,6 @@ else to_chat(user, "This doesn't fit in [src].") return FALSE - return FALSE /obj/item/hypospray/mkii/AltClick(mob/user) . = ..() diff --git a/code/modules/reagents/reagent_containers/maunamug.dm b/code/modules/reagents/reagent_containers/maunamug.dm new file mode 100644 index 0000000000..18e6cfa847 --- /dev/null +++ b/code/modules/reagents/reagent_containers/maunamug.dm @@ -0,0 +1,117 @@ +/obj/item/reagent_containers/glass/maunamug + name = "mauna mug" + desc = "A drink served in a classy mug. Now with built-in heating!" + icon = 'icons/obj/mauna_mug.dmi' + icon_state = "maunamug" + spillable = TRUE + reagent_flags = OPENCONTAINER +// fill_icon_state = "maunafilling" +// fill_icon_thresholds = list(25) + var/obj/item/stock_parts/cell/cell + var/open = FALSE + var/on = FALSE + +/obj/item/reagent_containers/glass/maunamug/Initialize(mapload, vol) + . = ..() + cell = new /obj/item/stock_parts/cell(src) + +/obj/item/reagent_containers/glass/maunamug/examine(mob/user) + . = ..() + . += "The status display reads: Current temperature: [reagents.chem_temp]K Current Charge:[cell ? "[cell.charge / cell.maxcharge * 100]%" : "No cell found"]." + if(open) + . += "The battery case is open." + +/obj/item/reagent_containers/glass/maunamug/update_overlays() + . = ..() + if(reagents.total_volume >= 25) + . += mutable_appearance('icons/obj/reagentfillings.dmi', "maunafilling25", color = mix_color_from_reagents(reagents.reagent_list)) + +/obj/item/reagent_containers/glass/maunamug/process() + ..() + if(on && (!cell || cell.charge <= 0)) //Check if we ran out of power + change_power_status(FALSE) + return FALSE + cell.use(10) //Basic cell goes for like 200 seconds, bluespace for 8000 + if(!reagents.total_volume) + return FALSE + var/max_temp = min(500 + (500 * (0.2 * cell.rating)), 1000) // 373 to 1000 + reagents.adjust_thermal_energy(0.8 * cell.maxcharge * reagents.total_volume, max_temp = max_temp) // 4 kelvin every tick on a basic cell. 160k on bluespace + reagents.handle_reactions() + update_icon() + if(reagents.chem_temp >= max_temp) + change_power_status(FALSE) + audible_message("The Mauna Mug lets out a happy beep and turns off!") + playsound(src, 'sound/machines/chime.ogg', 50) + +/obj/item/reagent_containers/glass/maunamug/Destroy() + if(cell) + QDEL_NULL(cell) + STOP_PROCESSING(SSobj, src) + . = ..() + + +/obj/item/reagent_containers/glass/maunamug/attack_self(mob/user) + if(on) + change_power_status(FALSE) + else + if(!cell || cell.charge <= 0) + return FALSE //No power, so don't turn on + change_power_status(TRUE) + +/obj/item/reagent_containers/glass/maunamug/proc/change_power_status(status) + on = status + if(on) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + update_icon() + +/obj/item/reagent_containers/glass/maunamug/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + open = !open + to_chat(user, "You screw the battery case on [src] [open ? "open" : "closed"] .") + update_icon() + +/obj/item/reagent_containers/glass/maunamug/attackby(obj/item/I, mob/user, params) + add_fingerprint(user) + if(!istype(I, /obj/item/stock_parts/cell)) + return ..() + if(!open) + to_chat(user, "The battery case must be open to insert a power cell!") + return FALSE + if(cell) + to_chat(user, "There is already a power cell inside!") + return FALSE + else if(!user.transferItemToLoc(I, src)) + return + cell = I + user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") + update_icon() + +/obj/item/reagent_containers/glass/maunamug/attack_hand(mob/living/user) + if(cell && open) + cell.update_icon() + user.put_in_hands(cell) + cell = null + to_chat(user, "You remove the power cell from [src].") + on = FALSE + update_icon() + return TRUE + return ..() + +/obj/item/reagent_containers/glass/maunamug/update_icon() + ..() + if(open) + if(cell) + icon_state = "maunamug_bat" + else + icon_state = "maunamug_no_bat" + else if(on) + icon_state = "maunamug_on" + else + icon_state = "maunamug" + if(reagents.total_volume && reagents.chem_temp >= 400) + var/intensity = (reagents.chem_temp - 400) * 1 / 600 //Get the opacity of the incandescent overlay. Ranging from 400 to 1000 + var/mutable_appearance/mug_glow = mutable_appearance(icon, "maunamug_incand") + mug_glow.alpha = 255 * intensity + add_overlay(mug_glow) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index e6fa18ba9c..fca04f239e 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -22,10 +22,11 @@ if(reagents.total_volume && roundstart) name += " ([reagents.total_volume]u)" - /obj/item/reagent_containers/pill/attack_self(mob/user) return +/obj/item/reagent_containers/pill/get_w_volume() // DEFAULT_VOLUME_TINY at 25u, DEFAULT_VOLUME_SMALL at 50u + return DEFAULT_VOLUME_TINY/2 + reagents.total_volume / reagents.maximum_volume * DEFAULT_VOLUME_TINY /obj/item/reagent_containers/pill/attack(mob/M, mob/user, def_zone) if(!canconsume(M, user)) @@ -72,9 +73,8 @@ to_chat(user, "[target] is full.") return - to_chat(user, "You dissolve [src] in [target].") - for(var/mob/O in viewers(2, user)) //viewers is necessary here because of the small radius - to_chat(O, "[user] slips something into [target]!") + user.visible_message("[user] slips something into [target]!", + "You dissolve [src] in [target].", vision_distance = 2) reagents.trans_to(target, reagents.total_volume) qdel(src) @@ -138,14 +138,14 @@ name = "mannitol pill" desc = "Used to treat brain damage." icon_state = "pill17" - list_reagents = list(/datum/reagent/medicine/mannitol = 50) + list_reagents = list(/datum/reagent/medicine/mannitol = 25) roundstart = 1 /obj/item/reagent_containers/pill/mutadone name = "mutadone pill" desc = "Used to treat genetic damage." icon_state = "pill20" - list_reagents = list(/datum/reagent/medicine/mutadone = 50) + list_reagents = list(/datum/reagent/medicine/mutadone = 25) roundstart = 1 /obj/item/reagent_containers/pill/salicyclic @@ -187,14 +187,14 @@ name = "prussian blue pill" desc = "Used to treat heavy radition poisoning." icon_state = "prussian_blue" - list_reagents = list(/datum/reagent/medicine/prussian_blue = 25, /datum/reagent/water = 10) + list_reagents = list(/datum/reagent/medicine/prussian_blue = 25) roundstart = 1 /obj/item/reagent_containers/pill/mutarad name = "radiation treatment deluxe pill" desc = "Used to treat heavy radition poisoning and genetic defects." icon_state = "anit_rad_fixgene" - list_reagents = list(/datum/reagent/medicine/prussian_blue = 15, /datum/reagent/medicine/potass_iodide = 15, /datum/reagent/medicine/mutadone = 15, /datum/reagent/water = 5) + list_reagents = list(/datum/reagent/medicine/prussian_blue = 10, /datum/reagent/medicine/potass_iodide = 10, /datum/reagent/medicine/mutadone = 5) roundstart = 1 ///////////////////////////////////////// this pill is used only in a legion mob drop @@ -217,7 +217,7 @@ /obj/item/reagent_containers/pill/lsd name = "hallucinogen pill" - list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 15, /datum/reagent/toxin/mindbreaker = 15) + list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 12.5, /datum/reagent/toxin/mindbreaker = 12.5) /obj/item/reagent_containers/pill/aranesp diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 62ca5d658e..7fea8250d9 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -66,7 +66,7 @@ /obj/item/reagent_containers/spray/proc/spray(atom/A) - var/range = CLAMP(get_dist(src, A), 1, current_range) + var/range = clamp(get_dist(src, A), 1, current_range) var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE) var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index b8957775b1..4ab1470667 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -15,6 +15,7 @@ var/show_filling = TRUE custom_materials = list(/datum/material/iron=10, /datum/material/glass=20) reagent_flags = TRANSPARENT + custom_price = PRICE_CHEAP_AS_FREE /obj/item/reagent_containers/syringe/Initialize() . = ..() @@ -180,7 +181,7 @@ ///Used by update_icon() and update_overlays() /obj/item/reagent_containers/syringe/proc/get_rounded_vol() if(reagents && reagents.total_volume) - return CLAMP(round((reagents.total_volume / volume * 15),5), 1, 15) + return clamp(round((reagents.total_volume / volume * 15),5), 1, 15) else return 0 diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 1c87c1901c..bc4e214161 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -120,9 +120,10 @@ /obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume) boom() -/obj/structure/reagent_dispensers/fueltank/tesla_act() +/obj/structure/reagent_dispensers/fueltank/zap_act(power, zap_flags, shocked_objects) ..() //extend the zap - boom() + if(ZAP_OBJ_DAMAGE & zap_flags) + boom() /obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P) . = ..() @@ -169,6 +170,7 @@ name = "pepper spray refiller" desc = "Contains condensed capsaicin for use in law \"enforcement.\"" icon_state = "pepper" + plane = ABOVE_WALL_PLANE anchored = TRUE density = FALSE reagent_id = /datum/reagent/consumable/condensedcapsaicin @@ -182,6 +184,7 @@ name = "virus food dispenser" desc = "A dispenser of low-potency virus mutagenic." icon_state = "virus_food" + plane = ABOVE_WALL_PLANE anchored = TRUE density = FALSE reagent_id = /datum/reagent/consumable/virus_food @@ -211,7 +214,6 @@ /obj/structure/reagent_dispensers/keg name = "keg" desc = "A keg." - icon = 'modular_citadel/icons/obj/objects.dmi' icon_state = "keg" /obj/structure/reagent_dispensers/keg/mead @@ -235,19 +237,13 @@ /obj/structure/reagent_dispensers/keg/milk name = "keg of milk" - desc = "It's not quite what you were hoping for." + desc = "A keg of pasteurised, homogenised, filtered and semi-skimmed space milk." icon_state = "whitekeg" reagent_id = /datum/reagent/consumable/milk -/obj/structure/reagent_dispensers/keg/semen - name = "keg of semen" - desc = "Dear lord, where did this even come from?" - icon_state = "whitekeg" - reagent_id = /datum/reagent/consumable/semen - /obj/structure/reagent_dispensers/keg/gargle name = "keg of pan galactic gargleblaster" desc = "A keg of... wow that's a long name." icon_state = "bluekeg" reagent_id = /datum/reagent/consumable/ethanol/gargle_blaster - tank_volume = 100 \ No newline at end of file + tank_volume = 100 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 425c94cd65..cadd9ba04f 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -138,6 +138,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) var/turf/T = get_step(src, movedir) if(length(T.contents) > 150) return + affecting.len = min(affecting.len, 150 - length(T.contents)) for(var/atom/movable/A in affecting) if((A.loc == loc) && A.has_gravity()) A.ConveyorMove(movedir) @@ -330,7 +331,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) desc = "A conveyor control switch assembly." icon = 'icons/obj/recycling.dmi' icon_state = "switch-off" - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_NORMAL var/id = "" //inherited by the switch /obj/item/conveyor_switch_construct/Initialize() diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index aed2310a7f..45d3d9da25 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -14,6 +14,7 @@ max_integrity = 200 armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30) layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes + plane = ABOVE_WALL_PLANE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE var/dpdir = NONE // bitmask of pipe directions var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index d6ad1bf042..b47f0de032 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -57,7 +57,7 @@ return ..() /obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O) - if(ismovableatom(loc)) + if(ismovable(loc)) var/atom/movable/AM = loc //can't unwrap the wrapped container if it's inside something. AM.relay_container_resist(user, O) return diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm new file mode 100644 index 0000000000..20ca7987d5 --- /dev/null +++ b/code/modules/research/bepis.dm @@ -0,0 +1,270 @@ +//This system is designed to act as an in-between for cargo and science, and the first major money sink in the game outside of just buying things from cargo (As of 10/9/19, anyway). + +//economics defined values, subject to change should anything be too high or low in practice. + +#define MACHINE_OPERATION 100000 +#define MACHINE_OVERLOAD 500000 +#define MAJOR_THRESHOLD 5500 +#define MINOR_THRESHOLD 3500 +#define STANDARD_DEVIATION 1000 + +/obj/machinery/rnd/bepis + name = "\improper B.E.P.I.S. Chamber" + desc = "A high fidelity testing device which unlocks the secrets of the known universe using the two most powerful substances available to man: excessive amounts of electricity and capital." + icon = 'icons/obj/machines/bepis.dmi' + icon_state = "chamber" + density = TRUE + layer = ABOVE_MOB_LAYER + use_power = IDLE_POWER_USE + active_power_usage = 1500 + circuit = /obj/item/circuitboard/machine/bepis + + var/banking_amount = 100 + var/banked_cash = 0 //stored player cash + var/datum/bank_account/account //payer's account. + var/account_name //name of the payer's account. + var/error_cause = null + //Vars related to probability and chance of success for testing + var/major_threshold = MAJOR_THRESHOLD + var/minor_threshold = MINOR_THRESHOLD + var/std = STANDARD_DEVIATION //That's Standard Deviation, what did you think it was? + //Stock part variables + var/power_saver = 1 + var/inaccuracy_percentage = 1.5 + var/positive_cash_offset = 0 + var/negative_cash_offset = 0 + var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here. + /obj/item/flashlight/flashdark, + /obj/item/pen/survival, + /obj/item/circuitboard/machine/sleeper/party, + /obj/item/toy/sprayoncan) + var/static/list/item_list = list() + +/obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params) + if(default_deconstruction_screwdriver(user, "chamber_open", "chamber", O)) + update_icon_state() + return + if(default_deconstruction_crowbar(O)) + return + if(!is_operational()) + to_chat(user, "[src] can't accept money when it's not functioning.") + return + if(istype(O, /obj/item/holochip) || istype(O, /obj/item/stack/spacecash)) + var/deposit_value = O.get_item_credit_value() + banked_cash += deposit_value + qdel(O) + say("Deposited [deposit_value] credits into storage.") + update_icon_state() + return + if(istype(O, /obj/item/card/id)) + var/obj/item/card/id/Card = O + if(Card.registered_account) + account = Card.registered_account + account_name = Card.registered_name + say("New account detected. Console Updated.") + else + say("No account detected on card. Aborting.") + return + return ..() + +/obj/machinery/rnd/bepis/RefreshParts() + var/C = 0 + var/M = 0 + var/L = 0 + var/S = 0 + for(var/obj/item/stock_parts/capacitor/Cap in component_parts) + C += ((Cap.rating - 1) * 0.1) + power_saver = 1 - C + for(var/obj/item/stock_parts/manipulator/Manip in component_parts) + M += ((Manip.rating - 1) * 250) + positive_cash_offset = M + for(var/obj/item/stock_parts/micro_laser/Laser in component_parts) + L += ((Laser.rating - 1) * 250) + negative_cash_offset = L + for(var/obj/item/stock_parts/scanning_module/Scan in component_parts) + S += ((Scan.rating - 1) * 0.25) + inaccuracy_percentage = (1.5 - S) + +/obj/machinery/rnd/bepis/proc/depositcash() + var/deposit_value = 0 + deposit_value = banking_amount + if(deposit_value == 0) + update_icon_state() + say("Attempting to deposit 0 credits. Aborting.") + return + deposit_value = clamp(round(deposit_value, 1), 1, 15000) + if(!account) + say("Cannot find user account. Please swipe a valid ID.") + return + if(!account.has_money(deposit_value)) + say("You do not possess enough credits.") + return + account.adjust_money(-deposit_value) //The money vanishes, not paid to any accounts. + SSblackbox.record_feedback("amount", "BEPIS_credits_spent", deposit_value) + banked_cash += deposit_value + use_power(1000 * power_saver) + say("Cash deposit successful. There is [banked_cash] in the chamber.") + update_icon_state() + return + +/obj/machinery/rnd/bepis/proc/withdrawcash() + var/withdraw_value = 0 + withdraw_value = banking_amount + if(withdraw_value > banked_cash) + say("Cannot withdraw more than stored funds. Aborting.") + else + banked_cash -= withdraw_value + new /obj/item/holochip(src.loc, withdraw_value) + say("Withdrawing [withdraw_value] credits from the chamber.") + update_icon_state() + return + +/obj/machinery/rnd/bepis/proc/calcsuccess() + var/turf/dropturf = null + var/gauss_major = 0 + var/gauss_minor = 0 + var/gauss_real = 0 + var/list/turfs = block(locate(x-1,y-1,z),locate(x+1,y+1,z)) //NO MORE DISCS IN WINDOWS + while(length(turfs)) + var/turf/T = pick_n_take(turfs) + if(is_blocked_turf(T, exclude_mobs=TRUE)) + continue + else + dropturf = T + break + if (!dropturf) + dropturf = drop_location() + gauss_major = (gaussian(major_threshold, std) - negative_cash_offset) //This is the randomized profit value that this experiment has to surpass to unlock a tech. + gauss_minor = (gaussian(minor_threshold, std) - negative_cash_offset) //And this is the threshold to instead get a minor prize. + gauss_real = (gaussian(banked_cash, std*inaccuracy_percentage) + positive_cash_offset) //this is the randomized profit value that your experiment expects to give. + say("Real: [gauss_real]. Minor: [gauss_minor]. Major: [gauss_major].") + flick("chamber_flash",src) + update_icon_state() + banked_cash = 0 + if((gauss_real >= gauss_major) && (SSresearch.techweb_nodes_experimental.len > 0)) //Major Success. + say("Experiment concluded with major success. New technology node discovered on technology disc.") + new /obj/item/disk/tech_disk/major(dropturf,1) + if(SSresearch.techweb_nodes_experimental.len == 0) + say("Expended all available experimental technology nodes. Resorting to minor rewards.") + return + if(gauss_real >= gauss_minor) //Minor Success. + var/reward = pick(minor_rewards) + new reward(dropturf) + say("Experiment concluded with partial success. Dispensing compiled research efforts.") + return + if(gauss_real <= -1) //Critical Failure + say("ERROR: CRITICAL MACHIME MALFUNCTI- ON. CURRENCY IS NOT CRASH. CANNOT COMPUTE COMMAND: 'make bucks'") //not a typo, for once. + new /mob/living/simple_animal/deer(dropturf, 1) + use_power(MACHINE_OVERLOAD * power_saver) //To prevent gambling at low cost and also prevent spamming for infinite deer. + return + //Minor Failure + error_cause = pick("attempted to sell grey products to American dominated market.","attempted to sell gray products to British dominated market.","placed wild assumption that PDAs would go out of style.","simulated product #76 damaged brand reputation mortally.","simulated business model resembled 'pyramid scheme' by 98.7%.","product accidently granted override access to all station doors.") + say("Experiment concluded with zero product viability. Cause of error: [error_cause]") + return + +/obj/machinery/rnd/bepis/update_icon_state() + if(panel_open == TRUE) + icon_state = "chamber_open" + return + if((use_power == ACTIVE_POWER_USE) && (banked_cash > 0) && (is_operational())) + icon_state = "chamber_active_loaded" + return + if (((use_power == IDLE_POWER_USE) && (banked_cash > 0)) || (banked_cash > 0) && (!is_operational())) + icon_state = "chamber_loaded" + return + if(use_power == ACTIVE_POWER_USE && is_operational()) + icon_state = "chamber_active" + return + if(((use_power == IDLE_POWER_USE) && (banked_cash == 0)) || (!is_operational())) + icon_state = "chamber" + return + +/obj/machinery/rnd/bepis/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "bepis", name, 500, 480, master_ui, state) + ui.open() + RefreshParts() + +/obj/machinery/rnd/bepis/ui_data(mob/user) + var/list/data = list() + var/powered = FALSE + var/zvalue = (banked_cash - (major_threshold - positive_cash_offset - negative_cash_offset))/(std) + var/std_success = 0 + var/prob_success = 0 + //Admittedly this is messy, but not nearly as messy as the alternative, which is jury-rigging an entire Z-table into the code, or making an adaptive z-table. + var/z = abs(zvalue) + if(z > 0 && z <= 0.5) + std_success = 19.1 + else if(z > 0.5 && z <= 1.0) + std_success = 34.1 + else if(z > 1.0 && z <= 1.5) + std_success = 43.3 + else if(z > 1.5 && z <= 2.0) + std_success = 47.7 + else if(z > 2.0 && z <= 2.5) + std_success = 49.4 + else + std_success = 50 + if(zvalue > 0) + prob_success = 50 + std_success + else if(zvalue == 0) + prob_success = 50 + else + prob_success = 50 - std_success + + if(use_power == ACTIVE_POWER_USE) + powered = TRUE + data["account_owner"] = account_name + data["amount"] = banking_amount + data["stored_cash"] = banked_cash + data["mean_value"] = (major_threshold - positive_cash_offset - negative_cash_offset) + data["error_name"] = error_cause + data["power_saver"] = power_saver + data["accuracy_percentage"] = inaccuracy_percentage * 100 + data["positive_cash_offset"] = positive_cash_offset + data["negative_cash_offset"] = negative_cash_offset + data["manual_power"] = powered ? FALSE : TRUE + data["silicon_check"] = issilicon(user) + data["success_estimate"] = prob_success + return data + +/obj/machinery/rnd/bepis/ui_act(action,params) + if(..()) + return + switch(action) + if("deposit_cash") + if(use_power == IDLE_POWER_USE) + return + depositcash() + if("withdraw_cash") + if(use_power == IDLE_POWER_USE) + return + withdrawcash() + if("begin_experiment") + if(use_power == IDLE_POWER_USE) + return + if(banked_cash == 0) + say("Please deposit funds to begin testing.") + return + calcsuccess() + use_power(MACHINE_OPERATION * power_saver) //This thing should eat your APC battery if you're not careful. + use_power = IDLE_POWER_USE //Machine shuts off after use to prevent spam and look better visually. + update_icon_state() + if("amount") + var/input = text2num(params["amount"]) + if(input) + banking_amount = input + if("toggle_power") + if(use_power == ACTIVE_POWER_USE) + use_power = IDLE_POWER_USE + else + use_power = ACTIVE_POWER_USE + update_icon_state() + if("account_reset") + if(use_power == IDLE_POWER_USE) + return + account_name = "" + account = null + say("Account settings reset.") + . = TRUE diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index f3ac118134..cfb6d92723 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -36,6 +36,9 @@ other types of metals and chemistry for reagents). var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed. var/departmental_flags = ALL //bitflags for deplathes. var/list/datum/techweb_node/unlocked_by = list() + ///minimum and security levels the design can be printed on. Currently only available for rnd production machinery and mechfab. + var/min_security_level = SEC_LEVEL_GREEN + var/max_security_level = SEC_LEVEL_DELTA var/research_icon //Replaces the item icon in the research console var/research_icon_state var/icon_cache diff --git a/code/modules/research/designs/autobotter_designs.dm b/code/modules/research/designs/autobotter_designs.dm index eab7423b91..830c035525 100644 --- a/code/modules/research/designs/autobotter_designs.dm +++ b/code/modules/research/designs/autobotter_designs.dm @@ -14,7 +14,7 @@ /datum/design/bottle materials = list(/datum/material/glass = 1200) build_type = AUTOBOTTLER - category = list("Storge") + category = list("Storage") /datum/design/bottle/wine name = "Bottle Design (Wine)" @@ -165,6 +165,7 @@ name = "Export Design (Gin)" desc = "Allows for the blowing, and bottling of Gin bottles." id = "gin_export" + reagents_list = list(/datum/reagent/consumable/ethanol/gin = 50) build_path = /obj/item/export/bottle/gin /datum/design/bottle/export/whiskey @@ -331,4 +332,4 @@ id = "greenroad" reagents_list = list(/datum/reagent/consumable/vitfro = 50, /datum/reagent/consumable/ethanol/rum = 30, /datum/reagent/ash = 10) category = list("Beers") - build_path = /obj/item/export/bottle/greenroad \ No newline at end of file + build_path = /obj/item/export/bottle/greenroad diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm index ee9ee14e4a..f8cf5c1d84 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_construction.dm @@ -112,8 +112,8 @@ /datum/design/rcd_ammo_large name = "Large Compressed Matter Cartridge" id = "rcd_ammo_large" - build_type = AUTOLATHE | PROTOLATHE + build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 48000, /datum/material/glass = 32000) build_path = /obj/item/rcd_ammo/large - category = list("Tool Designs") + category = list("hacked", "Construction", "Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm index 86e11010bc..78b0a365c5 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm @@ -74,3 +74,19 @@ materials = list(/datum/material/glass = 20) build_path = /obj/item/stock_parts/cell/emergency_light category = list("initial", "Electronics") + +/datum/design/electrochromatic_control + name = "Electrochromatic Control Circuit" + id = "electrochromatic_control_circuit" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 100, /datum/material/glass = 100) + build_path = /obj/item/assembly/control/electrochromatic + category = list("initial", "Electronics") + +/datum/design/electrochromatic_kit + name = "Electrochromatic Upgrade Kit" + id = "electrochromatic_kit" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 2010, /datum/material/glass = 5) + build_path = /obj/item/electronics/electrochromatic_kit + category = list("initial", "Electronics") diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm index b62f30e041..76ec6224b8 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm @@ -8,7 +8,7 @@ /datum/design/kitchen_knife name = "Kitchen Knife" id = "kitchen_knife" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 12000) build_path = /obj/item/kitchen/knife category = list("initial","Dinnerware") @@ -140,7 +140,7 @@ /datum/design/healthanalyzer name = "Health Analyzer" id = "healthanalyzer" - build_type = AUTOLATHE | PROTOLATHE + build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 500, /datum/material/glass = 50) build_path = /obj/item/healthanalyzer category = list("initial", "Medical") diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm index 173240e196..9768d80a59 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm @@ -10,6 +10,7 @@ id = "beanbag_slug" build_type = AUTOLATHE materials = list(/datum/material/iron = 250) + materials = list(/datum/material/iron = 1000) build_path = /obj/item/ammo_casing/shotgun/beanbag category = list("initial", "Security") @@ -29,6 +30,14 @@ build_path = /obj/item/ammo_box/c38 category = list("initial", "Security") +/datum/design/r32acp + name = "Rubber Pistol Bullet (.32)" + id = "r32acp" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 250) + build_path = /obj/item/ammo_casing/r32acp + category = list("initial", "Security") + ///////////////// ///Hacked Gear // ///////////////// @@ -36,7 +45,7 @@ /datum/design/large_welding_tool name = "Industrial Welding Tool" id = "large_welding_tool" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 70, /datum/material/glass = 60) build_path = /obj/item/weldingtool/largetank category = list("hacked", "Tools") @@ -44,7 +53,7 @@ /datum/design/flamethrower name = "Flamethrower" id = "flamethrower" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 500) build_path = /obj/item/flamethrower/full category = list("hacked", "Security") @@ -52,7 +61,7 @@ /datum/design/rcd name = "Rapid Construction Device (RCD)" id = "rcd" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 30000) build_path = /obj/item/construction/rcd category = list("hacked", "Construction") @@ -60,7 +69,7 @@ /datum/design/rpd name = "Rapid Pipe Dispenser (RPD)" id = "rpd" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500) build_path = /obj/item/pipe_dispenser category = list("hacked", "Construction") @@ -68,23 +77,23 @@ /datum/design/handcuffs name = "Handcuffs" id = "handcuffs" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 500) build_path = /obj/item/restraints/handcuffs category = list("hacked", "Security") -/datum/design/receiver - name = "Modular Receiver" - id = "receiver" +/datum/design/rifle_receiver + name = "Rifle Receiver" + id = "rifle_receiver" build_type = AUTOLATHE - materials = list(/datum/material/iron = 15000) - build_path = /obj/item/weaponcrafting/receiver + materials = list(/datum/material/iron = 24000) + build_path = /obj/item/weaponcrafting/improvised_parts/rifle_receiver category = list("hacked", "Security") /datum/design/shotgun_slug name = "Shotgun Slug" id = "shotgun_slug" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_casing/shotgun category = list("hacked", "Security") @@ -92,7 +101,7 @@ /datum/design/buckshot_shell name = "Buckshot Shell" id = "buckshot_shell" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_casing/shotgun/buckshot category = list("hacked", "Security") @@ -100,7 +109,7 @@ /datum/design/shotgun_dart name = "Shotgun Dart" id = "shotgun_dart" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_casing/shotgun/dart category = list("hacked", "Security") @@ -108,15 +117,19 @@ /datum/design/incendiary_slug name = "Incendiary Slug" id = "incendiary_slug" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_casing/shotgun/incendiary category = list("hacked", "Security") +///////////////// +// Bullets // +///////////////// + /datum/design/riot_dart name = "Foam Riot Dart" id = "riot_dart" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 1125) //Discount for making individually - no box = less metal! build_path = /obj/item/ammo_casing/caseless/foam_dart/riot category = list("hacked", "Security") @@ -124,7 +137,7 @@ /datum/design/riot_darts name = "Foam Riot Dart Box" id = "riot_darts" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 50000) //Comes with 40 darts build_path = /obj/item/ammo_box/foambox/riot category = list("hacked", "Security") @@ -132,7 +145,7 @@ /datum/design/a357 name = "Revolver Bullet (.357)" id = "a357" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 4000) build_path = /obj/item/ammo_casing/a357 category = list("hacked", "Security") @@ -140,7 +153,7 @@ /datum/design/a762 name = "Rifle Bullet (7.62mm)" id = "a762" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 5000) //need seclathe for clips build_path = /obj/item/ammo_casing/a762 category = list("hacked", "Security") @@ -148,7 +161,7 @@ /datum/design/c10mm name = "Ammo Box (10mm)" id = "c10mm" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 30000) build_path = /obj/item/ammo_box/c10mm category = list("hacked", "Security") @@ -156,7 +169,7 @@ /datum/design/c45 name = "Ammo Box (.45)" id = "c45" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 30000) build_path = /obj/item/ammo_box/c45 category = list("hacked", "Security") @@ -164,7 +177,7 @@ /datum/design/c9mm name = "Ammo Box (9mm)" id = "c9mm" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 30000) build_path = /obj/item/ammo_box/c9mm category = list("hacked", "Security") @@ -172,7 +185,7 @@ /datum/design/electropack name = "Electropack" id = "electropack" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 10000, /datum/material/glass = 2500) build_path = /obj/item/electropack category = list("hacked", "Security") @@ -180,7 +193,7 @@ /datum/design/cleaver name = "Butcher's Cleaver" id = "cleaver" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 18000) build_path = /obj/item/kitchen/knife/butcher category = list("hacked", "Dinnerware") @@ -192,3 +205,23 @@ materials = list(/datum/material/iron = 5500) build_path = /obj/item/clothing/head/foilhat category = list("hacked", "Misc") + +/datum/design/c32acp + name = "Pistol Bullet (.32)" + id = "c32acp" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 500) + build_path = /obj/item/ammo_casing/c32acp + category = list("hacked", "Security") + +///////////////// +// Magazines // +///////////////// + +/datum/design/m32acp + name = "Empty .32 Magazine" + id = "m32acp" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 10000) + build_path = /obj/item/ammo_box/magazine/m32acp/empty + category = list("hacked", "Security") diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm index 30cd56c66a..320f856b35 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm @@ -256,3 +256,35 @@ materials = list(/datum/material/iron = 300, /datum/material/glass = 150) build_path = /obj/item/key/collar category = list("initial", "Misc") + +/datum/design/price_tagger + name = "Price Tagger" + id = "price_tagger" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) + build_path = /obj/item/price_tagger + category = list("initial", "Misc") + +/datum/design/custom_vendor_refill + name = "Custom Vendor Refill" + id = "custom_vendor_refill" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 2000) + build_path = /obj/item/vending_refill/custom + category = list("initial", "Misc") + +/datum/design/trigger_assembly + name = "Trigger Assembly" + id = "trigger_assembly" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 6500, /datum/material/glass = 50) + build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly + category = list("initial", "Misc") + +/datum/design/focusing_lens + name = "Makeshift Lens" + id = "makeshift_lens" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 4000) + build_path = /obj/item/weaponcrafting/improvised_parts/makeshift_lens + category = list("initial", "Misc") diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm index 8288ceff23..516c91d426 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm @@ -49,7 +49,7 @@ /datum/design/multitool name = "Multitool" id = "multitool" - build_type = AUTOLATHE | PROTOLATHE + build_type = AUTOLATHE | PROTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 50, /datum/material/glass = 20) build_path = /obj/item/multitool category = list("initial","Tools","Tool Designs") @@ -75,7 +75,7 @@ /datum/design/weldingtool name = "Welding Tool" id = "welding_tool" - build_type = AUTOLATHE + build_type = AUTOLATHE | NO_PUBLIC_LATHE materials = list(/datum/material/iron = 70, /datum/material/glass = 20) build_path = /obj/item/weldingtool category = list("initial","Tools","Tool Designs") @@ -97,6 +97,7 @@ build_path = /obj/item/screwdriver category = list("initial","Tools","Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + /datum/design/wirecutters name = "Wirecutters" id = "wirecutters" @@ -138,7 +139,7 @@ id = "tool_box" build_type = AUTOLATHE materials = list(MAT_CATEGORY_RIGID = 500) - build_path = /obj/item/storage/toolbox + build_path = /obj/item/storage/toolbox/greyscale category = list("initial","Tools") /datum/design/spraycan @@ -156,3 +157,11 @@ materials = list(/datum/material/iron = 150, /datum/material/glass = 150) build_path = /obj/item/geiger_counter category = list("initial", "Tools") + +/datum/design/saw + name = "Hand Saw" + id = "handsaw" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 500) + build_path = /obj/item/hatchet/saw + category = list("initial", "Tools") diff --git a/code/modules/research/designs/autoylathe_designs.dm b/code/modules/research/designs/autoylathe_designs.dm index 7811cfdaad..c2076db121 100644 --- a/code/modules/research/designs/autoylathe_designs.dm +++ b/code/modules/research/designs/autoylathe_designs.dm @@ -1,5 +1,5 @@ /datum/design/autoylathe - build_type = AUTOYLATHE + build_type = TOYLATHE /datum/design/autoylathe/mech category = list("initial", "Figurines") @@ -558,15 +558,16 @@ /datum/design/foam_x9 name = "Foam Force X9 Rifle" id = "foam_x9" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/automatic/x9/toy category = list("initial", "Rifles") + build_type = TOYLATHE | NO_PUBLIC_LATHE /datum/design/foam_dart name = "Box of Foam Darts" id = "foam_dart" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 500, /datum/material/iron = 100) build_path = /obj/item/ammo_box/foambox category = list("initial", "Misc") @@ -574,7 +575,7 @@ /datum/design/foam_magpistol name = "Foam Force Magpistol" id = "magfoam_launcher" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250) build_path = /obj/item/gun/ballistic/shotgun/toy/mag category = list("initial", "Pistols") @@ -582,15 +583,16 @@ /datum/design/foam_magrifle name = "Foam Force MagRifle" id = "foam_magrifle" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/automatic/toy/magrifle category = list("initial", "Rifles") + build_type = TOYLATHE | NO_PUBLIC_LATHE /datum/design/foam_hyperburst name = "MagTag Hyper Rifle" id = "foam_hyperburst" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 2000, /datum/material/glass = 1000) build_path = /obj/item/gun/energy/laser/practice/hyperburst category = list("initial", "Rifles") @@ -598,7 +600,7 @@ /datum/design/foam_sp name = "Foam Force Stealth Pistol" id = "foam_sp" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 1000) build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth category = list("initial", "Pistols") @@ -606,7 +608,7 @@ /datum/design/toyray name = "RayTag Gun" id = "toyray" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 1000, /datum/material/glass = 1000) build_path = /obj/item/gun/energy/laser/practice/raygun category = list("initial", "Pistols") @@ -614,15 +616,16 @@ /datum/design/am4c name = "Foam Force AM4-C Rifle" id = "foam_am4c" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/automatic/AM4C category = list("initial", "Rifles") + build_type = TOYLATHE | NO_PUBLIC_LATHE /datum/design/foam_f3 name = "Replica F3 Justicar" id = "foam_f3" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250) build_path = /obj/item/toy/gun/justicar category = list("initial", "Pistols") @@ -630,7 +633,7 @@ /datum/design/toy_blaster name = "pump-action plastic blaster" id = "toy_blaster" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 750, /datum/material/glass = 1000) build_path = /obj/item/gun/energy/pumpaction/toy category = list("initial", "Rifles") @@ -638,7 +641,7 @@ /datum/design/capammo name = "Box of Caps" id = "capammo" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/iron = 10, /datum/material/glass = 10) build_path = /obj/item/toy/ammo/gun category = list("initial", "Misc") @@ -646,15 +649,16 @@ /datum/design/foam_smg name = "Foam Force SMG" id = "foam_smg" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250) build_path = /obj/item/gun/ballistic/automatic/toy/unrestricted category = list("initial", "Pistols") + build_type = TOYLATHE | NO_PUBLIC_LATHE /datum/design/foam_pistol name = "Foam Force Pistol" id = "foam_pistol" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250) build_path = /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted category = list("initial", "Pistols") @@ -662,7 +666,7 @@ /datum/design/foam_shotgun name = "Foam Force Shotgun" id = "foam_shotgun" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/shotgun/toy/unrestricted category = list("initial", "Rifles") @@ -670,7 +674,7 @@ /datum/design/foam_dartred name = "Box of Lastag Red Foam Darts" id = "redfoam_dart" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 500, /datum/material/iron = 100) build_path = /obj/item/ammo_box/foambox/tag/red category = list("initial", "Misc") @@ -678,7 +682,7 @@ /datum/design/foam_dartblue name = "Box of Lastag Blue Foam Darts" id = "bluefoam_dart" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 500, /datum/material/iron = 100) build_path = /obj/item/ammo_box/foambox/tag/blue category = list("initial", "Misc") @@ -686,7 +690,7 @@ /datum/design/foam_bow name = "Foam Force Crossbow" id = "foam_bow" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250) build_path = /obj/item/gun/ballistic/shotgun/toy/crossbow category = list("initial", "Pistols") @@ -694,15 +698,17 @@ /datum/design/foam_c20 name = "Donksoft C20R" id = "foam_c20" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted category = list("hacked", "Rifles") + build_type = TOYLATHE | NO_PUBLIC_LATHE /datum/design/foam_l6 name = "Donksoft LMG" id = "foam_LMG" - build_type = AUTOYLATHE + build_type = TOYLATHE materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500) build_path = /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted category = list("hacked", "Rifles") + build_type = TOYLATHE | NO_PUBLIC_LATHE diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index e82dffbe07..2cf9df6d50 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -2,6 +2,9 @@ ///////Biogenerator Designs /////// /////////////////////////////////// +//Please be wary to not add inorganic items to the results such as generic glass bottles and metal. +//as they kind of defeat the design of this feature. + /datum/design/milk name = "10u Milk" id = "milk" @@ -18,22 +21,6 @@ make_reagents = list(/datum/reagent/consumable/cream = 10) category = list("initial","Food") -/datum/design/milk_carton - name = "Milk Carton" - id = "milk_carton" - build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 100) - build_path = /obj/item/reagent_containers/food/condiment/milk - category = list("initial","Food") - -/datum/design/cream_carton - name = "Cream Carton" - id = "cream_carton" - build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 300) - build_path = /obj/item/reagent_containers/food/drinks/bottle/cream - category = list("initial","Food") - /datum/design/black_pepper name = "10u Black Pepper" id = "black_pepper" @@ -42,15 +29,6 @@ make_reagents = list(/datum/reagent/consumable/blackpepper = 10) category = list("initial","Food") -/datum/design/pepper_mill - name = "Pepper Mill" - id = "pepper_mill" - build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 50) - build_path = /obj/item/reagent_containers/food/condiment/peppermill - make_reagents = list() - category = list("initial","Food") - /datum/design/enzyme name = "10u Universal Enzyme" id = "enzyme" @@ -59,20 +37,12 @@ make_reagents = list(/datum/reagent/consumable/enzyme = 10) category = list("initial","Food") -/datum/design/flour_sack - name = "Flour Sack" - id = "flour_sack" - build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 150) - build_path = /obj/item/reagent_containers/food/condiment/flour - category = list("initial","Food") - /datum/design/monkey_cube name = "Monkey Cube" id = "mcube" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 250) - build_path = /obj/item/reagent_containers/food/snacks/monkeycube + build_path = /obj/item/reagent_containers/food/snacks/cube/monkey category = list("initial", "Food") /datum/design/smeat @@ -84,43 +54,43 @@ category = list("initial", "Food") /datum/design/ez_nut - name = "E-Z Nutrient" + name = "10u E-Z Nutrient" id = "ez_nut" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 10) - build_path = /obj/item/reagent_containers/glass/bottle/nutrient/ez + materials = list(/datum/material/biomass = 2) + make_reagents = list(/datum/reagent/plantnutriment/eznutriment = 10) category = list("initial","Botany Chemicals") /datum/design/l4z_nut - name = "Left 4 Zed" + name = "10u Left 4 Zed" id = "l4z_nut" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 20) - build_path = /obj/item/reagent_containers/glass/bottle/nutrient/l4z + materials = list(/datum/material/biomass = 4) + make_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 10) category = list("initial","Botany Chemicals") /datum/design/rh_nut - name = "Robust Harvest" + name = "10u Robust Harvest" id = "rh_nut" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 25) - build_path = /obj/item/reagent_containers/glass/bottle/nutrient/rh + materials = list(/datum/material/biomass = 5) + make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10) category = list("initial","Botany Chemicals") /datum/design/weed_killer name = "Weed Killer" id = "weed_killer" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 50) - build_path = /obj/item/reagent_containers/glass/bottle/killer/weedkiller + materials = list(/datum/material/biomass = 10) + make_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 10) category = list("initial","Botany Chemicals") /datum/design/pest_spray name = "Pest Killer" id = "pest_spray" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 50) - build_path = /obj/item/reagent_containers/glass/bottle/killer/pestkiller + materials = list(/datum/material/biomass = 10) + make_reagents = list(/datum/reagent/toxin/pestkiller = 10) category = list("initial","Botany Chemicals") /datum/design/ammonia @@ -139,13 +109,13 @@ make_reagents = list(/datum/reagent/saltpetre = 10) category = list("initial","Botany Chemicals") -/datum/design/botany_bottle - name = "Empty Bottle" - id = "botany_bottle" +/datum/design/empty_carton + name = "Small Empty Carton Box" + id = "empty_carton" build_type = BIOGENERATOR - materials = list(/datum/material/biomass = 5) - build_path = /obj/item/reagent_containers/glass/bottle/nutrient/empty - category = list("initial", "Botany Chemicals") + materials = list(/datum/material/biomass = 15) + build_path = /obj/item/reagent_containers/food/drinks/bottle/bio_carton + category = list("initial", "Organic Materials") /datum/design/cloth name = "Roll of Cloth" diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm index 27560f29a1..99caa5b480 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm @@ -43,4 +43,20 @@ id = "libraryconsole" build_path = /obj/item/circuitboard/computer/libraryconsole category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_ALL \ No newline at end of file + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/board/flight_control + name = "Computer Design (Shuttle Flight Controls)" + desc = "Allows for the construction of circuit boards used to build a console that enables shuttle flight" + id = "shuttle_control" + build_path = /obj/item/circuitboard/computer/shuttle/flight_control + category = list("Computer Boards", "Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/board/shuttle_docker + name = "Computer Design (Private Navigation Computer)" + desc = "Allows for the construction of circuit boards used to build a console that enables the targetting of custom flight locations" + id = "shuttle_docker" + build_path = /obj/item/circuitboard/computer/shuttle/docker + category = list("Computer Boards", "Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm index 0e93481f66..914e9ec225 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_sec.dm @@ -10,6 +10,14 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/board/shuttleseccamera + name = "Computer Design (Shuttle-Linked Security Camera)" + desc = "Same as a regular security camera console, but when linked to a shuttle, will specifically access cameras on that shuttle." + id = "shuttleseccamera" + build_path = /obj/item/circuitboard/computer/security/shuttle + category = list("Computer Boards") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/board/secdata name = "Computer Design (Security Records Console)" desc = "Allows for the construction of circuit boards used to build a security records console." diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 4e9238c4c7..7e5bedaf0e 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -166,5 +166,3 @@ desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk." id = "xenobio_slimeadv" build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv - - diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm index c5f6b01e57..804556cb04 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm @@ -45,7 +45,7 @@ /datum/design/board/vendor name = "Machine Design (Vendor Board)" - desc = "The circuit board for a Vendor." + desc = "The circuit board for a Vendor. Use a screwdriver to turn the \"brand selection\" dial." id = "vendor" build_path = /obj/item/circuitboard/machine/vendor category = list ("Misc. Machinery") @@ -107,10 +107,50 @@ departmental_flags = DEPARTMENTAL_FLAG_ALL category = list ("Medical Machinery") +/datum/design/board/paystand + name = "Machine Design (Pay Stand)" + desc = "The circuit board for a paystand." + id = "paystand" + build_path = /obj/item/circuitboard/machine/paystand + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ALL + /datum/design/board/autoylathe name = "Machine Design (Autoylathe)" desc = "The circuit board for an autoylathe." id = "autoylathe" - build_path = /obj/item/circuitboard/machine/autoylathe + build_path = /obj/item/circuitboard/machine/autolathe/toy departmental_flags = DEPARTMENTAL_FLAG_ALL category = list("Misc. Machinery") + +/datum/design/board/hypnochair + name = "Machine Design (Enhanced Interrogation Chamber)" + desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber." + id = "hypnochair" + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + build_path = /obj/item/circuitboard/machine/hypnochair + category = list("Misc. Machinery") + +/datum/design/board/engine_plasma + name = "Machine Design (Plasma Thruster Board)" + desc = "The circuit board for a plasma thruster." + id = "engine_plasma" + build_path = /obj/item/circuitboard/machine/shuttle/engine/plasma + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/engine_void + name = "Machine Design (Void Thruster Board)" + desc = "The circuit board for a void thruster." + id = "engine_void" + build_path = /obj/item/circuitboard/machine/shuttle/engine/void + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/engine_heater + name = "Machine Design (Engine Heater Board)" + desc = "The circuit board for an engine heater." + id = "engine_heater" + build_path = /obj/item/circuitboard/machine/shuttle/heater + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/machine_desings/machine_designs_sci.dm b/code/modules/research/designs/machine_desings/machine_designs_sci.dm index 183977b455..59fae9d09b 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_sci.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_sci.dm @@ -66,6 +66,14 @@ category = list("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/board/bepis + name = "Machine Design (B.E.P.I.S. Board)" + desc = "The circuit board for a B.E.P.I.S." + id = "bepis" + build_path = /obj/item/circuitboard/machine/bepis + category = list("Research Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/board/protolathe name = "Machine Design (Protolathe Board)" desc = "The circuit board for a protolathe." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 6b3ba6fe28..e1e55f3476 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -122,16 +122,6 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/bluespacebodybag - name = "Bluespace Body Bag" - desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures." - id = "bluespacebodybag" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/plasma = 2000, /datum/material/diamond = 500, /datum/material/bluespace = 500) - build_path = /obj/item/bodybag/bluespace - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE - /datum/design/plasmarefiller name = "Plasma-Man Jumpsuit Refill" desc = "A refill pack for the auto-extinguisher on Plasma-man suits." @@ -222,6 +212,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/chem_pack + name = "Intravenous Medicine Bag" + desc = "A plastic pressure bag for IV administration of drugs." + id = "chem_pack" + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + materials = list(/datum/material/plastic = 1500) + build_path = /obj/item/reagent_containers/chem_pack + category = list("Medical Designs") + /datum/design/cloning_disk name = "Cloning Data Disk" desc = "Produce additional disks for storing genetic data." @@ -242,6 +242,40 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE +//////////////////////////////////////// +//////////Body Bags///////////////////// +//////////////////////////////////////// + +/datum/design/bodybag + name = "Body Bag" + desc = "A normal body bag used for storage of dead crew." + id = "bodybag" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 4000) + build_path = /obj/item/bodybag + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/bluespacebodybag + name = "Bluespace Body Bag" + desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures." + id = "bluespacebodybag" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/plasma = 2000, /datum/material/diamond = 500, /datum/material/bluespace = 500) + build_path = /obj/item/bodybag/bluespace + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/containmentbodybag + name = "Containment Body Bag" + desc = "A containment body bag, heavy and radiation proof." + id = "containmentbodybag" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 6000, /datum/material/plastic = 4000, /datum/material/titanium = 2000) + build_path = /obj/item/bodybag/containment + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + //////////////////////////////////////// //////////Defibrillator Tech//////////// //////////////////////////////////////// diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index c18c33b04b..0a1fde30c2 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -206,6 +206,35 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/bright_helmet + name = "Workplace-Ready Firefighter Helmet" + desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." + id = "bright_helmet" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) + build_path = /obj/item/clothing/head/hardhat/red/upgraded + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO + +/datum/design/mauna_mug + name = "Mauna Mug" + desc = "This awesome mug will ensure your coffee never stays cold!" + id = "mauna_mug" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 100) + build_path = /obj/item/reagent_containers/glass/maunamug + category = list("Equipment") + +/datum/design/rolling_table + name = "Rolly poly" + desc = "We duct-taped some wheels to the bottom of a table. It's goddamn science alright?" + id = "rolling_table" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000) + build_path = /obj/structure/table/rolling + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + /datum/design/portaseeder name = "Portable Seed Extractor" desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." @@ -285,6 +314,25 @@ build_path = /obj/item/vending_refill/donksoft category = list("Equipment") +/datum/design/eng_gloves + name = "Tinkers Gloves" + desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." + id = "eng_gloves" + build_type = PROTOLATHE + materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) + build_path = /obj/item/clothing/gloves/color/latex/engineering + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/lavarods + name = "Lava-Resistant Metal Rods" + id = "lava_rods" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) + build_path = /obj/item/stack/rods/lava + category = list("initial", "Stock Parts") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + ///////////////////////////////////////// ////////////Janitor Designs////////////// ///////////////////////////////////////// @@ -293,20 +341,20 @@ name = "Broom" desc = "Just your everyday standard broom." id = "broom" - build_type = PROTOLATHE + build_type = PROTOLATHE | AUTOLATHE materials = list(/datum/material/iron = 1000, /datum/material/glass = 600) build_path = /obj/item/twohanded/broom - category = list("Equipment") + category = list("initial", "Equipment", "Misc") departmental_flags = DEPARTMENTAL_FLAG_SERVICE /datum/design/mop name = "Mop" desc = "Just your everyday standard mop." id = "mop" - build_type = PROTOLATHE + build_type = PROTOLATHE | AUTOLATHE materials = list(/datum/material/iron = 1200, /datum/material/glass = 100) build_path = /obj/item/mop - category = list("Equipment") + category = list("initial", "Equipment", "Misc") departmental_flags = DEPARTMENTAL_FLAG_SERVICE /datum/design/advmop @@ -329,6 +377,16 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/normtrash + name = "Trashbag" + desc = "It's a bag for trash, you put garbage in it." + id = "normtrash" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 2000) + build_path = /obj/item/storage/bag/trash + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/blutrash name = "Trashbag of Holding" desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." @@ -349,6 +407,17 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/paint_remover + name = "Paint Remover" + desc = "Removes stains from the floor, and not much else." + id = "paint_remover" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000) + reagents_list = list(/datum/reagent/acetone = 60) + build_path = /obj/item/paint/paint_remover + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/spraybottle name = "Spray Bottle" desc = "A spray bottle, with an unscrewable top." @@ -614,3 +683,146 @@ build_path = /obj/item/circuitboard/computer/sat_control category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + + + +///////////////////////////////////////// +////////////Tackle Gloves//////////////// +///////////////////////////////////////// + +/datum/design/tackle_dolphin + name = "Dolphin Gloves" + id = "tackle_dolphin" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 2500) + build_path = /obj/item/clothing/gloves/tackler/dolphin + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/tackle_rocket + name = "Rocket Gloves" + id = "tackle_rocket" + build_type = PROTOLATHE + materials = list(/datum/material/plasma = 1000, /datum/material/plastic = 2000) + build_path = /obj/item/clothing/gloves/tackler/rocket + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +///////////////////////////////////////// +/////////////Internal Tanks////////////// +///////////////////////////////////////// + +/datum/design/oxygen_tank + name = "Oxygen Tank" + desc = "An empty oxygen tank." + id = "oxygen_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/oxygen/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/plasma_tank + name = "Plasma Tank" + desc = "An empty plasma tank." + id = "plasma_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/plasma/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/emergency_oxygen + name = "Emergency Oxygen Tank" + desc = "A small emergency oxygen tank." + id = "emergency_oxygen" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/tank/internals/emergency_oxygen/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/plasma_belt_tank + name = "Plasmaman Belt Tank" + desc = "A small tank of plasma for plasmamen." + id = "plasmaman_tank_belt" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/tank/internals/plasmaman/belt/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/emergency_oxygen_engi + name = "Engineering Emergency Oxygen Tank" + desc = "An emergency oxygen tank for engineers." + id = "emergency_oxygen_engi" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/tank/internals/emergency_oxygen/engi/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +///////////////////////////////////////// +/////////////////Tape//////////////////// +///////////////////////////////////////// + +/datum/design/sticky_tape + name = "Sticky Tape" + id = "sticky_tape" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/sticky_tape + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/super_sticky_tape + name = "Super Sticky Tape" + id = "super_sticky_tape" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 3000) + build_path = /obj/item/stack/sticky_tape/super + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/pointy_tape + name = "Pointy Tape" + id = "pointy_tape" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1500, /datum/material/plastic = 1000) + build_path = /obj/item/stack/sticky_tape/pointy + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +///////////////////////////////////////// +/////////////////Shuttle Upgrades//////// +///////////////////////////////////////// + +/datum/design/shuttle_speed_upgrade + name = "Shuttle Route Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console." + id = "disk_shuttle_route" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/shuttle_speed_upgrade_hyper + name = "Shuttle Bluespace Hyperlane Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one abuses bluespace hyperlanes for increased efficiency." + id = "disk_shuttle_route_hyper" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation/hyperlane + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/shuttle_speed_upgrade_void + name = "Shuttle Voidspace Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one access voidspace for increased efficiency." + id = "disk_shuttle_route_void" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation/void + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm index c72ee4fb8c..b157d0c349 100644 --- a/code/modules/research/designs/nanite_designs.dm +++ b/code/modules/research/designs/nanite_designs.dm @@ -529,7 +529,6 @@ ////////////////////NANITE PROTOCOLS////////////////////////////////////// //Note about the category name: The UI cuts the last 8 characters from the category name to remove the " Nanites" in the other categories //Because of this, Protocols was getting cut down to "P", so i had to add some padding -/* /datum/design/nanites/kickstart name = "Kickstart Protocol" desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation." @@ -557,4 +556,10 @@ id = "offline_nanites" program_type = /datum/nanite_program/protocol/offline category = list("Protocols_Nanites") -*/ + +/datum/design/nanites/synergy + name = "Synergy Protocol" + desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume." + id = "synergy_nanites" + program_type = /datum/nanite_program/protocol/synergy + category = list("Protocols_Nanites") diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 2d938bc38c..551d6fa0e3 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -42,6 +42,16 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/shuttlecreator + name = "Rapid Shuttle Designator" + desc = "An advanced device capable of defining areas for use in the creation of shuttles" + id = "shuttle_creator" + build_path = /obj/item/shuttle_creator + build_type = PROTOLATHE + materials = list(/datum/material/iron = 8000, /datum/material/titanium = 5000, /datum/material/bluespace = 5000) + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/handdrill name = "Hand Drill" desc = "A small electric hand drill with an interchangeable screwdriver and bolt bit" @@ -72,6 +82,16 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/rld_mini + name = "Mini Rapid Light Device (MRLD)" + desc = "A tool that can portable and standing lighting orbs and glowsticks." + id = "rld_mini" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 8000, /datum/material/gold = 2000) + build_path = /obj/item/construction/rld/mini + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO + ///////////////////////////////////////// //////////////Alien Tools//////////////// ///////////////////////////////////////// diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 658e108288..8c934d39a9 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -91,7 +91,7 @@ /datum/design/mag_oldsmg name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)" - desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG." + desc = "A 32 round magazine for the out of date security WT-550 Semi-Auto SMG." id = "mag_oldsmg" build_type = PROTOLATHE materials = list(/datum/material/iron = 4000) @@ -101,7 +101,7 @@ /datum/design/mag_oldsmg/ap_mag name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." + desc = "A 32 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." id = "mag_oldsmg_ap" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600) build_path = /obj/item/ammo_box/magazine/wt550m9/wtap @@ -109,7 +109,7 @@ /datum/design/mag_oldsmg/ic_mag name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)" - desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." + desc = "A 32 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG." id = "mag_oldsmg_ic" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/glass = 1000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtic @@ -117,7 +117,7 @@ /datum/design/mag_oldsmg/tx_mag name = "WT-550 Semi-Auto SMG Uranium Magazine (4.6x30mm TX)" - desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG." + desc = "A 32 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG." id = "mag_oldsmg_tx" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/uranium = 2000) build_path = /obj/item/ammo_box/magazine/wt550m9/wttx @@ -125,7 +125,7 @@ /datum/design/mag_oldsmg/rubber_mag name = "WT-550 Semi-Auto SMG rubberbullets Magazine (4.6x30mm rubber)" - desc = "A 20 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG" + desc = "A 32 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG" id = "mag_oldsmg_rubber" materials = list(/datum/material/iron = 6000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber @@ -135,6 +135,15 @@ //Ammo Shells/ ////////////// +/datum/design/shell_clip + name = "stripper clip (shotgun shells)" + id = "sec_shellclip" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000) + build_path = /obj/item/ammo_box/shotgun + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + /datum/design/beanbag_slug/sec id = "sec_beanbag" build_type = PROTOLATHE @@ -166,7 +175,7 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/incendiary_slug/sec - id = "sec_Islug" + id = "sec_islug" build_type = PROTOLATHE category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -225,13 +234,13 @@ category = list("Firing Pins") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -/datum/design/pin_away - name = "Station Locked Pin" - desc = "This is a security firing pin which only authorizes users who are off station." - id = "pin_away" +/datum/design/pin_explorer + name = "Outback Firing Pin" + desc = "This firing pin only shoots while ya ain't on station, fair dinkum!" + id = "pin_explorer" build_type = PROTOLATHE - materials = list(/datum/material/iron = 1500, /datum/material/glass = 2000) - build_path = /obj/item/firing_pin/away + materials = list(/datum/material/silver = 1000, /datum/material/gold = 1000, /datum/material/iron = 500) + build_path = /obj/item/firing_pin/explorer category = list("Firing Pins") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -435,9 +444,9 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE -////////// -//MISC//// -////////// +/////////// +//Shields// +/////////// /datum/design/tele_shield name = "Telescopic Riot Shield" @@ -449,6 +458,30 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/laser_shield + name = "Laser Resistant Riot Shield" + desc = "An advanced riot shield made of darker glasses to prevent laser fire from passing through." + id = "laser_shield" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 4000, /datum/material/silver = 800, /datum/material/titanium = 600, /datum/material/plasma = 5000) + build_path = /obj/item/shield/riot/laser_proof + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/bullet_shield + name = "Bullet Resistant Riot Shield" + desc = "An advanced riot shield made bullet resistant plastics and heavy metals to protect against projectile harm." + id = "bullet_shield" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/silver = 2000, /datum/material/titanium = 1200, /datum/material/plastic = 2500) + build_path = /obj/item/shield/riot/bullet_proof + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +////////// +//MISC//// +////////// + /datum/design/suppressor name = "Suppressor" desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels." @@ -467,3 +500,13 @@ materials = list(MAT_CATEGORY_RIGID = 12000) build_path = /obj/item/melee/cleric_mace category = list("Imported") + +/datum/design/stun_boomerang + name = "OZtek Boomerang" + desc = "Uses reverse flow gravitodynamics to flip its personal gravity back to the thrower mid-flight. Also functions similar to a stun baton." + id = "stun_boomerang" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) + build_path = /obj/item/melee/baton/boomerang + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 42b8a4dcbb..cc02e271f9 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -101,7 +101,7 @@ Note: Must be placed within 3 tiles of the R&D Console if(!istype(loaded_item) || !istype(linked_console)) return FALSE - if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID) + if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID && id != RESEARCH_DEEP_SCAN_ID) var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id) if(!istype(TN)) return FALSE @@ -125,7 +125,7 @@ Note: Must be placed within 3 tiles of the R&D Console if(destroy_item(loaded_item)) linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(TN.id), dpath) - else + else if(id == RESEARCH_MATERIAL_RECLAMATION_ID) var/list/point_value = techweb_item_point_check(loaded_item) if(linked_console.stored_research.deconstructed_items[loaded_item.type]) point_value = list() @@ -143,6 +143,15 @@ Note: Must be placed within 3 tiles of the R&D Console if(destroy_item(loaded_item)) linked_console.stored_research.add_point_list(point_value) linked_console.stored_research.deconstructed_items[loaded_type] = point_value + else if(id == RESEARCH_DEEP_SCAN_ID) + var/list/return_list = list() + . = SEND_SIGNAL(loaded_item, COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN, src, user, return_list) + flick("d_analyzer_process", src) + if(. & COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION) + say("New information uncovered from item deep scan[length(return_list)? ": [english_list(return_list)]" : ""].") + else + say("Item deep scan uncovered no new information.") + return TRUE /obj/machinery/rnd/destructive_analyzer/proc/unload_item() diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 41ed6a556e..a5df3f4d12 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -3,7 +3,8 @@ desc = "Makes researched and prototype items with materials and energy." layer = BELOW_OBJ_LAYER var/consoleless_interface = TRUE //Whether it can be used without a console. - var/efficiency_coeff = 1 //Materials needed / coeff = actual. + var/offstation_security_levels = TRUE + var/print_cost_coeff = 1 //Materials needed * coeff = actual. var/list/categories = list() var/datum/component/remote_materials/materials var/allowed_department_flags = ALL @@ -60,7 +61,8 @@ popup.open() /obj/machinery/rnd/production/proc/calculate_efficiency() - efficiency_coeff = 1 + var/total_manip_rating = 0 + var/manips = 0 if(reagents) //If reagents/materials aren't initialized, don't bother, we'll be doing this again after reagents init anyways. reagents.maximum_volume = 0 for(var/obj/item/reagent_containers/glass/G in component_parts) @@ -71,17 +73,16 @@ for(var/obj/item/stock_parts/matter_bin/M in component_parts) total_storage += M.rating * 75000 materials.set_local_size(total_storage) - var/total_rating = 0 for(var/obj/item/stock_parts/manipulator/M in component_parts) - total_rating += M.rating - total_rating = max(1, total_rating) - efficiency_coeff = total_rating + total_manip_rating += M.rating + manips++ + print_cost_coeff = STANDARD_PART_LEVEL_LATHE_COEFFICIENT(total_manip_rating / (manips? manips : 1)) /obj/machinery/rnd/production/examine(mob/user) . = ..() var/datum/component/remote_materials/materials = GetComponent(/datum/component/remote_materials) if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Storing up to [materials.local_size] material units locally.
    Material usage efficiency at [efficiency_coeff*100]%.
    " + . += "The status display reads: Storing up to [materials.local_size] material units locally.
    Material usage cost at [print_cost_coeff*100]%.
    " //we eject the materials upon deconstruction. /obj/machinery/rnd/production/on_deconstruction() @@ -94,10 +95,9 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).") for(var/i in 1 to amount) var/obj/O = new path(get_turf(src)) - if(efficient_with(O.type) && isitem(O)) - var/obj/item/I = O - I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this. - I.set_custom_materials(matlist.Copy()) + if(efficient_with(O.type)) + O.set_custom_materials(matlist.Copy()) + O.rnd_crafted(src) SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) @@ -112,8 +112,8 @@ // these types don't have their .materials set in do_print, so don't allow // them to be constructed efficiently - var/ef = efficient_with(being_built.build_path) ? efficiency_coeff : 1 - return round(A / max(1, all_materials[mat] / ef)) + var/ef = efficient_with(being_built.build_path) ? print_cost_coeff : 1 + return round(A / max(1, all_materials[mat] * ef)) /obj/machinery/rnd/production/proc/efficient_with(path) return !ispath(path, /obj/item/stack/sheet) && !ispath(path, /obj/item/stack/ore/bluespace_crystal) @@ -134,6 +134,12 @@ if(D.build_type && !(D.build_type & allowed_buildtypes)) say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!") return FALSE + if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z))) + if(GLOB.security_level < D.min_security_level) + say("Minimum security alert level required to print this design not met, please contact the command staff.") + return FALSE + if(GLOB.security_level > D.max_security_level) + say("Exceeded maximum security alert level required to print this design, please contact the command staff.") if(!materials.mat_container) say("No connection to material storage, please contact the quartermaster.") return FALSE @@ -141,32 +147,32 @@ say("Mineral access is on hold, please contact the quartermaster.") return FALSE var/power = 1000 - amount = CLAMP(amount, 1, 50) + amount = clamp(amount, 1, 50) for(var/M in D.materials) power += round(D.materials[M] * amount / 35) power = min(3000, power) use_power(power) - var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1 + var/coeff = efficient_with(D.build_path) ? print_cost_coeff : 1 var/list/efficient_mats = list() for(var/MAT in D.materials) - efficient_mats[MAT] = D.materials[MAT]/coeff + efficient_mats[MAT] = D.materials[MAT] * coeff if(!materials.mat_container.has_materials(efficient_mats, amount)) say("Not enough materials to complete prototype[amount > 1? "s" : ""].") return FALSE for(var/R in D.reagents_list) - if(!reagents.has_reagent(R, D.reagents_list[R]*amount/coeff)) + if(!reagents.has_reagent(R, D.reagents_list[R] * amount * coeff)) say("Not enough reagents to complete prototype[amount > 1? "s" : ""].") return FALSE materials.mat_container.use_materials(efficient_mats, amount) materials.silo_log(src, "built", -amount, "[D.name]", efficient_mats) for(var/R in D.reagents_list) - reagents.remove_reagent(R, D.reagents_list[R]*amount/coeff) + reagents.remove_reagent(R, D.reagents_list[R] * amount * coeff) busy = TRUE if(production_animation) flick(production_animation, src) - var/timecoeff = D.lathe_time_factor / efficiency_coeff - addtimer(CALLBACK(src, .proc/reset_busy), (30 * timecoeff * amount) ** 0.5) - addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction, usr), (32 * timecoeff * amount) ** 0.8) + var/timecoeff = D.lathe_time_factor * print_cost_coeff + addtimer(CALLBACK(src, .proc/reset_busy), (20 * timecoeff * amount) ** 0.5) + addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction, usr), (20 * timecoeff * amount) ** 0.5) return TRUE /obj/machinery/rnd/production/proc/search(string) @@ -241,7 +247,7 @@ /obj/machinery/rnd/production/proc/ui_screen_search() var/list/l = list() - var/coeff = efficiency_coeff + var/coeff = print_cost_coeff l += "

    Search Results:

    " l += "
    \ \ @@ -258,7 +264,7 @@ if(!istype(D)) return if(!coeff) - coeff = efficiency_coeff + coeff = print_cost_coeff if(!efficient_with(D.build_path)) coeff = 1 var/list/l = list() @@ -270,20 +276,31 @@ t = check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += "[all_materials[M] * coeff] [CallMaterialName(M)]" else - temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += " [all_materials[M] * coeff] [CallMaterialName(M)]" c = min(c,t) - if (c >= 1) + var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)) + var/sec_text = "" + if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA)) + sec_text = " (Allowed security levels: " + for(var/n in D.min_security_level to D.max_security_level) + sec_text += NUM2SECLEVEL(n) + if(n + 1 <= D.max_security_level) + sec_text += ", " + sec_text += ")" + + clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level) + if (c >= 1 && clearance) l += "[D.name][RDSCREEN_NOBREAK]" if(c >= 5) l += "x5[RDSCREEN_NOBREAK]" if(c >= 10) l += "x10[RDSCREEN_NOBREAK]" - l += "[temp_material][RDSCREEN_NOBREAK]" + l += "[temp_material][sec_text][RDSCREEN_NOBREAK]" else - l += "[D.name][temp_material][RDSCREEN_NOBREAK]" + l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]" l += "" return l @@ -349,7 +366,7 @@ return ui_screen_main() var/list/l = list() l += "

    Browsing [selected_category]:

    " - var/coeff = efficiency_coeff + var/coeff = print_cost_coeff for(var/v in stored_research.researched_designs) var/datum/design/D = SSresearch.techweb_design_by_id(v) if(!(selected_category in D.category)|| !(D.build_type & allowed_buildtypes)) diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 948dad61db..b80e96a1e9 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -25,8 +25,9 @@ /obj/machinery/rnd/production/circuit_imprinter/calculate_efficiency() . = ..() - var/total_rating = 0 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - total_rating += M.rating * 2 //There is only one. - total_rating = max(1, total_rating) - efficiency_coeff = total_rating + var/obj/item/circuitboard/machine/circuit_imprinter/C = circuit + offstation_security_levels = C.offstation_security_levels + +/obj/machinery/rnd/production/circuit_imprinter/offstation + offstation_security_levels = FALSE + circuit = /obj/item/circuitboard/machine/circuit_imprinter/offstation diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index 684f27ccad..b1b31a279c 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -23,3 +23,12 @@ /obj/machinery/rnd/production/protolathe/disconnect_console() linked_console.linked_lathe = null ..() + +/obj/machinery/rnd/production/protolathe/calculate_efficiency() + . = ..() + var/obj/item/circuitboard/machine/protolathe/C = circuit + offstation_security_levels = C.offstation_security_levels + +/obj/machinery/rnd/production/protolathe/offstation + offstation_security_levels = FALSE + circuit = /obj/item/circuitboard/machine/protolathe/offstation diff --git a/code/modules/research/nanites/extra_settings/number.dm b/code/modules/research/nanites/extra_settings/number.dm index 6e63ae067e..75489635f5 100644 --- a/code/modules/research/nanites/extra_settings/number.dm +++ b/code/modules/research/nanites/extra_settings/number.dm @@ -16,7 +16,7 @@ value = text2num(value) if(!value || !isnum(value)) return - src.value = CLAMP(value, min, max) + src.value = clamp(value, min, max) /datum/nanite_extra_setting/number/get_copy() return new /datum/nanite_extra_setting/number(value, min, max, unit) diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm index 0750d3d268..4650af5c80 100644 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ b/code/modules/research/nanites/nanite_chamber_computer.dm @@ -72,14 +72,14 @@ if("set_safety") var/threshold = text2num(params["value"]) if(!isnull(threshold)) - chamber.set_safety(CLAMP(round(threshold, 1),0,500)) + chamber.set_safety(clamp(round(threshold, 1),0,500)) playsound(src, "terminal_type", 25, FALSE) chamber.occupant.investigate_log("'s nanites' safety threshold was set to [threshold] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE if("set_cloud") var/cloud_id = text2num(params["value"]) if(!isnull(cloud_id)) - chamber.set_cloud(CLAMP(round(cloud_id, 1),0,100)) + chamber.set_cloud(clamp(round(cloud_id, 1),0,100)) playsound(src, "terminal_type", 25, FALSE) chamber.occupant.investigate_log("'s nanites' cloud id was set to [cloud_id] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 439d0c5750..f9d4d71b01 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -174,7 +174,7 @@ var/cloud_id = new_backup_id if(!isnull(cloud_id)) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - cloud_id = CLAMP(round(cloud_id, 1),1,100) + cloud_id = clamp(round(cloud_id, 1),1,100) generate_backup(cloud_id, usr) . = TRUE if("delete_backup") diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index ea4392f236..47ee2447d2 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -21,7 +21,7 @@ list(name = "Augmentation Nanites"), list(name = "Suppression Nanites"), list(name = "Weaponized Nanites"), - //list(name = "Protocols") B.E.P.I.S Content, which we dont have + list(name = "Protocols") //Moved to default techweb from B.E.P.I.S. research, for now ) /obj/machinery/nanite_program_hub/Initialize() diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index d81880c6d9..5315a7a507 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -86,13 +86,13 @@ var/target_code = params["target_code"] switch(target_code) if("activation") - program.activation_code = CLAMP(round(new_code, 1),0,9999) + program.activation_code = clamp(round(new_code, 1),0,9999) if("deactivation") - program.deactivation_code = CLAMP(round(new_code, 1),0,9999) + program.deactivation_code = clamp(round(new_code, 1),0,9999) if("kill") - program.kill_code = CLAMP(round(new_code, 1),0,9999) + program.kill_code = clamp(round(new_code, 1),0,9999) if("trigger") - program.trigger_code = CLAMP(round(new_code, 1),0,9999) + program.trigger_code = clamp(round(new_code, 1),0,9999) . = TRUE if("set_extra_setting") program.set_extra_setting(params["target_setting"], params["value"]) @@ -102,7 +102,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_restart = timer . = TRUE @@ -110,7 +110,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_shutdown = timer . = TRUE @@ -118,7 +118,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_trigger = timer . = TRUE @@ -126,7 +126,7 @@ var/timer = text2num(params["delay"]) if(!isnull(timer)) playsound(src, "terminal_type", 25, FALSE) - timer = CLAMP(round(timer, 1), 0, 3600) + timer = clamp(round(timer, 1), 0, 3600) timer *= 10 //convert to deciseconds program.timer_trigger_delay = timer . = TRUE diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 72f969a77e..faa81be0a5 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -290,7 +290,7 @@ qdel(src) ///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once. -//Currently unused due to us lacking the B.E.P.I.S +//Moved to being 'normally' researched due to lack of B.E.P.I.S. /datum/nanite_program/protocol name = "Nanite Protocol" var/protocol_class = NONE diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 70a1412b11..18307ce2c5 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -76,7 +76,8 @@ var/problems = FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) + if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_BASIC))) problems = TRUE if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) problems = TRUE @@ -198,7 +199,8 @@ var/problems = FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) + if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_SURGERY))) problems = TRUE if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) problems = TRUE @@ -208,7 +210,7 @@ host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2) if(iscarbon(host_mob) && prob(10)) var/mob/living/carbon/C = host_mob - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_SURGERY) /datum/nanite_program/defib name = "Defibrillation" diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm index 73976abe09..3830e7c8ba 100644 --- a/code/modules/research/nanites/nanite_programs/protocols.dm +++ b/code/modules/research/nanites/nanite_programs/protocols.dm @@ -105,3 +105,14 @@ /datum/nanite_program/protocol/offline/active_effect() nanites.adjust_nanites(null, boost) + +/datum/nanite_program/protocol/synergy + name = "Synergy Protocol" + desc = "Replication Protocol: the nanites syncronize their tasks and processes within a host, leading to an increase in replication speed proportional to the current nanite volume." + use_rate = 0 + rogue_types = list(/datum/nanite_program/necrotic) + protocol_class = NANITE_PROTOCOL_REPLICATION + var/max_boost = 2 //The maximum boost this program applies to the nanite replication, multiplied with the current nanite 'saturation' percentage + +/datum/nanite_program/protocol/synergy/active_effect() + nanites.adjust_nanites(null, round(max_boost * (nanites.nanite_volume / nanites.max_nanites), 0.1)) diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index 6352f50b8b..ebe623d73d 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -144,7 +144,7 @@ return ..() /datum/nanite_program/metabolic_synthesis/active_effect() - host_mob.nutrition -= 0.5 + host_mob.adjust_nutrition(-0.5) nanites.adjust_nanites(src, 0.5) /datum/nanite_program/research @@ -160,7 +160,7 @@ if(!host_mob.client) //less brainpower points *= 0.25 SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points)) - + /datum/nanite_program/researchplus name = "Neural Network" desc = "The nanites link the host's brains together forming a neural research network, that becomes more efficient with the amount of total hosts." @@ -184,7 +184,7 @@ SSnanites.neural_network_count-- else SSnanites.neural_network_count -= 0.25 - + /datum/nanite_program/researchplus/active_effect() if(!iscarbon(host_mob)) return @@ -234,7 +234,7 @@ var/spread_cooldown = 0 /datum/nanite_program/spreading/active_effect() - if(spread_cooldown < world.time) + if(world.time < spread_cooldown) return spread_cooldown = world.time + 50 var/list/mob/living/target_hosts = list() diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index bd2b9618de..ae0d8d35aa 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -84,7 +84,7 @@ /datum/nanite_program/explosive/on_trigger(comm_message) host_mob.visible_message("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow...",\ "You start emitting a high-pitched buzzing, and your skin begins to glow...") - addtimer(CALLBACK(src, .proc/boom), CLAMP((nanites.nanite_volume * 0.35), 25, 150)) + addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150)) /datum/nanite_program/explosive/proc/boom() var/nanite_amount = nanites.nanite_volume diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 71aecc8f2c..0d9361b534 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -106,7 +106,7 @@ return var/new_code = text2num(params["code"]) if(!isnull(new_code)) - new_code = CLAMP(round(new_code, 1),0,9999) + new_code = clamp(round(new_code, 1),0,9999) code = new_code . = TRUE if("set_relay_code") @@ -114,7 +114,7 @@ return var/new_code = text2num(params["code"]) if(!isnull(new_code)) - new_code = CLAMP(round(new_code, 1),0,9999) + new_code = clamp(round(new_code, 1),0,9999) relay_code = new_code . = TRUE if("update_name") diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index be1b9460b0..d543468c48 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -47,6 +47,9 @@ Nothing else in the console has ID requirements. var/research_control = TRUE + /// Long action cooldown to prevent spam + var/last_long_action = 0 + /obj/machinery/computer/rdconsole/production circuit = /obj/item/circuitboard/computer/rdconsole/production research_control = FALSE @@ -287,7 +290,7 @@ Nothing else in the console has ID requirements. continue var/temp_material var/c = 50 - var/coeff = linked_lathe.efficiency_coeff + var/coeff = linked_lathe.print_cost_coeff if(!linked_lathe.efficient_with(D.build_path)) coeff = 1 @@ -296,20 +299,31 @@ Nothing else in the console has ID requirements. var/t = linked_lathe.check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += "[all_materials[M] * coeff] [CallMaterialName(M)]" else - temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += " [all_materials[M] * coeff] [CallMaterialName(M)]" c = min(c,t) - if (c >= 1) + var/clearance = !(linked_lathe.obj_flags & EMAGGED) && (linked_lathe.offstation_security_levels || is_station_level(linked_lathe.z)) + var/sec_text = "" + if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA)) + sec_text = " (Allowed security levels: " + for(var/n in D.min_security_level to D.max_security_level) + sec_text += NUM2SECLEVEL(n) + if(n + 1 <= D.max_security_level) + sec_text += ", " + sec_text += ")" + + clearance = !clearance || ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level) + if (c >= 1 && clearance) l += "[D.name][RDSCREEN_NOBREAK]" if(c >= 5) l += "x5[RDSCREEN_NOBREAK]" if(c >= 10) l += "x10[RDSCREEN_NOBREAK]" - l += "[temp_material][RDSCREEN_NOBREAK]" + l += "[temp_material][sec_text][RDSCREEN_NOBREAK]" else - l += "[D.name][temp_material][RDSCREEN_NOBREAK]" + l += "[D.name][temp_material][sec_text][RDSCREEN_NOBREAK]" l += "" l += "
    " return l @@ -342,16 +356,16 @@ Nothing else in the console has ID requirements. var/temp_material var/c = 50 var/all_materials = D.materials + D.reagents_list - var/coeff = linked_lathe.efficiency_coeff + var/coeff = linked_lathe.print_cost_coeff if(!linked_lathe.efficient_with(D.build_path)) coeff = 1 for(var/M in all_materials) var/t = linked_lathe.check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += "[all_materials[M] * coeff] [CallMaterialName(M)]" else - temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_material += " [all_materials[M] * coeff] [CallMaterialName(M)]" c = min(c,t) if (c >= 1) @@ -443,7 +457,7 @@ Nothing else in the console has ID requirements. var/check_materials = TRUE var/all_materials = D.materials + D.reagents_list - var/coeff = linked_imprinter.efficiency_coeff + var/coeff = linked_imprinter.print_cost_coeff if(!linked_imprinter.efficient_with(D.build_path)) coeff = 1 @@ -451,9 +465,9 @@ Nothing else in the console has ID requirements. temp_materials += " | " if (!linked_imprinter.check_mat(D, M)) check_materials = FALSE - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M] * coeff] [CallMaterialName(M)]" else - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M] * coeff] [CallMaterialName(M)]" if (check_materials) l += "[D.name][temp_materials]" else @@ -474,16 +488,16 @@ Nothing else in the console has ID requirements. var/temp_materials var/check_materials = TRUE var/all_materials = D.materials + D.reagents_list - var/coeff = linked_imprinter.efficiency_coeff + var/coeff = linked_imprinter.print_cost_coeff if(!linked_imprinter.efficient_with(D.build_path)) coeff = 1 for(var/M in all_materials) temp_materials += " | " if (!linked_imprinter.check_mat(D, M)) check_materials = FALSE - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M] * coeff] [CallMaterialName(M)]" else - temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M] * coeff] [CallMaterialName(M)]" if (check_materials) l += "[D.name][temp_materials]" else @@ -572,10 +586,8 @@ Nothing else in the console has ID requirements. l += "
    [icon2html(linked_destroy.loaded_item, usr)][linked_destroy.loaded_item.name] Eject
    [RDSCREEN_NOBREAK]" l += "Select a node to boost by deconstructing this item. This item can boost:" - var/anything = FALSE var/list/boostable_nodes = techweb_item_boost_check(linked_destroy.loaded_item) for(var/id in boostable_nodes) - anything = TRUE var/list/worth = boostable_nodes[id] var/datum/techweb_node/N = SSresearch.techweb_node_by_id(id) @@ -609,7 +621,6 @@ Nothing else in the console has ID requirements. // point deconstruction and material reclamation use the same ID to prevent accidentally missing the points var/list/point_values = techweb_item_point_check(linked_destroy.loaded_item) if(point_values) - anything = TRUE l += "
    [RDSCREEN_NOBREAK]" if (stored_research.deconstructed_items[linked_destroy.loaded_item.type]) l += "Point Deconstruction" @@ -625,10 +636,8 @@ Nothing else in the console has ID requirements. for (var/M in materials) l += "* [CallMaterialName(M)] x [materials[M]]" l += "
    [RDSCREEN_NOBREAK]" - anything = TRUE - if (!anything) - l += "Nothing!" + l += "" l += "
    " return l @@ -915,6 +924,9 @@ Nothing else in the console has ID requirements. screen = RDSCREEN_MENU say("Ejecting Technology Disk") if(ls["deconstruct"]) + if((last_long_action + 1 SECONDS) > world.time) + return + last_long_action = world.time if(QDELETED(linked_destroy)) say("No Destructive Analyzer Linked!") return @@ -1026,7 +1038,7 @@ Nothing else in the console has ID requirements. autolathe_friendly = FALSE D.category -= "Imported" - if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab + if(D.build_type & (AUTOLATHE|PROTOLATHE|TOYLATHE)) // Specifically excludes circuit imprinter and mechfab D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type D.category |= "Imported" d_disk.blueprints[slot] = D diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index aa781ca06b..a656093d98 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -21,6 +21,16 @@ . = ..() stored_research = new /datum/techweb/admin +/obj/item/disk/tech_disk/major + name = "Reformatted technology disk" + desc = "A disk containing a new, completed tech from the B.E.P.I.S. Upload the disk to an R&D Console to redeem the tech." + icon_state = "rndmajordisk" + custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) + +/obj/item/disk/tech_disk/major/Initialize() + . = ..() + stored_research = new /datum/techweb/bepis + /obj/item/disk/tech_disk/illegal name = "Illegal technology disk" desc = "A technology disk containing schematics for syndicate inspired equipment." diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 388fa3785c..503bd8bae7 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -63,6 +63,19 @@ id = "SCIENCE" organization = "Nanotrasen" +/datum/techweb/bepis //Should contain only 1 BEPIS tech selected at random. + id = "EXPERIMENTAL" + organization = "Nanotrasen R&D" + +/datum/techweb/bepis/New() + . = ..() + var/bepis_id = pick(SSresearch.techweb_nodes_experimental) //To add a new tech to the BEPIS, add the ID to this pick list. + var/datum/techweb_node/BN = (SSresearch.techweb_node_by_id(bepis_id)) + hidden_nodes -= BN.id //Has to be removed from hidden nodes + research_node(BN, TRUE, FALSE, FALSE) + update_node_status(BN) + SSresearch.techweb_nodes_experimental -= bepis_id + /datum/techweb/Destroy() researched_nodes = null researched_designs = null @@ -126,17 +139,17 @@ modify_point_list(l) /datum/techweb/proc/copy_research_to(datum/techweb/receiver, unlock_hidden = TRUE) //Adds any missing research to theirs. + if(unlock_hidden) + for(var/i in receiver.hidden_nodes) + CHECK_TICK + if(!hidden_nodes[i]) + receiver.hidden_nodes -= i //We can see it so let them see it too. for(var/i in researched_nodes) CHECK_TICK receiver.research_node_id(i, TRUE, FALSE) for(var/i in researched_designs) CHECK_TICK receiver.add_design_by_id(i) - if(unlock_hidden) - for(var/i in receiver.hidden_nodes) - CHECK_TICK - if(!hidden_nodes[i]) - receiver.hidden_nodes -= i //We can see it so let them see it too. receiver.recalculate_nodes() /datum/techweb/proc/copy() @@ -199,6 +212,10 @@ researched_designs -= design.id return TRUE +/datum/techweb/proc/get_point_total(list/pointlist) + for(var/i in pointlist) + . += pointlist[i] + /datum/techweb/proc/can_afford(list/pointlist) for(var/i in pointlist) if(research_points[i] < pointlist[i]) @@ -227,6 +244,10 @@ for(var/id in node.design_ids) add_design_by_id(id) update_node_status(node) + if(!istype(src, /datum/techweb/admin)) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI) + if(D) + D.adjust_money(SSeconomy.techweb_bounty) return TRUE /datum/techweb/proc/unresearch_node_id(id) @@ -344,6 +365,7 @@ /datum/techweb/specialized/autounlocking var/design_autounlock_buildtypes = NONE + var/design_autounlock_skip_types = NONE var/design_autounlock_categories = list("initial") //if a design has a buildtype that matches the abovea and either has a category in this or this is null, unlock it. var/node_autounlock_ids = list() //autounlock nodes of this type. @@ -356,7 +378,7 @@ research_node_id(id, TRUE, FALSE) for(var/id in SSresearch.techweb_designs) var/datum/design/D = SSresearch.techweb_design_by_id(id) - if(D.build_type & design_autounlock_buildtypes) + if(D.build_type & (design_autounlock_buildtypes & allowed_buildtypes) && !(D.build_type & design_autounlock_skip_types)) for(var/i in D.category) if(i in design_autounlock_categories) add_design_by_id(D.id) @@ -364,7 +386,16 @@ /datum/techweb/specialized/autounlocking/autolathe design_autounlock_buildtypes = AUTOLATHE - allowed_buildtypes = AUTOLATHE + allowed_buildtypes = AUTOLATHE|TOYLATHE + +/datum/techweb/specialized/autounlocking/autolathe/public + design_autounlock_skip_types = NO_PUBLIC_LATHE + +/datum/techweb/specialized/autounlocking/autolathe/toy + design_autounlock_buildtypes = TOYLATHE + +/datum/techweb/specialized/autounlocking/autolathe/toy/public + design_autounlock_skip_types = NO_PUBLIC_LATHE /datum/techweb/specialized/autounlocking/limbgrower design_autounlock_buildtypes = LIMBGROWER @@ -381,10 +412,6 @@ /datum/techweb/specialized/autounlocking/exofab allowed_buildtypes = MECHFAB -/datum/techweb/specialized/autounlocking/autoylathe - design_autounlock_buildtypes = AUTOYLATHE - allowed_buildtypes = AUTOYLATHE - /datum/techweb/specialized/autounlocking/autobottler design_autounlock_buildtypes = AUTOBOTTLER allowed_buildtypes = AUTOBOTTLER \ No newline at end of file diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index fff3f42b9f..40cc322eed 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -7,6 +7,7 @@ var/display_name = "Errored Node" var/description = "Why are you seeing this?" var/hidden = FALSE //Whether it starts off hidden. + var/experimental = FALSE //If the tech can be randomly granted by the BEPIS as a reward. Meant to be fully given in tech disks, not researched. var/starting_node = FALSE //Whether it's available without any research. var/list/prereq_ids = list() var/list/design_ids = list() @@ -91,4 +92,17 @@ actual_costs[i] -= L[i] return actual_costs else - return research_costs \ No newline at end of file + return research_costs + +//Base Nodes, everything starts from here. + +/datum/techweb_node/base + id = "base" + starting_node = TRUE + display_name = "Basic Research Technology" + description = "NT default research technologies." + // Default research tech, prevents bricking + design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap", + "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", + "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal", + "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm deleted file mode 100644 index fe5f275da5..0000000000 --- a/code/modules/research/techweb/all_nodes.dm +++ /dev/null @@ -1,1046 +0,0 @@ - -//Current rate: 132500 research points in 90 minutes - -//Base Nodes -/datum/techweb_node/base - id = "base" - starting_node = TRUE - display_name = "Basic Research Technology" - description = "NT default research technologies." - // Default research tech, prevents bricking - design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap", - "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", - "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal", - "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass") - -/datum/techweb_node/mmi - id = "mmi" - starting_node = TRUE - display_name = "Man Machine Interface" - description = "A slightly Frankensteinian device that allows human brains to interface natively with software APIs." - design_ids = list("mmi") - -/datum/techweb_node/cyborg - id = "cyborg" - starting_node = TRUE - display_name = "Cyborg Construction" - description = "Sapient robots with preloaded tool modules and programmable laws." - design_ids = list("robocontrol", "sflash", "borg_suit", "borg_head", "borg_chest", "borg_r_arm", "borg_l_arm", "borg_r_leg", "borg_l_leg", "borgupload", - "cyborgrecharger", "borg_upgrade_restart", "borg_upgrade_rename") - -/datum/techweb_node/mech - id = "mecha" - starting_node = TRUE - display_name = "Mechanical Exosuits" - description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." - design_ids = list("mecha_tracking", "mechacontrol", "mechapower", "mech_recharger", "ripley_chassis", "firefighter_chassis", "ripley_torso", "ripley_left_arm", "ripley_right_arm", "ripley_left_leg", "ripley_right_leg", - "ripley_main", "ripley_peri", "mech_hydraulic_clamp") - -/datum/techweb_node/mech_tools - id = "mech_tools" - starting_node = TRUE - display_name = "Basic Exosuit Equipment" - description = "Various tools fit for basic mech units" - design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") - -/datum/techweb_node/surplus_lims - id = "surplus_lims" - display_name = "Basic Prosthetics" - description = "Basic fragile lims for the impaired." - starting_node = TRUE - prereq_ids = list("biotech") - design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg") - -/datum/techweb_node/blueprinted_bottles - id = "blueprinted_bottles" - display_name = "License Bottling" - description = "Some Branded bottles to print and export." - starting_node = TRUE - design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler") - -/datum/techweb_node/blueprinted_exports - id = "blueprinted_exports" - display_name = "License Exports" - description = "Some Branded bottles to print and export." - starting_node = TRUE - design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export") - -/////////////////////////Biotech///////////////////////// -/datum/techweb_node/biotech - id = "biotech" - display_name = "Biological Technology" - description = "What makes us tick." //the MC, silly! - prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/adv_biotech - id = "adv_biotech" - display_name = "Advanced Biotechnology" - description = "Advanced Biotechnology" - prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/bio_process - id = "bio_process" - display_name = "Biological Processing" - description = "From slimes to kitchens." - prereq_ids = list("biotech") - design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/bottle_exports - id = "bottle_exports" - display_name = "Legal Bottling" - prereq_ids = list("blueprinted_bottles") - description = "New bottles for printing and selling." - design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) - -/datum/techweb_node/advance_lims - id = "advance_lims" - display_name = "Upgraded Prosthetics" - description = "Reinforced prosthetics for the impaired." - prereq_ids = list("adv_biotech", "surplus_lims") - design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) - -/datum/techweb_node/advance_surgerytools - id = "advance_surgerytools" - display_name = "Advanced Surgery Tools" - description = "Refined and improved redesigns for the run-of-the-mill medical utensils." - prereq_ids = list("adv_biotech", "adv_surgery") - design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/adv_defibrillator_tec - id = "adv_defibrillator_tec" - display_name = "Defibrillator Upgrades" - description = "More ways to bring back the newly dead." - prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power") - design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/////////////////////////Advanced Surgery///////////////////////// -/datum/techweb_node/imp_wt_surgery - id = "imp_wt_surgery" - display_name = "Improved Wound-Tending Surgery" - description = "Who would have known being more gentle with a hemostat decreases patient pain?" - prereq_ids = list("biotech") - design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - -/datum/techweb_node/adv_surgery - id = "adv_surgery" - display_name = "Advanced Surgery" - description = "When simple medicine doesn't cut it." - prereq_ids = list("imp_wt_surgery") - design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/exp_surgery - id = "exp_surgery" - display_name = "Experimental Surgery" - description = "When evolution isn't fast enough." - prereq_ids = list("adv_surgery") - design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/alien_surgery - id = "alien_surgery" - display_name = "Alien Surgery" - description = "Abductors did nothing wrong." - prereq_ids = list("exp_surgery", "alientech") - design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - -/////////////////////////data theory tech///////////////////////// -/datum/techweb_node/datatheory //Computer science - id = "datatheory" - display_name = "Data Theory" - description = "Big Data, in space!" - prereq_ids = list("base") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/adv_datatheory - id = "adv_datatheory" - display_name = "Advanced Data Theory" - description = "Better insight into programming and data." - prereq_ids = list("datatheory") - design_ids = list("icprinter", "icupgadv", "icupgclo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/////////////////////////engineering tech///////////////////////// -/datum/techweb_node/engineering - id = "engineering" - display_name = "Industrial Engineering" - description = "A refresher course on modern engineering technology." - prereq_ids = list("base") - design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", - "atmosalerts", "atmos_control", "recycler", "autolathe", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", - "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000) - -/datum/techweb_node/adv_engi - id = "adv_engi" - display_name = "Advanced Engineering" - description = "Pushing the boundaries of physics, one chainsaw-fist at a time." - prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) - -/datum/techweb_node/anomaly - id = "anomaly_research" - display_name = "Anomaly Research" - description = "Unlock the potential of the mysterious anomalies that appear on station." - prereq_ids = list("adv_engi", "practical_bluespace") - design_ids = list("reactive_armour", "anomaly_neutralizer") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -/datum/techweb_node/high_efficiency - id = "high_efficiency" - display_name = "High Efficiency Parts" - description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels." - prereq_ids = list("engineering", "datatheory") - design_ids = list("pico_mani", "super_matter_bin") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/adv_power - id = "adv_power" - display_name = "Advanced Power Manipulation" - description = "How to get more zap." - prereq_ids = list("engineering") - design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/* -/datum/techweb_node/basic_meteor_defense - id = "basic_meteor_defense" - display_name = "Meteor Defense Research" - description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves." - prereq_ids = list("adv_engi", "high_efficiency") - design_ids = list("meteor_defence", "meteor_console") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) -*/ - -//datum/techweb_node/adv_meteor_defense - //id = "adv_meteor_defense" - //display_name = "Meteor Defense Research" - //description = "New and improved coding and lock on tech for meteor defence!" - //prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv") - //design_ids = list("meteor_disk") - //research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - -/datum/techweb_node/computer_board_gaming - id = "computer_board_gaming" - display_name = "Games and Toys" - description = "For the slackers on the station." - prereq_ids = list("comptech") - design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - -/////////////////////////Bluespace tech///////////////////////// -/datum/techweb_node/bluespace_basic //Bluespace-memery - id = "bluespace_basic" - display_name = "Basic Bluespace Theory" - description = "Basic studies into the mysterious alternate dimension known as bluespace." - prereq_ids = list("base", "datatheory") - design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/practical_bluespace - id = "practical_bluespace" - display_name = "Applied Bluespace Research" - description = "Using bluespace to make things faster and better." - prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/adv_bluespace - id = "adv_bluespace" - display_name = "Advanced Bluespace Research" - description = "Deeper understanding of how the Bluespace dimension works" - prereq_ids = list("practical_bluespace", "high_efficiency") - design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - -/datum/techweb_node/bluespace_power - id = "bluespace_power" - display_name = "Bluespace Power Technology" - description = "Even more powerful.. power!" - prereq_ids = list("adv_power", "adv_bluespace") - design_ids = list("bluespace_cell", "quadratic_capacitor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/bluespace_holding - id = "bluespace_holding" - display_name = "Bluespace Pockets" - description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality." - prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma") - design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag", "duffelbag_holding") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500) - -/datum/techweb_node/bluespace_portal - id = "bluespace_portal" - display_name = "Bluespace Portals" - description = "Allows for Bluespace Tech to be used tandem with Wormhole tech." - prereq_ids = list("adv_weaponry", "adv_bluespace") - design_ids = list("wormholeprojector") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/bluespace_warping - id = "bluespace_warping" - display_name = "Bluespace Travel" - description = "Application of Bluespace for static teleportation technology." - prereq_ids = list("adv_power", "adv_bluespace") - design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/unregulated_bluespace - id = "unregulated_bluespace" - display_name = "Unregulated Bluespace Research" - description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions." - prereq_ids = list("bluespace_warping", "syndicate_basic") - design_ids = list("desynchronizer") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/////////////////////////plasma tech///////////////////////// -/datum/techweb_node/basic_plasma - id = "basic_plasma" - display_name = "Basic Plasma Research" - description = "Research into the mysterious and dangerous substance, plasma." - prereq_ids = list("engineering") - design_ids = list("mech_generator") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/adv_plasma - id = "adv_plasma" - display_name = "Advanced Plasma Research" - description = "Research on how to fully exploit the power of plasma." - prereq_ids = list("basic_plasma") - design_ids = list("mech_plasma_cutter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/////////////////////////robotics tech///////////////////////// -/datum/techweb_node/robotics - id = "robotics" - display_name = "Basic Robotics Research" - description = "Programmable machines that make our lives lazier." - prereq_ids = list("base") - design_ids = list("paicard", "drone_shell") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/adv_robotics - id = "adv_robotics" - display_name = "Advanced Robotics Research" - description = "It can even do the dishes!" - prereq_ids = list("robotics") - design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_advancedmop", "borg_upgrade_advcutter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/datum/techweb_node/neural_programming - id = "neural_programming" - display_name = "Neural Programming" - description = "Study into networks of processing units that mimic our brains." - prereq_ids = list("biotech", "datatheory") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/posibrain - id = "posibrain" - display_name = "Positronic Brain" - description = "Applied usage of neural technology allowing for autonomous AI units based on special metallic cubes with conductive and processing circuits." - prereq_ids = list("neural_programming") - design_ids = list("mmi_posi") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/cyborg_upg_util - id = "cyborg_upg_util" - display_name = "Cyborg Upgrades: Utility" - description = "Utility upgrades for cyborgs." - prereq_ids = list("engineering", "robotics") - design_ids = list("borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/cyborg_upg_med - id = "cyborg_upg_med" - display_name = "Cyborg Upgrades: Medical" - description = "Medical upgrades for cyborgs." - prereq_ids = list("adv_biotech", "robotics") - design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/cyborg_upg_combat - id = "cyborg_upg_combat" - display_name = "Cyborg Upgrades: Combat" - description = "Military grade upgrades for cyborgs." - prereq_ids = list("adv_robotics", "adv_engi" , "weaponry") - design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/ai - id = "ai" - display_name = "Artificial Intelligence" - description = "AI unit research." - prereq_ids = list("robotics", "posibrain") - design_ids = list("aifixer", "aicore", "safeguard_module", "onehuman_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module", - "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "paladin_module", "tyrant_module", "corporate_module", - "default_module", "borg_ai_control", "mecha_tracking_ai_control", "aiupload", "intellicard") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/////////////////////////EMP tech///////////////////////// -/datum/techweb_node/emp_basic //EMP tech for some reason - id = "emp_basic" - display_name = "Electromagnetic Theory" - description = "Study into usage of frequencies in the electromagnetic spectrum." - prereq_ids = list("base") - design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/emp_adv - id = "emp_adv" - display_name = "Advanced Electromagnetic Theory" - description = "Determining whether reversing the polarity will actually help in a given situation." - prereq_ids = list("emp_basic") - design_ids = list("ultra_micro_laser") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/datum/techweb_node/emp_super - id = "emp_super" - display_name = "Quantum Electromagnetic Technology" //bs - description = "Even better electromagnetic technology." - prereq_ids = list("emp_adv") - design_ids = list("quadultra_micro_laser") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/////////////////////////Clown tech///////////////////////// -/datum/techweb_node/clown - id = "clown" - display_name = "Clown Technology" - description = "Honk?!" - prereq_ids = list("base") - design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm", - "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -////////////////////////Computer tech//////////////////////// -/datum/techweb_node/comptech - id = "comptech" - display_name = "Computer Consoles" - description = "Computers and how they work." - prereq_ids = list("datatheory") - design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get. - id = "computer_hardware_basic" - display_name = "Computer Hardware" - description = "How computer hardware are made." - prereq_ids = list("comptech") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) //they are really kinda shitty - design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired", - "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced", - "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small") - -/datum/techweb_node/comp_recordkeeping - id = "comp_recordkeeping" - display_name = "Computerized Recordkeeping" - description = "Organized record databases and how they're used." - prereq_ids = list("comptech") - design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) - -/datum/techweb_node/telecomms - id = "telecomms" - display_name = "Telecommunications Technology" - description = "Subspace transmission technology for near-instant communications devices." - prereq_ids = list("comptech", "bluespace_basic") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", - "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor") - -/datum/techweb_node/integrated_HUDs - id = "integrated_HUDs" - display_name = "Integrated HUDs" - description = "The usefulness of computerized records, projected straight onto your eyepiece!" - prereq_ids = list("comp_recordkeeping", "emp_basic") - design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - -/datum/techweb_node/NVGtech - id = "NVGtech" - display_name = "Night Vision Technology" - description = "Allows seeing in the dark without actual light!" - prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") - design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -////////////////////////Medical//////////////////////// -/datum/techweb_node/cloning - id = "cloning" - display_name = "Genetic Engineering" - description = "We have the technology to make him." - prereq_ids = list("biotech") - design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/cryotech - id = "cryotech" - display_name = "Cryostasis Technology" - description = "Smart freezing of objects to preserve them!" - prereq_ids = list("adv_engi", "biotech") - design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/subdermal_implants - id = "subdermal_implants" - display_name = "Subdermal Implants" - description = "Electronic implants buried beneath the skin." - prereq_ids = list("biotech", "datatheory") - design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/cyber_organs - id = "cyber_organs" - display_name = "Cybernetic Organs" - description = "We have the technology to rebuild him." - prereq_ids = list("adv_biotech") - design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - -/datum/techweb_node/cyber_organs_upgraded - id = "cyber_organs_upgraded" - display_name = "Upgraded Cybernetic Organs" - description = "We have the technology to upgrade him." - prereq_ids = list("cyber_organs") - design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) - -/datum/techweb_node/cyber_implants - id = "cyber_implants" - display_name = "Cybernetic Implants" - description = "Electronic implants that improve humans." - prereq_ids = list("adv_biotech", "adv_datatheory") - design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/adv_cyber_implants - id = "adv_cyber_implants" - display_name = "Advanced Cybernetic Implants" - description = "Upgraded and more powerful cybernetic implants." - prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs") - design_ids = list("ci-toolset", "ci-surgery", "ci-reviver", "ci-nutrimentplus") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/combat_cyber_implants - id = "combat_cyber_implants" - display_name = "Combat Cybernetic Implants" - description = "Military grade combat implants to improve performance." - prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency") - design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -////////////////////////Tools//////////////////////// -/datum/techweb_node/basic_tools - id = "basic_tools" - display_name = "Basic Tools" - description = "Basic mechanical, electronic, surgical and botanical tools." - prereq_ids = list("base") - design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) - -/datum/techweb_node/basic_mining - id = "basic_mining" - display_name = "Mining Technology" - description = "Better than Efficiency V." - prereq_ids = list("engineering", "basic_plasma") - design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/adv_mining - id = "adv_mining" - display_name = "Advanced Mining Technology" - description = "Efficiency Level 127" //dumb mc references - prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma") - design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo", "plasteel_pick", "titanium_pick") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/janitor - id = "janitor" - display_name = "Advanced Sanitation Technology" - description = "Clean things better, faster, stronger, and harder!" - prereq_ids = list("adv_engi") - design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap", "ci-janitor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag - -/datum/techweb_node/botany - id = "botany" - display_name = "Botanical Engineering" - description = "Botanical tools." - prereq_ids = list("adv_engi", "biotech") - design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) - -/datum/techweb_node/exp_tools - id = "exp_tools" - display_name = "Experimental Tools" - description = "Highly advanced construction tools." - design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan") - prereq_ids = list("adv_engi") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) - -/datum/techweb_node/sec_basic - id = "sec_basic" - display_name = "Basic Security Equipment" - description = "Standard equipment used by security." - design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag") - prereq_ids = list("base") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750) - -/////////////////////////weaponry tech///////////////////////// -/datum/techweb_node/weaponry - id = "weaponry" - display_name = "Weapon Development Technology" - description = "Our researchers have found new to weaponize just about everything now." - prereq_ids = list("engineering") - design_ids = list("pin_testing", "tele_shield", "lasercarbine", "pin_away") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) - -/datum/techweb_node/adv_weaponry - id = "adv_weaponry" - display_name = "Advanced Weapon Development Technology" - description = "Our weapons are breaking the rules of reality by now." - prereq_ids = list("adv_engi", "weaponry") - design_ids = list("pin_loyalty") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) - -/datum/techweb_node/electric_weapons - id = "electronic_weapons" - display_name = "Electric Weapons" - description = "Weapons using electric technology" - prereq_ids = list("weaponry", "adv_power" , "emp_basic") - design_ids = list("stunrevolver", "stunshell", "ioncarbine") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -/datum/techweb_node/radioactive_weapons - id = "radioactive_weapons" - display_name = "Radioactive Weaponry" - description = "Weapons using radioactive technology." - prereq_ids = list("adv_engi", "adv_weaponry") - design_ids = list("nuclear_gun") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/magnetic_weapons - id = "magnetic_weapons" - display_name = "Magnetic Weapons" - description = "Weapons using magnetic technology" - prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") - design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/medical_weapons - id = "medical_weapons" - display_name = "Medical Weaponry" - description = "Weapons using medical technology." - prereq_ids = list("adv_biotech", "adv_weaponry") - design_ids = list("rapidsyringe", "shotgundartcryostatis") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/beam_weapons - id = "beam_weapons" - display_name = "Beam Weaponry" - description = "Various basic beam weapons" - prereq_ids = list("adv_weaponry") - design_ids = list("temp_gun", "xray_laser") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/adv_beam_weapons - id = "adv_beam_weapons" - display_name = "Advanced Beam Weaponry" - description = "Various advanced beam weapons" - prereq_ids = list("beam_weapons") - design_ids = list("beamrifle") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250) // Sniper - -/datum/techweb_node/explosive_weapons - id = "explosive_weapons" - display_name = "Explosive & Pyrotechnical Weaponry" - description = "If the light stuff just won't do it." - prereq_ids = list("adv_weaponry") - design_ids = list("large_Grenade", "pyro_Grenade", "adv_Grenade") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) - -/datum/techweb_node/ballistic_weapons - id = "ballistic_weapons" - display_name = "Ballistic Weaponry" - description = "This isn't research.. This is reverse-engineering!" - prereq_ids = list("weaponry") - design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) - -/datum/techweb_node/exotic_ammo - id = "exotic_ammo" - display_name = "Exotic Ammunition" - description = "They won't know what hit em." - prereq_ids = list("weaponry", "ballistic_weapons") - design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -/datum/techweb_node/gravity_gun - id = "gravity_gun" - display_name = "One-point Bluespace-gravitational Manipulator" - description = "Fancy wording for gravity gun." - prereq_ids = list("adv_weaponry", "adv_bluespace") - design_ids = list("gravitygun", "mech_gravcatapult") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -////////////////////////mech technology//////////////////////// -/datum/techweb_node/adv_mecha - id = "adv_mecha" - display_name = "Advanced Exosuits" - description = "For when you just aren't Gundam enough." - prereq_ids = list("adv_robotics") - design_ids = list("mech_repair_droid") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/odysseus - id = "mecha_odysseus" - display_name = "EXOSUIT: Odysseus" - description = "Odysseus exosuit designs" - prereq_ids = list("base") - design_ids = list("odysseus_chassis", "odysseus_torso", "odysseus_head", "odysseus_left_arm", "odysseus_right_arm" ,"odysseus_left_leg", "odysseus_right_leg", - "odysseus_main", "odysseus_peri") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/gygax - id = "mech_gygax" - display_name = "EXOSUIT: Gygax" - description = "Gygax exosuit designs" - prereq_ids = list("adv_mecha", "weaponry") - design_ids = list("gygax_chassis", "gygax_torso", "gygax_head", "gygax_left_arm", "gygax_right_arm", "gygax_left_leg", "gygax_right_leg", "gygax_main", - "gygax_peri", "gygax_targ", "gygax_armor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/durand - id = "mech_durand" - display_name = "EXOSUIT: Durand" - description = "Durand exosuit designs" - prereq_ids = list("adv_mecha", "adv_weaponry") - design_ids = list("durand_chassis", "durand_torso", "durand_head", "durand_left_arm", "durand_right_arm", "durand_left_leg", "durand_right_leg", "durand_main", - "durand_peri", "durand_targ", "durand_armor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) - -/datum/techweb_node/phazon - id = "mecha_phazon" - display_name = "EXOSUIT: Phazon" - description = "Phazon exosuit designs" - prereq_ids = list("adv_mecha", "weaponry" , "adv_bluespace") - design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main", - "phazon_peri", "phazon_targ", "phazon_armor") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) - -/datum/techweb_node/adv_mecha_tools - id = "adv_mecha_tools" - display_name = "Advanced Exosuit Equipment" - description = "Tools for high level mech suits" - prereq_ids = list("adv_mecha") - design_ids = list("mech_rcd") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/med_mech_tools - id = "med_mech_tools" - display_name = "Medical Exosuit Equipment" - description = "Tools for high level mech suits" - prereq_ids = list("adv_biotech") - design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/mech_modules - id = "adv_mecha_modules" - display_name = "Simple Exosuit Modules" - description = "An advanced piece of mech weaponry" - prereq_ids = list("adv_mecha", "bluespace_power") - design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_scattershot - id = "mecha_tools" - display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" - description = "An advanced piece of mech weaponry" - prereq_ids = list("ballistic_weapons") - design_ids = list("mech_scattershot", "mech_scattershot_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_seedscatter - id = "mech_seedscatter" - display_name = "Exosuit Weapon (Melon Seed \"Scattershot\")" - description = "An advanced piece of mech weaponry" - prereq_ids = list("ballistic_weapons") - design_ids = list("mech_seedscatter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_carbine - id = "mech_carbine" - display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("ballistic_weapons") - design_ids = list("mech_carbine", "mech_carbine_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_ion - id = "mmech_ion" - display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("electronic_weapons", "emp_adv") - design_ids = list("mech_ion") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_tesla - id = "mech_tesla" - display_name = "Exosuit Weapon (MKI Tesla Cannon)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("electronic_weapons", "adv_power") - design_ids = list("mech_tesla") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_laser - id = "mech_laser" - display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" - description = "A basic piece of mech weaponry" - prereq_ids = list("beam_weapons") - design_ids = list("mech_laser") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_laser_heavy - id = "mech_laser_heavy" - display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("adv_beam_weapons") - design_ids = list("mech_laser_heavy") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_grenade_launcher - id = "mech_grenade_launcher" - display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("explosive_weapons") - design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_missile_rack - id = "mech_missile_rack" - display_name = "Exosuit Weapon (BRM-6 Missile Rack)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("explosive_weapons") - design_ids = list("mech_missile_rack", "mech_missile_rack_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/clusterbang_launcher - id = "clusterbang_launcher" - display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("explosive_weapons") - design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_teleporter - id = "mech_teleporter" - display_name = "Exosuit Module (Teleporter Module)" - description = "An advanced piece of mech Equipment" - prereq_ids = list("adv_bluespace") - design_ids = list("mech_teleporter") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_wormhole_gen - id = "mech_wormhole_gen" - display_name = "Exosuit Module (Localized Wormhole Generator)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("adv_bluespace") - design_ids = list("mech_wormhole_gen") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_taser - id = "mech_taser" - display_name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)" - description = "A basic piece of mech weaponry" - prereq_ids = list("electronic_weapons") - design_ids = list("mech_taser") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_lmg - id = "mech_lmg" - display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" - description = "An advanced piece of mech weaponry" - prereq_ids = list("ballistic_weapons") - design_ids = list("mech_lmg", "mech_lmg_ammo") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mech_diamond_drill - id = "mech_diamond_drill" - display_name = "Exosuit Diamond Drill" - description = "A diamond drill fit for a large exosuit" - prereq_ids = list("adv_mining") - design_ids = list("mech_diamond_drill") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/////////////////////////Nanites///////////////////////// -/datum/techweb_node/nanite_base - id = "nanite_base" - display_name = "Basic Nanite Programming" - description = "The basics of nanite construction and programming." - prereq_ids = list("datatheory","robotics") - design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\ - "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\ - "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/nanite_smart - id = "nanite_smart" - display_name = "Smart Nanite Programming" - description = "Nanite programs that require nanites to perform complex actions, act independently, roam or seek targets." - prereq_ids = list("nanite_base","adv_robotics") - design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) - -/datum/techweb_node/nanite_mesh - id = "nanite_mesh" - display_name = "Mesh Nanite Programming" - description = "Nanite programs that require static structures and membranes." - prereq_ids = list("nanite_base","engineering") - design_ids = list("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/nanite_bio - id = "nanite_bio" - display_name = "Biological Nanite Programming" - description = "Nanite programs that require complex biological interaction." - prereq_ids = list("nanite_base","biotech") - design_ids = list("regenerative_nanites", "bloodheal_nanites", "coagulating_nanites","poison_nanites","flesheating_nanites",\ - "sensor_crit_nanites","sensor_death_nanites", "sensor_health_nanites", "sensor_damage_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/nanite_neural - id = "nanite_neural" - display_name = "Neural Nanite Programming" - description = "Nanite programs affecting nerves and brain matter." - prereq_ids = list("nanite_bio") - design_ids = list("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites","good_mood_nanites","bad_mood_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/nanite_synaptic - id = "nanite_synaptic" - display_name = "Synaptic Nanite Programming" - description = "Nanite programs affecting mind and thoughts." - prereq_ids = list("nanite_neural","neural_programming") - design_ids = list("mindshield_nanites", "pacifying_nanites", "blinding_nanites", "sleep_nanites", "mute_nanites", "speech_nanites","hallucination_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/nanite_harmonic - id = "nanite_harmonic" - display_name = "Harmonic Nanite Programming" - description = "Nanite programs that require seamless integration between nanites and biology." - prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh") - design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) - -/datum/techweb_node/nanite_combat - id = "nanite_military" - display_name = "Military Nanite Programming" - description = "Nanite programs that perform military-grade functions." - prereq_ids = list("nanite_harmonic", "syndicate_basic") - design_ids = list("explosive_nanites","pyro_nanites","meltdown_nanites","viral_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) - -/datum/techweb_node/nanite_hazard - id = "nanite_hazard" - display_name = "Hazard Nanite Programs" - description = "Extremely advanced Nanite programs with the potential of being extremely dangerous." - prereq_ids = list("nanite_harmonic", "alientech") - design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - -////////////////////////Alien technology//////////////////////// -/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech - id = "alientech" - display_name = "Alien Technology" - description = "Things used by the greys." - prereq_ids = list("biotech","engineering") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - hidden = TRUE - design_ids = list("alienalloy") - -/datum/techweb_node/alientech/New() - . = ..() - boost_item_paths = typesof(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, - /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien, - /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, - /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor, - /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, - /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor) - -/datum/techweb_node/alien_bio - id = "alien_bio" - display_name = "Alien Biological Tools" - description = "Advanced biological tools." - prereq_ids = list("alientech", "advance_surgerytools") - design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/alien_engi - id = "alien_engi" - display_name = "Alien Engineering" - description = "Alien engineering tools." - prereq_ids = list("alientech", "exp_tools") - design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -/datum/techweb_node/syndicate_basic - id = "syndicate_basic" - display_name = "Illegal Technology" - description = "Dangerous research used to create dangerous objects." - prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons") - design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "syndiesleeper") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - hidden = TRUE - -/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way. - . = ..() - boost_item_paths = list() - for(var/path in GLOB.uplink_items) - var/datum/uplink_item/UI = new path - if(!UI.item || !UI.illegal_tech) - continue - boost_item_paths |= UI.item //allows deconning to unlock. - -/datum/techweb_node/advanced_illegal_ballistics - id = "advanced_illegal_ballistics" - display_name = "Advanced Non-Standard Ballistics" - description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with." - design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip") - prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between. - -//Helpers for debugging/balancing the techweb in its entirety! - -/proc/total_techweb_points() - var/list/datum/techweb_node/processing = list() - for(var/i in subtypesof(/datum/techweb_node)) - processing += new i - var/datum/techweb/TW = new - TW.research_points = list() - for(var/i in processing) - var/datum/techweb_node/TN = i - TW.add_point_list(TN.research_costs) - return TW.research_points - -/proc/total_techweb_points_printout() - var/list/datum/techweb_node/processing = list() - for(var/i in subtypesof(/datum/techweb_node)) - processing += new i - var/datum/techweb/TW = new - TW.research_points = list() - for(var/i in processing) - var/datum/techweb_node/TN = i - TW.add_point_list(TN.research_costs) - return TW.printout_points() diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm new file mode 100644 index 0000000000..567a5dbded --- /dev/null +++ b/code/modules/research/techweb/nodes/alien_nodes.dm @@ -0,0 +1,36 @@ + +////////////////////////Alien technology//////////////////////// +/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech + id = "alientech" + display_name = "Alien Technology" + description = "Things used by the greys." + prereq_ids = list("biotech","engineering") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + hidden = TRUE + design_ids = list("alienalloy") + +/datum/techweb_node/alientech/New() + . = ..() + boost_item_paths = typesof(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, + /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien, + /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, + /obj/item/crowbar/abductor, /obj/item/multitool/abductor, + /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor, + /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, + /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor) + +/datum/techweb_node/alien_bio + id = "alien_bio" + display_name = "Alien Biological Tools" + description = "Advanced biological tools." + prereq_ids = list("alientech", "advance_surgerytools") + design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/alien_engi + id = "alien_engi" + display_name = "Alien Engineering" + description = "Alien engineering tools." + prereq_ids = list("alientech", "exp_tools") + design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm new file mode 100644 index 0000000000..41d3a08d64 --- /dev/null +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -0,0 +1,91 @@ +////////////////////////B.E.P.I.S. Locked Techs//////////////////////// + +/datum/techweb_node/light_apps + id = "light_apps" + display_name = "Illumination Applications" + description = "Applications of lighting and vision technology not originally thought to be commercially viable." + prereq_ids = list("base") + design_ids = list("bright_helmet", "rld_mini") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/aus_security + id = "aus_security" + display_name = "Australicus Security Protocols" + description = "It is said that security in the Australicus sector is tight, so we took some pointers from their equipment. Thankfully, our sector lacks any signs of these, 'dropbears'." + prereq_ids = list("base") + design_ids = list("pin_explorer", "stun_boomerang") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/spec_eng + id = "spec_eng" + display_name = "Specialized Engineering" + description = "Conventional wisdom has deemed these engineering products 'technically' safe, but far too dangerous to traditionally condone." + prereq_ids = list("base") + design_ids = list("lava_rods", "eng_gloves") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/rolling_table + id = "rolling_table" + display_name = "Advanced Wheel Applications" + description = "Adding wheels to things can lead to extremely beneficial outcomes." + prereq_ids = list("base") + design_ids = list("rolling_table") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/Mauna_Mug + id = "mauna_mug" + display_name = "Mauna Mug" + description = "A bored scientist was thinking to himself for very long...and then realized his coffee got cold! He made this invention to solve this extreme problem." + prereq_ids = list("base") + design_ids = list("mauna_mug") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/nanite_replication_protocols + id = "nanite_replication_protocols" + display_name = "Nanite Replication Protocols" + description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster." + prereq_ids = list("nanite_smart") + design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/interrogation + id = "interrogation" + display_name = "Enhanced Interrogation Technology" + description = "By cross-referencing several declassified documents from past dictatorial regimes, we were able to develop an incredibly effective interrogation device. \ + Ethical concerns about loss of free will may still apply, according to galactic law." + prereq_ids = list("base") + design_ids = list("hypnochair") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/tackle_advanced + id = "tackle_advanced" + display_name = "Advanced Grapple Technology" + description = "Nanotrasen would like to remind its researching staff that it is never acceptable to \"glomp\" your coworkers, and further \"scientific trials\" on the subject \ + will no longer be accepted in its academic journals." + design_ids = list("tackle_dolphin", "tackle_rocket") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/sticky_advanced + id = "sticky_advanced" + display_name = "Advanced Sticky Technology" + description = "Taking a good joke too far? Nonsense!" + design_ids = list("super_sticky_tape", "pointy_tape") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm new file mode 100644 index 0000000000..977f8685d6 --- /dev/null +++ b/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -0,0 +1,25 @@ + +/////////////////////////Biotech///////////////////////// +/datum/techweb_node/biotech + id = "biotech" + display_name = "Biological Technology" + description = "What makes us tick." //the MC, silly! + prereq_ids = list("base") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner","chem_pack") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/adv_biotech + id = "adv_biotech" + display_name = "Advanced Biotechnology" + description = "Advanced Biotechnology" + prereq_ids = list("biotech") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "containmentbodybag") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/bio_process + id = "bio_process" + display_name = "Biological Processing" + description = "From slimes to kitchens." + prereq_ids = list("biotech") + design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm new file mode 100644 index 0000000000..3aacc9fec5 --- /dev/null +++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -0,0 +1,98 @@ + +/////////////////////////Bluespace tech///////////////////////// +/datum/techweb_node/bluespace_basic //Bluespace-memery + id = "bluespace_basic" + display_name = "Basic Bluespace Theory" + description = "Basic studies into the mysterious alternate dimension known as bluespace." + prereq_ids = list("base", "datatheory") + design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/practical_bluespace + id = "practical_bluespace" + display_name = "Applied Bluespace Research" + description = "Using bluespace to make things faster and better." + prereq_ids = list("bluespace_basic", "engineering") + design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/adv_bluespace + id = "adv_bluespace" + display_name = "Advanced Bluespace Research" + description = "Deeper understanding of how the Bluespace dimension works" + prereq_ids = list("practical_bluespace", "high_efficiency") + design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + +/datum/techweb_node/bluespace_power + id = "bluespace_power" + display_name = "Bluespace Power Technology" + description = "Even more powerful.. power!" + prereq_ids = list("adv_power", "adv_bluespace") + design_ids = list("bluespace_cell", "quadratic_capacitor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/bluespace_holding + id = "bluespace_holding" + display_name = "Bluespace Pockets" + description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality." + prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma") + design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag", "duffelbag_holding") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500) + +/datum/techweb_node/bluespace_portal + id = "bluespace_portal" + display_name = "Bluespace Portals" + description = "Allows for Bluespace Tech to be used tandem with Wormhole tech." + prereq_ids = list("adv_weaponry", "adv_bluespace") + design_ids = list("wormholeprojector") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/bluespace_warping + id = "bluespace_warping" + display_name = "Bluespace Travel" + description = "Application of Bluespace for static teleportation technology." + prereq_ids = list("adv_power", "adv_bluespace") + design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/unregulated_bluespace + id = "unregulated_bluespace" + display_name = "Unregulated Bluespace Research" + description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions." + prereq_ids = list("bluespace_warping", "syndicate_basic") + design_ids = list("desynchronizer") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/////////////////////////shuttle tech///////////////////////// +/datum/techweb_node/basic_shuttle_tech + id = "basic_shuttle" + display_name = "Basic Shuttle Research" + description = "Research the technology required to create and use basic shuttles." + prereq_ids = list("practical_bluespace", "adv_engi") + design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/shuttle_route_upgrade + id = "shuttle_route_upgrade" + display_name = "Route Optimisation Upgrade" + description = "Research into bluespace tunnelling, allowing us to reduce flight times by up to 20%!" + prereq_ids = list("basic_shuttle") + design_ids = list("disk_shuttle_route") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/shuttle_route_upgrade_hyper + id = "shuttle_route_upgrade_hyper" + display_name = "Hyperlane Optimisation Upgrade" + description = "Research into bluespace hyperlane, allowing us to reduce flight times by up to 40%!" + prereq_ids = list("shuttle_route_upgrade", "bluespace_warping") + design_ids = list("disk_shuttle_route_hyper") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/shuttle_route_upgrade_void + id = "shuttle_route_upgrade_void" + display_name = "Nullspace Breaching Upgrade" + description = "Research into voidspace tunnelling, allowing us to significantly reduce flight times." + prereq_ids = list("shuttle_route_upgrade_hyper", "alientech") + design_ids = list("disk_shuttle_route_void", "engine_void") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500) diff --git a/code/modules/research/techweb/nodes/computer_hud_nodes.dm b/code/modules/research/techweb/nodes/computer_hud_nodes.dm new file mode 100644 index 0000000000..2835edc52b --- /dev/null +++ b/code/modules/research/techweb/nodes/computer_hud_nodes.dm @@ -0,0 +1,60 @@ + +////////////////////////Computer tech//////////////////////// +/datum/techweb_node/comptech + id = "comptech" + display_name = "Computer Consoles" + description = "Computers and how they work." + prereq_ids = list("datatheory") + design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get. + id = "computer_hardware_basic" + display_name = "Computer Hardware" + description = "How computer hardware are made." + prereq_ids = list("comptech") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) //they are really kinda shitty + design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired", + "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced", + "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small") + +/datum/techweb_node/comp_recordkeeping + id = "comp_recordkeeping" + display_name = "Computerized Recordkeeping" + description = "Organized record databases and how they're used." + prereq_ids = list("comptech") + design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) + +/datum/techweb_node/telecomms + id = "telecomms" + display_name = "Telecommunications Technology" + description = "Subspace transmission technology for near-instant communications devices." + prereq_ids = list("comptech", "bluespace_basic") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", + "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor") + +/datum/techweb_node/integrated_HUDs + id = "integrated_HUDs" + display_name = "Integrated HUDs" + description = "The usefulness of computerized records, projected straight onto your eyepiece!" + prereq_ids = list("comp_recordkeeping", "emp_basic") + design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + +/datum/techweb_node/NVGtech + id = "NVGtech" + display_name = "Night Vision Technology" + description = "Allows seeing in the dark without actual light!" + prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") + design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/computer_board_gaming + id = "computer_board_gaming" + display_name = "Games and Toys" + description = "For the slackers on the station." + prereq_ids = list("comptech") + design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm new file mode 100644 index 0000000000..eac8c2faf2 --- /dev/null +++ b/code/modules/research/techweb/nodes/engineering_nodes.dm @@ -0,0 +1,60 @@ + +/////////////////////////engineering tech///////////////////////// +/datum/techweb_node/engineering + id = "engineering" + display_name = "Industrial Engineering" + description = "A refresher course on modern engineering technology." + prereq_ids = list("base") + design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", + "atmosalerts", "atmos_control", "recycler", "autolathe", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", + "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo","oxygen_tank", + "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000) + +/datum/techweb_node/adv_engi + id = "adv_engi" + display_name = "Advanced Engineering" + description = "Pushing the boundaries of physics, one chainsaw-fist at a time." + prereq_ids = list("engineering", "emp_basic") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) + +/datum/techweb_node/anomaly + id = "anomaly_research" + display_name = "Anomaly Research" + description = "Unlock the potential of the mysterious anomalies that appear on station." + prereq_ids = list("adv_engi", "practical_bluespace") + design_ids = list("reactive_armour", "anomaly_neutralizer") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/high_efficiency + id = "high_efficiency" + display_name = "High Efficiency Parts" + description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels." + prereq_ids = list("engineering", "datatheory") + design_ids = list("pico_mani", "super_matter_bin") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/adv_power + id = "adv_power" + display_name = "Advanced Power Manipulation" + description = "How to get more zap." + prereq_ids = list("engineering") + design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/* +/datum/techweb_node/basic_meteor_defense + id = "basic_meteor_defense" + display_name = "Meteor Defense Research" + description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves." + prereq_ids = list("adv_engi", "high_efficiency") + design_ids = list("meteor_defence", "meteor_console") + +/datum/techweb_node/adv_meteor_defense + id = "adv_meteor_defense" + display_name = "Meteor Defense Research" + description = "New and improved coding and lock on tech for meteor defence!" + prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv") + design_ids = list("meteor_disk") +*/ diff --git a/code/modules/research/techweb/nodes/export_nodes.dm b/code/modules/research/techweb/nodes/export_nodes.dm new file mode 100644 index 0000000000..cbdedef113 --- /dev/null +++ b/code/modules/research/techweb/nodes/export_nodes.dm @@ -0,0 +1,21 @@ +/datum/techweb_node/blueprinted_bottles + id = "blueprinted_bottles" + display_name = "License Bottling" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler") + +/datum/techweb_node/blueprinted_exports + id = "blueprinted_exports" + display_name = "License Exports" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export") + +/datum/techweb_node/bottle_exports + id = "bottle_exports" + display_name = "Legal Bottling" + prereq_ids = list("blueprinted_bottles") + description = "New bottles for printing and selling." + design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) diff --git a/code/modules/research/techweb/nodes/mecha_nodes.dm b/code/modules/research/techweb/nodes/mecha_nodes.dm new file mode 100644 index 0000000000..4d1b703cae --- /dev/null +++ b/code/modules/research/techweb/nodes/mecha_nodes.dm @@ -0,0 +1,205 @@ + +////////////////////////mech technology//////////////////////// + +/datum/techweb_node/mech + id = "mecha" + starting_node = TRUE + display_name = "Mechanical Exosuits" + description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." + design_ids = list("mecha_tracking", "mechacontrol", "mechapower", "mech_recharger", "ripley_chassis", "firefighter_chassis", "ripley_torso", "ripley_left_arm", "ripley_right_arm", "ripley_left_leg", "ripley_right_leg", + "ripley_main", "ripley_peri", "mech_hydraulic_clamp") + +/datum/techweb_node/mech_tools + id = "mech_tools" + starting_node = TRUE + display_name = "Basic Exosuit Equipment" + description = "Various tools fit for basic mech units" + design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") + +/datum/techweb_node/adv_mecha + id = "adv_mecha" + display_name = "Advanced Exosuits" + description = "For when you just aren't Gundam enough." + prereq_ids = list("adv_robotics") + design_ids = list("mech_repair_droid") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/odysseus + id = "mecha_odysseus" + display_name = "EXOSUIT: Odysseus" + description = "Odysseus exosuit designs" + prereq_ids = list("base") + design_ids = list("odysseus_chassis", "odysseus_torso", "odysseus_head", "odysseus_left_arm", "odysseus_right_arm" ,"odysseus_left_leg", "odysseus_right_leg", + "odysseus_main", "odysseus_peri") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/gygax + id = "mech_gygax" + display_name = "EXOSUIT: Gygax" + description = "Gygax exosuit designs" + prereq_ids = list("adv_mecha", "weaponry") + design_ids = list("gygax_chassis", "gygax_torso", "gygax_head", "gygax_left_arm", "gygax_right_arm", "gygax_left_leg", "gygax_right_leg", "gygax_main", + "gygax_peri", "gygax_targ", "gygax_armor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/durand + id = "mech_durand" + display_name = "EXOSUIT: Durand" + description = "Durand exosuit designs" + prereq_ids = list("adv_mecha", "adv_weaponry") + design_ids = list("durand_chassis", "durand_torso", "durand_head", "durand_left_arm", "durand_right_arm", "durand_left_leg", "durand_right_leg", "durand_main", + "durand_peri", "durand_targ", "durand_armor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) + +/datum/techweb_node/phazon + id = "mecha_phazon" + display_name = "EXOSUIT: Phazon" + description = "Phazon exosuit designs" + prereq_ids = list("adv_mecha", "weaponry" , "adv_bluespace") + design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main", + "phazon_peri", "phazon_targ", "phazon_armor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/datum/techweb_node/adv_mecha_tools + id = "adv_mecha_tools" + display_name = "Advanced Exosuit Equipment" + description = "Tools for high level mech suits" + prereq_ids = list("adv_mecha") + design_ids = list("mech_rcd") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/med_mech_tools + id = "med_mech_tools" + display_name = "Medical Exosuit Equipment" + description = "Tools for high level mech suits" + prereq_ids = list("adv_biotech") + design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/mech_modules + id = "adv_mecha_modules" + display_name = "Simple Exosuit Modules" + description = "An advanced piece of mech weaponry" + prereq_ids = list("adv_mecha", "bluespace_power") + design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_scattershot + id = "mecha_tools" + display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" + description = "An advanced piece of mech weaponry" + prereq_ids = list("ballistic_weapons") + design_ids = list("mech_scattershot", "mech_scattershot_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_seedscatter + id = "mech_seedscatter" + display_name = "Exosuit Weapon (Melon Seed \"Scattershot\")" + description = "An advanced piece of mech weaponry" + prereq_ids = list("ballistic_weapons") + design_ids = list("mech_seedscatter") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_carbine + id = "mech_carbine" + display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("ballistic_weapons") + design_ids = list("mech_carbine", "mech_carbine_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_ion + id = "mmech_ion" + display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("electronic_weapons", "emp_adv") + design_ids = list("mech_ion") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_tesla + id = "mech_tesla" + display_name = "Exosuit Weapon (MKI Tesla Cannon)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("electronic_weapons", "adv_power") + design_ids = list("mech_tesla") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_laser + id = "mech_laser" + display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" + description = "A basic piece of mech weaponry" + prereq_ids = list("beam_weapons") + design_ids = list("mech_laser") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_laser_heavy + id = "mech_laser_heavy" + display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("adv_beam_weapons") + design_ids = list("mech_laser_heavy") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_grenade_launcher + id = "mech_grenade_launcher" + display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("explosive_weapons") + design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_missile_rack + id = "mech_missile_rack" + display_name = "Exosuit Weapon (BRM-6 Missile Rack)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("explosive_weapons") + design_ids = list("mech_missile_rack", "mech_missile_rack_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/clusterbang_launcher + id = "clusterbang_launcher" + display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("explosive_weapons") + design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_teleporter + id = "mech_teleporter" + display_name = "Exosuit Module (Teleporter Module)" + description = "An advanced piece of mech Equipment" + prereq_ids = list("adv_bluespace") + design_ids = list("mech_teleporter") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_wormhole_gen + id = "mech_wormhole_gen" + display_name = "Exosuit Module (Localized Wormhole Generator)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("adv_bluespace") + design_ids = list("mech_wormhole_gen") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_taser + id = "mech_taser" + display_name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)" + description = "A basic piece of mech weaponry" + prereq_ids = list("electronic_weapons") + design_ids = list("mech_taser") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_lmg + id = "mech_lmg" + display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" + description = "An advanced piece of mech weaponry" + prereq_ids = list("ballistic_weapons") + design_ids = list("mech_lmg", "mech_lmg_ammo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mech_diamond_drill + id = "mech_diamond_drill" + display_name = "Exosuit Diamond Drill" + description = "A diamond drill fit for a large exosuit" + prereq_ids = list("adv_mining") + design_ids = list("mech_diamond_drill") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm new file mode 100644 index 0000000000..71dd7c943c --- /dev/null +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -0,0 +1,132 @@ + +////////////////////////Medical//////////////////////// +/datum/techweb_node/cloning + id = "cloning" + display_name = "Genetic Engineering" + description = "We have the technology to make him." + prereq_ids = list("biotech") + design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/cryotech + id = "cryotech" + display_name = "Cryostasis Technology" + description = "Smart freezing of objects to preserve them!" + prereq_ids = list("adv_engi", "biotech") + design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/adv_defibrillator_tec + id = "adv_defibrillator_tec" + display_name = "Defibrillator Upgrades" + description = "More ways to bring back the newly dead." + prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power") + design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +//////////////////////Cybernetics///////////////////// + +/datum/techweb_node/surplus_limbs + id = "surplus_limbs" + display_name = "Basic Prosthetics" + description = "Basic fragile prosthetics for the impaired." + starting_node = TRUE + prereq_ids = list("biotech") + design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg") + +/datum/techweb_node/advance_limbs + id = "advance_limbs" + display_name = "Upgraded Prosthetics" + description = "Reinforced prosthetics for the impaired." + prereq_ids = list("adv_biotech", "surplus_limbs") + design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) + +/datum/techweb_node/subdermal_implants + id = "subdermal_implants" + display_name = "Subdermal Implants" + description = "Electronic implants buried beneath the skin." + prereq_ids = list("biotech", "datatheory") + design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/cyber_organs + id = "cyber_organs" + display_name = "Cybernetic Organs" + description = "We have the technology to rebuild him." + prereq_ids = list("adv_biotech") + design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + +/datum/techweb_node/cyber_organs_upgraded + id = "cyber_organs_upgraded" + display_name = "Upgraded Cybernetic Organs" + description = "We have the technology to upgrade him." + prereq_ids = list("cyber_organs") + design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + +/datum/techweb_node/cyber_implants + id = "cyber_implants" + display_name = "Cybernetic Implants" + description = "Electronic implants that improve humans." + prereq_ids = list("adv_biotech", "adv_datatheory") + design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/adv_cyber_implants + id = "adv_cyber_implants" + display_name = "Advanced Cybernetic Implants" + description = "Upgraded and more powerful cybernetic implants." + prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs") + design_ids = list("ci-toolset", "ci-surgery", "ci-reviver", "ci-nutrimentplus") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/combat_cyber_implants + id = "combat_cyber_implants" + display_name = "Combat Cybernetic Implants" + description = "Military grade combat implants to improve performance." + prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency") + design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters", "ci-shield") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/////////////////////////Advanced Surgery///////////////////////// +/datum/techweb_node/imp_wt_surgery + id = "imp_wt_surgery" + display_name = "Improved Wound-Tending Surgery" + description = "Who would have known being more gentle with a hemostat decreases patient pain?" + prereq_ids = list("biotech") + design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + +/datum/techweb_node/advance_surgerytools + id = "advance_surgerytools" + display_name = "Advanced Surgery Tools" + description = "Refined and improved redesigns for the run-of-the-mill medical utensils." + prereq_ids = list("adv_biotech", "adv_surgery") + design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/adv_surgery + id = "adv_surgery" + display_name = "Advanced Surgery" + description = "When simple medicine doesn't cut it." + prereq_ids = list("imp_wt_surgery") + design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/exp_surgery + id = "exp_surgery" + display_name = "Experimental Surgery" + description = "When evolution isn't fast enough." + prereq_ids = list("adv_surgery") + design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/alien_surgery + id = "alien_surgery" + display_name = "Alien Surgery" + description = "Abductors did nothing wrong." + prereq_ids = list("exp_surgery", "alientech") + design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm new file mode 100644 index 0000000000..3f8ad8592a --- /dev/null +++ b/code/modules/research/techweb/nodes/misc_nodes.dm @@ -0,0 +1,89 @@ + +/////////////////////////data theory tech///////////////////////// +/datum/techweb_node/datatheory //Computer science + id = "datatheory" + display_name = "Data Theory" + description = "Big Data, in space!" + prereq_ids = list("base") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/adv_datatheory + id = "adv_datatheory" + display_name = "Advanced Data Theory" + description = "Better insight into programming and data." + prereq_ids = list("datatheory") + design_ids = list("icprinter", "icupgadv", "icupgclo") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/////////////////////////plasma tech///////////////////////// +/datum/techweb_node/basic_plasma + id = "basic_plasma" + display_name = "Basic Plasma Research" + description = "Research into the mysterious and dangerous substance, plasma." + prereq_ids = list("engineering") + design_ids = list("mech_generator") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/adv_plasma + id = "adv_plasma" + display_name = "Advanced Plasma Research" + description = "Research on how to fully exploit the power of plasma." + prereq_ids = list("basic_plasma") + design_ids = list("mech_plasma_cutter") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/////////////////////////EMP tech///////////////////////// +/datum/techweb_node/emp_basic //EMP tech for some reason + id = "emp_basic" + display_name = "Electromagnetic Theory" + description = "Study into usage of frequencies in the electromagnetic spectrum." + prereq_ids = list("base") + design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/emp_adv + id = "emp_adv" + display_name = "Advanced Electromagnetic Theory" + description = "Determining whether reversing the polarity will actually help in a given situation." + prereq_ids = list("emp_basic") + design_ids = list("ultra_micro_laser") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/datum/techweb_node/emp_super + id = "emp_super" + display_name = "Quantum Electromagnetic Technology" //bs + description = "Even better electromagnetic technology." + prereq_ids = list("emp_adv") + design_ids = list("quadultra_micro_laser") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/////////////////////////Clown tech///////////////////////// +/datum/techweb_node/clown + id = "clown" + display_name = "Clown Technology" + description = "Honk?!" + prereq_ids = list("base") + design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm", + "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +////////////////////////Tape tech//////////////////////////// +/datum/techweb_node/sticky_basic + id = "sticky_basic" + display_name = "Basic Sticky Technology" + description = "The only thing left to do after researching this tech is to start printing out a bunch of 'kick me' signs." + prereq_ids = list("base") + design_ids = list("sticky_tape") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE + +// Can be researched after getting the basic sticky technology from the BEPIS major reward +/datum/techweb_node/sticky_advanced + id = "sticky_advanced" + display_name = "Advanced Sticky Technology" + description = "Taking a good joke too far? Nonsense!" + prereq_ids = list("sticky_basic") + design_ids = list("super_sticky_tape", "pointy_tape") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + hidden = TRUE \ No newline at end of file diff --git a/code/modules/research/techweb/nodes/nanites_nodes.dm b/code/modules/research/techweb/nodes/nanites_nodes.dm new file mode 100644 index 0000000000..0a860c8938 --- /dev/null +++ b/code/modules/research/techweb/nodes/nanites_nodes.dm @@ -0,0 +1,76 @@ + +/////////////////////////Nanites///////////////////////// +/datum/techweb_node/nanite_base + id = "nanite_base" + display_name = "Basic Nanite Programming" + description = "The basics of nanite construction and programming." + prereq_ids = list("datatheory","robotics") + design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\ + "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\ + "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/nanite_smart + id = "nanite_smart" + display_name = "Smart Nanite Programming" + description = "Nanite programs that require nanites to perform complex actions, act independently, roam or seek targets." + prereq_ids = list("nanite_base","adv_robotics") + design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/nanite_mesh + id = "nanite_mesh" + display_name = "Mesh Nanite Programming" + description = "Nanite programs that require static structures and membranes." + prereq_ids = list("nanite_base","engineering") + design_ids = list("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/nanite_bio + id = "nanite_bio" + display_name = "Biological Nanite Programming" + description = "Nanite programs that require complex biological interaction." + prereq_ids = list("nanite_base","biotech") + design_ids = list("regenerative_nanites", "bloodheal_nanites", "coagulating_nanites","poison_nanites","flesheating_nanites",\ + "sensor_crit_nanites","sensor_death_nanites", "sensor_health_nanites", "sensor_damage_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/nanite_neural + id = "nanite_neural" + display_name = "Neural Nanite Programming" + description = "Nanite programs affecting nerves and brain matter." + prereq_ids = list("nanite_bio") + design_ids = list("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites","good_mood_nanites","bad_mood_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/nanite_synaptic + id = "nanite_synaptic" + display_name = "Synaptic Nanite Programming" + description = "Nanite programs affecting mind and thoughts." + prereq_ids = list("nanite_neural","neural_programming") + design_ids = list("mindshield_nanites", "pacifying_nanites", "blinding_nanites", "sleep_nanites", "mute_nanites", "speech_nanites","hallucination_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/nanite_harmonic + id = "nanite_harmonic" + display_name = "Harmonic Nanite Programming" + description = "Nanite programs that require seamless integration between nanites and biology." + prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh") + design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) + +/datum/techweb_node/nanite_combat + id = "nanite_military" + display_name = "Military Nanite Programming" + description = "Nanite programs that perform military-grade functions." + prereq_ids = list("nanite_harmonic", "syndicate_basic") + design_ids = list("explosive_nanites","pyro_nanites","meltdown_nanites","viral_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) + +/datum/techweb_node/nanite_hazard + id = "nanite_hazard" + display_name = "Hazard Nanite Programs" + description = "Extremely advanced Nanite programs with the potential of being extremely dangerous." + prereq_ids = list("nanite_harmonic", "alientech") + design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) diff --git a/code/modules/research/techweb/nodes/robotics_nodes.dm b/code/modules/research/techweb/nodes/robotics_nodes.dm new file mode 100644 index 0000000000..6248cd99aa --- /dev/null +++ b/code/modules/research/techweb/nodes/robotics_nodes.dm @@ -0,0 +1,81 @@ + +/////////////////////////robotics tech///////////////////////// +/datum/techweb_node/robotics + id = "robotics" + display_name = "Basic Robotics Research" + description = "Programmable machines that make our lives lazier." + prereq_ids = list("base") + design_ids = list("paicard", "drone_shell") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/mmi + id = "mmi" + starting_node = TRUE + display_name = "Man Machine Interface" + description = "A slightly Frankensteinian device that allows human brains to interface natively with software APIs." + design_ids = list("mmi") + +/datum/techweb_node/cyborg + id = "cyborg" + starting_node = TRUE + display_name = "Cyborg Construction" + description = "Sapient robots with preloaded tool modules and programmable laws." + design_ids = list("robocontrol", "sflash", "borg_suit", "borg_head", "borg_chest", "borg_r_arm", "borg_l_arm", "borg_r_leg", "borg_l_leg", "borgupload", + "cyborgrecharger", "borg_upgrade_restart", "borg_upgrade_rename") + +/datum/techweb_node/adv_robotics + id = "adv_robotics" + display_name = "Advanced Robotics Research" + description = "It can even do the dishes!" + prereq_ids = list("robotics") + design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_advancedmop", "borg_upgrade_advcutter") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) + +/datum/techweb_node/neural_programming + id = "neural_programming" + display_name = "Neural Programming" + description = "Study into networks of processing units that mimic our brains." + prereq_ids = list("biotech", "datatheory") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/posibrain + id = "posibrain" + display_name = "Positronic Brain" + description = "Applied usage of neural technology allowing for autonomous AI units based on special metallic cubes with conductive and processing circuits." + prereq_ids = list("neural_programming") + design_ids = list("mmi_posi") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/cyborg_upg_util + id = "cyborg_upg_util" + display_name = "Cyborg Upgrades: Utility" + description = "Utility upgrades for cyborgs." + prereq_ids = list("engineering", "robotics") + design_ids = list("borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/cyborg_upg_med + id = "cyborg_upg_med" + display_name = "Cyborg Upgrades: Medical" + description = "Medical upgrades for cyborgs." + prereq_ids = list("adv_biotech", "robotics") + design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/cyborg_upg_combat + id = "cyborg_upg_combat" + display_name = "Cyborg Upgrades: Combat" + description = "Military grade upgrades for cyborgs." + prereq_ids = list("adv_robotics", "adv_engi" , "weaponry") + design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/ai + id = "ai" + display_name = "Artificial Intelligence" + description = "AI unit research." + prereq_ids = list("robotics", "posibrain") + design_ids = list("aifixer", "aicore", "safeguard_module", "onehuman_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module", + "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "paladin_module", "tyrant_module", "corporate_module", + "default_module", "borg_ai_control", "mecha_tracking_ai_control", "aiupload", "intellicard") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/techweb/nodes/syndicate_nodes.dm b/code/modules/research/techweb/nodes/syndicate_nodes.dm new file mode 100644 index 0000000000..193ed8653b --- /dev/null +++ b/code/modules/research/techweb/nodes/syndicate_nodes.dm @@ -0,0 +1,50 @@ + +/datum/techweb_node/syndicate_basic + id = "syndicate_basic" + display_name = "Illegal Technology" + description = "Dangerous research used to create dangerous objects." + prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons") + design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "syndiesleeper") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + hidden = TRUE + +/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way. + . = ..() + boost_item_paths = list() + for(var/path in GLOB.uplink_items) + var/datum/uplink_item/UI = new path + if(!UI.item || !UI.illegal_tech) + continue + boost_item_paths |= UI.item //allows deconning to unlock. + +/datum/techweb_node/advanced_illegal_ballistics + id = "advanced_illegal_ballistics" + display_name = "Advanced Non-Standard Ballistics" + description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with." + design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip") + prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between. + +//Helpers for debugging/balancing the techweb in its entirety! + +/proc/total_techweb_points() + var/list/datum/techweb_node/processing = list() + for(var/i in subtypesof(/datum/techweb_node)) + processing += new i + var/datum/techweb/TW = new + TW.research_points = list() + for(var/i in processing) + var/datum/techweb_node/TN = i + TW.add_point_list(TN.research_costs) + return TW.research_points + +/proc/total_techweb_points_printout() + var/list/datum/techweb_node/processing = list() + for(var/i in subtypesof(/datum/techweb_node)) + processing += new i + var/datum/techweb/TW = new + TW.research_points = list() + for(var/i in processing) + var/datum/techweb_node/TN = i + TW.add_point_list(TN.research_costs) + return TW.printout_points() diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm new file mode 100644 index 0000000000..5d8d40f10d --- /dev/null +++ b/code/modules/research/techweb/nodes/tools_nodes.dm @@ -0,0 +1,57 @@ + +////////////////////////Tools//////////////////////// +/datum/techweb_node/basic_tools + id = "basic_tools" + display_name = "Basic Tools" + description = "Basic mechanical, electronic, surgical and botanical tools." + prereq_ids = list("base") + design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) + +/datum/techweb_node/basic_mining + id = "basic_mining" + display_name = "Mining Technology" + description = "Better than Efficiency V." + prereq_ids = list("engineering", "basic_plasma") + design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/adv_mining + id = "adv_mining" + display_name = "Advanced Mining Technology" + description = "Efficiency Level 127" //dumb mc references + prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma") + design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo", "plasteel_pick", "titanium_pick") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/janitor + id = "janitor" + display_name = "Advanced Sanitation Technology" + description = "Clean things better, faster, stronger, and harder!" + prereq_ids = list("adv_engi") + design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap", "ci-janitor", "paint_remover") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag + +/datum/techweb_node/botany + id = "botany" + display_name = "Botanical Engineering" + description = "Botanical tools." + prereq_ids = list("adv_engi", "biotech") + design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) + +/datum/techweb_node/exp_tools + id = "exp_tools" + display_name = "Experimental Tools" + description = "Highly advanced construction tools." + design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan") + prereq_ids = list("adv_engi") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) + +/datum/techweb_node/sec_basic + id = "sec_basic" + display_name = "Basic Security Equipment" + description = "Standard equipment used by security." + design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag") + prereq_ids = list("base") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750) diff --git a/code/modules/research/techweb/nodes/weaponry_nodes.dm b/code/modules/research/techweb/nodes/weaponry_nodes.dm new file mode 100644 index 0000000000..e17d7e1e7b --- /dev/null +++ b/code/modules/research/techweb/nodes/weaponry_nodes.dm @@ -0,0 +1,97 @@ + +/////////////////////////weaponry tech///////////////////////// +/datum/techweb_node/weaponry + id = "weaponry" + display_name = "Weapon Development Technology" + description = "Our researchers have found new to weaponize just about everything now." + prereq_ids = list("engineering") + design_ids = list("pin_testing", "tele_shield", "lasercarbine") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) + +/datum/techweb_node/adv_weaponry + id = "adv_weaponry" + display_name = "Advanced Weapon Development Technology" + description = "Our weapons are breaking the rules of reality by now." + prereq_ids = list("adv_engi", "weaponry") + design_ids = list("pin_loyalty", "laser_shield", "bullet_shield") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) + +/datum/techweb_node/electric_weapons + id = "electronic_weapons" + display_name = "Electric Weapons" + description = "Weapons using electric technology" + prereq_ids = list("weaponry", "adv_power" , "emp_basic") + design_ids = list("stunrevolver", "stunshell", "ioncarbine") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/radioactive_weapons + id = "radioactive_weapons" + display_name = "Radioactive Weaponry" + description = "Weapons using radioactive technology." + prereq_ids = list("adv_engi", "adv_weaponry") + design_ids = list("nuclear_gun") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/magnetic_weapons + id = "magnetic_weapons" + display_name = "Magnetic Weapons" + description = "Weapons using magnetic technology" + prereq_ids = list("weaponry", "adv_weaponry", "emp_adv") + design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/medical_weapons + id = "medical_weapons" + display_name = "Medical Weaponry" + description = "Weapons using medical technology." + prereq_ids = list("adv_biotech", "adv_weaponry") + design_ids = list("rapidsyringe", "shotgundartcryostatis") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) + +/datum/techweb_node/beam_weapons + id = "beam_weapons" + display_name = "Beam Weaponry" + description = "Various basic beam weapons" + prereq_ids = list("adv_weaponry") + design_ids = list("temp_gun", "xray_laser") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/adv_beam_weapons + id = "adv_beam_weapons" + display_name = "Advanced Beam Weaponry" + description = "Various advanced beam weapons" + prereq_ids = list("beam_weapons") + design_ids = list("beamrifle") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250) // Sniper + +/datum/techweb_node/explosive_weapons + id = "explosive_weapons" + display_name = "Explosive & Pyrotechnical Weaponry" + description = "If the light stuff just won't do it." + prereq_ids = list("adv_weaponry") + design_ids = list("large_Grenade", "pyro_Grenade", "adv_Grenade") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) + +/datum/techweb_node/ballistic_weapons + id = "ballistic_weapons" + display_name = "Ballistic Weaponry" + description = "This isn't research.. This is reverse-engineering!" + prereq_ids = list("weaponry") + design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) + +/datum/techweb_node/exotic_ammo + id = "exotic_ammo" + display_name = "Exotic Ammunition" + description = "They won't know what hit em." + prereq_ids = list("weaponry", "ballistic_weapons") + design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/gravity_gun + id = "gravity_gun" + display_name = "One-point Bluespace-gravitational Manipulator" + description = "Fancy wording for gravity gun." + prereq_ids = list("adv_weaponry", "adv_bluespace") + design_ids = list("gravitygun", "mech_gravcatapult") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index b8bdffbabf..795a57b82c 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -137,8 +137,7 @@ Slimecrossing Armor var/hit_reflect_chance = 10 // Citadel Change: because 40% chance of bouncing lasers back into peoples faces isn't good. armor = list("melee" = 70, "bullet" = 70, "laser" = 40, "energy" = 40, "bomb" = 80, "bio" = 80, "rad" = 80, "fire" = 70, "acid" = 90) //Citadel Change to avoid immortal Xenobiologists. -/obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) - if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) - return TRUE - else - return FALSE +/obj/item/clothing/suit/armor/heavy/adamantine/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if(is_energy_reflectable_projectile(object) && prob(hit_reflect_chance)) + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_INTERNAL + return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index b9897db303..ed43576a61 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -191,7 +191,7 @@ alert_type = /obj/screen/alert/status_effect/bloodchill /datum/status_effect/bloodchill/on_apply() - owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) return ..() /datum/status_effect/bloodchill/tick() @@ -199,7 +199,7 @@ owner.adjustFireLoss(2) /datum/status_effect/bloodchill/on_remove() - owner.remove_movespeed_modifier("bloodchilled") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) return ..() /obj/screen/alert/status_effect/bloodchill @@ -213,7 +213,7 @@ alert_type = /obj/screen/alert/status_effect/bonechill /datum/status_effect/bonechill/on_apply() - owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) return ..() /datum/status_effect/bonechill/tick() @@ -223,7 +223,7 @@ owner.adjust_bodytemperature(-10) /datum/status_effect/bonechill/on_remove() - owner.remove_movespeed_modifier("bonechilled") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) return ..() /obj/screen/alert/status_effect/bonechill @@ -385,11 +385,11 @@ datum/status_effect/rebreathing/tick() duration = 30 /datum/status_effect/tarfoot/on_apply() - owner.add_movespeed_modifier(MOVESPEED_ID_TARFOOT, update=TRUE, priority=100, multiplicative_slowdown=0.5, blacklisted_movetypes=(FLYING|FLOATING)) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) return ..() /datum/status_effect/tarfoot/on_remove() - owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) return ..() /datum/status_effect/spookcookie @@ -505,13 +505,13 @@ datum/status_effect/rebreathing/tick() /datum/status_effect/stabilized/purple/tick() var/is_healing = FALSE if(owner.getBruteLoss() > 0) - owner.adjustBruteLoss(-0.2) + owner.adjustBruteLoss(-0.4) is_healing = TRUE if(owner.getFireLoss() > 0) - owner.adjustFireLoss(-0.2) + owner.adjustFireLoss(-0.4) is_healing = TRUE if(owner.getToxLoss() > 0) - owner.adjustToxLoss(-0.2, forced = TRUE) //Slimepeople should also get healed. + owner.adjustToxLoss(-0.4, forced = TRUE) //Slimepeople should also get healed. is_healing = TRUE if(is_healing) examine_text = "SUBJECTPRONOUN is regenerating slowly, purplish goo filling in small injuries!" @@ -624,9 +624,9 @@ datum/status_effect/stabilized/blue/on_remove() O.extinguish() //All shamelessly copied from water's reaction_obj, since I didn't seem to be able to get it here for some reason. O.acid_level = 0 // Monkey cube - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) + if(istype(O, /obj/item/reagent_containers/food/snacks/cube)) to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") - var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O + var/obj/item/reagent_containers/food/snacks/cube/cube = O cube.Expand() // Dehydrated carp @@ -707,15 +707,15 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/sepia/tick() if(prob(50) && mod > -1) mod-- - owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 1) else if(mod < 1) mod++ // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=0, blacklisted_movetypes=(FLYING|FLOATING)) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) return ..() /datum/status_effect/stabilized/sepia/on_remove() - owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia) return ..() /datum/status_effect/stabilized/cerulean @@ -777,11 +777,11 @@ datum/status_effect/stabilized/blue/on_remove() colour = "red" /datum/status_effect/stabilized/red/on_apply() - owner.ignore_slowdown("slimestatus") - return ..() + . = ..() + owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) /datum/status_effect/stabilized/red/on_remove() - owner.unignore_slowdown("slimestatus") + owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) return ..() /datum/status_effect/stabilized/green @@ -917,7 +917,7 @@ datum/status_effect/stabilized/blue/on_remove() healing_types += CLONE if(length(healing_types)) owner.apply_damage_type(-heal_amount, damagetype=pick(healing_types)) - owner.nutrition += 3 + owner.adjust_nutrition(3) M.adjustCloneLoss(heal_amount * 1.2) //This way, two people can't just convert each other's damage away. else messagedelivered = FALSE @@ -933,7 +933,6 @@ datum/status_effect/stabilized/blue/on_remove() return ..() /datum/status_effect/stabilized/lightpink/tick() - owner.adjustStaminaLoss(-4.5) for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") @@ -960,9 +959,10 @@ datum/status_effect/stabilized/blue/on_remove() familiar = new linked.mob_type(get_turf(owner.loc)) familiar.name = linked.mob_name familiar.del_on_death = TRUE - familiar.copy_known_languages_from(owner, FALSE) + familiar.copy_languages(owner, LANGUAGE_MASTER) if(linked.saved_mind) linked.saved_mind.transfer_to(familiar) + familiar.update_atom_languages() familiar.ckey = linked.saved_mind.key else if(familiar.mind) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 48e6f720b0..7b5004e722 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -35,7 +35,7 @@ Burning extracts: S.visible_message("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!") S.Friends[user] = 20 //Gas, gas, gas S.bodytemperature = T0C + 400 //We gonna step on the gas. - S.nutrition = S.get_hunger_nutrition() //Tonight, we fight! + S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! ..() /obj/item/slimecross/burning/orange diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index bec2c2c1ae..ac9d2e58c5 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -53,7 +53,7 @@ Industrial extracts: /obj/item/slimecross/industrial/grey colour = "grey" - itempath = /obj/item/reagent_containers/food/snacks/monkeycube + itempath = /obj/item/reagent_containers/food/snacks/cube/monkey itemamount = 5 /obj/item/slimecross/industrial/orange diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index d230c22d2f..6b2b0b458c 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -128,7 +128,7 @@ Regenerative extracts: colour = "silver" /obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) - target.nutrition = NUTRITION_LEVEL_FULL - 1 + target.set_nutrition(NUTRITION_LEVEL_FULL - 1) to_chat(target, "You feel satiated.") /obj/item/slimecross/regenerative/bluespace @@ -200,8 +200,7 @@ Regenerative extracts: colour = "gold" /obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) - var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - var/obj/item/coin/C = new newcoin(target.loc) + var/obj/item/coin/C = new /obj/effect/spawner/lootdrop/coin(target.loc) playsound(C, 'sound/items/coinflip.ogg', 50, 1) target.put_in_hand(C) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 2f6ca9555a..3662f45355 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -19,14 +19,14 @@ Reproductive extracts: return if(istype(O, /obj/item/storage/bag/bio)) var/list/inserted = list() - SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted) + SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/cube/monkey, src, 1, null, null, user, inserted) if(inserted.len) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1] + var/obj/item/reagent_containers/food/snacks/cube/monkey/M = inserted[1] if(istype(M)) eat_cube(M, user) else to_chat(user, "There are no monkey cubes in the bio bag!") - if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube)) + if(istype(O,/obj/item/reagent_containers/food/snacks/cube/monkey)) eat_cube(O, user) if(cubes_eaten >= 3) var/cores = rand(1,4) diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 1912ca6476..8fbe841828 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -158,7 +158,7 @@ Stabilized extracts: /obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user) var/obj/item/slimecross/regenerative/regen = O - if(istype(O) && !regencore) + if(istype(regen) && !regencore) to_chat(user, "You place the [O] in the [src], prepping the extract for automatic application!") regencore = regen regen.forceMove(src) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 5492e9bc38..ef9c751d57 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -146,7 +146,7 @@ else to_chat(user, "[src] already has the contents of [O] installed!") return - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS + if(istype(O, /obj/item/reagent_containers/food/snacks/cube/monkey) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS monkeys++ to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") qdel(O) @@ -155,7 +155,7 @@ var/obj/item/storage/P = O var/loaded = FALSE for(var/obj/G in P.contents) - if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube)) + if(istype(G, /obj/item/reagent_containers/food/snacks/cube/monkey)) loaded = TRUE monkeys++ qdel(G) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a346cd697f..bc78e3ab1a 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -83,7 +83,7 @@ /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = new + var/obj/item/reagent_containers/food/snacks/cube/monkey/M = new if(!user.put_in_active_hand(M)) M.forceMove(user.drop_location()) playsound(user, 'sound/effects/splat.ogg', 50, 1) @@ -186,7 +186,7 @@ /obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - user.nutrition += 50 + user.adjust_nutrition(50) user.blood_volume += 50 to_chat(user, "You activate [src], and your body is refilled with fresh slime jelly!") return 150 @@ -636,7 +636,7 @@ qdel(src) return M.docile = 1 - M.nutrition = 700 + M.set_nutrition(700) to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") var/newname = reject_bad_name(stripped_input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime", MAX_NAME_LEN), TRUE) @@ -684,7 +684,7 @@ if(SM.flags_1 & HOLOGRAM_1) //Check to see if it's a holodeck creature to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") to_chat(user, "[SM] accepts [src] and suddenly becomes attentive and aware. It worked!") - SM.copy_known_languages_from(user, FALSE) + SM.copy_languages(user) after_success(user, SM) qdel(src) else @@ -801,7 +801,7 @@ return to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = CLAMP(M.mutation_chance-15,0,100) + M.mutation_chance = clamp(M.mutation_chance-15,0,100) qdel(src) /obj/item/slimepotion/slime/mutator @@ -825,7 +825,7 @@ return to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") - M.mutation_chance = CLAMP(M.mutation_chance+12,0,100) + M.mutation_chance = clamp(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm new file mode 100644 index 0000000000..8cbd1b1f37 --- /dev/null +++ b/code/modules/ruins/icemoonruin_code/hotsprings.dm @@ -0,0 +1,37 @@ +GLOBAL_LIST_EMPTY(cursed_minds) + +/** + * Turns whoever enters into a mob + * + * If mob is chosen, turns the person into a random animal type + * Once the spring is used, it cannot be used by the same mind ever again + * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere) + * + */ + +/turf/open/water/cursed_spring + baseturfs = /turf/open/water/cursed_spring + initial_gas_mix = ICEMOON_DEFAULT_ATMOS + +/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc) + . = ..() + if(!isliving(thing)) + return + var/mob/living/L = thing + if(!L.client) + return + if(GLOB.cursed_minds[L.mind]) + return + GLOB.cursed_minds[L.mind] = TRUE + RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, .proc/remove_from_cursed) + L = wabbajack(L, "animal") // Appearance randomization removed so citadel players don't get randomized into some ungodly ugly creature and complain + var/turf/T = find_safe_turf() + L.forceMove(T) + to_chat(L, "You blink and find yourself in [get_area_name(T)].") + +/** + * Deletes minds from the cursed minds list after their deletion + * + */ +/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M) + GLOB.cursed_minds -= M diff --git a/code/modules/ruins/icemoonruin_code/library.dm b/code/modules/ruins/icemoonruin_code/library.dm new file mode 100644 index 0000000000..e9bbb852b7 --- /dev/null +++ b/code/modules/ruins/icemoonruin_code/library.dm @@ -0,0 +1,33 @@ +/obj/machinery/door/keycard/library + name = "wooden door" + desc = "A dusty, scratched door with a thick lock attached." + icon = 'icons/obj/doors/puzzledoor/wood.dmi' + puzzle_id = "library" + open_message = "The door opens with a loud creak." + +/obj/item/keycard/library + name = "golden key" + desc = "A dull, golden key." + icon_state = "golden_key" + puzzle_id = "library" + +/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning + name = "ancient note" + info = "Here lies the vast collection of He Who Knows Ten Thousand Things. May all who pursue this knowledge for power be cursed a thousand times." + +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary + name = "diary entry 13" + info = "It has been a week since the library was buried. I am so hungry that I can barely muster the energy to think, let alone write. The owl is gone." + +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2 + name = "diary entry 18" + info = "I've lost track of time. I lack the strength to even pick up books off the shelves. To think, after all this time spent searching for the library, I will die before I can so much as graze the depth of its knowledge." + +/obj/item/feather + name = "feather" + desc = "A dark, wilting feather. It seems as old as time." + icon = 'icons/obj/objects.dmi' + icon_state = "feather" + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index d09c1ce86f..45b6939f42 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -133,7 +133,7 @@ assignedrole = "Lavaland Syndicate" /obj/effect/mob_spawn/human/lavaland_syndicate/special(mob/living/new_spawn) - new_spawn.grant_language(/datum/language/codespeak) + new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) /datum/outfit/lavaland_syndicate name = "Lavaland Syndicate Agent" @@ -142,7 +142,7 @@ uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/toggle/labcoat shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated ears = /obj/item/radio/headset/syndicate/alt back = /obj/item/storage/backpack r_pocket = /obj/item/gun/ballistic/automatic/pistol diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm new file mode 100644 index 0000000000..65530031c0 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm @@ -0,0 +1,247 @@ +//******Decoration objects +//***Bone statues and giant skeleton parts. +/obj/structure/statue/bone + anchored = TRUE + max_integrity = 120 + material_drop_type = /obj/item/stack/sheet/bone + impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least + layer = ABOVE_ALL_MOB_LAYER + +/obj/structure/statue/bone/rib + name = "collosal rib" + desc = "It's staggering to think that something this big could have lived, let alone died." + oreAmount = 4 + icon = 'icons/obj/statuelarge.dmi' + icon_state = "rib" + +/obj/structure/statue/bone/skull + name = "collosal skull" + desc = "The gaping maw of a dead, titanic monster." + oreAmount = 12 + icon = 'icons/obj/statuelarge.dmi' + icon_state = "skull" + +/obj/structure/statue/bone/skull/half + desc = "The gaping maw of a dead, titanic monster. This one is cracked in half." + oreAmount = 6 + icon = 'icons/obj/statuelarge.dmi' + icon_state = "skull-half" + +//***Wasteland floor and rock turfs here. +/turf/open/floor/plating/asteroid/basalt/wasteland //Like a more fun version of living in Arizona. + name = "cracked earth" + icon = 'icons/turf/floors.dmi' + icon_state = "wasteland" + environment_type = "wasteland" + baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland + digResult = /obj/item/stack/ore/glass/basalt + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + slowdown = 0.5 + floor_variance = 30 + +/turf/open/floor/plating/asteroid/basalt/wasteland/Initialize() + .=..() + if(prob(floor_variance)) + icon_state = "[environment_type][rand(0,6)]" + +/turf/closed/mineral/strong/wasteland + name = "ancient dry rock" + color = "#B5651D" + environment_type = "wasteland" + turf_type = /turf/open/floor/plating/asteroid/basalt/wasteland + baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland + smooth_icon = 'icons/turf/walls/rock_wall.dmi' + +/turf/closed/mineral/strong/wasteland/drop_ores() + if(prob(10)) + new /obj/item/stack/ore/iron(src, 1) + new /obj/item/stack/ore/glass(src, 1) + new /obj/effect/decal/remains/human/grave(src, 1) + else + new /obj/item/stack/sheet/bone(src, 1) + +//***Oil well puddles. +/obj/structure/sink/oil_well //You're not going to enjoy bathing in this... + name = "oil well" + desc = "A bubbling pool of oil.This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago." + icon = 'icons/obj/watercloset.dmi' + icon_state = "puddle-oil" + dispensedreagent = /datum/reagent/oil + +/obj/structure/sink/oil_well/Initialize() + .=..() + create_reagents(20) + reagents.add_reagent(dispensedreagent, 20) + +/obj/structure/sink/oil_well/attack_hand(mob/M) + flick("puddle-oil-splash",src) + reagents.reaction(M, TOUCH, 20) //Covers target in 20u of oil. + to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.") + +/obj/structure/sink/oil_well/attackby(obj/item/O, mob/user, params) + flick("puddle-oil-splash",src) + if(O.tool_behaviour == TOOL_SHOVEL && !(flags_1&NODECONSTRUCT_1)) //attempt to deconstruct the puddle with a shovel + to_chat(user, "You fill in the oil well with soil.") + O.play_tool_sound(src) + deconstruct() + return 1 + if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil + var/obj/item/reagent_containers/RG = O + if(RG.is_refillable()) + if(!RG.reagents.holder_full()) + RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) + to_chat(user, "You fill [RG] from [src].") + return TRUE + to_chat(user, "\The [RG] is full.") + return FALSE + if(user.a_intent != INTENT_HARM) + to_chat(user, "You won't have any luck getting \the [O] out if you drop it in the oil.") + return 1 + else + return ..() + +/obj/structure/sink/oil_well/drop_materials() + new /obj/effect/decal/cleanable/oil(loc) + +//***Grave mounds. +/obj/structure/closet/crate/grave + name = "burial mound" + desc = "An marked patch of soil, showing signs of a burial long ago. You wouldn't disturb a grave... right?" + icon = 'icons/obj/crates.dmi' + icon_state = "grave" + dense_when_open = TRUE + material_drop = /obj/item/stack/ore/glass/basalt + material_drop_amount = 5 + anchorable = FALSE + anchored = TRUE + locked = TRUE + breakout_time = 900 + cutting_tool = /obj/item/shovel + var/lead_tomb = FALSE + var/first_open = FALSE + +/obj/structure/closet/crate/grave/PopulateContents() //GRAVEROBBING IS NOW A FEATURE + ..() + new /obj/effect/decal/remains/human/grave(src) + switch(rand(1,8)) + if(1) + new /obj/item/coin/gold(src) + new /obj/item/storage/wallet(src) + if(2) + new /obj/item/clothing/glasses/meson(src) + if(3) + new /obj/item/coin/silver(src) + new /obj/item/shovel/spade(src) + if(4) + new /obj/item/storage/book/bible/booze(src) + if(5) + new /obj/item/clothing/neck/stethoscope(src) + new /obj/item/scalpel(src) + new /obj/item/hemostat(src) + + if(6) + new /obj/item/reagent_containers/glass/beaker(src) + new /obj/item/clothing/glasses/science(src) + if(7) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/mask/cigarette/rollie(src) + +/obj/structure/closet/crate/grave/open(mob/living/user, obj/item/S) + if(!opened) + to_chat(user, "The ground here is too hard to dig up with your bare hands. You'll need a shovel.") + else + to_chat(user, "The grave has already been dug up.") + +/obj/structure/closet/crate/grave/tool_interact(obj/item/S, mob/living/carbon/user) + if(user.a_intent == INTENT_HELP) //checks to attempt to dig the grave, must be done on help intent only. + if(!opened) + if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL) + to_chat(user, "You start start to dig open \the [src] with \the [S]...") + if (do_after(user,20, target = src)) + opened = TRUE + locked = TRUE + dump_contents() + update_icon() + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing) + if(lead_tomb == TRUE && first_open == TRUE) + user.gain_trauma(/datum/brain_trauma/magic/stalker) + to_chat(user, "Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!") + first_open = FALSE + return 1 + return 1 + else + to_chat(user, "You can't dig up a grave with \the [S.name].") + return 1 + else + to_chat(user, "The grave has already been dug up.") + return 1 + + else if((user.a_intent != INTENT_HELP) && opened) //checks to attempt to remove the grave entirely. + if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL) + to_chat(user, "You start to remove \the [src] with \the [S].") + if (do_after(user,15, target = src)) + to_chat(user, "You remove \the [src] completely.") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing) + deconstruct(TRUE) + return 1 + return + +/obj/structure/closet/crate/grave/bust_open() + ..() + opened = TRUE + update_icon() + dump_contents() + return + +/obj/structure/closet/crate/grave/lead_researcher + name = "ominous burial mound" + desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread." + icon = 'icons/obj/crates.dmi' + icon_state = "grave_lead" + lead_tomb = TRUE + first_open = TRUE + +/obj/structure/closet/crate/grave/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING + ..() + new /obj/effect/decal/cleanable/blood/gibs/old(src) + new /obj/item/book/granter/crafting_recipe/boneyard_notes(src) + +/obj/effect/decal/remains/human/grave + turf_loc_check = FALSE + +/obj/item/book/granter/crafting_recipe/boneyard_notes + name = "The Complete Works of Lavaland Bone Architecture" + desc = "Pried from the lead Archaeologist's cold, dead hands, this seems to explain how ancient bone architecture was erected long ago." + crafting_recipe_types = list(/datum/crafting_recipe/rib, /datum/crafting_recipe/boneshovel, /datum/crafting_recipe/halfskull, /datum/crafting_recipe/skull) + icon = 'icons/obj/library.dmi' + icon_state = "boneworking_learing" + oneuse = FALSE + remarks = list("Who knew you could bend bones that far back?", "I guess that was much easier before the planet heated up...", "So that's how they made those ruins survive the ashstorms. Neat!", "The page is just filled with insane ramblings about some 'legion' thing.", "But why would they need vinegar to polish the bones? And rags too?", "You spend a few moments cleaning dirt and blood off of the page, yeesh.") + + +//***Fluff items for lore/intrigue +/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard + name = "posted warning" + desc = "It seems to be smudged with mud and... oil?" + info = "TO WHOM IT MAY CONCERN

    This area is property of the Nanotrasen Mining Division.

    Trespassing in this area is illegal, highly dangerous, and subject to several NDAs.

    Please turn back now, under intergalactic law section 48-R." + +/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes + name = "Research Findings: Day 26" + desc = "Huh, this one page looks like it was torn out of a full book. How odd." + icon_state = "docs_part" + info = "Researcher name: B--*--* J--*s.

    Detailed findings:Today the camp site's cond-tion has wor--ene*. The ashst--ms keep blocking us off from le-ving the sit* for m-re supplies, and it's lo-king like we're out of pl*sma to p-wer the ge-erat*r. Can't rea-*y study c-*bon *ating with no li--ts, ya know? Da-*y's been going -*f again and ag-*n a-*ut h*w the company's left us to *ie here, but I j-s* keep tell-ng him to stop che*-in* out these damn graves. We m-y b* archaeologists, but -e sho*ld have t-e dec-**cy to know these grav-s are *-l NEW.

    The rest of the page is just semantics about carbon dating methods." + +/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny + name = "hastily scribbled note" + desc = "Seems like someone was in a hurry." + info = "Alright, we all know that stuck up son a bitch is just doing this to keep us satisifed. Who the hell does he think he is, taking extra rations? We're OUT OF FOOD, CARL. Tomorrow at noon, we're going to try and take the ship by force. He HAS to be lying about the engine cooling down. He HAS TO BE. I'm tellin ya, with this implant I lifted off that last supply ship, I got the smarts to get us offa this shithole. Keep your knife handy carl." + +/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis + name = "research document" + desc = "Standard Nanotrasen typeface for important research documents." + info = "Day 9: Tenative Conclusions

    While the area appears to be of significant cultural importance to the lizard race, outside of some sparce contact with native wildlife, we're yet to find any exact reasoning for the nature of this phenomenon. It seems that organic life is communally drawn to this planet as though it functions as a final resting place for intelligent life. As per company guidelines, this site shall be given the following classification: 'LZ-0271 - Elephant Graveyard'

    Compiled list of Artifact findings (Currently Sent Offsite)
    Cultist Blade Fragments: x8
    Brass Multiplicative Ore Sample: x105
    Syndicate Revolutionary Leader Implant (Broken) x1
    Extinct Cortical Borer Tissue Sample x1
    Space Carp Fossil x3" + +/obj/item/paper/fluff/ruins/elephant_graveyard/final_message + name = "important looking Note" + desc = "This note is well written, and seems to have been put here so you'd find it." + info = "If you find this... you don't need to know who I am.

    You need to leave this place. I dunno what shit they did to me out here, but I don't think I'm going to be making it out of here.

    This place... it wears down your psyche. The other researchers out here laughed it off but... They were the first to go.

    One by one they started turning on each other. The more they found out, the more they started fighting and arguing...
    As I speak now, I had to... I wound up having to put most of my men down. I know what I had to do, and I know there's no way left for me to live with myself.
    If anyone ever finds this, just don't touch the graves.

    DO NOT. TOUCH. THE GRAVES. Don't be a dumbass, like we all were." diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 70b0545ded..92e24e3bc4 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -289,7 +289,7 @@ /obj/effect/sliding_puzzle/prison/dispense_reward() prisoner.forceMove(get_turf(src)) - prisoner.notransform = FALSE + prisoner.mob_transforming = FALSE prisoner = null //Some armor so it's harder to kill someone by mistake. @@ -329,7 +329,7 @@ return FALSE //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. - prisoner.notransform = TRUE + prisoner.mob_transforming = TRUE prisoner.forceMove(cube) to_chat(prisoner,"You're trapped by the prison cube! You will remain trapped until someone solves it.") @@ -350,4 +350,4 @@ //Move them into random block var/obj/structure/puzzle_element/E = pick(cube.elements) prisoner.forceMove(E) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm index 67e071b274..7d1fda6740 100644 --- a/code/modules/ruins/spaceruin_code/clericsden.dm +++ b/code/modules/ruins/spaceruin_code/clericsden.dm @@ -27,7 +27,8 @@ melee_damage_lower = 8 melee_damage_upper = 10 retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you. - attacktext = "pinches" + attack_verb_continuous = "pinches" + attack_verb_simple = "pinch" environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch2.ogg' playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists." diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index a60d564631..ec5e98b2e6 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -413,13 +413,13 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) . = ..() if(ismob(AM)) var/mob/M = AM - M.notransform = TRUE + M.mob_transforming = TRUE /obj/item/abstracthotelstorage/Exited(atom/movable/AM, atom/newLoc) . = ..() if(ismob(AM)) var/mob/M = AM - M.notransform = FALSE + M.mob_transforming = FALSE //Space Ruin stuff /area/ruin/space/has_grav/hilbertresearchfacility diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm index 8efeaaabff..e48a1c45d5 100644 --- a/code/modules/ruins/spaceruin_code/listeningstation.dm +++ b/code/modules/ruins/spaceruin_code/listeningstation.dm @@ -32,7 +32,7 @@ /obj/item/paper/fluff/ruins/listeningstation/receipt name = "receipt" - info = "1 x Stechkin pistol - $600
    1 x silencer - $200
    shipping charge - $4360
    total - $5160" + info = "1 x Stechkin pistol - 600 cr
    1 x silencer - 200 cr
    shipping charge - 4360 cr
    total - 5160 cr" /obj/item/paper/fluff/ruins/listeningstation/odd_report name = "odd report" diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 8a58563407..adf53ff0da 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -9,6 +9,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." icon = 'icons/obj/monitors.dmi' icon_state = "auth_off" + plane = ABOVE_WALL_PLANE use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 @@ -19,6 +20,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) var/event = "" var/obj/machinery/keycard_auth/event_source var/mob/triggerer = null + var/obj/item/card/id/first_id = null var/waiting = 0 /obj/machinery/keycard_auth/Initialize() @@ -41,7 +43,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) var/list/data = list() data["waiting"] = waiting data["auth_required"] = event_source ? event_source.event : 0 - data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0 + data["red_alert"] = (SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level)) >= SEC_LEVEL_RED) ? 1 : 0 data["emergency_maint"] = GLOB.emergency_access data["bsa_unlock"] = GLOB.bsa_unlock return data @@ -55,32 +57,37 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) return ..() /obj/machinery/keycard_auth/ui_act(action, params) - if(..() || waiting || !allowed(usr)) + if(..() || waiting) + return + var/obj/item/card/id/ID = usr.get_idcard(TRUE) + if(!ID || !istype(ID)) + return + if(!check_access(ID)) return switch(action) if("red_alert") if(!event_source) - sendEvent(KEYCARD_RED_ALERT) + sendEvent(KEYCARD_RED_ALERT, ID) . = TRUE if("emergency_maint") if(!event_source) - sendEvent(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS) + sendEvent(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS, ID) . = TRUE if("auth_swipe") - if(event_source) + if(event_source && ID != first_id && first_id) event_source.trigger_event(usr) event_source = null . = TRUE if("bsa_unlock") if(!event_source) - sendEvent(KEYCARD_BSA_UNLOCK) + sendEvent(KEYCARD_BSA_UNLOCK, ID) . = TRUE -/obj/machinery/keycard_auth/proc/sendEvent(event_type) +/obj/machinery/keycard_auth/proc/sendEvent(event_type, trigger_id) triggerer = usr event = event_type waiting = 1 - GLOB.keycard_events.fireEvent("triggerEvent", src) + GLOB.keycard_events.fireEvent("triggerEvent", src, trigger_id) addtimer(CALLBACK(src, .proc/eventSent), 20) /obj/machinery/keycard_auth/proc/eventSent() @@ -88,14 +95,16 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) event = "" waiting = 0 -/obj/machinery/keycard_auth/proc/triggerEvent(source) +/obj/machinery/keycard_auth/proc/triggerEvent(source, trigger_id) icon_state = "auth_on" + first_id = trigger_id event_source = source addtimer(CALLBACK(src, .proc/eventTriggered), 20) /obj/machinery/keycard_auth/proc/eventTriggered() icon_state = "auth_off" event_source = null + first_id = null /obj/machinery/keycard_auth/proc/trigger_event(confirmer) log_game("[key_name(triggerer)] triggered and [key_name(confirmer)] confirmed event [event]") diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 887891ca16..52fafb81be 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -5,20 +5,17 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) //SEC_LEVEL_RED = code red //SEC_LEVEL_DELTA = code delta + /* + * All security levels, per ascending alert. Nothing too fancy, really. + * Their positions should also match their numerical values. + */ +GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "delta")) + //config.alert_desc_blue_downto /proc/set_security_level(level) - switch(level) - if("green") - level = SEC_LEVEL_GREEN - if("blue") - level = SEC_LEVEL_BLUE - if("amber") - level = SEC_LEVEL_AMBER - if("red") - level = SEC_LEVEL_RED - if("delta") - level = SEC_LEVEL_DELTA + if(!isnum(level)) + level = GLOB.all_security_levels.Find(level) //Will not be announced if you try to set to the same level as it already is if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != GLOB.security_level) @@ -111,46 +108,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) if(D.red_alert_access) D.visible_message("[D] whirrs as it automatically lifts access requirements!") playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE) - SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level()) + SSblackbox.record_feedback("tally", "security_level_changes", 1, NUM2SECLEVEL(GLOB.security_level)) SSnightshift.check_nightshift() else return - -/proc/get_security_level() - switch(GLOB.security_level) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_AMBER) - return "amber" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/num2seclevel(num) - switch(num) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_AMBER) - return "amber" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/seclevel2num(seclevel) - switch( lowertext(seclevel) ) - if("green") - return SEC_LEVEL_GREEN - if("blue") - return SEC_LEVEL_BLUE - if("amber") - return SEC_LEVEL_AMBER - if("red") - return SEC_LEVEL_RED - if("delta") - return SEC_LEVEL_DELTA diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index d2b13fc71a..75bf55a5a3 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -71,6 +71,6 @@ to_chat(user, "You fried the consoles ID checking system.") return TRUE -/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) +/obj/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) if(port && (shuttleId == initial(shuttleId) || override)) shuttleId = port.id \ No newline at end of file diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm new file mode 100644 index 0000000000..6e06e3fefe --- /dev/null +++ b/code/modules/shuttle/custom_shuttle.dm @@ -0,0 +1,268 @@ +#define Z_DIST 500 +#define CUSTOM_ENGINES_START_TIME 65 +#define CALCULATE_STATS_COOLDOWN 2 + +/obj/machinery/computer/custom_shuttle + name = "nanotrasen shuttle flight controller" + desc = "A terminal used to fly shuttles defined by the Shuttle Zoning Designator" + circuit = /obj/item/circuitboard/computer/shuttle/flight_control + icon_screen = "shuttle" + icon_keyboard = "tech_key" + light_color = LIGHT_COLOR_CYAN + req_access = list( ) + var/shuttleId + var/possible_destinations = "whiteship_home" + var/admin_controlled + var/no_destination_swap = 0 + var/calculated_mass = 0 + var/calculated_dforce = 0 + var/calculated_speed = 0 + var/calculated_engine_count = 0 + var/calculated_consumption = 0 + var/calculated_cooldown = 0 + var/calculated_non_operational_thrusters = 0 + var/calculated_fuel_less_thrusters = 0 + var/target_fuel_cost = 0 + var/targetLocation + var/datum/browser/popup + + var/stat_calc_cooldown = 0 + + //Upgrades + var/distance_multiplier = 1 + +/obj/machinery/computer/custom_shuttle/examine(mob/user) + . = ..() + . += distance_multiplier < 1 ? "Bluespace shortcut module installed. Route is [distance_multiplier]x the original length." : "" + +/obj/machinery/computer/custom_shuttle/ui_interact(mob/user) + var/list/options = params2list(possible_destinations) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + var/dat = "[M ? "Current Location : [M.getStatusText()]" : "Shuttle link required."]

    " + if(M) + dat += "Run Flight Calculations
    " + dat += "Shuttle Data
    " + dat += "Shuttle Mass: [calculated_mass/10]tons
    " + dat += "Engine Force: [calculated_dforce]kN ([calculated_engine_count] engines)
    " + dat += "Sublight Speed: [calculated_speed]ms-1
    " + dat += calculated_speed < 1 ? "INSUFFICIENT ENGINE POWER
    " : "" + dat += calculated_non_operational_thrusters > 0 ? "Warning: [calculated_non_operational_thrusters] thrusters offline.
    " : "" + dat += "Fuel Consumption: [calculated_consumption]units per distance
    " + dat += "Engine Cooldown: [calculated_cooldown]s
    " + var/destination_found + for(var/obj/docking_port/stationary/S in SSshuttle.stationary) + if(!options.Find(S.id)) + continue + if(!M.check_dock(S, silent=TRUE)) + continue + if(calculated_speed == 0) + break + destination_found = TRUE + var/dist = round(calculateDistance(S)) + dat += "Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])
    " + if(!destination_found) + dat += "No valid destinations
    " + dat += "
    [targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]" + dat += "
    Initate Flight
    " + dat += "Close" + + popup = new(user, "computer", M ? M.name : "shuttle", 350, 450) + popup.set_content("
    [dat]
    ") + popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/custom_shuttle/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + + if(href_list["calculate"]) + calculateStats() + ui_interact(usr) + return + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return + if(M.launch_status == ENDGAME_LAUNCHED) + return + if(href_list["setloc"]) + SetTargetLocation(href_list["setloc"]) + ui_interact(usr) + return + else if(href_list["fly"]) + Fly() + ui_interact(usr) + return + +/obj/machinery/computer/custom_shuttle/proc/calculateDistance(var/obj/docking_port/stationary/port) + var/deltaX = port.x - x + var/deltaY = port.y - y + var/deltaZ = (port.z - z) * Z_DIST + return sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * distance_multiplier + +/obj/machinery/computer/custom_shuttle/proc/linkShuttle(var/new_id) + shuttleId = new_id + possible_destinations = "whiteship_home;shuttle[new_id]_custom" + +/obj/machinery/computer/custom_shuttle/proc/calculateStats(var/useFuel = FALSE, var/dist = 0, var/ignore_cooldown = FALSE) + if(!ignore_cooldown && stat_calc_cooldown >= world.time) + to_chat(usr, "You are using this too fast, please slow down") + return + stat_calc_cooldown = world.time + CALCULATE_STATS_COOLDOWN + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return FALSE + //Reset data + calculated_mass = 0 + calculated_dforce = 0 + calculated_speed = 0 + calculated_engine_count = 0 + calculated_consumption = 0 + calculated_cooldown = 0 + calculated_fuel_less_thrusters = 0 + calculated_non_operational_thrusters = 0 + //Calculate all the data + var/list/areas = M.shuttle_areas + for(var/shuttleArea in areas) + calculated_mass += length(get_area_turfs(shuttleArea)) + for(var/obj/machinery/shuttle/engine/E in shuttleArea) + E.check_setup() + if(!E.thruster_active) //Skipover thrusters with no valid heater + calculated_non_operational_thrusters ++ + continue + if(E.attached_heater) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = E.attached_heater.resolve() + if(resolvedHeater && !resolvedHeater.hasFuel(dist * E.fuel_use) && useFuel) + calculated_fuel_less_thrusters ++ + continue + calculated_engine_count++ + calculated_dforce += E.thrust + calculated_consumption += E.fuel_use + calculated_cooldown = max(calculated_cooldown, E.cooldown) + //This should really be accelleration, but its a 2d spessman game so who cares + if(calculated_mass == 0) + return FALSE + calculated_speed = (calculated_dforce*1000) / (calculated_mass*100) + return TRUE + +/obj/machinery/computer/custom_shuttle/proc/consumeFuel(var/dist) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return FALSE + //Calculate all the data + for(var/obj/machinery/shuttle/engine/shuttle_machine in GLOB.custom_shuttle_machines) + shuttle_machine.check_setup() + if(!shuttle_machine.thruster_active) + continue + if(get_area(M) != get_area(shuttle_machine)) + continue + if(shuttle_machine.attached_heater) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = shuttle_machine.attached_heater.resolve() + if(resolvedHeater && !resolvedHeater.hasFuel(dist * shuttle_machine.fuel_use)) + continue + resolvedHeater?.consumeFuel(dist * shuttle_machine.fuel_use) + shuttle_machine.fireEngine() + +/obj/machinery/computer/custom_shuttle/proc/SetTargetLocation(var/newTarget) + if(!(newTarget in params2list(possible_destinations))) + log_admin("[usr] attempted to href dock exploit on [src] with target location \"[newTarget]\"") + message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[newTarget]\"") + return + targetLocation = newTarget + say("Shuttle route calculated.") + return + +/obj/machinery/computer/custom_shuttle/proc/Fly() + if(!targetLocation) + return + var/obj/docking_port/mobile/linkedShuttle = SSshuttle.getShuttle(shuttleId) + if(!linkedShuttle) + return + if(linkedShuttle.mode != SHUTTLE_IDLE) + return + if(!calculateStats(TRUE, 0, TRUE)) + return + if(calculated_fuel_less_thrusters > 0) + say("Warning, [calculated_fuel_less_thrusters] do not have enough fuel for this journey, engine output may be limitted.") + if(calculated_speed < 1) + say("Insufficient engine power, shuttle requires [calculated_mass / 10]kN of thrust.") + return + var/obj/docking_port/stationary/targetPort = SSshuttle.getDock(targetLocation) + if(!targetPort) + return + var/dist = calculateDistance(targetPort) + var/time = min(max(round(dist / calculated_speed), 10), 90) + linkedShuttle.callTime = time * 10 + linkedShuttle.rechargeTime = calculated_cooldown + //We need to find the direction of this console to the port + linkedShuttle.port_direction = angle2dir(dir2angle(dir) - (dir2angle(linkedShuttle.dir)) + 180) + linkedShuttle.preferred_direction = NORTH + linkedShuttle.ignitionTime = CUSTOM_ENGINES_START_TIME + linkedShuttle.count_engines() + linkedShuttle.hyperspace_sound(HYPERSPACE_WARMUP) + var/throwForce = clamp((calculated_speed / 2) - 5, 0, 10) + linkedShuttle.movement_force = list("KNOCKDOWN" = calculated_speed > 5 ? 3 : 0, "THROW" = throwForce) + if(!(targetLocation in params2list(possible_destinations))) + log_admin("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"") + message_admins("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"") + return + switch(SSshuttle.moveShuttle(shuttleId, targetLocation, 1)) + if(0) + consumeFuel(dist) + say("Shuttle departing. Please stand away from the doors.") + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + return + +/obj/machinery/computer/custom_shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + if(port && (shuttleId == initial(shuttleId) || override)) + linkShuttle(port.id) + +//Custom shuttle docker locations +/obj/machinery/computer/camera_advanced/shuttle_docker/custom + name = "Shuttle Navigation Computer" + desc = "Used to designate a precise transit location for private ships." + lock_override = NONE + whitelist_turfs = list(/turf/open/space, + /turf/open/lava, + /turf/open/floor/plating/beach, + /turf/open/floor/plating/ashplanet, + /turf/open/floor/plating/asteroid, + /turf/open/floor/plating/lavaland_baseturf) + jumpto_ports = list("whiteship_home" = 1) + view_range = 12 + designate_time = 100 + circuit = /obj/item/circuitboard/computer/shuttle/docker + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize() + . = ..() + GLOB.jam_on_wardec += src + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Destroy() + GLOB.jam_on_wardec -= src + return ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/placeLandingSpot() + if(!shuttleId) + return //Only way this would happen is if someone else delinks the console while in use somehow + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(M?.mode != SHUTTLE_IDLE) + to_chat(usr, "You cannot target locations while in transit.") + return + ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/attack_hand(mob/user) + if(!shuttleId) + to_chat(user, "You must link the console to a shuttle first.") + return + return ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/linkShuttle(var/new_id) + shuttleId = new_id + shuttlePortId = "shuttle[new_id]_custom" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index cd08b7290a..358fc5ad50 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -310,7 +310,7 @@ /obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE) if(!isnum(set_coefficient)) - var/security_num = seclevel2num(get_security_level()) + var/security_num = SECLEVEL2NUM(NUM2SECLEVEL(GLOB.security_level)) switch(security_num) if(SEC_LEVEL_GREEN) set_coefficient = 2 @@ -557,7 +557,7 @@ dwidth = 1 width = 3 height = 4 - var/target_area = /area/lavaland/surface/outdoors + var/target_area = list(/area/lavaland/surface/outdoors, /area/icemoon/underground/unexplored/rivers) var/edge_distance = 16 // Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 3ba2198b35..8f98a89c36 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -270,7 +270,7 @@ var/turf/landmark_turf = get_turf(locate(/obj/effect/landmark/shuttle_import) in GLOB.landmarks_list) S.load(landmark_turf, centered = TRUE, register = FALSE) - var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE) + var/affected = S.get_affected_turfs(landmark_turf, centered = TRUE) var/found = 0 // Search the turfs for docking ports diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index e8971154f0..4f53e5d9d0 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -13,6 +13,7 @@ var/view_range = 7 var/x_offset = 0 var/y_offset = 0 + var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava) var/space_turfs_only = TRUE var/see_hidden = FALSE var/designate_time = 0 @@ -22,6 +23,7 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/Initialize() . = ..() GLOB.navigation_computers += src + whitelist_turfs = typecacheof(whitelist_turfs) /obj/machinery/computer/camera_advanced/shuttle_docker/Destroy() . = ..() @@ -226,6 +228,11 @@ if(!ispath(turf_type, /turf/open/space)) return SHUTTLE_DOCKER_BLOCKED + if(length(whitelist_turfs)) + var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type + if(!is_type_in_typecache(turf_type, whitelist_turfs)) + return SHUTTLE_DOCKER_BLOCKED + // Checking for overlapping dock boundaries for(var/i in 1 to overlappers.len) var/obj/docking_port/port = overlappers[i] @@ -246,7 +253,7 @@ current_user.client.images -= remove_images current_user.client.images += add_images -/obj/machinery/computer/camera_advanced/shuttle_docker/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) +/obj/machinery/computer/camera_advanced/shuttle_docker/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) if(port && (shuttleId == initial(shuttleId) || override)) shuttleId = port.id shuttlePortId = "[port.id]_custom" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 701c153783..8c1b3fa955 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -249,7 +249,7 @@ All ShuttleMove procs go here A.atmosinit() if(A.returnPipenet()) A.addMember(src) - build_network() + SSair.add_to_rebuild_queue(src) else // atmosinit() calls update_icon(), so we don't need to call it update_icon() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 2c466564ff..bce2da74e4 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -11,17 +11,31 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF anchored = TRUE -// + /// The identifier of the port or ship. + /// This will be used in numerous other places like the console, + /// stationary ports and whatnot to tell them your ship's mobile + /// port can be used in these places, or the docking port is compatible, etc. var/id - // this should point -away- from the dockingport door, ie towards the ship + ///Common standard is for this to point -away- from the dockingport door, ie towards the ship dir = NORTH - var/width = 0 //size of covered area, perpendicular to dir - var/height = 0 //size of covered area, parallel to dir - var/dwidth = 0 //position relative to covered area, perpendicular to dir - var/dheight = 0 //position relative to covered area, parallel to dir + ///size of covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically. + var/width = 0 + ///size of covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically. + var/height = 0 + ///position relative to covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically. + var/dwidth = 0 + ///position relative to covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically. + var/dheight = 0 var/area_type - var/hidden = FALSE //are we invisible to shuttle navigation computers? + ///are we invisible to shuttle navigation computers? + var/hidden = FALSE + + ///Delete this port after ship fly off. + var/delete_after = FALSE + +/obj/docking_port/proc/get_save_vars() + return list("pixel_x", "pixel_y", "dir", "name", "req_access", "req_access_txt", "piping_layer", "color", "icon_state", "pipe_color", "amount", "width", "height", "dwidth", "dheight") //these objects are indestructible /obj/docking_port/Destroy(force) @@ -155,8 +169,6 @@ /obj/docking_port/stationary name = "dock" - area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA - var/last_dock_time var/datum/map_template/shuttle/roundstart_template @@ -169,6 +181,9 @@ id = "[SSshuttle.stationary.len]" if(name == "dock") name = "dock[SSshuttle.stationary.len]" + if(!area_type) + var/area/place = get_area(src) + area_type = place?.type || SHUTTLE_DEFAULT_UNDERLYING_AREA // We might be created in nullspace if(mapload) for(var/turf/T in return_turfs()) @@ -183,6 +198,13 @@ SSshuttle.stationary -= src . = ..() +/obj/docking_port/stationary/Moved(atom/oldloc, dir, forced) + . = ..() + if(area_type) // We already have one + return + var/area/newarea = get_area(src) + area_type = newarea?.type + /obj/docking_port/stationary/proc/load_roundstart() if(json_key) var/sid = SSmapping.config.shuttles[json_key] @@ -235,16 +257,25 @@ var/list/shuttle_areas - var/timer //used as a timer (if you want time left to complete move, use timeLeft proc) + ///used as a timer (if you want time left to complete move, use timeLeft proc) + var/timer var/last_timer_length + ///current shuttle mode + var/mode = SHUTTLE_IDLE + ///time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples. + var/callTime = 100 + /// time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles. + var/ignitionTime = 55 + /// time spent after arrival before being able to begin ignition + var/rechargeTime = 0 + /// time spent after transit 'landing' before actually arriving + var/prearrivalTime = 0 - var/mode = SHUTTLE_IDLE //current shuttle mode - var/callTime = 100 //time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples. - var/ignitionTime = 55 // time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles. - - // The direction the shuttle prefers to travel in + /// The direction the shuttle prefers to travel in, ie what direction + /// the animation will cause it to appear to be traveling in var/preferred_direction = NORTH - // And the angle from the front of the shuttle to the port + /// relative direction of the docking port from the front of the shuttle + /// NORTH is towards front, EAST would be starboard side, WEST port, etc. var/port_direction = NORTH var/obj/docking_port/stationary/destination @@ -254,13 +285,16 @@ var/launch_status = NOLAUNCH - var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + ///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching. + var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0) var/list/ripples = list() - var/engine_coeff = 1 //current engine coeff - var/current_engines = 0 //current engine power - var/initial_engines = 0 //initial engine power - var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at + var/engine_coeff = 1 + var/current_engines = 0 + var/initial_engines = 0 + var/list/engine_list = list() + ///if this shuttle can move docking ports other than the one it is docked at + var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() /obj/docking_port/mobile/proc/register() @@ -308,14 +342,12 @@ id = "[id][idnum]" if(name == initial(name)) name = "[name] [idnum]" - for(var/i in shuttle_areas) - var/area/place = i - for(var/obj/machinery/computer/shuttle/comp in place) - comp.connect_to_shuttle(src, dock, idnum) - for(var/obj/machinery/computer/camera_advanced/shuttle_docker/comp in place) - comp.connect_to_shuttle(src, dock, idnum) - for(var/obj/machinery/status_display/shuttle/sd in place) - sd.connect_to_shuttle(src, dock, idnum) + for(var/place in shuttle_areas) + var/area/area = place + area.connect_to_shuttle(src, dock, idnum, FALSE) + for(var/each in place) + var/atom/atom = each + atom.connect_to_shuttle(src, dock, idnum, FALSE) //this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact @@ -423,7 +455,10 @@ if(initiate_docking(S1) != DOCKING_SUCCESS) WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].") else - previous = S0 + if(S0.delete_after) + qdel(S0, TRUE) + else + previous = S0 else WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]") @@ -472,7 +507,7 @@ if(M.mind && !istype(t, /turf/open/floor/plasteel/shuttle/red) && !istype(t, /turf/open/floor/mineral/plastitanium/red/brig)) M.mind.force_escaped = TRUE // Ghostize them and put them in nullspace stasis (for stat & possession checks) - M.notransform = TRUE + M.mob_transforming = TRUE M.ghostize(FALSE) M.moveToNullspace() @@ -536,7 +571,11 @@ // If we can't dock or we don't have a transit slot, wait for 20 ds, // then try again switch(mode) - if(SHUTTLE_CALL) + if(SHUTTLE_CALL, SHUTTLE_PREARRIVAL) + if(prearrivalTime && mode != SHUTTLE_PREARRIVAL) + mode = SHUTTLE_PREARRIVAL + setTimer(prearrivalTime) + return var/error = initiate_docking(destination, preferred_direction) if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE)) var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])" @@ -547,6 +586,10 @@ else if(error) setTimer(20) return + if(rechargeTime) + mode = SHUTTLE_RECHARGING + setTimer(rechargeTime) + return if(SHUTTLE_RECALL) if(initiate_docking(previous) != DOCKING_SUCCESS) setTimer(20) @@ -649,6 +692,10 @@ return "ESC" if(SHUTTLE_STRANDED) return "ERR" + if(SHUTTLE_RECHARGING) + return "RCH" + if(SHUTTLE_PREARRIVAL) + return "LDN" return "" // returns 5-letter timer string, used by status screens and mob status panel @@ -667,7 +714,7 @@ /obj/docking_port/mobile/proc/getStatusText() var/obj/docking_port/stationary/dockedAt = get_docked() - + var/docked_at = dockedAt?.name || "unknown" if(istype(dockedAt, /obj/docking_port/stationary/transit)) if (timeLeft() > 1 HOURS) return "hyperspace" @@ -678,8 +725,10 @@ else dst = destination . = "transit towards [dst?.name || "unknown location"] ([getTimerStr()])" + else if(mode == SHUTTLE_RECHARGING) + return "[docked_at], recharging [getTimerStr()]" else - return dockedAt?.name || "unknown" + return docked_at /obj/docking_port/mobile/proc/getDbgStatusText() @@ -711,19 +760,47 @@ return null /obj/docking_port/mobile/proc/hyperspace_sound(phase, list/areas) - var/s + var/selected_sound switch(phase) if(HYPERSPACE_WARMUP) - s = 'sound/effects/hyperspace_begin.ogg' + selected_sound = "hyperspace_begin" if(HYPERSPACE_LAUNCH) - s = 'sound/effects/hyperspace_progress.ogg' + selected_sound = "hyperspace_progress" if(HYPERSPACE_END) - s = 'sound/effects/hyperspace_end.ogg' + selected_sound = "hyperspace_end" else CRASH("Invalid hyperspace sound phase: [phase]") - for(var/A in areas) - for(var/obj/machinery/door/E in A) //dumb, I know, but playing it on the engines doesn't do it justice - playsound(E, s, 100, FALSE, max(width, height) - world.view) + // This previously was played from each door at max volume, and was one of the worst things I had ever seen. + // Now it's instead played from the nearest engine if close, or the first engine in the list if far since it doesn't really matter. + // Or a door if for some reason the shuttle has no engine, fuck oh hi daniel fuck it + var/range = (engine_coeff * max(width, height)) + var/long_range = range * 2.5 + var/atom/distant_source + if(LAZYLEN(engine_list)) + distant_source = engine_list[1] + else + for(var/A in areas) + distant_source = locate(/obj/machinery/door) in A + if(distant_source) + break + + if(distant_source) + for(var/mob/M in SSmobs.clients_by_zlevel[z]) + var/dist_far = get_dist(M, distant_source) + if(dist_far <= long_range && dist_far > range) + M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20) + else if(dist_far <= range) + var/source + if(engine_list.len == 0) + source = distant_source + else + var/closest_dist = 10000 + for(var/obj/O in engine_list) + var/dist_near = get_dist(M, O) + if(dist_near < closest_dist) + source = O + closest_dist = dist_near + M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2) // Losing all initial engines should get you 2 // Adding another set of engines at 0.5 time @@ -743,7 +820,12 @@ var/area/shuttle/areaInstance = thing for(var/obj/structure/shuttle/engine/E in areaInstance.contents) if(!QDELETED(E)) + engine_list += E . += E.engine_power + for(var/obj/machinery/shuttle/engine/E in areaInstance.contents) + if(!QDELETED(E)) + engine_list += E + . += E.thruster_active ? 1 : 0 // Double initial engines to get to 0.5 minimum // Lose all initial engines to get to 2 @@ -757,18 +839,18 @@ var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default if(initial_engines > 0) change_per_engine = (1 - ENGINE_COEFF_MIN) / initial_engines // or however many it had - return CLAMP(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return clamp(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) if(new_value < initial_engines) var/delta = initial_engines - new_value var/change_per_engine = 1 //doesn't really matter should not be happening for 0 engine shuttles if(initial_engines > 0) change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay - return CLAMP(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) /obj/docking_port/mobile/proc/in_flight() switch(mode) - if(SHUTTLE_CALL,SHUTTLE_RECALL) + if(SHUTTLE_CALL,SHUTTLE_RECALL,SHUTTLE_PREARRIVAL) return TRUE if(SHUTTLE_IDLE,SHUTTLE_IGNITING) return FALSE diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm new file mode 100644 index 0000000000..f5a11db60f --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -0,0 +1,370 @@ +#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size) +#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count) +#define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0) +#define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1) + +GLOBAL_VAR_INIT(custom_shuttle_count, 0) //The amount of custom shuttles created to prevent creating hundreds +GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (Heaters, engines) + +//============ Shuttle Creator Object ============ +/obj/item/shuttle_creator + name = "Rapid Shuttle Designator" + icon = 'icons/obj/tools.dmi' + icon_state = "rsd" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + desc = "A device used to define the area required for custom ships. Uses bluespace crystals to create bluespace-capable ships." + density = FALSE + anchored = FALSE + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + force = 0 + throwforce = 8 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + req_access_txt = "11" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + resistance_flags = FIRE_PROOF + var/ready = TRUE + //pre-designation + var/override_max_shuttles = FALSE + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_shuttle_creator + //During designation + var/overwritten_area = /area/space + var/list/loggedTurfs = list() + var/loggedOldArea + var/recorded_shuttle_area + var/datum/shuttle_creator_overlay_holder/overlay_holder + //After designation + var/linkedShuttleId + +/obj/item/shuttle_creator/Initialize() + . = ..() + internal_shuttle_creator = new() + internal_shuttle_creator.owner_rsd = src + overlay_holder = new() + +/obj/item/shuttle_creator/Destroy() + . = ..() + if(internal_shuttle_creator) + internal_shuttle_creator.owner_rsd = null + QDEL_NULL(internal_shuttle_creator) + if(overlay_holder) + QDEL_NULL(overlay_holder) + +/obj/item/shuttle_creator/attack_self(mob/user) + ..() + if(linkedShuttleId) + return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles) + to_chat(user, "Too many shuttles have been created.") + message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.") + return + if(!internal_shuttle_creator) + return + overlay_holder.add_client(user.client) + internal_shuttle_creator.attack_hand(user) + +/obj/item/shuttle_creator/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(!ready) + to_chat(user, "You need to define a shuttle area first.") + return + if(!proximity_flag) + return + if(istype(target, /obj/machinery/computer/custom_shuttle)) + if(!linkedShuttleId) + to_chat(user, "Error, no defined shuttle linked to device") + return + var/obj/machinery/computer/custom_shuttle/console = target + console.linkShuttle(linkedShuttleId) + to_chat(user, "Console linked successfully!") + return + else if(istype(target, /obj/machinery/computer/camera_advanced/shuttle_docker/custom)) + if(!linkedShuttleId) + to_chat(user, "Error, no defined shuttle linked to device") + return + var/obj/machinery/computer/camera_advanced/shuttle_docker/custom/console = target + console.linkShuttle(linkedShuttleId) + to_chat(user, "Console linked successfully!") + return + to_chat(user, "The [src] bleeps. Select an airlock to create a docking port, or a valid machine to link.") + return + +//=========== shuttle designation actions ============ +/obj/item/shuttle_creator/proc/calculate_bounds(obj/docking_port/mobile/port) + if(!port || !istype(port, /obj/docking_port/mobile)) + return FALSE + //Heights is the distance away from the port + //width is the distance perpendicular to the port + var/minX = INFINITY + var/maxX = 0 + var/minY = INFINITY + var/maxY = 0 + for(var/turf/T in loggedTurfs) + minX = min(T.x, minX) + maxX = max(T.x, maxX) + minY = min(T.y, minY) + maxY = max(T.y, maxY) + //Make sure shuttle was actually found. + if(maxX == INFINITY || maxY == INFINITY) + return FALSE + minX-- + minY-- + var/width = maxX - minX + var/height = maxY - minY + var/offset_x = port.x - minX + var/offset_y = port.y - minY + switch(port.dir) //Source: code/datums/shuttles.dm line 77 (14/03/2020) :) + if(NORTH) + port.width = width + port.height = height + port.dwidth = offset_x - 1 + port.dheight = offset_y - 1 + if(EAST) + port.width = height + port.height = width + port.dwidth = height - offset_y + port.dheight = offset_x - 1 + if(SOUTH) + port.width = width + port.height = height + port.dwidth = width - offset_x + port.dheight = height - offset_y + if(WEST) + port.width = height + port.height = width + port.dwidth = offset_y - 1 + port.dheight = width - offset_x + return TRUE + +//Go through all the all_turfs and check which direction doesn't have the shuttle +/obj/item/shuttle_creator/proc/getNonShuttleDirection(turf/targetTurf) + var/position = null + if(!(get_offset_target_turf(targetTurf, 0, 1) in loggedTurfs)) + if(position != null) + return null + position = NORTH + if(!(get_offset_target_turf(targetTurf, 0, -1) in loggedTurfs)) + if(position != null) + return null + position = SOUTH + if(!(get_offset_target_turf(targetTurf, 1, 0) in loggedTurfs)) + if(position != null) + return null + position = EAST + if(!(get_offset_target_turf(targetTurf, -1, 0) in loggedTurfs)) + if(position != null) + return null + position = WEST + return position + +/obj/item/shuttle_creator/proc/invertDir(var/input_dir) + if(input_dir == NORTH) + return SOUTH + else if(input_dir == SOUTH) + return NORTH + else if(input_dir == EAST) + return WEST + else if(input_dir == WEST) + return EAST + return null + +/obj/item/shuttle_creator/proc/shuttle_create_docking_port(atom/target, mob/user) + + if(loggedTurfs.len == 0 || !recorded_shuttle_area) + to_chat(user, "Invalid shuttle, restarting bluespace systems...") + return FALSE + + var/datum/map_template/shuttle/new_shuttle = new /datum/map_template/shuttle() + + var/obj/docking_port/mobile/port = new /obj/docking_port/mobile(get_turf(target)) + var/obj/docking_port/stationary/stationary_port = new /obj/docking_port/stationary(get_turf(target)) + port.callTime = 50 + port.dir = 1 //Point away from space. + port.id = "custom_[GLOB.custom_shuttle_count]" + linkedShuttleId = port.id + port.ignitionTime = 25 + port.name = "Custom Shuttle" + port.port_direction = 2 + port.preferred_direction = 4 + port.area_type = recorded_shuttle_area + + stationary_port.area_type = overwritten_area + + var/portDirection = getNonShuttleDirection(get_turf(port)) + var/invertedDir = invertDir(portDirection) + if(!portDirection || !invertedDir) + to_chat(usr, "Shuttle creation aborted, docking airlock must be on an external wall. Please select a new airlock.") + port.Destroy() + stationary_port.Destroy() + linkedShuttleId = null + return FALSE + port.dir = invertedDir + port.port_direction = portDirection + + if(!calculate_bounds(port)) + to_chat(usr, "Bluespace calculations failed, please select a new airlock.") + port.Destroy() + stationary_port.Destroy() + linkedShuttleId = null + return FALSE + + port.shuttle_areas = list() + //var/list/all_turfs = port.return_ordered_turfs(port.x, port.y, port.z, port.dir) + var/list/all_turfs = loggedTurfs + for(var/i in 1 to all_turfs.len) + var/turf/curT = all_turfs[i] + var/area/cur_area = curT.loc + //Add the area to the shuttle <3 + if(istype(cur_area, recorded_shuttle_area)) + if(istype(curT, /turf/open/space)) + continue + if(length(curT.baseturfs) < 2) + continue + //Add the shuttle base shit to the shuttle + curT.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle) + port.shuttle_areas[cur_area] = TRUE + + port.linkup(new_shuttle, stationary_port) + + port.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) + port.initiate_docking(stationary_port) + + port.mode = SHUTTLE_IDLE + port.timer = 0 + + port.register() + + icon_state = "rsd_used" + + //Clear highlights + overlay_holder.clear_highlights() + GLOB.custom_shuttle_count ++ + message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + return TRUE + +/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user) + //Check to see if the user can make a new area to prevent spamming + if(user) + if(user.create_area_cooldown >= world.time) + to_chat(user, "Smoke vents from the [src], maybe you should let it cooldown before using it again.") + return FALSE + user.create_area_cooldown = world.time + 10 + if(!loggedTurfs) + return FALSE + if(!check_area(loggedTurfs, FALSE)) //Makes sure nothing (Shuttles) has moved into the area during creation + return FALSE + //Create the new area + var/area/shuttle/custom/powered/newS + var/area/oldA = loggedOldArea + var/str = stripped_input(user, "Shuttle Name:", "Blueprint Editing", "", MAX_NAME_LEN) + if(!str || !length(str)) + return FALSE + if(length(str) > 50) + to_chat(user, "The provided ship name is too long, blares the [src]") + return FALSE + newS = new /area/shuttle/custom/powered() + newS.setup(str) + newS.set_dynamic_lighting() + //Shuttles always have gravity + newS.has_gravity = TRUE + newS.requires_power = TRUE + //Record the area for use when creating the docking port + recorded_shuttle_area = newS + + for(var/i in 1 to loggedTurfs.len) + var/turf/turf_holder = loggedTurfs[i] + var/area/old_area = turf_holder.loc + newS.contents += turf_holder + turf_holder.change_area(old_area, newS) + + newS.reg_in_areas_in_z() + + var/list/firedoors = oldA.firedoors + for(var/door in firedoors) + var/obj/machinery/door/firedoor/FD = door + FD.CalculateAffectingAreas() + return TRUE + +//Checks an area to ensure that the turfs provided are valid to be made into a shuttle +/obj/item/shuttle_creator/proc/check_area(list/turfs, addingTurfs = TRUE) + if(!turfs) + to_chat(usr, "Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.") + return FALSE + if(turfs.len + (addingTurfs ? loggedTurfs.len : 0) > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(usr, "The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"") + return FALSE + //Check to see if it's a valid shuttle + for(var/i in 1 to turfs.len) + var/area/place = get_area(turfs[i]) + //If any of the turfs are on station / not in space, a shuttle cannot be forced there + if(!place) + to_chat(usr, "You can't seem to overpower the bluespace harmonics in this location, try somewhere else.") + return FALSE + if(istype(place, /area/space)) + overwritten_area = /area/space + else if(istype(place, /area/lavaland/surface/outdoors)) + overwritten_area = /area/lavaland/surface/outdoors + else + to_chat(usr, "Caution, shuttle must not use any material connected to the station. Your shuttle is currenly overlapping with [place.name]") + return FALSE + //Finally, check to see if the area is actually attached + if(!LAZYLEN(loggedTurfs)) + return TRUE + for(var/turf/T in turfs) + if(turf_connected_to_saved_turfs(T)) + return TRUE + CHECK_TICK + to_chat(usr, "Caution, new areas of the shuttle must be connected to the other areas of the shuttle.") + return FALSE + +/obj/item/shuttle_creator/proc/turf_connected_to_saved_turfs(turf/T) + for(var/i in 1 to 4) + var/turf/adjacentT = get_offset_target_turf(T, CARDINAL_DIRECTIONS_X[i], CARDINAL_DIRECTIONS_Y[i]) + if(adjacentT in loggedTurfs) + return TRUE + return FALSE + +/obj/item/shuttle_creator/proc/turf_in_list(turf/T) + return loggedTurfs.Find(T) + +/obj/item/shuttle_creator/proc/add_single_turf(turf/T) + if(!check_area(list(T))) + return FALSE + loggedTurfs |= T + loggedOldArea = get_area(T) + overlay_holder.highlight_turf(T) + +/obj/item/shuttle_creator/proc/add_saved_area(mob/user) + var/static/area_or_turf_fail_types = typecacheof(list( + /turf/open/space, + /area/shuttle + )) + //Detect the turfs connected in the curerrent enclosed area + var/list/turfs = detect_room(get_turf(user), area_or_turf_fail_types) + if(!check_area(turfs)) + return FALSE + loggedOldArea = get_area(get_turf(user)) + loggedTurfs |= turfs + overlay_holder.highlight_area(turfs) + //TODO READD THIS SHIT: icon_state = "rsd_used" + to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.") + return turfs + +/obj/item/shuttle_creator/proc/remove_single_turf(turf/T) + if(!turf_in_list(T)) + return + loggedTurfs -= T + loggedOldArea = get_area(T) + overlay_holder.unhighlight_turf(T) + +/obj/item/shuttle_creator/proc/reset_saved_area() + overlay_holder.clear_highlights() + loggedTurfs.Cut() + to_chat(usr, "You reset the area buffer on the [src].") + +#undef CARDINAL_DIRECTIONS_X +#undef CARDINAL_DIRECTIONS_Y diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm new file mode 100644 index 0000000000..f50b3bf59f --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -0,0 +1,101 @@ +//============ Actions ============ +/datum/action/innate/shuttle_creator + icon_icon = 'icons/mob/actions/actions_shuttle.dmi' + var/mob/living/C + var/mob/camera/aiEye/remote/shuttle_creation/remote_eye + var/obj/item/shuttle_creator/shuttle_creator + +/datum/action/innate/shuttle_creator/Activate() + if(!target) + return TRUE + C = owner + remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target + shuttle_creator = internal_console.owner_rsd + +//Add an area +/datum/action/innate/shuttle_creator/designate_area + name = "Designate Room" + button_icon_state = "designate_area" + +/datum/action/innate/shuttle_creator/designate_area/Activate() + if(..()) + return + shuttle_creator.add_saved_area(remote_eye) + +//Add a single turf +/datum/action/innate/shuttle_creator/designate_turf + name = "Designate Turf" + button_icon_state = "designate_turf" + +/datum/action/innate/shuttle_creator/designate_turf/Activate() + if(..()) + return + var/turf/T = get_turf(remote_eye) + if(istype(T, /turf/open/space)) + var/connectors_exist = FALSE + for(var/obj/structure/lattice/lattice in T) + connectors_exist = TRUE + break + if(!connectors_exist) + to_chat(usr, "This turf requires support, build some catwalks or lattices.") + return + if(!shuttle_creator.check_area(list(T))) + return + if(shuttle_creator.turf_in_list(T)) + return + shuttle_creator.add_single_turf(T) + +//Clear a single entire area +/datum/action/innate/shuttle_creator/clear_turf + name = "Clear Turf" + button_icon_state = "clear_turf" + +/datum/action/innate/shuttle_creator/clear_turf/Activate() + if(..()) + return + shuttle_creator.remove_single_turf(get_turf(remote_eye)) + +//Clear the entire area +/datum/action/innate/shuttle_creator/reset + name = "Reset Buffer" + button_icon_state = "clear_area" + +/datum/action/innate/shuttle_creator/reset/Activate() + if(..()) + return + shuttle_creator.reset_saved_area() + +//Finish the shuttle +/datum/action/innate/shuttle_creator/airlock + name = "Select Docking Airlock" + button_icon_state = "select_airlock" + +/datum/action/innate/shuttle_creator/airlock/Activate() + if(..()) + return + var/turf/T = get_turf(remote_eye) + for(var/obj/machinery/door/airlock/A in T) + if(get_area(A) != shuttle_creator.loggedOldArea) + to_chat(C, "Caution, airlock must be on the shuttle to function as a dock.") + return + if(shuttle_creator.linkedShuttleId) + return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT) + to_chat(C, "Shuttle limit reached, sorry.") + return + if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(C, "This shuttle is too large!") + return + if(!shuttle_creator.getNonShuttleDirection(T)) + to_chat(C, "Docking port must be on an external wall, with only 1 side exposed to space.") + return + if(!shuttle_creator.create_shuttle_area(C)) + return + if(shuttle_creator.shuttle_create_docking_port(A, C)) + to_chat(C, "Shuttle created!") + //Remove eye control + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target + internal_console.remove_eye_control() + qdel(internal_console) + return diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm new file mode 100644 index 0000000000..6945c93427 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm @@ -0,0 +1,93 @@ +//============The internal camera console used for designating the area============= +/obj/machinery/computer/camera_advanced/shuttle_creator + name = "internal shuttle creator console" + desc = "You should not have access to this, please report this as a bug" + networks = list() + var/obj/item/shuttle_creator/owner_rsd + var/datum/action/innate/shuttle_creator/designate_area/area_action = new + var/datum/action/innate/shuttle_creator/designate_turf/turf_action = new + var/datum/action/innate/shuttle_creator/clear_turf/clear_turf_action = new + var/datum/action/innate/shuttle_creator/reset/reset_action = new + var/datum/action/innate/shuttle_creator/airlock/airlock_action = new + +/obj/machinery/computer/camera_advanced/shuttle_creator/check_eye(mob/user) + if(user.eye_blind || user.incapacitated()) + user.unset_machine() + +/obj/machinery/computer/camera_advanced/shuttle_creator/CreateEye() + eyeobj = new /mob/camera/aiEye/remote/shuttle_creation(get_turf(owner_rsd)) + eyeobj.origin = src + eyeobj.use_static = USE_STATIC_NONE + +/obj/machinery/computer/camera_advanced/shuttle_creator/is_operational() + return TRUE + +/obj/machinery/computer/camera_advanced/shuttle_creator/can_interact(mob/user) + if(!isliving(user)) + return FALSE + var/mob/living/L = user + if(L.incapacitated()) + return FALSE + return TRUE + +/obj/machinery/computer/camera_advanced/shuttle_creator/GrantActions(mob/living/user) + ..(user) + eyeobj.invisibility = SEE_INVISIBLE_LIVING + if(area_action) + area_action.target = src + area_action.Grant(user) + actions += area_action + if(turf_action) + turf_action.target = src + turf_action.Grant(user) + actions += turf_action + if(clear_turf_action) + clear_turf_action.target = src + clear_turf_action.Grant(user) + actions += clear_turf_action + if(reset_action) + reset_action.target = src + reset_action.Grant(user) + actions += reset_action + if(airlock_action) + airlock_action.target = src + airlock_action.Grant(user) + actions += airlock_action + +/obj/machinery/computer/camera_advanced/shuttle_creator/remove_eye_control(mob/living/user) + . = ..() + owner_rsd.overlay_holder.remove_client() + eyeobj.invisibility = INVISIBILITY_MAXIMUM + if(user.client) + user.client.images -= eyeobj.user_image + +/obj/machinery/computer/camera_advanced/shuttle_creator/attack_hand(mob/user) + if(!is_operational()) //you cant use broken machine you chumbis + return + if(current_user) + to_chat(user, "The console is already in use!") + return + var/mob/living/L = user + if(!can_use(user)) + return + if(!eyeobj) + CreateEye() + if(!eyeobj.eye_initialized) + var/camera_location = get_turf(owner_rsd) + if(camera_location) + eyeobj.eye_initialized = TRUE + give_eye_control(L) + eyeobj.setLoc(camera_location) + var/mob/camera/aiEye/remote/shuttle_creation/shuttle_eye = eyeobj + shuttle_eye.source_turf = get_turf(user) + else + user.unset_machine() + else + var/camera_location = get_turf(owner_rsd) + var/mob/camera/aiEye/remote/shuttle_creation/eye = eyeobj + give_eye_control(L) + if(camera_location) + eye.source_turf = camera_location + eyeobj.setLoc(camera_location) + else + eyeobj.setLoc(eyeobj.loc) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm new file mode 100644 index 0000000000..ff96e2ae65 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -0,0 +1,54 @@ +//===============Camera Eye================ +/mob/camera/aiEye/remote/shuttle_creation + name = "shuttle holo-drone" + icon = 'icons/obj/mining.dmi' + icon_state = "construction_drone" + visible_icon = FALSE + acceleration = 0 + var/turf/source_turf + var/max_range = 12 + +/mob/camera/aiEye/remote/shuttle_creation/Initialize() + . = ..() + setLoc(get_turf(source_turf)) + +/mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user) + user.sight = BLIND|SEE_TURFS + user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + user.sync_lighting_plane_alpha() + return TRUE + +/mob/camera/aiEye/remote/shuttle_creation/relaymove(mob/user, direct) + dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated + var/initial = initial(sprint) + var/max_sprint = 50 + + if(cooldown && cooldown < world.timeofday) // 3 seconds + sprint = initial + + for(var/i = 0; i < max(sprint, initial); i += 20) + var/turf/step = get_turf(get_step(src, direct)) + if(step && can_move_to(step)) + setLoc(step) + + cooldown = world.timeofday + 5 + if(acceleration) + sprint = min(sprint + 0.5, max_sprint) + else + sprint = initial + +/mob/camera/aiEye/remote/shuttle_creation/proc/can_move_to(var/turf/T) + var/origin_x = source_turf.x + var/origin_y = source_turf.y + var/change_X = abs(origin_x - T.x) + var/change_Y = abs(origin_y - T.y) + return (change_X < max_range && change_Y < max_range) + +/mob/camera/aiEye/remote/shuttle_creation/setLoc(T) + ..() + if(eye_user?.client) + eye_user.client.images -= user_image + var/image/I = image(icon, loc, icon_state, FLY_LAYER, dir) + I.plane = MASSIVE_OBJ_LAYER + user_image = I + eye_user.client.images += user_image diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm new file mode 100644 index 0000000000..919b1f0221 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm @@ -0,0 +1,52 @@ +/* + * Manages the overlays for the shuttle creator drone. +*/ + +/datum/shuttle_creator_overlay_holder + var/client/holder + var/list/images = list() + var/list/turfs = list() + +/datum/shuttle_creator_overlay_holder/proc/add_client(client/C) + holder = C + holder.images += images + +/datum/shuttle_creator_overlay_holder/proc/remove_client() + holder.images -= images + holder = null + +/datum/shuttle_creator_overlay_holder/proc/clear_highlights() + if(holder) + holder.images -= images + images.Cut() + turfs.Cut() + +/datum/shuttle_creator_overlay_holder/proc/create_hightlight(turf/T) + if(T in turfs) + return + var/image/I = image('icons/turf/overlays.dmi', T, "greenOverlay") + I.plane = ABOVE_LIGHTING_PLANE + images += I + holder.images += I + turfs += T + +/datum/shuttle_creator_overlay_holder/proc/remove_hightlight(turf/T) + if(!(T in turfs)) + return + turfs -= T + holder.images -= images + for(var/image/I in images) + if(get_turf(I) != T) + continue + images -= I + holder.images += images + +/datum/shuttle_creator_overlay_holder/proc/highlight_area(list/turfs) + for(var/turf/T in turfs) + highlight_turf(T) + +/datum/shuttle_creator_overlay_holder/proc/highlight_turf(turf/T) + create_hightlight(T) + +/datum/shuttle_creator_overlay_holder/proc/unhighlight_turf(turf/T) + remove_hightlight(T) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm new file mode 100644 index 0000000000..6b67eec5b8 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm @@ -0,0 +1,39 @@ +/obj/item/shuttle_route_optimisation + name = "Route Optimisation Upgrade" + desc = "Used on a custom shuttle control console to calculate more efficient routes." + icon = 'icons/obj/module.dmi' + icon_state = "shuttledisk" + force = 0 + throwforce = 0 + throw_speed = 1 + throw_range = 7 + density = FALSE + anchored = FALSE + item_flags = NOBLUDGEON + var/upgrade_amount = 0.8 + +/obj/item/shuttle_route_optimisation/hyperlane + name = "Bluespace Hyperlane Calculator" + desc = "Used on a custom shuttle control console to allow for the following of bluespace hyperlanes, increasing the efficiency of the shuttle." + icon_state = "shuttledisk_better" + upgrade_amount = 0.6 + +/obj/item/shuttle_route_optimisation/void + name = "Voidspace Route Calculator" + desc = "Used on a custom shuttle control console to allow it to navigate into voidspace, making the routes almost instant." + icon_state = "shuttledisk_void" + upgrade_amount = 0.2 + +/obj/item/shuttle_route_optimisation/attack_obj(obj/O, mob/living/user) + . = ..() + if(!istype(O, /obj/machinery/computer)) + return + if(!istype(O, /obj/machinery/computer/custom_shuttle)) + to_chat(user, "This upgrade only works on a custom shuttle flight console.") + return + if (!user.transferItemToLoc(src, get_turf(O))) + return + var/obj/machinery/computer/custom_shuttle/link_comp = O + link_comp.distance_multiplier = clamp(link_comp.distance_multiplier, 0, upgrade_amount) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + to_chat(usr, "You insert the disk into the flight computer, allowing for routes to be [upgrade_amount]x the original distance.") diff --git a/code/modules/shuttle/snaxi.dm b/code/modules/shuttle/snaxi.dm new file mode 100644 index 0000000000..477d61753c --- /dev/null +++ b/code/modules/shuttle/snaxi.dm @@ -0,0 +1,7 @@ +/obj/machinery/computer/shuttle/snow_taxi + name = "snow taxi console" + desc = "Used to direct the snow taxi." + circuit = /obj/item/circuitboard/computer/snow_taxi + shuttleId = "snow_taxi" + possible_destinations = "snaxi_nw;snaxi_ne;snaxi_s" + no_destination_swap = TRUE diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 033187e353..87f9b55aa9 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -122,7 +122,7 @@ /obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper) if(sleeper in sleepers) to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.") - sleeper.ghostize(TRUE) + sleeper.ghostize(TRUE, voluntary = TRUE) /obj/structure/table/abductor/wabbajack/left desc = "You sleep so it may wake." diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index bdf6e8cc87..7af0315934 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -101,6 +101,10 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( if(!SSshuttle.shoppinglist.len) return + var/list/obj/miscboxes = list() //miscboxes are combo boxes that contain all goody orders grouped + var/list/misc_order_num = list() //list of strings of order numbers, so that the manifest can show all orders in a box + var/list/misc_contents = list() //list of lists of items that each box will contain + var/list/empty_turfs = list() for(var/place in shuttle_areas) var/area/shuttle/shuttle_area = place @@ -109,30 +113,81 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( continue empty_turfs += T + var/datum/bank_account/cargo_budget = SSeconomy.get_dep_account(ACCOUNT_CAR) var/value = 0 var/purchases = 0 for(var/datum/supply_order/SO in SSshuttle.shoppinglist) if(!empty_turfs.len) break - if(SO.pack.cost > SSshuttle.points) - continue - SSshuttle.points -= SO.pack.cost + var/price = SO.pack.cost + if(SO.applied_coupon) + price *= (1 - SO.applied_coupon.discount_pct_off) + var/datum/bank_account/D + if(SO.paying_account) //Someone paid out of pocket + D = SO.paying_account + if(!SO.pack.goody) + price *= 1.1 //TODO make this customizable by the quartermaster + else + D = cargo_budget + if(D) + if(!D.adjust_money(-SO.pack.cost)) + if(SO.paying_account) + D.bank_card_talk("Cargo order #[SO.id] rejected due to lack of funds. Credits required: [price]") + continue + + if(SO.paying_account) + D.bank_card_talk("Cargo order #[SO.id] has shipped. [price] credits have been charged to your bank account.") + var/datum/bank_account/department/cargo = SSeconomy.get_dep_account(ACCOUNT_CAR) + cargo.adjust_money(price - SO.pack.cost) //Cargo gets the handling fee value += SO.pack.cost SSshuttle.shoppinglist -= SO SSshuttle.orderhistory += SO + QDEL_NULL(SO.applied_coupon) + + if(SO.pack.goody) //goody means it gets piled in the miscbox + if(SO.paying_account) + if(!miscboxes.len || !miscboxes[D.account_holder]) //if there's no miscbox for this person + miscboxes[D.account_holder] = new /obj/item/storage/lockbox/order(pick_n_take(empty_turfs)) + var/obj/item/storage/lockbox/order/our_box = miscboxes[D.account_holder] + our_box.buyer_account = SO.paying_account + miscboxes[D.account_holder].name = "small items case - purchased by [D.account_holder]" + misc_contents[D.account_holder] = list() + for (var/item in SO.pack.contains) + misc_contents[D.account_holder] += item + misc_order_num[D.account_holder] = "[misc_order_num[D.account_holder]]#[SO.id] " + else //No private payment, so we just stuff it all into a generic crate + if(!miscboxes.len || !miscboxes["Cargo"]) + miscboxes["Cargo"] = new /obj/structure/closet/secure_closet/goodies(pick_n_take(empty_turfs)) + miscboxes["Cargo"].name = "small items closet" + misc_contents["Cargo"] = list() + miscboxes["Cargo"].req_access = list() + for (var/item in SO.pack.contains) + misc_contents["Cargo"] += item + //new item(miscboxes["Cargo"]) + if(SO.pack.access) + miscboxes["Cargo"].req_access += SO.pack.access + misc_order_num["Cargo"] = "[misc_order_num["Cargo"]]#[SO.id] " + else + SO.generate(pick_n_take(empty_turfs)) - SO.generate(pick_n_take(empty_turfs)) SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]")) - investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", INVESTIGATE_CARGO) + investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]), paid by [D.account_holder] has shipped.", INVESTIGATE_CARGO) if(SO.pack.dangerous) - message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)] has shipped.") + message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)], paid by [D.account_holder] has shipped.") purchases++ - investigate_log("[purchases] orders in this shipment, worth [value] credits. [SSshuttle.points] credits left.", INVESTIGATE_CARGO) + for(var/I in miscboxes) + var/datum/supply_order/SO = new/datum/supply_order() + SO.id = misc_order_num[I] + SO.generateCombo(miscboxes[I], I, misc_contents[I]) + qdel(SO) + + investigate_log("[purchases] orders in this shipment, worth [value] credits. [cargo_budget.account_balance] credits left.", INVESTIGATE_CARGO) /obj/docking_port/mobile/supply/proc/sell() - var/presale_points = SSshuttle.points + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + var/gain = 0 if(!GLOB.exports_list.len) // No exports list? Generate it! setupExports() @@ -164,14 +219,15 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list( continue msg += export_text + "\n" - SSshuttle.points += ex.total_value[E] + gain += ex.total_value[E] for(var/chem in ex.reagents_value) var/value = ex.reagents_value[chem] msg += "[value > 0 ? "+" : ""][value] credits: received [ex.reagents_volume[chem]]u of [chem].\n" - SSshuttle.points += value + gain += value + D.adjust_money(gain) msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) SSshuttle.centcom_message = msg - investigate_log("Shuttle contents sold for [SSshuttle.points - presale_points] credits. Contents: [ex.exported_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO) + investigate_log("Shuttle contents sold for [gain] credits. Contents: [ex.exported_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 4ebefc7e3c..440e6cb03b 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -62,6 +62,8 @@ view_range = 13 x_offset = -7 y_offset = -1 + space_turfs_only = FALSE + whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava, /turf/closed/mineral) see_hidden = TRUE -#undef SYNDICATE_CHALLENGE_TIMER \ No newline at end of file +#undef SYNDICATE_CHALLENGE_TIMER diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 9452722183..143fe508b6 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -45,6 +45,12 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th /obj/effect/proc_holder/singularity_pull() return +/obj/effect/proc_holder/Click() + return Trigger(usr, FALSE) + +/obj/effect/proc_holder/proc/Trigger(mob/user) + return TRUE + /obj/effect/proc_holder/proc/InterceptClickOn(mob/living/caller, params, atom/A) if(caller.ranged_ability != src || ranged_ability_user != caller) //I'm not actually sure how these would trigger, but, uh, safety, I guess? to_chat(caller, "[caller.ranged_ability.name] has been disabled.") @@ -150,8 +156,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(mobs_blacklist) mobs_blacklist = typecacheof(mobs_blacklist) -/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = FALSE, mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(!can_cast(user, skipcharge)) +/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = FALSE, mob/user = usr, skip_can_cast = FALSE) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell + if(!skip_can_cast && !can_cast(user, skipcharge)) return FALSE if(!skipcharge) @@ -181,17 +187,22 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return TRUE /obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount + var/mob/living/L + if(isliving(user)) + L = user switch(invocation_type) if("shout") - if(prob(50))//Auto-mute? Fuck that noise - user.say(invocation, forced = "spell") - else - user.say(replacetext(invocation," ","`"), forced = "spell") + if(!L || L.can_speak_vocal(invocation)) + if(prob(50))//Auto-mute? Fuck that noise + user.say(invocation, forced = "spell") + else + user.say(replacetext(invocation," ","`"), forced = "spell") if("whisper") - if(prob(50)) - user.whisper(invocation) - else - user.whisper(replacetext(invocation," ","`")) + if(!L || L.can_speak_vocal(invocation)) + if(prob(50)) + user.whisper(invocation) + else + user.whisper(replacetext(invocation," ","`")) if("emote") user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm @@ -210,8 +221,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th qdel(action) return ..() -/obj/effect/proc_holder/spell/Click() - if(cast_check()) +/obj/effect/proc_holder/spell/Trigger(mob/user, skip_can_cast = TRUE) + if(cast_check(FALSE, user, skip_can_cast)) choose_targets() return 1 @@ -432,18 +443,15 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return 1 /obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr, skipcharge = FALSE, silent = FALSE) - var/magic_flags = SEND_SIGNAL(user, COMSIG_MOB_SPELL_CAST_CHECK, src) + var/magic_flags = SEND_SIGNAL(user, COMSIG_MOB_SPELL_CAN_CAST, src) if(magic_flags & SPELL_SKIP_ALL_REQS) return TRUE - if(player_lock && (!user.mind || !(src in user.mind.spell_list))) + if(player_lock ? (!user.mind || !(src in user.mind.spell_list) && !(src in user.mob_spell_list)) : !(src in user.mob_spell_list)) if(!silent) to_chat(user, "You shouldn't have this spell! Something's wrong.") return FALSE - if(!(src in user.mob_spell_list)) - return FALSE - if(!centcom_cancast && !(magic_flags & SPELL_SKIP_CENTCOM)) //Certain spells are not allowed on the centcom zlevel var/turf/T = get_turf(user) if(is_centcom_level(T.z)) @@ -451,9 +459,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th to_chat(user, "You can't cast this spell here.") return FALSE - if(!skipcharge) - if(!charge_check(user)) - return FALSE + if(!skipcharge && !charge_check(user, silent)) + return FALSE if(user.stat && !stat_allowed && !(magic_flags & SPELL_SKIP_STAT)) if(!silent) @@ -486,7 +493,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th to_chat(L, "You can't get the words out!") return FALSE - if(!(magic_flags & SPELL_SKIP_MOBTYPE) && ((mobs_whitelist && !mobs_whitelist[user]) || (mobs_blacklist && mobs_blacklist[user]))) + if(!(magic_flags & SPELL_SKIP_MOBTYPE) && ((mobs_whitelist && !mobs_whitelist[user.type]) || (mobs_blacklist && mobs_blacklist[user.type]))) if(!silent) to_chat(user, "This spell can't be casted in this current form!") return FALSE diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 786026a1bc..8fab4a221d 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -11,12 +11,11 @@ var/current_amount = 0 //How many projectiles left. var/projectiles_per_fire = 1 //Projectiles per fire. Probably not a good thing to use unless you override ready_projectile(). -/obj/effect/proc_holder/spell/aimed/Click() - var/mob/living/user = usr +/obj/effect/proc_holder/spell/aimed/Trigger(mob/user, skip_can_cast = TRUE) if(!istype(user)) return var/msg - if(!can_cast(user, FALSE, TRUE)) + if(!skip_can_cast && !can_cast(user, FALSE, TRUE)) msg = "You can no longer cast [name]!" remove_ranged_ability(msg) return @@ -102,7 +101,7 @@ base_icon_state = "lightning" sound = 'sound/magic/lightningbolt.ogg' active = FALSE - projectile_var_overrides = list("tesla_range" = 15, "tesla_power" = 20000, "tesla_flags" = TESLA_MOB_DAMAGE) + projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) active_msg = "You energize your hand with arcane lightning!" deactive_msg = "You let the energy flow out of your hands back into yourself..." projectile_type = /obj/item/projectile/magic/aoe/lightning diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 34b033fd17..438c762ef6 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -118,14 +118,14 @@ revert_cast() return ..() else - user.notransform = TRUE + user.mob_transforming = TRUE user.fakefire() to_chat(src, "You begin to phase back into sinful flames.") if(do_mob(user,user,150)) user.infernalphaseout() else to_chat(user, "You must remain still while exiting.") - user.notransform = FALSE + user.mob_transforming = FALSE user.fakefireextinguish() start_recharge() return @@ -149,11 +149,11 @@ ExtinguishMob() forceMove(holder) holder = holder - notransform = 0 + mob_transforming = 0 fakefireextinguish() /mob/living/proc/infernalphasein() - if(notransform) + if(mob_transforming) to_chat(src, "You're too busy to jaunt in.") return FALSE fakefire() diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm index ab3e3cc27e..8ba106d77b 100644 --- a/code/modules/spells/spell_types/devil_boons.dm +++ b/code/modules/spells/spell_types/devil_boons.dm @@ -16,14 +16,14 @@ for(var/mob/living/carbon/C in targets) if(user.dropItemToGround(user.get_active_held_item())) var/obj/item = pick( - new /obj/item/coin/gold(user.loc), - new /obj/item/coin/diamond(user.loc), - new /obj/item/coin/silver(user.loc), - new /obj/item/clothing/accessory/medal/gold(user.loc), - new /obj/item/stack/sheet/mineral/gold(user.loc), - new /obj/item/stack/sheet/mineral/silver(user.loc), - new /obj/item/stack/sheet/mineral/diamond(user.loc), - new /obj/item/stack/spacecash/c1000(user.loc)) + new /obj/item/coin/gold(user.drop_location()), + new /obj/item/coin/diamond(user.drop_location()), + new /obj/item/coin/silver(user.drop_location()), + new /obj/item/clothing/accessory/medal/gold(user.drop_location()), + new /obj/item/stack/sheet/mineral/gold(user.drop_location()), + new /obj/item/stack/sheet/mineral/silver(user.drop_location()), + new /obj/item/stack/sheet/mineral/diamond(user.drop_location()), + new /obj/item/holochip(user.drop_location(), 1000)) C.put_in_hands(item) /obj/effect/proc_holder/spell/targeted/view_range diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index f485ae578f..8cf51d45c6 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -22,14 +22,14 @@ INVOKE_ASYNC(src, .proc/do_jaunt, target) /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target) - target.notransform = 1 + target.mob_transforming = 1 var/turf/mobloc = get_turf(target) var/obj/effect/dummy/phased_mob/spell_jaunt/holder = new /obj/effect/dummy/phased_mob/spell_jaunt(mobloc) new jaunt_out_type(mobloc, target.dir) target.ExtinguishMob() target.forceMove(holder) target.reset_perspective(holder) - target.notransform=0 //mob is safely inside holder now, no need for protection. + target.mob_transforming=0 //mob is safely inside holder now, no need for protection. jaunt_steam(mobloc) sleep(jaunt_duration) @@ -102,4 +102,4 @@ return /obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah) - return BULLET_ACT_FORCE_PIERCE \ No newline at end of file + return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index 81b26cf464..d0c3c4166c 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -15,9 +15,9 @@ action_icon_state = "lightning" -/obj/effect/proc_holder/spell/targeted/tesla/Click() - if(!ready && cast_check()) - StartChargeup() +/obj/effect/proc_holder/spell/targeted/tesla/Trigger(mob/user, skip_can_cast = TRUE) + if(!ready && cast_check(FALSE, user, skip_can_cast)) + StartChargeup(user) return 1 /obj/effect/proc_holder/spell/targeted/tesla/proc/StartChargeup(mob/user = usr) diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index a3bb81ae55..8f39da5031 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -16,12 +16,12 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() - if(usr && usr.mind) - if(!usr.mind.miming) +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." + invocation = "[user.real_name] looks as if a wall is in front of [user.p_them()]." else invocation_type ="none" ..() @@ -41,17 +41,12 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/targeted/mime/speak/Click() - if(!usr) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - if(H.mind.miming) +/obj/effect/proc_holder/spell/targeted/mime/speak/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind?.miming) still_recharging_msg = "You can't break your vow of silence that fast!" else still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" - ..() + return ..() /obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) for(var/mob/living/carbon/human/H in targets) @@ -82,15 +77,15 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() - if(usr && usr.mind) - if(!usr.mind.miming) +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + invocation = "[user.real_name] looks as if a blockade is in front of [user.p_them()]." else invocation_type ="none" - ..() + return ..() /obj/effect/proc_holder/spell/aimed/finger_guns name = "Finger Guns" @@ -114,19 +109,18 @@ base_icon_state = "mime" -/obj/effect/proc_holder/spell/aimed/finger_guns/Click() - var/mob/living/carbon/human/owner = usr - if(owner.incapacitated()) - to_chat(owner, "You can't properly point your fingers while incapacitated.") +/obj/effect/proc_holder/spell/aimed/finger_guns/Trigger(mob/user, skip_can_cast = TRUE) + if(user.incapacitated()) + to_chat(user, "You can't properly point your fingers while incapacitated.") return - if(usr && usr.mind) - if(!usr.mind.miming) + if(user.mind) + if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return - invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + invocation = "[user.real_name] fires [user.p_their()] finger gun!" else invocation_type ="none" - ..() + return ..() /obj/effect/proc_holder/spell/targeted/touch/mimerope name = "Invisible Rope" @@ -144,8 +138,8 @@ action_background_icon_state = "bg_mime" hand_path = /obj/item/melee/touch_attack/mimerope -/obj/effect/proc_holder/spell/targeted/touch/mimerope/Click() - if(usr && usr.mind) +/obj/effect/proc_holder/spell/targeted/touch/mimerope/Trigger(mob/user, skip_can_cast = TRUE) + if(user.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") return diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm index 7a96d0ac55..6b974608d6 100644 --- a/code/modules/spells/spell_types/rod_form.dm +++ b/code/modules/spells/spell_types/rod_form.dm @@ -18,7 +18,7 @@ W.damage_bonus += spell_level * 20 //You do more damage when you upgrade the spell W.start_turf = start M.forceMove(W) - M.notransform = 1 + M.mob_transforming = 1 M.status_flags |= GODMODE //Wizard Version of the Immovable Rod @@ -37,7 +37,7 @@ /obj/effect/immovablerod/wizard/Destroy() if(wizard) wizard.status_flags &= ~GODMODE - wizard.notransform = 0 + wizard.mob_transforming = 0 wizard.forceMove(get_turf(src)) return ..() diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index c6966ccee9..a8f9c8bce5 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -100,7 +100,7 @@ if(stored.mind) stored.mind.transfer_to(shape) stored.forceMove(src) - stored.notransform = TRUE + stored.mob_transforming = TRUE if(source.convert_damage) var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth; var/damapply = damage_percent * shape.maxHealth; @@ -148,7 +148,7 @@ restoring = TRUE qdel(slink) stored.forceMove(get_turf(src)) - stored.notransform = FALSE + stored.mob_transforming = FALSE if(shape.mind) shape.mind.transfer_to(stored) if(death) diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index 94de75faac..2f3ed64655 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -76,20 +76,6 @@ break M.dropItemToGround(item_to_retrieve) - if(iscarbon(M)) //Edge case housekeeping - var/mob/living/carbon/C = M - if(C.stomach_contents && (item_to_retrieve in C.stomach_contents)) - C.stomach_contents -= item_to_retrieve - for(var/X in C.bodyparts) - var/obj/item/bodypart/part = X - if(item_to_retrieve in part.embedded_objects) - part.embedded_objects -= item_to_retrieve - to_chat(C, "The [item_to_retrieve] that was embedded in your [L] has mysteriously vanished. How fortunate!") - if(!C.has_embedded_objects()) - C.clear_alert("embeddedobject") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "embedded") - break - else if(istype(item_to_retrieve.loc, /obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery var/obj/machinery/portable_atmospherics/P = item_to_retrieve.loc diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index ace542126c..e9432e2f58 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -297,7 +297,7 @@ var/mob/living/M = AM M.DefaultCombatKnockdown(stun_amt, override_hardstun = stun_amt * 0.2) to_chat(M, "You're thrown back by [user]!") - AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. + AM.throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. safety-- /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 2aae17b0f3..6c21456e63 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -276,7 +276,7 @@ ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault") if(VAULT_SPEED) to_chat(H, "Your legs feel faster.") - H.add_movespeed_modifier(MOVESPEED_ID_DNA_VAULT, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + H.add_movespeed_modifier(/datum/movespeed_modifier/dna_vault_speedup) if(VAULT_QUICK) to_chat(H, "Your arms move as fast as lightning.") H.next_move_modifier = 0.5 diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm index 99902ff6d6..eb70a838a4 100644 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm @@ -32,13 +32,11 @@ name = "Grounded Nerves" desc = "Nerves form a safe path for electricity to traverse, protecting the body from electric shocks." mod_type = BIOWARE_NERVES - var/prev_coeff /datum/bioware/grounded_nerves/on_gain() ..() - prev_coeff = owner.physiology.siemens_coeff - owner.physiology.siemens_coeff = 0 + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "grounded_nerves") /datum/bioware/grounded_nerves/on_lose() ..() - owner.physiology.siemens_coeff = prev_coeff + REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "grounded_nerves") diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index a41e72b76d..4a52e446bc 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -1,6 +1,6 @@ /datum/surgery/advanced/lobotomy name = "Lobotomy" - desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." + desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, at the cost of severe, albeit repairable, brain damage." steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -41,13 +41,16 @@ target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - switch(rand(1,4))//Now let's see what hopefully-not-important part of the brain we cut off + switch(rand(1,6))//Now let's see what hopefully-not-important part of the brain we cut off if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) if(2) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_SURGERY) if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_SURGERY) + // you're cutting off a part of the brain.w + var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) + B.applyOrganDamage(50, 100) return TRUE /datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -59,11 +62,11 @@ B.applyOrganDamage(80) switch(rand(1,3)) if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY) if(2) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) + target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_LOBOTOMY) else user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.") return FALSE diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index e9f8ff4446..cf3a218d80 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -36,7 +36,7 @@ return FALSE if(istype(tool, /obj/item/melee/baton)) var/obj/item/melee/baton/B = tool - if(!B.status) + if(!B.turned_on) to_chat(user, "[B] needs to be active!") return FALSE if(istype(tool, /obj/item/gun/energy)) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 4b169173ed..09ac7a8cb2 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -164,8 +164,8 @@ return FALSE switch(animal_origin) - if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take double burn //nothing can burn with so much snowflake code around - burn *= 2 + if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around + burn *= 1.2 var/can_inflict = max_damage - get_damage() if(can_inflict <= 0) @@ -183,7 +183,7 @@ //We've dealt the physical damages, if there's room lets apply the stamina damage. var/current_damage = get_damage(TRUE) //This time around, count stamina loss too. var/available_damage = max_damage - current_damage - stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION) + stamina_dam += round(clamp(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION) if(disabled && stamina > 10) incoming_stam_mult = max(0.01, incoming_stam_mult/(stamina*0.1)) @@ -285,7 +285,7 @@ if(status == BODYPART_ORGANIC) icon = base_bp_icon || DEFAULT_BODYPART_ICON_ORGANIC else if(status == BODYPART_ROBOTIC) - icon = base_bp_icon || DEFAULT_BODYPART_ICON_ROBOTIC + icon = DEFAULT_BODYPART_ICON_ROBOTIC if(owner) owner.updatehealth() @@ -350,7 +350,8 @@ body_gender = H.dna.features["body_model"] should_draw_gender = S.sexes - if(MUTCOLORS in S.species_traits) + var/mut_colors = (MUTCOLORS in S.species_traits) + if(mut_colors) if(S.fixed_mut_color) species_color = S.fixed_mut_color else @@ -360,7 +361,7 @@ species_color = "" if(base_bp_icon != DEFAULT_BODYPART_ICON) - color_src = MUTCOLORS //TODO - Add color matrix support to base limbs + color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE) if(S.mutant_bodyparts["legs"]) if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG) @@ -436,7 +437,7 @@ if(!isnull(body_markings) && status == BODYPART_ORGANIC) if(!use_digitigrade) - if(BODY_ZONE_CHEST) + if(body_zone == BODY_ZONE_CHEST) . += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) else . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) @@ -544,13 +545,23 @@ return if(color_src) //TODO - add color matrix support for base species limbs - var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone)) + var/draw_color = mutation_color || species_color + var/grayscale = FALSE + if(!draw_color) + draw_color = SKINTONE2HEX(skin_tone) + grayscale = color_src == CUSTOM_SKINTONE //Cause human limbs have a very pale pink hue by def. + else + draw_color = "#[draw_color]" if(draw_color) - limb.color = "#[draw_color]" + if(grayscale) + limb.icon_state += "_g" + limb.color = draw_color if(aux_icons) for(var/a in aux) var/image/I = a - I.color = "#[draw_color]" + if(grayscale) + I.icon_state += "_g" + I.color = draw_color if(!isnull(aux_marking)) for(var/a in auxmarking) var/image/I = a diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 276d4893de..f654270df7 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -14,9 +14,8 @@ return FALSE if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) return FALSE - var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST) - affecting.receive_damage(CLAMP(brute_dam/2 * affecting.body_damage_coeff, 15, 50), CLAMP(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage + affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) @@ -44,6 +43,10 @@ throw_at(target_turf, throw_range, throw_speed) return TRUE +/obj/item/bodypart/head/dismember() + if(HAS_TRAIT(owner, TRAIT_NODECAP)) + return FALSE + ..() /obj/item/bodypart/chest/dismember() if(!owner) @@ -53,6 +56,8 @@ return FALSE if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) return FALSE + if(HAS_TRAIT(C, TRAIT_NOGUT)) //Just for not allowing gutting + return FALSE . = list() var/organ_spilled = 0 var/turf/T = get_turf(C) @@ -60,8 +65,7 @@ playsound(get_turf(C), 'sound/misc/splort.ogg', 80, 1) for(var/X in C.internal_organs) var/obj/item/organ/O = X - var/org_zone = check_zone(O.zone) - if(org_zone != BODY_ZONE_CHEST) + if(O.organ_flags & ORGAN_NO_DISMEMBERMENT || check_zone(O.zone) != BODY_ZONE_CHEST) continue O.Remove() O.forceMove(T) @@ -295,6 +299,7 @@ O.Insert(C) update_bodypart_damage_state() + update_disabled() C.updatehealth() C.update_body() @@ -302,7 +307,6 @@ C.update_damage_overlays() C.update_mobility() - /obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special) //Transfer some head appearance vars over if(brain) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index aaca33685b..29aca7166f 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -152,26 +152,24 @@ disabled += zone return disabled -//Remove all embedded objects from all limbs on the carbon mob +///Remove a specific embedded item from the carbon mob +/mob/living/carbon/proc/remove_embedded_object(obj/item/I) + SEND_SIGNAL(src, COMSIG_CARBON_EMBED_REMOVAL, I) + +///Remove all embedded objects from all limbs on the carbon mob /mob/living/carbon/proc/remove_all_embedded_objects() - var/turf/T = get_turf(src) - for(var/X in bodyparts) var/obj/item/bodypart/L = X for(var/obj/item/I in L.embedded_objects) - L.embedded_objects -= I - I.forceMove(T) - I.unembedded() + remove_embedded_object(I) - clear_alert("embeddedobject") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") - -/mob/living/carbon/proc/has_embedded_objects() - . = 0 +/mob/living/carbon/proc/has_embedded_objects(include_harmless=FALSE) for(var/X in bodyparts) var/obj/item/bodypart/L = X for(var/obj/item/I in L.embedded_objects) - return 1 + if(!include_harmless && I.isEmbedHarmless()) + continue + return TRUE //Helper for quickly creating a new limb - used by augment code in species.dm spec_attacked_by @@ -252,37 +250,6 @@ L.change_bodypart_status(BODYPART_ROBOTIC) . = L - -/proc/skintone2hex(skin_tone) - . = 0 - switch(skin_tone) - if("caucasian1") - . = "ffe0d1" - if("caucasian2") - . = "fcccb3" - if("caucasian3") - . = "e8b59b" - if("latino") - . = "d9ae96" - if("mediterranean") - . = "c79b8b" - if("asian1") - . = "ffdeb3" - if("asian2") - . = "e3ba84" - if("arab") - . = "c4915e" - if("indian") - . = "b87840" - if("african1") - . = "754523" - if("african2") - . = "471c18" - if("albino") - . = "fff4e6" - if("orange") - . = "ffc905" - /mob/living/carbon/proc/Digitigrade_Leg_Swap(swap_back) for(var/X in bodyparts) var/obj/item/bodypart/O = X diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index a3f8b883b4..39e660203e 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -19,7 +19,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_l_arm" status = BODYPART_ROBOTIC - + brute_reduction = 2 burn_reduction = 1 @@ -40,7 +40,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_r_arm" status = BODYPART_ROBOTIC - + brute_reduction = 2 burn_reduction = 1 @@ -61,7 +61,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_l_leg" status = BODYPART_ROBOTIC - + brute_reduction = 2 burn_reduction = 1 @@ -82,7 +82,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_r_leg" status = BODYPART_ROBOTIC - + brute_reduction = 2 burn_reduction = 1 @@ -102,7 +102,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_chest" status = BODYPART_ROBOTIC - + brute_reduction = 2 burn_reduction = 1 @@ -131,8 +131,7 @@ if(src.wired) to_chat(user, "You have already inserted wire!") return - var/obj/item/stack/cable_coil/coil = W - if (coil.use(1)) + if (W.use_tool(src, user, 0, 1)) src.wired = 1 to_chat(user, "You insert the wire.") else @@ -164,7 +163,7 @@ flags_1 = CONDUCT_1 icon_state = "borg_head" status = BODYPART_ROBOTIC - + brute_reduction = 5 burn_reduction = 4 diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 773048f838..7a92b39692 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -89,18 +89,23 @@ "You remove [I] from [M]'s [parse_zone(selected_zone)].") qdel(S) else if(S.can_cancel) - var/close_tool_type = /obj/item/cautery + var/required_tool_type = TOOL_CAUTERY var/obj/item/close_tool = user.get_inactive_held_item() var/is_robotic = S.requires_bodypart_type == BODYPART_ROBOTIC if(is_robotic) - close_tool_type = /obj/item/screwdriver - if(istype(close_tool, close_tool_type) || iscyborg(user)) - M.surgeries -= S - user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and removes [I].", \ - "You close [M]'s [parse_zone(selected_zone)] with [close_tool] and remove [I].") - qdel(S) - else + required_tool_type = TOOL_SCREWDRIVER + if(iscyborg(user)) + close_tool = locate(/obj/item/cautery) in user.held_items + if(!close_tool) + to_chat(user, "You need to equip a cautery in an inactive slot to stop [M]'s surgery!") + return + else if(!close_tool || close_tool.tool_behaviour != required_tool_type) to_chat(user, "You need to hold a [is_robotic ? "screwdriver" : "cautery"] in your inactive hand to stop [M]'s surgery!") + return + M.surgeries -= S + user.visible_message("[user] closes [M]'s [parse_zone(selected_zone)] with [close_tool] and removes [I].", \ + "You close [M]'s [parse_zone(selected_zone)] with [close_tool] and remove [I].") + qdel(S) /proc/get_location_modifier(mob/M) var/turf/T = get_turf(M) diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 63e828d3c9..5a0fd819f1 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -40,7 +40,7 @@ "[user] extracts [target]'s fat!") target.overeatduration = 0 //patient is unfatted var/removednutriment = target.nutrition - target.nutrition = NUTRITION_LEVEL_WELL_FED + target.set_nutrition(NUTRITION_LEVEL_WELL_FED) removednutriment -= 450 //whatever was removed goes into the meat var/mob/living/carbon/human/H = target var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 9da20e4921..c737e8bc30 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -12,12 +12,10 @@ var/inflamed /obj/item/organ/appendix/on_life() - ..() - if(!(organ_flags & ORGAN_FAILING)) + . = ..() + if(. || !owner) return - var/mob/living/carbon/M = owner - if(M) - M.adjustToxLoss(4, TRUE, TRUE) //forced to ensure people don't use it to gain tox as slime person + owner.adjustToxLoss(4, TRUE, TRUE) //forced to ensure people don't use it to gain tox as slime person /obj/item/organ/appendix/update_icon_state() if(inflamed) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index daf3324980..b7dfa3eb88 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -2,6 +2,7 @@ name = "arm-mounted implant" desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" zone = BODY_ZONE_R_ARM + organ_flags = ORGAN_SYNTHETIC icon_state = "implant-toolkit" w_class = WEIGHT_CLASS_NORMAL actions_types = list(/datum/action/item_action/organ_action/toggle) @@ -20,7 +21,28 @@ update_icon() SetSlotFromZone() - items_list = contents.Copy() + for(var/obj/item/I in contents) + add_item(I) + +/obj/item/organ/cyberimp/arm/proc/add_item(obj/item/I) + if(I in items_list) + return + I.forceMove(src) + items_list += I + // ayy only dropped signal for performance, we can't possibly have shitcode that doesn't call it when removing items from a mob, right? + // .. right??! + RegisterSignal(I, COMSIG_ITEM_DROPPED, .proc/magnetic_catch) + +/obj/item/organ/cyberimp/arm/proc/magnetic_catch(datum/source, mob/user) + . = COMPONENT_DROPPED_RELOCATION + var/obj/item/I = source //if someone is misusing the signal, just runtime + if(I in items_list) + if(I in contents) //already in us somehow? i probably shouldn't catch this so it's easier to spot bugs but eh.. + return + I.visible_message("[I] snaps back into [src]!") + I.forceMove(src) + if(I == holder) + holder = null /obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() switch(zone) @@ -62,7 +84,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(prob(15/severity) && owner) + if(owner) to_chat(owner, "[src] is hit by EMP!") // give the owner an idea about why his implant is glitching Retract() @@ -75,29 +97,20 @@ "[holder] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", "You hear a short mechanical noise.") - if(istype(holder, /obj/item/assembly/flash/armimplant)) - var/obj/item/assembly/flash/F = holder - F.set_light(0) - owner.transferItemToLoc(holder, src, TRUE) holder = null playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) -/obj/item/organ/cyberimp/arm/proc/Extend(var/obj/item/item) +/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/item) if(!(item in src)) return holder = item - ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF holder.slot_flags = null holder.set_custom_materials(null) - if(istype(holder, /obj/item/assembly/flash/armimplant)) - var/obj/item/assembly/flash/F = holder - F.set_light(7) - var/obj/item/arm_item = owner.get_active_held_item() if(arm_item) @@ -223,21 +236,6 @@ icon_state = "arm_taser" contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted) -/obj/item/organ/cyberimp/arm/gun/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) - Retract() - owner.visible_message("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!") - playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) - to_chat(owner, "You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!") - owner.adjust_fire_stacks(20) - owner.IgniteMob() - owner.adjustFireLoss(25) - crit_fail = 1 - organ_flags |= ORGAN_FAILING - /obj/item/organ/cyberimp/arm/flash name = "integrated high-intensity photon projector" //Why not desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." @@ -275,6 +273,12 @@ desc = "A deployable riot shield to help deal with civil unrest." contents = newlist(/obj/item/shield/riot/implant) +/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I) + if(I.obj_integrity == 0) //that's how the shield recharge works + to_chat(owner, "[I] is still too unstable to extend. Give it some time!") + return FALSE + return ..() + /obj/item/organ/cyberimp/arm/shield/emag_act() . = ..() if(obj_flags & EMAGGED) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 47a452cc76..fcc3f71b8b 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -16,13 +16,14 @@ slot = ORGAN_SLOT_STOMACH_AID /obj/item/organ/cyberimp/chest/nutriment/on_life() - if(synthesizing) + . = ..() + if(!. || synthesizing) return if(owner.nutrition <= hunger_threshold) synthesizing = TRUE to_chat(owner, "You feel less hungry...") - owner.nutrition += 50 + owner.adjust_nutrition(50) addtimer(CALLBACK(src, .proc/synth_cool), 50) /obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool() @@ -59,23 +60,25 @@ var/convalescence_time = 0 /obj/item/organ/cyberimp/chest/reviver/on_life() + . = ..() if(reviving) - var/do_heal = world.time < convalescence_time + var/do_heal = . && world.time < convalescence_time if(revive_cost >= MAX_HEAL_COOLDOWN) do_heal = FALSE - else if(owner.stat && owner.stat != DEAD) + else if(owner?.stat && owner.stat != DEAD) do_heal = TRUE else if(!do_heal) convalescence_time = world.time + DEF_CONVALESCENCE_TIME - if(do_heal) + if(. && (do_heal || world.time < convalescence_time)) addtimer(CALLBACK(src, .proc/heal), 3 SECONDS) else cooldown = revive_cost + world.time reviving = FALSE - to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].") + if(owner) + to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].") return - if(cooldown > world.time || owner.stat == CONSCIOUS || owner.stat == DEAD || owner.suiciding) + if(!. || cooldown > world.time || owner.stat == CONSCIOUS || owner.stat == DEAD || owner.suiciding) return revive_cost = 0 @@ -165,14 +168,14 @@ if(allow_thrust(0.01)) ion_trail.start() RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react) - owner.add_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK) + owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic) if(!silent) to_chat(owner, "You turn your thrusters set on.") else ion_trail.stop() if(!QDELETED(owner)) UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) - owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic) if(!silent) to_chat(owner, "You turn your thrusters set off.") on = FALSE diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index a678482ef3..6705b4c7b4 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -102,8 +102,8 @@ slot = ORGAN_SLOT_BRAIN_ANTISTUN /obj/item/organ/cyberimp/brain/anti_stun/on_life() - ..() - if(crit_fail || !(organ_flags & ORGAN_FAILING)) + . = ..() + if(!. || crit_fail) return owner.adjustStaminaLoss(-3.5, FALSE) //Citadel edit, makes it more useful in Stamina based combat owner.HealAllImmobilityUpTo(STUN_SET_AMOUNT) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 63febd1a9f..c1e33c7dac 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -29,22 +29,17 @@ var/damage_multiplier = 1 /obj/item/organ/ears/on_life() - if(!iscarbon(owner)) - return - ..() - var/mob/living/carbon/C = owner - if((damage < maxHealth) && (organ_flags & ORGAN_FAILING)) //ear damage can be repaired from the failing condition - organ_flags &= ~ORGAN_FAILING + . = ..() // genetic deafness prevents the body from using the ears, even if healthy - if(HAS_TRAIT(C, TRAIT_DEAF)) + if(owner && HAS_TRAIT(owner, TRAIT_DEAF)) deaf = max(deaf, 1) - else if(!(organ_flags & ORGAN_FAILING)) // if this organ is failing, do not clear deaf stacks. + else if(.) // if this organ is failing, do not clear deaf stacks. deaf = max(deaf - 1, 0) if(prob(damage / 20) && (damage > low_threshold)) adjustEarDamage(0, 4) - SEND_SOUND(C, sound('sound/weapons/flash_ring.ogg')) - to_chat(C, "The ringing in your ears grows louder, blocking out any external noises for a moment.") - else if((organ_flags & ORGAN_FAILING) && (deaf == 0)) + SEND_SOUND(owner, sound('sound/weapons/flash_ring.ogg')) + to_chat(owner, "The ringing in your ears grows louder, blocking out any external noises for a moment.") + else if(!. && !deaf) deaf = 1 //stop being not deaf you deaf idiot /obj/item/organ/ears/proc/restoreEars() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 6b93995e62..049fc5b5d4 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -1,3 +1,7 @@ +#define BLURRY_VISION_ONE 1 +#define BLURRY_VISION_TWO 2 +#define BLIND_VISION_THREE 3 + /obj/item/organ/eyes name = BODY_ZONE_PRECISE_EYES icon_state = "eyeballs" @@ -10,7 +14,7 @@ decay_factor = STANDARD_ORGAN_DECAY maxHealth = 0.5 * STANDARD_ORGAN_THRESHOLD //half the normal health max since we go blind at 30, a permanent blindness at 50 therefore makes sense unless medicine is administered high_threshold = 0.3 * STANDARD_ORGAN_THRESHOLD //threshold at 30 - low_threshold = 0.15 * STANDARD_ORGAN_THRESHOLD //threshold at 15 + low_threshold = 0.2 * STANDARD_ORGAN_THRESHOLD //threshold at 15 low_threshold_passed = "Distant objects become somewhat less tangible." high_threshold_passed = "Everything starts to look a lot less clear." @@ -27,14 +31,17 @@ var/flash_protect = 0 var/see_invisible = SEE_INVISIBLE_LIVING var/lighting_alpha - var/damaged = FALSE //damaged indicates that our eyes are undergoing some level of negative effect + var/eye_damaged = FALSE //indicates that our eyes are undergoing some level of negative effect /obj/item/organ/eyes/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE) . = ..() if(!.) return - if(damage == initial(damage)) - clear_eye_trauma() + switch(eye_damaged) + if(BLURRY_VISION_ONE, BLURRY_VISION_TWO) + owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + if(BLIND_VISION_THREE) + owner.become_blind(EYE_DAMAGE) if(ishuman(owner)) var/mob/living/carbon/human/H = owner old_eye_color = H.eye_color @@ -48,46 +55,49 @@ owner.update_sight() /obj/item/organ/eyes/Remove(special = FALSE) - clear_eye_trauma() . = ..() var/mob/living/carbon/C = . - if(!QDELETED(C)) - if(ishuman(C) && eye_color) - var/mob/living/carbon/human/H = C - H.eye_color = old_eye_color - if(!special) - H.dna.species.handle_body(H) + if(QDELETED(C)) + return + switch(eye_damaged) + if(BLURRY_VISION_ONE, BLURRY_VISION_TWO) + C.clear_fullscreen("eye_damage") + if(BLIND_VISION_THREE) + C.cure_blind(EYE_DAMAGE) + if(ishuman(C) && eye_color) + var/mob/living/carbon/human/H = C + H.eye_color = old_eye_color if(!special) - C.update_tint() - C.update_sight() + H.dna.species.handle_body(H) + if(!special) + C.update_tint() + C.update_sight() -/obj/item/organ/eyes/on_life() - ..() - var/mob/living/carbon/C = owner - //since we can repair fully damaged eyes, check if healing has occurred - if((organ_flags & ORGAN_FAILING) && (damage < maxHealth)) - organ_flags &= ~ORGAN_FAILING - C.cure_blind(EYE_DAMAGE) - //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities - if(damage > 20) - damaged = TRUE - if(organ_flags & ORGAN_FAILING) - C.become_blind(EYE_DAMAGE) - else if(damage > 30) - C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 2) + +/obj/item/organ/eyes/applyOrganDamage(d, maximum = maxHealth) + . = ..() + if(!.) + return + var/old_damaged = eye_damaged + switch(damage) + if(INFINITY to maxHealth) + eye_damaged = BLIND_VISION_THREE + if(maxHealth to high_threshold) + eye_damaged = BLURRY_VISION_TWO + if(high_threshold to low_threshold) + eye_damaged = BLURRY_VISION_ONE else - C.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) - //called once since we don't want to keep clearing the screen of eye damage for people who are below 20 damage - else if(damaged) - damaged = FALSE - C.clear_fullscreen("eye_damage") - return - -/obj/item/organ/eyes/proc/clear_eye_trauma() - var/mob/living/carbon/C = owner - C.clear_fullscreen("eye_damage") - C.cure_blind(EYE_DAMAGE) - damaged = FALSE + eye_damaged = FALSE + if(eye_damaged == old_damaged || !owner) + return + if(old_damaged == BLIND_VISION_THREE) + owner.cure_blind(EYE_DAMAGE) + else if(eye_damaged == BLIND_VISION_THREE) + owner.become_blind(EYE_DAMAGE) + if(eye_damaged && eye_damaged != BLIND_VISION_THREE) + owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + else + owner.clear_fullscreen("eye_damage") /obj/item/organ/eyes/night_vision name = "shadow eyes" @@ -259,7 +269,7 @@ if(!isnum(range)) return - set_distance(CLAMP(range, 0, max_light_beam_distance)) + set_distance(clamp(range, 0, max_light_beam_distance)) assume_rgb(C) /obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor) @@ -382,4 +392,8 @@ /obj/item/organ/eyes/ipc name = "ipc eyes" - icon_state = "cybernetic_eyeballs" \ No newline at end of file + icon_state = "cybernetic_eyeballs" + +#undef BLURRY_VISION_ONE +#undef BLURRY_VISION_TWO +#undef BLIND_VISION_THREE \ No newline at end of file diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index ea98ecd32b..465c10c4cd 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -15,6 +15,7 @@ // Heart attack code is in code/modules/mob/living/carbon/human/life.dm var/beating = 1 + var/no_pump = FALSE var/icon_base = "heart" attack_verb = list("beat", "thumped") var/beat = BEAT_NONE//is this mob having a heatbeat sound played? if so, which? @@ -66,27 +67,28 @@ return S /obj/item/organ/heart/on_life() - ..() + . = ..() + if(!owner || no_pump) + return if(owner.client && beating) failed = FALSE var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) var/sound/fastbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) - var/mob/living/carbon/H = owner - if(H.health <= H.crit_threshold && beat != BEAT_SLOW) + if(owner.health <= owner.crit_threshold && beat != BEAT_SLOW) beat = BEAT_SLOW - H.playsound_local(get_turf(H), slowbeat,40,0, channel = CHANNEL_HEARTBEAT) + owner.playsound_local(get_turf(owner), slowbeat,40,0, channel = CHANNEL_HEARTBEAT) to_chat(owner, "You feel your heart slow down...") - if(beat == BEAT_SLOW && H.health > H.crit_threshold) - H.stop_sound_channel(CHANNEL_HEARTBEAT) + if(beat == BEAT_SLOW && owner.health > owner.crit_threshold) + owner.stop_sound_channel(CHANNEL_HEARTBEAT) beat = BEAT_NONE - if(H.jitteriness) - if(H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW)) - H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT) + if(owner.jitteriness) + if(owner.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW)) + owner.playsound_local(get_turf(owner),fastbeat,40,0, channel = CHANNEL_HEARTBEAT) beat = BEAT_FAST else if(beat == BEAT_FAST) - H.stop_sound_channel(CHANNEL_HEARTBEAT) + owner.stop_sound_channel(CHANNEL_HEARTBEAT) beat = BEAT_NONE if(organ_flags & ORGAN_FAILING) //heart broke, stopped beating, death imminent @@ -107,6 +109,7 @@ obj/item/organ/heart/slime icon_state = "cursedheart-off" icon_base = "cursedheart" decay_factor = 0 + no_pump = TRUE actions_types = list(/datum/action/item_action/organ_action/cursed_heart) var/last_pump = 0 var/add_colour = TRUE //So we're not constantly recreating colour datums @@ -128,6 +131,9 @@ obj/item/organ/heart/slime return ..() /obj/item/organ/heart/cursed/on_life() + . = ..() + if(!owner) + return if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/H = owner @@ -208,12 +214,14 @@ obj/item/organ/heart/slime obj/item/organ/heart/cybernetic/upgraded/on_life() . = ..() + if(!.) + return if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid)) owner.reagents.add_reagent(rid, ramount) used_dose() if(ramount < 10) //eats your nutrition to regen epinephrine var/regen_amount = owner.nutrition/2000 - owner.nutrition -= regen_amount + owner.adjust_nutrition(-regen_amount) ramount += regen_amount /obj/item/organ/heart/cybernetic/upgraded/proc/used_dose() @@ -233,7 +241,7 @@ obj/item/organ/heart/cybernetic/upgraded/on_life() /obj/item/organ/heart/freedom/on_life() . = ..() - if(owner.health < 5 && world.time > min_next_adrenaline) + if(. && owner.health < 5 && world.time > min_next_adrenaline) min_next_adrenaline = world.time + rand(250, 600) //anywhere from 4.5 to 10 minutes to_chat(owner, "You feel yourself dying, but you refuse to give up!") owner.heal_overall_damage(15, 15) diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 73225fc41c..b24034ca4a 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -1,7 +1,6 @@ #define LIVER_DEFAULT_HEALTH 100 //amount of damage required for liver failure #define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out #define LIVER_DEFAULT_TOX_LETHALITY 0.01 //lower values lower how harmful toxins are to the liver -#define LIVER_SWELLING_MOVE_MODIFY "pharma" /obj/item/organ/liver name = "liver" @@ -15,73 +14,71 @@ healing_factor = STANDARD_ORGAN_HEALING decay_factor = STANDARD_ORGAN_DECAY + high_threshold_passed = "You feel a stange ache in your abdomen, almost like a stitch. This pain is encumbering your movements." + high_threshold_cleared = "The stitching ache in your abdomen passes away, unencumbering your movements." + now_fixed = "The stabbing pain in your abdomen slowly calms down into a more tolerable ache." + var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol - var/failing //is this liver failing? var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE//maximum amount of toxins the liver can just shrug off var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver var/filterToxins = TRUE //whether to filter toxins - var/swelling = 0 var/cachedmoveCalc = 1 /obj/item/organ/liver/on_life() - var/mob/living/carbon/C = owner + . = ..() + if(!. || !owner)//can't process reagents with a failing liver + return - if(istype(C)) - if(!(organ_flags & ORGAN_FAILING))//can't process reagents with a failing liver - //slowly heal liver damage - damage = max(0, damage - 0.1) + if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) + //handle liver toxin filtration + for(var/datum/reagent/toxin/T in owner.reagents.reagent_list) + var/thisamount = owner.reagents.get_reagent_amount(T.type) + if (thisamount && thisamount <= toxTolerance) + owner.reagents.remove_reagent(T.type, 1) + else + damage += (thisamount*toxLethality) - if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) - //handle liver toxin filtration - for(var/datum/reagent/toxin/T in C.reagents.reagent_list) - var/thisamount = C.reagents.get_reagent_amount(T.type) - if (thisamount && thisamount <= toxTolerance) - C.reagents.remove_reagent(T.type, 1) - else - damage += (thisamount*toxLethality) + //metabolize reagents + owner.reagents.metabolize(owner, can_overdose=TRUE) - //metabolize reagents - C.reagents.metabolize(C, can_overdose=TRUE) - - if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability - to_chat(C, "You feel a dull pain in your abdomen.") - - if(damage > maxHealth)//cap liver damage - damage = maxHealth - - if(swelling >= 10) - pharmacokinesis() + if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability + to_chat(owner, "You feel a dull pain in your abdomen.") /obj/item/organ/liver/prepare_eat() var/obj/S = ..() S.reagents.add_reagent(/datum/reagent/iron, 5) return S -//Just in case +/obj/item/organ/liver/applyOrganDamage(d, maximum = maxHealth) + . = ..() + if(!. || QDELETED(owner)) + return + if(damage >= high_threshold) + var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3)) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc) + sizeMoveMod(move_calc, owner) + else + owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis) + sizeMoveMod(1, owner) + +/obj/item/organ/liver/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(. && damage >= high_threshold) + var/move_calc = 1+((round(damage) - high_threshold)/(high_threshold/3)) + M.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis, multiplicative_slowdown = move_calc) + sizeMoveMod(move_calc, owner) + /obj/item/organ/liver/Remove(special = FALSE) if(!QDELETED(owner)) - owner.remove_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY) - owner.ResetBloodVol() //At the moment, this shouldn't allow application twice. You either have this OR a thirsty ferret. + owner.remove_movespeed_modifier(/datum/movespeed_modifier/liver_cirrhosis) sizeMoveMod(1, owner) return ..() -//Applies some of the effects to the patient. -/obj/item/organ/liver/proc/pharmacokinesis() - var/moveCalc = 1+((round(swelling) - 9)/3) - if(moveCalc == cachedmoveCalc)//reduce calculations - return - if(prob(5)) - to_chat(owner, "You feel a stange ache in your side, almost like a stitch. This pain is affecting your movements and making you feel lightheaded.") - var/mob/living/carbon/human/H = owner - H.add_movespeed_modifier(LIVER_SWELLING_MOVE_MODIFY, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) - H.AdjustBloodVol(moveCalc/3) - sizeMoveMod(moveCalc, H) - -/obj/item/organ/liver/proc/sizeMoveMod(var/value, mob/living/carbon/human/H) +/obj/item/organ/liver/proc/sizeMoveMod(value, mob/living/carbon/C) if(cachedmoveCalc == value) return - H.next_move_modifier /= cachedmoveCalc - H.next_move_modifier *= value + C.next_move_modifier /= cachedmoveCalc + C.next_move_modifier *= value cachedmoveCalc = value /obj/item/organ/liver/fly diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index ac2b34b855..b3020ae13f 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -146,7 +146,7 @@ if(safe_oxygen_max) if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check. var/ratio = (breath_gases[/datum/gas/oxygen]/safe_oxygen_max) * 10 - H.apply_damage_type(CLAMP(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) else if((O2_pp > safe_oxygen_max) && !(safe_oxygen_max == 0)) //Why yes, this is like too much CO2 and spahget. Dirty lizards. @@ -188,7 +188,7 @@ if(safe_nitro_max) if(N2_pp > safe_nitro_max) var/ratio = (breath_gases[/datum/gas/nitrogen]/safe_nitro_max) * 10 - H.apply_damage_type(CLAMP(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) H.losebreath += 2 else @@ -255,7 +255,7 @@ if(safe_toxins_max) if(Toxins_pp > safe_toxins_max) var/ratio = (breath_gases[/datum/gas/plasma]/safe_toxins_max) * 10 - H.apply_damage_type(CLAMP(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) + H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else H.clear_alert("too_much_tox") @@ -446,17 +446,17 @@ if(prob(20)) to_chat(H, "You feel [hot_message] in your [name]!") - -/obj/item/organ/lungs/on_life() - ..() - if((!failed) && ((organ_flags & ORGAN_FAILING))) - if(owner.stat == CONSCIOUS) +/obj/item/organ/lungs/applyOrganDamage(d, maximum = maxHealth) + . = ..() + if(!.) + return + if(!failed && organ_flags & ORGAN_FAILING) + if(owner && owner.stat == CONSCIOUS) owner.visible_message("[owner] grabs [owner.p_their()] throat, struggling for breath!", \ "You suddenly feel like you can't breathe!") failed = TRUE else if(!(organ_flags & ORGAN_FAILING)) failed = FALSE - return /obj/item/organ/lungs/prepare_eat() var/obj/S = ..() @@ -547,5 +547,6 @@ color = "#68e83a" /obj/item/organ/lungs/yamerol/on_life() - ..() - damage += 2 //Yamerol lungs are temporary \ No newline at end of file + . = ..() + if(.) + applyOrganDamage(2) //Yamerol lungs are temporary diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index b091af0f92..761ebc17a2 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,7 +8,7 @@ var/zone = BODY_ZONE_CHEST var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! - var/organ_flags = 0 + var/organ_flags = NONE var/maxHealth = STANDARD_ORGAN_THRESHOLD var/damage = 0 //total damage this organ has sustained ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick @@ -108,7 +108,7 @@ var/datum/gas_mixture/enviro = T.return_air() local_temp = enviro.temperature - else if(istype(loc, /mob/) && !owner) + else if(!owner && ismob(loc)) var/mob/M = loc if(is_type_in_typecache(M.loc, GLOB.freezing_objects)) if(!(organ_flags & ORGAN_FROZEN)) @@ -134,17 +134,17 @@ organ_flags &= ~ORGAN_FROZEN return FALSE -/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing - if(organ_flags & ORGAN_FAILING) - return - if(is_cold()) - return - ///Damage decrements by a percent of its maxhealth - var/healing_amount = -(maxHealth * healing_factor) - ///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health - healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0 - applyOrganDamage(healing_amount) //to FERMI_TWEAK - //Make it so each threshold is stuck. +/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic + if(organ_flags & ORGAN_FAILING || !owner) + return FALSE + if(!is_cold() && damage) + ///Damage decrements by a percent of its maxhealth + var/healing_amount = -(maxHealth * healing_factor) + ///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's satiety + healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0 + if(healing_amount) + applyOrganDamage(healing_amount) //to FERMI_TWEAK + return TRUE /obj/item/organ/examine(mob/user) . = ..() @@ -204,15 +204,14 @@ ///Adjusts an organ's damage by the amount "d", up to a maximum amount, which is by default max damage /obj/item/organ/proc/applyOrganDamage(var/d, var/maximum = maxHealth) //use for damaging effects - if(!d) //Micro-optimization. - return - if(maximum < damage) - return - damage = CLAMP(damage + d, 0, maximum) - var/mess = check_damage_thresholds(owner) + if(!d || maximum < damage) //Micro-optimization. + return FALSE + damage = clamp(damage + d, 0, maximum) + var/mess = check_damage_thresholds() prev_damage = damage if(mess && owner) to_chat(owner, mess) + return TRUE ///SETS an organ's damage to the amount "d", and in doing so clears or sets the failing flag, good for when you have an effect that should fix an organ if broken /obj/item/organ/proc/setOrganDamage(var/d) //use mostly for admin heals @@ -224,7 +223,7 @@ * description: By checking our current damage against our previous damage, we can decide whether we've passed an organ threshold. * If we have, send the corresponding threshold message to the owner, if such a message exists. */ -/obj/item/organ/proc/check_damage_thresholds(var/M) +/obj/item/organ/proc/check_damage_thresholds() if(damage == prev_damage) return var/delta = damage - prev_damage diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 3b383581cf..d9cbf9be03 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -17,33 +17,24 @@ low_threshold_cleared = "The last bouts of pain in your stomach have died out." /obj/item/organ/stomach/on_life() - ..() - var/datum/reagent/consumable/nutriment/Nutri + . = ..() + if(!owner) + return if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(!(organ_flags & ORGAN_FAILING)) + if(.) H.dna.species.handle_digestion(H) handle_disgust(H) - Nutri = locate(/datum/reagent/consumable/nutriment) in H.reagents.reagent_list - if(Nutri) - if(prob((damage/40) * Nutri.volume * Nutri.volume)) - H.vomit(damage) - to_chat(H, "Your stomach reels in pain as you're incapable of holding down all that food!") - - else if(Nutri && damage > high_threshold) - if(prob((damage/10) * Nutri.volume * Nutri.volume)) - H.vomit(damage) - to_chat(H, "Your stomach reels in pain as you're incapable of holding down all that food!") - - - else if(iscarbon(owner)) - var/mob/living/carbon/C = owner - Nutri = locate(/datum/reagent/consumable/nutriment) in C.reagents.reagent_list - - if(damage < low_threshold) + if(!damage) return - + var/datum/reagent/consumable/nutriment/Nutri = locate(/datum/reagent/consumable/nutriment) in owner.reagents.reagent_list + if(!Nutri) + return + var/prob_divisor = damage > high_threshold ? 10 : 40 + if(prob((damage/prob_divisor) * (Nutri.volume**2))) + owner.vomit(damage) + to_chat(owner, "Your stomach reels in pain as you're incapable of holding down all that food!") /obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/H) if(H.disgust) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index bcc764d00a..f8547dda6e 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -64,8 +64,8 @@ owner.RegisterSignal(owner, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech) return ..() -/obj/item/organ/tongue/could_speak_in_language(datum/language/dt) - return is_type_in_typecache(dt, languages_possible) +/obj/item/organ/tongue/could_speak_language(language) + return is_type_in_typecache(language, languages_possible) /obj/item/organ/tongue/lizard name = "forked tongue" @@ -141,7 +141,7 @@ /obj/item/organ/tongue/abductor/handle_speech(datum/source, list/speech_args) //Hacks var/message = speech_args[SPEECH_MESSAGE] - var/mob/living/carbon/human/user = usr + var/mob/living/carbon/human/user = source var/rendered = "[user.name]: [message]" user.log_talk(message, LOG_SAY, tag="abductor") for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) @@ -260,7 +260,7 @@ maxHealth = 100 //RoboTongue! var/electronics_magic = TRUE -/obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt) +/obj/item/organ/tongue/robot/could_speak_language(language) return ..() || electronics_magic /obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 7c849dbd68..65e53df26f 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -74,7 +74,7 @@ ..() cords = target -/datum/action/item_action/organ_action/colossus/IsAvailable() +/datum/action/item_action/organ_action/colossus/IsAvailable(silent = FALSE) if(world.time < cords.next_command) return FALSE if(!owner) @@ -632,7 +632,7 @@ ..() cords = target -/datum/action/item_action/organ_action/velvet/IsAvailable() +/datum/action/item_action/organ_action/velvet/IsAvailable(silent = FALSE) return TRUE /datum/action/item_action/organ_action/velvet/Trigger() @@ -1254,12 +1254,12 @@ if (trigger2 == "speak" || trigger2 == "echo") var/trigger3 = html_decode(stripped_input(user, "Enter the phrase spoken. Abusing this to self antag is bannable.", MAX_MESSAGE_LEN)) E.customTriggers[trigger] = list(trigger2, trigger3) - log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") + log_reagent("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2], to send [trigger3].") if(findtext(trigger3, "admin")) message_admins("FERMICHEM: [user] maybe be trying to abuse MKUltra by implanting by [H] with [trigger], triggering [trigger2], to send [trigger3].") else E.customTriggers[trigger] = trigger2 - log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") + log_reagent("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 5 addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) to_chat(user, "You sucessfully set the trigger word [trigger] in [H]") @@ -1322,7 +1322,7 @@ objective = replacetext(lowertext(objective), "strangle", "meow at") objective = replacetext(lowertext(objective), "suicide", "self-love") message_admins("[H] has been implanted by [user] with the objective [objective].") - log_game("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.") + log_reagent("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.") addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 @@ -1341,7 +1341,7 @@ var/instill = stripped_input(user, "Instill an emotion in [H].", MAX_MESSAGE_LEN) to_chat(H, "[instill]") to_chat(user, "You sucessfully instill a feeling in [H]") - log_game("FERMICHEM: [H] has been instilled by [user] with [instill] via MKUltra.") + log_reagent("FERMICHEM: [H] has been instilled by [user] with [instill] via MKUltra.") E.cooldown += 1 //RECOGNISE @@ -1455,7 +1455,7 @@ if(message_admins || debug)//Do you want this in? message_admins("[ADMIN_LOOKUPFLW(user)] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") - log_game("FERMICHEM: [key_name(user)] ckey: [user.key] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + log_reagent("FERMICHEM: [key_name(user)] ckey: [user.key] has said '[log_message]' with a Velvet Voice, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have spoken with a velvet voice") //SSblackbox.record_feedback("tally", "Velvet_voice", 1, log_message) If this is on, it fills the thing up and OOFs the server diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index ce9de95b4c..c4e056583c 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -40,7 +40,6 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target H.sec_hud_set_ID() - return 1 return TRUE /datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 7d7cd2df63..f974c39bb4 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -23,12 +23,7 @@ var/objects = 0 for(var/obj/item/I in L.embedded_objects) objects++ - I.forceMove(get_turf(H)) - L.embedded_objects -= I - I.unembedded() - if(!H.has_embedded_objects()) - H.clear_alert("embeddedobject") - SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded") + H.remove_embedded_object(I) if(objects > 0) display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].", diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 1857f8db48..e287b38ca1 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -57,8 +57,11 @@ surgery.step_in_progress = FALSE return FALSE if(tool) - speed_mod = tool.toolspeed - if(do_after(user, time * speed_mod, target = target)) + speed_mod = tool.toolspeed //faster tools mean faster surgeries, but also less experience. + if(user.mind) + speed_mod = user.mind.action_skill_mod(/datum/skill/numerical/surgery, speed_mod, THRESHOLD_UNTRAINED, FALSE) + var/delay = time * speed_mod + if(do_after(user, delay, target = target)) var/prob_chance = 100 if(implement_type) //this means it isn't a require hand or any item step. prob_chance = implements[implement_type] @@ -66,6 +69,10 @@ if((prob(prob_chance) || (iscyborg(user) && !silicons_obey_prob)) && chem_check(target) && !try_to_fail) if(success(user, target, target_zone, tool, surgery)) + var/multi = (delay/SKILL_GAIN_DELAY_DIVISOR) + if(repeatable) + multi *= 0.5 //Spammable surgeries award less experience. + user.mind?.auto_gain_experience(/datum/skill/numerical/surgery, SKILL_GAIN_SURGERY_PER_STEP * multi) advance = TRUE else if(failure(user, target, target_zone, tool, surgery)) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 287d9492fb..584a0a189a 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -66,7 +66,6 @@ toolspeed = 0.5 attack_verb = list("attacked", "pinched") - /obj/item/cautery name = "cautery" desc = "This stops bleeding." @@ -91,7 +90,6 @@ toolspeed = 0.5 attack_verb = list("burnt") - /obj/item/surgicaldrill name = "surgical drill" desc = "You can drill using this item. You dig?" @@ -148,7 +146,6 @@ toolspeed = 0.5 attack_verb = list("drilled") - /obj/item/scalpel name = "scalpel" desc = "Cut, cut, and once more cut." @@ -229,7 +226,6 @@ user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat", "stomach")] with [src]! It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS) - /obj/item/circular_saw name = "circular saw" desc = "For heavy duty cutting." diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE new file mode 100644 index 0000000000..221f9e1deb --- /dev/null +++ b/code/modules/tgs/LICENSE @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2017 Jordan Brown + +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. diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md new file mode 100644 index 0000000000..445cee41f5 --- /dev/null +++ b/code/modules/tgs/README.md @@ -0,0 +1,13 @@ +# DMAPI Internals + +This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. + +- [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest. +- The [core](./core) folder includes all code not directly part of any API version. +- The other versioned folders contain code for the different DMAPI versions. + - [v3210](./v3210) contains the final TGS3 API. + - [v4](./v4) is the legacy DMAPI 4 (Used in TGS 4.0.X versions). + - [v5](./v5) is the current DMAPI version used by TGS4 >=4.1. +- [LICENSE](./LICENSE) is the MIT license for the DMAPI. + +APIs communicate with TGS in two ways. All versions implement TGS -> DM communication using /world/Topic. DM -> TGS communication, called the bridge method, is different for each version. diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md new file mode 100644 index 0000000000..aa3c7a9c9d --- /dev/null +++ b/code/modules/tgs/core/README.md @@ -0,0 +1,8 @@ +# Core DMAPI functions + +This folder contains all DMAPI code not directly involved in an API. + +- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals. +- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code. +- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement. +- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition \ No newline at end of file diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 70252cfb49..f75e7837af 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -1,11 +1,17 @@ /world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) var/current_api = TGS_READ_GLOBAL(tgs) if(current_api) - TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])! Was TgsNew() called more than once?") + TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?") + return + + if(!(minimum_required_security_level in list(TGS_SECURITY_ULTRASAFE, TGS_SECURITY_SAFE, TGS_SECURITY_TRUSTED))) + TGS_ERROR_LOG("Invalid minimum_required_security_level: [minimum_required_security_level]!") return #ifdef TGS_V3_API - minimum_required_security_level = TGS_SECURITY_TRUSTED + if(minimum_required_security_level != TGS_SECURITY_TRUSTED) + TGS_WARNING_LOG("V3 DMAPI requires trusted security!") + minimum_required_security_level = TGS_SECURITY_TRUSTED #endif var/raw_parameter = world.params[TGS_VERSION_PARAMETER] if(!raw_parameter) @@ -13,7 +19,7 @@ var/datum/tgs_version/version = new(raw_parameter) if(!version.Valid(FALSE)) - TGS_ERROR_LOG("Failed to validate TGS version parameter: [raw_parameter]!") + TGS_ERROR_LOG("Failed to validate DMAPI version parameter: [raw_parameter]!") return var/api_datum @@ -21,18 +27,21 @@ if(3) #ifndef TGS_V3_API TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!") + return #else - switch(version.major) + switch(version.minor) if(2) api_datum = /datum/tgs_api/v3210 #endif if(4) - switch(version.major) + switch(version.minor) if(0) api_datum = /datum/tgs_api/v4 + if(5) + api_datum = /datum/tgs_api/v5 var/datum/tgs_version/max_api_version = TgsMaximumAPIVersion(); - if(version.suite != null && version.major != null && version.minor != null && version.patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter) + if(version.suite != null && version.minor != null && version.patch != null && version.deprecated_patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter) TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") api_datum = /datum/tgs_api/latest @@ -41,20 +50,25 @@ return TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]") - var/datum/tgs_api/new_api = new api_datum(version) + + if(event_handler && !istype(event_handler)) + TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]") + event_handler = null + + var/datum/tgs_api/new_api = new api_datum(event_handler, version) TGS_WRITE_GLOBAL(tgs, new_api) - var/result = new_api.OnWorldNew(event_handler, minimum_required_security_level) + var/result = new_api.OnWorldNew(minimum_required_security_level) if(!result || result == TGS_UNIMPLEMENTED) TGS_WRITE_GLOBAL(tgs, null) TGS_ERROR_LOG("Failed to activate API!") /world/TgsMaximumAPIVersion() - return new /datum/tgs_version("4.0.x.x") + return new /datum/tgs_version("5.x.x") /world/TgsMinimumAPIVersion() - return new /datum/tgs_version("3.2.0.0") + return new /datum/tgs_version("3.2.x") /world/TgsInitializationComplete() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) @@ -88,6 +102,11 @@ if(api) return api.version +/world/TgsApiVersion() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.ApiVersion() + /world/TgsInstanceName() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) @@ -135,30 +154,3 @@ var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) api.SecurityLevel() - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index fb2508059a..ef6d3a4fe5 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -2,13 +2,15 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) /datum/tgs_api var/datum/tgs_version/version + var/datum/tgs_event_handler/event_handler -/datum/tgs_api/New(datum/tgs_version/version) +/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) . = ..() + src.event_handler = event_handler src.version = version /datum/tgs_api/latest - parent_type = /datum/tgs_api/v4 + parent_type = /datum/tgs_api/v5 TGS_PROTECT_DATUM(/datum/tgs_api) @@ -53,30 +55,3 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm index b97745611f..a5dae1241a 100644 --- a/code/modules/tgs/core/tgs_version.dm +++ b/code/modules/tgs/core/tgs_version.dm @@ -5,11 +5,11 @@ suite = text2num(version_bits[1]) if(version_bits.len > 1) - major = text2num(version_bits[2]) + minor = text2num(version_bits[2]) if(version_bits.len > 2) - minor = text2num(version_bits[3]) + patch = text2num(version_bits[3]) if(version_bits.len == 4) - patch = text2num(version_bits[4]) + deprecated_patch = text2num(version_bits[4]) /datum/tgs_version/proc/Valid(allow_wildcards = FALSE) if(suite == null) @@ -19,4 +19,10 @@ return !Wildcard() /datum/tgs_version/Wildcard() - return major == null || minor == null || patch == null + return minor == null || patch == null + +/datum/tgs_version/Equals(datum/tgs_version/other_version) + if(!istype(other_version)) + return FALSE + + return suite == other_version.suite && minor == other_version.minor && patch == other_version.patch && deprecated_patch == other_version.deprecated_patch diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index 247f1fda5d..c803cf7ac2 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -2,9 +2,16 @@ #include "core\core.dm" #include "core\datum.dm" #include "core\tgs_version.dm" + #ifdef TGS_V3_API #include "v3210\api.dm" #include "v3210\commands.dm" #endif + #include "v4\api.dm" #include "v4\commands.dm" + +#include "v5\_defines.dm" +#include "v5\api.dm" +#include "v5\commands.dm" +#include "v5\undef.dm" diff --git a/code/modules/tgs/v3210/README.md b/code/modules/tgs/v3210/README.md new file mode 100644 index 0000000000..f96e7cf3b3 --- /dev/null +++ b/code/modules/tgs/v3210/README.md @@ -0,0 +1,6 @@ +# DMAPI V3 + +This DMAPI implements bridge using file output which TGS monitors for. + +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index c536995b04..e0d00ad15d 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -39,7 +39,7 @@ var/warned_custom_commands = FALSE /datum/tgs_api/v3210/ApiVersion() - return "3.2.1.0" + return new /datum/tgs_version("3.2.1.0") /datum/tgs_api/v3210/proc/trim_left(text) for (var/i = 1 to length(text)) @@ -56,7 +56,7 @@ /datum/tgs_api/v3210/proc/file2list(filename) return splittext(trim_left(trim_right(file2text(filename))), "\n") -/datum/tgs_api/v3210/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level) //don't use event handling in this version +/datum/tgs_api/v3210/OnWorldNew(minimum_required_security_level) . = FALSE comms_key = world.params[SERVICE_WORLD_PARAM] @@ -76,7 +76,8 @@ TGS_ERROR_LOG("This API version is only supported on Windows. Not running on Windows. Aborting initialization!") return ListServiceCustomCommands(TRUE) - ExportService("[SERVICE_REQUEST_API_VERSION] [ApiVersion()]", TRUE) + var/datum/tgs_version/api_version = ApiVersion() + ExportService("[SERVICE_REQUEST_API_VERSION] [api_version.deprefixed_parameter]", TRUE) return TRUE //nothing to do for v3 @@ -166,7 +167,8 @@ /datum/tgs_api/v3210/Revision() if(!warned_revison) - TGS_ERROR_LOG("Use of TgsRevision on [ApiVersion()] origin_commit only points to master!") + var/datum/tgs_version/api_version = ApiVersion() + TGS_ERROR_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") warned_revison = TRUE var/datum/tgs_revision_information/ri = new ri.commit = commit @@ -224,30 +226,3 @@ #undef SERVICE_REQUEST_API_VERSION #undef SERVICE_RETURN_SUCCESS - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index e5bc6f4895..a1949da444 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -44,35 +44,3 @@ user.friendly_name = sender user.mention = sender return stc.Run(user, params) || TRUE - -/* - -#undef SERVICE_JSON_PARAM_HELPTEXT -#undef SERVICE_JSON_PARAM_ADMINONLY -#undef SERVICE_JSON_PARAM_REQUIREDPARAMETERS - -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/v4/README.md b/code/modules/tgs/v4/README.md new file mode 100644 index 0000000000..78191447b2 --- /dev/null +++ b/code/modules/tgs/v4/README.md @@ -0,0 +1,6 @@ +# DMAPI V4 + +This DMAPI implements bridge requests using file output which TGS monitors for. It has a safe mode restriction. + +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index b61cddbeba..1dc98f811e 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -43,15 +43,17 @@ var/list/cached_test_merges var/datum/tgs_revision_information/cached_revision - var/datum/tgs_event_handler/event_handler - var/export_lock = FALSE var/list/last_interop_response /datum/tgs_api/v4/ApiVersion() - return "4.0.0.0" + return new /datum/tgs_version("4.0.0.0") + +/datum/tgs_api/v4/OnWorldNew(minimum_required_security_level) + if(minimum_required_security_level == TGS_SECURITY_ULTRASAFE) + TGS_WARNING_LOG("V4 DMAPI requires safe security!") + minimum_required_security_level = TGS_SECURITY_SAFE -/datum/tgs_api/v4/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level) json_path = world.params[TGS4_PARAM_INFO_JSON] if(!json_path) TGS_ERROR_LOG("Missing [TGS4_PARAM_INFO_JSON] world parameter!") @@ -76,7 +78,6 @@ security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] chat_commands_json_path = cached_json["chatCommandsJson"] - src.event_handler = event_handler instance_name = cached_json["instanceName"] ListCustomCommands() @@ -313,30 +314,3 @@ /datum/tgs_api/v4/SecurityLevel() return security_level - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index af21a86fb6..4ca1500167 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -39,31 +39,3 @@ result = "" return result return "Unknown command: [command]!" - -/* - -The MIT License - -Copyright (c) 2017 Jordan Brown - -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. -*/ diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm new file mode 100644 index 0000000000..8fd84e19fa --- /dev/null +++ b/code/modules/tgs/v5/_defines.dm @@ -0,0 +1,98 @@ +#define DMAPI5_PARAM_SERVER_PORT "tgs_port" +#define DMAPI5_PARAM_ACCESS_IDENTIFIER "tgs_key" + +#define DMAPI5_BRIDGE_DATA "data" +#define DMAPI5_TOPIC_DATA "tgs_data" + +#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0 +#define DMAPI5_BRIDGE_COMMAND_STARTUP 1 +#define DMAPI5_BRIDGE_COMMAND_PRIME 2 +#define DMAPI5_BRIDGE_COMMAND_REBOOT 3 +#define DMAPI5_BRIDGE_COMMAND_KILL 4 +#define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 + +#define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" +#define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" + +#define DMAPI5_RESPONSE_ERROR_MESSAGE "errorMessage" + +#define DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE "commandType" +#define DMAPI5_BRIDGE_PARAMETER_CURRENT_PORT "currentPort" +#define DMAPI5_BRIDGE_PARAMETER_VERSION "version" +#define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" +#define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" + +#define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" +#define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" + +#define DMAPI5_CHAT_MESSAGE_TEXT "text" +#define DMAPI5_CHAT_MESSAGE_CHANNEL_IDS "channelIds" + +#define DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER "accessIdentifier" +#define DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION "serverVersion" +#define DMAPI5_RUNTIME_INFORMATION_SERVER_PORT "serverPort" +#define DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY "apiValidateOnly" +#define DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME "instanceName" +#define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" +#define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" +#define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" + +#define DMAPI5_CHAT_UPDATE_CHANNELS "channels" + +#define DMAPI5_TEST_MERGE_TIME_MERGED "timeMerged" +#define DMAPI5_TEST_MERGE_REVISION "revision" +#define DMAPI5_TEST_MERGE_TITLE_AT_MERGE "titleAtMerge" +#define DMAPI5_TEST_MERGE_BODY_AT_MERGE "bodyAtMerge" +#define DMAPI5_TEST_MERGE_URL "url" +#define DMAPI5_TEST_MERGE_AUTHOR "author" +#define DMAPI5_TEST_MERGE_NUMBER "number" +#define DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION "pullRequestRevision" +#define DMAPI5_TEST_MERGE_COMMENT "comment" + +#define DMAPI5_CHAT_COMMAND_NAME "name" +#define DMAPI5_CHAT_COMMAND_PARAMS "params" +#define DMAPI5_CHAT_COMMAND_USER "user" + +#define DMAPI5_EVENT_NOTIFICATION_TYPE "type" +#define DMAPI5_EVENT_NOTIFICATION_PARAMETERS "parameters" + +#define DMAPI5_TOPIC_COMMAND_CHAT_COMMAND 0 +#define DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION 1 +#define DMAPI5_TOPIC_COMMAND_CHANGE_PORT 2 +#define DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE 3 +#define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4 +#define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 5 +#define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 6 +#define DMAPI5_TOPIC_COMMAND_HEARTBEAT 7 +#define DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH 8 + +#define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" +#define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" +#define DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION "eventNotification" +#define DMAPI5_TOPIC_PARAMETER_NEW_PORT "newPort" +#define DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE "newRebootState" +#define DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME "newInstanceName" +#define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate" +#define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" + +#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" +#define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" + +#define DMAPI5_REVISION_INFORMATION_COMMIT_SHA "commitSha" +#define DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA "originCommitSha" + +#define DMAPI5_CHAT_USER_ID "id" +#define DMAPI5_CHAT_USER_FRIENDLY_NAME "friendlyName" +#define DMAPI5_CHAT_USER_MENTION "mention" +#define DMAPI5_CHAT_USER_CHANNEL "channel" + +#define DMAPI5_CHAT_CHANNEL_ID "id" +#define DMAPI5_CHAT_CHANNEL_FRIENDLY_NAME "friendlyName" +#define DMAPI5_CHAT_CHANNEL_CONNECTION_NAME "connectionName" +#define DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL "isAdminChannel" +#define DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL "isPrivateChannel" +#define DMAPI5_CHAT_CHANNEL_TAG "tag" + +#define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" +#define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" +#define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm new file mode 100644 index 0000000000..8ca85faf05 --- /dev/null +++ b/code/modules/tgs/v5/api.dm @@ -0,0 +1,355 @@ +/datum/tgs_api/v5 + var/server_port + var/access_identifier + + var/instance_name + var/security_level + + var/reboot_mode = TGS_REBOOT_MODE_NORMAL + + var/list/intercepted_message_queue + + var/list/custom_commands + + var/list/test_merges + var/datum/tgs_revision_information/revision + var/list/chat_channels + +/datum/tgs_api/v5/ApiVersion() + return new /datum/tgs_version("5.2.1") + +/datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) + server_port = world.params[DMAPI5_PARAM_SERVER_PORT] + access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] + + var/datum/tgs_version/api_version = ApiVersion() + version = null + var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) + if(!istype(bridge_response)) + TGS_ERROR_LOG("Failed initial bridge request!") + return FALSE + + var/list/runtime_information = bridge_response[DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION] + if(!istype(runtime_information)) + TGS_ERROR_LOG("Failed to decode runtime information from bridge response: [json_encode(bridge_response)]!") + return FALSE + + if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) + TGS_INFO_LOG("DMAPI validation, exiting...") + del(world) + + version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) + security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] + + var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] + if(istype(revisionData)) + revision = new + revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] + revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] + else + TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_REVISION] from runtime information!") + + test_merges = list() + var/list/test_merge_json = runtime_information[DMAPI5_RUNTIME_INFORMATION_TEST_MERGES] + if(istype(test_merge_json)) + for(var/entry in test_merge_json) + var/datum/tgs_revision_information/test_merge/tm = new + tm.number = entry[DMAPI5_TEST_MERGE_NUMBER] + + var/list/revInfo = entry[DMAPI5_TEST_MERGE_REVISION] + if(revInfo) + tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] + tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] + else + TGS_WARNING_LOG("Failed to decode [DMAPI5_TEST_MERGE_REVISION] from test merge #[tm.number]!") + + tm.time_merged = text2num(entry[DMAPI5_TEST_MERGE_TIME_MERGED]) + tm.title = entry[DMAPI5_TEST_MERGE_TITLE_AT_MERGE] + tm.body = entry[DMAPI5_TEST_MERGE_BODY_AT_MERGE] + tm.url = entry[DMAPI5_TEST_MERGE_URL] + tm.author = entry[DMAPI5_TEST_MERGE_AUTHOR] + tm.pull_request_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION] + tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT] + + test_merges += tm + else + TGS_WARNING_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_TEST_MERGES] from runtime information!") + + chat_channels = list() + DecodeChannels(runtime_information) + + return TRUE + +/datum/tgs_api/v5/proc/RequireInitialBridgeResponse() + while(!version) + sleep(1) + +/datum/tgs_api/v5/OnInitializationComplete() + Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) + + var/tgs4_secret_sleep_offline_sauce = 29051994 + var/old_sleep_offline = world.sleep_offline + world.sleep_offline = tgs4_secret_sleep_offline_sauce + sleep(1) + if(world.sleep_offline == tgs4_secret_sleep_offline_sauce) //if not someone changed it + world.sleep_offline = old_sleep_offline + +/datum/tgs_api/v5/proc/TopicResponse(error_message = null) + var/list/response = list() + response[DMAPI5_RESPONSE_ERROR_MESSAGE] = error_message + + return json_encode(response) + +/datum/tgs_api/v5/OnTopic(T) + var/list/params = params2list(T) + var/json = params[DMAPI5_TOPIC_DATA] + if(!json) + return FALSE //continue world/Topic + + var/list/topic_parameters = json_decode(json) + if(!topic_parameters) + return TopicResponse("Invalid topic parameters json!"); + + var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] + if(their_sCK != access_identifier) + return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] from: [json]!"); + + var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] + if(!isnum(command)) + return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] from: [json]!") + + switch(command) + if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND) + var/result = HandleCustomCommand(topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND]) + if(!result) + result = TopicResponse("Error running chat command!") + return result + if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) + intercepted_message_queue = list() + var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] + if(!istype(event_notification)) + return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!") + + var/event_type = event_notification[DMAPI5_EVENT_NOTIFICATION_TYPE] + if(!isnum(event_type)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_TYPE]!") + + var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS] + if(event_parameters && !istype(event_parameters)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + + var/list/event_call = list(event_type) + if(event_parameters) + event_call += event_parameters + + if(event_handler != null) + event_handler.HandleEvent(arglist(event_call)) + + var/list/response = list() + response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue + intercepted_message_queue = null + return json_encode(response) + if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + if (!isnum(new_port) || !(new_port > 0)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port) + + //the topic still completes, miraculously + //I honestly didn't believe byond could do it without exploding + if(!world.OpenPort(new_port)) + return TopicResponse("Port change failed!") + + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE) + var/new_reboot_mode = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE] + if(!isnum(new_reboot_mode)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE]!") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_REBOOT_MODE_CHANGE, reboot_mode, new_reboot_mode) + + reboot_mode = new_reboot_mode + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED) + var/new_instance_name = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME] + if(!istext(new_instance_name)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME]!") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_INSTANCE_RENAMED, new_instance_name) + + instance_name = new_instance_name + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE) + var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE] + if(!istype(chat_update_json)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!") + + DecodeChannels(chat_update_json) + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + if (!isnum(new_port) || !(new_port > 0)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + + server_port = new_port + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + var/error_message = null + if (new_port != null) + if (!isnum(new_port) || !(new_port > 0)) + error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" + else + server_port = new_port + + var/new_version_string = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION] + if (!istext(new_version_string)) + if(error_message != null) + error_message += ", " + error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" + else + var/datum/tgs_version/new_version = new(new_version_string) + if (event_handler) + event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) + + version = new_version + + return json_encode(list(DMAPI5_RESPONSE_ERROR_MESSAGE = error_message, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) + + return TopicResponse("Unknown command: [command]") + +/datum/tgs_api/v5/proc/Bridge(command, list/data) + if(!data) + data = list() + + data[DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE] = command + data[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] = access_identifier + + var/json = json_encode(data) + var/encoded_json = url_encode(json) + + // This is an infinite sleep until we get a response + var/export_response = world.Export("http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]") + if(!export_response) + TGS_ERROR_LOG("Failed export request: [json]") + return + + var/response_json = file2text(export_response["CONTENT"]) + if(!response_json) + TGS_ERROR_LOG("Failed export request, missing content!") + return + + var/list/bridge_response = json_decode(response_json) + if(!bridge_response) + TGS_ERROR_LOG("Failed export request, bad json: [response_json]") + return + + var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE] + if(error) + TGS_ERROR_LOG("Failed export request, bad request: [error]") + return + + return bridge_response + +/datum/tgs_api/v5/OnReboot() + var/list/result = Bridge(DMAPI5_BRIDGE_COMMAND_REBOOT) + if(!result) + return + + //okay so the standard TGS4 proceedure is: right before rebooting change the port to whatever was sent to us in the above json's data parameter + + var/port = result[DMAPI5_BRIDGE_RESPONSE_NEW_PORT] + if(!isnum(port)) + return //this is valid, server may just want use to reboot + + if(port == 0) + //to byond 0 means any port and "none" means close vOv + port = "none" + + if(!world.OpenPort(port)) + TGS_ERROR_LOG("Unable to set port to [port]!") + +/datum/tgs_api/v5/InstanceName() + RequireInitialBridgeResponse() + return instance_name + +/datum/tgs_api/v5/TestMerges() + RequireInitialBridgeResponse() + return test_merges + +/datum/tgs_api/v5/EndProcess() + Bridge(DMAPI5_BRIDGE_COMMAND_KILL) + +/datum/tgs_api/v5/Revision() + RequireInitialBridgeResponse() + return revision + +/datum/tgs_api/v5/ChatBroadcast(message, list/channels) + if(!length(channels)) + channels = ChatChannelInfo() + + var/list/ids = list() + for(var/I in channels) + var/datum/tgs_chat_channel/channel = I + ids += channel.id + + message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = ids) + if(intercepted_message_queue) + intercepted_message_queue += list(message) + else + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + +/datum/tgs_api/v5/ChatTargetedBroadcast(message, admin_only) + var/list/channels = list() + for(var/I in ChatChannelInfo()) + var/datum/tgs_chat_channel/channel = I + if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) + channels += channel.id + message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = channels) + if(intercepted_message_queue) + intercepted_message_queue += list(message) + else + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + +/datum/tgs_api/v5/ChatPrivateMessage(message, datum/tgs_chat_user/user) + message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = list(user.channel.id)) + if(intercepted_message_queue) + intercepted_message_queue += list(message) + else + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + +/datum/tgs_api/v5/ChatChannelInfo() + RequireInitialBridgeResponse() + return chat_channels + +/datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) + var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] + if(istype(chat_channels_json)) + chat_channels.Cut() + for(var/channel_json in chat_channels_json) + var/datum/tgs_chat_channel/channel = DecodeChannel(channel_json) + if(channel) + chat_channels += channel + else + TGS_WARNING_LOG("Failed to decode [DMAPI5_CHAT_UPDATE_CHANNELS] from channel update!") + +/datum/tgs_api/v5/proc/DecodeChannel(channel_json) + var/datum/tgs_chat_channel/channel = new + channel.id = channel_json[DMAPI5_CHAT_CHANNEL_ID] + channel.friendly_name = channel_json[DMAPI5_CHAT_CHANNEL_FRIENDLY_NAME] + channel.connection_name = channel_json[DMAPI5_CHAT_CHANNEL_CONNECTION_NAME] + channel.is_admin_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL] + channel.is_private_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL] + channel.custom_tag = channel_json[DMAPI5_CHAT_CHANNEL_TAG] + return channel + +/datum/tgs_api/v5/SecurityLevel() + RequireInitialBridgeResponse() + return security_level diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm new file mode 100644 index 0000000000..6d31dd3422 --- /dev/null +++ b/code/modules/tgs/v5/commands.dm @@ -0,0 +1,40 @@ +/datum/tgs_api/v5/proc/ListCustomCommands() + var/results = list() + custom_commands = list() + for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) + var/datum/tgs_chat_command/stc = new I + var/command_name = stc.name + if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) + TGS_WARNING_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!") + continue + + if(results[command_name]) + var/datum/other = custom_commands[command_name] + TGS_WARNING_LOG("Custom commands [other.type] and [I] have the same name (\"[command_name]\"), only [other.type] will be available!") + continue + results += list(list(DMAPI5_CUSTOM_CHAT_COMMAND_NAME = command_name, DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT = stc.help_text, DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY = stc.admin_only)) + custom_commands[command_name] = stc + + return results + +/datum/tgs_api/v5/proc/HandleCustomCommand(list/command_json) + var/command = command_json[DMAPI5_CHAT_COMMAND_NAME] + var/user = command_json[DMAPI5_CHAT_COMMAND_USER] + var/params = command_json[DMAPI5_CHAT_COMMAND_PARAMS] + + var/datum/tgs_chat_user/u = new + u.id = user[DMAPI5_CHAT_USER_ID] + u.friendly_name = user[DMAPI5_CHAT_USER_FRIENDLY_NAME] + u.mention = user[DMAPI5_CHAT_USER_MENTION] + u.channel = DecodeChannel(user[DMAPI5_CHAT_USER_CHANNEL]) + + var/datum/tgs_chat_command/sc = custom_commands[command] + if(sc) + var/text_response = sc.Run(u, params) + var/list/topic_response = list() + if(!istext(text_response)) + TGS_ERROR_LOG("Custom command [command] should return a string! Got: \"[text_response]\"") + text_response = null + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = text_response + return json_encode(topic_response) + return TopicResponse("Unknown custom chat command: [command]!") diff --git a/code/modules/tgs/v5/undef.dm b/code/modules/tgs/v5/undef.dm new file mode 100644 index 0000000000..34fc481d36 --- /dev/null +++ b/code/modules/tgs/v5/undef.dm @@ -0,0 +1,98 @@ +#undef DMAPI5_PARAM_SERVER_PORT +#undef DMAPI5_PARAM_ACCESS_IDENTIFIER + +#undef DMAPI5_BRIDGE_DATA +#undef DMAPI5_TOPIC_DATA + +#undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE +#undef DMAPI5_BRIDGE_COMMAND_STARTUP +#undef DMAPI5_BRIDGE_COMMAND_PRIME +#undef DMAPI5_BRIDGE_COMMAND_REBOOT +#undef DMAPI5_BRIDGE_COMMAND_KILL +#undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND + +#undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER +#undef DMAPI5_PARAMETER_CUSTOM_COMMANDS + +#undef DMAPI5_RESPONSE_ERROR_MESSAGE + +#undef DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE +#undef DMAPI5_BRIDGE_PARAMETER_CURRENT_PORT +#undef DMAPI5_BRIDGE_PARAMETER_VERSION +#undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE +#undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL + +#undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT +#undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION + +#undef DMAPI5_CHAT_MESSAGE_TEXT +#undef DMAPI5_CHAT_MESSAGE_CHANNEL_IDS + +#undef DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER +#undef DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION +#undef DMAPI5_RUNTIME_INFORMATION_SERVER_PORT +#undef DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY +#undef DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME +#undef DMAPI5_RUNTIME_INFORMATION_REVISION +#undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES +#undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL + +#undef DMAPI5_CHAT_UPDATE_CHANNELS + +#undef DMAPI5_TEST_MERGE_TIME_MERGED +#undef DMAPI5_TEST_MERGE_REVISION +#undef DMAPI5_TEST_MERGE_TITLE_AT_MERGE +#undef DMAPI5_TEST_MERGE_BODY_AT_MERGE +#undef DMAPI5_TEST_MERGE_URL +#undef DMAPI5_TEST_MERGE_AUTHOR +#undef DMAPI5_TEST_MERGE_NUMBER +#undef DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION +#undef DMAPI5_TEST_MERGE_COMMENT + +#undef DMAPI5_CHAT_COMMAND_NAME +#undef DMAPI5_CHAT_COMMAND_PARAMS +#undef DMAPI5_CHAT_COMMAND_USER + +#undef DMAPI5_EVENT_NOTIFICATION_TYPE +#undef DMAPI5_EVENT_NOTIFICATION_PARAMETERS + +#undef DMAPI5_TOPIC_COMMAND_CHAT_COMMAND +#undef DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION +#undef DMAPI5_TOPIC_COMMAND_CHANGE_PORT +#undef DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE +#undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED +#undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE +#undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE +#undef DMAPI5_TOPIC_COMMAND_HEARTBEAT +#undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH + +#undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE +#undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND +#undef DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION +#undef DMAPI5_TOPIC_PARAMETER_NEW_PORT +#undef DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE +#undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME +#undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE +#undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION + +#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE +#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES + +#undef DMAPI5_REVISION_INFORMATION_COMMIT_SHA +#undef DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA + +#undef DMAPI5_CHAT_USER_ID +#undef DMAPI5_CHAT_USER_FRIENDLY_NAME +#undef DMAPI5_CHAT_USER_MENTION +#undef DMAPI5_CHAT_USER_CHANNEL + +#undef DMAPI5_CHAT_CHANNEL_ID +#undef DMAPI5_CHAT_CHANNEL_FRIENDLY_NAME +#undef DMAPI5_CHAT_CHANNEL_CONNECTION_NAME +#undef DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL +#undef DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL +#undef DMAPI5_CHAT_CHANNEL_TAG + +#undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME +#undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT +#undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index b0808cef5e..723e5f90ed 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -99,7 +99,7 @@ * return UI_state The state of the UI. **/ /mob/living/proc/shared_living_ui_distance(atom/movable/src_object) - if(!(src_object in view(src))) // If the object is obscured, close it. + if(!(src_object in fov_view())) // If the object is obscured, close it. return UI_CLOSE var/dist = get_dist(src_object, src) diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm index a4cea7c7c2..3b13dc5b3d 100644 --- a/code/modules/tgui/states/physical.dm +++ b/code/modules/tgui/states/physical.dm @@ -2,7 +2,7 @@ * tgui state: physical_state * * Short-circuits the default state to only check physical distance. - **/ + */ GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new) @@ -22,3 +22,28 @@ GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new) /mob/living/silicon/ai/physical_can_use_topic(src_object) return UI_UPDATE // AIs are not physical. + +/** + * tgui state: physical_obscured_state + * + * Short-circuits the default state to only check physical distance, being in view doesn't matter + */ + +GLOBAL_DATUM_INIT(physical_obscured_state, /datum/ui_state/physical_obscured_state, new) + +/datum/ui_state/physical_obscured_state/can_use_topic(src_object, mob/user) + . = user.shared_ui_interaction(src_object) + if(. > UI_CLOSE) + return min(., user.physical_obscured_can_use_topic(src_object)) + +/mob/proc/physical_obscured_can_use_topic(src_object) + return UI_CLOSE + +/mob/living/physical_obscured_can_use_topic(src_object) + return shared_living_ui_distance(src_object) + +/mob/living/silicon/physical_obscured_can_use_topic(src_object) + return max(UI_UPDATE, shared_living_ui_distance(src_object)) // Silicons can always see. + +/mob/living/silicon/ai/physical_obscured_can_use_topic(src_object) + return UI_UPDATE // AIs are not physical. \ No newline at end of file diff --git a/code/modules/uplink/uplink_items/uplink_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm index 15bb47af91..ce74773f8d 100644 --- a/code/modules/uplink/uplink_items/uplink_ammo.dm +++ b/code/modules/uplink/uplink_items/uplink_ammo.dm @@ -15,6 +15,12 @@ cost = 1 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/ammo/pistol/box + name = "Ammo Box - 10mm" + desc = "An additional box of 10mm ammo. The box has 20 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/c10mm + illegal_tech = FALSE + /datum/uplink_item/ammo/pistolap name = "10mm Armour Piercing Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ @@ -23,6 +29,12 @@ cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/ammo/pistolap/box + name = "Ammo Box - 10mm Armour Piercing" + desc = "An additional box of 10mm Armour Piercing ammo. The box has 20 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/c10mm/ap + illegal_tech = FALSE + /datum/uplink_item/ammo/pistolhp name = "10mm Hollow Point Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ @@ -31,6 +43,12 @@ cost = 3 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/ammo/pistolhp/box + name = "Ammo Box - 10mm Hollow Point" + desc = "An additional box of 10mm Hollow Point ammo. The box has 20 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/c10mm/hp + illegal_tech = FALSE + /datum/uplink_item/ammo/pistolfire name = "10mm Incendiary Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ @@ -39,6 +57,12 @@ cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/ammo/pistolfire/box + name = "Ammo Box - 10mm Incendiary" + desc = "An additional box of 10mm Incendiary ammo. The box has 20 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/magazine/m10mm/fire + illegal_tech = FALSE + /datum/uplink_item/ammo/pistolzzz name = "10mm Soporific Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with soporific rounds that put the target to sleep. \ @@ -46,6 +70,12 @@ item = /obj/item/ammo_box/magazine/m10mm/soporific cost = 2 +/datum/uplink_item/ammo/pistolzzz/box + name = "Ammo Box - 10mm Soporific" + desc = "An additional box of 10mm Soporific ammo. The box has 20 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/c10mm/soporific + illegal_tech = FALSE + /datum/uplink_item/ammo/shotgun cost = 2 include_modes = list(/datum/game_mode/nuclear) @@ -159,6 +189,13 @@ cost = 4 include_modes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/machinegun/match + name = "7.12x82mm (Match) Box Magazine" + desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; you didn't know there was a demand for match grade \ + precision bullet hose ammo, but these rounds are finely tuned and perfect for ricocheting off walls all fancy-like." + item = /obj/item/ammo_box/magazine/mm712x82/match + cost = 10 + /datum/uplink_item/ammo/machinegun cost = 6 surplus = 0 @@ -212,6 +249,12 @@ cost = 2 include_modes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/pistolaps + name = "Ammo Box - 9mm" + desc = "An additional box of 9mm ammo. The box has 30 cases inside, does not come with a magazine." + item = /obj/item/ammo_box/c9mm + illegal_tech = FALSE + /datum/uplink_item/ammo/flechetteap name = "Armor Piercing Flechette Magazine" desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \ diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm index 681efea5b3..43e5523bad 100644 --- a/code/modules/uplink/uplink_items/uplink_badass.dm +++ b/code/modules/uplink/uplink_items/uplink_badass.dm @@ -24,13 +24,6 @@ Radio headset does not include encryption key. No gun included." item = /obj/item/storage/box/syndie_kit/centcom_costume -/datum/uplink_item/badass/claymore - name = "Claymore" - cost = 8 - player_minimum = 25 - desc = "A claymore. We don't know why you'd do this." - item = /obj/item/claymore - /datum/uplink_item/badass/costumes/clown name = "Clown Costume" desc = "Nothing is more terrifying than clowns with fully automatic weaponry." @@ -58,6 +51,7 @@ manufactured to pack a little bit more of a punch if your client needs some convincing." item = /obj/item/storage/secure/briefcase/syndie cost = 1 + restricted = TRUE /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" @@ -84,11 +78,3 @@ limited_stock = 1 cant_discount = TRUE include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) - -/datum/uplink_item/badass/shades - name = "Big Sunglasses" - desc = "Prevents flashes and looks badbass with some Smokes." - item = /obj/item/clothing/glasses/sunglasses/big - cost = 1 - surplus = 5 - illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm index a748f49322..321b9121bc 100644 --- a/code/modules/uplink/uplink_items/uplink_bundles.dm +++ b/code/modules/uplink/uplink_items/uplink_bundles.dm @@ -38,7 +38,18 @@ specialised contractor baton, and three randomly selected low cost items. Can include otherwise unobtainable items." item = /obj/item/storage/box/syndie_kit/contract_kit cost = 20 - player_minimum = 15 + player_minimum = 30 + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + restricted = TRUE + +/datum/uplink_item/bundles_TC/northstar_bundle + name = "Northstar Bundle" + desc = "An item usually reserved for the Gorlex Marauders and their operatives, now available for recreational use. \ + These armbands let the user punch people very fast and with the lethality of a legendary martial artist. \ + Does not improve weapon attack speed or the meaty fists of a hulk, but you will be unmatched in martial power. \ + Combines with all martial arts, but the user will be unable to bring themselves to use guns, nor remove the armbands." + item = /obj/item/storage/box/syndie_kit/northstar + cost = 20 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) /datum/uplink_item/suits/infiltrator_bundle @@ -150,6 +161,23 @@ U.purchase_log.LogPurchase(goods, I, 0) return C +/datum/uplink_item/bundles_TC/reroll + name = "Renegotiate Contract" + desc = "Selecting this will inform the syndicate that you wish to change employers. Can only be done once; no take-backs." + item = /obj/effect/gibspawner/generic + cost = 0 + cant_discount = TRUE + restricted = TRUE + limited_stock = 1 + +/datum/uplink_item/bundles_TC/reroll/purchase(mob/user, datum/component/uplink/U) + var/datum/antagonist/traitor/T = user?.mind?.has_antag_datum(/datum/antagonist/traitor) + if(istype(T)) + var/new_traitor_kind = get_random_traitor_kind(list(T.traitor_kind.type)) + T.set_traitor_kind(new_traitor_kind) + else + to_chat(user,"Invalid user for contract renegotiation.") + /datum/uplink_item/bundles_TC/random name = "Random Item" desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't decided on a strategy yet." @@ -197,4 +225,4 @@ name = "20 Raw Telecrystals" desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." item = /obj/item/stack/telecrystal/twenty - cost = 20 \ No newline at end of file + cost = 20 diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index aad9834612..014e0452b5 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -83,4 +83,17 @@ name = "Thieving Gloves" desc = "A pair of gloves that are insulated and frictionless, allowing you to steal easily from anyone you see." item = /obj/item/clothing/gloves/thief - cost = 4 \ No newline at end of file + cost = 4 + +/datum/uplink_item/suits/wallwalkers + name = "Wall Walking Boots" + desc = "Through bluespace magic stolen from an organisation that hoards technology, these boots simply allow you to slip through the atoms that make up anything, but only while walking, for safety reasons. As well as this, they unfortunately cause minor breath loss as the majority of atoms in your lungs are sucked out into any solid object you walk through." + item = /obj/item/clothing/shoes/wallwalkers + cost = 6 + +/datum/uplink_item/device_tools/guerillagloves + name = "Guerilla Gloves" + desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!" + item = /obj/item/clothing/gloves/tackler/combat/insulated + include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + cost = 2 diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index 819ba51623..99c9c505c0 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -9,9 +9,9 @@ /datum/uplink_item/dangerous/pistol name = "Stechkin Pistol" - desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \ + desc = "A sleek box containing a small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines. The handgun is compatible \ with suppressors." - item = /obj/item/gun/ballistic/automatic/pistol + item = /obj/item/storage/box/syndie_kit/pistol cost = 7 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) @@ -117,17 +117,6 @@ /datum/uplink_item/dangerous/doublesword/get_discount() return pick(4;0.8,2;0.65,1;0.5) -/datum/uplink_item/dangerous/cxneb - name = "Dragon's Tooth Non-Eutactic Blade" - desc = "An illegal modification of a weapon that is functionally identical to the energy sword, \ - the Non-Eutactic Blade (NEB) forges a hardlight blade on-demand, \ - generating an extremely sharp, unbreakable edge that is guaranteed to satisfy your every need. \ - This particular model has a polychromic hardlight generator, allowing you to murder in style! \ - The illegal modifications bring this weapon up to par with the classic energy sword, and also gives it the energy sword's distinctive sounds." - item = /obj/item/melee/transforming/energy/sword/cx/traitor - cost = 8 - exclude_modes = list(/datum/game_mode/nuclear/clown_ops) - /datum/uplink_item/dangerous/sword name = "Energy Sword" desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \ @@ -174,10 +163,13 @@ include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/rapid - name = "Gloves of the North Star" - desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk." - item = /obj/item/clothing/gloves/rapid - cost = 8 + name = "Bands of the North Star" + desc = "These armbands let the user punch people very fast and with the lethality of a legendary martial artist. \ + Does not improve weapon attack speed or the meaty fists of a hulk, but you will be unmatched in martial power. \ + Combines with all martial arts, but the user will be unable to bring themselves to use guns, nor remove the armbands." + item = /obj/item/clothing/gloves/fingerless/pugilist/rapid + cost = 30 + include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/dangerous/guardian name = "Holoparasites" diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index 06fd9aab43..df6373b8de 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -20,6 +20,12 @@ item = /obj/item/emagrecharge cost = 2 +/datum/uplink_item/device_tools/bluespacerecharge + name = "Bluespace Crystal Recharging Device" + desc = "A small device intended for recharging Wall Walking boots. Using it will add six charges to them. Use ten bluespace crystals on this recharger to add three more charges to it. " + item = /obj/item/bluespacerecharge + cost = 2 + /datum/uplink_item/device_tools/phantomthief name = "Syndicate Mask" desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles" @@ -94,6 +100,12 @@ cost = 1 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) +/datum/uplink_item/device_tools/ammo_pouch + name = "Ammo Pouch" + desc = "A small yet large enough pouch that can fit in your pocket, and has room for three magazines." + item = /obj/item/storage/bag/ammo + cost = 1 + /datum/uplink_item/device_tools/fakenucleardisk name = "Decoy Nuclear Authentication Disk" desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \ @@ -182,12 +194,22 @@ item = /obj/item/healthanalyzer/rad_laser cost = 3 +/datum/uplink_item/device_tools/riflery_primer + name = "Riflery Primer" + desc = "An old book with blood and vodka stains on it. Freshly pulled from a dusty crate in some old warehouse, \ + this primer of questionable worth and value is rumored to increase your rifle-bolt-working and/or shotgun \ + racking fivefold. Then again, the techniques here only work on bolt-actions and pump-actions..." + item = /obj/item/book/granter/trait/rifleman + cost = 3 + restricted_roles = list("Operative") // i want it to be surplusable but i also want it to be mostly nukie only, please advise + surplus = 90 + /datum/uplink_item/device_tools/stimpack name = "Stimpack" desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \ 5 minutes after injection." item = /obj/item/reagent_containers/syringe/stimulants - cost = 5 + cost = 3 surplus = 90 /datum/uplink_item/device_tools/medkit @@ -255,3 +277,15 @@ cost = 2 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) restricted = TRUE + +/* for now +/datum/uplink_item/device_tools/suspiciousphone + name = "Protocol CRAB-17 Phone" + desc = "The Protocol CRAB-17 Phone, a phone borrowed from an unknown third party, it can be used to crash the space market, funneling the losses of the crew to your bank account.\ + The crew can move their funds to a new banking site though, unless they HODL, in which case they deserve it." + item = /obj/item/suspiciousphone + cost = 7 + restricted = TRUE + limited_stock = 1 +*/ + diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index 3d28010133..da25cf5298 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -64,14 +64,6 @@ restricted_roles = list("Clown") */ -/datum/uplink_item/role_restricted/clumsyDNA - name = "Clumsy Clown DNA" - desc = "A DNA injector that has been loaded with the clown gene that makes people clumsy.. \ - Making someone clumsy will allow them to use clown firing pins as well as Reverse Revolvers. For a laugh try using this on the HOS to see how many times they shoot themselves in the foot!" - cost = 1 - item = /obj/item/dnainjector/clumsymut - restricted_roles = list("Clown") - /datum/uplink_item/role_restricted/haunted_magic_eightball name = "Haunted Magic Eightball" desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. \ @@ -92,6 +84,24 @@ restricted_roles = list("Chaplain") surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain +/datum/uplink_item/role_restricted/clockwork_slab + name = "Clockwork Slab" + desc = "A reverse engineered clockwork slab. Is this really a good idea?." + item = /obj/item/clockwork/slab/traitor + cost = 20 + player_minimum = 20 + refundable = TRUE + restricted_roles = list("Chaplain") + +/datum/uplink_item/role_restricted/arcane_tome + name = "Arcane Tome" + desc = "A replica of a Nar'sian tome. This is probably a bad idea.." + item = /obj/item/tome/traitor + cost = 20 + player_minimum = 20 + refundable = TRUE + restricted_roles = list("Chaplain") + /datum/uplink_item/role_restricted/explosive_hot_potato name = "Exploding Hot Potato" desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \ @@ -100,19 +110,11 @@ cost = 4 restricted_roles = list("Cook", "Botanist", "Clown", "Mime") -/datum/uplink_item/role_restricted/strange_seeds - name = "Pack of strange seeds" - desc = "Mysterious seeds as strange as their name implies. Spooky." - item = /obj/item/seeds/random - cost = 2 - restricted_roles = list("Botanist") - illegal_tech = FALSE - /datum/uplink_item/role_restricted/strange_seeds_10pack - name = "Pack of strange seeds x10" + name = "Pack of strange seeds" desc = "Mysterious seeds as strange as their name implies. Spooky. These come in bulk" item = /obj/item/storage/box/strange_seeds_10pack - cost = 20 + cost = 10 restricted_roles = list("Botanist") /datum/uplink_item/role_restricted/ez_clean_bundle diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm index 80aba02e2e..b4933b30ba 100644 --- a/code/modules/uplink/uplink_items/uplink_stealth.dm +++ b/code/modules/uplink/uplink_items/uplink_stealth.dm @@ -51,6 +51,7 @@ gain skin as hard as steel and swat bullets from the air, but you also refuse to use dishonorable ranged weaponry." item = /obj/item/book/granter/martial/carp cost = 17 + player_minimum = 30 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -60,6 +61,7 @@ and dodging all ranged weapon fire, but you will refuse to use dishonorable ranged weaponry." item = /obj/item/book/granter/martial/bass cost = 18 + player_minimum = 30 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index eb6a9a92e2..d125453e5a 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -60,3 +60,23 @@ turret.pixel_x = 12 turret.pixel_y = 4 turret.layer = OBJ_LAYER + +/obj/vehicle/ridden/atv/snowmobile + name = "snowmobile" + desc = "a tracked vehicle designed for use in the snow, it looks like it would have difficulty moving elsewhere, however." + icon_state = "snowmobile" + +/obj/vehicle/ridden/atv/snowmobile/Moved() + . = ..() + var/static/list/snow_typecache = typecacheof(list(/turf/open/floor/plating/asteroid/snow/icemoon, /turf/open/floor/plating/snowed/smoothed/icemoon, /turf/open/floor/plating/snowed, /turf/open/floor/plating/asteroid/snow)) + var/datum/component/riding/E = LoadComponent(/datum/component/riding) + if(snow_typecache[loc.type]) + E.vehicle_move_delay = 1 + else + E.vehicle_move_delay = 2 + +/obj/vehicle/ridden/atv/snowmobile/snowcurity + name = "security snowmobile" + desc = "for when you want to look like even more of a tool than riding a secway." + icon_state = "snowcurity" + key_type = /obj/item/key/security diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 84e0fcbefc..3784f4d459 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -24,10 +24,12 @@ buckled_mob.stop_sound_channel(CHANNEL_BICYCLE) . =..() -/obj/vehicle/ridden/bicycle/tesla_act() // :::^^^))) +/obj/vehicle/ridden/bicycle/zap_act(zap_str, zap_flags, shocked_targets) // :::^^^))) + //This didn't work for 3 years because none ever tested it I hate life name = "fried bicycle" desc = "Well spent." color = rgb(63, 23, 4) can_buckle = FALSE + . = ..() for(var/m in buckled_mobs) unbuckle_mob(m,1) diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index dc6cccb9a9..d45cb8d26f 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -49,12 +49,12 @@ mob_exit(M, silent) return TRUE -/obj/vehicle/sealed/car/attacked_by(obj/item/I, mob/living/user) +/obj/vehicle/sealed/car/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(!I.force) - return + return FALSE if(occupants[user]) to_chat(user, "Your attack bounces off of the car's padded interior.") - return + return FALSE return ..() /obj/vehicle/sealed/car/attack_hand(mob/living/user) @@ -85,4 +85,4 @@ if(!silent) M.visible_message("[M] is forced into \the [src]!") M.forceMove(src) - add_occupant(M, VEHICLE_CONTROL_KIDNAPPED) \ No newline at end of file + add_occupant(M, VEHICLE_CONTROL_KIDNAPPED) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 2b9890b863..cd21b61dbe 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -36,7 +36,7 @@ visible_message("[src] spews out a ton of space lube!") new /obj/effect/particle_effect/foam(loc) //YEET -/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user) +/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) . = ..() if(istype(I, /obj/item/reagent_containers/food/snacks/grown/banana)) var/obj/item/reagent_containers/food/snacks/grown/banana/banana = I @@ -129,4 +129,4 @@ icon_state = initial(icon_state) /obj/vehicle/sealed/car/clowncar/proc/StopDroppingOil() - droppingoil = FALSE \ No newline at end of file + droppingoil = FALSE diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 4f3970dd37..f71d9367d3 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -77,3 +77,7 @@ if(!force && occupant_amount() >= max_occupants) return FALSE return ..() + +/obj/vehicle/ridden/zap_act(zap_str, zap_flags, shocked_targets) + zap_buckle_check(zap_str) + . = ..() diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index cb53574653..1fb037d1c5 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -40,11 +40,22 @@ . = ..() /obj/vehicle/ridden/scooter/skateboard - name = "skateboard" - desc = "An unfinished scooter which can only barely be called a skateboard. It's still rideable, but probably unsafe. Looks like you'll need to add a few rods to make handlebars. Alt-click to adjust speed." + name = "improvised skateboard" + desc = "An unfinished scooter which can only barely be called a skateboard. It's still rideable, but probably unsafe. Looks like you'll need to add a few rods to make handlebars." icon_state = "skateboard" density = FALSE - var/adjusted_speed = FALSE + arms_required = 0 + var/datum/effect_system/spark_spread/sparks + ///Whether the board is currently grinding + var/grinding = FALSE + ///Stores the time of the last crash plus a short cooldown, affects availability and outcome of certain actions + var/next_crash + ///Stores the default icon state + var/board_icon = "skateboard" + ///The handheld item counterpart for the board + var/board_item_type = /obj/item/melee/skateboard + ///Stamina drain multiplier + var/instability = 10 /obj/vehicle/ridden/scooter/skateboard/Initialize() . = ..() @@ -54,6 +65,23 @@ D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) D.set_vehicle_dir_layer(EAST, OBJ_LAYER) D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + sparks = new + sparks.set_up(1, 0, src) + sparks.attach(src) + +/obj/vehicle/ridden/scooter/skateboard/Destroy() + if(sparks) + QDEL_NULL(sparks) + . = ..() + +/obj/vehicle/ridden/scooter/skateboard/relaymove() + if (grinding || world.time < next_crash) + return FALSE + return ..() + +/obj/vehicle/ridden/scooter/skateboard/generate_actions() + . = ..() + initialize_controller_action_type(/datum/action/vehicle/ridden/scooter/skateboard/ollie, VEHICLE_CONTROL_DRIVE) /obj/vehicle/ridden/scooter/skateboard/post_buckle_mob(mob/living/M)//allows skateboards to be non-dense but still allows 2 skateboarders to collide with each other density = TRUE @@ -68,17 +96,49 @@ . = ..() if(A.density && has_buckled_mobs()) var/mob/living/H = buckled_mobs[1] - var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) - unbuckle_mob(H) - H.throw_at(throw_target, 4, 3) - H.DefaultCombatKnockdown(100) - H.adjustStaminaLoss(40) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) - if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3) - H.updatehealth() - visible_message("[src] crashes into [A], sending [H] flying!") - playsound(src, 'sound/effects/bang.ogg', 50, 1) + H.adjustStaminaLoss(instability*6) + playsound(src, 'sound/effects/bang.ogg', 40, TRUE) + if(!iscarbon(H) || H.getStaminaLoss() >= 100 || grinding || world.time < next_crash) + var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) + unbuckle_mob(H) + H.throw_at(throw_target, 3, 2) + var/head_slot = H.get_item_by_slot(SLOT_HEAD) + if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + H.updatehealth() + visible_message("[src] crashes into [A], sending [H] flying!") + H.Knockdown(80) + else + var/backdir = turn(dir, 180) + vehicle_move(backdir) + H.spin(4, 1) + next_crash = world.time + 10 + +///Moves the vehicle forward and if it lands on a table, repeats +/obj/vehicle/ridden/scooter/skateboard/proc/grind() + vehicle_move(dir) + if(has_buckled_mobs() && locate(/obj/structure/table) in loc.contents) + var/mob/living/L = buckled_mobs[1] + L.adjustStaminaLoss(instability*0.5) + if (L.getStaminaLoss() >= 100) + playsound(src, 'sound/effects/bang.ogg', 20, TRUE) + unbuckle_mob(L) + var/atom/throw_target = get_edge_target_turf(src, pick(GLOB.cardinals)) + L.throw_at(throw_target, 2, 2) + visible_message("[L] loses [L.p_their()] footing and slams on the ground!") + L.Knockdown(40) + grinding = FALSE + icon_state = board_icon + return + else + playsound(src, 'sound/vehicles/skateboard_roll.ogg', 50, TRUE) + if(prob (25)) + sparks.start() //the most radical way to start plasma fires + addtimer(CALLBACK(src, .proc/grind), 2) + return + else + grinding = FALSE + icon_state = board_icon /obj/vehicle/ridden/scooter/skateboard/MouseDrop(atom/over_object) . = ..() @@ -89,22 +149,42 @@ to_chat(M, "You can't lift this up when somebody's on it.") return if(over_object == M) - var/obj/item/melee/skateboard/board = new /obj/item/melee/skateboard() + var/board = new board_item_type(get_turf(M)) M.put_in_hands(board) qdel(src) -/obj/vehicle/ridden/scooter/skateboard/AltClick(mob/user) - . = ..() - var/datum/component/riding/R = src.GetComponent(/datum/component/riding) - if (!adjusted_speed) - R.vehicle_move_delay = 0 - to_chat(user, "You adjust the wheels on [src] to make it go faster.") - adjusted_speed = TRUE +/obj/vehicle/ridden/scooter/skateboard/pro + name = "skateboard" + desc = "A RaDSTORMz brand professional skateboard. Looks a lot more stable than the average board." + icon_state = "skateboard2" + board_icon = "skateboard2" + board_item_type = /obj/item/melee/skateboard/pro + instability = 6 + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/ + name = "hoverboard" + desc = "A blast from the past, so retro!" + board_item_type = /obj/item/melee/skateboard/hoverboard + instability = 3 + icon_state = "hoverboard_red" + board_icon = "hoverboard_red" + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/screwdriver_act(mob/living/user, obj/item/I) + return FALSE + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/rods)) + return else - R.vehicle_move_delay = 1 - to_chat(user, "You adjust the wheels on [src] to make it go slower.") - adjusted_speed = FALSE - return TRUE + return ..() + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/admin + name = "\improper Board Of Directors" + desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." + board_item_type = /obj/item/melee/skateboard/hoverboard/admin + instability = 0 + icon_state = "hoverboard_nt" + board_icon = "hoverboard_nt" //CONSTRUCTION /obj/item/scooter_frame diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index fc81e2ec00..edaab8b982 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,5 +1,6 @@ /obj/vehicle/sealed var/enter_delay = 20 + flags_1 = BLOCK_FACE_ATOM_1 /obj/vehicle/sealed/generate_actions() . = ..() @@ -51,7 +52,7 @@ if(randomstep) var/turf/target_turf = get_step(exit_location(M), pick(GLOB.cardinals)) M.throw_at(target_turf, 5, 10) - + if(!silent) M.visible_message("[M] drops out of \the [src]!") return TRUE @@ -102,7 +103,13 @@ if(iscarbon(i)) var/mob/living/carbon/C = i C.DefaultCombatKnockdown(40) - - + + /obj/vehicle/sealed/AllowDrop() return FALSE + +/obj/vehicle/sealed/setDir(newdir) + . = ..() + for(var/k in occupants) + var/mob/M = k + M.setDir(newdir) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 868610a149..8ad8b5f1ee 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -22,7 +22,7 @@ /obj/vehicle/ridden/secway/process() var/diff = world.time - last_tick var/regen = chargerate * diff - charge = CLAMP(charge + regen, 0, chargemax) + charge = clamp(charge + regen, 0, chargemax) last_tick = world.time /obj/vehicle/ridden/secway/relaymove(mob/user, direction) diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index c780ce6fd3..5de2c8961f 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -164,3 +164,41 @@ if(istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar)) var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target C.RollTheDice(owner) + + +/datum/action/vehicle/ridden/scooter/skateboard/ollie + name = "Ollie" + desc = "Get some air! Land on a table to do a gnarly grind." + button_icon_state = "skateboard_ollie" + ///Cooldown to next jump + var/next_ollie + +/datum/action/vehicle/ridden/scooter/skateboard/ollie/Trigger() + if(world.time > next_ollie) + var/obj/vehicle/ridden/scooter/skateboard/V = vehicle_target + if (V.grinding) + return + var/mob/living/L = owner + var/turf/landing_turf = get_step(V.loc, V.dir) + L.adjustStaminaLoss(V.instability*2) + if (L.getStaminaLoss() >= 100) + playsound(src, 'sound/effects/bang.ogg', 20, TRUE) + V.unbuckle_mob(L) + L.throw_at(landing_turf, 2, 2) + L.Knockdown(40) + V.visible_message("[L] misses the landing and falls on [L.p_their()] face!") + else + L.spin(4, 1) + animate(L, pixel_y = -6, time = 4) + animate(V, pixel_y = -6, time = 3) + playsound(V, 'sound/vehicles/skateboard_ollie.ogg', 50, TRUE) + passtable_on(L, VEHICLE_TRAIT) + V.pass_flags |= PASSTABLE + L.Move(landing_turf, vehicle_target.dir) + passtable_off(L, VEHICLE_TRAIT) + V.pass_flags &= ~PASSTABLE + if(locate(/obj/structure/table) in V.loc.contents) + V.grinding = TRUE + V.icon_state = "[V.board_icon]-grind" + addtimer(CALLBACK(V, /obj/vehicle/ridden/scooter/skateboard/.proc/grind), 2) + next_ollie = world.time + 5 diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 8a62c19e16..b9d60af1b6 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -16,12 +16,30 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY CANISTER CHARGES in vending_items.dm */ +#define MAX_VENDING_INPUT_AMOUNT 30 +/** + * # vending record datum + * + * A datum that represents a product that is vendable + */ /datum/data/vending_product name = "generic" + ///Typepath of the product that is created when this record "sells" var/product_path = null + ///How many of this product we currently have var/amount = 0 + ///How many we can store at maximum var/max_amount = 0 + ///Does the item have a custom price override + var/custom_price + ///Does the item have a custom premium price override + var/custom_premium_price +/** + * # vending machines + * + * Captalism in the year 2525, everything in a vending machine, even love + */ /obj/machinery/vending name = "\improper Vendomat" desc = "A generic vending machine." @@ -36,43 +54,128 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C integrity_failure = 0.33 armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70) circuit = /obj/item/circuitboard/machine/vendor - var/active = 1 //No sales pitches if off! - var/vend_ready = 1 //Are we ready to vend?? Is it time?? + payment_department = ACCOUNT_SRV + light_power = 0.5 + light_range = MINIMUM_USEFUL_LIGHT_RANGE + /// Is the machine active (No sales pitches if off)! + var/active = TRUE + ///Are we ready to vend?? Is it time?? + var/vend_ready = TRUE + ///Next world time to send a purchase message + var/purchase_message_cooldown + ///Last mob to shop with us - // To be filled out at compile time - var/list/products = list() //For each, use the following pattern: - var/list/contraband = list() //list(/type/path = amount, /type/path2 = amount2) - var/list/premium = list() //No specified amount = only one in stock + /** + * List of products this machine sells + * + * form should be list(/type/path = amount, /type/path2 = amount2) + */ + var/list/products = list() + + /** + * List of products this machine sells when you hack it + * + * form should be list(/type/path = amount, /type/path2 = amount2) + */ + var/list/contraband = list() + + /** + * List of premium products this machine sells + * + * form should be list(/type/path, /type/path2) as there is only ever one in stock + */ + var/list/premium = list() + + ///String of slogans separated by semicolons, optional + var/product_slogans = "" + ///String of small ad messages in the vending screen - random chance + var/product_ads = "" - var/product_slogans = "" //String of slogans separated by semicolons, optional - var/product_ads = "" //String of small ad messages in the vending screen - random chance var/list/product_records = list() var/list/hidden_records = list() var/list/coin_records = list() var/list/slogan_list = list() - var/list/small_ads = list() //Small ad messages in the vending screen - random chance of popping up whenever you open it - var/vend_reply //Thank you for shopping! - var/last_reply = 0 - var/last_slogan = 0 //When did we last pitch? - var/slogan_delay = 6000 //How long until we can pitch again? - var/icon_vend //Icon_state when vending! - var/icon_deny //Icon_state when vending! - var/seconds_electrified = 0 //Shock customers like an airlock. - var/shoot_inventory = 0 //Fire items at customers! We're broken! - var/shoot_inventory_chance = 2 - var/shut_up = 0 //Stop spouting those godawful pitches! - var/extended_inventory = 0 //can we access the hidden inventory? - var/scan_id = 1 - var/obj/item/coin/coin - var/obj/item/stack/spacecash/bill - - var/static/vending_cache = list() //used for storing the icons of items being vended - + ///Small ad messages in the vending screen - random chance of popping up whenever you open it + var/list/small_ads = list() var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. + ///Message sent post vend (Thank you for shopping!) + var/vend_reply + ///Last world tick we sent a vent reply + var/last_reply + ///Last world tick we sent a slogan message out + var/last_slogan + var/last_shopper + var/tilted = FALSE + var/tiltable = TRUE + var/squish_damage = 75 + var/forcecrit = 0 + var/num_shards = 7 + var/list/pinned_mobs = list() + ///How many ticks until we can send another + var/slogan_delay = 6000 + ///Icon when vending an item to the user + var/icon_vend + ///Icon to flash when user is denied a vend + var/icon_deny + ///World ticks the machine is electified for + var/seconds_electrified = MACHINE_NOT_ELECTRIFIED + ///When this is TRUE, we fire items at customers! We're broken! + var/shoot_inventory + ///How likely this is to happen (prob 100) + var/shoot_inventory_chance = 2 + //Stop spouting those godawful pitches! + var/shut_up + ///can we access the hidden inventory? + var/extended_inventory + ///Are we checking the users ID + var/scan_id = TRUE + var/obj/item/coin/coin + ///Default price of items if not overridden + var/default_price = 25 + ///Default price of premium items if not overridden + var/extra_price = 50 + ///cost multiplier per department or access + var/list/cost_multiplier_per_dept = list() + /** + * Is this item on station or not + * + * if it doesn't originate from off-station during mapload, everything is free + */ + var/onstation = TRUE //if it doesn't originate from off-station during mapload, everything is free + ///A variable to change on a per instance basis on the map that allows the instance to force cost and ID requirements + var/onstation_override = FALSE //change this on the object on the map to override the onstation check. DO NOT APPLY THIS GLOBALLY. - var/obj/item/vending_refill/refill_canister = null //The type of refill canisters used by this machine. + ///ID's that can load this vending machine wtih refills + var/list/canload_access_list -/obj/machinery/vending/Initialize() + + var/list/vending_machine_input = list() + ///Display header on the input view + var/input_display_header = "Custom Vendor" + + //The type of refill canisters used by this machine. + var/obj/item/vending_refill/refill_canister = null + + /// how many items have been inserted in a vendor + var/loaded_items = 0 + + ///Name of lighting mask for the vending machine + var/light_mask + +/obj/item/circuitboard + ///determines if the circuit board originated from a vendor off station or not. + var/onstation = TRUE + +/** + * Initialize the vending machine + * + * Builds the vending machine inventory, sets up slogans and other such misc work + * + * This also sets the onstation var to: + * * FALSE - if the machine was maploaded on a zlevel that doesn't pass the is_station_level check + * * TRUE - all other cases + */ +/obj/machinery/vending/Initialize(mapload) var/build_inv = FALSE if(!refill_canister) circuit = null @@ -90,13 +193,23 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. last_slogan = world.time + rand(0, slogan_delay) power_change() + if(onstation_override) //overrides the checks if true. + onstation = TRUE + return + if(mapload && !is_station_level(z)) //check if it was initially created off station during mapload. + onstation = FALSE + if(circuit) + circuit.onstation = onstation //sync up the circuit so the pricing schema is carried over if it's reconstructed. + else if(circuit && (circuit.onstation != onstation)) //check if they're not the same to minimize the amount of edited values. + onstation = circuit.onstation //if it was constructed outside mapload, sync the vendor up with the circuit's var so you can't bypass price requirements by moving / reconstructing it off station. /obj/machinery/vending/Destroy() QDEL_NULL(wires) - QDEL_NULL(coin) - QDEL_NULL(bill) return ..() +/obj/machinery/vending/can_speak() + return !shut_up + /obj/machinery/vending/RefreshParts() //Better would be to make constructable child if(!component_parts) return @@ -118,34 +231,65 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C else ..() -/obj/machinery/vending/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) - stat |= BROKEN +/obj/machinery/vending/update_icon_state() + if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" + set_light(0) + else if(powered()) + icon_state = initial(icon_state) + set_light(1.4) + else + icon_state = "[initial(icon_state)]-off" + set_light(0) - var/dump_amount = 0 - var/found_anything = TRUE - while (found_anything) - found_anything = FALSE - for(var/record in shuffle(product_records)) - var/datum/data/vending_product/R = record - if(R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if(!dump_path) - continue - R.amount-- - // busting open a vendor will destroy some of the contents - if(found_anything && prob(80)) - continue - var/obj/O = new dump_path(loc) - step(O, pick(GLOB.alldirs)) - found_anything = TRUE - dump_amount++ - if (dump_amount >= 16) - return +/obj/machinery/vending/update_overlays() + . = ..() + if(!light_mask) + return + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + if(!(stat & BROKEN) && powered()) + SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) + +/obj/machinery/vending/obj_break(damage_flag) + . = ..() + if(!.) + return + + var/dump_amount = 0 + var/found_anything = TRUE + while (found_anything) + found_anything = FALSE + for(var/record in shuffle(product_records)) + var/datum/data/vending_product/R = record + if(R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if(!dump_path) + continue + R.amount-- + // busting open a vendor will destroy some of the contents + if(found_anything && prob(80)) + continue + + var/obj/O = new dump_path(loc) + step(O, pick(GLOB.alldirs)) + found_anything = TRUE + dump_amount++ + if (dump_amount >= 16) + return + +GLOBAL_LIST_EMPTY(vending_products) +/** + * Build the inventory of the vending machine from it's product and record lists + * + * This builds up a full set of /datum/data/vending_products from the product list of the vending machine type + * Arguments: + * * productlist - the list of products that need to be converted + * * recordlist - the list containing /datum/data/vending_product datums + * * startempty - should we set vending_product record amount from the product list (so it's prefilled at roundstart) + */ /obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE) for(var/typepath in productlist) var/amount = productlist[typepath] @@ -154,13 +298,23 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/atom/temp = typepath var/datum/data/vending_product/R = new /datum/data/vending_product() + GLOB.vending_products[typepath] = 1 R.name = initial(temp.name) R.product_path = typepath if(!start_empty) R.amount = amount R.max_amount = amount + R.custom_price = initial(temp.custom_price) + R.custom_premium_price = initial(temp.custom_premium_price) recordlist += R - +/** + * Refill a vending machine from a refill canister + * + * This takes the products from the refill canister and then fills the products,contraband and premium product categories + * + * Arguments: + * * canister - the vending canister we are refilling from + */ /obj/machinery/vending/proc/restock(obj/item/vending_refill/canister) if (!canister.products) canister.products = products.Copy() @@ -172,7 +326,13 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . += refill_inventory(canister.products, product_records) . += refill_inventory(canister.contraband, hidden_records) . += refill_inventory(canister.premium, coin_records) - +/** + * Refill our inventory from the passed in product list into the record list + * + * Arguments: + * * productlist - list of types -> amount + * * recordlist - existing record datums + */ /obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist) . = 0 for(var/R in recordlist) @@ -182,7 +342,11 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C productlist[record.product_path] -= diff record.amount += diff . += diff - +/** + * Set up a refill canister that matches this machines products + * + * This is used when the machine is deconstructed, so the items aren't "lost" + */ /obj/machinery/vending/proc/update_canister() if (!component_parts) return @@ -190,12 +354,14 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/obj/item/vending_refill/R = locate() in component_parts if (!R) CRASH("Constructible vending machine did not have a refill canister") - return R.products = unbuild_inventory(product_records) R.contraband = unbuild_inventory(hidden_records) R.premium = unbuild_inventory(coin_records) +/** + * Given a record list, go through and and return a list of type -> amount + */ /obj/machinery/vending/proc/unbuild_inventory(list/recordlist) . = list() for(var/R in recordlist) @@ -209,11 +375,15 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C return TRUE /obj/machinery/vending/wrench_act(mob/living/user, obj/item/I) + ..() if(panel_open) default_unfasten_wrench(user, I, time = 60) + unbuckle_all_mobs(TRUE) return TRUE /obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/I) + if(..()) + return TRUE if(anchored) default_deconstruction_screwdriver(user, icon_state, icon_state, I) cut_overlays() @@ -228,56 +398,220 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C if(panel_open && is_wire_tool(I)) wires.interact(user) return - else if(istype(I, /obj/item/coin)) - if(coin) - to_chat(user, "[src] already has [coin] inserted") - return - if(bill) - to_chat(user, "[src] already has [bill] inserted") - return - if(!premium.len) - to_chat(user, "[src] doesn't have a coin slot.") - return - if(!user.transferItemToLoc(I, src)) - return - coin = I - to_chat(user, "You insert [I] into [src].") - return - else if(istype(I, /obj/item/stack/spacecash)) - if(coin) - to_chat(user, "[src] already has [coin] inserted") - return - if(bill) - to_chat(user, "[src] already has [bill] inserted") - return - var/obj/item/stack/S = I - if(!premium.len) - to_chat(user, "[src] doesn't have a bill slot.") - return - S.use(1) - bill = new S.type(src, 1) - to_chat(user, "You insert [I] into [src].") - return - else if(refill_canister && istype(I, refill_canister)) + if(refill_canister && istype(I, refill_canister)) if (!panel_open) - to_chat(user, "You should probably unscrew the service panel first.") + to_chat(user, "You should probably unscrew the service panel first!") else if (stat & (BROKEN|NOPOWER)) to_chat(user, "[src] does not respond.") else //if the panel is open we attempt to refill the machine var/obj/item/vending_refill/canister = I if(canister.get_part_rating() == 0) - to_chat(user, "[canister] is empty!") + to_chat(user, "[canister] is empty!") else // instantiate canister if needed var/transferred = restock(canister) if(transferred) to_chat(user, "You loaded [transferred] items in [src].") else - to_chat(user, "There's nothing to restock!") + to_chat(user, "There's nothing to restock!") return + + if(compartmentLoadAccessCheck(user) && user.a_intent != INTENT_HARM) + if(canLoadItem(I)) + loadingAttempt(I,user) + updateUsrDialog() //can't put this on the proc above because we spam it below + + if(istype(I, /obj/item/storage/bag)) //trays USUALLY + var/obj/item/storage/T = I + var/loaded = 0 + var/denied_items = 0 + for(var/obj/item/the_item in T.contents) + if(contents.len >= MAX_VENDING_INPUT_AMOUNT) // no more than 30 item can fit inside, legacy from snack vending although not sure why it exists + to_chat(user, "[src]'s compartment is full.") + break + if(canLoadItem(the_item) && loadingAttempt(the_item,user)) + SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, the_item, src, TRUE) + loaded++ + else + denied_items++ + if(denied_items) + to_chat(user, "[src] refuses some items!") + if(loaded) + to_chat(user, "You insert [loaded] dishes into [src]'s compartment.") + updateUsrDialog() else - return ..() + . = ..() + if(tiltable && !tilted && I.force) + switch(rand(1, 100)) + if(1 to 5) + freebie(user, 3) + if(6 to 15) + freebie(user, 2) + if(16 to 25) + freebie(user, 1) + if(76 to 90) + tilt(user) + if(91 to 100) + tilt(user, crit=TRUE) + +/obj/machinery/vending/proc/freebie(mob/fatty, freebies) + visible_message("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!") + + for(var/i in 1 to freebies) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) + for(var/datum/data/vending_product/R in shuffle(product_records)) + + if(R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if(!dump_path) + continue + + R.amount-- + new dump_path(get_turf(src)) + break + +/obj/machinery/vending/proc/tilt(mob/fatty, crit=FALSE) + visible_message("[src] tips over!") + tilted = TRUE + layer = ABOVE_MOB_LAYER + + var/crit_case + if(crit) + crit_case = rand(1,5) + + if(forcecrit) + crit_case = forcecrit + + if(in_range(fatty, src)) + for(var/mob/living/L in get_turf(fatty)) + var/mob/living/carbon/C = L + + if(istype(C)) + var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits + + if(crit_case != 5) // the head asplode case has its own description + C.visible_message("[C] is crushed by [src]!", \ + "You are crushed by [src]!") + + switch(crit_case) // only carbons can have the fun crits + if(1) // shatter their legs and bleed 'em + crit_rebate = 60 + C.bleed(150) + var/obj/item/bodypart/l_leg/l = C.get_bodypart(BODY_ZONE_L_LEG) + if(l) + l.receive_damage(brute=200, updating_health=TRUE) + var/obj/item/bodypart/r_leg/r = C.get_bodypart(BODY_ZONE_R_LEG) + if(r) + r.receive_damage(brute=200, updating_health=TRUE) + if(l || r) + C.visible_message("[C]'s legs shatter with a sickening crunch!", \ + "Your legs shatter with a sickening crunch!") + if(2) // pin them beneath the machine until someone untilts it + forceMove(get_turf(C)) + buckle_mob(C, force=TRUE) + C.visible_message("[C] is pinned underneath [src]!", \ + "You are pinned down by [src]!") + if(3) // glass candy + crit_rebate = 50 + for(var/i = 0, i < num_shards, i++) + var/obj/item/shard/shard = new /obj/item/shard(get_turf(C)) + shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5) + shard.updateEmbedding() + C.hitby(shard, skipcatch = TRUE, hitpush = FALSE) + shard.embedding = list() + shard.updateEmbedding() + if(4) // paralyze this binch + // the new paraplegic gets like 4 lines of losing their legs so skip them + visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C)) + C.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) + if(5) // skull squish! + var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD) + if(O) + C.visible_message("[O] explodes in a shower of gore beneath [src]!", \ + "Oh f-") + O.dismember() + O.drop_organs() + qdel(O) + new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) + + C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) + C.AddElement(/datum/element/squish, 18 SECONDS) + else + L.visible_message("[L] is crushed by [src]!", \ + "You are crushed by [src]!") + L.apply_damage(squish_damage, forced=TRUE) + if(crit_case) + L.apply_damage(squish_damage, forced=TRUE) + + L.Paralyze(60) + L.emote("scream") + playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE) + playsound(L, 'sound/effects/splat.ogg', 50, TRUE) + + var/matrix/M = matrix() + M.Turn(pick(90, 270)) + transform = M + + if(get_turf(fatty) != get_turf(src)) + throw_at(get_turf(fatty), 1, 1, spin=FALSE) + +/obj/machinery/vending/proc/untilt(mob/user) + user.visible_message("[user] rights [src].", \ + "You right [src].") + + unbuckle_all_mobs(TRUE) + + tilted = FALSE + layer = initial(layer) + + var/matrix/M = matrix() + M.Turn(0) + transform = M + +/obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user) + . = TRUE + if(!user.transferItemToLoc(I, src)) + return FALSE + if(vending_machine_input[format_text(I.name)]) + vending_machine_input[format_text(I.name)]++ + else + vending_machine_input[format_text(I.name)] = 1 + to_chat(user, "You insert [I] into [src]'s input compartment.") + loaded_items++ + + +/obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force=FALSE) + if(!force) + return + . = ..() + +/** + * Is the passed in user allowed to load this vending machines compartments + * + * Arguments: + * * user - mob that is doing the loading of the vending machine + */ +/obj/machinery/vending/proc/compartmentLoadAccessCheck(mob/user) + if(!canload_access_list) + return TRUE + else + var/do_you_have_access = FALSE + var/req_access_txt_holder = req_access_txt + for(var/i in canload_access_list) + req_access_txt = i + if(!allowed(user) && !(obj_flags & EMAGGED) && scan_id) + continue + else + do_you_have_access = TRUE + break //you passed don't bother looping anymore + req_access_txt = req_access_txt_holder // revert to normal (before the proc ran) + if(do_you_have_access) + return TRUE + else + to_chat(user, "[src]'s input compartment blinks red: Access denied.") + return FALSE /obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) if(!istype(W)) @@ -297,7 +631,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C else display_parts(user) if(moved) - to_chat(user, "[moved] items restocked.") + to_chat(user, "[moved] items restocked.") W.play_rped_sound() return TRUE @@ -317,190 +651,166 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C if(seconds_electrified && !(stat & NOPOWER)) if(shock(user, 100)) return + if(tilted && !user.buckled && !isAI(user)) + to_chat(user, "You begin righting [src].") + if(do_after(user, 50, target=src)) + untilt(user) + return return ..() -/obj/machinery/vending/ui_interact(mob/user) - var/dat = "" +/obj/machinery/vending/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/vending) + assets.send(user) + ui = new(user, src, ui_key, "vending", name, 450, 600, master_ui, state) + ui.open() - dat += "

    Select an item

    " - dat += "
    " - if(!product_records.len) - dat += "No product loaded!" - else - var/list/display_records = product_records - if(extended_inventory) - display_records = product_records + hidden_records - if(coin || bill) - display_records = product_records + coin_records - if((coin || bill) && extended_inventory) - display_records = product_records + hidden_records + coin_records - dat += "" - for (var/datum/data/vending_product/R in display_records) - dat += "" - dat += "" - if(R.amount > 0) - dat += "" - else - dat += "" - dat += "" - dat += "
    [sanitize(R.name)][R.amount] VendVend
    " - dat += "
    " - if(premium.len > 0) - dat += "Change Return: " - if (coin || bill) - dat += "[(coin ? coin : "")][(bill ? bill : "")]  Remove" +/obj/machinery/vending/ui_static_data(mob/user) + . = list() + .["onstation"] = onstation + .["product_records"] = list() + for (var/datum/data/vending_product/R in product_records) + var/list/data = list( + path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"), + name = R.name, + price = R.custom_price || default_price, + max_amount = R.max_amount, + ref = REF(R) + ) + .["product_records"] += list(data) + .["coin_records"] = list() + for (var/datum/data/vending_product/R in coin_records) + var/list/data = list( + path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"), + name = R.name, + price = R.custom_premium_price || extra_price, + max_amount = R.max_amount, + ref = REF(R), + premium = TRUE + ) + .["coin_records"] += list(data) + .["hidden_records"] = list() + for (var/datum/data/vending_product/R in hidden_records) + var/list/data = list( + path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"), + name = R.name, + price = R.custom_price || default_price, + max_amount = R.max_amount, + ref = REF(R), + premium = TRUE + ) + .["hidden_records"] += list(data) + +/obj/machinery/vending/ui_data(mob/user) + . = list() + var/obj/item/card/id/C = user.get_idcard(TRUE) + .["cost_mult"] = 1 + .["cost_text"] = "" + if(C && C.registered_account) + .["user"] = list() + .["user"]["name"] = C.registered_account.account_holder + .["user"]["cash"] = C.registered_account.account_balance + if(C.registered_account.account_job) + .["user"]["job"] = C.registered_account.account_job.title else - dat += "No money  Remove" - if(istype(src, /obj/machinery/vending/snack)) - dat += "

    Chef's Food Selection

    " - dat += "
    " - for (var/O in dish_quants) - if(dish_quants[O] > 0) - var/N = dish_quants[O] - dat += "Dispense " - dat += "[capitalize(O)]: [N]
    " - dat += "
    " - - var/datum/browser/popup = new(user, "vending", (name)) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - -/obj/machinery/vending/proc/GetIconForProduct(datum/data/vending_product/P) - if(vending_cache[P.product_path]) - return vending_cache[P.product_path] - var/product = new P.product_path() - vending_cache[P.product_path] = icon2base64(getFlatIcon(product, no_anim = TRUE)) - qdel(product) - return vending_cache[P.product_path] - -/obj/machinery/vending/Topic(href, href_list) - if(..()) - return - - if(href_list["remove_coin"]) - if(!(coin || bill)) - to_chat(usr, "There is no money in this machine.") - return - if(coin) - usr.put_in_hands(coin) - to_chat(usr, "You remove [coin] from [src].") - coin = null - if(bill) - usr.put_in_hands(bill) - to_chat(usr, "You remove [bill] from [src].") - bill = null - - - usr.set_machine(src) - - if((href_list["dispense"]) && (vend_ready)) - var/N = href_list["dispense"] - if(dish_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. - return - vend_ready = 0 - use_power(5) - - dish_quants[N] = max(dish_quants[N] - 1, 0) - for(var/obj/O in contents) - if(O.name == N) - O.forceMove(drop_location()) - break - vend_ready = 1 - updateUsrDialog() - return - - if((href_list["vend"]) && (vend_ready)) - if(panel_open) - to_chat(usr, "The vending machine cannot dispense products while its service panel is open!") - return - - if((!allowed(usr)) && !(obj_flags & EMAGGED) && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(usr, "Access denied." ) - flick(icon_deny,src) - return - - vend_ready = 0 //One thing at a time!! - - var/datum/data/vending_product/R = locate(href_list["vend"]) - if(!R || !istype(R) || !R.product_path) - vend_ready = 1 - return - - if(R in hidden_records) - if(!extended_inventory) - vend_ready = 1 - return - else if(R in coin_records) - if(!(coin || bill)) - to_chat(usr, "You need to insert money to get this item!") - vend_ready = 1 - return - if(coin && coin.string_attached) - if(prob(50)) - if(usr.CanReach(src)) - if(usr.put_in_hands(coin)) - to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.") - coin = null - else - to_chat(usr, "You couldn't pull [coin] out because your hands are full!") - QDEL_NULL(coin) - else - to_chat(usr, "You successfully pull [coin] out of [src] to the floor.") - coin = null - else - to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!") - QDEL_NULL(coin) + .["user"]["job"] = "No Job" + var/cost_mult = get_best_discount(C) + if(cost_mult != 1) + .["cost_mult"] = cost_mult + if(cost_mult < 1) + .["cost_text"] = " ([(1 - cost_mult) * 100]% OFF)" else - QDEL_NULL(coin) - QDEL_NULL(bill) + .["cost_text"] = " ([(cost_mult - 1) * 100]% EXTRA)" + .["stock"] = list() + for (var/datum/data/vending_product/R in product_records + coin_records + hidden_records) + .["stock"][R.name] = R.amount + . + .["extended_inventory"] = extended_inventory - else if (!(R in product_records)) - vend_ready = 1 - message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!") - return - - if (R.amount <= 0) - to_chat(usr, "Sold out.") - vend_ready = 1 - return - else +/obj/machinery/vending/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("vend") + . = TRUE + if(!vend_ready) + return + if(panel_open) + to_chat(usr, "The vending machine cannot dispense products while its service panel is open!") + return + vend_ready = FALSE //One thing at a time!! + var/datum/data/vending_product/R = locate(params["ref"]) + var/list/record_to_check = product_records + coin_records + if(extended_inventory) + record_to_check = product_records + coin_records + hidden_records + if(!R || !istype(R) || !R.product_path) + vend_ready = TRUE + return + var/price_to_use = R.custom_price || default_price + if(R in hidden_records) + if(!extended_inventory) + vend_ready = TRUE + return + else if (!(R in record_to_check)) + vend_ready = TRUE + message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!") + return + if (R.amount <= 0) + say("Sold out of [R.name].") + flick(icon_deny,src) + vend_ready = TRUE + return + if(onstation && price_to_use >= 0) + var/obj/item/card/id/C = usr.get_idcard(TRUE) + if(!C) + say("No card found.") + flick(icon_deny,src) + vend_ready = TRUE + return + else if (!C.registered_account) + say("No account found.") + flick(icon_deny,src) + vend_ready = TRUE + return + var/datum/bank_account/account = C.registered_account + if(coin_records.Find(R)) + price_to_use = R.custom_premium_price || extra_price + else if(!hidden_records.Find(R)) + price_to_use = round(price_to_use * get_best_discount(C)) + if(price_to_use && !account.adjust_money(-price_to_use)) + say("You do not possess the funds to purchase [R.name].") + flick(icon_deny,src) + vend_ready = TRUE + return + var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) + if(D) + D.adjust_money(price_to_use) + if(last_shopper != usr || purchase_message_cooldown < world.time) + say("Thank you for shopping with [src]!") + purchase_message_cooldown = world.time + 5 SECONDS + last_shopper = usr + use_power(5) + if(icon_vend) //Show the vending animation if needed + flick(icon_vend,src) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) + var/obj/item/vended = new R.product_path(get_turf(src)) R.amount-- - - if(((last_reply + 200) <= world.time) && vend_reply) - speak(vend_reply) - last_reply = world.time - - use_power(5) - if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) - var/vended = new R.product_path(get_turf(src)) - if(usr.CanReach(src)) - if(usr.put_in_hands(vended)) + if(usr.CanReach(src) && usr.put_in_hands(vended)) to_chat(usr, "You take [R.name] out of the slot.") else to_chat(usr, "[capitalize(R.name)] falls onto the floor!") - else - to_chat(usr, "[capitalize(R.name)] falls onto the floor!") - SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) - vend_ready = 1 - - updateUsrDialog() - return - - else if(href_list["togglevoice"] && panel_open) - shut_up = !shut_up - - updateUsrDialog() - + SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) + vend_ready = TRUE /obj/machinery/vending/process() if(stat & (BROKEN|NOPOWER)) - return + return PROCESS_KILL if(!active) return - if(seconds_electrified > 0) + if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- //Pitch to the people! Really sell it! @@ -511,7 +821,14 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C if(shoot_inventory && prob(shoot_inventory_chance)) throw_item() - +/** + * Speak the given message verbally + * + * Checks if the machine is powered and the message exists + * + * Arguments: + * * message - the message to speak + */ /obj/machinery/vending/proc/speak(message) if(stat & (BROKEN|NOPOWER)) return @@ -520,48 +837,81 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C say(message) +/** + * Gets the best discount from a given ID card, comparing its access and paycheck depart with cost_multiplier_per_dept. + * It only applies to the regular selection, not premium or contraband. And a bank account is still required. + * But it can also be used to charge more to certain departments or accesses. :) + * + * Arguments: + * * list/dept_access_list - the list to compare + */ +/obj/machinery/vending/proc/get_best_discount(obj/item/card/id/C) + var/list/discounts = NUMLIST2TEXTLIST(C.GetAccess()) + if(C.registered_account?.account_job) + discounts += C.registered_account.account_job.paycheck_department + discounts &= cost_multiplier_per_dept + if(!length(discounts)) + return 1 + . = INFINITY + for(var/k in discounts) + . = min(cost_multiplier_per_dept[k], .) + /obj/machinery/vending/power_change() - if(stat & BROKEN) - icon_state = "[initial(icon_state)]-broken" - else - if(powered()) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - icon_state = "[initial(icon_state)]-off" - stat |= NOPOWER + . = ..() + if(powered()) + START_PROCESSING(SSmachines, src) //Somebody cut an important wire and now we're following a new definition of "pitch." +/** + * Throw an item from our internal inventory out in front of us + * + * This is called when we are hacked, it selects a random product from the records that has an amount > 0 + * This item is then created and tossed out in front of us with a visible message + */ /obj/machinery/vending/proc/throw_item() var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) + var/mob/living/target = locate() in view(7, src) if(!target) - return 0 - + return FALSE for(var/datum/data/vending_product/R in shuffle(product_records)) if(R.amount <= 0) //Try to use a record that actually has something to dump. continue var/dump_path = R.product_path if(!dump_path) continue - R.amount-- throw_item = new dump_path(loc) break if(!throw_item) - return 0 + return FALSE pre_throw(throw_item) throw_item.throw_at(target, 16, 3) visible_message("[src] launches [throw_item] at [target]!") - return 1 - + return TRUE +/** + * A callback called before an item is tossed out + * + * Override this if you need to do any special case handling + * + * Arguments: + * * I - obj/item being thrown + */ /obj/machinery/vending/proc/pre_throw(obj/item/I) return - -/obj/machinery/vending/proc/shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock +/** + * Shock the passed in user + * + * This checks we have power and that the passed in prob is passed, then generates some sparks + * and calls electrocute_mob on the user + * + * Arguments: + * * user - the user to shock + * * prb - probability the shock happens + */ +/obj/machinery/vending/proc/shock(mob/living/user, prb) + if(!istype(user) || stat & (BROKEN|NOPOWER)) // unpowered, no shock return FALSE if(!prob(prb)) return FALSE @@ -571,6 +921,208 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C return TRUE else return FALSE +/** + * Are we able to load the item passed in + * + * Arguments: + * * I - the item being loaded + * * user - the user doing the loading + */ +/obj/machinery/vending/proc/canLoadItem(obj/item/I, mob/user) + return FALSE /obj/machinery/vending/onTransitZ() return + +/obj/machinery/vending/custom + name = "Custom Vendor" + icon_state = "robotics" + icon_deny = "robotics-deny" + max_integrity = 400 + payment_department = NO_FREEBIES + refill_canister = /obj/item/vending_refill/custom + /// where the money is sent + var/datum/bank_account/private_a + /// max number of items that the custom vendor can hold + var/max_loaded_items = 20 + /// Base64 cache of custom icons. + var/list/base64_cache = list() + +/obj/machinery/vending/custom/compartmentLoadAccessCheck(mob/user) + . = FALSE + var/mob/living/carbon/human/H + var/obj/item/card/id/C + if(ishuman(user)) + H = user + C = H.get_idcard(FALSE) + if(C?.registered_account && C.registered_account == private_a) + return TRUE + +/obj/machinery/vending/custom/canLoadItem(obj/item/I, mob/user) + . = FALSE + if(loaded_items >= max_loaded_items) + say("There are too many items in stock.") + return + if(istype(I, /obj/item/stack)) + say("Loose items may cause problems, try use it inside wrapping paper.") + return + if(I.custom_price) + return TRUE + +/obj/machinery/vending/custom/ui_data(mob/user) + . = ..() + .["access"] = compartmentLoadAccessCheck(user) + .["vending_machine_input"] = list() + for (var/O in vending_machine_input) + if(vending_machine_input[O] > 0) + var/base64 + var/price = 0 + for(var/obj/T in contents) + if(T.name == O) + price = T.custom_price + if(!base64) + if(base64_cache[T.type]) + base64 = base64_cache[T.type] + else + base64 = icon2base64(icon(T.icon, T.icon_state)) + base64_cache[T.type] = base64 + break + var/list/data = list( + name = O, + price = price, + img = base64 + ) + .["vending_machine_input"] += list(data) + +/obj/machinery/vending/custom/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("dispense") + . = TRUE + if(!vend_ready) + return + var/N = params["item"] + var/obj/S + vend_ready = FALSE + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + var/obj/item/card/id/C = H.get_idcard(TRUE) + + if(!C) + say("No card found.") + flick(icon_deny,src) + vend_ready = TRUE + return + else if (!C.registered_account) + say("No account found.") + flick(icon_deny,src) + vend_ready = TRUE + return + var/datum/bank_account/account = C.registered_account + for(var/obj/O in contents) + if(O.name == N) + S = O + break + if(S) + if(compartmentLoadAccessCheck(usr)) + vending_machine_input[N] = max(vending_machine_input[N] - 1, 0) + S.forceMove(drop_location()) + loaded_items-- + use_power(5) + vend_ready = TRUE + updateUsrDialog() + return + if(account.has_money(S.custom_price)) + account.adjust_money(-S.custom_price) + var/datum/bank_account/owner = private_a + if(owner) + owner.adjust_money(S.custom_price) + vending_machine_input[N] = max(vending_machine_input[N] - 1, 0) + S.forceMove(drop_location()) + loaded_items-- + use_power(5) + if(last_shopper != usr || purchase_message_cooldown < world.time) + say("Thank you for buying local and purchasing [S]!") + purchase_message_cooldown = world.time + 5 SECONDS + last_shopper = usr + vend_ready = TRUE + updateUsrDialog() + return + else + say("You do not possess the funds to purchase this.") + vend_ready = TRUE + +/obj/machinery/vending/custom/attackby(obj/item/I, mob/user, params) + if(!private_a) + var/mob/living/carbon/human/H + var/obj/item/card/id/C + if(ishuman(user)) + H = user + C = H.get_idcard(TRUE) + if(C?.registered_account) + private_a = C.registered_account + say("[src] has been linked to [C].") + + if(compartmentLoadAccessCheck(user)) + if(istype(I, /obj/item/pen)) + name = stripped_input(user,"Set name","Name", name, 20) + desc = stripped_input(user,"Set description","Description", desc, 60) + slogan_list += stripped_input(user,"Set slogan","Slogan","Epic", 60) + last_slogan = world.time + rand(0, slogan_delay) + return + + if(canLoadItem(I)) + loadingAttempt(I,user) + updateUsrDialog() + return + + if(panel_open && is_wire_tool(I)) + wires.interact(user) + return + + return ..() + +/obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/I) + return FALSE + +/obj/machinery/vending/custom/Destroy() + unbuckle_all_mobs(TRUE) + var/turf/T = get_turf(src) + if(T) + for(var/obj/item/I in contents) + I.forceMove(T) + explosion(T, -1, 0, 3) + return ..() + +/obj/machinery/vending/custom/unbreakable + name = "Indestructible Vendor" + resistance_flags = INDESTRUCTIBLE + +/obj/item/vending_refill/custom + machine_name = "Custom Vendor" + icon_state = "refill_custom" + custom_premium_price = 100 + +/obj/item/price_tagger + name = "price tagger" + desc = "This tool is used to set a price for items used in custom vendors." + icon = 'icons/obj/device.dmi' + icon_state = "pricetagger" + custom_premium_price = 25 + ///the price of the item + var/price = 1 + +/obj/item/price_tagger/attack_self(mob/user) + price = max(1, round(input(user,"set price","price") as num|null, 1)) + to_chat(user, " The [src] will now give things a [price] cr tag.") + +/obj/item/price_tagger/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity) + return + if(isitem(target)) + var/obj/item/I = target + I.custom_price = price + to_chat(user, "You set the price of [I] to [price] cr.") diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 5dafd3935c..92e40bc3a8 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -14,11 +14,15 @@ /obj/item/stock_parts/cell/upgraded = 2) premium = list(/obj/item/stock_parts/cell/upgraded/plus = 2, /obj/item/flashlight/lantern = 2, - /obj/item/beacon = 2) + /obj/item/beacon = 2, + /obj/item/airlock_painter/decal = 5) product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/assist resistance_flags = FIRE_PROOF + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_ALMOST_CHEAP + payment_department = NO_FREEBIES /obj/item/vending_refill/assist - icon_state = "refill_engi" \ No newline at end of file + icon_state = "refill_engi" diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 2eaf24c493..9dfb4c76a0 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -3,7 +3,6 @@ desc = "A vending machine for costumes." icon_state = "theater" icon_deny = "theater-deny" - req_access = list(ACCESS_THEATRE) product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!" vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, @@ -124,7 +123,7 @@ /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman/fake = 1, /obj/item/skub = 1, - /obj/item/clothing/under/costume/lobster = 1, // CIT CHANGES + /obj/item/clothing/under/costume/lobster = 1, /obj/item/clothing/head/lobsterhat = 1, /obj/item/clothing/head/drfreezehat = 1, /obj/item/clothing/suit/dracula = 1, @@ -137,12 +136,19 @@ /obj/item/clothing/under/costume/christmas/croptop/green = 3, /obj/item/clothing/head/christmashat = 3, /obj/item/clothing/head/christmashatg = 3, - /obj/item/clothing/under/costume/drfreeze = 1) //End of Cit Changes - refill_canister = /obj/item/vending_refill/autodrobe + /obj/item/clothing/under/costume/drfreeze = 1) -/obj/machinery/vending/autodrobe/all_access - desc = "A vending machine for costumes. This model appears to have no access restrictions." - req_access = null + refill_canister = /obj/item/vending_refill/autodrobe + default_price = PRICE_ALMOST_CHEAP + extra_price = PRICE_ALMOST_EXPENSIVE + payment_department = ACCOUNT_SRV + +/obj/machinery/vending/autodrobe/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_THEATRE]" = 0) + +/obj/machinery/vending/autodrobe/canLoadItem(obj/item/I,mob/user) + return (I.type in products) /obj/item/vending_refill/autodrobe machine_name = "AutoDrobe" diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 5a6380c322..97efbecb77 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -4,7 +4,7 @@ icon_state = "boozeomat" icon_deny = "boozeomat-deny" products = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 30, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12, /obj/item/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/reagent_containers/food/drinks/bottle/tequila = 5, @@ -39,12 +39,11 @@ /obj/item/reagent_containers/food/drinks/bottle/trappist = 5) product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" - req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat - -/obj/machinery/vending/boozeomat/all_access - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. This model appears to have no access restrictions." - req_access = null + default_price = PRICE_ALMOST_CHEAP + extra_price = PRICE_EXPENSIVE + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/machinery/vending/boozeomat/pubby_maint //abandoned bar on Pubbystation products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, @@ -56,7 +55,6 @@ /obj/item/reagent_containers/food/drinks/ice = 3, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 6, /obj/item/reagent_containers/food/drinks/flask = 1) - req_access = null /obj/machinery/vending/boozeomat/pubby_captain //Captain's quarters on Pubbystation products = list(/obj/item/reagent_containers/food/drinks/bottle/rum = 1, @@ -65,10 +63,17 @@ /obj/item/reagent_containers/food/drinks/drinkingglass = 6, /obj/item/reagent_containers/food/drinks/ice = 1, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 4); - req_access = list(ACCESS_CAPTAIN) + +/obj/machinery/vending/boozeomat/pubby_captain/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_CAPTAIN]" = 0) /obj/machinery/vending/boozeomat/syndicate_access - req_access = list(ACCESS_SYNDICATE) + payment_department = NO_FREEBIES + +/obj/machinery/vending/boozeomat/syndicate_access/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) /obj/item/vending_refill/boozeomat machine_name = "Booze-O-Mat" diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index 35b1a1da7a..beaf6bb873 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -10,12 +10,19 @@ /obj/item/cartridge/security = 10, /obj/item/cartridge/janitor = 10, /obj/item/cartridge/signal/toxins = 10, - /obj/item/pda/heads = 10, - /obj/item/cartridge/captain = 3, - /obj/item/cartridge/quartermaster = 10) + /obj/item/pda/heads = 10) + premium = list(/obj/item/cartridge/captain = 2, + /obj/item/cartridge/quartermaster = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/cart resistance_flags = FIRE_PROOF + default_price = PRICE_ALMOST_EXPENSIVE + extra_price = PRICE_ALMOST_ONE_GRAND + payment_department = ACCOUNT_SRV + +/obj/machinery/vending/cart/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_CHANGE_IDS]" = 0) /obj/item/vending_refill/cart icon_state = "refill_pda" diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index f567c9765e..0f26abde1d 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -20,6 +20,9 @@ /obj/item/storage/fancy/cigarettes/cigars/havana = 1, /obj/item/storage/fancy/cigarettes/cigars/cohiba = 1) refill_canister = /obj/item/vending_refill/cigarette + default_price = PRICE_ALMOST_CHEAP + extra_price = PRICE_ABOVE_NORMAL + payment_department = ACCOUNT_SRV /obj/machinery/vending/cigarette/syndicate products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7, @@ -30,6 +33,11 @@ /obj/item/storage/box/matches = 10, /obj/item/lighter/greyscale = 4, /obj/item/storage/fancy/rollingpapers = 5) + payment_department = NO_FREEBIES + +/obj/machinery/vending/cigarette/syndicate/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) /obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin name = "\improper ShadyCigs Ultra" diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 521c1e0999..963fff9368 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -173,6 +173,12 @@ /obj/item/clothing/suit/jacket/letterman_nanotrasen = 5, /obj/item/clothing/suit/hooded/wintercoat/polychromic = 5) refill_canister = /obj/item/vending_refill/clothing + default_price = PRICE_CHEAP + extra_price = PRICE_BELOW_NORMAL + payment_department = NO_FREEBIES + +/obj/machinery/vending/clothing/canLoadItem(obj/item/I,mob/user) + return (I.type in products) /obj/item/vending_refill/clothing machine_name = "ClothesMate" diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index 355d037f99..ab64756868 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -8,12 +8,14 @@ /obj/item/reagent_containers/food/drinks/mug/tea = 25, /obj/item/reagent_containers/food/drinks/mug/coco = 25) contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12) - premium = list(/obj/item/reagent_containers/food/snacks/chocolatebar = 3, - /obj/item/reagent_containers/food/condiment/milk = 2, + premium = list(/obj/item/reagent_containers/food/condiment/milk = 2, /obj/item/reagent_containers/food/drinks/bottle/cream = 2, /obj/item/reagent_containers/food/condiment/sugar = 1) refill_canister = /obj/item/vending_refill/coffee + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_PRETTY_CHEAP + payment_department = ACCOUNT_SRV /obj/item/vending_refill/coffee machine_name = "Solar's Best Hot Drinks" diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 57cf315209..b667f4c7c9 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -21,6 +21,9 @@ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1, /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 1) refill_canister = /obj/item/vending_refill/cola + default_price = PRICE_CHEAP_AS_FREE + extra_price = PRICE_ABOVE_NORMAL + payment_department = ACCOUNT_SRV /obj/item/vending_refill/cola machine_name = "Robust Softdrinks" diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/dinnerware.dm similarity index 84% rename from code/modules/vending/drinnerware.dm rename to code/modules/vending/dinnerware.dm index 8f257d07ec..b78af9c46b 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/dinnerware.dm @@ -20,15 +20,17 @@ /obj/item/reagent_containers/food/condiment/saltshaker = 5, /obj/item/reagent_containers/food/condiment/peppermill = 5) contraband = list( - /obj/item/reagent_containers/food/snacks/monkeycube = 1, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/syringe = 3) premium = list( - /obj/item/reagent_containers/food/condiment/enzyme = 1, - /obj/item/reagent_containers/glass/bottle/cryoxadone = 2) // Bartender can literally make this with upgraded parts, or it gets stolen from medical. + /obj/item/reagent_containers/food/condiment/enzyme = 1) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/dinnerware resistance_flags = FIRE_PROOF + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_ALMOST_EXPENSIVE + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/dinnerware - icon_state = "refill_cook" \ No newline at end of file + icon_state = "refill_cook" diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index e067c094f6..ef4edd6b67 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -4,7 +4,6 @@ desc = "Everything you need for do-it-yourself station repair." icon_state = "engi" icon_deny = "engi-deny" - req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/under/rank/engineering/chief_engineer = 4, /obj/item/clothing/under/rank/engineering/engineer = 4, /obj/item/clothing/shoes/sneakers/orange = 4, @@ -29,3 +28,7 @@ /obj/item/stock_parts/manipulator = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + default_price = PRICE_NORMAL + extra_price = PRICE_NORMAL + payment_department = ACCOUNT_ENG + cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 15da7cab15..50e0fb9cde 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -3,7 +3,6 @@ desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" icon_deny = "engivend-deny" - req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/glasses/meson/engine = 5, /obj/item/clothing/glasses/welding = 5, /obj/item/multitool = 5, @@ -16,6 +15,7 @@ /obj/item/electronics/airalarm = 10, /obj/item/electronics/firealarm = 10, /obj/item/electronics/firelock = 10, + /obj/item/airlock_painter/decal = 5, /obj/item/rcd_ammo = 3 ) contraband = list(/obj/item/stock_parts/cell/potato = 3, @@ -30,6 +30,10 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/engivend resistance_flags = FIRE_PROOF + default_price = PRICE_ALMOST_EXPENSIVE + extra_price = PRICE_ABOVE_EXPENSIVE + payment_department = ACCOUNT_ENG + cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) /obj/item/vending_refill/engivend - icon_state = "refill_engi" \ No newline at end of file + icon_state = "refill_engi" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 14ce7a83b7..7bed27b0bd 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -6,9 +6,16 @@ products = list(/obj/item/toy/cards/deck = 5, /obj/item/storage/pill_bottle/dice = 10, /obj/item/toy/cards/deck/cas = 3, - /obj/item/toy/cards/deck/cas/black = 3) + /obj/item/toy/cards/deck/cas/black = 3, + /obj/item/toy/cards/deck/unum = 3) contraband = list(/obj/item/dice/fudge = 9) + premium = list(/obj/item/melee/skateboard/pro = 3, + /obj/item/melee/skateboard/hoverboard = 1) refill_canister = /obj/item/vending_refill/games + default_price = PRICE_CHEAP + extra_price = PRICE_ALMOST_EXPENSIVE + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/games machine_name = "\improper Good Clean Fun" diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index acfeeddaa9..24fb685eac 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -20,7 +20,11 @@ /obj/item/clothing/under/misc/gear_harness = 10, /obj/item/dildo/custom = 5, /obj/item/electropack/shockcollar = 3, - /obj/item/assembly/signaler = 3 + /obj/item/assembly/signaler = 3, + /obj/item/clothing/under/shorts/polychromic/pantsu, + /obj/item/clothing/under/misc/poly_bottomless, + /obj/item/clothing/under/misc/poly_tanktop, + /obj/item/clothing/under/misc/poly_tanktop/female ) contraband = list( /obj/item/clothing/neck/petcollar/locked = 2, @@ -40,6 +44,9 @@ /obj/item/clothing/under/pants/chaps = 5 ) refill_canister = /obj/item/vending_refill/kink + default_price = PRICE_CHEAP + extra_price = PRICE_BELOW_NORMAL + payment_department = NO_FREEBIES /obj/item/vending_refill/kink machine_name = "KinkMate" diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index affc1dfed7..81afab3a70 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -28,3 +28,6 @@ /obj/item/reagent_containers/food/snacks/burger/superbite = 3) //U S A armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + default_price = PRICE_ABOVE_NORMAL + extra_price = PRICE_ABOVE_EXPENSIVE + payment_department = ACCOUNT_SEC diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index e2c97b32db..1ce0b6cfaf 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -25,3 +25,10 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft + default_price = PRICE_ABOVE_NORMAL + extra_price = PRICE_EXPENSIVE + payment_department = NO_FREEBIES + +/obj/machinery/vending/toyliberationstation/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index ab7670c453..9dcd77e4ab 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -16,3 +16,6 @@ contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50, "magic" = 100) resistance_flags = FIRE_PROOF + default_price = PRICE_EXPENSIVE + extra_price = PRICE_ABOVE_EXPENSIVE + payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index d32af7de03..fbd9a10bf2 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -4,7 +4,6 @@ icon_state = "med" icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" - req_access = list(ACCESS_MEDICAL) products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 4, @@ -47,6 +46,10 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/medical + default_price = PRICE_ALMOST_CHEAP + extra_price = PRICE_ABOVE_NORMAL + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) /obj/item/vending_refill/medical machine_name = "NanoMed Plus" @@ -54,4 +57,8 @@ /obj/machinery/vending/medical/syndicate_access name = "\improper SyndiMed Plus" - req_access = list(ACCESS_SYNDICATE) + payment_department = NO_FREEBIES + +/obj/machinery/vending/medical/syndicate_access/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_SYNDICATE]" = 0) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index a048d253c5..09719e1d56 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -18,6 +18,11 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/wallmed + default_price = PRICE_FREE + extra_price = PRICE_NORMAL + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) + tiltable = FALSE /obj/item/vending_refill/wallmed machine_name = "NanoMed" diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 37ce00069c..2eb68aaf4a 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -27,6 +27,7 @@ /obj/item/seeds/orange = 3, /obj/item/seeds/peach = 3, /obj/item/seeds/peanutseed = 3, + /obj/item/seeds/peas = 3, /obj/item/seeds/pineapple = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, @@ -57,6 +58,10 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/hydroseeds resistance_flags = FIRE_PROOF + default_price = PRICE_ALMOST_CHEAP + extra_price = PRICE_NORMAL + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/hydroseeds icon_state = "refill_hydro" diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm index 42b7848ac1..40ca06b78b 100644 --- a/code/modules/vending/nutrimax.dm +++ b/code/modules/vending/nutrimax.dm @@ -19,6 +19,10 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/hydronutrients resistance_flags = FIRE_PROOF + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_CHEAP + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/hydronutrients icon_state = "refill_hydro" diff --git a/code/modules/vending/plasmaresearch.dm b/code/modules/vending/plasmaresearch.dm index 40b709f5b5..bb16570ab3 100644 --- a/code/modules/vending/plasmaresearch.dm +++ b/code/modules/vending/plasmaresearch.dm @@ -11,3 +11,7 @@ /obj/item/assembly/prox_sensor = 6, /obj/item/assembly/igniter = 6) contraband = list(/obj/item/assembly/health = 3) + default_price = PRICE_EXPENSIVE + extra_price = PRICE_REALLY_EXPENSIVE + payment_department = ACCOUNT_SCI + cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 852b7d65f0..88f65506a6 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -4,7 +4,6 @@ desc = "All the tools you need to create your own robot army." icon_state = "robotics" icon_deny = "robotics-deny" - req_access = list(ACCESS_ROBOTICS) products = list(/obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/under/rank/rnd/roboticist = 4, /obj/item/stack/cable_coil = 4, @@ -21,3 +20,6 @@ /obj/item/crowbar = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + default_price = PRICE_EXPENSIVE + payment_department = ACCOUNT_SCI + cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 09681def64..35e4b3232a 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -4,7 +4,6 @@ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon_state = "sec" icon_deny = "sec-deny" - req_access = list(ACCESS_SECURITY) products = list(/obj/item/restraints/handcuffs = 8, /obj/item/restraints/handcuffs/cable/zipties = 10, /obj/item/grenade/flashbang = 4, @@ -16,15 +15,23 @@ /obj/item/secbat = 5) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, - /obj/item/ssword_kit = 1) + /obj/item/ssword_kit = 1, + /obj/item/storage/bag/ammo = 1) premium = list(/obj/item/coin/antagtoken = 1, /obj/item/clothing/head/helmet/blueshirt = 1, /obj/item/clothing/suit/armor/vest/blueshirt = 1, /obj/item/clothing/under/rank/security/officer/blueshirt = 1, - /obj/item/ssword_kit = 1) + /obj/item/clothing/gloves/tackler = 5, + /obj/item/grenade/stingbang = 1, + /obj/item/ssword_kit = 1, + /obj/item/storage/bag/ammo = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/security + default_price = PRICE_ALMOST_EXPENSIVE + extra_price = PRICE_REALLY_EXPENSIVE + payment_department = ACCOUNT_SEC + cost_multiplier_per_dept = list(ACCOUNT_SEC = 0) /obj/machinery/vending/security/pre_throw(obj/item/I) if(istype(I, /obj/item/grenade)) diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 9dda649b24..7aef2b627c 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -26,77 +26,16 @@ /obj/item/storage/box/donkpockets = 2) refill_canister = /obj/item/vending_refill/snack - var/chef_compartment_access = "28" //ACCESS_KITCHEN + canload_access_list = list(ACCESS_KITCHEN) + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_ALMOST_CHEAP + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) + input_display_header = "Chef's Food Selection" /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" -/obj/machinery/vending/snack/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/reagent_containers/food/snacks)) - if(!compartment_access_check(user)) - return - var/obj/item/reagent_containers/food/snacks/S = W - if(!S.junkiness) - if(!iscompartmentfull(user)) - if(!user.transferItemToLoc(W, src)) - return - food_load(W) - to_chat(user, "You insert [W] into [src]'s chef compartment.") - else - to_chat(user, "[src]'s chef compartment does not accept junk food.") - - else if(istype(W, /obj/item/storage/bag/tray)) - if(!compartment_access_check(user)) - return - var/obj/item/storage/T = W - var/loaded = 0 - var/denied_items = 0 - for(var/obj/item/reagent_containers/food/snacks/S in T.contents) - if(iscompartmentfull(user)) - break - if(!S.junkiness) - SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src, TRUE) - food_load(S) - loaded++ - else - denied_items++ - if(denied_items) - to_chat(user, "[src] refuses some items.") - if(loaded) - to_chat(user, "You insert [loaded] dishes into [src]'s chef compartment.") - updateUsrDialog() - return - - else - return ..() - -/obj/machinery/vending/snack/Destroy() - for(var/obj/item/reagent_containers/food/snacks/S in contents) - S.forceMove(get_turf(src)) - return ..() - -/obj/machinery/vending/snack/proc/compartment_access_check(user) - req_access_txt = chef_compartment_access - if(!allowed(user) && !(obj_flags & EMAGGED) && scan_id) - to_chat(user, "[src]'s chef compartment blinks red: Access denied.") - req_access_txt = "0" - return 0 - req_access_txt = "0" - return 1 - -/obj/machinery/vending/snack/proc/iscompartmentfull(mob/user) - if(contents.len >= 30) // no more than 30 dishes can fit inside - to_chat(user, "[src]'s chef compartment is full.") - return 1 - return 0 - -/obj/machinery/vending/snack/proc/food_load(obj/item/reagent_containers/food/snacks/S) - if(dish_quants[S.name]) - dish_quants[S.name]++ - else - dish_quants[S.name] = 1 - sortList(dish_quants) - /obj/machinery/vending/snack/random name = "\improper Random Snackies" icon_state = "random_snack" diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm index 39364d78da..88aba484e1 100644 --- a/code/modules/vending/sovietsoda.dm +++ b/code/modules/vending/sovietsoda.dm @@ -7,3 +7,6 @@ contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF + default_price = PRICE_FREE + extra_price = PRICE_FREE + payment_department = NO_FREEBIES diff --git a/code/modules/vending/sovietvend.dm b/code/modules/vending/sovietvend.dm index c555362fb6..71547e6198 100644 --- a/code/modules/vending/sovietvend.dm +++ b/code/modules/vending/sovietvend.dm @@ -23,6 +23,9 @@ premium = list() refill_canister = /obj/item/vending_refill/soviet + default_price = PRICE_FREE + extra_price = PRICE_FREE + payment_department = NO_FREEBIES /obj/item/vending_refill/soviet machine_name = "sovietvend" diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 9783607a21..2dcc1e99f7 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -5,7 +5,7 @@ product_ads = "Sufficiently healthy.;Efficiently produced tofu!;Mmm! So good!;Have a meal.;You need food to live!;Have some more candy corn!;Try our new ice cups!" icon_state = "sustenance" products = list(/obj/item/reagent_containers/food/snacks/tofu = 24, - /obj/item/reagent_containers/food/drinks/ice = 12, + /obj/item/reagent_containers/food/drinks/ice/sustanance = 12, /obj/item/reagent_containers/food/snacks/candy_corn = 6) contraband = list(/obj/item/kitchen/knife = 6, /obj/item/reagent_containers/food/drinks/coffee = 12, @@ -14,6 +14,9 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) refill_canister = /obj/item/vending_refill/sustenance resistance_flags = FIRE_PROOF + default_price = PRICE_FREE + extra_price = PRICE_FREE + payment_department = NO_FREEBIES /obj/item/vending_refill/sustenance icon_state = "refill_cook" diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 08bb4615bb..d628c888a5 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -25,6 +25,9 @@ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft + default_price = PRICE_ABOVE_NORMAL + extra_price = PRICE_EXPENSIVE + payment_department = ACCOUNT_SRV /obj/item/vending_refill/donksoft machine_name = "Donksoft Toy Vendor" diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index acd58959f1..76ef5e6f23 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -1,6 +1,15 @@ /obj/item/vending_refill/wardrobe icon_state = "refill_clothes" +/obj/machinery/vending/wardrobe + default_price = PRICE_NORMAL + extra_price = PRICE_EXPENSIVE + payment_department = NO_FREEBIES + input_display_header = "Returned Clothing" + +/obj/machinery/vending/wardrobe/canLoadItem(obj/item/I,mob/user) + return (I.type in products) + /obj/machinery/vending/wardrobe/sec_wardrobe name = "\improper SecDrobe" desc = "A vending machine for security and security-related clothing!" @@ -22,6 +31,10 @@ premium = list(/obj/item/clothing/under/rank/security/officer/formal = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5) refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe + payment_department = ACCOUNT_SEC + cost_multiplier_per_dept = list(ACCOUNT_SEC = 0) + default_price = PRICE_ABOVE_NORMAL + extra_price = PRICE_EXPENSIVE /obj/item/vending_refill/wardrobe/sec_wardrobe machine_name = "SecDrobe" @@ -38,6 +51,7 @@ /obj/item/storage/backpack/medic = 5, /obj/item/storage/backpack/satchel/med = 5, /obj/item/clothing/suit/hooded/wintercoat/medical = 5, + /obj/item/clothing/suit/hooded/wintercoat/paramedic = 2, /obj/item/clothing/under/rank/medical/doctor/nurse = 5, /obj/item/clothing/head/nursehat = 5, /obj/item/clothing/under/rank/medical/doctor/skirt= 5, @@ -57,6 +71,8 @@ /obj/item/clothing/suit/apron/surgical = 5, /obj/item/clothing/mask/surgical = 5) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) /obj/item/vending_refill/wardrobe/medi_wardrobe machine_name = "MediDrobe" @@ -80,6 +96,8 @@ /obj/item/clothing/head/hardhat = 5, /obj/item/clothing/head/hardhat/weldhat = 3) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe + payment_department = ACCOUNT_ENG + cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) /obj/item/vending_refill/wardrobe/engi_wardrobe machine_name = "EngiDrobe" @@ -101,6 +119,8 @@ /obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt = 5, /obj/item/clothing/shoes/sneakers/black = 5) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe + payment_department = ACCOUNT_ENG + cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) /obj/item/vending_refill/wardrobe/atmos_wardrobe machine_name = "AtmosDrobe" @@ -119,6 +139,8 @@ /obj/item/clothing/head/soft = 5, /obj/item/radio/headset/headset_cargo = 3) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe + payment_department = ACCOUNT_CAR + cost_multiplier_per_dept = list(ACCOUNT_CAR = 0) /obj/item/vending_refill/wardrobe/cargo_wardrobe machine_name = "CargoDrobe" @@ -141,6 +163,8 @@ /obj/item/clothing/mask/bandana/skull = 2) contraband = list(/obj/item/clothing/suit/hooded/techpriest = 2) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe + payment_department = ACCOUNT_SCI + cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) /obj/item/vending_refill/wardrobe/robo_wardrobe machine_name = "RoboDrobe" @@ -163,6 +187,8 @@ /obj/item/radio/headset/headset_sci = 4, /obj/item/clothing/mask/gas = 5) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe + payment_department = ACCOUNT_SCI + cost_multiplier_per_dept = list(ACCOUNT_SCI = 0) /obj/item/vending_refill/wardrobe/science_wardrobe machine_name = "SciDrobe" @@ -182,6 +208,8 @@ /obj/item/clothing/under/rank/civilian/hydroponics/skirt = 5, /obj/item/clothing/mask/bandana = 4) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/wardrobe/hydro_wardrobe machine_name = "HyDrobe" @@ -206,6 +234,8 @@ /obj/item/clothing/glasses/regular/jamjar = 1, /obj/item/storage/bag/books = 1) refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe + payment_department = ACCOUNT_CIV + cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) /obj/item/vending_refill/wardrobe/curator_wardrobe machine_name = "CuraDrobe" @@ -234,6 +264,8 @@ /obj/item/clothing/neck/petcollar = 3, /obj/item/storage/belt/bandolier = 1) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/wardrobe/bar_wardrobe machine_name = "BarDrobe" @@ -259,6 +291,8 @@ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, /obj/item/book/granter/crafting_recipe/coldcooking = 2) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/wardrobe/chef_wardrobe machine_name = "ChefDrobe" @@ -290,6 +324,8 @@ /obj/item/screwdriver = 2, /obj/item/stack/cable_coil/random = 4) refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe + payment_department = ACCOUNT_SRV + cost_multiplier_per_dept = list(ACCOUNT_SRV = 0) /obj/item/vending_refill/wardrobe/jani_wardrobe machine_name = "JaniDrobe" @@ -321,6 +357,8 @@ /obj/item/clothing/shoes/laceup = 3, /obj/item/clothing/accessory/lawyers_badge = 3) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe + payment_department = ACCOUNT_CIV + cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) /obj/item/vending_refill/wardrobe/law_wardrobe machine_name = "LawDrobe" @@ -347,6 +385,8 @@ premium = list(/obj/item/toy/plush/plushvar = 1, /obj/item/toy/plush/narplush = 1) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe + payment_department = ACCOUNT_CIV + cost_multiplier_per_dept = list(ACCOUNT_CIV = 0) /obj/item/vending_refill/wardrobe/chap_wardrobe machine_name = "ChapDrobe" @@ -368,6 +408,8 @@ /obj/item/storage/bag/chemistry = 3, /obj/item/fermichem/pHbooklet = 3)//pH indicator) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) /obj/item/vending_refill/wardrobe/chem_wardrobe machine_name = "ChemDrobe" @@ -386,6 +428,8 @@ /obj/item/storage/backpack/genetics = 3, /obj/item/storage/backpack/satchel/gen = 3) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) /obj/item/vending_refill/wardrobe/gene_wardrobe machine_name = "GeneDrobe" @@ -406,6 +450,8 @@ /obj/item/storage/backpack/virology = 3, /obj/item/storage/backpack/satchel/vir = 3) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe + payment_department = ACCOUNT_MED + cost_multiplier_per_dept = list(ACCOUNT_MED = 0) /obj/item/vending_refill/wardrobe/viro_wardrobe machine_name = "ViroDrobe" @@ -416,7 +462,6 @@ icon_state = "capsdrobe" icon_deny = "capsdrobe-deny" product_ads = "Only the greatest for a commander such as ours." - req_access = list(ACCESS_CAPTAIN) vend_reply = "A wonderful day to you, great leader." products = list(/obj/item/clothing/suit/hooded/wintercoat/captain = 1, /obj/item/storage/backpack/captain = 1, @@ -436,6 +481,13 @@ /obj/item/clothing/glasses/sunglasses/gar/supergar = 1, /obj/item/clothing/gloves/color/captain = 1) refill_canister = /obj/item/vending_refill/wardrobe/cap_wardrobe + payment_department = ACCOUNT_CIV + default_price = PRICE_ALMOST_EXPENSIVE + extra_price = PRICE_ABOVE_EXPENSIVE + +/obj/machinery/vending/wardrobe/cap_wardrobe/Initialize() + . = ..() + cost_multiplier_per_dept = list("[ACCESS_CAPTAIN]" = 0) /obj/item/vending_refill/wardrobe/cap_wardrobe machine_name = "Captain's Wardrobe" diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index c027cea6e5..c936d9c32c 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -15,12 +15,18 @@ /obj/item/flashlight/glowstick/red = 6, /obj/item/flashlight = 7) contraband = list(/obj/item/weldingtool/largetank = 4, - /obj/item/clothing/gloves/color/fyellow = 4) + /obj/item/clothing/gloves/color/fyellow = 4, + /obj/item/multitool = 2) premium = list(/obj/item/clothing/gloves/color/yellow = 2, - /obj/item/weldingtool/hugetank = 2) + /obj/item/weldingtool/hugetank = 2, + /obj/item/airlock_painter/decal = 3) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) refill_canister = /obj/item/vending_refill/tool resistance_flags = FIRE_PROOF + default_price = PRICE_REALLY_CHEAP + extra_price = PRICE_EXPENSIVE + payment_department = ACCOUNT_ENG + cost_multiplier_per_dept = list(ACCOUNT_ENG = 0) /obj/item/vending_refill/tool - icon_state = "refill_engi" \ No newline at end of file + icon_state = "refill_engi" diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index 4917bd3dba..50cdc32bf6 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -221,9 +221,9 @@ if(isliving(AM)) var/mob/living/L = AM var/mob/living/OW = owner - if(L.absorbed && !include_absorbed) + if(L.vore_flags & ABSORBED && !include_absorbed) continue - L.absorbed = FALSE + L.vore_flags &= ~ABSORBED L.stop_sound_channel(CHANNEL_PREYLOOP) SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred) SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey) @@ -277,14 +277,14 @@ SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred) SEND_SIGNAL(ML, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey) - if(ML.absorbed) - ML.absorbed = FALSE + if(CHECK_BITFIELD(ML.vore_flags,ABSORBED)) + DISABLE_BITFIELD(ML.vore_flags,ABSORBED) if(ishuman(M) && ishuman(OW)) var/mob/living/carbon/human/Prey = M var/mob/living/carbon/human/Pred = OW var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion for(var/mob/living/P in contents) - if(P.absorbed) + if(CHECK_BITFIELD(P.vore_flags,ABSORBED)) absorbed_count++ Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) @@ -389,7 +389,7 @@ formatted_message = replacetext(formatted_message,"%pred",owner) formatted_message = replacetext(formatted_message,"%prey",english_list(contents)) for(var/mob/living/P in contents) - if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach. + if(!CHECK_BITFIELD(P.vore_flags, ABSORBED)) //This is required first, in case there's a person absorbed and not absorbed in a stomach. total_bulge += P.mob_size if(total_bulge >= bulge_size && bulge_size != 0) return("[formatted_message]
    ") @@ -465,7 +465,7 @@ log_attack("[key_name(owner)] digested [key_name(M)].") // If digested prey is also a pred... anyone inside their bellies gets moved up. - if(is_vore_predator(M)) + if(has_vore_belly(M)) M.release_vore_contents(include_absorbed = TRUE, silent = TRUE) //Drop all items into the belly @@ -484,7 +484,7 @@ // Handle a mob being absorbed /obj/belly/proc/absorb_living(var/mob/living/M) - M.absorbed = TRUE + ENABLE_BITFIELD(M.vore_flags, ABSORBED) to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") @@ -498,7 +498,7 @@ for(var/belly in M.vore_organs) var/obj/belly/B = belly for(var/mob/living/Mm in B) - if(Mm.absorbed) + if(CHECK_BITFIELD(Mm.vore_flags, ABSORBED)) absorb_living(Mm) //Update owner @@ -512,7 +512,7 @@ if(!digested) items_preserved |= item else -// owner.nutrition += (5 * digested) // haha no. +// owner.adjust_nutrition(5 * digested) // haha no. if(iscyborg(owner)) var/mob/living/silicon/robot/R = owner R.cell.charge += (50 * digested) @@ -542,7 +542,7 @@ if (!(R in contents)) return // User is not in this belly - R.setClickCooldown(50) + R.changeNext_move(CLICK_CD_BREAKOUT*0.5) if(owner.stat) //If owner is stat (dead, KO) we can actually escape to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)") @@ -558,7 +558,6 @@ to_chat(R,"Your attempt to escape [lowertext(name)] has failed!") to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!") return - return var/struggle_outer_message = pick(struggle_messages_outside) var/struggle_user_message = pick(struggle_messages_inside) diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm index ea15892a30..77864021b4 100644 --- a/code/modules/vore/eating/bellymodes.dm +++ b/code/modules/vore/eating/bellymodes.dm @@ -1,6 +1,6 @@ // Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc) /obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller - if((times_fired < next_process) || !contents.len) + if((times_fired < next_process) || !length(contents)) recent_sound = FALSE return SSBELLIES_IGNORED @@ -27,7 +27,7 @@ var/list/EL = emote_lists[digest_mode] if(LAZYLEN(EL)) for(var/mob/living/M in contents) - if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people + if((M.vore_flags & DIGESTABLE) || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") ///////////////////// Prey Loop Refresh/hack ////////////////////// @@ -51,7 +51,7 @@ //////////////////////// Absorbed Handling //////////////////////// for(var/mob/living/M in contents) - if(M.absorbed) + if(M.vore_flags & ABSORBED) M.Stun(5) ////////////////////////// Sound vars ///////////////////////////// @@ -60,187 +60,181 @@ var/sound/pred_digest = sound(get_sfx("digest_pred")) var/sound/pred_death = sound(get_sfx("death_pred")) -///////////////////////////// DM_HOLD ///////////////////////////// - if(digest_mode == DM_HOLD) - return SSBELLIES_PROCESSED + switch(digest_mode) + if(DM_HOLD) + return SSBELLIES_PROCESSED -//////////////////////////// DM_DIGEST //////////////////////////// - else if(digest_mode == DM_DIGEST) - if(HAS_TRAIT(owner, TRAIT_PACIFISM)) //obvious. - digest_mode = DM_NOISY - return + if(DM_DIGEST) + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) //obvious. + digest_mode = DM_NOISY + return - for (var/mob/living/M in contents) - if(prob(25)) - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_digest) - play_sound = pick(pred_digest) + for (var/mob/living/M in contents) + if(prob(25)) + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) - //Pref protection! - if (!M.digestable || M.absorbed) - continue + //Pref protection! + if (!M.vore_flags & DIGESTABLE || M.vore_flags & ABSORBED) + continue + + //Person just died in guts! + if(M.stat == DEAD) + var/digest_alert_owner = pick(digest_messages_owner) + var/digest_alert_prey = pick(digest_messages_prey) + + //Replace placeholder vars + digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) + digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) + digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) + + digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) + digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) + digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) + + //Send messages + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s form loses its additions.") + + owner.adjust_nutrition(400) // so eating dead mobs gives you *something*. + play_sound = pick(pred_death) + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_death) + M.stop_sound_channel(CHANNEL_PREYLOOP) + digestion_death(M) + owner.update_icons() + to_update = TRUE + continue + + + // Deal digestion damage (and feed the pred) + if(!(M.status_flags & GODMODE)) + M.adjustFireLoss(digest_burn) + owner.adjust_nutrition(1) + + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) + + if(DM_HEAL) + for (var/mob/living/M in contents) + if(prob(25)) + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) + if(M.stat != DEAD) + if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth)) + M.adjustBruteLoss(-3) + M.adjustFireLoss(-3) + owner.adjust_nutrition(-5) + + //for when you just want people to squelch around + if(DM_NOISY) + if(prob(35)) + for(var/mob/M in contents) + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) + + + if(DM_ABSORB) + + for (var/mob/living/M in contents) + + if(prob(10))//Less often than gurgles. People might leave this on forever. + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) + + if(M.vore_flags & ABSORBED) + continue + + if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them. + var/oldnutrition = (M.nutrition * 0.05) + M.set_nutrition(M.nutrition * 0.95) + owner.adjust_nutrition(oldnutrition) + else if(M.nutrition < 100) //When they're finally drained. + absorb_living(M) + to_update = TRUE + + if(DM_UNABSORB) + + for (var/mob/living/M in contents) + if(M.vore_flags & ABSORBED && owner.nutrition >= 100) + DISABLE_BITFIELD(M.vore_flags, ABSORBED) + to_chat(M,"You suddenly feel solid again ") + to_chat(owner,"You feel like a part of you is missing.") + owner.adjust_nutrition(-100) + to_update = TRUE + + //because dragons need snowflake guts + if(DM_DRAGON) + if(HAS_TRAIT(owner, TRAIT_PACIFISM)) //imagine var editing this when you're a pacifist. smh + digest_mode = DM_NOISY + return + + for (var/mob/living/M in contents) + if(prob(55)) //if you're hearing this, you're a vore ho anyway. + if((world.time + NORMIE_HEARCHECK) > last_hearcheck) + LAZYCLEARLIST(hearing_mobs) + for(var/mob/living/H in get_hearers_in_view(3, owner)) + if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES)) + continue + LAZYADD(hearing_mobs, H) + last_hearcheck = world.time + for(var/mob/living/H in hearing_mobs) + if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) + SEND_SOUND(H,pred_digest) + else if(H?.client && (H in contents)) + SEND_SOUND(H,prey_digest) + + //No digestion protection for megafauna. //Person just died in guts! - if(M.stat == DEAD) - var/digest_alert_owner = pick(digest_messages_owner) - var/digest_alert_prey = pick(digest_messages_prey) + if(M.stat == DEAD) + var/digest_alert_owner = pick(digest_messages_owner) + var/digest_alert_prey = pick(digest_messages_prey) - //Replace placeholder vars - digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) - digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) - digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) + //Replace placeholder vars + digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) + digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) + digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) - digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) - digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) - digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) + digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) + digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) + digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) - //Send messages - to_chat(owner, "[digest_alert_owner]") - to_chat(M, "[digest_alert_prey]") - M.visible_message("You watch as [owner]'s form loses its additions.") - - owner.nutrition += 400 // so eating dead mobs gives you *something*. - play_sound = pick(pred_death) - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_death) - M.stop_sound_channel(CHANNEL_PREYLOOP) - digestion_death(M) - owner.update_icons() - to_update = TRUE - continue + //Send messages + to_chat(owner, "[digest_alert_owner]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") + play_sound = pick(pred_death) + if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) + SEND_SOUND(M,prey_death) + M.spill_organs(FALSE,TRUE,TRUE) + M.stop_sound_channel(CHANNEL_PREYLOOP) + digestion_death(M) + owner.update_icons() + to_update = TRUE + continue - // Deal digestion damage (and feed the pred) - if(!(M.status_flags & GODMODE)) - M.adjustFireLoss(digest_burn) - owner.nutrition += 1 + // Deal digestion damage (and feed the pred) + if(!(M.status_flags & GODMODE)) + M.adjustFireLoss(digest_burn) + M.adjustToxLoss(2) // something something plasma based acids + M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds. + //Contaminate or gurgle items + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) + digest_item(T) - //Contaminate or gurgle items - var/obj/item/T = pick(touchable_items) - if(istype(T)) - if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) - digest_item(T) - -///////////////////////////// DM_HEAL ///////////////////////////// - if(digest_mode == DM_HEAL) - for (var/mob/living/M in contents) - if(prob(25)) - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_digest) - play_sound = pick(pred_digest) - if(M.stat != DEAD) - if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth)) - M.adjustBruteLoss(-3) - M.adjustFireLoss(-3) - owner.nutrition -= 5 - -////////////////////////// DM_NOISY ///////////////////////////////// -//for when you just want people to squelch around - if(digest_mode == DM_NOISY) - if(prob(35)) - for(var/mob/M in contents) - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_digest) - play_sound = pick(pred_digest) - - -//////////////////////////// DM_ABSORB //////////////////////////// - else if(digest_mode == DM_ABSORB) - - for (var/mob/living/M in contents) - - if(prob(10))//Less often than gurgles. People might leave this on forever. - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_digest) - play_sound = pick(pred_digest) - - if(M.absorbed) - continue - - if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them. - var/oldnutrition = (M.nutrition * 0.05) - M.nutrition = (M.nutrition * 0.95) - owner.nutrition += oldnutrition - else if(M.nutrition < 100) //When they're finally drained. - absorb_living(M) - to_update = TRUE - -//////////////////////////// DM_UNABSORB //////////////////////////// - else if(digest_mode == DM_UNABSORB) - - for (var/mob/living/M in contents) - if(M.absorbed && owner.nutrition >= 100) - M.absorbed = FALSE - to_chat(M,"You suddenly feel solid again ") - to_chat(owner,"You feel like a part of you is missing.") - owner.nutrition -= 100 - to_update = TRUE - -//////////////////////////DM_DRAGON ///////////////////////////////////// -//because dragons need snowflake guts - if(digest_mode == DM_DRAGON) - if(HAS_TRAIT(owner, TRAIT_PACIFISM)) //imagine var editing this when you're a pacifist. smh - digest_mode = DM_NOISY - return - - for (var/mob/living/M in contents) - if(prob(55)) //if you're hearing this, you're a vore ho anyway. - if((world.time + NORMIE_HEARCHECK) > last_hearcheck) - LAZYCLEARLIST(hearing_mobs) - for(var/mob/living/H in get_hearers_in_view(3, owner)) - if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES)) - continue - LAZYADD(hearing_mobs, H) - last_hearcheck = world.time - for(var/mob/living/H in hearing_mobs) - if(H && H.client && (isturf(H.loc) || (H.loc != src.contents))) - SEND_SOUND(H,pred_digest) - else if(H?.client && (H in contents)) - SEND_SOUND(H,prey_digest) - - //No digestion protection for megafauna. - - //Person just died in guts! - if(M.stat == DEAD) - var/digest_alert_owner = pick(digest_messages_owner) - var/digest_alert_prey = pick(digest_messages_prey) - - //Replace placeholder vars - digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner) - digest_alert_owner = replacetext(digest_alert_owner,"%prey",M) - digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name)) - - digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner) - digest_alert_prey = replacetext(digest_alert_prey,"%prey",M) - digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name)) - - //Send messages - to_chat(owner, "[digest_alert_owner]") - to_chat(M, "[digest_alert_prey]") - M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.") - play_sound = pick(pred_death) - if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES) - SEND_SOUND(M,prey_death) - M.spill_organs(FALSE,TRUE,TRUE) - M.stop_sound_channel(CHANNEL_PREYLOOP) - digestion_death(M) - owner.update_icons() - to_update = TRUE - continue - - - // Deal digestion damage (and feed the pred) - if(!(M.status_flags & GODMODE)) - M.adjustFireLoss(digest_burn) - M.adjustToxLoss(2) // something something plasma based acids - M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds. - //Contaminate or gurgle items - var/obj/item/T = pick(touchable_items) - if(istype(T)) - if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ)) - digest_item(T) - -/////////////////////////// Make any noise /////////////////////////// + /////////////////////////// Make any noise /////////////////////////// if(play_sound) if((world.time + NORMIE_HEARCHECK) > last_hearcheck) LAZYCLEARLIST(hearing_mobs) @@ -252,7 +246,7 @@ for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) - //these are all external sound triggers now, so it's ok. + //these are all external sound triggers now, so it's ok. if(to_update) for(var/mob/living/M in contents) if(M.client) @@ -260,4 +254,4 @@ if(owner.client) owner.updateVRPanel() - return SSBELLIES_PROCESSED \ No newline at end of file + return SSBELLIES_PROCESSED diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index c59662d5b6..bffb8b2517 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -1,18 +1,11 @@ ///////////////////// Mob Living ///////////////////// /mob/living - var/digestable = FALSE // Can the mob be digested inside a belly? + var/vore_flags = 0 var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not. var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob - var/devourable = FALSE // Can the mob be vored at all? - var/feeding = FALSE // Are we going to feed someone else? var/vore_taste = null // What the character tastes like - var/no_vore = FALSE // If the character/mob can vore. - var/openpanel = FALSE // Is the vore panel open? - var/absorbed = FALSE //are we absorbed? var/next_preyloop - var/vore_init = FALSE //Has this mob's vore been initialized yet? - var/vorepref_init = FALSE //Has this mob's voreprefs been initialized? // // Hook for generic creation of stuff on new creatures @@ -22,7 +15,7 @@ M.verbs += /mob/living/proc/lick M.verbs += /mob/living/proc/escapeOOC - if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. + if(M.vore_flags & NO_VORE) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. return TRUE M.verbs += /mob/living/proc/insidePanel @@ -35,7 +28,7 @@ return TRUE /mob/living/proc/init_vore() - vore_init = TRUE + ENABLE_BITFIELD(vore_flags, VORE_INIT) //Something else made organs, meanwhile. if(LAZYLEN(vore_organs)) return TRUE @@ -49,8 +42,8 @@ vore_selected = vore_organs[1] return TRUE - //Or, we can create a basic one for them - if(!LAZYLEN(vore_organs)) +/mob/living/proc/lazy_init_belly() + if(!length(vore_organs)) LAZYINITLIST(vore_organs) var/obj/belly/B = new /obj/belly(src) vore_selected = B @@ -68,6 +61,7 @@ // Critical adjustments due to TG grab changes - Poojawa /mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) + lazy_init_belly() if(!user || !prey || !pred) return @@ -75,46 +69,40 @@ return if(pred == prey) //you click your target - if(!pred.feeding) + if(!CHECK_BITFIELD(pred.vore_flags,FEEDING)) to_chat(user, "They aren't able to be fed.") to_chat(pred, "[user] tried to feed you themselves, but you aren't voracious enough to be fed.") return - if(!is_vore_predator(pred)) - to_chat(user, "They aren't voracious enough.") - return feed_self_to_grabbed(user, pred) else if(pred == user) //you click yourself - if(!is_vore_predator(src)) - to_chat(user, "You aren't voracious enough.") - return feed_grabbed_to_self(user, prey) else // click someone other than you/prey - if(!pred.feeding) + if(!CHECK_BITFIELD(pred.vore_flags,FEEDING)) to_chat(user, "They aren't voracious enough to be fed.") to_chat(pred, "[user] tried to feed you [prey], but you aren't voracious enough to be fed.") return - if(!prey.feeding) + if(!CHECK_BITFIELD(prey.vore_flags,FEEDING)) to_chat(user, "They aren't able to be fed to someone.") to_chat(prey, "[user] tried to feed you to [pred], but you aren't able to be fed to them.") return - if(!is_vore_predator(pred)) - to_chat(user, "They aren't voracious enough.") - return feed_grabbed_to_other(user, prey, pred) // // Eating procs depending on who clicked what // /mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) + user.lazy_init_belly() var/belly = user.vore_selected return perform_the_nom(user, prey, user, belly) /mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred) + pred.lazy_init_belly() var/belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, user, pred, belly) /mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) + pred.lazy_init_belly() var/belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, prey, pred, belly) @@ -128,7 +116,7 @@ testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") return - if (!prey.devourable) + if (!prey.vore_flags & DEVOURABLE) to_chat(user, "This can't be eaten!") return FALSE @@ -267,9 +255,7 @@ to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.") return FALSE - client.prefs.digestable = digestable - client.prefs.devourable = devourable - client.prefs.feeding = feeding + client.prefs.vore_flags = vore_flags // there's garbage data in here, but it doesn't matter client.prefs.vore_taste = vore_taste var/list/serialized = list() @@ -288,12 +274,17 @@ if(!client || !client.prefs) to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.") return FALSE - vorepref_init = TRUE + ENABLE_BITFIELD(vore_flags,VOREPREF_INIT) + // garbage data coming back the other way or breaking absorbed would be bad, so instead we do this + vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 1 if prefs is 1 + vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE) + vore_flags |= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING) + + vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DIGESTABLE) // set to 0 if prefs is 0 + vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,DEVOURABLE) + vore_flags &= CHECK_BITFIELD(client.prefs.vore_flags,FEEDING) - digestable = client.prefs.digestable - devourable = client.prefs.devourable - feeding = client.prefs.feeding vore_taste = client.prefs.vore_taste release_vore_contents(silent = TRUE) @@ -358,10 +349,13 @@ if(incapacitated(ignore_restraints = TRUE)) to_chat(src, "You can't do that while incapacitated.") return + if(next_move > world.time) + to_chat(src, "You can't do that so fast, slow down.") + return var/list/choices for(var/mob/living/L in view(1)) - if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L)) + if(L != src && (!L.ckey || L.client?.prefs.vore_flags & LICKABLE) && Adjacent(L)) LAZYADD(choices, L) if(!choices) @@ -369,10 +363,10 @@ var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices - if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE)) + if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE)) return - setClickCooldown(100) + changeNext_move(CLICK_CD_MELEE) visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!") @@ -392,7 +386,7 @@ return taste_message // Check if an object is capable of eating things, based on vore_organs // -/proc/is_vore_predator(var/mob/living/O) +/proc/has_vore_belly(var/mob/living/O) if(istype(O)) if(O.vore_organs.len > 0) return TRUE diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index 9c1ff4a84e..1adf5ef6e7 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -20,10 +20,10 @@ picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() - src.openpanel = TRUE + vore_flags |= OPEN_PANEL /mob/living/proc/updateVRPanel() //Panel popup update call from belly events. - if(src.openpanel == TRUE) + if(vore_flags & OPEN_PANEL) var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder picker_holder.selected = vore_selected @@ -65,7 +65,7 @@ //Don't display this part if we couldn't find the belly since could be held in hand. if(inside_belly) - dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

    " + dat += "You are currently [(user.vore_flags & ABSORBED) ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

    " if(inside_belly.desc) dat += "[inside_belly.desc]

    " @@ -80,8 +80,8 @@ continue //That's an absorbed person you're checking - if(M.absorbed) - if(user.absorbed) + if(M.vore_flags & ABSORBED) + if(user.vore_flags & ABSORBED) dat += "[O]" continue else @@ -139,7 +139,7 @@ var/mob/living/M = O //Absorbed gets special color OOoOOOOoooo - if(M.absorbed) + if(M.vore_flags & ABSORBED) dat += "[O]" continue @@ -243,11 +243,11 @@ dat += "
    " var/pref_on = "#173d15" var/pref_off = "#990000" - dat += "
    Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])" - dat += "
    Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])" - dat += "
    Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])" + dat += "
    Toggle Digestable (Currently: [(user.vore_flags & DIGESTABLE) ? "ON" : "OFF"])" + dat += "
    Toggle Devourable (Currently: [(user.vore_flags & DEVOURABLE) ? "ON" : "OFF"])" + dat += "
    Toggle Feeding (Currently: [(user.vore_flags & FEEDING) ? "ON" : "OFF"])" if(user.client.prefs) - dat += "
    Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])" + dat += "
    Toggle Licking (Currently: [(user.client.prefs.vore_flags & LICKABLE) ? "ON" : "OFF"])" //Returns the dat html to the vore_look return dat @@ -257,7 +257,7 @@ if(href_list["close"]) qdel(src) // Cleanup - user.openpanel = FALSE + user.vore_flags &= ~OPEN_PANEL return if(href_list["show_int"]) @@ -287,7 +287,7 @@ M.examine(user) if("Help Out") //Help the inside-mob out - if(user.stat || user.absorbed || M.absorbed) + if(user.stat || user.vore_flags & ABSORBED || M.vore_flags & ABSORBED) to_chat(user,"You can't do that in your state!") return TRUE @@ -306,7 +306,7 @@ to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") if("Devour") //Eat the inside mob - if(user.absorbed || user.stat) + if(user.vore_flags & ABSORBED || user.stat) to_chat(user,"You can't do that in your state!") return TRUE @@ -687,58 +687,58 @@ user.vore_taste = new_flavor if(href_list["toggledg"]) - var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") + var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [(user.vore_flags & DIGESTABLE) ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") if(!user || !user.client) return switch(choice) if("Cancel") return FALSE if("Allow Digestion") - user.digestable = TRUE + user.vore_flags |= DIGESTABLE + user.client.prefs.vore_flags |= DIGESTABLE if("Prevent Digestion") - user.digestable = FALSE - - user.client.prefs.digestable = user.digestable + user.vore_flags &= ~DIGESTABLE + user.client.prefs.vore_flags &= ~DIGESTABLE if(href_list["toggledvor"]) - var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") + var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [(user.vore_flags & DEVOURABLE) ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") if(!user || !user.client) return switch(choice) if("Cancel") return FALSE if("Allow Devourment") - user.devourable = TRUE + user.vore_flags |= DEVOURABLE + user.client.prefs.vore_flags |= DEVOURABLE if("Prevent Devourment") - user.devourable = FALSE - - user.client.prefs.devourable = user.devourable + user.vore_flags &= ~DEVOURABLE + user.client.prefs.vore_flags &= ~DEVOURABLE if(href_list["toggledfeed"]) - var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") + var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [(user.vore_flags & FEEDING) ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") if(!user || !user.client) return switch(choice) if("Cancel") return FALSE if("Allow Feeding") - user.feeding = TRUE + user.vore_flags |= FEEDING + user.client.prefs.vore_flags |= FEEDING if("Prevent Feeding") - user.feeding = FALSE - - user.client.prefs.feeding = user.feeding + user.vore_flags &= ~FEEDING + user.client.prefs.vore_flags &= ~FEEDING if(href_list["toggledlickable"]) - var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking") + var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [(user.client.prefs.vore_flags & LICKABLE) ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking") if(!user || !user.client) return switch(choice) if("Cancel") return FALSE if("Allow Licking") - user.client.prefs.lickable = TRUE + user.client.prefs.vore_flags |= LICKABLE if("Prevent Licking") - user.client.prefs.lickable = FALSE + user.client.prefs.vore_flags &= ~LICKABLE //Refresh when interacted with, returning 1 makes vore_look.Topic update return TRUE diff --git a/code/modules/vore/trycatch.dm b/code/modules/vore/trycatch.dm index 2adf6e0cf6..d4b1ac2c05 100644 --- a/code/modules/vore/trycatch.dm +++ b/code/modules/vore/trycatch.dm @@ -16,15 +16,14 @@ The proc you're attemping should return nonzero values on success. try if(!callon || !procname) CRASH("attempt_vr: Invalid obj/proc: [callon]/[procname]") - return 0 var/result = call(callon,procname)(arglist(args)) return result catch(var/exception/e) - CRASH("attempt_vr runtimed when calling [procname] on [callon].") - CRASH("attempt_vr catch: [e] on [e.file]:[e.line]") + stack_trace("attempt_vr runtimed when calling [procname] on [callon].") + stack_trace("attempt_vr catch: [e] on [e.file]:[e.line]") return 0 /* @@ -46,17 +45,16 @@ The hooks you're calling should return nonzero values on success. var/hook_path = text2path("/hook/[hook]") if(!hook_path) CRASH("hook_vr: Invalid hook '/hook/[hook]' called.") - return 0 var/caller = new hook_path var/status = 1 for(var/P in typesof("[hook_path]/proc")) if(!call(caller, P)(arglist(args))) - CRASH("hook_vr: Hook '[P]' failed or runtimed.") + stack_trace("hook_vr: Hook '[P]' failed or runtimed.") status = 0 return status catch(var/exception/e) - CRASH("hook_vr itself failed or runtimed. Exception below.") - CRASH("hook_vr catch: [e] on [e.file]:[e.line]") \ No newline at end of file + stack_trace("hook_vr itself failed or runtimed. Exception below.") + stack_trace("hook_vr catch: [e] on [e.file]:[e.line]") diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 0f6ef14cd1..d4d92f54c4 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -74,4 +74,4 @@ user.adjustCloneLoss(-hp_gained, 0) user.updatehealth() user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" - user.nutrition = min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL) + user.adjust_nutrition(hp_gained, NUTRITION_LEVEL_FULL) diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index 545394f3e9..ef30ba732e 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -7,16 +7,16 @@ #Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once. #DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors! -#_maps/RandomZLevels/blackmarketpackers.dmm -#_maps/RandomZLevels/spacebattle.dmm -#_maps/RandomZLevels/TheBeach.dmm -#_maps/RandomZLevels/Academy.dmm -#_maps/RandomZLevels/wildwest.dmm -#_maps/RandomZLevels/challenge.dmm -#_maps/RandomZLevels/centcomAway.dmm -#_maps/RandomZLevels/moonoutpost19.dmm -#_maps/RandomZLevels/undergroundoutpost45.dmm -#_maps/RandomZLevels/caves.dmm -#_maps/RandomZLevels/snowdin.dmm -#_maps/RandomZLevels/research.dmm -#_maps/RandomZLevels/Cabin.dmm +#_maps/RandomZLevels/away_mission/blackmarketpackers.dmm +#_maps/RandomZLevels/away_mission/spacebattle.dmm +#_maps/RandomZLevels/away_mission/TheBeach.dmm +#_maps/RandomZLevels/away_mission/Academy.dmm +#_maps/RandomZLevels/away_mission/wildwest.dmm +#_maps/RandomZLevels/away_mission/challenge.dmm +#_maps/RandomZLevels/away_mission/centcomAway.dmm +#_maps/RandomZLevels/away_mission/moonoutpost19.dmm +#_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm +#_maps/RandomZLevels/away_mission/caves.dmm +#_maps/RandomZLevels/away_mission/snowdin.dmm +#_maps/RandomZLevels/away_mission/research.dmm +#_maps/RandomZLevels/away_mission/SnowCabin.dmm diff --git a/config/config.txt b/config/config.txt index fd5dc968fb..35af0e848b 100644 --- a/config/config.txt +++ b/config/config.txt @@ -510,13 +510,16 @@ DEFAULT_VIEW 21x15 ### FAIL2TOPIC: ### Automated IP bans for world/Topic() spammers +### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. +### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. ## Enabled -FAIL2TOPIC_ENABLED +#FAIL2TOPIC_ENABLED ## Minimum wait time in deciseconds between valid requests FAIL2TOPIC_RATE_LIMIT 10 ## Number of requests after breaching rate limit that triggers a ban FAIL2TOPIC_MAX_FAILS 5 ## Firewall rule name used on physical server +## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND FAIL2TOPIC_RULE_NAME _dd_fail2topic ## Enable automatic profiling - Byond 513.1506 and newer only. diff --git a/config/game_options.txt b/config/game_options.txt index c3930fd325..405ec0405a 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -139,6 +139,20 @@ MIDROUND_ANTAG CHANGELING MIDROUND_ANTAG WIZARD #MIDROUND_ANTAG MONKEY +## Toggles for whether this mode should force antags even if not enough players have it enabled. +## If it's off, it just won't roll as many antags. +#FORCE_ANTAG_COUNT TRAITOR +#FORCE_ANTAG_COUNT TRAITORBRO +#FORCE_ANTAG_COUNT TRAITORCHAN +#FORCE_ANTAG_COUNT INTERNAL_AFFAIRS +FORCE_ANTAG_COUNT NUCLEAR +FORCE_ANTAG_COUNT REVOLUTION +FORCE_ANTAG_COUNT CULT +FORCE_ANTAG_COUNT CLOCKWORK_CULT +#FORCE_ANTAG_COUNT CHANGELING +#FORCE_ANTAG_COUNT WIZARD +#FORCE_ANTAG_COUNT MONKEY + ## Uncomment these for overrides of the minimum / maximum number of players in a round type. ## If you set any of these occasionally check to see if you still need them as the modes ## will still be actively rebalanced around the SUGGESTED populations, not your overrides. @@ -288,6 +302,9 @@ MINIMUM_SECBORG_ALERT 3 ## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart. #ROUNDSTART_AWAY +## Uncomment to load one of the virtual reality levels from vr_config at roundstart. +#ROUNDSTART_VR + ## How long the delay is before the Away Mission gate opens. Default is half an hour. ## 600 is one minute. GATEWAY_DELAY 18000 @@ -529,7 +546,10 @@ BOMBCAP 20 ## of ruins. LAVALAND_BUDGET 60 -## Space Ruin Budged +## Ice Moon Budget +ICEMOON_BUDGET 90 + +## Space Ruin Budget Space_Budget 16 ## Station Ruin Budget @@ -583,11 +603,17 @@ NIGHTSHIFT_TOGGLE_PUBLIC_REQUIRES_AUTH ## A cap on how many monkeys may be created via monkey cubes MONKEYCAP 64 +## A cap on how many mice can be bred via cheese wedges +RATCAP 64 + +## Enable the capitalist agenda on your server. +ECONOMY + ## Uncomment to use TG-style combat #DISABLE_STAMBUFFER #Replaces standard extended/secret dichotomy with extended and calm/chaotic votes for dynamic. -DYNAMIC_VOTING +#DYNAMIC_VOTING ## Choose which Engine to start the round with. Weight is after the comma. Setting the weight to 0 removes the engine from rotation. BOX_RANDOM_ENGINE Box SM,3 @@ -620,3 +646,23 @@ BREASTS_CUPS_PREFS e ## Minimum and maximum limits for penis length from the character creation menu. PENIS_MIN_INCHES_PREFS 1 PENIS_MAX_INCHES_PREFS 20 + +## Body size configs, the feature will be disabled if both min and max have the same value. +BODY_SIZE_MIN 1 +BODY_SIZE_MAX 1 + +## Pun-Pun movement slowdown given to characters with a body size smaller than this value, +## to compensate for their smaller hitbox. +## To disable, just make sure the value is lower than 'body_size_min' +THRESHOLD_BODY_SIZE_SLOWDOWN 0.85 + +## Multiplier used in the smaller strides slowdown calculation. +## Doesn't apply to floating or crawling mobs. +BODY_SIZE_SLOWDOWN_MULTIPLIER 0.25 + +## Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. +ALLOW_CUSTOM_SKINTONES + +## Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. +## Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. +#USE_FIELD_OF_VISION \ No newline at end of file diff --git a/config/iceruinblacklist.txt b/config/iceruinblacklist.txt new file mode 100644 index 0000000000..3cecffa4fe --- /dev/null +++ b/config/iceruinblacklist.txt @@ -0,0 +1,23 @@ +#Listing maps here will blacklist them from generating in the ice moon. +#Maps must be the full path to them +#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins +#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +##RESPAWN +#_maps/RandomRuins/AnywhereRuins/golem_ship.dmm + +##MISC +#_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm \ No newline at end of file diff --git a/config/lavaRuinBlacklist.txt b/config/lavaRuinBlacklist.txt index 1d9804e0b2..e86cf42ea0 100644 --- a/config/lavaRuinBlacklist.txt +++ b/config/lavaRuinBlacklist.txt @@ -13,7 +13,7 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +#_maps/RandomRuins/AnywhereRuins/golem_ship.dmm ##SIN #_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -33,8 +33,10 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm +#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm \ No newline at end of file diff --git a/config/maps.txt b/config/maps.txt index 4bd2b1ce8a..a90fea7595 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -36,6 +36,10 @@ map deltastation minplayers 50 endmap +map snaxi + minplayers 25 +endmap + map runtimestation endmap diff --git a/config/mentors.txt b/config/mentors.txt index 8c2bc2f392..1247986f82 100644 --- a/config/mentors.txt +++ b/config/mentors.txt @@ -1 +1 @@ -thatfaggotgeorgemellons \ No newline at end of file +thattraitorgeorgemellons diff --git a/config/plushies/defines.txt b/config/plushies/defines.txt index e69de29bb2..e7a92f6ac2 100644 --- a/config/plushies/defines.txt +++ b/config/plushies/defines.txt @@ -0,0 +1,2 @@ +# EXAMPLE +# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}} diff --git a/config/plushies/plushie_config.txt b/config/plushies/plushie_config.txt deleted file mode 100644 index 7cd1d88f3e..0000000000 --- a/config/plushies/plushie_config.txt +++ /dev/null @@ -1,2 +0,0 @@ -# EXAMPLE -# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}} diff --git a/config/vr_config.txt b/config/vr_config.txt new file mode 100644 index 0000000000..0c6354f8fe --- /dev/null +++ b/config/vr_config.txt @@ -0,0 +1,13 @@ +#List the potential virtual reality Z-levels here. awaymissionconfig copypasta follows. + +#Maps must be the full path to them +#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior. +#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +#!!IMPORTANT NOTES FOR HOSTING VR MAPS!!: +#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once. +#DO tick the associated code file for the virtual reality levels you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors! + +#_maps/RandomZLevels/VR/murderdome.dmm +#_maps/RandomZLevels/VR/snowdin_VR.dmm +#_maps/RandomZLevels/VR/syndicate_trainer.dmm \ No newline at end of file diff --git a/dependencies.sh b/dependencies.sh index be5a320428..83254509b9 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -23,4 +23,4 @@ export NODE_VERSION=12 export PHP_VERSION=5.6 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.3 +export SPACEMAN_DMM_VERSION=suite-1.4 diff --git a/html/admin/view_variables.css b/html/admin/view_variables.css new file mode 100644 index 0000000000..34c1a211eb --- /dev/null +++ b/html/admin/view_variables.css @@ -0,0 +1,35 @@ +body { + font-family: Verdana, sans-serif; + font-size: 9pt; +} +.value { + font-family: "consolas", monospace; /* consolas is better!! (was "Courier New") */ + font-size: 8pt; + display: inline-block; +} + +table.matrix { + border-collapse: collapse; border-spacing: 0; + font-size: 7pt; +} +table.matrix td{ + text-align: center; + padding: 0 1ex 0ex 1ex; +} +table.matrixbrak { + border-collapse: collapse; border-spacing: 0; +} +table.matrixbrak td.lbrak, table.matrixbrak td.rbrak{ + width: 0.8ex; + font-size: 50%; + border-top: solid 0.25ex black; + border-bottom: solid 0.25ex black; +} +table.matrixbrak td.lbrak { + border-left: solid 0.5ex black; + border-right: none; +} +table.matrixbrak td.rbrak { + border-right: solid 0.5ex black; + border-left: none; +} diff --git a/html/archivedchangelog.html b/html/archivedchangelog.html index 6b0fb6c6e6..b586ae9d51 100644 --- a/html/archivedchangelog.html +++ b/html/archivedchangelog.html @@ -6394,7 +6394,7 @@ start of their shift.
    • Greek Rioter updated:
        -
      • Removed dumb/badly sprited drinks for barman. This is for you, people that love to play barman. Your job is now non-retarded again. EDIT: FIXED DRINK MIXING
      • +
      • Removed dumb/badly sprited drinks for barman. This is for you, people that love to play barman. Your job is now non-stupid again. EDIT: FIXED DRINK MIXING
      • More info here: rev2136
    • @@ -7315,7 +7315,7 @@ resistance (only slight don't run into a fire).
    • HoS, Warden and Security Officer starting equipment changed.
    • New crate, which contains armored vests and helmets. Requires security access, costs 20.
    • Miner lockers now contain meson scanners and mining jumpsuits.
    • -
    • Food crate now contains milk, instead of faggots. Lightbulb crates cost reduced to 5. Riot crates cost reduced to 20. Emergency crate contains 2 med bots instead of floor bots. Hydroponics crate no longer contains weed spray, pest spray. It's latex gloves were replaced with leather ones and an apron.
    • +
    • Food crate now contains milk, instead of meatballs. Lightbulb crates cost reduced to 5. Riot crates cost reduced to 20. Emergency crate contains 2 med bots instead of floor bots. Hydroponics crate no longer contains weed spray, pest spray. It's latex gloves were replaced with leather ones and an apron.
    • Added chef's apron (can hold a kitchen knife) and a new service borg sprite.
    • Autolathe can now construct kitchen knives.
    • Biosuit and syndicate space suits can now fit into backpacks.
    • @@ -8139,7 +8139,7 @@ resistance (only slight don't run into a fire). -Meatbread: 3 meats (whatever meats) 3 flour 3 cheese. Can be sliced. Cheese_amount is actually displayed on the microwave.
    • Profession-special radio channels now have color.
    • -
    • AI card not retardedly lethal anymore, for anyone that didn't notice
    • +
    • AI card not stupidly lethal anymore, for anyone that didn't notice
    • HYDROPONICS OVERHAUL, credit goes to Skie and Numbers. Wood doesn't have the entity so the tower caps cannot be harvested. For now.
    • Bar is now barman-only, access-wise. No more shall the entire station trump inside the bar and choke the monkey.
    • Prepping ground for Barman update (SPRITE ME SOME GODDAMN BOTTLES)
    • @@ -8496,7 +8496,7 @@ resistance (only slight don't run into a fire). New spell: Mindblast
      • - Causes brain damage, progressively causing other players to become even more retarded. + Causes brain damage, progressively causing other players to become even more stupid.
      @@ -8693,7 +8693,7 @@ resistance (only slight don't run into a fire).
    • BACKUP BACKUP TELL ME WHAT YOU GONNA DO NOW Changed the monkey name code. Re-did my antimatter engine code so it actually puts out power now
    • dumb as fuck change, whoever did that, it already spawn ()&#39;s inside the proc - code, whoever did that, you are a faggot and should read code before you modify + code, whoever did that, you are a fool and should read code before you modify it
    • Fixed a bug that gave everyone modify ticker variables you silly sausage.
    • Sorted the AIs track list.
    • @@ -8896,7 +8896,7 @@ resistance (only slight don't run into a fire).
    • Fixed the syndicate nuclear victory bug
    • Wizard now spawns with wizard outfit which he must wear to cast spells
    • Blood bug fixes
    • -
    • Fixed a retarded bug that meant I didn't have the power to kick admins
    • +
    • Fixed a dumb bug that meant I didn't have the power to kick admins
    • THUNDERDOME!
    • Several new facial hair options and a bitchin' mohawk
    • Blood by Culka
    • @@ -9048,4 +9048,4 @@ resistance (only slight don't run into a fire).
    • Seperated male and female names.
    • Females have pink underwear.
    • Guests can no longer save/load profiles, as this just created useless profiles that weren't used again.
    • -
    \ No newline at end of file + diff --git a/html/changelog.html b/html/changelog.html index b19cd15494..e78ecfb9db 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,1061 +1,348 @@ - - - - Citadel Station 13 Changelog - - - - - - - -
    - - - - -
    -
    Traditional Games Space Station 13
    - -

    -
    - - - - - -
    - Thanks to: /tg/station, 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.
    -
    Have a bug to report?
    Visit our Issue Tracker.
    - Please ensure that the bug has not already been reported, use the template provided here!. - Currently Active GitHub contributor list: -Click Here-
    -
    - - -
    - -

    28 March 2020

    -

    Arreksuru and Detective Google updated:

    -
      -
    • new HUDpatches for medical, diagnostic, and mesons.
    • -
    • crafting and de-crafting recipes for new HUDpatches.
    • -
    • silly typo with "singlasses" in one of the crafting recipes for HUDglasses.
    • -
    -

    Arturlang updated:

    -
      -
    • Bloodsuckers can no longer get usable blood from blood tomatoes.
    • -
    • Fixed reagent container transfer amount cycling.
    • -
    -

    Bhijn updated:

    -
      -
    • Clicking an open closet with harm intent no longer attempts to place your currently held item inside, but rather attacks it.
    • -
    -

    Bhijn (original PR by Azarak, sprites by Discord user Smug Asshole Muhreen#5522) updated:

    -
      -
    • Synths, the open source and free-as-in-freedom species by FA user vader-san, have been ported from Skyrat.
    • -
    • Ported VOREStation's synthetic taursprites
    • -
    • Markings that don't match very well with your selected species are now hidden from the markings list by default. You can still use these mismatched markings to create horrendous sparkledog abominations by using the "Show mismatched markings" button ingame.
    • -
    • Body markings who's iconstates don't match their name will now actually render properly.
    • -
    • Limb base icons are no longer hardcoded, should_draw_citadel and should_draw_grayscale have been removed in favor of the species-level `icon_limbs` var and the bodypart-level `base_bp_icon` and `color_src` vars. Downstreams should no longer have to touch bodypart rendering code a whole lot if they want to add custom species. Downstreams that have already added species with digitigrade leg support will have to append species IDs to the digitigrade leg sprites, but aside from that, the migration process to this more modularity-friendly system should be fairly smooth.
    • -
    -

    BlackMajor updated:

    -
      -
    • Adjusted the ash walker camp's storm proofing.
    • -
    • Added a tip about creating areas to the ash walker spawn text.
    • -
    -

    Bumtickley00 updated:

    -
      -
    • Iron sheets build the normal metal table again
    • -
    -

    Crystal9156 updated:

    -
      -
    • Fixes Chocolate Jelly Donut icon
    • -
    -

    Dennok, ported by Hatterhat updated:

    -
      -
    • Lava rivers no longer burn into basalt.
    • -
    • The river generator can now specify baseturfs.
    • -
    -

    Detective-Google updated:

    -
      -
    • absurd dong sizes.
    • -
    • my dumb stupid paramedics
    • -
    • Medical no longer spawns with syringe guns, Medical now spawns with medidart guns.
    • -
    -

    EmeraldSundisk updated:

    -
      -
    • Adds CogStation's shuttles to-be.
    • -
    • Adds the "NES Classic" escape shuttle.
    • -
    • Accounts for the new shuttles.
    • -
    -

    Ghommie updated:

    -
      -
    • Added a few cooldowns to chill nuclear bomb and communications console security level change spam, as well as the emergency shuttle's authorization announcements.
    • -
    • Fixed viruses not working on anthros and some others species.
    • -
    • Made the cogchamp mixing sound less annoying.
    • -
    • Removed makeshift switchblades.
    • -
    • pAIs, drones, monkys and lizards can be worn over the head again.
    • -
    • Fixed cargo passive point generation to not go into decimals.
    • -
    • Syndicate ninjas are slightly less friendly now.
    • -
    • Allowed blobbernauts to drag objects (but not mobs) again.
    • -
    • The examiner circuit now works better for mobs.
    • -
    • Chances are monkeys won't end up gorillizing as quickly after being exposed to a rad storm for a minute or so.
    • -
    • Vampire mesmerize doesn't permanently disable combat mode.
    • -
    • The flying speed slowdown while hurt now actually affects flying mobs and not floating ones.
    • -
    • Joining in as a positronic brain won't break the spawner menu anymore.
    • -
    • Fixed dynamic voting.
    • -
    • The autotransfer subsystem is slightly more modulable now.
    • -
    • Resprited some sprite_accessory icon states.
    • -
    -

    Ghommie (plus a fix originally done by Skogol) updated:

    -
      -
    • Drinks dispensers now only show the container they are holding.
    • -
    • Ghost cafe patrons are warded against a few more events now.
    • -
    • Fixed RnD machineries UI displaying designs' required reagents' typepaths instead of names.
    • -
    -

    Hatterhat updated:

    -
      -
    • Red and blue boxes are now actually red or blue.
    • -
    • Beegions! Like Legions, but with actual bees. As in, the bees from the holodeck sim with the randomly-generated toxic bees.
    • -
    • Mining cyborgs are no longer physically capable of claiming points nor wielding a premium accelerator.
    • -
    • Arrow crafting has been finagled with, preventing fire-hardened arrows from being fire-hardened repeatedly. Or something.
    • -
    • Space hermits (those quirky fellas stuck in a rock with carp surrounding them) now have gravity! But they lost their perpetual generators.
    • -
    • Space hermits now have to mine for their research tech (golem vendor board, ORM board). They have slightly less bad parts, though. And better(?) rocks.
    • -
    -

    InnocentFire made the sprites all thanks to them! updated:

    -
      -
    • All bows now have inhand sprites once again
    • -
    -

    KathrinBailey updated:

    -
      -
    • Nine new posters!
    • -
    • Shower curtains can be crafted.
    • -
    • New sofas!
    • -
    • Green and purple comfy chairs to the crafting menu to fit green and purple carpets.
    • -
    • Shower curtains now let you see through them once open, and don't once closed.
    • -
    -

    Kraseo updated:

    -
      -
    • If you have the powersink objective, you will now receive a free beacon.
    • -
    • Lavaland flora have more traits now, to encourage harvesting and sending these off to the botanists.
    • -
    • Napalm will now properly remove weeds from a tray if the plant in it has the fireproof gene.
    • -
    • Gangs no longer get soporific rounds for their sniper rifles.
    • -
    • Syndicate Contracts. Use the new contract uplink to select a contract, and bring the assigned target dead or alive to the designated drop off. Call for the extraction pod and send them off for your TC payment, with much higher rewards for keeping them alive. A high risk, high reward choice for a traitor who wants a real challenge.
    • -
    • New 20 TC contract kit - supplies you with your contractor loadout and uplink.
    • -
    • Targets successfully extracted will be held for ransom by the Syndicate after their use to them is fulfilled. Central command covers the cost, but they'll be taking a cut out of station funds to offset their loss...
    • -
    • Adds a third random item, as well as a small guide on using the contract kit. Also added new possible items that can appear.
    • -
    • Supplied space suit in the contract kit is now an improved variant on the normal Syndicate version.
    • -
    • TC payouts adjusted to be a bit more fair to the contractor. Total payout can never be below a certain threshold.
    • -
    • Broken dropoff locations work again, and general bugfixes.
    • -
    • Contract kit comes with a contractor baton - a unique, lightly electrified weapon to help complete your contracts.
    • -
    • Finalized payment system for contracts; much more balanced for contractors. No more extremely low paying contract sets.
    • -
    • Generated contracts will all have unique targets, no more duplicates.
    • -
    • Extraction droppod explosion has been removed, it'll only damage the tile it lands on.
    • -
    • Extraction pods get sent to the jail immediately again.
    • -
    • Refactored classic_baton code.
    • -
    • Contractor Hub. A unique store for contractors to buy items with Contractor Rep, with two Rep being given when completing a contract.
    • -
    • Contractor pinpointer, available through the Hub. A very inaccurate pinpointer that ignores suit sensors.
    • -
    • Call reinforcements, available through the Hub. Limited to a one-time buy for a contractor, you can purchase an agent to be sent down to help in your mission. Role is polled to ghosts.
    • -
    • Blackout, available through the Hub. Disable station power for a small duration - an expensive, but powerful option of getting into secure areas.
    • -
    • Fulton extraction, available through the Hub. Purchase a fulton extraction kit to help move your targets across the station for those difficult dropoffs.
    • -
    • Assigning yourself to another tablet will give you another contract set.
    • -
    • Contractors can now reroll their contracts a small number of times.
    • -
    • Brand new sprites! A redesign of the specialist space suit, and the kit's own unique tablet. Done by Mey Ha Zah.
    • -
    • Displays contract target jobs under their name.
    • -
    • New locations, such as maintenance, are now possible dropoff locations.
    • -
    • Contractor kit pop cap reduced from 20 to 15.
    • -
    • You can no longer get haunted 8balls from contractor kits.
    • -
    • Pods and shuttles should no longer be valid dropoff locations.
    • -
    • Contract tablets will no longer break when one of your contracts is deleted from the world.
    • -
    • Baton inhands for the right hand now shows the right direction.
    • -
    • Mice don't chew on wires anymore while they're on your person.
    • -
    • Bloodsucker heart theft objective now completes successfully.
    • -
    • Blacklists turret protected areas, the toxins test range, asteroid ruins, and solars from being valid dropoff locations for contracts.
    • -
    -

    Linzolle updated:

    -
      -
    • pacifists can no longer meatspike living things
    • -
    • flypeople being unable to gain nutrition from eating vomit
    • -
    • targetting mouth on help intent now properly nose boops
    • -
    • cmo hypokit now holds the same amount of items as normal kits
    • -
    -

    Moonlit Protector updated:

    -
      -
    • Introducing the 'Heroic Beacon', standing vigil over service the curator can assume one three different historic heroes, each determining their equipment and emergent playstyle to suit the player; a beacon can be found in the curator's backpack upon spawning
    • -
    • Become the Braveheart, a fierce scottish warrior armed with a ceremonial claymore, spraycan, kilt and a disregard for underwear with the scottish themed hero pack.
    • -
    • A unique mention is the "First man on the Moon" heroic pack, with a two piece space worthy suit, air tank & a GPS for recreating a key spessfaring moment in history.
    • -
    • The Curadrobe has been stripped & refilled full of helpful library supplies, including varieties of pens and glasses including the jamjar's.
    • -
    • The curator's explorer equipment & whip has been moved into the 'Courageous Tomb Raider' heroic pack; removed from the backpack & the Curavend respectively.
    • -
    -

    MrJWhit updated:

    -
      -
    • Added minor station things
    • -
    • re balanced r-walls
    • -
    • Evens both sides of the gas containers TEG with reinforced windows
    • -
    • Removed egun in every head locker, replaces RPD with air pump in science, fixes a computer in sec, moves hand teleporter, and removes decals under lockers.
    • -
    -

    MrPerson updated:

    -
      -
    • Solar panels will visually rotate a lot more smoothly instead of being locked to only 8 directions.
    • -
    • Timed solar tracking is in degrees per minute. You're still not gonna use it though.
    • -
    -

    Naksu updated:

    -
      -
    • Time based free rerolls
    • -
    • Refactored Blobs
    • -
    • Blob rerolls now give the blob 4 different options to choose from, rather than forcing a single random one.
    • -
    -

    NecromancerAnne and goldnharl updated:

    -
      -
    • Sprite cleanups and animations for energy guns.
    • -
    -

    NecromancerAnne and zawo and zeroisthebiggay and carlarctg updated:

    -
      -
    • The Infiltrator Bundle, an armor kit for 3TC. Murder people in style!
    • -
    • Some pajamas for nukies to get plenty of bed rest.
    • -
    • halved firefight carry delay with latex or nitrile gloves
    • -
    • headset upgrade is cheaper
    • -
    -

    Owai-Seek updated:

    -
      -
    • Butter Bear
    • -
    • Crab Burger, Bisque, Crab Rangoon, French Onion Soup, Empowered Burger, Chicken Nugget box.
    • -
    • +++ Spider Eggs to Exotic Meat crate. --- Bacon from Exotic Meat crate.
    • -
    • Tweaked Crab Recipes
    • -
    • Butter Bear aka Terrygold
    • -
    • Food Crafting is now 5 deciseconds instead of 30.
    • -
    -

    Putnam updated:

    -
      -
    • Swarmers, portal storm, wormholes are now controlled by dynamic.
    • -
    • Dynamic-controlled events can now have a minimum start time.
    • -
    • Threatening meteors are more common (though still have pretty strict requirements)
    • -
    • Different storytellers now balance around different expected players-per-antag; default was 5, now intrigue/story/random have 7 and calm has 10.
    • -
    • Clown ops is now available as a roundstart antag in dynamic.
    • -
    • Sentient disease and revenant are now in the event pool rather than the antag pool (with the logic that they're both completely useless and unfun to play if people are actually playing against them).
    • -
    • A new formulation of extended was added to the storytellers; no antags, but still spending threat on events.
    • -
    • Fixed a runtime in dynamic due to my misunderstanding pickweightAllowZero
    • -
    • Made conversion storyteller 0-weight-by-default.
    • -
    -

    Putnam3145 updated:

    -
      -
    • Salbutamol causes jittering now.
    • -
    • Made lickable pref save
    • -
    • Traitor classes for traitors: a new way for traitors to have objectives assigned.
    • -
    • Actually made things work as intended.
    • -
    • Removed a redundant turf melting check from the supermatter.
    • -
    • Removed "realistic tcomms lag"
    • -
    • Removed some particularly bad flavor objectives.
    • -
    • Power sink objective is 10x as easy to get
    • -
    • Processing objectives now properly stop once won
    • -
    • MKUltra no longer explodes into lovegas when it fermi explodes, instead causing a regular ol' fireball.
    • -
    • Eigenstasium OD flavor text less restrictive
    • -
    • Dynamic voting should work absent of a config.
    • -
    • Autotransfer vote now requires actual transfer votes to transfer.
    • -
    • More dynamic fixes
    • -
    • Server-run votes aren't subject to vote cooldown
    • -
    • Mass hallucination can better be admemed
    • -
    • Waffle co objective rewritten to make more clear it's not a murderbone objective
    • -
    • CTF spawns, random animals and possessed blades can now be pinged for ghost roles.
    • -
    • A bunch of polls now work with ghost role eligible non-observers.
    • -
    • Removes superfluous line in supermatter processing.
    • -
    • Power sink objective processing now makes sense.
    • -
    -

    Qustinnus/floyd, Ghommie updated:

    -
      -
    • To save costs, Nanotrasen has removed the emergency battery ejection systems in modular computers. We realized saving the batteries isn't really important.
    • -
    • You can squash spiderlings with your bare hands now.
    • -
    • Being deafened properly stops jukebox music from playing.
    • -
    • admin multicam toggles no longer tells everyone but only admins and AIs
    • -
    -

    Ragolution updated:

    -
      -
    • All winter coats and hoods might be different if slightly from one a other.
    • -
    • Adjusted Bartender's Drink Flinging print message to not include name of target turf and save immersion.
    • -
    -

    Seris02 updated:

    -
      -
    • tg genetics
    • -
    • illegal technology
    • -
    • rebalanced rising bass's buttom actions from repulse to side kick
    • -
    • projectiles and rising bass and items and rising bass
    • -
    • a very specific fix with tails and wagging
    • -
    • duffel bags of holding
    • -
    • quirk blacklist fixing
    • -
    • robotics console button swapping
    • -
    • fixed thieving gloves not pickpocketing fast
    • -
    • mentor de/rementor button
    • -
    • mentor !msg
    • -
    • bloodsuckers being unable to accept genes
    • -
    • removes xray from the gene pool
    • -
    -

    Skoglol updated:

    -
      -
    • Fixed gibber exploit.
    • -
    -

    Timberpoes updated:

    -
      -
    • Shuttle countdowns once again read like "01:05" instead of "01: 5".
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • Three new arm implants, shield for sec, janitor and service
    • -
    • Two new legion drop. Assistant and Bee-Activist
    • -
    • Three new posters have been issued to the printing press
    • -
    • Well contruction, grubs to ash walker home, more seeds for ash walkers.
    • -
    • Wooden buckets can be made from 2 planks of wood, Tower caps also can be used on a fire to make coal
    • -
    • Makes all ashwalker round start seeds 5 yield and 50 harvest so that they can get good crops in rather then failing after 1 harvest
    • -
    • arrow crafting has been fixed
    • -
    • Blobs now can store 250 points.
    • -
    • Alien bar stool is no longer bronze
    • -
    • 28 days log changlogs have been added well 56+ day old changlogs have been removed
    • -
    • Added sunglasses that are able to be huds AND prescription
    • -
    • Prescription sunglasses and crafting of each new type for - Diagnostic, Med and Sec
    • -
    • Diagnostic Sunglasses
    • -
    • Blackists Prescription HUDs from sunglasses crafting
    • -
    • Cotton/Durathread now stack to 80 bundles
    • -
    • Medical hardsuits now have a Medi-Hud built into its helm
    • -
    • Removed old unused Techweb Node selling
    • -
    • Corrects snowcones names and a pixle. Corrects Space Wind snowcone as well
    • -
    • Arrow crafting has been fixed... Again...
    • -
    • Soidifaction of and uranium can be done as well as making new bluespace shards
    • -
    • Xeno and Fountain Hall will no longer spawn more then once
    • -
    • Makes the game want to spawn in more then one tumor maybe
    • -
    • Number of paper work in the crate "freelance paperwork" is half
    • -
    • A few cases were something their is unneeded copy past replaced with many 1 in spawns
    • -
    • Potass Iodide has been fitted into standered borgs as well as medical ones. Upgraded hypos now have Prussian Blue as well.
    • -
    • Syndi borgs Potass Iodide has been swapped for Prussian Blue
    • -
    • No longer can you get the The End and Russian Flask without being the donator
    • -
    • Pipes are small now
    • -
    • Edaggers now enbed as intended
    • -
    • The sleeper agents can be outfitted with some larger then normal sunglasses for 1TC in Badass category
    • -
    • The Syndi Medical borg has been outfitted with the newest and latest ~~Stolen~~ MediCo Gear on the market
    • -
    • Ninjas may be asked to steal the CMO's smart drapes
    • -
    • Hyper Cell steal goal is upgraded to a bluespace cell, as well as the BoH goal now wants a type of BoH rather then the normal default one.
    • -
    • Gutlunches have gotten teeth now and will eat legs, arms, and organs! - Tho are picky and will not eat the brain just laying about!
    • -
    -

    Useroth updated:

    -
      -
    • contractor tablets spawned with invalid icon_state
    • -
    -

    Xantholne updated:

    -
      -
    • Bumbles is now actually in every station's hydroponics.
    • -
    • Bumbles will now actually rest, sit up, and buzz
    • -
    -

    YakumoChen updated:

    -
      -
    • Nekomata (double cat) tails.
    • -
    • 2CAT LMAO
    • -
    • Mining base looks more natural where it's spawned.
    • -
    • Templates Headers will now correctly use the Citadel Official Wiki Link
    • -
    -

    Yenwodyah updated:

    -
      -
    • Bear traps and bolas apply slowdown correctly again
    • -
    • Recycler doesn't delete people in mechs, cardboard boxes, spells, etc. anymore.
    • -
    -

    actioninja, ninjanomnom updated:

    -
      -
    • Being fat is no longer lessened by flying.
    • -
    • The slowdown from grabbing someone no longer applies when you're floating.
    • -
    -

    bunny232 updated:

    -
      -
    • Box bar now has a lightswitch.
    • -
    • fixes several piping issues around box station
    • -
    • moved a scrubber and vent down 5 pixels
    • -
    • Box station captain office now has a standard issue renault
    • -
    • Box bridge now actually has the air distro connected
    • -
    -

    dapnee updated:

    -
      -
    • Lambdastation and it's accompanying files
    • -
    • Robotic's APC, a few missing buttons (bridge shutters and crematorium), paramedic has spawn locations now, two rapid cable deployers to engineering
    • -
    • Renamed some doors and edited engineering to be a bit more open in one spot
    • -
    • a few APCs with bad area tags, access on maintenance doors fixed, engine APC is now connected to the grid instead of power created by the engine
    • -
    • the two syringe guns in medical were removed
    • -
    • couple gas masks around atmos
    • -
    • direction on turbine plasma pressure tank, cloning actually has a cloning console now
    • -
    -

    floyd updated:

    -
      -
    • Everything made from glass in the game has a little more tegridy and doesnt break from a single punch.
    • -
    -

    kappa-sama updated:

    -
      -
    • removed laptops giving slowdown when open
    • -
    • removed (mostly aesthetic) requirement to become hulk
    • -
    • changed add to remove on crit
    • -
    • a super combat shotgun that loads and fires 2 shells at a time
    • -
    • replaces bubblegum's blood contract drop with the super shotgun
    • -
    • 60 seconds instead of 120 for firebreath
    • -
    -

    keronshb updated:

    -
      -
    • blobs now receive a 50% cost refund on attacks that don't spread
    • -
    • reflector blobs are considerably tougher
    • -
    • fixed an integrity
    • -
    • attempting to turn a damaged strong blob into a reflector blob now refunds points
    • -
    • also fixes blob node camera jump (from another PR)
    • -
    -

    kevinz000 updated:

    -
      -
    • Mobility flags are here. Fixed some edge cases with xeno hardstuns and similar stuff like warden's shotgun hardstuns and yeah.
    • -
    • Security now has riot quarterstaves in their lethal shotgun locker.
    • -
    • Pushing is no longer free space movement.
    • -
    • You can now right click to point the tip of some sharp tipped weapons at people.
    • -
    • compact defibs have 10k cells again
    • -
    • music max characters per line is now 150 instead of 50.
    • -
    • storage no longer closes while being dragged
    • -
    • disabler taser alt fire shots are faster and have a 14 tile range now
    • -
    • HoS taser now only applies tased effect for 1 second and warden's pump action stun blaster no longer applies it at all.
    • -
    • Nanite adrenals have been nerfed.
    • -
    • Ninja stungloves nerfed 49 stamina to 25 (so they're basically just better than stunbatons).
    • -
    • Batons now also trigger disarm behavior in disarm intent and not just on right click.
    • -
    • combat mode/sprint/resisting lying down/attempting to crawl under all refactored, added combat/sprint mode lockouts, being locked out of combat mode no longer disables it and allows right click interactions etc etc
    • -
    • hands free actions no longer check mobility and only consciousness.
    • -
    • Minimaps, accessible via a button on OOC.
    • -
    • unnecessary blindness post-unconsciouss has been fixed with a hack that's almost as garbage as the code that caused it in the first place.
    • -
    • synthflesh and rezadone now take total amounts of both applied and existing reagents rather than only existing and only applied respectively.
    • -
    • reverts bubblegum bloodling swarming.
    • -
    • Beam rifles shot count 10 --> 5 and can no longer pierce. Also renders properly for reflections against blobs and some other things.
    • -
    • being stunned no longer stops an ai from undeploying from a shell.
    • -
    • beam rifles are less terrible code
    • -
    • slowdown on items should now be set by set_slowdown().
    • -
    • hypereutactic blades properly slow down their wielders when being used and vv-editing an item's slowdown will once again properly update someone's slowdown to take the new value into account.
    • -
    • stunprods knockdown again.
    • -
    -

    monster860 updated:

    -
      -
    • You can now moan in soft crit
    • -
    • Use Ctrl-Shift-direction key to shift your characters position. Use for ERP.
    • -
    -

    necromanceranne updated:

    -
      -
    • Ports New Sleeping Carp
    • -
    • Ports the martial arts refactors, which includes things like moving martial into the martial subfolder and renaming it _martial, and cleans up human_defense rising bass/sleeping carp exclusive code.
    • -
    • Particle Defender is now a much more sane weapon.
    • -
    • Tasers are no longer ignoring stimulants.
    • -
    • Blood beam can't create harvesters out of mech pilots.
    • -
    • Some minor fixes to fakedeath and a tg fix port.
    • -
    • Bleeding out all your blood from getting love tapped by a toolbox.
    • -
    • Diagnostic HUDSunglasses are better than ever!
    • -
    • Sprite fixes I hope
    • -
    • You can no longer acquire stun bullets in the .45 calibre. You can get the 30 damage version out of the autolathe instead.
    • -
    • KITCHEN GUN (TM) is a lot stronger. Cleaning bullets are a whole 40 damage!
    • -
    • Fixed turrets not allowing their guns to be recovered.
    • -
    • Altered the plastitanium rapier from a perfect AP but weaker esword equivalent to a more unique sleep inducing melee weapon.
    • -
    • Touched up all the relevant sprites.
    • -
    • Nightvision goggles are nerfed all-round. Flashes have actual use against people using nightvision, as do flashbangs.
    • -
    • Syndicate nuclear agents get to live peacefully knowing their eyes are well protected by their special night vision goggles. Spider clan also get these goggles.
    • -
    -

    raspyosu updated:

    -
      -
    • some flavor text for lunge, cloak
    • -
    • mesmerize, cloak functionality/requirements
    • -
    • mesmerize, lunge, cloak
    • -
    • lunge telegraph sound
    • -
    • mesmerized status icon flavor text
    • -
    • cloak sometimes not restoring initial move intent
    • -
    • mesmerize (line of sight checking system and remove progress bar)
    • -
    • nerf: lunge, mesmerize
    • -
    -

    spookydonut updated:

    -
      -
    • adds selective duplicate component mode
    • -
    -

    wesoda25 updated:

    -
      -
    • You no longer hit fermenting barrels when taking reagents from them
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • kilo shuttle less bad
    • -
    • tauric contractor space suits
    • -
    • ghost hud and nv defaults on
    • -
    • syndicate elite hardsuit helmet doesnt hide masks anymore
    • -
    • syndicate contractor helmets are no longer secretly lead
    • -
    • Space Fashion has discovered a new way to wear bandannas. With some simple minor adjustments and ties, bandannas can be made into fashionable neckerchiefs!
    • -
    • Box Station has gotten a brand new brig. Go and check it out and discover all the quirky little soulbits.
    • -
    • box brig miscellaneous issues
    • -
    • box station hos office
    • -
    - -

    26 February 2020

    -

    AnturK ported by kevinz000 updated:

    -
      -
    • Dueling pistols have been added.
    • -
    -

    Arturlang updated:

    -
      -
    • Replaces a lot of ingame UIs with TGUI next, increasing performance drastically.
    • -
    • Each night for bloodsuckers will last longer due to the sun dimming.
    • -
    • You cant level up for free, now you have to pay blood for power.
    • -
    • Bloodsuckers are no longer as resistant to hard stuns and regenerate less stamina. and a lot of their cooldowns are a lot higher.
    • -
    • Removed text macros from the chem dispenser.
    • -
    • Replaced with dispenser input recording macros.
    • -
    • Fancifying makeshift switchblades now works
    • -
    • Shields will no longer block lasers, and will break if they take too much damage.
    • -
    • Added a TGUI Next interface for crafting
    • -
    • Removed the old TGUI slow crafting interface
    • -
    • The MK2 hypospray now
    • -
    • The debug outfit is now kitted out for whatever debbuging needs.
    • -
    • Fixed the pandemic naming and the radiation healing symptom UI crashing
    • -
    • Hyposprays now switch modes on CTRL click, instead of alt, as it was already reserved for dispension amount.
    • -
    • Nanite interfaces have gotten a rework to TGUI Next, and can now support sub-programs. add:Adds the nanite sting program, which will allow you to manually sting people to give them nanites, changeling style.
    • -
    • The pandemic can no longer make vaccines or synthblood as quickly.
    • -
    • The syndicate uplinks interface has been redone in TGUI Next
    • -
    • Valentines can now be converted by bloodsuckers
    • -
    -

    Bhijn updated:

    -
      -
    • Click-dragging will now only perform the quick item usage behavior if you're in combat mode.
    • -
    -

    BlueWildrose updated:

    -
      -
    • podpeople tail wagging
    • -
    • lifebringer ghost role fixes
    • -
    -

    BuffEngineering, nemvar. updated:

    -
      -
    • Addicts can now feel like they're getting their fix or kicking it.
    • -
    • Aheals now remove addictions and restore your mood to default.
    • -
    -

    CameronWoof updated:

    -
      -
    • Lighting looks better now. I can say that because the PR wouldn't be merged and you wouldn't be reading this if it wasn't true.
    • -
    • Ammonia and saltpetre can now be made at the biogenerator.
    • -
    -

    Commandersand updated:

    -
      -
    • uplink centcomm suit doesn't have sensors
    • -
    -

    DeltaFire15 updated:

    -
      -
    • Nar'Sie runes no longer benefit from runed floors.
    • -
    -

    Detective-Google updated:

    -
      -
    • the POOL. remove: boxstation dorms 7
    • -
    • valentines candy no longer prefbreaks
    • -
    • Loudness Booster pAI program
    • -
    • Encryption Key pAI program
    • -
    -

    EmeraldSundisk updated:

    -
      -
    • Connects mining's disposal unit on Delta.
    • -
    • Slight visual adjustments to the immediate affected area.
    • -
    -

    Feasel updated:

    -
      -
    • Buffed dissection success chances.
    • -
    -

    Ghommie updated:

    -
      -
    • The anomalous honking crystal should now properly clown your mind.
    • -
    • Stopped the ellipsis question mark from being displayed twice in the examine message for masked/unknown human mobs.
    • -
    • Made the aforementioned ellipsis question mark display on flavor-text-less masked/unknown human mobs too for consistency.
    • -
    • Stopped an APTFT exploit with spray bottles.
    • -
    • Fixed the detective revolver being quite risky to use.
    • -
    • Hair styles and undergarments are yet again free from gender restrictions.
    • -
    • Clown ops will find bombananas and clown bomb beacons instead of minibombs and bomb beacons in their infiltrator ship now.
    • -
    • For safety, the syndicate shuttle minibombs and bombananas come shipped in a box. Please don't instinctively eat any of those nanas, thank you.
    • -
    • Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive (such as cyber implants) to normal nuke ops will now be properly unavailable/available to clown ops.
    • -
    • Fixed bananium energy sword/shield slips.
    • -
    • Buffed said slips to ignore no-grav/crawling/flying as well as adding some deadly force to the e-sword.
    • -
    • Fixed the 'stache grenade anti-non-clumsy user check.
    • -
    • Doubled the timer for the sticky mustaches effect from the above grenade (from 1 to 2 minutes)
    • -
    • Fixed an edge case with the chaplain armaments beacon spawning the box in nullspace.
    • -
    • The playback device's cooldown now proportionally increases with messages longer than 60 characters (3 seconds is the default assembly cooldown).
    • -
    • Fixed space ninjas "Nothing" objective. Now you gotta steal some dandy stuff such as corgi meat and pinpointers as a ninja too.
    • -
    • Fixed maploaded APC terminals direction.
    • -
    • Nerfed magnetic rifles/pistols by re(?)adding power cell requirements for it. These firearms must be recharged after firing 2 magazines worth of projectiles and are slightly more susceptible to EMPs.
    • -
    • Fixed the tearstache nade not properly working.
    • -
    • Buffed it against space helmet internals.
    • -
    • Holographic fans won't display above mobs and other objects anymore.
    • -
    • Fixed paraplegics appearing as shoeless.
    • -
    • Fixed the petting element.
    • -
    • Fixed slipping.
    • -
    • Refactored mob holders into an element.
    • -
    • Fixed a few minor issues with that feature. such as mismatching sprites for certain held mobs and a slight lack of safety checks.
    • -
    • holdable mobs can't force themselves into people's hands anymore.
    • -
    • Milkies fix.
    • -
    • Fixed some mounted defibrillator issue with the altclicking functionality.
    • -
    • Fixed no-grav lavaland labor/mining shuttle areas.
    • -
    • Fixed a little issue with sleeper UI and blood types.
    • -
    • Fixing accidental nerfs to the magpistol magazine.
    • -
    • The Lavaland's Herald speech sound should only play if they are actually speaking.
    • -
    • Nerfed cargo passive points generation from 500 to 125 creds per minute.
    • -
    • Fixed whitelisted/donor loadouts
    • -
    • Childproofs double-esword and hypereuplastic blade toys.
    • -
    • Some reagent holders (such as cigarettes, food) are not suitable for reagents export anymore, while unprocessed botany crops will only net 1/3 of the standard reagents values.
    • -
    • Export scanners now include the reagents value in the price report.
    • -
    • Fixed a little inconvenience with the character setup preview dummy having extra unwarranted bits.
    • -
    • Stopped role restricted uplink items from being discounted despite not being purchasable most times.
    • -
    • Missing words replacement file for the gondola mask.
    • -
    • Fixed an issue with the nearsighted prescription glasses taking over worn eyewear.
    • -
    • Fixed AI unanchoring not properly removing the no teleport trait. My bad.
    • -
    • Fixed another issue with hering comsig.
    • -
    • Fixed dozen missing privates sprites.
    • -
    • A little fix concerning some R&D and reagents.
    • -
    • Further mob holder fixes.
    • -
    • Fixed being unable to dump a trash bag's contents directly into disposal bins.
    • -
    • Doubled the halved flavor text maximum length.
    • -
    • Reduced tongue organ damage and tasting pH message spam.
    • -
    • Fixed agent IDs not registering the inputted name. Thanks MrPerson.
    • -
    • Fixed solar panels/trackers (de)construction being a bit wonky.
    • -
    • Fixed something about slime blood and the law of conservation of mass.
    • -
    • Fixed flypeople being emetic machine guns.
    • -
    • Fixed virology being unable to be done with synthetic blood.
    • -
    • Renamed "blaster carbine" and "blaster rifles" back to "energy gun" and "laser gun" respectively
    • -
    • Fixed magnetic rifles & co being inconsistent with printed energy guns and start with an empty power cell.
    • -
    • Reverted practice laser gun sprites back to their former glory. Mostly.
    • -
    • Fixed sprint buffer cost and regen being rounded down.
    • -
    • Nerfed the fermenting barrel export industry.
    • -
    • Reagent dispensers selling price no longer takes in account the reagents volume. It's already handled by reagents export.
    • -
    • pAIs are yet again unable to perform certain silicon interactions with machineries yet again.
    • -
    • Fixed pAI radios inability to be toggled on/off.
    • -
    -

    Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer, Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle, MrPerson, ArcaneMusic and zxaber) updated:

    -
      -
    • You can now make toolboxes out of almost any solid material in an autolathe
    • -
    • adds Knight's Armour made out of any materials
    • -
    • new ruin found in lavaland protected by dark wizards, I wonder what they're guarding
    • -
    • You can now put a bunch more mats in the coin mint and autolathe
    • -
    • Adamantine and Mythril are now materials (Adamantine still only from xenobio, Mythril still only from badminnery). Adamantine boosts an item's force by 1.5, Mythril gives an item RPG statistics.
    • -
    • most custom sprites for coins have been lost
    • -
    • You can now give your ass acute radiation poisoning
    • -
    • floydmats now apply to all objs / items
    • -
    • you can now make tables and chairs out of any material
    • -
    • Fixes being able to exploit fully upgraded destructive analyzers to multiply materials
    • -
    • An old monastery from a previously abandoned sector of space has recently resurfaced in some regions surrounding the station.
    • -
    • Latent scans of the surrounding systems have picked up trace signs of new, smaller cult constructs, however these signatures quickly vanished.
    • -
    • In other news, scavengers in your sector have been seen occasionally with classically recreated maces, so autolathe firmware has been upgraded to accommodate this.
    • -
    -

    Hatterhat updated:

    -
      -
    • Zombie powder is now instant when ingested, but delayed when injected or applied through touch.
    • -
    • The H.E.C.K. suit is now goliath tentacle resistant and probably better for acid resistance.
    • -
    • The Engineering techfab can now print standard and large RCD compressed matter cartridges.
    • -
    • The Experimental Tools node now has the Combifan projector, blocking both temperature and atmospheric changes.
    • -
    • fiddles with the seed extractor upgrade examine to make it not shit
    • -
    • Formaldehyde prevents organ decay and corpses' miasma production at 1u in the body.
    • -
    • Epinephrine pens now contain 3u formaldehyde. This should not kill you.
    • -
    • The ships often crashed by Free Golems on Lavaland now have GPSes. They're off, by default, but an awakening Golem could easily turn one on.
    • -
    • Standard RCD ammo can now be printed from Engineering-keyed techfabs once you hit Industrial Engineering.
    • -
    • Consoleless interfaces are now default - this means unrestricted protolathes and circuit imprinters can now be interfaced with by interacting with the machine itself.
    • -
    • Multitools can now actually be printed from Engineering and Science protolathes/techfabs once you unlock Basic Tools.
    • -
    • Husking (from being burned to shit) can now be reverted! 5u rezadone or 100u synthflesh, at below 50 burn.
    • -
    • Turning a body into a burnt husk now takes more effort. 300 burn's worth of effort.
    • -
    • Buckshot individual pellet damage up from 10 to 12.5. Still firing 6 pellets.
    • -
    • Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay into histamine. Instead, it just prevents your organs from rotting into nothing.
    • -
    • You can now purify eldritch longswords with a bible. This creates purified longswords, which do not have anti-magic properties, but are still good for swinging at cultists.
    • -
    • Extend votes! Ported from Hyper, ported from AUstation.
    • -
    • mechs with stock parts now have icons
    • -
    • Pie reagent transfer now requires an uncovered mouth.
    • -
    • Biogenerators can now actually generate universal enzyme.
    • -
    • The Basic Tools node now unlocks the multitool for printing on Engineering and Science fabricators.
    • -
    • The Ash Walkers' nest on Lavaland now starts with three bowyery slabs.
    • -
    • You can now welder-harden arrows. It might take longer.
    • -
    • Silkstring's costs adjusted for bows and whatnot.
    • -
    • Grammar adjusted on a lot of things relating to bows.
    • -
    • Pipe bows' bowstring doesn't look like it replicated itself upon draw.
    • -
    -

    IHOPMommyLich updated:

    -
      -
    • Changed the multiplicative_slowdown of Stimulants from -1 to -0.5
    • -
    -

    IronEleven updated:

    -
      -
    • Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms.
    • -
    -

    KathrinBailey updated:

    -
      -
    • Missing turf_decals in Cargo Office.
    • -
    • Turns on the docking beacons on Box.
    • -
    • Fixes Starboard Quarter maint room being spaced. It was never intended to be like how it was.
    • -
    • The aforementioned maint room not having stuff in it.
    • -
    • varedited photocopier sometimes not opening any UI.
    • -
    • Atmos differences in Starboard Quarter maint.
    • -
    • Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with airless plating.
    • -
    • Rotates AI satellite computers. These have probably been like this since computers had the old sprites and no directional ones. You shouldn't sit at a chair to operate a sideways computer.
    • -
    -

    KrabSpider updated:

    -
      -
    • The Van Dyke is no longer Fu Manchu.
    • -
    • Gets rid of a Fu Manchu imitation.
    • -
    -

    Kraseo updated:

    -
      -
    • You can no longer pull before wearing boxing gloves to bypass the grab check.
    • -
    • Nightmares no longer delete entire guns from existence for merely having a light on them.
    • -
    -

    Linzolle updated:

    -
      -
    • Bows now will not delete an arrow if it cant fire it.
    • -
    • bows now like and respect sprite changes
    • -
    -

    MalricB updated:

    -
      -
    • "Shaggy" sprite from virgo
    • -
    • "shaggy" option in the character customization
    • -
    -

    MrJWhit updated:

    -
      -
    • Removed meteor defense tech node
    • -
    • TEG
    • -
    -

    Naksu updated:

    -
      -
    • Odysseus chem synthesizing now works again.
    • -
    -

    Owai-Seek updated:

    -
      -
    • Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates.
    • -
    • Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat Crate
    • -
    • Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint.
    • -
    • Organised some crates with sub-categories. Also, moved all vendor refills to a new tab.
    • -
    • Moved Grill to Service Tab
    • -
    • Engineering Hardsuit Access
    • -
    • Blood Crate now has all of the current blood types.
    • -
    • Birthday Cake Recipe is now the same as TG.
    • -
    • Added Soy Sauce and BBQ Packets to Dinnerware Vendor.
    • -
    • Added nurse outfit, nurse cap, and mailman hat to loadout.
    • -
    • Changed the name of scrubs to blue, green, and purple scrubs.
    • -
    • Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin.
    • -
    • Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box
    • -
    • Mops can now be printed at service lathe once tools are researched.
    • -
    • Biobags can hold most organic limbs/organs, but not brains, implants, or cybernetics.
    • -
    • Trash Bag can now hold limbs (but not heads.)
    • -
    • Most snack vendor items reduced by 1.
    • -
    • Trash Cans are now actually craftable, and only require metal instead of plastic.
    • -
    • Bacon and Eggs, Drying Agent Bottle.
    • -
    • Mugs now show reagent colors of contained reagents. Thanks Seris!
    • -
    • Reorganized all food recipes, (hopefully) making things easier to find.
    • -
    • Trays now have a whitelist, allowing them to pick up normal sized foods, bowls, glassware, booze, ect.
    • -
    • Easter foods are no longer their own Misc Food Category on the top of the menu.
    • -
    • fixed a few typos/capitalization consistency.
    • -
    • Mexican Foods are their own Subcategory.
    • -
    • Donuts are their own Subcategory
    • -
    • Moved Sweets from Misc Food in with Pies. Renamed to Pies & Sweets
    • -
    • BROOM
    • -
    • Janitor Vendor now has gear for two Janitors.
    • -
    -

    PersianXerxes updated:

    -
      -
    • SMES and PACMAN attached to gulag Security to power electrified windows remove: Removed Sec vendor from gulag Security
    • -
    • Separation of gulag and public mining
    • -
    • Better clarified the comment explaining the contraband tag.
    • -
    • Cargo nuclear defusal kits now require an emag'd drop pod console to be purchased.
    • -
    • Added Kilo Station
    • -
    • Adjusts Kilo Station to be more in line with Citadel standards
    • -
    • Added area icons required to make Kilo Station editable on Citadel code
    • -
    • Fixed a reagent container on Kilo pointing to a nonexistent reagent
    • -
    • Adds Kilo Station to the maps config file, does not fix Meta Station's population requirement
    • -
    -

    Psody-Mordheim updated:

    -
      -
    • You can now make synth-flesh with synthetic blood.
    • -
    • You can now make synthetic blood via mixing saline glucose, iron, stable plasma and heating it to 350 temp.
    • -
    • You can mix synthetic blood and cryoxadone to create synth-meat in addition to normal blood.
    • -
    • Disfiguration Symptom.
    • -
    • Deoxyribonucleic Acid Saboteur Symptom.
    • -
    • Polyvitiligo Symptom.
    • -
    • Revitiligo Symptom.
    • -
    • Vitiligo Symptom.
    • -
    -

    Putnam3145 updated:

    -
      -
    • Added logging to various consent things.
    • -
    • Lots of new traitor objectives
    • -
    • gender change potion now respects prefs
    • -
    • Hypno prefs work better.
    • -
    • Panic bunker is now round-to-round persistent
    • -
    • Relief valve now has a TGUI-next UI
    • -
    • Atmos reaction priority works now.
    • -
    • map voting doesn't suck anymore
    • -
    • Dynamic now defaults to "classic" storyteller instead of just failing if the vote didn't choose a storyteller.
    • -
    • antag quirk blacklisting works now
    • -
    • default should be... default
    • -
    • all supermatter damage is now hardcapped
    • -
    • Supermatter sabotage objective no longer shows up with no supermatter
    • -
    • Mining vendors no longer fail and eat your points iff you have precisely enough points to pay for an item
    • -
    • Licking pref
    • -
    • Fixed IRV.
    • -
    • Runtime if nobody has a chaos pref set
    • -
    • IRV fixed... again
    • -
    • temporary flavor text can now be of reasonable length
    • -
    • Shooting the supermatter now adds to the supermatter's power. CO2 setups beware!
    • -
    • Logging for renaming
    • -
    -

    Raiq & Linzolle updated:

    -
      -
    • Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting, silk string used in bow crafting, harden arrows - Ash walkers crafting, ash walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers for ash walkers as well, just to hold some arrows well out on the hunt!
    • -
    -

    Seris02 updated:

    -
      -
    • tweaked the way the SM works
    • -
    • custom reagent pie smite
    • -
    • hijack implant
    • -
    • changed mentions of the issilion proc to hasSiliconAccessInArea based on what the proc is used for
    • -
    • recipe for mammal mutation toxin
    • -
    • polychromic winter coat
    • -
    • thief's gloves
    • -
    • crushing magboots
    • -
    • golden plastitanium toolbox being actually plastitanuium
    • -
    • character slot amount
    • -
    • rebalanced rising bass
    • -
    • string highlighting whitespace
    • -
    • glitch with PKA
    • -
    • meteor hallucinations (again)
    • -
    • Added naked hallucination
    • -
    • crowbarring manifests off crates
    • -
    • makes RCDs cost a better amount
    • -
    • apc icons
    • -
    • rest hotkey
    • -
    • hsl instead of sum of rgb for spraycan lum check
    • -
    • bloodcrawl's cooldown
    • -
    -

    ShadeAware updated:

    -
      -
    • Craftable Switchblades, a weaker subtype of normal switchblades that can be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable Coil. Requires a welder to complete.
    • -
    • You can now actually craft Switchblades.
    • -
    • Switchblades no longer regain their old Makeshift sprite after retracting if you've made them fancy with Silver.
    • -
    • The Captain's Wardrobe, a special one-of-a-kind and ID-locked wardrobe for the Captain that holds all of their snowflakey gear. Remove: Snowflake gear from the Captain's locker, since now it has its own vendor.
    • -
    -

    Tlaltecuhtli, ported by Hatterhat updated:

    -
      -
    • Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning modules and capacitors on construction. This means that they also gain reduced power consumption and EMP protection from higher-tier stock parts.
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • Vault hallway door being all access
    • -
    • Updates change logs
    • -
    • Crafts are now made of plasteel and can be made with 5 sheets
    • -
    • Takes away NT's connections to the Aliens that run the Syndicats
    • -
    • Carps have evolved to take more damage
    • -
    • restock crates for each vender
    • -
    • restock units for all station venders
    • -
    • Sec-vender missing icon
    • -
    • Box station captain office issues maping: Gulag on box can now be accessed
    • -
    • Alien stools and chairs
    • -
    • Bone armor/Dagger are now crafting from bones rather then crafting menu
    • -
    • Firing pins that only works when not on station
    • -
    • Medical locked crates
    • -
    • Russian gear crates have less gear in some cases but all will cost more
    • -
    • Medical locked crates that were not locked
    • -
    • Crates that were out of date are corrected
    • -
    • Heads of staff have been better screened by NT before being promoted
    • -
    • The suit full of spiders also known as a ninja now is a tactical turtleneck
    • -
    • The Wiznerds now dont have suits set to max
    • -
    • Meat wheat no longer has blood
    • -
    • Flat guns can no longer be suppressed
    • -
    • replaced stickmans .45 caliber with 10mm, for consistency.
    • -
    • Meatwheat and Oats now have rarity
    • -
    • Oats now have at lest 50% more flour in them
    • -
    • BDM now uses a PKA rather then a normal KA
    • -
    • Gang tower shield is no longer transparent
    • -
    • Cosmic winter coat now glows like the bedsheet, and holds normal winter coat gear
    • -
    • Express console is now logging what it buys, like the normal console should
    • -
    • Crabs are now made of crab meat.
    • -
    • AIs now understand the old ways of drunken dwarfs
    • -
    • Removes some armored Russian hats from box station round start
    • -
    • Doner items spawning
    • -
    • Engi/Sec Trek suit no longer has 10% melee protection
    • -
    • IPC hearts are now made of robomeat and roboblood thats emp proof. Heals and is all and all just like an normal heart
    • -
    • All robotic organs now have an animation.
    • -
    • IPC's now organs now look like robotic ones, even tho thats not the case game wise
    • -
    • Added a new bee themed bar sign
    • -
    • Makes plywood chair not look as bad.
    • -
    • corndog sprite being miss-spelled
    • -
    • Ash from land of lava now is useable for sandstone
    • -
    • Peach cake slices are no long made by mimes
    • -
    -

    Tupinambis updated:

    -
      -
    • the portion of laws that require harm prevention by silicons has been removed.
    • -
    • silicon_laws.txt config file is required to be modified for full implementation.
    • -
    • masks no longer improperly stick out of helmets when they should be hidden.
    • -
    • Status Displays should now update correctly.
    • -
    • stunbatons now take 4 hits to inflict hard crit, up from 3.
    • -
    • stunbatons no longer disarm targets.
    • -
    -

    Yakumo Chen updated:

    -
      -
    • Rings for your fingers!
    • -
    • New cargo crates and loadout options to bling your rings!
    • -
    -

    YakumoChen updated:

    -
      -
    • Observe is back in the OOC tab
    • -
    • Rings look nicer. Sprites used from RP.
    • -
    • Ring on-hands. Diamond rings sparkle!
    • -
    • You can now propose using a diamond ring in your hand.
    • -
    • Legion skulls behave like bees!!!!
    • -
    -

    Zellular updated:

    -
      -
    • Movement state for pupdozer and its decals
    • -
    • Tweaked the movement state for the pupdozer's eyes
    • -
    -

    ancientpower updated:

    -
      -
    • Fixes an error in pH strips' feedback message.
    • -
    • Ported drink sliding from /vg/station.
    • -
    • Fixes color mismatching with the "genitals use skintone" preference.
    • -
    • Bunny ear style for humanoid species.
    • -
    • Ghosts are now literate.
    • -
    -

    bunny232 updated:

    -
      -
    • Changes the simple animal sentience event from the xenomorph preference to sentience potion preference.
    • -
    -

    coiax updated:

    -
      -
    • Admin and event only pair pinpointers! They come in a box of two, and each pinpointer will always point at its corresponding pair. Aww.
    • -
    -

    deathride58 updated:

    -
      -
    • Spacemen no longer run at lightspeed on local servers.
    • -
    -

    kappa-sama updated:

    -
      -
    • the plant dudes can actually make plant disks now
    • -
    -

    keronshb updated:

    -
      -
    • Added repairable turrets
    • -
    • Adds Tiny Fans to the pirate ship
    • -
    • changes some reinforced windows to plastinanium pirate windows
    • -
    • made the pirate shuttle + turrets bomb resistant
    • -
    • made most pirate machines + consoles indestructible
    • -
    • increased pirate turret health
    • -
    • Adds the CogChamp drink and Sprite
    • -
    • Added burn and knockback to stunhand during HALOS on cult.
    • -
    • fixed accelerated regeneration nanites
    • -
    • fixed mechanical repair nanites
    • -
    • fixed bio reconstruction nanites
    • -
    -

    kevinz000 updated:

    -
      -
    • Custom snowflake plushies are now in config rather than code.
    • -
    • Abductor mindsnapping (aka abductee objectives) can now be "cured" with brain surgery.
    • -
    • Shuttle hijacking has been completely reworked. Alt-click the shuttle as a hijack-capable mind (so traitors, and especially traitors with hijack) to begin or continue a hacking process.
    • -
    • A good amount of the blood RGB rework was cleaned up/reverted, with some notable gameplay changes including: Gibs and blood not having max blood by default (no more easy rampages, cultists), infinite gib streaking, etc etc.
    • -
    • meteor waves are now directional and announces the direction on the command report.
    • -
    • CTF CLAYMORES
    • -
    • shoves buffed, now shoving into a wall twice rapidly will also disarm their weapon.
    • -
    • traitor+bro gamemode minimum population set to 25 until there can be more in depth configuration systems for gamemodes.
    • -
    • no more bluespace skittish locker diving,
    • -
    • moths now have unique laughs and can *chitter.
    • -
    • nuke explosion is now full dev radius for anti lag purposes
    • -
    • Gangs can now only tag with a gang uplink bought spraycan.
    • -
    • dueling pistol accesses have been changed to be more accessible.
    • -
    • mechs no longer have admin logs flooding into IC control console log viewing
    • -
    • Guncode and energy guns have been refactored a bit.
    • -
    • You can now combat mode ight click on an energy gun to attempt to switch firing modes. This only works on guns without right click functions overridden.
    • -
    • shoes can now fit magpistols again.
    • -
    • Projectiles now always hit chest if targeting chest, snipers have 100% targeting zone accuracy. All other cases are unchanged.
    • -
    • The lawyer's PDA cartridge has been rebranded to something more accurate to its true nature.
    • -
    • Refactored ghostreading/etc
    • -
    • Cyborgization will now de-gang people, even gangheads.
    • -
    • reactive repulse armor now has an item limit
    • -
    • beam rifle runtime fix during aiming_beam
    • -
    • fail2topic runtime fix: taking out an ip while incrementing index resulted in accessing the next-next entry instead of the next and results in out of bound errors.
    • -
    • gravity gun repulse and chaos now work in all angles, rather than just basic cardinals and diagonals. fun.
    • -
    • Public autolathes can no longer be hacked.
    • -
    • Energy weapons now once again have their lens in contents.
    • -
    • pais are no longer muted for literally a whole hour on emp.
    • -
    • auto profiler subsystem from tg
    • -
    • Brig cells now are more accurate by using timeofday instead of realtime
    • -
    • Cryo now actually transfers reagents at tier 4 on enter rather than every 80 machine fire()-process()s regardless of if it was "reset" by open/close.
    • -
    • cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries without an operating console.
    • -
    • ctf claymores now actually spawn (and fit).
    • -
    • STOP_PROCESSING now removes from currentrun to prevent another process cycle from happening where it shouldn't.
    • -
    • hand teleporters now require 30 deciseconds of still movement by the user to dispel portals. there's a beam effect too.
    • -
    • Sort of a bugfix but cult blood magic and all guns now respect stamina softcrit.
    • -
    • Organ healing rate doubled. Organ decay rate halved to match its define (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked).
    • -
    • Storage now caches max screen size and only stores when being opened by a non ghost, meaning ghosts will no longer distort living player screens when viewing storage.
    • -
    • Stunbatons changed yet again.
    • -
    • the game's built in autoclicker aka CanMobAutoclick no longer triggers client/Click()'s anti clickspam guard.
    • -
    • pais can no longer bodyblock bullets
    • -
    • pai radio short changed to 3 minutes down from 5
    • -
    • pais are no longer fulltile click opacity.
    • -
    • vampire "immortal haste" has been reworked to be more reliable and consistent.
    • -
    • hand teles use a less atrocious beam
    • -
    -

    necromanceranne updated:

    -
      -
    • Ebows now disarm people hit by them.
    • -
    • Ebows now do 60 stamina damage on hit.
    • -
    • Ebows no longer inflict drowsiness
    • -
    • Miniature ebows do 15 toxin damage, up from 8.
    • -
    • Ebows have considerably shorter knockdowns.
    • -
    • Ebows now make you slur rather than stutter.
    • -
    • Large ebows are now heavy and bulky.
    • -
    • You can no longer order spinfusors or their ammo from cargo.
    • -
    • Removed the formal security officer jacket from the secdrobe
    • -
    • formal security jackets are now armor vests
    • -
    • Bullets causing bleed rates equal to unmitigated damage through all forms of defense.
    • -
    • Reverted #9092, crew mecha no longer spawn with tracking beacons.
    • -
    • [Port] Mecha ballistics weapons now require ammo created from an Exosuit Fabricator or the Security Protolathe, though they will start with a full magazine and in most cases enough for one full reload. Reloading these weapons no longer chunks your power cell. Clown (and mime) mecha equipment have not changed.
    • -
    • [Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8).
    • -
    • [Port] Both Missile Launchers and the Clusterbang Launcher do not have an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded ammo has been spent, you can use the appropriate ammo box to load the weapon directly.
    • -
    • [Port] Utility mechs that have a clamp equipped can load ammo from their own cargo hold into other mechs.
    • -
    • [Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, should they run low.
    • -
    • Literally unclickability with a cham projector
    • -
    -

    nemvar updated:

    -
      -
    • Slight changes the self-repair borg module. It no longer references the borg that owns it.
    • -
    • Trash from food now gets generated at the location of the food item, instead of in the hands of the eater.
    • -
    • Changed mob biotypes from lists to flags.
    • -
    -

    r4d6 updated:

    -
      -
    • Added a dwarf language
    • -
    • Added more engines
    • -
    • RPD subcategories and preview icons reorganized.
    • -
    • RPD now starts with painting turned off, hitting pipes with build and no paint will target the turf underneath instead. Bye bye turf pixelhunting.
    • -
    • Made dwarves into a roundstart races
    • -
    • Meteor Timer back to 3-5 minutes
    • -
    • Mining no longer lead to spess
    • -
    • Added Plasteel Pickaxe
    • -
    • Added Titanium Pickaxe
    • -
    • fixed a missing tile
    • -
    -

    tralezab, bandit, Skoglol updated:

    -
      -
    • The mime's PDA messages are silent now!
    • -
    • 30 new emoji have been added. Mime buff, mime now OP.
    • -
    -
    - -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.

    -
    - - + + + + Citadel Station 13 Changelog + + + + + + + +
    + + + + +
    +
    Traditional Games Space Station 13
    + +

    +
    + + + + + +
    + Thanks to: /tg/station, 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.
    +
    Have a bug to report?
    Visit our Issue Tracker.
    + Please ensure that the bug has not already been reported, use the template provided here!. + Currently Active GitHub contributor list: -Click Here-
    +
    + + +
    + +

    22 June 2020

    +

    Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:

    +
      +
    • Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
    • +
    • Added single-order options for several existing products in the Cargo Catalog.
    • +
    • Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
    • +
    • You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
    • +
    • Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
    • +
    • Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
    • +
    +

    kevinz000 updated:

    +
      +
    • Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
    • +
    +

    shellspeed1 updated:

    +
      +
    • Adds IV bags.
    • +
    + +

    21 June 2020

    +

    kevinz000 updated:

    +
      +
    • calculations for punch hit chance has been drastically buffed in favor of the attacker.
    • +
    + +

    20 June 2020

    +

    LetterN updated:

    +
      +
    • Asset cache from tg
    • +
    • Made the map viewer not look bad
    • +
    • Admin matrix right-bracket
    • +
    +

    bunny232 updated:

    +
      +
    • Removed unsavory things from the vent clog event
    • +
    + +

    19 June 2020

    +

    Bhijn updated:

    +
      +
    • Atmos can no longer become completely bricked
    • +
    +

    Funce updated:

    +
      +
    • Square root circuit should now actually work.
    • +
    +

    SmArtKar updated:

    +
      +
    • Fixed my runtimes
    • +
    +

    TheSpaghetti updated:

    +
      +
    • more insectoid insects
    • +
    +

    kevinz000 updated:

    +
      +
    • bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
    • +
    +

    timothyteakettle updated:

    +
      +
    • Adds the brain trauma event, where one player gets a random brain trauma!
    • +
    • Adds the wisdom cow event, where the wisdom cow appears on the station!
    • +
    • Adds the fake virus event, where people get fake virus symptoms.
    • +
    • Adds the stray cargo pod event, where a cargo pod crashes into the station.
    • +
    • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
    • +
    + +

    18 June 2020

    +

    Detective-Google updated:

    +
      +
    • cog is now less the suck
    • +
    • couple little derpy bits
    • +
    • malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
    • +
    +

    SmArtKar updated:

    +
      +
    • Ported shuttles from beestation
    • +
    +

    timothyteakettle updated:

    +
      +
    • embeds got reworked, sticky tape was added, more bullets that ricochet also added
    • +
    • medbots can now be tipped over
    • +
    • added more medbot sounds
    • +
    + +

    17 June 2020

    +

    SmArtKar updated:

    +
      +
    • New ID icons
    • +
    • Sutures and Meshes
    • +
    +

    Trilbyspaceclone updated:

    +
      +
    • Gin export takes gin now
    • +
    + +

    16 June 2020

    +

    Ghommie updated:

    +
      +
    • You can't blink nor use LOOC/AOOC as a petrified statue anymore.
    • +
    +

    Trilbyspaceclone updated:

    +
      +
    • BEPIS decal painter has been moved to venders, replacing it being the flashdark
    • +
    +

    kevinz000 updated:

    +
      +
    • projectile ricochets now use a less hilariously terrible way of being handled and should be easier to w
    • +
    • projectile runtime/ricocheting
    • +
    • Lobotomy no longer has a 50% chance of giving you a nigh-unremovable trauma, but does 50 brain damage even on success. On failure, it will give you a lobotomy-class trauma.
    • +
    • spinesnapping from tackling now only gives a lobotomy class trauma instead of magic.
    • +
    +

    timothyteakettle updated:

    +
      +
    • Food carts now function as intended, allowing the pouring and mixing of drinks.
    • +
    • slimes can now change their color using alter form
    • +
    + +

    15 June 2020

    +

    Anturk, kevinz000 updated:

    +
      +
    • VV now properly allows access to datums in associative lists
    • +
    • SDQL2 printout has been upgraded for the 5th time.
    • +
    +

    kevinz000 updated:

    +
      +
    • plushies now work. credits to timothytea.
    • +
    • You can now tape knives to cleanbots
    • +
    +

    kevinz000 (port from VOREStation) updated:

    +
      +
    • Ported zoomba skins for cyborgs.
    • +
    + +

    14 June 2020

    +

    Bhijn updated:

    +
      +
    • raw HTML can no longer be used in flavortext
    • +
    • Added Lesbian Visibility Day (April 26th)
    • +
    • Added Bisexual Visibility Day (September 23rd)
    • +
    • Added Coming Out Day! (October 11th)
    • +
    • Added Intersex Awareness Day (October 26th)
    • +
    • Added Transgender Awareness Week (November 13th - 19th)
    • +
    • Added the Transgender Day of Remembrance (November 20th)
    • +
    • Added Asexual Awareness Week (Last full week of October, this year it'll be Oct. 25-31)
    • +
    • Added the Stonewall Riot Anniversary (June 28)
    • +
    • Moth week is now *actually* the last full week of July, instead of the 4th of every weekday + the 5th Sunday.
    • +
    +

    Floof Ball / Kathrin Morrison / Floof Ball#0798 updated:

    +
      +
    • Improvised Pistol + 32 ACP ammo.
    • +
    • Improvised Energy Gun. Fires 5 shots of 10 burn damage each. Can be upgraded with a lens made from glassworking and T4 parts for a minor buff.
    • +
    • Ammo + gun part loot spawners for mappers.
    • +
    • New sprites for Improvised Rifle, the ability to sling the rifle and a sprite for that.
    • +
    • New sprites for the Improvised Shotgun and its sling sprite.
    • +
    • Improvised shotguns are now two-handed only.
    • +
    • Improvised shotguns now only have a much less harsh 0.9* modifier, keeping them two hits to crit with slugs and buckshot. It can no longer be dual-wielded but can still be sawn off for w_class medium (can fit in backpacks).
    • +
    • Missing handsaw icons added in.
    • +
    • Crafting table cleaned up into sections.
    • +
    +

    Ghommie updated:

    +
      +
    • changed the weak attack message prefix from "inefficiently" to "limply", "feebly" and "saplessly" and lowered the threshold.
    • +
    • Fixing old beserker hardsuits having the wrong helmet type.
    • +
    +

    The0bserver and Stewydeadmike updated:

    +
      +
    • Hey, there's a bit of dust in this recipe book! Recipes using peas? How many recipes does this book even have?
    • +
    • Adds 6 new food items, and 1 new consumable reagent using all forms of the recently discovered peas. Ask your local botanist and chef for them today!
    • +
    +

    YakumoChen updated:

    +
      +
    • Adds polychrome options to loadout
    • +
    • Adds risque polychrome options to Kinkmate vendors
    • +
    +

    kevinz000 updated:

    +
      +
    • emissive blockers can no longer be radioactive.
    • +
    • Ghosts can now scan air inside most objects that contain air by clicking on them.
    • +
    • Directional blocking has been added, keybound to G. This will reduce a portion of incoming damage if done with eligible items at the cost of stamina damage incurred to the user based on damage blocked as well as while active, as well as in most cases preventing the user from doing any attacks while this is active.
    • +
    • Parrying has been added, keybound to F. Timing-based counterattacks, effect heavily dependent on the item, WIP.
    • +
    • Disks are now smaller.
    • +
    + +

    12 June 2020

    +

    EmeraldSundisk updated:

    +
      +
    • The Detective's Office has been commandeered in order to serve a Head of Security. Detectives will find their new office within starboard maintenance.
    • +
    • Adds the Head of Security's standard equipment to their new office.
    • +
    • Slight adjustment/expansion to the main security department
    • +
    • Additional maintenance work
    • +
    +

    timothyteakettle updated:

    +
      +
    • Crabs, cockroaches, slimes and crabs are now small enough to fit in pet carriers
    • +
    + +

    11 June 2020

    +

    Ghommie updated:

    +
      +
    • Balanced vending machine prices to be generally more affordable, a minority has been priced up though.
    • +
    + +

    10 June 2020

    +

    DeltaFire15 updated:

    +
      +
    • Golems / simillar now inherit the neutered antag datum if the creator is neutered.
    • +
    +

    Ghommie updated:

    +
      +
    • Fixing missing pill type buttons from the chem master UI.
    • +
    +

    Naksu updated:

    +
      +
    • Lighting corner updates are ever so slightly faster.
    • +
    +

    Putnam for helping me code the contamination clearing on people updated:

    +
      +
    • Lab made Zeolites have been remade anew and more affective now that they refined the best possable way to mix and make a supper Zeolite capable of clearing contamination form not only people but items!
    • +
    +

    Trilbyspaceclone updated:

    +
      +
    • Tank Dispender has been moved into toxin storage from toxins
    • +
    +

    kevinz000 updated:

    +
      +
    • traitor classes can now be poplocked. hijack/glorious death are now locked to 25/20 respectively.
    • +
    +

    timothyteakettle updated:

    +
      +
    • adds a new fermichem, used for creating sentient plushies!
    • +
    • Mice can now breed using cheese wedges
    • +
    • Royal cheese can be crafted to convert a mouse into king rat
    • +
    + +

    09 June 2020

    +

    Anonymous updated:

    +
      +
    • Added Orville-inspired clothing as a worthy alternative to Trek stuff.
    • +
    • Adds chaplain role allowance to the TMP Service Uniform loadout.
    • +
    • Adds paramedic in every medsci mentioned uniform loadout.
    • +
    +

    DeltaFire15 updated:

    +
      +
    • Offstation AIs can once again only interact with their z-level
    • +
    +

    Ghommie updated:

    +
      +
    • Fixing IC material containers interaction with stacks, for real.
    • +
    +

    Trilbyspaceclone updated:

    +
      +
    • Gasses like BZ and Masiam seem to just sell for less in cargo, markets seem to change it seems
    • +
    +

    kevinz000 updated:

    +
      +
    • plantpeople should stop dying in the halls now
    • +
    • Modifier-independent hotkey bindings have been added.
    • +
    + +

    08 June 2020

    +

    DeltaFire15 updated:

    +
      +
    • Delinging now properly removes their special role
    • +
    • Keycard auth devices now require two seperate IDs with sufficient access to auth.
    • +
    +

    Linzolle updated:

    +
      +
    • shotguns no longer delete chambered shells while firing
    • +
    +

    kevinz000 updated:

    +
      +
    • test
    • +
    +

    shellspeed1 updated:

    +
      +
    • Internal tanks are now printable at the engineering lathe.
    • +
    +

    timothyteakettle updated:

    +
      +
    • newly created areas using blueprints now maintain the previous areas noteleport value
    • +
    • kudzu seeds now actually spawn vines
    • +
    +
    + +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/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3f79c7aed9..95c8e72a54 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1,25507 +1,26049 @@ -DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. ---- -2015-04-04: - ACCount: - - rscadd: Emergency welding tool added to emergency toolbox. - - rscadd: Changed industrial welding tool sprite. - - tweak: Replaced welder in syndicate toolbox with industrial one. - - tweak: All tools in syndicate toolbox are red. Corporate style! - - tweak: Red crowbar is a bit more robust. - - bugfix: 'Fixed two bugs: welder icon disappearing and drone toolbox spawning with - invisible cable coil.' - AnturK: - - rscadd: 'Picket signs: table crafted with a rod and two cardboard sheets, write - on them with pen or crayon.' - Cheridan: - - wip: The bar's layout has been changed with a poker table and re-arranged seating. - Dannno: - - rscadd: Added gun lockers for shotguns and energy guns. Click on the lockers with - an item to close them if they're full. - Gun Hog: - - rscadd: Nanotrasen research has finalized improvements for the experimental Reactive - Teleport Armor. The armor is now made of a thinner, lightweight material which - will not hinder movement. In addition, the armor shows an increase in responsiveness, - activating in at least 50% of tests. - Incoming: - - rscadd: The iconic blood-red hardsuits of nuke ops can now be purchased for a - moderate sum of 8 TC by traitors. - Jordie0608: - - tweak: Cyborg mining drills now use up their internal battery before drawing power - from a borg's cell. - - bugfix: Fixes cyborg mining drills not recharging. - RemieRichards: - - rscadd: Burning mobs will ignite others they bump into or when they are stepped - on. - Xhuis: - - tweak: Malfunctioning AIs can no longer leave the station z-level. Upon doing - this, they will fail the round. - - tweak: Phazon exosuits now require an anomaly core as the final step in their - construction. - xxalpha: - - rscadd: Added Nutriment Pump, Nutriment Pump Plus and Reviver implants. - - tweak: Added origin technologies to all implants. - - tweak: 'The following implants are now much harder to obtain: X-ray, Thermals, - Anti-Stun, Nutriment Pump Plus, Reviver.' - - tweak: Cauterizing a surgery wound will now heal some of the damage done by the - bonesaw if it was used as part of the same surgery. - - tweak: Added ability for Medical HUDs to detect cybernetic implants in humans. -2015-04-09: - Iamgoofball: - - rscadd: Quite a lot of cleanables can now be scooped up with a beaker in order - to acquire the contents. - - rscadd: Light a piece of paper on fire with a lighter, and scoop up the ashes! - - rscadd: Scoop up the flour the clown sprayed everywhere as a 'joke'! - - rscadd: Scoop up the oil left behind by exploding robots for re-usage in chemistry! - - rscadd: You can splash the contents of a beaker onto the floor to create a Chemical - Pile! This pile can be heated or blown up and have the reagents take the effects. - Make a string of black powder around a department in maint. and then heat it - with a welder today! - - rscadd: Reagents now can have processing effects when just sitting in a beaker. - - rscadd: Pyrosium and Cryostylane now feed off of oxygen and heat/cool the beaker - without having to be inside of a person! - - rscadd: Reagents can now respond to explosions! - - rscadd: Black Powder now instantly detonates if there is an explosion that effects - it. - - rscadd: Fire now heats up beakers and their contents! - - rscadd: Activate some smoke powder in style by lighting the beaker on fire with - a burning hot plasma fire! - RemieRichards: - - tweak: Ninja stars are summoned to your hand to be thrown rather than automatically - targetting nearby mobs. - - rscadd: 'Added Sword Recall: pulls your katana towards you, hitting mobs in the - way. Free if within sight, cost scales with distance otherwise.' - - rscadd: Enemies can be electrocuted by a ninja as the cost of his energy, stunning - and injuring them. - - rscdel: Removed SpiderOS, functions moved to status panel. - - bugfix: Fixed energy nets not anchoring target, katana emag spam and sound delay. - optimumtact: - - bugfix: Mimes can't use megaphone without breaking their vow anymore. - phil235: - - tweak: Flying animals no longer triggers mouse traps, bear traps or mines. -2015-04-11: - Gun Hog: - - tweak: Nanotrasen has approved an access upgrade for Cargo Technicians! They are - now authorized to release minerals from the ore redemption machine, to allow - proper inventory management and shipping. - Iamgoofball: - - tweak: Blobbernauts no longer deal chemical damage, brute damage increased however. - Ikarrus: - - experiment: Getting converted by a rev or cultist will stun you for a few seconds. - Incoming5643: - - bugfix: Fixes some AI malf powers being usable when dead. - MrPerson: - - tweak: Reduces movement speed penalty from being cold. - Xhuis: - - rscadd: Adds a pizza bomb traitor item for 4 telecrystals. It's a bomb, diguised - as a pizza box. You can also attempt to defuse it by using wirecutters. - kingofkosmos: - - rscadd: Activating internals with an adjusted breath mask will automatically push - it up to normal state. - - tweak: Masks can now be adjusted when buckled to a chair. - optimumtact: - - tweak: Stun batons no longer lose charge over time when on. - phil235: - - tweak: The AI holopads now use a popup window just like computers and other machines. - - rscdel: Nerfs kinetic accelerator and plasma cutters. Plasma cutter is no longer - in the mining vendor. Reduces the drilling cost of all drills. - - rscadd: Adding 40+ new food and drink recipes, mostly using the newest plants. - Notably rice recipes, burritos, nachos, salads, pizzas. - - tweak: Opening the tablecrafting window can now also be done by dragging the mouse - from any food (that's on a table) onto you. - - rscadd: The kitchen cabinet starts with one rice pack. - - tweak: Glasses with unknown reagent will no longer be always brown but will take - the color of their reagents. -2015-04-13: - AnturK: - - rscadd: 'Spacemen have learned the basics of martial arts: Boxing, unleash it''s - power by wearing Boxing Gloves.' - - rscadd: While boxing you can't grab or disarm, but you hit harder with a knockout - chance that scales off stamina damage above 50. - - rscadd: Rumors have been heard of powerful martial styles avaliable only to the - gods themselves. - CosmicScientist: - - rscadd: Added a dehydrated space carp to traitor items, bought with telecrystals. - Use dehydrated space carp in hand to school them on loyalty. Add water to create - a vicious murder machine just for the halibut. - - tweak: The toy carp plushie now has attack verbs for fun, hit your friend with - one today. I put my sole into this mod. - - wip: If you can think of a better fish pun let minnow but I shouldn't leave it - to salmon else. - Ikarrus: - - tweak: Gang bosses can no longer purchase certain potent traitor items but instead - have access to some of a nuke op's arsenal of weapons. - Incoming5643: - - rscadd: 'Three new chemical types of blob can occur: Omnizine, Morphine and Space - Drugs.' - MrPerson: - - experiment: New lighting system! Lighting now smoothly transfers from one lighting - level to the next. - Xhuis: - - rscadd: There have been... odd sighting in Space Station 13's sector. Alien organisms - have appeared on stations 57, 23, and outlying. - - rscadd: Nanotrasen personnel have reason to believe that Space Station 13 is under - attack by shadowlings. We have little intel on these creatures, but be on the - lookout for odd behavior and dark areas. Use plenty of lights. - Zelacks: - - tweak: Defibs no longer have a minimum damage requirement for a successful revive. - Patients will have 150 total damage on a successful revive. - - tweak: Additional feedback is given for several failure states of the defib. - xxalpha: - - wip: Airlock crushing damage increased. -2015-04-16: - AnturK: - - rscadd: Nanotrasen authorities are reporting sightings of unidentified space craft - near space station 13. Report any strange sightings or mental breakdowns to - central command. - - rscadd: 'PS : Abductions are not covered by health insurance.' - - rscadd: Shadowlings and their thralls now have HUD icons. - - rscadd: Thralls learn their master's objectives when enthralled. - - rscadd: Regenerate Chitin ability lets shadowlings re-equip their armor if lost. - - tweak: Loyalty implanted people take 25% longer to enthrall, but lose their implant - and become immune to re-implanting. - - experiment: Shadowlings now have a message in their spawning text which specifies - that cooperation is mandatory. - - bugfix: Veil now works on equipped lights. - - bugfix: Shadowlings now take correct amount of burn damage and in light and heal - clone and brain damage in darkness. - - bugfix: Fixes 'Round end code broke' displaying every round. - - bugfix: Shadowlings who ascend will nore greentext properly. - Gun Hog: - - rscadd: Thinktronic Systems, LTD. has increased the Value of the Value-PAK PDA - cartridge! Standard issue for Captain PDAs, it can now access security bots, - medibots, cleanbots, and floorbots ALL AT ONCE! In addition, it can also connect - to your station's Newscaster network at NO EXTRA CHARGE! As a Thank you for - our contract with them, they have thrown in Newscaster access for the HumanResources9001 - cartridge, Heads of Personnel rejoice! - - tweak: The Newscaster app has also gotten a free upgrade which allows it to display - images and comments inside of posts! - - bugfix: Nanotrasen has concurrently released a patch for bots which will allow - off-station bots to properly patrol. - Incoming5643: - - rscadd: Changeling head slugs have been given player control, ventcrawling, and - a short escape period after egg laying. - MrStonedOne: - - rscadd: Admin ghosts can now drag ghosts to mobs to put that ghost in control - of that mob. - Xhuis: - - rscadd: Nanotrasen scientists have recently observed a strange genome shift in - green slimes. Experiments have shown that injection of radium into an active - green slime extract will create a very unstable mutation toxin. Use with caution. -2015-04-19: - AnturK: - - bugfix: Observers can now see abductor hivemind messages. - - rscadd: 'Adds advanced baton for abductors: Stun, Sleep and Cuff in one tool.' - - rscadd: Abductor agents now have vest cameras. - - imageadd: New sprites for abductors and their gear made by Ausops. - Fayrik: - - rscadd: Added jobban options for Abductors and Deathsquads. - - tweak: Made admin antag spawning buttons more efficient and less prone to failure. - Xhuis: - - rscadd: Recent sightings aboard space stations shows that spirits seem to be manifesting - as malevolent revenants and draining the life of crew. The chaplain may be helpful - in stopping this new threat. - kingofkosmos: - - wip: Girder and machine frame construction protocols has been changed. They can - now be secured/unsecured with a wrench and disassembled with a welder. -2015-04-20: - Fayrik: - - rscadd: Abductors now get advanced camera consoles. - - tweak: Redesigned Centcom again. There's a bar at the thunderdome now. - - rscadd: Headsets can now be locked to a spesific frequency, this only occurs for - nuke ops and deathsquads. - - rscadd: The Centcom channel is now available over all z-levels, regardless of - telecomms status. - - tweak: The Deathsquad space suits have been upgraded to hardsuits. - - rscadd: The Deathsquad now have thermal imaging huds, which can swap which hud - they display on the fly. - phil235: - - tweak: Reagents are now back to being metabolized every tick. Fixes frost oil - and capsaicin not working. - - tweak: Fixes not being able to make sterilizine. - - rscadd: Adding overdose to space drug, causing mild hallucination and toxin and - brain damage. - - tweak: Nerfed healing power of stimulant reagent. Buffed ephedrine a bit. - - rscadd: Nitroglycerin can now be stabilized with stabilizing agent, and explodes - when heated. -2015-04-21: - Ikarrus: - - wip: Gang mode has had some considerable work done on it, including a new objective - and currency dynamic. - - rscadd: New objective: Claim half the station as territory by tagging it - with spray cans supplied to gang bosses, but usable by any member. - - wip: An area can only be tagged by one gang at a time, remove your opponent's - tag or spray over it. - - rscadd: New recruitment: Recruiment pens replace flashes, stab people to - recruit them. - - experiment: Recruitment is silent, but causes brief seizures and has a cooldown - that scales upwards with a gang's size. - - rscadd: New tool: The Gangtool is used by bosses and lieutenants to recall - the shuttle and purchase supplies. - - rscadd: Pistols, ammo, spraycans, recruitment pens and additional gangtools can - all be bought. - - tweak: Gangtools also alert the user of promotions, purchases and territory changes - within the gang. - - rscadd: Lieutenants are promoted from gang members when given their own gangtool; - they're immune to deconversion and able to do anything a boss can except promotion. - - rscadd: New currency: Influence is used to purchase with the gangtool and - is generated every 5 minutes by each territory owned by the gang. - - tweak: Thermite can be cleaned off walls now. -2015-04-22: - Incoming5643: - - rscadd: 'Adds a new fun button for admins: ''Set Round End Sound''. You can use - the set round end sound button to set the round end sound. Glad we cleared that - up!' - Miauw62: - - wip: Very slightly expanded atmos and added an external airlock. - Xhuis: - - bugfix: A few issues have been fixed for revenants. In addition, the Mind Blast/Mind - Spike sound effect has been removed. - - rscadd: Adds the Hypnotize ability to revenants. It will cause a target to fall - asleep after a short time. - xxalpha: - - rscadd: Added an Exosuit Mining Scanner to the robotics fabricator. - - tweak: Buffed Ripley's movement and drilling speed in low pressure environments. -2015-04-25: - Boggart: - - rscadd: Generalizes handheld instrument code and Ports Nienhaus's guitar, sounds - by BartNixon of Tau Ceti. - - rscadd: Fixes being unable to build disposal pipes on walls, makes changing the - RPD's settings not affect pipes that are currently building, makes the RPD use - the datum/browser ui, makes it use categories and makes it show the selected - mode. - Gun Hog: - - rscadd: Nanotrasen has provided designs for fabrication of APC power control modules. - You may print them at any autolathe. - Ikarrus: - - rscadd: Gangs can now purchase switchblades, a relatively cheap and decently robust - melee weapon. - - tweak: Gangs now require at least 66% control of the station to win. - - tweak: Gang spraycan uses reduced to 15. - - tweak: Pistol cost increased to 30 Influence - - tweak: Promotions now start off cheap at 20 influence but get more expensive the - more people you promote. - Xhuis: - - rscadd: Added a Create Antagonist button for revenants. - - rscdel: Removed Mind Blast. - - bugfix: Revenants no longer get killed by explosions. - - tweak: Mind spike cooldown increased to 4 seconds. - - tweak: Harvest now takes 8 seconds and requires you to be adjacent to the target. - - tweak: Hypnotise sleeps targets for longer. - - tweak: Revenant now starts with 3 strikes. - phil235: - - tweak: Telecom machines are now deconstructed the same way as all other constructable - machines. - - tweak: You can no longer overdose on nicotine but you can get addicted (very mild - effects). -2015-04-29: - AndroidSFV: - - tweak: Dehydrated carp now are friendly to both the imprinter of the plushie as - well as any coded-in allies (I.E. Nuke Ops team), and unfriendly to carp of - other origin othan than yourself or your coded-in allies. Dehydrated carp that - are not imprinted will still have the same behavior as regular carp. - AnturK: - - rscadd: Advanced cameras now have all functionality of the abductor consoles. - - tweak: Pinpoint teleportation takes 8 seconds and spawns a flashy silhouette at - the target location. Can be used as distraction since it appears even if teleporter - is empty. - - bugfix: Abductors are now immune to viruses. - - bugfix: Dissection surgery ignores clothes. - - bugfix: Non-abductors can escape the ship by fiddling with consoles enough. - - rscadd: Three new negative glands. - - rscadd: Bloody glands spray blood everywhere and injure the host. - - rscadd: Bodysnatch glands turn the host into a cocoon that hatches doppelgangers. - - rscadd: Plasma glands cause the host to explode into a cloud of plasma. - GoonOnMoon: - - rscadd: Added a new assault rifle to the game for use by Nanotrasen fighting forces - in special events. Also happens to be available in the Liberation Station vending - machine and the summon guns spell usable by the wizard and badminnery. - Iamgoofball: - - rscdel: Acid blob has been removed. - - tweak: Charcoal and Silver Sulf are more powerful now. - - tweak: Styptic power and Silver Sulf metabolize at the default rate. - Ikarrus: - - rscadd: Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as - grafiti. - - tweak: Influence income changed to provide weaker gangs a bigger boost, while - slowing down stronger gangs to promote opportunity for comebacks. - - tweak: Gangs only earn influence on territories they have held on to since the - previous Status Report (the income calculation every 5 minutes). This places - more significance on defending your existing territory. - - bugfix: You must be in the territory physically to tag it now. So no more tagging - everything from maint. - - tweak: Gang income delay reduced to 3 minutes intervals. - - tweak: Gang Capture goal reduced to 50% - - tweak: Gang spraycan use increased to 20 - - tweak: Gang Boss icon is now a red [G] icon to make it stand out better from regular - gang icons - JJRcop: - - tweak: TED's kill duration has been halved. - - tweak: Escaping from the TED's field no longer kills you. - RemieRichards: - - rscadd: Adds Easels and canvases for custom drawings. - - imageadd: Place a canvas on an easel and draw on it with crayons, clean one pixel - with a rag or soap and activate it in-hand to erase the whole canvas. - - rscadd: Ports VG's Ventcrawling overhaul! - - tweak: Crawling through vents is no longer instant, you now have to move and navigate - manually - - rscadd: While inside pipes and other atmos machinery, you now see pipe vision - phil235: - - bugfix: Podplants are no longer unharvestable. - - tweak: Choosing your clown, mime, cyborg and AI name as well as religion and deity - is now done in the preferences window. As a chaplain , your bible's icon is - now chosen by clicking the bible. -2015-04-30: - Fayrik: - - rscadd: Ported NanoUI to most atmospherics equipment. - TheVekter: - - tweak: Hooch is now made with 2 parts Ethanol, 1 part Welder fuel and 1 part Universal - Enzyme as a catalyst. - - tweak: No-slip shoes are paintable, painting them doesn't remove no-slip properties. -2015-05-01: - Ikarrus: - - rscadd: Gang bosses can now rally their gang to their location with their gangtool. - - rscadd: Gangtools can no longer recall the shuttle if station integrity is lower - than 70% - - rscdel: Removed requirement to be in the territory to tag it. - - tweak: Recruitment Pen cost reduced to 40. - - bugfix: Communications console should now accurately print the (lack of a) location - of the last shuttle call. - Xhuis: - - rscdel: Revenants will no longer spawn without admin intervention. They are pending - a remake. -2015-05-02: - Boggart: - - bugfix: Cryo tubes can no longer be used for ventcrawling. - Ikarrus: - - rscadd: Admins can choose the strength and size of Centcom teams to send, ranging - from officials to deathsquads, with the 'Make Centcom Respone Team' button. - phil235: - - tweak: Space carps can no longer knock down anyone, but they now deal additional - stamina damage to humans. - - tweak: Radiation effects from uranium walls are nerfed to the level of uranium - floor. - - rscadd: You can no longer put an inactive MMI in a cyborg shell. Ghosted brains - now get an alert when someone puts their brain in a MMI. You can now examine - the MMI to see if its brain is active. -2015-05-03: - AnturK: - - rscadd: Abductors can purchase spare gear with experimentation points. - Ikarrus: - - rscadd: Admins can now adjust the pre-game delay time. - MrStonedOne: - - experiment: MasterController and subsystem rejiggering! - - rscadd: The MC can now dynamcially change the rate a subsystem is triggered based - on how laggy it's being. This has been applied to atmos to allow for faster - air processing without lagging the server - - tweak: Pipes and atmos machinery now processes in tune with air, rather than seperately. - - bugfix: Fixed hotspots and fire causing more lag than they needed to - - bugfix: Fixed some objects not getting garbage collected because they didn't properly - clear references in Destory() - - tweak: The qdel subsystem will now limit its processing time to a 5th of a second - each tick to prevent lag when a lot of deletes happen - - bugfix: Fixed the ticker not showing a tip of the round if an admin forces the - round to start immediately -2015-05-04: - Firecage: - - bugfix: Emagged windoors can now be deconstructed. - RemieRichards: - - rscadd: Adds Plasmamen, a species that breathes plasma and bursts into flames - if they don't wear special suits. - - imageadd: New burning icon for all humanoid mobs. - - imageadd: New sprite for Skeletons to match Plasmamen. - oranges: - - tweak: Thanks to recent advances in fork science, you no longer need to aim at - your eyes to eat the food off a fork - xxalpha: - - rscadd: 'Adds a new barsign: ''The Net''.' -2015-05-05: - Firecage: - - bugfix: Golems and skeletons no longer fall over when stepping on shards. - Gun Hog: - - bugfix: Mining borg diamond drill upgrade now functional. - Ikarrus: - - tweak: Doubled the initial charge of SMESs in Engineering. - - tweak: Influence cap for gangs has been increased. - incoming5643: - - bugfix: All modes now select their antagonists before job selection, this means - that a player who prefers roles normally immune to being certain antagonists - (implanted roles/silicons) can still have a fair shot at every antagonist roll - they opt into. If they're selected they simply will not end up with an incompatible - job. - - bugfix: As an example if someone loved to play Head of Security (humor me here) - and had it set to high, and the only other jobs he had set were security officer - at medium and botanist at low but he was selected to be a traitor, he would - spawn as a botanist even if there ended up being no Head of Security. - - experiment: Please give playing security another chance if you'd written it off - because it affected your antag chances. - xxalpha: - - bugfix: Hulks can now break windoors. - - bugfix: Fixed smoking pipe messages. Fixed emptying a smoking pipe with nothing - in it. -2015-05-06: - Jordie0608: - - bugfix: Borgs can now open lockers with the 'Toggle Open' verb. - Thunder12345: - - bugfix: Severed the cryo tube's connection to the spirit world. Ghosts will no - longer be able to eject people from cryo. Please report further instances of - poltergeist activity to your local exorcist. - Xhuis: - - tweak: Many minor technical changes have been made to cult. - - rscadd: Cultist communications now show the name of the person using them. Emergency - communications do not do this. - - rscadd: Emergency communication does less damage. - xxalpha: - - rscadd: Engineering cyborgs can now pick their cable coil color whenever they - want. -2015-05-07: - Xhuis: - - rscadd: Emagged defibrillators will now do burn damage and stop the patient's - heart if used in harm intent. - - tweak: The previous stunning functionality of the emagged defibrillator has been - moved to disarm intent. - phil235: - - tweak: Temperature effects from frost oil and capsaicin reagents and basilisk - have been buffed to be significant again. - xxalpha: - - tweak: Hulks can now break windoors. -2015-05-08: - Firecage: - - tweak: Mobs can now be buckled to operating tables. - Gun Hog: - - rscadd: 'Top scientists at Nanotrasen have made strong progress in Artificial - Intelligence technology, and have completed a design for replicating a human - mind: Positronic Brains. Prototypes produced on your research station should - be compatible with all Man-Machine Interface compliant machines, be it Mechs, - AIs, and even Cyborg bodies. Please note that Cyborgs created from artificial - brains are called Androids.' - - tweak: The pAI role preference and related jobbans have been renamed to properly - reflect that they are not soley for pAI, but include drones and positroinc prains. - astralenigma: - - tweak: Cargo packages are now delivered with their manifests taped to the outside. - Click on them with an open hand to remove them. - optimumtact: - - tweak: Machine frame and girder deconstruction now uses a screwdriver instead - of welding tool. -2015-05-09: - Firecage: - - tweak: Increased the manifestation chance of super powers. - Ikarrus: - - experiment: 'Loyalty implants will no longer survive deconverting a gangster. - Security now needs to use two of them if they want the permanent effects: The - first to deconvert them, and the second to make them loyal.' - KorPhaeron: - - tweak: Slime mutation chance now starts at 30%. - - rscadd: Baby slimes have a -5% to 5% difference of their parent's mutation chance, - allowing you to breed slimes that are more likely to mutate. - - rscdel: Plasma and epinephrine no longer affect mutation chance of slimes. - - rscadd: Red slime extract and plasma makes a potion that can increase mutation - chance, Blue slime extract and plasma potions will decrease it. -2015-05-10: - AnturK: - - bugfix: Fixed borg's cells draining much faster than they're meant to. - Gun Hog: - - tweak: Station bot performance greatly increased. - - rscadd: Captain PDA cartridge now includes nearly all utilities and functions, - including signaller and all bots! HoP now has janitor and quartermaster functions! - The RD and Roboticists now have access to Floor, Clean, and Medibots! - - tweak: Bot access on PDA is now one button across all PDAs. You will only see - what bots you can access, however. - - rscadd: Cartridges that include a signaller have been improved so they will work - on a larger frequency range. - - tweak: All bots now have Robotics access, so they may be set to patrol and released - once constructed. - - tweak: Roboticists now have access to bot navigation beacons. They are found under - the floor tiles as patrol route nodes. -2015-05-11: - Firecage: - - imageadd: New icons for Industrial and Experimental welding tools. - Gun Hog: - - rscdel: The power mechanic for mining drills and the jackhammer has been removed. - They no longer require cells or recharging. - - bugfix: The diamond drill upgrade for mining cyborgs has been fixed. - Xhuis: - - rscadd: Adds the pneumatic cannon, attach an air tank and shoot anything out of - it. - - rscadd: Improvised pneumatic cannons can be tablecrafted with a wrench, 4 metal, - 2 pipes, a pipe manifold, a pipe valve and 8 package wrappers. - spasticVerbalizer: - - bugfix: False walls no longer stackable. -2015-05-13: - Firecage: - - rscadd: Kudzu is now admin-logged in Investigate. - GunHog: - - tweak: Positronic brains are now entered by clicking on an empty one, in the same - manner as drones. - - rscadd: Ghosts are alerted when a new posibrain is made. - Jordie0608: - - rscadd: Borg reagent containers (beakers, spraybottles, shakers etc.) are no longer - emptied when stowed. - - bugfix: Fixes North and West Mining Outposts having empty SMESs. - - bugfix: Aliens and slimes can smash metal foam again. - - rscdel: Deconstructing reinforced walls no longer creates additional rods out - of nowhere. - - imageadd: Pepperspray now has inhand sprites. - Xhuis: - - bugfix: Fixes the recipe for pneumatic cannons; it now only requires a wrench, - 4 metal, 2 pipes and 8 package wrappers . -2015-05-15: - xxalpha: - - bugfix: Fixed emitter beams not being reflectable. -2015-05-16: - MartiUK: - - bugfix: Fixed a typo when cleaning a Microwave. - - bugfix: Fixed a typo when burning someone with a lighter. -2015-05-20: - xxalpha: - - rscadd: Added three drone shells to the derelict. -2015-05-22: - Jordie0608: - - tweak: Smothering someone with a damp rag when in harm intent will apply reagents - onto them, for acid-burning their face; otherwise it will inject them, for drugging - with chloral hydrate. - - imageadd: The healthdoll is now blue when at full health to make it more clear - when a body part is injured. -2015-05-25: - spasticVerbalizer: - - tweak: Glass airlocks can now be made heat-proof by using a sheet of reinforced - glass to create the window, regular glass creates a normal glass airlock. - xxalpha: - - bugfix: You can no longer drop items inside mechas nor machinery (this includes - gas pipes, disposal pipes, cryopods, sleepers, etc.). - - bugfix: Fixed exploit of changelings being able to keep thermal vision after resetting - their powers. - - bugfix: Fixed being able to implant NODROP items with cavity implant surgery. -2015-05-26: - CosmicScientist: - - spellcheck: Corrected wording for the pAI, donksoft riot darts and some tip of - the round tips. - xxalpha: - - bugfix: Fixed changeling revival. -2015-05-30: - duncathan: - - bugfix: Fixes passive gates not auto-coloring. - spasticVerbalizer: - - tweak: Players trying to speak but unable to will now get a message. -2015-05-31: - duncathan: - - tweak: Clarified the ability to retract changeling armblades. -2015-06-04: - Cuboos: - - rscadd: Added casting and firing sounds for wizard spells and staves. - - rscadd: A new title theme has been added. - Gun Hog: - - rscadd: Nanotrasen has approved the designs for destination taggers and hand labelers - in the autolathe. - Palpatine213: - - tweak: Allows sechuds to have their id locks removed via emag as well as EMP -2015-06-05: - CandyClown: - - tweak: Ointments, bruise packs, and gauze are now stacked to 6 instead of 5. - CorruptComputer: - - bugfix: Security lockers no longer spawn in front of each other on Box. - - bugfix: Hooked up the scrubbers in QM's office on Box. - - bugfix: Fixed bar disposals on Box - - bugfix: Fixed the stacked heater+freezer in expirementor maint on Box - - tweak: Made the turbine into Atmos and Engineering access only, and renamed the - doors to Turbine on Box. - Ikarrus: - - rscadd: Gang Bosses will now be able to discreetly send messages to everyone in - their gang for 5 influence a message. - - tweak: Conversion pens now use a flat 60sec cooldown rate. - KorPhaeron: - - rscadd: You can now lay tiles on the asteroid. Go nuts building forts. -2015-06-06: - Incoming5643: - - rscadd: Antagonists with escape alone can now escape with others on the shuttle, - so long as they are also antagonists. - - rscadd: Antagonists with escape alone can also win if non-antagonists are on the - shuttle provided they are locked in the brig. - - rscadd: Escaping to syndicate space on board the nuke op shuttle is now a valid - way to escape the station. - Jordie0608: - - rscadd: Admin-delaying the round now works once it has finished. -2015-06-07: - Aranclanos: - - rscadd: Malfunctioning AIs can preview placement of a Robotic Factory. - Iamgoofball: - - rscadd: Bicardine, Dexalin, Kelotane, Anti-toxin, Inaprovaline and Tricordrazine - have been re-added. - RemieRichards: - - rscadd: Lizards can now wag their tails, emote *wag to start and *stopwag to stop. - kingofkosmos: - - tweak: Mops can now be wet from normal buckets and sinks. -2015-06-08: - AnturK: - - imageadd: Improved the interface of Spellbooks. - Cheridan: - - tweak: Push-force from Atmospherics now depends on an entity's weight, heavier - objects are less prone to being pushed. - - rscadd: Magboots and No-Slip shoes now prevent pushing from spacewind. - Firecage: - - rscadd: Protolathes can now build Experimental Welding Tools. -2015-06-09: - Aranclanos: - - wip: Structures and machines can now be built on shuttles. - Iamgoofball: - - rscadd: 'Adds the Bluespace Rapid Part Exchange Device: holds up to 400 stock - parts and can be used to upgrade machines at range without needing to open their - maintenance panel.' - - rscadd: A new tier of stock parts have been added, they're very expensive to produce - but provide ample improvements. - - experiment: Many machines can now also be upgraded. - - tweak: 'Emitter: Lasers decrease firing delay and Capacitors decrease power consumption.' - - tweak: 'Gibber: Matter Bins increase yield of meat and Manipulators speed up operation - time, at high level can gib creatures with clothes.' - - tweak: 'Seed Extractor: Matter Bins increase storage and Manipulators multiply - seed production.' - - tweak: 'Monkey Recycler: Matter Bins increase the amount of monkey cubes produced - and Manipulators reduce the monkey-to-cubes ratio to a minimum of 1-to-1.' - - tweak: 'Crusher: Matter Bins increase material yield and Manipulators increase - chance to yield materials, at high level there is a chance for rarer materials.' - - tweak: 'Holopad: Capacitors increase an AI''s traversal range from the holopad.' - - tweak: 'Smartfridge: Matter Bins increase storage.' - - tweak: 'Processor: Matter Bins increase yield and Manipulators speed up operation - time.' - - tweak: 'Microwave: Matter Bins increase storage.' - - tweak: 'Ore Redemption Machine: Matter Bins increase yield per ore, Lasers increase - points per ore and Manipulators speed up operation time.' - - tweak: 'Hydroponics Tray: Manipulators improve water and nutrients efficiency.' - - tweak: 'Biogenerator: Matter Bins increase storage.' - bananacreampie: - - rscadd: Added several new options to the ghostform sprites -2015-06-11: - Cheridan: - - rscdel: Removes the powerdrain for individiual active modules on cyborgs. -2015-06-12: - Ikarrus: - - experiment: Gang Updates - - rscadd: 'New objective: To win, Gangs must now buy a Dominator machine (50 influence) - and defend it for a varying time frame.
    * The location of the dominator is - broadcasted to the entire station the moment it is activated
    * The more territories - the gang controls, the less time it will take
    * Gangs no longer win by capturing - territories' - - rscadd: A choice of gang outfits are now purchasable for 1 influence each - - rscadd: Thompson SMGs aka "tommy guns" are now purchasable for 50 influence - - rscadd: Bulletproof armor vests are now purchasable for 10 influence - - tweak: Gang messages are now free to send - - tweak: Prices of pistols and pens reduced to 20 and 30, respectively - - tweak: Gang spraycans have been made a lot less obvious. They look nearly identical - to regular ones, now. - - rscdel: Gangs will no longer be notified how much territory the enemy controls - Incoming5643: - - rscadd: Growing tired of reports of slain members, the Wizard Federation has cautiously - sactioned the dark path of lichdom. Beware of the powerful lich who hides his - phylactery well, for he is immortal! - - rscadd: The trick to defeating liches is to destroy either their body or their - phylactery item before they can ressurect to it. The more a lich is slain the - longer it will take him to make use of his phylactery and the more likely the - crew is to catch him during a vunerable moment. - - rscremove: Due to the addition of proper liching, skeletons as a choosable race - from magic mirrors has been discontinued. My apologies to the powergamers. A - special admin version of the mirror that allows for skeletons has also been - added to the code. - Miauw: - - tweak: 'AIs have received several minor nerfs in order to increase antagonist - counterplay:' - - tweak: AI tracking is no longer instant, it takes an amount of time that increases - with distance from the AI eye, up to 4 seconds. The AI detector item will light - up when an AI begins tracking. - - tweak: A random camera failure event has been added, which will break one or two - random cameras. - - tweak: You can no longer keep tracking people that are outside of your camera - vision. - - tweak: Camera wires have been removed. Screwdriver a camera to open the panel, - then use wirecutters to disable it or a multitool to change the focus. - - tweak: You can now hit cameras with items to break them. To repair a camera, simply - open the panel and use wirecutters on it. - - tweak: Camera alerts now only happen after a camera is reactivated. - RemieRichards: - - rscadd: New optional explosion effect ported from /vg/'s DeityLink, Explosions - that are affected by Walls and Doors -2015-06-14: - Ikarrus: - - rscadd: White suits added to gang outfits - - tweak: Gang outfits are now free, but are now limited in stock (that replenishes - over time) - - tweak: While attempting a Hostile Takeover, gangs do not gain influence. Instead, - the takeover timer will be reduced by how many territories they control. - - tweak: Spraycan cost reduced to 5 influence. - - tweak: Recruitment Pen cooldown increased to 2 minutes, but is reduced if the - enemy gang has more members than yours. - - tweak: Tommy guns no longer deal stamina damage. - - rscdel: Gangtools can no longer recall the shuttle if the game mode is not Gang - War -2015-06-15: - Incoming5643: - - rscadd: Lizards can now choose from a wide varity of physical appearances in character - creation! Sprites made by WJohn. Hiss Responsibly. - Kor: - - rscadd: A terrible new creature stalks the halls of SS13. - - rscadd: The wizard has a new artefact related to said creature. - - rscadd: Added a new sepia slime plasma reaction. Try it out! - spasticVerbalizer: - - bugfix: Drones can now properly quick-equip. -2015-06-18: - AnturK: - - rscadd: Added new photo-over-pda function. Apply the photo to PDA to send it with - your next message! - Ikarrus: - - rscadd: Department Management consoles have been added to Head of Staff offices. - These will enable heads to modify ID's access to their department, as well as - preform demotions. - Miauw: - - tweak: Bullets can now damage cameras. - - tweak: Camera alarms now trigger 90 seconds after the first EMP pulse, instead - of when all EMP pulses run out. - - tweak: Makes the force required to damage cameras greater than or equal to ten - instead of greater than ten. - - tweak: Camera alarms now trigger when cameras are disabled with brute force or - bullets. - Xhuis: - - rscadd: Nanotrasen scientists have determined that a delaminating supermatter - shard combining with a gravitational singularity is an extremely bad idea. They - advise keeping the two as far apart as possible. - phil235: - - rscdel: Nerfed the xray gun. Its range is now 15 tiles. -2015-06-20: - Dorsisdwarf: - - tweak: Syndicate Bulldog Shotguns now use slug ammo instead of buckshot by default - - rscadd: Nuke Ops can now buy team grab-bags of bulldog ammo at a discount. - Ikarrus: - - rscadd: Wearing your gang's outfit now increases influence and shortens takeover - time faster. - - rscadd: Added several more options for gang outfits - - rscadd: Pinpointers will now point at active dominators. - - tweak: Gang outfits are now slightly armored - - tweak: Gang tags are now named 'graffiti' to make them harder to detect - - tweak: Initial takeover timer is now capped at 5 minutes (50% control) - - tweak: 'Server Operators: The default Delta Alert texts have changed. Please check - if your game_options.txt is up to date.' - - rscdel: Loyalty implants now treat gangs as it treats cultists. Implants can no - longer deconvert gangsters, but it can still prevent recruitments. - - tweak: Replaced tommy guns with 9mm 2-burst 32 mag uzis that costs 40 influence. - Unlike tommy guns gangs will be able to purchase ammo for uzis. - Jordie0608: - - tweak: 'For Admins: Jump-to-Mob (JMP) notification command replaced with Follow - (FLW).' - - rscadd: Message and Follow links added to many notifications. - - rscadd: New buttons to toggle nuke and set security level. - - spellcheck: Flamethrowers are logged in attack_log. - Thunder12345: - - rscadd: Combat shotguns are now semi automatic, and will be pumped automatically - after firing. - - tweak: Combat shotgun capacity has been reduced to six shells. - Xhuis: - - rscadd: You will now trip over securitrons if you run over them whilst they are - chasing a target. - - rscadd: An admin-spawnable drone dispenser has been added that will automatically - create drone shells when supplied with materials. - - rscadd: Airlock charges are available to traitors and will cause a lethal explosion - on the next person to open the door. - - rscadd: Nuclear operatives can now buy drum magazines for their Bulldog shotguns - filled with lethal poison-filled darts. - - rscadd: When a malfunctioning AI declares Delta, all blue tiles in its core will - begin flashing red. - - rscadd: Back-worn cloaks have been added for all heads except the HoP. LARPers - rejoice! - - rscadd: More suicide messages have been added for a few items. -2015-06-21: - GunHog: - - tweak: The Hostile Lockdown ability for Malfunctioning AIs has been nerfed. It - now costs 30 CPU, is much more obvious, and automatically resets in 90 seconds. - - tweak: Buffed the Upgrade Turrets Malfunction ability. Turrets will now fire heavy - lasers instead of simply shooting faster. - - rscadd: Nanotrasen has released an Artificial Intelligence firmware upgrade under - the ID 41ST0L3MYB1K3. It contains drivers for interacting with all variants - of exosuit technology, from the Ripley APLU design to even experimental Phazon - units. Simply upload your AI to the exosuit's internal computer via the InteliCard - device. Per safety regulations, the exosuit must have maintenance protocols - enabled in order to remove an AI from it. - - rscadd: Malfunctioning AIs may wirelessly steal mechs via a new power, Mech Domination. - For 30 CPU, a Malf AI may permanently upload itself to a mech, ejecting any - pilots. Malf AIs will still lose if they leave the Z-level, and the Malf will - be gibbed if the mech is destroyed - they cannot be carded out of the mech or - shunt to an APC. - Iamgoofball: - - rscdel: Blobs can no longer have Morphine as their chemical. - duncathan: - - tweak: Heat exchangers now update their color to match that of the pipe connected - to them. - - tweak: Heat exchangers are on longer dense. -2015-06-22: - Iamgoofball: - - rscdel: Removed failure chance and delay when emagging an APC. - KorPhaeron: - - tweak: Rebalanced armor to be less effective, reducing the melee, bullet and/or - laser damage reduction of all armor suits. - LaharlMontogmmery: - - rscadd: You can now click and drag a storage container to empty it's contents - into another container, disposal bin or floor tile. - Xhuis: - - experiment: Revenants have received a considerable overhaul. - - rscadd: Revenants will no longer share spawn points with space carp and will spawn - in locations like the morgue and prisoner transfer center. - - rscadd: Revenants can no longer cross tiles covered in holy water. - - rscadd: Revenants have a new ability called Defile for 30E. It will cause robots - to malfunction, holy water over tiles to evaporate, and a few other effects. - - rscadd: Upon death, revenants will appear and play a sound before rapidly fading - away and leaving behind glimmering residue as evidence of their demise. - - rscadd: This residue lingers with the essence of the revenant. If left unattended, - it may reform into a new revenant. Simply scattering it is enough to stop this, - but it also has high research levels. - - rscadd: Revenants now have fluff objectives as well as a set essence goal. - - tweak: Revenanants will be revealed for longer when using abilities and also receive - feedback on this revealing. - - tweak: Revenants can now only spawn via random event with a specific amount of - dead mobs on the station. The default for this is 10. - - bugfix: Revenants can no longer use abilities from inside walls. - - rscdel: Directly lethal abilities have been removed from revenants. In addition, - they can no longer harvest unconscious people, only the dead. -2015-06-23: - Fayrik: - - rscadd: NanoUI is now Telekenesis aware, but due to other constraints, NanoUI - interfaces are read only at a distance. - - tweak: Refactored all NanoUI interfaces to use a more universal proc. - - tweak: Adjusted the refresh time of the NanoUI SubSystem. All interfaces will - update less, but register mouse clicks faster. - - bugfix: Removed automatic updates on atmospheric pumps, canisters and tanks, making - them respond to button clicks much faster. - - bugfix: Atmos alarm reset buttons work now. Probably. - Iamgoofball: - - rscadd: Adds a progress bar when performing actions. - Ikarrus: - - rscadd: New gang names with tags created by Joan - - rscadd: C4 explosive can be purchased by gangs for 10 influence. - - tweak: Recruitment pen cost increased to 50. - - rscadd: Lieutenants recieve one free recruitment pen. - - tweak: Recruitment pens are now stealthy and no longer give a tiny prick message. - - tweak: Increased chance of deconversion with head trauma - - tweak: Recalling the shuttle now takes about a minute to work, during which you - won't be able to use your gangtool. - - rscadd: Pinpointers no longer point at dominators. Instead, dominators will beep - while active. - - rscadd: Added puffer jackets and vests. - - tweak: Increased gang outfit armor. It is moderately resistant to bullets now. - - rscdel: Removed bulletproof vests from gangtool menu. - Jordie0608: - - rscadd: Admins can now flag ckeys to be alerted when they connect to the server. - MrStonedOne: - - rscadd: Admins can now reject poor adminhelps. This will tell the player how to - construct a useful adminhelp and give them back their adminhelp verb - RemieRichards: - - tweak: Cumulative armour damage resistance is now capped at 90%, you will now - always take at bare minimum, 10% of the incoming damage. - - rscadd: Added a system for Armour Penetration to items, it works by temporarily - (It does NOT damage the armour or anything) reducing the armour values by the - AP value during the attack instance. - - rscadd: 'The formula for AP is Armour-ArmourPenetration = AdjustedArmour and AdjustedArmour - is used for all the remaining calculations instead of Armour (Eg: 80 Melee - - 15 AP = 65 Melee).' - - rscadd: The Ninja's Energy Katana has 15 AP, Xenomorphs have an inbuilt AP of - 10. - - tweak: You can now unwrench pipes who's internal pressures are greater than that - of their environment... - - rscadd: However it will throw you away from the pipe at extreme speed! (You are - warned beforehand if the pipe will do this, allowing you to cancel) - Vekter: - - bugfix: Finally fixed immovable rods! They will now properly bisect the station - (and crit anyone unlucky enough to be in their path). - - tweak: Increased Meteor activity detected in the vicinity of the station. Be advised - that many storms may be more violent than they once were. - - rscadd: Gravitational anomalies will now throw items at mobs in their vicinity. - Take care while scanning them. - - rscadd: Flux anomalies explode much more violently now. Get there and destroy - them, or risk losing half a department. - xxalpha: - - rscadd: 'Added a new Reviver implant: now it revives you from unconsciousness - rather than death.' - - rscadd: Added cybernetic implants and a cybernetic implants bundle to the Nuke - Ops uplink. - - bugfix: Fixed Nutriment pump implant printing. - - tweak: Health Analyzers now have the ability to detect cybernetic implants. - - tweak: X-Ray implants are now much harder to unlock. -2015-06-24: - Ikarrus: - - rscadd: Request Console message sent to major departments will now be broadcasted - on that department's radio. - - rscadd: Request Consoles can be used to quicly declare a security, medical, or - engineering emergency. -2015-06-25: - Iamgoofball: - - rscadd: Changes up how Explosive Implants work. - - rscadd: They have become Microbomb Implants. They cost 1 TC each. Each implant - you inject increases the size of the explosion. You gib on usage, regardless - of explosion size. - - rscadd: A Macrobomb implant was added for 20 TC. It is the equivalent of injecting - 20 microbombs. - - rscadd: Nuke Ops start with microbomb implants again. -2015-06-26: - Ikarrus: - - imageadd: Added a couple of new gang tag resprites by Joan. - Kor: - - tweak: Summon Guns has returned to its former glory. The spell will once again - create antagonists, now with the objective to steal as many guns as possible. - - tweak: Summon Guns once again costs a spell point, rather than granting one. - phil235: - - tweak: Buffs traitor stimpack (and adrenalin implant) to be more efficient against - stuns/knockdowns. - pudl: - - rscadd: You can now play games of mastermind to unlock abandoned crates found - throughout space. -2015-06-27: - Ikarrus: - - rscadd: Some objects can be burned now. - - rscadd: Bombs will shred your clothes, with respect to their layering and armor - values. Exterior clothing will shield clothing underneath. Storage items will - drop their contents when bombed this way. - Laharl Montogmmery: - - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the - content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 - tiles.' - MrStonedOne: - - tweak: Admins will now receive a notification when one of them starts to reply - to an adminhelp to cut down on multiple responses to adminhelps and let admins - know when an adminhelp isn't getting replied to. - - rscadd: The keyword finder in admin helps (adds a (?) link next to player names - in the text of adminhelps) has been added for all player to admin pms, as well - as admin say. - NullQuery: - - wip: Introduces html_interface, a module to streamline the management of browser - windows. - - rscadd: Adds playing cards that utilize a new HTML window management system. - Vekter: - - rscadd: Added a new military jacket to the Autodrobe and ClothesMate. -2015-06-28: - Ikarrus: - - rscadd: Gang Lieutenants can buy gang tools now, but at a higher cost than the - original boss - - rscadd: Gang leaders can register additional gangtools to themselves for use as - spares. - - tweak: Number of maximum lieutenants lowered to 2 - - tweak: Pistol cost increased to 25 influence - - tweak: Uzi cost increased to 50 influence - - tweak: Uzi Ammo decreased to 20 influence - - rscadd: Overcoats added to items the biogenerator can produce. - - rscdel: Micro and Macro bomb implants are now restricted to the Nuclear game mode. - phil235: - - tweak: Smoke (and foam) no longer distribute more reagents than they have. The - amount of clouds in a smoke now depends on the amount of smoke created. Acid - no longer melts items on a mob at low volume, and the chances to melt them increases - with the amount applied on the mob. Sprays can now contain acid again. -2015-06-29: - Ikarrus: - - rscadd: Clothing has been separated out of equipment lockers into wardrobes to - reduce clutter. - Incoming5643: - - rscadd: The secrets of the rainbow slimes have finally been revealed. To attain - this rare blob you must breed a slime with a 100% mutation chance! - - rscadd: Rainbow slime cores will generate a randomly colored slime when injected - with plasma. It's a good plan B if the slimes aren't cooperating in terms of - colors. You can get any color slime this way, pray to the RNG! - Xhuis: - - rscadd: The Sleeping Carp clan has made its presence known on Space Station 13. - Some gangs will name themselves after this group and practice martial arts rather - than using traditional gang weaponry. These shadowboxers are not to be taken - lightly. - oranges: - - tweak: Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand - jetpacks have been greatly improved in speed and handling -2015-07-01: - Ikarrus: - - rscadd: Multiple gang leaders are spawned at round start, the number which depends - on server population - - rscdel: Gangsters can no longer be promoted mid-game. - - rscadd: Security can once again deconvert gangsters with loyalty implants - - rscadd: Added an Implant Breaker item to the gangtool as a purchasable item for - 10 influence each
    * They are a one-use item that destroys all implants in - the target, including loyalty implants
    * They will also attempt to recruit - the target before destroying itself - - rscdel: Implanters no longer work if the target is wearing headgear. Remove them - first. - NullQuery: - - tweak: The crew monitoring computer, AI crew monitoring popup and the handheld - crew monitor now update automatically. - - tweak: 'Crew monitoring: The health information has been turned into a health - indicator. It goes from green to red. Hovering over the icon shows detailed - information (if available).' - - tweak: 'Crew monitoring: The location coordinates have been hidden. You can see - them by hovering over the ''Location'' column.' - - rscadd: 'Crew monitoring: A minimap has been added so you can easily see where - people are.' - - tweak: 'Crew monitoring: Players who are not in range of a camera are not shown - on the minimap.' - - tweak: 'Crew monitoring: AI players can quickly move to other locations or track - players by clicking the minimap or items in the table.' - - tweak: 'Crew monitoring: For AI players, health information always shows a white - indicator instead of green-to-red. This is a deliberate limitation to prevent - the AI from becoming too omnipresent.' - phil235: - - tweak: Space drug overdose no longer cause brute/brain damage but you hallucinate - more. Space Drug Blob now makes you hallucinate even if you don't overdose on - its space drug. - xxalpha: - - rscadd: 'Added a new traitor objective: steal the station''s self-destruct nuke - plutonium core.' -2015-07-02: - Ikarrus: - - rscadd: Throwing reagent containers such as drinks or beakers may spill their - contents onto whatever they hit - - rscadd: Slipping while carrying items in your hand may cause ~accidents~ - - tweak: Mounted and portable flashers can now only be burned out from overuse, - similar to flashes. - oranges: - - tweak: Thanks to department budget cuts we've had to remove the security cameras - built into officer helmets, Nanotrasen apologies for this inconvenience. -2015-07-03: - Ikarrus: - - experiment: Added support for up to six gangs at a time. Admins may add additional - gangs to any round. - - experiment: Gang mode now has a chance to start with a third gang. - - rscadd: Promotion of lieutenants have been re-added - - rscadd: Every lieutenant promoted will lengthen the gang's recruitment cooldowns - by one minute. - - rscdel: Only gang bosses will be able to recall the shuttle from their gangtool. - - rscadd: A recruitment pen that has not been used for a while will accumilate charges, - so you are no longer punished for waiting to convert people. - - rscadd: Gangs are now fully functional outside of gang mode. - Ricotez: - - rscadd: 'Added two categories of mutant bodyparts for humans with the same system - that lizards use: ears and tails. Right now only admins can edit these.' - - rscadd: Updated the system that checks for which jobs your character qualifies - to be species-dependant. At this moment you won't notice any differences, but - in the future coders can use this to be more specific about which jobs a species - is allowed in under which circumstances. - - imageadd: 'Added one option to both categories, taken from the kitty ears: a cat - tail and cat ears.' - - rscadd: 'Added a new button to the VV menu drop-down list for admins: Toggle Purrbation. - Putting a human on purrbation will give them cat ears and a cat tail, and send - them the message ''You suddenly feel valid.'' Using the button a second time - removes the effects.' - - wip: 'Adding categories for tattoos and scars is in the works. (Read: I need sprites!)' - oranges: - - tweak: Engineers in nanotrasen's safety equipment department announced the release - of a new and improved version of the X25 taser trigger, previous triggers, which - suffered from a long line of misfire problems were recalled enmasse. Nanotrasen - refused to comment on rumours that the previous trigger design was the work - of a saboteur. -2015-07-04: - Gun Hog: - - tweak: The Ore Redemption Machine now allows users to release minerals without - having to insert an ID first. - Ikarrus: - - bugfix: Fixed items that logically shouldn't spill, spilling their contents when - thrown - - bugfix: Fixed Bartender's non-spilling powers - - bugfix: Fixed thrown beakers not applying their contents onto floors - - bugfix: Fixed unable to transfer reagents between beakers you are holding - - bugfix: Fixed bombs shredding clothes that should have been protected by covering - clothes - - bugfix: Fixed gang mode. - MMMiracles: - - rscadd: Added patriotic underwear apparel due to the most god damn american holiday - being just around the corner. - - rscadd: Also adds some other stuff for those inferior countires too, I guess. -2015-07-05: - AlexanderUlanH & Xhuis: - - rscadd: Shadowling Ascendants have a new ability to send messages to the world. - - bugfix: Glare now properly silences targets. - - bugfix: Veil now turns off held lights. - - tweak: Drain Thralls replaced with Drain Life, which targets all nearby humans. - - rscadd: Spatial Relocation replaced with Black Recuperation which lets you revive - a dead thrall every five minutes. - - rscdel: Removed Vortex. - - tweak: Shadowlings can now only enthrall five people before being forced to hatch; - Hatched shadowlings can continue to enthrall however non-hatched ones can't - pass the global limit. - - tweak: Enthralling sends a message to all nearby humans. - - tweak: Removed cooldown on Glacial Freeze. - Ikarrus: - - tweak: Reactive armor may now teleport user to space tiles. Be careful using it - around space. - Razharas: - - tweak: Firing pins can now be removed by tablecrafting a gun with a plasmacutter, - screwdriver and wirecutters. - RemieRichards: - - imageadd: Melee attacks with weapons now display and animation of the weapon over - the target. - - rscadd: Tablecrafting window now shows all recipies and has been split into categorized - tabs. - - rscdel: 30 item limit removed. - Sabbat: - - rscadd: Updated the cult armor rune to let you get additional equipment or abilities - based on what you're wearing or holding. Some nerfed versions of wizard spells - can be used by the cult in exchange for unique clothing, these spells require - the cult robes or armor in order to use. No armor choices are mandatory, you - will always have the option of the default choice. - - rscadd: Zealot - Default armor rune. If none of the required clothing is worn - this will be chosen automatically. Is the same as ever. - - rscadd: Summoner - If you are wearing the wizard robe and hat when using the armor - rune this choice will be available. User will receive magus robes and hat and - nerfed versions of the summon shard and summon shell spells. - - rscadd: Traveler - Available to people wearing EVA suit and helmet. Replaces the - EVA suit and helmet with the cult space suit and space helmet. Gives you a sword. - - rscadd: Marauder - Available to people wearing the captain's space suit and helmet. - Same as Traveler except user is given a spell of summon creature (two creatures). - They can and will attack the user. - - rscadd: Trickster - Available if wearing the RD's reactive teleport armor. Gives - you magus robes, a wand of doors, and a nerfed version of Blink. - - rscadd: Physician - Available if wearing the CMO's labcoat. Gives you a wand of - life. - TheVekter: - - rscadd: Ian now has a dog-bed in the HoP's office. - nukeop: - - rscadd: Uplinks now have a syndicate surgery bag containing surgery tools, a muzzle, - a straightjacket and a syndicate MMI. - - rscadd: Syndicate MMIs can only be placed in cyborgs to create an unlinked cyborg - with syndicate laws. -2015-07-06: - Ikarrus: - - tweak: Increased Uzi SMG cost to 60 influence. - - tweak: Increased Uzi ammo cost to 40 influence. - - tweak: Domination attempt limit is reduced to 1 per gang while the shuttle is - docked with the station. - - tweak: Gang bosses can promote and recall the shuttle using spare gangtools - - bugfix: Fixed Gang bosses getting deconverted with head trauma - - rscadd: Lizard characters can now get random names unique from humans. -2015-07-07: - Ikarrus: - - bugfix: Fixed bug where gang messages would occasionally fail to send. - - bugfix: Fixed bug that prevented implant breakers from recruiting security. - - tweak: Implanters are now only blocked by helmets with THICKMATERIAL - - rscdel: Light severity explosions no longer shred clothes. - MMMiracles: - - rscadd: Adds a new crate to cargo in the security section, for when desperate - times call for desperate measures. - NullQuery: - - bugfix: Crew monitoring computers now sort by department and rank again. - - tweak: 'Crew monitoring computer: Hovering over a dot on the minimap will now - jump to the appropriate entry in the table.' - - bugfix: sNPCs were given ID cards with blank assignments. -2015-07-09: - AlexanderUlanH: - - rscadd: Riot Shotguns now spawn loaded with rubber pellet shells that deal high - stamina damage. - kingofkosmos: - - tweak: Both beakers and drinking glasses can now be be drunk from, fed to mobs - and splashed on mobs, turfs and most objects with harm intent. - nukeop: - - tweak: RCDs have a larger storage and can be loaded with glass, metal and plasteel. - - rscadd: Grilles and Windows can be made with an RCD. - - rscadd: Engi-Vend machine now has three RCDs. - - rscdel: Removed RCD as a steal objective. -2015-07-10: - Ikarrus: - - rscadd: 'New Changeling Ability: False Armblade Sting. It creates an undroppable - armblade on the target temporarily. It will appear exactly like a real one, - except you can''t do anything with it.' - - tweak: Transform stings are no longer stealthy. -2015-07-11: - Dorsidwarf: - - tweak: Due to a new Syndicate budget, uplink implants are now only 14 TC. - - tweak: In order to facilitate inter-agent communication, Syndicate Encryption - Keys have been reduced to 2TC. They retain the ability to intercept all channels - and speak on a private frequency. - Ikarrus: - - tweak: Robotic augmentations have been made a bit more difficult to maintain. -2015-07-13: - Ikarrus: - - imageadd: Loyalty Implant HUD Icon has been updated. - duncathan: - - tweak: Greatly shortened the time it takes to lay pipes with the RPD and to unwrench - pipes in general. - - rscadd: Added Optical T-Ray scanners to R&D and Atmospheric Technician closets. - Optical T-Ray Scanners function identically to a handheld scanner. -2015-07-14: - AnturK: - - rscadd: New species of mimic was spotted in the wilderness of space. Watch out! - Jordie0608: - - rscadd: Added a Local Narrate verb for admins. -2015-07-17: - Ikarrus: - - bugfix: Virology is no longer all-access. - - rscadd: Changelings now have the ability to swap forms with another being. - - tweak: Halved Domination Time. - - tweak: Reinforced windows and windoors are a bit more resistant to fires and blasts. - MrStonedOne: - - tweak: 'Scrubbers now use power: 10w + 10w for every gas its configured to filter. - (60w for siphon)' - - rscadd: Scrubbers can now be configured to operate on a 3x3 range via the air - alarm at a high cost (ranging from 100w to 1000w depending on how many tiles - are near it that aren't blocked and how much power it's using normally) - - tweak: Huge portable scrubbers (like in toxins storage) now use a 3x3 range rather - then a higher volume rate - - bugfix: Fixed issue with atmos not allowing low levels of plasma to spread - - bugfix: Fixed issue with atmos not adding or removing plasma overlays in some - cases - - tweak: Panic siphon now uses a 3x3 area range rather then increasing the scrubbers - intake rate by 8x - - tweak: Replace air uses 3x3 range for the first stage - - rscadd: 'Air alarms now have 3 new environmental modes:' - - rscadd: Siphon - Panic siphon without the panic, operates on a 1 tile range - - rscadd: Contaminated - Activates all gas filters and 3x3 scrubbing mode - - rscadd: Refill Air - 3 times the normal vent output -2015-07-18: - AlexanderUlanH: - - tweak: Reduced stun duration of tabling to be closer to other stuns. - Iamgoofball: - - tweak: The Bioterror Chemical Sprayer is now filled with a more deadly mix of - chemicals. - RemieRichards: - - tweak: Changelings now regenerate chemicals and geneticdamage while dead, but - only up to specific caps (50% of their max chem storage, and 50 geneticdamage) - - tweak: Fakedeath's length has been reduced from 80s dead (1 minute 20) to 40s - dead - - rscadd: Changelings now get to see the last 8 messages the person they absorbed - said, to allow them to better impersonate their victim's speech patterns - Steelpoint: - - tweak: Reduced weight of Sechailer, it now fits in boxes. - phil: - - tweak: Smoke and foam touch reactions gets buffed. - - rscadd: Reagent dispensers (watertank, fueltank) tells you how much reagents they - have left when examined. - - tweak: Liquid dark matter blob spore smoke now cannot throw you. The effects of - sorium, blob sorium, liquid dark matter and blob liquid dark matter are now - scaled by their volume. Sorium/LDM blob's touch now throws the mobs who are - close but simply moves the mobs that are further away. -2015-07-19: - Gun Hog: - - rscadd: Nanotrasen advancements in cyborg technology now allow for integrated - headlamps! As such, the flashlight package normally used as a module is now - seamlessly merged with their systems! - Ikarrus: - - rscadd: Asimov's subject of "human beings" can now be modified by uploaders. - - rscadd: Eaxmining AI modules while adjacent to them will show you what laws it - will upload. - MMMiracles: - - soundadd: Adds a TWANG sound effect when hitting things with a guitar. -2015-07-20: - AnturK: - - tweak: Lightning Bolt now always bounces 5 times and deals 15 to 50 burn damage - to each target depending on the chargeup - KorPaheron: - - rscadd: Added the Multiverse Sword, a new wizard artifact that can summon clones - of yourself from other universes, allowing for dangerous amounts of recursion. - phil235: - - tweak: Mechs no longer use object verbs and the exosuit interface tab. They now - use action buttons. Mechs now have a cycle equipment action button to change - weapon faster than by using the view stats window. Mechs get two special alerts - when their battery or health is low. Mechs now properly consume energy when - moving and having their lights on. Using a mech tool that takes time to act - now shows a progress bar (e.g. mech drill). - - rscadd: Mechs now have a cycle equipment action button to change weapon faster - than by using the view stats window. - - rscadd: Mechs get two special alerts when their battery or health is low. - - tweak: Mechs now properly consume energy when moving and having their lights on. - - rscadd: Using a mech tool that takes time to act now shows a progress bar (e.g. - mech drill). -2015-07-21: - Fayrik: - - tweak: Syndicate Donksoft gear now costs less. - Xhuis: - - rscadd: Firelocks may now be constructed and deconstructed with standard tools. - Circuit boards can be produced at a standard autolathe. - phil235: - - tweak: Thrown things no longer bounces off walls, unless they're in no gravity. - Heavy items and mobs thrown can push the mobs and non anchored objects they - land on. Throwing a mob onto a mob in no gravity will push each one in opposite - direction. Thrown mobs landing on wall, or dense object or mob gets stunned - and a bit injured. The damage when mob hit a wall is nerfed. -2015-07-23: - NullQuery: - - tweak: 'Crew monitoring: The minimap now supports scaling. You can zoom in and - out using the buttons. Hovering over an entry in the table centers the minimap - on that part of the screen.' - - tweak: 'Crew monitoring: If the window is wide enough the health indicator will - expand to show full health data (if available).' - - tweak: 'Crew monitoring: Clicking on the area name will now copy the coordinates - to your clipboard.' - - tweak: 'Crew monitoring: The AI can view health information again, but there is - a 5 second delay between updates for everyone watching.' - freerealestate: - - rscadd: Added resist hotkeys for borgs and humans. With hotkeys mode, use CTRL+C - or C as a human and CTRL+C, C or END as a borg. With hotkeys mode off, use CTRL+C - as a human and END as a borg. - xxalpha: - - bugfix: Changeling augmented eyesight night vision is now working. -2015-07-24: - Incoming5643: - - rscadd: The spells disintegrate and flesh to stone have had their mechanics changed. - Using these spells will spawn a special touch weapon in a free hand (your dominant - hand if possible) that can then be used to inflict the spell on the target of - your choice. Having the touch weapon out is obvious, this is not a stealth based - change. Clicking the spell while the hand is out will let you return the charge - without using it. - - rscdel: The spell won't begin to recharge until the hand attack is either used - or returned. Additionally these changes mean you can no longer use these spells - while stunned or handcuffed. As a suggestion remember that the mutate spell - allows you to break out of cuffs very easily, and warping abilities will keep - you from getting cuffed to begin with! -2015-07-25: - Dorsisdwarf: - - tweak: Due to a fire sale at Syndicate HQ, many of the more interesting traitor - gadgets have been cut in price dramatically. Please take this opportunity to - make full use, as we cannot guarantee that the sale will last! - bgobandit: - - bugfix: Under pressure from the Animal Rights Consortium, Nanotrasen has improved - conditions at its cat and dog breeding facilities. Cats and pugs are now much - more responsive to their owners. - duncathan: - - tweak: Restores RPD delay on disposals machines. - xxalpha: - - tweak: Agent IDs are now rewrittable. -2015-07-26: - Phil235: - - rscadd: Sechailers will now break when used too often. - - imageadd: Mechs now have new action button sprites. - Steelpoint: - - rscadd: Security Officers now spawn with a security breathmask in their internals - box. - - imageadd: Abductor's batons now changes color with modes. - - imageadd: Unique sprites for Abductor hand cuffs and paper. - goosefraba19: - - imageadd: Updated the Power Monitoring Console with better alignment and colorized - readouts. -2015-07-27: - Bgobandit: - - bugfix: Burgers can now be made from corgi meat again. - Ikarrus: - - rscadd: Added shutters to the armory to allow quick access when needed. - - bugfix: Security can now use the Brig external airlocks. - - rscadd: Added a join queue when the server has exceeded the population cap. - - tweak: Decreased the cost of Body Swap and removed it's genetic damage. - kingofkosmos: - - rscadd: Added a link to re-enter corpse to alert when your body is placed in a - cloning scanner. -2015-07-28: - Anonus: - - imageadd: New gang tags for Omni and Prima gangs. - Chiefwaffles: - - rscadd: After realizing how often AIs tend to 'disappear', Central Command has - authorized the shipment of the Automated Announcement System to take over the - AI's responsibility of announcing new arrivals. - - rscadd: In addition, users are able to configure the messages to their liking. - Early testing has shown that this feature may be vulnerable to malicious external - elements! - - rscadd: The station's R&D software has been updated so it can now succesfully - create its own prototype AAS board once the prerequisite levels have been met. - Dorsisdwarf: - - tweak: Increased the cost of Bioterror darts to 6TC. - Incoming5643: - - experiment: Double Agents no longer know they're Double Agents and not just standard - Traitors. - xxalpha: - - rscdel: Removed Anti-Drop and Nutriment Pump implants from Nuclear Operative's - uplink. -2015-07-29: - AnturK: - - rscadd: Aliens can now mine through asteroid rock. - GunHog: - - tweak: Cyborg headlamps have a short cooldown before reactivation when forcibly - deactivated. - - bugfix: Shadowling's Veil now shuts down headlamps for the ability's entire duration. - Kor: - - rscadd: Eating the heart of a Slaughter Demon will grant you dark powers. - freerealestate: - - bugfix: Fixed bug where copying with ctrl+C didn't work due to it being assigned - to resist. - - rscadd: Changed resist to B (hotkeys mode) and ctrl+B (either mode) instead. - - rscdel: Removed End resist from cyborgs. -2015-07-30: - Gun Hog: - - tweak: The Reactivate Camera power for Malfunctining AIs now costs 10 CPU, and - works on the entire camera network, up to 30 cameras fixed. - - tweak: The Upgrade Cameras power now costs 35 CPU, upgrades all cameras in the - network to have EMP proofing, X-ray, and gives the AI night-vision. - Ikarrus: - - rscadd: Door Access buttons can now be emagged to remove access restrictions. - LordPidey: - - rscadd: Added a new medication, Miner's Salve. It heals brute/burn damage over - time, and has the side effect of making the patient think their wounds are fully - healed. It is mixed with water+iron+oil, or grind a twinkie, a sheet of metal, - and a sheet of plasma. - - rscadd: Added a grinder to the mining station. - Midaychi: - - rscadd: Random loot has been added to the derelict as salvage for drones. - Scones: - - rscadd: Adds a Rice Hat to the biogenerator. -2015-08-02: - Incoming5643: - - rscadd: Syndicate toolboxes now come with never before seen red insulated gloves. - Steelpoint: - - bugfix: Fixed multiple mapping errors for Boxstation and the mining base. - - rscadd: A circuit imprinter and exosuit fabrication board have been added to tech - storage. - SvartaSvansen: - - rscadd: Our lizard engineers have worked hard and managed to improve Centcom airlocks - so they no longer disintegrate when the electronics are removed! - - tweak: Put a safety net in place so future airlocks without assemblies produce - the default assembly instead of disintegrating. -2015-08-04: - Kor: - - rscadd: Soulstones will now attempt to pull ghosts from beyond if the targeted - corpse has no soul. - Summoner99: - - rscadd: Added the *roar emote back to Alien Larva - - bugfix: Fixed aliens not being able to do the *hiss and *screech emotes - - tweak: 'Changed how the plural emote system works and now some emotes have plural - versions, example is: *hiss and *hisses.' -2015-08-05: - CoreOverload: - - rscadd: Implants, implant cases and implanters got RnD levels and can be DA'ed - for science. - - rscadd: Surgically removed implant can be placed into an implant case. Remove - implant with empty implant case in inactive hand. - - rscadd: Surgical steps now got progress bars. - - rscadd: You can cancel a surgery by using drape on operable body part again. This - works only before you perform surgery's first step. - - rscadd: Operating computer shows next step for surgeries. No more alt-tabbing - to view next step on wiki while operating. - - tweak: You cannot start two surgeries on one body part at once. You can start - two multiloc surgeries (i.e. two augumentations) on diffirent body parts at - once. - - tweak: Monkey <-> Human transformations now keep your internal organs, cyberimplants - and xeno embryos included. - Ikarrus: - - rscdel: Head beatings no longer deconvert gangsters. - LordPidey: - - rscadd: 'Added a new chemical. Spray tan. It is made by mixing orange juice with - oil or corn oil. Warning: overexposure may result in orange douchebaggery.' - Xhuis: - - rscadd: Shadowling thralls can now be deconverted via surgery or borging. - - rscadd: Thralls can be revealed by examining them. They can hide this by wearing - a mask. - - rscadd: Thralls have a few minor abilities they can use in addition to night vision. - - rscadd: Hatch-exclusive abilities can no longer be used if you are not the shadowling - mutant race. - - rscadd: Ascendants are now immune to bombs and singularities. Honk. - - rscadd: A Centcom report has been added for shadowlings. - - tweak: Ascending no longer kills all shadowling thralls. This allows antagonists - who were enthralled to succeed along with the ascendants. - - tweak: Annihilate now has different sound and a shorter delay before the target - explodes. In addition, it now works on all mobs, instead of just humans. - - bugfix: Glacial Blast now properly has no cooldown if used while phase shifting. - - bugfix: Fixes a runtime if a target with no mind is enthralled. - bgobandit: - - rscadd: Nanotrasen scientists have achieved the tremendous breakthrough of injecting - gold slime extracts with water. Pets ensued. -2015-08-06: - AnturK: - - rscadd: Adds the voodoo doll as a mining treasure, link it with a victim with - an item previously held by them. - - rscadd: Once linked the voodoo doll can be used to injure, confuse and control - the victim. - Core0verlad: - - tweak: Items can now be removed from storage containers inside storage containers. - - imageadd: Beds and bedsheets have new sprites. - - rscdel: MMIs are no longer ID locked. - KorPhaeron: - - tweak: Slaughter Demon's have had their health reduced to 200 and their speed - reduced but they get a speed boost when exiting blood. - MrPerson: - - rscadd: Items stacks now automatically merge unless thrown when moved onto the - same tile. -2015-08-07: - KorPhaeron: - - rscadd: Added a new Guardian Mob that can be summoned to manifest inside a mob. - - rscadd: Guardians can communicate with their host and materialize themselves to - protect their host with magic powers. - - rscadd: Guardians are invincible but cannot live without or too far from their - host, they also relay injuries they suffer to the host. - Phil235: - - bugfix: Fixed being able to run into your own bullet. - RemieRichards: - - rscadd: You no longer need to click on an item in a storage container to remove - it, clicking anywhere around the item works. - bustygoku: - - rscdel: Removed the chance for a disease to make you a carrier on transfer. - phil235: - - tweak: The plasma cutter's fire rate is now a bit lower but its projectile can - pierce multiple asteroid walls and its range isn't lowered in pressurized environment - anymore. -2015-08-09: - RemieRichards: - - rscadd: 'Nanotrasen Mandatory FunCo Subsidiary: CoderbusGames, would like to announce - an update to Orion Trail!' - - rscadd: 'Spaceports: Buy/Sell Crew, Trade Fuel for Food, Trade Food for Fuel, - Buy Spare Electronics, Engine Parts and Hull Plates, or maybe you think you''re - tough enough to attack the spaceport?' - - rscadd: 'Changelings: Changelings can now sneak into your crew, Changelings eat - double the standard food ration and have a chance to Ambush the rest of the - crew!' - - rscadd: 'Kill Crewmembers: Do you suspect changelings? or dont feel you have enough - food rations? Just shoot somebody in the head, at any time!' -2015-08-12: - CosmicScientist: - - rscadd: Added Space Carp costume to the code, get it from an autodrobe near you. - - rscadd: Added Ian costume to the code, take his place under the HoP's hand, get - it from an autodrobe or corgi hide, keep it away from washing machines or it'll - meat its end as clothing. - - rscadd: Added Space Carp spacesuit to the code, I know what I'm praying for. - bgobandit: - - rscadd: After multiple complaints from WaffleCo food activists, Nanotrasen has - added real chocolate, berry juice and blue flavouring to its ice cream products. -2015-08-13: - CoreOverload: - - rscadd: 'Added a new 8TC traitor item: subspace storage implant. It allows you - to store two box-sized items in (almost) undetectable storage. ' - - tweak: Changed the way most of the surgical operations work. See wiki for new - steps. - - tweak: You can cancel step 2+ surgeries with drapes and cautery in inactive hand. - - tweak: Defib no longer works on humans who have no heart. Changeling/thrall/cult/strange - reagent revives are still working, and this is intended. - - rscadd: You can eat all organs raw now, with exception for brains and cyberimplants. - - rscadd: Some xenos abilities are linked to their organs. Play with xenos' guts - for fun and profit! - RemieRichards: - - rscadd: Modifying a string (Text) variable with View Variables or View Variables - Mass Modify now allows you to embed variables like real byond strings, For example - the variable real_name; you could set a text var to [real_name] and it would - be replaced with the actual contents of the var, This allows for Mass fixing - of certain variables but it's also useful for badmin gimmickery -2015-08-15: - Miauw: - - rscadd: Changeling transformations have been upgraded to also include clothing - instead of just DNA. - - tweak: Patches no longer work on dead people. - - rscadd: Added 15-force edaggers that function like pens when off. - MrPerson: - - rscadd: Objects being dragged will no longer get shoved out of your grasp by space - wind. Retrieving dead bodies should be possible. - RemieRichards: - - rscadd: Added Changeling Team Objectives, these are handed out to all lings, with - the chance of a round having one being 20*number_of_lings% (3 lings = 60%) - - rscadd: 'Impersonate Department (Team Objective): As many members of a department - as can reasonably be picked are chosen for the lings to kill, replace and escape - as' - - rscadd: 'Impersonate Heads (Team Objective): 3 to 6 Heads of Staff are chosen - for the lings to kill, replace and escape as' - - tweak: If the Changelings have a Team Objective, their usual Kill, Maroon, Etc. - objectives will not pick other changelings, to discourage backstabbing in teamling - - tweak: Changeling Engorged Glands is now the default storage and regen rate, Engorged - Glands remains for an extra boost - - rscadd: Armblades can now be used to open powered doors, however it takes 10 seconds - of the changeling standing still, Their ability to instantly open unpowered - doors remains unchanged - - rscdel: Debrain objective is no longer handed out to lings, it's as good as broken - these days - - rscadd: Changelings may now purchase a togglable version of the Chameleon Skin - genetics mutation, for 2 DNA -2015-08-16: - Joan: - - rscadd: Revenants will now occasionally spawn as an event. - - tweak: Revenants gain more energy from Harvesting, and can Harvest from people - in crit. - - tweak: Revenant powers are more effective, and no longer freeze you in place, - besides Harvest. - - tweak: Slain Revenants will respawn much faster. - - bugfix: Fixed a whole bunch of revenant bugs, including one that caused the objective - to always fail. - Kor: - - rscadd: The wizard can now stop time. - MMMiracles: - - tweak: Revamps bioterror darts into a less-lethal, syringe form. Removed the coniine - and spore toxins to keep it solely for quiet take-downs. -2015-08-18: - CoreOverload: - - rscadd: Added a new low-tech eye cyberimplant in RnD - welding shield implant. - - rscadd: Implanter and empty implant case added to protolathe. - - rscadd: You can sell tech disks and maxed reliability design disks in cargo for - supply points. - - tweak: DA menu shows current research levels. - - tweak: You can print cyberimplants in updated mech fab. - Supermichael777: - - bugfix: Added an ooc hotkey for borgs = O. They simply didn't have one and it - was a consistency issue - - rscadd: Also added Ctrl+O as an any mode keycombo so you dont have to backspace - and type ooc. Added to hotkey mode to remain consistent with all other Ctrl - combos - bustygoku: - - tweak: Most backpacks now have 21 or more slots, but are still weight restricted. - What this means is that you can have a lot of tiny weight items, but only 7 - medium items just like before. - phil235: - - tweak: Janicart rider no longer slip on wet floor or bananas. Moving on a floor - tile with lube while buckled (chair, roller bed, etc) will make you fall off. -2015-08-19: - Joan: - - rscadd: Added a new revenant ability; Malfunction. It does bad stuff to machines. - - tweak: Defile and Overload Lights now briefly stun the revenant. - - tweak: You can now Harvest a target by clicking on them while next to them. - - bugfix: Harvesting no longer leaves you draining if the target is deleted mid-drain - attempt. - - rscdel: Defile no longer emags bots or disables cyborgs, Malfunction does that - now. - Kor: - - rscadd: The Ranged and Scout guardian types have been merged, and gained a new - surveillance snare ability. - SconesC: - - rscadd: Added Military Belts to traitor uplinks. - bgobandit: - - rscadd: CentComm now offers its cargo department toys, as well as detective gear - so their boss can figure out which tech wasted all the points on them. - phil235: - - rscadd: You can now partially protect yourself from blob attack effects by wearing - impermeable clothes like hardsuits, medical clothes, masks, etc. Max protection - effect is capped at 50%. - - rscdel: Splashing someone with chemicals no longer injects those chemicals in - their body. - - bugfix: Fixes splashing acid on items or floor with items not having any effect. -2015-08-28: - bgobandit: - - bugfix: 'Overheard at CentComm: ''This burn kit said salicyclic acid would heal - my burns! WHO MADE THIS SHIT?'' A muffled honking is heard in the background. - (Burn first-aid kits now contain an appropriate burn pill.)' - - rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid - kits and to chemistry. Ingesting 25 units or more causes burn and brute damage. -2015-09-01: - Dorsidwarf: - - tweak: Changelings' Digital Camoflague ability now renders them totally invisible - to the AI - ExcessiveUseOfCobblestone: - - rscadd: Added health analyzer to the autolathe. - - tweak: Moved Cloning board to Medical Machinery section. - - tweak: Moved Telesci stuff to Teleporter section. - Fox P McCloud: - - tweak: Adds the emitter board to to the circuit imprinter for R&D. - Gun Hog: - - tweak: The Disable RCD Malfunction power is now Destroy RCDs! It costs 25 CPU - (down from 50), causes RCDs to explode, can be used multiple times, and no longer - affects cyborgs. - Kor: - - rscadd: Revheads and Gang leaders now spawn with chameleon security HUDs, for - keeping track of loyalty implanted crew. - - rscadd: Syndicate thermals now have a chameleon function as well, allowing you - to disguise the goggles to match your job. - Miauw: - - tweak: Edaggers actually work now and have been buffed to 18 brute and 2 TC. - Oisin100: - - rscadd: Nanotransen discover ancient human knowledge confirming that trees produce - Oxygen From Carbon Dioxide - - tweak: Trees now require Oxygen to live. And will die in extreme temperatures - Xhuis: - - rscadd: The arcade machines have been stocked with a xenomorph action figure that - comes with realistic sounds! - - rscadd: Darksight now has its own icon. - - rscadd: Empowered thralls have been added. While obvious, they are more powerful - and can resist dethralling while conscious. Only 5 can exist at one time. - - rscadd: Shadowlings can now change their night vision radius by using the action - button their eyes (glasses) now provide. - - tweak: Torches are dimmer, being as bright as flashlights, and no longer fit on - belts. - - tweak: Black Recuperation now has a 1 minute cooldown, down from 5. It can also - be used to empower living thralls. - - tweak: Guise can now be used outside of darkness and makes the user more invisible - than before. - - bugfix: Enthrall now functions properly when a shadowling is not hatched, allowing - them to enthrall up to 5 people before hatching. - xxalpha: - - tweak: Blood crawling is now a spell. - - rscadd: Engineering cyborgs now have a constant magpulse. - - tweak: Changed foam spreading to be like gas spreading. -2015-09-05: - Shadowlight213: - - rscadd: The syndicate have taken notice of the camera bug's woeful underuse, and - have managed to combine all of its upgrades into one! -2015-09-06: - Fox P McCloud: - - bugfix: Fixes gold sheets having plasma as their material. - Xhuis: - - bugfix: Nanotrasen inspectors have discovered a fault in the buckles of chairs - and beds. This has been fixed and you are now able to buckle again. -2015-09-07: - xxalpha: - - tweak: Changed xeno weed spread to be like gas spread. -2015-09-09: - Joan: - - rscadd: New blob chemical; Cryogenic Liquid. Cools down targets. - - tweak: Tweaked names, colors, and effects of remaining blob chemicals; - - tweak: Skin Ripper is now Ripping Tendrils and does minor stamina damage, in addition - to the brute damage. - - tweak: Toxic Goop is now Envenomed Filaments and injects targets with spore toxin - and causes hallucinations, in addition to the toxin damage. - - tweak: Lung Destroying Toxin is now Lexorin Jelly and does brute damage instead - of toxin damage. The oxygen loss it causes can also no longer crit you in one - hit. - - tweak: Explosive Gelatin is now Kinetic Gelatin and does random brute damage, - instead of randomly exploding targets. - - rscdel: Skin Melter, Radioactive Liquid, Omnizine, and Space Drugs blob chemicals - are gone. - bgobandit: - - rscadd: Nanotrasen has commissioned two new corporate motivational posters for - your perusal and edification. - - rscadd: Nanotrasen also wishes to remind the crew that non-authorized posters - ARE CONTRABAND. Especially those new ones with Rule 34. Perverts. -2015-09-11: - CosmicScientist: - - tweak: Drone dispenser now has a var for its cooldown, get var editing. -2015-09-13: - Fox P McCloud: - - bugfix: Fixes an exploit and inconsistency issue with a few material amounts on - a few items and designs. - - bugfix: Fixes Bibles/holy books not properly revealing runes. - - bugfix: fixes stimulants not properly applying its speedbuff. - Gun Hog: - - tweak: Nanotrasen scientists have proposed a refined prototype design for the - nuclear powered Advanced Energy guns to include a taser function along with - the disable and kill modes. Addtionally, they have modified the chassis blueprint - to include a hardpoint for attachable seclites. - Iamgoofball: - - tweak: Reduced the cost of changeling armor to 1 and increased it's armor values. - Jordie0608: - - rscadd: You can now view the reason of a jobban from character setup. - xxalpha: - - rscadd: Drying agent splashed on galoshes will turn them into absorbent galoshes - that dry wet floors they walk on. - - rscadd: Drying agent can be made with ethanol, sodium and stable plasma. -2015-09-14: - Fox P McCloud: - - tweak: Adds a mining voucher to the Quartermaster's locker. - Thunder12345: - - rscadd: The captain has been issued with a new jacket for formal occasions. - - tweak: Research has shown that is is possible to build technological shotshells - without the need for silver. The design blueprints supplied to your station - have been updated accordingly. - xxalpha: - - bugfix: Fixed not being able to grab things from storage while inside aliens. - - bugfix: Fixed two progress bars when devouring. - - rscadd: Shields will now block alien hunter pounces. - - tweak: Alien hunters health reduced to 125 from 150. Alien sentinels health increased - to 150 from 125. - - tweak: Alien hunters will no longer be transparent when stalking, this ability - was given to alien sentinels. - - tweak: Alien slashing now deals constant 20 damage but has a chance to miss. - - tweak: Reduced alien disarm stun duration vs cyborgs, from 7 seconds to 2 seconds. - - tweak: Alien sentinels now move as fast as humans. - - tweak: Facehuggers and alien eggs layers increased to be higher than resin walls. -2015-09-16: - Razharas: - - tweak: Replaces the space cube with space torus. Space levels are now each round - randomly placed on the grid with at least one neigbour, any side of the space - level that doesnt have neigbour will loop either onto itself or onto the opposite - side of the furthest straight-connected space level on the same axis. - Supermichael777: - - tweak: The detomax pda cartridge no longer blows its user up. - Xhuis: - - experimental: Cultists will now be able to create all runes without needing to - research or collect words. This is subject to change. - - tweak: Cult code has been significantly improved and will run much faster and - be more responsive. - - tweak: Conversion runes can now be invoked with less than three cultists, but - take a small amount of time to convert the target. - - tweak: Armor runes will only outfit the user with standard armor, rather than - having different loadouts for different worn clothing items. - - tweak: Astral Journey runes will now pull the user back to the rune if they are - moved. The user also has a different color while on the rune. - - tweak: Free Cultist has been removed. Summon Cultist now works even if the target - is restrained. - - tweak: Sacrifice and Raise Dead runes now offer more precise target selection. - - soundadd: Sacrifice runes now have different sounds, and gib rather than dust - (assuming the target is not a silicon). - - tweak: There is no longer a maximum cap on active runes. - - tweak: Runes have been renamed to Rites. For instance, the Teleport rune is now - the Rite of Translocation. The only exception to this is the rune to summon - Nar-Sie, which is a Ritual. - - tweak: Nar-Sie now has a new summon sound. - - tweak: The Nar-Sie summon rune has a new 3x3 sprite. - - tweak: The stun rune no longer stuns cultists. - - rscadd: The Rite of False Truths had been added, that will make all nearby runes - appear as if they were drawn in crayon. - - rscadd: Runes can now be examined by cultists to determine their name, function, - and words. - phil235: - - tweak: Riot and energy shield users now have a chance to block things thrown at - them as well as xeno leaping at them. -2015-09-17: - bgobandit: - - rscadd: Meatspikes can now be constructed and deconstructed with metal and rods, - as well as wrenched and unwrenched! Humans and corgis can be used on them as - well. - xxalpha: - - tweak: 'Reworked nuke deconstruction: Standardized steps, partial reparation (use - metal) to contain radiation.' - - rscadd: New portable nuke, self-destruct terminal, syndie screwdriver sprites - by WJohnston. -2015-09-19: - Xhuis: - - rscadd: Shadowlings are now able to sacrifice a thrall to extend the shuttle timer - by 15 minutes. This will not stack. - - bugfix: Additional abilities granted by Collective Mind will now properly have - icons. - - bugfix: Shadowlings now have their antagonism removed if turned into a silicon. - - tweak: The order of abilities unlocked by Collective Mind has been changed. It - now starts with Sonic Screech. - - tweak: Veil now destroys glowshrooms in a much larger radius than before. -2015-09-20: - Xhuis: - - tweak: Rites have been renamed to their old runes, which reflect their functionality. - - tweak: Examining a talisman no longer opens the paper GUI. - - tweak: Armor talismans have been re-added. - - tweak: EMP talismans now have the same range as their rune counterpart. - - tweak: Some talismans now cost health to use, costing more or less depending on - their effect. - - tweak: Scribing runes now deals 0.1 brute damage instead of 1. - - tweak: Bind Talisman runes no longer deal 5 brute damage when invoking. - - tweak: Rune shapes and colors are now identical to their old versions. - - tweak: Conversion runes can no longer be used by yourself, and require a static - 2 cultists. -2015-09-22: - Kor: - - rscadd: A new admin command, Offer Control to Ghosts, can be found in the view - variables menu. It will randomly select a willing candidate from among dead - players, providing a fair method of replacing antagonists. - Xhuis: - - tweak: When a morph changes form, a message is shown to nearby people. This also - happens upon undisguising. - - tweak: Morphs now have an attack sound and message. - - tweak: The Spawn Morph event now plays a sound to the chosen candidate. - - tweak: Slaughter demons (and other creatures with blood crawl) now take two seconds - to emerge from blood pools. Entering is still instantaneous. - - tweak: The demon heart's sprite has been updated. - - tweak: Eating a demon heart now surgically implants the heart into your chest. - If the heart is removed from you, you lose the ability. Someone else can eat - the heart to gain the ability. - - tweak: Blood Crawl no longer has a 1-second cooldown, instead having none. - - tweak: You can no longer hold items when attempting to Blood Crawl, nor can you - use any items while Blood Crawling. - - tweak: Creatures that can Blood Crawl now take two seconds to emerge from blood - pools. - - tweak: Slaughter demons now store devoured creatures, and will drop them upon - death. - - tweak: Revenants now have the ability to speak to the dead. - - tweak: Revenant abilities now have icons. - - tweak: Malfunction no longer EMPs a specific area - it will instead EMP nearby - machines directly and stun cyborgs. Dominators are immune to this. - - tweak: Revenants now have directional sprites. - - tweak: Overload Lights now has a smaller radius. - - tweak: Defile no longer corrupts tiles. - - tweak: When glimmering residue reforms, the game will attempt to place the old - revenant in control of the new one. If this cannot be done, it will find a random - candidate. - - tweak: Revenants can no longer see ghosts. They can see other revenants, however, - and ghosts can still see revenants. - - tweak: The Spawn Slaughter Demon event now plays a sound to the chosen candidate. - phil235: - - rscdel: Lizards and other non human species can no longer acquire the hulk mutation. - Hulks no longer have red eyes - - bugfix: Monkeys now always have dna and a blood type (compatible with humans). - - bugfix: Monkey transformation no longer deletes the human's clothes. - - bugfix: Space Retrovirus now correctly transfers dna SE to the infected human. - - bugfix: Changeling's Anatomic Panacea removes alien embryo again. - - bugfix: Cloning someone now correctly sets up their dna UE. - - bugfix: Fixes the laser eyes mutation not giving glowing red eyes to the human. - - bugfix: Using changeling readaptation now properly removes all evolutions bought - (arm blade, chameleon skin, organic suit). - xxalpha: - - rscadd: Added a researchable cyborg self-repair module to the robotics fabricator. -2015-09-23: - Xhuis: - - rscadd: Syndicate medical cyborgs have been added. - - rscadd: The Dart Pistol is now available from the uplink for 4 telecrystals. It - functions as a pocket-sized syringe gun with a quieter firing sound. - - tweak: Boxes of riot foam darts now cost 2 telecrystals, down from 10, and are - available to traitors. - - tweak: Foam dart pistols now cost 3 telecrystals, down from 6. - - tweak: Syndicate cyborg teleporters now allow a choice between Assault and Medical - cyborgs. - - tweak: Syndicate cyborgs are now distinguished as Syndicate Assault. - - tweak: Syndicate cyborg energy swords now cost 50 energy per use, down from 500. - - tweak: Airlock charges now cost 2 telecrystals, down from 5. - - tweak: Airlock charges are much more powerful. - - tweak: There is no longer a 25% chance to detonate an airlock charge while removing - it. - - tweak: The description of many uplink items has been changed to better reflect - their use. -2015-09-24: - Jordie0608: - - tweak: Advanced energy guns now only critically fail after successive minor failures. - Cease firing after multiple recent minor failures to avoid critical ones. - Kor: - - rscadd: Guardian Spirit types and powers have been heavily reworked. Full details - of each type are available on the wiki. - - rscadd: Guardian damage transfer to users now deals cloneloss if their user is - in crit. - - rscadd: Guardians are now undergoing a trial run in the traitor uplink, under - the name of Holoparasites. - - rscadd: You can now hang human mobs (dead or alive) from meatspikes. Escaping - the meatspike will further damage the victim. - - rscdel: You can no longer slam humans into the meatspike as an attack. -2015-09-25: - Xhuis: - - rscadd: Changelings have a new ablity, Biodegrade. Costing 30 chemicals and having - an unlock cost of 1, it allows them to dissolve handcuffs and straight jackets - in 3 seconds, and escape from lockers in 7. - - tweak: Fleshmend's effectiveness is now halved each time it is used in a short - time span. - - tweak: Last Resort now blinds and confuses nearby humans and briefly disables - silicons upon use. - - tweak: Headslugs now have 50 health, up from 20. -2015-09-26: - MMMiracles: - - rscadd: Nanotrasen's genetic researchers have rediscovered the inactive dwarfism - genetic defect inside all bipedal humanoids. Suffer not the short to live. - WJohnston: - - tweak: Repiped the entire station. Atmosia and the disposals loop were not touched. - - tweak: Moved mulebot delivery from misc lab to RnD. -2015-09-28: - Feemjmeem: - - bugfix: Rechargers can now be wrenched and unwrenched by cyborgs. - - bugfix: Rechargers no longer stop working forever if you move them from an unpowered - area to a powered area, and now actually look powered off when they are. - - bugfix: Guns and batons can no longer be placed in unwrenched chargers. - Razharas: - - rscadd: Added button to preferences menu that kills all currently playing sounds - when pressed, now you can kill midis and any other sounds for real. - phil235: - - bugfix: Fixed the syndicate cyborg's grenade launcher. - - tweak: You can modify the dna of corpses again. -2015-09-29: - Kor: - - bugfix: The Chaos holoparasite can now actually set people on fire properly. - - tweak: Guardian powers are now used via alt+click rather than shift+click. - - tweak: Added an alert chime for ghosts when someone is summoning a Guardian. -2015-10-04: - Fox P McCloud: - - tweak: Adds a bar of soap to the janitor's locker. - - rscadd: Re-adds the advanced mop as a researchable R&D item. - - rscadd: Adds a bluespace trashbag as a researchable R&D item; can hold large quantities - of garbage. - Jordie0608: - - rscadd: Added Special Verb 'Create Poll', an in-game interface to create server - polls for admins with +permissions. - MrPerson: - - rscdel: Removed NTSL. Sorry. People could write scripts that crashed the server, - and this is the only thing that can be done to prevent them from doing that. - MrStonedOne: - - rscdel: Removed feature where quick consecutive ghost orbits while moving could - be used to fuck with your sprite - - bugfix: Fixed ghosts losing floating animation when returning from an orbit - - bugfix: Fixed logic error that prevented orbit's automatic cancel when the orbiting - thing moved in certain situations. - - rscadd: Ghost Orbit size now changes based on the icon size of the thing they - are orbiting (for that sweet sweet singulo orbiting action) - - tweak: Removed needless checks in ghost orbit, you can now orbit yourself and - restart an orbit around the thing you are already orbiting - Xhuis: - - rscadd: Syndicate Medical cyborgs now have cryptographic sequencers. - - rscdel: Syndicate Medical cyborgs no longer have syringes. - - tweak: Restorative Nanites now heal much more damage per type. - - bugfix: Operative pinpointers now actually point toward the nearest operative. - - bugfix: Syndicate Assault cyborgs no longer start with medical supplies. - - bugfix: Energy saws now have a proper icon. - - bugfix: Non-operatives can now longer use operative pinpointers or Syndicate cyborg - teleporters. - - tweak: Doctor's Delight now requires cryoxadone in its recipe instead of omnizine. - - tweak: Doctor's Delight now restores half a point of brute, burn, toxin, and oxygen - damage per tick. - - tweak: Doctor's Delight now drains nutrition while it's in your system (that is, - unless you're a doctor). - - bugfix: Syndicate roboticists have given Syndicate medical cyborgs sharper hypospray - needles - they are now able to penetrate armor. -2015-10-06: - Gun Hog, for WJohnston: - - rscadd: 'Add new Xenomorph caste: The Praetorian. Drones may become this on their - way to growing into a full queen, and a queen may promote one if there is not - one already.' - - tweak: Xenomorph queens are now GIGANTIC, along with the new Praetorian. Together, - they are considered royals. - - tweak: Queens are now significantly tougher to make up for their huge size. - - bugfix: All forms of dead xenomorph may now be grabbed and placed on a surgery - table for organ harvesting! - Xhuis: - - rscadd: Maintenance drones now have a more descriptive message when examined. - - tweak: A recent Nanotrasen firmware update to drones has increased vulnerability - to foreign influences. Please periodically check drones for abnormal behavior - or status LED malfunction. Note, however, that cryptographic sequencers will - not incur this behavior. - - tweak: In response to complaints about rogue drones, Nanotrasen engineers have - allowed factory resets on all drones by simply using a wrench. - - experiment: Central Command reminds drones to immediately retreat, if possible, - when a law override is begun. Not doing so may anger the gods and incur their - wrath! - - rscadd: Some virus symptoms that had no messages now have them. - - rscadd: 'New virology symptom: Weakness. This will cause stamina damage and fainting - spells.' - - tweak: Many virus symptom messages have been changed to be more threatening. -2015-10-07: - Kor: - - rscadd: The alien queen can now perform a tail sweep attack, throwing back and - stunning all nearby foes. -2015-10-13: - AnturK: - - rscadd: Display cases can now be built using 5 wood planks and 10 glass sheets. - - rscadd: Add airlock electronics to open it with id later, otherwise you'll have - to use crowbar - - tweak: Broken display cases can be fixed with glass sheets or removed using crowbar - - tweak: Added start_showpiece_type variable for mappers to create custom displays - - rscadd: Syndicate Lone Operatives spotted near the nanotrasen stations! Keep the - disk safe! - - tweak: Admin spawned nuclear operatives will now have access to nukeop equipment - Gun Hog: - - rscadd: Nanotrasen's research team has released a new, high tech design for Science - Goggles, which previously did nothing! They new come fitted with a portable - scanning module which will display the potential research data gained from experimenting - with an object. Nanotrasen has also released drivers which shall enable the - prototype hardsuit's built in scan visor. - - rscadd: Supporting this new design, Nanotrasen has seen fit to provide blueprints - for Science Goggles to the station's protolathe. - Kor: - - tweak: Gang implanters now only break implants/deconvert gangsters, meaning you - will have to use a pen to convert them afterwards. - - rscadd: An important function, accessible via alt+click, has been restored to - the detectives hat. - - sounddel: When Nar-Sie is created, they now use the old sound effect. - Steelpoint: - - rscadd: The Chief Medical Officers 'Medical Hardsuit' has been added to the CMO's - office. Boasts the usage of lightweight materials allowing fast movement while - wearing the suit as well as complete biological protection to airborne and similar - pathogens. - - rscadd: The Head of Security's personal 'HoS Hardsuit' has been added to the HoS's - office. This Hardsuit is slightly more armored than the regular Security Hardsuit. - - rscadd: The Research Directors 'Prototype Hardsuit' has been added to the RD's - office. This Hardsuit offers the highest levels of protection against explosive, - as well as biological, attacks, as well as fireproofing. - - rscdel: The Command EVA space suits, due to budget concerns, have been removed - and reloacted to another space station. - Xhuis: - - rscdel: All instances of autorifles have been removed from Security. - - rscadd: The armory has been re-mapped. - - tweak: The spell book has received a rebalancing! There are now ten uses by default, - but most spells cost two uses. Some underused spells, like Blind, Smoke, and - Forcewall, only cost a single use. - - experiment: After searching through the Sleeping Carp's ancient monastery in deep - space, more secrets have been uncovered of their traditional fighting techniques. - - tweak: Members of the Sleeping Carp gang are now able to deflect all ranged projectiles. - - tweak: Members of the Sleeping Carp gang are now uanble to use any type of ranged - weaponry. Doing so would be dishonorable. - - tweak: The Sleeping Carp martial art's effects are more damaging, and many stuns - have been increased in duration. - phil235: - - bugfix: Fixes critical bug causing multiple hits from single projectile. - - bugfix: Fixes not being able to shoot a mob on same tile as the shooter. - - bugfix: Clicking your mob (without targeting your mouth) no longer causes you - to shoot yourself. - - bugfix: Fixes not being able to shoot non human mobs at point blank. - - rscdel: Morphs no longer automatically drop the things they swallowed, you have - to butcher their corpse to retrieve their contents. - - bugfix: butchering a corpse no longer also attacks it. - - rscdel: Dipping cigarette (to asbsorb liquids) in a glass can now only be done - with an unlit cigarette. Lit cigarette now heats up the glass content (like - other heat sources). - - bugfix: Fixes trashbag not being able to pickup drinks and ammo casings. - - tweak: Slimes now attaches themselves to mobs via buckling. -2015-10-16: - MrStonedOne: - - rscadd: Added a reconnect option to the file menu. This will allow you to reconnect - to the game server without closing and re-opening the game window. This should - also prevent another byond ad from playing during reconnections. - Xhuis: - - rscadd: A gamebreaking bug has been fixed with buckets. You can now wear them - on your head. - bgobandit: - - rscadd: The Grape Growers Consortium has complained that Nanotrasen kitchens do - not use their products enough. HQ has come up with a few recipes to pacify them. - Goddamn winos. -2015-10-19: - AnturK: - - rscadd: Handheld T-Ray Scanners now detect critters in pipes. - Kor: - - tweak: Weapons and projectiles that are armour piercing now have an increased - chance to bypass riot shields. - - tweak: Slipping on lube now deals slightly more damage, but is concentrated on - a random body part, rather than spread to your entire body. - - tweak: Slipping on water no longer deals damage - - rscadd: You can now attach grenades and C4 to spears to create explosive lances. - This is done via table crafting. Alt+click the spear to set a war cry. - Shadowlight213: - - rscadd: In response to reports of stranded drones, Nanotrasen has added magnets - to drone legs. They are no longer affected by lack of gravity or spacewind! - - bugfix: Drones can now set Airlock access on RCDs. - bgobandit: - - rscadd: Nanotrasen loves recycling! In the highly unlikely occasion that your - space station accumulates gibs, scoop 'em up and bring them to chemistry to - recycle into soap, candles, or even delicious meat product! - - rscadd: L3 biohazard closets now contain bio-bag satchels for the safe collection - of biowaste products, such as slime extracts. - phil235: - - rscdel: Removing Smile, Swedish, Chav and Elvis mutations from genetics. These - mutation can still be acquired via adminspawned dna injector. - - rscadd: Added a dna injector for laser eyes mutation for admin use. - - bugfix: Fixes winter coat hood sprite appearing as a bucket. - - bugfix: Fixes using razor on non human shaving non existent hair. - - bugfix: Fixes chair deconstruction dropping too much metal. - - bugfix: Fixes snapcorn not giving seeds. - - bugfix: Fixes portable chem dispenser. - - tweak: Changing the transfer amount of all reagent containers (beaker, bucket, - glass) is now done by clicking them, similar to spray. Reagent dispensers (watertank, - fueltank, pepperspray dispenser) no longer have their own transfer amounts and - use the reagent container's transfer amount instead (except for sprays which - get 50u for faster refilling). -2015-10-23: - Incoming5643: - - rscadd: 'Syndicate bomb payloads will now detonate if set on fire long enough. - Note that the casings for the bombs is fireproof, so if you want to set fire - to a bombcore you''ll need to remove it from the case first (cut all wires, - then crowbar it out). A reassurance from our explosives department: it is, and - always has been, impossible to detonate a syndicate bomb that isn''t ticking - with wirecutters alone.' - Xhuis: - - rscadd: Geiger counters have been added and are obtainable from autolathes and - EngiVends. They will measure the severity of radiation pulses while in your - pockets, belt, or hands. One can scan a mob's radiation level by switching to - Help intent and clicking on it. These counters never really discard the radiation - they store, and rumor has it this can be used in nefarious ways... - - tweak: When a mob is impacted by radiation, the radiation is now relayed to all - items on the mob. -2015-10-24: - Kor: - - rscadd: The friendly gold slime reaction now spawns three mobs. - phil235: - - tweak: Changed the effects of alcohol to be more realistic. The effects of alcohol - now appear twice as fast. Drunkenness now scales with how much alcohol is in - you, not how long you've been drinking. This means drinking very little but - continuously no longer makes you very drunk, or confused/slurring for a long - time or give you alcohol poisoning. The dizziness and slurring effects now properly - scale with how drunk you are (and dizziness is generally more pronounced). -2015-10-25: - Incoming5643: - - rscadd: The spell Charge has been added to the spellbook. It can be used to extend - the life of magic and energy weapons and even reset the cooldowns of held wizards! - It cannot reset your own cooldowns. - - rscadd: The Staff of Healing has been added to the spellbook. Heals all damage - and raises the dead! Can't be used on yourself however. - - bugfix: The exploit that allowed you to use the staff of healing on yourself by - suicide has been fixed. - Jordie0608: - - rscadd: You can now selectively mute non-admin players from OOC with the Ignore - verb in the OOC tab. - Tkdrg: - - rscadd: Added chainsaws. They can be tablecrafted using a circular saw, a plasteel - sheet, some cable coil, and a welding tool. Don't forget to turn it on! -2015-10-26: - Fox P McCloud: - - tweak: Standardizes the slowdown of most spacesuits to 1 as opposed to 2. - Incoming5643: - - rscadd: 48x48 pixel mode (x1.5 zoom) has been added to the Icons menu (top left). - While playing in 32x32 or 64x64 will still provide a clearer looking station, - for those of us with resolutions that fall into the gap between the two zooms - this can provide a more consistant looking station than stretch to fit. - - rscadd: 96x96 pixel mode (x3 zoom) has also been added for our players who enjoy - looking at spacemen on their 4k monitors at a crisp and consistent scale. - - tweak: The lich spell has been subjected to some gentle nerfing. When you die - a string of energy will tie your new body to your old body for a short time, - aiding others in determining your location. The duration of this beam scales - with the number of deaths you've avoided. - - tweak: Additionally the post revival stun now also scales in this way. - - tweak: The spell will also fail if the item and the wizard don't share the same - z level, though the nature of space means the odds of the item (or the wizard) - looping around back to the station is pretty high. - - rscadd: The spell is still really good. -2015-10-27: - Joan: - - bugfix: You can now click on things under timestop effects, instead of clicking - the effect and looking like a fool. - Kor: - - rscadd: Added a zombie mob that turns its kills into more zombies. Currently adminspawn - and xenobio only. - - rscadd: Using water with a red slime extract will now yield a speed potion. Using - the speed potion on an item of clothing will paint it red and remove its slowdown. - MrStonedOne: - - rscadd: You may now access the setup character screen when not in the lobby via - the game preferences verb in the preferences tab - - rscadd: The round end restart delay can now be configured by server operators. - New servers will default to 90 seconds while old servers will default to the - old 25 seconds until they import the config option to their server. -2015-10-28: - Tkdrg: - - rscadd: Added a Ghost On-screen HUD. It can be toggled using the "Toggle Ghost - HUD" verb. Thank you Razharas for the sprites! - - rscadd: Ghosts can now use the "Toggle med/sec HUD" verb to see the basic secHUD - (jobs only) or the medHUD of humans. - - rscadd: Ghost will now get clickable icon alerts from events such as being put - in a cloner, drones being created, Nar-sie being summoned, among others. The - older chat messages were kept. These alerts can not be toggled. -2015-10-29: - Kor: - - tweak: Slightly changed what items spawn on the captain vs in his locker, hopefully - saving some annoying inventory shuffle at roundstart. -2015-10-30: - Incoming5643: - - rscadd: Slimepeople can now split if they contain 200 units of slime jelly, and - slimepeople will now slowly generate slime jelly up to 200 units provided they - are very well fed. Split slimepeople are NOT player controlled, but rather the - original slime person can swap between the two mobs at will. If one of the slimepeople - should die under player control, the player won't be able to swap back to their - living body. Splitting only creates a new body, any items you have on you are - not duplicated. - - rscadd: Slimepeople now take half damage from sources of heat, but double damage - from sources of cold. Lasers good, Space bad. -2015-11-01: - Gun Hog: - - rscadd: Nanotrasen listens! After numerous complaints and petitions from Security - personnel regarding energy weapon upkeep, we have authorized the construction - and maintenance of your station's weapon rechargers. As an added bonus, we have - also provided a more modular design for the devices, allowing for greater recharge - rates if fitted with a more efficient capacitor! - - rscadd: Added Diagnostic HUDs! They can be used to view the health and cell status - of borgs and mechs. Silicons have them built in, Roboticists get two in their - locker, and the RD's hardsuit has one built in. - Incoming5643: - - rscadd: The number of roundstart head revolutionaries nows depends on the roundstart - security force as well as the roundstart heads - - rscadd: The maximum number of head revs is 3, the minimum is 1. If there is fewer - than three station heads there will never be more than that number of head revs - at roundstart. For every three vacant security roles (Head of Security/Warden/Security - Officer/Detective) at roundstart the number of starting head revs will be reduced - by 1. - - rscadd: Head revolutionaries can be gained during play if the security/head roles - are filled. They are drawn from existing revolutionaries. - - rscadd: Added dental implant surgery. While targeting the mouth drill a hole in - a tooth then stick a pill in there for hands free later use. - Kor: - - rscadd: Added an experimental control console for Xenobiology. Ask the admins - if you'd like to try it out. It may not work on maps other than Box if they - have renamed the Xenobiology Lab. - - rscadd: Injecting blood into a cerulean slime will yield a special one use set - of blueprints that will allow you to expand the territory your camera can cover. - Kor and Remie: - - rscadd: Added as series of laser reflector structures, the frame of which can - be built with 5 metal sheets. - - rscadd: Completing the frame with 5 glass sheets creates a mirror that will reflect - lasers at a 90 degree angle. - - rscadd: Completing the frame with 10 reinforced glass sheets creates a double - sided mirror that reflects lasers at a 90 degree angle. - - rscadd: Completing the frame with a single diamond sheet creates a box that will - redirect all lasers that hit it from any angle in a single direction. - MMMiracles: - - tweak: Energy Swords can now embed when thrown for a 75% chance. Embedding -2015-11-05: - AnturK: - - rscadd: Added wild shapeshift spell for wizards. -2015-11-08: - Cuboos: - - soundadd: Added a new and better sounding flashbang sound and a ringing sound - for flashbang deaf effect - JJRcop: - - tweak: Chronosuits have had their movement revised, they now take time to teleport - depending on how far you've traveled, and don't teleport automatically anymore - unless you stop moving for a short moment, or press the new ' Teleport Now' - button. - - rscadd: Added new outfit that allows admins to dress people up in the chrono equipment - easier. - Jalleo: - - tweak: Due to a recently discovered report it turns out The Wizard Federation - has devised a way for CEOs to stop having some teas from their Smartfridges - due to this change all smartfridges will temporarily be unable to stack contents. - Joan: - - tweak: Revenant draining now takes about 5 seconds to complete and can be interrupted - by dragging the target away. - - tweak: Revenants can now tell if they are currently visible. - - tweak: Revenant ability costs tweaked; Defile now costs 40 essence to cast, Overload - Lights now costs 45 essence to cast, and Malfunction now costs 50 essence to - cast. - - tweak: Malfunction now affects non-machine objects, even if they're not being - held by a human. - - tweak: Defile does an extremely low amount of toxin damage to humans and confuses, - but does much less stamina damage and stuns the revenant for slightly longer. - - tweak: Overload Lights will no longer shock if the light is broken after a light - is chosen to shock an area. - Kor: - - rscadd: Using water on a dark blue slime extract will now yield a new potion capable - of completely fireproofing clothing items. - - rscadd: You can once again click+drag mobs into disposal units. Xenobiologists - rejoice. - Xhuis: - - tweak: Shadowling abilities now require the user to be human. - - tweak: Enthralling now takes 21 seconds (down from 30). - - tweak: Regenerate Chitin has been renamed to Rapid Re-Hatch. - - tweak: Dethralling surgery's final step now requires a flash, penlight, or flashlight. - - tweak: Dethralling surgery now produces a black tumor, which has a high biological - tech origin but dies quickly in the light. - - rscdel: Shadowlings no longer have Enthrall before hatching. - - rscadd: Shadowling clothing now has icons to better reflect its existence. - - rscdel: Ascendant Broadcast has been removed. - - rscdel: Destroy Engines is now removed from the user after it is used once. -2015-11-11: - AnturK: - - tweak: DNA Injectors now grant temporary powers on every use. Duration dependent - on activated powers and machine upgrades - - rscadd: 'Delayed Transfer added to DNA Scanner - It will activate on the next - closing of scanner door ' - - rscadd: 'UI+UE injectors/buffer transfers added for convinience ' - - tweak: Injector creation timeout cut in half - Firecage: - - rscadd: NanoTrasen specialists has developed a new type of operating table. You - can now make one yourself with only some rods and a sheet of silver! - Kor: - - rscadd: Adds immovable and indestructible reflector structures for badmin use. - - rscadd: The Mjolnir has been added to the wizards spellbook. - - rscadd: The Singularity Hammer has been added to the wizards spellbook. - - rscadd: The Supermatter Sword has been added to the wizards spellbook. - - rscadd: The Veil Render has been added to the wizards spellbook. - - rscadd: Trigger Multiverse War (give the entire crew multiswords) has been added - to the wizards spellbook, at a cost of 8 points. - - rscadd: Converting (to cultist, rev, or gangster) a jobbaned player will now automatically - offer control of their character to ghosts. - - rscadd: Emergency Response Teams and Deathsquads no longer accept non-human members - if the server is configured to bar mutants from being heads of staff. - LordPidey: - - rscadd: Nanotransen doctors have re-approved Saline-Glucose Solution for usage - in IV drips, when blood supplies are low. Simple pills will not suffice. - MMMiracles: - - tweak: Water slips have been nerfed to a more reasonable duration. It is still - a guaranteed way to disarm an opponent and obtain their weapon, but you can - no longer manage to cuff/choke everyone who manages to slip without a problem. - MrStonedOne: - - bugfix: Fixes the smartfridge not stacking items. - Xhuis: - - soundadd: The emergency shuttle now plays unique sounds (thanks to Cuboos for - creating them) when launching from the station and arriving at Central Command. - torger597: - - rscadd: Added a syringe to boxed poison kits. -2015-11-12: - Dunc: - - rscdel: DNA injectors have been restored to their original permanent RNG state - from the impermanent guaranteed state. - Xhuis: - - rscadd: Reagents can no longer be determined by examining a reagent container - without the proper apparatus. Silicons and ghosts can always see reagents. - - rscadd: Science goggles now allow reagents to be seen on examine. In addition, - chemists now start wearing them. The bartender has a pair that looks and functions - like sunglasses. -2015-11-13: - as334: - - rscadd: Nanotrasen has hired a brand new supply of ~~expendable labor~~ *LOYAL - CREW MEMBERS* please welcome them with open arms. - - rscadd: Plasmamen are now a playable race. They require plasma gas to survive - and will ignite in oxygen environments. -2015-11-15: - CosmicScientist: - - tweak: Hopefully made the dehydrated carp's uplink description 100% clear. - - tweak: Made the dehydrated carp cost 1 TC (instead of 3) to help with your traitor - gear combos. - Incoming5643: - - tweak: The supermatter sword was being far too kind in the hands of men. They - should now have the desired effect when swung at people. - Joan: - - tweak: Anomalies move more often, are resistant to explosions and will only be - destroyed if they are in devastation range. You shouldn't bomb them, though. - - tweak: Hyper-energetic flux anomaly will shock mobs that run into it, or if it - runs into them. - - tweak: Bluespace anomaly will occasionally teleport mobs away from it in a small - radius. - - tweak: Vortex anomalies will sometimes throw objects at nearby living mobs. - - tweak: Pyroclastic anomalies will produce bigger, hotter fires, and if not disabled, - it will release an additional burst of flame. In addition, the resulting slime - will be rabid and thus attack much more aggressively. - - bugfix: Gravitational anomalies will now properly throw objects at nearby living - things. - MrStonedOne: - - bugfix: Away mission loading will no longer improperly expand the width of the - game world to two times the size of the away mission map. - - tweak: This should also improve the speed of loading away missions, since the - game doesn't have to resize the world - RemieRichards: - - rscadd: Deities now start off with the ability to place 1 free turret - - tweak: HoG Claymores now do 30 Brute (Down from 40) but now have 15 Armour Penetration - (Up from 0) - - bugfix: Killing the other god objective is fixed - - tweak: Turrets will no longer attack handcuffed people - - rscadd: Followers are now informed of their god's death - - rscadd: Followers are now informed of the location of their god's nexus when it - is placed - - tweak: Gods can no longer place structures near the enemy god's nexus -2015-11-16: - Gun Hog: - - tweak: The Combat tech requirement for Loyalty Firing Pins has been reduced from - 6 to 5. - Joan: - - tweak: Plasmamen can now man the bar. - - tweak: Defile no longer directly affects mobs. Instead, it rips up floors and - opens most machines and lockers. - - rscadd: Blight added. Blight infects humans with a virus that does a set amount - of damage over time and is relatively easily cured. Blight also badly affects - nonhuman mobs and other living things. - - experiment: While the cure to Blight is simple, it's not in this changelog. Use - a medical analyzer to find the cure. - - tweak: Tweaked costs and stuntimes of abilities; - - tweak: Defile now costs 30 essence and stuns for about a second. - - tweak: Overload Lights now costs 40 essence. - - tweak: Malfunction now costs 45 essence. - - rscadd: Blight costs 50 essence and 200 essence to unlock. - - imageadd: Transmit has a new, spookier icon. - - bugfix: Revenant abilities can be given to non-revenants, and will work as normal - spells instead of runtiming. - bgobandit: - - rscadd: Blood packs can now be labeled with a pen. -2015-11-17: - Xhuis: - - tweak: Many medicines have received rebalancing. Expect underused chemicals like - Oxandralone to be much more effective in restoring damage. - - tweak: Many toxins are now more or less efficient. - - tweak: The descriptions of many reagents have been made more accurate. - - rscadd: 'New poison: Heparin. Made from Formaldehyde, Sodium, Chlorine, and Lithium. - Functions as an anticoagulant, inducing uncontrollable bleeding and small amounts - of bruising.' - - rscadd: 'New poison: Teslium. Made from Plasma, Silver, and Black Powder, heated - to 400K. Modifies examine text and induces periodic shocks in the victim as - well as making all shocks against them more damaging.' - - rscadd: Two Chemistry books have been placed in the lab. When used, they will - link to the wiki page for chemistry in the same vein as other wiki books. -2015-11-18: - oranges: - - tweak: Nanotrasen apologies for a recent bad batch of synthflesh that was shipped - to the station, any rumours of death or serious injury are false and should - be reported to your nearest political officer. At most, only light burns would - result. - phil235: - - bugfix: Remotely detonating a planted c4 with a signaler now works again. -2015-11-19: - Joan: - - rscadd: Constructs have action buttons for their spells. - - imageadd: The Juggernaut forcewall now has a new, more cult-appropriate sprite. - - imageadd: Cult floors and walls now have a glow effect when being created. - - bugfix: Nar-Sie and Artificers will properly produce cult flooring. - - spellcheck: Nar-Sie is a she. -2015-11-20: - AnturK: - - tweak: Staff of Doors now creates random types of doors. - Incoming5643: - - bugfix: Setting your species to something other than human (if available) once - again saves properly. Note that if you join a round where your species setting - is no longer valid it will be reset to human. - PKPenguin321: - - tweak: Healing Fountains in Hand of God now give cultists a better and more culty - healing chemical instead of Doctor's Delight. - kingofkosmos: - - rscadd: Added the ability to upgrade your grab by clicking the grabbed mob repeatedly. - octareenroon91: - - rscadd: Add the four-color pen, which writes in black, red, green, and blue. - - rscadd: Adds two such pens to the Bureaucracy supply pack. -2015-11-21: - Joan: - - rscadd: Blobs now have a hud, with jump to node, create storage blob, create resource - blob, create node blob, create factory blob, readapt chemical, relocate core, - and jump to core buttons. - - tweak: Manual blob expansion is now triggered by clicking anything next to a blob - tile, instead of by ctrl-click. - - tweak: 'Rally Spores no longer has a cost. Reminder: You can middle-click anything - you can see to rally spores to it.' - - tweak: Creating a Shield Blob with hotkeys is now ctrl-click instead of alt-click. - - rscadd: Removing a blob now refunds some points based on the blob type, usually - around 40% of initial cost. Hotkey for removal is alt-click. - - rscadd: Blobs now have the *Blob Help* verb which will pull up useful information, - including what your reagent does. - - tweak: Storage Blobs now cost 20, from 40. Storage Blobs also cannot be removed - by blob removal. - - tweak: Readapt Chemical now costs 40, from 50. - octareenroon91: - - rscadd: Add numbers and a star graffiti to crayon/spraycan designs. -2015-11-23: - octareenroon91: - - rscadd: Spilling oxygen or nitrogen will obtain a release of the corresponding - atmospheric gas in the effected tile. - - rscadd: 'Carbon Dioxide has been added as a reagent. Recipe: 2:1 carbon:oxygen, - heated to 777K.' - - rscadd: Spilling CO2 will produce CO2 gas. -2015-11-24: - Kor: - - rscadd: Added a lava turf. Expect to see it in away missions or in admin 'events' -2015-11-25: - Incoming5643: - - experiment: A number of popular stunning spells have undergone balance changes. - Note that for the most part the stuns themselves are untouched. - - experiment: 'Lightning Bolt Changes:' - - rscdel: You can no longer throw the bolt whenever you want, it will fire itself - once it's done charging. - - rscadd: Getting hit by a bolt will do a flat 30 burn now, as opposed to scaling - with how long the wizard spent charging the spell. Unless said wizard made a - habit of charging lightning bolt to near maximum every time this is a buff to - damage. - - rscdel: Every time the bolt jumps the next shock will do five less burn damage. - - rscadd: Lightning bolts can still jump back to the same body, so the maximum number - of bolts you can be hit by in a single casting is three, and the maximum amount - of damage you could take for that is 60 burn. - - experiment: 'Magic Missile Changes:' - - rscdel: Cooldown raised to 20 seconds, up from 15 - - rscadd: Cooldown reduction from taking the spell multiple times raised from 1.5 - seconds to 3.5 seconds. Rank 5 magic missile now has a cooldown of 6 seconds, - down from 9, and is effectively a permastun. - - experiment: 'Time Stop Changes:' - - rscadd: Time Stop field now persists for 10 seconds, up from 9 - - rscdel: Cooldown raised to 50 seconds, up from 40 - - rscadd: Cooldown reduction from taking the spell multiple times raised from 7.75 - seconds to 10 seconds. Rank 5 time stop now has a cooldown of 10 seconds, up - from 9, and is effectively a permastun. - Kor: - - rscadd: Escape pods can now be launched to the asteroid during red and delta level - security alerts. Pods launched in this manner will not travel to Centcomm at - the end of the round. - - rscadd: Each pod is now equipped with a safe that contains two emergency space - suits and mining pickaxes. This safe will only open during red or delta level - security alerts. - MrStonedOne: - - bugfix: fixes interfaces (like the "ready" button) being unresponsive for the - first minute or two after connecting. - - tweak: Burn related code has been changed - - tweak: This will give a small buff to fires by making them burn for longer - - tweak: This will give a massive nerf to plasma related bombs - - tweak: I am actively seeking feedback, if the nerf to bombs is too bad we can - still tweak stuff - PKPenguin321: - - rscadd: Chainsaws (both arm-mounted and not arm-mounted) can now be used in surgeries - as a ghetto sawing tool. Arm-mounted chainsaws are a teeny bit more precise - than regular ol' everyday chainsaws. - YotaXP: - - tweak: Spruced up the preview icons on the Character Setup dialog. - incoming5643: - - rscdel: Citing shenanigan quality concerns the wizard federation has withdrawn - supermatter swords and veil renderers from spellbooks. - neersighted: - - bugfix: Make Airlock Electronics use standard ID checks, allowing Drones to use - them. -2015-11-26: - neersighted: - - tweak: Cyborg Toner is now refilled by recharging stations. - oranges: - - tweak: Removed the 'gloves' from the sailor dress which looked weird since it - was a blouse basically - - tweak: Made the skirt on the blue/red skirts less blocky, - - tweak: Made the striped dress consistent at every direction -2015-11-27: - AnturK: - - rscadd: Turret control panels can now be made through frames available at autolathe. - - rscadd: Unlocked turrets can be linked with built controls with multiool - JJRcop: - - bugfix: Restores golem shock immunity. - Kor and Ausops: - - rscadd: Added four different suits of medieval plate armour. - - rscadd: The Chaplain starts with a suit of Templar armour in his locker. God wills - it! - - rscadd: Rumour has it that Nanotrasen is now training a new elite unit of soldiers - to deal with paranormal threats. Corporate was unable to be reached for comment. - MMMiracles: - - rscadd: Adds a brand new away mission for the gateway called 'Caves'. - - rscadd: The away mission has multiple levels to explore and could be quite dangerous, - running in without proper preparation is unadvised. - YotaXP: - - bugfix: Drones can now use the pick-up verb, and watertanks no longer get jammed - in their internal storage. - bgobandit: - - rscadd: Due to changes in Nanotrasen's mining supply chain, ore redemption machines - now offer a variety of upgraded items! However, certain items are more expensive. - Point values for minerals have been adjusted to reflect their scarcity. - - rscadd: Nanotrasen R&D has discovered how to improve upon the resonator and kinetic - accelerator. - - rscadd: After a colossal tectonic event on Nanotrasen's asteroid, ores are distributed - more randomly. - - rscadd: Bluespace crystals have been discovered to be ore. They will now fit into - satchels and ore boxes. - - rscadd: Mech advanced mining scanners now include meson functionality. - neersighted: - - bugfix: Wooden Barricades now take bullet damage. - - tweak: Rebalance Wooden Barricade damage. -2015-11-28: - TechnoAlchemisto: - - tweak: Cloaks are now worn in your exosuit slot! -2015-11-29: - Firecage: - - rscadd: Hand tools now have variable operating speeds. - GunHog: - - tweak: Nanotrasen has improved the interface for the hand-held teleportation device. - It will now provide the user with the name of the destination tracking beacon. - JJRcop: - - bugfix: Fixes changeling Hive Absorb DNA ability runtime. - Joan: - - imageadd: When sacrificing a target with the sacrifice rune, Nar-Sie herself will - briefly appear to consume them. - - imageadd: When an artificer repairs a construct, there is a visible beam between - it and the target. - - imageadd: When reviving a target with the raise dead rune, there is a visible - beam between the two corpses used. - - imageadd: When draining a target with the blood drain rune, there is a visible - beam between you and the rune. - - imageadd: Construct sprites are now consistent and all bob in the air. - - rscadd: Most cult messages now use the cult span classes, though visible messages - from cult things generally do not. - - bugfix: Examining a cultist talisman as a cultist no longer causes the paper popup - to appear. - - bugfix: You no longer need to press two buttons to read a cultist tome. - - spellcheck: Cult should have a few less typos and grammatical errors. - - spellcheck: The sacrifice rune now uses the proper invocation. - KorPhaeron: - - rscadd: Guardians and holoparasites can now be manually recalled by their master. - - rscadd: The ghost controlling a guardian or holoparasite can be repicked by their - master, only one use which is removed when a new ghost is chosen. - MrStonedOne: - - rscadd: Re-adds 100% chance timed injectors, as it was removed over a misunderstanding. - - bugfix: Fixes bug with injectors having a 100% power chance despite not being - timed - - bugfix: Fixes the excessive amount of time it took the game to initialize. - - bugfix: Fixes some interface bugs. - - rscadd: when an interface window has to send a lot of resources before it can - open, it will now tell you with a "sending resources" line so you know why it's - not opening right away. - PKPenguin321: - - rscadd: Teleprods can now be constructed. Make them via tablecrafting, or by putting - a bluespace crystal onto a stunprod. They warp the target to a random nearby - area (which may include space/the inside of a wall) in addition to giving the - victim a brief stun. Like stunprods, they require a power cell to function. - - rscadd: Teleprods can have their crystal removed and be made back into stunprods - by using them in your hand when they have no cell installed. - - imageadd: Mounted chainsaws now have a unique inhand sprite. - Remie + Kor: - - tweak: Holopads now use AltClick to request the AI - Shadowlight213: - - tweak: Syndie melee mobs have been buffed. - TheNightingale: - - rscadd: Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that - has better armor and fireproofing. - - tweak: Added throwing stars and Syndicate playing cards to nuclear operative's - uplink. - Yolopanther12: - - rscadd: Added the ability to use a box of lights on a light replacer to more quickly - refill it to capacity. - incoming5643: - - rscadd: OOC will now take steps to try and prevent accidental IC from people who - mistakenly use OOC instead of say. This doesn't catch all mistakes, so please - don't test it. - ktccd: - - bugfix: Blob pieces on some areas no longer count for blob mode victory (Such - as space or asteroid). - - bugfix: Blobcode no longer spawns and destroys blobs uselessly, which fixes other - stuff too. - - bugfix: Asteroid areas are no longer valid gang territory. - neersighted: - - experiment: Nanotrasen would like to announce NanoUI 2.0, now being rolled out - across all our stations. Existing NanoUI devices have been updated, and more - will be added soon. Please report any bugs to Nanotrasen Support. - - tweak: Many NanoUI interfaces have had +/- buttons replaced with input fields. - - tweak: Some NanoUI interfaces have had more information added. - - bugfix: Drones can now interact with NanoUI windows. - swankcookie: - - bugfix: Fixes issue of space-Christians forgetting about the true, humbling values - of space-Christmas. - - rscadd: Adds snowmen outfits -2015-11-30: - neersighted: - - bugfix: Nanotrasen would like to apologize for Chemistry being stuck on NanoUI - 1.0... Please report any further bugs to Nanotrasen Support. - - tweak: NanoUI becomes... difficult to operate with brain damage. Who would have - guessed? - - tweak: Telekinesis enables you to use NanoUI at a distance. - - bugfix: Canisters require physical proximity to actuate... - - bugfix: NanoUI no longer leaks memory on click. -2015-12-01: - Kor: - - rscadd: The away mission Listening Post, originally mapped by Petethegoat, has - removed as a mission. It is now present in normal deep space. - neersighted: - - tweak: Attack animations are now directional! - - rscadd: Nanotrasen brand Airlock Electronics now sport our latest NanoUI interface! - Upgrade your electronics today! - - bugfix: Cryo now knocks you out. - - bugfix: Resisting out of cryo has a delay. - - rscadd: Cryo auto-ejection can now be configured. - - rscdel: Remove Cryo eject verb (resist out). - - bugfix: Cryo works... Love, neersighted - swankcookie: - - tweak: Switches cloak usage to overclothing slot -2015-12-02: - GunHog: - - bugfix: Nanotrasen has discovered a flaw in the weapon recharging station's design - that makes it incompatible with the Rapid Part Exchange Device. This has been - corrected. - neersighted: - - tweak: You can now stop pulling by trying to pull the same object again. - - rscadd: Nanotrasen is proud to announce that even the dead can use our state of - the art NanoUI technology. -2015-12-03: - Joan: - - rscadd: Artificers now have feedback when healing other constructs, showing how - much health the target has. - - tweak: Constructs can move in space. - - imageadd: Fixes cult flooring not lining up with normal floors. - - imageadd: Fixes a juggernaut back spine not glowing where it should. - Spudboy: - - tweak: Realigned the librarian's PDA. - Swankcookie: - - bugfix: Cakehat now creates light - YotaXP: - - rscadd: Rolled out a new line of space heaters around the station. This new model - has the functionality to cool down the environment, as well as heat it. Additionally, - they can be built and upgraded like any other machine. - neersighted: - - bugfix: Dominator now shows the correct area name on non-Box maps. - - bugfix: Unwrenching atmos pipes is less... nuts... - - bugfix: You don't get hopelessly spun when standing on a unwrenched pipe... Don't - try it, though. - - tweak: You can now cancel pulling by Ctrl+Clicking anything else - - tweak: Chemistry Dispensers now have a built-in drain! -2015-12-05: - Joan: - - rscdel: Magic missiles no longer do damage. -2015-12-06: - Gun Hog: - - rscadd: Nanotrasen is proud to announce that it has improved its Diagnostic HUD - firmware to include the station's automated robot population! New features include - integrity tracking, Off/On status, and mode tracking! If your little robot friend - suddenly manages to acquire free will, you will be able to track that as well! - - tweak: Artificial Intelligence units may find that their bot management interface - now shows when a robot gains free will. This is also displayed on the Personal - Data Assistant's bot control interface. - neersighted: - - bugfix: Cryo now properly checks it is on before healing... -2015-12-07: - octareenroon91: - - rscadd: Wallets now use the access of all IDs stored inside them. - - rscadd: As the accesses of all IDs are merged, two IDs in a wallet may grant access - to a door that neither one alone would open. - - bugfix: Wallets used to be useless for access if the first ID card put into it - was taken out, until another ID card was put back in. That should not happen - anymore. -2015-12-08: - Joan: - - experiment: Revenants can no longer move through walls and windows while revealed, - though they can move through tables, plastic flaps, mobs, and other similarly - thin objects. - - tweak: Defile now reveals for 4 seconds, from 8. - - tweak: Overload lights now reveals for 10 seconds, from 8. - - tweak: Blight now reveals for 6 seconds, from 8. - - rscadd: Blight has a higher chance of applying stamina damage to the infected. - Kor: - - rscadd: The blocking system has been completely overhauled. Any held item, exosuit, - or jumpsuit can now have a chance to block, or a custom on hit effect. Different - shields can now have different block chances. - - rscadd: The clowns jumpsuit now honks when you beat the owner. - - rscadd: There is a new (admin only for now) suit of reactive armour that ignites - attackers instead of warping you. - - rscadd: Shields will no longer block hugs. Give peace a chance. - neersighted: - - tweak: MC tab reworked, more items made available. - - rscadd: Admins can now click entries in the MC tab to debug. -2015-12-09: - GunHog: - - tweak: Nanotrasen has discovered new strains of Xenomorph which resist penetration - by known injection devices, including syringes. This seems to only extend to - the large 'Royal' strains, designed 'Queen' and 'Praetorian'. Extreme caution - is advised should these specimens escape containment. - - rscadd: Ghosts may now use Diagnostic HUD. - - tweak: Feedback added for which HUD is active. - Kor: - - rscadd: Security barricades now block gunfire 80% of the time while deployed. - - rscadd: Standing adjacent to barricades will allow you to shoot over them. - MrStonedOne: - - rscadd: noslip floors make you slightly faster - Shadowlight213: - - rscadd: Admins can now interact with mos of the station's machinery as if they - were an AI when ghosting. - incoming5643: - - rscadd: a mutation of glowshrooms, glowcaps, have recently been discovered in - botany. - ktccd: - - bugfix: Blobs now require the correct amount of blobs to win that scales depending - on number of blobs, instead of a set value of 700. -2015-12-12: - Joan: - - tweak: The blob Split Consciousness ability now requires a node under the overmind's - selector, instead of picking the oldest living node to spawn a core on. - - bugfix: Revenant antagonist preference can once again be toggled from the Game - Preferences menu. - Kor: - - rscadd: You now have a chance to flip while attacking with a dualsaber. - - rscadd: Bluespace survival capsules have been added to escape pod safes. - - rscadd: Standing between activating shield generators now has disastrous consequences. - Lo6a4evskiy: - - bugfix: Ninja drains power properly, no more infinite stealth. - RemieRichards: - - rscadd: Adds a Synth Species - - rscadd: Species can now react to being force set by admins, used for Synth species -2015-12-13: - Kor: - - rscadd: Adds reactive stealth armor. Admin spawn only. -2015-12-15: - Incoming5643: - - rscadd: The summon events... event "RPG loot" now allows for items to have bonuses - of up to +15! - - rscadd: The "RPG loot" event now also improves the damage reduction of armor! - - rscadd: Check out the item mall for new item fortification scrolls! - as334: - - rscadd: New research has shown that when when plasma reaches a high enough temperature - in the presence of a carbon catalyst, it undergoes a violent and powerful fusion - reaction. - - rscadd: Adds a new gas reaction, fusion. Heat up plasma and carbon dioxide in - order to produce large amounts of energy and heat. - oranges: - - tweak: hulk no longer stuns - - tweak: John Cena -2015-12-16: - AnturK: - - rscadd: Medical Beam Gun now available for Nuclear Operatives and ERT Medics. - Joan: - - tweak: Revenant Overload Lights reveal time lowered from 10 seconds to 8 seconds, - shock damage increased from 18 to 20. - - tweak: Revenant Blight reveal time lowered from 6 seconds to 5 seconds. - Kor: - - rscadd: Styptic once again works in patches. - - rscadd: Nuke Op team leaders can now activate challenge mode if more than 50 players - are online. - - rscadd: Xenobio mobs will no longer spontaneously murder their friends if you - give them sentience - The-Albinobigfoot: - - bugfix: The Wishgranter now displays its faith in humans with curbed enthusiasm. - Tkdrg: - - experiment: Cult has been overhauled in an attempt to make the gamemode more fun. - - rscdel: Cult onversion and stunpapers have been removed. So have most cult objectives. - - tweak: The cult's single objective is now defend and feed a large construct shell - in order to summon the Geometer. - - tweak: The cult must sacrifice souls in order to acquire summoning orbs, which - must be inserted inside said shell. - - tweak: The large construct shell can be procured by using a summoning orb in hand, - but it is vulnerable to attack. - - tweak: Once enough orbs are inserted, the station will go Delta. After three minutes, - the cult will have won. - - rscadd: Cult communications now no longer damage you when done without a tome. - - rscadd: Cultists now start with a sacrificial dagger, with bleeding effects and - high throwing damage. - - rscadd: Most existing runes were buffed, merged, or removed. A Immolate rune and - a Time Stop rune were added. Experiment! - - experiment: Each cultist now gets a random set of runes in their tomes. Pool together - your knowledge in order to thrive. - neersighted: - - experiment: NanoUI 3.0 - - experiment: Completely rewrite NanoUI frontend; rework backend. - - tweak: Re-design NanoUI interface to be much more attractive. - - tweak: Reduce NanoUI LOC count/resource size. - - tweak: Reduce NanoUI tickrate; make UIs update properly. - - rscadd: Add chromeless NanoUI mode. - - rscadd: NanoUI's chromeless mode can be toggled with the 'Fancy NanoUI' preference. - - bugfix: Allow NanoUI to work on IE8-IE11, and Edge. - - bugfix: Close holes that allow NanoUI href spoofing. -2015-12-17: - Kor: - - rscadd: Security barricades are now deployed via grenade. You can no longer move - them after they've been deployed, you must destroy them. - - rscadd: You can now shoot through wooden barricades while adjacent, while any - other gunfire has a 50% chance of being blocked. - - rscadd: There are no longer restrictions against implanting the nuclear disk in - people. - - rscadd: If the station is destroyed in a nuclear blast, any surviving traitors - will complete their "escape alive" objective regardless of their location. - - rscadd: Hulks now lose hulk when going into crit, rather than at 25 health. - - rscadd: Shuttles will no longer drag random tiles of space with them. This means - you can be thrown out of partially destroyed escape shuttles very easily. - - rscadd: The people and objects on destroyed tiles won't be along for the ride - when the shuttle moves either. - - rscadd: Adds hardsuits with built in energy shielding. CTF and security versions - are admin only. - - rscadd: Nuclear operatives can buy a shielded hardsuit for 30tc. - - rscadd: Traitors can now buy a Mulligan for 4 telecrystals, a syringe that completely - randomizes your name and appearance. - - rscadd: The spy bundle now includes a switchblade and Mulligan. - MMMiracles: - - rscadd: A set of coordinates have recently reappeared on the Nanotrasen gateway - project. Ask your local central official about participation. - MrStonedOne: - - tweak: 'Ghosts can now double click on ANY movable thing (ie: not a turf) to orbit - it' - PKPenguin321: - - rscadd: Dope golden necklaces have been added. They're a jumpsuit attachment like - ties and are completely cosmetic. - - rscadd: Dope necklaces can be bought from the clothesmate with a coin. Three are - in the clothesmate by default, so you can get your posse going. Gangs that aren't - Sleeping Carp can also purchase necklaces for 1 influence each. Dope. - xxalpha: - - tweak: Restores the ability to bolt and unbolt operating airlocks. -2015-12-18: - Incoming5643: - - rscadd: Soon to be blobs in blob mode can now burst at their choosing. However - they will still burst if they wait too long. - - rscadd: Burst responsibly. - Joan: - - rscadd: 'New blob chemicals:' - - rscadd: Pressurized Slime, which is grey, does low brute, oxygen, and stamina - damage, but releases water when damaged or destroyed. - - rscadd: Energized Fibers, which is light yellow, does low burn damage, high stamina - damage, and heals if hit with stamina damage. - - rscadd: Hallucinogenic Nectar, which is pink, does low toxin damage, causes vivid - hallucinations, and does some bonus toxin damage over time. - - tweak: Replaces Kinetic Gelatin with Reactive Gelatin, which does less brute damage, - but if hit with brute damage in melee, damages all nearby objects. - - wip: 'Changes three of the old blob chemicals:' - - tweak: Ripping Tendrils does slightly more stamina damage - - tweak: Envenomed Filaments no longer causes hallucinations, but does some stamina - damage in addition to toxin damage over time. - - tweak: Cryogenic Liquid will freeze targets more effectively. - Kor: - - rscadd: Shooting someone who is holding a grenade has a chance to set the grenade - off. - - rscadd: Shooting someone who is holding a flamethrower has a chance to rupture - the fuel tank. - - tweak: Shields have a bonus against blocking thrown projectiles. - Swankcookie: - - rscadd: lanterns no longer turn into flashlights when you pick them up. - bgobandit: - - rscadd: Lizard tails can now be severed by surgeons with a circular saw and cautery, - and attached the same way augmented limbs are. - - rscadd: The Animal Rights Consortium is horrified by Nanotrasen stations' sudden - rise of illegal lizard tail trade, with such atrocities as lizardskin hats, - lizard whips, lizard clubs and even lizard kebab! - neersighted: - - tweak: NanoUI should now load much faster, as the filesize and file count have - been reduced -2015-12-20: - Joan: - - tweak: Reduces Lexorin Jelly's oxygen damage significantly. - - experiment: Blobbernaut chemical application on attack is back, but much less - absurd this time; blobbernauts with an overmind will do 70% of the normal chem - damage(plus 4) and attack at a much slower rate than the blob itself can. - - wip: As an example, a blobbernaut with the Ripping Tendrils chemical would do - 14.5 brute and 10.5 stamina damage per hit. - Kor: - - rscadd: Adds reactive tesla armour. Adminspawn only. - - rscadd: Adds the legendary spear, Grey Tide. Admin only. - - rscadd: Nuke Ops can now purchase penetrator rounds for their sniper rifles. - - rscadd: Nuke ops can now purchase additional team members for 25 telecrystals. - They don't come with any gear other than a pistol however, so remember to save - some points for them. - - rscadd: Nuke Ops now have an assault pod. A 30tc targeting device will allow you - to select any area on the station as its landing zone. The pod is one way, so - don't forget your nuke. - - rscdel: The teleporter board is no longer available for purchase in the uplink. - - rscdel: After finding absolutely nothing of value, Nanotrasen away teams placed - charges and scuttled the abandoned space hotel. - - rscadd: Metastation now has xenobiology computers. - - rscadd: Metastation now has escape pod computers. - - rscadd: A distress signal has been detected broadcasting in an asteroid field - near Space Station 13. - - rscadd: Clicking the (F) follow link for AI speech will now make you orbit their - camera eye. - MMMiracles: - - tweak: The SAW has been revamped slightly. It now requires a free hand to fire, - but includes 4 new ammo variants along with a TC cost decrease for both the - gun and the ammo boxes. - MrStonedOne: - - bugfix: Fixes ghost orbit breaking ghost floating - - bugfix: Fixes orbiting ever breaking golem spawning - - bugfix: 'Fixes orbiting ever preventing that ghost from showing up in pictures - taken by ghost cameras resdel: Fixes being able to break your ghost sprite by - multiple quick consecutive orbits (FINAL SOLUTION, PROVE ME WRONG YOU CAN''T)' - Remie: - - rscadd: 'Byond members can now choose how their ghost orbits things, their choices - are: Circle, Triangle, Square, Pentagon and Hexagon!' - - tweak: orbit() should be much cheaper for clients now, allowing those of you with - potato PCs to survive mega ghost swirling better. - incoming5643: - - bugfix: the terror of double tailed lizards and featureless clones should now - be over - - rscdel: the emote *stopwag no longer works, just *wag again to stop instead -2015-12-21: - AnturK: - - tweak: Ghost HUD and Ghost Inquisitiveness toggles are now persistent between - rounds. - Kor: - - rscadd: Malfunctioning AIs have been merged with traitor AIs. They no longer appear - in their own mode. - - rscadd: Hacking APCs now gives you points to spend on your modules. Save up enough - points and you can buy a doomsday device on a 450 second timer. - - rscadd: The detectives revolver reskins on alt click now. - - rscadd: You can now dual wield guns. Firing a gun will automatically fire the - gun held in your off hand if you are on harm intent. - LanCartwright: - - tweak: The TC costs for nuke ops have been rebalanced. Guns, viscerators and mechs - are cheaper, ammo and borgs are more expensive. - - rscadd: Most guns can now be bought in bundles, together with some ammo and freebies - for a special discount. - The-Albinobigfoot: - - rscadd: Nuclear Operative families may once again requisition ultra-adhesive footwear. -2015-12-22: - Iamgoofball: - - rscadd: Tesla engine has been added alongside the singularity engine to all maps. - Joan: - - wip: 'Adds three new blob chemicals:' - - rscadd: Replicating Foam, which is brown, does brute damage, has bonus expansion, - and has a chance to expand when damaged. - - rscadd: Sporing Pods, which is light orange, does low toxin damage, and has a - chance to produce weak spores when expanding or killed. - - rscadd: Synchronous Mesh, which is teal, does brute damage and bonus damage for - each blob tile near the target, and splits damage taken between nearby blobs. - - experiment: Synchronous Mesh blobs take 25% more damage, to compensate for the - spread damage. - Kor: - - rscadd: Cayenne will no longer be targeted by the syndicate turrets. - - tweak: Energy shields now only reflect energy projectiles. - - rscadd: Added accelerator sniper rounds to uplink, a weak projectile that ramps - up damage the farther it flies. - MMMiracles: - - bugfix: Saber magazines have been dropped to 21 per magazine. When asked, Nanotrasens - official ballistic department replied "There is indeed such a thing as too much - bullet." - Xhuis: - - tweak: Stun batons can now be blocked by shields, blocked hits don't deduct charge. - xxalpha: - - rscadd: Janitor cyborgs now have a bottle of drying agent. -2015-12-25: - Joan: - - rscdel: The blob Split Consciousness ability has been removed. - - tweak: The blob mode now spawns more roundstart blobs, instead. - Kor: - - rscadd: AI holograms no longer drift in zero gravity - LanCartwright: - - tweak: Shotguns shells now have one extra pellet. - MrStonedOne: - - bugfix: Screen shakes will no longer allow you to see through walls - - tweak: Screen shakes will now move with you when moving rather than lag your client - behind your mob - - tweak: Screen shakes are now less laggy in higher tickrates -2015-12-26: - Buggy123: - - tweak: Salicyclic Acid now rapidly heals severe bruising and slowly heals minor - ones. - Iamgoofball: - - tweak: Telsa energy ball now shoots only a single, powerful beam of lightning - that can arc between mobs. - - soundadd: Energy ball can now be heard when near-by. - Incoming5643: - - tweak: Animated objects now revert if they have no one to attack for a while. - - rscadd: Added Golden revolver, a powerful sounding gun with large recoil. - Kor: - - rscadd: Transform Sting is now actually functional. - MrStonedOne: - - tweak: Movement in no gravity now allows you to push off of things only dense - to some mobs if it is dense to you (such as tables/blob tiles) rather than just - objects that are only dense to all mobs. - - bugfix: Long/timed actions will now cancel properly if you move and quickly move - back to the right location. -2015-12-27: - Joan: - - rscadd: Overmind-created blobbernauts are now player-controlled if possible. - - tweak: Creating a blobbernaut no longer destroys the factory, instead doing heavy - damage to it and preventing it from spawning spores for one minute. - - tweak: You cannot spawn blobbernauts from overly damaged factories. - - rscadd: Procedure 5-6 may be issued for biohazard containment under certain situations. - - tweak: Blobs will now burst slightly later on average, and the nuke report with - the nuke code will arrive slightly earlier. - Kor: - - soundadd: Spacemen now announce when they are changing magazines. - - rscadd: Command headsets now have a toggle to let you have larger radio speech. - LanCartwright: - - rscdel: The Syndicate Ship no longer spawns with Bulldog shotguns, operative have - been given 10 extra telecrystals instead. - MrStonedOne: - - bugfix: Flashes that were emp'ed were incorrectly flashing people in range of - the emper, not in range of the flash. - - tweak: Flashes in a mob's inventory that are emp'ed will only aoe stun if it is - not inside of a container like a backpack/box -2015-12-28: - AnturK: - - rscadd: You can now write an entire word with crayons by setting it as a buffer - and then clicking the target tiles in the right order. - Joan: - - rscdel: Blobbernauts can no longer smash walls of any type. - MrStonedOne: - - tweak: Progress bars now have 20 states instead of 5. - - bugfix: Bump mining should be fixed. - - tweak: Long actions now checks for movement/changed hands/etc more often to prevent - edge cases. - - tweak: Multiple progress bars will now stack properly, rather than fight each - other for focus. - Ressler: - - rscadd: Adds the reagent Haloperidol. - - rscadd: It is an anti-drug reagent, good for stopping assistants hyped up on meth, - bath salts, and equally illegal drugs. - - rscadd: It can be made with Chlorine, Fluorine, Aluminum, Potassium Iodide, and - Oil. - neersighted: - - bugfix: Make NanoUIs transfer upon (un)ghosting. - - bugfix: Fix NanoUIs jumping when resized/dragged. - - bugfix: Lots of other NanoUI bugs. -2015-12-31: - Bawhoppen: - - rscadd: Nanotrasen has opened the availability of tactical SWAT gear to station's - cargo department - - rscadd: Due to a new trade agreement with Chinese space suit manufacturers, Nanotrasen - can now obtain basic space suits much cheaper; This has been reflected in the - cargo prices - - rscadd: Amateur medieval enthusiasts have found a quick way to easily make wooden - bucklers. - Joan: - - imageadd: Replaced every book sprite in the game with new, consistent versions. - - imageadd: Except the one-use wizard spellbooks, which already got new sprites. - PKPenguin321: - - rscadd: Chest implants have been added that allow you to morph your arms into - a gun and back at will. There are two variants, a taser version and a laser - version. Both versions are self-charging. Getting EMPed with one of these implants - results in the implant breaking and loads of fire damage. The implants are currently - admin-only. - - tweak: The telecrystal price for thermal imaging goggles has been lowered from - 6 to 4. - incoming5643: - - rscadd: The wizard federation has finally updated their assortment of guns for - the summon guns event. Look forward to getting shot in the face with a whole - new batch of interesting and rarely seen weaponry! -2016-01-01: - Iamgoofball: - - experiment: Redid how objectives are assigned, they're now a lot more random in - terms of what you can get. - Incoming5643: - - tweak: Removed gender restrictions from socks. - Joan: - - rscdel: Storage Blobs are gone; they were effectively a waste of resources, as - there are more or less no points at which you should need them, unless you were - winning excessively hard. - - rscdel: Blobs can no longer burst early; instead, the button gives some early - help and serves to indicate you're a blob. - - wip: Blobbernauts now poll candidates instead of grabbing a candidate immediately. - The poll is 5 seconds, so that there's no significant pause between making a - blobbernaut and it doing stuff. - - rscadd: Blobbernaut creation replaces Storage Blob creation on the blob HUD. - - tweak: Overmind communication is now much larger and easier to see, and blob mobs, - such as blobbernauts, will hear it. - Kor: - - rscadd: The wizard has a new spell, Lesser Summon Guns. This summons an unending - stream of single shot bolt action rifles into his hands, automatically replacing - themselves as you fire. - - bugfix: Fixes successive generations of grey tide clones not despawning. - - tweak: Using challenge ops now delays shuttle refuel. - - rscadd: Added a new wizard event, Advanced Darkness. - MrStonedOne: - - experiment: GHOST POPUP RE-WORK - - bugfix: Ghost popups will no longer steal focus - - bugfix: Ghost popups will no longer submit on key press (regardless of focus) - unless you tab to a button first - - tweak: Ghost popups will close themselves after the time out has ended - - rscadd: Ghost popups are now themed. - - tweak: Long actions (like resisting out of handcuffs) will no longer count space/nograv - drifting as the user moving. - - tweak: This does not apply to the target of a long action if that target isn't - you. Pulling something while space drifting and working on it intentionally - won't work. -2016-01-02: - Kor: - - rscadd: Guardians/Parasites are now named after constellations, and have new sprites - from Ausops. - Kor and GunHog: - - rscadd: Malfunctioning AIs can now purchase Enhanced Surveillance for 30 points, - which allows them to "hear" with their camera eye. - MMMiracles: - - rscadd: A distress signal was recently discovered with gateway coordinates attached - to a far-off research facility owned by Nanotrasen. The signal was sent out - in hopes of someone competent receiving it, unfortunately, your station was - the only one to respond. Local security forces may not be welcoming your arrival - group with open arms. -2016-01-07: - KorPhaeron: - - tweak: Doubled cost of Lesser Summon Guns to 4 and increased charge time to 75 - seconds. - TrustyGun: - - rscadd: 'Added two new UI styles: black and green Operative and pale green Slimecore.' -2016-01-09: - Wjohnston: - - wip: AI Satellite has been remapped to make it more secure. -2016-01-11: - Joan: - - rscdel: Blob cores and nodes no longer cause normal pulsed blobs to animate. Factories - and resource nodes will still animate. - - imageadd: Holoparasite sprites have been updated again, are now named after silvery - metals and flowers and can also be colored purple, blue or yellow. - xxalpha: - - tweak: Pipes and cables under walls, intact floors, grilles and reinforced windows - will now be shielded from explosions until exposed. -2016-01-13: - Joan: - - imageadd: Alien whisper ability has a new icon - MrStonedOne: - - tweak: Control clicking on the thing you are pulling will no longer unpull, instead - control clicking on anything too far away to be pulled will unpull. (reminder - that the delete key also unpulls) - OneArmedYeti: - - imageadd: To help with colorblindness, gang HUDs have been changed so leaders - have a border and normal gangster icons are smaller. -2016-01-15: - Joan: - - bugfix: Holoparasites can no longer beat their owner to death while inside of - them. - - spellcheck: Updates traitor holoparasite descriptions for accuracy. - - spellcheck: Adds 8 additional silvery metals to the holoparasite name pool. - - imageadd: Adds two new holoparasite colors, light purple and red. - - imageadd: Holoparasite HUD buttons now have new sprites. - - imageadd: Adds glow effects when guardians teleport or recall, including fire - guardian teleporting and support guardian teleporting. - Kor: - - rscadd: Washing machines are activated via alt+click rather than a right click - verb. -2016-01-16: - Joan: - - imageadd: Alien queens and praetorians have suitably large speechbubbles. - - imageadd: Syndicate cyborgs and syndrones have suitably evil robotic speechbubbles. - - imageadd: Blob mobs have suitably uncomfortable-looking speechbubbles. - - imageadd: Holoparasites and guardians have suitably robotic and magical speechbubbles. - - imageadd: Swarmers have suitably holographic speechbubbles. - - imageadd: Slimes have suitably slimy speechbubbles. -2016-01-17: - Joan: - - bugfix: You can once again repair a hacked APC by using an APC frame on it instead - of welding it off the wall, at the same stage as you'd weld it off the wall. - MrStonedOne: - - bugfix: Control clicking on a turf now un-pulls -2016-01-19: - neersighted: - - rscadd: Many many interfaces have been ported to tgui; uplinks and MULEbots being - the most important - - rscadd: You can now tune radios by entering a frequency - - bugfix: Air Alarms now support any gas -2016-01-23: - neersighted: - - experiment: Refactor wires; port wire interface to tgui. - - rscadd: Wire colors are now fully randomized. - - rscdel: Remove pizza bombs, as the code and sprites were terrible. - - rscadd: Add pizza bomb cores, which can be combined with a pizza box to make a - pizza bomb. - octareenroon91: - - bugfix: Chemistry machinery should now all equally accept beakers, drinking glasses, - etc. -2016-01-27: - Joan: - - tweak: Golems have about a 40% chance to stun with punches, from about 60%. - - tweak: Millitary Synths have about a 50% chance to stun with punches, from literally - 100%. - - wip: Blobbernaut creation costs 30 points, and does much more damage to the factory. - - rscdel: Blob factories regenerate at half normal rate. - - tweak: Blob reagents tweaked; - - rscadd: Ripping Tendrils does slightly more brute damage, but less stamina damage. - - rscdel: Lexorin Jelly does less brute damage. - - rscadd: Energized Fibers does slightly more burn damage. - - rscadd: Sporing Pods does slightly more toxin damage. - - rscadd: Replicating Foam will try to replicate when hit more often. - - rscadd: Hallucinogenic Nectar does slightly more toxin damage and causes hallucinations - for longer. - - rscadd: Cryogenic Liquid does more burn damage. - - experiment: Synchronous Mesh does slightly less damage with one blob but massive - damage with more than one nearby blob. - - rscdel: Dark Matter does less brute damage. - - rscdel: Sorium does slightly less brute damage. - - rscdel: Pressurized Slime has a lower chance to emit water when killed and when - attacking targets. - - tweak: Supermatter explosion is no longer capped, and under normal conditions - will produce a 8/16/24 explosion when delaminating. - - imageadd: Blob tiles now do an attack animation when failing to expand into a - turf. - - imageadd: Overmind-directed expansion is more visible than automatic expansion. - Kor: - - rscadd: Capture the flag has been added in space near central command. The spawners - are disabled by default, so be sure to harass admins when you die until they - let you play. The arena was mapped by Ausops. - - rscadd: Nuke ops can purchase mosin nagants for 2 telecrystals. - MrStonedOne: - - bugfix: Fixes the powersink drawing less power than the smeses put out. - - tweak: Made the powersink hold significantly more power before overloading and - going boom. - - tweak: Buffed the explosion of the power sink when it overloads. You are suggested - to think twice about wiring the engine to the grid. - PKPenguin321: - - rscadd: The Autoimplanter, a device that can insert cyberimplants into humans - instantly and without the need of surgery, has been added to the game. It is - currently only obtainable by nuke ops, by way of being included in the Box of - Implants. -2016-01-28: - Joan: - - rscadd: Blobs can communicate before bursting to allow for more coordination. - Kor: - - rscadd: Butchering mobs by attacking them with sharp objects will only happen - on harm intent. This means it is possible to do surgery on aliens again. -2016-01-29: - Joan: - - rscadd: Holoparasites can now see their summoner's health at all times. The health - displayed is a percentage, with 0 being dead. - - imageadd: Holoparasites now have visual flashes on the summoner's location when - recalled due to range limits and when manifesting. - Kor: - - rscadd: Red xenobio potions now work on vehicles (janitor cart, ATV, secway, etc), - causing them to go faster. - - rscadd: Stuffing people in bins uses clickdrag instead of grab. -2016-01-30: - Boredone: - - tweak: Due to an experiment gone wrong, the Research Director's Teleport Armor - now causes some mild radiation poisoning on teleportation to the wearer. - Francinum: - - rscadd: Added two new female underwear styles. - Kor: - - rscadd: You can now use the abandoned white ship as an escape route at round end. - This is possible on Box, Meta, and Dream. - - rscadd: Added support so that mappers can make any shuttle function as an escape - shuttle. - MMMiracles: - - rscadd: Three new bra sets have been added for the ladies out there who want to - show their patriotism. - xxalpha: - - rscadd: Blueprints will now allow the expansion of an existing area by giving - its name to a new adjacent area. - - rscadd: Added a no power warning cyborg verb to Robot Commands. -2016-01-31: - Kor: - - rscadd: Added a special AI upgrade disk that allows normal AIs to use malf modules - and hack APCs. It is admin only. - - rscadd: Added an AI upgrade disk that grants AIs the lipreading power. It is admin - only. -2016-02-01: - Erwgd: - - rscadd: The Kitchen Vending machine now stocks salt shakers and pepper mills! - - rscadd: The NutriMax now stocks spades, cultivators and plant analyzers. - - rscadd: Rice seeds are now stocked in the MegaSeed Servitor, and the seeds supply - crate now contains a pack of rice seeds. - - rscdel: Botanists should be aware that wheat stalks can no longer mutate into - rice. - Fayrik: - - rscadd: pAI cards can now be inserted into simple robots, to allow for more robust - robot personalities. - PKPenguin321: - - rscadd: You can now store knives, pens, switchblades, and energy daggers in certain - types of shoes (such as jackboots, workboots, winter boots, combat boots, or - no-slips). - - rscadd: Horns can now be stored in clown shoes. Honk. - TrustyGun: - - rscadd: Adds gag handcuffs to the prize pool for arcade machines. They act like - regular handcuffs, but you break out of them in a second. - WJohnston: - - rscadd: Adds missing booze & soda dispenser, library console, fixes door access - and a few other minor things to Efficiency Station - - rscadd: Also adds direction tags so people can find their way around better. - bgobandit: - - rscadd: On Valentine's Day, all spacemen will receive candy hearts and valentines - for their special someones! Label valentines with a pen. - - rscadd: Note that today is not Valentine's Day. -2016-02-05: - Joan: - - experiment: Blob expansion is faster near the expanding blob, but slower further - away from it. - - tweak: Blob spores produce a slightly larger smoke cloud when dying. Sporing Pods - spores and blob zombies produce the current small cloud. - - rscdel: Blobbernauts can no longer pull anything at all. - - tweak: Blobbernauts health reduced to 200, but blobbernauts now take half brute - damage. - - tweak: Blobbernauts now take massive damage from fire. - - tweak: Blobbernauts do approximately 3 more damage when attacking. - - wip: Replicating Foam will expand more actively when damaged. - - rscadd: Adds Electromagnetic Web, which is light blue, does burn damage and EMPs - targets, and causes a small EMP when dying. - - rscadd: Electromagnetic Web takes more damage; a normal blob that hasn't been - near a node or the core for 6~ seconds can be oneshotted by a laser. - - rscadd: Anomalies, such as pyroclastic and vortex anomalies, now appear at the - bottom of the ghost orbit and observe menus. - Kor: - - rscadd: Nuke ops can purchase sentience potions for 4tc - MMMiracles: - - tweak: Bulldog now starts with stun-slugs instead of its usual 60-brute slugs. - Slugs now cost 3 TC instead of 2. - - tweak: Most SAW ammo has been slightly buffed in damage so maybe it'll be worth - buying now along with a slight cost decrease for the gun itself. - - tweak: Incen shells for the shotgun now apply extra firestacks on hit so it actually - sets people on fire instead of turning them into a light show. - - tweak: Incen rounds for the SAW now leave a fire trail similar to the bulldog's - dragonsbreath round. - - rscadd: Nuke Ops now have the ability to purchase breaching shells, a weaker variant - of the meteorslugs that can still push back people/airlocks/mechs/corgis. - - bugfix: SAW should now use its in-hand sprites for an open-closed magazine - PKPenguin321: - - rscadd: You can now sharpen carrots into shivs by using a knife or hatchet on - them. - bgobandit: - - rscadd: Seven new emoji have been added to hasten the death of the English language. - octareenroon91: - - rscadd: Player-controlled medibots can examine a patient to know what chems are - in the patient's body. - - bugfix: autolathes have been showing extra copies of the hacked designs, but no - more. -2016-02-06: - LordPidey: - - rscadd: Added suicide command for pipe valves. It's quite messy. - Lzimann: - - tweak: Combat Mechas now have a increased chance of destroying a wall with punches - (40% for walls and 20% for reinforced walls)! - - rscadd: Combat mechas can now destroy tables and racks with a punch! - neersighted: - - rscadd: The Syndicate has stolen the latest tgui improvements from Nanotrasen! - All uplinks now feature filtering/search. - - rscadd: Nanotrasen is proud to announce its next generation sleepers, featuring - tgui! - - rscadd: Portable atmospheric components have been overhauled to use the latest - interface technology. - - rscdel: The Area Atmosphere Computer has been removed. - - rscadd: Huge scrubbers now require power. - - rscdel: Borg jetpacks are now refilled from a recharger and not a canister. - - rscadd: Power monitors now have a state of the art graph. Hopefully they're actually - useful to someone. - - rscadd: Cargo consoles have been redesigned and now feature search and a shopping - cart! -2016-02-08: - Incoming5643: - - rscadd: Poly will now speak a line or emote when pet. - - rscadd: Poly now responds to getting fed crackers by becoming more annoying for - the round. - - experiment: Every day he is growing stronger - Kor: - - rscadd: A certain hygiene obsessed alien is now obtainable via xenobiology gold - cores. - - rscadd: Add laserguns with swappable, rechargeable magazines. They are adminspawn - only. - - rscadd: Operatives now get their pinpointers in their pocket when they spawn, - meaning reinforcements automatically come with them (and hopefully people stop - forgetting them in general). - - rscadd: Capture the flag now features a high speed instagib mode, with guns courtesy - of MMMiracles. - phil235: - - tweak: The vision updates for mobs are now instantaneous (e.g. you don't have - to wait one second to see again when removing your welding helmet) - - tweak: Your vision is now affected when you're inside something or viewing through - a camera. You can no longer see mobs or objects when ventcrawling (unless you - have xray for example), an xray user viewing through a camera do not see through - walls around the camera. On the other hand, cameras with an xray upgrade let - you see through walls. Unfocused camera now give you the same effect as when - you are nearsighted. Being inside closets, morgue container and disposal bins - give you some vision impairments. - - rscadd: The ability to toggle your hud on and off (with f12) is now available - to all mobs not just humans. -2016-02-09: - AnturK: - - rscadd: Syndicate Operatives can now buy bags full of plastic explosives for 9 - TC. - Gun Hog: - - rscadd: '"Nanotrasen has drafted a design for an exosuit version of the medical - nanite projector normally issued to its Emergency Response Personnel. With sufficient - research, a prototype may be fabricated for field testing!"' - incoming5643: - - rscadd: The wizard spell wild shapeshift has been made less terrible. - neersighted: - - rscadd: Internals tanks now provide an action button - - rscadd: Jetpacks now emit the gas consumed for propulsion onto their turf - - rscdel: Jetpacks no longer have object verbs - - rscdel: tgui no longer has internals buttons - - bugfix: Malf AI's flood ability now correctly sets vent pressure bounds -- the - results are devastating... Try it! -2016-02-10: - Joan: - - rscadd: Blob mobs now heal for 2.5% of their maxhealth when blob_act()ed, basically - whenever they're on blobs near a node or the core. - - tweak: Blob expansion no longer has a chance to fail inversely proportional with - the expanding blob's health. Blobs still, however, expand at roughly the same - rate as they do currently. - - experiment: Adds five new blob chemicals. - - rscadd: Adds Penetrating Spines, which is sea green and does brute damage through - armor. The damage can still be reduced by bio protection. - - rscadd: Adds Explosive Lattice, which is dark orange and does brute damage to - all mobs near the target. Explosive Lattice is very resistant to explosions. - - rscadd: Adds Cyclonic Grid, which is a light blueish green and does oxygen damage, - in addition to randomly throwing or pulling nearby objects. - - rscadd: Adds Zombifying Feelers, which is a fleshy zombie color and does toxin - damage, in addition to killing and reviving unconscious humans as blob zombies. - - rscadd: Adds Regenerative Materia, which is light pink and does toxin damage, - in addition to making the attacked mob think it is at full health. - - wip: Tweaks some of the existing blob chemicals slightly. - - rscadd: Sporing Pods can produce spores when killed by damage less than 21, from - less than 20. This means lasers can produce spores. - - rscadd: Reactive Gelatin has a slightly higher maximum damage and will attack - the nearby area when hit with brute damage projectiles, from just when attacked - by brute damage in melee. - - tweak: Sorium, Dark Matter, and the new Cyclonic Grid will not throw mobs with - the 'blob' faction, such as blobbernauts and spores. - Kor: - - rscadd: The chaplain can now transform the null rod into a holy weapon of his - choice by using it in hand. Each one has different strengths and drawbacks. - MrStonedOne: - - tweak: Tesla balance changes - - tweak: Tesla will now require increasingly more energy to trigger new orbiting - balls. First ball comes with 32 energy (down from 300), fourth requires 256 - (down from 1200), and so on and on, doubling with each new ball. Balls after - 7 are increasingly harder to get than before, whereas balls before 6 are easier - to get. - - rscadd: MULTIBOLT IS BACK! - - tweak: Be warned that in multibolt all but 1 primary bolt now have a random shocking - range, meaning they may still target a close human over a far away grounding - rod as the rod may be out of range. - - tweak: Power output of tesla massively dropped, it should no longer put out almost - twice the power of a stage 3 singulo with maxed collectors without any balls, - you'll need at least 3 balls for that now. - - tweak: Tesla can now lose power, causing ball count to drop. Tesla will never - shrink out of existence, just lose its balls. - - tweak: Tesla is now more likely to head in the direction of the thing it last - zapped. - PKPenguin321: - - rscadd: Chameleon Jumpsuits now have slight melee, bullet, and laser protection. - - tweak: The armor values for security helmets, caps, and berets have all been brought - in line. Consequently, helmets and berets are a teeny bit better, and caps now - have the slight bomb protection that the other two had. - - experiment: The time needed to complete most tablecrafting recipes has been cut - in half to make tablecrafting less annoying to use. - Shadowlight213: - - rscadd: pAI controlled mulebots can now run people over. - - tweak: Mulebot health has been greatly decreased. - neersighted: - - rscadd: Horizontal (lying) mobs now fit into crates - - rscadd: Mobs may now be stuffed into crates, as with lockers - - rscadd: Stuffing into a locker deals a mild stun (the same as tabling) - octareenroon91: - - rscadd: New designs can now be added to Autolathes via a design disk. Simply use - a disk containing a suitable design on your autolathe. -2016-02-11: - neersighted: - - rscdel: Remove all cyborg jetpacks... They were awful... - - rscadd: Adds borg ion thrusters, which are available as an upgrade module for - any borg. - - rscdel: Jetpack stabilizers are always on, but now we have... - - rscadd: Jetpack turbo mode, to move at sanic speed in space. -2016-02-12: - Kor: - - rscadd: Malf AIs can now get the objective to have a robot army by the end of - the round. - - rscadd: Malf AIs can now get the objective to ensure only human crew (no mutants) - are on the shuttle at round end. - - rscadd: Malf AIs can now get the objective to prevent a crewmember from escaping - the station, while requiring that crewmember still be alive. - neersighted: - - rscadd: Cybernetic implants purchased from the uplink now include a free autoimplanter! - octareenroon91: - - rscdel: You can no longer kill yourself with the SORD - - rscadd: Suicide attempts with the SORD will inflict 200 stamina damage. You will - only die of shame. - - bugfix: Cleanup to suicide verb code. -2016-02-13: - Buggy123: - - rscadd: You can now build cable coils using the autolathe. - Fox McCloud: - - bugfix: Fixes the sleeping carp martial arts grab not being an instant aggressive - grab - KazeEspada: - - rscadd: 'New backpack options available! New options include: Department Bags, - Leather Satchels, and Dufflebags!' - Kor: - - rscadd: Chainsaw sword, force weapon, and war hammer have all been added as Chaplain - weapon options. - Malkevin: - - tweak: Tracking implants have been upgraded. The old clunky manually adjusted - number system has been replaced with an automated ID scanner, this will show - the implant carrier's name on both the Prisoner Management Console and the hand - tracker. Happy deep striking! - PKPenguin321: - - tweak: 'Traitor EMP kits have had their cost reduced from 5 to 2, and no longer - contain the EMP flashlight. rcsadd: EMP flashlights can now be bought separately - for 2 TCs.' - Zerrien: - - rscadd: Conveyor pieces can be placed as corner pieces when building in non-cardinal - directions. - - rscadd: Using a wrench on a conveyor rotates it while in place. - neersighted: - - tweak: Gibtonite can now be pulled. - - tweak: Slowdown factors are ignored when in zero gravity. - phil235: - - rscadd: Brains can no longer be blinded. - - bugfix: Fixes brain being immortal. They are immune to everything but melee weapon - attacks. Brains not inside a MMI can now be attacked just like MMIs. Damaged - brain can't be put into a robot, they can still be put inside a brainless humanoid - corpse and cloned, but deffibing the corpse always fails (can't revive someone - with a brain beaten to a pulp). -2016-02-14: - Joan: - - rscadd: Blobbernauts can now speak to overminds and other blobbernauts with :b - - rscadd: Blobs can now expand onto lattices and catwalks. - - rscdel: Blob expansion on space tiles with no supports is much slower. - - tweak: Blob Sorium and Dark Matter now have less range on targets with bio protection. - - tweak: Blob Sorium does slightly less damage. -2016-02-17: - Fox McCloud: - - tweak: Laser eyes mutation no longer drains nutrition - Joan: - - rscdel: The sleeping carp gang no longer has special equipment and an inability - to use pneumatic cannons. - PKPenguin321: - - tweak: The traitor surgery bag now costs 3 TC, down from 4. - Zerrien: - - rscadd: adds unique icons for the two medical patch types -2016-02-18: - Kor: - - rscadd: 'Four more chaplain weapon options have been added: hanzo steel, light - energy sword, dark energy sword, and monk''s staff.' -2016-02-19: - AnturK: - - rscadd: Chairs and stools can now be picked up and used as weapons by dragging - them over your character. - PKPenguin321: - - rscadd: The cleanbot uprising has begun. - - rscadd: Emagged cleanbots are much scarier now. Standing on top of one will yield - very devastating results, namely in the form of powerful flesh-eating acid. -2016-02-20: - CPTANT: - - tweak: Due to new crystals Nanotrasen lasers weapons may now set you on FIRE. - Joan: - - imageadd: Blobbernauts and blob spores now have a visual healing effect when being - healed by the blob. - xxalpha: - - rscadd: 'New event: Portal Storm.' - - rscadd: Kinetic accelerators now reload automatically. -2016-02-24: - CPTANT: - - tweak: stamina regeneration is now 50% faster. - Joan: - - rscadd: Revenants now have an essence display on their HUD - - rscadd: Revenants retain the essence cap from the previous revenant when reforming, - minus any perfect souls. - - rscadd: Revenants can now toggle their night vision. - - tweak: Revenant Defile has one tile more of range, but does less damage to windows. - - tweak: Revenant Blight kills space vines and glowshrooms slightly more rapidly. - - tweak: Delays before appearing when harvesting are slightly randomized. - - tweak: Revenant fluff objectives have been changed to be slightly more interesting. - RemieRichards: - - rscadd: Cursed heart item for wizards, allows them to heal themselves in exchange - for having to MANUALLY beat their heart every 6 seconds. Heals 25 brute/burn/oxy - damage per correctly timed pump. - Steelpoint: - - tweak: Syndicate engineers have reinforced the exterior of their stealth attack - ships. Nuclear Operative ship hull walls are now, once again, indestructible. - - tweak: In addition Syndicate engineers had the opportunity to revamp the interior - of stealth attack ships. The inside of Op ships now has a slightly new layout, - including a expanded medbay, as well as additional medical and explosive equipment. - - rscadd: Thanks to covert Syndicate operatives, strike teams can now bring the - stealth attack ship within very close proximity to the station codenamed 'Boxstation'. - A new ship destination labeled 'south maintenance airlock' is now available - to Op strike teams. - phil235: - - rscadd: Holo tape is replaced by holo barriers. - - rscadd: The action button of gas tanks and jetpacks now turn green when you turn - your internals on. -2016-02-26: - Iamgoofball: - - rscadd: Adds the Chameleon Kit to uplinks for 4 telecrystals containing a Chameleon - Jumpsuit/Exosuit/Gloves/Shoes/Glasses/Hat/Mask/Backpack/Radio/Stamp/Gun/PDA. - - rscadd: The chameleon gun fires no-damage lasers regardless of what it looks like. - - rscadd: The Voice Changer has been merged into the Chameleon Mask. - - rscadd: No-slip shoes have been combined into Chameleon Shoes. - - rscdel: Space Ninjas no longer have voice changing capabilities. - - rscdel: The Chameleon Jumpsuit has been replaced by the Chameleon Kit in the uplink - for the same price. - - tweak: All chameleon clothing items have lost EMP vulnerability. - - tweak: Chameleon equipment provides very minor armor. - - experimental: Agent ID Cards can now use chameleon technology to look like any - other ID card. - - bugfix: The Chameleon Kit is actually purchasable now. It doesn't give a single - chameleon jumpsuit anymore. - PKPenguin321: - - rscadd: The kitchen vendor now contains two sharpening blocks. - - rscadd: Only items that are already sharp (such as fire axes, knives, etc) can - be sharpened. Items used on sharpening blocks become sharper and deadlier. The - sharpening blocks themselves can only be used once, and you can only sharpen - items once. - - tweak: The EMP kit has been buffed. It now contains five EMP grenades, up from - two. - - tweak: The EMP implant found in the EMP kit has been buffed. It now has three - uses, up from two. -2016-03-02: - CoreOverload: - - rscadd: A new "breathing tube" mouth implant. It allows you to use internals without - a mask and protects you from being choked. It doesn't protect you from the grab - itself. - - tweak: Arm cannon implants are now actually implanted into the arms, not into - the chest. - - bugfix: Arm cannons have an action button again. - - tweak: Heart removal is no longer instakill. It puts you in condition similar - to heart attack instead. You can fix it by installing a new heart and applying - defibrillator if it wasn't beating. - - rscadd: You can now make a stopped heart beat again by squeezing it. It will stop - beating very soon, so you better be quick if you want to install it without - using defibrillator. - - rscadd: There is now a chance to recover some of the internal organs when butchering - aliens or monkeys. - - rscadd: A new organ - lungs. When removed, it will give you breathing and speaking - troubles. - - rscadd: Human burgers are, once again, named after the generous meat donors that - made them possible. - Fox McCloud: - - rscadd: Gibbing mobs will now throw their internal organs - Gun Hog: - - rscadd: Ghost security HUDs now show arrest status and implants. - - tweak: The Alien queen, upon her death, will now severely weaken the remaining - alien forces. - Joan: - - tweak: Replicating Foam has a lower chance to expand when hit. - - tweak: Penetrating Spines is now purple instead of sea green. - - imageadd: Blobbernauts now have a brief animation when produced. - - experiment: Adds five new blob chemicals. This is a total of 25 blob chemicals. - Will it ever stop? - - rscadd: Draining Spikes, which is reddish pink and does medium brute damage, and - drains blood from targets. - - rscadd: Shifting Fragments, which is tan and does medium brute damage, and shifts - position when attacked. - - rscadd: Flammable Goo, which is reddish orange and does low burn and toxin damage, - and when hit with burn damage, emits a burst of flame. It takes more damage - from burn, though. - - rscadd: Poisonous Strands, which is lavender and does burn, fire, and toxin damage - over a few seconds, instead of instantly. - - rscadd: Adaptive Nexuses, which is dark blue and does medium brute damage, and - reaps 5-10 resources from unconscious humans, killing them in the process. - - wip: Confused about what the chemical you're fighting does? Look at https://tgstation13.org/wiki/Blob#Blob_Chemicals - - rscadd: Adds 'Support and Mechanized Exosuits' and 'Space Suits and Hardsuits' - categories to the syndicate uplink. - - rscadd: Nuke op reinforcements and mechs have been moved to the first category. - Syndicate space suits and hardsuits have been moved to the second category. - - bugfix: Traitors can now properly buy the blood-red hardsuit for 8 TC. - - tweak: Nuke ops can no longer buy the blood-red hardsuit, as the elite hardsuit - costs the same amount while being absolutely better. - Kor: - - rscadd: Added door control remotes. Clicking on doors while holding them will - let you open/bolt/toggle emergency access depending on the mode. They will not - work on doors that have their IDscan disabled (rogue AIs take note!) - - rscadd: The Captain, RD, CE, HoS, CMO, and QM all now have door control remotes - in their lockers. - LanCartwright: - - rscadd: Adds Uranium to Virus reaction. Will create a random symptom between 5 - and 6 when mixed with blood. - - rscadd: Adds Virus rations, which creates a level 1 symptom when mixed with blood. - - rscadd: Adds Mutagenic agar, which creates a level 3 symptom. - - rscadd: Adds Sucrose agar which creates a level 4 symptom. - - rscadd: Adds Weak virus plasma, which creates a level 5 symptom. - - rscadd: Adds Virus plasma, which creates a level 6 symptom. - - rscadd: Adds Virus food and Mutagen reaction, creating Mutagenic agar. - - rscadd: Adds Virus food and Synaptizine reaction, creating Virus rations. - - rscadd: Adds Virus food and Plasma reaction, creating Virus plasma. - - rscadd: Adds Synaptizine and Virus plasma reaction, creating weakened virus plasma. - - rscadd: Adds Sugar and Mutagenic agar reaction, creating sucrose agar. - - rscadd: Adds Saline glucose solution and Mutagenic agar reaction, creating sucrose - agar. - - rscadd: Adds Viral self-adaptation symptom, which boosts stealth and resistance, - but lowers stage speed. - - rscadd: Adds Viral evolutionary acceleration, which bosts stage speed and transmittability, - but lowers stealth and resistance. - - rscadd: Flypeople now vomit when they eat nutriment. - - rscadd: Flypeople can now suck the vomit off the floor to gain it's nutritional - content. - - rscadd: Flypeople now must suck puke chunks and vomit to fill themselves of food - content. - Malkevin: - - tweak: Sec officers have two sets of cuffs again (one on spawn, one in locker) - - tweak: Done some optimisation of sec spawn equipment lists and lockers to remove - some of the repetitive clicking, sec belts are now preloaded with equipment. - - tweak: HoS has a full baton instead of the collapsible one - - tweak: Detective has a classic police baton and pepper spray instead of the collapsible - baton (someone made police batons shit, so don't get overly happy) - - bugfix: pop scaled additional lockers spawned were the wrong type, changed them - to the right type which has batons now (actually belts now that I've changed - them). - MrStonedOne: - - tweak: Suit sensors will now favor higher levels for starting amount with the - exception of the max level, that remains unchanged. - - tweak: 'Old odds: 25% off 25% binary lifesigns 25% full lifesigns 25% coordinates' - - tweak: 'New odds: 12.5% off 25% binary lifesigns 37.5% full lifesigns 25% coordinates' - PKPenguin321: - - rscadd: Bolas are now in the game. They're a simple device fashioned from a cable - and two weights on the end, designed to entangle enemies by wrapping around - their legs upon being thrown at them. The victim can remove them rather quickly, - however. - - rscadd: Bolas can be crafted by applying 6 metal sheets to cablecuffs. They can - also be tablecrafted. - Sestren413: - - rscadd: Botanists have access to a new banana mutation now, bluespace bananas. - These will teleport anyone unfortunate enough to slip on their peel. - Shadowlight213: - - rscadd: A wave of dark energy has been detected in the area. Corgi births may - be affected. - Shadowlight213 and Robustin: - - rscadd: '"Old Cult is back baby!"' - - tweak: '"Cult survival objective disabled"' - - tweak: '"Imbuing talismans now consumes the imbue rune"' - - tweak: '"Invoking the stun talisman now hurts the cultist more"' - - tweak: '"The stun talisman duration is nerfed by 10%, mute is nerfed by 60% but - a stutter and special new slur effect will last much longer"' - - tweak: '"The old cult has retained the rune of time stop, now requiring 3 cultists - to invoke"' - - rscdel: '"New Cult is removed!"' - bgobandit: - - rscadd: CentComm has been informed that cargo is receiving new forms of contraband - in crates. Remember, Nanotrasen has a zero-tolerance contraband policy! - lordpidey: - - rscadd: New virology symptom, projectile vomiting. It is a level four symptom. -2016-03-03: - Joan: - - tweak: Blobbernauts now die slowly when not near a blob. - - rscadd: Blobbernauts can now see their health and the core health of the overmind - that created them. -2016-03-05: - CoreOverload: - - imageadd: Cyborg tools (screwdriver, crowbar, wrench, etc) now have new fancy - sprites. - - tweak: Said cyborg tools have received a buff and are now two times faster than - their non-cyborg counterparts. - Joan: - - tweak: Replicating Foam has lower expand chances when hit and on normal expand. - - bugfix: Shifting Fragments will no longer try and fail to swap with invalid blobs - when hit. - - tweak: Electromagnetic Web no longer always EMPs targets, instead doing it at - a 25% chance. - - tweak: Synchronous Mesh now only takes bonus damage from fire, bombs, and flashbangs. - - tweak: Synchronous Mesh no longer tries to split damage to blob cores or nodes. - Cores and nodes still split damage to nearby blobs, however. - - tweak: Blobbernauts now attack much slower. - - tweak: Blobbernauts are now maximum one per factory, reduce that factory's health - drastically, and die slowly if that factory is destroyed. - - experiment: Factories must still have above 50% health to produce blobbernauts. -2016-03-07: - WJohnston: - - tweak: Queens and praetorians have new sprites! -2016-03-09: - Joan: - - rscadd: Blobs can now attack people that end up on top of blob tiles with Left-Click - or the Expand/Attack Blob verb. - - tweak: The Toxin Filter virology symptom now heals 4-8 toxin damage instead of - 8-14. - - tweak: The Damage Converter virology symptom will now do toxin damage for each - limb healed. - MrStonedOne: - - tweak: Centcom has improved the the tesla generator! The generated tesla energy - balls should now be more stable! Growing quicker and dissipating slower. It - seems to also move around a touch more but that shouldn't be an issue as the - the tesla escaping containment is unheard of! -2016-03-10: - Joan: - - rscadd: The blob can now be shocked by the tesla. - - tweak: Strong blobs are now much more resistant to brute damage. - - wip: Tweaks blob reagents; - - rscdel: Removes Ripping Tendrils. - - rscdel: Removes Draining Spikes. - - tweak: Cryogenic Liquid does less burn damage. - - tweak: Pressurized Slime does less brute damage. - - tweak: Reactive Gelatin now has a lower minimum damage. - - tweak: Poisonous Strands applies its damage over a longer period of time. - - tweak: Sporing Pods now does much less damage, and is less likely to produce spores - when killed. - - tweak: Regenerative Materia, Hallucinogenic Nectar, and Envenomed Filaments do - less toxin damage. - - rscadd: Energized Fibers no longer heals when hit with stamina damage, and is - instead immune to the tesla. - - rscadd: Boiling Oil now takes damage from extinguisher blasts. Boiling Oil blobbernauts, - however, do not. - - tweak: Replicating Foam now takes increased brute damage and when expanding from - damage, will not expand again. - - tweak: Flammable Goo takes 50% increased burn damage, from 30%. - - tweak: Explosive Lattice now takes much higher damage from fire, flashbangs, and - the tesla. - - experiment: Electromagnetic Web takes full brute damage, lasers will now one-hit - normal blobs, and the death EMP is smaller. -2016-03-12: - Joan: - - bugfix: Blobbernauts and blob spores can now move near blob tiles in no gravity. - - tweak: Boiling Oil does slightly more damage and takes slightly less damage when - extinguished. - - rscadd: Flammable Goo now applies firestacks to targets, but does not ignite them. - Jordie0608: - - rscadd: Show Server Revision will now tell you if a PR is test merged currently. - PKPenguin321: - - rscadd: Added reinforced bolas. They do a very short stun in addition to normal - functions, and take twice as long to break out of when compared to regular bolas. - - tweak: The traitor's Throwing Star Box has been made into the Throwing Weapons - Box. It now contains two reinforced bolas in addition to its old contents. It - also costs 5 TCs, down from 6. - tkdrg: - - tweak: The detective's revolver now takes three full seconds to reload. - xxalpha: - - rscadd: Detective can be a Traitor/Double Agent. - - tweak: Removed Detective's access to security lockers and secbots. - - tweak: Removed bowman's headset from Detective's locker. - - tweak: Box Brig Security Office and Locker Room require a higher access level - (Security Officer level). -2016-03-13: - Dorsisdwarf: - - rscadd: 'Adds Robo-Doctor board (The Hippocratic Oath: Now on your beepbot)' - - rscadd: Adds Reporter board (The truth will set ye free (termsandconditionsmayapply)) - - rscadd: Adds Live and Let Live board - - rscadd: Adds Thermodynamics as a dangerous board. - Impisi: - - tweak: Improvised shells now deal more far more damage but are more inaccurate. - - tweak: Overloaded shells now require liquid plasma in addition to black powder. - Shells now fire explosive pellets that are good at hurting you and everything - in front of you. - Joan: - - rscdel: Blob gamemode blobs will no longer burst from people. - - rscadd: Instead, the blob gamemode spawns overminds, which can place their blob - core underneath them in an unobserved area. - - rscadd: The overminds can, until they have placed a blob core, move to any non-space, - non-shuttle tile. - - rscadd: If the overminds fail to place a blob core within a time limit, it will - be automatically placed for them at a random blob spawnpoint. - - tweak: The time before the overmind automatically places the core is slightly - lower than the previous average time it'd take a blob to burst. -2016-03-15: - Cuboos: - - soundadd: Modded the current door sound and added a few new ones, unique sound - for closing, bolting up/down and a nifty denied sound. - Isratosh: - - rscadd: Security flashlights can now be attached to the bulletproof helmets. - Joan: - - tweak: Resource blobs produce resources for their overmind slightly slower for - each resource blob their overmind has. - - rscadd: Blob overminds get one free chemical reroll. - - rscadd: Blob overminds can no longer place resource and factory blobs out of range - of cores and nodes, unless they Toggle Node Requirement off. It is on by default. - - rscadd: Blob UI buttons now have tooltips. - - tweak: Cores and nodes will expand slightly slower. - - tweak: Blob Chemicals no longer trigger effects on dead mobs. - - tweak: Shifting Fragments has a lower chance to move shields with normal expansion - and will no longer shift blobs to the location of a dying blob. - - tweak: Flammable Goo no longer applies fire to tiles with blobs. - - tweak: Electromagnetic Web has a slightly higher EMP range. - Kor: - - rscadd: Hunger was accidentally disabled sometime back in October 2015. We finally - noticed and fixed it. - Kor (And all the lovely maintainers and spriters who helped me along the way): - - rscadd: Adds a new, lava themed planet to mine on,with randomly generated rivers - of lava and islands of volcanic rock. This mine is used on Box and Metastation. - Other mappers may enable it at their discretion. - - rscadd: Added deadly ash storms to mining. - - rscadd: Added slightly deadlier variants of mining mobs to lavaland, with sprites - done by my girlfriend. - - rscadd: Added portable survival capsules to mining equipment lockers. Don't forget - these, or you might get caught out by a storm. You may purchase more at the - venders. - - rscadd: Added randomly loaded ruins to mining. These maps contain new and unique - items not seen elsewhere in thegame. There are around a dozen of them added - with the "release" of lavaland, though I plan for many more. - - rscadd: Some ruins contain sleepers which allow you to spawn as various roles, - such as survivors of a shuttle crash stranded in the wilderness. You can find - these sleepers in the orbit list. - - rscadd: You can now fly the abandoned white ship to lavaland. - LanCartwright: - - tweak: Choking now deals damage based on virus' Stage speed and virus Stealth. - - tweak: Fever heats the body based on Transmittability and Stage speed. - - tweak: Spontaneous Combustion now adjusts firestacks based on stage speed minus - Stealth. - - tweak: Necrotizing Fasciitis now deals damage based on lower Stealth values. - - tweak: Toxic Filter now heals based on Stage speed. - - tweak: Deoxyribonucleic Acid Restoration now heals brain damage based on Stage - speed minus Stealth. - - tweak: Shivering now chills based on Stealth and Resistance. - - rscadd: Proc for the total stage speed of a virus' symptoms. - - rscadd: Proc for the total stealth of a virus' symptoms. - - rscadd: Proc for the total resistance of a virus' symptoms. - - rscadd: Proc for the total transmittance speed of a virus' symptoms. - MrStonedOne: - - rscdel: 'Lag has been removed from the following systems: mob life()/virus process, - machine/object/event processing, atmos, deletion subsystem, lighting, explosions, - singularity''s eat(), timers, wall smoothing, mass var edit, mass proc calls(and - all of sdql2), map loader, and the away mission loader.' - - rscdel: Removed limit on bomb cap of 32,64,128, it can now go to the MOON. - - tweak: Minimap generation is now a config option that defaults to off so coders - don't have to wait for it to generate to test their code, server operators should - note that they need to enable it on production servers that want minimap generation. - - wip: if you find any things that still lag, please report them to MrStonedOne - for lag removal. - - experiment: I'm gonna take this time to shill out that, Lummox JR, byond's only - dev, coded the tool that made this change possible, he lives off of byond membership - donations, if you like the lag removal, become a byond member or at least throw - 5 bucks byond's way for doing this. - - experiment: Feel free to ask for bomb cap removals when solo antag, but remember, - the later in the round it is, the more likely you'll get it. - PKPenguin321: - - rscadd: Scooters and skateboards have been added. - - rscadd: Use rods to make a scooter frame. From there, apply metal to make wheels, - creating a skateboard. Apply a few more rods to make a full scooter. You can - also use tablecrafting to create them, their recipes can be found under the - Misc. category. - - rscadd: Each step of scooter deconstruction is performed with either a wrench - or a screwdriver, depending on the step. - xxalpha: - - rscadd: Scrubber clog event now ejects cockroaches. -2016-03-17: - CoreOverload: - - rscdel: The recent jetpacks nerf is finally reverted. Turbo mode is dead and stabilization - is once again can be toggled on and off. - - rscadd: 'Added a new chest cyberimplant: implantable thrusters set. This implant - is a built-in jetpack that has no stabilization mode at all and can use gas - from environment (if 30+ kPa) or from internals. It can also use plasma from - plasma vessel organ, if you have one.' - Joan: - - tweak: Moved the security hud's icons down slightly to allow it to coexist with - medical and antag huds. - Shadowlight213: - - rscadd: HOG deity can now be heard by all of its followers! - - tweak: The prophet no longer needs to wear his hat to speak with his deity. - - rscadd: The prophet's hat and staff have a new functionality! Use the staff inhand - to reveal hidden structures. - - rscadd: Deities can now hide their structures from view! Pretend to be a book - club when sec bursts in. experiment:Only enemy prophets or your own deity can - reveal these structures and they are disabled when hidden. -2016-03-19: - Joan: - - imageadd: Xray lasers now have unique inhands. - - imageadd: Xray lasers have been recolored to match R&D equipment. - Zombehz: - - rscadd: Adds 'chicken' nuggets* in 4 shapes, including regular, star, corgi, and - lizard. it. They are made with one cutlet of meat. -2016-03-20: - Joan: - - rscadd: Nar-Sie will now corrupt airlocks, tables, windows, and windoors. - - rscadd: Corrupted airlocks have no access restrictions. - - tweak: Nar-Sie no longer causes destruction while moving around in favor of additional - corruption. - - tweak: The surplus crate is less likely to give you eight space suits. - - bugfix: Nukeops can once again buy noslips. The nuke op magboots are still better - than noslips, buy them instead. - Kor: - - rscadd: Runtime now has a chance to spawn with a more classic look. - - rscadd: Killing a necropolis tendril will now drop a chest full of spooky loot. - - rscadd: Killing a necropolis tendril will now cause the ground to collapse around - it after 5 seconds. -2016-03-21: - CoreOverload: - - rscadd: You can now construct and deconstruct wall mounted flashes by using a - wrench on empty wall flash. A crate with four linked "flash frame - flash controller" - pairs is added to cargo. - Joan: - - rscadd: Explosive Holoparasites now have a 33% chance to explosively teleport - attacked targets, doing damage to everyone near the target's appearance point. - - tweak: Explosive Holoparasite bombs can now detonate when living mobs bump them. - - rscadd: Adds lightning holoparasites, which have medium damage resist, a weak - attack, have a lightning chain to their summoner, and apply lightning chains - when attacking targets. - - rscadd: Lightning chains shock everyone nearby, doing low burn damage. This is - excluding the parasite and summoner; chains will shock enemies they're attached - to. - - tweak: Holoparasites can now smash tables and lockers. - PKPenguin321 && !JJRcop: - - rscadd: Milk, which is good for your bones, is now extra beneficial to species - that are mostly comprised of bones. - kingofkosmos: - - rscdel: The backpack close-button has got a visual overhaul. - - rscadd: All storage items can be closed by clicking on them again. -2016-03-23: - Iamgoofball: - - rscadd: Cargo now works off of Credits. - - rscadd: Cargo now plays the Stock Market. - - rscadd: Buy Low, Sell High -2016-03-24: - Iamgoofball: - - rscadd: CLF3 now melts, burns, and destroys floors a lot more often, as it should - be. - - rscadd: CLF3 now makes 3x3 fireballs on tiles it touches now, instead of a single - fireball. - Joan: - - tweak: Lightning Holoparasites will actually shock relatively often instead of - 'sometimes, maybe, if you're really lucky' - PKPenguin321: - - tweak: Sand now fits in your pockets - - rscadd: Sand can now be thrown into people's eyes, doing slight stamina damage, - making their vision slightly blurry, and making them stumble when they walk - for a short time. - RemieRichards: - - rscadd: BEES - - rscadd: Hydroponics can now manage bee colonies, bees produce honeycombs that - can be grinded to obtain honey, a decent nutriment+healing chemical - - rscadd: Hydroponics can inject a queen bee with a syringe of a reagent to alter - her DNA to match that reagent, meaning all honeycombs produced will contain - that reagent in small amounts - - rscadd: Bees with reagents will attack with that reagent - Xhuis: - - experiment: Alcohol has received multiple tweaks. - - tweak: Drunkenness will now be displayed on examine as long as the target's face - is not hidden, ranging from a slight flush to being a completely drunken wreck. - This also helps to measure alcohol poisoning, although the appearance will remain - for thirty seconds after the alcohol leaves the imbiber's bloodstream. - - tweak: Alcohol poisoning now has different effects. It begins with standard things - such as confusion, dizziness, and slurring, but eventually escalates to constant - vomiting, blacking out, and toxin damage. - - tweak: Drinks now have a wide variety of alcoholism. Grog is barely a drink whatsoever, - for instance, but Manly Dorf will completely floor you with too much consumption. - Note that drinks based off of whiskey and vodka are the hardest, whereas beer - and wine are the softest. - - tweak: The speed of alcohol poisoning has been slightly reduced. - - rscadd: Some drinks have received unique effects. Experiment! - - rscadd: A new base alcohol joins the lineup! Absinthe has been added, and is very - strong. - - rscadd: Whiskey Sour, made with Whiskey, Lemon Juice, and Sugar, simply expands - the existing whiskey-based lineup. - - rscadd: Fetching Fizz, made with Nuka-Cola and Iron, will pull all nearby ores - in the direction of the imbiber. - - rscadd: Hearty Punch, made with Brave Bull, Syndicate Bomb, and Absinthe, will - provide extreme healing in critical condition. - - rscadd: Bacchus' Blessing, made with four of the most powerful alcohols on the - station, is over three times stronger than any other alcohol on the station. - Consume in small amounts or risk death. -2016-03-26: - CPTANT: - - tweak: Nanotrasen found a new taser supplier. The new tasers hold 12 shots, down - people with 2 hits and hybrid tasers now have a light laser attached. - CoreOverload: - - tweak: Sorting junctions now support multiple sorting tags. - Fox McCloud: - - bugfix: Fixes Shadowlings not being spaceproof to pressure - - bugfix: Fixes being able to receive multiple spells as a Lesser Shadowling - Joan: - - rscadd: Adds assassin holoparasites, which do low damage and take full damage, - but can go invisible, causing their next attack to do massive damage and ignore - armor. - - rscadd: Assassin holoparasite stealth will be broken by attacking or taking damage, - which will briefly prevent the parasite from recalling. - - rscadd: Traitor holoparasite injectors include this parasite type. - Kor: - - rscadd: There are a couple new lavaland ruins, including one with a new ghost - role. - PKPenguin321: - - tweak: The RD's reactive teleport armor now has a cooldown between teleports. - EMPing it will cause it to shut down and have a longer cooldown applied. - - imageadd: Bolas, both reinforced and regular, now have newer, sexier sprites. -2016-03-29: - Bawhoppen: - - tweak: Bruisepacks, ointment, and gauze now will apply significanty faster. - - rscdel: SWAT crates no longer contain combat knives. - - rscadd: SWAT crates now contain combat gloves. - - rscadd: Combat knives now can be ordered in their own crate. - Iamsaltball: - - rscadd: GRAB SUPER NERFED - - rscadd: IT'S WAY EASIER TO ESCAPE GRABS NOW - - rscadd: IT TAKES WAY LONGER TO UPGRADE GRABS NOW - - rscadd: 'YOU CAN ACTUALLY FUCKING ESCAPE GRABS NOW TOO #WOW #WHOA' - - rscadd: GRAB TEXT IS ALL BIG BOLD AND RED MUCH LIKE YOUR MOM LAST NIGHT - - experiment: GIT GUDDERS GO FUCK YOURSELVES YOU CAN'T GET GOOD AGAINST "LOL INSTANT - PERMASTUN THAT ISN'T OBVIOUS IN CHAT LIKE THE REST OF THE STUNS" - Joan: - - tweak: Ghost revival/body creation alerts now use the ghost's hud style. - - imageadd: Support holoparasites now have a healing effect with their color when - successfully healing a target. - - tweak: Ranged holoparasite projectiles now take on the color of the holoparasite. - - bugfix: Holoparasite communication(holo->summoner) now sends the message to all - holoparasites the summoner has. - - bugfix: If you have multiple holoparasites for some reason, Reset Guardian allows - you to choose which to reset. - - tweak: Resetting a holoparasite also resets its color and name, to make it more - obvious it's a new player. - - rscadd: Holoparasites can now see their summoner's health and various ability - cooldowns from the status panel. - - rscadd: Blobbernauts are now alerted when their factory is destroyed. - KazeEspada: - - bugfix: Blob Mobs no longer swap with other mobs. - RemieRichards: - - rscadd: Added the ability to make Apiaries and Honey frames with wood - - rscadd: Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey - - rscadd: Added the ability to make more Queen Bees from Royal Bee Jelly by using - it on an existing Queen, to split her into two Queens - - tweak: Made homeless bees more obvious - - bugfix: Fixed a typo that made almost all bees homeless, severely reducing the - odds of getting honeycomb - - tweak: Made bee progress reports (50% towards new honeycomb, etc.) always show, - even if it's 0% - - tweak: Made some feedback text more obvious - - bugfix: Fixed being able to duplicate the bee holder object, this was not exploity, - just weird - - bugfix: Fixed being able to put two (or more) queens in the same apiary - - bugfix: Fixed some runtimes from hydro code assuming a plant gene exists - - bugfix: Fixed runtime when you use a honeycomb in your hand - - tweak: It now takes and uses 5u of a reagent to give a bee that reagent - - rscdel: Removed unused icon file - Ricotez: - - imageadd: The default white ghost form now has directional sprites. - - rscadd: The default white ghost form now also has (your) hair! Here's how it works. - - experiment: If you ghost from a body, you'll get the hair from that body. If it - has hair. - - experiment: If you hit Observe, you'll get the hair from the character you had - active in your setup window. If they had hair. - - wip: This only works with the default white ghost form right now (because the - other forms have the wrong shape or lack directional sprites), and with human - bodies since they're the only ones that have hair. Sorry lizards and plasmamen! - You'll get your turn next time. - - rscadd: A new preference called Ghost Accessories. This lets you configure if - you want your ghost sprite to show both hair and directional sprites, only directional - sprites or just use its original default version without directional sprites. - - rscadd: 'A new preference called Ghosts of Others. This preference is clientside - and lets you configure how other ghosts appear to you: as their own setting, - as the form they chose but without any hair or directional sprites, or as the - simple white ghost sprite if you''re sick of those premium users with their - rainbow ghosts.' - - experiment: The layout of the ghost preference buttons has slightly changed. The - old Choose Ghost Form and Choose Ghost Orbit are now a part of Ghost Customization, - which also contains the new Ghost Accessories button. Clicking Ghost Customization - will send you directly to Ghost Accessories if you don't have premium. The Preferences - tab now also contains the Ghost Display button, which lets you configure how - other ghosts appear to you. - - bugfix: Fixed a bug where the toggles for Ghost Accessories and Ghosts of Others - in the Preferences menu wouldn't save your preference update to your save file. - - bugfix: Renamed the "Ghost Display Settings" preference toggle button to "Ghosts - of Others", so it fits with the name the preference has everywhere else. - TehZombehz: - - rscadd: Paper sacks are now craftable by tablecrafting with 5 sheets of paper. - - rscadd: 'Comes in 5 different designs: Use a pen on a paper sack to change the - design.' - - rscadd: Certain paper sack designs can be modified with a sharp object to craft - a (creepy) paper sack hat. - Xhuis: - - bugfix: Portal storm messages now use the station name rather than the world name. - - bugfix: Shadowlings can no longer glare while shadow walking. - - bugfix: Progress bars are now properly shown when reloading revolvers. - - bugfix: Cyborgs and AIs are no longer knocked out when being stuffed into lockers. - - bugfix: Plasmamen can no longer be the patient zero of the space retrovirus. - - bugfix: Cyborgs and AIs now properly display death messages. - - bugfix: Revenants can no longer be closed into lockers. - - bugfix: Airlocks no longer play sounds or flash lights when denying access if - the airlock has no power. - - bugfix: Job spawn icons in mapping have been fixed. - - bugfix: Gibtonite's disarm message no longer include the outside viewer. - - bugfix: Cult walls and girders are now more streamlined and can be built with - runed metal. - - bugfix: Positronic brains and MMIs can no longer see ghosts. - - rscadd: When someone is turned into a statue, the statue now appears as a greyscale - version of them. - - rscadd: Returning from a statue to a human now knocks you down. - - rscdel: Flesh to Stone no longer works on dead mobs. - - bugfix: Wall-mounted flasher crates now have the proper price. - - bugfix: Wall-mounted flasher frames now have icons. - - bugfix: Upgraded resonators now have an inhand sprite. -2016-03-30: - Coiax: - - rscadd: Geiger counters can now be stored in the suit storage of radiation suits - RemieRichards: - - bugfix: fixes shift-clicking action buttons not instantly resetting their location. - (I'm only making a changelog for this because apparently barely noone even knows - you can move the buttons, let alone reset them...) - TehZombehz: - - rscadd: Honey buns and honey nut bars are now craftable using honey. - - tweak: Brewing mead now requires actual honey. -2016-04-01: - Erwgd: - - bugfix: Weed Killer bottles and Pest Killer bottles now contain 50 units. - - rscadd: The biogenerator can now make empty bottles and black pepper. - Isratosh: - - rscadd: Added an admin jump button to explosion logs. - Joan: - - rscadd: Traitors can now buy charger holoparasites. - - rscadd: Charger holoparasites move extremely fast, do medium damage, and can charge - at a location, damaging the first target it hits and forcing them to drop any - items they're holding. - Kor: - - rscadd: Mechas are now storm proof - - rscadd: Kinetic Accelerators now require two hands to fire, but are free standard - gear for miners. - - rscadd: All mining scanners are now automatic, with the advanced version having - longer range. - - rscadd: The QM and HoP no longer have spare vouchers. - - rscadd: You can buy a pack of two survival capsules with your mining voucher. - - rscadd: Mining Bots will no longer cause friendly fire incidents. They'll hold - fire if you are between them and their target - - rscadd: There are now four different mining drone upgrades available in the vendor. - - rscadd: Resonators can now have more fields and deal more melee damage. - - rscadd: Lavaland miners now have explorer's suits instead of hardsuits. Sprites - by Ausops. - - rscadd: You can now butcher Goliath's for their meat. It cooks well in lava. - Shadowlight213: - - rscadd: Clients now have a volume preference for admin-played sounds. - TehZombehz: - - rscadd: The 'Plasteel Chef' program has provided station chefs with complimentary - ingredient packages. There are several package themes, and chefs are provided - a random package on arrival. - coiax: - - rscadd: Free Golems on Lavaland have been naming their newborn siblings with a - wider range of geology terms -2016-04-02: - Eaglendia: - - rscadd: Central Command has released a new, more functional run of their most - stylish fashion line. - - rscadd: Head of Staff cloaks can now hold specific items - the antique laser gun - for the Captain, the replica energy gun for the Head of Security, the hypospray - for the Chief Medical Officer, the Hand Teleporter or RPED for the Research - Director, and the RCD or RPD for the Chief Engineer. -2016-04-03: - Erwgd: - - rscadd: Our valued colleagues in the security department are reminded to search - boots for hidden items (such as knives or syringes) as part of standard search - procedures. Alt-click a pair of boots to remove any hidden items. - Isratosh: - - bugfix: Fixed rudimentary transform not working properly on ghosts with minds. - - rscadd: Admin logs for bluespace capsules not activated on the mining Z level. -2016-04-04: - TechnoAlchemisto: - - rscadd: The recipes for some Trekchems are now back in the game - - rscadd: Bicaridine can be made with carbon, oxygen, and sugar. - - rscadd: Kelotane can be made with silicon and carbon. - - rscadd: Antitoxin can be made with nitrogen, silicon, and potassium - - rscadd: tricordrazine can be made by combining all three. -2016-04-05: - Erwgd: - - rscadd: Utility belts of all kinds can now accept gloves. Most belts, except janitorial - belts, may now also hold station bounced radios. - - rscadd: Hazard vests and most jackets can carry a station bounced radio as well. - Labcoats can be used to store a handheld crew monitor. - - rscadd: The autolathe can now make toolboxes. - Joan: - - rscadd: Adds protector holoparasites to traitor holoparasite injectors. - - rscadd: Protector holoparasites cause the summoner to teleport to them when out - of range, instead of the other way around. - - rscadd: Protector holoparasites have two modes; Combat, where they do and take - medium damage, and Protection, where they do and take almost no damage, but - move slightly slower. - - tweak: Explosive Holoparasites no longer teleport non-mobs when attacking, but - have a higher chance to teleport mobs. - - rscdel: Explosive Holoparasite bombs no longer trigger on their summoner or any - other parasites their summoner has. - - bugfix: Ranged Holoparasites no longer have nightvision active by default. It - can still be toggled on. - - tweak: Ranged Holoparasite snares no longer alert if the crossing mob is their - summoner or one of the parasites their summoner has. - - tweak: Ranged Holoparasites are slightly less visible in scout mode. - - tweak: Standard Holoparasites attack 20% faster than other parasite types. - - rscdel: Support Holoparasite beacons no longer require safe atmospheric conditions, - but the warp channel takes slightly longer, and is preceded with a visible message. - - tweak: Zombies can no longer destroy more than one airlock at a time. - - rscadd: The mining station has been updated. - MrStonedOne: - - bugfix: Centcom is glad to announce the end of sending workers to our control - group for space exposure testing, a fake station in "space" that noticeably - had air in "space". - TechnoAlchemisto: - - tweak: Detective scanners are now smaller. - - tweak: Pickaxes now fit in explorer suit exosuit slots. - bgobandit: - - rscadd: Alt-clicking a fire extinguisher cabinet opens and closes it. That is - all. -2016-04-06: - CoreOverload: - - rscadd: You can now put slimes in stasis by exposing them to room temp CO2. Useful - for both fighting the slimes and safely storing them. - Erwgd: - - rscadd: The autolathe can now make hydroponics tools! Access the design routines - in the Misc. category of the machine. - LanCartwright: - - tweak: Custom viruses with stealth values of 3 or above are now invisible on the - PANDEMIC and no longer visible on health huds. - MrStonedOne: - - bugfix: Centcom is happy to report that our single sided windows and our windoors - should once again create an airtight seal. - bgobandit: - - rscadd: Honk! Nanotrasen's clowning and development department has invented the - clown megaphone, standard in all clowning loadouts! Honk honk! -2016-04-07: - Kor: - - rscadd: The Laser Cannon in RD has been replaced with the Accelerator Laser Cannon. - Try it out! - - rscadd: Mechas now have armour facings. Attacking the front will deal far less - damage, while attacking the back will deal massive bonus damage. - - rscadd: EMPs now deal far less damage/drain to mechas. - Kor and Ausops: - - rscadd: Survival pod interiors have been redone. - - rscadd: Survival pods now contain a stationary GPS computer. - - rscadd: You can now toggle your GPS off with alt+click. - bgobandit: - - rscadd: Due to budget cuts, Nanotrasen is no longer utilizing copy-protected paper - for its classified documents. Fortunately, our world-class security team has - always prevented any thefts or photocopies from being made! - - rscadd: Secret documents can be photocopied. If you have an objective to steal - any set of documents, a photocopy will be accepted. If you must steal red or - blue documents, a photocopy will NOT be accepted. Enterprising traitors can - forge the red/blue seal with a crayon to take advantage of this. -2016-04-09: - GunHog: - - rscadd: Aliens may now force open unbolted, unwelded airlocks. Unpowered airlocks - open faster than powered ones. Has a cool sound provided by @Ultimate-Chimera! - - tweak: Alien Drone health increased to 125 hp. - - tweak: Alien drone is now faster! - - tweak: Alien egg and larva maturation times halved. - - tweak: Resin membrane health increased to 160 hp. - - rscadd: Aliens may now open firelocks. - - rscadd: Aliens may now unweld scrubbers and vents. (From the outside!) - - tweak: Droppers no longer affect aliens. - Joan: - - rscdel: You can no longer drop survival capsules on top of dense objects, such - as the windows in the emergency shuttle. You can still drop them on non-dense - objects and mobs, however. - - tweak: Swarmers can now deconstruct objects simply by clicking. - - rscadd: Swarmers can still teleport mobs away via ctrl-click. - - bugfix: Emps will now properly damage swarmers. - Kor: - - rscadd: Added wisp lanterns to necropolis chests. - - rscadd: Added red/blue cube pairs to necropolis chests. - - rscadd: Added meat hooks to necropolis chests. - - rscadd: Added immortality talismans to necropolis chests. - - rscadd: Added paradox bags to necropolis chests. - - rscadd: Ripley drills work again. Go tear up lavaland. - PKPenguin321: - - tweak: Goofball's grab nerf has been reverted. - TechnoAlchemisto: - - tweak: Pickaxe upgrades are now better. - coiax: - - tweak: Efficiency Station Testing Lab now has a Drone Shell Dispenser - - tweak: Fixed an issue with a door on the Golem Ship - - rscadd: The unfathomable entity Carp'sie has blessed vir followers with mysterious - carp guardians. - - rscadd: Nanotrasen Cyborgs are now able to empty ore boxes without human assistance - - rscadd: Ore boxes are now craftable with 4 planks of wood - - tweak: Ore boxes now drop their contents when destroyed, or dismantled with a - crowbar - coiax, bobdobbington, Core0verload: - - rscadd: An experimental plant DNA manipulator, based on machinery recovered from - ancient seed vaults, has been installed in the Botany department. -2016-04-11: - Joan: - - rscadd: Blob cores will take slight brute damage from explosions. - RandomMarine: - - rscadd: Additional luxuries have been added to golem ships. Including new rewards. - Praise be to The Liberator! - - rscdel: However, jaunters are no longer easily obtained by free golems. - RemieRichards: - - rscadd: The Station Blueprints now display the piping/wiring and some of the machinery - the station started with, to assist in repairs - coiax: - - rscadd: Emagging the cargo console also unlocks regular contraband, in addition - to syndicate gear - - rscadd: A working drone shell dispenser is now on display in MetaStation's museum, - displaying the virtue of the tireless little workers! - - rscadd: Dreamstation now has a drone shell dispenser in the Toxins Launch Room -2016-04-12: - Incoming5643: - - rscadd: Leading scientists have finally proven that humans (and xenos) in fact - have tongues in their mouths. - - rscadd: Swapping out tongues allows the various races to change their speech impediments. - Putting a xeno tongue in someone allows them to make the hissing sound like - a xeno whenever they speak. - - rscdel: There are no erp mechanics tied to this feature. - - experiment: Remember that tongues are stored in the MOUTH, selecting the head - isn't good enough. - Kor: - - rscadd: Ash walker starting gear has been rebalanced. - - rscadd: Ash walkers can no longer use guns. - TrustyGun: - - rscadd: After carefully investing in the market, the Captain had enough money - to replace his silver flask with a golden one! - - rscadd: The Detective is now bringing his personalized flask to work, due to the - grim work he has to do. - - rscadd: The Booze-O-Mat now stocks 3 flasks. -2016-04-16: - Bawhoppen: - - tweak: Cryo is no longer god-awful. - CoreOverload: - - rscadd: A lot of items are now exportable in cargo. - - rscadd: Use Export Scanner to check any item's export value. - Erwgd: - - rscadd: Forks, bowls, drinking glasses, shot glasses and shakers can now be made - and recycled in the autolathe! Access the designs in the new 'Dinnerware' category. - - tweak: Kitchen knives have been moved to the Dinnerware category of the autolathe. - - rscadd: Butcher's cleavers can now be made in a hacked autolathe. - Fox McCloud: - - rscadd: Slime batteries now self-recharge. - - rscadd: Adds transference potion. A potion that allows the user to transfer their - consciousness to a simple mob. - - rscadd: Adds rainbow slime core reaction that generates a consciousness transference - potion when injected with blood. - Iamgoofball, Lati, Geo_Jerkal, Tanquetsunami25: - - rscadd: Lati requested that the Slime Processor will now automatically scoop up - any dead slimes into itself for processing. - - rscadd: Geo_Jerkal requested that you be able to mix Arnold Palmers with Tea and - Lemon Juice. - - rscadd: Tanquetsunami25 requested that cyborg be able to boop. - Incoming5643: - - rscdel: Removed the horrible meme skeletons, please don't sue us. - Kor: - - rscadd: Adrenals, no slips, surplus crates and SUHTANDOS now have minimum population - requirements before they can be purchased. - KorPhaeron: - - rscadd: You now need to butcher goliaths and watchers on lavaland to receive their - loot. Use the combat knives to do so. - Lati: - - rscadd: Custom floor tiles can now be added to floorbots. They will start replacing - other tiles with these tiles if the option is toggled on. - coiax: - - rscadd: Boxstation, not to be outdone by all the other competing station designs, - has installed a drone shell dispenser in the Testing Lab, which makes automated - drones to help fix the station. - - rscadd: Toy fans, rejoyce! The famous skeleton brothers from the beloved game - Belowyarn now have toys that you can win from the arcade machines! - - rscadd: Airlock painters can be printed at your local autolathe - - rscadd: Please do not attempt suicide with the airlock painter or the medical - wrench. - - rscadd: Metastation now has a plant DNA manipulator in Botany. - - rscadd: Using the fire extinguisher on yourself or others while in HELP intent - will spray you or them, rather than beat their probably flaming body with a - metal object. - - tweak: Alt-clicking extinguishers to empty them now wets the floor underneath - them. - lordpidey: - - rscadd: Meth labs can now blow up if you don't purify the ingredients or over-heat - the end product. - nullbear: - - rscadd: Added attack verbs for heart and tongue organs - - tweak: Maximum output of air pumps has been raised. -2016-04-18: - Joan: - - rscdel: Crates are now dense even when open. - - rscadd: You can now climb onto crates in the same way as table and sandbags, though - climbing onto crates is very fast and does not stun you. - - wip: You can walk on crates, provided both are closed/open or the crate you're - on is closed. - - rscdel: You can't close or open a crate if there's a large mob on top of it. - - rscadd: Stuffing items into a closet or crate is now instant and does not close - the closet or crate. Stuffing mobs into a closet or crate still takes time and - closes the closet/crate in question. - - imageadd: Crowbars and wirecutters have new inhand sprites. Crowbars can now be - distinguished from wrenches in-hand. - RandomMarine: - - tweak: Cloth items removed from biogenerator. Instead, it can create stacking - cloth that crafts those items. - - rscadd: In addition, cloth can be used to create grey jumpsuits, backpacks, dufflebags, - bio bags, black shoes, bedsheets, and bandages. - - tweak: Bedsheets now tear into cloth instead of directly into bandages. - Shadowlight213: - - tweak: AI will be notified when one of their cyborgs is detonated. - coiax: - - bugfix: Fixed slime grinders not sucking up more than one slime - - rscadd: Drones now start with a spacious dufflebag full of tools, so they will - stop stealing the captain's - - bugfix: Fixed issues with drones wearing chameleon headgear. - - rscadd: Added admin-only "snowflake drone" (also known as drone camogear) headgear. - nullbear: - - bugfix: Fixes air canisters being silent when bashed. -2016-04-20: - Erwgd: - - rscadd: The autolathe can now make trays. - Fox McCloud: - - bugfix: Fixes abductor vests having no cooldown between uses - Kor: - - rscadd: You can now craft boats and oars out of goliath hides. These boats can - move in lava. - - rscadd: Added a spooky, upgraded boat to necropolis chests. - coiax: - - tweak: Slime grinders now cease suction of new slimes while grinding - coiax, Joan: - - rscadd: Drone dufflebags now have their own sprite. - kevinz000: - - rscadd: 'Admin Detection Multitool: A multitool that shows when administrators - are watching you! Now you can grief in safety!' - - tweak: Syndicate R&D scientists have significantly increased the range of their - "AI detection multitools", making them turn yellow when an AI's tracking is - near, but not on you just yet! -2016-04-21: - Kor: - - rscadd: Mechas can now toggle strafing mode. -2016-04-22: - Bawhoppen: - - rscadd: Security belts can now hold any type of grenade. This includes barrier - grenades. - - rscadd: Janitorial belts are now able to store chem grenades. - - rscadd: Military belts have been given a size upgrade, so they can now hold larger - items. - - rscadd: Bandoliers have been given a buff and now can hold a much larger amount - of ammunition. - nullbear: - - bugfix: xenobio console is deconstructable again. - - tweak: syndibomb recipe calls for any matter bin, scaling effectiveness with tier. -2016-04-23: - Joan: - - bugfix: Aliens can now open crates and lockers. - - bugfix: Aliens and monkeys can now climb climbable objects, such as crates and - sandbags. - - rscadd: Aliens climb very, very fast. - Kor: - - rscadd: Running HE pipes over lava will now heat the gas inside. - - rscadd: Alt+clicking on your mecha (while inside it) will toggle strafing mode. - Mercenaryblue: - - rscadd: Allowed all corgis to wear red wizard hats. - TechnoAlchemisto: - - rscadd: Goliaths now drop bones, and Watchers drop sinews. - - rscadd: You can craft primitive gear from bone and sinew. - coiax: - - bugfix: Non-humans are now able to interact with bee boxes. -2016-04-25: - Joan: - - bugfix: You can once again hit a closet or crate with an item to open it. - Kor Razharas: - - rscadd: Adds support for autoclicking. - - rscadd: The Shock Revolver has been added to RnD. - - rscadd: The Laser Gatling Gun has been added to RnD. The Gatling Gun uses autoclick - to fire as you hold down the mouse. - - rscadd: The Research Director now starts with a box of firing pins. - - rscadd: The SABR and Stun Revolver recipes have been removed from RnD - coiax: - - rscadd: Laughter demons are like slaughter demons, but they tickle people to death - - tweak: Slaughter demons are no longer able to cast spells while phased. - - tweak: Wizards can now speak while ethereal, but still cannot cast spells while - ethereal. - - rscadd: 'Centcom''s "drone expert" reports that drones vision filters have been - upgraded to include the option of making all beings appear as harmless animals. - info: As always, all drone filters are togglable.' - - rscadd: As a sign of friendship between the Free Golems and Centcom, they have - modified Centcom's jaunter to be worn around a user's waist, which will save - them from falling to their death in a chasm. - - experiment: The Golems warn that these modifications have created a risk of accidental - activation when exposed to heavy electromagnetic fields. - - tweak: Renamed hivelord stabilizer to stabilizing serum. - - rscadd: Centcom regret to inform you that new instabilities with nearby gas giants - are causing exospheric bubbles to affect the telecommunications processors. - Please contact your supervisor for further instructions. - - rscadd: The Janitor's Union has mandated additional features to station light - replacer devices. - - rscadd: The light replacer now can be used on the floor to replace the bulbs of - any lights on that tile. - - rscadd: The light replacer now eats replaced bulbs, and after a certain number - of bulb fragments (four) will recycle them into a new bulb. - - tweak: The description of the light replacer is now more informative. - - rscadd: Clown mask appearance toggle now has an action button. -2016-04-26: - Iamgoofball & Super Aggro Crag: - - tweak: Fluorosulfuric Acid now has doubled acid power. - - experiment: Fluorosulfuric Acid now does BONUS burn damage scaling on the time - it's been inside the consumer. - Joan: - - tweak: Blobbernauts now spawn at half health. - - tweak: Blobbernauts regeneration on blob is now 2.5 health per tick, from 5. - - tweak: Blobbernauts now cost 40 resources to produce, from 30. - - rscdel: Factories supporting blobbernauts do not spawn spores. - Lati: - - tweak: Syndicate bomb can be only delayed once by pulsing the delay wire. Time - gained from this is changed from 10 seconds to 30 seconds. - TechnoAlchemisto: - - tweak: Goliath plates can now be stacked. - phil235: - - rscadd: More structures and machines are now breakable and/or destroyable with - melee weapon. Additionally, Some structures and machines that are already breakable/destroyable - are now affected by more attack methods (gun projectiles, thrown items, melee - weapons, xeno/animal attacks, explosions). - - rscadd: Hitting any machine now always makes a sound. - - rscadd: You can hit closed closets/crates and doors by using an item on harm intent - (but it doesn't actually hurt them). - - rscadd: you can now burst filled water balloons with sharp items. - - bugfix: Wooden barricade drops wood when destroyed. - - bugfix: Slot machines with coins inside are deconstructable now. -2016-04-27: - TechnoAlchemisto: - - rscadd: Miners can now select explorer belts from the mining vendor using their - vouchers, or mining points. -2016-04-28: - Bawhoppen: - - tweak: Sandbags are no longer tablecrafted. Now you just put in sand (or ash) - by hand to make them. - - rscadd: Miners and Engis now get boxes of empty sandbags in their lockers. Miners - also get a few premade aswell. - - rscadd: You can now break sandstone down into normal sand. - Joan: - - rscadd: Attacking a blob with an analyzer will tell you what its chemical does, - its health, and a small fact about the blob analyzed. - - rscdel: 'NERFS:' - - tweak: Zombifying Feelers does less toxin damage. - - tweak: Adaptive Nexuses does slightly less brute damage. - - tweak: Replicating Foam does slightly less brute damage. - - tweak: Blob Sorium does slightly less brute damage. - - tweak: Blob Dark Matter does slightly less brute damage. - - tweak: Cyrogenic Liquid injects slightly less frost oil and ice and does slightly - less stamina damage. - - tweak: Pressurized Slime does less brute, oxygen, and stamina damage, and extinguishes - objects and people on turfs it wets. - - rscdel: Blob core strong blobs no longer give points when removed. - - wip: 'PROBABLY BUFFS:' - - tweak: Flammable Goo now does slightly more burn damage and applies more firestacks, - but applies fire to blob tiles that don't share its chemical. - - tweak: Energized Fibers does slightly more burn damage, slightly less stamina - damage, and now takes damage from EMPs. - - rscadd: 'BUFFS:' - - tweak: Boiling Oil does slightly more burn damage and applies more firestacks. - - tweak: Reactive Gelatin does slightly more damage on average. - - tweak: Penetrating Spines now also ignores bio resistance in addition to armor. - - tweak: Hallucinogenic Nectar causes more hallucinations. - - tweak: Normal strong blobs now refund 4 points when removed, from 2. - - rscadd: Charger holoparasites now play a sound when hitting a target, as well - as shaking the target's camera. - PKPenguin321: - - rscadd: The warden's locker now contains krav maga gloves. - TechnoAlchemisto: - - rscadd: You can now craft skull helmets from bones. - - rscadd: Syndicate bombs are now harder to detect -2016-04-29: - Bawhoppen: - - rscadd: Several lesser-used uplink's TC cost have been rebalanced. - - tweak: Steckhin down from 9TC to 7TC. - - tweak: Tactical medkit down from 9TC to 4TC. - - tweak: Syndicate magboots from 3TC to 2TC. - - tweak: Powersinks down from 10TC to 6TC. - - tweak: Stealth rad-laser down from 5TC to 3TC. - - tweak: Bundles have been updated accordingly. - Incoming5643: - - rscadd: The staff/wand of door creation can now also be used to open airlock doors. - - rscadd: Doors spawned by the staff/wand now start open. Keep this in mind the - next time you try to turn every wall on the escape shuttle into a door. - Robustin: - - rscdel: The Teleport Other, Veil, Imbue, Reveal, Disguise, Blood Drain, Timestop, - Stun, Deafen, Blind, Armaments, Construct Shell and Summon Tome runes are gone. - - rscadd: Disguise, Veil/Reveal, Construct Shell and Armaments are now talismans. - The Construction talisman requires 25 sheets of metal. - - rscadd: Cultists will now receive a warning when attempting to use emergency communion - or create the Nar-Sie rune - - rscadd: Cultists can now create talismans with a super-simple Talisman-Creation - rune. It takes about 10 seconds to invoke and will present a menu of all the - talisman choices available. Its as simple as tossing the paper on, clicking - the rune, and selecting your talisman. - - rscadd: Cultists now have a proc, "How to Play" that will give a basic explanation - of how to succeed as a cultist. - - rscadd: The new Talisman of Horror is a stealthy talisman that will cause hallucinations - in the victim. Great for undermining security without having to commit to murder - them in middle of the hall. - - rscadd: Creating the Summon Nar-Sie rune does takes slightly less time, but now - adds a 3x3 square of red barrier shields (60hp each) to prevent the rune-scriber - from being bumped by other idiots. This works in conjunction with the rune's - warning to give crew a chance to stop the summoning. Manifest ghost has a weaker - 1x1 shield to prevent bumps as well. - - rscadd: Talismans are now color-coded by their effect so you can easily organize - and deploy talismans. - - rscadd: You can now make colored paper in the washing machine using crayons or - stamps, honk. - - rscadd: The Electromagnetic Disruption rune will now scale with the number of - cultists invoking the rune. **A full 9-cultist invocation will EMP the entire - station!** - - rscadd: Armaments will now give the recipient a new cult bola. - - rscadd: The new Talisman of Shackling will apply handcuffs directly to the victim. - These cuffs will disappear when removed. - - tweak: Cult slur is a little less potent so victims might be able to squeeze in - a coherent word or two if you let them keep jabbering on the radio, stun talismans - now have less of a health cost and the stun is back to 10 seconds, from 9. - - tweak: Rune and Talisman names now give a much clearer idea of what they do. - - experiment: The following changes are courtesy of ChangelingRain - - rscadd: The Teleport rune now allows cultists to select which rune to teleport - to, and teleports everything on it. - - rscadd: Veil and Reveal are merged into Talisman of Veiling. Veiling has two uses, - the first use will hide and the second use will reveal. - - rscadd: New icons for the cult bola - - tweak: You can now attack fellow cultists with a Talisman of Arming to arm them - with robes and a sword. - - tweak: You can now only place one rune per tile. - - tweak: Ghosts are notified when a new manifest rune is created. - TechnoAlchemisto: - - rscadd: Sinew can now be fashioned into restraints. - coiax: - - tweak: Internals Crate now contains breath masks and small tanks. - - rscadd: Metal foam grenade box crate added for 1000 points - - rscadd: Added two Engineering Mesons to Engineering Gear Crate - - tweak: Engineering Gear now costs 1300 - - rscadd: Breach Shield Generator Crate added for 2500 points - - rscadd: Grounding Rod Crate added for 1700 points - - rscadd: PACMAN Generator Crate added for 2500 - - rscadd: Defibrillator Crate added for 2500 - - rscadd: Added more helmets to the Laser Tag Crate. - - rscadd: Nanotrasen Customs report that some wide band suppliers have been providing - "alternative" firing pins. Nanotrasen reminds all crewmembers that contraband - is contraband. - - rscadd: Contraband crates now appear visually similar to legitimate crates. - - bugfix: The cargo shuttle's normal transit time has been restored. - nullbear: - - rscadd: Adds a preference option, allowing players to toggle whether recipes with - no matching components should be hidden. -2016-04-30: - Joan: - - rscadd: Blobs attempting to attack the supermatter will instead be eaten by it. - - experiment: This doesn't mean throwing a supermatter shard at the blob is a good - idea; blobs attacking it will gradually damage it, eventually resulting in a - massive explosion, and it will not consume blobs if on a space turf. - - tweak: Hitting a locker or crate with an ID, PDA with ID, or wallet with ID will - try to toggle the lock instead of trying to open it. - - imageadd: Cable coils, cablecuffs, and zipties now all have properly colored inhands. - Kor: - - rscadd: Megafauna have been added to lavaland. - - rscadd: Ash Drakes have been spotted roaming the wastes. Use your GPS to track - their fiery signals. - - rscadd: You can now knock on the Necropolis door, but it's probably best that - you don't. - Mercenaryblue: - - rscadd: Adds a basic paper plane to the game. Fold paper with alt-clicking. - - rscadd: Paper planes are now fully compatible with every stamps on station. - bgobandit: - - rscadd: 'Nanotrasen has released Cards Against Spess! Visit your local library - for a copy. Warning: may cause breakage of the fourth wall.' -2016-05-02: - Joan: - - tweak: Blob spores spawn from factories 2 seconds faster, but the factory goes - on cooldown when any of its spores die. - - experiment: You can examine tomes, soulstones, and construct shells to see what - you can do with them. - - rscadd: Releasing a shade from a soulstone now allows you to reuse that soulstone - for capturing shades or souls, instead of preventing the stone's use forever - if the shade dies. - - imageadd: Runes now actually pulse red on failure. - - rscadd: The Summon Cultist rune no longer includes the cultists invoking it in - the selection menu. - - tweak: Imperfect Communication renamed to Emergency Communication. - - rscdel: You can no longer hide the Nar-Sie rune with a Talisman of Veiling/Revealing. - Kor: - - rscadd: Engineering cyborgs now have internal blueprints. - Lzimann: - - tweak: Automatic nexus placing time changed from 2 to 15 minutes. - - tweak: Prophet's gear(hat and staff) prioritizes the backpack instead of automatically - equipping. - - rscadd: Divine telepathy and prophet to god speak now have a follow button for - ghosts. - - rscadd: Divine telepathy and prophet to god speak now has the god's color. - - bugfix: CTF spawn protection trap is no longer constructable - Mercenaryblue: - - tweak: Drastically reduced the chances of eye damage when throwing a paper plane. - RandomMarine: - - tweak: Medical HUDs improved. To better prioritize patients, subjects deep into - critical condition have a blinking red outline around the entire HUD icon, and - will blink more rapidly when very close to death. - TechnoAlchemisto: - - tweak: Security uniforms have been made more professional, and more tactical. - TrustyGun: - - rscadd: By crafting together a legion skull, a goliath steak, ketchup, and capsaicin - oil, you can create Stuffed Legion! Be careful, it's hot. - coiax: - - rscadd: Centcom Department of [REDACTED] have announced a change of supplier of - [EXPLETIVE DELETED]. As such, for security reasons, the absinthe [MOVE ALONG - CITIZEN] will instead be [NOTHING TO SEE HERE]. We hope that this will not affect - the performance of the [INFORMATION ABOVE YOUR SECURITY CLEARANCE]. - nullbear: - - rscadd: A reminder for crew to avoid mopping floors in cold rooms, as the water - will freeze and provide a dangerous slipping hazard known as 'ice'. Running - on it is not recommended. - - rscadd: Frostoil is an effective chemical for rapidly cooling areas in the event - of a fire. - - rscadd: Added X4, a breaching charge more destructive than C4, it can be purchased - from uplinks. - - rscadd: C4 can be used with assemblies. - - bugfix: Fixes chembomb recipe to use any matter bin. Again. - - bugfix: ARG's disappear once finished reacting. -2016-05-03: - coiax, Robustin: - - tweak: Changeling Fleshmend is much less effective when used repeatedly in a short - time. Changeling Panacea is much more effective at purging reagents, reducing - radiation and now reduces braindamage. -2016-05-04: - Fox McCloud: - - tweak: shock revolver projectiles are now energy instead of bullets - Joan: - - rscdel: Cultists no longer communicate via tomes. - - rscadd: Cultists now communicate via the 'Communion' action button. - - rscadd: Examining the blob with an active research scanner or medical hud will - display effects, akin to hitting it with an analyzer. - - rscadd: Improved medical HUDs to work on all living creatures. - - rscadd: Drones and swarmers, being machines, require a diagnostic HUD for analysis - instead. - TechnoAlchemist: - - rscadd: You can now craft cloaks from the scales of fallen ash drakes, look for - the recipe in tablecrafting! - coiax: - - rscadd: The Service and the Standard cyborg module now have a spraycan built in, - for hijinks and passing on important urban messages. The Service cyborg module - also has a cyborg-hand labeler, in case anything needs to be labelled. - - rscadd: 'Centcom Suicide Prevention wishes to remind the station: Please do not - kill yourself with a hand labeler.' - xxalpha: - - bugfix: Fixed the mk-honk prototype shoes. -2016-05-05: - Joan: - - tweak: Revenants are slower while revealed. - - rscdel: Revenants can no longer cast inside dense objects. - - tweak: Lying down will cure Blight much, much faster. - \"Macho Man\" Randy Savage: - - rscadd: OOOHHH YEAAAAHHHH - - rscadd: SNAP INTO A JLIM SIM WITH THE ALL NEW WRESTLING BELT - - rscadd: YOU CAN FREAKOUT YOUR OPPONENTS WITH THE 5 HOT MOVES ON THIS BELT YEAH - - rscadd: PRAY TO THE LOCAL SPACE GODS TO EXCHANGE YOUR TELECRYSTALS TO ENSURE THE - CREAM RISES TO THE TOP -2016-05-07: - Robustin: - - rscadd: A small pantry has been added to SW maintenance. - nullbear: - - rscadd: Makes Shift+Middleclick the hotkey for pointing. - phil235: - - rscadd: DISMEMBERMENT! Humans can now lose their bodyparts. Explosions and being - attacked with a heavy sharp item on a specific bodypart can cause dismemberment. - - rscadd: You can't be handcuffed or legcuffed if you're missing an arm or leg. - You can't use items when you have no legs, your arms are too busy helping you - crawl, unless your are buckled to a chair. You're slower when missing a leg. - - rscadd: You lose organs and items if the bodypart they are inside gets cut off. - You can always retrieve them by cutting the dropped bodypart with a sharp object. - - rscadd: Medbay can replace your missing limbs with robotic parts via surgery, - or amputate you. - - rscadd: Changelings do not die when decapitated! They can regrow all their limbs - with Fleshmend, or just one arm with Arm Blade or Organic Shield. - - rscadd: Your chest cannot be dropped, but it will spill its organs onto the ground - when dismembered. -2016-05-08: - CoreOverload: - - rscadd: You can now de-power inactive swarmers with a screwdriver to prevent them - from activating. - - rscadd: Recycle depowered swarmers in autolathe or sell them in cargo! - Joan: - - rscadd: Cultist constructs, and shades, can now invoke runes by clicking them. - - rscdel: This does not include Manifest Ghost, Blood Boil, or Astral Journey runes. - - rscadd: Medical huds will now show parasites in dead creatures. - KorPhaeron: - - rscadd: Burn weapons can now dismember, and they reduce the limb to ash in the - process - - rscadd: Weapons with high AP values will now dismember limbs much easier. These - values are subject to change depending on how things play out over the next - week or two. - - rscadd: Various weapons with high AP values had them lowered (chaplain scythe, - energy sword, dualsaber) to prevent them taking limbs off in a single hit. - - rscadd: The chaplain has two new weapons (they are mechanically identical to previous - weapons, before anyone gets upset about balance). One is dismemberment themed, - the other is related to a new antagonist. - Mercenaryblue: - - rscadd: Throwing a Banana Cream Pie will now knock down and cream the target's - face. - - rscadd: You can clean off the cream with the usual methods, such as soap, shower, - cleaner spray, etc. - - rscadd: The Clown Federation would like to remind the crew that the HoS is worth - double points! Honk! - Robustin: - - experiment: There are rumors that the Cult's 'Talisman of Construction', which - turns ordinary metal for construct shells, can be used on plasteel to create - structures. If the stories are true, the cult has been producing relics of incredible - power through this transmutation. - coiax: - - rscadd: To save credits, Centcom has subcontracted out emergency shuttle design - to third parties. Rest assured, all of these produced shuttles meet our stringent - quality control. - - tweak: Lavaland ruins spawning chances have been modified. Expect to see more - smaller and less round affecting ruins, and no duplicates of major ruins, like - ash walkers or golems. - lordpidey: - - rscadd: Infernal devils have been seen onboard our spacestations, offering great - boons in exchange for souls. - - rscadd: Employees are reminded that their souls already belong to nanotrasen. If - you have sold your soul in error, a lawyer or head of personnel can help return - your soul to Nanotrasen by hitting you with your employment contract. - - rscadd: Nanotrasen headquarters will be bluespacing employment contracts into - the Lawyer's office filing cabinet when a new arrival reaches the station. It - is recommended that the lawyer create copies of some of these for safe keeping. - - rscadd: Due to the recent infernal incursions, the station library has been equipped - with a Codex Gigas to help research infernal weaknesses. Please note that reading - this book may have unintended side effects. Also note, you must spell the devil's - name exactly, as there are countless demons with similar names. - - rscadd: When a devil dies, if the proper banishment ritual is not performed on - it's remains, the devil will revive itself at the cost of some of it's power. The - banishment ritual is described in the Codex Gigas. - - rscadd: When a demon gains enough souls, It's form will mutate to a more demonic - looking form. The Arch-demon form is known to be on par with an ascended shadowling - in power. -2016-05-09: - Joan: - - tweak: Sporing Pods produces spores when expanding slightly more often. - - tweak: Replicating Foam now only expands when hit with burn damage, from all damage, - but does so at a higher chance. Free expansion from it is, however, more rare. - - tweak: Penetrating Spines does slightly more brute damage, and Poisonous Strands - does its damage 50% faster. - KorPhaeron: - - rscadd: The AI no longer has a tracking delay because artificial lag is the most - miserable thing in the world. - Razharas: - - tweak: crafting can now be done everywhere, little button near the intents with - hammer on it(its not T) opens the crafting menu, if you are in a locker or mech - only things in your hands will be considered for crafting - coiax: - - tweak: Skeletons now have bone "tongues" -2016-05-11: - Joan: - - rscadd: Shades can move in space. - - rscadd: Artificers can now heal shades. - coiax: - - tweak: Added action button to chameleon stamp - - rscadd: Added APPROVED and DENIED stamps to Bureaucracy Crate - - rscadd: Added the cream pie closet to various maps. Added contraband Cream Pie - Crate to Cargo. - pudl: - - rscadd: The armory has been redesigned. -2016-05-12: - Shadowlight and coiax: - - rscdel: Due to numerous reports of teams using human weapons instead of stealth - when carrying out their assignments, future teams have been genetically modified - to only be able to use their assigned blaster and are unable to use human weapons. -2016-05-13: - Joan: - - rscadd: Cultists can now unanchor and reanchor cult structures by hitting them - with a tome. Unanchored cult structures don't do anything. - KorPhaeron: - - rscadd: Drake attacks are now much easier to avoid. - - rscadd: Player controlled drakes can now consume bodies to heal, and alt+click - targets to divebomb them. - TechnoAlchemisto: - - rscadd: More items have been added to the mining vendor, check them out! -2016-05-14: - Cruix: - - bugfix: Fixed foam darts with the safety cap removed being reset when fired. - - rscadd: Added the ability to remove pens from foam darts. - - bugfix: Foam darts with pens inside them are no longer destroyed when fired. - - bugfix: Foam darts no longer drop two darts when fired at a person on a janicart. - Joan: - - rscdel: The Raise Dead rune no longer accepts dead cultists as a sacrifice to - raise the dead. - Metacide: - - rscadd: 'A small update for MetaStation, changes include:' - - rscadd: Added extra grounding rods to the engine area to stop camera destruction. - - rscadd: Added canvases and extra crayons to art storage and some easels to maint. - - rscadd: Added formal security uniform crate for parades to the warden's gear area. - - rscadd: The armory securitron now starts active. - - rscadd: The genetics APC now starts unlocked. - - rscadd: Other minor changes and fixes as detailed on the wiki page. - coiax, Nienhaus: - - rscdel: Unfortunately, the Belowyarn toys have been withdrawn from distribution - due to Assistants choking on the batteries. Centcom has sent their condolences - to the battery manufacturing plant. - - rscadd: We are introducing Oh-cee the original content skeleton figurines. Pull - its string, and hear it say a variety of phrases. Not suitable for infants or - assistants under 36 months. - - tweak: Note that pulling the string of all talking toys is now visible to others. - - rscadd: Talking toys produce a lot more chatter than they did before. So do some - skeleton "tongues". - pudl: - - rscadd: Adds normal security headsets to security lockers - xxalpha: - - bugfix: Fixed drone dispenser multiplying glass or metal. -2016-05-15: - Iamgoofball: - - rscadd: Nanotrasen is short on cash, and are now borrowing escape shuttles from - other stations, and Space Apartments. - Mercenaryblue: - - rscadd: Turns out a bike horn made with Bananium is flipping awesome! Honk! -2016-05-18: - Cruix: - - bugfix: unwrapping an item with telekinesis no longer teleports the item into - your hand. - Metacide: - - rscadd: 'MetaStation: the library and chapel have had windows removed to make - them feel more isolated.' - MrStonedOne: - - tweak: Tesla has been rebalanced. - - tweak: It should now lose balls slower, increase balls faster, and be a bit more - aggressive about finding nearby grounding rods. - - tweak: additional zaps from it's orbiting balls should be a bit more varied, but - a touch less powerful. - Robustin: - - rscadd: Lings have a new default ability, Hivemind Link. This lets you bring a - neck-grabbed victim into hivemind communications after short period of time. - You can talk to victims who are in crit/muted and perhaps persuade them to help - you, give you intel, or even a PDA code. The link will stabilize crit victims - to help ensure they do not die during the link. - Shadowlight213: - - bugfix: Cleanbot and floorbot scanning has greatly improved. they should prioritize - areas next to them, as well as resolve themselves stacking on the same tiles. - coiax: - - rscadd: Kinetic accelerators only require one hand to be fired, as before - - rscdel: Kinetic accelerators recharge time is multiplied by the number of KAs - that person is carrying. - - rscdel: Kinetic accelerators lose their charge quickly if not equipped or being - held - - rscadd: Kinetic accelerator modkits (made at R&D or your local Free Golem ship) - overcome these flaws -2016-05-19: - Razharas: - - rscadd: HE pipes once again work in space and in lava. - - rscadd: Space cools down station air again -2016-05-20: - KorPhaeron: - - rscadd: The HoS now has a pinpointer, the Warden now has his door remote. - bgobandit: - - rscadd: Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you - will use it responsibly. - - rscadd: BZ causes hallucinations once breathed in and, at high doses, has a chance - of doing brain damage. - - rscadd: BZ is known to cause unusual stasis-like behavior in the slime species. - coiax: - - rscadd: Neurotoxin spit can be used as makeshift space propulsion -2016-05-21: - Iamsaltball: - - rscadd: Heads of Staff now have basic Maint. access. - NicholasM10: - - rscadd: The chef can now make Khinkali and Khachapuri - coiax: - - rscdel: NOBREATH species (golems, skeletons, abductors, ash walkers, zombies) - no longer have or require lungs. They no longer take suffocation/oxyloss damage, - cannot give CPR and cannot benefit from CPR. Instead of suffocation damage, - during crit they take gradual brute damage. - - rscdel: NOBLOOD (golems, skeletons, abductors, slimepeople, plasmamen) species - no longer have or require hearts. - - tweak: NOBREATH species that require hearts still take damage from heart attacks, - as their tissues die and the lack of circulation causes toxins to build up. - - rscdel: NOHUNGER (plasmamen, skeletons) species no longer have appendixes. - coiax, OPDingo: - - tweak: Renamed and reskinned legion's heart to legion's soul to avoid confusion; - it is not a substitute heart, it is a supplemental chest organ. - - rscadd: Legion's souls are now more obviously inert when becoming inert. - nullbear: - - tweak: Wetness updates less often. - - rscadd: Wetness now stacks. Spraying lube over a tile that already has lube, will - make the lube take longer to dry. Likewise, dumping 100 units of lube will take - longer to dry than if only 10 units were dumped. (lube used to last just as - long, regardless of whether it was 1u, or 100u) There is a limit, however, and - you can't stack infinite lube. - - tweak: Hotter temperatures cause water to evaporate more quickly. At 100C, water - will boil away instantly. - - rscadd: About 5 seconds of wetness are removed from a tile for each unit of drying - agent. Absorbant Galoshes remain the most effective method of drying, and dry - tiles instantly regardless of wetness. -2016-05-22: - coiax: - - rscdel: Lavaland monsters now give ruins a wide berth. - - bugfix: Glass tables now break when people are pushed onto them. -2016-05-23: - CoreOverload: - - rscadd: New cyberimplant, "Toolset Arm", is now available in RnD. - coiax, OPDingo: - - rscadd: Crayons and spraycans are now easier to use. - - rscdel: Centcom announce due to budget cuts their supplier of rainbow crayons - has been forced to use more... exotic chemicals. Please do not ingest your standard - issue crayon. - kevinz000: - - rscadd: 'Peacekeeper borgs: Security borgs but without any stuns or restraints! - Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector - that confuses living things, and a weak holobarrier projector! It also comes - with the ability to hug.' - - rscadd: 'Cookie Synthesizer: Self recharging RCD that prints out cookies!' - - tweak: Nanotrasen scientists have added a hugging module to medical and peacekeeper - cyborgs to boost emotions during human-cyborg interaction. -2016-05-24: - Joan: - - rscdel: You can no longer scribe the Summon Nar-Sie rune under non-valid conditions. - Kiazusho: - - rscadd: Added three new advanced syringes to R&D -2016-05-26: - Xhuis: - - rscadd: Purge all untruths and honor Ratvar. - coiax: - - bugfix: Fixes bug where bolt of change to the host would kill an attached guardian. - - bugfix: Fixes bug where bolt of change to laughter demon would not release its - friends. - - bugfix: Fixes bug where bolt of change to morphling would not release its contents. - - bugfix: Fixes bug where bolt of change transforming someone into a drone would - not give them hacked laws and vision. - - bugfix: Blobbernauts created by a staff of change are now "independent" and will - not decay if seperated from a blob or missing a factory. - - rscadd: Independent blobbernauts added to gold slime core spawn pool. - - rscadd: Medical scanners now inform the user if the dead subject is within the - (currently) 120 second defib window. - - rscadd: Ghosts now have the "Restore Character Name" verb, which will set their - ghost appearance and dead chat name to their character preferences. - - bugfix: Mob spawners now give any generated names to the mind of the spawned mob, - meaning ghosts will have the name they had in life. - - bugfix: Fixes interaction with envy's knife and lavaland spawns. - - bugfix: Fixes a bug where swarmers teleporting humans would incorrectly display - a visible message about restraints breaking. - - rscdel: Emagging the emergency shuttle computer with less than ten seconds until - launch no longer gives additional time. - - rscadd: The emergency shuttle computer now reads the ID in your ID slot, rather - than your hand. -2016-05-27: - coiax: - - rscdel: Gatling gun removed from R&D for pressing ceremonial reasons. - phil235: - - tweak: Pull and Grab are merged together. Pulling stays unchanged. Using an empty - hand with grab intent on a mob will pull them. Using an empty hand with grab - intent on a mob that you're already pulling will try to upgrade your grip to - aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but - they act exactly like a handcuff, preventing you from using your hands until - you escape the grip. You can break free from the grip by trying to move or using - the resist button. - - tweak: Someone pulling a restrained mob now swap position with them instead of - getting blocked by the mob, unable to even push them. -2016-05-29: - GunHog: - - rscadd: The CE, RD, and CMO have been issued megaphones. - Paprika, Crystalwarrior, Korphaeron and Bawhoppen: - - rscadd: Pixel projectiles. This is easier to see than explain, so go fire a weapon. - Xhuis: - - rscadd: Ratvar and Nar-Sie now actively seek each other out if they both exist. - - tweak: Celestial gateway animations have been twweaked. - - tweak: Ratvar now has a new sound and message upon spawning. - - tweak: Ratvar now only moves one tile at a time. - - bugfix: The celestial gateway now takes an unreasonably long amount of time. - - bugfix: God clashing is now much more likely to work properly. - - bugfix: Function Call now works as intended. - - bugfix: Break Will now works as intended. - - bugfix: Holy water now properly deconverts servants of Ratvar. - - bugfix: Deconverted servants of Ratvar are no longer considered servants. - pudl: - - rscadd: Chemicals should now have color, instead of just being pink. -2016-05-30: - coiax: - - rscadd: A new Shuttle Manipulator verb has been added for quick access to probably - the best and most mostly bugfree feature on /tg/. - - rscadd: Spectral sword is now a point of interest for ghosts. - - bugfix: Clicking the spectral sword action now orbits the sword, instead of just - teleporting to its location. - - bugfix: Gang tags can again be sprayed over. - - bugfix: Fixes bug where the wisp was unable to be recalled to the lantern. - xxalpha: - - rscdel: Engineering, CE and Atmos hardsuits no longer have in-built jetpacks. -2016-05-31: - CoreOverload: - - rscadd: 'Cleanbot software was updated to version 1.2, improving pathfinding and - adding two new cleaning options: "Clean Trash" and "Exterminate Pests".' - - experiment: New cleaning options are still experimental and disabled by default. - Kiazusho: - - bugfix: Changeling organic suit and chitin armor can be toggled off once again. - Kor: - - rscadd: The Japanese Animes button is back, - - rscadd: 'The chaplain has three new weapons: The possessed blade, the extra-dimensional - blade, and the nautical energy sword. The former has a new power, the latter - two are normal sword reskins.' - - rscadd: The chapel mass driver has been buffed. - coiax: - - rscdel: Zombies can no longer be butchered - - rscadd: If you encounter an infectious zombie, be cautious, its claws will infect - you, and on death you will rise with them. If you manage to kill the beast, - you can remove the corruption from its brain via surgery, or just chop off the - head to stop it coming back. - - rscadd: Adds some stock computers and lavaland to Birdboat Station. - - bugfix: Free Golem scientists have proved that as beings made out of stone, golems - are immune to all electrical discharges, including the tesla. - - rscadd: Nuclear bombs are now points of interest. Never miss a borg steal a nuke - from the syndicate shuttle again! - - rscadd: Alt-clicking a spraycan toggles the cap. -2016-06-01: - coiax: - - rscadd: Added a mirror to the beach biodome. Beach Bums, rejoyce! - pudl: - - rscadd: The brig infirmary has received a redesign. -2016-06-02: - Joan: - - tweak: Closed false walls will block air. - Lati: - - rscadd: R&D required levels and origin tech levels have been rebalanced - - experiment: Overall, items buildable in R&D have lower tech levels and items in - other departments have their tech levels raised. Remember to use science goggles - to see tech levels of items! - - tweak: There are now level gates at high levels. R&D scientists will need help - from others to get past these level gates. - - tweak: Other departments such as hydroponics and genetics will be important to - R&D's progress now and xenobio, mining and cargo are more important than before - - tweak: Efficiency upgrades are back in R&D machines and tweaked to be less powerful - in autolathes - - rscdel: Reliability has been removed from all items - - bugfix: Most bugs in R&D machines should be fixed - PKPenguin321 & Nienhaus: - - rscadd: Letterman jackets are now available from the ClothesMate. - Quiltyquilty: - - rscadd: The bar has seen a redesign. - coiax: - - rscadd: Clone pods now notify the medical channel on a successful clone. They - also notify the medical channel if the clone dies or is horribly mutilated; - but not if it is ejected early by authorised medical personnel. - - rscadd: Cloning pods now are more capable of cloning humanoid species that do - not breathe. - - bugfix: You can only be damaged once by a shuttle's arrival. It is still unpleasant - to be in the path of one though; try to avoid it. - - rscadd: Adds Asteroid emergency shuttle to shuttle templates. It is a very oddly - shaped one though, it might not be compatible with all stations. - - rscdel: The Chaplain soulshard can only turn a body into a shade once. A released - shade can still be reabsorbed by the stone to heal it. - - rscadd: The shuttle manipulator now has a Fast Travel button, for those admins - that really want a shuttle to get to where its going FAST. -2016-06-04: - MrStonedOne: - - bugfix: fixes see_darkness improperly hiding ghosts in certain cases. - Xhuis: - - tweak: Clockwork marauders can now smash walls and tables. - - tweak: Servants are no longer turned into harvesters by Nar-Sie but instead take - heavy brute damage and begin to bleed. Similarly, cultists are no longer converted - by Ratvar but instead take heavy fire damage and are set ablaze. - - rscadd: Added clockwork reclaimers. Ghosts can now click on Ratvar to become clockwork - reclaimers - small constructs capable of forcefully converting those that still - resist Ratvar's reign. Alt-clicking a valid target will allow the reclaimer - to leap onto the head of any non-servant, latching onto their head and converting - the target if they are able. The target will be outfitted with an unremovable, - acid-proof hat version of the reclaimer. The reclaimer will be able to speak - as normal and attack its host and anything nearby. If the reclaimer's host goes - unconscious or dies, it will leap free. - - rscadd: Added pinion airlocks. These airlocks can only be opened by servants and - conventional deconstruction will not work on them. They can be created by proselytizing - a normal airlock or from Ratvar. - - rscadd: Added ratvarian windows. They are created when Ratvar twists the form - of a normal window, and there are both single-direction and full-tile variants. - - bugfix: Non-servants can no longer use clockwork proselytizers or mending motors. - - bugfix: Servants are now deconverted properly. - coiax: - - bugfix: The cloning pod now sounds robotic on the radio. - - rscadd: For extra observer drama, ghosts can now visibly see the countdown of - syndicate bombs, nuclear devices, cloning pods, gang dominators and AI doomsday - devices. -2016-06-05: - Joan: - - rscadd: Clockwork structures can be damaged by projectiles and simple animals, - and will actually drop debris when destroyed. - - rscadd: AIs and Cyborgs that serve Ratvar can control clockwork airlocks and clockwork - windoors. - - rscadd: The clockwork proselytizer can now proselytize windows, doors, grilles, - and windoors. - - rscadd: The clockwork proselytizer can proselytize wall gears and alloy shards - to produce replicant alloy. It can also proselytize replicant alloy to refill, - in addition to refilling by attacking it with alloy. - - rscadd: The clockwork proselytizer can replace clockwork floors with clockwork - walls and vice versa. - - rscadd: Ratvar will convert windoors, tables, and computers in addition to everything - else. - - tweak: Ratvar now moves around much faster. - - rscadd: Ratvar and Nar-Sie will break each other's objects. - - tweak: The blind eye from a broken ocular warden now serves as a belligerent eye - instead of as replicant alloy. The pinion lock from a deconstructed clockwork - airlock now serves as a vanguard cogwheel instead of as replicant alloy. - - rscadd: Clockwork walls drop a wall gear when removed by a welding tool. The wall - gear is dense, but can be climbed over or unwrenched, and drops alloy shards - when broken. Clockwork walls drop alloy shards when broken by other means. - - bugfix: Fixed Nar-Sie wandering while battling Ratvar. - - bugfix: Ratvarian Spears now last for the proper 5 minute duration. - - bugfix: Servant communication now has ghost follow links. - - imageadd: New sigil sprites, courtesy Skowron. - - imageadd: Sigils of Transgression have a visual effect when stunning a target. - - imageadd: Clockwork spears now have a visual effect when breaking. - PKPenguin321: - - rscadd: The CMO's medical HUD implant now comes with a one-use autoimplanter for - ease of use. - RemieRichards: - - rscadd: Slimes may now be ordered to attack! You must be VERY good friends with - the slime(s) to give this command, asking them to attack their friends or other - slimes will result in them liking you less so be careful! - X-TheDark: - - rscadd: Mech battery replacement improved. The inserted battery's charge will - be set to the same percentage of the removed one's (or 10%, if removed one's - was less). - coiax: - - bugfix: Clicking the (F) link when an AI talks in binary chat will follow its - camera eye, the same as when (F) is clicked for its radio chat. - - bugfix: Laughter demons should now always let their friends go when asked correctly. - - rscadd: Cloning pods now grab the clone's mind when the body is ejected, rather - than when it starts cloning. - - rscadd: Wizards have been experimenting with summoning the slightly less lethal - "laughter demon". Please be aware that these demons appear to be nearly as dangerous - as their slaughter cousins. But adorable, nonetheless. - kevinz000: - - rscadd: Gravity Guns! It is a mildly expensive R&D gun that has a 5 second cooldown - between shots, but doesn't need to be recharged. It has two modes, attract and - repulse. For all your gravity-manipulation needs! -2016-06-07: - Bobylein: - - rscadd: Nanotrasen is finally able to source transparent bottles for chemistry. - Iamgoofball: - - experiment: The Greytide Virus got some teeth. - Joan: - - wip: This is a bunch of Clockwork Cult changes. - - rscadd: Added the Clockwork Obelisk, an Application scripture that produces a - clockwork obelisk, which can Hierophant Broadcast a large message to all servants - or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious - servant or clockwork obelisk. - - wip: Spatial Gateways of any source have doubled uses and duration when the target - is a clockwork obelisk. - - rscadd: Added the Mania Motor, an Application scripture that produces a mania - motor, which, while active, causes hallucinations and brain damage in all nearby - humans. - - wip: The Mania Motor will try to convert any non-servant human directly adjacent - to it at an additional power cost and will remove brain damage, hallucinations, - and the druggy effect from servants. - - rscadd: Added the Vitality Matrix, an Application scripture that produces a sigil - that will slowly drain health from non-servants that remain on it. Servants - that remain on the sigil will instead be healed with the vitality drained from - non-servants. - - wip: The Vitality Matrix can revive dead servants for a cost of 25 vitality plus - all non-oxygen damage the servant has. If it cannot immediately revive a servant, - it will still heal their corpse. - - experiment: Most clockwork structures, including the Mending Motor, Interdiction - Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power - to function. - - wip: Mending Motors can still use alloy for power. - - tweak: The Sigil of Transmission has been remade into a power battery and will - power directly adjecent clockwork structures. Sigils of Transmission start off - with 4000 power and can be recharged with Volt Void. - - tweak: Volt Void drains somewhat more power, but will not damage the invoker unless - they drain too much power. Invokers with augmented limbs will instead have those - limbs healed unless they drain especially massive amounts of power. - - wip: Using Volt Void on top of a Sigil of Transmission will transfer most of the - power drained to the Sigil of Transmission, effectively making it far less likely - to damage the invoker. - - rscdel: You can no longer stack most sigils and clockwork objects with themself. - You can still have multiple different objects or sigils on a tile, however. - - tweak: The Break Will Script has been renamed to Dementia Doctrine, is slightly - faster, and causes slightly more brain damage. - - tweak: The Judicial Visor now uses an action button instead of alt-click. Cultists - of Nar-Sie judged by the visor will be stunned for half duration, but will be - set on fire. - - tweak: Multiple scriptures have had their component requirements changed. The - Summon Judicial Visor Script has been reduced from a Script to a Driver. - - rscadd: Recollection will now show both required and consumed components. - - tweak: Clockwork Marauders can now emerge from their host if their host is at - or below 60% total health(for humans, this is 20 health out of crit) - - tweak: Clockwork Marauders will slowly heal if directly adjacent to their host - and have a slightly larger threshold for their no-Fatigue bonus damage. - Quiltyquilty: - - rscadd: Botany, atmospherics and cargo now all have access to high-capacity watertanks. - - rscadd: The bar has now been outfitted with custom bar stools. - Xhuis: - - rscdel: Removed the global message played when Nar-Sie _begins_ to spawn (but - not when it actually spawns). - - tweak: Drunkenness recovery speed now increases with how drunk the imbiber is - and is much quicker when the imbiber is asleep. - - tweak: Suit storage units now take three seconds to enter (up from one) and have - different sounds and messages for UV ray cauterization. - - bugfix: Fixed some bugs with the suit storage unit, inserting mobs, and contents - to seemed to duplicate themselves. - - bugfix: The Summon Nar-Sie rune can now only be drawn on original station tiles - and fails to invoke if scribed on the station then moved elsewhere. - coiax: - - rscdel: Bluespace shelter capsules can no longer be used on shuttles. - - rscadd: Bluespace shelters may have different capsules stored. View what your - capsule has inside by examining it. - - rscdel: The Nar'sie rune cannot be scribed on shuttles or off Z-level. - - rscadd: The Raise Dead rune automatically grabs the ghost of the raised corpse. - - rscadd: Deadchat is now notified when a sentient mob dies. - phil235: - - rscadd: Monkeys and all other animals that should have blood now has it. Beating - them up will make you and your weapon bloody, just like beating a human does. - Dragging them when wounded and lying will leave a blood trail. Their blood is - still mostly cosmetic, they suffer no effects from low blood level, unlike humans. - - rscadd: When a mob leaves a blood trail while dragged, it loses blood. You can - no longer drag a corpse to make an inifinite amount of blood trails, because - once the victim's blood reaches a certain threshold it no longer leaves a blood - trail (and no longer lose any more blood). The threshold depends on how much - damage the mob has taken. You can always avoid hurting the dragged mob by making - them stand up or by buckling them to something or by putting them in a container. - - rscdel: You can no longer empty a mob of its blood entirely with a syringe, once - the mob's blood volume reaches a critically low level you are unable to draw - any more blood from it. - - tweak: A changeling absorbing a human now sucks all their blood. -2016-06-08: - Cruix: - - bugfix: Changelings no longer lose the regenerate ability if they respect while - in regenerative stasis. - Fox McCloud: - - bugfix: Fixes Experimentor critical reactions not working - - bugfix: Fixes Experimentor item cloning not working - - bugfix: Fixes Experimentor producing coffee vending machines instead of coffe - cups - - tweak: Experimentor can only clone critical reaction items instead of anything - with an origin tech - GunHog: - - rscadd: Nanotrasen has approved the Hyper-Kenetic Accelerator upgrade for cyborg - mining modules. - - tweak: Each of the heads' ID computers are now themed for their department! - Joan: - - tweak: Anima Fragments have slightly more health and move faster, but slow down - temporarily when taking damage. Also they can move in space now. - Kor: - - rscadd: The clown will play a sad trombone noise upon death. - - rscadd: Colossi now roam the wastes. - - rscadd: Bubblegum now roams the wastes. - PKPenguin321: - - rscadd: You can now emag chemical dispensers, such as the ones in chemistry or - the bar, to unlock illegal chemicals. - lordpidey: - - tweak: Infernal jaunt has been significantly nerfed with an enter and exit delay. -2016-06-09: - GunHog: - - rscadd: Nanotrasen scientists have completed a design for adapting mining cyborgs - to the Lavaland Wastes in the form of anti-ash storm plating. Research for this - technology must be adapted at your local station. - Joan: - - tweak: Anima Fragments have slightly less health and damage and will slow down - for longer when hit. - Kor: - - rscadd: The captain now spawns with the station charter, which allows him to name - the station. - Papa Bones: - - tweak: Loyalty implants have been refluffed to mindshield implants, they are mechanically - the same. - Xhuis: - - rscadd: You can now remove all plants and weeds from a hydroponics tray by using - a spade on it. - - rscadd: Added meatwheat, a mutated variant of wheat that can be crushed into meat - substitute. - - rscadd: Added ambrosia gaia, a mysterious plant that is rumored to provide nutrients - and water to any soil - hydroponic or otherwise - that it's planted in. - - rscadd: Added cherry bombs, a mutated variant of blue cherries that have an explosively - good taste. Oh, and don't pluck the stems. - coiax: - - tweak: The beacons from support guardians are now structures, rather than replacing - the floor tile. In practice, this will change little, aside from not leaving - empty plating when a beacon is removed because a new one has been placed. - nullbear: - - tweak: Removes the restriction on wormhole jaunters, preventing them from teleporting - you to beacons on other z-levels. - - tweak: No longer able to use beacons to bypass normal shuttle/centcomm anti-bluespace - measures. -2016-06-11: - Joan: - - rscadd: Clockwork Slabs, Clockwork Caches near walls, and Tinkerer's Daemons will - now be more likely to generate components that the clockwork cult has the least - of. - - rscadd: Destroyed Clockwork Caches will drop all Tinkerer's Daemons in them. - - tweak: Clockwork Caches can now only generate a component every 30 seconds(when - near a clockwork wall), Clockwork Slabs can only generate a component every - 40 seconds, and Tinkerer's Daemons can only generate a component every 20 seconds. - This should result in higher component generation for everything except Clockwork - Caches near clockwork walls. - - tweak: Adding a component to a Clockwork Slab instead puts that component in the - global component cache. - - tweak: Clockwork Slabs only generate components if held by a mob or in a mob's - storage, and when generating a component will prevent other Slabs held from - generating a component. - - tweak: The Replicant Driver no longer costs a Replicant Alloy to invoke; basically - you can throw free Slabs at converts. - - rscdel: Clockwork Slabs no longer have Repository as a menu option; instead, you - can examine them to see how many components they have access to. - - rscdel: Clockwork Caches directly on top of clockwork walls won't generate components - from that wall. - Lzimann: - - rscadd: Bar stools are now constructable with metal! - coiax: - - rscadd: Ghosts are notified when someone arrives on the Arrivals Shuttle. This - is independent of the announcement system, and the (F) link will follow the - arrived person. - - tweak: Slimes and aliens with custom names now retain those names when changing - forms. - kevinz000: - - bugfix: Malf AI hacking an APC that is then destroyed will no longer bug the AI - - bugfix: Being turned into a Revolutionary now stuns you for a short while. - - bugfix: Kinetic Accelerators no longer drop their firing pin or cell when destroyed - by lava - phil235: - - rscadd: Firelock assemblies can be reinforced with plasteel to construct heavy - firelocks. -2016-06-12: - Joan: - - rscadd: Attacking a human you are pulling or have grabbed with a ratvarian spear - will impale them, doing massive damage, stunning the target, and breaking the - spear if they remain conscious after being attacked. - - tweak: The Function Call verb is now an action button. - Xhuis: - - rscdel: While experimenting with floral genetic engineering, Nanotrasen botanists - discovered an explosive variety of the cherry plant. Due to gross misuse, the - genes used to produce this strain have been isolated and removed while Central - Command decides how best to modify it. - xxalpha: - - rscadd: 'New wizard spell: Spacetime Distortion.' - - rscadd: 3x1 grafitti -2016-06-13: - Joan: - - tweak: Sigils of Transgression will now only stun for about 5 seconds, from around - 10 seconds. - - tweak: Sigils of Submission take about 5 seconds to convert a target, from around - 3 seconds, and will glow faintly. - - rscadd: Sigils of any type can be attacked with an open hand to destroy them, - instead of requiring harm intent. Servants still require harm intent to do so. - Lati: - - rscadd: Nanotrasen has added one of their rare machine prototypes to cargo's selection. - It might be valuable to research. - Xhuis: - - rscadd: You can now create living cake/cat hybrids through a slightly expensive - crafting recipe. These "caks" are remarkably resilient, quickly regenerating - any brute damage dealt, and can be attacked on harm intent to take a bite to - be fed by a small amount. They serve as mobile sources of food and make great - pets. - - rscadd: If a brain occupied by a player is used in the crafting recipe for caks, - that player then takes control of the cak! -2016-06-14: - Joan: - - tweak: The Gateway to the Celestial Derelict now takes exactly 5 minutes to successfully - summon Ratvar and has 500 health, from 1000. - - rscadd: You can now actually hit people adjacent to the Gateway; only the center - of the Gateway can be attacked. The Gateway is also now dense, allowing you - to more easily shoot at it. - - rscadd: All Scripture in the Clockwork Slab's recital has a simple description. - Razharas: - - rscadd: Wiki now has the method of cultivating kudzu vines that was in game for - over a year. https://tgstation13.org/wiki/Guide_to_hydroponics#Kudzu - kevinz000: - - tweak: Gravity Guns should no longer destroy local reality when set to attract - and shot in an east cardinal direction. Added safety checks has slightly increased - the cost of the gun's fabrication. Nanotrasen apologizes for the inconvenience. - - bugfix: Gravity guns now have an inhand sprite. -2016-06-16: - GunHog: - - rscadd: In response to alarmingly high mining cyborg losses, Nanotrasen has equipped - the units with an internal positioning beacon, as standard within the module. - Joan: - - rscadd: You can now strike a Tinkerer's Cache with a Clockwork Proselytizer to - refill the Proselytizer from the global component cache. - - tweak: The Clockwork Proselytizer requires slightly less alloy to convert windows - and windoors. - - tweak: Several clockwork objects have more useful descriptions, most notably including - structures, which will show a general health level to non-servants and exact - health to servants. - - imageadd: The Clockwork Proselytizer has new, more appropriate inhands. - - tweak: Invoking Inath-Neq, the Resonant Cogwheel, now gives total invulnerability - to all servants in range for 15 seconds instead of buffing maximum health. - - tweak: Impaling a target with a ratvarian spear no longer breaks the spear. - - tweak: Judicial Markers(the things spawned from Ratvar's Flame, in turn spawned - from a Judicial Visor) explode one second faster. - - rscdel: Removed Dementia Doctrine, replacing it with an Application sigil. - - rscadd: Adds the Sigil of Accession, the previously-mentioned Application sigil, - which is much like a Sigil of Submission, except it isn't removed on converting - un-mindshielded targets and will disappear after converting a mindshielded target. - - tweak: Sigil of Submission is now a Script instead of a Driver; It's unlocked - one tier up, so you have to rely on the Drivers you have until you get Scripts, - instead of spamming both Driver sigils for free converts. - - rscadd: To replace Sigil of Submission in the Driver tier; Added Taunting Tirade, - which is a chanted scripture with a very fast invocation, which, on chanting, - confuses, dizzies, and briefly stuns nearby non-servants and allows the invoker - a brief time to relocate before continuing the chant. - - rscadd: Ghosts can now see the Gateway to the Celestial Derelict's remaining time - as a countdown. - - tweak: Anima Fragments are now slightly slower if not at maximum health and no - longer drop a soul vessel when destroyed. - Quiltyquilty: - - rscdel: Patches now hold only 40u. - - rscdel: Patches in first aid kits now only contain 20u of chemicals. - coiax: - - rscadd: Polymorphed mobs now have the same name, and where possible, the same - equipment as their previous form. -2016-06-19: - Joan: - - tweak: Assassin holoparasite attack damage increased from 13 to 15, stealth cooldown - decreased from 20 seconds to 16 seconds. - - tweak: Charger holoparasite charge cooldown decreased from 5 seconds to 4 seconds. - - tweak: Chaos holoparasite attack damage decreased from 10 to 7, range decreased - from 10 to 7. - - tweak: Lightning holoparasite attack damage increased from 5 to 7, chain damage - increased by 33%. - - rscdel: Clock cult scripture unlock now only counts humans and silicons. - - rscadd: Servants of ratvar can now create cogscarab shells with a Script scripture. - Adding a soul vessel to one will produce a small, drone-like being with an inbuilt - proselytizer and tools. - - imageadd: Clockwork mobs have their own speechbubble icons. - - tweak: Invoking Sevtug now causes massive hallucinations, brain damage, confusion, - and dizziness for all non-servant humans on the same zlevel as the invoker. - - rscdel: Invoking Sevtug is no longer mind control. RIP mind control 2016-2016. - - tweak: Clockwork slabs now produce a component every 50 seconds, from 40, Tinkerer's - Caches now produce(if near a clockwork wall) a component every 35 seconds, from - 30. - - experiment: 'Tinkerer''s daemons have a slightly higher cooldown for each component - of the type they chose to produce that''s already in the cache: This is very - slight, but it''ll add up if you have a lot of one component type and are trying - to get more of it with daemons; 5 of a component type will add a second of delay.' - Kor and Iamgoofball: - - rscadd: Miners can now purchase fulton extraction packs. - - rscadd: Miners can now purchase fulton medivac packs. - - rscadd: Two new fulton related bundles are available for purchase with vouchers. - Quiltyquilty: - - rscadd: Beepsky now has his own home in the labor shuttle room. - Wizard's Federation: - - bugfix: We've fired the old Pope, who was actually an apprentice in disguise. - We've a-pope-riately replaced him with a much more experienced magic user. - - rscadd: Some less-then-sane people have been sighted forming mysterious cults - in lieu of recent Pope sightings, lashing out at anyone who speaks ill of him. - - bugfix: We've rejiggered our trans-dimensional rifts, and almost all cases of - clergy members being flung into nothingness should be resolved. - - bugfix: All members of the Space Wizard's Clergy have been appropriately warned - about usage of skin-to-stone spells, and such there should be no more instances - of permanent statueification. - Xhuis: - - tweak: Revenants have been renamed to umbras and have undergone some tweaks. - coiax: - - rscadd: Drones can hear robotic talk, but cannot communicate on it. AIs and cyborgs - are encouraged to share information with station repair drones. - - rscadd: Potted plants can now be ordered from cargo. - - rscdel: AI turrets no longer fire at drones. -2016-06-20: - Kor: - - rscadd: Cult runes can only be scribed on station and on mining. - - rscadd: The comms console now has a new option allowing you to communicate with - the other server. - Quiltyquilty: - - rscadd: The detective has been moved to above the post office. - coiax: - - rscadd: Birdboat's supply loop has been split into two unconnected halves, to - maintain award winning air quality. - incoming5643: - - experiment: New abilities for some races! - - rscadd: Skeletons (liches) and zombies now are much more susceptible to limb loss, - but can also reattach lost limbs manually without surgery. - - rscadd: Slimepeople can now lose their limbs, but also can regenerate them if - they have the jelly for it. Additionally slimepeople will (involuntarily) lose - limbs and convert them to slime jelly if they're extremely low on jelly. - - rscadd: Zombies and slimepeople now have reversed toxic damage, what usually heals - now hurts and what usually hurts now heals. Keep in mind that while you could - for example heal with unstable mutagen, you'd still mutate. Beware of secondary - effects! Drugs like antitoxin are especially dangerous to these races now since - not only do they do toxin damage, but they remove other toxic chems before they - can heal you. Be wary also of wide band healing drugs like omnizine. - - rscadd: For slime people the above mechanic also adds/drains slime jelly. So yes - inhaling plasma is now a valid way to build jelly (but you'll still suffocate - if there's no oxygen). - - rscadd: Pod people now mutate if shot with the mutation setting of the floral - somatoray. -2016-06-22: - Cheridan: - - tweak: Flashes no longer stun cyborgs, instead working almost exactly like a human, - causing them to become confused and unequip their current module. - Joan: - - rscdel: Those who do not serve Ratvar cannot understand His creations. - - rscadd: You can now repair clockwork structures with a clockwork proselytizer. - This is about a third as efficient as a mending motor, costing 2 liquified alloy - to 1 health, and also about a third as fast. - - tweak: Scarab proselytizers are more efficient and will reap more alloy from metal - and plasteel. - - rscadd: They can also directly convert rods to alloy. - - tweak: Nuclear bombs will no longer explode the station if in space. Please be - aware of this. - Kor: - - rscadd: You can now pick up potted plants. - PKPenguin321: - - rscadd: You can now pick up a skateboard and use it as a weapon by dragging it - to yourself. - - imageadd: Skateboards have been given brand new sprites, courtesy of JStheguy - Quiltyquilty: - - rscadd: The AI is back in the center of the station. The gravity generator is - now where the SMES room used to be. The SMESes are in the equipment room. - Supermichael777: - - rscadd: Flaps are no longer space-racist and now accept all bots. - Xhuis: - - tweak: Holy weapons, such as the null rod and possessed blade, now protect from - Ratvar's magic. - coiax: - - rscadd: Certain custom station names may be rejected by Centcom. - - rscadd: Drone shells can be ordered in Emergency supplies at Cargo. -2016-06-23: - Joan: - - tweak: Tinkerer's Caches generate components(when near clockwork walls) every - minute and a half, from every 35 seconds. Clockwork Slabs generate components - once per minute, from once per 50 seconds. - - tweak: Spatial Gateway will last four seconds per invoker, instead of two per - invoker. - - rscdel: Clockwork floors now only heal toxin damage on servants of Ratvar. - - rscdel: You can no longer place ocular wardens very close to other ocular wardens. - - tweak: The Flame produced by a Judicial Visor is no longer an effective melee - weapon and will trigger on all intents, not just harm intent. - Wizard's Federation: - - bugfix: Acolytes of Hades have revealed their true forms. - - rscadd: We've discovered a way to traverse portals left behind by Hades, and have - discovered a great treasure through it. - - bugfix: Hades has undergone Anger Management classes, and should no longer remain - wrathful for the duration of his visit. - coiax: - - rscadd: Changelings now evolve powers via the cellular emporium, which they can - access via an action button. - - rscadd: Due to budget cuts, the shuttle's hyperspace engines now create a visual - distortion at their destination, a few seconds before arrival. Crewmembers are - encouraged to use these "ripples" as an indication of where not to stand. - - bugfix: Shuttles now only run over mobs in turfs they are moving into, rather - than the entire rectangle. - - rscadd: If you are an observer, you can click on transition edges of a Z-level - in order to move as a mob would. - - rscadd: Due to safety concerns, the Hyperfractal Gigashuttle now has some safety - grilles to prevent accidental matter energising. - coiax, incoming: - - rscadd: Due to budget cuts, the builtin anti-orbit engines on the station have - been removed. As such, expect the station to start orbiting the system again, - and encounter an unpredictable stellar environment. - - rscdel: All permanent structures (not on station, Centcom or lavaland) have been - removed. - - rscadd: All removed structures are now space ruins, and can be placed randomly - in space ruin zlevels. - - wip: The White Ship remains at its current location, but has lost any reliable - landmarks near it. Its starting position will be made more random in a coming - update. - - rscadd: The Space Bar has a small atmos system added and a teleporter. Some other - ruins have been cleaned up to not have atmos active turfs. -2016-06-24: - Joan: - - experiment: The Interdiction Lens has been reworked; instead of allowing you to - disable Telecomms, Cameras, or non-Servant Cyborgs, it drains power from all - APCs, SMES units, and non-Servant cyborgs in a relatively large area, funneling - that power into nearby Sigils of Transmission, then disables all cameras and - radios in that same area. - - wip: If it fails to find anything it could disable or drain any power, it turns - off for 2 minutes. - - tweak: You can now target yourself with Sentinel's Compromise, allowing you to - heal yourself with it. - - rscadd: Flashes will once again stun borgs, but for a much shorter time than they - previously did; average stun time is reduced from the previous average of 15 - seconds to about 6 seconds. The confusion remains, but it will no longer unequip - borg modules. - MMMiracles: - - tweak: Metastation xenobiology's lights and cell have been modified so it won't - drain 5 minutes into the round. - SnipeDragon: - - bugfix: Changelings created at round start now correctly receive their Antag HUD. - Xhuis: - - rscadd: Cardboard cutouts have been added. Now you can set up advertisements for - your clown mart. -2016-06-26: - Basilman: - - rscadd: The Donor prompt for becoming an alien queen maid is now an action button - instead, and can be toggled on and off. - Joan: - - rscadd: Fellowship Armory now invokes faster for each nearby servant and provides - clockwork gauntlets, which are shock-resistant and provide armor to the arms. - - tweak: It's not wise to equip clockwork armor if you don't serve Ratvar. - - bugfix: A full set of clockwork armor will now actually cover all limbs. - coiax: - - rscadd: Our administrators, here at /tg/, don't get enough credit for their wealth - of experience and knowledge. Now they get the chance to share that with you - by giving out custom tips! - - tweak: Gang domination now uses the same timing method as shuttles, making their - domination times more accurate. - - rscdel: The default shuttle transit time is now 15 seconds. - - rscadd: Please do not commit suicide with the nuclear authentication disk. - - rscadd: Observers now have a visible countdown for borg factories, silicons can - examine the factory to determine how long it has remaining until it is ready. - - rscadd: Clockwork mobs sound like Ratvar chants if you do not serve Ratvar. - - rscadd: When servants recite, they now talk in a strange voice that is more noticable. -2016-06-28: - CoreOverload: - - rscadd: Kinetic accelerator now supports seclite attachment. - - rscadd: All cyborgs have been outfitted with ash-proof plating. - - rscadd: Mining cyborg module now includes a welder and a fire extinguisher. - - rscadd: 'Mining cyborgs now have a new upgrade: lavaproof tracks.' - Joan: - - rscdel: Clockwork Marauders are no longer totally invincible to damage unless - a holy weapon was involved. - - rscadd: Clockwork Marauders will take damage when attacked, but unless they're - fighting excessive amounts, they'll be forced to return to their host before - they'd normally die. - - experiment: A holy weapon held in either hand in the presence of a marauder will - massively increase the damage they take, making it much more likely the marauder - can be killed. - - tweak: Clockwork Marauders do slightly less damage at low fatigue levels. - - rscadd: Clockwork Marauders now have a chance to block melee attacks, negating - the damage from them, and an additional chance to immediately counter, attacking - whoever tried to attack them. - - wip: If Ratvar has awoken, Marauders have a much higher chance to block and counter, - will block thrown items and projectiles, and gradually regenerate. - - experiment: Clockwork Marauders no longer have a verb to communicate; they instead - use :b to do so. - - rscadd: Faked deaths are now effectively indistinguishable from real deaths. - MMMiracles: - - rscadd: Adds some ruins for space and lavaland. Balance not included. - - rscadd: Adds spooky ghosts. - SnipeDragon: - - bugfix: Cardboard Cutouts now become opaque when their appearance is changed. - Wizard's Federation: - - rscadd: Acolytes of Hades have been scolded for gluing their clothes to themselves, - and their clothes can now be cut off them. - - rscadd: Hades has learned a few new tricks, to ensure the ultimate demise of his - target. - - bugfix: Hades has faced a council of his repeated use of time magic inside chapels, - and as it was deemed unholy, he will no longer do it. - - rscadd: Wizards of the Wizard's Federation have been granted access to Dark Seeds, - ancient relics used to call upon Hades in a time of need. - Xhuis: - - rscdel: You can no longer put paper cups back onto water coolers. In addition, - they're now just called "liquid coolers" instead of changing based on their - contents. - coiax: - - rscadd: Status displays added to a variety of shuttle templates. - - rscdel: Large graffiti now consumes 5 uses from limited use crayons and spraycans, - as well as taking three times the amount of time to draw. - - rscadd: All items inside the supply shuttle will now be sold, regardless of whether - they're inside a container or not. - - bugfix: Fixes issue where the AI core APC on Metastation would not charge. - 'name: Lzimann': - - rscadd: Engineer and atmos wintercoat can hold the RPD now! - optional name here: - - rscdel: Shadowlings have been completely removed. - oranges: - - tweak: You can now hear dice - timkoster1: - - rscadd: adds a hud soul counter for devils. Sprites by PouFrou and special thanks - to lordpidey for about everything. -2016-06-29: - Joan: - - rscadd: Ghosts spawning via Ratvar can now choose to spawn as a Cogscarab with - a usable slab instead of as a Reclaimer. - - bugfix: You can no longer permanently block hostile simple mobs with sandbags - and other barricades. - MrStonedOne: - - rscadd: Ghosts may now jump between the two linked servers using the new Server - Hop verb. Rather than whine in deadchat about dieing, you can just go play a - new round on the other server. - coiax: - - rscadd: Adds a new UI to slimepeople, allowing them to select more easily which - body to swap to - - rscadd: Slimepeople swapping consciousness between bodies is now visible to onlookers - - bugfix: The AI malfunction "Hostile Lockdown" power now restores the station doors - to normal after 90 seconds, rather than keeping everything shut forever. -2016-07-01: - Flavo: - - bugfix: fixed a bug where lights would not update. - Joan: - - rscadd: Clockwork Slabs now use an action button to communicate instead of the - "Report" option in the menu after using a slab. - - tweak: Clockwork Slabs now fit in pockets, the belt slot, or in the suit storage - slot(if wearing clockwork armor), where they can be used as hands-free communication. - - imageadd: Clockwork items with action buttons have a new, clockwork-y background. - - rscadd: Judicial Visors now tell the user how many targets the Judicial Blast - struck. - - soundadd: Judicial Markers now have sounds when appearing and exploding. - - tweak: Wet turfs should remain that way for slightly longer than 5 seconds now. - - rscadd: Drones and Swarmers should now sound more robotic. - - tweak: Ratvarian Spears will stun cyborgs and cultists for twice as long when - thrown; on cyborgs, this should be long enough to use Guvax on them. - - rscdel: Removed the Justicar's Gavel application scripture. - - tweak: Vitality Matrices will drain and heal 50% faster, and the base cost to - revive is 20% lower; 20, from 25. - - rscadd: Vitality Matrices will not revive or heal corpses unless they can grab - the ghost of the corpse, and will immediately grab the ghost when reviving. - - rscadd: Swarmers consuming swarmer shells now refunds the swarmer the entire cost - of the shell instead of 2% of the shell's cost. - - experiment: Application scriptures require at least 75 CV, from 50. - - experiment: Revenant scriptures require at least 4 Caches, from 3, and at least - 150 CV, from 100. - - experiment: Judgement scripture requires at least 12 servants, from 10, 5 Caches, - from 3, and at least 250 CV, from 100. - - experiment: Script and Application scripture have had their component costs and - requirements tweaked to reduce overuse of certain components. - - wip: Invoke times for a few scriptures that were instant are now very short instead. - Kor: - - rscdel: Holoparasites are no longer in the uplink - NikNak: - - tweak: Showcases are now movable and deconstructable. Wrench them to unanchor - and then screwdriver and crowbar to deconstruct. - Papa Bones: - - tweak: Security now has energy bolas available to them in their vending machines, - check them out! - bobdobbington: - - rscadd: Added skub to the AutoDrobe as a premium item. - coiax: - - rscadd: The CTF arena regenerates every round, and the blue team now shoot blue - lasers. - - rscadd: Adds some descriptions to alien surgery tools - - rscadd: The agent vest can be locked and unlocked (toggling the NODROP flag) - - rscadd: An abductor team can spend data points to purchase an agent vest (note - that only abductor agents are trained in their use) - - rscadd: The nuke disk reappears on the station in far more random locations, but - tends to re-materialise in safe pressurised areas that aren't on fire. - 'name: Lzimann': - - tweak: Mulebots with pAI cards no longer stun people -2016-07-02: - Joan: - - rscadd: Clockwork Proselytizers can now reform stored alloy into usable component - alloy when used in-hand. - - rscdel: Mending motors start with 2500W of power in alloy, from 5000. Sigils of - Transmission start with 2500W of power, from 4000. Clockwork Proselytizers start - with 90 alloy, from 100. - - rscdel: Umbras have been removed. - - rscadd: Revenants have been readded, though they are now vulnerable to salt piles. - MMMiracles: - - rscadd: Added the power fist, a gauntlet with a piston-powered ram attached to - the top for traitors to punch people across the station. Punch people into walls - for added fun. - incoming5643: - - rscadd: 'Nuke ops can now harness the power of METAL BOXES: special versions of - cardboard boxes that can take a lot of abuse and can fit the whole team if need - be. They''re not nearly as light as their cardboard brothers though...' - kevinz000: - - rscadd: Some new emojis have been added to OOC for your enjoyment. Try them out. - - rscadd: 'New emojis are : coffee, trophy, tea, gear, supermatter, forceweapon, - gift, kudzu, dosh, chrono, nya, and tophat. Type :nameofemoji: in OOC to use.' -2016-07-03: - Cruix: - - bugfix: Hand labelers can now label storage containers. - - bugfix: You can now properly resist out of wrapped lockers. - - bugfix: You can now resist out of morgues if you are in a bodybag. - - bugfix: Mechs can no longer spam doors they do not have access to. - Joan: - - tweak: Clock Cult can now happen at 24 players, same as cult. - - tweak: Clock Cult player scaling is lower; 3 people, plus one for every 15 players - above 30, from 1 for every 10 players with a player minimum of 30. - - experiment: Guvax now invokes 1 second faster(5 seconds), but is 0.75 seconds - slower for each scripture-valid servant above 5, up to a maximum of 15 seconds. - - experiment: Clockwork Slabs generate components 20 seconds slower for each scripture-valid - servant above 5, up to a maximum of 1 component every 5 minutes. - - tweak: Tinkerer's Daemons that would be useless cannot be made. -2016-07-04: - Gun Hog: - - rscadd: The Space Wizard Federation has finally begun teaching its pupils how - to properly aim the Fireball spell! - - tweak: Fireball spells, including the Devil version, are now aimed via mouse click. - It is recommended to avoid firing at anything too close, as the user can still - blow himself up! - Joan: - - rscdel: Mecha are no longer immune to ocular wardens. - Lzimann: - - rscadd: Throwing active stunbatons now has a chance to stun whoever it hits! - MMMiracles: - - rscadd: Adds space ruins. Balance not included. - - tweak: Simple mob ghosts actually work now. - - rscdel: Puzzle1 ruin removed due to issues with projectiles. - X-TheDark: - - rscadd: Switching mobs/ghosting/etc related actions during the round will now - no longer reset your hotkey settings. - Xhuis: - - bugfix: Ash storms can now occur again. - bgobandit: - - rscadd: Bluespace polycrystals, basically stacks of bluespace crystals, have been - added. The ore redemptor accepts them now. - - tweak: The ore redemptor machine should be less spammy now. - coiax: - - rscadd: The zone of hyperspace that a shuttle travels in is dynamically determined - when a shuttle begins charging its engines. This is signified by the shuttle - mode IGN. All shuttles must now charge engines before launching. This time is - already included in the emergency shuttle timer. - - rscdel: The cargo shuttle can only be loaned to Centcom while at Centcom. - - rscadd: Immovable rods now notify ghosts when created, allowing them to orbit - it and follow their path of destruction through the station. - - bugfix: Fixed bugs where no meteors would come or go from the south. Seriously, - that was a real bug. Meteor showers are now about 33% stronger as a result. -2016-07-06: - Cruix: - - bugfix: Vending machine restocking units now work. - Joan: - - rscadd: Servants should now be more aware of when scripture tiers are locked or - unlocked. - - experiment: Judicial Explosions from a Judicial Visor now mute for about 10 seconds. - MrStonedOne: - - rscadd: Instant Runoff Voting polls are now available. - RemieRichards: - - tweak: Fixes accidental buff to botany, all modifiers should now be at the point - they were at pre-bees (this does not remove, nerf or alter bees) - Xhuis: - - rscadd: The Necropolis gate now looks as regal as it should. Credit goes to KorPhaeron - for turf and wall sprites. - - bugfix: Ash storms are actually damaging now. - coiax: - - bugfix: Gulag prisoners can no longer duplicate their mining efforts through window - breaking on the shuttle. - - bugfix: Fixes pickaxes inside walls on lavaland, along with lava having eaten - one of the storage units. - - rscadd: More fire extinguishers for lavaland mining base. - - bugfix: You can now reload your gun in CTF. - - rscadd: Dying in CTF will spawn a short lived ammo pickup, which you can walk - over to reload all your weapons. - - rscadd: If reduced to critical status in CTF, you will automatically die, so you - no longer have to succumb or be coup de graced. If you are conscious, you will - now heal slowly if some damage got through your shield and didn't crit you. - - bugfix: The tesla now dusts all carbon mobs on the turf that it moves to, grounding - rod or no. - coiax, Niknakflak: - - rscadd: Added fireplaces, fuel with logs or paper and set on fire and enjoy that - warm comforting glow. - - bugfix: Cardboard cutouts are now flammable. - - rscadd: Cigarettes, fireplaces and candles now share a pool of possible igniters. - So you can now esword that candle on, but turn it on first. - - rscadd: Eswords will ignite plasma in the air if turned on. - kevinz000: - - tweak: Kudzu is no longer unstoppable - optional name here: - - bugfix: Suit Storage Units can now disinfect items other than living and dead - creatures. -2016-07-09: - CoreOverload: - - rscadd: You can remove jetpack from a hardsuit by using screwdriver on it. - Crazylemon: - - bugfix: The map loader no longer resets when reading another map mid-load - Goofball Sanders: - - rscadd: Added a new plant to the game to encourage the Chef to be a more relevant - job, alongside a recipe for a food related to it. Throw a cannabis leaf on a - table and check the recipes list to find it. - Gun Hog: - - rscdel: Malf (Traitor) AI's Fireproof Core ability has been removed, as it was - entirely obsolete. - - rscadd: Nanotrasen is proud to announce that conveyor belts can now be fabricated - at your station's autolathes! - Iamgoofball: - - bugfix: Fixes the Atheist's Fedora's throw damage. - Joan: - - rscadd: Tips for Clock Cult may now show up. - - experiment: The global component cache can only be accessed by clockwork slabs - if there is at least one Tinkerer's Cache active. - - rscadd: Ratvarian Spears are now sharp and can be used to cut off limbs or butcher - mobs. - - rscadd: Clock Cult silicons get an action button to communicate with other servants. - - tweak: Clockwork Slabs now produce a component every 1 minute, 30 seconds, from - every 1 minute. - - experiment: The slab production time gain from each servant above 5 has been increased - from 20 seconds to 30 seconds, and the maximum production time has been increased - from 5 minutes to 6 minutes. - - rscadd: You can now transfer components between two clockwork slabs by attacking - one slab, or a person holding a slab, with the other; this will transfer the - attacking slab's components into the target slab. - - tweak: Application scripture now requires 100 CV, from 75, Revenant scripture - now requires 200 CV, from 150, and Judgment scripture now requires 300 CV, from - 250. - - experiment: However, converted windows, windoors, airlocks, and grilles will all - provide some CV. - Lzimann & Keekenox: - - rscadd: You can now craft a baseball bat with 5 sheets of wood! - MrStonedOne: - - experiment: Atmos on planets is now more realistic. There is an unseen upper atmosphere - that gas changes get carried away into, causing planet turfs to revert back - to their original gas mixture. - - tweak: This should massively improve atmos run speed as all of lavaland won't - be processing the moment somebody opens a door anymore - MrStonedOne, coiax: - - rscadd: View Variables can expand on associated lists with type keys. Only 90s - admins will truely understand. - RemieRichards: - - rscadd: Added a Compact mode to the crafting tgui - - tweak: Modified the back end of the crafting tgui so that it has well let's just - say "a lot less" calls to certain functions, should lag a little less but don't - expect miracles (you'd have to wait till we get a new version of ractive for - those!) - coiax: - - rscadd: Podpeople (and venus human traps) are now no longer damaged, poisoned - or obstructed by space vines. Explosive vines still damage them, because there's - an actual explosion. - - rscadd: During a meteor shower, observers can automatically orbit threatening - meteors via an action button and watch them hit the station. - - rscadd: Added Major Space Dust event, which is a meteor shower containing only - space dust. - - bugfix: Fixes bug where meteors wouldn't move when spawned. - - rscadd: Meteor Shower split into three different events, Normal, Threatening and - Catastrophic. They all have the same crew messages, but admins can tell the - difference. - - bugfix: Damage to a shuttle while it is moving will now correctly make transit - space turfs, rather than non-moving space. - - rscadd: AIs get a notification when hacking an APC, which can be clicked to jump - your camera to the APC's location. AIs also get notification sounds when a hack - has completed or failed. - - rscadd: Nuclear bombs now use a more accurate timer system, the same as gang dominators - and shuttles. - - rscadd: Nuclear bombs now have a TGUI interface. - - rscdel: Fleshmend no longer regrows lost limbs. - - rscadd: Added free Regenerate power to changelings, which regrows all external - limbs and internal organs (including the tongue if you lost your head). It costs - 10 chemicals to use. - - rscadd: Fleshmend now costs 20 chemicals, down from 25. - - tweak: Changeling revive power name changed from Regenerate to Revive. - - rscadd: When a player uses a communication console to ask for the codes to the - self destruct, for better or for worse, the admins can set them with a single - click. Whether the admins a) click the button b) actually give the random person - the codes, is another thing entirely. - - rscadd: Servants of Ratvar get an alert if they have no tinkerer's caches constructed. - Because it's important that they should. -2016-07-11: - Iamgoofball: - - bugfix: Fixes Nicotine's stun reduction - Joan: - - tweak: The Function Call action that summons a Ratvarian Spear is no longer one-use; - instead, it can be reused once every five minutes. - - experiment: Clockwork Walls and Floors will appear as normal walls and plating - to mesons, respectively. - coiax: - - tweak: Syndicate bombs now use a more accurate timer. - - bugfix: Fixed a separate bug that caused bomb timers to take twice as long (ie. - 60 seconds took 120 seconds) - - tweak: The AI doomsday device timer is more accurate. - - bugfix: Fixes a bug where the doomsday device would take twice as long as it should. - optional name here: - - bugfix: The search function on security records consoles now works. -2016-07-12: - MMMiracles: - - bugfix: Hotel staff can now actually use their own lockers. - RemieRichards: - - bugfix: fixed Kor's plant disguises - - bugfix: fixed some issues with Alternate Appearances not being added/removed - hornygranny: - - bugfix: Attacks will no longer miss missing limbs -2016-07-14: - Basilman: - - rscadd: Added a new hairstyle "Boddicker" - Bawhoppen: - - rscadd: Added two new materials, Titanium and plastitanium. Titanium is naturally - occuring, and plastitanium is an alloy made of plasma and titanium. - - rscadd: These materials can be used to build shuttle walls and floors, though - this serves no current purpose. - CoreOverload: - - rscadd: Some clothing has pockets now. - Firecage: - - tweak: Mechas can no longer pass through Plastic Flaps - Fox McCloud: - - bugfix: Fixes borg stun arm not having a hitsound, bypassing shields, and not - doing an attack animation - - bugfix: Fixes simple mobs not properly having armor penetration - Joan: - - rscadd: Added dextrous guardians to the code, able to hold and use items and store - a single item within themselves. - - experiment: Dextrous guardians do low damage on punches, have medium damage resist, - and recalling or leashing will force them to drop any items in their hands. - Kor: - - tweak: Shuttle travel time has been shortened from 25 seconds to 6 seconds - Lzimann: - - tweak: Alt clicking a jumpsuit now removes the accessories(if there's any)! - Papa Bones: - - tweak: Security's lethal injections are actually lethal now. - Xhuis: - - rscadd: Nanotrasen electricians have introduced a software update to all licensed - pinpointers. The new pinpointers are more responsive and automatically switch - modes based on the current crisis. - - rscadd: It should be noted that some of these pinpointers have been reported as - missing from their distribution warehouse and are presumed to have been stolen. - This is likely nothing to worry about. - lordpidey: - - tweak: Infernal jaunt now has a cooldown, to prevent trying to jaunt while already - jaunting. This should have no practical changes. - - bugfix: Infernal jaunt no longer occasionally leaves you permanently on fire. - - bugfix: Pitchforks no longer burn devils and soul-sellers, as intended. -2016-07-15: - Cheridan: - - rscadd: Added an aesthetic new space ruin -2016-07-16: - Gun Hog and WJohnston: - - rscadd: Aliens (Xenos) now have the ability to sense the direction and rough distance - of their queen! - Iamgoofball: - - bugfix: Fixed the lag when opening the foodcrafting menu by splitting everything - up into categories. - Joan: - - rscadd: Cogscarabs(and other nonhuman mobs able to hold clockwork slabs) can now - check the stats of the clockwork cult by using a clockwork slab. They remain - unable to use slabs under normal conditions. - MrStonedOne: - - experiment: Added a system to detect when stickybans go rogue and revert all recent - matches. -2016-07-18: - CoreOverload: - - rscadd: Sterilizine now reduces probability of step failure if you apply it after - starting surgery. Useful while operating in less-than-perfect conditions. - - rscadd: Potent alcohol can be used as replacement for sterilizine. - Joan: - - experiment: The Vanguard scripture no longer prevents you from using slabs while - active, but you cannot reactivate it if it is currently active. - - tweak: It now only lasts 20 seconds, instead of 30. - - tweak: When Vanguard deactivates, it now stuns for half the time of all stuns - absorbed, instead of all of them. - - tweak: Invoking Sevtug is less potent at long ranges, and slightly more potent - if extremely close. - - experiment: Invoking Sevtug now requires 3 invokers instead of 1. - - rscadd: The Clockwork Slab now has action buttons for rapidly invoking Guvax and - Vanguard. - - tweak: Belligerent is now chanted more often. - - experiment: Taunting Tirade now weakens nearby nonservants, but is now only invoked - once every 6 seconds(1 second chant, 5 second flee time) and is only chanted - five times. - lordpidey: - - rscadd: Flyswatters are now included in beekeeping crates, they are great at killing - insects and flies of all sizes. -2016-07-19: - Joan: - - tweak: Cogscarabs can no longer pass mobs and have slightly less health. - - experiment: The Gateway to the Celestial Derelict can now take damage from bombs. - RemieRichards: - - rscadd: Added VR Sleepers that allow users to enter a virtual body in a virtual - world (Currently not mapped in ;_;) - Xhuis: - - rscadd: Added communication intercept texts for gamemodes that were missing them. - - tweak: Changed all intercept texts and improved grammar for a lot of key game - code. - - rscdel: The shuttle can now leave while a celestial gateway exists. - - rscadd: If the shuttle docks at Central Command while a celestial gateway exists, - Ratvar's servants will win a minor victory. His arrival will still award a major - victory. - - rscadd: The celestial gateway can now take damage from explosions. -2016-07-22: - Bawhoppen: - - rscadd: Titanium now spawns in mining again. - - rscadd: It has uses in R&D and robotics production. - - rscadd: All shuttle walls are now using a new proper smoothing path. Mappers please - make sure to use this path correctly in the future. (along with tiles) - Cheridan: - - rscadd: Added another space ruin. - Cruix: - - bugfix: Camera bugs can now show camera views. - - bugfix: The chameleon masks in the chameleon kit can once again have their voice - changers toggled. - Incoming5643: - - rscadd: You now have the ability to automatically "back out" of a round if you - miss your chance at all the jobs you have set to low or higher. This is found - on the toggle at the bottom of the jobs window - - rscadd: Due to a quirk of game mode code this option will fail to work if you've - been selected as an antag (what a tragedy!) In this situation, you'll be assigned - a random job. - Joan: - - bugfix: You can now throw items and mobs over chasms without causing them to drop. - - bugfix: You can now throw items over lava without burning them. Mobs will still - burn, however. - - experiment: Tinkerer's Caches now link to a nearby unlinked clockwork wall, and - will not generate components unless linked. As compensation, they will link - to nearby walls(and can generate components) in a larger area. - - wip: Guvax is now slightly slower when above 5 valid servants; 1 additional second - of invoke time for each one above 5, from 0.75 additional seconds, up to a maximum - of 20 seconds of invoke time, from 15 seconds. - - tweak: Sigils of Transgression now stun for about 7 seconds. - - experiment: Sigils of Submission/Accession now take 7 seconds to convert successfully, - and have an obvious message to the person on them that their mind is being invaded. - - tweak: Ocular Wardens do 17% less damage. - - tweak: Mania Motors cause less brain damage and hallucinations. - - rscadd: If you lack the components to recite a scripture, you will be informed - of how many components that scripture requires. - - experiment: Tinkerer's Caches now cost an additional one of each non-alloy component - to construct for every three existing Tinkerer's Caches, up to a maximum of - 5 of each non-alloy component. - - rscadd: Revenant scriptures now announce to all servants and ghosts when used - instead of having a visible message. - Lzimann: - - tweak: Blood packs are now back in surgery room. - MMMiracles: - - rscadd: A giant wad of paper has been seen hurling through the nearby sector of - SS13, officials deny existence of giant paper ball hurling through space because - 'thats really fucking stupid'. - MrStonedOne: - - bugfix: Fixes super darkness from lighting creating two darkness overlays on the - same turf but only changing the darkness of one of the overlays - PKPenguin321: - - rscadd: Added Canned Laughter for the clown. Hehehe - RemieRichards: - - tweak: Auto-generated ratvarian now follows all the rules of hand-written ratvarian, - but you probably won't notice. - Shadowlight213: - - tweak: Angels can now equip satchels - - rscadd: Players will now receive an achievement for killing their first megafauna - after this point. - - rscadd: Additionally, megafauna kills are now tracked on a hub page. Rack up those - kills for first place! - Xhuis: - - rscadd: Clockwork cultists may now have the "Escape" and "Silicon" objectives, - requiring a certain amount of servants to escape on the shuttle and all silicons - to be converted respectively. - - rscadd: Ocular wardens are now forced to target bibles rather than the people - holding them. -2016-07-28: - Cruix: - - bugfix: Fixed a bug where some objects in photos would not be displayed if they - were facing a certain direction. - - bugfix: Photograph descriptions will no longer claim that mobs with low max health - are hurt when they are not. - Incoming5643: - - rscadd: The previously underwhelming viscerator robot has been made a lot more - terrifying by the new ability to proactively target and dismember limbs. - Joan: - - tweak: The Tinkerer's Cache cost increase for having multiple Tinkerer's Caches - now happens every 5 caches, from every 3. - - experiment: If the invoker of Nzcrentr is knocked unconscious or killed, they - will gib instead of producing a lighting blast. - - tweak: Anima Fragments slow down for slightly less time when hit. - - tweak: Clockwork Marauders do 1 more damage on every attack. - - tweak: Wraith Spectacles are now less hard on the eyes, and can be used without - permanent vision impairment for about 50% longer; from 40~ seconds to about - 1 minute. - - tweak: Halves the Interdiction Lens' disrupt cost from 100 per disrupted object - to 50 per disrupted object. - - tweak: Clockwork Sigils will now be destroyed by any level of explosion, except - for Sigils of Transmission, which will gain a small amount of power if hit by - a light explosion instead of breaking. - - bugfix: Clockwork Structures will now properly take damage from explosions instead - of variably not taking damage or instantly being destroyed. - - rscadd: Ghosts can now click Spatial Gateways to teleport to the other gateway. - - bugfix: Spatial Gateways are now properly disrupted by devastating explosions(but - not heavy or light explosions) - - rscadd: Striking a Sigil with any damaging item as a non-servant will remove it. - Servants still need to be on harm intent with an empty hand to remove Sigils. - Kor: - - rscadd: The Staff of Storms, dropped by Legion, can now be used on station. - MMMiracles: - - rscadd: Adds jump boots, a mid/end-tier mining equipment that allows the user - to dash over 4-wide chasms. - ModernViolence: - - bugfix: Hulk now has default cooldown for melee attacks against dominator - MrStonedOne: - - tweak: Space wind (movement from pressure differentials (like a hole to space)) - has been improved. - - tweak: Space wind's rate of movement now scales with pressure differential amount. - - experiment: Actively moving (as in holding down a move key) reduces chance/rate - of getting moved by space wind. - - rscadd: 'Having a wall or dense anchored object to your left or right will lower - the chance/rate of getting moved by space wind for each direction (IE: a wall - on both sides of you will be a double reduction)' - - rscadd: Added Lazy airlock cycling. Bump opening an airlock with this system will - close its partner. This system has been added to most airlocks that go to space - on boxstation, as well as airlocks to secure areas like brig, bridge, engine. - - tweak: This can be overridden by click opening, having a shuttle docked, or setting - emergency mode on one of the doors. - PKPenguin321: - - bugfix: Laughter no longer makes you laugh if you're muted. - - rscadd: Laughter can now be brewed with banana juice and sugar. - Thunder12345: - - rscadd: An old rapier was found rusting in the back of a closet. We cleaned it - up, polished it, and assigned it to your captain as a ceremonial weapon only. - Warranty void if used in combat. - incoming5643: - - tweak: viscerator grenades are now more generous with viscerators spawned -2016-07-30: - astralenigma: - - bugfix: Admins can now turn people into red god. -2016-07-31: - Arctophylax: - - bugfix: Birdboat's atmospheric tanks now function normally again. - - bugfix: Birdboat's TEG is now orientated to match the pipe layout. - Bawhoppen: - - tweak: toolboxes fit in backpacks - Gun Hog: - - rscadd: In an effort to reduce the demoralizing effects that accompany the death - of a crew member, Nanotrasen has provided the prototype designs for the Sad - Trombone implant. It can be fabricated at your station's protolathe, if you - manage to secure the ever elusive Bananium ore. - Joan: - - rscadd: Megafauna will now seek and consume corpses of enemies to heal or otherwise. - - tweak: Toolboxes are slightly more robust. - - tweak: Vanguard now only stuns for 25% of absorbed stuns, from 50%. - Kor: - - rscadd: Hostile mobs will now attack turrets. - Robustin: - - rscdel: Amber ERT Commanders no longer have thermal goggles - lordpidey: - - rscadd: Added Devil agent gamemode, where multiple devils are each trying to buy - more souls than the next in line. - - rscadd: If you've already sold your soul, you can sell it again to a different - devil. You can even go back and forth for INFINITE POWER. -2016-08-01: - Bawhoppen: - - rscadd: Added crowns. Make them from gold. Cap gets a fancy one. - Fox McCloud: - - rscadd: Adds in generic uplink refund system that potentially allows for even - regular traitors to refund uplink items - Joan: - - rscadd: Soul Vessels can now be used on unconscious or dead humans to extract - their consciousness, much like a soulstone. - - tweak: Soul Vessels no longer automatically ping ghosts when created, though they - can still be used in-hand to ping ghosts. - - rscadd: Soul Vessels can now communicate over the Hierophant Network - - experiment: Xenobiology golems enslaved to someone will become convertable if - their enslaver is converted to the enslaving antag type; this applies to gang - and both cult types. - oranges: - - rscdel: Reverted toolboxes fitting in backpacks due to being incorrectly merged -2016-08-02: - CoreOverload: - - rscadd: Pockets in coats! -2016-08-05: - Arctophylax: - - bugfix: The Emergency Medical and Winter Wonderland Holodeck programs work once - again. - Cruix: - - bugfix: RCDs can no longer place multiple grilles on the same tile. - - bugfix: RCDs will no longer use all their ammo if you try to build a wall on the - same turf multiple times. - - tweak: RCDs will now inform their user if they do not have enough ammo to complete - an operation. - Incoming5643: - - rscadd: Parrots have been made more robust. - Joan: - - rscadd: Clockwork Constructs, including anima fragments, marauders, and reclaimers, - can now communicate over the Hierophant Network. - - rscadd: Plasma cutters(normal, advanced, and mech) now have double range in low - pressure areas, but slightly lower range in high pressure areas. - - rscadd: Vitality Matrices will consume dead non-servant mobs to gain a large amount - of Vitality. This doesn't work on mobs that did not have a mind at some point. - Lordpidey and PKPenguin321: - - rscadd: Recent studies have revealed that fly amanita can give you a huge trip. - Lzimann: - - tweak: Holy water no longers makes you confused. - ModernViolence: - - bugfix: 'Photocopier fixes: proper sprites for not empty copies; removing originals - now does not delete them' - PKPenguin321: - - rscadd: Chef, do your station a favor and make a home run baseball burger (TM) - Robustin: - - rscadd: The initial supply talisman can now be used to create runed metal, 5 per - use - - rscadd: The void torch is now available from the altar, use it to transport any - item instantly to any cultist! It appears alongside the veil shifter as part - of the "Veil Walker" set. - - rscadd: Cult floors no longer appear on mesons! - - tweak: Flagellant's Robes now increases damage taken by 50%, down from 100% - - tweak: Veil Shifter has 4 uses, up from 2 - - tweak: Shuttle curse now delays shuttle 3 minutes, up from 2.5 minutes - - tweak: Cult forges, archives, and airlocks have had their cost reduced by 1 runed - metal each - Shadowlight213: - - rscadd: You will now receive an achievement for winning a pulse rifle at the arcade. - TheCarlSaganExpress: - - rscadd: Added lighting effects to the welder. -2016-08-07: - Arctophylax: - - bugfix: You can unbuckle mobs from meat spikes by clicking on the spike once again. - Joan: - - tweak: Barrier runes will now block air while active. - - rscadd: Trying to use sleeping carp against the colossus will now anger it. - frtbngll: - - bugfix: Fixed Paper Wizard summoning only 9 minions in its lifespan by making - the dead stickman decrease it's summoned_minions variable - lordpidey: - - bugfix: Centcom has received reports of cyborgs electrocuting themselves when - working on the power grid, and we have decided to stop storing important electronics - on the wirecutter's blade. -2016-08-08: - Ergovisavi: - - rscadd: Added bonfires to botany. Requires five tower cap logs to create, and - mobs can be buckled to them if an iron rod is added to the bonfire and the mob - is restrained. - Joan: - - rscadd: Added the clockcult "Global Records" alert, which clock cultists can mouse - over to check a variety of information on the clockcult's status, including - living servants, number of caches, CV, tinkerer's daemons, if there's an unconverted - AI, what clockwork generals can be invoked, and what scripture is unlocked. - Shadowlight213: - - rscadd: Ghosts can now see human player's huds when using the OOC -> Observe verb - WJohnston, Gun Hog: - - tweak: Xenos are now considered female. - - tweak: Hunter pounce are now always blocked by shields, and may be blocked more - often by other protective items. - - tweak: Alien Queen is now somewhat faster. - - tweak: Adjusted larva growth sprites. - - tweak: Removed 20% facehugger failure chance for masks. - - tweak: Disarm now always forces a person to drop an item in the active hand, and - if a person's hand is empty/undroppable, Disarm will always result in a tackle. - - tweak: Cyborgs disarmed by a Xeno will first disable their selected module, and - if there is none selected, the cyborg will be pushed back and stunned. - - tweak: Tail Sweep now has a slightly longer stun. -2016-08-10: - Cruix: - - rscadd: Sentient minebots can now toggle meson vision, a flashlight, their mode, - and dump their stored ore. - - bugfix: Sentient minebots can now be repaired if they were made sentient while - the AI was active. - - bugfix: Healing minebots will no longer switch them to attack mode. - - tweak: Sentient minebots can now shoot at humans. - - bugfix: The cooldown on wizard lightning will no longer break if you ethereal - jaunt or RISE! after the initial cast. - Kor: - - rscadd: You can now detonate drones with the RD console - LanCartwright: - - rscadd: Acute respiratory distress syndrom symptom. - - rscadd: Toxic metabolism. - - rscadd: Alkali perspiration - - rscadd: Autophagocytosis Necrosis - - rscadd: Apoptoxin filter - - rscadd: 3 different lategame/Non-roundstart virus reagents - - rscadd: 4 different lategame/Non-roundstart virus recipes - MrStonedOne: - - tweak: Tweaked space wind, it should now only trigger at higher pressure differences, - but be quicker to become aggressive as the pressure difference gets higher. - This should alleviate issues where small differences was still moving a lot - of things. - - tweak: Paper still moves with any pressure difference. - PKPenguin321: - - rscadd: There's now an achievement for managing to examine a meteor as a living - mob! - RemieRichards: - - rscadd: 'Added a new PDA button/app: Drone Phone!' -2016-08-14: - Cheridan: - - tweak: Greatly reduced amount of Hydroponics yield multipliers - - tweak: Somewhat reduced gaia'd tray sustainability. - - tweak: Mutagen will no longer potentially cause plant instadeath based on RNG. - Ergovisavi: - - tweak: Watchers no longer randomly fire beams at you when damaged, and no longer - beam you at point blank. - Gun Hog: - - tweak: The AI's Crew Manifest button now uses the updated styling. - Joan: - - rscadd: Sigils of Transgression now glow brightly when stunning a target. - - rscadd: The Global Records alert now shows the location and countdown time of - the Gateway to the Celestial Derelict. - - tweak: Clockcult tooltips now all have the clockcult tooltip style. - - rscdel: You can no longer become a Reclaimer when clicking on Ratvar. You can - still become a Cogscarab, however. - - bugfix: You can no longer invoke Vanguard while under its effects. - - bugfix: Servants of Ratvar should now always get an announcement when scripture - states change. - - tweak: Function Call can be used to summon a Ratvarian Spear once every 3 minutes, - from 5, but the spear summoned will now only last 3 minutes. - - rscadd: Belligerent now does minor damage to the legs on each invocation, up to - a maximum of 30 damage per recital. - - tweak: Ratvarian Spears will now stun any mob they're thrown at instead of just - enemy cultists and silicons, though the stun is still longer on enemy cultists - and silicons. - Jordie0608: - - rscdel: Removed clicking clown mask to morph it's shape, use action button instead. - Kor: - - rscadd: Added support for projectiles which can dismember - - rscadd: Added a new wizard sword, the spellblade, which fires dismembering projectiles. - Sprites from Lexorion. - - rscadd: Plasmacutter blasts can now take limbs off, but they still do pitiful - damage in a pressurized environment. - - rscadd: Humans and drones now have a UI button that allows them to create new - areas, in the same manner as blueprints. Unlike blueprints, this button does - not allow you to edit existing areas. - - rscadd: You can now use mineral doors (or any other object that blocks atmos) - to complete rooms with blueprints - - rscadd: Players created by sentience potions, mining drone upgrades, or Guardian/Holoparsite - summoners will now automatically join the users antagonist team, if any. - - rscadd: Mobs created in this manner will no longer be convertable/deconvertable - unless their creator is first converted/deconverted. - - rscadd: Cayenne will now officially become an operative when given a sentience - potion. - LanCartwright: - - bugfix: Fixes the recipes not working. - - tweak: Changes Stable uranium virus food recipe from Plasma virus food to just - plasma. - RemieRichards: - - bugfix: You can no longer use the incorrect limb type during augmentation - - bugfix: You can no longer use the incorrect limb type during prosthetic replacement - Shadowlight213: - - rscadd: Security has two new weapons in their arsenal. The security temperature - gun, and the DRAGnet capture and recovery system. - optional name here: - - bugfix: The syndicate uplink ui has been refactored to majorly reduce lag -2016-08-15: - Joan: - - rscadd: The Ark of the Clockwork Justicar can now be constructed even if Ratvar's - rise is not the objective. - - experiment: Accordingly, its behavior is different; instead of summoning Ratvar, - it will convert a massive amount of the station, and should effectively instantly - complete the clockwork cult's objectives. - MrStonedOne: - - tweak: Tweaked the lag stop numbers to hopefully reduce lag during 80+ population - - tweak: Fixed the blackbox not blackboxing. - OSCAR MIKE: - - rscadd: CONTACT ON THE LEFT SIDE! -2016-08-16: - MrStonedOne: - - rscadd: Automated the granting of profiler access to admins - oranges: - - rscadd: Nanotrasen is an all right kind of company -2016-08-17: - Basilman: - - rscadd: Added an admin-spawnable only "Cosmohonk" hardsuit that has the same protection - values of an engineering hardsuit. Comes with built-in lights and requires clown - roundstart role to be equipped. - Ergovisavi: - - rscadd: Adds the "Proto-Kinetic Crusher", a new melee mining weapon. Available - at a mining vendor near you! - Gun Hog: - - tweak: Nanotrasen has improved the coolant system in the stations automated robots. - They will no longer violently explode in hot rooms. - Joan: - - rscadd: Once the blob alert message is sent in the blob game mode, all mobs get - to see how many tiles the blob has until it wins, via the Status tab. - - rscdel: Removed/merged a bunch of blob chems, you probably don't care about the - specifics. - - tweak: The remaining blob chems should, overall, be more powerful. - - tweak: Shield blobs soak brute damage less well. - - tweak: Flashbangs do higher damage to blobs up close, but their damage falls off - faster. - - experiment: Shield blobs now cost 15 resources to make instead of 10. Node blobs - now cost 50 resources to make instead of 60. - - experiment: Expanding/attacking now costs 4 resources instead of 5, and blobs - can now ATTACK DIAGONALLY. Diagonal attacks are weaker than normal attacks, - especially against cyborgs(which may be entirely immune, depending), and they - remain unable to expand diagonally. - - rscadd: Shield blobs no longer block atmos while under half health. Shield blobs - are still immune to fire, even if they can't block atmos. - - tweak: Blobs should block explosions less well. - - rscadd: Blob cores and nodes are no longer immune to fire and no longer block - atmos. - - rscadd: Blobs can only auto-expand one tile at a time per expanding thing, and - should be easier to beat back in general. - - tweak: Blobbernauts now attack faster. - - tweak: Blob Overminds attack mobs slower but can attack non-mobs much faster. - - rscadd: Blob Overminds start with some amount of resources; in the gamemode, it's - 80 divided by the number of overminds, in the event, it's 20 plus the number - of active players, and otherwise, it's 60. - - bugfix: You can no longer move blob cores into space, onto the mining shuttle, - white ship, gulag shuttle, or solars. - - bugfix: Blob rounds might be less laggy, if they were laggy? - - tweak: Blobs don't heal as fast, excluding the core. - - experiment: Blobs are marginally less destructive to their environment. - MrStonedOne: - - rscdel: The server will no longer wait until the next tick to process movement - key presses. Movements should now be ~25-50ms more responsive. - Shadowlight213: - - rscadd: Adds modular computers -2016-08-21: - Ergovisavi: - - tweak: Consolidates the fulton packs into a single item and makes them more user - friendly - Google Play Store: - - spellcheck: Minor Text Fixes. - Incoming5643: - - rscadd: Smuggler satchels left behind hidden on the station can now reappear in - a later round. - - experiment: There's absolutely no way of knowing when exactly it will reappear - however... - - rscadd: Only one item in the satchel will remain when the satchel reappears. - - rscadd: Items are saved in their initial forms, so saving things like chemical - grenades will only disappoint you. - - rscadd: The item pool is map specific and needs to be a certain size before satchels - can start reappearing, so get to hiding that loot! - - rscadd: The staff of change has been expanded to turn you into even more things - that don't have hands. - Jalleo: - - bugfix: Gulag Teleporter of two issues any more please report them. - Jordie0608: - - rscadd: Advanced Energy Guns once again have a chance to irradiate you if EMPed. - Kor: - - rscadd: Kinetic Accelerators are now modular. You can find mod kits in the mining - vendor and in RnD. - - bugfix: Chaplain's dormant spellblade is no longer invisible. - Papa Bones: - - rscadd: A new, scandalous outfit is now available as contraband from the clothesmate - vendor, check it out! Fulfill your deep, dark fantasies. - Shadowlight213: - - tweak: Service and cargo have lost roundstart tablets and engineering has gained - them - - tweak: you can now charge battery modules in cell chargers. Use a screwdriver - on a computer to remove them. As a note, tablets and laptops can be charged - directly by placing them in a security charger. - WJohnston: - - rscadd: Metastation and Boxstation now boast auxillary mining construction rooms - in arrivals. These allow you to build a base and then launch it to wherever - you want on lavaland. - Wjohnston, Gun Hog: - - rscadd: Aliens with Neurotoxic Spit readied will now have drooling animations. - - rscadd: Hunters may now safely leap over lava. - - tweak: Hulk punches no longer stun Xenos. - - tweak: Alien evolve and promotion buttons updated to current Xeno sprites - - bugfix: Handcuff sprites for Xenos now show properly. -2016-08-22: - Bawhoppen: - - rscdel: Stock computers have been temporarily removed due to imbalances. - Ergovisavi: - - bugfix: Bubblegum's charge indicator should be significantly more accurate now. - ExcessiveUseOfCobblestone: - - rscdel: Reverts getting partial credit for discovered seeds. - - tweak: 'Tweaks Money Tree Potency Values [For instance: 1000 Space Cash requires - 98-100 Potency]' - Lzimann & Lexorion: - - rscadd: Adds a bow to the game, currently not craftable - Shadowlight213: - - bugfix: The efficiency AI sat SMES will now charge the APCs instead of itself. - XDTM: - - rscdel: Removed the Longevity symptom. - - rscadd: Added Viral Aggressive Metabolism, which will make viruses act quickly - but decay over time. - - rscadd: Cloning can now give bad mutations if unupgraded! - - rscadd: Cloning can, however, give you good ones if upgraded! -2016-08-24: - Bones: - - rscadd: The detective's closet now contains a seclite, get sleuthing! - Cargo Intelligence Agency: - - rscdel: You don't get to bring traitor items. - Ergovisavi: - - rscadd: Adds "Sacred Flame", a spell that makes everyone around you more flammable, - and lights yourself on fire. Share the wealth. Of fire. - - tweak: Replaces the fireball spellbook as a possible reward from a Drake chest - with a book of sacred flame. - Gun Hog: - - rscadd: The Aux mining base can now call the mining shuttle once landed! The mining - shuttle beacon that comes with the base must be deployed to enable this functionality. - - tweak: Multiple landing zones may now be set for the mining base. - - tweak: The coordinates of each landing zone is shown in the list. - - rscadd: Miners now each get a remote in their starting lockers. tweak The Aux - mining base now requires lighting while on station. - - tweak: The Aux Mining Base now has a GPS signal. - - tweak: The Aux Mining Base now has an alarm for when it is about to drop. - Incoming5643: - - rscadd: 'A slight change to the secret satchel system described below: If a satchel - cannot be spawned due to there not being enough hidden satchels to choose from, - a free empty satchel will spawn hidden SOMEWHERE on the station. Dig - it up and bury it with something interesting!' - Joan: - - rscadd: Using a resonator on an existing resonator field will immediately detonate - that field. Normal resonators will reduce the damage dealt to 80% of normal, - while upgraded resonators will not reduce it at all. - - rscadd: Adds a KA mod that does damage in an AoE, found only in necropolis chests. - - rscadd: You can now install any KA mods into a mining cyborg, though its mod capacity - is slightly lower. - - tweak: Mining cyborgs now have a crowbar to remove mods from their KA. - - tweak: Kinetic Accelerators now have a larger mod capacity, though most mods can - still only be installed the same amount of times as they can currently. - - tweak: You can now hit modkits with Kinetic Accelerators to install that modkit - into the accelerator. Mining cyborgs are unable to do so. - - rscadd: Added white and adjustably-coloured tracer round mods to the mining equipment - vendor, so you can see where your projectile is going(and look cool). - - rscadd: Added the super and hyper chassis mods to the mining equipment vendor, - so you can use excess mod space to have a cool-looking KA. - MrStonedOne: - - rscdel: Removes check on lights preventing you from turning them on while in a - locker - PKPenguin321: - - rscadd: Xeno queens now have an action button that makes them appear to themselves - as the old, small queen sprite. Now they should be able to interact with things - that are above them more easily. - Shadowlight213: - - tweak: Reviver and nutriment implants are far easier to get and have lower tech - origins. - - rscdel: Centcom has cut back on their cat carrier budget and will now only be - able to bring kittens along with runtime. - - rscadd: A new event has been added. The automated grid check. All apcs in non - critical areas will be shut off for some time, but can be manually rebooted - via interaction. - Yackemflam: - - tweak: Boxes are worth >26 tc at LEAST -2016-08-28: - CoreOverload: - - tweak: You can now use sheets from any hand, not just the active one. - Iamgoofball: - - tweak: Station and Character names are now allowed to be longer. - - rscdel: Gender Reassignment surgery has been removed. - Incoming5643: - - experiment: 'Due to a bad case of "being terrible" the save system for secret - satchels has been reworked. All saves are now unified in a single data file: - /data/npc_saves/SecretSatchels' - - rscdel: 'Old savefiles such as: /data/npc_saves/SecretSatchels_Box Station can - now be safely removed.' - - rscadd: A new slime reaction has been found for pink slimes using blood. The potion - produced from this reaction can be used to change the gender of living things. - Decently useful for animal husbandry, but otherwise mostly just for pranks/"""roleplay"""/enforcing - a brutal regime composed entirely of female slime people. - Joan: - - bugfix: Bumping the AI on help intent will no longer cause it and you to swap - positions, even if it is unanchored. If unanchored, it will properly push the - AI around. - - rscadd: The staff of lava can now turn lava back into basalt. - - bugfix: Placing a singularity or energy ball generator directly in front of an - active particle accelerator may be a bad idea. - Kor: - - rscadd: Added Battlemage armour to the spellbook. The armour is heavily shielded, - but will not recharge once the shields are depleted. - - rscadd: Added armour runes to the spellbook, which can grant additional charges - to the Battlemage armour. - MrStonedOne: - - rscadd: The game window will now flash in the taskbar on incoming admin pm, and - to all admins when an admin help comes in. - PKPenguin321: - - rscadd: The tesla is now much more dangerous, and can cause electronics to explode - violently. - - rscadd: It now hurts to get thrown into another person. - Shadowlight213: - - tweak: The radiation storm random event will automatically enable and disable - emergency maint. - - rscadd: The radiation storm random event is now a weather type that affects the - station. - - bugfix: The security temperature gun now has a firing pin making it 0.0000001% - more useful! - - rscadd: Added config option to use byond account creation age for job limits. - WJohnston: - - imageadd: Lavaland lava probably sorta looks better I guess. - Yackemflam: - - rscadd: Sniper kit have been given as a syndicate bundle set. Be warned though, - they are not as equipped as the nuclear agent kits. - kilkun: - - rscadd: Adds a shielded deathsquad hardsuit. it has four charges and recharges - after 15 seconds of not being shot (compared to the syndicate 3 charges and - 20 second recharge rate) - - tweak: All death commandos now spawn with this new hardsuit. The previous hardsuit - was not removed. - pubby: - - rscadd: Mining scanner module to standard borgs - - rscdel: Sheet snatcher module from standard borgs - xxalpha: - - rscadd: Cigarette packs, donut boxes, egg boxes can now be closed and opened with - Ctrl+Click. - - rscadd: Lighters are now represented in cigarette packs with a sprite of their - own. - - rscadd: You can now remove a lighter from a cigarette pack quickly with Alt+Click. - - bugfix: Reduced the amount of cigars that cigar cases can hold to 5 because the - cigar case sprite doesn't support more than that. -2016-08-29: - Cruix: - - rscadd: Space floppy-disk technology has advanced to the point that multiple technologies - or designs can be stored on a single disk. - Joan: - - rscadd: Lava bubbling up from basalt turfs now glows if in sufficient concentration. - - rscadd: Necropolis tendrils now glow. - - rscadd: Lava rivers now have riverbanks, and should overall look much nicer. - Shadowlight213: - - bugfix: The revenant ectoplasm sprite is no longer invisible. - Xhuis: - - rscadd: Highlander has been revamped. Now you can butcher your coworkers in cold - blood like never before! -2016-08-30: - oranges: - - tweak: The ed209 can now only fire as fast as the portaturrets -2016-08-31: - Iamgoofball: - - rscadd: Adds a new experimental gas to the game. Check it out! - Joan: - - rscadd: Vanguard now has a tooltip showing the amount of stuns you've absorbed - and will be affected by. - MMMiracles: - - bugfix: Xenomorphs can now actually damage barricades. - Shadowlight213: - - bugfix: Fixed runtime preventing access locked programs from being downloaded - XDTM: - - rscadd: Metal slimes now spawn a few sheets of glass when injected with water. - xxalpha: - - tweak: Opening and closing of donut boxes, etc. is now done with clicking the - object with itself. - yackemflam: - - rscadd: The standard rounds now blow off limbs. Happy hunting! -2016-09-01: - Cruix: - - bugfix: fortune cookies will now drop their fortunes when they are eaten. - Iamgoofball: - - tweak: NULL Crate in cargo was added again because people are fucking idiots so - if we're going to have this stupid fucking crate might as well make it not fucking - garbo - Kor: - - rscadd: Watertanks will now explode when shot. - Lzimann: - - tweak: You can now open all access doors while restrained. - Shadowlight213: - - tweak: Rad storms are more obvious - - bugfix: Pizza bombs will now delete after exploding. - phil235: - - tweak: Putting packagewrap or hand labeler in a backpack is now done by clicking - and dragging. - - bugfix: You can now wrap backpacks and other storage items with packagewrap. -2016-09-02: - A-t48: - - bugfix: Fixed cyborgs being able to use Power Warning emote when broken. - Iamgoofball: - - experiment: Freon has been reworked completely. - - rscadd: Water Vapor has been added to the Janitor's Closet. - RemieRichards: - - bugfix: Cutting bedsheets with a sharp object/wirecutters no longer puts the resulting - cloth INSIDE OF YOU if you're holding it, what a bug. - bgobandit: - - tweak: You can hide small items in urinals now. Use a screwdriver to screw open - the drain enclosure. - - rscadd: Every space urinal comes complete with space urinal cake. Do not eat. -2016-09-04: - A-t48: - - bugfix: Radiation storms no longer spam "Your armor softened the blow." - - bugfix: Radiation always gives a message that you are being irradiated, regardless - of armor level (only an issue if you stripped off all clothing) - - bugfix: Radiation now displays a message appropriate for all mob types (no longer - references clothes). - Gun Hog: - - rscadd: Ghosts may now read an AI or Cyborg's laws by examining them. - Joan: - - rscadd: The talisman of construction now has 25 uses, each of which can convert - a sheet of plasteel to a sheet of runed metal. It can still convert metal into - construct shells, and requires no specific amount of uses to do so. - - rscadd: Added the 'Drain Life' rune to the runes cultists can make. It will drain - life from all creatures on the rune, healing the invoker. - - imageadd: The 'Astral Communion' rune has a new sprite, made by WJohnston. - - rscdel: You can no longer use telekinesis to hit people with items they're holding, - items inside items they're holding, items embedded in them, items actually implanted - in them, or items they're wearing. - MMMiracles: - - rscadd: A set of combat gear for bears has been added, see your local russian - for more information. - XDTM: - - tweak: Nanotrasen has now stocked the DNA Manipulators with potassium iodide instead - of epinephrine as rejuvenators. -2016-09-07: - A-t48: - - bugfix: you can now scrub freon and water vapor - - bugfix: you can now label canisters as freon and water vapor - AnturK: - - rscadd: Watch out for special instructions from Centcom in the intercept report. - Cheridan: - - tweak: Brain damage no longer causes machines to be inoperable. - Ergovisavi: - - bugfix: Stops ash drakes from swooping across zlevels - Impisi: - - tweak: Increased chances of Modular Receiver drop in Maintenance - Incoming5643: - - rscdel: Wizards can no longer purchase the Cursed Heart from their spellbook. - Joan: - - experiment: The lava staff now has a short delay before creating lava, with a - visible indicator. - - tweak: The lava staff's cooldown is now somewhat shorter, and turning lava back - into basalt has a much shorter cooldown and no delay. - Lzimann: - - tweak: Stunprods no longer fit in your backpack, they go on your back now. - MrStonedOne: - - bugfix: Fixed lava sometimes doing massive amounts of damage. - - tweak: AFK players will no longer default to continue playing during restart votes. - XDTM: - - bugfix: Cloners now preserve your genetic mutations. - pubby: - - tweak: Changed military belt TC cost from 3 -> 1 - - tweak: Update ingredient boxes to have more useful ingredients -2016-09-08: - Jordie0608: - - rscadd: Notes can now be tagged as secret to be hidden from player viewed notes. - Lzimann: - - tweak: Legion implants now have a full heal when implanted instead of passive - heal + spawn tentacles. The healing also goes off when you enter crit. - Yackemflam: - - rscadd: You can now buy a box for a chance to mess with the stations meta for - ops. -2016-09-09: - Ergovisavi: - - rscadd: Adds new loot for the colossus, the "Anomalous Crystal" - - tweak: Enabled colossus spawning again - Joan, Ausops: - - rscadd: Added some very fancy tables, constructed by adding carpet tiles to a - standard table frame. - MrStonedOne: - - experiment: Blessed our beloved code with dark magic. - Shadowlight213: - - tweak: Radiation storm direct tox loss removed - - tweak: Radiation storms now cause a radiation alert to appear for the duration -2016-09-12: - Joan: - - rscadd: Cult structures can once again be constructed with runed metal. - - experiment: Cult structures can now take damage and be destroyed. Artificers can - repair them if they're damaged. - - tweak: The Recollection function of the clockwork slab is much more useful and - easier to parse. - - wip: Tweaked the Recital menus for scripture so the scripture are all in the proper - order. This might fuck you up if you were used to the incorrect order, but you'll - get used to it. - Nanotrasen Anti-Cheese Committee: - - bugfix: A glitch in the hydroponics tray firmware allowed it to retain plant growth - even after the plant was removed, resulting in the next planted seed being grown - instantaneously. This is no longer possible. - PKPenguin321: - - bugfix: Tesla shocks from grilles will no longer do thousands and thousands of - damage. They now properly deal burn damage that is equal to the current power - in the powernet divided by 5000. - Papa Bones: - - tweak: You can now rename the captain's sabre by using a pen on it. - RemieRichards: - - rscadd: Added the functionality for mobs to have multiple hands, this might have - broken some things, so please report any weirdness - Shadowlight213: - - rscdel: The surplus crate and random item will now only contain items allowed - by the gamemode - - rscdel: removes sleeping carp scroll from surplus crates - - experiment: Minimaps will now try to load from a cache or backup file if minimap - generation is disabled. - TheCarlSaganExpress: - - rscadd: Crayons, lipstick, cigarettes, and penlights can now be inserted into - PDAs. - phil235: - - rscadd: Monkeys can be dismembered. - - rscadd: Humans, monkeys and aliens can drop limbs when they are gibbed. - - rscadd: Roboticists can remove flashes, wires and power cells that they inserted - in robot head or torso by using a crowbar on it. - - rscadd: visual wounds appear on a monkey's bodyparts when injured, exactly like - humans. - - rscadd: Using a health analyzer on a monkey or alien shows the injuries to each - bodypart. - - rscadd: Monkeys can become husks. - - bugfix: Human-monkey transformations now respect missing limbs. No more limb regrowth - by becoming a monkey. - - bugfix: Changeling's regenerate ability also work while in monkey form. - - bugfix: Alien larva has its own gib and dust animation. - - bugfix: A bodypart that looks wounded still looks bloody when dismembered. - - bugfix: Amputation surgery now works on robotic limbs, and monkeys. -2016-09-14: - Ergovisavi: - - bugfix: Fixes lockers, bodybags, etc, giving you ash storm / radiation storm protection - Erwgd: - - rscadd: Upgraded sleepers can now inject inacusiate to treat ear damage. - Joan: - - rscadd: Added brass, producible by proselytizing rods, metal, or plasteel, or - by using Replicant Alloy in-hand, and usable to construct a variety of cult-y - brass objects. - - tweak: Objects constructable with brass include; wall gears, pinion airlocks, - brass windoors, brass windows, brass table frames and tables, and brass floor - tiles. - - rscadd: Cogscarabs can convert brass sheets into liquified alloy with their proselytizer. - - tweak: You can use brass sheets on wall gears to produce clockwork walls, or, - if the gear is unanchored, false clockwork walls. - - bugfix: Fixed a bug preventing you from converting grilles into ratvar grilles. - - experiment: Please note that conservation of mass exists. - Sligneris: - - tweak: Captain's space armor has been readapted with modern hardsuit technology. - oranges: - - tweak: Examine code for dismembered humans now has better easter eggs -2016-09-17: - BoxcarRacer41: - - rscadd: Added a new food, bacon. Bacon is made by processing raw meat cutlets. - - rscadd: Added a new burger recipe, the Bacon Burger. It is made with one bun, - one cheese wedge and three pieces of cooked bacon. - Ergovisavi: - - rscadd: Added a nightvision toggle to Shadowpeople - - tweak: Made several anomalous crystal variants more easily identified/easier to - see the effects thereof, and removed the "magic" activation possibility (replaced - with the "bomb" flag) - Gun Hog: - - tweak: Nanotrasen Robotics Division is proud to announce slightly less clunky - leg servo designs relating to the "Ripley" APLU and "Firefighter" exosuits. - Tests show increased mobility in both high and low pressure environments. The - previous designer has been fired for incompetence. - Improves tablets design: - - imageadd: Brings the tablet icons into the holy light of having depth - Joan: - - rscadd: Megafauna will now use ranged attacks even if they don't have direct vision - on their target. - - rscadd: Volt Void and Interdiction Lenses will now drain mech cells of energy. - - tweak: Ocular Wardens do slightly more damage to mechs. - - experiment: Replicant, Soul Vessel, Cogscarab, and Anima Fragment now take an - additional second to recite. - - tweak: Anima Fragments do slightly less damage in melee. - - tweak: Mending Motors and Clockwork Obelisks have slightly less health. - - tweak: Invoking Nezbere now requires 3 invokers. - - rscdel: Clockwork armor no longer has 5% energy resistance. - - bugfix: You can no longer construct clockwork structures on space turfs. - Papa Bones: - - tweak: BZ gas is no longer available on Box and Metastation layouts. - phil235: - - tweak: You no longer have to click a megaphone to use it, you simply keep it in - your active hand and talk normally. - - rscadd: Added new things - - imageadd: added some icons and images -2016-09-20: - Ergovisavi: - - bugfix: fixed "friendly" xenobio mobs and mining drones attacking station drones - Joan: - - rscadd: Miners can now buy KA AoE damage mods from the mining vendor for 2000 - points per mod. - - rscadd: 'Combined the Convert and Sacrifice runes into one rune. It''ll convert - targets that are alive and eligible, and attempt to sacrifice them otherwise. - The only changes to mechanics are that: Converting someone will heal them of - all brute and burn damage they had, and sacrificing anything will always produce - a soulstone(but will still only sometimes fill it)' - - tweak: You can no longer teleport to Teleport runes that have dense objects on - top of them. - - experiment: Wall runes will now activate other nearby wall runes when activated, - but will automatically disable after a minute and a half of continuous activity - and become unusable for 5 seconds. - - experiment: The Blood Boil rune no longer does all of its damage instantly or - stuns, but if you remain in range for the full duration you will be sent deep - into critical. - - experiment: Bubblegum has been seen reaching through blood. Try not to get hit. - - experiment: The Raise Dead rune no longer requires a noncultist corpse to revive - a cultist; instead, it will draw from the pool of all people sacrificed to power - the rune. - Mekhi: - - rscadd: Nanotrasen has been experimenting on cybernetics for a while, and rumors - are they have a few combat prototypes available... - - experiment: 'New arm implants: Energy-blade projector, implanted medical beamgun, - stun-arm implant (Like the borg version), flash implant that is automatically-regenerating - and doubles as a powerful flashlight. There is also one with all four items - in one. Also, a surgery toolkit implant. Adminspawn only for the moment.' - MrStonedOne: - - bugfix: Fixed space/nograv movement not triggering when atoms moved twice quickly - in space/nograv - Nanotrasen Stress Relief Board: - - rscadd: Latecomers to highlander can now join in on the fun. - - rscadd: The crew are encouraged to less pacifistic during highlander. Failing - to shed blood will result in your soul being devoured. Have a nice day. - Nicho1010: - - bugfix: Fixed lattices appearing after exploding lava - Screemonster: - - tweak: Abandoned crates no longer accept impossible guesses. - - tweak: Lets players know that all the digits in the code must be unique. - - tweak: Reads the last guess back on the multitool along with the correct/incorrect - guess readout. - - bugfix: multitool output on crates no longer returns nonsense values. - XDTM: - - rscadd: Positive viruses are now recognized by medical HUDs with a special icon. - - tweak: fully_heal no longer removes nonharmful viruses. This affects legion souls, - staffs of healing, and changeling's revive. - - rscadd: Canisters of any type of gas are now orderable in cargo. Dangerous experimental - gases will require Research Director approval. - Yackemflam: - - rscadd: The syndicate has learned on how to give their agents a true syndicate - ninja experience. - chickenboy10: - - rscadd: Added a Experimental Limb Grower to the medbay department, now medical - stuff can grow synthetic limbs using Synthflesh to help crew that suffer any - work related accidents. There may also be a limb that can be grown with a special - card... - feemjmeem: - - tweak: You can now disassemble meatspike frames with a welding tool. - phil235: - - experiment: 'adds a talk button next to the crafting button. Clicking it makes - a "wheel" appear around you with short predetermined messages that you click - to say them. This lets you say common responses without having to type in the - chat bar. Current messages available are: "Hi", "Bye", "Thanks", "Come", "Help", - "Stop", "Get out", "Yes", and "No". The talk button can be activated with the - hotkey "H" or "CTRL+H"' - - rscadd: Wearing colored glasses colors your vision. This option can be enabled/disabled - by alt-clicking any glasses with such feature. -2016-09-21: - Cyberboss: - - bugfix: The food processor's sprite's maintenance panel is no longer open while - closed and vice/versa - - tweak: Tesla arcs no longer lose power when passing through a coil that isn't - connected to a grid - MrStonedOne: - - bugfix: Fixes minimap generation crashes by making parts of it less precise -2016-09-23: - Cyberboss: - - rscadd: Wire layouts of NanoTransen devices for the round can now be found in - the Station Blueprints - Incoming5643 + WJohnston: - - imageadd: Lizard sprites have received an overhaul, sprites courtesy of WJohnston! - - rscdel: While there are some new bits, a few old bits have gone by the wayside, - if your lizard has been affected by this the specific feature will be randomized - until you pick a new setting. - - rscadd: Lizards can now choose to have digitigrade legs (those weird backwards - bending ones). Keep in mind that they can only be properly seen in rather short - pants. They also preclude the use of shoes. By default no lizard will have these - legs, you have to opt in. - - rscadd: All ash walker lizards however are forced to have these legs. - - experiment: There is absolutely no tactical benefits to using digitigrade legs, - you are only crippling yourself if you use them. - Papa Bones: - - tweak: You can now quick-draw the officer's sabre from its sheath by alt-clicking - it. - XDTM: - - bugfix: Holy Water no longer leaves you stuttering for years. -2016-09-24: - Cheridan: - - tweak: Nerfed Critical Hits - MrStonedOne: - - tweak: Orbits now use a subsystem. - - tweak: Orbits now bind to object's moving to allow for quicker updates, subsystem - fallback for when that doesn't work (for things inside of things or things that - move without announcing it) - XDTM: - - rscdel: Viruses start with 0 in every stat instead of 1. - - bugfix: Atomic Bomb, Pan-Galactic Gargle Blaster, Neurotoxin and Hippie's Delight - are now proper alcoholic drinks, and as such can disinfect, ignite, and be purged - by antihol. - optional name here: - - tweak: Changes cursed heart description to something slightly more clear. - - bugfix: Fixes a capitalization issue -2016-09-26: - Cuboos: - - rscadd: Added E-cigarettes as contraband to cigarettes vending machines. They - take reagents instead of dried plants and also hold more than cigarettes or - pipes. You can modify them to puff out clouds of reagents or emag them to fill - a whole room with reagent vapor. - - rscadd: Added a new shirt to the clothing vendor relating to the newly added vapes. - Joan: - - tweak: Blobs will generally require fewer blobs to win during the blob mode, which - should hopefully make the mode end faster at lower overmind amounts. - Razharas: - - rscadd: '"Kudzu now keeps the mutations it had before and thus can be properly - cultivated to be whatever you want"' - TheCarlSaganExpress: - - rscadd: You may now insert crayons, lipstick, penlights, or cigarettes in your - PDA. - - bugfix: Removing cartridges from the PDA will no longer cause them to automatically - fall to the floor. - oranges: - - rscadd: It looks like a pizza delivery from an un-named station got misplaced -2016-09-27: - Cobby: - - tweak: Nanotrasen has buffed the electronic safety devices found in Secure Briefcases - and Wallsafes, making them... well... more secure. In Particular, we added more - wires that do absolutely nothing but hinder the use of the multitool, along - with removing the ID slot only used by syndicates to emag the safe. - Incoming5643: - - rscadd: The secret satchels system has been updated to hide more smuggler's satchels - hidden randomly under the station - - experiment: In case you forgot about the secret satchel system, basically if you - take a smuggler's satchel (a traitor item also occasionally found under a random - tile in the station [USE T-RAYS]), stow away an item in it, and bury it under - the floor tiles that item can reappear in a random later round! - MrStonedOne: - - tweak: Custom Round end sounds selected by admins will be preloaded to all clients - before actually rebooting the world - Shadowlight213: - - bugfix: Fixes broken icon states when replacing warning floor tile - Supermichael777: - - tweak: Cat men have finally achieved equal discrimination. - TrustyGun+Pubby: - - imageadd: Lawyers now have unique speech bubbles. - XDTM: - - tweak: Using plasma on dark blue slimes will now spawn freon instead of arbitrarily - freezing mobs. - uraniummeltdown: - - tweak: Protolathe stock parts now build 5 times faster -2016-09-28: - Cuboos: - - bugfix: Removed the admin message spam from the smoke_spread proc. You may now - vape in peace without the threat of a Blue Space Artillery - LanCartwright: - - rscdel: Removed Stimulants and Coffee from survival pens. - - tweak: Nanites have been replaced with Mining Nanites which heal more when you - are lower health, and do not have the ridiculous healing Adminorazine had. -2016-10-01: - Incoming5643: - - rscadd: After years of having to live on a mostly blown up hunk of junk the wizard's - ship has finally been repaired - - rscdel: No one paid attention to that lore anyway -2016-10-07: - WJohnston: - - imageadd: Improved/resprited AI card, pAI, easel/canvases, shotgun shells, RCD - cartridge, speedloaders, and certain older buttons. - - imageadd: Improved/resprited a few bar signs, basketball/dodgeball/hoop, blood - bags, and body bags. - - imageadd: Improved/resprited Paper, stamps, folders, small fires, pens, energy - daggers, cabinets, newspaper and other bureaucracy related items. -2016-10-10: - ChemicalRascal: - - bugfix: Previously, improving the incinerator's efficiency made the RPM decay - more quickly, instead of less quickly. No more! - Cyberboss: - - rscadd: More reagent containers can be used for filling your dirty vapor cancer - sticks - - spellcheck: Fixed some vape spelling/grammar - MrStonedOne: - - tweak: Player Preferences window made slightly faster. - Nanotrasen Stress Relief Board: - - rscdel: Claymores created through Highlander no longer thirst for blood or announce - their wielder's location incessantly. - - bugfix: Claymores should now properly absorb fallen foes' corpses. - - bugfix: Losing a limb now properly destroys your claymore. - Supermichael777: - - bugfix: The wizards federation have instituted a strict 1 demon limit on demon - bottles. - XDTM: - - rscadd: Using blood on an Oil Slime will create Corn Oil. - - rscadd: Using blood on Pyrite Slimes will create a random crayon. - - rscadd: Using water on Orange Slimes will create a small smoke cloud. - - rscadd: Using water on Blue Slimes will spawn foam. - - rscadd: You can now retrieve materials inserted in a Drone Shell Dispenser with - a crowbar. - phil235: - - rscadd: A whole bunch of structures and machines can now be broken and destroyed - using conventional attack methods. - - rscadd: The effect of fire on objects is overhauled. When on fire, your external - clothes now take fire damage and can become ashes, unless fire proof. All objects - caught in a fire can now take fire damage, instead of just flammable ones, unless - fire proof. - - rscadd: Acid effect is overhauled. Splashing acid on something puts a green effect - on it and start slowly melting it. Throwing acid on mobs puts acid on their - clothes. Acid can destroy structures and items alike, as long as they're not - acid proof. The more acid put on an object, the faster it melts. Walking on - an acid puddle puts acid on your shoes or burns your bare feet. Picking up an - item with acid without adequate glove protection burns your hand. Acid can be - washed away with any sort of water source (extinguisher, shower, water glass,etc...). - - rscadd: When a mob receives melee attacks, its clothes also get damaged. Clothes - with enough damage get a visual effect. Damaged clothes can be repaired with - cloth (produced with botany's biogenerator). Clothes that receives too much - melee damage become shreds. - - tweak: Clicking a structure/machine with an item on help intent can never result - in an attack. - - tweak: Hostile animals that are environment destroyers no longer destroys tables&closets - in one hit. It now takes several hits depending on the animal. -2016-10-11: - Cyberboss: - - rscadd: The waste line now has a digital valve leading to space (off by default) - along with a port on it's far side - Incoming5643: - - rscadd: Wizards may finally use jaunt and blink on the escape shuttle. Maybe elsewhere - too? - - bugfix: The previously broken radios in the wizards den should work now. You still - have to turn them on though. - Kor: - - rscadd: Added frogs, with sprites by WJ and sounds by Cuboos. - Papa Bones: - - rscadd: Flora now spawns in lavaland tunnels, they can be harvested with a knife. - - rscadd: Flora have a range of effects, be careful what you eat! - - bugfix: You harvest flora on lavaland with your hands, not a knife. My bad. - Shadowlight213: - - rscadd: Cargo can order the antimatter engine -2016-10-12: - Cyberboss: - - bugfix: Fixed motion alarms instantly triggering and de/un/re/triggering - - bugfix: Airlock speed mode now works - Joan: - - rscadd: You can now deconstruct AI cores that contain no actual AI. - WJohnston: - - imageadd: Recolored and resprited candles and ID cards. Folders should have improved - color contrast. - XDTM: - - rscadd: Exhausted slime extracts will now dissolve instead of leaving useless - used slime extracts. - - tweak: Airlocks are now immune to any damage below 20, to prevent pickaxe prison - breaks. - - tweak: High-Security Airlocks, such as the vault or the AI core's airlocks, are - now immune to any damage below 30. -2016-10-13: - Razharas: - - tweak: Makes clicking something in heat of battle a bit easier by making drag&drops - that dont have any effect be counted as clicks - XDTM: - - rscadd: 'Added four new symptoms: Regeneration and Tissue Regrowth heal respectively - brute and burn damage slowly; Flesh Mending and Heat Resistance are the level - 8 version of those symptoms, and heal faster.' - - rscdel: The Toxic Compensation, Toxic Metabolism and Stimulants symptoms have - been removed. - - rscdel: Viruses no longer stack. Viruses can be overridden if the infecting virus - has higher transmittability than the previous virus' resistance. - - tweak: Viruses can now have 8 symptoms, up from 6. - - rscadd: You can now store monkey cubes in bio bags; using bio bags on the consoles - will load them with the monkey cubes inside the bags. - ma44: - - rscadd: Cargo can now order a 2500 supply point crate that requires a QM or above - to unlock. This crates contains a explorer suit, compact pickaxe, mesons, and - a bag to hold ore with. -2016-10-16: - Cuboos: - - rscadd: Added a new unique tool belt to the CE - - rscadd: Added new power tools, a hand drill that can be used as a screw driver - or wrench and jaws of life which can be used as either a crowbar or wire cutters - - rscadd: Power tools can also be made from the protolathe with engineering and - electromagnet 6 - - tweak: slightly revamped how construction/deconstruction handle sound - - soundadd: added new sounds for the power tools - - soundadd: added a new sound for activating and deactivating welding tools, just - because. - Cyberboss: - - bugfix: Plasma fires no longer cause cameras to break. - Joan: - - tweak: Blazing Oil blobs are now outright immune to fire. This does not affect - damage taken from other sources that happen to do burn damage. - - tweak: Normal blob spores now take two welder hits to die, from three. - - tweak: Cyborgs now die much less rapidly to blob attacks. - Lzimann: - - tweak: 'Changed two admin hotkeys: f7 is now stealth-mode and f8 to toggle-build-mode-self.' - Shadowlight213: - - bugfix: Modular consoles have been fixed. - Supermichael777: - - tweak: Changeling Sting is now one part screwdriver cocktail and 2 parts lemon-lime - soda. - - bugfix: Triple citrus now actually displays its sprite. - Yackemflam: - - tweak: extinguishers now spray faster - coiax: - - rscadd: RCDs have a Toggle Window Type verb allowing the rapid construction of - reinforced windows, rather than regular windows. - - rscadd: RCDs can now finish and deconstruct wall girders. - phil235: - - tweak: Clicking a floor with a bodybag or roller bed now deploys them directly - (and the bodybag starts open) - scoopscoop: - - bugfix: The cult shifter will now properly spawn as part of the veil walker set. -2016-10-18: - Basilman: - - rscadd: A third martial art, CQC, has been added and is now available to nuke - ops instead of sleeping carp - Kor: - - rscadd: Added sloths to cargobay on Box and Meta - MrPerson: - - rscadd: New toxin - Rotatium. It doesn't quite do what it does on other servers. - Instead it rocks your game view back and forth while slowly doing toxin damage. - The rocking gets more intense with time. - - rscadd: To make it, mix equal parts mindbreaker, neurotoxin, and teslium. - MrStonedOne: - - experiment: Byond 511 beta users may now choose their own FPS. This will apply - to animations and other client side only effects. Find it in your game preferences. - Shadowlight213: - - bugfix: fixed removing modular computer components - TheCarlSaganExpress: - - tweak: Provided you have access, you may now use your ID to unlock the display - case. - - tweak: The fire axe cabinet and display case may now be repaired with the welder. - XDTM: - - rscadd: You can now grind slime extracts in a reagent grinder. If the slime was - unused it will result in slime jelly, while if used it will only output the - reagents inside the extract. - Yackemflam: - - bugfix: fixed the standard vest being weaker than the slim variant - lordpidey: - - rscadd: There is a new potential obligation for devils to have. Musical duels. Ask - your nearest devil for a musical duel, there's a 14% chance he's obligated to - do it. - - rscdel: Removed the old offering a drink obligation for devils, it overlapped - too much with the food obligation. - - tweak: Trying to clone people who've sold their soul now results in FUN. - - tweak: Devils can no longer spam ghosts with revival contracts. - phil235: - - rscadd: Visual effects appear on the target of an attack, similar to the item - attack effect. - - rscdel: You now only see a message in chat when witnessing someone else getting - attacked or hit by a bullet if you are close enough to the action. -2016-10-19: - Cyberboss: - - bugfix: Physically speaking is no longer delayed by your radio's lag - - bugfix: You can now attack doors with fireaxes and crowbars when using the harm - intent - - tweak: The BSA is no longer ready to fire when constructed - - bugfix: The BSA can no longer be reloaded faster by rebuilding the console - MrStonedOne: - - tweak: tweaked the settings of the space drift subsystem to be less effected by - anti-lag slowdowns - Pubby: - - rscadd: 'A new map: PubbyStation. Set it to your favorite in map preferences!' - XDTM: - - rscadd: PanD.E.M.I.C. now displays the statistics of the viruses inside. - phil235: - - tweak: Made the singularity gen and tesla gen immune to fire. - - tweak: All unique traitor steal objective item are now immune to all damage except - severity=1 explosion. - - tweak: Mobs on fire no longer get damage to their worn backpacks, belts, id, pocket - stuff, and suit storage. - - bugfix: Mob receiving melee attacks now only have its outer layer of clothes damaged, - e.g. no damage to jumpsuit when wearing a suit. - - bugfix: now all hardsuit have 50% more health, as intended. - wrist: - - rscadd: Toxins is different now. -2016-10-21: - Adam E.: - - tweak: Added cargo and engi access to auxillary mine base launching console. - Cyberboss: - - tweak: Your brain is now gibbed upon chestburst - - bugfix: The safe is indestructible again - Joan: - - rscadd: Wraith Spectacles will now slowly repair the eye damage they did to you - as long as you aren't wearing them. - - experiment: You can now see how much eye damage the spectacles have done to you - overall, as well as how close you are to being nearsighted/blinded. - - tweak: Mending Motors heal for more. - - wip: Mania Motors are overall more powerful; they have greater effect, but require - more power to run and less power to convert adjacent targets. - - experiment: Interdiction Lenses no longer require power to disrupt electronics - and will no longer disrupt the radios of servants. - - bugfix: You need to be holding teleport talismans and wizard teleport scrolls - in your hands when you finish the input, and cannot simply open the input and - finish it whenever you get stunned. - - tweak: The range for seeing visible messages in combat is a tile higher. - Screemonster: - - tweak: The anti-tamper mechanism on abandoned crates now resists tampering. - - tweak: Secure, non-abandoned crates can be given a %chance of exploding when tampered - with. Defaults to 0. - Shadowlight213: - - bugfix: The Swap minds wizard event will now function - Swindly: - - rscadd: The action button for a dental implant now includes the name of the pill - - bugfix: The pill activation button now properly displays the pill's icon - uraniummeltdown: - - rscadd: Adds more replacements to the Swedish gene -2016-10-22: - Shadowlight213: - - experiment: Breathing has been moved from species to the lung organ - - rscadd: Lung transplants are now possible! -2016-10-23: - Cyberboss: - - bugfix: Fixed a bug that caused door buttons to open doors one after another rather - than simultaneously like they are suppose to - - bugfix: NOHUNGER species no longer hunger - - bugfix: Appropriate gloves now protect you from getting burned by cheap cigarette - lighters - - rscdel: Labcoats no longer have pockets - Yackemflam: - - tweak: Riot helmets are now more useful in melee situations and the standard helmet - is now slightly weaker - uraniummeltdown: - - rscadd: Atmos grenades are now in the game and uplink -2016-10-24: - Batman: - - tweak: The sniper rifle descriptions are less edgy. - Cobby: - - rscadd: Finally, a way to relate to Bees! - Cyberboss: - - bugfix: Morphs no longer gain the transparency of chameleons - - bugfix: Turrets can no longer shoot when unwrenched - - bugfix: Spray bottle can now be used in the chem dispenser - Joan: - - rscadd: Clockwork marauders now have a HUD, showing block chance, counter chance, - health, fatigue, and host health(if applicable), as well as including a button - to try to emerge/recall. - - experiment: Clockwork marauders can now block bullets and thrown items, even if - Ratvar has not risen. - - rscadd: The Judicial Visor no longer requires an open hand to use. Instead, clicking - the button will give you a target selector to place the Judicial Marker. - - experiment: Tinkerer's Daemons are now a structure instead of a Cache addon. - - wip: Tinkerer's Daemons now consume a small amount of power when producing a component, - but produce components every 12 seconds with no additional delay. - - tweak: Adjusted the costs of the Tinkerer's Daemon and Interdiction Lens. - - imageadd: Floaty component images appear when Tinkerer's Caches and Daemons produce - components. - MrStonedOne: - - bugfix: Spectral sword now tracks orbiting ghosts correctly. - Shadowlight213: - - imageadd: Damaged airlocks now have a sparking effect - Swindly: - - rscadd: Added a button to the ChemMaster that dispenses the entire buffer to bottles. - ma44: - - rscadd: Reminds the user that reading or writing a book is stupid. -2016-10-27: - Chowder McArthor: - - rscadd: Added a neck slot. - - tweak: Modified some of the attachment items (ties, scarves, etc) to be neck slot - items instead. - Cyberboss: - - rscadd: NEW HOTKEYS - - rscadd: The number pad can be used to select the body part you want to target - (Cycle through head -> eyes -> mouth with 8) in hotkey mode. Be sure Numlock - is on! - - rscadd: Holding shift can be used as a modifier to your current run state in both - hotkey and normal mode. - - bugfix: Emag can no longer be spammed on shuttle console - Gun Hog: - - bugfix: Fixed AIs uploaded to mechs having their camera view stuck to their card. - Joan: - - rscadd: Clockwork Floors now have a glow when healing servants of toxin damage. - Only other servants can see it, so don't get any funny ideas. - - bugfix: The Interdiction Lens now properly has a high Belligerent Eye cost instead - of a high Replicant Alloy cost. - Pubby: - - tweak: PubbyStation's bar is now themed like a spooky castle! - Swindly: - - bugfix: Chem implants can now be properly filled and implanted - WJohnston: - - rscadd: Adds an unlocked miner equipment locker on Boxstation and Metastation's - Aux Base Construction area, as well as a telescreen to the camera inside. All - mining outpost computers can also see through that camera. - lordpidey: - - rscadd: The wizard federation has teamed up with various LARP groups to invent - a new type of spell. -2016-10-28: - Erwgd: - - rscadd: You can now use cloth to make black or fingerless gloves. - - tweak: Biogenerators require less biomass to produce botanist's leather gloves. - Tacolizard: - - rscadd: Added a new contraband crate to cargo, the ATV crate. -2016-10-29: - Chowder McArthor: - - bugfix: Added in icons for the neck slot for the other huds. - Cobby: - - rscadd: Adds several Halloween-Themed Emojis. See if you can get them all! [no - code diving cheaters!] - Erwgd: - - rscadd: The NanoMed Plus now stocks premium items. - Joan: - - experiment: Guvax is now targeted; invoking it charges your slab to bind and start - converting the next target attacked in melee within 10 seconds. This makes your - slab visible in-hand. - - tweak: Above 5 Servants, the invocation to charge your slab is not whispered, - and the conversion time is increased for each Servant above 5. - - wip: Using Guvax on an already bound target will stun them. The bound target can - resist out, which will prevent conversion. - - experiment: Sentinel's Compromise is now targeted, like Guvax, but can select - any target in vision range. - - rscadd: Sentinel's Compromise now also removes holy water from the target Servant. - - wip: Clicking your slab will cancel these scriptures. - - imageadd: Both of these will change your cursor, to make it obvious they're active - and you can't do anything else. - - rscadd: Arks of the Clockwork Justicar that do not summon Ratvar will still quick-call - the shuttle. - - bugfix: Clockwork structures that return power can now return power to the APC - of the area they're in if there happens to be one. - - bugfix: Clockwork structures that use power from an APC will cause that APC to - start charging and update the tgUI of anyone looking at the APC. - - bugfix: Converting metal, rods, or plasteel to brass with a clockwork proselytizer - while holding it will no longer leave a remainder inside of you. - - tweak: Plasteel to brass is now a 2:1 ratio, from a 2.5:1 ratio. Accordingly, - you now only need 2 sheets of plasteel to convert it to brass instead of 10 - sheets. - - tweak: Wall gears are now converted to brass sheets instead of directly to alloy. - - rscdel: You can no longer do other proselytizer actions while refueling from a - cache. - - bugfix: Fixed a bug where certain stacks wouldn't merge with other stacks, even - when they should have been. - - bugfix: Clockwork structures constructed from brass sheets now all have appropriate - construction value to replicant alloy ratios. - - bugfix: Tinkerer's Caches no longer need to see a clockwork wall to link to it - and generate components. - MrStonedOne: - - experiment: Shoes do not go on heads. - NikNak: - - rscadd: Action figures are finally winnable at arcade machines. Comes in boxes - of 4. - Pubby: - - rscadd: The holodeck has been upgraded with new programs. Try them out! - Shadowlight213: - - rscdel: The HOS and other heads of staff no longer have a chance to be revheads - TehZombehz: - - tweak: Custom food items can now fit inside of smaller containers, such as paper - sacks. - - rscadd: Small cartons can be crafted using 1 piece of cardboard. Don't be late - for school. - - rscadd: Apples can now be juiced for apple juice. Chocolate milk can now be crafted - using milk and cocoa. - - tweak: Chocolate bar recipe has been modified to compensate for chocolate milk. - The soy milk version of the chocolate bar recipe remains unchanged. - - bugfix: Grapes can now be properly juiced for grape juice using a grinder. - XDTM: - - tweak: Wizards no longer need sandals to cast robed spells. - Xhuis: - - rscadd: Syndicate and malfunctioning AIs may now be transferred onto an intelliCard - if their parent core has been destroyed. This may only be done with the AI's - consent, and the AI may not be re-transferred onto another APC or the APC it - came from. - - rscadd: New additions have been made for this Halloween and all future ones. Happy - Halloween! - ma44: - - rscadd: You can now solidify liquid gold into sheets of gold with frostoil and - a very little amount of iron -2016-10-30: - Joan: - - rscadd: The Recollection option in the Clockwork Slab has been significantly improved, - with a better information to fluff ratio, and the ability to toggle which tiers - of scripture that are visible in Recollection. - Lzimann: - - bugfix: You can once again order books by its ID in the library. - Mysak0CZ: - - bugfix: You no longer need to deconstruct emagged (or AI-hacked) APC to fix them, - replacing board is sufficient - - bugfix: You can no longer unlock AI-hacked APCs - - bugfix: Removing APC's and SMES's terminal no longer ignore current tool's speed - - rscadd: You can repair APC's cover (only if APC is not compleatly broken) by using - APC frame on it - - rscadd: closing APC's cover will lock it - bgobandit: - - rscadd: The creepy clown epidemic has arrived at Space Station 13. - - rscadd: Honk. -2016-10-31: - Joan: - - experiment: Brass windows will now survive two fireaxe hits, and are slightly - more resistant to bullets. - Lzimann: - - rscdel: Changelings no longer have the Swap Forms ability. - Xhuis: - - rscadd: Disposal units, outlets, etc. are now fireproof. - - rscadd: Changelings can now use biodegrade to escape silk cocoons. -2016-11-02: - Iamgoofball: - - rscadd: Added a new lobby menu sound. - Joan: - - rscdel: Brass windows and windoors no longer drop full sheets of brass when destroyed. - - rscadd: Instead, they'll drop gear bits, which can be proselytized for a small - amount of liquified alloy; 80% of the materials used to construct the window. - - tweak: Mending Motors have an increased range and heal for more. - - experiment: Mending Motors will no longer waste massive amounts of power on slightly - damaged objects; instead, they will heal a small amount, use a small amount - of power, and stop if the object is fully healed. - - wip: Mending Motors can now heal all clockwork objects, including pinion airlocks, - brass windows, and anything else you can think of. - - rscadd: Ocular Wardens will no longer attack targets that are handcuffed, buckled - to something AND lying, or in the process of being converted by Guvax. - - tweak: Also, they do very slightly more damage. - - rscdel: Hulks no longer one-shot most clockwork structures and will no longer - four-shot the Gateway to the Celestial Derelict. - - bugfix: Hulks are no longer a blob counter. - XDTM: - - tweak: Ninjas are now slightly visible when stealthing. - phil235: - - rscadd: Spray cleaner and soap can now wash off paint color. -2016-11-03: - Cobby: - - rscadd: Adds a geisha outfit to the clothesmate on hacking. QT space ninja BF - not included - Joan: - - rscadd: 'Proselytizing a window will automatically proselytize any grilles under - it. This is free, so don''t worry about wasting alloy. rcsadd: Trying to proselytize - something that can''t be proselytized will try to proselytize the turf under - it, instead.' - - experiment: Clockcult's "Convert All Silicons" objective now also requires that - Application scripture is unlocked. - - wip: The "Convert All Silicons" objective will also only be given if there is - an AI, instead of only if there is a silicon. -2016-11-05: - Joan: - - rscadd: Proselytizer conversion now accounts for existing materials, and deconstructing - a wall, a girder, or a window for its materials is no longer more efficient - than just converting it. - - imageadd: Heal glows now appear when mending motors repair clockwork mobs and - objects. - Lzimann: - - rscdel: You can no longer walk holding shift. -2016-11-06: - Joan: - - bugfix: Dragging people over a Vitality Matrix will actually cause the Matrix - to start working on them instead of failing to start draining because it's "active" - from when the dragging person crossed it. - phil235: - - rscadd: You can now climb on transit tube, like tables. - - rscadd: You can now use tabs when writing on paper by writing "[tab]" -2016-11-07: - Basilman: - - rscadd: CQC users can now block attacks by having their throw mode on. - - tweak: The CQC kick and Disorient-disarm combos are now much easier to use, CQC - harm intent attacks are stronger aswell. - - bugfix: Fixed being able to CQC restrain someone, let him go, then 10 minutes - later disarm someone else to instantly chokehold them. - - tweak: CQC costs more TC (13) - Cyberboss: - - bugfix: Tesla zaps that don't come from an energy ball can no longer destroy nukes - and gravity generators - El Tacolizard: - - rscadd: A space monastery and chaplain job have been added to PubbyStation. - - rscadd: Improved pubby's maint detailing - Joan: - - tweak: Ratvarian Spears now do 18 damage and ignore a small amount of armor on - normal attacks, but have a slightly lower chance to knowdown/knockout. Impaling - also ignores a larger amount of armor. - - rscadd: Throwing a Ratvarian Spear at a Servant will not damage them and may cause - them to catch the spear. - - rscadd: Standard drones will be converted to Cogscarabs by Ratvar and the Celestial - Gateway proselytization. - - rscdel: Cogscarabs no longer receive station alerts. - - bugfix: Anima Fragments, Clockwork Marauders, and cult constructs are now properly - immune to heat and electricity. - - tweak: Clockwork armor is much stronger against bullets and bombs but much weaker - against lasers. - - wip: Specific numbers; Bullet armor from 50% to 70%, bomb armor from 35% to 60%, - laser armor from -15% to -25%. This means lasers are a 4-hit crit. - - rscadd: You can now Quickbind scripture other than Guvax and Vanguard to the Clockwork - Slab's action buttons, via Recollection. - - rscadd: You can also recite scripture directly from Recollection, if doing so - suits your taste. Of course it suits your taste, it's way easier than menus. - - tweak: You can also toggle compact scripture in Recollection, so that you don't - see description, invocation time, component cost, or tips. - - tweak: Dropping items into Spatial Gateways no longer consumes a use from the - gateway. - - rscadd: If your Spatial Gateway target is unconscious, you can pick a new target - instead. - Kor: - - rscadd: Multiverse teams now have HUD icons. - - rscadd: Multiverse war is back in the spellbook. - phil235: - - rscadd: Altclicking a PDA without id now removes its pen. - - rscadd: The PDA's sprite now shows whether it has an id, a pAI, a pen, or if its - light is on. -2016-11-09: - Changes: - - tweak: Old mining asteroid is more interesting (mining world can be picked in - ministation.dm) - - tweak: Space around ministation is now half(?) the size of normal space - - rscadd: Loot spawners to maintenance - - bugfix: Rad storms frying maintenance - - bugfix: Bad conveyor belts in mining/cargo area of station - - bugfix: Bombs completely destroying toxins test site - - rscadd: Cyborg job available again - - tweak: Mining cyborgs can use steel rods when asteroid mining is enabled - Joan: - - tweak: Repairing clockwork structures with a Clockwork Proselytizer now only costs - 1 alloy per point of damage. - - experiment: Vitality Matrices will no longer heal dead Servants that they cannot - outright revive. - - rscadd: The Celestial Gateway will now prevent the emergency shuttle from leaving. - - tweak: However, Centcom will alert, in general terms, the location of the Celestial - Gateway two minutes after it is summoned. - - rscadd: Reciting scripture while not on the station, centcom, or mining/lavaland - will double recital time and component costs. - Kor: - - rscadd: You can now examine an r-wall to find out which tool is needed to continue - deconstructing it. - - rscadd: The game will now recognize a successful detonation of the nuclear bomb - in the syndicate base. - - rscadd: Cloaks are now cosmetic items that can be worn in the neck slot, allowing - you to wear them over armour. - Shadowlight213: - - rscdel: Removed the restriction on attacking people with a fire extinguisher on - help intent if the safety is on. - uraniummeltdown: - - rscadd: Added Cortical Borers, a brainslug parasite. - - rscadd: Added Cortical Borer Event -2016-11-10: - Kor: - - rscadd: The wizard has a new spell, Rod Form, which allows him to transform into - an immovable rod. - uraniummeltdown: - - bugfix: fixed brains not having ckeys when removed - - bugfix: hopefully fixed multiple ghosts entering a borer ghosting all but one - - tweak: tweaked the formula for hosts needed for borer event to 1+humans/6 - - tweak: borer endround report is a lot nicer -2016-11-11: - Cyberboss: - - bugfix: Promotion of revheads won't occur if they are restrained/incapacitated - - bugfix: Facehuggers can no longer latch onto mobs without a head... How the fuck - did you get a living mob without a head? - - bugfix: Hulks and monkeys can no longer bypass armor - - rscadd: Metastation now has a waste to space line - - bugfix: Objects will no longer get stuck behind the recycler on Boxstation - Joan: - - rscadd: You can now repair reinforced walls by using the tool you'd use to get - to the state they're currently in. Examining will give you a hint as to which - tool to use. - - spellcheck: Renamed Guvax to Geis. This also applies to the component, which has - been similarly renamed. - Kor: - - rscadd: The Captain can now purchase alternate escape shuttles from the communications - console. This drains from the station supply of cargo points, and you can only - do so once per round, so spend wisely. - - rscadd: Some shuttles are less desirable than the default, and will instead grant - the station a credit bonus when purchased. - - rscadd: Explosions are no longer capped on the mining z level. - - rscadd: The forcewall spell now creates a 3x1 wall which the caster can pass through. - - rscadd: Bedsheets are now worn in the neck slot, rather than the back slot. -2016-11-13: - Cyberboss: - - rscadd: Using a screwdriver on a conveyor belt will reverse it's direction - - bugfix: Medibots, by default, can no longer OD you on tricord - - tweak: They will now use charcoal instead of anti-toxin to heal tox damage - - bugfix: Silicons no longer get warm skin when irradiated - Gun Hog: - - tweak: Wizard (and Devil) fireballs now automatically toggle off once fired. - Joan: - - tweak: Judicial Visors now protect from flashes. - - rscadd: Reciting Scripture is now done through an actual interface, and can thus - be done much faster. - - rscdel: The recital and quickbind functions that Recollection had have been moved - to this interface instead. - - rscadd: Servants of Ratvar can now unsecure and move most Clockwork Structures - with a wrench, though doing so will damage the structure by 25% of its maximum - integrity. - - rscadd: Clockwork Structures become less effective as their integrity lowers, - reducing their effect by up to 50% at 25% integrity. - - tweak: You can now deconstruct unsecured wall gears with a screwdriver. - - tweak: Wall gears now have much more health and can be repaired with a proselytizer. - Mysak0CZ: - - rscadd: You can now use wrech to anchor (as long as it is not in space) / unanchor - lockers - - bugfix: Cyborgs can now simply use "hand" to open / close lockers (instead of - using toggle open verb) - - bugfix: You can now properly put unlit welder inside lockers - - bugfix: Lockers using different decostruction tools (like cardboard boxes wirecutters) - can now be deconstructed too - Xhuis: - - rscadd: All computers now have sounds. Try them out! - coiax: - - rscadd: Swarmers can now use :b to talk on Swarm Communication. - - rscadd: Lich phylacteries are now in the "points of interest" for ghosts. - uraniummeltdown: - - bugfix: Cancel Assume Control works as borer now - - rscadd: Added the cueball helmet, scratch suit, joy mask to Autodrobe -2016-11-14: - Joan: - - rscdel: You can no longer pick up cogscarabs. - - rscadd: Servants of Ratvar can now reactivate Cogscarabs with a screwdriver. - - tweak: Cogscarab proselytizers proselytize things twice as fast. - - tweak: Cogscarabs now have 1.6 seconds of delay when firing guns, as much as an - unmodded kinetic accelerator. - - bugfix: Fixed Vitality Matrices and Raise Dead runes not reviving if the target - happened to be in their body already. - Kor: - - rscadd: Extended mode now has a special command report that tells you the round - type. This is to let people know they have time to start on large scale projects - rather than milling about waiting for antagonists to attack. - - rscadd: All station goals are now unlocked during extended. - Mysak0CZ: - - bugfix: MetaStation's xenobiology disposals now work properly - uraniummeltdown: - - tweak: Changed the Command and Security radio colors - - rscadd: Added raw telecrystals to the uplink, can be used with uplinks and uplink - implants. - - rscadd: Added 10mm ammo variants to uplink -2016-11-15: - Cyberboss: - - bugfix: Brains and heads with brains trigger the emergency stop on the recycler - Kor: - - rscadd: The vault is now home to a new machine which can accept cash deposits, - adding to the cargo point total. - - rscadd: You can also use this machine to steal credits from the cargo point total. - Doing so takes time, and will set off an alarm. - - rscadd: You can now buy an asteroid with engines strapped to it to replace the - emergency escape shuttle. - - rscadd: You can now buy a luxury shuttle to replace the emergency escape shuttle. - Each crewmember must bring 500 credits worth of cash or coins to board though. - Lexorion & Lzimann: - - tweak: Wizards have developed a new spell. It's called Arcane Barrage and it has - been reported that it has a similar function to Lesser Summon Guns! - Supermichael777: - - rscdel: The atmos grenades have been removed. if you want to burn down the shuttle - use canisters or something but at least work at it. - coiax: - - rscadd: Mice (the rodent, not the peripheral) now start in random locations. -2016-11-16: - Mysak0CZ: - - rscadd: Door can now have higher security, making them stronger and wires harder - to access - - rscadd: More info can be found on github or wiki (if this passes) - - imageadd: Protected wires now have sprites - Pubby: - - bugfix: cyclelinked airlock pairs now close behind you even when running through - at full speed. - Swindly: - - rscadd: Dice can now be rigged by microwaving them. -2016-11-18: - Cyberboss: - - bugfix: The amount of metal used to construct High Security airlocks with the - RCD is now consistent with the actual cost - Incoming5643: - - bugfix: The charge spell should once again work correctly with guns/wands - Joan: - - rscadd: Clockcult AIs have power as long as they are on a Clockwork Floor or next - to a Sigil of Transmission. This is in addition to having power under normal - conditions. - - rscadd: Clockcult silicons can now activate Clockwork Structures from a distance. - - rscdel: Interdiction Lenses will not disable cameras if there are no living unconverted - AIs. - - rscadd: Clockcult Cyborgs can charge from Sigils of Transmission by crossing them; - after a 5 second delay, the cyborg regains either their missing charge or the - amount of power in the sigil(whichever is lower) over 10 seconds. - - rscadd: You can now cancel out of selecting a robot module! - - imagedel: Robot modules now only have a generic transform animation when selected; - the borg is locked in place for 5 seconds in a small cloud of smoke while the - base borg sprite fades out and the new module fades in. - - tweak: Resetting a borg will do that animation. - - rscadd: Adds Networked Fibers, which gains points instead of automatic expansion - and causes manual expansion near its core to move its core. - - rscadd: Added a new UI style, Clockwork. - NikNak: - - rscadd: Added tator tots, made my putting a potato in the food processor - - tweak: French fries are now made by cutting up a potato into wedges and putting - the wedges (plate and all) into the food processor - coiax: - - bugfix: The observer visible countdown timer for the malfunctioning AI doomsday - device is now formatted and rounded appropriately. - erwgd: - - rscadd: You can now make emergency welding tools in the autolathe. -2016-11-19: - Crushtoe: - - imageadd: Added a shiny new icon for the reaper's scythe in-hand and normal sprite. - It's 25% less gardener. - RandomMarine: - - rscadd: An instruction paper has been added to the morgue on most maps, because - somehow it's needed. - Shadowlight213: - - rscadd: Added the AI integrity restorer as a modular computer program - - rscadd: Added an AI intelliCard slot. Insert an Intellicard into it to be able - to use the restoration program. - - bugfix: Fixes Alarm program detecting ruins - - bugfix: Fixes being unable to toggle the card reader module power - - tweak: The downloader will now tell you if a program is incompatible with your - hardware -2016-11-20: - Basilman: - - rscadd: Added a new beard style, Broken Man. - Cobby: - - tweak: Airlock security is only given to vault doors, centcomm, and Secure Tech - [Secure Tech just requires a welder] - Incoming5643: - - rscadd: The warp whistle has been added to the wizard's repertoire of spells and - artifacts. - - rscadd: The drop table for summon magic has been expanded. - Joan: - - rscdel: Servant cyborgs no longer have emagged modules. - - rscadd: Servant cyborgs now have a limited selection of scripture and tools, which - varies by cyborg type. - Kor: - - bugfix: Station goals will once again function in extended. - Swindly: - - rscadd: Added a nitrous oxide reagent. It can be created by heating 3 parts ammonia, - 1 part nitrogen, and 2 parts oxygen to 525K. The process produces water as a - by-product and will cause an explosion if too much heat is applied. -2016-11-21: - Cobby: - - tweak: mining/labor shuttles are now radiation proof. -2016-11-23: - Crushtoe: - - rscadd: Added more tips. - - bugfix: Fixes some sprites and spelling issues, namely bedsheet capes. - Cyberboss: - - bugfix: Changing an airlock's security level no longer heals it - Gun Hog: - - bugfix: Medibots now heal toxin damage again. - Joan: - - rscadd: Clockcult AIs can now listen to conversations through cameras. - - rscadd: Due to complaints that the new slab interface was too difficult to navigate, - it now starts off in compressed format. The button to toggle this is now also - larger. - Kor: - - rscadd: Rounds ending on one server will send a news report to the other server. - Shadowlight213: - - tweak: Borers now have a 10 second delay before waking up after sugar leaves the - host system - - tweak: There is a chance for borers to lose control, based on brain damage levels - Swindly: - - rscadd: Most small items can now be placed in the microwave. Remember not to microwave - metallic objects. - XDTM: - - rscadd: 'Golems now have special properties based on the mineral they''re made - of:' - - rscadd: Silver golems have a higher chance of stun when punching - - rscadd: Gold golems are faster but less armoured - - rscadd: Diamond golems are more armoured - - rscadd: Uranium golems are radioactive - - rscadd: Plasma golems explode on death - - rscadd: Iron and adamantine golems are unchanged. - jakeramsay007: - - tweak: Borers can no longer take control of people who have a mindshield implant - or are a member of either cult. This however does not stop them from infesting - and controlling them through other means, such as chemicals. -2016-11-24: - Kor: - - rscadd: Shaft miners now have access to the science channel. - Lzimann: - - rscdel: Multiverse sword is no longer buyable by wizards - erwgd: - - rscadd: Plasmamen get their own random names. -2016-11-25: - Joan: - - rscadd: Clockcult AIs with borgs 'slaved' to them will convert them when hacking - via the robotics console. - - experiment: Replaced the "No Cache" alert with an alert that will show what you - need for the next tier of scripture. - Kor: - - rscadd: The captain may now purchase an unfinished shuttle chassis, which will - dock immediately when bought, but will not launch until the end of the regular - shuttle call procedure. The shuttle is empty and devoid of atmosphere however, - so you'll need to do some work on it if you want a safe trip home. - Shadowlight213: - - bugfix: The activation button for the AI integrity restorer modular program actually - works now! - - rscdel: The cortical borer event is now admin only -2016-11-27: - Cyberboss: - - bugfix: False armblades are now removed after one minute. Start feeling the P - A R A N O I A when you see em - Gun Hog: - - rscadd: AIs piloting a mech may now be recovered with an Intellicard from the - wreckage if the mech is destroyed. They will be require repair once recovered. - - tweak: Instructions for piloting mechs as an AI are now more obvious. - - tweak: Traitor and Ratvar AIs may now be carded from mechs, at their discretion. - Joan: - - tweak: Clockwork walls are now about as hard for hulks to break as rwalls. - - rscadd: You can now quickbind up to 5 scriptures from the recital menu, and the - recital menu has less empty space. - - tweak: Clockwork slabs now only start with only Geis pre-bound. - Kor: - - rscadd: Shaft miners can now redeem their starting voucher for a conscription - kit, which contains everything they need to rope their friend into joining them - on lavaland. - - rscadd: You can now see which emergency shuttle is coming in the status panel. - Lzimann: - - rscadd: The robots stole Santa's Elfs jobs. - MMMiracles: - - tweak: Jump boots now have a pocket - - imageadd: Jump boots from mining now have on-character icons. - Mervill: - - imageadd: Disposal units now use a tgui instead of plain html - - rscadd: 'As the AI: Click an AI status display to bring up the prompt for changing - the image' - Swindly: - - rscadd: Wet leather can be dried by putting it on a drying rack. - Xhuis: - - bugfix: Plastic explosives now actually explode when you commit suicide with them. - - bugfix: Resisting out of straight jackets now works properly. - - rscdel: Highlander will no longer announce the last man standing. - - rscadd: Cyborgs can now open morgue trays. This does not include crematoriums! - uraniummeltdown: - - rscdel: Borers no longer randomly lose control based on host brain damage - - tweak: Borer Dominate Victim stun time reduced from 4 -> 2. - - tweak: Borers no longer force unhidden when infesting someone. - - tweak: Borer event is rarer (weight 20->15). - - tweak: Borer reproduction chemicals required increased from 100 to 200. -2016-11-29: - Joan: - - tweak: Interdiction Lenses are more likely to turn off if damaged. - - tweak: Reduced Interdiction Lens and Tinkerer's Daemon CV from 25 to 20. - RemieRichards: - - rscadd: Devils may now spawn with an obligation to accept dance off challanges, - if they have this obligation they also gain a spell to summon/unsummon a 3x3 - dance floor at will. - Swindly: - - rscadd: Microwaves now heat open reagent containers to 1000K. - XDTM: - - rscadd: 'Added new types of golem: glass, sand, wood, plasteel, titanium, plastitanium, - alien alloy, bananium, bluespace, each with their own traits. Experiment!' - - tweak: Golems will be told what their traits are when spawning. - - rscadd: Putting a golem in a gibber will give ores of its mineral type, instead - of meat. - - rscadd: Using Iron on an adamantine slime extract will spawn an incomplete golem - shell, that will be slaved to whoever completes it, much like a normal adamantine - golem. - jughu: - - tweak: Proselytizing airlocks into pinion airlocks takes longer. -2016-11-30: - ANGRY CODER: - - tweak: NT news reports the clandestine criminal organization known as the syndicate - may have upgraded one of their illegally stolen cyborg modules with additional - healing technology. - Cobby [Idea stolen from Shaps]: - - rscadd: For objects that you could previously rename with a pen, you can now edit - their description as well. - Cyberboss: - - rscdel: Due to budget cuts. Firelocks no longer have safety features - - bugfix: Roundstart airlock electronics now properly generate the correct accesses - - bugfix: tgui windows will now close on round end - Gun Hog: - - bugfix: Syndicate Medical Cyborg hyposprays now properly work through Operative - hardsuits and other thick clothing. - Joan: - - tweak: Cogscarabs will once again convert metal, rods, and plasteel directly to - alloy. - - tweak: Tinkerer's caches now increase in cost every 4 caches, from 5. - - rscadd: The Ark of the Clockwork Justicar now converts all silicons once it finishes - proselytizing the station. - Mervill: - - rscadd: AI hologram can move seamlessly between holopads - Thunder12345: - - rscadd: Added anti-armour launcher. A single-use rocket launcher capable of penetrating - all but the heaviest of armour. Deals massively increased damage to cyborgs - and mechs. -2016-12-02: - Cobby: - - bugfix: Removes the exploit that allowed you to bypass grabcooldowns with Ctrl+Click - PeopleAreStrange: - - tweak: Changed F7 to buildmode, F8 to Invismin (again). Removed stealthmin toggle - RemieRichards: - - rscadd: Added a new lavaland "boss" - - tweak: Hostile mobs will now find a new target if they failed to attack their - current one for 30 seconds, this reduces cheese by simply making the mob find - something else to do/someone to kill - - bugfix: Hostile mobs with search_objects will now regain that value after a certain - amount of time (per-mob, base 3 seconds), this is because being attacked causes - mobs with this var to turn it off, so they can run away, however it was literally - never turned on which caused swarmers to get depression and never do anything. -2016-12-03: - Joan: - - rscadd: Trying to move while bound by Geis will cause you to start resisting, - but the time required to resist is up by half a second. - - experiment: Resisting out of Geis now does damage to the binding, and as such - being stunned while bound will no longer totally reset your resist progress. - - rscadd: Using Geis on someone already bound by Geis will interrupt them resisting - out of it and will fully repair the binding. - - tweak: Geis's pre-binding channel now takes longer for each servant above 5. Geis's - conversion channel also takes slightly longer for each servant above 5. - - rscadd: Converted engineering and miner cyborgs can now create Sigils of Transgression. - RandomMarine: - - tweak: Airlocks will keep their original name when their electronics are removed - and replaced. You may still use a pen to rename the assembly if desired. -2016-12-04: - Durkel: - - tweak: Recent enemy reports indicate that changelings have grown bored with attacking - near desolate stations and have shifted focus to more fertile hunting grounds. -2016-12-06: - BASILMAN YOUR MAIN MAN: - - bugfix: fixes people "walking over the glass shard!" when they're on the ground, - changes message when incapacitated - Chnkr: - - rscadd: Nuclear Operatives can now customize the message broadcast to the station - when declaring war. - Cyberboss: - - bugfix: The atmos waste lines for the Metastation Kitchen and Botany departments - is now actually connected - Gun Hog: - - rscadd: Nanotrasen Janitorial Sciences Division is proud to announce a new concept - for the Advanced Mop prototype; It now includes a built-in condenser for self - re-hydration! See your local Scientist today! In the event that janitorial staff - wish to use more expensive solutions, the condenser may be shut off with a handy - handle switch! - Incoming5643: - - bugfix: The timer for shuttle calls/recalls now scales with the security level - of the station (Code Red/Green, etc.). You no longer have to feel dumb if you - forget to call Code Red before you call the shuttle! - - rscadd: Shuttles called in Code Green (the lowest level) now take 20 minutes to - arrive, but may be recalled for up to 10 minutes. They also don't require a - reason to be called. - - experiment: That doesn't mean you should call a code green shuttle every round - the moment it finishes refueling. - - rscadd: Server owners may now customize the population levels required to play - various modes. Keep in mind that this does not preserve the balance of the mode - if you change it drastically. See game_modes.txt for details. - Joan: - - rscadd: You can now proselytize floor tiles at a rate of 20 tiles to 1 brass sheet - or 2 tiles to 1 liquified alloy for cogscarabs. - - rscadd: Proselytizers will automatically pry up floor tiles if those tiles can - be proselytized. - - tweak: Brass floor tiles no longer exist. Instead, you can just apply brass sheets - to a tile. Crowbarring up a clockwork floor will yield that brass sheet. - - rscadd: You can now cancel AI intellicard wiping. - - tweak: Geis now takes 5 seconds to resist. - Mervill: - - bugfix: Examining now lists the neck slot - MisterTikva: - - rscadd: Nanotrasen informs that certain berry and root plants have been infused - with additional genetic traits. - - rscadd: Watermelons now have water in them! - - rscadd: Blumpkin's chlorine production has been reduced for better workplace efficiency. - - rscadd: Squishy plants now obey the laws of physics and will squash all over you - if fall on them. - Shadowlight213: - - bugfix: The lavaland syndicate agents, as well as the ID for all simple_animal - syndicate corpses should have their ID actually have syndicate access on it - now! - Swindly: - - rscadd: 'Adds a new toxin: Anacea. It metabolizes very slowly and quickly purges - medicines in the victim while dealing light toxin damage. Its recipe is 1 part - Haloperidol, 1 part Impedrezene, 1 part Radium.' - WJohn: - - bugfix: AI core turrets can once again hit you if you are standing in front of - the glass panes, or in the viewing area's doorway. - XDTM: - - rscadd: Quantum Pads are now buildable in R&D! - - rscadd: Quantum Pads, once built, can be linked to other Quantum Pads using a - multitool. Using a Pad who has been linked will teleport everything on the sending - pad to the linked pad! - - rscadd: 'Pads do not need to be linked in pairs: Pad A can lead to Pad B which - can lead to pad C.' - - rscadd: Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and - power consumption. - - rscadd: Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor - and a cable piece. - kilkun: - - rscadd: New lore surrounding the various SWAT suits. - - tweak: Captain's hardsuit/SWAT suit got a few buffs. It's now much more robust. - - bugfix: Captain's space suit is now heat proof as well as fireproof. Long overlooked - no longer. -2016-12-07: - Cyberboss: - - bugfix: Atmos canisters now stay connected after relabeling them - Incoming5643: - - rscadd: Server owners that use the panic bunker feature can now optionally redirect - new players to a different server. See config.txt for details. - LOOT DUDE: - - tweak: Swarmers will drop bluespace crystals on death, non-artificial crystals. - MisterTikva: - - rscadd: Nanotrasen Mushroom Studies Division proudly announces that growth serum - producing plants were genetically reassembled. You no longer alternate between - sizes with doses 20u+ and more effects were added to higher doses. - Thunder12345: - - bugfix: You can now only order a replacement shuttle once -2016-12-08: - Fox McCloud: - - rscadd: The ability to harvest a plant, repeatedly, is now a gene-extractable - trait that can be spliced into other plants - - rscadd: can extract the battery capabilities of potatoes and splice them into - other plants - - rscadd: Plants types are now gene traits that can be added/removed from plants - - rscadd: Adds new stinging plant trait that will inject a bit of a plant's reagents - when thrown at someone - Joan: - - rscadd: The clockwork slab's interface is now TGUI. - - imageadd: You can now see what an ocular warden is attacking. - Mervill: - - rscadd: The light replacer can now create bulbs from glass shards - - rscadd: Click a light replacer while holding a glass shard to add the shard to - the replacer - - rscadd: Click a glass shard while holding a light replacer to consume the shard - MrStonedOne: - - tweak: world initialization is now faster. - - bugfix: fixed the modify bodypart admin tool not working - PKPenguin321: - - tweak: Swarmer beacons now have 750 health, down from 3000. - TehZombehz: - - rscadd: Nanotrasen Culinary Division has authorized the production of tacos, both - plain and classic. - XDTM: - - bugfix: Replica Pod cloning now works on people who have been decapitated. - coiax: - - rscadd: Additional mice sometimes appear in the maintenance tunnels. Engineers - beware! -2016-12-10: - Cyberboss: - - bugfix: The slips bug (which made freon laggy) is fixed - Kor: - - imagedel: Deleted all (3000+) left handed inhand icons. They are now automatically - mirrored from the right hand, saving spriters a lot of tedious busywork. - - rscadd: By crafting a wall mounted flasher frame (can be ordered via cargo), a - flash, and a riot shield, you can now construct a strobe shield. The strobe - shield combines the functionality of a riot shield and a flash, and can be reloaded - with flash bulbs. - Supermichael777: - - tweak: Conveyors have been more firmly anchored. No fun allowed - Thunder12345: - - rscadd: Added the Standby Emergency Vessel "Scrapheap Challenge" as a new emergency - shuttle option. You'll even be paid 1000 credits to use it! - coiax: - - rscadd: Due to a combination of radiation and water supply contamination, stations - have been reporting animals gaining self awareness. - optional name here: - - bugfix: fixed ashdrake's flame wall. - - bugfix: fixed walls decon spawning metal in a random location in the same room. -2016-12-11: - Cobby: - - bugfix: Fixes literally everything regarding renaming so far. When adding unique_rename - to objects, make sure the attackby checks for inheritance. - - bugfix: You can pull as other mobs now. Sorry, clickcode is stupid. - Cyberboss: - - bugfix: Frozen things will now unfreeze above 0C - Joan: - - tweak: Invoking Nezbere now increases ocular warden damage slightly more, but - increases ocular warden range slightly less. - Swindly: - - tweak: The recipe for moonshine now calls for 5 units of nutriment and 5 units - of sugar instead of 10 units of nutriment. - Thunder12345: - - bugfix: Scrapheap Challenge shuttle now actually works - coiax: - - rscadd: Cyborgs now have a reset module wire, that when pulsed, triggers the cyborg's - reset module hardware. - - rscadd: Cyborgs now eject all upgrades when reset, rather than the upgrades being - destroyed. - - rscdel: Removed redundant reset module. -2016-12-12: - Dannno: - - rscadd: more chaplain outfits - - rscadd: animal and tribal masks to the theater vendor -2016-12-13: - Fox McCloud: - - rscadd: Adds in random botany seeds; never the same twice. - - rscadd: Adds in new trait that makes a grown release smoke when squashed - - rscadd: Weed rates and chances are now core seed genes - Joan: - - experiment: Clockwork proselytizers suffer doubled cost and proselytization time - when not on the station, mining, or centcom. - - soundadd: Trying to recite scripture offstation is more clearly disapproved of. - XDTM: - - bugfix: The internal rage of the crew has been suppressed, and they will no longer - attack their own backpacks when opening them. -2016-12-14: - Incoming5643: - - rscadd: Recently we've been receiving reports of cheap knock off nuclear authentication - disks circulating among the syndicate network. Don't be fooled by these decoys, - only the real deal can be used to destroy the station! - - experiment: Please don't destroy the station in an attempt to make sure the disk - is real. - Joan: - - rscdel: The Ark of the Clockwork Justicar can no longer be repaired. - - tweak: The Ark now has 20% more health. - - rscadd: The Ark of the Clockwork Justicar will now force objects away from it. - - tweak: Faster-than-normal tools are somewhat slower than before. - - tweak: Mania Motors now require a much larger amount of power to convert people - adjacent, and people converted by it are knocked out. - Mindustry: - - bugfix: Goliath meat can be cooked in lava again - Okand37: - - rscadd: DeltaStation's emergency shuttle - XDTM: - - rscadd: Abductor Agents have now been equipped with extremely advanced construction - and hacking tools. -2016-12-18: - Dannno: - - rscadd: Sec hailers can now be emagged for a more rational, calm message. - Erwgd: - - rscadd: Limb Grower circuit boards can now be made in Research and Development, - requiring level 3 in data theory and level 2 in biological technology. - Firecage: - - rscadd: The NanoTrasen Airlock Builder Federation(NTABF) has recently released - the blueprints involving building and deconstructing Titanium Airlocks! These - airlocks are now being used on all of our shuttles. - Fox McCloud: - - bugfix: Fixes the personal crafting cost of ED-209's being too expensive - Hyena: - - tweak: adds 2 geiger counters to radition protection crates and a gift from the - russians - Joan: - - rscadd: Adds Replicant and Tinkerer's Cache to the default slab quickbind. - - rscadd: Revenants will be revealed by ocular wardens when targeted. - Joan, Dagdammit: - - rscadd: You can now push Wraith Spectacles up to avoid vision damage, but lose - xray vision. - - wip: Do note that flicking them on and off very quickly may cause you to lose - vision rather quickly. - Kor: - - rscadd: Added the treasure hunter's hat, coat, uniform, and whip. These aren't - available on the map yet, but will be available to the librarian soon. - Mervill: - - rscadd: Notice boards can now have photographs pined to them - - tweak: Items removed from the notice board are placed in your hands - - bugfix: Intents can be cycled forward and backwards with hotkeys again - - bugfix: Russian revolver ammo display works correctly - - rscadd: Added a credit deposit to pubbystation's vault - - rscdel: Removed a rather garish golden statue of the HoP from pubbystation's vault - Okand37 & Lexorion: - - rscadd: Added a new hair style, the Sidecut! - Supermichael777: - - rscadd: Clockwork components the chaplain picks up are now destroyed. - Swindly: - - rscadd: Adds eggnog. It can be made by mixing 5 parts rum, 5 parts cream, and - 5 parts egg yolk. - XDTM: - - rscadd: Changelings can now buy Tentacles on the Cellular emporium for 2 evolution - points. - - rscadd: Tentacles, once used, can be fired once against an item or mob to pull - it towards yourself. Items will be automatically grabbed. Costs 10 chemicals - per tentacle. - - rscadd: 'On humanoid mobs tentacles have a varying effect depending on intent: - - Help intent simply pulls the target closer without harming him; - Disarm intent - does not pull the target but instead pulls whatever item he''s holding in his - hands to yours; - Grab intent puts the target into an aggressive grab after - it is pulled, allowing you to throw it or try to consume it; - Harm intent will - briefly stun the target on landing; if you''re holding a sharp weapon you''ll - also impale the target, dealing increased damage and a longer stun.' - - bugfix: Random golems now properly acquire the properties of the golem they pick. - - rscadd: When becoming a random golem the user is informed of the properties of - the picked golem. - coiax: - - rscadd: Chameleon clothing produced by the syndicate has been found to react negatively - to EMPs, randomly switching forms for a time. - - rscadd: Anomalies now have observer-visible countdowns to their detonation. - - rscadd: Adds upgrades for the medical cyborg! - - rscadd: The Hypospray Expanded Synthesiser that adds chemicals to treat blindness, - deafness, brain damage, genetic corruption and drug abuse. - - rscadd: The Hypospray High-Strength Synthesiser, containing stronger versions - of drugs to treat brute, burn, oxyloss and toxic damage. - - rscadd: The Piercing Hypospray (also applicable to the Standard and Peacekeeper - borgs) that allows a hypospray to pierce thick clothing and hardsuits. - - rscadd: The Defibrillator, giving the medical cyborg an onboard defibrillator. - - rscadd: Loose atmospherics pipes are now dangerous to be hit by. - - rscadd: Whenever you automatically pick up ore with an ore satchel, if you are - dragging a wooden ore box, the satchel automatically empties into the box. - dannno: - - rscadd: Adds a villain costume to the autodrobe. - - bugfix: Fixes autodrobe failing to stock items. - jughu: - - tweak: 'sandals are not fireproof or acidproof anymore :add: Magical sandals for - the wizard that are still fireproof/acid proof :tweak: makes the marisa boots - acid and fire proof too' - karlnp: - - bugfix: made facehuggers work again - - bugfix: vendors, airlocks, etc now cannot shock at a distance - uraniummeltdown: - - tweak: Side entrance to Box Medbay, a few layout changes. -2016-12-19: - spudboy: - - bugfix: Fixed items not appearing in the detective's fedora. -2016-12-20: - Kor: - - rscadd: You can put a variety of hats on cyborgs using help intent (the engiborg - can't wear hats though, as it is shaped too oddly. Sorry!) - - rscadd: 'The complete list of currently equippable hats is as follows: Cakehat, - Captains Hat, Centcomm Hat, Witch Hunter Hat, HoS Cap, HoP Cap, Sombrero, Wizard - Hat, Nurse Hat.' - Lzimann: - - bugfix: Mjor the Creative will drop his loot correctly now. - Mekhi Anderson: - - rscdel: Fixes various PAI bugs, various tweaks and bullshit. - MrPerson: - - rscadd: Starlight will have more of a gradient and generally shine a more constant - amount of light regardless of how many tiles are touching space. In dark places - with long borders to space, starlight will be much darker. -2016-12-21: - FTL13, yogstation, Iamgoofball, and MrStonedOne: - - rscadd: Space is pretty. - - tweak: You can configure how pretty space is in preferences, those of you on toasters - should go to low to remove the need to do client side animations. (standard - fanfare as job selection, left click to increase, right click to decrease) (Changes - are applied immediately in most cases, on reconnect otherwise) - Joan: - - rscadd: EMPs will generally fuck up clockwork structures. - - rscdel: Cogscarabs can no longer hold slabs to produce components. - - rscadd: Slabs will now produce components even if in a box in your backpack inside - of a bag of holding on your back; any depth you can hide the slab in will still - produce components. - - bugfix: Non-Servants in possession of clockwork slabs will also no longer produce - components. - Mekhi Anderson: - - bugfix: PAI notifications no longer flood those who do not wish to be flooded. - Shadowlight213: - - imageadd: 2 new performer's outfits have been added to the autodrobe -2016-12-24: - AnturK: - - rscadd: Implants now work on animals. - Cyberboss: - - bugfix: Dead things can no longer be used to open doors - F-OS: - - bugfix: swarmers can no longer destroy airlocks. - MrStonedOne: - - tweak: AI's call bot command has been throttled to prevent edge cases causing - lag. You will not be able to call another bot until the first bot has finished - mapping out it's route. - TehZombehz: - - tweak: Observers can now orbit derelict station drone shells, much like current - lavaland ghost role spawners, to make finding them easier. Regular drone shells - are not affected by this. - XDTM: - - rscadd: Autolathes are now true to their name and can queue 5 or 10 copies of - the same item. - coiax: - - rscadd: Cyborg renaming boards cannot be used if no name has been entered. - - rscdel: Cyborg rename and emergency reboot modules are destroyed upon use, and - not stored inside the cyborg to be ejected if modules are reset. - - rscadd: Emagging the book management console and printing forbidden lore now has - a chance of producing a clockwork slab rather than an arcane tome. - kevinz000: - - experiment: Flightsuits now have their own subsystem! - - bugfix: Flightsuits properly account for power before calculating drifting - - experiment: Flightpack users will automatically fly over anyone buckled without - crashing. - - experiment: Flightpack users automatically slip through mineral doors - - experiment: Flightpack users will crash straight through grills at appropriate - times - - experiment: Flightpack users automatically slip through unbolted airlocks - - experiment: Flightpacks are faster in space, but their space momentum decay has - been upped significantly to compensate - - experiment: Flighthelmets now have a function to allow the wearer to zoom out - to see further. Helps you not crash eh? - spudboy: - - bugfix: Gave cyborgs some hotkeys they should have had. -2016-12-27: - Firecage: - - bugfix: The Nanotrasen Sewing Club has finally fixed the problem which rendered - NT, Ian, and Grey bedsheets invisible when worn! - Hyena: - - tweak: Detective coats can now hold police batons - - bugfix: Fixes disabler in hand sprites - Joan: - - rscadd: You can now put syndicate MMIs and soul vessels into AI cores. - - rscadd: The Hierophant boss will now create an arena if you try to leave its arena. - - imageadd: The Hierophant boss, its arena, and the weapon it drops all have new - sprites. - - soundadd: And new sounds. - - wip: And new text. - - rscadd: Wizards can now buy magic guardians for 2 points. They are not limited - to one guardian, meaning they can have up to 5. If that's wise is an entirely - different question. - - experiment: Wizards cannot buy support guardians, but can buy dexterous guardians, - which can hold items. - Shadowlight213: - - tweak: Shuttle are now safe from radstorms - XDTM: - - bugfix: HUD implants now properly allow you to modify the records of those you - examine, like HUD glasses do. - - bugfix: Organ Manipulation surgery now properly heals on the cautery step. - - bugfix: The maintenance door adjacent to R&D in metastation is now accessible - to scientists, instead of requiring both science and robotics access. -2016-12-28: - Erwgd: - - rscadd: A new access level is available, named "Cloning Room". Medical Doctors, - Geneticists and CMOs start with it. - - tweak: On Box Station and on Meta Station, the cloning lab doors require Cloning - Room access in addition to each door's previous requirements. - - tweak: Cloning pods are now unlocked with Cloning Room access only. - Incoming5643: - - rscadd: There's a new category in uplinks for discounted gear. These special discounts - however can only be taken once, so even if you are lucky enough to see syndibombs - for 75% off you won't be able to nuke the entire station with them. - - bugfix: The charge spell will no longer bilk you on wand charges, and wands that - are dead won't show up as charged. - Joan: - - rscdel: Clockwork Marauders no longer have Fatigue. It was difficult to balance - and made them too easy to force into recalling. This means they just have health; - they aren't forced to recall by anything, but can accordingly die much more - easily. - - rscadd: Accordingly Clockwork Marauders now have more health, do slightly more - damage, block slightly more often, and have to go slightly further from their - host to take damage. - - rscadd: Marauders that are not recovering(from recalling while the host's health - is too high to emerge) and are inside their host, or are within a tile of their - host, will gradually heal their host until their host is above the health threshold - to emerge. - - tweak: Chaos guardians transfer slightly less damage to their summoner. - XDTM: - - tweak: Armblades now go slash slash instead of thwack thwack - - imageadd: Tentacles have some fancier sprites -2016-12-29: - Mervill: - - bugfix: Patched an exploit related to pulling a vehicle as its driver while in - space - - bugfix: Fixed evidence bags not displaying their contents when held - - bugfix: Clothing without a casual variant will no longer say it can be worn differently - when examined - - bugfix: Only standard handcuffs can be used to make chained shoes - - bugfix: Fixed cards against space - - bugfix: Drying rack sprite updates properly when things are removed without drying - XDTM: - - rscadd: Colossi now drop the Voice of God, a mouth organ that, if implanted, allows - you to speak in a HEAVY TONE. This voice can compel hearers to briefly obey - certain codewords, such as "STOP". Using these codewords will severely increase - this ability's cooldown, and only one will be used per sentence. - - rscadd: 'Use .x, :x, or #x as a prefix to use Voice of God or any future vocal - cord organs.' - - rscadd: Chaplains, being closer to the gods, and command staff, being used to - giving orders, gain an increased effect when using the Voice of God. The mime, - not being used to speaking, has a reduced effect. -2016-12-31: - hyena: - - bugfix: fixes caps suit fire immunity - kevinz000: - - bugfix: Machine overloads/overrides aren't as bullshit as you'll actually be able - to dodge it now. -2017-01-01: - A whole bunch of spiders in a SWAT suit: - - bugfix: spiders can't wrap anchored things -2017-01-02: - MrStonedOne: - - tweak: Throwing was refactored to cause less lag and be more precise - - rscadd: Item throwing now imparts the momentum of the user throwing. Throwing - in the direction you are moving throws the item faster, throwing away from the - direction you are moving throws the item slower. This should make hitting yourself - with floor tiles less likely. - XDTM: - - bugfix: Storage bags should now cause less lag when picking up large amounts of - items. - - bugfix: Storage bags now don't send an error message for every single item they - fail to pick up. -2017-01-03: - Cyberboss: - - bugfix: AIs can no longer see cult runes properly - Mervill: - - bugfix: Can't kick racks if weakened, resting or lying -2017-01-06: - Cruix: - - bugfix: Fixed the leftmost and bottommost 15 turfs not having static for AIs and - camera consoles - Joan: - - bugfix: Tesla coils and grounding rods must be anchored with a closed panel to - function, ie; not explode when shocked. - - tweak: Metastation's xenobio has been slightly modified to avoid getting hit by - some standard shuttles. - Mervill: - - bugfix: Regular spraycans aren't silent anymore - MrStonedOne and Ter13: - - rscadd: Added some ping tracking to the game. - - rscadd: Your ping shows in the status tab - - rscadd: Other players ping shows in who to players and admins. - Nabski89: - - bugfix: Re-Vitiligo Levels to match wiki. - XDTM: - - tweak: Voice of God's Sleep lasts less than the other stuns. - - rscadd: You can also use people's jobs to single them out, instead of only names. - - tweak: If multiple people share the same name/job they'll all be included, although - at a reduced bonus. - - tweak: Names and jobs will only be accepted if they're the first part of the command, - and not in the middle, to prevent unintended focusing. - - bugfix: Voice of God now shows speech before the emotes it causes. - - bugfix: Special characters are no longer over-sanitized. - - bugfix: You can now properly apply items to clothing with pockets, such as slime - speed potions on clown shoes. - - bugfix: Mechs are now able to enter wormhole-sized portals. -2017-01-08: - Mervill: - - bugfix: pre-placed posters don't retain their pixel offset when taken down carefully - - bugfix: Dinnerware Vendor will show it's wire panel - Nanotrasen Station Project Advisory Board: - - wip: It is highly recommended that, when constructing the Meteor Shield project, - you are able to see, at minimum, two meteor shields from a stationary location. - The Nanotrasen Station Project Advisory Board is not liable for meteor damage - taken under wider shield arrangements. - Speed of Light Somehow Changed: - - tweak: Dynamic lights are no longer animated, and update instantly - - tweak: Increased maximum radius of mob and mobile lights -2017-01-10: - Arianya: - - bugfix: Doors and vending machines once again make a sound when you screwdriver - them. - Cyberboss: - - bugfix: Explosions can no longer be dodged - - tweak: Airlocks are now destroyed by the same level explosion that destroys walls - - tweak: Diamond/External/Centcomm airlocks and firedoors now block explosions as - walls do - Joan: - - experiment: Clockwork Proselytizers no longer require Replicant Alloy to function; - instead, they gradually charge themselves with power, which is used more or - less the same as alloy. - - tweak: Clockwork Proselytizers now produce brass sheets when used in-hand, instead - of Replicant Alloy. - - rscdel: Tinkerer's Caches can no longer have Replicant Alloy removed from them; - using an empty hand on them will simply check when they'll next produce a component. - - rscdel: Mending Motors can no longer use Replicant Alloy in place of power. - Mervill: - - bugfix: Controlling the station status displays no longer overrides the cargo - supply timer - MrStonedOne: - - experiment: Lighting was made more responsive. - XDTM: - - rscadd: Earmuffs and null rods protect against the Voice of God. - - rscadd: Earmuffs are now buildable in autolathes. - - tweak: Voice of God stuns have a longer cooldown. - coiax: - - rscadd: Girders now offer hints to their deconstruction when examined. -2017-01-13: - Cyberboss: - - bugfix: Walls blow up less stupidly - - bugfix: You no longer drop a beaker after attempting to load it into an already - full cryo cell - Joan: - - bugfix: Instant Summons is no longer greedy with containers. - Mervill: - - bugfix: Hardsuits, amour and other suits that cover the feet now protect against - glass shards - - bugfix: You will now lose the lawyer's speech bubble effect if you unequip the - layer's badge - MrStonedOne: - - tweak: More performance tweaks with the modulated reactive ensured entropy frame - governor system - PKPenguin321: - - tweak: Ash walker tendrils will now restore 5% of their HP when fed. - Shadowlight213: - - bugfix: Borg emotes should now play at the correct pitch - - bugfix: The ID console now properly handles authorization - - bugfix: Clicking on one of the ID cards in the UI will no longer eject both of - them - Thunder12345: - - bugfix: Morphs will no longer retain the colour of the last thing mimicked when - reverting to their true form - XDTM: - - bugfix: Patches' application is now properly delayed instead of instant. - - bugfix: Accelerator laser cannons' projectile now properly grows with distance. - coiax: - - rscadd: The end of round stats include the number of people who escaped on the - main emergency shuttle. -2017-01-14: - Cyberboss: - - bugfix: Explosions now flash people properly - Lzimann: - - bugfix: Fixes TGUI not working for people without IE11 - Thunder12345: - - bugfix: Recoloured mobs and objects will no longer produce coloured fire. - XDTM: - - bugfix: Nanotrasen decided that the "violent osmosis" method for refilling fire - extinguishers was, while cathartic, too expensive, due to the water tank repair - bills. Water tanks now have a tap. - - bugfix: (refilling extinguishers from tanks won't make you hit them) - - bugfix: Golems no longer drop belt, id, and pocket contents in a fit of extreme - clumsiness when drawing a sword from a sheath. - - bugfix: Wrenching portable chem dispensers won't cause you to immediately try - unwrenching them. - coiax: - - bugfix: Blue circuit floors are now restored to their normal colour if an AI doomsday - device is disabled. -2017-01-16: - Cyberboss: - - bugfix: Firedoors no longer have maintenance panels - - tweak: Firedoors must now be welded and screwdrivered prior to be deconstructed - Joan: - - rscadd: Ratvar will now convert lattices and catwalks to clockwork versions. - XDTM: - - tweak: Updating your PDA info with an agent id card inside will also overwrite - the previous name. - - bugfix: Loading a xenobiology console with a bio bag won't cause you to smack - it with it. - - tweak: Chemical splashing is now based on distance rather than affected tiles. - - bugfix: You can now properly wet floors by putting enough water in a grenade. - - bugfix: Floating without gravity won't drain hunger. -2017-01-18: - Mervill: - - bugfix: Using a welder to repair a mining drone now follows standard behaviour - - bugfix: Redeeming the mining voucher for a mining drone now also provides welding - goggles - - bugfix: ntnrc channels are now deleted properly - Tofa01: - - bugfix: Moved all sprites for heat pipe manifold either up or down by one so that - they will line up correctly when connected to adjacent pipes. - uraniummeltdown: - - rscadd: More AI holograms! -2017-01-19: - Cyberboss: - - bugfix: Various abstract entities will no longer be affected by spacewind - - bugfix: Ash will, once again, burn in lava - - rscadd: Active testmerges of PRs will now be shown in the MOTD - - bugfix: You will no longer appear to bleed while bandaged - Joan: - - spellcheck: Clockwork airlocks now have more explicit deconstruction messages, - using the same syntax as rwall deconstruction. - Mervill: - - bugfix: Raw Telecrystals won't appear in the Traitor's purchase log at the end - of the round - MrStonedOne: - - bugfix: Fixed excessive and immersion ruining delay on the smoothing of asteroid/mining - rock after a neighboring rock turf was mined up. - XDTM: - - bugfix: Plasmamen that are set on fire by reacting with oxygen will burn even - if they have protective clothing. It will still protect from external fire sources. - - tweak: Atmos-sealing clothing, like hardsuits, will protect plasmamen from reacting - with the atmosphere. - - tweak: Plasmamen can survive up to 1 mole of oxygen before burning, instead of - burning with any hint of oxygen. - - bugfix: Nanotrasen no longer ships self-glueing posters. You'll have to finish - placing the posters to ensure they don't fall on the ground. - - bugfix: Exosuits can't push anchored mobs, such as megafauna or tendrils, anymore. - coiax: - - bugfix: AIs can no longer activate the Doomsday Device off-station. Previously - it would activate and then immediately turn off, outing the AI as a traitor - without any benefit. -2017-01-20: - CoreOverload: - - tweak: Any sharp item can now be used for "incise" surgery step, with 30% success - probability. - Joan: - - rscadd: Sentinel's Compromise will also convert oxygen damage into half toxin, - in addition to brute and burn. - - tweak: Reduced the Ark of the Clockwork Justicar's health from 600 to 500 - - rscadd: You can now pull objects past the Ark of the Clockwork Justicar without - them being moved and or destroyed by its power. - MrStonedOne: - - tweak: Server side timing of the parallax shuttle launch animation now runs on - client time rather than byond time/server time. This will fix the odd issues - it has during lag. The parallax shuttle slowdown animation will still have issues, - those will be fixed in another more involved update to shuttles. - - rscadd: The window will flash in the taskbar when a new round is ready and about - to start. - Tofa01: - - bugfix: Moved The CentComm station 6 tiles to the left in order to prevent large - shuttles such as "asteroid with engines on it" from clipping off the end of - the right side of the map. - XDTM: - - bugfix: Chameleon PDAs can now morph into assistant PDAs. - - bugfix: A few iconless items have been blacklisted from chameleon clothing. - - tweak: Reviver implants now warn you when they're turning on or off, or when giving - a heart attack due to EMP. -2017-01-22: - ChemicalRascal: - - tweak: Voice analyzers in "inclusive" mode (the default mode) are now case-insensitive. - Cyberboss: - - tweak: You can no longer meatspike bots and silicons - - bugfix: Secbots will now drop the baton type they were constructed with - Dannno: - - rscadd: yeehaw.ogg is now a round end sound - Fox McCloud: - - tweak: drying meat slabs and grapes now yields a healthy non-junkfood snack - Hyena: - - rscadd: Adds paint remover to the janitors closet - Joan: - - rscadd: Clockwork Proselytizers can now convert lattices and catwalks. This has - negative gameplay benefit, but looks cool. - - rscadd: Sigils of Transmission can be accessed by clockwork structures in a larger - range. - - tweak: You can see, when examining a clockwork structure, how many sigils are - in range of it. - - rscadd: Clockwork constructs will toggle clockwork structures instead of attacking - them. - Shadowlight213: - - bugfix: Zombies will now get their claws upon zombification - Thunder12345: - - rscadd: The indestructible walls on CentComm will now smooth. - Tofa01: - - tweak: Changed alert message on early launch Authorization shuttle repeal message. - - bugfix: Makes the repeal message work and push a alert to the crew properly, also - reports every Authorization repeal now. - - bugfix: Auto Capitalisation will now work with all types of MMI chat - Ultimate-Chimera: - - rscadd: Adds a new costume crate to the cargo ordering console. - XDTM: - - rscadd: Xenobiology consoles are now buildable from circuitboards in R&D. They'll - be limited to the area they're built in plus any area with the same name. - - rscadd: Stock Exchange computers are now also buildable this way. - - rscadd: Androids now speak in a more robotic tone of voice. - - imageadd: Armblades now look a bit more bladelike. - coiax: - - rscadd: The Delta emergency shuttle now travels towards the south, rather than - the north. This changes nothing except which direction the stars rushing past - the windows are moving. - - bugfix: Fixed dragging the spawn protection traps on CTF. -2017-01-24: - CoreOverload: - - rscadd: You can now buckle handcuffed people to singularity/tesla generators, - RTGs, tesla coils and grounding rods. - Cyberboss: - - tweak: Firealarms now go off if it's too cold - - bugfix: World start will no longer lag - - bugfix: Dismembered heads will now use a mob's real name - Joan: - - rscadd: Clockwork Slabs can now focus on a specific component type to produce. - - experiment: 'Redesigned: Volt Void now allows you to fire up to 5 energy rays - at targets in view; each ray does 25 laser damage to non-Servants in the target - tile. The ray will consume power to do up to double damage, however.' - - wip: Failing to fire a Volt Void ray will damage you, though you won't die from - it unless you have access to a lot of power and are either low on health or - fail all five rays in a row. - - rscadd: The Ark of the Clockwork Justicar will gradually convert objects near - it with increasing range as it gets closer to activating. - - tweak: 'Brass windows have 20% less health, and are accordingly easier to destroy. - Fun fact: Lasers do more damage to brass windows!' - - tweak: 'Wall gears have 33% less health and are slightly faster to deconstruct. - Fun fact: You can climb over wall gears!' - - tweak: Marauders will heal more of their host's damage, on average, per life tick. - - rscadd: Clockwork Proselytizers can now repair Servant silicons and clockwork - mobs. This works in the same manner as repairing clockwork structures. - - tweak: Cogscarabs work slightly differently, and act as though the proselytizer - is a screwdriver. - Kor: - - rscadd: Megafauna will not heal while on the station. Do not be afraid to throw - your life away to get in a few toolbox hits. - Shadowlight213: - - rscdel: PAIs can no longer ventcrawl - Tofa01: - - rscadd: '[Delta Station] Adds a tracking beacon to AI MiniSat Exterior Hallway' - coiax: - - rscdel: Statues are now just incredibly tough mobs, rather than GODMODE. As a - side effect, they are no longer immune to bolts of change. - - bugfix: Fixed some issues with X (as Y) names on polymorphed mobs. -2017-01-26: - Robustin: - - tweak: Unholy Water can now be thrown or vaporized to deliver a powerful poison - unto the cult's enemies - or healing and stun resistance to its acolytes. - Tofa01: - - tweak: Moved Meta station AI MiniSat tracking beacon to AI MiniSat entrance. Should - prevent being regular teleported into space. - - bugfix: Added missing row of pixels to Flypeople torso so head connects to body - properly. - Tofa01 & XDTM: - - rscadd: Adds radio alert messages going to medical channel to the cryo tube when - a patient is fully restored. - - soundadd: Adds new alert sound for cryo tube. (cryo_warning.ogg) - XDTM: - - rscadd: Voice of God has received a few more commands. - - rscadd: You can now use job abbreviations (ex. hos > head of security) and first - names (ex. Duke > Duke Hayka) to focus targets. - coiax: - - rscadd: The nuclear operative cybernetic implant bundle now actually contains - implants. - - rscdel: The cybernetic implant bundle is no longer eligible for discounts (bundles - are, in general, not eligible). - - rscadd: Telecrystals can be purchased in stacks of five and twenty. - - rscadd: The entire stack of telecrystals are added to the uplink when charging - them. -2017-01-27: - Joan: - - tweak: Buckshot now does a maximum of 75 damage, from 90. - - tweak: The unique cyborg scriptures(Linked Vanguard, Judicial Marker) take 3 seconds - to invoke, from 4. - - tweak: Invoking Inath-neq and Invoking Nzcrentr now both take 10 seconds to invoke, - from 15. - Lzimann: - - rscadd: Now you can choose what department you want to be as security! (This may - not be completly reliable). - RemieRichards: - - rscadd: 'Emagging a sleeper now randomises the buttons, the buttons remain the - same until randomised again so you can "learn" the new button config if you''re - a masochist, Inject omnizine but realise far too late that it''s all morphine, - woops! (Note: Epinephrine can always be injected, regardless of chem levels, - this means if something !!FUN!! ends up on the Epinephrine button, it will always - be injectable!)' - Sweaterkittens: - - tweak: There are now updated names and descriptions for the items that your plasma-based - crewmembers start with and use frequently. -2017-01-28: - Joan: - - tweak: Brass windows no longer start off anchored, but are constructed instantly. - - bugfix: You can no longer stack multiple windows of the same direction on a tile. - - rscadd: Vitality Matrices now share vitality globally, allowing you to use vitality - gained from any Matrix. - - tweak: Geis now mutes human targets if there are less than 6 Servants. - - tweak: Geis no longer produces resist messages below 6 Servants; this isn't a - change, as Geis cannot be successfully resisted below 6 Servants. - - tweak: Applying Geis to an already bound target will also mute them, in addition - to preventing resistance. - RemieRichards: - - rscadd: A New weapon for clown mechs, the Oingo Boingo Punch-face! it's a giant - boxing glove that extends out on a spring and sends atoms flying (including - anchored ones and things that make no sense to move because -clowns-) - Tofa01: - - bugfix: Mop will no longer try and clean tile under janitorial cart when wetting - the mop. - - rscadd: Adds modular computers to Metastation. - - bugfix: Fixes no air in Deltastation maintenance kitchen. - - rscadd: Adds a modular computer to the CE office on Pubbystation. - Xhuis: - - rscadd: Energy-based weapons can now light cigarettes. - coiax: - - rscadd: Communication consoles now share cooldowns on announcements. - - rscadd: Cyborgs can now alter the messages of the announcement system. - - bugfix: Deadchat is now notified of any deaths on the shuttle or on Centcom. The - CTF arena does not generate death messages, due to the high levels of death. - - rscadd: The Human-level Intelligence event now occurs slightly more often, and - produces a classified message. - kevinz000: - - rscadd: Emitters and Tesla Coils now have activation wires! - - rscadd: Emitters will shoot out an emitter bolt when pulsed, regardless of it - is on. - - rscadd: Tesla coils will shoot lightning when pulsed, if it is connected to a - cable that has power. - - bugfix: Bolas no longer restrain your hands for 10 seconds when you try to remove - them and fail. -2017-01-29: - BASILMAN YOUR MAIN MAN: - - rscadd: Added a new sailor outfit to the autodrobe, now you can play sailors vs - pirates. - BlakHoleSun: - - rscadd: Added new reaction with the rainbow slime extract. Injecting a rainbow - slime extract with 5u of holy water and 5u of uranium gives you a flight potion. - Cobby: - - tweak: AI's can now be your banker by manipulating the stock machine. - Cyberboss: - - experiment: Nuclear bombs now detonate - - rscadd: You can now link additional cloning pods in the same powered area to a - single computer using a multitool. - Fox McCloud: - - bugfix: Fixes Kudzu seed gene stats not being properly altered by certain reagents - - bugfix: Fixes Kudzu vine dropped seeds not properly having gene stats set - - bugfix: Fixes glowshrooms having an invalidly high lifespan - - bugfix: Fixes explosive vines not properly chaining - Joan: - - rscadd: Clockwork Marauders now grant their host action buttons to force them - to emerge/recall and communicate with them, instead of requiring the host to - type their name or use a verb, respectively. - - rscdel: Clockwork Marauders no longer see their block and counter chances; this - was mostly useless info, as knowing the chance didn't matter as to what you'd - do. - - rscdel: Clockwork Marauders can no longer change their name. - - tweak: Clockwork Marauders have a slightly lower chance to block, and take slightly - more damage when far from their host. - - bugfix: Fixes a bug where Clockwork Marauders never suffered reduced damage and - speed at low health and never got the damage bonus at high health. - Kor: - - rscdel: Stimpacks are no longer available in the mining vendor. - Lzimann: - - rscadd: You can now change your view range as ghost. To do so, either use the - View Range verb in the ghost tab, the mouse scroll up/down or control + "+"/"-". - The verb also works as a reset if you changed your view. - Sogui: - - tweak: There are now 2 less traitors in the double agent mode - - tweak: All security (and captain) suit sensors are set to max by default - Supermichael777: - - tweak: The wooden chair with wings is now craft-able. -1 non reconstruct-able - map object - - rscadd: Added the Tiki mask, you can make it in wood's crafting menu. - - imageadd: Ported Tiki mask's sprites from Hippie station. It is under the same - Creative Commons 3.0 BY-SA as the rest of our sprites. They are from Nienhaus. - Tofa01: - - rscadd: Adds a camera network onto the Omega Station. - - imageadd: Added new sprite for the AI Slipper. - XDTM: - - tweak: Implanting chainsaws is now a prosthetic replacement instead of its own - surgery. - - rscadd: You can now implant synthetic armblades (from an emagged limb grower) - into people's arms to use it at its full potential. - - rscdel: Chainsaw removal surgery has been removed as well; you'll have to sever - the limb and get a new one. - Xhuis: - - rscadd: AI control beacons are a new item created from the exosuit fabricator. - When installed into a mech, it allows AIs to jump to and from that mech freely. - Note that malfunctioning AIs with the domination power unlocked will instead - be forced to dominate the mech. - - tweak: Some timed actions are no longer interrupted while drifting through space. - - rscadd: Riot foam darts can now be constructed from a hacked autolathe. - bgobandit: - - rscadd: The library computer can now upload scanned books to the newscaster. Remember, - seditious or unsavory news channels should receive a Nanotrasen D-Notice! - - rscadd: The library computer can now print corporate posters as well as Bibles. - - rscdel: Cargo no longer offers a corporate poster crate. Nobody ever bought it - anyway. - coiax: - - rscadd: The Librarian now starts with a chisel/soapstone/chalk/magic marker capable - of engraving messages for subsequent shifts, and permanently erasing messages - that the Librarian is unhappy with. It has limited uses, so order more at Cargo. - - bugfix: The contraband cream pie crate is now locked, and requires Theatre access. - - rscadd: Any silicons created by bolts of change have no laws. - - rscadd: Cyborgs are immune to polymorph while changing module. - - rscadd: Adds Romerol to the traitor uplink for 25 TC. (This means you need a discount, - or to work with another traitor to afford it). Romerol is a highly experimental - bioterror agent which silently create dormant nodules to be etched into the - grey matter of the brain. On death, these nodules take control of the dead body, - causing limited revivification, along with slurred speech, aggression, and the - ability to infect others with this agent. - - rscdel: Zombie infections are no longer visible on MediHUD. - - rscdel: Zombies no longer tear open airlocks, since they can just smash them open - just as fast. - - rscdel: Zombies are no longer TOXINLOVING. - - rscadd: EMPs may cause random wires to be pulsed. Please ensure that sensitive - equipment avoids exposure to heavy electromagnetic pulses. - jughu: - - tweak: Changes some cargo export prices - ma44: - - tweak: Nanotrasen has improved training of the crew, teaching crewmembers like - you to unscrew the top off the bottle and pour it into containers like beakers. - vcordie: - - bugfix: Loads the HADES carbine with the correct bullet. - - tweak: The SRM-8 Rocket Pods have been loaded with new explosives designed to - do maximum damage to terrain. These explosives are less effective on people, - however. -2017-01-30: - BASILMAN YOUR MAIN MAN: - - rscadd: Added BM SPEEDWAGON THE BEST (AND ONLY) SPACE CAR ON THE MARKET. - CoreOverload: - - tweak: Clicking item slot now clicks the item in it. - Cyberboss: - - bugfix: Judicial visors now recharge properly - - bugfix: Gluon grenades now properly freeze turfs - - bugfix: Revs are now properly jobbanned - Fox McCloud: - - tweak: Plant analyzers will now display plant traits - - tweak: Plant analyzers will now display all of a grown's genetic reagents - Joan: - - rscdel: Cutting off legs no longer stuns. - - tweak: Volt Void now only allows you to fire 4 volt rays instead of 5, and the - damage of each ray has been reduced to 20, from 25. - - rscdel: Cyborgs using Volt Void now take damage if they fail to fire. - - experiment: 'Clockwork scripture can no longer require more components than it - consumes: This means that most scriptures ""cost"" one less component.' - MrStonedOne: - - rscadd: Because of abuse, actions on interfaces are throttled. Some bursting is - allowed. You will get a message if an action is ignored. Server operators can - configure this in config.dm - Tofa01: - - bugfix: '[Delta] Fixes area names for Deltastation' - - bugfix: '[Delta] Fixes custodial closet being cold all the time on Deltastation' - bgobandit: - - rscadd: Nanotrasen supports the arts. We now offer picture frames! - coiax: - - rscdel: The Syndicate "Uplink Implant" now has no TC precharged. You can charge - it with the use of physical telecrystals. The price has been reduced from 14TC - to 4TC accordingly. (The uplink implant in the implant bundle still has 10TC). - - rscadd: Syndicate bombs and nuclear devices now have a minimum timer of 90 seconds. - - rscadd: Camoflaged HUDs given to head revolutionaries now function the same as - chameleon glasses in the chameleon kit bundle, giving them an action button - and far more disguise options. - - rscadd: Syndicate thermals are also now more like chameleon glasses as well. - - rscadd: You can regain a use of a soapstone by erasing one of your own messages. - (This means you can remove a message if you don't like the colour and want to - try rephrasing it to get a better colour). Erasing someone else's message still - uses a charge. - - bugfix: Fixes bugs where you'd spend a charge without engraving anything. - - bugfix: Fixes a bug where the wrong ckey was entered in the engraving, you won't - be able to take advantage of the "recharging" on messages made before this change. -2017-01-31: - Cyberboss: - - tweak: The cyborg hugging module can no longer self target - Joan: - - tweak: Changed what scriptures and tools Servant cyborgs get; a full list can - be found on the clockwork cult wiki page. - RemieRichards: - - rscadd: Added the ability to choose where your uplink spawns, choose between the - classic PDA, the "woops you don't actually have a PDA" fallback Radio uplink - and the brand new Pen uplink! -2017-02-01: - Cyberboss: - - bugfix: AI integrity restorer computer now respects power usage - - bugfix: Progress bars will now stack vertically instead of on top of each other - - bugfix: Progress bars will no longer be affected by lighting - Xhuis: - - rscadd: You can now fold up bluespace body bags with creatures or objects inside. - You can't fold them up if too many things are inside, but anything you fold - up in can be carried around in the object and redeployed at any time. -2017-02-03: - Cobby: - - rscadd: Ghosts will now be informed when an event has been triggered by our lovely - RNG system. - Cyberboss: - - tweak: Firedoors will eventually reseal themselves if left open during a fire - alarm - Joan: - - tweak: Clockwork Marauders have 25% less health, 300 health from 400. - - wip: The Vitality Matrix scripture is now a Script, from an Application. Its cost - has been accordingly adjusted. - - tweak: Vitality Matrices will be consumed upon successfully reviving a Servant. - They also drain and heal conscious targets slightly slower. - - wip: The Fellowship Armory scripture is now an Application, from a Script. Its - cost has been accordingly adjusted. - - tweak: Fellowship Armory now affects all Servants in view of the invoker, and - will replace weaker gear and armor with its Ratvarian armor. Also, clockwork - treads now allow you to move in no gravity like magboots. - - rscdel: Mania Motors no longer instantly convert people next to them. - - rscadd: Instead, you have to remain next to them for several seconds, after which - you will be knocked out, then converted if possible. - - tweak: Mania Motors now cost slightly less power to run. - Jordie0608: - - tweak: Admin notes, memos and watchlist entries now use a generalized system, - they can all be accessed from the former notes browser. - - rscadd: Added to this are messages, which allow admins to leave a message for - players that is delivered to them when they next connect. - Lexorion: - - tweak: Laser projectiles have a new sprite! They also have a new effect when they - hit a wall. - Sweaterkittens and Joan: - - rscadd: Ocular Wardens will now provide auditory feedback when they acquire targets - and deal damage. - - soundadd: adds ocularwarden-target.ogg, ocularwarden-dot1.ogg and ocularwarden-dot2.ogg - to the game sound files. - Tofa01: - - bugfix: '[Delta] Allows Station Engineers to access Delta Atmospherics Solar Panel - Array Room.' - - rscadd: '[Omega] Adds a Massdriver room to chapel on Omegastation.' - bgobandit: - - rscadd: All art storage facilities offer construction paper now! - coiax: - - rscadd: A victim of a transformation disease will retain their name. - - tweak: The slime transformation disease can turn you into any colour or age of - slime. - - rscadd: The Abductor event can now happen at any time, rather than thirty (30) - minute plus rounds. -2017-02-04: - Cyberboss: - - bugfix: Modular computers now explode properly - - bugfix: Emagged holograms can no longer be exported for credits - - bugfix: Abstract entities no longer feed the singularity - - tweak: Machine frames will no longer be anchored when created - Joan: - - rscadd: Vanguard now shows you how long you have until it deactivates. - Kor: - - rscadd: 'By combing two flashlights and cable coil, you can create a new eye implant: - flashlight eyes. People with flashlights for eyes can not see, but they will - provide an enormous amount of light to their friends.' - - rscadd: Valentines day will now randomly pair up crew members on dates. The paired - crewmembers will get an objective to protect each other at all costs. - Steelpoint: - - rscadd: Addition of two security DragNETs to Deltastations, Omegastations and - Metastations armouries. - Tofa01: - - rscadd: '[Delta] Removes space money from gold crate replaces with 3 Gold Bars - Gold Wrestling belt is still there.' - - rscadd: '[Delta] Removes space money from silver crate replaces with 5 Silver - Coins.' - - bugfix: Fixes incorrect placement of RD modular computer on Metastation. - WhiteHusky: - - rscadd: Fields are supported when printing with a modular computer - - rscadd: PRINTER_FONT is now a variable - - rscdel: Removed the [logo] tag on Modular computers as the logo no longer exists - - tweak: New lines on paper are parsed properly - - tweak: '[tab] is now four non-breaking spaces on papers' - - tweak: Papers have an additional proc, reload_fields, to allow fields made programmatically - to be used - - tweak: 'stripped_input stripped_multiline_input has a new argument: no_trim' - - bugfix: Modular computers no longer spew HTML when looking at a file, rather it - is unescaped like it should - - bugfix: Modular computers no longer show escaped HTML entities when editing - - bugfix: Modular computers can now propperly read and write from external media - - bugfix: Modular computers' file browser lists files correctly - - spellcheck: NTOS File Manager had a spelling mistake; Manage instead of Manager - coiax: - - bugfix: Engraved messages can no longer be moved by a gravitational singularity. - - tweak: The deadchat notification of randomly triggered events now uses the deadsay - span. - - rscdel: The wizard spell "Rod Form" does not produce a message in deadchat everytime - it is used. -2017-02-05: - Cyberboss: - - bugfix: Shuttle docking/round end shouldn't lag as much - - rscadd: There's a new round end sound! - Hyena: - - bugfix: The bible now contains 1 whiskey - Joan: - - rscadd: Ratvar-converted AIs become brass-colored, speak in Ratvarian, and cannot - be carded. - Kor: - - rscadd: Eyes are now organs. You can remove or implant them into peoples heads - with organ manipulation surgery. A mob without eyes will obviously have trouble - seeing. - - rscadd: All special eye powers are now tied to their respective organs. For example, - this means you can harvest an alien or shadow persons eyes, have them implanted, - and gain toggle-able night vision. - - rscadd: All cybernetic eye implants are now cybernetic eyes, meaning you must - replace the patients organic eyes. HUD implants are still just regular implants. - Lzimann: - - rscadd: Tesla zaps can now generate an energy ball if they zap a tesla generator! - Sweaterkittens: - - rscadd: The station's Plasmamen have been issued a new production of envirosuits. - The most notable change aside from small aesthetic differences is the addition - of an integrated helmet light. - - tweak: Tweaked a few of the Plasma Envirosuit sprites to be more fitting thematically. - Swindly: - - bugfix: Saline-glucose solution can no longer decrease blood volume - - rscadd: Cyborg hyposprays can now dispense saline-glucose solution - - rscadd: Saline-glucose solution now increases blood volume when it heals - coiax: - - bugfix: The mulligan reagent can now be created with 1u stable mutation toxin - + 1u unstable mutagen. - - rscdel: Tesla balls cannot dust people near grounding rods. - - rscadd: Soapstones/chisel/magic markers/chalk can remove messages for free. Removing - one of your own messages still grants a use. - - rscadd: The Janitor starts with a dull soapstone for removing unwanted messages. - xmikey555: - - tweak: The tesla engine no longer destroys energy ball generators. -2017-02-06: - Xhuis: - - rscadd: Traitor janitors can now order EZ-clean grenades for 6 telecrystals per - bundle. They function like normal cleaning grenades with an added "oh god my - face is melting" effect, and can also be found in surplus crates. -2017-02-07: - Cyberboss: - - bugfix: Wire, atmos, and disposal networks no longer work across hyperspace when - on the border of a shuttle - - bugfix: Implants that work on death will now work for simple_animals - - bugfix: The target moving while being implanted will no longer continue the implant - - bugfix: Implanters now show progress bars as they were intended to - - bugfix: Pipe painters are no longer aggressive - - bugfix: Carding the AI will now stop a doomsday device - - rscadd: The job subsystem now loads instantly. No more waiting to set your occupation - prefs! - - bugfix: The rare case of duping your inventory at roundstart has been fixed - - bugfix: Self deleting stackable items are fixed - Dannno: - - tweak: We've switched to a new brand of colored jumpsuit. - JJRcop: - - tweak: Adds 4% chance when assigning a valentines day date to also assign someone - else to the same date, but your date will still have you as their only date. - Poojawa: - - bugfix: '[Delta] Active turfs down from 300+' - - bugfix: '[Delta] Janitor closet isn''t 2.7K anymore' - - bugfix: '[Delta] Various pipe fixes' - RemieRichards: - - rscadd: Added a new checmial, Skewium, it's produced by mixing rotatium, plasma - and sulphuric acid in the ratio 2:2:1, which results in 5 Skewium. - Swindly: - - bugfix: Robotic eyes can no longer be eaten - Tofa01: - - bugfix: Fixes grammar issue when changing someones appearance via plastic surgery. - - tweak: '[OmegaStation] Allows Chaplain job to be selectable.' - - bugfix: '[Omega] Fixes Overpressurization In Mass Driver Room' - Xhuis: - - rscadd: Traitor clowns can now buy a reverse revolver. I'll leave it up to you - to guess what it does. Honk. - iamthedigitalme: - - imageadd: Legion has a new, animated sprite. - kevinz000: - - rscadd: 'ADMINS: SDQL2 has been given some new features!' - - bugfix: SDQL2 now gives you an exception on runtime instead of flooding server - runtime logs. - - rscadd: SDQL2 now supports usr, which makes that variable reference to whatever - mob you are in, src, which targets the object it is being called on itself, - and marked, which targets the datum marked by the admin calling it. Also, it - supports hex references (the hex number at the top of a VV panel) in {}s, so - you can target nearly anything! Also, global procs are supported by global.[procname](args), - for CALL queries. - - bugfix: SDQL2 can no longer edit /datum/admins or /datum/admin_rank, and is protected - from changing x/y/z of a turf and anything that would cause broken movement - for movable atoms. - - rscadd: SDQL2 can now get list input with [arg1, arg2]! - - experiment: Do '""' to put strings inside of SDQL2 or it won't work. -2017-02-09: - Cyberboss: - - bugfix: Certain firedoors that should have closed during an alarm now actually - close - - soundadd: You can now knock on firedoors - - bugfix: Supermatter in a closet/crate will now properly fee the singulo - - bugfix: Paper planes can be unfolded again - - bugfix: Paper planes can be stamped properly - Joan: - - tweak: Impaling someone with a sharp item by pulling them with a changeling Tentacle - now does significantly less damage and stuns for less time. - Jordie0608: - - rscadd: Admins can now filter watchlist entries to only users who are connected. - - tweak: Messages no longer delete themselves when sent. - Kor: - - rscadd: The limb grower has been replaced with a box of surplus limbs. Visit robotics - or harvest limbs from another person if you want quality. - Reeeeimstupid: - - rscadd: Silly Abductee objectives. Try not to go crazy trading life stories with - Lord Singulo. - Tofa01: - - tweak: Removes virology access to jobs including Medical Doctor, Geneticist and - Chemist. - - tweak: '[Delta] Changes NW supermatter filter to filter O2 instead of N2' - - rscadd: '[Delta] Adds wardrobes to Dorms & Arrivals Shuttle' - - rscadd: '[Delta] Adds access buttons to virology doors for extra security' - - rscadd: '[Delta] Adds bolt door button to all dorms' - - rscadd: '[Delta] Adds three pairs of optical meson scanners to supermatter room' - - rscadd: '[Delta] Adds a disk fridge to botany' - - rscadd: '[Delta] Adds a cake hat to the bar' - - bugfix: '[Delta] Fixes misplaced station intercom in Supermatter SMES room' - XDTM: - - rscadd: A Law Removal module can be build in RnD. It can remove a specified core - or freeform law. - - tweak: 'When stating laws, silicons won''t skip a number when hiding laws. (example: - 1. Law 1; 2. Law 2; 3. Law 4 if you choose not to state Law 3)' - Xhuis: - - rscadd: Artistic toolboxes now spawn in maintenance and possess various supplies - for wire art and crayon art. - - rscadd: Traitors can now obtain His Grace. Chaplains can buy it for 20 TC, or - it can be found in a surplus crate. - - rscadd: Soapstone messages can now be rated! Attack the message with your hand - to rate it positive or negative. Anyone can see the rating, and you cannot rate - a message more than once, even across rounds. - - rscdel: Soapstones no longer have a write time. - - tweak: Soapstones now have a fixed vocabulary to write messages with. - chanoc1: - - tweak: The salt and pepper shakers have new sprites. - coiax: - - rscadd: Added metal rods and floor tiles to Standard cyborgs. - - rscadd: Added a remote signaling device to Engineering cyborg. - - rscadd: Adds a 'Guardian of Balance' lawset and AI module, currently admin spawn - only. - uraniummeltdown: - - tweak: Kinetic Accelerator Cosmetic and Tracer Modkits now don't use mod capacity. - Cosmetic kits change the name of the KA. -2017-02-10: - Ausops: - - rscadd: Air tanks and plasma tanks have been resprited. - ChemicalRascal: - - tweak: Pen is able to wind up ruined tapes. - CoreOverload: - - rscadd: You can now emag the escape pods to launch them under any alert code. - - tweak: Shuttle name is no longer displayed on "Status" panel. Instead, you can - now examine a status screen to see it. - Cyberboss: - - bugfix: Simple animals now deathgasp properly again - - bugfix: Testmerged PRs will no longer duplicate in the list - - bugfix: Pods and shuttles now have air again - Joan: - - experiment: Clockwork Cults must always construct and activate the Ark. - - imageadd: Updates air tank inhands to match Ausops' new sprites. - Mekhi Anderson: - - rscadd: All mobs can now *spin! - - rscadd: Cyborgs now have handholds. This means you can ride around on them, but - if you get stunned or hit, you fall off! The cyborg can also throw you off by - spinning. - Tofa01: - - soundadd: Changes fire alarm to make new sound FireAlarm.ogg - Xhuis: - - rscdel: The Syndicate will no longer prank their operatives by including reverse - revolvers in surplus crates. - coiax: - - rscadd: A reverse revolver now comes in a box of hugs. - - rscadd: 'Added a new admin only event: Station-wide Human-level Intelligence. - Like the random animal intelligence event, but affecting as many animals as - there are ghosties.' - - rscadd: The Luxury Shuttle grabs cash in your wallet and backpack, and shares - approval between the entrance gates. - - rscadd: The NES Port shuttle now costs 500 credits. -2017-02-11: - Dannno: - - tweak: hahaha I switched your toolboxes you MORONS - Kor: - - rscadd: Killing bubblegum now unlocks a new shuttle for purchase. - Lzimann: - - tweak: Hardsuit built-in jetpacks no longer have a speed boost. - Pyko: - - bugfix: Fixed legit posters and map editing official/serial number for poster - decals. - Tofa01: - - bugfix: '[Delta] Fixes doors walls and windows being incorrectly placed due to - mapmerge issues.' - - bugfix: '[Box] Fixes access levels for HOP shutters.' -2017-02-12: - AnturK: - - rscadd: Added Poison Pen to uplink. - Drunk Musicians: - - rscadd: Drunk music - Gun Hog: - - rscadd: Nanotrasen Engineering has devised a construction console to assist with - building the Auxiliary Mining Base, usually located near a station's Arrivals - hallway. A breakthrough in bluespace technology, this console employs an advanced - internal Rapid Construction Device linked to a camera-assisted holocrane for - rapid, remote construction! - Lzimann: - - bugfix: MMIs/posibrains works with mechas again - RandomMarine: - - rscadd: The Russians have expanded to the shuttle business. A new escape shuttle - is available for purchase. - Sweaterkittens: - - tweak: Plasmamen burn damage multiplier reduced to 1.5x from 2x - coiax: - - rscdel: Removes the STV5 shuttle from purchase. - - rscadd: Swarmers no longer consume the deep fryer, since they have too much respect - for the potential fried foods it can produce. - - rscadd: The clown's survival/internals box is now a box of hugs. Dawww. -2017-02-13: - ChemicalRascal: - - tweak: Delta station brig cell chairs have been replaced with beds. One bed per - cell, no funny business. - Cyberboss: - - bugfix: Simple animals that are deleted when killed will now deathrattle - - bugfix: Fixed Alt-click stack duplication - Joan: - - imageadd: Updated the back and belt sprites for airtanks to match the new sprites. - Kor: - - rscadd: Mobile pAIs are now slower than humans. - Swindly: - - rscadd: Added Nuka Cola as a premium item in Robust Softdrinks - Tofa01: - - bugfix: '[Delta] Fixes double windoor on chemistry windows.' - - tweak: Lowered volume of fire alarm sound also makes it more quiet. - coiax: - - rscadd: Added an admin only tool, the life candle. Touch the candle, and when - you die, you'll respawn shortly afterwards. Touch it again to stop. Used for - testing, thunderdome brawls and good old fashioned memery. - - bugfix: Fried foods no longer shrink to miniature size. -2017-02-14: - Cyberboss: - - bugfix: Fixed unequipping items while stunned - - bugfix: Fixed various things deleting when unequipped - - bugfix: Fixed tablet ID slots deleting cards - - bugfix: Fixed water mister nozzle getting stuck in hands - - tweak: Title music now starts immediately upon login - - tweak: You can no longer sharpen energy weapons - Joan: - - tweak: Mania Motors are overall less effective and only affect people who can - see the motor. - - tweak: Mania Motors have slightly more health; 100, from 80. - MrStonedOne: - - tweak: Station time is now always visible in the status tab. - - tweak: Both server time and station time now displays seconds so you can actively - see how game time (ByondTime[tm]) is progressing along side real time. - - rscadd: Added a time dilation tracker, this allows you to better understand how - time will progress in game. It shows the time dilation percent for the last - minute as well as some rolling averages. - RandomMarine: - - tweak: Pre-made charcoal pills now contain 10 units instead of 50. The amount - of pills inside of toxin first aid kits and the smartfridge have been increased - to compensate. Keep in mind that each ten unit pill recovers 100 points of toxin - damage and purges 50 units of other reagents. - Steelpoint: - - tweak: All Drones now have a walking animation. - Tofa01: - - bugfix: '[Delta] Fixes space cleaner being empty in brig medbay' - - bugfix: '[Delta] Fixes some areas that are not radiation proof' - - bugfix: '[Meta] Fixes Atmospherics Freezer Spawning As A Heater' - uraniummeltdown: - - rscadd: Window Flashing is now a preference - - rscadd: Your game window will flash when alerted as a ghost. This includes being - revived by defibs/cloning and events such as borers, swarmers, revenant, etc. -2017-02-16: - Cyberboss: - - rscadd: Test merged PRs are now more detailed - Steelpoint: - - rscadd: The Head of Security's Hardsuit is now equipped with a inbuilt Jetpack. - coiax: - - rscadd: The Hyperfractal Gigashuttle is now purchasable for 100,000 credits. Help - Centcom by testing this very safe and efficient shuttle design. (Terms and conditions - apply.) - - rscadd: The changeling power "Anatomic Panacea" now causes the changeling to vomit - out zombie infections, along with headslugs and xeno infections, as before. - - bugfix: The main CTF laser gun disappears when dropped on the floor. -2017-02-17: - Arianya: - - tweak: The Labour Camp rivet wall has been removed! - - spellcheck: Fixed some typos in Prison Ofitser's description. - Cobby: - - experiment: Flashes have been rebalanced to be more powerful - Cyberboss: - - bugfix: Rack construction progress bars will no longer be spammed - - tweak: The round start timer will count down during subsystem initialization - - tweak: Total subsystem initialization time will now be displayed - Joan: - - rscdel: His Grace no longer globally announces when He is awakened or falls to - sleep. - - rscdel: His Grace is not a toolbox, even if He looks like one. - - experiment: His Grace no longer requires organs to awaken. - - tweak: His Grace now gains 4 force for each victim consumed, always provides stun - immunity, and will, generally, take longer to consume His owner. - - experiment: His Grace must be destroyed to free the bodies within Him. - - experiment: Dropping His Grace while He is awake will cause you to suffer His - Wrath until you hold Him again. - - rscadd: His Grace becomes highly aggressive after consuming His owner, and will - hunt His own prey. - - experiment: The Ark of the Clockwork Justicar now only costs 3 of each component - to summon, but must consume an additional 7 of each component before it will - activate and start counting down. - - rscadd: The presence of the Ark will be immediately announced, though the location - will still only be announced after it has been active and counting down for - 2 minutes. - - tweak: The Ark also requires an additional invoker to invoke. - Lobachevskiy: - - bugfix: Fixed glass shards affecting buckled and flying mobs - MrStonedOne: - - experiment: The game will now force hardware rendering on for all clients. - Nienhaus: - - rscadd: Drying racks have new sprites. - Swindly: - - rscadd: Trays can now be used to insert food into food processors - Thunder12345: - - bugfix: It's ACTUALLY possible to pat people on the head now - WJohn: - - imageadd: Improved blueshift sprites, courtesy of Nienhaus. - XDTM: - - rscadd: Bluespace Crystals are now a material that can be inserted in Protolathes - and Circuit Printers. Some items now require Bluespace Mesh. - - rscadd: Bluespace Crystal can now be ground in a reagent grinder to gain bluespace - dust. It has no uses, but it teleports people if splashed on them, and if ingested - it will occasionally cause teleportation. - coiax: - - rscadd: Engraved messages now have a UI, which any player, living or dead can - access. See when the message was engraved, and upvote or downvote accordingly. - - rscadd: Admins have additional options with the UI, seeing the player ckey, original - character name, and the ability to outright delete messages at the press of - a button. - kevinz000: - - bugfix: Flightsuits actually fly over people - - bugfix: Flightsuits don't interrupt pulls when you pass through doors -2017-02-18: - Cyberboss: - - imageadd: New round end animation. Inspired by @Iamgoofball - Gun Hog: - - rscadd: The Aux Base console now controls turrets made by the construction console. - - rscadd: The Aux Base may now be dropped at a random location if miners fail to - use the landing remote. - - rscadd: The mining shuttle may now dock at the Aux Base's spot once the base is - dropped. - - tweak: Removed access levels on the mining shuttle so it can be used at the public - dock. - - tweak: The Aux Base's turrets now fire through glass. Reminder that the turrets - need to be installed outside the base for full damage. - - rscadd: Added a base construction console to Delta Station. - Mysterious Basilman: - - rscadd: More powerful toolboxes are active in this world... - Scoop: - - tweak: Condimasters now correctly drop their items in front of their sprite. - Tofa01: - - bugfix: Re-Arranges And Extends Pubby Escape Hallway To Allow Larger Shuttle To - Dock - - bugfix: '[Meta] Fixes top left grounding rod from being destroyed by the Tesla - engine.' - TrustyGun: - - rscadd: Traitor mimes can now learn two new spells for 15 tc. - - rscadd: The first, Invisible Blockade, creates a 3x1 invisible wall. - - rscadd: The second, Finger Guns, allows them to shoot bullets out of their fingers. - kevinz000: - - rscadd: You can now ride piggyback on other human beings, as a human being! To - do so they must grab you aggressively and you must climb on without outside - assistance without being restrained or incapacitated in any manner. They must - also not be restrained or incapacitated in any manner. - - rscadd: If someone is riding on you and you want them to get off, disarm them - to instantly floor them for a few seconds! It's pretty rude, though. - rock: - - soundadd: you can now harmlessly slap somebody by aiming for the mouth on disarm - intent. - - soundadd: you can only slap somebody who is unarmed on help intent, restrained, - or ready to slap you. -2017-02-19: - Basilman: - - rscadd: some toolboxes, very rarely, have more than one latch - Joan: - - rscadd: You can now put components, and deposit components from slabs, directly - into the Ark of the Clockwork Justicar provided it actually requires components. - - experiment: Taunting Tirade now leaves a confusing and weakening trail instead - of confusing and weakening everyone in view. - - tweak: Invoking Inath-neq/Nzcrentr is now 33% cheaper and has a 33% lower cooldown. - Tofa01: - - rscdel: '[Delta] Removes SSU From Mining Equipment Room' - - tweak: Changes centcomm ferry to require centcomm general access instead of admin - permission. - coiax: - - rscadd: Nuke ops syndicate cyborgs have been split into two seperate uplink items. - Medical cyborgs now cost 35 TC, assault cyborgs now cost 65 TC. - grimreaperx15: - - tweak: Blood Cult Pylons will now rapidly regenerate any nearby cultists blood, - in addition to the normal healing they do. - ma44: - - tweak: Intercepted messages from a lavaland syndicate base reveals they have additional - grenade and other miscellaneous equipment. - uraniummeltdown: - - rscadd: Shuttle engines have new sprites. -2017-02-20: - Cyberboss: - - bugfix: The frequncy fire alarms play at is now consistent - MrStonedOne: - - tweak: bluespace ore cap changed from 100 ores to 500 - Tofa01: - - tweak: '[Meta] Replaces orange jumpsuit in holding cell with prisoner jumpsuits' - XDTM: - - tweak: Repairing someone else's robotic limb is instant. Repairing your own robotic - limbs will still take time. - - tweak: Repairing limbs with cable or welding will now heal more. - Xhuis: - - bugfix: Medipens are no longer reusable. -2017-02-21: - Cyberboss: - - bugfix: You can now unshunt as a malfunctioning AI again - Kor: - - bugfix: You will now retain your facing when getting pushed by another mob. - Tofa01: - - bugfix: '[Z2] Fixed Centcomm shutters to have proper access levels for inspectors - and other Admin given roles' - coiax: - - rscadd: Refactors heart attack code, a cardiac arrest will knock someone unconscious - and kill them very quickly. - - rscadd: Adds corazone, an anti-heart attack drug, made by mixing 2 parts Phenol, - 1 part Lithium. A person with corazone in their system will not suffer any negative - effects from missing a heart. Use it during surgery. - - rscadd: Abductor glands are now hearts, the abductor operation table now automatically - injects corazone to prevent deaths during surgery. The gland will restart if - it stops beating. - - bugfix: Cloning pods always know the name of the person they are cloning. - - rscadd: You can swipe a medical ID card to eject someone from the cloning pod - early. The cloning pod will announce this over the radio. - - rscdel: Fresh clones have no organs or limbs, they gain them during the cloning - process. Ejecting a clone too early is not recommended. Power loss will also - eject a clone as before. - - rscdel: An ejected clone will take damage from being at critical health very quickly - upon ejection, rather than before, where a clone could be stable in critical - for up to two minutes. - - rscadd: Occupants of cloning pods do not interact with the air outside the pod. - uraniummeltdown: - - bugfix: All shuttle engines should now be facing the right way -2017-02-22: - AnonymousNow: - - rscadd: Added Medical HUD Sunglasses. Not currently available on-station, unless - you can convince Centcom to send you a pair. - Cyberboss: - - bugfix: Spawning to the station should now be a less hitchy experience - MrPerson: - - experiment: 'Ion storms have several new additions:' - - rscadd: 25% chance to flatly replace the AI's core lawset with something random - in the config. Suddenly the AI is Corporate, deal w/ it. - - rscadd: 10% chance to delete one of the AI's core or supplied laws. Hope you treated - the AI well without its precious law 1 to protect your sorry ass. - - rscadd: 10% chance that, instead of adding a random law, it will instead replace - one of the AI's existing core or supplied laws with the ion law. Otherwise, - it adds the generated law as normal. There's still a 100% chance of getting - a generated ion law. - - rscadd: 10% chance afterwards to shuffle all the AI's laws. - TalkingCactus: - - bugfix: New characters will now have their backpack preference correctly set to - "Department Backpack". - Tofa01: - - bugfix: '[Delta] Fixes missing R&D shutter near public autolathe' - Xhuis: - - tweak: Highlanders can no longer hide behind chairs and plants. - - tweak: Highlanders no longer bleed and are no longer slowed down by damage. -2017-02-23: - Cyberboss: - - bugfix: Fixed a bug where the fire overlay wasn't getting removed from objects - - bugfix: The graphical delays with characters at roundstart are gone - - bugfix: The crew manifest is working again - - rscadd: Admins can now asay with ":p" and dsay with ":d" - Dannno: - - imageadd: Robust Softdrinks LLC. has sent out new vendies to the stendy. - Joan: - - rscdel: Off-station and carded AIs no longer prevent Judgement scripture from - unlocking. - Nienhaus: - - tweak: Updates ammo sprites to the new perspective. - Tofa01: - - bugfix: Disables sound/frequency variance on cryo tube alert sound - coiax: - - rscadd: Nanotrasen reminds its employees that they have ALWAYS been able to taste. - Anyone claiming that they've recently only just gained the ability to taste - are probably Syndicate agents. -2017-02-24: - MrStonedOne: - - rscdel: Limit on Mining Satchel of Holding Removed - - tweak: Dumping/mass pickup/mass transfer of items is now lag checked - - rscadd: Dumping/mass pickup/mass transfer of items has a progress bar -2017-02-25: - AnonymousNow: - - rscadd: Nerd Co. has sent pairs of thicker prescription glasses out to Nanotrasen - stations, for your local geek to wear. - Basilman: - - rscadd: New box sprites - Robustin: - - tweak: Hulks can no longer use pneumatic cannons or flamethrowers - Tofa01: - - rscadd: '[All Maps] The new and improved Centcom transportation ferry version - 2.0 is out now!' - coiax: - - rscadd: Cargo can now order plastic sheets to make plastic flaps. No doubt other - uses for plastic will be discovered in the future. - - rscadd: To deconstruct plastic flaps, unscrew from the floor, then cut apart with - wirecutters. Plastic flaps have examine tips like reinforced walls. - uraniummeltdown: - - rscadd: Science crates now have new sprites -2017-02-26: - Ausops: - - imageadd: New sprites for water, fuel and hydroponics tanks. - Joan: - - experiment: 'Clockwork objects are overall easier to deconstruct:' - - wip: Clockwork Walls now take 33% less time to slice through, Brass Windows now - work like non-reinforced windows, and Pinion Airlocks now have less health and - only two steps to decon(wrench, then crowbar). - - rscadd: EMPing Pinion Airlocks and Brass Windoors now has a high chance to open - them and will not shock or bolt them. - - rscadd: Anima fragments will very gradually self-repair. - Tofa01: - - bugfix: '[Omega] Fixes ORM input and output directions' - - bugfix: Fixes space bar kitchen freezer access level - - bugfix: Fixes giving IDs proper access for players who spawn on a ruin via a player - sleeper/spawners - - bugfix: '[Delta] Fixes varedited tiles causing tiles to appear as if they have - no texture' - - bugfix: Fixes robotic limb repair grammar issue -2017-02-27: - Kor, Jordie0608 and Tokiko1: - - rscadd: Singularity containment has been replaced on box, meta, and delta with - a supermatter room. The supermatter gives ample warning when melting down, so - hopefully we'll see fewer 15 minute rounds ended by a loose singularity. - - rscadd: Supermatter crystals now collapse into singularities when they fail, rather - than explode. - Tofa01: - - bugfix: Stops AI And Borgs From Interfacing With Ferry Console - TrustyGun: - - imageadd: Box sprites are improved. - WJohnston: - - imageadd: New and improved BRPED beam. The old one was hideous. - coiax: - - rscadd: Drone shells are now points of interest in the orbit list. - - rscadd: Derelict drone shells now spawn with appropriate headgear. -2017-02-28: - Cyberboss: - - tweak: You will no longer be shown empty memories when the game starts - - bugfix: Built APCs now work again - - bugfix: Borg AI cameras now work again - Joan: - - rscadd: Anima Fragments now slam into non-Servants when bumping. This will ONLY - happen if the fragment is not slowed, and slamming into someone will slightly - damage the fragment and slow it severely. - Lzimann: - - tweak: Communications console can also check the ID the user is wearing. - Supermichael777: - - tweak: The button now has a five second delay when detonating bombs - XDTM: - - rscadd: You can now change the input/output directons for Ore Redemption Machines - by using a multitool on them with the panel open. - - rscadd: Diagnostic HUDs can now see if airlocks are shocked. -2017-03-01: - Cyberboss: - - bugfix: Lobby music is no longer delayed -2017-03-02: - Gun Hog: - - tweak: Advanced camera, Slime Management, and Base Construction consoles may now - be operated by drones and cyborgs. - Robustin: - - rscadd: The syndicate power beacon will now announce the distance and direction - of any engines every 10 seconds. - Steelpoint: - - rscadd: Robotics and Mech Bay have seen a mapping overhaul on Boxstation. - - rscadd: A cautery surgical tool has been added to the Robotics surgical area on - Boxstation. - XDTM: - - tweak: Hallucinations have been modified to increase the creepiness factor and - reduce the boring factor. - - rscadd: Added some new hallucinations. - - bugfix: Fixed a bug where the singularity hallucination was stunning for longer - than intended and leaving the fake HUD crit icon permanently. - coiax: - - rscadd: Ghosts are polled if they want to play an alien larva that is about to - chestburst. They are also told who is the (un)lucky victim. - - bugfix: Clones no longer gasp for air while in cloning pods. - - rscadd: Adds a new reagent, "Mime's Bane", that prevents all emoting while it - is in a victim's system. Currently admin only. - - experiment: Mappers now have an easier time adding posters, and specifying whether - they're random, random official, random contraband or a specific poster. - - rscdel: Posters no longer have serial numbers when rolled up; their names are - visible instead. - kevinz000: - - rscadd: You can now craft pressure plates. - - rscadd: Pressure plates are hidden under the floor like smuggler satchels are, - but you can attach a signaller to them to have it signal when a mob passes over - them! - - experiment: Bomb armor is now effective in lessening the chance of being knocked - out by bombs. -2017-03-03: - Cyberboss: - - tweak: You can now repair shuttles in transit space - Incoming5643: - - imageadd: 'Server Owners: There is a new system for title screens accessible from - config/title_screen folder.' - - rscadd: This system allows for multiple rotating title screens as well as map - specific title screens. - - rscadd: It also allows for hosting title screens in formats other than DMI. - - rscadd: 'See the readme.txt in config/title_screen for full details. remove: The - previous method of title screen selection, the define TITLESCREEN, has been - depreciated by this change.' - Sligneris: - - imageadd: Updated sprites for the small xeno queen mode -2017-03-04: - Cyberboss: - - bugfix: You can build lattice in space again - Hyena: - - tweak: Detective revolver/ammo now starts in their shoulder holster - Joan: - - tweak: Weaker cult talismans take less time to imbue. - PJB3005: - - rscadd: Rebased to /vg/station lighting code. - Supermichael777: - - rscadd: Grey security uniforms have unique names and descriptions - Tofa01: - - rscadd: Adds the new Centcomm Raven Battlecruiser to the purchasable shuttle list - buy now get one free! - coiax: - - rscadd: CTF players start with their helmet toggled off, better to see the whites - of their opponents eyes. Very briefly. - - bugfix: Existing CTF barricades are repaired between rounds, and deploy instantly - when replaced. - - tweak: Healing non-critical CTF damage is faster. Remember though, if you drop - into crit, YOU DIE. - - rscadd: Admin ghosts can just click directly on the CTF controller to enable them, - in addition to using the Secrets panel. - - bugfix: Cyborg radios can no longer have their inaccessible wires pulsed by EMPs. -2017-03-06: - Cyberboss: - - experiment: Map rotation has been made smoother - Gun Hog: - - bugfix: The Aux Base Construction Console now directs to the correct Base Management - Console. - - bugfix: The missing Science Department access has been added to the Auxiliary - Base Management Console. - Hyena: - - rscdel: Space bar is out of bussiness - MrStonedOne: - - bugfix: patched a hacky workaround for /vg/lights memory leaking crashing the - server - Penguaro: - - bugfix: Changed DIR of Gas Filter for O2 in Waste Loop from 1 to 4 - Sligneris: - - imageadd: '''xeno queen'' AI hologram now actually uses the xeno queen sprite - as a reference' - Tofa01: - - bugfix: '[Omega] Fixes missing walls and wires new dock to the powergrid' - XDTM: - - rscadd: Changelings can now click their fake clothing to remove it, without needing - to drop the full disguise. - coiax: - - rscadd: The Bardrone and Barmaid are neutral, even in the face of reality altering - elder gods. -2017-03-07: - Supermichael777: - - rscadd: Wannabe ninjas have been found carrying an experimental chameleon belt. - The Spider clan has disavowed any involvement. -2017-03-08: - Cyberboss: - - imageadd: Added roundstart animation - - experiment: Roundstart should now be a smoother experience... again - - bugfix: You can now scan storage items with the forensic scanner - - bugfix: Unfolding paper planes no longer deletes them - - bugfix: Plastic no longer conducts electricity - - tweak: The map rotation message will only show if the map is actually changing - Francinum: - - bugfix: Holopads now require power. - Fun Police: - - tweak: Reject Adminhelp and IC Issue buttons have a cooldown. - Joan: - - rscadd: Circuit tiles now glow faintly. - - rscadd: Glowshrooms now have colored light. - - tweak: Tweaked the potency scaling for glowshroom/glowberry light; high-potency - plantss no longer light up a huge area, but are slightly brighter. - Kor: - - rscadd: People with mutant parts (cat ears) are no longer outright barred from - selecting command roles in their preferences, but will have their mutant parts - removed on spawning if they are selected for that role. - LanCartwright: - - rscadd: Adds scaling damage to buckshot. - Robustin: - - tweak: The DNA Vault has 2 new powers - - tweak: The DNA Vault requires super capacitors instead of quadratic - - tweak: Cargo's Vault Pack now includes DNA probes - Supermichael777: - - rscadd: Robust Soft Drinks LLC is proud to announce Premium canned air for select - markets. There is not an air shortage. Robust Soft Drinks has never engaged - in any form of profiteering. - TalkingCactus: - - rscadd: Energy swords (and other energy melee weapons) now have a colored light - effect when active. - Tofa01: - - bugfix: '[All Maps] Fixes syndicate shuttles spawning too close to stations by - moving their spawn further from the station' - - rscadd: '[Omegastation] This station now has a syndicate shuttle and syndicate - shuttle spawn.' - coiax: - - rscadd: Wizards now have a new spell "The Traps" in their spellbook. Summon an - array of temporary and permanent hazards for your foes, but don't fall into - your own trap(s)! - - rscadd: Permanent wizard traps can be triggered relatively safely by throwing - objects across the trap, or examining it at close range. The trap will then - be on cooldown for a minute. - - rscadd: Toy magic eightballs can now be found around the station in maintenance - and arcade machines. Ask your question aloud, and then shake for guidance. - - rscadd: Adds new Librarian traitor item, the Haunted Magic Eightball. Although - identical in appearance to the harmless toys, this occult device reaches into - the spirit world to find its answers. Be warned, that spirits are often capricious - or just little assholes. - - rscadd: You only have a headache looking at the supermatter if you're a human - without mesons. - - rscadd: The supermatter now speaks in a robotic fashion. - - rscadd: Admins have a "Rename Station Name" option, under Secrets. - - rscadd: A special admin station charter exists, that has unlimited uses and can - be used at any time. - - rscadd: Added glowsticks. Found in maintenance, emergency toolboxes and Party - Crates. - kevinz000: - - rscadd: The Syndicate reports a breakthrough in chameleon laser gun technology - that will disguise its projectiles to be just like the real thing! -2017-03-10: - Cyberboss: - - bugfix: You should no longer be seeing entities with `\improper` in front of their - name - - rscadd: The arrivals shuttle will now ferry new arrivals to the station. It will - not depart if any intelligent living being is on board. It will remain docked - if it is depressurized. - - tweak: You now late-join spawn buckled to arrivals shuttle chairs - - tweak: Ghost spawn points have been moved to the center of the station - - tweak: Departing shuttles will now try and shut their docking airlocks - - bugfix: The arrivals shuttle airlocks are now properly cycle-linked - - bugfix: You can now hear hyperspace sounds outside of shuttles - - experiment: The map loader is faster - - tweak: Lavaland will now load instantly when the game starts - Jordie0608: - - tweak: The Banning Panel now organises search results into pages of 15 each. - XDTM: - - bugfix: Slimes can now properly latch onto humans. - - bugfix: Slimes won't aggro neutral mobs anymore. This includes blood-spawned gold - slime mobs. - - rscadd: Clicking on a tile with another tile and a crowbar in hand directly replaces - the tile. - Xhuis: - - imageadd: Ratvar and Nar-Sie now have fancy colored lighting! - coiax: - - rscadd: Wizards can now use their magic to make ghosts visible to haunt the crew, - and possibly attempt to betray the wizard. - - rscadd: When someone dies, if their body is no longer present, the (F) link will - instead jump to the turf they previously occupied. - - bugfix: Stacks of materials will automatically merge together when created. You - may notice differences when ejecting metal, glass or using the cash machine - in the vault. - - rscadd: You can find green and red glowsticks in YouTool vending machines. - fludd12: - - bugfix: Modifying/deconstructing skateboards while riding them no longer nails - you to the sky. - lordpidey: - - rscadd: Glitter bombs have been added to arcade prizes. -2017-03-11: - AnturK: - - rscadd: Traitors now have access to radio jammers for 10 TC - Hyena: - - bugfix: fixes anti toxin pill naming - Joan: - - tweak: Window construction steps are slightly faster; normal windows now take - 6 seconds with standard tools, from 7 and reinforced windows now take 12 seconds - with standard tools, from 14. - - tweak: Brass windows take 8 seconds with standard tools, from 7. - - rscadd: Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd - expect. - - rscdel: Removed His Grace ascension. - PKPenguin321: - - tweak: Cryoxadone's ability to heal cloneloss has been greatly reduced. - - rscadd: Clonexadone has been readded. It functions exactly like cryoxadone, but - only heals cloneloss, and at a decent rate. Brew it with 1 part cryoxadone, - 1 part sodium, and 5 units of plasma for a catalyst. - Penguaro: - - tweak: Adjusted table locations - - tweak: Moved chair and Cargo Tech start location - - tweak: Moved filing cabinet - - rscdel: Removed Stock Computer - Tofa01: - - bugfix: '[Meta] Fixes Supermatter Shutters Not Working' - coiax: - - rscadd: Swarmer lights are coloured cyan. - kevinz000: - - bugfix: Deadchat no longer has huge amount of F's. -2017-03-12: - JStheguy: - - imageadd: Changed Desert Eagle sprites, changed .50 AE magazine sprites, added - Desert Eagle magazine overlay to icons/obj/guns/projectile.dmi. - - tweak: The empty Desert Eagle sprite now only displays on an empty chamber. The - existence or lack thereof of the magazine is rendered using an overlay instead. - Lzimann: - - tweak: Braindead has a more intuitive message - coiax: - - rscdel: A cloner that is EMP'd will merely eject the clone early, rather than - gibbing it. Emagging the cloner will still gib the clone. -2017-03-13: - Cyberboss: - - tweak: You must now be on any intent EXCEPT help to weld an airlock shut - - rscadd: You can now repair airlocks with welding tools on help intent (broken - airlocks still need their wires mended though) - Cyberboss, Bgobandit, and Yogstation: - - rscadd: The HoP can now prioritze roles for late-joiners - Every coder, player, and admin in Space Station 13: - - rscadd: Adds the Tomb Of The Unknown Employee to Central Command, - - rscadd: Rest in peace, those who died after contributing to Space Station 13. - Hyena: - - bugfix: Surplus leg r/l name fixed - - bugfix: You can now carry honey in plant bags - Lordpidey: - - bugfix: Devils can no longer break into areas with sheer force of disco funk - - rscadd: The pitchfork of an ascended devil can now break down walls. - - rscadd: Hell has decided to at least clothe it's devils when sending them a brand - new body. - - rscadd: Pitchforks glow red now. - Penguaro: - - rscdel: '**Engineering** - Removed Tables, paper bin, and pen' - - rscadd: '**Engineering** - Replaced with Welder and Electrical Lockers' - - rscadd: '**Engineering** - Moved First-Aid Burn kit to Engineering Foyer' - - tweak: '**Chapel** - Replaced one Window with Win-Door for Coffin Storage' - Space Bicycle Consortium: - - bugfix: Bicycles now only cost 10,000 yen, down from 1,000,000 yen. - coiax: - - rscadd: The egg spawner on Metastation will generate a station message and inform - the admins if an egg is spawned. (It's only a two percent chance, but live in - hope.) - - rscadd: Glowsticks can now be found in "Swarmer Cyan" colors. -2017-03-14: - Joan: - - rscadd: Shuttles now have dynamic lighting; you can remove the lights on them - and use your own lights. - - tweak: All maps now use Deltastation's fancy syndicate shuttle. - - tweak: Shadowshrooms of lower potency are much less able to blanket the station - in darkness. - PKPenguin321: - - tweak: Lattices now require wirecutters to deconstruct, rather than welding tools. -2017-03-15: - Cyberboss: - - bugfix: You can no longer depart on the arrivals shuttle by hiding inside things - Joan: - - tweak: Proselytizers converting clockwork floors to walls now always take 10 seconds, - regardless of how fast the proselytizer is. - - tweak: Clockwork grilles no longer provide CV. - Penguaro: - - bugfix: '**Engineering** - Changed Access Level from **24** (_Atmo_) to **10** - (_Engine_) on **Radiation Shutter Control**' - TrustyGun: - - tweak: Traitor Mimes with the finger guns spell now fire 3 bullets at a time, - as opposed to just 1. - octareenroon91: - - rscadd: Allow new reflector frames to be built from metal sheets. - oranges: - - rscdel: Removed patting -2017-03-16: - BASILMAN YOUR MAIN MAN: - - rscadd: The BM Speedwagon has been improved both in terms of aesthetics and performance! - Cyberboss: - - bugfix: The shield generators in Boxstation Xenobiology now have the correct access - Joan: - - rscadd: Cult structures that emitted light now have colored light. - MrPerson: - - rscadd: Humans can see in darkness slightly again. This is only so you can see - where you are when the lights go out. - MrStonedOne: - - bugfix: Fixed lighting not updating when a opaque object was deleted - Penguaro: - - tweak: Increased Synchronization Range on Exosuit Fabricator - Tofa01: - - bugfix: '[Delta] Fixes telecoms temperature and gas mixing / being contaminated.' - - bugfix: '[Delta] Fixes some doubled up turfs causing items and objects to get - stuck to stuff' - - tweak: '[Omega] Makes telecoms room cool down and be cold.' - Tokiko1: - - rscadd: Most gases now have unique effects when surrounding the supermatter crystal. - - tweak: The supermatter crystal can now take damage from too much energy and too - much gas. - - rscadd: Added a dangerous overcharged state to the supermatter crystal. - - rscadd: Readded explosion delaminations, a new tesla delamination and allowed - the singulo delamination to absorb the supermatter. - - tweak: The type of delamination now depends on the state of the supermatter crystal. - - tweak: Various supermatter engine rebalancing and fixes. - kevinz000: - - rscadd: SDQL2 now supports outputting proccalls to variables, and associative - lists - peoplearestrange: - - bugfix: Fixed buildmodes full tile window to be correct path - rock: - - tweak: if we can have glowsticks in toolvends why not flashlights amirite guys -2017-03-17: - BeeSting12: - - bugfix: Moved Metastation's deep fryer so that the chef can walk all the way around - the table. - Cobby: - - tweak: The gulag mineral ratio has been tweaked so there are PLENTY of iron ore, - nice bits of silver/plasma, with the negative of having less really high valued - ores. If you need minerals, it may be a good time to ask the warden now! - Joan: - - rscadd: You can now place lights and most wall objects on shuttles. - Xhuis: - - rscadd: Added the power flow control console, which allows remote manipulation - of most APCs on the z-level. You can find them in the Chief Engineer's office - on all maps. -2017-03-18: - Supermichael777: - - rscadd: Free golems can now buy new ids for 250 points. - XDTM: - - rscadd: You can now complete a golem shell with runed metal, if you somehow manage - to get both. - - rscadd: Runic golems don't have passive bonuses over golems, but they have some - special abilities. - coiax: - - bugfix: The alert level is no longer lowered by a nuke's detonation. -2017-03-19: - BeeSting12: - - rscadd: Nanotrasen has decided to better equip the box-class emergency shuttles - with a recharger on a table in the cockpit. - Cheridan: - - tweak: The slime created by a pyroclastic anomaly detonating is now adult and - player-controlled! Reminder that if you see an anomaly alert, you should grab - an analyzer and head to the announced location to scan it, and then signal the - given frequency on a signaller! - Penguaro: - - bugfix: change access variables for turrets and shield gens - - bugfix: Box Station - Replaces the smiling table grilles with their more serious - counterparts. - coiax: - - tweak: The Syndicate lavaland base now has a single self destruct bomb located - next to the Communications Room. Guaranteed destruction of the base is guaranteed - by payloads embedded in the walls. - octareenroon91: - - bugfix: Fixes infinite vaping bug. - uraniummeltdown: - - rscadd: Plant data disks have new sprites. - - bugfix: Fixed Monkey Recycler board not showing in Circuit Imprinter - - tweak: Kinetic Accelerator Range Mod now takes up 25% space instead of 24% -2017-03-21: - ExcessiveUseOfCobblestone: - - experiment: All core traits [Hydroponics] scale with the parts in the gene machine. - Time to beg Duke's Guide Read.... I mean RND! - - tweak: Data disks with genes on them will have just the name of the gene instead - of the prefix "plant data disk". - - tweak: If you were unaware, you can rename these disks with a pen. Now, you can - also change the description if you felt inclined to. - Joan: - - experiment: Caches produce components every 70 seconds, from every 90, but each - other linked, component-producing cache slows down cache generation by 10 seconds. - Lombardo2: - - rscadd: The tentacle changeling mutation now changes the arm appearance when activated. - MrPerson: - - bugfix: Everyone's eyes aren't white anymore. - Penguaro: - - tweak: Box Station - The Vents and Scrubbers for the Supermatter Air Alarm are - now isolated from the rest of the Air Alarms in Engineering. - Supermichael777: - - bugfix: Chasms now smooth properly. - Tokiko1: - - tweak: Minor supermatter balancing changes. - - tweak: Supermatter now announces its damage half as frequently. - - tweak: Badly unstable supermatter now occasionally zaps nearby engineers and causes - anomalies to appear nearby, similar to overcharged supermatter. - XDTM: - - rscadd: Golem Shells can now be completed with medical gauze or cloth to form - cloth golems, which are weaker and extremely flammable. However, if they die, - they turn into a pile of cloth that will eventually re-animate back into full - health. That is, unless someone lights it on fire. -2017-03-22: - BeeSting12: - - rscadd: Added an autolathe circuit board to deltastation's tech storage. - - rscadd: Added 49 sheets of metal to deltastation's auxiliary tool storage. - Iamgoofball: - - bugfix: Freon no longer bypasses atmos hardsuits. - Penguaro: - - rscadd: Meta - Added Tool Belts to Engineering and Engineering Foyer - - rscdel: Meta - Removed Coffee Machine from Permabrig - - rscadd: Added Cameras for Supermatter Chamber (to view rad collectors and crystal) - - tweak: Adjusted Engine Camera Names for Station Consistency - - bugfix: Adjusted Monitor Names / Networks to view the Engine Cameras - coiax: - - rscadd: APCs now glow faintly with their charging lights. So red is not charging, - blue is charging, green is full. Emagged APCs are also blue. Broken APCs do - not emit light. - - rscadd: Alien glowing resin now glows. -2017-03-23: - Joan: - - tweak: Clock cults always have to summon Ratvar, but that always involves a proselytization - burst. - - rscdel: The proselytization burst will no longer convert heretics, leaving Ratvar - free to chase them down. - - spellcheck: Places that referred to the Ark of the Clockwork Justicar as the "Gateway - to the Celestial Derelict" have been corrected to always refer to the Ark. - Penguaro: - - bugfix: Wizard Ship - Bolts that floating light to the wall. - XDTM: - - rscadd: Medical Gauze now stacks up to 12 - - bugfix: Pressure plates are now craftable. - bgobandit: - - tweak: Alt-clicking a command headset toggles HIGH VOLUME mode. - coiax: - - bugfix: A dead AI no longer counts as an "unconverted AI" for clockcult. -2017-03-24: - BeeSting12: - - bugfix: Auxiliary base maintenance airlock now requires the proper access. Sorry - greyshirts, no loot for you! - Cyberboss: - - tweak: The recycler's base reclaim rate has been buffed from 1% to 50%. Manipulator - upgrades now give +12.5% per level instead of +25% - - bugfix: You can now successfully remove a pen from a PDA while it's in a container - Fox McCloud: - - rscadd: Modular receiver removed from the protolathe to autolathe - - tweak: Modular receiver cost is now 15,000 metal - Joan: - - bugfix: Fixes structures being unable to go through spatial gateways. - - tweak: Blazing Oil blobs take 33% less damage from water. - Penguaro: - - rscadd: '[Meta] Replaced Power Monitoring Console in Engineering with Modular - Engineering Console' - - rscadd: '[Pubby] Replaced Power Monitoring Console in Engineering with Modular - Engineering Console' - - rscadd: '[Omega] Replaced Power Monitoring Console in Engineering with Modular - Engineering Console' - - rscadd: '[Omega] Added RD and Command Modular Consoles to Bridge' - - rscadd: '[Delta] Replaced Power Monitoring Console in Engineering with Modular - Engineering Console' - - rscadd: '[Delta] Replaced duplicate Atmospherics Monitoring Console in Atmo with - Modular Engineering Console' - coiax: - - rscadd: Destroying a lich's body does not destroy the lich permanently, provided - the phylactery is intact. - - rscadd: A lich will respawn three minutes after its death, provided the phylactery - is intact. - - rscadd: The Soul Bind spell is forgotten after cast, respawn is now automatic. - - rscdel: Stationloving objects like the nuke disk are not valid objects for a phylactery. - - rscadd: Explosive implants can always be triggered via action button, even if - unconscious. - rock: - - tweak: lizards are hurt slightly more by cold but less by heat. this does not - mean they are more resistant to being lasered, fortunately. -2017-03-26: - BeeSting12: - - spellcheck: The bar shuttle's buckable bar stools are now buckleable bar stools. - Gun Hog and Shadowlight213: - - rscadd: The AI may now deploy to cyborgs prepared as AI shells. The module to - do this may be research in the exosuit fabricator. Simply slot the module into - a completed cyborg frame as with an MMI, or into a playerless (with no ckey) - cyborg. - - rscadd: AI shells and AIs controlling a shell can be determined through the Diagnostic - HUD. - - rscadd: AIs can deploy to a shell using the new action buttons or by simply clicking - on it. - - experiment: An AI shell will always have the laws of its controlling AI. - Penguaro: - - rscadd: Brig - Added Air Alarm - - rscdel: Engineering - Removed Brig Shutter - - tweak: Omega, Meta, & Delta Stations - The Vents and Scrubbers for the Supermatter - Air Alarm are now isolated from the rest of the Air Alarms in Engineering. - Qbopper: - - spellcheck: Drones are now given OOC guidelines to follow as well as their IC - lawset. - Robustin: - - rscadd: Added the prototype canister with expanded volume, valve pressure, and - access/timer features - TrustyGun: - - bugfix: Deconstructing display cases and coffins now drop the correct amount of - wood. - XDTM: - - tweak: Some golems now spawn with more thematic names. - - tweak: Adamantine Golems are no longer numbered, but receive a random golem name. - - bugfix: Airlocks properly remove the shock overlay when a temporary shock runs - out. - coiax: - - bugfix: Teams playing CTF have their own radio channels, rather than using the - Centcom and Syndicate channels. - - bugfix: Actually actually makes CTF barricades repair between rounds. - - bugfix: Blue CTF lasers have little blue effects when they hit things, rather - than red effects. -2017-03-28: - Supermichael777: - - rscadd: Backup operatives now get the nukes code. - XDTM: - - bugfix: Wooden tiles can now be quick-replaced with a screwdriver instead of a - crowbar, preserving the floor tile. - octareenroon91: - - bugfix: Bonfires that have a metal rod added should buckle instead of runtiming. -2017-03-29: - BeeSting12: - - rscadd: Adds emergency launch console to the backup emergency shuttle. - Joan: - - rscdel: Putting sec armour and a helmet on a corgi no longer makes the corgi immune - to item attacks. - - rscadd: All items with armour will now grant corgis actual armour. - Kevinz000: - - rscadd: High-powered floodlights may be constructed with 5 sheets of metal, a - wrench, a screwdriver, 5 cable coils, and a light tube. They require a powernet - connection via direct wire node. - coiax: - - bugfix: All tophats, rather than just the ones in maintenance, hurt a tiny bit - if you throw them at people. - - bugfix: Supermatter anomalies are more shortlived than regular anomalies, as intended. -2017-03-30: - coiax: - - rscadd: Autoimplanters have been renamed to autosurgeons. Currently only the CMO - and nuclear operatives have access to autosurgeons. What is the CMO hiding? - - bugfix: All upgraded organs for purchase by nuclear operatives now actually come - in an autosurgeon, for speed of surgery. -2017-03-31: - Cobby: - - tweak: Shot glasses are now more ambiguous [EASIER TO MAINTAIN] - Cyberboss: - - bugfix: Temperature changes will now properly cause atmospherics simulation to - activate - - bugfix: The command report for random xeno eggs will now be delivered along with - the rest of the roundstart reports - - bugfix: Drones can no longer be irradiated -2017-04-01: - Cyberboss: - - bugfix: The contents of the shelterpod smart fridge work again - XDTM: - - bugfix: Facehuggers no longer rip masks from people protected by helmets. -2017-04-02: - BeeSting12: - - bugfix: Metastation's northeast radiation collector is now connected to the grid. - Nanotrasen would like to apologize for any inconvenience caused to engineers, - but copper is expensive. - - rscadd: Boxstation's HoP office now has a PDA tech. - Cyberboss: - - tweak: Firedoors no longer operate automatically without power - - bugfix: Blood and other decals will no longer remain on turfs they shouldn't - - bugfix: The splashscreen is working again - - bugfix: False alarms are now guaranteed to actually announce something - Incoming5643: - - rscadd: Lighting visuals have been changed slightly to reduce it's cost to the - client. If you had trouble running the new lighting, it might run a little better - now. - MMMiracles (CereStation): - - rscadd: Added a patrol path for bots, includes 2 round-start securitrons placed - on opposite sites of station. - - wip: Due to map size, mulebots are still somewhat unreliable on longer distances. - Disposals are still advised, but mule bots are now technically an option for - delivery. - - rscadd: Added multiple status displays, extinguishers, and appropriate newscasters - to hallways. - - rscadd: A drone dispenser is now located underneath Engineering in maintenance. - - rscadd: Each security checkpoint now has a disposal chute that directs to a waiting - cell in the Brig for rapid processing of criminals. Why run half-way across - the station with some petty thief when you can just shove him in the criminal - chute and have the warden deal with him? - - tweak: Security's mail chute no longer leads into the armory. This was probably - not the best idea in hindsight. - - tweak: Virology has a bathroom now. - - tweak: Genetics monkey pen is a bit more green now. - - bugfix: Lawyer now has access the brig cells so he can complain more effectively. - - bugfix: Xenobio kill chamber is now in range of a camera. - - bugfix: Removed rogue bits of Vault area. - - bugfix: Medbay escape pod no longer juts out far enough to block the disposal's - path. - - bugfix: Captain's spare ID is now real and not just a gold ID card. - Penguaro: - - tweak: '[Meta] The Chapel Security Hatches were very intimidating. They have been - changed to more inviting glass doors.' - - bugfix: '[Meta] The maintenance tunnels in the Xeno Lab now have radiation shielding. - The Slime Euthanization Chamber will not have radiation shielding at this time - as dead slimes will not mind radiation.' - coiax: - - rscadd: Adds seperate languages to the game. Now Ratvarian, Drone, Machine, Swarmer, - Human (now called Galactic Common), Slime and Monkey are separate languages. - Each languages has its own comma prefix, for example, Galcom has the ,0 prefix, - while Ratvarian has the ,r prefix. If you don't understand a language when it - is spoken to you, you will hear a scrambled version that will vary depending - on the language that you're not understanding. - - experiment: This does not change who can understand what. - - rscdel: Removed the talk wheel feature. - - rscadd: Clicking the speech bubble icon now opens the Language Menu, allowing - you to review which languages you speak, their keys, and letting you set which - language you speak by default. Admins have additional abilities to add and remove - languages from mobs using this menu. - ktccd: - - bugfix: Ninja suits have received a new software update, making them able to **actually - steal tech levels** from R&D consoles and servers, thus avoid being forced to - honourably kill themselves for failing their objective. -2017-04-05: - Cyberboss: - - bugfix: Cardboard boxes and bodybags can no longer be anchored - Penguaro: - - rscadd: '[Box] A fire alarm has been added to the Lawyer''s office.' - - rscadd: '[Box] Adds access for Scientists to Starboard Maintenance Areas outside - of Toxins.' - - tweak: '[Box] Adjusted Science doors to more logical access codes.' - QV: - - bugfix: Fixed taking max suffocation damage whenever oxygen was slightly low - RemieRichards: - - bugfix: Using TK on the supermatter will burn your head off violently, don't do - this. - - rscadd: 'Examining clothing with pockets will now give information about the pockets: - number of slots, how it is interacted with (backpack, etc.), if it has quickdraw - (Alt-Click) support and whether or not it is silent to interact with.' - coiax: - - bugfix: Emergency shuttles will now forget early launch authorizations if they - cannot launch due to a hostile environment. -2017-04-07: - Qbopper: - - bugfix: Secure lockers will no longer have multiple lines about being broken. -2017-04-09: - 4dplanner: - - bugfix: Gas analyzers can now detect more gases in pipes - Joan: - - bugfix: Fixed a bug where getting caught between two shield generators as they - activated wouldn't cause you to gib and die. - QV: - - tweak: Refactored the way limbs that aren't limbs work - octareenroon91: - - bugfix: Hackable wires should work as intended again. -2017-04-11: - BeeSting12: - - spellcheck: '"the herpes of arts and crafts" is now "The herpes of arts and crafts."' - Cyberboss: - - bugfix: Runes no longer make you/themselves/random atoms yuge - JJRcop: - - tweak: Refactors whisper, now all living mobs can use it - - rscadd: 'Prefix any message with # to whisper, for example, "# Man, that guy is - weird.", you can still use the whisper verb if you whish.' - - rscadd: This is compatible with languages, for example "#,r That HoS is a problem, - we should kill him" - - rscdel: 'Removes #a #b #c etc radio codes, as well as :w and .w, which used to - be whisper.' - MrStonedOne: - - tweak: Nightvision was heavily modified. - - rscadd: Nightvision has been given 3 levels of nightvisionness. (some, most, and - full) - - tweak: ghosts, aliens, guardians, night vision eyes, and statues were given all - 3 levels in a cycling toggle - - tweak: thermals, and hud+NV goggles give "some" nightvisionness - - tweak: standalone masons are unchanged. - - tweak: Nightvision goggles (that aren't also sec huds or medhuds or the like) - give "most" nightvisionness. Nightvision masons also give "most" nightvisionness - - tweak: Most simple mobs with the ability to see in the dark were given "most" - nightvisionness, others got full nightvisionness. - - bugfix: Fixed certain ghost only things disappearing when disabling darkness. - - bugfix: Fixed ash storms not being visible when using things that modified your - ability to see darkness - - bugfix: fix a bug with the new github web processor - Shadowlight213: - - bugfix: The anime admin button will no longer cause equipped items to drop. - coiax: - - rscadd: Examining a ghost determines whether it is visible. -2017-04-13: - Cyberboss: - - bugfix: Fixed the incorrectly named Brig APC on Box Station= - - spellcheck: Fixed simple animal attack grammar - - bugfix: Roundstart department head announcements have been fixed - - bugfix: Brig cell doors now properly require the correct access - - bugfix: Fixed a bug preventing chameleon stamps from being picked up - - bugfix: Fixed a bug where honey frames couldn't be picked up - - bugfix: Photocopied papers will now retain their stamps - Davidj361: - - bugfix: Made it so chemsprayers, peppersprays, extinguishers don't spray when - you click your inventory items - - bugfix: Spray guns now actually have their range change when changing modes between - spray and stream - - bugfix: Krav maga now gets its abilities toggled if you click the same ability - twice - - bugfix: Added a link to the bottom right of paper when writing that shows help - for paper writing - - bugfix: Fixed the shift+middle-click pointing shortcut to work for cyborgs as - the functionality wasn't even there - - bugfix: Bodies in body bags get cremated properly now - RemieRichards: - - bugfix: Constructing lattice no longer prevents space transitions. - Robustin: - - rscadd: Ranged RCD added to the game - - rscadd: Rapid Lighting Device (also ranged) has been added. It can create wall, - floor, and temporary lights of any color you desire. - coiax: - - bugfix: Cigarette branding has been fixed. - - rscadd: Uplift Smooth brand cigarettes now taste minty as advertised. - - rscdel: You can no longer inject cigarette packets to inject all cigarettes simultaneously. - powergaming research director: - - bugfix: woops i dropped the emp protection module when i made your cns rebooters - today, guess they're vulnerable again! -2017-04-15: - Cyberboss: - - bugfix: Holopads can no longer be interacted with while unpowered - Davidj361: - - bugfix: Monkeys won't pickup items or rob you while they are in your stomach, - neither walk out of your stomach. - - bugfix: You can't cheat with eyewear/eye-implants when using advanced cameras - - bugfix: Mutant digitigrade legs re-added to the ashwalker species - Robustin: - - rscadd: The Prototype Emitter, will function like an ordinary emitter while also - charging a secondary power supply that will allow a buckled user to manually - fire the emitter. Returning to automatic fire will have the emitter continue - to fire at the last target struck by manual fire. - - rscadd: The Engineering Dance Machine, along with assorted effects/sounds. - coiax: - - bugfix: Plasmamen no longer burn to death while inside a cloning pod. -2017-04-18: - BeeSting12: - - bugfix: Cerestation's shuttle now has a recharger. - - rscdel: Centcomm's thunderdome airlocks have been removed due to contestants breaking - out. - - bugfix: Deltastation's chemistry lab now has a pill bottle closet. - - bugfix: The shield wall generators in xenobiology on Deltastation, Boxstation, - Metastation, and Pubbystation can now be locked and unlocked by scientists. - Davidj361: - - bugfix: Spawned humans no longer spawn eyeless (sprite) - MMMiracles (Cerestation): - - rscadd: Departments have been given head offices for a more secure place to chill - in their departments. - - rscadd: There is now a theatre on the service asteroid. - - tweak: Maintenance visuals and loot have been overhauled to be more visually interesting - and have more scattered bits of loot. - - bugfix: Various fixes with missing APCs, camera coverage, and misc things. - QualityVan: - - rscadd: Some foam guns can now be suppressed - coiax: - - rscadd: Drone, monkey and swarmer language now have distinctive colours when spoken. - - rscadd: Since drones are allowed to interact with pAIs, pAIs in mobile chassis - form are no longer distorted to drone viewpoints. - - bugfix: The shuttle's arrival can no longer be delayed after Nar-Sie's arrival. - The End cannot be delayed. -2017-04-19: - QualityVan: - - bugfix: Improved stethoscopes - Thunder12345: - - bugfix: You can no longer extract negative sheets from the ORM - XDTM: - - bugfix: APCs hacked by a malfunctioning AI are no longer immune to alien attacks. - - bugfix: Fixed bug where flashlight eyes weren't emitting light. -2017-04-20: - Cyberboss: - - bugfix: Fixed mining closets having extra, unrelated items -2017-04-22: - Cyberboss: - - bugfix: Conveyors no longer move things they aren't supposed to - XDTM: - - bugfix: Gold and Light Pink slime extracts no longer disappear before working. - coiax: - - bugfix: Fixed people understanding languages over the radio when they shouldn't. -2017-04-23: - coiax: - - rscadd: Centcom would like to inform all employees that they have ears. - - rscadd: Adds "ear" organs to all carbons. These organs store ear damage and deafness. - A carbon without any ears is deaf. Genetic deafness functions as before. -2017-04-25: - BeeSting12: - - bugfix: Deltastation's secure tech storage is no longer all access. - CoreOverload: - - bugfix: Disposals no longer get broken by shuttles rotation. - - bugfix: Wires no longer get broken by shuttles movement and rotation. - - bugfix: Atmospheric equipment no longer gets broken by shuttles movement and rotation. - Glory to the Flying Fortress of Atmosia! - Jalleo: - - rscdel: WW_maze from lavaland has been removed it wasnt that good really anyhow - QualityVan: - - bugfix: Changeling brains are now more fully vestigial - WJohnston: - - tweak: Skeletons and plasmamen's hitboxes now more closely match that of humans. - They are no longer full of holes and incredibly frustrating to hit, should they - run around naked. - XDTM: - - bugfix: Items will no longer be used on backpacks if they fail to insert when - they're too full. - - bugfix: T-Ray scans are no longer visible to bystanders. - - bugfix: T-Ray scans no longer allow viewers to interact with underfloor objects. - basilman: - - bugfix: fixed species with no skin dropping skin when gibbed. - coiax: - - rscadd: Examining a window now gives hints to the appropriate tool for the next - stage of construction/deconstruction. - - rscadd: You can examine a firedoor for hints on how to construct/deconstruct it. - - rscadd: Add an additional hint during construction where you can add plasteel - to make the firedoor reinforced. - - bugfix: Fixed easter eggs spawning during non-Easter. - - bugfix: Fixes stations not having holiday specific prefixes during the holidays. - - bugfix: Ghosts no longer drift in space. - - bugfix: Swarmers now only speak their own language, rather than swarmer and common. - - bugfix: When you are crushed by a door, it prints a visible message, instead of, - in some cases, silently damaging you. - - bugfix: The vent in the Escape Coridoor on Omega Station has been fixed. - - bugfix: You no longer die when turning into a monkey. - coiax, WJohnston: - - rscadd: Plasmamen lungs, also known as "plasma filters" now look different from - human lungs. - - rscadd: Plasmamen now have their own special type of bone tongue. They still sound - the same, it's just purple. Like them. -2017-04-26: - CoreOverload: - - rscadd: Gas injectors are now buildable! - Joan: - - tweak: Ash Drake swoops no longer teleport the Ash Drake to your position. - - balance: Some other tweaks to Ash Drake attacks and patterns; discover these yourself! - coiax: - - balance: The wizard spell Rod Form now costs 3 points, up from 2. - flashdim: - - bugfix: Omega Station had two APCs not wired properly. (#26526) -2017-04-27: - Gun Hog: - - rscadd: The GPS interface has been converted to tgui. - - experiment: GPS now update automatically or manually, give distance and direction - to a signal, and many other improvements! - MrStonedOne: - - tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes - and provide better logging for things that cause lag when hard-deleted. - - tweak: Server hop verb moved to the OOC tab - - rscadd: Server hop verb can now be used in the lobby as well as while a ghost. - QualityVan: - - bugfix: You can hit emagged cloning pods with a medical ID to empty them - - rscadd: Crayons can be ground - - rscadd: Crayon powder can be used to color stuff - Shadowlight213: - - tweak: Heads of staff may now download the ID card modification program from NTNet. - bgobandit: - - tweak: When jumpsuits take severe damage, their suit sensors break. They can be - fixed by applying a cable coil. - coiax: - - rscadd: Anomalous crystals can be examined by ghosts to determine their function - and activation method. - - rscdel: Lightbringers can understand Slime and Galactic Common, and can only speak - Slime, as before. - - rscadd: The helper anomalous crystal is in the orbit list after it has been activated. -2017-04-28: - Kor: - - rscadd: Librarians can speak any language - coiax, WJohnston: - - rscdel: Languages no longer colour their text. - - rscadd: Languages now have icons to identify them. Galatic Common does not have - an icon if understood. -2017-04-29: - BeeSting12: - - bugfix: The emergency backup shuttle has lighting now. - - bugfix: Plating in deltastation's aux tool storage is no longer checkered. - Cobby: - - rscadd: Syndicate Lavabase now has more explicit instructions when it comes to - outing non-syndicate affiliated enemies of Nanotrasen. - - tweak: The GPS set tag has gone from a limit of 5 characters to 20. - - rscadd: The GPS can now be personalized in both name and description using a pen. - Joan: - - rscdel: Removed Mending Motor. - - rscadd: Added Mending Mantra, which is a script that causes you to repair nearby - constructs and structures as long as you continue chanting it. - - tweak: Mending Mantra will also heal Servants as long as they're wearing clockwork - armor. - Kor: - - rscdel: Removed double agents mode. - - rscadd: Replaced it with Internal Affairs mode. - Swindly: - - rscadd: Added organ storage bags for medical cyborgs. They can hold an organic - body part. Use the bag on a carbon during organ manipulation or prosthetic replacement - to add the held body part. - coiax: - - rscdel: Swarmer traps are no longer summoned by The Traps. - - balance: Wizard traps automatically disappear five minutes after being summoned. - - balance: Wizard traps disappear after firing, whether triggered via person or - something being thrown across it. - - balance: Wizards are immune to their own traps. - - tweak: The Traps are now marked as a Defensive spell, rather than an Offensive - spell. - kevinz000: - - experiment: Songs can now be added to disco machines with add_track(file, name, - length, beat). Only file is required, the other 3 should still be put in, though. - tacolizard forever: - - bugfix: Rechargers no longer flash the 'fully charged' animation before charging - something -2017-04-30: - QualityVan: - - bugfix: Changelings can once again revive with their brain missing - XDTM: - - rscdel: Voice of God's Rest command now no longer makes listeners rest. It instead - activates the sleep command. - coiax: - - rscadd: The Bank Machine in the vault now uses the radio to announce unauthorized - withdrawals, rather than an endless stream of loud announcements. -2017-05-01: - 4dplanner: - - tweak: Syndicate surplus crates now contain fewer implants - Bawhoppen: - - rscadd: Deep storage space ruin has been readded. - - rscadd: Space Cola machines now stock bottles of water. - Cobby: - - balance: The Gang pen is now stealthy. Stab away! - Cyberboss: - - rscadd: You can now make holocalls! Simply stand on a pad, bring up the menu, - and select the holopad you wish to call. Remain still until someone answers. - When they do, you'll be able to act just like an AI hologram until the call - ends - Joan: - - rscadd: Belligerent now prevents you from running for 7 seconds after every chant. - - rscdel: However, you no longer remain walking after Belligerent's effect fades. - - rscadd: Clockcult component generation will automatically focus on components - needed to activate the Ark if it exists. - - rscadd: Gaining Vanguard, such as from the Linked Vanguard scripture, will remove - existing stuns. - - rscadd: Proselytizers can now charge from Sigils of Transmission at a rate of - 1000W per second. - - rscadd: Sigils of Transmission can be charged with brass at a rate of 250W per - sheet. - Moonlighting Mac says: - - bugfix: Due to a clerical error in the chef's cookbooks now being resolved, you - can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients - from Lavaland. - - experiment: After being found again you will now be able to enjoy its special - blend of flavors with your tastebuds. Mmm. - QualityVan: - - tweak: Saline glucose now acts as temporary blood instead of increasing blood - regeneration - Swindly: - - tweak: Mercury and Lithium make people move when not in space instead of when - in space. - ninjanomnom: - - tweak: TEG displays power in kw or MW now - - tweak: TEG power bar only maxes over 1MW now - - experiment: Moves TEG to SSair - - experiment: Moves SM to SSair -2017-05-02: - 4dplanner: - - bugfix: Squishy plants will now affect walls and other turfs they get squished - on - Kor, Goof and Plizzard: - - rscadd: Adds persistent trophy cases. They are not on any map yet. - Shadowlight213: - - bugfix: The biogenerator will now show its recipes again. - XDTM: - - tweak: Blood Cult's talisman of Horrors now works at range. It will still give - no warning to the victim. - - rscadd: Golems can now click on empty golem shells to transfer into them. - - tweak: Plasma Golems now no longer explode on death. They instead explode if they're - on fire and are hot enough. The explosion size has been increased. - - tweak: Plasma Golems are now always flammable. - coiax: - - rscadd: When talking on the alien hivemind, a person will be identified by their - real name, rather than who they are disguised as. -2017-05-03: - BeeSting12: - - bugfix: Omega shuttle now has lighting. - Joan: - - balance: Clockwork component generation is twice as fast. - - balance: Scriptures cost up to twice as much; Driver scriptures are unaffected, - meaning they cost 50% less, Script scriptures cost 25% less, Application scriptures - cost about 12.5% less, and Revenant scriptures cost about 5% less. - Jordie0608: - - rscadd: Investigate logs are now persistent. - - tweak: Game logs are now stored per-round; use .getserverlog to access previous - rounds. - - rscdel: .giveruntimelog and .getruntimelog removed. - Kor, Profakos, Iamgoofball: - - rscadd: The Librarian has been replaced by the Curator. - - rscadd: Persistent trophy cases have been added to the library on Meta, Delta, - and Box. These are only usable by the Curator. - - rscadd: The Curator now starts with his whip. - - rscadd: The Curator now has access to his treasure hunter outfit, stashed in his - private office. - coiax: - - balance: Plasma vessels, the organs inside aliens that are responsible for their - internal plasma storage, will regenerate small amounts of plasma even if the - owner is not on resin weeds. - - rscadd: Restrictions on Lizardpeople using their native language on the station - have been lifted by Centcom, in order to maximise worker productivity. The language's - key is ",o". - deathride58: - - tweak: Fixed the slimecore HUD's neck slot sprite. -2017-05-04: - 4dplanner: - - bugfix: revenants now properly resurrect from ectoplasm, as opposed to ectoplasm - merely spawning a new grief ghost - - bugfix: Turrets can no longer see invisible things, such as unrevealed revenants - Joan: - - rscadd: Mania Motors now do minor toxin damage over time and will convert those - affected if the toxin damage is high enough. - - balance: The effects of a Mania Motor continue to apply to targets after they - leave its range, though they will fall off extremely quickly. - - rscdel: Mania Motors no longer cause brain damage. - - imageadd: Ratvarian Spears have new inhand icons. - Lzimann: - - rscdel: Gang game mode was removed - Moonlighting Mac says: - - rscadd: Courtesy of the art & crafts division, imitation basalt tiles themed on - the rough volcanic terrain of lavaland are now available to be made out of sandstone. - - experiment: The manufacturer even managed to replicate the way that it lights - up with volcanic energy, it is the perfect accompaniment to other fake (or real) - lava-land tiles or a independent piece. - QualityVan: - - rscadd: Point flashlights at mouths to see what's inside them -2017-05-05: - Incoming: - - tweak: Display cases now require a key to open, which the curator spawns with - Joan: - - balance: Sigil of Accession, Fellowship Armory, Memory Allocation, Anima Fragment, - and Sigil of Transmission are not affected by the previously-mentioned % reduction - to Application scripture costs. - LanCartwright: - - rscadd: Lesser smoke book to Delta and Metastation - - rscdel: Normal smoke book from Delta and Metastation - - tweak: Civilian smoke book now has a 360 max cooldown (from 120) and halved smoke - output. - QualityVan: - - bugfix: Dental implants stay with the head they're in - bgobandit: - - tweak: The Syndicate has added basic functionality to their state-of-the-art equipment. - Nuke ops can now donate all TCs at once. - lordpidey: - - rscadd: There is a new traitor poison, spewium. It will cause uncontrollable - vomiting, which gets worse the longer it's in your system. An overdose can - cause vomiting of organs. - - tweak: Committing suicide with a gas pump can now shoot out random organs. - - bugfix: Toxic vomit now shows up as intended. -2017-05-06: - 4dplanner: - - rscadd: Internal Affairs Agents now obtain the kill objectives of their targets - when they die. - - rscadd: Internal Affairs Agents now have an integrated nanotrasen pinpointer that - tracks their target at distances further than ten squares. - - rscadd: Internal Affairs Agents will now lose any restrictions on collateral damage - and gain a "Die a glorious death" objective upon becoming the last man standing, - and revert if any of their targets are cloned. - BeeSting12: - - bugfix: Pubbystation no longer has two airlocks stacked on top of each other leading - into xenobiology's kill room. - - rscadd: Deltastation's chemistry now has a screwdriver. - - bugfix: Deltastation's morgue no longer has a blue tile. - - bugfix: Deltastation's chemistry smart fridge is no longer blocked by a disposal - unit. - Cyberboss: - - tweak: Teslas now give off light - Joan: - - balance: Sigils of Transgression are slightly more visible and glow very faintly. - LanCartwright: - - rscadd: Reduction to nutrition when consuming Miner's salve. - - rscdel: Stun/weaken that bypasses bugged chemical protection when consuming Miner's - salve. - Lzimann: - - rscdel: Telescience is no more. - PKPenguin321: - - rscadd: Undid the gang gamemode removal. - QualityVan: - - rscadd: Cargo can order restocking units for NanoMed vending machines - - rscadd: NanoMed vending machines can be build and unbuilt - Robustin: - - rscadd: Blood Cultists can now attempt to claim the position of Cult Master with - the approval of a majority of their brethren. - - rscadd: 'The Cult Master has access to unique blood magic that will aid them in - leading the cult to victory:' - - rscadd: The Cult Master can mark targets, allowing the entire cult to track them - down. - - rscadd: The Cult Master has single-use, noisy, and overt channeled spell that - will summon the entire cult to their location. - - rscadd: All cultists gain a HUD alert that will assist them in completing their - objectives. - - rscadd: Constructs created by soul shards will now be able to track their master. - - rscadd: Cultists created outside of cult mode will now get a working sacrifice - and summon objective and the summon rune will no longer fail outside of cult - mode. - - tweak: Gang Dominator max time is now 8 minutes down from 15m - - tweak: Gang Tagging now reduces the timer by 9 seconds per territory, down from - 12 seconds. - coiax: - - rscadd: Adamantine golems have special vocal cords that allow them to send one-way - messages to all golems, due to fragments of resonating adamantine in their heads. - Both of these are organs, and can be removed and put in other species. - - rscadd: You can use adamantine vocal cords by prefixing your message with ":x". - - rscdel: Xenobiology is no longer capable of making golem runes with plasma. Instead, - inject plasma into the adamantine slime core to get bars of adamantine which - you can then craft into an incomplete golem shell. Add 10 sheets of suitable - material to finish the shell. - - experiment: The metal adamantine is also quite valuable when sold via cargo. - - bugfix: If you know more than the usual number of languages, you'll now remember - them after you get cloned. - - rscdel: Humans turning into monkeys will not suddenly be able to speak the monkey - language, and will continue to understand and speak human. - - rscadd: Ghosts can now modify their own understood languages with the language - menu. - - rscadd: Any mob can also open their language menu with the IC->Open Language Menu - verb. - - rscadd: Silicons can now understand Draconic as part of their internal databases. - - bugfix: Golems no longer have underwear, undershorts or socks. - - tweak: The lavaland Seed Vault ruin can spawn only once. - - rscadd: It is now possible to make plastic golems, who are made of a material - flexible enough to crawl through vents (while not carrying equipment). They - also can pass through plastic flaps. - - bugfix: Fixed adamantine vocal cord (F) links not working for observers. -2017-05-07: - Anonmare: - - tweak: Removes organic check from mediborg storage container - Joan: - - rscadd: Cultists of Nar-sie have their own language. The language's key is ",n". - - balance: Sigils of Transgression are slightly brighter. - Moonlighting Mac: - - experiment: Due to budget cuts and oil synthesis replacing expensive processes - of digging up haunted primeval ashwalker burial grounds, Nanotransen has taught - chemists how to make plastic from chemicals in the hopes that new plastic products - can reduce expenditure on metal and glass. - - rscadd: you can now make plastic sheets from chemistry out of heated up crude - oil, ash & sodium chloride - MrStonedOne: - - bugfix: fixed bug that caused an infinite connection loop when connecting on a - new computer or computer with recently changed hardware. - - rscadd: Moved to a new system to make top menu items easier to edit. - - tweak: Moved icon size stuff to a sub menu - - rscadd: Added option to change icon scaling mode. - - bugfix: Byond added fancy shader supported scaling(Point Sampling), this sucks - because it's blurry, the default for /tg/station has changed back to the old - nearest neighbor scaling. - Penguaro: - - bugfix: Adjusted the Examine description of the right-most tiles of the Space - Station 13 sign to be consistent with the rest of the tiles. - - bugfix: Anywhere there was lava below a tile on the station is now space. - Robustin: - - tweak: c4 planting is now 40% faster - coiax: - - bugfix: Smartfridges no longer magically gain medicines if deconstructed and rebuilt. - - rscadd: Ash walkers now know and speak Draconic by default, but still know Galactic - Common. Remember, Galcom's language key is ",0" and you can review your known - languages with the Language Menu. - octareenroon91: - - rscadd: Showers and sinks added to gulag and mining station for hygiene and fire - safety. - - rscadd: Watertanks added to mining station for convenient fire extinguisher refill. -2017-05-08: - Dorsisdwarf: - - bugfix: Fixed being unable to hit museum cases in melee - Joan: - - tweak: The verb to Assert Leadership over the cult has been replaced with an action - button that does the same thing, but is much more visible. - Moonlighting Mac says: - - tweak: After a recent trade fair, employees have took it upon themselves to learn - how to craft leather objects out of finished leather sheets, for novices they - are pretty good at it! Try it yourself! - - rscadd: Muzzles to silence people are now craftable out of leather sheets. - - rscdel: You can no longer print off designs from a bio-generator that can now - be crafted out of leather sheets. - - tweak: Complete sheets of leather can be printed from the bio-generator for 150 - biomass to accommodate for a loss of designs. - - experiment: Specialist objects from the leather & cloth category bio-generator - category were not removed as to encourage interdepartmental interaction & balance. - Penguaro: - - rscadd: The Slime Scanner is available from the Autolathe. - - tweak: The Design Names in the various machines are now capitalized consistently - coiax: - - bugfix: Fixes various mobs speaking languages that they were only supposed to - understand. - - bugfix: Fixes being able to bypass language restrictions by selecting languages - you can't speak as your default language. - ninjanomnom: - - tweak: Highlander no longer breaks your speakers -2017-05-09: - Expletive: - - rscadd: Curator's fedora has a pocket, like all the other fedoras. - - tweak: Treasure hunter suits can now hold large internal tanks, to ease the exploration - of lavaland. - - tweak: The curator can now access the Auxillary Base and open doors on the mining - station. - MrStonedOne: - - tweak: Lighting now defaults to fully bright until the first update tick for that - tile. This makes shuttle movements less immersion breaking. - - experiment: Rather than remove the light source from the system and then re-adding - it on light movements, the system now calculates and applies the difference - to each tile. This should speed up lighting updates. - Penguaro: - - tweak: Adjusts Meteor Shuttle Name - - bugfix: The Central Command Ferry will now dock at one of the ports in Arrivals - - tweak: '[Meta] The Slime Control Console boundaries have been adjusted around - the Kill Room' - XDTM: - - rscadd: Added bluespace launchpads. They can be built with R&D, and can teleport - objects and mobs up to 5 tiles away (8 at max upgrades), from the pad to the - target and viceversa. - - rscadd: To set up a launchpad, a launchpad and a launchpad console must be built. - The pad must be opened with a screwdriver, then linked to the console using - a multitool. A console can support up to 4 pads. - - rscadd: Launchpads require some time to charge up teleports, but don't require - cooldowns unlike quantum pads. Upgrading launchpads increases the range by 1 - per manipulator tier. - - rscadd: A special variant, the Briefcase Launchpad, has also been added to the - traitor uplink for 6 TC. - - rscadd: Briefcase Launchpads look like briefcases until setup (which requires - a few seconds). When setup, the launchpad will be functional, but can still - be dragged on the ground. To pick a pad back up, click and drag it to your character's - sprite. - - rscadd: Unlike stationary launchpads, briefcase pads only have 3 tiles of maximum - range. - - rscadd: Briefcase pads are controlled by a remote (that is sent with the briefcase) - instead of a console. The remote must be linked to the briefcase by simply hitting - it. Each remote can only be linked to one pad, unlike consoles. - coiax: - - rscadd: Visible ghosts emit light. -2017-05-11: - Joan: - - rscadd: You can now buy double eswords from the uplink for 16 telecrystals. They - cannot be bought below 25 players. - - rscdel: You can no longer use two eswords to construct a double esword. - Joan, Robustin: - - rscdel: Harvesters can no longer break walls, construct walls, convert floors, - or emit paralyzing smoke. - - rscadd: Harvesters now remove the limbs of humans when attacking, can heal OTHER - constructs, have thermal vision, and can move through cult walls. - - rscadd: Harvesters can now convert turfs in a small area around them and can create - a wall of force. - - tweak: Harvesters are now cultists. - - rscadd: When Nar-Sie is summoned, she will convert all living non-construct cultists - to harvesters, who will automatically track her. - Kor: - - rscadd: a new mysterious book has been discovered in lavaland chests! - - tweak: weird purple hearts found in lavaland chests have started beating again! - what could this mean? - MrStonedOne: - - bugfix: Fixes t-ray mode on engineering goggles not resetting the lighting override - properly. - QualityVan: - - tweak: Machine names will be capitalized when they talk on radio - Robustin: - - tweak: Dominators now require a significant amount of open (non-walled) space - around them in order to operate. - TehZombehz: - - rscadd: Sticks of butter and liquid mayonnaise can now be produced via a new 'mix' - function on the grinder. Please eat responsibly. - XDTM: - - bugfix: Plasma Golems now have the correct updated tip. - - tweak: Plasma Golems no longer take damage from fire, and take normal instead - of increased burn damage from other sources. They will still explode if on fire - and hot enough. - - rscadd: Plasma Golems can now self-ignite with an action button. - - tweak: Plasma Golems are now warned when they're close to exploding. - - tweak: Plasma Golems now have a constant chance of exploding after 850K instead - of a precise threshold at 900K, making it less predictable. - bandit: - - tweak: Nanotrasen has enhanced personality matchmaking for its personal AIs. pAI - candidates will now see who is requesting a pAI personality. - duncathan: - - tweak: opening a dangerous canister will only alert admins if it contains meaningful - amounts of a dangerous gas. No more being bwoinked because you opened an empty - canister that used to have plasma in it. - lordpidey: - - tweak: Modified chances for returning someone's soul using an employment contract. Now - everyone has a chance, not just lawyers and HoP. - - rscadd: Particularly brain damaged people can no longer sign infernal contracts - properly. - - tweak: Infernal contracts for power no longer give fireball, and instead give - robeless 'lightning bolt' spell. - - rscadd: Devils can now sell you a friend, for the cost of your soul. - - tweak: The codex gigas should now be easier to use, and less finicky. - - rscdel: The codex gigas no longer sintouches readers. - ma44: - - tweak: Doubles the amount of points wooden planks sell for (now 50 points) -2017-05-12: - Joan: - - tweak: Manifest Spirit will no longer continue to cost the user health if the - summoned ghost is put into critical or gibbed. - - rscadd: Ghosts summoned by Manifest Spirit are outfitted with ghostly armor and - a ghostly cult blade that does slightly less damage than a normal cult blade. - - balance: Manifest Spirit now consumes 1 health per second per summoned ghost, - from 0.333~. - - balance: Manifest Spirit can now only summon a maximum of 5 ghosts per rune, and - the summoned ghosts cannot use Manifest Spirit to summon more ghosts. - - rscadd: Wraiths now refund Phase Shift's cooldown by attacking; 1 second on normal - attacks, 5 seconds when putting a target into critical, and a full refund when - killing a target. - - balance: Increased Phase Shift's cooldown from 20 seconds to 25 seconds. - KorPhaeron: - - rscadd: Zombies can now see in the dark. If you steal their eyes you'll be able - to see in the dark as well! - MMMiracles (Cerestation): - - tweak: Hydroponics has been revamped, adding a few things missing before and adding - a bee room in place of the backroom. - - bugfix: Fixed some other stuff. - New Antag Alert sounds: - - soundadd: added sounds that alert players to their antag status - - soundadd: Blood cult has a new alert sound - - soundadd: Clock cult has a new alert sound - - soundadd: changeling has a new alert sound - - soundadd: Malf/traitor AI has a new alert sound - - soundadd: Nuke Ops has a new alert sound - - soundadd: Ragin' Mages has a new alert sound - - soundadd: Traitor has a new alert sound - Swindly: - - tweak: Solid plasma now begins burning at the temperature at which it was ignited. - - balance: Snow walls no longer block explosions, are deconstructed faster, and - no longer leave girders when deconstructed. - coiax: - - balance: Nanotrasen Cloning Divison's three hundred identical scientists have - announced an upgrade to the cloning computer's software. You can now scan brains - or dismembered heads and successfully clone from them. Brains seem to remember - the DNA of the last body they were attached to. -2017-05-13: - QualityVan: - - bugfix: Pizza boxes once again look different when open - 'Tacolizard Forever: It''s hip to fuck bees': - - rscadd: Added a honey jar item. It's not implemented yet. - - balance: Honey is now more robust at healing, but don't eat too much or you'll - turn into a fatty landwhale. - TehZombehz: - - rscadd: Butter noodles, butter biscuits, buttered toast, and pigs in a blanket - can now be crafted using sticks of butter and other ingredients. - coiax: - - rscadd: Servant golems now follow the "Material Golem (123)" naming scheme. - octareenroon91: - - rscadd: Hermit ruin now includes a portable seed extractor. -2017-05-14: - coiax: - - rscadd: Free Golems can purchase Royal Capes of the Liberator at their mining - equipment vendor. -2017-05-15: - Dorsidwarf: - - balance: Nanotrasen Robotics Supply Division has successfully petitioned to replace - the "My First Robot" motors in turret coverings with a standard commercial brand. - As such, they will now open faster. - Expletive: - - rscadd: You can now create water bottles and wet floor signs by using plastic - sheets. - - rscadd: You can create toy swords out of plastic sheets, a piece of cable, and - a light bulb. - Joan: - - tweak: Glowshrooms now have a less saturated glow. - - balance: The summoned ghosts from Manifest Spirit can no longer break airlocks - with their standard blade. - - balance: Manifest Spirit now does a small amount of damage when initially manifesting - a ghost. - McBawbaggings: - - tweak: SMES units will now accept charge from the power network even if the available - load is less than the input rate. Credit to Zaers for the original code. - - bugfix: Wizards are now at least 30 years old. Apprentices will be in-between - ages 17 to 29. - Penguaro: - - bugfix: The Gravity Generator description now mentions a graviton field as opposed - to a gravaton field. What is Gravaty anyway? - - bugfix: Centcom Engineering has reviewed the plans for the Box series station - and has addressed some concerns related to some APCs not affecting their designated - section. APCs for the Detective's Office, Cargobay, and Gateway, now control - those rooms. The Bridge Maintenance APC has been removed from future construction - as it serves no purpose and thus is an unnecessary construction cost. - - bugfix: The pipe from the station to the AI Satellite has been completed. - Profakos: - - rscadd: Centcom has decided to upgrade the Ore Redemption machines with a floppy - drive, intended for design disks. - Qbopper: - - tweak: The supermatter crystal now sends its warning messages to the engineering - channel. (if it's in critical condition the message will be sent to the common - radio channel as before) - Swindly: - - balance: Nitrous oxide now causes anemia. - coiax: - - bugfix: Curator soapstones now successfully leave messages for future shifts. - - rscdel: Soapstones can no longer be purchased in cargo. - - rscdel: The janitor no longer starts with an empty soapstone. - - experiment: Engraved messages can be left anywhere in the world, but be wary that - the terrain of places like lavaland and space can change shift to shift. - - rscadd: Goats on the station have developed a taste for glowshrooms, and will - eat them if they encounter any. - ma44: - - tweak: Seed vault remapped - - tweak: The seed vault random seed spawner can now spawn cherry bombs instead of - regular cherry seeds - - rscadd: BEES to plant vault - octareenroon91: - - rscadd: Ambrosia Deus can now mutate into Gaia, and Gaia into Deus. - - rscdel: A single branch of Ambrosia Gaia will not immediately make a hydroponics - tray self-sufficient. - - balance: A (total) dose of 20u Earthsblood (from Gaia) will make a hydroponics - tray self-sufficient. - uraniummeltdown: - - rscadd: Ambrosia Gaia is back -2017-05-16: - Moonlighting Mac says: - - rscadd: Starthistles now return seeds when they are harvested, amongst having - a overhaul of description, alteration of statistics & a mutational path into - harebells. These seeds have been supplied into the hydroponics seed vendor. - - imageadd: Starthistle tray sprites have been restructured & also fixed from a - issue of them being broken and not appearing in trays. In addition there are - new sprites for its seeds. - Penguaro: - - bugfix: There is now Space under the rocks at the Dragoon's Tomb - - bugfix: Centcom Intelligence reports that the Hidden Syndicate Research Base may - have received a shipment of viruses. - QualityVan: - - bugfix: Fixed fire alarms not being repairable if the board was broken - - bugfix: People without eyes and ears are no longer susceptible to flashbangs they - aren't directly on top of - Robustin: - - rscadd: Summoning Nar'Sie now triggers a different ending. No shuttle is coming! - Survivors must escape on a pod or survive the Red Harvest for 3 minutes. If - Nar'Sie acquires enough souls, the round ends immediately with a **special ending**. - - rscadd: New Harvester Sprite - - rscadd: Harvesters can now track a random survivor on the station, then switch - back to tracking Nar'Sie, via a new action button. - fludd12: - - rscadd: You can now add grills to a bonfire, letting you cook things on top of - them. -2017-05-17: - 4dplanner: - - bugfix: revenant respawning will not spam up deadchat so much, and is less likely - to break. - Expletive: - - rscadd: Syndicate Tomes have been added to traitor uplinks for 9 TC. They let - an agent or an operative provide both weal and woe. - Penguaro: - - bugfix: Centcom Engineering has reviewed the power schematic for the engine room - and added an Area Power Controller. - coiax: - - balance: Magic eightballs are now tiny items, able to fit into a box and pocket. -2017-05-18: - Joan: - - rscadd: Proselytizing alloy shards will now proselytize all the shards in the - tile, instead of requiring you to proselytize each one at a time. - Lordpidey: - - tweak: Space ninjas now use action buttons instead of verbs for a more consistent - user experience. - - rscadd: Toy toolboxes with realistic rumbling action have been added to arcade - prizes. - 'Tacolizard Forever: Plasmaman Powercreep': - - tweak: Plasmaman tanks are the same size as emergency oxygen tanks. - coiax: - - rscadd: Syndicate agents can purchase a "codespeak manual", that teaches them - a language that sounds like a series of codewords. You can also hit other people - with the manual to teach them. One use per manual. - - rscadd: Nuclear operatives have access to a deluxe manual that is more expensive - but has unlimited uses. - - rscadd: Syndicate AIs know Codespeak for free. - - bugfix: Spacevines can no longer spread on space transit turfs. - - balance: Plastic explosives can no longer be detonated by EMPs. - - rscadd: Various vending machines, when shooting their inventory at nearby people, - will "demonstrate their products features". This means that if a cigarette vending - machine throws a lighter at you, it will be on. Vending machines also choose - random products when throwing, rather than the first available one. - kevinz000: - - rscadd: Peacekeeper cyborgs now have projectile dampening fields. -2017-05-19: - 4dplanner: - - balance: the Hierophant club has gained in power -2017-05-20: - Joan: - - balance: Proto-kinetic crushers have been worked over by our highly qualified - techs, will recharge 12% faster, and no longer require very low-pressure atmospheres - to fire! - - balance: In addition, our techs have tweaked the quantum linker module and proto-kinetic - crushers can apply multiple marks to different targets! Marks applied may eventually - expire if not detonated. - Steelpoint: - - rscadd: All Pulse weapons now accurately show, by their sprites, what fire mode - they are in. - - rscadd: ERT, non-red alert, Security Response Officers spawn with a Tactical Energy - Gun. This is a military variant of the Egun that, in addition to laser and disable - rounds, has access to stun rounds. - - tweak: Pulse Pistols can now be recharged. - Swindly: - - rscadd: Added modified syringe guns. They fire DNA injectors. Geneticists and - CMOs can buy them from the traitor uplink for 14 TC. - coiax: - - rscadd: When a shuttle is called, sometimes an on-call admiral, using available - information to them, will recall the shuttle from Centcom. - octareenroon91: - - bugfix: Golems touching a shell can now choose to stay in their own body. -2017-05-21: - Gun Hog: - - bugfix: The Auxiliary Base can no longer land outside the lavaland map's boundaries. - RandomMarine: - - tweak: Drone laws no longer restrict drones to the station. - Steelpoint: - - rscadd: The Warden's Cycler Shotgun has been replaced with a Compact Combat Shotgun. - A unique weapon, it can fit in armour slots but at the sacrifice of a smaller - ammo capacity of four shells. -2017-05-22: - Joan: - - tweak: Resonator fields now visually show how long they have until they burst. - - bugfix: Hitting a legion skull with a resonator will now produce a field. - - balance: Swapped how far plasma cutter blasts go when going through rock and in - open air. This means blasts through air will go 4/5 tiles, but will mine 7/10 - tiles, for normal/advanced plasma cutters, respectively. - - tweak: There is now a buffer zone between the mining base and lavaland where megafauna - will not spawn. - - tweak: Ruins will no longer spawn directly in front of the mining base. - Lzimann: - - rscadd: Pandemic is now tgui! - Robustin: - - rscadd: Gang influence is now decentralized, each gangster has their own influence - that they can increase by spraying (and protecting) their tags and new influence-enhancing - bling. - - rscadd: Gang uniforms are now created based on your gang's color and can be purchased - by any gang member. They will increase the wearer's influence and provide protection, - but will make it fairly obvious which gang you belong to. - - rscadd: Gangs have access to a new surplus rifle; it is a semi-automatic rifle - that is very bulky and has a very low rate of fire. Gang members can buy this - gun for just 8 influence. - - rscadd: Gangs have access to the new machine gun turret; it unleashes a volley - of bullets with an extended view range. It does not run out of ammo, but a significant - delay between volleys and its stationary nature leaves the gunner vulnerable - to flanking and return fire. Holding down the trigger will allow you to aim - the gun while firing. It will cost gangs 50 influence. - - rscadd: The sawn-off improvised shotgun is now available to gangs for 6 influence. - With buckshot shells being easy to produce or purchase, this gun gives the most - "bang for your buck" but its single-shell capacity will leave you vulnerable - during a pitched gunfight. - - rscadd: The Wetwork boots give gangs access to a lightly armored noslip variant. - - tweak: The armored gang outfits are now slightly more resistant to ballistic and - bomb damage - Swindly: - - balance: Monkeys can be weakened by stamina loss - kevinz000: - - bugfix: Nanotrasen decided to remove the integrated jet engines from jetpacks. - They can no longer be used successfully indoors. -2017-05-23: - ClosingBracket: - - spellcheck: Fixed very minor inconsistencies on items & punctuation on items. - Joan: - - rscdel: Nanotrasen has taken a lower bid for their meson suppliers, and meson - scanners will no longer display terrain layouts while on the planet. - - tweak: However, they have discovered that, with some tweaks, mineral scanners - will no longer actually require you to be wearing mesons. - - tweak: The cheaper mesons will not completely remove reliance on light. - - tweak: Ripleys will collect all ore in front of them when they move with a clamp - and stored ore box. - - tweak: Chasms will glow dimly, like lava. - Joan, Repukan: - - rscadd: Traitor miners can now buy up to 2 KA Pressure Mods for 5 TC each. - - balance: KA Pressure Mods now only take up 35 mod capacity each, allowing traitor - miners to use 2 and have space for 1 other mod. - - rscdel: R&D can no longer build KA Pressure Mods. - Robustin: - - rscadd: Added a sexy new icon for the harvester's AOE conversion spell - - bugfix: Fixed construct's forcewall being invisible - - bugfix: Fixed cult constructs "Locate Master" and "Locate Prey" not functioning - - bugfix: Fixed spell action buttons not showing their actual availability status - - tweak: Changed the duration of a few frames for the new Cult ending - Steelpoint: - - rscadd: Auto Rifle alt ammo mags (AP, Incendiary, Uranium Tipped) now have a coloured - stripe to denote them. - That Really Good Soda Flavor: - - bugfix: Martial arts are no longer lost when mind-swapping, cloning, moving your - brain, et cetera. - - bugfix: Fixed a bug where paper bins could swallow up pens into the void. - coiax: - - rscadd: Galactic Common has been added to silicon's internal language database, - meaning even if a cyborg is created from someone who previously did not know - Galactic Common, they will be able to speak it as a silicon. - kevinz000: - - bugfix: Spessmen seems to have stopped suffering from the mental condition that - makes them believe they can't move fast if they have only one leg, even if they're - in space and using a jetpack! - ma44: - - rscadd: Reports of syndicate base on lavaland has been outfitted with a state - of the art donksoft toy weapon dispenser. -2017-05-24: - Joan, WJohnston: - - rscadd: Adds marker beacons to mining as a vendible item. They can be bought in - stacks of 1, 10, and 30 at a rate of 10 points per beacon. - - rscadd: Miners start with a stack of 10 in their backpack, and the Extraction - and Rescue Kit contains a stack of 30. - - rscadd: Marker beacons come in a large selection of colors and simply light up - a small area when placed, but are useful as a path marker or to indicate dangers. - QualityVan: - - rscadd: Hairless hides now become wet when exposed to water - - rscadd: You can microwave wet leather to dry it - - bugfix: Inserted legion cores no longer work if they went inert before implanting - Steelpoint: - - rscadd: Sketchin alternative magazines (Armour Piercing, Hollow Point, Incendiary) - now have unique sprites to better identify them. - - rscadd: ERT Sec Tactical Energy Guns now have a unique sprite. - - tweak: Changes to production of Nanotrasen Auto Rifle armour piercing bullets - have now made AP bullets better able to penetrate armour, but at the cost of - the amount of possible damage the bullet can do to soft targets. - - rscadd: Many Ballistic weapons now have new sounds related to reloading or placing - bullets into magazines. - - rscadd: Boxstation armoury weapon racks now have glass panes to help prevent the - weapons easily flying out of a breached hull. - - bugfix: Fixed Battleship Raven's bridge blast doors not working. - Tacolizard: - - tweak: Station based armour is slightly more descriptive of what it does. - That Really Good Soda Flavor: - - tweak: Changed spray tan overdoses to be more realistic. - - rscadd: People who are high and beach bums can now talk in their own stoner language. - - tweak: Beach bums can only communicate with other beach bums and people who are - high. -2017-05-25: - 4dplanner: - - bugfix: crushers now apply marks properly - - rscadd: 20% of internal affairs agents are actually traitors - 4dplanner, robustin: - - bugfix: c4 has always taken 3 seconds to plant, and you are not allow to believe - otherwise - Crexfu: - - spellcheck: typo fix for origin tech - Cyberboss: - - experiment: Explosions will no longer have a start up delay - - bugfix: Indestructible objects can no longer be destroyed by bombs - Oldman Robustin: - - tweak: Gang mode now calls a 4 minute unrecallable shuttle once 60% of the crew - is dead - ohnopigeons: - - balance: The cost of plasma has been reduced from 500 to 300, but retain their - immunity to saturation -2017-05-26: - Moonlighting Mac says: - - rscadd: You can now craft a strong cloak with a hood made out of goliath and monster - materials from within the primitive crafting screen. - - rscadd: The cloak has a suit slot for all kind of primitive supplies, however - it cannot carry most electronic miner equipment. - - balance: Due to the recipe requiring leather, it is not normally accessible to - all ghost roles without a source of water & electricity. - kevinz000: - - rscadd: You can now add bayonets to kinetic accelerators. However, only combat - knives and survival knives can be added. Harm intent attacking things will cause - you to attack that thing with the bayonet instead! -2017-05-28: - ClosingBracket: - - tweak: Allows explorer webbings to hold marker beacons. - Expletive: - - tweak: E-Cigarettes can now fit in your pocket. - Iamgoofball: - - bugfix: After the Syndicate realized their top chemist was both mixing a stamina - destroying drug with a stimulant to avoid slowdowns entirely in their sleepypens, - they fired him and replaced him with a new chemist. - Joan: - - rscadd: Miner borgs can now place marker beacons from a storage of 30. - - bugfix: Necropolis tendrils will once again emit light. - - rscadd: The kinetic crusher can now gain bonus effects via trophy items gained - by killing bosses with it. - - rscadd: Yes, you do have to kill the boss primarily doing damage via the kinetic - crusher, or you won't get the trophy item and the bonus effect it grants. - Kor: - - bugfix: The chaplains possessed blade, shades, and constructs, can once again - speak galactic common. - QualityVan: - - bugfix: Bayonets can now be used for butchery - - tweak: Cloning pods which are interrupted by a emagging will now produce a slightly - lumpier smoothie - - bugfix: Cloning pods that have stopped cloning early can no longer be broken open - to extract leftover parts - - bugfix: Crew monitoring consoles once again have minimaps while you're on the - station level - Steelpoint: - - rscadd: A New Iron Hawk troop transport ruin has been added to lavaland. Can the - sole surviving Marine somehow survive the horrors of lavaland? Lore fluff included. - - rscadd: Central Command has listened to complaints and, as such, has now stationed - "real" Private Security Officers at centcom docks. - - rscadd: A new Nanotrasen Security Officer NPC variant is available to admins, - this 'peaceful' version will only attack people who attack it first. Great for - keeping order. - Swindly: - - bugfix: fixed not being able to attach heads without brainmobs in them - cacogen: - - rscadd: You can now rename dog beds by buckling a new owner to them - - rscadd: Dogs that spawn in an area with a vacant bed will take possession of and - rename the bed - - rscadd: Adds AI follow links to holopad speech and PDA messages. Note that PDA - messages point to the owner of the PDA and not the PDA's actual location. - - bugfix: Fixes PDA icon not showing up beside received messages for AIs - kevinz000: - - rscadd: Nanotrasen's new titanium wall blueprints are smooth enough that it can - reflect projectiles! -2017-05-29: - Joan: - - spellcheck: Renames hivelord and legion cores to 'regenerative core'. Their descs - have also been updated to be more clear. - Nanotrasen Plasmaman Outreach Division: - - tweak: plasmaman tank volume has been increased from 3 to 6. - XDTM: - - balance: Abductors have learned how to properly delete the memories of their test - subjects. - bandit: - - tweak: The officer's sabre standard in Nanotrasen captain rollouts can be used - to remove the tails of lizard traitors, or lizards in general. - oranges: - - rscadd: AI's can now hang up all holocalls at a station with alt+click -2017-05-30: - Expletive: - - rscadd: Luxury versions of the bluespace shelter capsule are now available! Purchase - them at the mining equipment vendor. - - rscadd: 'Cardboard cutouts have a new option: Xenomorph Maid' - - rscadd: Black Carpet can now be crafted using a stack of carpet and a black crayon. - - rscadd: Black fancy tables can now be crafted using Black Carpet. - - rscadd: Shower curtains can now be recoloured with crayons, unscrewed from the - floor, disassembled with wire cutters, and reassembled using cloth, plastic, - and a metal rod. - kevinz000: - - rscadd: Research and Development have recieved designs for new prototype Beam - Marksman Rifles. These rifles require a short aiming cycle to fire, however, - have extreme velocity over other weapons. - - experiment: Aiming time is 2 seconds, hold down mouse to aim, aiming time increases - if you change your aim based on angle changed, or if you move while aiming. - The weapon can not be fired while unscoped. - - rscdel: However, someone tripped and pulled out the power cord while your servers - were being updated with the latest revision of accelerator laser cannons. All - data have been lost... -2017-06-02: - Cyberboss: - - experiment: New server backend! - - tweak: Test merged PRs now show the commit of the PR at which they were merged - Expletive: - - rscadd: Adds the NT75 Electromagnetic Power Inducer, a tool which can be used - to quickly recharge many devices! They can be found in Electrical Closets, the - CE's locker, ordered by cargo, or created in RnD. - Goodstuff: - - bugfix: Fixes the crafting recipe for black carpet - - bugfix: Removed a random white dot on the black carpet sprite - Joan: - - rscadd: Goliaths, Watchers, and Legions have a small chance of dropping a kinetic - crusher trophy item when killed with a kinetic crusher. Like the boss trophy - items, these give various effects. - - tweak: Kinetic crushers recharge very slightly slower. - - rscadd: Three unique Kinetic Accelerator modules will now appear in necropolis - chests. - MMMiracles (Cerestation): - - rscadd: CereStation's Security department has been overhauled entirely thanks - to the tireless efforts of Nanotrasen's construction division. - Nanotrasen Mining Alert: - - rscadd: Nanotrasen's mining operations have created far more corpses than an entire - galaxy of cooks could hope to deal with. To solve this, we decided to just dump - them all from orbit onto the barren lava planet. Unfortunately, the creatures - called "Legion" have infested a great number of them, and you can now commonly - find the bodies of former Nanotrasen employees left behind. Additionally, there - are reports of natives, other settlers, and even stranger things found among - the corpses. - QualityVan: - - tweak: The tactical rigging in op closets is more tacticool - Shadowlight213: - - balance: The reset wire on borgs must now be cut to reset a borg's module instead - of pulsed. - - tweak: Portable pump max pressure has been lowered. - Steelpoint: - - tweak: Iron Hawk Marine no longer has Centcom all access. My mistake. - - bugfix: Fixes Iron Hawk marine carbine not having a visible sprite. - Swindly: - - balance: Nitrous oxide no longer produces water as a by-product, requires 2 parts - ammonia instead of 3, and produces 5 parts when made instead of 2. - kevinz000: - - experiment: Gang turrets now follow the mouse of the person using them! Yay! - octareenroon91: - - bugfix: Attempts to add items to a storage container beyond its slots limit will - now obtain a failure message again. -2017-06-03: - Expletive: - - tweak: Chem Dispensers now store their power in their batteries. - - tweak: Instead of being based on battery and capacitor ratings, recharge delay - for portable chem dispensers is now based on their capacitor and matter bin - ratings. - - tweak: The Seed Vault's chemical dispenser now has all the chemicals a pod person - could want. - - rscadd: The crafting menu now has subcategories! - - rscadd: Food recipe categories have been combined as subcategories of the Foods - category. - - rscadd: Weaponry and Ammunition have been combined as subcategories of the Weaponry - category. - Improvedname: - - rscadd: Janitors now start with a flyswatter - Mothership Epsilon: - - tweak: All your base are belong to us. - Penguaro: - - bugfix: '[Box] Removes extra/unattached vent from Xeno Lab' - Planned Spaceparenthood: - - bugfix: We would like to apologize for mislabeled cloning pod buttons. - WJohnston: - - bugfix: Deltastation's south nuke op shuttle location should no longer be possible - to teleport into by moving off the map and back on, and moved the rest closer - to the station. - p440: - - bugfix: Fixed duping cable coils with magic APC terminals - - bugfix: Fixed invalid icon state for empty APCs -2017-06-04: - Expletive: - - rscadd: Many stacks now update their sprite based on their amount. - - rscadd: Stacks will now weigh less if they're less than full. - - imageadd: Added new icon states for glass, reinforced glass, metal, plasteel, - plastic, plasma, plastitanium, titanium, gold, silver, adamantine, brass, bruise - packs, ointment, gauze, cloth, leather, wet leather, hairless hide, human hide, - ash drake hide, goliath hide, bones, sandstone blocks, and snow blocks. - - tweak: Some lavaland stacks' max amounts have been reduced. - - bugfix: Bulldog Shotguns should update their sprite properly when you remove the - magazine. - - bugfix: Riot suits no longer hide jumpsuits. - Joan: - - balance: Rod Form now costs 2 points, from 3. - - balance: Rod Form now does 70 damage, from 160, but gains 20 damage, per upgrade, - when upgraded. This means you'll need to spend 6 points on it to instantly crit - people from full health. - Swindly: - - balance: Chemical grenades are no longer permanently disabled after being unlocked - by wirecutters after being primed. -2017-06-05: - Expletive: - - rscadd: The Ore Redemption Machine has been ported to TGUI. New features include - the addition of "Release All" and "Smelt All" buttons. - - rscadd: The Ore Redemption Machine now be loaded with sheets of material. - - rscadd: The Ore Redemption Machine can now 'smelt' Reinforced Glass. - Joan: - - balance: Only human and silicon servants can help recite multi-invoker scriptures. - This means cogscarabs, clockwork marauders, and anima fragments DO NOT COUNT - for scriptures that require multiple invokers. - - balance: Clockcult scripture tiers can no longer be lost by dipping below their - requirements once they are unlocked. - - rscdel: Removes Revenant scriptures entirely. - MMMiracles: - - tweak: Deepstorage ruin has been redone to be more self-sufficient and up to better - mapping standards. -2017-06-06: - Joan: - - rscadd: Added a new unique Kinetic Accelerator module to necropolis chests. - - spellcheck: Renames Clockwork Proselytizers to Replica Fabricators. - - balance: Replica Fabricators can directly consume floor tiles, rods, metal, and - plasteel for power instead of needing to convert to brass first. - - balance: Cogscarabs can no longer use guns. - - tweak: KA modkits in necropolis chests are now design discs with designs for those - modkits, to force miners to bring back minerals. - PKPenguin321: - - bugfix: The fake pits that the arcade machines can vend now vend properly, for - real this time. - Robustin: - - rscadd: The cult master has finally acquired their 3rd spell, Eldritch Pulse. - This ability allows the cult master to quickly teleport any cultist or cult - structure in visual range to another tile in visual range. This spell has an - obvious spell effect that will indicate where the target has gone but without - explicitly revealing who the master is. This spell should assist with moving - obstinate cultists off an important rune, getting wandering cultists back onto - an important rune, save a cultist from an untimely arrest/summary execution, - assist in getting your allies into secure areas, etc. - - bugfix: The void torch now only works on items that have been placed on surfaces, - this prevents the inventory bugs associated with this item. - thefastfoodguy: - - tweak: you can burn your brains out with a flashlight if you're tired of life -2017-06-07: - Expletive: - - rscadd: New plasma medals have been added to the Captain's medal box. Don't get - them too warm. - - imageadd: New sprites for plasma medals. - - imageadd: Icon and worn sprites for all medals and the lawyer's badge have been - improved. Worn medals more closely match their icons. - - tweak: The bone talisman is an accessory again, so it's not useless. - - imageadd: It also has a new worn sprite, based on an arm band. - - imagedel: Ties have been removed from accessories.dmi and vice versa. Same for - the explorer's webbing sprites that were in there. ties.dmi is now neck.dmi, - and has sprites for scarves, ties, sthetoscopes, etc. - - tweak: Examining an accessory now tells you how to use it. - Joan: - - spellcheck: Renamed Volt Void to Volt Blaster. - - tweak: Volt Blaster does not consume power when firing and does not cause backlash - if you don't fire. - - balance: Volt Blaster does 25 damage, from 20-40 depending on power, and has 5 - shots, from 4, over its duration. - QualityVan: - - bugfix: Surplus rifles are no longer invisible while unloaded - Shadowlight213: - - balance: The Changeling Transformation Sting is once again stealthy. However, - it no longer transfers mutations. - - balance: The chemical cost of Transformation Sting has been increased to 50 -2017-06-08: - 4dplanner: - - bugfix: traitors show up on antagHUD - Expletive: - - tweak: The detective's flask has Hearty Punch instead of whiskey. - - bugfix: The Detective's fedora no longer clips with hair. - - imageadd: Adds 91 new sprites to fix clipping issues with the Detective's fedora - and hair. - - imageadd: Change the standard fedora to match the detective and treasure hunter - variants. - - tweak: Detective, Treasure Hunter, and standard fedoras now all benefit from new - sprites. - Joan: - - balance: Tinkerer's Daemons are no longer totally disabled if you drop below the - servant requirement. - - balance: Instead, Tinkerer's Daemons will disable until the number of active daemons - is equal to or less than one-fifth of the living Servants. - - tweak: Tinkerer's Daemons produce components very slightly slower. - - rscadd: Added Prolonging Prism as an application scripture. - - balance: Prolonging Prism will delay the arrival of an emergency shuttle by 2 - minutes at the cost of 2500W of power plus 75W for every 10 CV and 750W for - every previous activation. In addition to the high cost, it very obviously affects - the shuttle dock and leaves an obvious trail to the prism. - - balance: Script scripture now requires 6 Servants to unlock, from 5, and Application - scripture now requires 9 Servants to unlock, from 8. - Lzimann + Cyberboss: - - experiment: Ported goonchat. Much less laggy and crashy than BYOND chat. + Frills! - NanoTrasen Public Relations Department: - - rscadd: A mining accident has released large amounts of space dust, which is starting - to drift near our stations. Don't panic, it's probably safe. - Nanotrasen Plastic Surgery Advert: - - rscadd: Are you a mutant? Were you born hideously deformed? Do you have ears growing - out of the top of your head? Or even a tail? Don't worry, with our patented - surgical techniques, Nanotrasen's highly trained medical staff can make you - normal! Schedule an appointment, and one of our surgeons can see you same day. - - balance: Cat ears now give you double the ear damage. - QualityVan: - - bugfix: Cremators now still work when there's only one thing in them - - bugfix: The ORM now uses the intended amount of resources when making alloys - - rscdel: Cyborgs can no longer alt-click their material stacks to split them - Robustin: - - balance: The blood cult can only attempt to summon Nar-Sie in one of three rooms - that are randomly selected at round-start. - Shadowlight213: - - rscadd: Tracking implants and chem implants have been added to rnd - - rscdel: Adrenaline and freedom implants have been removed from rnd - Xhuis: - - tweak: Defibrillator paddles will no longer stick to your hands, and will snap - back onto the unit if you drop them somehow. - lzimann: - - rscdel: Xeno queens can no longer be maids - oranges: - - rscadd: Added stungloves to the brain damage lines -2017-06-09: - Nanotrasen Shiny Object Appreciation Club: - - rscadd: The RD and HoS now receive medal lockboxes in their lockers, containing - science and security medals, respectively. - Tacolizard and Cyberboss, idea by RandomMarine: - - rscadd: You can now add a commendation message when pinning a medal on someone. - - rscadd: Medal commendations will be displayed when the round ends. - - tweak: Refactored the outfit datum to allow accessories as part of an outfit. - - bugfix: The Captain spawns with the Medal of Captaincy again. - TrustyGun: - - rscadd: Some of the clown's toys have been moved into a crate in the theater. - If you think you are missing something, check in there. - - rscadd: Wooden crates have been added. You can construct them with 6 wooden planks, - and deconstruct them the same way as regular crates - oranges: - - tweak: Security minor and major crime descriptors are now a single line input, - making it easier to add them - - tweak: Medical record descriptions are single inputs now -2017-06-11: - Expletive: - - imageadd: Glass tables are shinier - Nanotrasen Consistency Affairs: - - bugfix: You no longer see yourself in place of the user when examining active - Spirit Sight runes. - Shadowlight213: - - bugfix: Cloning dismembered heads and brains now respects husking and other clone - preventing disabilities. - WJohn: - - bugfix: It is now easier to wire the powernet into box's telecomms SMES cell. - Xhuis: - - rscadd: You can now pin papers and photos to airlocks. Anyone examining the airlock - from up close can see the details. You can cut them down with wirecutters. - lordpidey: - - rscadd: Added F.R.A.M.E. cartridge to uplinks. This PDA cartridge contains 5 - viruses, which when used will unlock the target's PDA into a syndicate uplink, - in addition, you will receive the code needed to unlock the uplink again, if - you so desire. - - rscadd: If you use telecrystals on a F.R.A.M.E. cartridge, the next time it is - used, it will also give those crystals to the target uplink. - octareenroon91: - - bugfix: Mecha tools now respond to MMI control signals as intended. - shizcalev: - - tweak: '"Species immune to radiation are no longer compatible targets of radiation - based DNA injectors."' - - bugfix: '"A gun''s firing pin will no longer malfunction when placed into your - own mouth. Phew!"' - - imageadd: '"Bedsheets capes are now slightly more accurate. Be jealous of the - clown and their sexy cape!"' -2017-06-13: - Expletive: - - tweak: Paper planes are now the same color as the paper used to make them. - - bugfix: Flashdarks can no longer be used to examine head based organs. - Fox McCloud: - - tweak: Tweaked game options animal speed value to match live server - Joan: - - spellcheck: Renamed AI liquid dispensers to foam dispensers. - - tweak: Foam dispensers now activate immediately when clicked, rather than forcing - the user to go through a menu. They also have better visual, message, and examine - feedback on if they can be activated. - MrStonedOne: - - experiment: Added some code to detect the byond bug causing clients to send phantom - actions shortly after connection. It will attempt to fix or work around the - issue. - Nanotrasen Robotics Department: - - rscadd: To aid in general-purpose cleaning and maintaining of station faculties, - all janitor cyborgs are now outfitted with a screwdriver, crowbar, and floor - tile synthesizer. - WJohnston: - - bugfix: Survival bunker ruin's power now works, mostly. - shizcalev: - - tweak: '"Radiation immune species are now incompatible with the radiation based - genetics DNA scanner/modifier."' -2017-06-14: - Expletive: - - rscadd: The medalboxes are now fancy. - - imageadd: New sprites for opened medal boxes. - Joan: - - tweak: Being converted to clockcult will briefly cause your world to turn yellow - and you to hear the machines of Reebe, matching the description in the messages. - - spellcheck: The messages for being converted and for failing conversion to clockcult - have been updated. - Tacolizard: - - bugfix: Flamethrowers no longer say they're being ignited when you extinguish - them -2017-06-17: - Cyberboss: - - tweak: NT now provides education on the proper response for experiencing the excrutiating - pain of varying degree burns (You scream when burning) - Expletive: - - rscadd: The Captain now starts with a deluxe fountain pen in their PDA. - - rscadd: The quartermaster, curator, research director, lawyer, and bartender start - with normal fountain pens in their PDAs. - - rscadd: Cargo can order fountain pens via the Calligraphy Crate. - - rscadd: Nerds on the station will be pleased to know they now have pocket protectors. - - bugfix: Cryo cells work properly on mobs with varying max health values. - Joan: - - rscdel: Cultists must be human to run for Cult Master status. - - tweak: The Hierophant is a little less chaotic and murdery on average. - LanCartwright: - - rscadd: Penguins, penguin chicks, penguin eggs. - - rscadd: Penguin family to Winter Wonderland. - MrStonedOne and Lummox JR: - - bugfix: Fixed icon scaling and size preferences not loading (Technically size - preferences were loading because byond saves that locally, but that's not reliable - because ss13 shares a hub) - QualityVan: - - rscadd: The botany vending machine now has a stock of onion seeds - RandomMarine: - - tweak: RCDs now always use matter consistent with the material needed when building. - - tweak: Floors now cost 3 or 1 matter to build, based on if a lattice exists on - the tile. - - tweak: Reinforced windows cost 12 matter. Normal windows cost 8 matter. (Both - up/down from 10) - - tweak: Glass airlocks cost 20 matter. - - tweak: RCDs are faster at building grilles and plain glass windows. - Steelpoint: - - tweak: Slightly reshuffles the Head of Security's, and Research Directors, locker - to place fluff items below essential items. - Tacolizard: - - rscdel: Flashes no longer have a tech requirement - That Really Good Soda Flavor: - - bugfix: High luminosity eyes will have material science instead of an error research - type - Thunder12345 and Improvedname: - - rscadd: You can now turn severed cat tails and ears into genuine kitty ears - - rscadd: Cat tails can now be used to make a cat o' nine tails, similarly to the - liz o' nine tails. - Xhuis: - - spellcheck: The names of the hand drill, jaws of life, and emitter are now lowercase. - - spellcheck: The descriptions of the hand drill, jaws of life, and emitter have - been changed to be more descriptive and less lengthy. - - rscadd: Tablets with IDs in them now show the ID's name when examining someone - with that tablet in their ID slot, similar to a PDA would. - bandit: - - tweak: Default short/medium/long brig times are now, in order, 2, 3, and 5 minutes. -2017-06-18: - Expletive: - - tweak: Stacks of space cash now tell you their total value and their value per - bill when you examine them. - RandomMarine: - - tweak: Compressed matter cartridge production costs now reflect their material - worth at basic efficiency. - - bugfix: Compressed matter cartridges can now be exported. - Xhuis: - - bugfix: Puny windows will no longer stop the progress of Ratvar. -2017-06-19: - Expletive: - - rscadd: Paper frames can be created using wood and paper, and can be used to create - decorative structures. - - rscadd: Natural paper can now be crafted - - rscadd: KorPhaeron can now start a maid cafe, if they so desire. - - rscadd: Thanks to the invention of "Bill slots", vending machines can now accept - space cash. - - tweak: The Clown and Mime can now find their unique crayons stored inside their - PDAs - LanCartwright: - - rscadd: 1D4 into Lavaland Mining base crate. - RandomMarine: - - tweak: Bonfires now work on lavaland! - Tacolizard: - - rscadd: Repurposed the action button tooltip code to add tooltips with the examine - details of all held and equipped items. Hover your mouse over any item equipped, - held or in your inventory to examine it. - - rscadd: Examine tooltips can be toggled with the 'toggle-examine-tooltips' verb, - which can be typed or accessed from the OOC menu. - - rscadd: You can change the delay before a tooltip appears with the 'set-examine-tooltip-delay' - verb, also accessible via the OOC menu. The default delay is 500ms. -2017-06-20: - Bawhoppen: - - bugfix: Grenade belts and bandoliers will no longer obscure half the screen when - they're completely filled. - LanCartwright: - - rscdel: Removed loot drops from Syndicate Simple mobs. - Tacolizard: - - rscadd: Some items now have custom force strings in their tooltips. - - bugfix: items with no force can still use a custom force string. - Xhuis: - - bugfix: The station's heaters and freezers have been sternly reprimanded and will - now drop the correct circuit boards and cable coils. - - rscadd: The straight jacket now takes five seconds to put on. - - bugfix: The display cases in luxury shelter capsules will no longer spawn unobtainable, - abstract offhand objects. - - bugfix: Disablers now have an in-hand sprite. - nicbn: - - imageadd: Changed cryo sprites to Bay cryopods, which show the person inside of - them. -2017-06-22: - Bawhoppen: - - rscadd: Dressers are now constructable, and unanchorable with a wrench. - ClosingBracket: - - spellcheck: Fixes small typographical errors on flight suits and implanters. - Ergovisavi: - - tweak: Nanofrost setting and metal foam synthesizer on the Atmos watertank backpack - changed to "Resin", which is a solid, but transparent structure similar to metal - foam that scrubs the air of toxins, regulates temperature, etc - - tweak: Atmos holobarrier device swapped out for an Atmos holo-firelock device, - which creates holographic firelocks that prevent atmospheric changes from going - over them - Expletive: - - tweak: Flame thrower plasma tanks can be removed with alt-click. - Lordpidey: - - bugfix: True and arch devils are no longer deaf. - - bugfix: Fixed some edge cases with devils getting two sets of spells. - - bugfix: True/arch devils can now instabreak cuffs. - - rscadd: The codex gigas now indicates if a devil is ascendable or not. - - tweak: Hellfire has been buffed, it now explodes multiple times. - Nanotrasen Robotics Department: - - tweak: Traitor AIs' malfunction modules have received a firmware update and are - more responsive, with HUD buttons and more sensible menus. - - tweak: Overload and Override Machines now function differently; instead of right-clicking - a machine to choose a context menu option, you activate the ability, which lets - you left-click on a machine to overload or override it. This also changes your - cursor. - Xhuis: - - rscadd: Alt-clicking the Show/Hide Actions button will now reset the positions - of all action buttons. - - rscadd: Hints to the two shortcuts for action buttons are now included in the - Show/Hide Actions button's tooltip. - - rscadd: (As a reminder, that's shift-click to reset the clicked button, and alt-clicking - the Show/Hide Actions button to reset it and all the others!) - - spellcheck: The names of several objects, such as the holopad and biogenerator, - have been lowercased. - - spellcheck: Added some descriptions to a few objects that lacked them. - - rscadd: Tablets now have a built-in flashlight! It can even change colors, as - long as they're light enough in hue. - bandit: - - rscadd: Nanotrasen researchers have made the breakthrough discovery that Lavaland's - plants are, in fact, plants, and can be harvested with seed extractors. - ohnopigeons: - - bugfix: After a janitorial audit Nanotrasen has decided to further cut costs by - removing the janicart's secret space propulsion functionality -2017-06-23: - BeeSting12: - - bugfix: The clowndagger now has the correct skin. - MrStonedOne: - - tweak: Makes old chat show while goonchat loads. Should goonchat fail to load, - the old chat will still be operational. -2017-06-25: - Expletive: - - rscadd: Adds the skull codpiece, which can be crafted from parts of lavaland monsters. - - rscadd: Maid Costume aprons can now be detached and reattached to any uniform. - Improvedname: - - rscadd: You can now export cat ears/tails for 1000 credits - JJRcop: - - bugfix: Fixed telekinesis remote item pick up exploit - Kor: - - rscadd: Robotic legs now let you use pockets without a jumpsuit, and a robot chest - now lets you use the belt slot and ID slot without a jumpsuit. - RandomMarine: - - rscadd: Cargo can now export mechs! - Steelpoint: - - rscadd: Station Engineers spawn with a Industrial Welder in their toolbelt. - - tweak: Engineering Welder Locker now only holds three standard Welders. - - rscadd: An old Nanotrasen Space Station has quietly reawoken its surviving crew - one hundred years after they fell to slumber. Can the surviving crew, using - old, broken and out of date equipment, overcome all odds and survive, or will - the cold embrace of the stars become their new home? - - tweak: Nanotrasens Corps of Engineers has refitted and refurbished NTSS Boxstations - Engineering area into, what Centcom believes, a more efficient design. - That Really Good Soda Flavor: - - experiment: Added the ability for a holiday to start on the nth weekday of a month. - - experiment: Allahu ackbar! Added the ability to calculate Ramadan. - - rscadd: Added Thanksgiving, Mother's Day, Father's Day, Ramadan, and Columbus - Day to the possible holidays. - - bugfix: Fixed nuclear bombs being radioactive. - Xhuis: - - rscadd: You can now unfasten intercoms from walls and place them elsewhere on - the station. - - rscadd: Intercom frames can now be created at an autolathe for 75 metal and 25 - glass. - - bugfix: Nearly-full goliath hide stacks now correctly have a sprite. -2017-06-27: - Ergovisavi: - - bugfix: Fixed a few anomalous crystal effects - - bugfix: Fixes stacking atmos resin objects in a single tile - - tweak: Lasers now go through atmos resin objects - Joan: - - tweak: The Necropolis has been rethemed. - Kor: - - rscadd: Added dash weapons, which let you do a short teleport within line of sight. - - rscadd: The ninjas energy katana now lets him dash. He can no longer teleport - with right click. - - rscadd: Glass shards will no longer hurt people with robotic legs. - - rscadd: Mesons work on lavaland again. - Xhuis: - - spellcheck: The names of most glasses, like mesons, t-ray scanners, and night - vision goggles, have been lowercased. - - spellcheck: The thermonocle's description now changes based on the gender of the - person examining it. - - bugfix: Straight jackets can now properly be put onto others. - drline: - - bugfix: Nanotrasen finally sent out IT personnel to plug your modular consoles - back in. You're welcome. -2017-06-28: - Cyberboss: - - rscdel: Cortical borers have been removed - Shadowlight213: - - rscadd: There is now a new monitor program that engineers can use to monitor the - supermatter status - Tacolizard: - - rscadd: NanoTrasen has now outfitted their employees with Extra-Loud(TM) Genetically - Modified Hearts! Now you can hear your heart about to explode when the clown - shoots you full of meth, or hear it slowly coming to a stop as you bleed out - in critical condition after being toolboxed by an unknown gas-mask wearing assistant. -2017-07-07: - Ergovisavi: - - tweak: Added a recovery window after some variable length megafauna attacks - - rscadd: Adds a new mob to the game, the "leaper" - - rscadd: Adds another planetstation mob, the "wanderer/mook" to the backend - - bugfix: Fixes a problem with player controlled leapers where they occasionally - can't fire - Joan: - - tweak: Rethemes the ash walker nest to match the Necropolis. - - balance: Chasms, asteroid turfs, basalt, and lava can no longer be made wet. - - rscadd: A strange new Resonant Signal has appeared on lavaland. - - tweak: Dreams while sleeping are now slightly longer on average and will contain - more possibilities. - - rscadd: Bedsheets may affect what you can dream. - Lexorion: - - imageadd: The portable PACMAN generators now have new icons, including on and - off states. - More Robust Than You: - - rscadd: Nanotrasen has added lids to their soda that POP! when opened. Up to 3 - possible sounds! - - bugfix: brain damage should no longer attempt to emote/say things while unconcious - NanoTrasen Smithy Department: - - soundadd: Tasked by corporate heads to make NanoTrasen's line of captain rapiers - flashier, a few brave smiths have managed to forge their steel in a way that - enhances their swords' acoustic properties. - Shadowlight213: - - rscdel: The majority of the tiny fans on Deltastation have been removed. - - tweak: Airlocks going to space, and secure areas like the bridge and sec on Delta - have been given the cycling system. - - balance: The freedom suit no longer slows you down and can withstand the FIRES - OF LIBERTY! - Steelpoint (Ancient Station): - - rscadd: Major changes to Ancient Station include new sounds for the prototype - RIG hardsuit, the NASA Engineering Voidsuit slowing the user down properly and - new insulated gloves in engineering. - - rscadd: Several minor changes, such as an extra oxygen tank, spawn in equipment - and minor tile changes. - Supermichael777: - - balance: The AI swap menu is now given to the person with the multi-tool rather - than the Borg. Old behavior remains for all non multi-tool sources - - bugfix: Borgs and shells now notify when un-linked due to the wire being cut. - Tacolizard: - - bugfix: Nanotrasen has begun a program to inform the souls of the departed that - their hearts can't beat after death. - - bugfix: heartbeat noises now loop (i can't come up with any dumb fluff for this - one sorry) - That Really Good Soda Flavor: - - bugfix: Martial arts will no longer be transferred in cloning, etc. if they are - temporary (i.e. wrestling, krav maga). - Xhuis: - - tweak: Recollection has been separated into categories and should be easier to - read and more informative. - - bugfix: Ratvar has been reminded that he hates Nar-Sie and will now actively pursue - fighting her. - - bugfix: You can now properly dig out plants from patches of soil. - - bugfix: Reskinnable guns no longer become invisible after firing a single shot. - - bugfix: The kinetic crusher and other forced two-handed objects can now correctly - be stored in a bag of holding. - - bugfix: Positronic brains' icons will now properly change depending on status. - - tweak: Positronic brains will now stop searching as soon as they're occupied. - - tweak: Positronic brains now have error messages if activating them fails for - whatever reason. - - bugfix: Unconscious Servants are now properly informed when they're deconverted. - - bugfix: The Voice of God no longer specifically targets creatures like constructs - and clockwork marauders. - - bugfix: Heartbeat sounds no longer play indefinitely if your body is destroyed. - kevinz000: - - rscadd: Headphones have been provided to the station in Autodrobes, mixed wardrobes, - and fitness wardrobes. Please use them responsibly, and remember to focus on - your job above all else! - - experiment: Headphones fit in head, ears, OR neck slots! - ohnopigeons: - - bugfix: Nanotrasen Electronics have fixed a bug where issued factory-fresh PDAs - did not link to their cartridges, requiring manual reinsertion. - shizcalev: - - balance: Nanotrasen has upgraded the obsolete teleporter consoles on most NT branded - stations with newer ones preloaded with the newest Supermatter monitoring application! - - soundadd: The supermatter base now has a speaker and will provide audio cues as - to it's current status! - somebody: - - rscadd: Strong plasma glass windows -2017-07-09: - Crexfu: - - tweak: 2 plasma sheets have been added to viro break room on box - More Robust Than You: - - bugfix: Plasma and Reinforced plasma glass no longer merge with Normal and Reinforced - Glass - Xhuis: - - bugfix: You can no longer catch objects that require two hands at all times with - only one hand. -2017-07-11: - RandomMarine: - - rscadd: Drones can now switch between help and harm intent. - Tacolizard: - - rscadd: Admins can now set a message/warning when they delay the round end, to - be shown to anyone who tries to reboot the world. - Tacolizard and Cyberboss: - - rscadd: Added two new organs, the liver and stomach. Without them, you won't metabolize - chemicals. - - rscadd: The liver is responsible for processing all chemicals except nutrients. - If your liver is removed, you will be unable to metabolize any drugs and will - slowly die of toxin damage. - - rscadd: Drinking too much alcohol or having too many toxins in you will damage - your liver, if it becomes too damaged, it will undergo liver failure and you - will slowly die of toxin damage. Your liver naturally heals a small amount of - its damage. However, it doesn't heal enough to offset stronger alcohols or large - amounts of toxins, at least until they are metabolized out of your body. - - rscadd: to conduct a liver transplant, inject corazone into the patient. Corazone - will prevent the patient from taking damage due to either not having a liver - or undergoing liver failure. Corazone will metabolize out of the patient quickly, - so at least 50u is recommended. - - rscadd: The stomach is responsible for metabolizing nutrients. Without a stomach, - you will be unable to get fat, but you will also be unable to process any nutrients, - meaning you will eventually starve to death. - Xhuis: - - bugfix: Mobs spawned by Necropolis curses are now immune to chasms. - - tweak: The BoxStation warden's office now has a crew monitoring console. - - imageadd: Clockwork slabs now show icons of the components used in scripture instead - of initials. - factoryman942: - - bugfix: Boxstation Robotics now has 6 flashes, from 2. - - bugfix: Metastation Robotics now has 40 sheets of glass, instead of 20. - shizcalev: - - tweak: The supermatter reporting system has been updated to report remaining integrity, - as opposed to how unstable the SM currently is. -2017-07-18: - BeeSting12: - - tweak: Deltastation's auxiliary storage in arrivals can be accessed by anyone - now. - - bugfix: Deltastation's cargo bay maintenance can now be accessed by cargo techs. - Dannno/Supermichael777/InsaneHyena: - - rscadd: You can now pick from a few different styles when augmenting someone with - robot parts by putting them in the augment manipulator. Alt+click to take parts - out. - Ergovisavi: - - bugfix: Fixed the refresher variant of the anomalous crystal making holodeck items - real - Fox McCloud: - - rscdel: blood and gibs on turfs can no longer infect nearby people - - tweak: Tuberculosis bypasses species virus immunity (it's not a virus!) - - tweak: Disease and appendicitis events no longer infect clientless mobs - - tweak: Disease event will no longer pick virus immune mobs - - tweak: Appendicitis event will no longer pick mobs without an appendix - - bugfix: Fixed changeling panacea curing non-harmful viruses - - bugfix: Fixes IV drips not properly injecting the right amount of blood - Joan: - - rscdel: Removed the Soul Vessel, Cogscarab, and Anima Fragment Scriptures. - - bugfix: The Ark of the Clockwork Justicar will still forcibly take up a 3x3 area - even if it still needs components to activate. - MrStonedOne & Fox-McCloud: - - tweak: Made pathfinding much quicker - NewSta: - - bugfix: Fixes the maid apron being invisible when in-hand or attached to the maid - outfit. - XDTM: - - experiment: Viruses and symptoms have been havily reworked. - - rscadd: Symptoms now have statistic thresholds, that give them new properties - or improve their existing ones if the overall virus statistic is above the threshold. - Check the pull request in github or the wiki (soon) for the full list. - - rscdel: Some symptoms no longer scale linearly with stats, and instead have thresholds. - - tweak: The symptom limit is now 6. - - rscdel: Viruses can no longer be made invisible to the Pandemic - - tweak: Symptoms no longer trigger with a 5% chance every second, but instead have - a minimum and maximum number of seconds between each activation, making them - more consistent. - - rscdel: The symptoms Blood Vomit and Projectile Vomit have been removed, and are - now bonuses for the base Vomit symptom. - - rscdel: The Weakness symptom has been removed as it was completely useless. - - tweak: The Sensory Destruction symptom has been reworked into Narcolepsy, which - causes drowsiness and sleep. - - tweak: Viral Aggressive Metabolism now has a timer before it starts decaying the - virus. It scales with the highest between Resistance or Stage Speed. - - rscadd: You can now neuter symptoms, making them inactive. They will still affect - stats. Adding formaldehyde to a virus will neuter a random symptom. A bottle - of formaldehyde starts in the virus fridge. - Xhuis: - - tweak: The tachyon-doppler array's rotation now has messages, sprites, and examine - text. - - bugfix: Time stop is now fixed, finally! - - soundadd: Time stop's sound now plays in reverse when the effect ends. - - bugfix: Missiles can no longer ricochet off of shuttle walls, etc. - - bugfix: Winter coats now hold all flashlights properly, instead of seclites. - Xhuis & Cyberboss: - - rscadd: New hivebot invasion event - kevinz000: - - rscadd: Personal Cabinets now have piano synthesizers for handheld piano playing. - - experiment: Thank @nicbn for the sprites! - ninjanomnom: - - experiment: Thank you for updating your ShuttlSoft product! Your last update was - -ERROR- years ago. A full changelog can be found at CYG10408.SHSO.b9 along with - the EULA. This update lays a foundation for new things to come and a sample - in the form of new and improved docking procedures. - shizcalev: - - bugfix: Cerestation's emergency shuttle autopilot will no longer fly you in reverse - back to Centcom! -2017-07-27: - Anonmare: - - bugfix: Informs a person about how bomb cores work - BeeSting12: - - rscdel: Water bottles from the sustenance vendor are gone. Wait for the ice in - the ice cups melt, criminal scum. - - rscdel: There is no longer a sink in gulag. Hygiene is for the moral members of - society. - - tweak: Janitor and service cyborgs now get pocket fire extinguishers for fire - suppression and space propulsion. - - rscadd: Pubbystation's dorms now has a dresser. - - bugfix: Crafting satchels from leather now makes a leather satchel rather than - a regular satchel. - Fox McCloud: - - tweak: breathing plasma now causes direct tox damage - - tweak: breathing hot/cold air now warns you when you're doing so, again - - tweak: species heat/cold mod now impacts damage from breathing hot/cold gases - HAL 9000: - - bugfix: I'm sorry Dave, I'm afraid I can't do that - JStheguy: - - imageadd: Resprited the tablet, including completely redone screen sprites. - - rscadd: Tablets can now come spawn in one of 5 colors; red, green, yellow, blue, - and black. - - imageadd: Most alcohol bottles have been resprited, as well as a poster that used - one of the current bottles as part of it's design. - Joan: - - balance: Unwrenching clockwork structures no longer damages them. - - tweak: The Hierophant will now release a burst when melee attacking instead of - actually hitting its target. - - bugfix: The Hierophant Club's blasts will now properly aggro hostile mobs. - - tweak: The blood-drunk miner will fire its KA a bit more often. - PopNotes: - - soundadd: Nar-Sie now sounds like an eldritch abomination that obliterates worlds - instead of a sweet maiden that gently whispers sweet nothings in your ear. - Supermichael777: - - bugfix: delayed chloral hydrate actually works now. - Tacolizard: - - rscadd: Added cybernetic organs to RnD, they can be used to replace organic organs. - Remember to administer corazone during implantation though! - - rscadd: Added the upgraded cybernetic liver. It is exceptionally robust against - toxins and alcohol poisoning. - Xhuis: - - bugfix: Cyborgs now regenerate oxygen damage. - - bugfix: If a cyborg somehow takes toxin damage, it can be healed with cables as - though it was burn damage. - - spellcheck: Picking up ores by walking over them now longer spams messages, instead - showing one message per tile of ore picked up. - - tweak: You can now control-click action buttons to lock them and prevent them - from being moved. Alt-clicking the "Show/Hide Actions" button will unlock all - buttons. - - tweak: There is now a preference for if buttons should be locked by default or - not. - - rscadd: Pizza box stacks can now fall over - - imageadd: Pizza box inhands now stacks depending on how many you're holding. - - bugfix: Mining satchels no longer hold infinite amounts of ore. - - bugfix: Reviving Stasis now consistently regenerates organs. - - bugfix: Medibots now properly render the overlays of the medkits they are made - from. - - bugfix: The latest batch of Syndicate screwdrivers fell into a vat of paint and - were colored randomly. We have rinsed them off and they will no longer come - in random colors. - - bugfix: Supermatter slivers can now be stolen properly. - - tweak: Whenever you're trying to hack off your own limbs, you'll now always hit - those limbs. - Xhuis & MoreRobustThanYou: - - imageadd: Toolbelts now have overlays for crowbars, wirecutters, screwdrivers, - multitools, and wrenches. - Y0SH1_M4S73R: - - bugfix: Romerol zombies count as dead for assassinate and maroon objectives. - bandit: - - rscadd: New Cards against Spess cards are available! - ktccd: - - bugfix: Hijacking should now be possible again! -2017-07-29: - Fox McCloud: - - rscadd: Sound should carry further, but should get quieter and quieter the further - you are from it - Joan: - - tweak: Sigils of Transmission can now drain power in a large area when activated - by a Servant. - - rscdel: Interdiction Lenses have been removed, as they were largely only used - to drain power into Sigils of Transmission. - - balance: Sigils can no longer directly be removed by Servants. - - balance: Prolonging Prisms have a higher cost to delay, but no longer increase - in cost based off of CV. - - balance: Base delay cost changed from 2500W to 3000W, cost increase per activation - changed from 750W to 1250W, cost increase per 10 CV changed from 75W to 0W. - - rscdel: Removed the Volt Blaster scripture. - - rscdel: Ratvarian spears can no longer impale. - - balance: Vitality Matrices now require a flat 150 Vitality to revive Servants, - from 20 + the Servant's non-oxygen damage. Vitality Matrices are also no longer - destroyed when reviving Servants. - - balance: Ratvarian spear damage changed from 18 to 20, Ratvarian spears now generate - 5 Vitality when attacking living targets. Ratvarian spear armour penetration - changed from 0 to 10. - - balance: The Judicial Visor's mark now immediately applies Belligerent and knocks - down for 0.5 seconds. Mark exploding no longer mutes, mark explosion stun changed - from 16 seconds to 1.5 seconds, mark explosion damage changed from 10 to 20. - More Robust Than You: - - rscadd: Nanotrasen has begun production of the Rapid Cable Layer, a tool that - helps you lay down cables faster - - rscadd: You can now craft ghetto RCLs with metal, a screwdriver, welder, and wrench. - They hold less cable, and may fall apart or jam! - Xhuis: - - spellcheck: Player-controlled medibots now receive a notice whenever they try - to heal someone with too high health. - - bugfix: Syringes now properly inject targets wearing thick clothing on different - slots. - - bugfix: Stun baton overlays now appear on security belts when active. - kevinz000: - - rscadd: 'Badmins: Buildmode map generators have names in the list to select them, - instead of paths.' - - rscadd: Also, a new map generator has been added, repair/reload station. Use it - VERY sparingly, it deletes the block of the map and reloads it to roundstart. - THIS CAN CAUSE ISSUES WITH MACHINES AND ATMOSPHERICS, SO DO NOT USE IT UNLESS - YOU ABSOLUTELY HAVE TO! - - experiment: The reload station one tagged DO NOT USE shouldn't be used as it doesn't - delete anything before loading, so if you use it you'll have two copies of things. - That can result in a LOT of issues, so don't use it unless you're a codermin - and know what you're doing/abusing! - ktccd: - - bugfix: Ashstorms no longer pierces the protected people to kill anyone/anything - in them. -2017-08-06: - Anonmare: - - rscadd: Surgical toolarm to protolathe and exofab - - tweak: Toolarm tools are less robust but more efficient at surgery - - tweak: Arm augments are no longer a huge item - AnturK: - - balance: Cyborg remote control range is now limited to 7 tiles. - Ergovisavi: - - rscadd: Adds the "seedling" planetstation mob to the backend - Floyd: - - bugfix: No longer does everyone look like a sick, nauseated weirdo! - Galactic Corgi Breeding Mills, LLC: - - bugfix: Fixed corgis being able to wear spacesuit helmets despite lacking the - proper code and sprites for them. - Joan: - - tweak: Colossus's shotgun is now a static-spread blast of 6 bolts, making it more - predictable. - - balance: Geis now mutes for 12-14 seconds and "stuns" the target, via a binding - effect, for 25 seconds instead of initiating a conversion. - - experiment: Geis's "stun" restrains the target and prevents them from taking actions, - but its duration is halved if the binding is not being pulled by a Servant. - - wip: Using Geis on a target prevents you from taking actions other than attempting - to pull the binding. If you are pulling the binding, you can dispel it at any - time. - - wip: As should be obvious, if the binding is destroyed or dispelled, you can once - again take normal actions. - - tweak: Sigils of Submission are now permanent and have been moved from the Script - tier to the Driver tier, with an according cost adjustment. They still do not - penetrate mindshield implants. - - rscdel: Removed Taunting Tirade. - - rscdel: Removed Sigils of Accession. - Lexorion: - - imageadd: Hearty Punch has a new, fancier sprite. - More Robust Than You: - - bugfix: RCL and Ghetto RCLs are no longer invisible - - bugfix: RCL action button now has a sprite - - bugfix: RCLs can no longer go inside you - XDTM: - - bugfix: Eyes can now be properly damaged. - Xhuis: - - spellcheck: Removed an improper period from the supermatter sliver theft objective's - name. - - bugfix: Alien hunters can no longer pounce through shields. - - bugfix: Observing mobs that have no HUD will no longer cause intense lighting - glare. - - bugfix: Objects on shuttles now rotate in the correct directions. - - soundadd: The speakers in the ceiling have been upgraded, and many sounds are - now less tinny. - Xhuis and oranges: - - bugfix: Banana cream pies no longer splat when they're caught by someone. - - soundadd: Throwing a pie in someone's face now has a splat sound. - kingofkosmos: - - bugfix: Fixed hair sticking through headgear. -2017-08-13: - JStheguy: - - imageadd: Laptops now have actual sprites for using the supermatter monitoring - instead of defaulting to a generic one. - Joan: - - imageadd: Belligerent now has a visible indicator over the caster. - More Robust Than You: - - tweak: Mulligan and non-continuous completion checks will not consider afk/logged - out people to be "living crew". - - tweak: The wiki button now asks what page you want to be taken to - - tweak: His Grace now shows up on the orbit list - Pubby: - - rscadd: The Curator job is now available on PubbyStation - - rscadd: Beekeeping has been added to PubbyStation's monastery - - tweak: PubbyStation's bar has been rearranged - Xhuis: - - bugfix: Swarmer shells now have ghost notifications again. - - bugfix: Minebots no longer lack icons for their action buttons. - kingofkosmos: - - imageadd: Adds icon_states to the unused and used Eldritch whetstones. Sprites - by Fury McFlurry. -2017-08-14: - Joan: - - imageadd: Ported CEV-Eris's APC sprites. - More Robust Than You: - - bugfix: Fixes a typo in the blobbernaut spawn text - WJohnston: - - rscadd: Adds an ore box and shuttle console to aux bases on all stations. - Xhuis: - - bugfix: The Resurrect Cultist rune now works as intended. - - bugfix: Cyborg energy swords now properly have an icon. - kingofkosmos: - - tweak: Canisters don't flash red lights anymore when empty. -2017-08-19: - Anonmare: - - balance: Raised airlock deflection by one point - BeeSting12: - - balance: The meth explosion temperature has been raised. - FrozenGuy5/PraiseRatvar: - - balance: Nerfs L6 SAW Hollow Point Bullets from -10 armour penetration to -60 - armour penetration. - Joan: - - balance: Deathsquads no longer get shielded hardsuits. - More Robust Than You: - - rscadd: Blobs can now sense when they're being cuddled! - - bugfix: Fixes mining hardsuit heat_protection - - bugfix: RCL icons are now better at updating - NewSta: - - bugfix: Fixes the wiki button - - spellcheck: Fixes a typo in the wiki button description - XDTM: - - rscadd: You can now click on symptoms in the Pandemic to see their description - and stats - Xhuis: - - soundadd: The station's explosion now uses a new (or old) sound. - - rscadd: Adds smart metal foam, which conforms to area borders and walls. It can - be made through chemistry by mixing foaming agent, acetone, and iron. - - rscadd: Smart metal foam will create foamed plating on tiles exposed to space. - Foamed plating can be struck with floor tiles to turn it into regular plating! - - spellcheck: The chat message has been removed from *spin. I hope you're happy. - nicbn: - - imageadd: Nanotrasen redesigned the area power controllers! - - imageadd: Thanks Xhuis for the contrast tweak on APCs -2017-08-23: - Cobby: - - balance: Planting kudzu now has a short delay with a visible message to users - around you. Hit-N-Run planting is no longer possible. - - rscdel: kudzu bluespace mutation and spacewalk mutation are removed. - Cruix: - - rscadd: The syndicate shuttle now has a navigation computer that allows it to - fly to any unoccupied location on the station z-level. - Ergovisavi: - - tweak: Slightly increased the radius of the atmos resin launcher, and resin now - makes floors unslippery - Pubby: - - rscadd: Gorillas - - rscadd: Irradiating monkeys can now turn them into hostile gorillas - Shadowlight213: - - experiment: The amount of time spent playing, and jobs played are now tracked - per player. - - experiment: This tracking can be used as a requirement of playtime to unlock jobs. - ShizCalev: - - balance: Morphlings now have to restore to their original form before taking a - new one. - - bugfix: Morphlings will no longer have combined object appearances - Supermichael777: - - bugfix: Boss tiles have been reconstructed out of an unstoppable force. - TehZombehz: - - rscadd: Nanotrasen Culinary Division has authorized the construction of pancakes, - including blueberry and chocolate chip pancakes. Pancakes can be stacked on - top of each other. -2017-08-26: - Cyberboss: - - rscadd: Added the credits roll - Iamgoofball: - - rscadd: Plasmamen now hallucinate with blackpowder in their system - Joan: - - balance: Geis bindings no longer decay faster if not pulled by a Servant, but - last for 20 seconds, from 25. - - tweak: Geis bindings will decay slower when on a Sigil of Submission, and, if - being pulled by a Servant when crossing a Sigil of Submission, will helpfully - remove the pull. - - tweak: Removing Geis bindings is no longer instant and can be done by any Servant - with a slab, not just the initiator. - - wip: Geis no longer prevents you from taking actions, but you remain unable to - recite scripture while the target is bound. In addition, dealing damage to a - bound target will cause the bindings to decay much more rapidly. - - rscadd: You can now remove sigils by hitting them with a clockwork slab for a - small refund. - More Robust Than You: - - balance: Lowers the chance for monkeys to become gorillas - - rscadd: Holoparasite prompts now have a "Never For This Round" option - Naksu: - - spellcheck: fixed inconsistent grammar between machines that derive from /obj/machinery/chem_dispenser - - spellcheck: touched up some chat messages to include references to objects instead - of "that" or "the machine" etc., also removed references to beakers being loaded - in machines that can accept any container -2017-08-30: - CPTANT: - - balance: Hacked AI module cost is reduced to 9TC - Cobby & Cyberboss: - - rscadd: A stealth option for the traitor microlaser has been added. When used, - it adds 30 seconds to the cooldown of the device. - Cyberboss (unwillingly by Kor's hand): - - balance: You no longer take damage/are as heavily blinded in crit while above - -30HP - - balance: Whispering in crit above -30HP will not cause you to succumb - - balance: You can now hear in crit above -30HP - Joan: - - imageadd: Cult blades have updated item and inhand sprites. - Kor: - - rscadd: Added Shadow Walk, a new form of jaunt that lasts for an unlimited amount - of time, but ends if you enter a well lit tile. It is planned for use in a Shadowling - rework, but feel free to hassle admins to test it out in the mean time. - - balance: Slime people can consume meat and dairy again. - Lzimann: - - rscadd: Ghosts now have a way to see all available ghost roles! Check your ghost - tab! - MMMiracles: - - rscdel: Cerestation has been decommissioned. Nanotrasen apologizes for any spikes - of suicidal tendencies, sporadic outbursts of primitive anger, and other issues - that may of been caused during the station's run. - Naksu: - - bugfix: fixed portable chem dispensers charging 50% slower than intended when - initialized. - - bugfix: fixed portable chem dispensers getting faster charging rate every time - refreshparts() is called - Pubby: - - rscadd: Crew-tracking pinpointers to replace laggy crew monitoring console functionality - - rscadd: Crew-tracking pinpointers in medical vendors and the detective's office - RemieRichards: - - rscadd: AltClick listing now updates instantly on AltClick - - bugfix: AltClick listing no longer reveals obscured items - ShizCalev: - - tweak: The singularity now poses a threat towards asteroids as well as stations. - - tweak: All power systems will now report their wattage values in Watts, Kilowatts, - Megawatts, and Gigawatts. Gone are the days of seeing 48760 W total load when - working with an APC! - kingofkosmos: - - tweak: You can now unbuckle out a chair/bed by moving. - ninjanomnom: - - bugfix: Fixed a problem with shuttles being unrepairable under certain circumstances. -2017-09-01: - Fury McFlurry: - - rscadd: Added more halloween costumes. - - rscadd: Among them are a lobster suit, a cold villain costume and some gothic - clothes - More Robust Than You: - - rscdel: Finally fucking removed gangs - MrStonedOne: - - rscadd: Player notes can now be configured to fade out over time to allow admins - to quickly see how recent notes are. Server Operators, check the config for - more info - Pubby: - - rscdel: The multiverse sword is toast - YPOQ: - - bugfix: Pouring radium into a ninja suit restores adrenaline boosts. - - bugfix: Adrenaline boost works while unconscious again. - - bugfix: Energy nets can be used again! -2017-09-02: - Frozenguy5: - - tweak: Added new station prefixes, names and suffixes! - Tortellini Tony: - - tweak: Round-end credits can now be toggled on or off in the server game options. - XDTM: - - tweak: The Disease Outbreak event now can generate random advanced viruses, with - more symptoms and higher level as round time goes on. -2017-09-11: - Anonmare: - - balance: Altered pressure plate crafting recipe - Basilman: - - rscadd: A strange asteroid has drifted nearby... - Firecage: - - rscadd: The NanoTrasen Department for Cybernetics (NDC) would like to announce - the creation of Cybernetic Lungs. Both a stock variety to replace traditional - stock human lungs in emergencies, and a more enhanced variety allowing greater - tolerance of breathing cold air, toxins, and CO2. - JJRcop: - - rscadd: Admins can now play media content from the web to players. - - rscadd: Adds a volume slider for admin midis to the chat options menu. - Jay: - - bugfix: Goliaths can be butchered again - Joan: - - tweak: While below 0 health but above -30 health, you will be able to crawl slowly - if not pulled, whisper, hear speech, and see with worsening vision. - - wip: The previous softcrit got reverted, for changelog context. - - rscdel: Standard attacks, such as swords, hulk punches, mech punches, xeno slashes, - and slime glomps, will no longer damage clothing. - Kor: - - rscadd: People in soft crit will take oxyloss more slowly than people in full - crit if they remain still. - - rscadd: People dragging themselves in critical condition will now leave blood - trails. This will rapidly deal oxyloss to you. - MrStonedOne: - - rscadd: Admins may now show the variables interface to players to help contributors - debug their new additions - Naksu: - - rscadd: Added TGUI interfaces to various smartfridges of different kinds, drying - racks and the disk compartmentalizer - Pubby: - - bugfix: Escape pods and PubbyStation's monastery shuttle are back in commission - Robustin: - - tweak: Golem shells no longer fit in standard crew bags. - Supermichael777: - - bugfix: Stands now check if their user got queue deleted somehow - VexingRaven: - - bugfix: Hearty Punch once again pulls people out of crit. - Xhuis: - - spellcheck: Various grammar in the Orion Trail arcade game has been tweaked. - - rscadd: You can now kill yourself in fun and creative ways with the hierophant - club. - - rscadd: Common lavaland mobs now have rare mutations! Keep an eye out for rare - Poke- err, monsters. - - imageadd: The hand drill and jaws of life now have sprites on the toolbelt. - YPOQ: - - bugfix: Windoors open when emagged again - as334: - - rscadd: Added a mass spectrometer to the detective's closet - basilman: - - rscadd: penguins may now have shamebreros, noot noot -2017-09-13: - BeeSting12: - - balance: The stetchkin APS pistol is smaller. - - rscadd: The 9mm pistol magazines can be purchased from nuke op uplinks at two - telecrystals each. - Kor: - - rscadd: Added Nightmares. They're admin only currently, so as usual, make sure - to beg admins to be one. - - rscadd: The Chaplain may now choose the Unholy Blessing as a null rod skin. - KorPhaeron: - - rscadd: Added Jacob's ladder to the necropolis chest - Lordpidey: - - bugfix: Centcom roundstart threat reports are fixed, and can now be used to narrow - down the types of threats facing the station. - MrROBUST: - - rscadd: Mechs now can be connected to atmos ports - VexingRaven: - - bugfix: Changeling Augmented Eyesight ability now grants flash protection when - toggled off - - bugfix: Changeling Augmented Eyesight ability can now be toggled properly - - bugfix: Changeling Augmented Eyesight ability is properly removed when readapting - - bugfix: The syndicate have once again stocked the toy C20r and L6 Saw with riot - darts. - Xhuis: - - rscadd: You can now use metal rods and departmental jumpsuits to craft departments - for each banner. - - tweak: The lavaland animal hospital ruin has been remapped, including more supplies - as well as light sources. -2017-09-14: - BeeSting12: - - balance: Deltastation's and Metastation's armory now starts with three riot shotguns! - Fun Police: - - rscdel: Removed some of the free lag. - Kor: - - bugfix: It is possible to multitool the cargo computer circuitboard for contraband - again - ShizCalev: - - bugfix: Holding a potted plant will no longer put you above objects on walls. - - bugfix: Replaced leftover references to loyalty implants with mindshield implants. - ninjanomnom: - - bugfix: Shuttle transit parallax should be working again -2017-09-16: - Basilman: - - rscadd: Gondolas are now procedural generated. - Mey-Ha-Zah: - - imageadd: Updated the knife sprite. - Naksu: - - bugfix: Evidence bags will no longer show ghosts of items such as primed flashbangs - after the flashbang inside explodes - - bugfix: Prevents dead monkeys from fleeing their attackers or escaping His Grace - only to be eaten again - - rscdel: Corgis can no longer be targeted by facehuggers - - rscdel: Removed unused vine floors and their sprite. - Robustin: - - rscadd: Due to budget cuts, airlocks that control access to non-functional maint - rooms and other abandoned areas now have a chance to spawn welded, bolted, screwdrivered, - or flat out replaced by a wall at roundstart. - - bugfix: Dice will now roll when thrown - YPOQ: - - rscadd: Ninja adrenaline boost removes stamina damage - - bugfix: Depowered AIs can no longer use abilities or interact with machinery - - bugfix: The doomsday device will again periodically announce the time until its - activation - - bugfix: Crafting stackable items results in the right stack sizes -2017-09-18: - More Robust Than you: - - balance: Blobbernauts are healed quicker by cores and nodes - Naksu: - - bugfix: OOC for dead people is now (re-)enabled at round-end - - bugfix: Fixed chemfridges being unable to display items with dots in their name - Pubby: - - rscadd: Traitorbro gamemode - Supermichael777: - - bugfix: Airlocks now check metal for upgrades using the standard get_amount() - proc instead of checking the amount var, this means it is compatible with cyborgs. - TungstenOxide: - - tweak: Swapped the action of purchasing a pAI software and subtracting the RAM - from available pool. - Xhuis: - - balance: Brave Bull now increases your max HP by 10, up from 5. - - rscadd: Tequila Sunrise now makes you radiate dim light while it's in your body. - - rscadd: Dwarves are now very resistant to the intense alcohol content of the Manly - Dorf and can freely quaff them without too much worry. - - rscadd: Bloody Mary now restores lost blood. -2017-09-20: - PopNotes: - - imageadd: Airlocks animate faster. This doesn't change the time it takes to pass - through an airlock, but it does visually match up much better so you don't just - appear to glide through the airlock while it's half-open. - Pubby: - - bugfix: Atmos pipenets are less glitchy - TehZombehz: - - rscadd: Several new plushie dolls are now available in toy crates. -2017-09-22: - AutomaticFrenzy: - - bugfix: Mice spawning finds the station z level properly - CPTANT: - - balance: Knockdown and unconcious now let you regenerate stamina damage. - - rscadd: Sleeping regenerates more stamina damage. - Naksu: - - bugfix: Admin ghosts can no longer unintentionally make a mess of things. -2017-09-23: - Armhulen: - - rscadd: Rare Spider Variants have arrived! Every spiderling has a rare chance - of growing up to a rare version of their original spider type! - - rscadd: Special thanks to Onule for the sprites, you're the best! - JJRcop: - - rscadd: Suiciding with a ballistic gun now actually blows your brain out. - More Robust Than You: - - tweak: Taking the beaker out of a cryotube now tries to put it into your hand - - code_imp: Removed some spawn()s from secbot code - - bugfix: Using a soulstone on somebody now transfers your languages to the shade - - bugfix: Zombies now stay dead if they suicide - - rscadd: If a zombie suicides, they now rip their head off! - - bugfix: pAIs now transfer their languages to bots - - bugfix: Support Holoparasites must be manifested to heal - Robustin: - - balance: A zombie's automatic self-healing is stopped for 6 seconds after taking - damage. - - bugfix: Deconverted revs will now always get a message, logs will now include - more details. - YPOQ: - - bugfix: Pet persistence works again -2017-09-27: - Arianya: - - balance: Lesser ash drakes no longer drop ash drake hide when butchered. - GLA Coding: - - tweak: Cells must now be installed in mechs when being constructed, this step - is always before the application of internal armor. - - bugfix: Combat mechs now get stats upgrades from their scanning modules and capacitors - Improvedname: - - rscadd: Adds racial equality to color burgers - More Robust Than You: - - rscadd: Implant Chairs now also support organs - Naksu: - - bugfix: Fixed jump boots breaking if used when you can't jump, such as when inside - a sleeper. - - code_imp: Removed meteor-related free lag. - - bugfix: Syndicate MMIs will now properly transfer their laws to newly-constructed - AIs - Pubby: - - rscadd: Bluespace pipes to atmospherics, which create a single pipenet with all - bluespace pipes in existence. -2017-09-28: - RandomMarine: - - imageadd: Air tanks (o2+n2) now have a different appearance from oxygen tanks. - Robustin: - - tweak: Revheads no longer spawn with chameleon glasses or a spraycan, instead - they will start with a cybernetic security HUD implanted into their eyes. - Xhuis: - - rscadd: Ian has recently communed with unspeakable horrors and may now be warped - by their power if Nar-Sie passes near them. - - rscadd: In order to fight back against their ancient foe Ian, Poly has struck - a bargain with Ratvar and will be transformed into a machine by their presence. - Y0SH1_M4S73R: - - bugfix: AFK players count as dead for the assassinate objective. -2017-09-29: - Kor: - - rscadd: Gunfire can now leave bullet holes/dents in walls. Sprites by JStheguy. - RandomMarine: - - rscadd: You can now light your cigs with people that are on fire. The surgeon - general is spinning in their grave. - Robustin: - - tweak: Hacking a secure container with a multitool now takes longer, but no longer - has a chance to fail. - XDTM: - - rscadd: Nurse spiders can now set a directive that will be seen by their spiderlings, - when they get controlled by a player. - - rscadd: Spiders' actions are now action buttons instead of verbs. - - rscadd: Wrapping stuff in a cocoon is now a targeted action! - kevinz000: - - rscadd: The syndicate have recently begun sending agents to extract vital research - information from Nanotrasen. - - bugfix: 'Timestop fields will now stop thrown objects experimental: Timestops - will now be much quicker to react.' - kingofkosmos: - - spellcheck: You can now find out if an item uses alt-clicking by examining it. -2017-10-07: - Antur: - - bugfix: Liches will no longer lose their spells when reviving. - AnturK: - - rscadd: Wigs are now available in AutoDrobe - Cobby: - - admin: Players will now be notified automatically when an admin resolves their - ahelp. - Cyberboss: - - config: The shuttle may now be configured to be automatically called if the amount - of living crew drops below a certain percentage - - bugfix: Fixed a rare case where creating a one tank bomb would result in a broken - object - - bugfix: Fixed many cases where forced item drops could be avoided by not having - an item in your active hand - DaxDupont: - - rscdel: No more roundstart tips about gangs. You can finally start to forget gangs - ever existed. - Incoming5643: - - bugfix: The rarely utilized secret satchel item persistence system has been fixed - and made more lenient. - - rscadd: 'In case you forgot how it works: if you find or buy secret satchels, - put an item in them, and then bury them under tiles on the station you or someone - else can find them again in a future round with the item still there! Free satchels - can often be found hiding around the station, so get to burying!' - JJRcop: - - config: Hosts can now lock config options with the @ prefix. This prevents admins - from editing the option in-game. - - tweak: Admin volume slider moved to its own menu for better visibility. - Joan: - - bugfix: Fixes Vanguard never stunning for more than 2 seconds. - - balance: Ocular Warden base damage per second changed from 12.5 to 15. - - bugfix: Ocular Wardens no longer count themselves when checking for dense objects, - which decreased their overall damage by 15%. - - balance: Ocular Wardens now only reduce their damage by 10% per dense object, - and only do so once per turf. However, dense turfs now reduce their damage with - the same 10% penalty. - Kerbin-Fiber: - - bugfix: Wood is no longer invisible - Kor: - - rscadd: Nightmares now have mutant hearts and brains, with their own special properties - when consumed or implanted in mobs. Experiment! - - bugfix: You can now tell when someone is in soft crit by examining them. - - rscadd: Nightmares now have a chance to spawn via event. - More Robust Than You: - - bugfix: Fixes cogscarab sprites not updating - - balance: Blobs now take damage from particle accelerators - MrDoomBringer: - - rscadd: Nanotrasen, as part of their new Employee Retention program, has encouraged - more station point-makery by adding the "Cargo Tech of the Shift"! The award - is located in a lockbox in the Quartermaster's locker. - MrStonedOne: - - tweak: The MC will now reduce tick rate during high populations to keep it from - fighting with byond for processing time. - - config: Added config options to control MC tick rate - - admin: Admins can no longer manually control the mc's tick rate by editing the - MC's processing value, instead you will have to edit the config datum's values - for high/low pop tick rates. - Naksu: - - bugfix: Removed some of the free lag - - bugfix: Updates to station name are now reflected on Cargo's stock exchange computers. - - bugfix: Gutlunches will now once again look for gibs to eat. - - bugfix: Bees now come with reduced amounts of free lag - - balance: Pyrosium and cryostylane now react at ludicrous speeds. - - tweak: Made atmos tiny bit faster - - bugfix: Tweaks to atmos performance - Qbopper: - - tweak: Moved a locker blocking an airlock in Toxins maintenance. - RandomMarine: - - bugfix: Simple mobs should no longer experience severe hud/lighting glitches when - reconnecting. - Robustin: - - rscadd: Blood cultists can now create a unique bastard sword at their forge - - rscdel: Blood cultists can no longer obtain a hardsuit from the forge - - bugfix: Emotes (e.g. spinning and flipping) will now properly check for consciousness, - restraints, etc. when appropriate. - - bugfix: The Cult's bastard sword should now properly store souls and create constructs. - - bugfix: Neutering a disease symptom now produces a unique ID that will ensure - the PANDEMIC machine copies it properly. - ShizCalev: - - bugfix: You now have to unbuckle a player PRIOR to shaking them up off a bed or - resin nest. - - bugfix: Wizards will now have the correct name when attacked with Envy's knife! - - soundadd: Space ninja energy katanas now make a swish when drawn! - Supermichael777: - - balance: The detectives gun has been restored from a system change that nerfed - knockdown in general. We need to have a serious discussion about anti revolver - hate in this community. - - tweak: The PDA default font has been switched from "eye bleed" to old-style monospace. - Check your preference. - Thefastfoodguy: - - bugfix: Silicons can no longer take brain damage - - bugfix: Antimatter shielding that can't find a control unit won't delete itself - anymore - WJohnston: - - rscadd: Boxstation and Metastation's white ships now have navigation computers, - letting you move them around in the station, deep space, and derelict z levels. - XDTM: - - rscadd: Added the H.E.C.K. suit, a guaranteed loot frop from Bubblegum. - - rscadd: The H.E.C.K. suit is fully fire (and ash) proof, and has very good melee - armor. - - rscadd: H.E.C.K. suits can also be painted with spraycans, to fully customize - your experience. - - rscadd: Despite spending centuries inside a demon king, H.E.C.K. suits are most - definitely safe. - - bugfix: Fixed a bug where Viral Aggressive Metabolism caused viruses to be cured - instantly. - - bugfix: Fixed a bug where viruses' symptoms would all instantly activate on infection. - - rscadd: The CMO now has an advanced health analyzer in his closet! It can give - more precise readings on the non-standard damage types. - Xhuis: - - bugfix: Runed metal and brass are no longer invisible. - Xhuis and Y0SH1_M4S73R: - - bugfix: Servants of Ratvar now spawn in as the actual race set on their preferences, - with plasmamen getting the gear they need to not immediately die. - Y0SH1_M4S73R: - - balance: Gygax overdrive consumes at least 100 power per step - YPOQ: - - bugfix: Jaunters equipped on the belt slot will save you from chasms again. - kevinz000: - - rscadd: Wormhole event wormholes now actually teleport you. - - bugfix: portals now actually teleport on click. - kingofkosmos: - - rscadd: You can now see construction/deconstruction hints when examining airlocks. - - spellcheck: Beds, chairs, closets, grilles, lattices, catwalks, tables, racks, - floors, plating and bookcases now show hints about constructing/deconstructing - them. - nicbn: - - rscadd: Paperwork now uses Markdown instead of BBCode, see the writing help for - changes. - - imageadd: Changed the drop, throw, pull and resist icons. -2017-10-15: - Armhulen: - - bugfix: Clockwork golems no longer slip and slide on glass! - Armie: - - tweak: Holoparasites are once again in the uplink. - Bawhoppen: - - tweak: Smoke machine board has been moved to tech storage. - DaxDupont: - - tweak: After lobbying by Robust Softdrinks and Getmore Chocolate Corp all vendor - firmware has been changed to add sillicons to their target demographic. - - spellcheck: Replaces instances of "permenant" and "permenantly" with the proper - spelling in several areas, - Epoc: - - rscadd: Added a Toggle Underline button to the PDA menu - - code_imp: Cleaned HTML spacing - Frozenguy5: - - bugfix: C20r damage upped from 20 to 30 (used to be 30 before an ammo cleanup - in the code) - GLACoding: - - bugfix: Syndicate turrets and other machines in walls can now be hit by projectiles - Improvedname: - - rscadd: You can now put custom name and lore on your holy weapon by using a pen - on it! - - tweak: Cmo, captain, and the bartender now get pet collars in their lockers. - Jambread/RemieRichards/Incoming5643: - - server: There is a new system for title music accessible from config/title_music - folder. This system allows for multiple rotating lobby music without bloating - Git as well as map specific lobby music. See the readme.txt in config/title_music - for full details. - - config: The previous method of title music selection, strings/round_start_sounds.txt - has been depreciated by this change. - Kor: - - balance: You can now smash the bulbs out of floodlights rather than having to - entirely destroy the object. - Mercenaryblue: - - rscadd: Use the Clown Stamp on some cardboard to begin... the honkbot! - - rscadd: These honkbots are just adorable, and totally not annoying. I swear! Honk! - - rscadd: You can even slot in a pAI! Just don't emag them... oh boy. oh no. oh - geez. - - soundadd: Honkbots now release an evil laugh when emagged. - - imageadd: added some in_hands for banana peels. - - tweak: Golden Bike Horns now permit its victims to perform a full flip before - forcing them to jump again. - More Robust Than You: - - bugfix: Makes the santa event properly poll ghosts - - bugfix: Diseases will now cure if species is changed - - tweak: You can now drag-drop people into open DNA scanners - - bugfix: Medibots will no longer inject people in lockers/sleepers/etc - Naksu: - - bugfix: Fixes to door/airlock deletion routines. - - bugfix: Traitor pen uplinks now preferentially spawn in the PDA pen, and not in - a pocket protector full of pens that no-one checks. - - bugfix: Reusable projectiles such as foam darts no longer get deleted if they're - shot at a shooting range target or a cardboard cutout. - - bugfix: Ghosts no longer inherit the movement delay of their former bodies. - - bugfix: Fixed mobs being able to smash shocked objects without taking damage. - - bugfix: Fixed some mobs not deleting correctly - - code_imp: Fixed dusting code, supermatter-suicides no longer spam the runtime - logs. - - code_imp: Fixed some initialize paths. - Onule: - - tweak: Sunflower sprites were changed, small edits to variants. - - imageadd: Sunflower and variant's inhands sprites. - - imageadd: Tweaked growing sprites to match the new sunflower. - - imageadd: Moonflower and novaflowers now have slightly different growing sprites. - Robustin: - - rscadd: The Chemistry Smoke Machine! Chemist offices will have a board available - should they choose to construct a smoke machine. The smoke machine will regularly - produce smoke from whatever chemicals have been inserted into the machine. Designs - for the circuitboard are also available at RND. - - tweak: Abandoned Airlocks will no longer be deleted when their turf is changed - to a wall. - - tweak: Tesla movement is now completely random. - - bugfix: Clock Cult mode will no longer end if all the cultists die. The round - will not end until the Ark is destroyed or completed. - - bugfix: Chain reactions between explosives will now properly trigger explosives - located in an individual's bag. - - tweak: The wrench-anchoring time of the smoke machine is now doubled to 4 seconds. - - tweak: Smoke Machine smoke is now transparent. - - rscadd: The smoke machine has taken its rightful place in the chemist's office. - - bugfix: Smoke machine will no longer operate while moving/unanchored. - ShizCalev: - - tweak: Nanotrasen brand "Box" model stations have received approval from CentCom - to be retrofitted with the latest in Xenobiology equipment. You will now find - a chemmaster, a chemical dispenser, and a dropper within the Research Division's - Xenobiology lab. - - bugfix: C4 will no longer appear underneath objects on walls. - - bugfix: Plastic explosives will no longer be invisible after being planted. - - imageadd: The security bombsuit's sprite has been updated! - SpaceManiac: - - spellcheck: Grammar when examining objects has been improved. - - bugfix: AI eye camera static is now correctly positioned on Lavaland. - - spellcheck: Fixed many instances of "the the" when interacting with objects. - - bugfix: The tracking implant locator now works on the station again. - WJohn: - - rscadd: An old cruiser class vessel has resiliently stuck around, and may do so - for the foreseeable future. - WJohnston: - - tweak: Due to age, the abandoned ship's engines are now considerably slower when - bringing it place to place. This does however mean that the ship now has a more - gradual takeoff, with no sudden jolt to knock passengers off their feet. - - imageadd: Black carpets no longer have an ugly periodic black line in them. Regular - catwalks are now totally opaque so you won't accidentally click on space when - trying to place wires or tiles on them. - - rscdel: Boxstation's guitar white ship is no more. - - rscadd: Metastation's white ship stands in its place! - - tweak: Metastation's white ship has a couple of weak laser turrets to protect - the cockpit from space carp. - - tweak: Boxstation and metastation now have some plating under the grilles near - the AI sat's transit tube to prevent players from deleting the tube by landing - there. - WJohnston & ninjanomnom: - - rscadd: Plastitanium walls smooth, fancier syndicate shuttles! - - bugfix: Infiltrator shuttles have been moved out of the station maps and made - into a multi-area shuttle. - - balance: Titanium and plastitanium have explosion resistance (requested by Wjohn) - XDTM: - - rscadd: Blood and vomit pools can now spread the diseases of the mob that made - them! Cover your feet properly to avoid infection. - - rscadd: Virus severity now changes the color of the disease HUD icon, scaling - from green to red to flashing black-red. - - tweak: Contact-based diseases no longer spread by simply standing near other people; - it requires interaction like touching or attacking. Bumping against people/swapping - with help intent still counts as touching. - - tweak: Advanced viruses now have another infection type, "Fluids"; it's between - blood and skin contact, and will only be transmitted through fluid contact. - - rscdel: Two "hidden" infection types have been removed. Overall this means that - making a virus airborne is a little bit easier. - - bugfix: Species who cannot breathe can no longer be infected by breathing. - - bugfix: Internals now properly work if set to 0 pressure, and will prevent breathing - gas from the external atmosphere. - - bugfix: Viral Aggressive Metabolism is now properly inactive when neutered. - Xhuis: - - tweak: Cogscarabs can now experiment more freely with base design during non-clockcult - rounds with infinite power and the ability to recite scripture! - - bugfix: The Ark of the Clockwork Justiciar is now registered as a hostile environment. - - refactor: Clockwork scripture now has one progress bar for the entire recital - instead of multiple ones for each sentence in the invocation. - - bugfix: Ocular wardens no longer have a burning hatred for revenants and won't - attack their corpse endlessly anymore. - - balance: Stargazers can no longer be built off-station, even in new areas. - - balance: Integration cogs no longer emit sounds and steam visuals when active. - armie: - - bugfix: mob spawners are no longer possessable - deathride58: - - rscadd: '*slap' - duncathan: - - bugfix: Scrubbers and filters no longer allow for infinite pressure in pipes. - improvedname: - - bugfix: 9mm doesn't longer appear in traitor surplus crates - kevinz000: - - bugfix: 'Flightsuits now allow proper pulling experimental: Moved now has an argument - for if it was a regular Move or a forceMove.' - - rscadd: Instead of dumb sleep()s, follow trails now use SSfastprocess for processing! - - rscadd: Mobs now float while flying automatically! - - rscdel: 'Flightsuits can no longer be safely shut off if you''re still barreling - down the hallway. experimental: Flightsuits should be less shitcode. Hope this - PR doesn''t blow anything important up!' - - bugfix: Fixed trying to clear beaker in pandemic when the beaker is already removed - causing a runtime. - kingofkosmos: - - rscadd: Alt-clicking on a computer now ejects the ID card inside it. - nicbn: - - tweak: You can now clear bullet holes in walls using a welding tool. - ninjanomnom: - - refactor: Radiation has been completely overhauled. - - rscadd: A new radiation subsystem and spreading mechanics. - - rscadd: Walls and other dense objects insulate you from radiation. - - rscadd: Geiger counters now store the last burst of radiation so you can view - it at your leisure or show it to someone. Examine it. - - rscadd: Geiger counters can check mobs for contaminated objects. Scan yourself - before you leave to make sure you aren't carrying dangerous radioactive items. - - soundadd: Geiger counters have realistic sounds and the radiation pulse spam in - chat has been replaced. - - balance: Radiation is more deadly and causes burns at high intensities, WEAR YOUR - RADSUITS. - - balance: However residue radiation is far slower acting and kills you with toxin. - - balance: Engineering holosigns have a light amount of radiation insulation. - - balance: Rad collectors are nerfed. No more supercharging with pressurized plasma. - No more collector spam either. - - balance: Engine output is a lot more stable as a result of collector changes. - - balance: Monkeys need more rads and take more time to turn into gorillas. - - tweak: Over 100% on the DNA computer means your subject is now taking damage. - - tweak: The asteroid escape shuttle has no stabilizers and throws you around when - it moves - - bugfix: Shuttles no longer rotate ghosts of players who prefer directionless sprites - - bugfix: 2 Years later and cameras work on shuttles now, probably. - - bugfix: Buckled mobs when on a rotating shuttle should now rotate correctly - - bugfix: Fixes shuttles gibbing in supposedly safe areas - - bugfix: Mobs that didn't move during shuttle launch would not have their parallax - updated. This is fixed now. - - bugfix: The custom shuttle placement highlight now works for multi area shuttles. - - bugfix: Directional windows shouldn't leak air anymore - - tweak: Windows only block air while anchored - - bugfix: Fixes camera mobs being considered a target by radiation - - bugfix: Cables can no longer be contaminated as well - - balance: Buffs radiation cleansing chems - - balance: Toxin damage per tick from radiation is halved - - admin: Contaminated objects keep track of what contaminated them - - admin: Radiation pulses over 3000 are logged now - spessmenart: - - imageadd: The captains sabre no longer looks like a rapier. -2017-10-17: - DaxDupont: - - bugfix: 'Fancy boxes(ie: donut boxes) now show the proper content amount in the - sprite and no longer go invisible when empty.' - Mercenaryblue: - - bugfix: when decapitated, banana-flavored cream no longer hovers where your head - used to be. - More Robust Than You: - - rscadd: EI NATH! now causes a flash of light - Naksu: - - bugfix: Pinned notes will now show up on vault, abductor, centcom and large glass - airlocks. - - spellcheck: Removed a misleading message when handling full stacks of sheets. - - bugfix: Pre-filled glass bottles (uplink, medbay, botany) will now give visual - feedback about how much stuff is left inside, and the color of contents will - match an empty bottle being filled with the same reagent. - - bugfix: Player-controlled "neutral" mobs such as minebots are now considered valid - targets by clock cult's ocular wardens. - Xhuis: - - bugfix: Cogged APCs can now be correctly unlocked with an ID card. - duncathan: - - tweak: Portable air pumps can output to a maximum of 25 atmospheres. - kevinz000: - - refactor: Legacy projectiles have been removed. Instead, all projectiles are now - PIXEL PROJECTILES! - - rscadd: Reflectors can now be at any angle you want. Alt click them to set angle! - - rscadd: Pipes can now be layered up to 3 layers. -2017-10-18: - DaxDupont: - - bugfix: Fixes automatic fire on guns. - Gun Hog: - - bugfix: The GPS item now correctly changes its name when the GPS tag is changed. - Improvedname: - - tweak: Reverts katana's to its orginal size being huge - Mercenaryblue: - - balance: it should be far easier to clean out your face from multiple cream pies. - More Robust Than You: - - tweak: People that are burning slightly less will appear to be burning... slightly - less. - Robustin: - - bugfix: The smoke machine now properly generates transparent smoke, transmits - chemicals, and displays the proper icons. - ShizCalev: - - tweak: You can no longer build reinforced floors directly on top of dirt, asteroid - sand, ice, or beaches. You'll have to first construct flooring on top of it - instead. - - bugfix: Corrected mapping issues introduced with the latest SM engine/radiation - update across all relevant maps. - - bugfix: The tools on the Caravan Ambush space ruin have had their speeds corrected. - - bugfix: Slappers will no longer appear as a latex balloon in your hand. - - bugfix: Renault now has a comfy new bed on Metastation! - - tweak: Engineering cyborgs now have access to geiger counters. - Xhuis: - - bugfix: You can no longer pick up brass chairs. - Y0SH1_M4S73R: - - bugfix: Disabling leg actuators sets the power drain per step to the correct value. - duncathan: - - bugfix: Filters no longer stop passing any gas through if the filtered output - is full. - ninjanomnom: - - rscadd: You can vomit blood at high enough radiation. - - balance: Radiation knockdown is far far shorter. - - balance: Genetics modification is less harmful but still, upgrade your machines. - - balance: Pentetic acid is useless for low amounts of radiation but indispensable - for high amounts now. - - balance: Singularity radiation has been normalized and Pubby engine has been remapped. - - bugfix: No more hair loss spam - - bugfix: Mob rad contamination has been disabled for now. Regular contamination - is still a thing. - - bugfix: Fixed turfs not rotating - - bugfix: Fixed stealing structures you shouldn't be moving -2017-10-19: - Kor: - - rscadd: Blob is now a side antagonist. - - rscadd: Event and admin blobs will now be able to choose their spawn location. - - rscadd: Blob can now win in any mode by gaining enough tiles to reach Critical - Mass. - - rscadd: Blobs that have Critical Mass have unlimited points, and a minute after - achieving critical mass, they will spread to every tile on station, killing - anyone still on board and ending the round. - - rscadd: Using an analyzer on a blob will now reveal its progress towards Critical - Mass. - - rscadd: The blob event is now more common. - Mercenaryblue: - - tweak: You will no longer trip on inactive honkbots. - - bugfix: Sentient Honkbots are no longer forced to speak when somebody trip on - them. - Naksu: - - bugfix: Manned turrets stop firing when there's no-one in the turret shooting. - - refactor: 'mobs will enter a deep power-saving state when there''s not much to - do except wander around. change: bees are slightly more passive in general' - deathride58: - - tweak: You can now press Ctrl+H to stop pulling, or simply H to stop pulling if - you're in hotkey mode. - ninjanomnom: - - rscadd: Engineering scanner goggles have a radiation mode now - - rscadd: Objects placed under showers are cleansed of radioactive contamination - over a short time. - - soundadd: Showers make sound now. - oranges: - - rscdel: Removed the bluespace pipe -2017-10-20: - Kor: - - rscadd: You can now select your Halloween race, rather than having it assigned - randomly via event. - Robustin: - - bugfix: Fixed a bug where detonating maxcaps, especially multiple maxcaps, on - Reebe guaranteed that everyone would die and thus the Clock Cult would immediately - lose; Reebe maxcap is now 2/5/10. - ShizCalev: - - bugfix: All reflector prisms/mirrors have had their angles corrected. - - tweak: Remains left over by dusting or soul-stoning a mob are now dissoluble with - acid. - - tweak: Changelings using biodegrade to escape restraints will now leave a pile - of goop. - - bugfix: Fixed messages related to changelings using biodegrade not appearing. -2017-10-21: - More Robust Than You: - - bugfix: Heads of staff will now have cat organs removed at roundstart - Robustin: - - balance: Spray tan no longer stuns when ingested. - Thunder12345: - - bugfix: Sentient cats no longer forget to fall over when they die -2017-10-22: - More Robust Than You: - - bugfix: Blood Brother now properly shows up in player panel - Naksu: - - server: Paper bins no longer let server admins know that pens were eaten. - - code_imp: Removed dangling mob references to last attacker/attacked - Robustin: - - balance: Medical biosuits (and hardsuits) now offer heavy, but not complete, radiation - resistance. - ninjanomnom: - - bugfix: Contents of silicon mobs are no longer considered for targets of radiation. - This blocks them from being contaminated. -2017-10-24: - Armhulen: - - rscadd: Wizards may now shapeshift into viper spiders. - Improvedname: - - tweak: Blacklists holoparasite's from surplus crates - Kor: - - rscadd: Added dullahans, which will be available from the character set up menu - during the Halloween event. - - bugfix: Severed heads will no longer appear bald. - More Robust Than You: - - bugfix: Fixes champrojector camera bugs - Naksu: - - bugfix: Grinders will now grind grown items like cocoa pods again - - code_imp: Cameras no longer keep hard references to mobs in their motion tracking - list. - ShizCalev: - - bugfix: Creatures made via gold slime cores will now be given the proper name - of their master. - deathride58: - - tweak: Deltastation's armory now contains reinforced windows surrounding the lethal - weaponry. This makes Delta's armory consistent with Box. - - tweak: There are now decals in places where extra Security lockers can spawn. - - tweak: Cleaned up semicolons in Meta and Boxstation's .dmms -2017-10-25: - Cruix: - - rscadd: Shuttle navigation computers can now place new transit locations over - the shuttle's current position. - JJRcop: - - rscadd: The heart of darkness revives you as a shadowperson if you aren't one - already. - ShizCalev: - - bugfix: Shades will no longer always hear a heartbeat. - - bugfix: Golem abilities will now be start on cooldown when they are made. -2017-10-26: - Kor and JJRcop: - - rscadd: Added vampires. They will be available as a roundstart race during the - Halloween holiday event. - ShizCalev: - - bugfix: Reflectors will no longer drop more materials than they took to make when - deconstructed. - - bugfix: You will no longer be prompted to reenter your body while being defibbed - if you can't actually be revived. - - bugfix: You can no longer teleport past the ticket stands of the Luxury Emergency - Shuttle. - - bugfix: Lightgeists can now -actually- be spawned with gold slime cores. - - tweak: The Staff of Change will now randomly assign a cyborg module when transforming - a mob into a cyborg. - Xhuis: - - balance: Clockwork marauders now move more slowly below 40% health. - - balance: Instead of a 40% chance (or more) chance to block projectiles, clockwork - marauders now have three fixed 100% blocks; after using those three, they cannot - block anymore without avoiding projectiles for ten seconds. This number increases - to four if war is declared. - - balance: Projectiles that deal no damage DO reduce marauders' shield health. Use - disabler shots to open them up, then use lasers to go for the kill! - - bugfix: Cogscarab shells and marauder armor now appear in the spawners menu. - - bugfix: You can no longer stack infinitely many stargazers on one tile. - nicbn: - - imageadd: Chemical heater and smoke machine resprited. - ninjanomnom: - - soundadd: Portable generators have a sound while active. - - soundadd: The supermatter has a sound that scales with stored energy. - ninjanomnom & Wjohn: - - bugfix: Cable cuffs now inherit the color of the cables used to make them. - - bugfix: Split cable stacks keep their color. - - tweak: The blue cable color is now a better blue. -2017-10-27: - Anonmare: - - rscadd: Adds new grindables - JamieH: - - rscadd: Buildmode map generators will now show you a preview of the area you're - changing - - rscadd: Buildmode map generators will now ask before nuking the map - - bugfix: Buildmode map generator corners can now only be set by left clicking - Kor: - - rscadd: Cloth golems will be available as a roundstart race during Halloween. - MrStonedOne: - - code_imp: Created a system to profile code on a line by line basis and return - detailed info about how much time was spent (in milliseconds) on each line(s). - Xhuis: - - balance: Servants can no longer teleport into the gravity generator, EVA, or telecomms. - ninjanomnom: - - bugfix: Hardsuit helmets work like geiger counters for the user. - - code_imp: Radiation should perform a little better in places. - - balance: Various radiation symptom thresholds have been tweaked. - - balance: Contamination strengths at different ranges have been tweaked. - - balance: Contaminated objects have less range for their radiation. - - balance: Hitting something with a contaminated object reduces its strength faster. - - balance: Contaminated objects decay faster. - - balance: Both radiation healing medicines have been buffed a bit. - - balance: Passive radiation loss for mobs is nerfed. - - balance: There is a soft cap for mob radiation now. - - balance: Projectiles, ammo casings, and implants are disallowed from becoming - contaminated. - - rscadd: Suit storage units can completely cleanse contamination from stored objects - - admin: The first time an object is contaminated enough to spread more contamination - admins will be warned. This is also added to stat tracking. - - rscadd: Thermite works on floors and can be ignited by sufficiently hot fires - now - - refactor: Thermite has been made into a component - - bugfix: Thermite no longer removes existing overlays on turfs -2017-10-28: - Mark9013100: - - tweak: The Medical Cloning manual has been updated. -2017-10-29: - Armhulen: - - rscadd: Frost Spiders now use Frost OIL! - Mercenaryblue: - - rscadd: Skeletons can now have their own spectral instruments - - rscadd: \[Dooting Intensifies\] - - admin: the variable "too_spooky" defines if it will spawn new instruments, by - default TRUE. - Naksu: - - bugfix: Removed meteor-related free lag - - bugfix: Cleaned up dangling mob references from alerts - Xhuis: - - bugfix: You can no longer become an enhanced clockwork golem with mutation toxin. - - balance: Normal clockwork golems now have 20% armor, down from 40%. - as334: - - spellcheck: This changelog has been updated and so read it again if you are interested - in doing assmos. - - rscadd: Atmospherics has been massively expanded including new gases. - - rscadd: These new gases include Brown Gas, Pluoxium, Stimulum, Hyper-Noblium and - Tritium. - - rscadd: Brown Gas is acidic to breath, but mildly stimulation. - - rscadd: Stimulum is more stimulating and much safer. - - rscadd: Pluoxium is a non-reactive form of oxygen that delivers more oxygen into - the bloodstream. - - rscadd: Hyper-Noblium is an extremely noble gas, and stops gases from reacting. - - rscadd: Tritium is radioactive and flammable. - - rscadd: New reactions have also been added to create these gases. - - rscadd: 'Tritium formation: Heat large amounts of oxygen with plasma. Make sure - you have a filter ready and setup!' - - rscadd: Fusion has been reintroduced. Plasma will fuse when heated to a high thermal - energy with Tritium as a catalyst. Make sure to manage the waste products. - - rscadd: 'Brown Gas formation: Heat Oxygen and Nitrogen.' - - rscadd: 'BZ fixation: Heat Tritium and Plasma.' - - rscadd: 'Stimulum formation: Heated Tritium, Plasma, BZ and Brown Gas.' - - rscadd: 'Hyper-Noblium condensation: Needs Nitrogen and Tritium at a super high - heat. Cools rapidly.' - - rscadd: Pluoxium is unable to be formed. - - rscdel: Freon has been removed. Use cold nitrogen for your SME problems now. - - rscadd: Water vapor now freezes the tile it is on when it is cooled heavily. - naltronix: - - bugfix: fixes that table that wasnt accessible in Metastation -2017-10-30: - PKPenguin321: - - tweak: You can now use beakers/cups/etc that have welding fuel in them on welders - to refuel them. - bgobandit: - - tweak: 'Due to cuts to Nanotrasen''s Occupational Safety and Health Administration - (NO-SHA) budget, station fixtures no longer undergo as much safety testing. - (Translation for rank and file staff: More objects on the station will hurt - you.)' -2017-11-02: - ACCount: - - tweak: '"Tail removal" and "tail attachment" surgeries are merged with "organ - manipulation".' - - imageadd: New sprites for reflectors. They finally look like something. - - rscadd: You can lock reflector's rotation by using a screwdriver. Use the screwdriver - again to unlock it. - - rscadd: Reflector examine now shows the current angle and rotation lock status. - - rscadd: You can now use a welder to repair damaged reflectors. - - bugfix: Multiple reflector bugs are fixed. - Improvedname: - - rscdel: Removes statues from gold slime pool - Mercenaryblue: - - imageadd: Updated Clown Box sprite to match the others. - More Robust Than You: - - admin: ONLY ADMINS CAN ACTIVATE THE ARK NOW - - tweak: The Ark's time measurements are now a bit more readable - MrStonedOne: - - tweak: Meteor events will not happen before 25 minutes, the worst versions before - 35 and 45 minutes. - - tweak: Meteor events are now player gated to 15, 20, and 25 players respectively - - balance: The more destructive versions of meteor events now have a slightly higher - chance of triggering, to offset the decrease in how often it is that they will - even qualify. - - bugfix: Fixed the changelog generator. - Naksu: - - tweak: Smartfridges and chem/condimasters now output items in a deterministic - 3x3 grid rather than in a huge pile in the middle of the tile. - SpaceManiac: - - bugfix: Admins can once again spawn nuke teams on demand. - Xhuis: - - admin: Admins can now create sound emitters (/obj/effect/sound_emitter) that can - be customized to play sounds to different people, at different volumes, and - at different locations such as by z-level. They're much more versatile for events - than the Play Sound commands! - - rscadd: You can now add grenades to plushies! You'll need to cut out the stuffing - first. - - tweak: Clockwork cult tips of the round have been updated to match the rework. - - tweak: Abscond and Reebe rifts now place servants directly at the Ark instead - of below the "base" area. - nicbn: - - tweak: Brown gas renamed to nitryl. - ninjanomnom: - - bugfix: Fixes decals not rotating correctly with the turf. - - bugfix: Fixes a runtime causing some turfs to be left behind by removed shuttles. - - code_imp: Shuttles should be roughly 40-50% smoother. - - bugfix: Fixes the cargo shuttle occasionally breaking if a mob got on at exactly - the right time. -2017-11-10: - Anonmare: - - bugfix: Adds an organ storage bag to the syndicate medborg. - AnturK: - - balance: Dying in shapeshifted form reverts you to the original one. (You're still - dead) - Floyd / Qustinnus: - - soundadd: Redtexting as a traitor now plays a depressing tune to you - Floyd / Qustinnus (And all the sounds by Kayozz11 from Yogstation): - - soundadd: Adds about 30 new ambience sounds - - refactor: added new defines for ambience lists. - Iamgoofball: - - tweak: Cooldown on the Ripley's mining drills has been halved. - - tweak: The frequency of the Ripley's ore pulse has been doubled. - Jalleo: - - tweak: Removed a variable to state which RCD's can deconstruct reinforced walls - - balance: Made combat (ERT ones) and admin RCDs able to deconstruct r walls alongside - borg ones - Kor: - - bugfix: Cult mode will once again print out names at round end. - Mark9013100: - - rscadd: Deltastation now has a Whiteship. - - tweak: Charcoal bottles have been renamed, and have been given a more informative - description. - Mercenaryblue: - - spellcheck: spellchecked the hotel staff. - - rscadd: Added frog masks. Reeeeeeeeee!! - More Robust Than You: - - bugfix: Blobbernauts and spores are no longer killed by blob victory - - bugfix: New blob overminds off the station Z level are moved to the station - - bugfix: You can now use banhammers as a weapon - - tweak: Monkeys can no longer transmit diseases through hardsuits - - tweak: Xenobio blobbernauts can no longer walk on blob tiles - Naksu: - - tweak: Added deterministic output slots to the slime processor - - bugfix: Fixed some interactions with ghosts and items - - bugfix: Nonhumans such as monkeys can now be scanned for chemicals with the health - analyzer. - Okand37 (DeltaStation Updates): - - rscadd: Tweaked Atmospherics - - bugfix: Fixed the Incinerator air injector - - rscadd: Tweaked Engineering - - rscadd: Added logs to the Chaplain's closet for gimmicks (bonfires) - - rscadd: Tweaked Security - - bugfix: Fixed medical morgue maintenance not providing radiation shielding and - exterior chemistry windoor - - rscadd: Bar now has a door from the backroom to the theatre stage - - rscadd: Tweaked Locker Room/Dormitories - ShizCalev: - - bugfix: You can now -actually- load pie cannons. - - bugfix: The captain's winter coat can now hold a flashlight. - - bugfix: The captain's and security winter coats can now hold internals tanks. - - tweak: All winter coats can now hold toys, lighters, and cigarettes. - - tweak: The captain's hardsuit can now hold pepperspray. - - rscadd: Updated the Test Map debugging verb to report more issues regarding APCs. - DELTASTATION - - bugfix: Reverted Okand37's morgue changes which broke power in the area. - - bugfix: Corrected wrong area on the Southern airlock leading into electrical maintenance. - ALL STATIONS - - bugfix: Corrected numerous duplicate APCs in areas which led to power issues. - SpaceManiac: - - bugfix: Ghosts can no longer create sparks from the hand teleporter's portals. - - bugfix: Digging on Lavaland no longer shows two progress bars. - - bugfix: The holodeck now has an "Offline" option. - - bugfix: Injury and crit overlays are now scaled properly for zoomed-out views. - - bugfix: Already-downloaded software is now hidden from the NTNet software downloader. - - bugfix: The crafting, language, and building buttons are now positioned correctly - in zoomed-out views. - - bugfix: Bluespace shelter walls no longer smooth with non-shelter walls and windows. - Swindly: - - rscadd: Organ storage bags can be used to perform limb augmentation. - - bugfix: You can now cancel a cavity implant during the implanting/removing step - by using drapes while holding the appropriate tool in your inactive hand. Cyborgs - can cancel the surgery by using drapes alone. - - bugfix: Fixed hot items and fire heating reagents to temperatures higher than - their heat source. - - bugfix: Sprays can now be heated with hot items. - - tweak: The heating of reagents by hot items, fire, and microwaves now scales linearly - with the difference between the reagent holder's temperature and the heat source's - temperature instead of constantly. - - tweak: The body temperature of a mob with reagents is affected by the temperature - of the mob's reagents. - - tweak: Reagent containers can now be heated by hot air. - Thefastfoodguy: - - bugfix: Spamming runes / battlecries / etc will no longer trigger spam prevention - WJohnston: - - bugfix: Ancient station lighting fixed on beta side (medical and atmos remains) - XDTM: - - rscadd: Ghosts now have a Toggle Health Scan verb, which allows them to health - scan mobs they click on. - Xhuis: - - rscadd: Ratvar and Nar-Sie plushes now have a unique interaction. - - balance: Clockwork marauders are now on harm intent. - - balance: The Clockwork Marauder scripture now takes five seconds longer to invoke - per marauder summoned in the last 20 seconds, capping at 30 extra seconds. - - balance: Clockwork marauders no longer gain a health bonus when war is declared. - - tweak: Moved the BoxStation deep fryers up one tile. - - rscadd: Microwaves have new sounds! - YPOQ: - - bugfix: EMPs can pulse multiple wires - as334: - - rscadd: Pluoxium can now be formed by irradiating tiles with CO2 in the air. - - rscadd: Rad collectors now steadily form Tritium at a slow pace. - - balance: Nerfs fusion by making it slower, and produce radioactivity. - - balance: Noblium formation now requires significantly more energy input. - - balance: Tanks now melt if their temperature is above 1 Million Kelvin. - deathride58: - - bugfix: Directional character icon previews now function properly. Other things - relying on getflaticon probably work with directional icons again, as well. - nicbn: - - imageadd: Canister sprites for the new gases - ninjanomnom: - - bugfix: Shuttle parallax has been fixed once more - - bugfix: You can no longer set up the auxiliary base's shuttle beacon overlapping - with the edge of the map - uraniummeltdown: - - tweak: Replica fabricatoring airlocks and windoors keeps the old name - - tweak: Narsie and Ratvar converting airlocks and windoors keeps the old name -2017-11-11: - DaxDupont: - - bugfix: Medbots can inject from one tile away again. - SpaceManiac: - - bugfix: The detective and heads of staff are no longer attacked by portable turrets. - deathride58: - - bugfix: You can no longer delete girders, lattices, or catwalks with the RPD - - bugfix: Fixes runtimes that occur when clicking girders, lattices, catwalks, or - disposal pipes with the RPD in paint mode - ninjanomnom: - - bugfix: Fixes ruin cable spawning and probably some other bugs -2017-11-12: - Cyberboss: - - bugfix: Clockwork slabs no longer refer to components -2017-11-13: - Cobby: - - rscadd: The Xray now only hits the first mob it comes into contact with instead - of being outright removed from the game. - Floyd / Qustinnus: - - soundadd: Reebe now has ambience sounds - 'Floyd / Qustinnus:': - - soundadd: Adds a few sound_loop datums to machinery. - Frozenguy5: - - bugfix: Broken cable cuffs no longer has an invisible sprite. - PKPenguin321: - - rscadd: Welders must now be screwdrivered open to reveal their fuel tank. - - rscadd: You can empty welders into open containers (like beakers or glasses) when - they're screwdrivered open. - - rscadd: You can now insert any chemical into a welder, but all most will do is - clog the fuel. Welding fuel will refuel it as usual. Plasma in welders tends - to explode. - Qbopper and JJRcop: - - tweak: The default internet sound volume was changed from 100 to 25. Stop complaining - in OOC about your ears! - SpaceManiac: - - bugfix: Posters may no longer be placed on diagonal wall corners. - WJohnston: - - rscdel: Removes stationary docking ports for syndicate infiltrator ships on all - maps. Use the docking navigator computer instead! This gives the white ship - and syndicate infiltrator more room to navigate and place custom locations that - are otherwise occupied by fixed shuttle landing zones that are rarely used. - Xhuis: - - rscadd: Deep fryers now have sound. - - tweak: Deep fryers now use cooking oil, a specialized reagent that becomes highly - damaging at high temperatures. You can get it from grinding soybeans and meat. - - tweak: Deep fryers now become more efficient with higher-level micro lasers, using - less oil and frying faster. - - tweak: Deep fryers now slowly use oil as it fries objects, instead of all at once. - - bugfix: You can now correctly refill deep fryers with syringes and pills. - nicn: - - balance: Damage from low pressure has been doubled. - ninjanomnom: - - rscadd: You can now select a nearby area to expand when using a blueprint instead - of making a new area. - - rscadd: New shuttle areas can be created using blueprints. This is currently not - useful but will be used later for shuttle construction. - - tweak: Blueprints can modify existing areas on station. - - admin: Blueprint functionality has been added to the debug tab as a verb. -2017-11-14: - ike709: - - imageadd: Added directional computer sprites. Maps haven't been changed yet. - psykzz: - - refactor: AI Airlock UI to use TGUI - - tweak: Allow AI to swap between electrified door states without having to un-electrify - first. - selea/arsserpentarium: - - rscadd: Integrated circuits have been added to Research! - - rscadd: You can use these to create devices with very complex behaviors. - - rscadd: Research the Integrated circuits printer to get started. -2017-11-15: - Fury: - - rscadd: Added new sprites for the Heirophant Relay (clock cultist telecomms equipment). - Naksu: - - bugfix: 'Removed fire-related free lag. change: fire alarms and cameras no longer - work after being ripped off a wall by a singulo' - - tweak: 'Minor speedups to movement processing. change: Fat mobs no longer gain - temperature by running.' - Robustin: - - refactor: Cult population scaling no longer operates on arbitrary breakpoints. - Each additional player between the between the breakpoints will add to the "chance" - that an additional cultist will spawn. - - tweak: On average you will see less roundstart cultists in lowpop and more roundstart - cultists in highpop. - - tweak: Damage examinations now include a "moderate" classification. Before minor - was <30 and severe was anything 30 or above. Now minor is <25, moderate is 25 - to <50, and severe is 50+. - - tweak: The tesla will now move toward power beacons at a significantly slower - rate. - SpaceManiac: - - bugfix: The post-round station integrity report is now functional again. - ninjanomnom: - - bugfix: Gas overlays no longer block clicks, on 512 -2017-11-22: - ACCount: - - refactor: Old integrated circuit save file format is ditched in favor of JSON. - Readability, both of save files and save code, is improved greatly. - - tweak: Integrated circuit panels now open with screwdriver instead of crowbar, - to match every single other thing on this server. - - tweak: Integrated circuit printer now stores up to 25 metal sheets. - - bugfix: Fixed integrated circuit rechargers not recharging guns properly and not - updating icons. - - bugfix: Fixed multiple bugs in integrated circuits UIs, improved overall usability. - Anonmare: - - balance: Laserpoitners now incapcitate catpeople - AutomaticFrenzy: - - bugfix: cell chargers weren't animating properly - - bugfix: disable_warning wasn't getting checked and the chat was being spammed - Code by Pyko, Ported by Frozenguy5: - - rscadd: Rat Kebabs and Double Rat Kebabs have been added! - Cyberboss: - - server: Server tools API changed to version 3.2.0.1 - - admin: '"ahelp" chat command can now accept a ticket number as opposed to a ckey' - DaxDupont: - - tweak: CentCom has issued a firmware updated for the operating computers. It is - no longer needed to manually refresh the procedure and patient status. - - bugfix: Proximity sensors no longer beep when unarmed. - - bugfix: Plant trays will now properly process fluorine and adjust toxins and water - contents. - Francinum: - - tweak: The shuttle build plate is now better sized for all stations. - Iamgoofball: - - spellcheck: fixes grammar on logic gate descriptions - - spellcheck: fixes grammar on list circuits - - bugfix: fixes grammar on trig circuits - - spellcheck: fixed grammar on output circuits - JJRcop: - - bugfix: Fixes changeling eggs not putting the changeling in control if the brainslug - is destroyed before hatching. - - tweak: The silicon airlock menu looks a little more like it used to. - Kor: - - bugfix: Blobbernauts will no longer spawn if a player is not selected to control - it, preventing AI blobbernauts from running off the blob and to their deaths. - - rscdel: Following complaints that cargo has been selling all the materials they - receive rather than distributing them, mineral exporting has been removed. - MMMiracles: - - balance: Power regen on the regular tesla relay has been reduced to 50, from 150. - Naksu: - - bugfix: Sped up saycode to remove free lag from highpop - - bugfix: Using a chameleon projector will now dismount you from any vehicles you - are riding, in order to prevent wacky space glitches and being sent to a realm - outside space and time. - Shadowlight213: - - code_imp: Added round id to the status world topic - ShizCalev: - - bugfix: Chameleon goggles will no longer go invisible when selecting Optical Tray - scanners. - - rscadd: Engineering and Atmos scanner goggles will now have correctly colored - inhand sprites. - - tweak: The computers on all maps have have been updated for the latest directional - sprite changes. Please report any computers facing in strange directions to - your nearest mapper. - - bugfix: MetaStation - The consoles in medbay have had their directions corrected. - - imageadd: The Nanotrasen logo on modular computers has been fixed, rejoice! - - bugfix: PubbyStation - Unpowered air injectors in various locations have been - fixed. - - bugfix: MetaStation - Air injector leading out of the incinerator has been fixed - - bugfix: MetaStation - Corrected a couple maintenance airlocks being powered by - the wrong areas. - - bugfix: Computers will no longer rotate incorrectly when being deconstructed. - - bugfix: You can now rotate computer frames during construction. - - bugfix: Chairs, PA parts, infrared emitters, and doppler arrays will now rotate - clockwise. - - bugfix: Throwing drinking glasses and cartons will now consistently cause them - to break! - - bugfix: Humans missing legs or are legcuffed will no longer move slower in areas - without gravity. - - bugfix: The structures external to stations are now properly lit. Make sure you - bring a flashlight. - - bugfix: Computers will no longer delete themselves when being built, whoops! - - bugfix: Space cats will no longer have a smashed helmet when they lay down. - Skylar Lineman, your local R&D moonlighter: - - rscadd: Research has been completely overhauled into the techweb system! No more - levels, the station now unlocks research "nodes" with research points passively - generated when there is atleast one research server properly cooled, powered, - and online. - - rscadd: R&D lab has been replaced by the departmental lathe system on the three - major maps. Each department gets a lathe and possibly a circuit imprinter that - only have designs assigned by that department. - - rscadd: The ore redemption machine has been moved into cargo bay on maps with - decentralized research to prevent the hallways from becoming a free for all. - Honk! - - balance: You shouldn't expect balance as this is the initial merge. Please put - all feedback and concerns on the forum so we can revise the system over the - days, weeks, and months, to make this enjoyable for everyone. Heavily wanted - are ideas of how to add more ways of generating points. - - balance: You can get techweb points by setting off bombs with an active science - doppler array listening. The bombs have to have a theoretical radius far above - maxcap to make a difference. You can only go up, not down, in radius, so you - can't get 6 times the points with 6 TTVs. The algorithm is exponentially/logarithmically - scaled to prevent "world destroyer" bombs from instantly finishing research. - SpaceManiac: - - bugfix: HUDs from mechs and helmets no longer conflict with HUD glasses and no - longer inappropriately remove implanted HUDs. - - code_imp: Chasm code has been refactored to be more sane. - - bugfix: Building lattices over chasms no longer sometimes deletes the chasm. - - code_imp: Ladders have been refactored and should be far less buggy. - - bugfix: Jacob's ladder actually works again. - - bugfix: Pizza box stacking works again. - - bugfix: Fix some permanent-on and permanent-off bugs caused by the HUD stacking - change. - WJohnston: - - imageadd: A bunch of new turf decals for mappers to play with, coming in yellow, - white, and red varieties! - - bugfix: Green banded default airlocks now have extended click area like all other - airlocks. - Y0SH1 M4S73R: - - spellcheck: The R&D Server's name is now improper. - - spellcheck: The R&D Server now has an explanation of what it does. - arsserpentarium: - - bugfix: now lists should work properly - duncathan: - - rscadd: The RPD has a shiny new UI! - - rscadd: The RPD can now paint pipes as it lays them, for quicker piping projects. - - rscadd: Atmos scrubbers (vent and portable) can now filter any and all gases. - ike709: - - imageadd: Added new vent and scrubber sprites by Partheo. - - bugfix: Fixed some computers facing the wrong direction. - jammer312: - - bugfix: fixed conjuration spells forgetting about conjured items - kevinz000: - - rscadd: purple bartender suit and apron added to clothesmates! - - rscadd: long hair 3 added, check it out. both have sprites from okand! - nicbn: - - soundadd: Now rolling beds and office chairs have a sound! - oranges: - - rscdel: Removed the shocker circuit - psykzz: - - imageadd: Grilles have new damaged and default sprites - - rscadd: Added TGUI for Turbine computer - tserpas1289: - - tweak: Any suit that could hold emergency oxygen tanks can now also hold plasma - man internals - - tweak: Hydroponics winter coats now can hold emergency oxygen tanks just like - the other winter coats. - - bugfix: Plasma men jumpsuits can now hold accessories like pocket protectors and - medals. - zennerx: - - bugfix: fixed a bug that made you try and scream while unconscious due to a fire - - tweak: Skateboard crashes now give slight brain damage! - - rscadd: Using a helmet prevents brain damage from the skateboard! -2017-11-23: - GupGup: - - bugfix: Fixes hostile mobs attacking surrounding tiles when trying to attack someone - MrStonedOne and Jordie: - - server: As a late note, serverops be advise that mysql is no longer supported. - existing mysql databases will need to be converted to mariadb - Robustin: - - tweak: RND consoles will no longer display options for machines or disks that - are not connected/inserted. - ShizCalev: - - bugfix: Aliens in soft-crit will now use the correct sprite. - XDTM: - - rscadd: 'Added two new symptoms: one allows viruses to still work while dead, - and allows infection of undead species, and one allows infection of inorganic - species (such as plasmapeople or golems).' -2017-11-24: - ACCount: - - rscdel: Removed "console screen" stock part. Just use glass sheets instead. - More Robust Than You: - - tweak: Spessmen are now smart enough to realize you don't need to turn around - to pull cigarette butts - SpaceManiac: - - bugfix: Fix water misters being inappropriately glued to hands in some cases. - - bugfix: Some misplaced decals in the Hotel brig have been corrected. - ninjanomnom: - - bugfix: Custom shuttle dockers can no longer place docking regions inside other - custom docker regions. -2017-11-25: - CosmicScientist: - - bugfix: bolas are back in tablecrafting! - Dorsisdwarf: - - tweak: Catpeople are now distracted instead of debilitated - - rscadd: Normal cats now go for laser pointers - SpaceManiac: - - bugfix: You can no longer buckle people to roller beds from inside of a locker. - YPOQ: - - bugfix: AIs and cyborgs can interact with unscrewed airlocks and APCs. - ninjanomnom: - - bugfix: Fixes thermite burning hotter than the boiling point of stone - zennerx: - - bugfix: Zombies don't reanimate with no head! -2017-11-27: - ACCount: - - rscadd: 'New integrated circuit components: list constructors/deconstructors. - Useful for building lists and taking them apart.' - - bugfix: Fixed multiple bugs in integrated circuits UIs, improved overall usability. - More Robust Than You: - - bugfix: Fixed cult leaders being de-culted upon election if they had a mindshield - implant - Naksu: - - bugfix: Hopefully fixed mesons granting the ability to hear people through walls. - Okand37: - - rscadd: Re-organized Delta's departmental protolathes for all departments. - - rscadd: Re-organized Delta's ORM placement by connecting it to the mining office, - which now has a desk for over handing materials to the outside. - - rscadd: Added a second Nanomed to Deltastation's medical bay. - - rscadd: Nanotrasen has decided to add proper caution signs to most docking ports - on Deltastation, warning individuals to be cautious around these areas. - - rscadd: Two health sensors are now placed in Deltastation's robotics area for - medibots. - - bugfix: Atmospheric Technicians at Deltastation can now open up their gas storage - in the supermatter power area as intended. - WJohnston: - - bugfix: Fixed a case where items would sometimes be placed underneath racks. - XDTM: - - balance: Viruses' healing symptoms have been reworked! - - rscdel: All existing healing symptoms have been removed in favour of new ones. - - rscdel: Weight Even and Weight Gain have been removed, so hunger can be used for - balancing in symptoms. - - rscadd: Starlight Condensation heals toxin damage if you're in space using starlight - as a catalyst. Being up to two tiles away also works, as long as you can still - see it, but slower. - - rscadd: Toxolysis (level 7) rapidly cleanses all chemicals from the body, with - no exception. - - rscadd: 'Cellular Molding heals brute damage depending on your body temperature: - the higher the temperature, the faster the healing. Requires above-average temperature - to activate, and the speed heavily increases while on fire.' - - rscadd: Regenerative Coma (level 8) causes the virus to send you into a deep coma - when you are heavily damaged (>70 brute+burn damage). While you are unconscious, - either from the virus or from other sources, the virus will heal both brute - and burn damage fairly quickly. Sleeping also works, but at reduced speed. - - rscadd: Tissue Hydration heals burn damage if you are wet (negative fire stacks) - or if you have water in your bloodstream. - - rscadd: Plasma Fixation (level 8) stabilizes temperature and heals burns while - plasma is in your body or while standing in a plasma cloud. Does not protect - from the poisoning effects of plasma. - - rscadd: Radioactive Resonance gives a mild constant brute and burn healing while - irradiated. The healing becomes more intense if you reach higher levels of radiation, - but is still less than the alternatives. - - rscadd: Metabolic Boost (level 7) doubles the rate at which you process chemicals, - good and bad, but also increases hunger tenfold. - kevinz000: - - bugfix: Cryo cells can now be properly rotated with a wrench. - ninjanomnom: - - rscadd: 'You can now make a new tasty traditional treat: butterdogs. Watch out, - they''re slippery.' -2017-11-28: - ACCount: - - rscdel: '"Machine prototype" is removed from the game.' - - rscdel: Mass-spectrometers are removed. Would anyone notice if not for this changelog - entry? - Cruix: - - rscadd: AI and observer diagnostic huds will now show the astar path of all bots, - and Pai bots will be given a visible path to follow when called by the AI. - JJRcop: - - admin: Fixed the Make space ninja verb. - Naksu: - - code_imp: rejiggered botcode a little bit - SpaceManiac: - - spellcheck: Admin-added "download research" objectives are now consistent with - automatic ones. - improvedname: - - tweak: toolbelts can now carry geiger counters - uraniummeltdown: - - rscadd: You can make many different types of office and comfy chairs with metal - - tweak: Stack menus use /datum/browser -2017-11-29: - MrStonedOne: - - tweak: The sloth no longer suspiciously moves fast when gliding between tiles. - - balance: The sloth's movespeed when inhabited by a player has been lowered from - once every 1/5 of a second to once every second. - SpaceManiac: - - spellcheck: The techweb node for mech LMGs no longer claims to be for mech tasers. -2017-11-30: - ninjanomnom: - - tweak: Reduced the max volume of sm by 1/5th and made the upper bounds only play - mid delamination. - psykzz: - - bugfix: Fixing the broken turbine computer -2017-12-02: - BeeSting12: - - spellcheck: Occupand ---> Occupant on opened cryogenic pods. - - spellcheck: Cyrogenic ---> Cryogenic on opened cryogenic pods. - CosmicScientist: - - rscadd: You can make plushies kiss one another! - Frozenguy5: - - tweak: The Particle Accelerator's wires can no longer be EMP'd - Naksu: - - code_imp: Cleans up some loc assignments - Robustin: - - tweak: Damage examinations now include a "moderate" classification. Before minor - was <30 and severe was anything 30 or above. Now minor is <25, moderate is 25 - to <50, and severe is 50+. - - balance: Clockwork magicks will now prevent Bags of Holding from being combined - on Reebe. - - bugfix: Flashes will now burn out AFTER flashing when they fail instead of being - a ticking time bomb that waits to screw you over on your next attempt. - SpaceManiac: - - tweak: The R&D Console has been given a much prettier interface. - - tweak: Research scanner goggles now show materials and technology prospects in - a nicer way. - uraniummeltdown: - - imageadd: Construct shells have a new animated sprite -2017-12-03: - ExcessiveUseOfCobblestone: - - bugfix: You can now lay (buckle!) yourself to a bed to avoid being burnt to a - crisp during "the floor is lava" event. - Robustin: - - tweak: Igniting plasma statues no longer ignores ignition temperature and only - creates as much plasma as was used in its creation. - Xhuis: - - rscadd: Light fixtures now turn an ominous, dim red color when they lose power, - and draw from an internal power cell to maintain it until either the cell dies - (usually after 10 minutes) or power is restored. - - rscadd: You can override emergency light functionality from an APC. You can also - click on individual lights as a cyborg or AI to override them individually. - Traitor AIs also have a new ability that disables emergency lights across the - entire station. - zennerx: - - spellcheck: fixed some typos in the weapon firing mechanism description -2017-12-04: - AnturK: - - rscadd: You can now record and replay holopad messages using holodisks. - - rscadd: Holodisks are printable in autolathes. - Xhuis: - - bugfix: You now need fuel in your welder to repair mechs. -2017-12-05: - Cyberboss: - - sounddel: Reduced the volume of showers - Dax Dupont: - - rscadd: Nanotrasen is happy to announce the pinnacle in plasma research! The Disco - Inferno shuttle design is the result of decades of plasma research. Burn, baby, - burn! - MrPerson & ninjanomnom: - - refactor: Completely changed how keyboard input is read. - - rscadd: Holding two directions at the same time will now move you diagonally. - This works with the arrow keys, wasd, and the numpad. - - tweak: Moving diagonally takes twice as long as moving a cardinal direction. - - bugfix: You can use control to turn using wasd and the numpad instead of just - the arrow keys. - - rscdel: 'Some old non-hotkey mode behaviors, especially in relation to chatbox - interaction, can''t be kept with the new system. Of key note: You can''t type - while walking. This is due to limitations of byond and the work necessary to - overcome it is better done as another overhaul allowing custom controls.' - Robustin: - - rscdel: Reverted changes in 3d sound system that tripled the distance that sound - would carry. - SpaceManiac: - - spellcheck: Energy values are now measured in joules. What was previously 1 unit - is now 1 kJ. - - bugfix: Syndicate uplink implants now work again. - Xhuis: - - tweak: Stethoscopes now inform the user if the target can be defibrillated; the - user will hear a "faint, fluttery pulse." - coiax: - - rscadd: Quiet areas of libraries on station have now been equipped with a vending - machine containing suitable recreational activities. -2017-12-06: - Dax Dupont & Alek2ander: - - tweak: Binary chat messages been made more visible. - Revenant Defile ability: - - bugfix: Revenant's Defile now removes salt piles - XDTM: - - rscadd: 'Brain damage has been completely reworked! remove: Brain damage now no - longer simply makes you dumb. Although most of its effects have been shifted - into a brain trauma.' - - rscadd: Every time you take brain damage, there's a chance you'll suffer a brain - trauma. There are many variations of brain traumas, split in mild, severe, and - special. - - rscadd: Mild brain traumas are the easiest to get, can be lightly to moderately - annoying, and can be cured with mannitol and time. - - rscadd: Severe brain traumas are much rarer and require extensive brain damage - before you have a chance to get them; they are usually very debilitating. Unlike - mild traumas, they require surgery to cure. A new surgery procedure has been - added for this, the aptly named Brain Surgery. It can also heal minor traumas. - - rscadd: 'Special brain traumas are rarely gained in place of Severe traumas: they - are either complex or beneficial. However, they are also even easier to cure - than mild traumas, which means that keeping these will usually mean keeping - a mild trauma along with it.' - - rscadd: Mobs can only naturally have one mild trauma and one severe or special - trauma. - - balance: Brain damage will now kill and ruin the brain if it goes above 200. If - it somehow goes above 400, the brain will melt and be destroyed completely. - - balance: Many brain-damaging effects have been given a damage cap, making them - non-lethal. - - rscdel: The Unintelligible mutation has been removed and made into a brain trauma. - - rscdel: Brain damage no longer makes using machines a living hell. - - rscadd: Abductors give minor traumas to people they experiment on. - coiax: - - rscadd: The drone dispenser on Metastation has been moved to the maintenance by - Robotics. -2017-12-07: - ShizCalev: - - bugfix: Games vending machines can now properly be rebuilt. - - bugfix: Games vending machines can now be refilled via supply crates. - - rscadd: Games Supply Crates have been added to the cargo console. - SpaceManiac: - - bugfix: Radio frequency 148.9 is once again serviced by the telecomms system. - Xhuis: - - rscadd: Added the Eminence role to clockcult! Players can elect themselves or - ghosts as the Eminence from the eminence spire structure on Reebe. - - rscadd: The Eminence is incorporeal and invisible, and directs the entire cult. - Anything they say is heard over the Hierophant network, and they can issue commands - by middle-clicking themselves or different turfs. - - rscadd: The Eminence also has a single-use mass recall that warps all servants - to the Ark chamber. - - rscadd: Added traps, triggers, and brass filaments to link them. They can all - be constructed from brass sheets, and do different things and trigger in different - ways. Current traps include the brass skewer and steam vent, and triggers include - the pressure sensor, lever, and repeater. - - rscadd: The Eminence can activate trap triggers by clicking on them! - - rscadd: Servants can deconstruct traps instantly with a wrench. - - rscdel: Mending Mantra has been removed. - - tweak: Clockwork scriptures have been recolored and sorted based on their functions; - yellow scriptures are for construction, red for offense, blue for defense, and - purple for niche. - - balance: Servants now spawn with a PDA and black shoes to make disguise more feasible. - - balance: The Eminence can superheat up to 20 clockwork walls at a time. Superheated - walls are immune to hulk and mech punches, but can still be broken conventionally. - - balance: Clockwork walls are slightly faster to build before the Ark activates, - taking an extra second less. - - bugfix: Poly no longer continually undergoes binary fission when Ratvar is in - range. - - code_imp: The global records alert for servants will no longer display info that - doesn't affect them since the rework. - coiax: - - rscadd: The drone dispenser on Box Station has been moved from the Testing Lab - to the Morgue/Robotics maintenance tunnel. - deathride58: - - config: The default view range can now be defined in the config. The default is - 15x15, which is simplified to 7 by BYOND. For reference, Goonstation's widescreen - range is 21x15. Do note that changing this value will affect the title screen. - The title screen images and the title screen area on the Centcom z-level will - have to be updated if the default view range is changed. -2017-12-08: - Dax Dupont: - - bugfix: Fixed observer chat flavor of silicon chat. - - bugfix: Grilles now no longer revert to a pre-broken icon state when you hit them - after they broke. - Dorsisdwarf: - - tweak: Minor fixes to some techweb nodes - - balance: Made flight suits, combat implants, and combat modules require more nodes - Fox McCloud: - - tweak: Slime blueprints can now make an area compatible with Xenobio consoles, - regardless of the name of the new area - MrDoomBringer: - - imageadd: All stations have been outfitted with brand new Smoke Machines! They - have nicer sprites now! - Shadowlight213: - - rscadd: You now can get a medal for wasting hours talking to the secret debug - tile. - - bugfix: Fixed runtime for the tile when poly's speech file doesn't exist. - Xhuis: - - rscadd: You can now make pet carriers from the autolathe, to carry around chef - meat and other small animals without having to drag them. The HoP, captain, - and CMO also start with carriers in their lockers for their pets. - YPOQ: - - bugfix: Fixed the camera failure, race swap, cursed items, and imposter wizard - random events - - tweak: The cursed items event no longer nullspaces items - jammer312: - - rscadd: Action buttons now remember positions where you locked. - - tweak: Now locking action buttons prevents them from being reset. -2017-12-10: - SpaceManiac: - - bugfix: External airlocks of the mining base and gulag are now cycle-linked. - - tweak: The pAI software interface is now accessible via an action button. - Swindly: - - rscadd: You can kill yourself with a few more items. - XDTM: - - tweak: Instead of activating randomly on speech, Godwoken Syndrome randomly grants - inspiration, causing the next message to be a Voice of God. - Xhuis: - - tweak: Flickering lights will now actually flicker and not go between emergency - lights and normal lighting. - - bugfix: Emergency lights no longer stay on forever in some cases. - kevinz000: - - rscadd: Nanotrasen would like to remind crewmembers and especially medical personnel - to stand clear of cadeavers before applying a defibrillator shock. (You get - shocked if you're pulling/grabbing someone being defibbed.) - - tweak: defib shock/charge sounds upped from 50% to 75%. -2017-12-11: - Anonmare: - - bugfix: Booze-o-mats have beer - Cruix: - - tweak: The white ship navigation computer now takes 10 seconds to designate a - landing spot, and users can no longer see the syndicate shuttle or its custom - landing location. If the white ship landing location would intersect the syndicate - shuttle or its landing location, it will fail after the 10 seconds have elapsed. - Frozenguy5: - - balance: Some hardsuits have had their melee, fire and rad armor ratings tweaked. - Improvedname: - - tweak: cats now drop their ears and tail when butchered. - Robustin: - - bugfix: Modes not in rotation have had their "false report" weights for the Command - Report standardized - SpaceManiac: - - bugfix: The MULEbots that the station starts with now show their ID numbers. - - bugfix: The dependency by Advanced Cybernetic Implants and Experimental Flight - Equipment on Integrated HUDs has been restored. - kevinz000: - - bugfix: flightsuits should no longer disappear when you take them off involuntarily - - bugfix: beam rifles actually fire striaght now - - bugfix: click catchers now actually work - - bugfix: you no longer see space in areas you normally can't see, instead of black. - in reality you can still see space but it's faint enough that you can't tell - so I'll say I fixed it. - uraniummeltdown: - - rscadd: Added MANY new types of airlock assembly that can be built with metal. - Use metal in hand to see the new airlock assembly recipes. - - rscadd: Added new airlock types to the RCD and airlock painter - - rscadd: Vault door assemblies can be built with 8 plasteel, high security assemblies - with 6 plasteel - - rscadd: Glass mineral airlocks are finally constructible. Use glass and mineral - sheets on an airlock assembly in any order to make them. - - tweak: Glass and mineral sheets are now able to be welded out of door assemblies - rather than having to deconstruct the whole thing - - rscdel: Airlock painter no longer works on airlock assemblies (still works on - airlocks) - - bugfix: Titanium airlocks no longer have any missing overlays -2017-12-12: - Mark9013100: - - rscadd: Medical Wardrobes now contain an additional standard and EMT labcoat. - Robustin: - - rscadd: The blood cult revive rune will now replace the souls of braindead or - inactive cultists/constructs when properly invoked. These "revivals" will not - count toward the revive limit. - - rscadd: The clock cult healing rune will now replace the souls of braindead or - inactive cultists/constructs when left atop the rune. These "revivals" will - not drain the rune's energy. - Swindly: - - bugfix: Swarmers can no longer deconstruct objects with living things in them. - kevinz000: - - bugfix: You can now print telecomms equipment again. -2017-12-13: - Naksu: - - bugfix: glass shards and bananium floors no longer make a sound when "walked" - over by a camera or a ghost - SpaceManiac: - - bugfix: Nonstandard power cells found in MULEbots, cyborgs, and elsewhere now - have the correct description. - deathride58: - - bugfix: Genetics will no longer have a random block completely disappear each - round -2017-12-15: - AverageJoe82: - - rscadd: drones now have night vision - - rscdel: drones no longer have lights - Cruix: - - bugfix: Shuttles now place hyperspace ripples where they are about to land again. - Cyberboss: - - config: Added "$include" directives to config files. These are recursive. Only - config.txt will be default loaded if they are specified inside it - - config: Added multi string list entry CROSS_SERVER. e.g. CROSS_SERVER Server+Name - byond://server.net:1337 - - config: CROSS_SERVER_ADDRESS removed - Epoc: - - bugfix: Adds Cybernetic Lungs to the Cyber Organs research node - JStheguy: - - rscadd: Added 10 new assembly designs to the integrated circuit printer, the difference - from current designs is purely aesthetics. - - imageadd: Added the icons for said new assembly designs to electronic_setups.dmi, - changed the current electronic mechanism and electronic machine sprites. - MrStonedOne: - - server: Added new admin flag, AUTOLOGIN, to control if admins start with admin - powers. this defaults to on, and can be removed with -AUTOLOGIN - - admin: Admins with +PERMISSION may now deadmin or readmin other admins via the - permission panel. - Naksu: - - code_imp: Preliminary work on tracking cliented living mobs across Z-levels to - facilitate mob AI changes later - - code_imp: Tidied up some loc assignments - - code_imp: fixes the remaining loc assignments - ShizCalev: - - soundadd: Revamped gun dry-firing sounds. - - tweak: Everyone around you will now hear when your gun goes click. You don't want - to hear click when you want to hear bang! - SpaceManiac: - - code_imp: Remote signaler and other non-telecomms radio code has been cleaned - up. - Xhuis: - - rscadd: Grinding runed metal and brass now produces iron/blood and iron/teslium, - respectively. - - balance: As part of some code-side improvements, the amount of reagents you get - from grinding some objects might be slightly different. - - bugfix: Some grinding recipes that didn't work, like dead mice and glowsticks, - now do. - - bugfix: All-In-One grinders now correctly grind up everything, instead of one - thing at a time. - nicbn: - - imageadd: Closet sprites changed. -2017-12-16: - Armhulen and lagnas2000 (+his team of amazing spriters): - - rscadd: Mi-go have entered your realm! - Robustin: - - balance: Marauder shields now take twice as long to regenerate and only recharge - one charge at a time. - - balance: Marauders now have 120hp down from 150hp. - - bugfix: The wizard event "race swap" should now stick to "safer" species. - - bugfix: Zombies are now properly stunned for a maximum of 2 seconds instead of - 2/10ths of a second. - - tweak: Zombie slowdown adjusted from -2 to -1.6. - SpaceManiac: - - bugfix: The shuttle will no longer be autocalled if the round has already ended. - Xhuis: - - tweak: Vitality matrices don't have visible messages when someone crosses them - anymore. -2017-12-17: - More Robust Than You: - - code_imp: Changed roundend sounds and lobby music to use one proc for choosing - sounds - - server: You can now easily host roundstart sounds without changing the code! - - config: RIP in shit round_start_sounds.txt - XDTM: - - rscadd: A few new traumas have been added. - - balance: Thresholds to get brain traumas have been lowered, as they currently - pretty much only trigger if you intentionally chug impedrezene. - - tweak: Melee head hits deal minor brain damage. Crits still do a significant amount. - - tweak: Nuke Op implants no longer trigger on deathgasp. (They still explode on - death) - - tweak: You'll now receive messages when crossing certain brain damage thresholds. - - tweak: Split Personalities are instructed not to suicide while in control. - - tweak: Godwoken Syndrome now randomly sends Voice of God commands, instead of - being controllable. - Xhuis: - - bugfix: Clockcult power alerts will no longer show outside of the clockcult gamemode - (they could be triggered by scarabs.) - ninjanomnom: - - bugfix: You can use the old non-hotkey mode text input behavior (keyboard input - automatically directed at the text input box) by changing your hotkey mode in - preferences - - rscadd: You can use Shift+E or Shift+B for belt/backpack respectively to quickly - put in your held item or take out the most recently added item. -2017-12-18: - AnturK: - - rscadd: Repeated messages will now be squashed in the chat. - Cyberboss: - - bugfix: Allied station communications are back, now with potentially multiple - stations - Naksu: - - tweak: Hostile mobs on z-levels without living players will now conserve their - efforts and simply not run AI routines at all. Also, idling mob routines should - be significantly cheaper on non-station Z-levels. - ShizCalev: - - soundadd: Added new sounds to guns when reloading. - - bugfix: Cartridges and casings ejected from guns will now make the proper sound! - Xhuis: - - bugfix: Microwave sound loops now correctly stop when it breaks or is otherwise - interrupted mid-cook. - coiax: - - rscadd: A lollipop dispenser in "dispense lollipops" mode can push the lollipop - straight into the targets hand, rather than getting it dirty on the floor first. - - tweak: Aliens (and humans with alien organs) will have a prompt if they try to - create resin structures or lay eggs atop vents or scrubbers. - nicbn: - - bugfix: Now the chem smoke machine uses stock parts for volume and range. - ninjanomnom: - - bugfix: Decals should now rotate the correct way around. - oranges: - - tweak: Dance machine will not play tracks to you if you have instruments turned - off -2017-12-19: - More Robust Than You: - - tweak: Jungle Fever cannot be cured anymore - - bugfix: The Monkey Leaders' virus are now un-detectable by health scanners and - to the PANDEMIC now. - Shadowlight213: - - bugfix: Fixed captain's PDA showing unusable Toggle Remote Door menu option - XDTM: - - rscadd: Abductors can now see if people already have glands! Never worry about - abducting the same guy twice again. - - rscadd: Added the Mind Interface Device to the abductor shop for 2 Credits. Only - scientists can use it. - - rscadd: 'The MID has two modes: Transmit and Control.' - - rscadd: Transmit will allow you to send a message anytime, anywhere to the mind - of a target of your choice, regardless of language barriers. The message will - be anonymous, but abductor-like. - - rscadd: Control allows you to give a temporary directive to a target with an implanted - gland, that they MUST follow. Duration and amount of uses varies by gland type. - When a gland is spent, it will no longer respond to Control signals. The target - forgets ever receiving the objective when the duration ends. - coiax: - - balance: The codespeak manual now has unlimited uses and costs 3 TC. - - bugfix: Nuke ops can now purchase the codespeak manual, as was intended. - - rscadd: Golems can now wear labcoats. - kevinz000: - - rscadd: You can now joust with spears if you are riding on another mob, whether - it's a hapless cyborg or otherwise! Additional damage and stunchance will be - added per tile moved! - ninjanomnom: - - bugfix: Non movement keys pressed while moving no longer stop movement. -2017-12-20: - AnturK: - - rscadd: You can enforce no smoking zones with a disarm aimed at the smokers mouth. - coiax: - - rscadd: A changeling will learn all languages from anyone they absorb. -2017-12-21: - Fox McCloud: - - bugfix: Fixes arm implants being immune to EMPs - SpaceManiac: - - refactor: Telecomms and radio code has been cleaned up. - - tweak: The PDA message server is now a real piece of telecomms machinery. - - tweak: PDA logs now include the job as well as name of the participants. - - bugfix: The Syndicate frequency no longer hears its own messages twice. - - bugfix: Talking directly into a radio which is also hot-miked no longer double-talks. - - bugfix: Passing a space transition no longer interrupts pulls. - Xhuis: - - bugfix: You can no longer elect two Eminences simultaneously. - - bugfix: The Eminence no longer drifts in space. - - tweak: The Eminence's mass recall now works on unconscious servants. - - tweak: The Eminence's messages now have follow links for observers. - - balance: Floors blessed with holy water prevent servants from warping in and the - Eminence from crossing them. - - balance: The Eminence can never enter the Chapel. - coiax: - - rscadd: At the end of the round, all players can see who the antagonists are. - improvedname: - - bugfix: Corrects 357. speedloader in the autolathe - kevinz000: - - rscdel: Integrated circuit smoke circuits now require 10 units of reagents to - fire. - uraniummeltdown: - - rscadd: You can adjust line height in chat settings - - tweak: Default chat line height is slightly shorter, from 1.4 to 1.2 -2017-12-22: - Awesine: - - rscadd: added some things which happen to be mining scanner things to that gulag - thing - Kor: - - rscadd: During Christmas you will be able to click on the tree in the Chapel to - receive one present per round. That present can contain any item in the game. - Naksu: - - bugfix: frying oil actually works - WJohnston: - - tweak: Syndicate nuke op infiltrator shuttle is no longer lopsided. - kevinz000: - - rscadd: 'Clown modules have been added for cyborgs! Modules: Bikehorn, Airhorn, - instrumental bikehorn, clown stamp, multicolor paint, rainbow crayon, soap, - razor, purple lipstick, nonstunning selfcharging creampie cannon, nonslipping - selfcharging water sprayer, lollipop fabricator, metallic picket sign, mini - extinguisher, laughter reagent hypospray, and the ability to hug. experimental: - When emagged they get a fire spray, "super" laughter injector, and shocking - or crushing hugs. Also, the module is adminspawn only at the moment.' - - bugfix: Projectiles that pierce objects will no longer be thrown off course when - doing so! - - code_imp: Projectiles now use /datum/point/vectors for trajectory calculations. - - bugfix: Beam rifle reflections will no longer glitch out. -2017-12-23: - Dax Dupont: - - bugfix: Borgs will no longer have their metal/glass/etc stacks commit sudoku when - it runs out of metal. They will also show the correct amount instead of a constant - of "1" on menu interaction. - Kor: - - rscadd: During Christmas you will be able to click on the tree in the Chapel to - receive one present per round. That present can contain any item in the game. - Robustin: - - tweak: The EMP door shocking effect has a new formula. Heavy EMP's will no longer - shock doors while light EMP's have a 10% chance (down from 13.33%). - coiax: - - balance: The kitchen gibber must be anchored in order to use. - - balance: The gibber requires bodies to have no external items or equipment. -2017-12-24: - Frozenguy5: - - bugfix: Soapstones now give the correct time they were placed down. - More Robust Than You: - - tweak: Vending machines now use TGUI - SpaceManiac: - - bugfix: '"Download N research nodes" objective is now checked correctly again.' -2017-12-25: - SpaceManiac: - - bugfix: The Syndicate radio channel works on the station properly again. - coiax: - - rscadd: Ghosts can now use the *spin and *flip emotes. - uraniummeltdown: - - rscadd: Examine a door assembly to check what custom name is set. -2017-12-26: - Cyberboss: - - tweak: Objects that can have materials inserted into them only will do so on help - intent - PsyKzz: - - rscadd: Jaws of life can now cut handcuffs - SpaceManiac: - - admin: Play Internet Sound now has an option to show the song title to players. - XDTM: - - balance: Rebalanced healing symptoms. - - balance: Cellular Molding was replaced by Nocturnal Regeneration, which only works - in darkness. - - balance: All healing symptoms now heal both brute and burn damage, although the - basic ones will still be more effective on one damage type. - - balance: Plasma Fixation and Radioactive Metabolism heal toxin damage, offsetting - the damage done by their healing sources. - - balance: Changed healing symptoms' stats, generally making them less punishing. - Xhuis: - - balance: Medical supplies on all normal maps (Box, Meta, Delta, Omega, and Pubby) - are now behind ID-locked windoors. These windoors will become all-access during - red alert! - YPOQ: - - bugfix: Emagged cleanbots can acid people again - - bugfix: Headgear worn by monkeys can be affected by acid - ninjanomnom: - - bugfix: The auxiliary mining base can no longer be placed on top of lava, indestructible - turfs, or inside particularly large ruins. - - bugfix: The backup shuttle has it's own area now and you should no longer occasionally - be teleported there by the arena shuttle. - - bugfix: Cycling airlocks on shuttles should work correctly when rotated now. - - bugfix: Things like thermite which burned through walls straight to space now - stop on plating. You'll have to thermite it again to get to space. -2017-12-27: - More Robust Than You: - - code_imp: Changed roundend sounds and lobby music to use one proc for choosing - sounds - - server: You can now easily host roundstart sounds without changing the code! - - config: RIP in shit round_start_sounds.txt - Nero1024: - - soundadd: blast doors and shutters will now play a sound when they open and close. - Robustin: - - bugfix: Hallucinations will no longer show open doors "bolting". - SpaceManiac: - - code_imp: The R&D console has been made more responsive by tweaking how design - icons are loaded. - Xhuis: - - rscadd: Maintenance drones and cogscarabs can now spawn with holiday-related hats - on some holidays! - coiax: - - rscadd: Deltastation now has christmas trees during seasonally appropriate times. - deathride58: - - bugfix: Praise the lord! The shift+scroll hotkey to zoom in/out as a ghost works - properly again! - kevinz000: - - rscadd: you can now pick up corgi's and pAIs, how disgustingly cute - - code_imp: Forensics is now a datum component. - - balance: NPC humans will now start leaving fingerprints on things they touch! -2017-12-28: - Cyberboss: - - bugfix: Ghost lights will follow the ghost while orbiting - Robustin: - - bugfix: Splashing a book with ethanol should no longer produce errant messages. - - balance: Dead cultists can now be moved across the "line" on Reebe. -2017-12-29: - CosmicScientist: - - rscadd: timestop now inverts the colours of those frozen in time! - Dax Dupont: - - bugfix: APCs and other wall mounted objects are no longer blocked by the secure - medbay storage parts. - - bugfix: Removed a duplicate radiation collector on Deltastation. - More Robust Than You: - - bugfix: The Radiance can now enter the chapel - - bugfix: Monkey chat should no longer have .k prefixed - - bugfix: Monkey leaders should actually get jungle fever now - Robustin: - - bugfix: The action button for spells should now accurately reflect when the spell - is on cooldown - - bugfix: You can now reliably use the button for "touch" spells to "recall" the - spell - SpaceManiac: - - code_imp: Explicit z-level checks have been changed to use defines. - XDTM: - - rscadd: 'Added a new reagent: Pax.' - - rscadd: Pax is made with Mindbreaker, Synaptizine and Water, and those affected - by it are forced to be nonviolent against living beings. At least, not directly. - coiax: - - rscadd: Adds an internal radio implant, allowing the use of the radio if you expect - to have your headset removed. Or if you don't have any ears or hands. It can - be purchased for 4 TC from any Syndicate uplink. - - rscadd: Nuke ops now buy special "syndicate intelligence potions" that automatically - insert an internal radio implant when used successfully. Cayenne can now participate - in your high level discussions. -2017-12-30: - Cyberboss: - - tweak: Burial jumpsuits no longer have suit sensors - - tweak: The chemistry job has been removed from Omegastation. Medical doctors still - have full chemistry access - MrDoomBringer: - - imageadd: NanoTrasen has sent the station new spaceheaters! They look nicer now! - Xhuis: - - balance: Vitality matrices now apply Ichorial Stain when reviving a dead servant, - which prevents that servant from being revived again by vitality matrices for - a full minute. - - balance: Vitality matrices can't be placed adjacent to one another. - - balance: Brass skewers now damage and stun cyborgs. - - balance: Vitality matrices no longer drain people impaled on brass skewers. - - balance: Pressure sensors have 5 health again (down from 25.) - ninjanomnom: - - bugfix: Some changes to turfs like shuttles would result in un-initialized space - tiles being created. This has been fixed. -2017-12-31: - Cyberboss: - - rscadd: Explosions now cause camera shake based on intensity and distance - F-OS: - - bugfix: Last resort now requires a confirmation - Naksu: - - code_imp: loot drop spawners now assign their pixel offsets to the items they - spawn, also have a "fanout" setting to distribute items in a neat fashion like - in omega/delta's core and some tech storages. - - tweak: replaced several law boards in uploads with spawners, the net result being - one more board in uploads that may be a duplicate asimov (but hopefully isn't) - SpaceManiac: - - bugfix: Viewing photos sent by PDA message works again. - WJohnston: - - rscadd: Redesigned the entire syndicate lavaland base to be more stylish, have - functioning power and atmos as well as a turbine to play with. - XDTM: - - bugfix: Fixed a hallucination that would say [target.first_name()] instead of - the actual name. -2018-01-01: - Dax Dupont: - - bugfix: PDA messages have been fixed. -2018-01-02: - Dax Dupont: - - bugfix: The bank vault is no longer metagaming. It will now display the IC station - name. - DaxDupont: - - bugfix: Solar control consoles are no longer pointing to the wrong direction, - you can now turn tracking off again and manual positioning of solar panels have - been fixed. - Frozenguy5: - - rscadd: Adds a goon and cult emoji. Improves gear and tophat. (Credits to GoonStation - for creating the goon bee sprite.) - Okand37: - - rscadd: Overhauled aesthetic of some portions of Omegastation - - rscadd: Overhauled Omegastation's departure lounge, fitting it with the rest of - the station's theme - - rscadd: Replaced the personal closets with wardrobes in Omegastation's Lockerroom - - rscadd: Made Omegastation's engine room floortiles reinforced - - rscadd: Replaced the cola and snack machines with their random counterparts on - Omegastation - - bugfix: Fixed Omegastation's self destruct console being a doomsday device - - bugfix: Fixed Omegastation's chemistry shutters not all being synced and rearranged - the chemmaster. - - rscadd: Added a small technology storage in maintenance near departures on Omegastation - - rscadd: Added additional loot and emergency supplies to maintenance on Omegastation - - rscadd: Added the X-01 Multiphase to the Captain's Locker, Blueprints to Vault, - Reactive Teleportation Armor to Server Room and theHypospray to Medical Storage - on Omegastation - XDTM: - - bugfix: Fixed Runic Golem's Abyssal Gaze blinding permanently. - - balance: Ocular Restoration has been removed, its effect transfered on Sensory - Restoration. - - balance: Sensory Restoration now heals both eye and ear damage. - - balance: Mind Restoration now no longer heals ear damage, but now heals brain - damage by default. - - balance: Mind Restoration's thresholds can now let the symptoms cure mild brain - traumas at 6 resistance and severe ones at 9. - ninjanomnom: - - bugfix: Turfs are construct-able again -2018-01-03: - Cyberboss: - - bugfix: Fixed lathe power consumption being too high - - bugfix: You no longer cut yourself with shards when clicking a portal - Dax Dupont: - - bugfix: After 2 years and 2 separate issues the paper mache wizard robe has finally - been fixed. - Naksu: - - rscadd: A damaged core AI module may now spawn in AI uploads. It contains a random - amount of ionic laws with normal law priorities. - - bugfix: splash-fried food is now actually edible - SpaceManiac: - - bugfix: Mimes now laugh silently. - deathride58: - - tweak: Explosions will no longer give everyone and their mothers motion sickness - from a mile away. -2018-01-04: - Cyberboss: - - bugfix: The bloodcult sacrifice objective description won't change when the target - is sacrificed - Dax Dupont: - - rscadd: PDA Interface color is now a preference. - - bugfix: Fixed PDA font style not applying at round start. - - rscadd: 'The following messages have been added to dead chat: Security level change, - (re)calling, Emergency Access, CentComm/Syndicate console messages, outgoing - server messages and announcements,' - MrStonedOne: - - bugfix: The changelog hadn't been updating. This has been fixed. - ShiggyDiggyDo: - - tweak: Syndicate experts were able to create more sophisticated copies of the - nuclear authentication disk. While still unable to detonate the nuclear fission - explosive with them, they're practically identical to the real disk if not examined - closely. -2018-01-05: - Cruix: - - bugfix: Chameleon PDAs now have their chameleon action. - Okand37: - - rscadd: Added a fully functioning A.I. satellite to Omegastation! - - rscadd: Added the CE's magboots to the gravity room on Omegastation! - - rscadd: Added a medical wrench to cryo for Omegastation! - Shadowlight213: - - bugfix: Devils will no longer be permanently stuck if interrupted while trying - to jaunt. - - bugfix: Devils will now properly clear the fake fire if failing to jaunt. - SpaceManiac: - - bugfix: The startup load time of away missions has been drastically reduced. - - bugfix: The admin notification for the pulse rifle prize now shows the correct - coordinates. - deathride58: - - bugfix: Explosions now function properly again! -2018-01-10: - Robustin: - - bugfix: Blood cultists will now properly display a "reverted to their old faith" - message when deconverted. -2018-01-11: - Cyberboss: - - spellcheck: Fixed mechanical arms grammar when failing to activate - - bugfix: You will now no longer hit closets when attempting to anchor them - ExcessiveUseOfCobblestone: - - code_imp: Adds Stat Tracking to Techwebs by node and order. - Selea: - - rscadd: pulling claw.Integrated circuit, which allow assemblies to pull things. - ShizCalev: - - bugfix: 'Meta: The UI for the captain''s cigarette vendor now works again.' - - tweak: 'Meta: Removed the omnizine filled syndicate cigarettes from the captain''s - cigarette vendor.' - - tweak: Medbots are no longer able to inject you if you do not have any exposed - flesh. - Someguynamedpie: - - bugfix: Use world.timeofday instead of world.realtime - SpaceManiac: - - spellcheck: Replaced "CentComm" with "CentCom" in communications console deadchat - announcement. - - refactor: Information about the properties of z-levels is now less hardcoded than - before. - Tortellini Tony: - - rscadd: 'New hotkey for admin say command: F3.' - yorii: - - spellcheck: Renamed the ChemMaster eject button to highlight the fact that the - buffer does not get cleared -2018-01-12: - Cobby: - - tweak: As a human, you will now point with your legs when you have no arms, falling - over each time. - - tweak: As a human, you will bump your head on the ground trying to motion towards - something when you have no arms or legs. - Cyberboss: - - spellcheck: Fixed message grammar when lifting someone off a brass skewer - - bugfix: Fixed the original poker tables not being deleted after Narsie converted - them to a wooden table - Dax Dupont: - - rscadd: Thanks to the extensive disco and plasma research gathered by the Disco - Inferno shuttles, an indestructible mark V disco machine is now available. The - latest edition of the Disco Inferno shuttle now carries it. - JJRcop: - - code_imp: Removes some links intended for admins from game logs. - More Robust Than You: - - balance: Sigils of submission now uncuff upon successful conversion - PKPenguin321: - - tweak: Cyborgs that take enough damage to have a module disabled will now automatically - announce that they've had a module disabled to anybody nearby. Now if you want - to stop a cyborg from interfering with your business but don't want to kill - it, you can simply bash until you see the CRITICAL ERROR message. - - soundadd: Borgs will play an alarm sound in addition to displaying this message - as they have their modules disabled. - ShizCalev: - - bugfix: You can now attach collars to pets again! - - bugfix: Corrected pet collars icon mismatch. - - bugfix: Pets will now drop their collars when gibbed. - - tweak: You will no longer be able to rename unique pets, such as Ian or Runtime. - You can still rename pets without a special name. - - bugfix: Secbot assemblies will no longer lose their weld hole when dragged North - - imageadd: Secbot assemblies now have new North facing sprites! - - imageadd: Cleaned up a rogue pixel on beepsky's sprite. - - bugfix: Defibrillators now have inhands again! - - bugfix: Defibrillators will no longer stay in your hands after you die. - - bugfix: Losing an arm while wielding a two handed weapon will now cause you to - drop the weapon. - - bugfix: Losing an arm while carrying an item that requires two hands to hold will - now cause you to drop the item. - - spellcheck: Improved user feedback from chem dispenser macros. - - bugfix: Fixed Tests Areas debug verb. - - bugfix: Only the chaplain can now purify a bloody bastard sword. - - bugfix: Fully healing a mob as an admin now cures disabilities properly. - - bugfix: Non-cultists hulks can no longer withstand the immense powers of Ratvar's - influence while holding a bloody bastard sword. - - bugfix: The average body temperature has been corrected to 98.6F. - - tweak: Safe dials will now present itself in 1 number increments, instead of 5. - - bugfix: Relabeled canisters will no longer switch to an incorrect sprite when - broken. - SpaceManiac: - - bugfix: Relabelled canisters once again have the correct description. - - bugfix: The interface of airlock consoles has been restored to normalcy. - YPOQ: - - bugfix: Securitrons/ED-209s/Honkbots will only activate their emag functions after - their internals are emagged -2018-01-14: - Dax Dupont: - - bugfix: The NT Violet Lepton shuttle has been retrofitted with lava proof windows - for the lava engine. They will no longer catch fire and violently decompress - the shuttle. - Leshana: - - bugfix: Fix attempt to use `in` on a non-list. Pretty sure bitfields do not work - that way. - - admin: SS_NO_FIRE subsystems will no longer display pointless cost statistics - in MC panel - QualityVan: - - balance: Due to budget cuts, the vault safe is now slightly less resistant to - explosions. - ShizCalev: - - bugfix: Constructed security/honk/ect bots will now drop the correct parts when - destroyed. - - bugfix: "Some areas will no longer present themselves at \"\xC3\xBFUnexplored\ - \ Area\"" - SpaceManiac: - - bugfix: The R&D console design icon for slot machines is no longer mangled. - - bugfix: The Ark's teleportation checks now take mechs and sleepers into account - correctly. - - spellcheck: Activating internals via the right-side button produces better messages - on success. - - bugfix: The RPD will no longer fail to paint and layer pipes in some situations. - - bugfix: Unwrenching canisters from connector ports on non-default layers now resets - their pixel offset. - Thunder12345: - - bugfix: The NES Port emergency shuttle will no longer drain the CentComm emergency - dock of air - XDTM: - - tweak: Dreams are now more immersive and interesting. - deathride58: - - admin: You can now choose an outfit to be equipped while transforming a mob to - human via rudimentary transform. -2018-01-15: - Cruix: - - rscadd: Roundend traitor purchase logs now have tooltips showing the name, cost, - and description of the items. - F-OS: - - rscadd: NT has disabled their automatic APC lock - - tweak: The space heater now has a warning on it about use in the SM. - Half of coderbus ended up working on this somehow: - - rscadd: Goats will now dismember plant people when attacking them. - Iamgoofball: - - bugfix: The Express Console emag effect is now worth using. - JohnGinnane: - - bugfix: Fixed not being able to alt click on a stack - More Robust Than You: - - bugfix: Monkey Leaders should now properly get Jungle Fever - - bugfix: Monkeymode roundend report should now properly show Major/Minor victory - - bugfix: Monkeys should now get the jungle fever objective in monkeymode - - imageadd: Wirecutters can come in even more colors now! - ShizCalev: - - bugfix: RPDs and pipe painters now have more colorssssssssssssssssss - SpaceManiac: - - bugfix: Title screens without multiple dots in their filename will now be chosen - again. - - bugfix: MMIs in mechs or held by humans wearing fireproof suits are no longer - burnt by ash storms. - WJohnston: - - rscadd: Encrypted radio waves have been detected airing around station space. - Watch for possible enemy communications. - - rscadd: The space syndicate listening post has been remade from scratch, and now - has an actual ghost role to help spy on the station and relay info to traitors! - Xhuis: - - tweak: Added some new tips to the list for fighting the clockcult! - - rscadd: Added a new bar sign, The Lightbulb. - YPOQ: - - bugfix: Players are immune to their own slime time stops again - coiax: - - rscadd: A xenomorph maid (or barmaid) cleans the floor as they walk on it. Lie - down, and they'll clean your face. - ninjanomnom: - - admin: There are 3 new helpers in the secrets menu for messing with movement controls - - bugfix: Mining base walls when broken turn into plating which in turn breaks down - to the basalt surface. - theo2003: - - tweak: The autolathes on MetaStation, and DeltaStation next to R&D are now accessible - from R&D via windoor. -2018-01-16: - AnturK: - - bugfix: Photos now properly capture everything again. - DaedalusGame: - - bugfix: fixed duplicate reagent definitions in chem macros - SpaceManiac: - - bugfix: Heat exchange manifold pipes facing east/west now work again. - Thunder12345: - - bugfix: The asteroid with engines strapped to it will no longer vent both the - CentCom docks and its own entrance. - XDTM: - - rscadd: Reworked the species side of xenobiology. - - rscadd: Instead of an universal unstable mutation toxin, green slimes can now - produce slime mutation toxin (plasma), human mutation toxin (blood), and lizard - mutation toxin (radium). - - balance: Slime mutation toxin requires several units and some time before acting, - unless you're already a slimeperson (in which case it will randomize your subspecies) - - rscadd: Two new jellypeople subspecies have been added to make up for the lost - species. - - rscadd: Stargazers have telepathic abilities; they can Send Thoughts, privately - and anonimously, to any target they can see, and they can Link Minds with any - aggressively grabbed mob to form a hivemind with them. Hiveminds have no limit - but expire when the Stargazer dies or changes species. - - rscadd: Luminescents glow faintly and can absorb slime cores to gain special abilities. - Each core has a minor and a major ability, generally based on what they normally - do. Using these abilities does not use up the cores, but it has a cooldown depending - on the ability's power. - - balance: Slimepeople can now switch bodies on death or when unconscious, as long - as they have another one. -2018-01-17: - DaedalusGame: - - balance: you can't get 12 syndi bomb cores from stripping the syndi lava base - for parts anymore - - bugfix: fixed the syndi lava base blowing up from stray colossus shots, goliaths - breaking in or miners throwing gibtonite at it. - F-OS: - - tweak: Air alarms start unlocked - - bugfix: Air alarms no longer think they are fire alarms - - bugfix: Drone dispensers no longer hide drones - - bugfix: Ash storms aren't at ear-rapey volumes inside shielded areas. - ShizCalev: - - bugfix: Gas tanks are now made of metal! Honk - SpaceManiac: - - bugfix: Clicking lattices and girders with the RPD now succeeds instead of appearing - to place a pipe but failing. - - bugfix: The debug verbs "Display Air Status" and "Air Status in Location" now - format their reports the same and actually work more often. - - bugfix: The Camera Failure event no longer crashes the server if the station has - no cameras. - - admin: SDQL "select" outputs now have buttons to jump to the coordinates of the - found objects. - Xhuis: - - balance: You now have to climb through rifts to Reebe by walking into them, instead - of instantly warping away when you bump into one. - - balance: The separation line between the crew spawn and servant spawn in Reebe - now blocks airflow. - - rscadd: Added a new bar sign, The Lightbulb. - - bugfix: The Eminence's mass recall ability should now work properly - coiax: - - rscadd: If enough people vote to start CTF (by clicking on a CTF controller as - a ghost), then CTF will automatically begin. - deathride58: - - rscadd: By using a multitool on a radiation collector, you can use it to generate - research points! This requires a tank filled with a mix of tritium and oxygen. - - tweak: The display of rad collectors' power production rates has been moved from - a multitool interaction to examine text. - - tweak: Radiation collectors now emit a ding when they run out of fuel. - kevinz000: - - bugfix: Flashes can no longer work from inside containers to flash people outside. - - balance: Research export cargo points have been halved - nicbn: - - tweak: The Pirate Code changed its first rule to "BE AN SKELETON YARR". The old - "there are no rules" is now the second rule. -2018-01-18: - Buggy123: - - tweak: full-tile plasmaglass windows have had their integrity increased to the - correct value. -2018-01-19: - AverageJoe82: - - tweak: Reduce clock work mob death sound file's volume to 80% - Buggy123: - - rscadd: Observers can now view the atmospheric contents of the tile they're floating - above. - Cyberboss: - - refactor: Added test run mode which checks for runtimes in startup/shutdown and - runs tests (if they were enabled during compilation). Invoke it with the "test-run" - world parameter - Dax Dupont: - - bugfix: Autolathe now consumes reasonable amounts of power when inserting materials - - bugfix: Fixed conveyor belt power usage. - Frozenguy5: - - code_imp: Travis now builds on BYOND 512.1403 - Joan and More Robust Than You: - - rscadd: Adds moths! They're a new species that is able to fly in pressurized areas - provided gravity is off... and that they still have wings. - More Robust Than You: - - rscadd: Added some useful sec officer tips - OrdoM: - - rscadd: Adds morphine recipe to chemistry. - - rscdel: Removed ability for bartender to steal all morphine on the map - Robustin: - - bugfix: Fixed frost oil (cryosting) sending insulated crewmembers below absolute - zero temperatures. - - bugfix: Fixed damaging cold temps being a death sentence to simple mobs (they - wouldn't heat back up to safe temps at room temperature). - - refactor: Refactored human temperature code, insulating clothing now helps you - stay warm but going unprotected will help you cool off. However, you will now - benefit from colder temps when you're overheating even in full EVA/hardsuit - gear and you will warm up faster at room temperature in insulated gear as well - (i.e. putting on a winter coat will no longer suppress your temperature if your - already cold). - - bugfix: All crew can now purify bloody bastard swords with a bible (available - from cargo religion crates, library, or chapel) once again. - Shadowlight213: - - rscadd: Players can now have a verb in the ooc tab to see their own tracked playtime - - bugfix: fixed admin bypass not using the right proc - - bugfix: Lavaland ghost roles should now show up in the playtime report - ShizCalev: - - bugfix: Floors that look damaged / burned are now ACTUALLY damaged / burned, and - can be repaired! - SpaceManiac: - - bugfix: PDA messages sent by the message monitor console are now included in the - talk logs. - XDTM: - - tweak: Mass Hallucination now will give everyone the same hallucination. - - bugfix: Slimepeople can now properly swap between bodies. - - bugfix: Slimes no longer attack people with their same faction. - Xhuis: - - tweak: Servants can now cancel warps by clicking the button again, instead of - having to manually interrupt it by doing something like picking up an item from - their pocket. - coiax: - - rscdel: The Free Golem Ship no longer has a teleport beacon. - - rscdel: Jaunters no longer have a special effect when teleporting golems. - deathride58: - - rscadd: Mappers can now color individual tiles of floors via turf decals. - - bugfix: Cancelling the "Change equipment" command now works as expected again. - uraniummeltdown: - - bugfix: Jaunting wraiths should now always be facing the correct direction - yorii: - - bugfix: fixed the syringe getting a transfer amount of 0 if the contents of it - are 0, intended feature was probably to check the target and not the syringe - itself for clamp. -2018-01-20: - MrDoomBringer: - - rscadd: All Cargo Techs now come equipped with a standard supply Export Scanner! - Get to selling! - XDTM: - - bugfix: Fixed a bug where slimes wouldn't eat neutral mobs. - uraniummeltdown: - - tweak: Emagged airlocks can now be deconstructed simply by crowbarring when the - panel is open -2018-01-21: - Dax Dupont: - - bugfix: Moth wings will now respect your preferences. - WJohnston: - - rscadd: We've lost contact with one of our trade caravans in your sector, be on - the lookout for possible enemy activity. - - rscadd: Redesigned the syndicate ambush space ruin. It now boasts multiple flyable - shuttles and looks a lot prettier. - - imageadd: Wirecutter greyscaling is now less ugly -2018-01-22: - DaedalusGame: - - balance: foam and smoke now get 4x the reagents as they should according to the - comments - - bugfix: fixes pyrosium and cryostylane not heating or cooling humans at all - - bugfix: fixes cryostylane cooling beakers to negative kelvin, it's now limited - to what the description says - - bugfix: fixes cryostylane cooling people to negative body temperature - - code_imp: removed redundant check in trans_to - - code_imp: fixes a runtime when total_volume is 0 in copy_to - - tweak: Gas reagents (o2, plasma, ...) now dump out gas based on container temperature - instead of room temperature - Dax Dupont: - - rscadd: Fans of clown photography have successfully lobbied Nanotrasen to include - camera and camera accessories designs in the autolathe. - - tweak: Brings material values for the camera in line with other devices. - - tweak: The tapes printed by autolathes now come in random colors. - Dax Dupont & Coiax: - - rscadd: Praise the lord for he has granted thy chaplains, wizards, revenants and - eminences with holy vision. They can now see blessed tiles. - MMMiracles: - - rscadd: Syndicate and pirate mobs now give off light when appropriate - More Robust Than You: - - bugfix: Fixed monkey teams - - tweak: The Lepidopterian language now has less spaces in it - Robustin: - - bugfix: Fixed monkeys slowly freezing to death - ShizCalev: - - bugfix: Clockcultists and revolutionaries can no longer be mindswapped. - SpaceManiac: - - refactor: Weather and certain events have been updated to use Z traits. - - bugfix: The Staff of Storms now correctly starts and ends storms if used from - inside lockers. - - bugfix: Weather telegraph messages are now shown to those inside lockers and mechs. - - bugfix: Radio jammers no longer affect other z-levels. - Tlaltecuhtli: - - tweak: min player req for rev is 30 now - Xhuis: - - bugfix: Emergency lights now function correctly. - deathride58: - - code_imp: Light fixtures no longer use hardcoded values for their power and colour. - ninjanomnom: - - bugfix: Functions that aren't intending on actually moving the shuttle yet don't - send error messages to admins anymore when seeing if a shuttle *can* move. - scrubs2009: - - tweak: Candles last longer - uraniummeltdown: - - bugfix: Bananium shows up on mining scanners again -2018-01-23: - Cruix: - - bugfix: engine goggles set to t-ray mode will no longer show pipes with the wrong - rotation. - - bugfix: cables now show up on t-ray scans. - Dax Dupont: - - bugfix: Fixed missing tile under autolathes - MrDoomBringer: - - rscadd: NanoTrasen's Creative Psychology Initiative has brought new training to - all crewmembers to foster rapid, innovative problem-solving! You can now kill - yourself in so many more ways! - - rscadd: The RnD department can now develop firmware upgrades to the Express Supply - Console, unlocking advanced cargo drop pods! - Naksu: - - code_imp: removed a bunch of unnecessary vars, combining them into a bitfield - SpaceManiac: - - bugfix: Fixed occasional runtimes when ion storms or overflow would replace an - existing law. - WJohnston: - - bugfix: Space syndie listening post now has a real microwave, and a book management - console. Lava listening post comms room intercom now no longer starts with broadcast - on. - - rscadd: the syndicate drop ship and fighter pods from the caravan ambush can now - be flown to the syndicate listening post. The fighter pods also now have xray - cameras because regular ones were super useless. - XDTM: - - rscadd: Added Regenerative Jelly, made with tricordrazine and slime jelly. It - regenerates a bit faster, and won't harm jellypeople. - - rscadd: Added Energized Jelly, made with teslium and jelly. It works as an anti-stun - chemical for slimepeople and speeds up luminescents' power cooldown, but non-jellypeople - will just get shocked. - - rscadd: 'Added Pyroxadone, made with cryoxadone and slime jelly. It''s basically - inverse cryoxadone: it heals faster the hotter your body temperature is.' - - tweak: Cryoxadone no longer deals toxin damage to jellypeople. - - tweak: Purple Slime Extracts no longer have their sugar->slime jelly reaction - (obsolete with extract grinding), and instead have a blood->regen jelly reaction. - - tweak: Purple Extract's major activation by Luminescents now give regenerative - jelly instead of tricordrazine. - coiax: - - rscadd: Fake nuclear disks can only be identified by the captain, observers, nuclear - operatives, seeing where the pinpointer points, or attempting to put it into - a nuclear device. - - rscadd: Fake nuclear disks "respawn" on the station just like the real one. - kevinz000: - - rscdel: pulling claw can now only passively grab - - bugfix: Infrared beams now update instantly. - ninjanomnom: - - bugfix: Changeling clothing can get bloodied again. - the hatchet man (i eat garbage code): - - bugfix: 'you shitlords picked the wrong virtual anime tits to fuck so im takin - away your space bases experimental: lets be fair all you guys did in those was - jack off to hentai, and not real man''s gachimuchi' -2018-01-24: - Dax Dupont: - - bugfix: Fixed missing wheat fridge on omega and removes a duplicate pipe. - - rscadd: Beakers and beaker-like objects now get put in your hand on ejection from - chemistry devices. - Shadowlight213: - - bugfix: Fixed eye damage not being applied if it was exactly 3. - YPOQ: - - bugfix: Emergency lights will give off light again - ninjanomnom: - - bugfix: Pointing at squeaky things doesn't make them squeak anymore. -2018-01-25: - Dax Dupont: - - imageadd: Autolathe now repeats it's animation while printing. - - tweak: You now need to examine engravings to pop open the menu. - - bugfix: People can no longer extract 300 supermatter shard slivers without it - exploding. - - bugfix: Fixed thongs not dusting people on use. - Jittai: - - tweak: All color inputs now use the current color, of the thing being colored, - as default choice. - More Robust Than You: - - rscadd: You can now defib monkeys and aliums - - tweak: Monkeys can also use defibs now, too! - Naksu: - - code_imp: Slightly refactored object armor code - Ordo: - - rscadd: Adds Ketrazine, a powerful but dangerous combat stim which the crew can - synthesize - Robustin: - - balance: Clockwork marauders now take more time (+3s) and power (7x) to create. - - balance: The "recent marauder" time limit is now 60 seconds, up from 20. The limit - now has a significantly smaller effect on summon time but will act as a further - cap on marauder summoning until it has passed. - - tweak: The marauder cap will now only account for living cultists. - - rscadd: 'A new cocktail: The Nar''Sour. Made from blood, demonsblood, and lemon - juice, this cocktail is known to induce a slightly different type of slurring - when imbibed.' - SPACE CONDUCTOR: - - tweak: Shuttles will throw you around if ya don't buckle in - Shadowlight213: - - balance: Moths are now more susceptible to bright lights - Togopal, Armhulenn, Naksu, Jordie & oranges: - - rscadd: Snakes! They hunt vermin on the station! Curators have a natural phobia - to them. - - rscadd: They can be purchased in cargo. - XDTM: - - rscadd: Slimepeople and Jellypeople can now speak the slime language. - - tweak: Slimes now only speak slime language, although they still understand common. - - balance: Slimepeople are no longer virus immune. - - bugfix: The above change fixes a bug that made black slime cure itself. - Xhuis: - - balance: Fleshmend can no longer be stacked several times at once. - - balance: Fleshmend no longer heals changelings who are on fire, and heals burn - damage half as quickly as brute and oxygen damage. - - code_imp: Fleshmend has been refactored into a status effect. - coiax: - - rscadd: Nuclear operatives that wish to fail in style can purchase Centcom Official - and Clown costumes. They can also buy a defective chameleon kit. - - rscadd: The majority of shuttles are now loaded at the start of the round from - template, rather than being premapped. As a side effect, Delta's mining shuttle - now docks facing down at Lavaland. - imsxz: - - rscadd: Traitor clowns are now able to purchase clown bombs from their uplinks. - Honk! - - rscadd: Clown bombs can now be placed via a small beacon, the same way normal - syndicate bombs can be. - - tweak: clown bomb payload now summons 50 clowns instead of 100 - nicbn: - - bugfix: Now if you lose arms you won't be able to see through your uniform. - ninjanomnom: - - bugfix: Loaded templates now get placed on top of existing terrain so as to preserve - baseturfs. This fixes survival pods walls breaking to lava as well as allows - some future fixes. -2018-01-26: - Cruix: - - bugfix: Fixed being able to rotate things in only one direction. - DaedalusGame: - - rscadd: Firefighting Foam reagent, better alternative to water and corn oil for - firefighting purposes - Dax Dupont: - - rscadd: You can now rename and copy holodisks! - - rscadd: Holorecordings now can be looped. - - tweak: Holodisks now have materials and the autolathe cost has been adjusted. - - bugfix: Fixed holodisk speaker name not getting set when on non-prerecorded messages. - Epoc: - - bugfix: Slows Simple Clown mobs - GuppyLaxx: - - bugfix: Fixes the Ketrazine recipe - Iamgoofball: - - balance: Power cells explosions are now logarithmic - Naksu: - - code_imp: Cleaned up some /obj/item vars - - bugfix: Pneumatic cannons no longer misbehave when their contents such as primed - grenades get deleted (explode) - Robustin: - - rscadd: The Peacekeeper Borg's "Peace Hypospray" now includes the "Pax" reagent, - which prevents the subject from carrying out many forms of direct harm. - SpaceManiac: - - spellcheck: Clockwork armaments are no longer named "arnaments". - - bugfix: The Syndicate Listening Post's medicine closet now has the correct access. - coiax: - - rscadd: Syndicate intelligence potions also grant an internal syndicate ID card - to the simple animal granted intelligence. This effectively means that Cayenne - can open the airlocks on the Infiltrator. - uraniummeltdown: - - bugfix: You can no longer weld airlock assemblies for infinite materials -2018-01-27: - Anonmare: - - balance: The Syndicate Chameleon Kit is now available during rounds of lower population. - Because of course you can have an e-sword and revolver without restriction but - disguising and RP is verboten because we deathmatch station now. - Dax Dupont: - - bugfix: Eminence won't get spammed by tile crossing now. - Denton ShizCalev Kor Kevinz000 (original idea): - - balance: Due to budget cuts, the shoes shipped with chameleon kits no longer prevent - slipping. The premium version is unchanged and still sold separately. - - balance: To compensate, the chameleon kit cost was lowered by 2 TC and the minimum - crew limit removed. - Jittai: - - imageadd: New Morgue Tray sprites. - - imageadd: New Crematorium sprites. - Naksu: - - bugfix: Away missions no longer require manually adjusting subsystem mob/client - lists in order to not have the AI break. - WJohnston: - - bugfix: The lavaland syndie base is now packed with considerably fewer explosives, - and should lag far less brutally when exploding. - coiax: - - balance: Mobs will now start with a random nutrition amount, between hungry and - mildly well fed. - - rscadd: Nanotrasen Security Division has reported that syndicate comms agents, - both on lavaland and in space, have had training in "Codespeak", a top secret - language for stealthy communication. - uraniummeltdown: - - imageadd: Ore boxes have a new sprite -2018-01-29: - ACCount: - - rscadd: Having station blueprints in your hands now reveals function of wires - in station objects. - DaedalusGame: - - bugfix: fixed a strange pipenet issue that happens when a singular pipe or manifold - is placed directly between two or more components and wrenched last. - Dax Dupont: - - bugfix: After 3 years of intensive research by Nanotrasen's elite team of chefs, - rice dishes such as rice pudding are no longer considered salads. - Denton: - - spellcheck: Fixed Bubblegum's description. - F-OS: - - tweak: Academy is now part of the random station names. - Mark9013100: - - rscadd: Cloning data disks can now be constructed after researching the Genetic - Engineering technode. - MrStonedOne: - - tweak: 511 Clients can see atmos gases - - rscdel: This reverts the fix that prevents atmos gas overlays from stealing clicks. - Naksu: - - bugfix: Attempting to join into a command role as a nonhuman species no longer - lets you keep your nonhuman species languages if you are transformed into a - human because of a config option - - bugfix: Warp whistle can no longer pick up its user from inside various animation/in-between - states and effects such as transformations, jellypeople split, talisman of immortality - effect period or rod form. - WJohnston: - - bugfix: The centcom ferry shuttle now works again. - XDTM: - - balance: Peacekeeper cyborgs have synth-pax instead of normal pax, which has the - same effect but wears out faster. - - rscadd: Xenobiology consoles can now scan slimes and apply potions remotely. Use - potions on the console to load them. - - rscadd: Abductors now have the chemical, electric and trauma glands. - - rscdel: Removed the bloody, bodysnatch and EMP glands. - - tweak: The abductor viral gland now generates a random advanced virus instead - of a basic one. - - tweak: The abductor heal gland now also heals toxin damage. - - tweak: The abductor mindshock gland can now cause different reactions. - - tweak: The abductor slime gland now gives the slime faction. - - tweak: The abductor species gland now randomizes the victim's appearance and name - on top of the species. - - rscadd: 'Abductors have a new surgery type: violence neutralization. It has the - same steps as brain surgery, but it will instead inflict a Pacifism trauma upon - the victim, making them mostly harmless in the future.' - - rscadd: Bath Salts now give complete stun immunity while they last. - - balance: Ketrazine now gives immuity to sleeping. - improvedname: - - rscadd: Adds bz to cargo - ninjanomnom: - - rscdel: Removed the ability to create new shuttle areas or expand existing ones - with blueprints. - - bugfix: Special areas like rooms which require no power can no longer be expanded. - You can still expand into them however. - - bugfix: Turning to face a direction with control no longer moves you in the faced - direction after releasing control. - uraniummeltdown: - - rscadd: You can alt-click microwaves to turn them on -2018-01-30: - Cyberboss: - - bugfix: Blood contracts now only show living players and real names - DaedalusGame: - - tweak: made fire colored according to blackbody radiation and rule of cool. - - imageadd: some kind of lightning texture - Dax Dupont: - - rscadd: Cyborgs can now be upgraded to be h-u-g-e! Only a cosmetic effect! - ExcessiveUseOfCobblestone: - - bugfix: Turrets now check for borgs. Syndicate turrets are nice to emagged borgs - too! - Iamgoofball: - - bugfix: Minor code cleanup on the wirer - Jalleo: - - balance: nerfs power cells from a insane max possibility - Jittai: - - imageadd: Crematoriums and Morgue Trays now have directional states. - - bugfix: Morgue Trays now checks for cloneable people like the dna-scanner does. - (ghosts can roam now) - - bugfix: Cremated mice no longer leave behind snackable bodies. - - bugfix: Ash does not get instantly deleted in the crematorium upon creation. Ash - also piles up. (aesthetically only) - - tweak: Morgue/Crematorium Trays make a slight rolling sound. - More Robust Than You: - - tweak: Announcing messages while drunk will be slurred - Naksu: - - bugfix: Subjects without hearts now display as unsuitable for abductor experiments - when probed with the advanced baton. - - balance: BZ gas now makes lings lose their chems and hivemind access. The chem - loss is gradual. - - rscdel: 'Removed actual reagent quadrupling added in #34485' - - rscdel: Removed the foam effect combining feature, hopefully to be replaced with - something less completely and utterly broken - PKPenguin321: - - rscadd: Attention, space explorers! Nothing is out of your reach with the ACME - Extendo-Hand (TM)! With it, you can get a WHOLE EXTRA TILE OF REACH! Hug or - punch your friends from a whole 3 feet away! Win one from an arcade machine - or make one in the Misc. tab of your crafting menu today! - Robustin: - - rscadd: Blood magic. The next generation of talismans - you can create 2 spells - without a rune, up to 5 with a rune of empowerment. Preparing spells without - a rune will cost a significant amount of blood. Every talisman has been rebalanced - for its spell form. With a few exceptions, blood magic exists as a "touch" spell - that is very similar in behavior/appearance to the wizard touch spells. - - rscadd: New UI system for cultists. - - rscdel: Removed talismans, Talisman Creation Rune replaced by Rune of Empowerment. - Supply talisman has been replaced by a ritual dagger and 10 runed metal. - - rscadd: Ritual Dagger, replacing the Arcane Tome. This is largely a thematic alteration - but its to reinforce that your primary tool is also a weapon. - - bugfix: Cyborgs and AI are finally unable to see runes again - - tweak: Only the cult master can forge Bastard swords now, regular cultists can - get a mirror shield. - - rscadd: 'The mirror shield, it blocks, it reflects, it creates illusions, and - an incredible throwing weapon! The mirror shield also bears a unique weakness: - Shotgun slugs, .357 rounds, and other high damage projectiles will instantly - shatter it and briefly stun the holder.' - - balance: Nar'sien Bolas will not longer ensnare cultists and non-cultists will - ensnare themselves when attempting to use them. The bolas are now comparable - in effectiveness with reinforced bolas. - - rscadd: Rune of Spirits. This merges the Spirit Sight and Manifest Ghost rune. - The user will now choose which effect when invoking. - - rscadd: The Spirit Sight function has received several major improvements, allowing - the ghost to commune with the cult and mark objects similar how the cult master - can. The user has a unique appearance while ghosted and manifested cult ghosts - can see ghosts as well - allowing their summoner to lead them from the spirit - realm. - - balance: The Form Barrier rune will now last significantly longer and examining - the rune as a cultist will tell you how long it will remain. - - rscadd: The Apocalypse Rune. Replaces the EMP runes. Has a fixed invoker requirement - and added usage limitations. It scales depending on the crew's strength relative - to the cult. Effect includes a massive EMP, unique hallucination for non-cultists, - and if the cult is doing poorly, certain events. The rune can only occur in - the Nar-Sie ritual sites and will prevent Nar-Sie from being summoned there - in the future. - - rscdel: No more EMP rune. - - balance: The conceal/reveal spell now has 10 charges and will conceal far more, - including cult structures and flooring. - - balance: The stun spell will now stun for ~4 less seconds and silence for 2 more - seconds. - - balance: The EMP spell now costs 10 health to use, up from 5, and has had its - heavy/light EMP range nerfed by 1 and 2 respectively (now 3 and 6). - - balance: The shackles spell now has a silence effect similar to the stun talisman. - - balance: The hallucination spell now has multiple charges. - - tweak: The teleport spell can now be used on other adjacent cultists. - - tweak: Summon Tome and Summon Armor have been combined into "Summon Equipment", - which lets you choose between summoning a Ritual Dagger or Combat Gear (same - loadout that Summon Armor used to provide). - - balance: Standard cult robes now have -10 melee and -10 laser armor. - - balance: The "Construction" spell will now convert airlocks into cult airlocks - and cyborgs (after ~10 seconds) into constructs. The airlock is the most fragile - in the game, with reduced integrity, armor, and render it vulnerable to most - attacks. Cyborg "reconstruction" will be accompanied by an obvious effect/sound. - - rscadd: Blood Rites. This spell allows you to absorb blood from your surroundings - or adjacent non-cultists. You can use the blood rites as a convenient heal (self-healing - is significantly more costly though) or you can try to gather large quantities - of blood for unique and powerful relics. - - rscadd: Blood spear, a fragile but robust spear with a special recall ability - - rscadd: Blood bolts, the cultist's version of arcane barrage. The bolts will infuse - cultists with unholy water and damage anything else. - - rscadd: Blood beam, the ultimate blood rite. After a channeling period it will - fire 12 powerful beams across a long distance, piercing almost any surface (except - blessed turf), and damaging all non-cult life caught in the beam. - - tweak: All cult structures now generate significantly less light. - - balance: Pylons will now heal constructs faster and restore slightly more blood - than before. - - balance: Cult floors are now highly resistant to atmospheric changes. - - bugfix: Unholy water will now splash victims properly. - - balance: Unholy Water Vials created at altars now contains 50 units, and is better - at healing brute, and deals slightly more damage to non-cultists, the splash - ratio was reduced to 20% to compensate for the increased volume and damage. - - balance: Holy water will purge any and all blood spells from cultists. - - rscadd: Artificers, Wraiths and Juggernauts can now scribe revive, teleport, and - barrier runes respectively with a 3 minute cooldown. - - balance: Juggernauts' forcewall is now 3x1 but it has a ~30% longer cooldown. - Juggernauts got a modest speed increase (2.5 from 3) but lost a modest amount - of HP (200 from 250). - - rscadd: Juggernauts now get a ranged attack "Gauntlet Echo", a single projectile - that moves about as fast as them and does 30 damage with 5 seconds of stun and - a 35s cooldown. - - balance: The number of ghosts summonable by the manifest spirit rune is 3, down - from 5. - - balance: It now takes ~20% less water (~25 units) and ~30 seconds less to deconvert - cultists via holy water. - - tweak: The emagged library console will now distribute ritual daggers. - - tweak: Using the dagger on a rune will now take a 1-second channel to destroy - it, to avoid incidents where people instantly wipe a critical rune by accident. - - balance: Standard runed airlocks now have a lower damage deflection so they can - be destroyed with most respectable melee weapons (10+). - - balance: Teleporter runes that are used from space or lavaland will result in - the destination rune giving off a unique effect for 60 seconds. This effect - includes a long distance (but not obvious antagonistic) sound, a bright lighting - effect, and a visual cue that will indicate where the cultist arrived from. - Shadowlight213: - - tweak: Pluoxium is no longer considered dangerous for air alarms. - XDTM: - - tweak: Slimepeople can now host multiple minds in their body pool; occupied bodies - will be marked as such in the bodyswap panel. - - tweak: Slimepeople now retain 45% of their slime volume upon splitting instead - of a fixed amount. - Xhuis: - - rscadd: Defibrillator mounts can now be found in the CMO's locker or produced - from a medical protolathe after Biotech is unlocked. They can be attached to - walls, and hold defibrillators for public use. You can swipe an ID to clamp - the defibrillator in place, and it will automatically draw from the powernet - to recharge it. Being one tile away from the mount will force you to drop the - paddles. - - balance: Stargazers have been removed. - - balance: The clockwork cult now has a power cap of 50 kW. - - balance: Script scripture is now unlocked at 25 kW, and Application at 40 kW, - instead of 50 kW and 100 kW. - - tweak: Important scriptures are now displayed with italicized names. - Xhuis & Jigsaw: - - rscadd: Traitor clowns can now purchase the reverse bear trap, a disturbing head-mounted - execution device, for five telecrystals. - kevinz000: - - rscadd: Chameleon laser guns now have a special firing mode, activated by using - them in hand! Only certain gun disguises will allow this to work! - nicbn: - - bugfix: Bloodpacks will have their colors defined by the reagents - - imageadd: MMI dead sprite will now show a red light and no eyes instead of X-crossed - eyes - uraniummeltdown: - - imageadd: Solar panels have new sprites - - imageadd: Coffins have a new sprite -2018-02-01: - CosmicScientist: - - balance: tomatoes and similar ovary laden edibles are fruit, not veg, beware plasmamen - and mothmen - Denton: - - bugfix: Added a missing distress signal to the space ambush ruin. - Jalleo: - - rscdel: Space ghost syndicate comms guy removed. - Jittai: - - bugfix: Cloning doesn't runtime (and indefinitely get stuck) on cloning non-humans. - - tweak: Some of the Morgue Trays and Crematoriums on Box, Delta, and Meta have - been re-positioned to make use of their new directional states. - - imageadd: New Horizontal Coffin Sprites - SpaceManiac: - - tweak: The Whiteship spawn point is now a space ruin rather than being fixed every - round. - Xhuis: - - balance: Servant golems no longer appear in the magic mirror race list. - - bugfix: Cogs now fucking work - cebutris: - - spellcheck: The text you get when you examine a stunbaton to see the battery level - now uses the item's name instead of "baton" -2018-02-02: - Dax Dupont: - - tweak: Hijack objectives will only be given out if there are 30 or more players. - DeityLink: - - rscadd: You can now see the rays from a holopad displaying a hologram! - Epoc: - - bugfix: Soap now has inhand sprites - Xhuis: - - balance: Brass skewers now must be at least one tile apart. - - balance: Steam vents can no longer be placed within cardinal directions of other - steam vents, and will not hide objects they're placed on top of. - - bugfix: Races that have eyes that look different from regular humans' no longer - have white eyespots where human eyes appear. - Xhuis, Cosmic, Fwoosh, and epochayur: - - rscadd: Added pineapples to botany, and a recipe for Hawaiian pizza. - improvedname: - - rscadd: adds yeehaw to the dj's disco soundboard - oranges: - - rscdel: removes ketrazine -2018-02-03: - Dax Dupont: - - tweak: Moved the lathe from box's cargo room to box's cargo office which miners - now can access. - - tweak: Harmonized medbay storage access requirements so all maps allow all medbay - personnel into medbay storage like on Meta and Delta. - - tweak: Moved service lathes into a dedicated service hall/storage area if they - weren't accessible by janitor or bartender. - SpaceManiac: - - code_imp: Removed the now-unused revenant spawn landmark. - Xhuis: - - bugfix: Servant cyborgs with the Standard module now correctly have Abscond. - - bugfix: Securing pipe fittings now transfers fingerprints to the new pipe. - - bugfix: The firelock below the Circuitry Lab airlock on Boxstation will no longer - cover it up when the airlock is open. - uraniummeltdown: - - bugfix: Some airlock animations should no longer be glitchy and restart in the - middle -2018-02-04: - Buggy123: - - rscadd: Morgue trays now detect if a body inside them possesses a consciousness, - and alerts people nearby - Cruix: - - rscadd: The Rapid Piping Device can now dispense transit tubes. - Dax Dupont: - - rscadd: Added logout button to the record screen in the security records console. - - rscadd: Allows you to print photos that are in the security records. - Incoming5643: - - rscadd: The ability to throw drinks without spilling them has been moved from - something bartender's just know how to do to a book that they spawn with, the - ability has also been made into a toggle. - - rscadd: Any number of people can read the book to learn the ability, and it can - also be ordered in the bartending crate in cargo. Bartenders are encouraged - to keep their trade secrets close to their stylish black vests. - Kor: - - bugfix: Fixed mecha grav catapults not being included in techwebs. - MrDoomBringer: - - imageadd: Conveyor Belts now look better when they are crowbar'd off the ground. - - rscadd: Due to complicated quantum-bluespace-entanglement shenanigans, the Bluespace - Drop Pod upgrade for the express supply console is now slightly more difficult - to research. - Robustin: - - bugfix: Vape Pens (e-cigs) will now consume reagents proportional to the vape - size and static smoke production. - - bugfix: Command reports should now properly weight the appearance of modes based - on their existence in our actual game rotation. - - balance: The current mode now has a 35% chance of not appearing in the report. - ShiggyDiggyDo: - - rscadd: You can now win stylish steampunk watches at your local arcade machine! - ShizCalev: - - bugfix: Fixed some broken cultist & wizard antagonist ghost polls. - - rscadd: The Syndicate Comms Officer ghost role has been readded with a minor chance - of actually existing. - Slignerd: - - balance: Following an immense number of complaints filed by security and command - personnel, the Captain's spare ID will from now on be placed inside his locker. - We fail to see how this would help the Captain access the spare in the event - he lost his ID, but the complainants have been VERY insistent. - SpaceManiac: - - bugfix: The pirate ship can now fly again. - Xhuis: - - balance: Integration cog power generation has been increased to 10 W per second - (up from 5 W per second.) Power consumed from the APC remains at 5 W per second. - - balance: Integration cogs will now continue generating power at half-speed when - the APC they are in has no energy. - coiax: - - balance: Romerol is now effective on dead bodies, not just ones that are still - alive. - nicbn: - - rscadd: Destroying windows will now spawn tiny shards -2018-02-05: - Dax Dupont: - - balance: Regular cyborgs now start with a normal high capacity cell instead of - a snowflake cell. Resulting in less confusing and 2.5MJ more electric charge. - - bugfix: Fixed name of the upgraded power cell - - refactor: Removed duplicate cell giving code in transformation proc. - - bugfix: Fixed the crematorium on meta and box. - Denton: - - tweak: Rearranged the mining vendor items by price and item group. - - tweak: In order to promote back-breaking physical labor, Nanotrasen has additionally - made conscription kits available at mining equipment vendors. - Iamgoofball: - - rscdel: Blood cultists can't space base anymore - MMMiracles: - - rscadd: A once-thought abandoned arctic post has recently had its gateway coordinates - re-enabled for access via the Gateway link. Contact your local Exploration Division - for more details. - More Robust Than You: - - bugfix: Holorays are now properly deleted if you switch holopads automatically - Naksu and kevinz000: - - tweak: Ores are no longer completely impervious to explosions, but rather "proper" - ores are destroyed by the strongest explosions and sand is blown away everything - but the weakest ones. This shouldn't affect ore spawns from explosions - - tweak: Lavaland bomb cap reduced to double the station bombcap. - - refactor: Ores are now stackable. Ore stacks now have the appearance of loose - ores and are not called "sheets" by machines that consume them. - - code_imp: Material container component now uses the singular names of stack objects. - - refactor: /obj/item/ore/Crossed() is now removed in favor of the ore satchel utilizing - a redirect component - ShiggyDiggyDo: - - spellcheck: You no longer win double the articles at the arcade - SpaceManiac: - - bugfix: Research investigate logs now actually include the name of the researcher. - XDTM: - - bugfix: Fixes intelligence potions removing previously known mob languages - - tweak: Slime scanning now has a more readable output, especially when scanning - multiple slimes at once - - tweak: Eggs from the abductor egg gland now have a random reagent instead of acid -2018-02-06: - Dax Dupont: - - bugfix: AIs can no longer turn on broken APCs, - SpaceManiac: - - bugfix: Defibrillator mounts no longer spam the error log while empty. - - bugfix: The various ships in the caravan ambush space ruin can now fly again. -2018-02-07: - DaedalusGame: - - bugfix: Fixes Noblium Formation being multiplicative, so having 500 moles of tritium - and 500 moles of nitrogen no longer produces 2500 moles of noblium (it should - correctly produce 10 moles) - - bugfix: Fixes most reactions deleting more gas than exists and making gas out - of nowhere - - bugfix: Fixes Stim Formation invoking a byond bug and not using its intended polynomial - formula - - bugfix: Fixes Cryo Cells not having garbage_collect and clamping - - bugfix: Fixes Rad Collectors not having clamping - - bugfix: Fixes Division by Zero when Fusion has no impurities. - - bugfix: Removes a redundant line in lungs - - bugfix: Fixes rad_act signal not firing from turfs, living mobs, rad collectors - and geiger counters - - bugfix: fixes lava burning into chasm tiles i hate hate hate hate them so much - grrrr - - tweak: NT Scientists have started looking into data from small-scale detonations - and found that there's still potential data to be gathered from explosive yields - lower than 4.184 petajoules - Dax Dupont: - - tweak: Moved the pocket protector to lockers instead of on the uniform. - - rscadd: You can now insert holodisks into cameras and take a static holographic - picture of someone! - - rscadd: Hologram recordings can now be offset slightly. - - rscadd: Posibrains have gotten a small firmware update, they will now play a sound - on successful activation. - - rscadd: Killing a revenant will now result in an unique shuttle to be able to - be bought. You probably won't like it though. - - rscadd: Fake emag now available. - Denton: - - spellcheck: Mining drone upgrades are no longer referred to as "ugprade" - - tweak: Fungal tuberculosis spores can no longer be synthesized by machinery. - Kor: - - rscadd: Spawning as a syndicate comms officer will now activate an encrypted signal - in the Lavaland Syndicate Base, to aid the crew in retaliating. - Ordo: - - rscadd: Mamma-mia! The chef speaks-a so different now! - Robustin: - - balance: The "construct shell" option from the cult archives structure will now - only yield one shell instead of two. - - balance: Sacrificing suicide victims will now only yield an empty shard. - - balance: Synths and Androids are no longer available species at the magic mirror. - ShiggyDiggyDo: - - rscadd: You can now win Toy Daggers at your local arcade! - Skylar Lineman: - - rscadd: Nanotrasen has new intelligence that the newest batch of Syndicate agent - equipment includes sticky explosives disguised as potatoes, designed to incite - terror among whoever is unlucky enough to have one stuck onto their hands. - - rscadd: 'Nanotrasen''s toy suppliers have also started making faux versions of - these, with less-forceful attachment mechanisms and absolutely zero explosive - materials for a child-safe experience. experimental: Explosive Hot Potatoes - are now available for purchase by syndicate-affiliated cooks, botanists, clowns, - and mimes.' - SpaceManiac: - - bugfix: Pressure damage now takes effect in certain situations where it should - have but did not. - Xhuis: - - rscadd: Nanotrasen's anomalous materials division has recently experienced a containment - breach, during which a certain pizza box went missing. Be on the lookout for - any slipups in cargo. - - spellcheck: Pizza margherita is now named "pizza margherita" (the proper way!) - instead of just "margherita." - - tweak: Brass chairs now stop spinning after eight rotations, so you can't crash - the server with them. - coiax: - - rscadd: Eggs now contain 5u of egg yolk. Breaking an egg in a glass container - adds all reagents inside to the container. If you're laying abductor gland eggs, - then you'll get 5u of egg yolk and 10u of random reagent. Egg glands now make - you act like a chicken while laying eggs. Egg laying makes you use the aliennotice - span. - kevinz000: - - balance: Explosive holoparasites must now be adjacent to turn objects into bombs, - instead of being able to do so from any range. -2018-02-09: - Cyberboss: - - balance: Printed power cells must now be charged before use - Dax Dupont: - - bugfix: Supermatter can again blow up again on space tiles. - - bugfix: Fixed borgs applying cuffs on people without the right number of arms. - - refactor: Handcuff code has been rejiggled and snowflake code has been removed. - - rscdel: Removed unused cable cuffs module stuff for borgs. - - bugfix: Telecom equipment now can only be printed by engineers and scientists - as intended. - - bugfix: WT-550 AP can only be printed by sec now. - - tweak: Removed engineering requirement for arcade machines to bring it in line - with others. - - rscadd: Defibs can now be researched and printed. - - balance: Hatches are now small instead of tiny. - Denton: - - code_imp: Changed can_synth values from 0/1 to FALSE/TRUE - - code_imp: Removes grind_results from empty soda cans since they can't be ground. - - spellcheck: For consistency's sake, aluminium is now universally spelled with - two 'i'. - Epoc: - - imageadd: Belt items now have inhand sprites - Evsey9: - - balance: Integrated Circuit Drones are now bulky to improve safety ratings, and - therefore, cannot be stored in normal backpacks or pockets, but now can accept - modules that bulky circuit machinery can. - - balance: Grabbers can now grab items up to the size of the circuit assembly they - are in. - - balance: Grabbers cannot store circuit machinery the same or larger size than - the circuit assembly they are in. - - tweak: Throwers now can throw items up to the size of circuit assembly they are - in. - MMMiracles: - - rscadd: A brand new space-farm, where your family sends all your old/sick catpeople - to live out the rest of their days being free to roam the acres and chase the - field grayshirts. - Naksu: - - bugfix: Cyborg engineering module geiger counters now work properly again - PKPenguin321: - - rscadd: As it would happen, the chef does not actually have Italian genes, but - rather was being influenced by a strange moustache-a. - Robustin: - - bugfix: Fixes the cult master getting two notifications on the cult forge - - rscadd: Blood spells will now "follow" the spell creation button, which is now - unlocked by default. If you want your spell "hotbar" to appear somewhere else, - just move the blood spell button, it will update when you prepare a new spell. - Also, individual spells start off locked but if you unlock them they will no - longer reposition when the spells are updated. - Robustin and More Robust Than You: - - rscadd: A heart disease event has been added. The cure is heart replacement surgery. - Effects of cardiac arrest are halted by the chemical Corazone. Once cardiac - arrest begins at Stage 5, the disease can be cured by a defibrillator or from - a lucky electric shock. - - rscadd: Using gym equipment will now grant a hidden exercise buff that prevents - heart disease for 20 minutes. - SpaceManiac: - - bugfix: Goliath hide plates now properly apply to explorer suits and APLUs again. - oranges: - - rscdel: Removed the saltmine grief shuttle -2018-02-10: - Cruix: - - balance: Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen - to plasma, hydrogen, and oxygen. - - bugfix: These were necessary due to recipe conflicts - Dax Dupont: - - bugfix: Cloner UI now properly updates cloning pod status when autocloning starts - cloning someone. - Ordo: - - tweak: Replaced nitrogen with ethanol in morphine recipe. The recipe now has a - lower yield. - Robustin: - - bugfix: Fixed the limb grower having a max volume of 0. - UI Changes: - - tweak: The Scan with Debugger/Device button now reads Copy Ref and no longer sends - you to the circuit's page when clicked - - tweak: The assembly's menu is now slightly wider - - tweak: The advanced in "integrated advanced medical analyser" is now abbreviated - to adv. - Xhuis: - - bugfix: The preference to lock action buttons in place is now correctly saved - across rounds. -2018-02-11: - DaedalusGame: - - bugfix: Prevents megafauna (and other large things like spiders and mulebots) - from going into machines - Dax Dupont: - - rscadd: You can now win a fake cryptographic sequencer, perfect to go with your - fake space suit! - - tweak: 'To login with an emag on the APC console you will now need to hit it with - the emag. removed: Snowflake emagging implants is no more, Swipe it before install.' - - refactor: everything uses emag_act() now - - balance: Grabbers/throwers no longer can contain/throw things equal to the assembly - size. - - bugfix: Fixes duplicate air alarm on meta. - Kor: - - rscadd: Mining sentience upgrades now grant minebots an ID and radio. - Mokiros: - - rscadd: All-In-One Grinder can now be built with researchable curcuit and micro-manipulator. - More Robust Than You: - - rscadd: You can now squish urinal cakes - More Robust Than You, Basilman, and MMMiracles: - - rscadd: Deep in space, a valuable artifact awaits - Naksu: - - rscdel: Steam engines have been removed from maintenance, engineering, atmos and - teleportation areas. - - rscadd: The chef is now trained for working under siege - Shadowlight213: - - admin: The notify irc/discord bot chat command no longer requires admin privileges. - ShizCalev: - - bugfix: Corrected a number of missing checks when using alt-click actions. Please - report any strange behavior to a coder. - - spellcheck: Corrected typo in NTNet Scanner circuits' name, make sure to update - your blueprints. - uraniummeltdown: - - rscadd: You can now smelt titanium glass and plastitanium glass - - rscadd: Use titanium glass and plastitanium glass to build shuttle windows and - plastitanium windows -2018-02-12: - Dax Dupont: - - bugfix: AI no longers block ark after mass_recall - - bugfix: Placed the dispersal logic AFTER the mass_recall on ark activation instead - of infront(did nothing before basically). - - rscadd: Cell chargers can now be built and upgraded with capacitors! - - bugfix: Fixed empty subtype batteries not updating icons - Denton: - - bugfix: Fixes lye/plastic/charcoal conflicts when mixing. - - bugfix: Lye is now made by combining ash with water and carbon. Plastic sheets - by heating ash, sulphuric acid and oil. - More Robust Than You: - - bugfix: Your hand no longer magically squishes urinal cakes when trying to pick - them up - - bugfix: SCP-294 no longer looks fucked up - Robustin: - - balance: The rift created by teleporting in from space will now include a description - indicating the direction of the "origin" teleport rune - giving the examiner - a fair idea of where the "space base" is located. - - balance: You can no longer manifest spirits or summon cultists while in space - or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral - jaunt, etc.) in either of these locations. - - balance: Juggernauts have lost 20% reflect rate on energy projectiles (now around - 50% for standard lasers). - - balance: Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively). - - balance: Construct shells now cost 50 metal through the "twisted construction" - spell. Twisted construction is now a "single use" spell. - - balance: The Concealment spell will now work on cult airlocks (including converted - airlocks). The "concealed" airlock will appear as a generic airlock but will - deny access to any non-cultist. - - balance: The draw blood effect on blood splatters will now draw more blood from - stains with low blood levels. - - tweak: Unanchored (via ritual dagger) cult structures are no longer "dense", meaning - you can move them through teleport runes more efficiently. - - tweak: The button to nominate yourself for cult master now has a confirmation - prompt seeking assurance that the user is prepared to be the cult's master. - - tweak: The reveal aspect of the concealment spell is slightly smaller, albeit - still slightly larger (6 range) than the concealment aspect (5 range). - - imageadd: Juggernauts "gauntlet echo" now has a more cult-themed appearance. - - bugfix: Using a shuttle curse to push the shuttle timer above its default can - no longer be "reset" with a recall. This also adds a block_recall(time_in_deciseconds) - helper-proc to the shuttle subsystem. - - bugfix: Using runed metal on a regular girder is no longer an option, preventing - runtimes and deletions associated with the (unintended) combination. -2018-02-13: - Buggy123: - - tweak: After consulting with their in-house physicists, Nanotrasen has updated - their worst-case disaster training simulation "Space Station 13". The combustion - of hydrogen isotopes now produces water vapor instead of carbon dioxide. - Dax Dupont: - - rscadd: Added hooray emoji! - Iamgoofball: - - bugfix: The Cook now ONLY works under siege. - TehZombehz: - - rscadd: Heart-shaped boxes of chocolates are now included in Valentine's Day event - gifts -2018-02-14: - Dax Dupont: - - bugfix: Integrated circuits no longer start upgraded. - - balance: The IC printers that are available on round start in the IC labs are - no longer upgraded by default. You will need to research these as was intended - Frozenguy5: - - bugfix: You can craft rat kebabs now. - Naksu: - - bugfix: Chasms no longer eat shuttle docking ports, rendering them unusable and - unresponsive - - tweak: The clogged vents event has been removed for pressing ceremonial reasons - coiax: - - rscadd: Transference potions now just rename the mob that you are transferring - into with your name, rather than your name plus the old name of the mob. -2018-02-15: - Kor: - - rscadd: Bluespace slime extracts now have a new chemical reaction with water, - which create slime radio potions. When applied to a simple animal, that mob - gains an internal radio. - MrStonedOne: - - balance: You no longer need an aggressive grab to table someone. - SpaceManiac: - - refactor: Map initialization now supports stations with multiple z-levels. - - bugfix: The map reader no longer sometimes expands the world size inappropriately. - - tweak: Pride's Mirror's destination has become less predictable. -2018-02-16: - AnturK: - - rscdel: Minimap gone from crew monitoring - DaedalusGame: - - code_imp: made powercell rigging no longer set rigged to the plasma reagent datum - what the hell and makes it use TRUE/FALSE defines - Denton: - - tweak: Emagging meteor shield satellites now shows you a message. - - spellcheck: Fixed a typo when emagging RnD servers. - MMMiracles: - - rscadd: You can now produce a cryostatis variant of the shotgun dart after researching - Medical Weaponry. Holds 10u and doesn't have reagents react inside it. - MetroidLover: - - rscadd: Added the ability to gain smoke bomb charges by attacking the initiated - ninja suit with a beaker containing smoke powder - More Robust Than You: - - bugfix: Fixes SCP-294 losing its top sometimes - Naksu: - - code_imp: replaced some item-specific movement hooks with components - Xhuis: - - tweak: Removing and printing integrated circuits will now attempt to place them - into a free hand. - - tweak: You can now hit an integrated circuit printer with an unsecured electronic - assembly to recycle all of the parts in the assembly en masse. - - tweak: You can now recycle empty electronic assemblies in an integrated circuit - printer! - - soundadd: Integrated circuit printers now have sounds for printing circuits and - assemblies. - - bugfix: The RPG loot event will no longer break circuit analyzers. - coiax: - - rscadd: Centcom now reports that thanks to extensive bioengineering, apples and - oranges now taste of apples and oranges, rather than nothing as they did before. -2018-02-17: - DaedalusGame: - - bugfix: fixes lava and fire burning HE-pipes - - rscadd: added a subreaction for rainbow slime cores, injecting 5u of plasma now - makes them explode into random slimecores. - - rscadd: added a slimejelly reaction to rainbow slime cores that does the above - but all the cores that spawn get 5u each of plasma, water and blood injected. - (aka chaos) - - code_imp: improved clusterbuster code with Initialize, addtimer, vars for sounds - and payload spawners, etc - Dax Dupont: - - bugfix: After an incident where a very eager roboticist kept expanding a borg's - size leading to a structural collapse of the entire station proper safety limitations - have been implemented. - - bugfix: You can rotate freezers and cryo again. - - rscadd: Nanotrasen has invested in better reflective materials for it's reflectors. - You can now make complex laser shows again. - Modafinil: - - rscadd: Adds new medicine chem that suppresses sleep and very lightly reduces - stunrates, has a very low metabolic rate which is randomized and a low overdose - treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently - and with charcoal/calomel before it puts you to sleep) - TankNut: - - tweak: Corpses spawned in ruins have their suit sensors disabled - coiax: - - admin: Admins can use the Select Equipment verb on observers. Doing so will humanise - them and then apply the equipment. - - bugfix: Species with RESISTHOT (golems, skeletons) can extinguish burning items - as if they were wearing fireproof gloves. - jakeramsay007: - - bugfix: Jellypeople/Slimepeople now are able to speak their Slime language, as - intended when it was added. - yorii: - - bugfix: removes the maintenance panel examination message on poddoors (blast doors) -2018-02-18: - More Robust Than You: - - bugfix: Actually fixes SCP 294 overlay problems - Naksu: - - rscadd: Exosuit fabricators can now build RPED and crew pinpointer upgrades for - engineering and medical borgs respectively. - Ordo: - - rscadd: Adds a few new liquors to the bar, and a few new cocktails to boot! - Xhuis: - - tweak: Crew pinpointers now fit on medical belts! - YPOQ: - - bugfix: Bicycles are rideable again -2018-02-19: - DaedalusGame: - - bugfix: Fixed paper bins not catching fire properly - - bugfix: fixed multiserver mining formula - Improvedname: - - bugfix: Fried eggs don't require boiled eggs anymore and just normal eggs - Kevinz000 and Naksu: - - bugfix: Ore stacks will now initialize with proper visuals and no longer show - a NO SPRITE text when you gather more than 20 ores to a stack. - XDTM: - - rscadd: 'Added three new techweb nodes: Advanced Surgery, Experimental Surgery, - and Alien Surgery(requires abductor tech)' - - rscadd: Added several new surgical procedures, which require these techweb nodes. - To enable an advanced surgery, print its relative disk from a protolathe, and - load it on an Operating Computer. Advanced surgery can only be performed at - operating tables. - - tweak: You can now intentionally fail surgical procedures by initiating them with - disarm intent instead of help intent. - - rscadd: Brain traumas now have a custom resilience system. Some trauma sources - can cause traumas which require more extensive treatment, such as the new Lobotomy - surgery. - - rscadd: Traitors can now purchase a Brainwashing Surgery Disk for 5 TC. - Xhuis: - - bugfix: New blob tiles are no longer invincible after their blob's death. - - bugfix: Blob nodes no longer produce blob tiles even after the blob's death. - coiax: - - rscadd: Mime's Bane, a toxin that prevents people from emoting while it's in their - system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 - part Radium. -2018-02-20: - Anonmare: - - rscadd: Nanotrasen psychologists have identified new phobias emerging amongst - the workforce. Nanotrasen's surgeon general advises all personnel to just buck - up and deal with it. - AverageJoe82: - - rscadd: Circuits integrity, charge, and overall circuit composition is displayed - on diagnostic huds. If the assembly has dangerous circuits then the status icon - will display exclamation points, if the assembly can communicate with something - far away a wifi icon will appear next to the status icon, and if the circuit - can not operate the status icon will display an 'X'. - - rscadd: AR interface circuit which can modify the status icon if it is not displaying - the exclamation points or the 'X'. - - tweak: Locomotive circuits can no longer be added to assemblies that can't use - them. - - spellcheck: Fixed a typo in the grenade primer description. - - code_imp: Added flags to circuits that help group subsets of circuits and regulate - them. - DaedalusGame: - - bugfix: fixed ghost spawners showing up in the spawner menu when you can't use - them - - bugfix: fixed walls under doors breaking to space - - tweak: changed doors to no longer spawn on top of walls - Dax Dupont: - - rscadd: Adds special tutorial holopads for the hazard course. - Jittai: - - tweak: Ctrl+Clicking progresses through grab cycle on living mobs (not just humans) - Joan: - - tweak: The crusher kit now includes an advanced mining scanner. - - tweak: The resonator kit now includes webbing and a small extinguisher. - - tweak: 'The minebot kit now includes a minebot passthrough kinetic accelerator - module, which will cause kinetic accelerator shots to pass through minebots. - The welding goggles have been replaced with a welding helmet, allowing you to - wear mesons and still be able to repair the minebot without eye damage. feature: - You can now install kinetic accelerator modkits on minebots. Some exceptions - may apply. Crowbar to remove modkits.' - - balance: Minebots now shoot 33% faster by default(3 seconds to 2). The minebot - cooldown upgrade still produces a fire rate of 1 second. - - balance: Minebots are now slightly less likely to sit in melee like idiots, and - are now healed for 15 instead of 10 when welded. - - balance: Sentient minebots are penalized; they cannot have armor and melee upgrades - installed, and making them sentient will override those upgrades if they were - installed. In addition, they move very slightly slower and have their kinetic - accelerator's cooldown increased by 1 second. - NTnet circuit fix: - - bugfix: Now NTnet circuits can recieve sender adress properly.Also, now messages - could be sended to multiple recepiens. - Xhuis: - - rscadd: Admins may now spawn a debug circuit printer that can always print circuits, - and has infinite metal. - - bugfix: Buttons, number pads, and text pads in integrated circuits now correctly - show their labels. - - bugfix: Integrated hypo-injectors can now correctly draw blood. - - tweak: The circuit analyzer output has been slightly tweaked and includes usage - instructions. - - rscadd: The round-end report now shows information about the first person to die - in that round. - - rscadd: Added the dish drive. This machine, the future in plate disposal, can - be researched from techwebs (Biological Processing) and built with a standard - machine frame using two matter bins, a micro manipulator, and a glass sheet. - - rscadd: A circuit board for the dish drive can be found in the chef's and bartender's - wardrobes. - - rscadd: You can hit a dish drive with any dish (like a plate or drinking glass), - and the dish drive will convert it from matter to energy, allowing it to store - an infinite amount of dishes. You can also interact with it to get things back - from it. - - rscadd: Dish drives also have an automatic "suction" function that sucks in all - loose dishes within four tiles. This can be toggled by activating its circuit - board in-hand. - - rscadd: Dish drives automatically beam their stored dishes into any disposal unit - that it can see within seven tiles every minute. You can toggle this by alt-clicking - its circuit board. - - tweak: Plastic surgery now lets you choose from a list of ten random names, so - you can pick the one that you prefer. - - tweak: Abductors performing plastic surgery can now give their target spooky subject - names, with one normal name available for standard plastique. -2018-02-21: - Denton: - - code_imp: Renamed the IDs of various reagents to be more descriptive. - - spellcheck: Fixed the descriptions of changeling adrenaling reagents. - - tweak: Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. - Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes. - - spellcheck: Tweaked the message you see when emagging meteor shield satellites. - Kevinz000 & Deathride58: - - rscadd: A separate round time has been added to status panel. This will start - at 00:00:00. - - rscadd: Night shift lighting [if enabled in the same configuration] will activate - between station time 7:30 PM and 7:30 AM. This will dim all lights affected, - but they will still have the same range. - - rscadd: APCs now have an option to set night lighting mode on or off, regardless - of time. - Naksu: - - bugfix: Flightsuits should be controllable again -2018-02-22: - Buggy123: - - tweak: Nanotrasen has begun a campaign to inform their employees that you can - alt-click to disable morgue tray beeping. - Jittai / ChuckTheSheep: - - imageadd: NT has stopped buying re-boxed storebrand Donkpockets and now stocks - stations with real, genuine, tasty Donkpockets! - MetroidLover: - - balance: rebalanced Ninja event to allow it to happen earlier. - - bugfix: fixed Ninja welcome text to no longer tell you to right click your suit. - Naksu: - - code_imp: removed unused poisoned apple variant - Repukan: - - bugfix: fixed windoors dropping more cable than what was used to build them. - Robustin: - - bugfix: The clock cult's marauder limit now works properly, temporarily lower - the marauder limit when one has recently been summoned. - Super3222, TheMythicGhost, DaedalusGame: - - rscadd: Adds a barometer function to the standard atmos analyzer. - - imageadd: Adds a new sprite for the atmos analyzer to resemble a barometer. - kevinz000, Denton: - - rscadd: Nanotrasen's RnD division has integrated all stationary tachyon doppler - arrays into the techweb system. Record increasingly large explosions with them - and you will generate research points! - - spellcheck: Fixed a few typos in the RnD doppler array name/description. -2018-02-25: - Astral: - - rscadd: Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which - is capable of synthesizing it's own syringes, but does so slowly, and can be - easily identified as syndicate by anyone who isn't blind! - Cebutris: - - tweak: Toxin loving species now properly take toxin damage from liver failiure - DaedalusGame: - - bugfix: enables the RPED to construct/replace other parts commonly used in machines - (igniters, beakers, bs crystals) - - bugfix: fixes part ratings of cells so slime cells are correctly more desirable - than bluespace cells and other such nonsense - - bugfix: shivering symptom now works properly instead of only cooling you if you're - already cold - - bugfix: fixed bodytemp going negative in a few cases - - code_imp: removes input/output plates and changes autogibbers to use input dir - - tweak: The last scientists have reported that thermonuclear blasts triggered by - so called 'power gamers' have shorted the doppler array. We've readjusted the - ALU and are confident that this will not happen again. - Denton: - - tweak: The outer airlocks of most space ruin airlocks are now cycle linked. - - tweak: The outer airlocks of various lavaland ruins and ships now cycle lock. - - bugfix: Players can no longer kill themselves by whispering inside clone pods. - - tweak: The 'neurotoxin2' toxin has been renamed to Fentanyl. - Naksu: - - admin: Admins can now start the game as extended revs, a version of revs that - doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which - nukes the station after 20 minutes. - Repukan: - - rscadd: Whiskey to the flask - - rscdel: Hearty Punch from the flask - ShizCalev: - - tweak: Silicons no longer have to be adjacent to morguetrays to disable the alarms - on then. - ThePainkiller: - - tweak: Tweaked the inventory management of the black fedora to be more like the - detective's - Xhuis: - - rscadd: Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple - citrus, and berry juice. When it's in your system, it will very slowly heal - you as long as you're not in critical. When it's first added to your system, - you heal an amount of each damage type equal to the volume taken in, with a - max of 10. This is turned to a max of 20 for anyone in critical. - - rscadd: Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. - It's nutritious and healthy! - - tweak: Reskinning objects now shows their possible appearances in the chat box. - deathride58: - - rscadd: Lights will now actually glow in the dark! -2018-02-26: - DaedalusGame: - - balance: livers don't unfail automatically every second life cycle you have to - get a new one or get some corazone stat - - balance: increased liver damage from alcohol significantly because apparently - your liver regenerates faster than you can chug unless you drink 100 liters - of bacchus blessing - - bugfix: fixed cyber livers thinking they should fail at half durability - MMMiracles: - - rscadd: Added tinfoil hats, headgear that can help protect against government - conspiracies and extra-terrestrials. Found in hacked autolathes. - Robustin: - - bugfix: Twisted Construction will now consume ALL available plasteel in a stack. - - bugfix: Runes will no longer count the original invoker more than once. - XDTM: - - balance: Wizard spells and items can now be resisted/ignored with anti-magic items/clothing - such as null rods! - - balance: Revenant spells can now be resisted with "holy" items like null rods - and bibles. - - balance: Wizard hardsuits are now magic immune, but not holy. - - balance: Immortality Talismans now grant both spell and holy immunity. - - tweak: Inquisitor Hardsuits already granted spell and holy immunity, but now they - do it properly instead of having a null rod embedded inside. - - tweak: Holy Melons now grant holy immunity. - - tweak: Operating computers now display the chemicals required to complete a surgery - step, if there are any. - - tweak: Completing a surgery without the required chems will always result in failure, - instead of a success with no effect. - - balance: You can no longer gain the same trauma more than once. - - balance: 'You can no longer gain more than a certain amount of brain traumas per - resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain - 3 mild and 1 severe)' - - tweak: Abductors' trauma gland now gives traumas of random resilience, instead - of lobotomy every time. - Xhuis: - - balance: Instead of starting unable to clone circuits at all, circuit printers - can now print circuits over time from roundstart. The formula for this is equal - to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing - progress by using the printer's interface, and you can print normal components - during this time. - - balance: If circuit printing is disabled in the config, cloning remains unavailable. - - balance: The upgrade disk to allow circuit printers to clone circuits has been - replaced with an upgrade disk to make circuit cloning instant. - - balance: Both circuit printer upgrade disks now cost 5000 metal and glass, down - from 10000. - - code_imp: Butchering has been refactored. - - balance: Some items now take longer to butcher, and have a chance to harvest fewer - items, like spears. Others, however, are faster, like circular saws. - - balance: Certain creatures will always drop certain items on butchering, regardless - of butchering effectiveness or chances. - - balance: Items that are very effective at butchering may yield bonus loot from - butchered creatures! - - rscadd: Plain hamburgers may now spawn as steamed hams with a very low chance. -2018-02-27: - Astral: - - rscadd: blood cultists can now use a nar nar plushie as an extra invoker for runes! - Iamgoofball: - - rscadd: Look sir, free crabs! - Poojawa: - - rscadd: Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental - research points! - Robustin: - - bugfix: The heart attack event will now actually make the victim acquire the heart - disease - - bugfix: Clicking the chatbox link will let you orbit the victim - - tweak: The event is now significantly more sensitive to junk food. Recent consumption - of multiple junk food items will triple your chances of having a heart attack - (exercise will still block it). - selea: - - bugfix: fixed floorbot - - bugfix: fixed cleanbot - - refactor: improved pathiding in case of given minimal distance;improved sanitation -2018-03-02: - AlexTheSysop: - - bugfix: C4 logging now shows correct location - Astral: - - imageadd: Space is now prettier - DaedalusGame: - - tweak: Machines can now be constructed anchored or unanchored, if the resultant - machine could be unanchored. - Dax Dupont: - - rscadd: Medals now show the commendation text in the description. - Denton: - - tweak: Cargo packs have been grouped and sorted alphabetically. Station goal crates - are now in the Engineering section. - - tweak: The cargo security section has been split into security/armory. - - tweak: Grouped all gas canisters and fuel/water tanks together in one section - with raw materials. - - spellcheck: Fixed a few cargo pack descriptions. - - tweak: Cyclelinked three airlock pairs on Boxstation (port bow solars and the - area that connects RnD with medical). - Improvedname: - - bugfix: chem implants can no longer be self triggered - Jittai / ChuckTheSheep: - - imageadd: New chemdispenser (and minidispenser) sprites. - - imageadd: New soda/beer dispenser sprites, with directional states. - Mey-Ha-Zah: - - imageadd: Heck suit sprites are prettier, with more contrast. - MoreRobustThanYou: - - bugfix: SCP-294 should no longer have overlay problems - Naksu: - - rscdel: SNPCs have been removed. - Poojawa: - - bugfix: Cyborg defib units are now actually functional - XDTM: - - tweak: Bath Salts now induce psychotic rage, but cause much more brain damage. - Xhuis: - - rscadd: Traits! You can now select up to three positive, negative, and neutral - traits in the character setup. You can choose up to six traits based on combinations - varying by the amount of points you earn with negative traits and spend with - positive ones. - - rscadd: You can now splash metal sheets with copper to make bronze sheets, which - you can make "clockwork" things out of. - YPOQ: - - bugfix: The assault pod can be launched again. - uraniummeltdown: - - rscadd: The chatbar now has OOC and Me buttons - - tweak: The chatbar font-size is smaller -2018-03-03: - Cebutris: - - bugfix: Washing a glove with a white crayon will make it look like a white glove, - instead of a latex glove. Instead, mime crayons make gloves look latex - Denton: - - bugfix: Burglar alarms in the Pubbystation library and RD office can now be disabled - properly. - - bugfix: Fixed Pubbystation's RD office shutters. - - rscadd: Added missing engineering and kitchen lockdown shutters on Pubbystation. - - rscadd: 'Pubbystation: Added privacy shutters to the CMO and RD offices. Added - space shutters to the HoS office. Replaced the RD office''s directional windows - with fulltile ones.' - - rscadd: Added a second blast door to the Pubbystation gulag shuttle lockdown. - - tweak: Due to pressure from the space OSHA, Pubbystation has installed missing - fire alarms and firelocks. - - tweak: Split the Pubbystation library into two areas with their own APCs. - Naksu: - - admin: Admins can now easily spawn cargo crates - - admin: Admins can now toggle antag, med, sci, engineering huds and maximum ghost - brightness with just one button. - Robustin: - - balance: Meth now deals 1-4 brain damage while active, up from 0.25 - Selea: - - balance: reduce CD of all non manipulative non list output circuits to 0.1 - - balance: add to locomotion circuit output ref with object, which assembly was - bumped to. - - balance: upgrade disks have multiuse. balance:iducer efficiency= efficiency/number - of inducers on 1 tile. - - balance: unnerf fuel cell.about 3-5 times.Make blood more powerful. - ShizCalev: - - rscadd: You can now hotswap tanks in a canister or gas pump by clicking it with - a new tank! - - rscadd: You can now also close a canister's valve and remove the tank inside it - by alt-clicking it. -2018-03-04: - DaedalusGame: - - balance: changed the formula of liver damage so weak alcohol does barely anything - while strong alcohol is still threatening - Iamgoofball: - - bugfix: RIP Billy, you'll be the boss of heaven's gym now :( - Jalleo: - - admin: Added a cancel button to nuke timer (and others). You no longer have to - make it 0 just a click to cancel. - - admin: You can now easily set how many "INSERT JOB ROLE HERE" you want in the - manage job selection in the admin panel. If you put zero in it will set it to - the current amount of filled positions. - - bugfix: moved a small amount of wording around in a admin browser to make it cleaner - looking. Along with a few updated checks for certain things. - Naksu: - - code_imp: First pass on cleaning up junk defines and unused code - RandomMarine: - - rscdel: The ore redemption machine no longer has 'release all' buttons. Remember - to take just what you need and leave some for the other departments. -2018-03-05: - 81Denton: - - tweak: 'Deltastation: Removed a windoor to make the northern chemistry fridge - more accessible.' - Cruix: - - rscadd: Added a new mini antagonist, the sentient disease. - DaedalusGame: - - bugfix: Fixes the auxbase camera console not placing airlocks on fans but doing - so vice-versa - Dax Dupont: - - balance: Others can now take off your tinfoil hat as seemingly originally intended. - - balance: Due to the nature of tinfoil hats, the delay of putting a tinfoil hat - on unwilling participants has been increased. - Denton: - - bugfix: 'Pubbystation: Added a missing APC to the cargo sorting room, a light - fixture to the RnD security checkpoint and removed an overlooked firelock east - of the bridge.' - - rscadd: 'Pubbystation: Added a spare RPD to the Atmospherics department. Replaced - Engineering''s outdated meson goggles with modern engineering scanners. Added - a GPS device to the secure storage crate.' - - tweak: Moved Pubbystation's drone shell dispenser from the experimentation lab - to Robotics maint. - Jittai / ChuckTheSheep: - - tweak: Adjusted the space parallax's contrast to be less vibrant. - Naksu: - - rscadd: Advanced roasting sticks, a product of applied bluespace research can - now be built from service protolathes. They can be used to cook sausages on - campfires, supermatter engines, tesla balls, singularities and a couple of other - things. - - admin: Admins can now grant spells via implants, using the spell implant. Some - VV is required. - Potato Masher: - - bugfix: The Wizard Federation has finally modified their production method for - pre-packaged magic tarot cards for better compatibility with time-stopping spells. - Guardians Spirits are no longer frozen by their user's time-stops. - SpaceManiac: - - bugfix: Night shift no longer ignores rooms whose APCs are in port or starboard - central maintenance. - - bugfix: Inserting brains into MMIs and then into mechs now works again. -2018-03-06: - MrDoomBringer: - - tweak: Advances in Rapid Delivery Technology have yielded a reduced premium on - express cargo orders! Orders from the express console now have a cost multiplier - of 1, down from 2. - MrStonedOne: - - bugfix: gas overlays once again no longer steal clicks - - rscdel: 511 clients will be unable to see gases once again. the 512 client crashes - are fixed so this shouldn't be that big of a deal. - Naksu: - - admin: Admins can now easily spawn mobs that look like objects. Googly eyes optional! - XDTM: - - rscadd: Revenants now have randomly generated names. - Xhuis: - - code_imp: Traits are now assigned in a way that should cause fewer edge cases - and strangeness. - - bugfix: Night Vision should now work. - - bugfix: Traits no longer tick while dead. - - tweak: RDS now triggers twice as often. - - tweak: You can now modify your trait setup mid-round. Your character is locked - to the traits you had selected when you spawned in, though. - selea: - - bugfix: After several months of natural selection, hostile mobs started to attack - assemblies with combat circuits. -2018-03-08: - ACCount: - - rscadd: Station airlocks now support NTNet remote control. Door remotes now use - NTNet. - - rscadd: Don't worry, any non-public airlock is fully protected from unauthorized - control attempts by NTNet PassKey system! - - rscadd: 'New integrated circuit component: card reader. Use it to read PassKeys - from ID cards.' - - bugfix: Fixes a delay issue when airlocks are being opened/closed by signalers. - Astral: - - bugfix: Lighting fixtures should no longer be visible in camera-less areas by - cameras. - - rscadd: Ghosts can now examine sentient diseases to see info - CameronWoof & MrDoomBringer: - - rscadd: Adds medical sprays, a new application method for touch chems - - rscadd: Pre-loaded medical sprays can be obtained from NanoMeds - - rscadd: Empty medical sprays can be found in boxes in chemistry and from cargo's - medical crate - - tweak: Sterilizer spray has been migrated to be a medspray instead of being a - spray bottle - Cebutris: - - spellcheck: lithenessk -> litheness - Cruix: - - rscadd: Sentient diseases now get two minutes to select an initial host before - being assigned a random one. - Dax Dupont: - - rscadd: Beacons can now be toggled on and off. - - rscadd: Mappers can now have beacons that default to off. Useful for ruins! - - tweak: Renaming replaces the snowflake locator frequency/code - - refactor: Beacons are no longer radios. Why were they radios in the first place? - I don't know. - - bugfix: You can now lay meters again with the RPD. - Denton: - - rscadd: Pubbystation's RnD department has been outfitted with a brand new circuitry - lab! It is found east of the Toxins launch room. - Floyd / Qustinnus (Sprites by Ausops, Some moodlets by Ike709): - - rscadd: Adds mood, which can be found by clicking on the face icon on your screen. - - rscadd: Adds various moodlets which affect your mood. Try eating your favourite - food, playing an arcade game, reading a book, or petting a doggo to increase - your moo. Also be sure to take care of your hunger on a regular basis, like - always. - - rscadd: Adds config option to disable/enable mood. - - rscadd: 'Indoor area''s now have a beauty var defined by the amount of cleanables - in them, (We can later expand this to something like rimworld, where structures - could make rooms more beautiful). These also affect mood. (Janitor now has gameplay - purpose besides slipping and removing useless decals) remove: Removes hunger - slowdown, replacing it with slowdown by being depressed' - - imageadd: Icons for mood states and depression states - MMMiracles: - - tweak: Thirteen Loko now has an overdose threshold of 60u, see your local CMO - for potential side-effects. - MrDoomBringer: - - tweak: Emagging the emergency shuttle now fries the on-board acceleration governor. - Better buckle up! - Naksu: - - balance: The nuclear authentication disk no longer treats the transit space as - a whole as being "in bounds", but instead checks whether it is in an approved - shuttle type (syndicate shuttles, escape shuttles, pubbiestation's monastery - shuttle, escape pods are allowed) - - bugfix: Blueprints can no longer be used to create areas inside shuttles. This - fixes various exploits involving shuttles and areas. - - bugfix: Moving across a space z-level border can no longer place you inside a - shuttle or a dense turf such as an asteroid. - SpaceManiac: - - bugfix: The Shift Duration in the round-end report is no longer blank in rounds - lasting between one and two hours. - kevinz000: - - rscadd: smoke machines can now be printed after researching adv biotech -2018-03-09: - Dax Dupont: - - rscadd: Display cases can now have a list where to randomly spawn items from. - - refactor: Moved plaque code to main type. - - refactor: Statues now use default unwrench and the tool interaction is now completely - non existent when no deconstruct flag is available. - Mark9013100: - - rscadd: Pill bottles can now be produced in the autolathe. - Naksu: - - balance: The white ship and miscellaneous caravan ships lose their advanced place-anywhere - shuttle movement during war ops. - - tweak: The smoke machine can now be deconstructed using a screwdriver and a crowbar - - code_imp: The smoke machine no longer calls update_icon every process() - Robustin: - - balance: Harvesters now have 40hp, from 60. - - tweak: The nuke will now detonate 2 minutes after Nar'sie is summoned, down from - 2.5 minutes - - tweak: The "ARM" ending now requires 75% of the remaining souls aboard to be sacrificed - before the nuke goes off, up from 60%. - - bugfix: Drones can no longer be on the sacrifice list - - bugfix: Bloodsense will now show the true name of the target -2018-03-10: - 81Denton: - - tweak: Added wall safes to Deltastation's HoP and Captain's offices. - Astral: - - bugfix: Constructed turbines will now properly connect to the powernet - Cobby: - - tweak: The Eminence scoffs at your "consecrated" tiles once the Justicar is freed - from his imprisonment. - Denton: - - rscadd: Engi-Vend machines now have welding goggles available. - - tweak: Grouped Nano-Med/Engi-Vend items by category. - Irafas: - - rscadd: Turrets can be set to shoot personnel without loyalty implants - Naksu: - - rscdel: The smoke machine can no longer be found in chemistry departments, instead - it must be constructed manually. The board was added to techwebs earlier. - Singularbyte: - - bugfix: Dead bodies no longer freak out about phobias - 'The Dreamweaver (Sprites: Onule)': - - rscdel: Nanotrasen's Lavaland research team has discovered that the alien brain - has disappeared from necropolis chests. - - rscadd: In it's place they have discovered a new artifact, the Rod of Asclepius, - a strange rod with a magnitude of healing properties, and an even higher magnitude - of responsibility... - XDTM: - - rscadd: You can now place people on tables on Help Intent. Doing so takes a few - seconds and makes the target Rest, instead of stunning them. - Xhuis: - - bugfix: Circuit slow-cloning no longer breaks with some circuits. - - code_imp: Circuit slow-cloning is now cleaner. - kevinz000: - - rscadd: Oh hey guys, RND shows correct material values now, don't hurt me! - ninjanomnom: - - bugfix: Blowing up the wrong part of the shuttle should no longer result in the - shuttle being permanently broken. -2018-03-11: - Buggy123: - - tweak: The Clockwork Justicar has decided to be merciful, and allow nonbelievers - to anchor their petty machines in his city. It's only fair for them to have - a fighting chance, after all. - Irafas: - - bugfix: Fixed pacifists from being able to fire mech weapons - JJRcop: - - bugfix: Sanity checks for Play Internet Sound - MrDoomBringer: - - rscadd: Orderable supplies in cargo now all have descriptions! The station's overall - FLAVORFUL_TEXT stat has gone up by nearly 2% as a result. - Onule: - - tweak: Mining drones have been given a visual makeover! - Poojawa: - - imageadd: Redded borg transformation animations - - imageadd: adjust mining borg animation to new colors. - Xhuis: - - rscadd: The Nanotrasen Meteorology Division has identified the aurora caelus in - your sector. If you are lucky, you may get a chance to witness it with your - own eyes. - ninjanomnom: - - admin: The debug message for generic shuttle errors is improved a little - - bugfix: Custom shuttles being too close to the map edge was causing problems, - you must now be at least 10 tiles away. -2018-03-12: - Naksu: - - balance: The space cleaner spray bottle is now much more efficient and uses much - less space cleaner per spray. The amount of cleaner it can hold has been adjusted - to compensate. - - bugfix: internet sounds can be stopped again - Robustin: - - bugfix: One-man conversions are actually fixed this time - excess chanters var - removed for a more readable and maintainable rune code. - - bugfix: Runes should no longer become GIANT if spammed (credit to Joan for this - fix). - - bugfix: Pylons are no longer a source of infinite rods. - - tweak: Attempting conversion without 2 cultists present will give a more helpful - warning. - - tweak: You can no longer convert braindead individuals. - - balance: Cult doors will no longer lose power but also cannot shock people, brittle - cult doors have 30 less integrity. Therefore ordinary crew can now beat cult - airlocks open without frying themselves. - - balance: Blood magic now costs slightly more blood and takes slightly more time, - the stun spell now stuns for 2 less seconds, twisted construction now costs - 10 health, and the blood rite relics (halberd, bolts, beam) are all 50-100 charges - cheaper. - - balance: The deconversion time for holy water is slightly reduced, 10 units and - 45 seconds (give or take), is all you should need now. Blood cultists can now - have seizures while afflicted with holy water. - - balance: Shades are now slower and have a modest reduction to their damage and - health. -2018-03-13: - Dennok: - - rscadd: Meters can be attached to the floor by screwdriver - Denton: - - bugfix: The disposal bin in Pubbystation's main tool storage now works. - - tweak: Deleted a duplicate r-wall between Pubby's main tool storage and the captain's - office. Added a Metastation-style crate disposals chute and a light switch. - - tweak: Various belts can now hold additional job-specific items. - - tweak: Sepia floor tiles fly really slowly, yet far when thrown. Don't hit yourself! - Naksu: - - admin: ERT creation has been refactored to allow for easier customization and - deployment via templates and settings - Polyphynx: - - tweak: Medical sprays can now be stored in medical belts and smartfridges. - The Dreamweaver: - - rscadd: Both of Nanotrasen brand totally-for-adult-use footwear, Wheely-heels, - the cool and hip new shoes with built in roller-wheels, and Kindle Kicks, the - fun and flashy light up sneakers, are now available as rare prizes at your nearest - arcade machine! - Toriate: - - rscadd: Added ammo counters for RCDs - - rscadd: Added actual flashing yellow light for RCDs - - imageadd: added new RCD sprites including inhands - - imagedel: deleted old RCD iconstate, but not the inhands - checkraisefold: - - bugfix: Nukeops properly checks the required amount of enemies for the gamemode! - This should fix downstream problems. - imsxz: - - rscdel: the viral aggressive metabolism symptom has been removed - ninjanomnom: - - bugfix: You need to actually clear an area for the aux base, remove all walls - (except rock walls). -2018-03-16: - Dax Dupont: - - tweak: 8balls take less time to shake. - Keekenox & Floyd / Qustinnus: - - imageadd: Adds a new Parallax layer that resembles Lavaland (Lava Planet), it - spawns on a random location near the station. You need your parallax on high - to see it. - Shadowlight213: - - tweak: Roundstart or latejoin sec officers will like donuts regardless of race. - cacogen: - - tweak: Transit tubes take half as long to secure/unsecure -2018-03-17: - AnturK: - - rscadd: Traitor AI's can now take manual control of turrets. - Cruix: - - bugfix: Sentient diseases will no longer lose points when a host is uninfected. - Dax Dupont: - - bugfix: Edison's ghost no longer interferes with Tesla Corona Coil research device. - Denton: - - tweak: Syndicate stormtroopers now rapid fire 10g slugs instead of buckshot. This - deals the same damage, but makes getting hit less laggy. - - rscadd: 'Pubbystation: Added protective grilles outside the circuitry lab. The - one with the big glass windows, right next to the bomb test site. Oops.' - - rscadd: 'Pubby: Added electrified grilles to the windows of the CMO/RD/CE offices, - as well as missing privacy shutters to the CE office.' - - rscadd: 'Pubby: There is now a very rare chance for a Xenomorph egg to appear - in the Xeno containment chamber at roundstart.' - - bugfix: 'Pubby: Fixed the name of the HoS space shutter button.' - - tweak: Updated a bunch of roundstart tips and added new ones. - Polyphynx: - - bugfix: Bluespace slime radio potions now work, and are no longer invisible. - RandomMarine: - - bugfix: Did you know that you could buckle guys to grounding rods? Probably not - - not that it mattered before, because people buckled to them didn't get shocked - when they got zapped. That's fixed now. - SpaceManiac: - - bugfix: Cameranet issues in OmegaStation's departures wing, crematorium, and freezer - have been corrected. - The Dreamweaver: - - bugfix: Fixes duplication issue when the Rod of Asclepius is removed while lying - down, as well as fixing a runtime when attempting to use multiple rods. - XDTM: - - rscadd: 'Changed behaviour of mech drills: now they take some time to start drilling, - then they keep drilling until manually stopped or the target is destroyed. Mobs - are still gibbed if they have more than 200 brute damage while being drilled.' - - rscadd: Drilling walls is now consistent; it takes longer, but it will always - work instead of only randomly. - - tweak: Drills no longer stun mobs, but they can dismember limbs. - - bugfix: Mech drills no longer cause explosion-like effects on mobs inside objects. - deathride58: - - bugfix: You can no longer push someone onto a table that's on the other side of - the station. - kevinz000: - - rscadd: Wet floors now get their duration decreased by 0.1 seconds per degree - above 0C the air temperature on it is, and instantly dry above 100C. Below 0C - they will freeze into ice and will not automatically dry. - - rscadd: Floors can now have different types of wet at the same time! Wet strength/type - is now a bitflag. -2018-03-18: - Davidj361: - - tweak: Made AI VOX sound files smaller sized - - bugfix: Fixed improperly pronounced AI VOX lines - - soundadd: Added a ton of new AI VOX sayings - Floyd / Qustinnus: - - rscdel: Removes short-term effects of mood add; Adds long-term effects of mood - by implementing sanity which goes up with good mood, down with bad mood, but - takes time to change. Your sanity can be seen as your average mood in the recent - past. All effects of moods are now covered by this system - - rscadd: Beauty component, currently only attached to cleanables, but you could - attach it to any atom/movable and make them pretty/ugly, affecting mood of anyone - in the room. - - refactor: Removes the original way of adding mood events, uses signals properly - instead. - - bugfix: Cleanables "giving" area's free beauty during initialization - - bugfix: Fixes some events not clearing properly - Naksu: - - bugfix: Chem dispensers now show the correct amount of units they will vend (instead - of 1/10) - - balance: Chem dispensers can now be upgraded. Manipulators increase macro granularity, - matter bins increase power efficiency, cells increase power capacity, capacitors - increase recharge rate. - - balance: Chem dispensers can now be constructed - - rscdel: mini-chemdispensers are removed. -2018-03-19: - Anonmare: - - tweak: Spaceacillin is now useful in disease control - Denton: - - rscadd: It's suicide HoPline prevention week at Omegastation! - - rscadd: Navigation beacons and a brand-new Officer Beepsky unit have been installed. - This means that crewmembers can now use medibots, janibots and other bots as - well. - - rscadd: The atmospherics department has been outfitted with all missing gases - as well as an incinerator and a hardsuit. - - rscadd: The size of the botany and xenobiology departments have been increased - in order to increase productivity. The medbay O2 port has been moved so that - doctors can access the table next to it. - - rscadd: RnD now has circuitry tools; medbay has stethoscopes+wrench+beaker/pill - bottle boxes and primary tool storage has multitools. Enginers no longer have - to share a single pair of insulated gloves either. - - rscadd: Engineers now have access to an Engi-Vend vending machine as well as missing - tools like inducers. Circuitry storage has a smoke machine board and a solars - crate in case the engine blows up. - - tweak: Blueprints have been moved from the vault safe to secure storage in order - to speed up construction projects. - - bugfix: The AI sat transit tube now works! Turret controls can now be accessed - from the outside. The first two turrets now use the proper type of gun. The - telecomms air alarm will no longer report false alarms. - - bugfix: The main hallway's firelocks now no longer all close at once. - - bugfix: 'Pubbystation: The atmos mix tank and N2 filter should now work properly.' - SailorDave: - - bugfix: Crayons and spraycans can no longer draw an unlimited amount of large - graffiti regardless of uses left. -2018-03-20: - Denton: - - bugfix: At last, the Pubbystation auxillary base can be launched again. - - code_imp: Aux base/escape pod/assault pod/elevator docking ports now default to - timid = FALSE. - Garen: - - rscadd: Added 4 new Icons to the diagnostic hud circuit status display that can - be set using the AR interface circuit. - - rscadd: now instead of seeing the yellow warning icon when a weapon is in the - circuit, the current status icon will just turn red. - Irafas: - - rscadd: Pacifists can now drill closets containing living beings - JStheguy: - - rscadd: Electronic assemblies can now have their casings colored using the new - assembly detailer, get yours at your nearest integrated circuit printer! - - rscadd: Added 2 new electronic assemblies, 2 new electronic mechanisms, and 3 - new electronic drones. - - rscadd: Added wall-mounted electronic assemblies in 3 sizes, simply slap it against - a wall to stick it up, and then anchor it in place with a wrench. - - imageadd: Added the new sprites for the new assemblies, and color-able overlays - for every assembly, to allow for the aforementioned coloring feature. - - tweak: Scanners can now scan power cells, circuitry tools, and integrated circuits, - assuming the player isn't able to use them normally. I.E. if the assembly is - closed. - - tweak: Using wrenches to anchor down assemblies now works for all assembly types - except drones, as opposed to just working for electronic machines. - - tweak: Examining an assembly now shows some text telling you what tools to use - to do what, like many other objects currently do. - Kor: - - code_imp: Jobs other than Assistant may now be assigned by admins or events as - the overflow role - - rscadd: April Fools now sets the overflow role as Clown. - Naksu: - - admin: Rhumba beat is now more than renamed GBS - - tweak: Plastic is now a valid material for lathes - - rscadd: Added two new beaker types, 120u and 180u. The 120u beaker can be printed - off the medical protolathe with just glass and plastic, the 180u requires some - mining materials and tech. - - admin: Whether to open the armory doors when spawning an ERT is now controllable - from the ERT creation window. - - tweak: Chaplain inquisitor role now spawns with one holy hand grenade instead - of a box full of them, and the belt now has actually useful stones instead of - unusable cult stones - Polyphynx: - - tweak: The piano now sounds more like a piano! - Shadowlight213: - - bugfix: Malf hacked APCs can be broken with extinguishers and toolboxes again. - TheDreamweaver: - - bugfix: Holodeck mobs that are given sentience via sentience potions are now warned - about the state of their existence. -2018-03-21: - BunnyBot5000: - - rscadd: Fringe Weaver drink - made with ethanol and sugar, it's classy (and slightly - weaker) hooch - - rscadd: Sugar Rush drink - made with sugar, lemon juice, and wine. It's got a - slight nutritional value but decreases your satiety, causing you to be unable - to consume junk food. - - rscadd: Crevice Spike drink - made with lime juice and hot sauce. A 'sobering' - drink, the Crevice Spike will reduce your drunkenness slightly but it kicks - hard going down, dealing 15 points of brute when first ingested. - MrStonedOne: - - bugfix: VOX sounds are now forcefully preloaded on clients to deal with an issue - keeping byond from loading them - cyclowns: - - tweak: Unary devices can now be analyzed using gas scanners. This means stuff - like vents, scrubbers, cryo tubes, or heaters/freezers. -2018-03-22: - Denton: - - tweak: The lavaland Syndicate base has been outfitted with a turret control panel - as well as more chemistry supplies and one (1) bar of Syndicate brand soap. - Floyd / Qustinnus: - - bugfix: Being happy no longer makes you obese. - JohnGinnane: - - refactor: Vending machines now have their own files which includes their refill - cannister. The machines themselves are unchanged - Naksu: - - bugfix: Pulled objects will now follow their puller across space transitions again - Robustin: - - bugfix: Fixed a bug that prevented the advanced blood rites (Halberd, Bolts, Beams) - from appearing when selected. - SpaceManiac: - - bugfix: Ventcrawlers in pipes now breathe from that pipe. - - bugfix: Deconstructing atmos components no longer breaks ventcrawl visuals. -2018-03-23: - Fel: - - add: Slimes can now be crossbred by feeding them a number of slime extracts of - one type. Beware, it only produces one crossbred extract! - - experiment: The number of required extracts has been lowered to 10 since the testmerge, - but this number is up for potential change depending on balance consideration - in the future. - - wip: 'Currently available crossbreeds are accomplished by feeding any slime the - required amount of the following extract colors: Grey, orange, purple, blue, - metal, yellow, dark purple, silver, cerulean, and pyrite. Their relevant effects - will be added to the wiki page for xenobiology soon(TM), and more to come in - a later addition!' - - add: Slimes can be fed extracts one at a time, but if you start mutating it, you - can feed it extracts straight from a biobag! You can also use biobags to feed - a reproductive extract monkey cubes. - - add: Slimes in the process of being crossbred will reveal what modifier they will - gain from their current modification, as well as how many more extracts are - required, to slime scanners. - - tweak: The rainbow slime clusterblorble effect will now only use reagents that - the extract will be activated from, and will try any of these reagents! As a - bonus side effect, this means it has a 1.1% chance of spawning and activating - another clusterblorble effect. - Floyd / Qustinnus: - - bugfix: progression bar now takes the delay after co_efficent in account - - code_imp: removes do_after_speed from mob base, moves it into physiology - - code_imp: makes a do_after coefficiency proc - - balance: Changes rate of sanity drain and caps it depending on mood - Frozenguy5: - - rscdel: Reverted bad airlock sounds. - Naksu: - - tweak: the amount of simultaneous monkey cube-spawned monkeys has been restricted. - - server: the cap is adjustable via the mobs subsystem - SpaceManiac: - - bugfix: The cargo conveyor switches now properly control the belts on the shuttle - again. - - bugfix: Entering a frequency like 145.7 into a radio will now work, where 1457 - was previously required. - TheMythicGhost: - - rscadd: 'New Integrated Circuit Converter Components: hsv2hex and rgb2hex for - smooth color transitions, woo!' - - imageadd: Added icons for the new component chips. - - rscadd: 'New Integrated Circuit Component: AI Vox Sound Circuit' - ninjanomnom: - - bugfix: You can no longer override shuttle areas with new or expanded areas from - elsewhere. -2018-03-24: - Davidj361: - - bugfix: Ranged guardians in scout mode no longer are able to move out of their - master when recalled. - Denton: - - spellcheck: Fixed missing capitalization for craft menu items. - - bugfix: Air alarms no longer trigger atmospherics alarms when stimulum or hyper-noblium - are present. The allowed partial pressure of pluoxium has been increased as - well. - Robustin: - - tweak: The Security Techfab can now produce basic shotgun shell types and .38 - ammo - ShizCalev: - - bugfix: Fixed a large number of missing APCs on Omegastation - - bugfix: Fixed unpowered Incinerator outlet injector on Omegastation. - - bugfix: Replaced glass window at Omegastation's incinerator with a plasma window. - - bugfix: Fixes broken atmos injectors on Omega - - bugfix: Fixes broken air outlet on Meta - - bugfix: Fixed a couple of malfunctioning atmospheric monitors across the rest - of the maps - - rscadd: New test atmos monitoring console debug verb to help alleviate future - issues. - YPOQ: - - bugfix: The imaginary friend trauma now works -2018-03-28: - Davidj361: - - bugfix: Ocular Wardens now target buckled and cuffed players/mobs, unless they - are cuffed by a slab. - - tweak: Cuck cultists can cuff already sec-cuffed targets with their slab cuff - spell. - Dax Dupont: - - bugfix: You no longer hit borgs with hats you want them to wear. - - rscadd: Viva la borg, engieborgs can now wear hats - - rscadd: Borgs can now wear more hats. - - bugfix: After a space OSHA inspection you can now reach the safe and fire extinguisher - in the omega detective office. - - bugfix: Makes it so you don't accidently trigger the fun balloon twice. - Denton: - - tweak: Pubbystation's signs to evac have been made more obvious. - - tweak: Plastic flaps are now airtight. - - spellcheck: Bluespace crystals now show their proper name during machine construction. - EvilJackCarver: - - bugfix: Edited a certain part of the disco machine's dance to only target carbon-based - (mob/living/carbon) lifeforms. pAI units will no longer spam chat with rest - notifications when in range of the disco machine. - Frozenguy5: - - tweak: The monkeycap has been increased to 64. - JohnGinnane: - - rscadd: A guillotine has been added to the game. Can be crafted. If the blade - isn't dull, will cut through human necks like a hot knife through butter. Use - a whetstone to sharpen it if it becomes dull. - MrDoomBringer: - - imageadd: All stations have been outfitted with brand new Chem Masters! They have - nicer sprites now! - - bugfix: Fixed the description of the Cargo Express Console. Cargo Drop Pod orders - aren't double-priced any more! - Naksu: - - bugfix: Chem dispensers no longer take hours to recharge - - tweak: chem dispensers also now use energy from the grid in proportion with the - amount charged - - admin: Admins now get a follow link when a revenant spawns. - - admin: Admin hotkey help is now actually correct - Pipe fixes: - - bugfix: Runtime in components_base.dm,91 what cause atmos machinery connection - problems. - - bugfix: Pipes release air in turf on Destroy(), again. - - bugfix: Pipeline now cant be annihilated by merge(src). Pipes don't lose air on - connecting more than to one pipe. - Robustin: - - code_imp: Monkey AI is now much more efficient and no longer full of terrible, - wasteful processes - - tweak: Monkeys will now move more and will only focus on nearby objects for stealing. - This should result in more natural monkey behavior instead of the monkey staring - furiously at random shit in the room for 5 minutes until it has a 50 item blacklist - of shit it will refuse to touch from then on out. - - tweak: The chance for a monkey to attack you for pulling it will now only happen - when execute the initial grab, instead of a check that happens every tick. - ShizCalev: - - tweak: Cleaned up the preferences panel a bit to be a bit more user friendly. - SpaceManiac: - - bugfix: Unwrenching and re-placing directional signs now keeps their direction, - and backings may be rotated in-hand rather than by pulling. - Tacolizard Forever: - - bugfix: phobias will no longer recognize trigger words inside of other words - XDTM: - - rscadd: Bees (and similar swarming mobs) are now able to occupy the same tile - as other bees! When doing so, their icons are offset to make them seem like - a proper swarm. - - tweak: Bees will now dodge bullets not directly aimed at them. Why are you firing - guns at bees - - bugfix: Sniper rifles will no longer oneshot mechs (although they still deal high - damage). - - bugfix: Sniper rifles no longer knock down walls they hit. - Xhuis: - - rscadd: Added the Family Heirloom trait. This makes you spawn with a special object - on your person; if you don't have it with you, you will gain a mood debuff. - - rscadd: Added the Nyctophobia trait. This makes you walk slowly in complete darkness, - and gain a mood debuff from the fear! - - rscadd: Added the Monochromacy trait, which makes you perceive (almost) the entire - world in black-and-white. - - balance: Social Anxiety's trigger frequency is now correlated to the number of - people near you. - - bugfix: Slimepeople now transfer their roundstart traits when swapping bodies. - YPOQ: - - bugfix: Machine power will now update when moving from powered to unpowered areas - and vice versa. - iskyp: - - bugfix: night vision goggles no longer overwrite thermal eyes. nvg eyes no longer - overwrite thermal goggles. - selea: - - rscadd: a* pathfinder, coordinate pathfinder(accepts not ref to some obj, but - it's abs coordinates) ,turf pointer(can give you ref to turf with given coordinates), - turf scanner(can read letters on floor and contents of turf),material scaner(can - read amounts of materials in machinery),material manipulator(to load/unload - resources) - - tweak: now you can decide, if basic pathfinder should avoid obstacles, or not.Now - demux push only desired output without unnecessary nulls,upgraded claw and local - locator. - - balance: reduced complexity cost of locomotors,abs/rel converters and basic pathfinders.Increased - complexity of throwers, - - bugfix: Fixed bugs with cryptography, obstacle ref in locomotors, release pin - in pullng claw. - - refactor: add material tranfer proc to mat containers.refactored pathfinder SS - to have separated queue for mobs and circuits to avoid spam. - - tweak: Now recycler can butcher mobs and saw tree logs. - yorii: - - tweak: Science goggles can now detect reagents in grenades. -2018-03-30: - Astatineguy12: - - bugfix: Ghosts of servants of Ratvar are no longer confined to Reebe like their - corporal counterparts. - Cruix: - - rscadd: Sentient diseases now have the "Secrete Infection" ability, which causes - anything touching the skin of the host they are currently following to become - infective, spreading their infection to anyone who touches it for the next 30 - seconds. - Davidj361: - - bugfix: Removed health cost for Twisted Construction upon casting on a wrong object - - bugfix: Fixed table crafting not properly checking the surrounding area for tools. - - code_imp: Changed /datum/personal_crafting/proc/get_surroundings(mob/user) to - return 2 lists. - Denton: - - bugfix: 'Omegastation: Added advanced magboots to secure storage so that traitors - can complete the theft objective.' - ShizCalev: - - bugfix: Silicons no longer have to be directly adjacent to a chem master to dispense - pills. - - bugfix: Fixed an exploit involving chem dispensers not actually checking if there - was enough energy to dispense the target chemicals. - - bugfix: Fixed exploit where chem dispensers always worked even if they didn't - have power... - - bugfix: Booze & soda dispensers will no longer turn into chem dispensers when - screwdrivered - - bugfix: Fixed chem dispensers showing as powered on when screwdrivered opened. - - rscadd: Added an examine indication when the maintenance panel to chem/soda/booze - dispensers is open. - neersighted: - - admin: Re-juggled delete verb permissions - robbym: - - bugfix: Fixed an error with integrated circuit tickers where they would sometimes - fail to tick. -2018-03-31: - Naksu: - - rscdel: Chameleon projectors will no longer work from inside transformations, - effects, mechas or machines. Effects that cause movement will no longer leave - sleepers in a bugged state where they can apply chems to you across distances. -2018-04-01: - Davidj361: - - bugfix: Fixed cuffed prison shoes being taken off by dragging them into your hand. - Denton: - - balance: The singularity engine will now output enough energy to power a station - again. - - bugfix: 'Pubbystation: The bomb testing site cameras are now accessible by camera - consoles.' - - spellcheck: Bluespace polycrystals now show their name when inserted into machinery. - Kor: - - rscadd: The disco machine no longer has a fixed list of songs. It will instead - allow players to pick music from a config folder managed by the host and head - admins. - - rscadd: There is now a bartender jukebox variant of the disco machine that plays - music, but has no lights or dancing. This variant will be added the station - maps once the feature freeze is over. - Naksu: - - bugfix: Removed stray defines from maps, making roundstart atmos functional and - runtime-spam free again - robbym: - - bugfix: 'fixed by converting to absolute coordinates #36861' - - spellcheck: changed description from copypasta to correct description -2018-04-02: - Davidj361: - - bugfix: Fixed 'vox_login' for AI VOX - - tweak: Made the AI VOX airhorn quieter to 25% of its original volume - GrayRachnid: - - bugfix: Fixes some crafting tooltips not displaying tool names properly. - MrDoomBringer: - - imageadd: roundend report button now has a lil icon - Naksu: - - bugfix: Removed some edge cases where atmospherics gas lists could continue holding - active gas items that can only transfer 0 gases to neighbors by making the garbage - collection clean them up. - RandomMarine: - - bugfix: The quick equip hotkey (e) now works for drones again. -2018-04-03: - 81Denton: - - spellcheck: Nanotrasen's space entomology department is shocked to discover that - Mothpeople have surnames! - YPOQ: - - bugfix: Mannitol will now properly cure minor brain traumas - robbylm: - - bugfix: Fixes 0 value not being saved in constant memory circuits (#36860) -2018-04-04: - Fludd12: - - rscadd: Burning ores now yields materials at a very reduced ratio! Lavaland roles - will now be able to construct things with enough effort. - JohnGinnane: - - bugfix: Fixed items sometimes being used on fullpacks when trying to insert - - bugfix: Fixed spray containers being used on open lockers and other containers - Naksu: - - bugfix: Fixed (dead) revenants being unable to deadchat or ahelp - - bugfix: Plasmamen that get converted into humans as a part of spawning as a protected - head role no longer retain their plasmaman equipment. - SailorDave: - - bugfix: Fixes virology Asphyxiation symptom activating too early and ignoring - transmission level. - ninjanomnom: - - bugfix: Shuttles have proper baseturfs now. - - bugfix: Mineral walls properly use their baseturfs when destroyed/drilled. - - rscadd: A new engineering goggle mode allows you to see the shuttle area you're - standing in. - - admin: Buildmode works a bit better with baseturfs now and can properly only remove - the top layer of turfs when editing. Note that as a result the order you place - turfs is important and a wall placed on space means when the wall is removed - there will be space underneath. -2018-04-07: - Davidj361: - - tweak: Stacked sheets now have a cancel button when taking an amount from them. - Dax Dupont: - - bugfix: Fixes dead chat announcements not using real name. - Naksu: - - bugfix: Trash bin anchoring/unanchoring now gives you a small text blip about - what happened. - PKPenguin321: - - bugfix: Restored accidentally cut functionality to flashes. You can once again - attach them to a signaller and signal them to trigger an AoE flash remotely. - SailorDave: - - bugfix: Mixed blood samples preserve their cloneability for podpeople if the samples - are the same. - kevinz000: - - rscadd: AIs can now latejoin! - - rscadd: Latejoining AIs will be sent to a special deactivated AI core. This AI - core will spawn in the AI satellite chamber in place of an active AI if none - is there at roundstart. These cores can be deactivated with a multitool, and - moved around per usual, but not deconstructed. They can, however, be destroyed - per usual. - - rscadd: AIs can only latejoin if atleast one of these cores exists and is in a - valid area (Powered, on station, etc etc), and if the AI job slot isn't filled - already by a roundstart or latejoin AI. - - code_imp: A few code internal debugging features have been added to help debug - GC errors. QDEL_HINT_IFFAIL_FINDREFERENCE hint will make the garbage subsystem - find references if the build is in TESTING mode, and qdel_and_then_find_ref_if_fail(datum) - or calling qdel_then_if_fail_find_references will do the same. - robbym: - - bugfix: Fixes examiner circuit failing to pulse 'not scanned' when reference is - null (#36881) -2018-04-08: - AnturK: - - tweak: Slime reflexes restored. - Dax Dupont: - - rscadd: Hugbox version of the VR sleeper you can't emag. - - admin: There's now two categorized vr landmarks for two teams for easy spawning. - You can also now rebuild/refresh all the VR spawnpoints by calling build_spawnpoints(1) - on any sleeper. - Naksu: - - admin: Admins can now access a new control panel for borgs via a new admin verb -2018-04-09: - CosmicScientist: - - rscadd: Top Nanotrasen scientists have diagnosed two new phobias! Birds and chasms! - Good luck Chief Engineers and Miners. - Dax Dupont: - - admin: Removing notes now has an "Are you sure" dialog. - Denton: - - rscadd: Omegastation now has its own arrivals shuttle. - Mickyan: - - imageadd: Stinger, Grasshopper, Quadruple Sec, and Quintuple Sec have new sprites. - Naksu: - - code_imp: Fixed an heirloom trait-related runtime - - code_imp: Fixed an incorrect signature in MakeSlippery causing runtimes - SpironoZeppeli: - - rscadd: You can now wrench the supermatter shard - ninjanomnom: - - bugfix: The arena shuttle should be working again. - - bugfix: The escape pods now reach their proper destination at round end -2018-04-11: - Davidj361: - - bugfix: Fixed paper bins dropping out of your hand or bag when grabbing a pen - or paper. - - bugfix: Paper bins not giving finger prints upon interaction. - - bugfix: Detective can now write notes onto his printed scanner reports. - - tweak: Detective scanner can have its logs erased via alt-click. - - tweak: Detective scanner can display logs via the action button. - Denton: - - bugfix: Added a missing intercom to the Delta arrivals shuttle. - ExcessiveUseOfCobblestone: - - code_imp: Uplink Items now have 2 separate probabilities. One for the syndicate - crate and one for cargo null crates. I encourage you to view uplink_items.dm - and make changes. - Robustin: - - balance: Hostile mobs capable of smashing structures will now smash their way - through dense objects too. - SpaceManiac: - - bugfix: The blindness overlay applied during cloning now properly stretches for - widescreen views. - - code_imp: Various macro consistency problems have been addressed. - YPOQ: - - bugfix: Eminences can hear clock cult chat again - george99g: - - bugfix: Suiciding will now deactivate all your genetics prescans. - iskyp: - - bugfix: makes dragnet non harmful - - tweak: pacifists can now use any disabler or stun setting on any energy gun - - code_imp: removed all of the pacifism check code from code/modules/mob/living/living.dm - - code_imp: gun objects no longer have a harmful variable, instead, ammo_casing - objects now have a harmful variable, which is by default set to TRUE - - code_imp: if a pacifist fires a gun, it checks whether or not the round chambered - is lethal, instead of whether or not the gun itself is lethal. - - code_imp: /obj/item/machinery/power/supermatter_shard is now /obj/item/machinery/power/supermatter_crystal/shard. - the crystal is the parent object. - neersighted: - - code_imp: Reduced lag by speeding up logs 10000% - - code_imp: Logs now include millisecond-level timestamps - pigeonsk: - - tweak: AI now requires silicon playtime instead of crew playtime for roundstart - role - selea: - - bugfix: fixed runtime in logic circuits, which was occured with invalid input - types. -2018-04-12: - Cobby: - - bugfix: Fixes getting "emptystacks" (a stack with an amount of 0) - Dax Dupont: - - bugfix: Briefcase bluespace launch pads no longer work on the centcom Z level. - Dennok: - - rscadd: RPD can automaticaly wrench printed pipes to floor. - Denton: - - rscadd: Cargo can now order tesla coil crates for 2500 credits. - Garen: - - bugfix: Added missing parameter types to circuits. - - bugfix: Fixes two datatypes appearing for some input circuits. - - tweak: Logic circuits now output booleans rather than 1's and 0's, this is purely - cosmetic. - Naksu: - - bugfix: Warp whistle can no longer leave you stuck in an invisible state - The Dreamweaver: - - bugfix: The air around you grows cooler, as if what you once knew about atmospherics - has changed ever so slightly... - Xhuis: - - bugfix: Mood traits cannot be chosen if mood is disabled in the config. - ninjanomnom: - - rscadd: The SM has a guaranteed 30 second final countdown before delamination - now - - balance: The SM will take less damage from low pressure environments - - balance: The SM has a slightly reduced max damage per tick - - bugfix: Tiles placed on lavaland turfs should behave properly again. - pigeonsk: - - bugfix: When you wash your bloody hands they will no longer still look bloody - afterwards -2018-04-13: - Dax Dupont: - - bugfix: SCP 194 now uses it's amount variable instead of a hardcoded number. - Dax Dupont & Naksu: - - bugfix: Toxin loving species won't take liver damage from toxins. - - bugfix: Liver now gets 0.01 damage per unit of toxin subtype reagent every 2 seconds - instead of 0.5. IE 30 units of whatever won't kill you within 10 seconds anymore. - - bugfix: Moved peacekeeper borg reagents to other_reagents so they don't do liver - damage and they aren't really toxins - - refactor: Renamed borg synthpax path to be more inline and put them next to the - other borg reagents. - Denton: - - tweak: Omegastation's supermatter crystal has been replaced with a smaller shard - that doesn't destroy the whole station on explosion. - Naksu: - - bugfix: Fixed KA upgrade applying on the minerborg - Putnam: - - tweak: rounded pi correctly - ninjanomnom: - - bugfix: Some strange baseturfs in lavaland structures and ruins should be fixed. - robbym: - - bugfix: Fixes tile analyzer circuit - - refactor: Cleaned up tile analyzer code -2018-04-14: - JohnGinnane: - - rscadd: PDA messages you send are now displayed in the chat for your confirmation - Naksu: - - bugfix: SCP-294 can no longer be deconstructed. - kevinz000: - - rscadd: After a severe security breach occurred due to lazily configured Nanotrasen - Network DHCP servers where attackers were able to hijack every airlock connected - to the Nanotrasen Intranet, the Central Command engineering team reports that - they have properly configured network address servers to give out (relatively) - secure network IDs again. [NTNet addresses reverted to 16-hex format. they will - now be randomized across a ~billion trillion possibilities instead of being - 1-1000 every round for doors and stuff.] -2018-04-15: - JohnGinnane: - - tweak: Reorganised circuit component controls within an assembly, so they appear - before the name of the component - Naksu: - - bugfix: Bluespace slime cookies can no longer be used to travel to CentCom - - bugfix: Borgs can no longer accidentally end up inside a cryo cell - - bugfix: Shoving someone inside a cryo cell now has a small delay unless they are - knocked down, stunned, sleeping or unconscious - - admin: Station borgs can no longer control the CentCom ferry. - - bugfix: Ghosts can no longer interact with the round via teleporter effects of - any kind - - tweak: His Grace can no longer be deep-fried - - bugfix: Passive gates can be interacted with in unpowered areas -2018-04-16: - Dax Dupont: - - rscadd: Added get current logs button for admins - - refactor: Removed verbs that have been replaced by other things like the combohud - or ticket panel. - Naksu: - - tweak: Mining borgs and mining drones now have mesons and the engineering goggles' - meson mode also works in lavaland again. - SpaceManiac: - - bugfix: The on-body icon for ancient bio suits is no longer broken. - ninjanomnom: - - bugfix: The aux base properly loads in rather than leaving an empty room. - - bugfix: Admin loaded map templates can be designated as shuttles during the upload - process. Make sure to load them on space first. -2018-04-17: - Dax Dupont: - - bugfix: Fixed martial arts/spell granters breaking on interrupt in final stage. - Naksu: - - balance: Welding tools now flash the user as the weld progresses, not just when - the welding is started. - - bugfix: CentCom officials will now properly display the objectives the admin has - assigned them. -2018-04-20: - Astatineguy12: - - bugfix: Gygax construction now actually uses up the capacitor - Dax Dupont: - - bugfix: A cat is fine too. You can select cat parts again! - - bugfix: Default lizard tail was never properly defaulted, now it is. - - bugfix: Fixes an exploit where tendrils/other spawners/anchored mobs in general - could be buckled to things and thus moved around. - Denton: - - rscadd: Due to space OSHA lobbying, the Syndicate's lavaland base now contains - a radsuit and decontamination shower. - - bugfix: Suit storage units' suit/helmet compartments now accept non-spacesuit - clothing (radsuits, EOD suits, firesuits and so on). - Naksu: - - bugfix: Oingo-boingo punch-face and meteor shot can no longer move gateways or - Reebe servant blocker effects - - bugfix: Mechas piloted by servants of Ratvar now teleport to the servant side - of Reebe when entering a rift - - admin: Gravity generators can now be thrown in buildmode - ShizCalev: - - bugfix: Fixed a number of conveyor belts leading to the incorrect direction. - - bugfix: Fixed shuttle conveyor belts being out of sync with cargo's conveyors - on some maps. - SpaceManiac: - - bugfix: Cycle-linking is no longer permanently disabled for airlocks on shuttles. -2018-04-21: - SailorDave: - - rscadd: A new manipulation circuit, the Seed Extractor. Extracts seeds from produce, - and outputs a list of the extracted seeds. - - rscadd: 'A new list circuit, the List Filter. Searches through a list for anything - matching the desired element and outputs two lists: one containing just the - matches, and the other with matches filtered out.' - - rscadd: A new list circuit, the Set circuit. Removes duplicate entries from a - list. - - tweak: The Plant Manipulation circuit can now plant seeds, and outputs a list - of harvested plants. - - tweak: Reagent circuits can now irrigate connected hydroponic trays and inject - blood samples into Replica pods. - - tweak: The Examiner circuit can now output worn items and other examined details - of carbon and silicon mobs into the description pin, as well as the occupied - turf of the scanned object, and can now scan turfs. - - tweak: The locomotion circuit now allows drones to move at base human speed, but - cannot be stacked, and assemblies can now open doors they have access to like - bots by bumping into them. - - bugfix: List Advanced Locator circuit now accepts refs as well as strings. - - bugfix: Fixed the Power Transmitter circuit not properly displaying a message - when activated. - - bugfix: Medical Analyzer circuit can now properly scan non-human mobs. -2018-04-23: - Dax Dupont: - - rscadd: More stations have been outfitted with disk compartmentalizers. - - bugfix: Fixed a lack of feedback when entering too many points for the gulag. - - admin: Fuel tank logging now logs to both game and attack logs so it's more clear - from logs what caused the explosion in game log and added coords to the messages - as well. - - bugfix: Fixes toolbelts being able to hold everything. - Denton: - - tweak: Moved Deltastation's ORM so that all crew can access it. - - code_imp: Added multilayer subtypes for mapping. - Kor: - - rscadd: Changelings can now have an objective to have more genomes than any other - changeling, rather than a set target. - - rscadd: Changelings can now have an objective to absorb another changeling. - - rscadd: Changelings now get bonus genetic points for buying powers when they absorb - another changeling. Their chem storage cap will also be increased. - - rscadd: Changelings absorbed by other changelings will lose all their powers, - chems, and genetic points, making them unable to revive. - Naksu: - - code_imp: Performance tweaks to plant code - - bugfix: Spears, nullrods etc should no longer be invisible - Power Control Support: - - bugfix: What do you mean we accidentally routed the interaction back to the apc - control conso- oh for fleeps sake STEVE WHAT DID YOU DO!! - Rinoka: - - bugfix: phobias now actually make you fear things other than an apostrophe s. - Spoilsport: - - rscdel: Inducers and integrated circuits can no longer charge energised weapons. - iksyp: - - rscadd: the beer and soda dispenser now have their own circuitboards, as well - as design ids. you can unlock them through techwebs under the biotech node. - - bugfix: beer and soda dispensers can no longer be turned into chem dispensers - by deconstructing and reconstructing them. -2018-04-24: - Dax Dupont: - - bugfix: Cargo scanner is no longer invisible. -2018-04-25: - Barhandar: - - bugfix: Pubbystation's field generators have been offset to no longer bisect the - engine on roundstart setup. - Dax Dupont: - - rscadd: You can now research and construct radiation collectors. - - bugfix: Doors don't turn into Mike Pence when the shock wire is pulsed, only why - it's cut. - - admin: Logging and messaging for singularities now include the area and a jump - link to the location where it happened. - - admin: Improved messaging for blood contracts. - - admin: While the onus is on the admin, the ckey has been added to some of the - prompts so mistakes can be caught earlier in the middle of the process. - Denton: - - tweak: 'Nanotrasen''s materials science division reports: Coins and diamonds DO - blend!' - Mickyan: - - tweak: Potato Chips and Beef Jerky from food vendors now contain salt. - deathride58: - - bugfix: Stocks in the stock market no longer have spontaneous exponential spikes. -2018-04-27: - Dax Dupont: - - balance: Experimentor now only outputs one clone. - - bugfix: Above change also fixes **an exploit** with loaded items getting cloned - after changing the loaded item and ejecting. - - bugfix: RPEDs will no longer display machine contents twice. - - bugfix: RPED can no longer hold everything. - - refactor: Moves all the logic for exchanging parts into the RPEDs instead of having - checks in every attack_by. - - rscadd: Clogged vents now scale like meteors. - - balance: Clogged vents got nerfed. - - bugfix: Buildmode toggle now checks for permissions so the hotkey can't bypass - it. - - admin: Press F10 for dsay prompt. - - admin: PDA explosions now have logging. - Denton: - - spellcheck: Fixed object descriptions and added missing ones - mostly to robotics - and RnD. - Fox McCloud: - - tweak: Removed acid requirement from basic network card and basic data disk - - tweak: grinding circuitboards no longer generates acid - Kor: - - rscadd: Added the Bureaucratic Error event, which replaces the overflow role with - a random job. - Mickyan: - - rscadd: 'New negative trait: Acute Blood Deficiency. Keep your slowly decreasing - blood level in check if you want to survive.' - MrDoomBringer: - - rscadd: Analyzers now show temperature in Kelvin as well as Celsuis - Naksu: - - code_imp: Inbounds subsystem, STATIONLOVING_2 and INFORM_ADMINS_ON_RELOCATE_2 - flags are removed. - - code_imp: New stationloving component replaces all of this. - - code_imp: 'Added new signals: COMSIG_MOVABLE_Z_CHANGED is now sent when a movable - changes Z level, COMSIG_PARENT_PREQDELETED is sent before the object''s Destroy() - is called and allows interrupting the deletion, COMSIG_ITEM_IMBUE_SOUL is sent - when a wizard attempts to make a thing their phylactery' - - bugfix: slime pressurization potions are no longer consumed when attempting to - apply them on already-spaceproof clothing - ShizCalev: - - bugfix: Fixed AI units being able to manually fire unpowered/broken turrets. - - bugfix: Fixed traitor AIs being unable to place a robotics factory if they failed - to place it after the prompt. - - bugfix: Fixed mobs having no hands if they had prosthetic limbs - - bugfix: Fixed damage overlays disappearing from prosthetic limbs when a mob is - husked - - bugfix: Fixed ghosts not being able to see into bags - - bugfix: Fixed a number of chapel and morgue doors being high-security CENTCOM - variants. This was also triggering certain phobias. - - bugfix: Fixed the warning message for chameleon projectors when a mob is inside - a closet - - tweak: Improved the formatting of the round-end report for AI and robotic units - - spellcheck: Added a period to the end of point-at messages. - - bugfix: Fixed ghosts getting spammed by sounds when clicking on a jukebox. - - bugfix: Fixed a duplicate docking port on the aux base template which was causing - some errors - - bugfix: Fixed Gr3y.T1d3 virus bolting open the doors to the SM, causing delamination. - - bugfix: Fixed the cat butcher dropping incorrectly colored tails - - bugfix: Fixed being unable to add a cat tail to someone through surgery. - - bugfix: Fixed mass purrbation & the anime event failing to give people ears and - tails in some cases. - - bugfix: Fixed AI units being able to toggle turrets on and off when AI control - is disabled. - - bugfix: While it slight increases the cost of production, vanilla ice cream is - now actually made with real vanilla! - - bugfix: Fixed AI units being able to see lights through static. - - bugfix: Fixed securitron pathfinding icons being broken. - imsxz: - - bugfix: invulnerability exploit involving stable adamantine extract fixed - ninjanomnom: - - admin: You can now use alt click in advanced buildmode to to copy the targeted - object for placement with left click. - - rscadd: You can now see objects and turfs past the map edge borders. - - bugfix: Shuttles getting removed would occasionally causes issues. This has been - fixed. -2018-04-28: - MMMiracles: - - rscadd: A jukebox can now be found in the bar of your respective station. Contact - Central about song suggestions to be added to the curated list! - Naksu: - - code_imp: clothing-specific flags are now defined in /obj/item/clothing.clothing_flags - PKPenguin321: - - balance: The changeling "Spiders" power now requires absorptions gained through - the actual Absorb ability, rather than DNA from DNA sting. To compensate, it - now only requires 3 absorptions, down from 5. - ShizCalev: - - bugfix: Fixed a good number of missing icons. - as334: - - rscadd: Fusion is back - - rscadd: Fusion now happens with large quantities of hot plasma and CO2, consuming - all the plasma rapidly and producing large amounts of energy. Other gases can - also effect the performance of the reaction. - - rscadd: Fusion now produces radiation. Be careful around reactors. - - bugfix: fixes fusion dividing by zero and destroying everything - - code_imp: Gas reactions now have access to where they are occurring - - bugfix: Prevents some other reactions from producing matter from nothing - kevinz000: - - rscadd: Circuit ntnet components buffed. Added a new low level ntnet component - that can send custom data instead of just the two plaintext and one passkey - format, which things will use by default. Ntnet now uses a list for their data - instead of three variables. they also have lowered complexity for the now weakened - normal network component, and has lower cooldowns. - pigeonsk: - - bugfix: The faint echoes of maracas grows louder, as if a past spirit once forgotten - has come back with a vengeance... -2018-04-29: - Naksu: - - bugfix: Wearing a bucket no longer connects your head to the vacuum of space - oranges: - - rscdel: Pet collars can no longer be equipped on humans -2018-04-30: - Dax Dupont: - - balance: Adds a cooldown to PDA send to all messages. - - bugfix: Last sent message cooldown actually works now. - - tweak: More reagents in the clogged vents event. - Denton: - - rscadd: Added more holoprojectors to techwebs (security, engineering and atmos). - Erwgd: - - rscadd: Limb growers can now create limbs for flypeople and mothmen. - Evsey9: - - balance: Integrated Circuit weapon mechanisms now work only when outside of any - containers and hands, due to reports of severe injury caused by activating them - while still holding them. - Garen: - - imageadd: added inhands for teleprods. - JJRcop: - - bugfix: Integrated circuits can no longer throw themselves. - Jalleo: - - bugfix: a certain exploit that can occur in regards to creating certain items - in a particular manner - - tweak: readds emitter field generator and rad collector wrenching times. Someone - override it when adding the wrench_act. - Mickyan: - - tweak: You can now see how well fed you are by self-inspecting. - Naksu: - - code_imp: More flags have been moved to their appropriate places - - code_imp: HEALS_EARS_2 is removed in favor of the earhealing component - - code_imp: wearertargeting component is available to subtype for components that - want to target the wearer of an item rather than the item itself - ShizCalev: - - bugfix: Glass stacks will now properly delete when exploded. - - bugfix: Fixed attacking someone with a bikehorn not triggering the correct mood - event. - YakumoChen: - - tweak: Nanotrasen has once again shipped BZ to its nearby stations. Check your - local Xenobiology lab for your shipment. - - tweak: Nanotrasen would like to remind you that BZ is meant for keeping slimes - from moving or getting hungry. It is not for human use and may lead to hallucinations. - Always practice workplace safety when handling dangerous gasses! - george99g: - - bugfix: Committing suicide will now stop you from being cloned via prescans. - iksyp: - - tweak: pacifists can now use .50BMG Soporific Rounds - ninjanomnom: - - bugfix: Caravan ambush shuttles have been templated to fit the new system and - can fly again. - pigeonsk: - - bugfix: Large stacks of plastitanium now display properly - - rscadd: You can now get traditional sake and get a first-hand taste of a superior - culture. Have I told you about my katana and my trip to- -2018-05-01: - BuffEngineering: - - bugfix: Nanotrasen has graciously connected the port bow solar's SMES to the main - grid. - Denton: - - rscadd: You can now craft and disassemble HUDsunglasses! Check out the clothing - section of the crafting menu. - - tweak: Cargo packs have been reorganized to shrink the big engineering, food&livestock - and misc categories. - NewSta: - - rscadd: 'Added 5 new drinks: Alexander, Between the Sheets, Kamikaze, Mojito and - Sidecar.' - - rscadd: Added Menthol and Sake to the drink dispensers. - Ordonis, Denton: - - rscadd: OH YEAH BROTHER! The H.O.G.A.N. AI module has a chance to spawn at the - AI upload. - SpaceManiac: - - bugfix: The button in the mech interface to terminate maintenace protocol no longer - reads "Initiate maintenace protocol". - - bugfix: Boxes now fit inside storage implants again. - XDTM: - - balance: Small, constant ticks of brain damage are now less likely to cause traumas. - deathride58: - - bugfix: Fixed the intergalactic stock market crash. The speculation/performance - modifier has been removed completely. -2018-05-04: - Cobby (Stolen from GrayRachnid): - - tweak: The processor has now been generalized techweb-wise into the "food/slime - processor". - - rscadd: The processor can now be made by Science. - Dax Dupont: - - balance: After successful lobbying by the Space Ancap Federation ammo is no longer - free. Material redemption cost is now determined by the amount of bullets left. - - balance: .38 ammo is now cheaper to produce. - - balance: Casings now give a little bit of metal. mostly for immersion sake. - Denton: - - bugfix: Runtimestation's RnD machinery is now up to date. - Fox McCloud: - - bugfix: Fixes recycler not recycling bluespace and plastic objects - - bugfix: Fixes objects with material components always showing their materials - on examine - Garen: - - bugfix: Removes unintentional pins from the constant circuit. - Hyacinth: - - rscadd: Grenadine is now available in the bar! - - tweak: Tequila sunrises now require grenadine to make! - Mickyan: - - bugfix: Our suppliers assure us that Midori Tabako cigarettes will actually contain - tobacco from now on. - Naksu: - - code_imp: APC code is slightly less shit. - - tweak: APC cells can be removed with a crowbar - Onule!: - - rscadd: Plasmaman liver and stomach crystals! - Poetic_Iron: - - spellcheck: Fixed 'Tequila Sunrise' naming from 'tequila Sunrise'. - SpaceManiac: - - code_imp: The commit hashes shown in Show Server Revision are now long enough - to autolink when copied into issue reports. - Spellbooks Take 2: - - imageadd: Magical Spellbooks are now animated. - Tlaltecuhtli: - - tweak: medbeams heal tox and oxy slighty - pigeonsk: - - rscdel: After an internal audit and review Nanotrasen has decided that stock financing - at the station-level makes no logistical nor managerial sense. Stations, and - their cargo departments, may no longer play the stock market. -2018-05-06: - Dax Dupont: - - bugfix: Rhumba beat now stops processing while dead. - Denton: - - bugfix: The Donksoft vendor board got lost during the techwebs transition and - has been re-added under the illegal technology node. - Garen: - - tweak: Grilles must take damage to produce tesla shocks. - Naksu: - - bugfix: APCs are closed with crowbars properly again. Screwdrivers can now be - used by borgs to pop out the cell instead of crowbars - SpaceManiac: - - bugfix: The top-left menus (icon scaling, ghost preferences, etc.) now work again. - Xhuis: - - tweak: Character traits are now called character quirks. Functionality remains - unaffected. - deathride58: - - rscadd: If the nuke disk stays still for long enough, the lone operative event - will enter the random event rotation. The longer the nuke disk stays still, - the more likely the lone operative event will trigger. -2018-05-08: - cacogen and nicbn: - - tweak: You can now select RPD modes individually. - - tweak: RPD autowrenching is now a tgui action rather than an Alt Click option. - deathride58: - - rscadd: Added ambient occlusion. You can toggle this on or off in the game preferences - menu. -2018-05-09: - Firecage & Bluespace: - - balance: Replaces the Roman Shield and Roman helmets in the Autodrobe with fake - versions with neither block chance nor armour values. - PKPenguin321: - - rscadd: There are now two new variants of the concatenator integrated circuit. - Small, which only takes 4 inputs, and large, which takes 16. Small uses 50% - less complexity, large uses 50% more. - - rscadd: There's a new string length circuit, which simply returns the length of - a given string. - - rscadd: There's a new indexer circuit, which takes a string and an index and returns - the character found at the index of the given string. - - tweak: The find text integrated circuit now has two new pulse outs, one that runs - when it finds the text and one that runs when it does not. - - tweak: Leaving the delimiter in the explode text circuit null will now return - all of the input string's characters in a list. -2018-05-10: - Dax Dupont: - - bugfix: The singularity spawned by the arcade orion tale meme will disappear as - intended. - Kor: - - rscadd: Science may now research reactive armour shells, which create different - armours when combined with different anomaly cores. They are constructable from - the Research and Engineering lathes. - Ordo: - - rscadd: Adds a french beret to the mime. Steal it from him to learn French! Sort - of. HONH HONH HONH. - SpaceManiac: - - refactor: Large groups of PNG assets are now transmitted in spritesheets, greatly - improving load times. - - tweak: The access denied message when entering a mech now distinguishes between - DNA lock and ID requirements. - - bugfix: Removing an ID card from a wallet now properly removes its visual and - accesses. - Tlaltecuhtli: - - bugfix: the default bulldog shotgun ammo makes sense now - - bugfix: fixes a possible money exploit - YPOQ: - - bugfix: Anomalies can be disabled with signalers again -2018-05-13: - Alexch2: - - bugfix: Large crates no longer behave like lockers. They no longer open into invisible - sprites when damaged, interacted with, when "toggle open" is used, or when non-crowbar - items are used on them. - Ausops and Qbopper: - - rscadd: Added security jumpskirts - snag one from a security wardrobe locker. - Cobby: - - bugfix: Beds will now properly save you from floor is lava, but only if you buckle - to them - Cyberboss: - - tweak: You may now take unlimited neutral and negative quirks - Denton: - - bugfix: Runtimestation's RTGs are now connected to the powernet. - - code_imp: Added chem_dispenser/fullupgrade as well as chem_synthesizer for testing. - - tweak: Replaced runtimestation's two chem dispensers with those subtypes. - - spellcheck: Did you know that you can use a screwdriver on the ChemMaster board? - Now you do. - Frozenguy5: - - tweak: You can now make plasma reinforced glass at the ORM. - - tweak: Titanium glass is now worth 0.5 titanium + 1 glass. Plastitanium glass - is now worth 0.5 titanium + 0.5 plasma + 1 glass. Therefore these glass sheets - are cheaper to make. - Iamgoofball: - - bugfix: Family Heirlooms now properly show you where they are stored if they spawn - in a bag. - Mickyan: - - tweak: Gauze can be deconstructed into cloth using wirecutters. - Naksu: - - rscdel: Fusion has been removed for pressing ceremonial reasons, and also because - it crashes the server - Tlaltecuhtli: - - bugfix: 50% of the corgis bought are now male - XDTM: - - tweak: Teleporters linked to other teleporters now teleport into the other teleporter's - hub, instead of the power station. - - bugfix: Teleporters now no longer consume power if teleportation fails. - YPOQ: - - bugfix: Fixed items stacks sometimes having the wrong amount if created on another - stack - - bugfix: Constructing light tiles no longer uses two sheets of metal - - bugfix: Gorillas have hands slots again - - bugfix: The paddle/nozzles of defibs, backpack water tanks, and gatling lasers - work again - - bugfix: You can honk people with bike horns again -2018-05-14: - Barhandar: - - rscadd: Amount of goliath plates is now shown in examine for explorer suits and - mining hardsuits. - Dax Dupont: - - rscadd: You can now swap disks in the plant manipulator. - JStheguy: - - imageadd: Vending machines now have more complex shading and are rigged with next-gen - flickering technology, a couple have either a partial or complete facelift. - Maintenance panel overlays have been fixed on machines where they were seemingly - left unchanged when the switch to 3/4ths was made. - - imageadd: Burger buns are bigger and more detailed. - - imageadd: Donuts have been totally redrawn. - SpaceManiac: - - admin: Admin-healing someone will now rejuvenate their mood as well. -2018-05-15: - Dax Dupont: - - bugfix: Fixes missing curator hud icon. - Denton: - - tweak: Engi-Vend machines now contain fire alarm and firelock electronics! - - code_imp: Loose tech storage circuit boards have been replaced with spawners. - - rscadd: APC/air alarm/airlock/fire alarm/firelock electronics are now available - once Industrial Engineering is researched.. -2018-05-16: - Dax Dupont: - - balance: Cult items will no longer be a long ride on the vomit coaster if picked - up by a non cultist. -2018-05-17: - Dax Dupont: - - balance: Cult space bases are kill again. - - balance: Cult floors now pass gas. - - bugfix: Fixed a few things deconning into the wrong circuit. - - bugfix: You can no longer do infinite bioware surgery. - - rscadd: Added the MURDERDOME VR player versus player combat arena, filled with - the most powerful weapons Centcom could think of to murder each other peacefully. - Contact your nearest vendors for VR sleepers. - - tweak: VR landmarks now accept outfits. - - tweak: VR Sleepers can now be constructed and researched. - - tweak: VR Sleepers now respond to mouse drops like sleepers! - - bugfix: VR sleepers no longer close or open inappropriately. - Denton: - - code_imp: Added /syndicate subtypes for air alarms and APCs. - - bugfix: Added missing stock parts to the syndicate lavaland base. - - tweak: Added kitchen related circuit boards to the syndie lavaland base. - Dimmadunk: - - rscadd: 'There''s a new type of reagent added to the booze dispenser: Fernet. - With it you can make a couple of new digestif drinks that will help you reduce - excess fat!' - Garen: - - rscadd: Thrower and Gun circuits put messages in chat when they're used. - - tweak: Only the gun assembly can throw/shoot while in hand - - imageadd: Adds inhands for the gun assembly - - bugfix: grabber inventories update when a thrower takes from them - Pubby: - - tweak: PubbyStation has been updated. You can now be the lawyer. - ShizCalev: - - bugfix: Adminorazine will no longer kill ash lizards. - - bugfix: Adminorazine will no longer remove quirks. - iskyp: - - tweak: the walls on the crashed abductor ship ruin in lavaland can now be broken - down -2018-05-18: - GrayRachnid: - - rscadd: The Spider Clan proudly announces that they've taken steps to improve - their hospitality at their capture center! They now hope that captured targets - would not kill them self or fight between each other, dirtying the floor with - blood. - - rscadd: They've also added a VR room for those sick of the real world, taking - them to a reality where they feel like they matter. -2018-05-19: - Alexch2: - - spellcheck: Fixes tons of typos related to integrated circuits. - - tweak: Re-writes the descriptions of a few parts of integrated circuits. - Astatineguy12: - - tweak: The experimentor is less likely to produce food when it transforms an item - - bugfix: The experimentor no longer breaks when the toxic waste malfunction occurs - multiple times and isn't cleaned up - - bugfix: The experimentor irridiate function actually chooses what item to make - properly rather than picking from the start of the list - Dax Dupont: - - bugfix: Mulligan didn't work on lizards and other mutants. Now it does. - - bugfix: Foam no longer gives infinite metal - Denton: - - code_imp: Loose silver/gold/solar panel crates have been replaced with "proper" - crates. - - tweak: There are rumors of the Tiger Cooperative adding a "special little something" - to some of their bioterror kits. - Iamgoofball: - - tweak: Lipolicide now only does damage if you're starving. - Mickyan: - - bugfix: Drinking too much Gargle Blaster, Nuka Cola or Neurotoxin no longer breaks - time and space. - Nichlas0010: - - tweak: Reseach Director Traitors can no longer receive an objective to steal the - Hand Teleporter - ShizCalev: - - bugfix: Fixed mobs immune to radiation being killed by HIGH bursts of radiation. - - bugfix: The book of mindswap will now properly mindswap it's users. - iksyp: - - rscadd: stacking machines and their consoles no longer dissapear into the shadow - realm when broken - - rscadd: you can link the stacking machine and its console by using a multitool -2018-05-20: - Pubby: - - rscadd: 'Cargo bounties from Nanotrasen. Earn cargo points by completing fetch - quests. remove: Several cargo exports have been reduced or merged into cargo - bounties.' - XDTM: - - rscadd: 'Added a new lavaland loot item: Memento Mori. A necklace which has the - power to prevent death, but will turn you into dust if removed.' -2018-05-22: - Cyberboss: - - rscadd: You can now view your last round end report window with the "Your last - round" verb in the OOC tab - Dax Dupont: - - tweak: The BoH dialog now has Abort instead of Proceed as an default option. - - bugfix: Fixes race condition caused by exiting the body while dying in VR. - Denton: - - balance: Skewium is much less likely to appear during the Clogged Vents event. - Firecage: - - rscadd: Replaces wardrobe lockers on Box with Wardrobe Vending Machine. - Kor: - - rscadd: Engineering can now create anomaly neutralizer devices, capable of instantly - neutralizing the short lived anomalies created by the supermatter engine. - - rscadd: The Quartermaster and HoP can now access the vault so they can use the - bank machine. - Mickyan: - - bugfix: Pacifists can now use harm intent for actions that require it (but still - can't harm!) - Naksu: - - code_imp: Added EMP protection component, replaced various bespoke ways things - handled EMP proofness - Nichlas0010: - - spellcheck: you now feel nauseated instead of nauseous - - bugfix: Comms consoles won't update while viewing messages - SpaceManiac: - - bugfix: Pipe icons in the RPD now show properly in older versions of IE. - - bugfix: Family heirlooms which can fit in pockets will now spawn there. - - bugfix: Family heirlooms which only fit in the backpack now show the backpack - at roundstart. - - bugfix: Family heirlooms which do not fit in the backpack are no longer gone forever. - - bugfix: Mindswapping with someone else no longer forces ambient occlusion on. - - code_imp: IRV polls now use the same version of jQuery as everything else. - - bugfix: Hydroponics trays can no longer be deconstructed with their panels closed - or unanchored while irrigated. - - tweak: Frames for machines which do not require being anchored can now be un/anchored - after the circuit has been added. - - bugfix: Removing an ID from a PDA in a backpack no longer hides the ID until something - else updates. - - bugfix: Opening and closing airlocks repeatedly no longer stacks queued autocloses. - - bugfix: Admin AI interaction now works properly on firelocks. - - spellcheck: Fix "Your the wormhole jaunter" when a wormhole jaunter saves you - from a chasm. - Wilchen: - - rscdel: Removed box of firing pins from rd's locker - armhulen: - - rscdel: chameleon guns are disabled for breaking the server - kevinz000: - - bugfix: Field generators are once again operable by adjacent cyborgs. - - bugfix: Digital valves are once again operable by silicons. - - bugfix: Chasms no longer drop mobs buckled to undroppable mobs or objects. - resistor: - - rscadd: Added circuit labels! You can now customize the description of your assemblies. -2018-05-23: - ShizCalev: - - bugfix: Fixed a runtime with the gulag teleporter that could cause the process - to fail if you removed the ID. - - tweak: Not setting the goal of a prisoner's ID when teleporting them will now - set the ID's goal to the default value (200 points at the time of this change.) - SpaceManiac: - - bugfix: Flipping and then rotating trinary pipe fittings no longer causes their - icon to mismatch what they will become when wrenched. - - bugfix: RPD tooltips for flippable trinary components have been corrected. - - bugfix: Entertainment monitors now view the real Thunderdome rather than the template. - cyclowns: - - rscadd: Analyzers can now scan all kinds of atmospheric machinery - unary, binary, - ternary, quaternary, you name it. This means stuff like gas pumps, gas mixers, - vents and so forth can be analyzed. - - tweak: Analyzers now show temperature in kelvin as well as celsius. - - tweak: Analyzers now show total mole count, volume, and mole count of all gases. - - tweak: Analyzers show everything at slightly higher degrees of precision. - imsxz: - - admin: Using mayhem bottles and going under their effects is now logged. - kevinz000: - - rscadd: Any anomaly core can now be deconstructed for a one time boost of 10k - points in the deconstructive analyzer. -2018-05-25: - Astatineguy12: - - bugfix: The mime blockade spell now shows up under the right tab - Cruix: - - rscadd: Added a button to chameleon items to change your entire chameleon outfit - to the standard outfit of a selected job. - Dax Dupont: - - rscadd: Murderdome now has a telecomm system, so you can taunt your enemies better. - - rscadd: Snowdin has come back, as VR! - - rscadd: Nanotrasen Tactical Bureau has discovered a Syndicate VR Training program - on their last raid. It seems to be based on an old CentCom design... - - rscadd: Restricted variant of the uplink. Will allow admins and such to spawn - uplinks in remote arenas or for events that aren't as destructive and can't - communicate with other Zs. - - bugfix: Extends same Z level check to monitor and bugging operations too for camera - bug. - - bugfix: VR sleepers now show the stat of the VR avatar instead of the user as - intended. - - code_imp: Makes it throw a stack trace when you ghostize in VR. - - tweak: It will now delete the body if it's unconscious if you try to reconnect, - to speed up reconnection. - - balance: Emagged sleepers will now display a notification on the UI, and make - you slightly dizzy after a while. - - balance: More chemicals can be found when vents get clogged. - - bugfix: Fixes accidental empty ahelp replies. - Denton: - - rscadd: Departmental wardrobe vendors have been added to all maps. - - spellcheck: Sorted cargo packs (wardrobe refills//alphabetically) and mining vendor - items (by price), again. - - bugfix: 'Navbeacon access requirements have been fixed: Now you need either Engineering - or Robotics access, but not both at the same time.' - Garen: - - rscdel: Removed circuitry save files saving whether or not the assembly is open. - - rscadd: Adds messages for when you successfully use a sensor or scanner circuit. - - bugfix: Fixed circuit printers printing advanced assemblies from save files despite - not being upgraded. - - bugfix: Fixed circuit printers printing circuits into assemblies that wouldn't - normally be able to hold them. - - bugfix: Fixed circuit assemblies taking damage when using objects with the help - intent. - Mickyan: - - spellcheck: fixed typo in bronze girder construction - MrDoomBringer: - - rscadd: Cargo now has access to Supplypod Beacons! Use these to call down supplypods - with frightening accuracy! - - imageadd: the VR sleeper action button has a sprite now - Naksu: - - code_imp: Replaced initialized and admin_spawned vars with flags. - - code_imp: changed the shockedby list on doors to be only initialized when needed. - - tweak: Chameleon projector can no longer scan (often temporary) visual effects - like projectiles, flashes and the masked appearance of another chameleon projector - user - - bugfix: Drones can no longer see a static overlay over invisible revenants - - balance: adjusted default antag rep points to grant every job the same amount - of points per round, except for assistant which gets 30% less - SpaceManiac: - - bugfix: Non-harmfully placing someone who is resting on a table no longer makes - them get up. - - bugfix: The disco machine no longer lags the chat by spamming "You are now resting!" - messages. - - bugfix: The green overlay indicating where a map template will be placed is no - longer invisible on space turfs. - - bugfix: CentCom is no longer self-looping, fixing the ability to see or get into - certain areas after escaping to space. - - bugfix: The destructive analyzer no longer consumes entire stacks to give the - benefit of one sheet. - - bugfix: Xeno weeds and floors under diagonal walls are now on the correct plane, - fixing odd ambient occlusion appearances. - - bugfix: Inserting materials into protolathes with telekinesis is now possible. - - bugfix: Telekinesis no longer teleports items removed from deep fryers, constructed - sandbags, and leftover materials not inserted into lathes. - - bugfix: Telekinetic sparkles now appear in the correct place when clicking on - a turf and when clicking in the fog of war in widescreen. - - bugfix: Telekinetically adjusting power tools no longer causes them to exit the - universe. - - tweak: Examining a telekinetic grab in-hand will now examine the grabbed object. - - bugfix: Frost spiders now correctly inject frost oil on bite. - yorii: - - bugfix: Fixed the smartfridges to be in line with all other machines and puts - the released item in your hand. -2018-05-26: - Dax Dupont: - - bugfix: Experimentor no longer shits out primed TB nades. - Garen: - - rscadd: Added a cell charger to the circuitry lab on all stations. - - rscadd: Added a circuitry lab to the syndicate lavaland base. - - tweak: Modified the meta station circuitry lab. - Iamgoofball: - - rscadd: Humans require ice cream. Eat the ice cream. - Kor: - - rscadd: Bag of Holding detonations have been significantly reworked. - Robustin with cat earrs: - - bugfix: 'Gun overlays should be way less laggy now. remove: Chameleon guns are - completely removed since they crash the server, were already made unavailable, - and are the worst shitcode I''ve ever seen in my life.' - SpaceManiac: - - tweak: Clicking on the viewport to focus it no longer leaves the input bar red. - - admin: Create Object will no longer force objects with special directional logic - to be facing south by default. - - bugfix: Running diagonally into space now properly continues the diagonal movement - in zero-gravity. -2018-05-27: - Armhulen, and Keekenox: - - rscadd: Chaplain now gets custom armor too! Order it from the beacon in your locker. - Cobby: - - tweak: Several of the recent drinks added have now been given effects! - - rscadd: 'Alexander: Conquer the world... or just the station with this drink! - If you have a shield, it will increase the block chance by 10 percent! Careful - not to drop it in battle though....' - - rscadd: 'Between The Sheets: Save the pillow talk for next shift, having this - in your system while you''re asleep will slowly heal you!' - - rscadd: 'Menthol: Prevents coughing. Good for a cold or if the Chaplain gets his - hands on a smoke book!' - - tweak: Descriptions have been edited so that if you view these under a chem master - they will tell you the effect. - - tweak: Decals are the exception to the recent removal of effects in Chameleon - Projectors. - Dax Dupont: - - bugfix: Did you know istype doesn't work on paths even though they are mostly - the same? Yeah I didn't either. Experimentor shouldn't shit out TB nades anymore. - - bugfix: Fixes item reactions for relics as well. - - rscadd: Adds better messaging - - bugfix: Fixes summons happening on away missions. - GuyonBroadway: - - rscadd: Adds gloves of the north star to the traitor uplink. Wearing these gloves - lets you punch people five times faster than normal. - - rscadd: Sprites for the gloves courtesy of Notamaniac - Mickyan: - - rscadd: 'New trait: Drunken Resilience. You may be a drunken wreck but at least - you''re healthy. If alcohol poisoning doesn''t get you, that is!' - Naksu: - - rscadd: Nuclear explosive-shaped beerkegs found on metastation can now be triggered - with the nuclear disk and the syndicate's legacy nuclear code for a foamy surprise - SpaceManiac: - - bugfix: Unwrenching and re-wrenching pre-mapped atmos components no longer turns - them on automatically. - steamport: - - bugfix: Borgs/AIs can now toggle rad collectors -2018-05-28: - CitrusGender: - - bugfix: Kills you if you're under 0% blood and above -9999% blood level (shouldn't - be possible through normal means to be below that.) - - bugfix: Stops bloodloss trait from happening if your race contains the NO_BLOOD - - bugfix: added a check to see if the preferred race is human when the name doesn't - have a space - Dennok: - - bugfix: Fixed a laser reflections from reflectors. - Denton: - - tweak: Deltastation's firing range has been decommisioned and replaced with a - brand new toxins burn chamber. - - bugfix: Delta toxins disposals are now actually connected to the disposals loop. - Toxins storage has a fire alarm too. - - bugfix: The shutter buttons of Pubbystation's mechbay now check for access. - SpaceManiac: - - bugfix: The robustness of the Super Secret Room has been increased. - - bugfix: Observers can no longer move the action button toggle or change the ambient - occlusion setting of their targets. - - bugfix: The emergency space suit safes in escape pods are no longer always unlocked. - Tlaltecuhtli: - - bugfix: apiaries from cargo start unwrenched -2018-05-29: - Dennok: - - rscadd: Collectors show their real produced power and stored power when examined - Naksu: - - code_imp: removed some unneeded typecaches -2018-05-31: - CitrusGender: - - bugfix: Flamethrowers are no longer uncraftable since they have a part that happens - to be a tool. - - bugfix: Fixes cyborgs not being able to use two-handed modules while other modules - are equipped. - CosmicScientist: - - rscdel: Can't make drones anymore - Cruix: - - rscadd: AIs now have an experimental multi-camera mode that allows them to view - up to six map areas at the same time, accessible through two new buttons on - their HUD. - Cyberboss: - - config: The limit of monkey's spawned via monkey cubes is now configurable - Dax Dupont: - - bugfix: Fixes the wrong tiles in Syndicate VR trainer and uses different tiny - fans. - - bugfix: Access didn't append to VR IDs - Firecage: - - rscadd: The mech fabricator can now print two new janiborg upgrades. Advanced - Mop and Trash Bag of holding. These two upgrades uses the advanced robotics - node. - SpaceManiac: - - bugfix: Changing UI Style preference now takes effect immediately rather than - next round. - - bugfix: Mindswapping with someone no longer gives you their UI style. - - bugfix: The destructive analyzer can once again be used to reveal nodes. - - spellcheck: Some references to "deconstructive analyzer" have been updated to - "destructive". - - tweak: Hulks and catpeople now show "Human-derived mutant" under "Species" when - health scanned. - - bugfix: Cyborg inventory slots once again unhighlight when a module is stowed. - deathride58: - - rscadd: Things that are capable of igniting plasma fires will now generate heat - if there's no plasma to ignite. Building a bonfire inside the station without - taking safety precautions is now a bad idea. - kevinz000: - - rscadd: Plasma specific heat is 500J/K*unit, everything else is 200 - zaracka: - - bugfix: The Spirit Realm rune no longer spawns a braindead cult ghost when attempting - to summon one after a player reaches the limit. -2018-06-01: - Big Tobacco: - - rscadd: Cheap lighters now come in four different shapes and Zippos can have one - of four different designs, collect them all and improve our sales! - - imageadd: All existing lighter sprites have been given a face-lift and the flames - are now subtly animated. - - tweak: Cheap lighters now use a fixed list of 16 colors to pick from instead of - using totally randomized colors. - - imageadd: Cigar cases have been tweaked to be a bit smaller and to have a modified - design. - - imageadd: Cohiba Robusto and Havanan cigars now use separate case sprites from - the generic premium cigar cases. - Dax Dupont: - - bugfix: Fixed rpeds throwing stock part rating related runtimes. - Naksu: - - code_imp: NODROP_1, DROPDEL_1, ABSTRACT_1 and NOBLUDGEON_1 have been moved to - item_flags - - tweak: brass handcuffs, meat hook and the chrono gun now conduct electricity. - Nichlas0010: - - bugfix: You can no longer use a soapstone infinitely - SpaceManiac: - - bugfix: Moving diagonally past delivery chutes, transit tube pods, &c. no longer - causes your camera to be stuck on them. - - refactor: The base machinery type is now anchored by default. - - bugfix: Pubby's auxiliary mining base now works again. - - bugfix: Cloning no longer breaks a character's connection to their family heirloom. - - bugfix: The overlay effects of cult flooring are now on the floor plane, fixing - their odd ambient occlusion appearance. - - bugfix: Beam rifle tracers no longer fall into chasms. - - bugfix: Vomiting on the same tile a second time no deletes the vomited reagents. - theo2003: - - bugfix: fixed the clockwork helmet not dropping to ground when used by non-clock - cultists -2018-06-03: - Denton: - - tweak: 'Pubbystation: Added a dual-port vent pump to the toxins burn chamber.' - - code_imp: Removed most airlock_controller/incinerator related varedits and replaced - them with defines/subtypes. - - tweak: The Deltastation toxins lab has its portable scrubber, air pump and intercom - back. - Naksu: - - bugfix: comms consoles now work in transit again, and no longer work in centcom - - code_imp: removed unnecessary getFlatIcons from holocalls - - bugfix: Screwdrivers and other items with overlays now show the proper appearance - of the item when attacking something with them, or when put on a tray. - Nichlas0010: - - bugfix: You now can't get multiple download objectives! - - tweak: RDs, Scientists and Roboticists can no longer get download objectives! - ShizCalev: - - bugfix: Fixed cigar cases & cigarette packets taking two inventory slots - - bugfix: Fixed cigar cases showing the wrong icon for the cigars inside them. - - bugfix: Fixed cigar cases & cigarette packets stating the wrong name of the cigar/cigarette - when removed via altclick. - - bugfix: Fixed items in pockets vanishing when a mob is monkeyized. - - bugfix: Fixed items in pockets vanishing when a mob is gorillized. - - bugfix: Fixed items in pockets vanishing when a mob is infected with a transformation - disease. - - bugfix: Fixed items in pockets not being properly deleted when a mob goes through - a recycler - - bugfix: Fixed items in pockets not being properly deleted when highlander mode - is enabled. - - bugfix: Fixed exploit allowing you to remove unremovable tanks from pockets. - - bugfix: Fixed items in pockets dropping when a mob is equipped with a new outfit. - - bugfix: Fixed items in pockets not being covered in blood when equipping the psycho - outfit. - SpaceManiac: - - bugfix: Switching mobs into/out of a mech (by VR, ghosting, or mindswap) no longer - improperly applies the mech's cursor. - ThatLing: - - bugfix: PDA style now gets loaded correctly. - cyclowns: - - bugfix: Fires no longer flicker back and forth like crazy - iskyp: - - tweak: switched the type of the space suit on the syndicate shuttle - theo2003: - - tweak: roboticists have access to R&D windoors - - bugfix: fixed hydroponics tray weed light staying on when removing weeds with - integrated circuits - yorpan: - - rscadd: Brain damage makes you say one more thing. -2018-06-04: - Beachsprites: - - imageadd: added directional beach sprites - MrDoomBringer: - - admin: Central Command can now smite misbehaving crewmembers with supply pods - (filled with whatever their hearts desire!) - SpaceManiac: - - bugfix: Atom initialization and icon smoothing no longer race, causing late-loading - mineral turfs to have no icon. - - spellcheck: Faceless persons no longer "melt their face off" in energy gun suicides. - - bugfix: The Lightning Bolt spell now works again. - yenwodyah: - - bugfix: A few virus threshold effects should work now -2018-06-06: - Dax Dupont: - - bugfix: Fixes a sentience related exploit by blacklisting it in restricted uplinks. - Denton: - - rscadd: Arcades have been stocked with preloaded tactical snack rigs. - - bugfix: Swarmers can no longer attack field generators and turret covers. - - bugfix: The Pubbystation maint bar Booze-O-Mat now shows its contents correctly. - MrDoomBringer: - - admin: CentCom Supplypods now stun their target before landing, and won't damage - the station as much - Naksu: - - code_imp: moved /datum.isprocessing into datum flags - iksyp: - - bugfix: Ever since the great emotion purge of 2558, people were able to work at - top efficiency, even while starving to death. This is no longer the case, Nanotrasen - Scientists say. - - admin: Hunger slowdown only applies if mood is disabled in the config. -2018-06-07: - Cruix: - - bugfix: Picture-in-picture objects now are no longer overlapped by other certain - objects - SpaceManiac: - - bugfix: It is now possible to access the wires of RND machines in order to repair - them if they have been EMP'd. - Tlaltecuhtli: - - bugfix: rad collectors set to research point gen are somewhat ok now - kevinz000: - - tweak: Vehicle speed changes now happen immediately instead of on the next movement - cycle -2018-06-08: - AnturK: - - code_imp: Gravity can now go above 1g - CitrusGender: - - imageadd: sandstone wall sprite for indestructible object - Denton: - - tweak: Added a warning to the shuttle purchase menu. - - bugfix: Added missing vents to runtimestation. - - tweak: 'Runtimestation: Added /debug EMP flashlight, emag, techfab and tiny fans. - Replaced RCD, healing wand and sleeper with more suitable subtypes.' - MrDoomBringer: - - tweak: Due to DonkCo's recent budget cuts, their line of toy emags are now noticably - less realistic. As such, you can now examine an emag to determine if it is a - toy or not. - Naksu: - - balance: Temperature gun projectiles now respect armor/dodge, and will no longer - freeze you if they don't hit you. - SpaceManiac: - - bugfix: The thermal sight benefits of lantern wisps no longer disappear if you - change glasses. - - bugfix: Paradox bags no longer block the middle of your screen until reconnect, - and also actually work. - - bugfix: A pAI dying while in holoform no longer deletes the card, instead merely - emptying it. - - bugfix: The elevators in the Snowdin away and VR missions work again. - - bugfix: Minor atmos issues in Snowdin and UO45 have been corrected. - Tlaltecuhtli: - - bugfix: all spiders can make webs now - deathride58: - - balance: Sparks, using welding tools, using igniters, etc, will no longer cause - an instant fireless inferno in small rooms. - - tweak: The revert of the original hotspot_expose() PR has been reverted, since - the reason as to why it was reverted was resolved with this change. - - balance: Reverted the increased rad collector tech point gain rate. - fludd12: - - rscadd: Love potions are marginally more interesting! This same effect applies - to if you are a valentine! - - tweak: The names of extracts are now in the proper order, finally! - - rscadd: Self-sustaining extracts are in! Technically, this is a fix, but whatever. - - bugfix: Stabilized Cerulean extracts no longer vaporize items into the Aetherium. - - rscadd: Stabilized Gold extracts are now moderately more fun to use! The randomized - creature persists if it is killed, and can be rerolled at will! Also, if you - give the creature a sentience potion, the mind will transfer over! - oranges: - - rscadd: Sec now has khaki pants for tacticoolness -2018-06-11: - Mickyan: - - rscadd: Added an abandoned kitchen to Metastation maintenance - XDTM: - - bugfix: Fixed anti-magic not working at all. - fludd12: - - bugfix: Stabilized gold extracts now respawn the familiar properly. - - bugfix: Stabilized gold familiars retain the proper languages even after respawning. - - tweak: Stabilized gold familiars can be renamed and have their positions reset - at will. -2018-06-12: - Dax Dupont: - - bugfix: Botany trays don't magically refill anymore with a rped. - SpaceManiac: - - tweak: Fire alarms now redden all the room's lights, and emit light themselves, - rather than applying an area-wide overlay. - - bugfix: Fire alarms no longer visually conflict with radiation storms. - - bugfix: Pulling objects diagonally no longer causes them to flail about when changing - directions. - - bugfix: Riders are no longer left behind if you move while pulling something that - has since been anchored. - - bugfix: Lockboxes are now actually locked again. - - bugfix: Deaf people can no longer hear cyborg system error alarms. - - bugfix: Plasmamen now receive their suit and internals when entering VR. - - bugfix: Legion cores and admin revives now heal confusion. - XDTM: - - bugfix: Diseases now properly lose scan invisibility if their stealth drops below - the required threshold. -2018-06-13: - 'Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes:': - - rscadd: 'New drinks: Peppermint Patty and the Candyland Extract!!' - CitrusGender: - - bugfix: checks to see if bullets are deleted if they are the ammo type and the - bullet chambered. - Dax Dupont: - - balance: It's now easier to become fat. Don't eat so much. - Mickyan: - - bugfix: Fixed pacifists being able to harm using bottles/screwdrivers - SpaceManiac: - - spellcheck: Capitalization, propriety, and plurality on turfs have been improved. - XDTM: - - tweak: Coldproof mobs can now be cooled down, but are still immune to the negative - effects of cold. - - bugfix: This also fixes some edge cases (freezing beams) where mobs could be cooled - down and damaged despite cold resistance. - - balance: Virus crates now contain several bottles of randomly generated diseases - with symptom levels up to 8. - - rscdel: Removed the single-symptom bottles that were included in the virus crate. - - balance: Androids are now immune to radiation. - cacogen: - - rscadd: You can now see what other people are eating or drinking. - - rscadd: Borg shaker can now synthesise milk, lemon juice, banana juice and coffee - - bugfix: Renamed drinks no longer revert to their original name when their reagents - change - chesse20: - - rscadd: Adds Exotic Corgi Crate to Cargo - - rscadd: Adds Exotic Corgi, a Corgi with a random hue applied to it - - rscadd: Adds Talking Corgi Crate, and talking Corgi -2018-06-15: - CitrusGender: - - bugfix: logs will now show ckeys when admin transformations are done - Cruix: - - bugfix: Item attack animations can no longer be seen over darkness or camera static. - Dax Dupont: - - admin: You can now send messages as CentCom through people's headsets. - - bugfix: Fixes missing cream pies in the cream pie fridge. - Denton: - - bugfix: 'Omegastation: Connected the Engineering Foyer APC to the powernet.' - - bugfix: 'Pubbystation: Connected Chemistry disposals to the pipenet and fixed - Booze-O-Mat related display/access issues.' - - tweak: Syndicate stormtroopers now fire buckshot again. - Naksu: - - bugfix: Pipe dispensers can no longer create pipes containing literally anything - Nichlas0010: - - tweak: The TEG and its circulator can now be deconstructed and rotated! - - tweak: The TEG and its circulator now supports circulators in all directions, - rather than just west/east! - SpaceManiac: - - rscadd: A new OOC verb "Fit Viewport" can be used to adjust the window splitter - to eliminate letterboxing around the map. It can also be set to run automatically - in Preferences. - - bugfix: Refunding nuclear reinforcements while polling ghosts no longer summons - the reinforcements into the error room anyways. - - bugfix: Shift-clicking turfs obscured by fog of war no longer lets you examine - them. - - admin: It is now possible to cancel "Manipulate Organs" midway through. - Tlaltecuhtli: - - rscadd: Added shoes to leather recipes - ninjanomnom: - - bugfix: Gas overlays left over in some turf changes should no longer stick around - where they shouldn't. -2018-06-17: - Dax Dupont: - - refactor: Syndicate and Centcom messages have been squashed together. - - admin: You can now send both Syndicate and Centcom headset messages. Be mindful - that the button was changed to HM in the playerpanel - - bugfix: Fixed missing grilles under brig windows of the pubby shuttle. - - rscadd: For the pubby shuttle, added some food in the fridge, mostly pie slices. - Also added a sleeper to the minimedbay. - - tweak: Reworded pubby shuttle description to be more inline with the new train - shuttle. - - bugfix: Chem synths overlays aren't all kinds of fucked anymore. - - refactor: Unfucked all of the remaining chem synth code. - - refactor: Reagents no longer have an unused var that's always set to true. Who - did this? - - bugfix: You can no longer remove circuits with your mind. - - balance: Makes the xeno nest ruin harder to cheese. - - bugfix: Fixes the bathroom being airless in the Space Ninja anime jail. - Denton: - - tweak: 'Runtimestation: Added shuttle docking ports, a comms console, cargo bay - and syndicate/centcom IDs.' - - balance: Pirates and Syndicate salvage workers have been beefed up around the - caravan ambush ruin. - Pubby: - - bugfix: 'PubbyStation: Fixed disposals issue in security hallway' - SpaceManiac: - - bugfix: Moving large amounts of items with bluespace launchpads no longer creates - a laggy amount of sparks. - - bugfix: Unbreakable ladders are now left behind when shuttles move. - - bugfix: It is no longer possible to pull the mirages images at space transitions, - and some other abstract effects. - - tweak: PDAs and radios with unlocked uplinks no longer open their normal interface - in addition to the uplink when activated. - - tweak: Nuclear operative uplinks are no longer also radios. - - bugfix: The mining shuttle can once again fly to the aux base construction room - after the base has dropped. - - bugfix: The escape pod hallways on MetaStation and DeltaStation now have air again. - - bugfix: Hyperspace ripples now remain visible until the shuttle arrives, even - during extreme lag. - - bugfix: Ripples now correctly take the shape of the shuttle, rather than always - being a rectangle. - - bugfix: Non-secure windoors now properly support the "One Required" access mode - of airlock electronics. - Tlaltecuhtli: - - rscadd: After years of protests NT decided to update the fire security standards - by adding 3 (three) advanced fire extinguishers to all the new stations. - and Fel: - - imageadd: New chairs are on most shuttles! Finally, you can relax in style while - escaping a metal death trap. - cyclowns: - - rscadd: Fusion has been re-enabled! It works similarly to before, but with some - slight modification. - - tweak: Fusion now requires huge amounts of plasma and tritium, as well as a very - high thermal energy and temperature to start. There are several tiers of fusion - that cause different benefits and effects. - - tweak: The fusion power of most gases has been tweaked to allow for more interesting - interactions. - - tweak: BZ now takes N2O and plasma to create, rather than tritium and plasma. - - bugfix: Fusion no longer delivers server-crashingly large amounts of radiation - and stationwide EMPs. - theo2003: - - rscadd: Players who edited a circuit assembly can scan it as a ghost. -2018-06-18: - CitrusGender: - - tweak: The blob core (and only the blob core) now respawns randomly on the station - when the core is taken off z-level - - bugfix: Prevents the round from going into an unending state - - code_imp: Added a variable to the stationloving component for objects that can - be destroyed but not moved off z-level - Denton: - - tweak: NanoTours is proud to announce that the Lavaland beach club has been outfitted - with a dance machine, state of the art bar equipment and more. - SpaceManiac: - - bugfix: It is no longer possible to repair cyborg headlamps even when their panel - is closed. - - bugfix: Item fortification scrolls no longer add multiple prefixes when applied - to the same item. - - bugfix: The gulag shuttle no longer moves instantly when returned via the claim - console. - - admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while - an admin ghost. -2018-06-19: - Cyberboss: - - admin: Speaking in deadchat now shows your rank instead of ADMIN - Dax Dupont: - - balance: Circuit lab no longer starts with super batteries, they have been replaced - with high batteries. - - balance: Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty - of materials on the station you can gather. - - balance: Circuit labs no longer have their own protolathe and autolathe. Science - has their own lathes already. - - tweak: There's no more entire library worth of equipment, they can go publish - the books like the rest of the station, in the library. At least give the librarians - something other to do than screaming about lizard porn on the radio. - Hyacinth-OR: - - rscadd: Added a pink scarf to vendomats - Irafas: - - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot - JStheguy: - - rscadd: Added the data card reader circuit, a circuit that is able to read data - cards, as well as write to them. - - tweak: Data cards are now longer inexplicably called data disks despite clearly - being cards, and can be printed from the "tools" section of the integrated circuit - printer. - - tweak: Data cards no longer have a special "label card" verb and instead can have - their names and descriptions changed with a pen. - - rscadd: Also, some aesthetically different variants of the data cards, because - why not. - - imageadd: Data cards have new sprites, with support for coloring them via the - assembly detailer. - Naksu: - - code_imp: Sped up atmos very slightly - ninjanomnom: - - rscadd: A plush that knows too much has found its way to the bus ruin. -2018-06-21: - BlueNothing: - - tweak: Grabbers can no longer hold circuit assemblies - CitrusGender: - - bugfix: Ruins air alarms will no longer be reported in the station tablets - - bugfix: added a clamp so you can't set a negative multiplier to create materials - and create more than 50 items. - Cobby: - - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits. - - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule - pack. - Denton: - - bugfix: The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access - requirements, as previously intended. - - rscadd: Regular and advanced health analyzers can now be researched and printed. - McDonald072: - - rscadd: A few new circuits for dealing with atmospherics have been uploaded to - your local printers. - NewSta: - - tweak: made it easier to see from the back whether someone is occupying the shuttle - chair or not. - SpaceManiac: - - tweak: One canister is now suitable to fully stock a vending machine. Relevant - cargo packs have been updated. - - bugfix: Deconstructing and reconstructing a vending machine no longer creates - items from thin air. - - bugfix: Using a part replacer on a vending machine no longer empties its inventory. - - rscadd: Bluespace RPEDs can now be used to refill vending machines. - Tlaltecuhtli: - - bugfix: anomaly cores no longer tend to dust - YPOQ: - - bugfix: Watcher beams will freeze you again -2018-06-23: - Dax Dupont: - - imageadd: CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN. - - admin: Create antags now checks for people being on station before applying. - ExcessiveUseOfCobblestone: - - spellcheck: Plant disks with potency genes clarify the percent is for potency - scaling and not relative to max volume on examine. - Kor: - - rscadd: Bubblegum has regained his original (deadlier) move set. - SpaceManiac: - - bugfix: Fire extinguishers on the emergency shuttle are no longer unclickable - once removed from their cabinets. - kevinz000: - - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous - scientists for a low low price of 14TC. - - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear - projectile that will apply what the bomb would do to a certain tile at that - distance to that tile. However, this will not cause breaches, or gib mobs, unless - the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. - (Unless the admins so will it.)' -2018-06-24: - CitrusGender: - - bugfix: Fixed cyborgs not getting their names at round start - - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans - SpaceManiac: - - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only). - Time-Green: - - bugfix: Soda is no longer intangible to the laws of physics - cinder1992: - - rscadd: The Captain can now go down with their station in style! Suicide animation - added to the Officer's Sabre. - kevinz000: - - rscadd: Cyborgs now drop keys on deconstruction/detonation -2018-06-27: - Cyberboss: - - server: Logs and admin messages will now appear when you are using deprecated - config settings and advise on upgrades - Dax Dupont: - - admin: Malf AI machine overloads now are logged/admin messaged. - - tweak: The tree of liberty must be refreshed from time to time with the blood - of patriots and tyrants. We've removed access requirements from liberation station - vendors. - - bugfix: Fixes more href exploits in circuits - - refactor: Printing premade assemblies is no longer shitcode, time remaining had - to go for this. - - admin: Filled holes in the logging of circuits - Denton: - - tweak: Camera networks, monitor screens and telescreens have been standardized. - - tweak: Motion-sensitive cameras now show a message when they trigger the alarm. - - bugfix: The Box/Meta auxillary base camera now works. - - bugfix: Bomb test site cameras now emit light, as intended. - - bugfix: 'Meta: Replaced the RD telescreen in the CE office with the correct one.' - - tweak: Did you know that honey has antibiotic properties? - Irafas: - - bugfix: Hardsuit helmets now protect the wearer from pepperspray - - bugfix: Bucket helmets cannot have reagents transferred into them until after - they are removed - MadmanMartian: - - bugfix: Cameras that are EMPed no longer sound an alarm - Mickyan: - - bugfix: Branca Menta won't make you starve and then kill you - - tweak: Fernet has been moved to contraband - Naksu: - - code_imp: Removed unused effect object that could be used to spawn a list of humans - Nichlas0010: - - bugfix: Mothpeople no longer push objects to move in 0-grav, if they can fly - SpaceManiac: - - refactor: AI static now uses visual contents and should perform better in theory. - - bugfix: Pocket protectors now work again. - - bugfix: URLs are no longer auto-linkified in character names and IC messages. - - bugfix: It is once again possible for Cargo to export mechs. - - bugfix: Deaths in the CTF arena are no longer announced to deadchat. - Tlaltecuhtli: - - tweak: tourettes doesnt stack on itself anymore - - bugfix: fixes cult shuttle message repeating - Zxaber: - - rscadd: Cyborgs can wear more hats now. - kevinz000: - - rscadd: R&D deconstructors can now destroy things regardless of if there's a point - value or material - nichlas0010: - - bugfix: You should now receive your destroy AI objectives properly during IAA -2018-06-28: - Anonmare: - - balance: The possessed chainsword no longer makes e-swords look pathetic - Dax Dupont: - - admin: Admins can now scan circuits if they have admin AI interaction enabled. - - admin: some more circuit logging - - rscadd: You can now build clown borgs with a little bit of bananium and research. - Praise be the honkmother. - - rscadd: New upgrade module has been added so making loot/tech web borg modules - has become easier for admins/mappers/coders. - - refactor: Unused and broken OOC metadata code has been killed. - Denton: - - tweak: Added a disk compartmentalizer to Omegastation's hydroponics. - Kraso: - - bugfix: You can no longer use a soulstone shard to tell who's a cultist. - ShizCalev: - - bugfix: The blob will no longer take over space/mining/ect upon victory. -2018-06-29: - BlueNothing: - - balance: Cavity implants can no longer hold normal-sized combat circuits. Grabbers - can now hold up to assembly size. - - bugfix: Grabbers and throwers no longer function inside of storage implants. - Denton: - - tweak: Added all-in-one tcomms machinery and an automated announcement system. - Mickyan: - - imageadd: graffiti letters and numbers have received a makeover - MrDoomBringer: - - imageadd: Disk Fridges now have sprites! Ask cobby if you're wondering why they - look like toasters. -2018-06-30: - Dennok: - - bugfix: Deconstructable TEG now propertly connects to pipes. - - bugfix: Fix of inverted TEG sprite of slow turbine turning. add:Now you can flip - circulator and make TEG of your dream. add:Add TEG and circulator to "Advanced - Power Manipulation" techweb node. - MacHac: - - rscadd: Changelings can now take the Pheromone Receptors ability to hunt down - other changelings. - TerraGS: - - imageadd: New icon for plastic flaps that actually looks airtight. - - code_imp: Update to plastic flaps code to use tool procs rather than attackby - and removed two pointless states. -2018-07-01: - Denton: - - tweak: To comply with space OSHA regulations, all toasters (disk compartmentalizers) - have been put on tables. - - rscadd: Added a disk compartmentalizer to the seed vault Lavaland ruin. - Nichlas0010: - - bugfix: Changelings can now greentext the extract more genomes objective. - Thunder12345: - - rscadd: Added a colour picker component for use with circuits. -2018-07-02: - AnturK: - - bugfix: non-player monkeys won't fight when stunned. - Denton: - - bugfix: 'Pubbystation: Fixed the QM camera console''s direction.' - - code_imp: 'Pubbystation: Used the correct aux bomb camera subtype and replaced - loose tech storage boards with spawners, as is done in the rest of the map.' - - tweak: Tesla balls no longer blow up disposal outlets/delivery chutes and cameras. - Irafas: - - rscadd: Admin spawnable Death Ripley that comes with a version of the Death Clamp - that actually inflicts damage and rips arms off. - Naksu: - - admin: maxHealth is now guarded against invalid values when varediting - SpaceManiac: - - bugfix: A single wired glass tile no longer creates unlimited light floor tiles. - - bugfix: Printing the TEG and circulator boards no longer prints the completed - machinery instead. - XDTM: - - tweak: Nutriment Pump implants no longer require replacing the stomach. -2018-07-03: - Dax Dupont: - - balance: BoH detonations now gib the user. - Denton: - - tweak: Engine heaters no longer let gases pass through them. - - tweak: The Cerestation escape shuttle is now available for purchase! - Frozenguy5: - - bugfix: Fixes nitryl gas not applying its effects. - MrDoomBringer: - - bugfix: SupplyPod smites work properly once again. - Naksu: - - code_imp: Fixed the signatures of several reagent procs, removing useless checks - - tweak: drunkenness is now handled at the carbon level, allowing monkeys to experience - ethanol - - balance: initropidil also works on carbon level, allowing syndicate operatives - using the poison kit to achieve the silent assassin rating against monkeys - - tweak: The ladders in the tear in the fabric of reality no longer spawn their - endpoints when the area is loaded, but only when the tear is made accessible - via a BoH bomb. - - tweak: CentCom is no longer accessible via the space ladder in the tear. - - tweak: The lavaland endpoint can no longer spawn completely surrounded by lava, - unless it spawns on an island - - code_imp: ChangeTurf can now conditionally inherit the air of the turf it is replacing, - via the CHANGETURF_INHERIT_AIR flag. - - bugfix: when ladder endpoints are created, the binary turfs that are created inherit - the air of the turfs they are replacing. This means the lavaland ladder endpoint - will have the lavaland airmix, instead of a vacuum. - - code_imp: navigation beacons are now properly deregistered from their Z-level - list and re-registered on the correct one if moved across Z-levels by an effect - such as teleportation or a BoH-induced chasm. - Nirnael: - - refactor: Removed an unnecessary volume_pump check - SpaceManiac: - - bugfix: Backpack water tanks now work properly when wielded by drones. - - bugfix: Backpack water tank nozzles can no longer be placed inside bags of holding - and chem dispensers. - - bugfix: Moving items between your hands no longer causes them to cross the floor - (squeaking, lava burning). - - bugfix: Scrambled research console icons have been fixed, and will be prevented - in the future. - Zxaber: - - tweak: Empty cyborg shells can now be disassembled with a wrench. - - tweak: Using a screwdriver on an empty shell will now remove the cell, or swap - it if you're holding a cell in your other hand. - ninjanomnom: - - tweak: Shuttle throwing also applies to loose objects on shuttles now. - - tweak: Closets on shuttles start anchored. - - tweak: The throw distance of shuttle throws is marginally random, potentialy 10% - further or shorter - - rscadd: Tables and racks on shuttles have been installed with inertia dampeners. - - bugfix: Some very thin barriers didn't stop mobs from being thrown by the shuttle - under certain circumstances, this has been fixed. -2018-07-05: - Cyberboss: - - bugfix: Setting "default" in maps.txt now will load that map as the first fallback - when a next_map.json is missing - Jared-Fogle: - - bugfix: Fixed the "Remove IV Container" verb on IV drips from showing every nearby - mob - Naksu: - - tweak: shuttles now move the air along with their occupants, instead of magicking - up new air. - deathride58: - - tweak: Lone nuclear operatives now spawn as often as originally intended when - the disk is immobile. Secure that fuckin' disk. -2018-07-06: - Denton: - - spellcheck: Improved supply shuttle messages and firefighting foam descs. - - bugfix: Supply shuttles will no longer spill containers on docking. - Jared-Fogle: - - imageadd: Medical HUDs will now show an icon if the body has died recently enough - to be defibbed - Jegub: - - imageadd: Glowcaps now have their own sprite. - MacHac: - - bugfix: Bedsheets once again properly influence the dreams of those who sleep - under them. -2018-07-07: - Cruix: - - bugfix: Advaced camera consoles now properly show camera static in the area that - the eye starts - Denton: - - bugfix: Cere Station's escape shuttle has had its turbo encabulator replaced and - should no longer fly through hyperspace backwards. - Garen: - - rscadd: sends a signal for afterattack() - - code_imp: modified all calls of afterattack() to call the parent proc - Naksu: - - bugfix: constructed directional windows no longer leak atmos across them - - code_imp: setting the value of anchored for objects should be done via the setAnchored - proc to properly handle things like atmos updates in one place - Spaceinaba: - - tweak: Digitigrade legs no longer revert to normal on compatible outfits. -2018-07-08: - Affurit: - - imageadd: Back Sprites for the Godstaffs and Scythe now exist. - Cruix: - - rscadd: AI detection multitools can now be toggled to provide a HUD that shows - the exact viewports of AI eyes, and the location of nearby camera blind spots. - Floyd: - - rscdel: removed beauty / dirtyness - - balance: Mood no longer gives you hallucinations, instead makes you go into crit - sooner - Gwolfski: - - rscadd: autoname APC - - rscadd: directional autoname APC's - Naksu: - - code_imp: fixed mood component - XDTM: - - bugfix: Corazone now actually stops heart attacks. - cacogen: - - rscadd: Gibs squelch when walked over - subject217: - - bugfix: Five months later, wires will again make noise when pulsed or cut while - hacking. -2018-07-09: - Ausops: - - imageadd: New shuttle chair sprites. - Jared-Fogle: - - bugfix: Fixed russian revolvers acting like normal revolvers. - Nabski: - - imageadd: Crabs have a movement state sprite - TerraGS: - - tweak: Removed tap.ogg from multitool so getting hit by one sounds as painful - as it really is. - ninjanomnom: - - code_imp: The very back-end of movement got some significant reshuffling in preparation - for some future refactors. Bugs are expected. - subject217: - - spellcheck: The Nuke Op uplink no longer lies about how much ammo a C-20r holds. - - tweak: The L6 SAW now has a small amount of spread. It is still accurate within - visual range, but it's not as effective at longer ranges. -2018-07-10: - Astatineguy12: - - bugfix: You can now buy energy shields as a nuke op again - Denton: - - rscadd: 'Box/Delta/Pubbystation: Nuclear explosive-shaped beerkegs have been added - to maintenance areas.' - Naksu: - - rscadd: Added a new ghost verb that lets you change your ignore settings, allowing - previously ignored popups to be un-ignored and notifications without an ignore - button to be ignored - - bugfix: Chaplains are once again unable to acquire the inquisition ERT commander's - sword, as intended. The sword has been restored to its former glory - Supermichael777: - - bugfix: Changelings are no longer prevented from entering stasis by another form - of fake death. - Wjohnston & ninjanomnom: - - imageadd: Engine heaters and engines have had a minor touch up so they don't meld - with the floor quite so much. - - tweak: Engine heaters don't block air anymore. - XDTM: - - bugfix: Romerol tumors no longer zombify you if you're alive when the revive timer - counts down. -2018-07-11: - Denton: - - bugfix: Fixed a bug where golem shells couldn't be completed by certain brass/sandstone/titanium - stacks. - - tweak: The Spider Clan holding facility has completed minor renovations. The dojo - now includes medical and surgical equipment, while the lobby has a fire extinguisher - and plasmaman equipment. - - bugfix: Plasma and wooden golems no longer need to breathe, same as all other - golems. - - spellcheck: Fixed wrong or incomplete golem spawn info texts. - - tweak: Added more random golem names. - Irafas: - - bugfix: non-silicons can no longer use machines without standing next to them. - XDTM: - - bugfix: Automatic emotes no longer spam you saying that you can't perform them - while unconscious. - - rscadd: Added a Rest button to the HUD. It allows the user to lie down or get - back on their feet. - - balance: Getting back up now takes a second, to avoid people matrix-ing bullets. - fludd12: - - rscadd: You can now craft wooden barrels with 30 pieces of wood! They can hold - up to 300u of reagents. - - rscadd: Putting hydroponics-grown plants into the barrel lets you ferment them - for alcohol! Some give bar drinks, while others simply give plain fruit wine. - ninjanomnom: - - bugfix: Porta turret rotation on shuttles visually would not turn, this has been - dealt with. - - bugfix: Decals weren't rotating properly after the recent signal refactor, a couple - new procs for dealing with the signals on the parent object have been added - to deal with this. - subject217: - - balance: L6 SAW AP ammo now costs 9 TC per magazine, up from 6. - - balance: L6 SAW incendiary ammo now deals 20 damage per shot, up from 15. -2018-07-12: - AnturK: - - bugfix: Nuclear rounds will now end properly on nukeop deaths if there are no - other antags present. - Denton: - - rscadd: A new shuttle loan event has been added. Hope you like bees! - - tweak: The pizza delivery shuttle loan event now has some of each flavor and no - longer pays the station for accepting it. - - balance: Syndicate shuttle infiltrators now carry suppressed pistols. - - spellcheck: Added a missing period to spent bullet casing and pizza shutte loan - text. - - bugfix: Zealot's blindfolds now properly prevent non-cultists from using them. - - bugfix: Cultist legion corpses now wear the correct type of zealot's blindfold. - Time-Green: - - rscadd: An overdosing chemist filled the maintenance shafts with unorthodox pills, - be wary - ninjanomnom: - - rscadd: Certain objects which make noise which are thrown in disposals will squeak - when they hit bends in the piping. This includes clowns. - tralezab: - - admin: admins, you can now find martial art granting buttons in your VV dropdown. -2018-07-13: - Arithmetics plus: - - rscadd: Min circuit - - rscadd: Max circuit - Cyberboss: - - rscadd: More interesting recipes to the pizza delivery event - Deepfreeze2k: - - balance: Adds 2 carbon dioxide jetpacks to the pirate ship. Also gives the captain - a renamed bottle of rum in his room. - Denton: - - tweak: 'Most static ingame manuals have been replaced with ones that open relevant - wiki articles. remove: Deleted the "Particle Accelerator User''s Guide" manual, - since it''s included in the Singulo/Tesla one.' - - tweak: Machine frames no longer explode when struck by tesla arcs. - - rscadd: Locators can now be researched and printed at the security protolathe. - Jared-Fogle: - - soundadd: Removed delay from rustle1.ogg - LetterN: - - rscadd: Adds ratvar plushie and narsie plushie on chaplain vendors - Naksu: - - bugfix: deep-frying no longer turns certain objects like limbs invisible - Time-Green: - - bugfix: "Fixes an href exploit that lets you grab ID\u2019s out of PDA right from\ - \ another person" - XDTM: - - balance: (Real) Zombies no longer die from normal means. They will instead go - into crit indefinitely and regenerate until they get back up again. To kill - a zombie permanently you either need to remove the tumor, cut off their head, - gib them, or use more elaborate methods like a wand of death or driving them - to suicide. - - balance: Slowed down zombie regeneration overall, since putting them in crit now - no longer disables them for a full minute in average. - Zxaber: - - bugfix: MMI units inside cyborgs are no longer affected by ash storms. - ninjanomnom: - - bugfix: Objects on tables that are thrown by shuttle movement should no longer - do a silly spin - - balance: The alien pistol and the xray gun have both received a much belated buff - to their radiation damage to be on par with other sources of radiation. -2018-07-14: - Naksu: - - balance: stamina damage is no longer softcapped by the unconsciousness trigger - lowering stamina damage a little bit - ShizCalev: - - tweak: "The SM is now even more deadly to \"certain mobs\"\u2122" -2018-07-15: - AnturK: - - tweak: You can now use numbers in religion and deity names - Denton: - - bugfix: Bounty console circuit boards no longer construct into supply request - terminals. - Naksu: - - bugfix: fixed some missing args in emote procs called with named args, leading - to runtimes - - code_imp: removed unnecessary processing from a few machine types - SpaceManiac: - - bugfix: The Shuttle Manipulator admin verb works once more. -2018-07-16: - kevinz000: - - rscadd: 'Integrated circuit clocks now come in 3 flavors: Nanotrasen time (round - time), Station time (station time), and Bluespace time (server time, therefore - not affected by lag/time dilation)' - - rscadd: Integrated circuit clocks now also output a raw value for deciseconds, - allowing for interesting timer constructions. -2018-07-17: - Cyberboss: - - server: Added BSQL.dll and updated libmariadb.dll for non-blocking SQL support. - See https://github.com/tgstation/BSQL for instructions on building for non-windows - systems - Denton: - - tweak: Sparks now emit less heat. - - tweak: Added a storage room to Metastation engineering that both engineers and - atmos techs can access. - Naksu: - - admin: Plasma decontamination can now be triggered via events - - bugfix: Reebe is no longer airless and completely broken - Shdorsh: - - tweak: added UI to the circuit printer. That's all - XDTM: - - balance: Limbs no longer need to have full damage to be dismemberable, although - more damage means higher dismemberment chance. - - balance: Damaging limbs now only counts as 75% for the mob's total health. Bleeding - still applies normally. - - rscadd: Limbs that reach max damage will now be disabled until they are healed - to half health. - - rscadd: Disabled limbs work similarly to missing limbs, but they can still be - used to wear items or handcuffs. - kevinz000: - - rscadd: Crew pinpointers added to advanced biotechnology, printable from medical - lathes. - - rscadd: AIs can now interact with smartfridges by default, but by default they - will not be able to retrieve items. - ninjanomnom: - - bugfix: Mech equipment can be detached again. This probably also fixes any other - uncaught bugs relating to objects moving out of other objects. -2018-07-18: - Cyberboss: - - bugfix: Deaths now lag the server less - - bugfix: Ban checks cause less lag - Denton: - - tweak: RCDs can now also be loaded with reinforced glass and reinforced plasma - glass sheets. - Irafas: - - bugfix: players can construct while standing on top of a directional window. (machine - frames, computer frames, etc) - MrStonedOne: - - bugfix: synchronizing admin ranks with the database now lags the server less - - bugfix: saving stats now lags the server less - - bugfix: jobexp updating now lags the server less - - bugfix: poll creation now lags the server less. - Tlaltecuhtli: - - tweak: putting a cell and other not intended actions dont open the circuit window - WJohnston: - - tweak: Abandoned box ship space ruin consoles have been turned into something - more obviously broken so people stop complaining the ship doesn't work when - it's not meant to anyway. - - rscdel: Removed the extra syndie headset from the syndicate listening post space - ruin so people stumbling on the ruin won't be able to ruin your channel's security - as often. - XDTM: - - bugfix: Fixed a few bugs with imaginary friends, including them not being able - to hear anyone or surviving past the owner's death. - - rscadd: Imaginary friends can now move into the owner's head. - - rscadd: Imaginary friends can now choose to become invisible to the owner at will. -2018-07-20: - Cobby: - - bugfix: having higher sanity is no longer punished by making you enter crit faster - - balance: you can have 100 mood instead of 99 before it starts slowly decreasing - - bugfix: Paper doesn't give illegal tech anymore - CthulhuOnIce: - - spellcheck: Fixed 'Cybogs' in research nodes. - Denton: - - admin: Added hardsuit outfits for the Captain, HoS, and CMO. Removed old Shaft - Miner (Asteroid) outfits. Gave Chief Engineer (Hardsuit) engineering scanner - goggles. Added debug outfit for testing. - - tweak: Most wardrobe vendor contents have been tweaked. CargoDrobe now has the - vintage shaft miner jumpsuit available as a premium item. - WJohn: - - balance: Caravan ruin overall contains much less firepower, and should be harder - to cheese due to placement changes and less ammunition to work with. - - rscadd: The white ship is no longer stuck to flying around the station z level. - It can now fly around its own spawn's level and the derelict's level too (these - sometimes will be the same level). - kevinz000: - - rscdel: Removed flightsuits - zaracka: - - balance: Visible indications of cultist status during deconversion using holy - water happen more often. -2018-07-21: - Jared-Fogle: - - bugfix: Fixes destroyed non-human bodies cloning as humans. - WJohnston: - - balance: Reduced the 180 rounds (6 boxes) of 9mm ammo in the deep storage bunker - to 45 (3 mags). Removed one of the wt-550s but put a compatible magazine in - its place for the other to use. Turned the syndicate hardsuit into a regular - grey space suit. -2018-07-23: - BeeSting12: - - bugfix: Robotics' circuit printers have been changed to science departmental circuit - printers to allow science to do their job more efficiently. - Cruix: - - bugfix: AI eyes will now see static immediately after jumping between cameras. - Denton: - - rscadd: Shared engineering storage rooms have been added to Deltastation. - - bugfix: Fixed access requirements of lockdown buttons in the CE office. On some - maps, these were set to the wrong department. - - bugfix: Fixed Box and Metastation's CE locker having no access requirements. - - bugfix: 'Deltastation: Fixed engineers having access to atmospheric technicians'' - storage room. Fixed engineers having no access to port bow solars (the ones - at the incinerator by Atmospherics). Also fixed Minisat airlock access requirements.' - - bugfix: 'Pubbystation: Medbay and Cargo now have a techfab instead of protolathe.' - - tweak: Charlie/Delta Station (the "old cryogenics pod" ghost role) has been improved. - Survivors can now finish the singularity engine and will have more minerals - available inside the Hivebot mothership. The local atmos network is connected - to an air tank; fire alarms and a bathroom have been added. Keep an eye out - for a defibrillator too. - - rscadd: Nuclear Operatives can now purchase Buzzkill grenades for 5TC per box - of three. Those release a swarm of angry bees with random toxins. - - spellcheck: Chemical grenades, empty casings and smart metal foam nades now have - more detailed descriptions. - - spellcheck: Added examine descriptions to the organ harvester. - Epoc: - - rscadd: Adds "Toggle Flashlight" to PDA context menu. - Hathkar: - - tweak: Captain's Door Remote now has vault access again. - Mickyan: - - bugfix: 'Deltastation: replaced blood decals in maintenance with their dried counterparts' - SpaceManiac: - - tweak: RCDs can now be loaded partially by compressed matter cartridges rather - than always consuming the entire cartridge. - - bugfix: Fernet Cola's effect has been restored. - - bugfix: Krokodil's addition stage two warning message has been restored. - - admin: The party button is back. - WJohnston: - - bugfix: Fixed corner decals rotating incorrectly in the small caravan freighter. - XDTM: - - bugfix: Limbs disabled by stamina damage no longer appear as broken and mangled. - obscolene: - - soundadd: Curator's whip actually makes a whip sound now -2018-07-25: - Denton: - - tweak: H.O.N.K mechs can now play more sounds from the "Sounds of HONK" panel. - JJRcop: - - tweak: The item pick up animation tweens to the correct spot if you move - MrDoomBringer: - - spellcheck: Changed "cyro" to "cryo" in a few item descriptions and flavortexts. - SpaceManiac: - - rscadd: The vault now contains an ore silo where the station's minerals are stored. - - rscadd: The station's ORM, recycling, and the labor camp send materials to the - silo via bluespace. - - rscadd: Protolathes, techfabs, and circuit imprinters all pull materials from - the silo via bluespace. - - rscadd: Those with vault access can view mineral logs and pause or remove any - machine's access, or add machines with a multitool. - - tweak: The ORM's alloy recipes are now available in engineering and science protolathes. - Telecomms chat logging: - - code_imp: Added logging of telecomms chat - - config: Added LOG_TELECOMMS config flag (enabled by default) - WJohnston: - - rscadd: Redesigned deltastation's abandoned white ship into a luxury NT frigate. - Oh, and there are giant spiders too. - - bugfix: Med and booze dispensers work again on lavaland's syndie base, and the - circuit lab there is slightly less tiny. - subject217: - - rscadd: The M-90gl is back in the Nuke Ops uplink with rebalanced pricing. - - bugfix: The revolver cargo bounty no longer accepts double barrel shotguns and - grenade launchers. -2018-07-26: - Iamgoofball: - - bugfix: The shake now occurs at the same time as the movement, and it now doesn't - trigger on containers or uplinks. - Mickyan: - - balance: Light Step quirk now stops you from leaving footprints - Naksu: - - code_imp: gas reactions no longer copy a list needlessly - SpaceManiac: - - rscadd: 'The following machines can now be tabled: all-in-one grinder, cell charger, - dish drive, disk compartmentalizer, microwave, recharger, soda/booze dispenser.' - - rscadd: Unanchored soda/booze dispensers can now be rotated with alt-click. - - bugfix: Machinery UIs no longer close immediately upon going out of interaction - range. - - rscadd: Washing machines now wiggle slightly while running. - - rscadd: Washing machines can be unanchored if their panel is open for even more - wiggle. - WJohnston: - - rscadd: Return of the boxstation white ship, with a complete makeover! Box and - meta no longer share the same ship. -2018-07-27: - ShizCalev: - - bugfix: Destroying a camera will now clear it's alarm. - ninjanomnom: - - bugfix: The cargo shuttle should move normally again -2018-07-28: - CitrusGender: - - rscdel: Removed slippery component from water turf - Denton: - - balance: The Odysseus mech's movespeed has been increased. - - tweak: 'Metastation: Spruced up the RnD circuitry lab; no gameplay changes.' - - tweak: Due to exemplary performance, NanoTrasen has awarded Shaft Miners with - their very own bathroom, constructed at the mining station dormitories. Construction - costs will be deducted from their salaries. - Mickyan: - - imageadd: insanity static is subtler - - imageadd: neutral mood icon is now light blue - SpaceManiac: - - bugfix: Cyborgs and AIs can now interact with items inside them again. - Tlaltecuhtli: - - rscadd: Mouse traps are craftable from cardboard and a metal rod. - WJohnston: - - balance: Syndicate and pirate simple animals should have stats that more closely - resemble fighting a human in those suits, with appropriate health, sounds, and - space movement limitations. - - imageadd: Pirates in space suits have more modern space suits. -2018-07-30: - Anonmare: - - balance: Upload boards and AI modules, in addition to Weapon Recharger boards, - are now more expensive to manufacture - Basilman: - - bugfix: fixed BM Speedwagon offsets - Cobby (based off Wesoda25's idea): - - rscadd: Adds the PENLITE holobarrier. A holographic barrier which halts individuals - with bad diseases! - Denton: - - tweak: Techweb nodes that are available to exofabs by roundstart have been moved - to basic research technology. - - balance: Ripley APLU circuit boards are now printable by roundstart. - - balance: Odysseus, Gygax, Durand, H.O.N.K. and Phazon mech parts have to be researched - before becoming printable (same as their circuit boards). - - tweak: Arrivals shuttles no longer throw objects/players when docking. - - bugfix: Regular fedoras no longer spawn containing flasks. - - tweak: Increased the range of handheld T-ray scanners. - - balance: Cargo bounties that request irreplaceable items have been removed. - Garen: - - balance: Throwers no longer deal damage - - balance: Flashlight circuits are now the same strength as a normal flashlight - - balance: Grabber circuits are now combat circuits - - rscdel: Removed smoke circuits - - rscdel: Removed all screens larger than small - - tweak: Ntnet circuits can no longer specify the passkey used, it instead always - uses the access - Hate9: - - rscadd: Added pulse multiplexer circuits, to complete the list of data transfers. - Jared-Fogle: - - rscadd: NanoTrasen now officially recognizes Moth Week as a holiday. - - rscdel: Temporarily removes canvases until someone figures out how to fix them. - Mickyan: - - balance: Social anxiety trigger range decreased. Stay out of my personal space! - - bugfix: Social anxiety no longer triggers while nobody is around but you - WJohnston: - - rscadd: Redesigned the metastation white ship as a salvage vessel. - YoYoBatty: - - bugfix: SMES power terminals not actually deleting the terminal reference when - by cutting the terminal itself rather than the SMES. - - bugfix: SMES now reconnect to the grid properly after construction. - - refactor: SMES now uses wirecutter act to handle terminal deconstruction. - ninjanomnom: - - bugfix: Objects picked up from tables blocking throws will no longer be forever - unthrowable -2018-08-01: - Basilman: - - rscadd: Added the stealth manual to the uplink, costs 8 TC. Find it under the - implant section - Cobby: - - spellcheck: Drone's Law 3 has been edited to explicitly state that it's for the - site of activation (aka people do not get banned for going to upgrade station - as derelict drones since it's explicitly clear now). See https://tgstation13.org/phpBB/viewtopic.php?f=33&t=18844&p=429944#p429944 - for why this was PR'd - - bugfix: PENLITEs are now actually spawnable in techwebs. Reminder to make sure - everything is committed before PRing haha! - Denton: - - tweak: New bounties have been added for the Firefighter APLU mech, cat tails and - the Cat/Liz o' Nine Tails weapons. - - bugfix: ExoNuclear mech reactors now noticably irradiate their environment. - - spellcheck: Adjusted suit storage unit descriptions to mention that they can decontaminate - irradiated equipment. - Hate9: - - rscadd: Added tiny-sized circuits (called Devices) - - imageadd: added new icons for the Devices - Iamgoofball: - - balance: 'Buzzkill Grenade Box Cost: 5 -> 15' - Shdorsh: - - rscadd: Text replacer circuit - SpaceManiac: - - bugfix: The bridge of the gulag shuttle now has a stacking machine console for - ejecting sheets. - Time-Green: - - rscadd: You can now mount energy guns into emitters - - bugfix: portal guns no longer runtime when fired by turrets - barbedwireqtip: - - tweak: Adds the security guard outfit from Half-Life to the secdrobe - granpawalton: - - tweak: Removed old piping sections and replaced with Canister storage area in - atmos incinerator - - tweak: scrubber and distro pipes moved in atmos incinerator to make room for added - piping - - balance: added filter at connector on scrubbing pipe in atmos incinerator - - balance: replaced vent in incinerator with scrubber in **Both** incinerators - - balance: mixer placed on pure loop at plasma - - bugfix: delta and pubby atmos incinerator air alarm is no longer locked at round - start - - bugfix: pubby atmos incinerator now starts without atmos in it - kevinz000: - - rscadd: 'Cameras now shoot from 1x1 to 7x7, fully customizable. Alt click on them - to change the size of your photos. experimental: All photos, assuming the server - host turns this feature on, will be logged to disk in round logs, with their - data and path stored in a json. This allows for things like Statbus, and persistence - features among other things to easily grab the data and load the photo.' - - rscadd: Mappers are now able to add in photo albums and wall frames with persistence! - This, obviously, requires photo logging to be turned on. If this is enabled - and used, these albums and frames will save the ID of the photo(s) inside them - and load it the next time they're loaded in! Like secret satchels, but for photos! -2018-08-03: - ArcaneMusic: - - soundadd: Added a new, shoutier RoundEnd Sound. - Basilman: - - bugfix: fixed agent box invisibility - Denton: - - tweak: 'Syndicate lavaland base: Added a grenade parts vendor and smoke machine - board. The testing chamber now has a heatproof door and vents/scrubbers to replace - air after testing gas grenades. Chemical/soda/beer vendors are emagged by default; - the vault contains a set of valuable Syndicate documents.' - - tweak: Added a scrubber pipenet to the Lavaland mining base. - Garen: - - bugfix: mobs now call COMSIG_PARENT_ATTACKBY - JJRcop: - - rscadd: Deadchat can use emoji now, be sure to freak out scrying orb users. - Kmc2000: - - rscadd: You can now attach 4 energy swords to a securiton assembly instead of - a baton to create a 4 esword wielding nightmare-bot - Mickyan: - - imageadd: added sprites for camera when equipped or in hand - - tweak: cameras are now equipped in the neck slot - SpaceManiac: - - bugfix: Traps now have their examine text back. - Supermichael777: - - bugfix: Cigarettes now always transfer a valid amount of reagents. - - bugfix: Reagent order of operations is no longer completely insane - WJohnston: - - tweak: Added a gun recharger to delta's white ship and toned it down from a "luxury" - frigate to just a NT frigate, it's just not made for luxury! - XDTM: - - bugfix: Beheading now works while in hard crit, so it can be used against zombies. - - tweak: You can now have fakedeath without also being unconscious. Existing sources - of fakedeath still cause unconsciousness. - - rscadd: Zombies and skeletons now appear as dead. Don't trust zombies on the ground! - - rscadd: You can now make Ghoul Powder with Zombie Powder and epinephrine, which - causes fakedeath without uncounsciousness. - granpawalton: - - bugfix: pubby round start atmos issues resolved - - bugfix: pubby departures lounge vent is no longer belonging to brig maint - - rscadd: pipe dispenser on pirate ship - ninjanomnom: - - bugfix: The first pod spawned had some issues with shuttle id and wouldn't move - properly. This has been fixed. -2018-08-06: - Basilman: - - balance: Increased agent box cooldown to 10 seconds - Denton: - - bugfix: Omegastation's Atmospherics lockdown button now has the proper access - reqs. - - bugfix: Pubbystation's disposals conveyor belts now face the correct direction. - - bugfix: Pubby's service techfab is no longer stuck inside a wall. - - bugfix: Pubby's disposal loop is no longer broken. - - tweak: The Lavaland seed vault chem dispenser now has upgraded stock parts. - - tweak: 'Metastation: Extended protective grilles to partially cover the Supermatter - cooling loop.' - Epoc: - - rscadd: You can now show off your Attorney's Badge - Garen: - - bugfix: Fixed AddComponent(target) not working when an instance is passed rather - than a path - JJRcop: - - bugfix: Fixed some strange string handling in SDQL - Jared-Fogle: - - rscadd: Moths can now eat clothes. - JohnGinnane: - - rscadd: Users can now see their prayers (similar to PDA sending messages) - Mickyan: - - tweak: Drinking alcohol now improves your mood - Shdorsh: - - bugfix: The previously-added find-replace circuit now actually exists. - Tlaltecuhtli (and then Cobby): - - bugfix: Science Bounties are now available! - WJohnston: - - balance: Rebalanced the simple animal syndies on the metastation ship to be a - bit less destructive of their surroundings, and downgraded the smg guy to a - pistol and upgraded the other guys to knives. - Y0SH1 M4S73R: - - rscadd: windoors now have NTNet support. The "open" command toggles the windoor - open and closed. The "touch" command, not usable by door remotes, functions - identically to walking into the windoor, opening it and then closing it after - some time. - cyclowns: - - tweak: Fusion has been reworked to be a whole lot deadlier! - - tweak: You can now use analyzers on gas mixtures holders (canisters, pipes, turfs, - etc) that have undergone fusion to see the power of the fusion reaction that - occurred. - - balance: Several gases' fusion power and fusion's gas creation has been reworked - to make its tier system more linear and less cheese-able. -2018-08-07: - WJohnston: - - rscadd: Redesigned the pirate event ship to be much prettier and better fitting - what it was meant to do. -2018-08-08: - Denton: - - rscadd: 'Added five new cargo packs: cargo supplies, circuitry starter pack, premium - carpet, surgical supplies and wrapping paper.' - - tweak: Added one bag of L type blood to the blood pack crate. Added a chance for - contraband crates to contain DonkSoft refill packs. - Iamgoofball: - - tweak: The Stealth Implant was mistakenly made nuclear operatives only due to - a misunderstanding of the code. This has been fixed. - Mark9013100: - - rscadd: Pocket fire extinguishers can now be made in the autolathe. - SpaceManiac: - - bugfix: The power flow control console once again allows actually modifying APCs. - - tweak: Gas meters will now prefer to target visible pipes if they share a turf - with hidden pipes. - daklaj: - - bugfix: fixed beepsky and ED-209 cuffing their target successfully even when getting - disabled (EMP'd) in the process - kevinz000: - - rscadd: Catpeople are now a subspecies of human. Switch your character's species - to "Felinid" to be one. - - rscadd: Oh yeah and they show up as felinids on health analyzers. -2018-08-10: - AnturK: - - balance: Portable flashers won't burnout from failed flashes. - Denton, Tlaltecuhtli: - - rscadd: Added cargo bounties that require cooperation with Atmospherics, Engineering - and Mining. - Naksu: - - bugfix: Transformation diseases now properly check for job bans where applicable - - code_imp: Fixed a bunch of runtimes that result from transforming into a nonhuman - from a human, or a noncarbon from a carbon. - SpaceManiac: - - refactor: The map loader has been cleaned up and made more flexible. - nicbn: - - tweak: 'BoxStation science changes: Circuitry lab is closer to RnD now; cannisters, - portable vents, portable scrubbers, filters and mixers have been moved to Toxin - Mixing Lab. There is now a firing range at the testing lab!' -2018-08-11: - Denton: - - tweak: Fixed the Beer Day date and added a few more holidays. - Jordie0608: - - admin: Asay history is once again logged under the admin log secret. - - admin: Notes, messages, memos and watchlists can now have an expiry time. Once - expired they are hidden like as if deleted. - SpaceManiac: - - tweak: Giant spiders can now freely pull their victims through webs. - Time-Green: - - rscadd: Circuit Boards now tell you the components required to build them on examine - WJohn: - - rscadd: Added zombies to boxstation's abandoned ship. - YPOQ: - - bugfix: AIs can take photos and print them at photocopiers again. - - bugfix: Cult floors will not deconstruct to space - - bugfix: Cult floors do not spawn rods when deconstructed - - bugfix: Footprints should no longer spread out of control - zaracka: - - bugfix: blunt trauma causes brain damage while unconscious too - - bugfix: sharp weapons no longer count as blunt trauma in all cases -2018-08-12: - Denton: - - rscadd: Killing gondolas now lets you harvest meat from them. Eating it raw might - be a bad idea. - Mickyan: - - rscadd: Mixed drinks now give mood boosts with varying strength depending on their - quality. - - rscadd: Although powerful, mood boosts from quality drinks are short lived. If - you want to make the most out of them, take a sip every few minutes like a normal - human being instead of downing the entire glass like the alcoholic you are. - Nichlas0010: - - bugfix: Admins with +admin and without +fun are no longer able to smite. - SpaceManiac: - - bugfix: Blood and oil footprints sharing a tile no longer causes footprint decals - to stack. - WJohnston: - - balance: Syndicate (melee) simple animals will now move less predictably and attack - twice as often, hopefully making them quite a bit more dangerous. - XDTM: - - tweak: Operating Computers can now sync to the research database to acquire researched - surgeries, instead of requiring installation by disk. - - rscadd: You can now review the full list of unlocked surgeries from the operating - computer. - actioninja: - - rscadd: Added (unobtainable) Felinid Mutation Toxin. - lyman: - - imageadd: Updated the Chronosuit Helmet sprite. -2018-08-13: - Basilman: - - rscadd: Adds Arnold pizza, dont try putting pineapple on it. - Denton: - - tweak: The briefcase launchpad can now hold items while in briefcase mode (just - like a regular briefcase). Its remote has been disguised as a folder and now - spawns pre-linked inside the briefcase. - - balance: Increased the briefcase launchpad's range from 3 to 8 tiles, which is - roughly half the screen. - - spellcheck: Added more ingame manuals that access wiki pages. - - rscadd: Added botanical and medical bounties as well as a static adamantine bar - bounty. - - tweak: Increased the syndicate document bounty's reward from 10.000 to 15.000 - credits. - - tweak: Removed the gondola hide bounty and in return, increased the export value - to the old level. - - tweak: The briefcase bounty now also accepts secure briefcases. - - bugfix: The action figure bounty now correctly spawns as an assistant type bounty. - Logging refactor and improvement: - - code_imp: All mob-related logs now include the area name and (x,y,z) position. - - code_imp: All logs that included an (x,y,z) position now also include the area - name. - - code_imp: Standardized logging format of mob/player keys. - - code_imp: Telecomms logs are now included in the individual logging panel. - - code_imp: Fixed many other cases of logs being sent to either the individual logging - panel or the saved log files, but not both. - - refactor: The logging system has been refactored to contain less redundant code - and to produce more consistent logs. - SpaceManiac: - - admin: The VV window loads and searches faster. - - admin: Fields in the VV window's header will immediately show your edits. - - admin: Selecting an action from the VV dropdown no longer leaves it selected after - the action is done. - YPOQ: - - bugfix: Uncalibrated teleporters can turn humans into flies again -2018-08-14: - Coolguy3289: - - config: Removed un-needed and un-used RENAME comment from game_options.txt - SpaceManiac: - - bugfix: Escape Pod 1 now reaches the CentCom recovery ship again. - WJohn: - - imageadd: Titanium walls and windows are a bit prettier looking now. - Zxaber: - - rscadd: Airlock electronics can have now have unrestricted access by direction - set. The resulting airlock will allow all traffic from the specified direction(s) - while still requiring normal access otherwise. A small floor light will indicate - this. - - tweak: Medbay Cloning and Main Access doors now have unrestricted access settings - set, and the buttons have been removed. All maps have been updated. - - bugfix: Airlocks now correctly update their overlays (bolts lights, emergency - lights) when their power state changes. -2018-08-15: - barbedwireqtip: - - tweak: added binoculars to the detective's locker -2018-08-17: - Anonmare: - - rscadd: Ore silos circuit boards are now constructable - SpaceManiac: - - admin: The "Map Template - Upload" verb now reports if a map uses nonexistent - paths. - Tlaltecuhtli: - - bugfix: fixes diamond drill bounty having the wrong object path - YPOQ: - - bugfix: Roundstart motion-detecting cameras work again - intrnlerr: - - bugfix: '"Allows image windows sent by PDA to be closed"' -2018-08-18: - Floyd / Qustinnus: - - code_imp: moves nutrition events to the mood component - Jared-Fogle: - - rscadd: Hovering over storage slots with an item in your hand will show you first - if you can put the item in. - XDTM: - - bugfix: Fixed augmentation not working and/or giving you extra limbs - nicbn: - - imageadd: New janitor cart sprites (by Quantum-M) - - imageadd: Dirt is smooth (by AndrewMontagne) - zaracka: - - bugfix: You can now use certain emotes and the suicide verb while buckled, but - not while stunned. -2018-08-20: - Basilman: - - rscadd: Added gondola fur products - Basilman, Sprites by WJohnston: - - rscadd: His Grace ascension is back, feed Him 25 people and you will unlock His - full potential. - Denton: - - tweak: Added new destinations for the parcel tagger! You can now send packages - to the Circuitry Lab, Toxins, Dormitories, Virology, Xenobiology, Law Office - and the Detective's office. Viro/Xeno can only receive parcels. - - bugfix: 'Deltastation: Tagged parcels no longer get routed straight into the crusher. - Untagged parcels also no longer get routed straight into the crusher!' - - tweak: 'Deltastation: Added disposals to Xenobiology that launch contents into - space.' - Epoc: - - tweak: Putting an extinguisher into a cabinet with the safety off will no longer - cause it to spray first - Floyd / Qustinnus: - - code_imp: removes useless mood events subtypes - - bugfix: 'fixes mood event timers not resetting when they get triggered again remove: - removes the depression overlay which makes our fruit happy' - Frosty Fridge: - - rscadd: Added the Surgical Processor upgrade for medical cyborgs. Scan surgery - disks or an operating computer to be able to initiate advanced procedures. - - tweak: Cyborgs can now perform surgery steps that do not require an instrument. - - bugfix: Plastic creation reaction now properly scales with the amount of reagents; - 10u = 1 sheet. - Garen: - - bugfix: fixed using items on a circuit removing all its access(now access gained - from each new item stacks) - - admin: adds logging for gun circuits, grabber circuits, and dragging claw circuits - - rscadd: grabbers can select what they want to drop - MrDoomBringer: - - imageadd: The Nanotrasen Airspace Aesthetics division has shipped out a newer - design of NT-Brand "Ore Silos". No new features have been added, but they certainly - look much nicer! - Naksu: - - balance: Having a high body temperature now increases the damage you take gradually, - whether you're on fire or not. Being on fire also always increases body temperature - damage - NewSta: - - tweak: The names of haircuts, facial hair, undershirts, underwear and socks have - now been sorted and categorized - WJohnston: - - imageadd: Remade titanium and plastitanium floors to be less of an eye strain - and something mappers might actually consider using. - - imageadd: New reinforced floor sprites. - XDTM: - - rscadd: Added programmable nanites to science! - - rscadd: Science now has a nanite chamber, a nanite program hub, a nanite cloud - console and a nanite programmer. - - rscadd: From the program hub you can download nanite programs (unlocked through - techwebs) to disks. - - rscadd: You can then customize their functionality and signal codes through the - Nanite Programmer. - - rscadd: The nanite chamber is necesary to inject nanites into a patient, and it's - also used to install/uninstall programs into a patient's nanites. A second person - is required to man the console. - - rscadd: The nanite cloud console controls remote program storage; it stores program - backups that nanites can be synced to through cloud IDs. - - rscadd: Nanite programs range can be either helpful or harmful; their main potential - is that they can be enabled at will through the use of remotes and sensors. - The potential uses are endless! - - rscadd: More detailed information is available in the wiki. -2018-08-22: - BlueNothing: - - rscadd: Allows video camera circuits to be seen on networks other than the science - cameranet. - - tweak: Alphabetizes camera list for camera bugs, and lets camera bugs see through - borg and circuit cameras. - - tweak: Makes video camera circuits fit in tiny assemblies. - PKPenguin321: - - tweak: The GPS circuit now has a 4th output, placing X,Y,Z all in a string. - - rscadd: '2 new converters: Rel to Abs, and Advanced Rel to Abs.' - - rscadd: Rel to Abs takes a set of relative and a set of absolute coordinates, - and converts the relative one to absolute. 1 complexity. - - rscadd: Advanced Rel to Abs takes a set of relative coordinates and converts it - to absolute without the need for an already known set of absolute coordinates. - 2 complexity. - SpaceManiac: - - bugfix: Freezers and heaters which start on no longer stay visually on when you - turn them off. - - code_imp: Atmospherics now initializes 93% (about 40 seconds) faster. - floyd: - - bugfix: fixes the hunger alert appearing forever - intrnlerr: - - bugfix: Tank temperature is no longer based on pressure - ninjanomnom: - - bugfix: Shuttle templates now handle shuttle registration in the load rather than - the shuttle manipulator. This means admin loaded shuttle templates no longer - need to be manually registered. - oranges: - - tweak: Inventory overlay now uses a traffic light to indicate if the item can - be placed in there -2018-08-23: - Naksu: - - code_imp: Waddling is now available as a component - Nervere: - - rscadd: re-adds the joy emoji. - SpaceManiac: - - rscadd: The body zone selector now indicates which body part you are about to - select when hovered over. - - code_imp: Transit space initializes about five seconds faster. - Tlaltecuhtli: - - balance: Cyborg ion thrusters consume 1/5 of their previous power. -2018-08-25: - Denton: - - rscadd: Added missing export rewards for various lavaland items (tendril/megafauna/ruins) - and engine parts. - - balance: Increased export values for emitters, PA parts, field generators and - radiation collectors to match the rest of engineering exports. Reduced supermatter - shard value by 1000 credits. - - rscdel: Removed export rewards for red/blue warp cubes since they're blacklisted - from the cargo shuttle. - - tweak: Added private intercoms to the confession booths of the Deltastation+Pubbystation - chapels. - - bugfix: Fixed invalid radio frequencies on interrogation chamber/confession booth - intercoms. - - tweak: Anime is even more horrifying than previously discovered! - - rscadd: Added a new shuttle loan event where crew can get paid for having an active - syndicate bomb delivered to cargo bay. - Mickyan: - - bugfix: Blue polo undershirt option has been restored - - tweak: underwear "nude" option moved to the top of the list - SpaceManiac: - - code_imp: The map loader now supports vars to be set to lists containing non-strings. - - bugfix: Overcharging energy guns no longer crashes the server. - - bugfix: Ordering the Build Your Own Shuttle kit no longer crashes the server. - The Dreamweaver: - - code_imp: Refactored gift code to fix a minor inefficiency. - XDTM: - - bugfix: Fixed chest and head augmentation not working properly. -2018-08-26: - CitrusGender: - - admin: Added note severity to [most] bans and the notes associated with them - - admin: 'Banning panel now has a severity option UI: Changed the UI of the note - panel UI: Changed the UI again, added some icons, removed brackets in urls, - fading out notes cannot be selected to expand the browser anymore' - Floyd / Qustinnus (Credits to KMC for the sprites): - - rscadd: The Clown Car, your 18TC clown-only solution to asshole co-workers - - rscadd: Regular car implementation (makes it easier to add more cars if someone - actually feels like adding those) - JJRcop: - - admin: 'Asay logs show "ADMINPRIVATE: ASAY:" again instead of just "ADMINPRIVATE:"' - Naksu: - - code_imp: living and stack typecaches now use a shared instance where it makes - sense, giving small memory savings - PKPenguin321: - - rscadd: Integrated circuit medium screens have been readded. They are now called - large screens. They now only work from your hands or on the ground when you're - standing on top of them (NOT from pockets, lockers, backpacks, etc). - - bugfix: Roundstart cyborgs will now be properly referred to as "it." - SpaceManiac: - - admin: The shuttle manipulator now allows flying any shuttle to any port which - will fit it. - - bugfix: The shuttle manipulator now allows fast-travelling shuttles with 5s remaining, - down from 50s. - - refactor: Status displays have been refactored to be cleaner and more flexible. - - bugfix: The AI dying properly updates its status displays again. - intrnlerr: - - refactor: Refactored nettles to be reagent_containers - nicbn: - - soundadd: Nanotrasen shoes no longer contain Silencium. Now footsteps make noise! - Sounds from Baystation. -2018-08-28: - Denton: - - bugfix: The 10 second anti spam cooldown of night shift lighting now works properly. - - spellcheck: Added an examine message to APCs that mentions Alt-click and Ctrl-click - (silicons only) behavior. - Garen: - - code_imp: adds a signal for screwdriver_act - SpaceManiac: - - code_imp: Multiple copies of a shuttle each get their own area instances (affects - APCs and air alarms). - XDTM: - - rscadd: The forcefield projector is now available ingame in the engineering protolathe. - It can project up to 3 forcefields which act as transparent walls, and share - a pool of health which is recharged over time. The projector must remain within - 7 tiles of the forcefields to keep them active. -2018-08-31: - Anonmare: - - bugfix: AIs can now turn shield generators on and off again - Denton: - - bugfix: Plastic golems can no longer vent crawl with items in their pockets. - Mickyan: - - balance: Skateboards can fit in backpacks - - tweak: Skateboards are slower by default, speed can be adjusted by alt-clicking - - rscadd: 'Show your support for the fine arts with these new quirks:' - - rscadd: 'Tagger: drawing graffiti takes half as many charges off your spraycan/crayon' - - rscadd: 'Photographer: halves the cooldown after taking a picture' - - rscadd: 'Musician: tune instruments to temporarily give your music beneficial - effects such as clearing minor debuffs and improving mood.' - Skoglol: - - bugfix: Dispensers can now add 5u to buckets, plastic beakers and metamaterial - beakers, down from 10u. - - bugfix: You can now pour 5u from buckets, plastic beakers and metamaterial beakers, - down from 10u. - - bugfix: Chem dispenser window width increased slightly, no longer shuffles buttons - when scroll bar appears. - The Dreamweaver: - - bugfix: Sentience Potions no longer require you to have Xenomorph toggled on in - preferences and now relies on its own preference in order to be notified of - open roles. - - code_imp: Split xenomorph, intelligence potions, and mind transfer potions into - separate roles for more precise role management. - - admin: Sentience Potion Spawns and Mind Transfer Potions are now job-bannable - roles. - Time-Green and locker sprites by MrDoomBringer: - - rscadd: Reports have come in that the wizard federation has harnessed some of - the ancient locker force to create a wand - XDTM: - - rscdel: Removed the chance of spouting brain damage lines when over 60 brain damage. - The dumbness trauma still has them. - - bugfix: Fixed Mechanical Repair nanites not working. - ninjanomnom: - - rscadd: Computers are now visible even in the darkest of rooms. Comfy! - - tweak: Because computers are now far easier to find in dark rooms their base light - output has been reduced. - - bugfix: Broken components left over from the signal origin refactor should be - fixed. - - bugfix: Lava isn't a safe place to throw your flammable shit anymore - - bugfix: The computer screen overlay being rotated incorrectly after construction - has been fixed. -2018-09-01: - ElPresidentePoole: - - rscdel: removes curator's fear of snakes - McDonald072: - - bugfix: Defibrillator nanites work properly. - Poojawa: - - bugfix: fixed clothing vendor fedoras having Detective Fedora grade armor - Potato Masher: - - tweak: The color of Wooden golems should be more in line with the color of the - wood used to make it. - WJohnston: - - imageadd: Reinforced floors are now shinier. -2018-09-02: - Denton: - - spellcheck: Fixed species type names that show up on health scanners. -2018-09-03: - Cdey78 (Ported by Floyd / Qustinnus): - - imageadd: AI can now think - - imageadd: 'New OOC emote: :thinking:!' - Naksu: - - admin: a new admin secret has been added to create a customized portal storm - Shdorsh: - - tweak: Makes it possible to create circuits that can get an item loaded into them - while they are in an assembly and the assembly is open. - - code_imp: Optimized electronic assemblies also. - - bugfix: A bug pertaining putting batteries in assemblies - Skoglol: - - bugfix: Eggplant and egg-plant seeds now have different names and plant names. - XDTM: - - bugfix: Fixed nanite cloud storage not allowing uploads. - octareenroon91: - - admin: Supermatter more likely to log fingerprintslast when it consumes any object. -2018-09-04: - Denton: - - spellcheck: Mech construction messages no longer incorrectly mention high-tier - stock parts. - - tweak: Added a nanite lab to Deltastation! It's at the old EXPERIMENTOR lab. - - tweak: 'Delta: Moved the Xenobiology disposals bin to be less obstructive. Added - two sets of insulated gloves to Engineering.' - - bugfix: 'Delta: Fixed scientists not having maintenance access near the circuitry - lab and toxins launch chamber.' - Shdorsh: - - code_imp: Made all the extinguishers use less sleep and spawn procs -2018-09-27: - Alexch2: - - spellcheck: Fixes tons of typos related to integrated circuits. - - tweak: Re-writes the descriptions of a few parts of integrated circuits. - 'Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes:': - - rscadd: 'New drinks: Peppermint Patty and the Candyland Extract!!' - Astatineguy12: - - tweak: The experimentor is less likely to produce food when it transforms an item - - bugfix: The experimentor no longer breaks when the toxic waste malfunction occurs - multiple times and isn't cleaned up - - bugfix: The experimentor irridiate function actually chooses what item to make - properly rather than picking from the start of the list - - bugfix: The mime blockade spell now shows up under the right tab - Beachsprites: - - imageadd: added directional beach sprites - Big Tobacco: - - rscadd: Cheap lighters now come in four different shapes and Zippos can have one - of four different designs, collect them all and improve our sales! - - imageadd: All existing lighter sprites have been given a face-lift and the flames - are now subtly animated. - - tweak: Cheap lighters now use a fixed list of 16 colors to pick from instead of - using totally randomized colors. - - imageadd: Cigar cases have been tweaked to be a bit smaller and to have a modified - design. - - imageadd: Cohiba Robusto and Havanan cigars now use separate case sprites from - the generic premium cigar cases. - CameronWoof: - - tweak: Quartermaster added to the list of changeling and traitor restricted jobs - CitadelStationBot: - - bugfix: The faint echoes of maracas grows louder, as if a past spirit once forgotten - has come back with a vengeance... - - bugfix: Removing an ID card from a wallet now properly removes its visual and - accesses. - - tweak: You may now take unlimited neutral and negative quirks - - tweak: the walls on the crashed abductor ship ruin in lavaland can now be broken - down - - bugfix: Pipe icons in the RPD now show properly in older versions of IE. - - bugfix: Removing an ID from a PDA in a backpack no longer hides the ID until something - else updates. - - bugfix: Opening and closing airlocks repeatedly no longer stacks queued autocloses. - - bugfix: Mindswapping with someone else no longer forces ambient occlusion on. - - bugfix: Admin AI interaction now works properly on firelocks. - - code_imp: IRV polls now use the same version of jQuery as everything else. - - rscadd: You can now view your last round end report window with the "Your last - round" verb in the OOC tab - - bugfix: Hydroponics trays can no longer be deconstructed with their panels closed - or unanchored while irrigated. - - tweak: Frames for machines which do not require being anchored can now be un/anchored - after the circuit has been added. - - spellcheck: Fix "Your the wormhole jaunter" when a wormhole jaunter saves you - from a chasm. - - rscadd: Analyzers can now scan all kinds of atmospheric machinery - unary, binary, - ternary, quaternary, you name it. This means stuff like gas pumps, gas mixers, - vents and so forth can be analyzed. - - tweak: Analyzers now show temperature in kelvin as well as celsius. - - tweak: Analyzers now show total mole count, volume, and mole count of all gases. - - tweak: Analyzers show everything at slightly higher degrees of precision. - - rscadd: Any anomaly core can now be deconstructed for a one time boost of 10k - points in the deconstructive analyzer. - - bugfix: Chasms no longer drop mobs buckled to undroppable mobs or objects. - - bugfix: Digital valves are once again operable by silicons. - - bugfix: Field generators are once again operable by adjacent cyborgs. - - bugfix: Entertainment monitors now view the real Thunderdome rather than the template. - - bugfix: Flipping and then rotating trinary pipe fittings no longer causes their - icon to mismatch what they will become when wrenched. - - bugfix: RPD tooltips for flippable trinary components have been corrected. - - bugfix: The green overlay indicating where a map template will be placed is no - longer invisible on space turfs. - - bugfix: Frost spiders now correctly inject frost oil on bite. - - bugfix: Inserting materials into protolathes with telekinesis is now possible. - - bugfix: Telekinesis no longer teleports items removed from deep fryers, constructed - sandbags, and leftover materials not inserted into lathes. - - bugfix: Telekinetic sparkles now appear in the correct place when clicking on - a turf and when clicking in the fog of war in widescreen. - - bugfix: Telekinetically adjusting power tools no longer causes them to exit the - universe. - - tweak: Examining a telekinetic grab in-hand will now examine the grabbed object. - - bugfix: Non-harmfully placing someone who is resting on a table no longer makes - them get up. - - bugfix: The disco machine no longer lags the chat by spamming "You are now resting!" - messages. - - tweak: Clicking on the viewport to focus it no longer leaves the input bar red. - - bugfix: Running diagonally into space now properly continues the diagonal movement - in zero-gravity. - - bugfix: Moving diagonally past delivery chutes, transit tube pods, &c. no longer - causes your camera to be stuck on them. - - config: The limit of monkey's spawned via monkey cubes is now configurable - - bugfix: Fixes cyborgs not being able to use two-handed modules while other modules - are equipped. - - bugfix: Pubby's auxiliary mining base now works again. - - bugfix: The overlay effects of cult flooring are now on the floor plane, fixing - their odd ambient occlusion appearance. - - bugfix: Cloning no longer breaks a character's connection to their family heirloom. - - bugfix: Beam rifle tracers no longer fall into chasms. - - bugfix: Vomiting on the same tile a second time no deletes the vomited reagents. - - bugfix: fixed the clockwork helmet not dropping to ground when used by non-clock - cultists - - refactor: The base machinery type is now anchored by default. - - bugfix: PDA style now gets loaded correctly. - - bugfix: Switching mobs into/out of a mech (by VR, ghosting, or mindswap) no longer - improperly applies the mech's cursor. - - tweak: roboticists have access to R&D windoors - - tweak: switched the type of the space suit on the syndicate shuttle - - bugfix: fixed hydroponics tray weed light staying on when removing weeds with - integrated circuits - - bugfix: Atom initialization and icon smoothing no longer race, causing late-loading - mineral turfs to have no icon. - - spellcheck: Faceless persons no longer "melt their face off" in energy gun suicides. - - bugfix: The Lightning Bolt spell now works again. - - tweak: Vehicle speed changes now happen immediately instead of on the next movement - cycle - - bugfix: Picture-in-picture objects now are no longer overlapped by other certain - objects - - bugfix: A pAI dying while in holoform no longer deletes the card, instead merely - emptying it. - - bugfix: The thermal sight benefits of lantern wisps no longer disappear if you - change glasses. - - imageadd: sandstone wall sprite for indestructible object - - bugfix: Stabilized gold extracts now respawn the familiar properly. - - bugfix: Stabilized gold familiars retain the proper languages even after respawning. - - tweak: Stabilized gold familiars can be renamed and have their positions reset - at will. - - bugfix: Pulling objects diagonally no longer causes them to flail about when changing - directions. - - bugfix: Riders are no longer left behind if you move while pulling something that - has since been anchored. - - tweak: Fire alarms now redden all the room's lights, and emit light themselves, - rather than applying an area-wide overlay. - - bugfix: Fire alarms no longer visually conflict with radiation storms. - - bugfix: Plasmamen now receive their suit and internals when entering VR. - - bugfix: Deaf people can no longer hear cyborg system error alarms. - - bugfix: Lockboxes are now actually locked again. - - bugfix: Legion cores and admin revives now heal confusion. - - bugfix: checks to see if bullets are deleted if they are the ammo type and the - bullet chambered. - - spellcheck: Capitalization, propriety, and plurality on turfs have been improved. - - bugfix: Unbreakable ladders are now left behind when shuttles move. - - rscadd: Players who edited a circuit assembly can scan it as a ghost. - - bugfix: It is no longer possible to pull the mirages images at space transitions, - and some other abstract effects. - - bugfix: Moving large amounts of items with bluespace launchpads no longer creates - a laggy amount of sparks. - - bugfix: The escape pod hallways on MetaStation and DeltaStation now have air again. - - bugfix: It is no longer possible to repair cyborg headlamps even when their panel - is closed. - - bugfix: Item fortification scrolls no longer add multiple prefixes when applied - to the same item. - - tweak: The blob core (and only the blob core) now respawns randomly on the station - when the core is taken off z-level - - bugfix: Prevents the round from going into an unending state - - code_imp: Added a variable to the stationloving component for objects that can - be destroyed but not moved off z-level - - rscadd: After years of protests NT decided to update the fire security standards - by adding 3 (three) advanced fire extinguishers to all the new stations. - - bugfix: Hyperspace ripples now remain visible until the shuttle arrives, even - during extreme lag. - - bugfix: Ripples now correctly take the shape of the shuttle, rather than always - being a rectangle. - - bugfix: Non-secure windoors now properly support the "One Required" access mode - of airlock electronics. - - bugfix: The gulag shuttle no longer moves instantly when returned via the claim - console. - - admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while - an admin ghost. - - admin: Speaking in deadchat now shows your rank instead of ADMIN - - rscadd: Added a pink scarf to vendomats - - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot - - bugfix: added a clamp so you can't set a negative multiplier to create materials - and create more than 50 items. - - bugfix: anomaly cores no longer tend to dust - - spellcheck: Plant disks with potency genes clarify the percent is for potency - scaling and not relative to max volume on examine. - - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous - scientists for a low low price of 14TC. - - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear - projectile that will apply what the bomb would do to a certain tile at that - distance to that tile. However, this will not cause breaches, or gib mobs, unless - the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. - (Unless the admins so will it.)' - - rscadd: Cyborgs now drop keys on deconstruction/detonation - - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only). - - bugfix: Fixed cyborgs not getting their names at round start - - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans - - bugfix: fixes cult shuttle message repeating - - bugfix: Hardsuit helmets now protect the wearer from pepperspray - - bugfix: It is once again possible for Cargo to export mechs. - - tweak: tourettes doesnt stack on itself anymore - - refactor: AI static now uses visual contents and should perform better in theory. - - bugfix: Bucket helmets cannot have reagents transferred into them until after - they are removed - - rscadd: R&D deconstructors can now destroy things regardless of if there's a point - value or material - - bugfix: You should now receive your destroy AI objectives properly during IAA - - bugfix: Deconstructable TEG now propertly connects to pipes. - - bugfix: Fix of inverted TEG sprite of slow turbine turning. add:Now you can flip - circulator and make TEG of your dream. add:Add TEG and circulator to "Advanced - Power Manipulation" techweb node. - - imageadd: New icon for plastic flaps that actually looks airtight. - - code_imp: Update to plastic flaps code to use tool procs rather than attackby - and removed two pointless states. - - bugfix: Printing the TEG and circulator boards no longer prints the completed - machinery instead. - - imageadd: Medical HUDs will now show an icon if the body has died recently enough - to be defibbed - Cobby: - - tweak: Decals are the exception to the recent removal of effects in Chameleon - Projectors. - - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits. - - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule - pack. - - bugfix: Paper doesn't give illegal tech anymore - Cruix: - - rscadd: AIs now have an experimental multi-camera mode that allows them to view - up to six map areas at the same time, accessible through two new buttons on - their HUD. - Dax Dupont: - - bugfix: Fixes the wrong tiles in Syndicate VR trainer and uses different tiny - fans. - - bugfix: Access didn't append to VR IDs - - bugfix: Fixes missing curator hud icon. - - balance: Cult items will no longer be a long ride on the vomit coaster if picked - up by a non cultist. - - balance: Cult space bases are kill again. - - balance: Cult floors now pass gas. - - bugfix: Fixed a few things deconning into the wrong circuit. - - bugfix: You can no longer do infinite bioware surgery. - - bugfix: Foam no longer gives infinite metal - - bugfix: Mulligan didn't work on lizards and other mutants. Now it does. - - tweak: The BoH dialog now has Abort instead of Proceed as an default option. - - bugfix: Fixes accidental empty ahelp replies. - - balance: More chemicals can be found when vents get clogged. - - bugfix: Experimentor no longer shits out primed TB nades. - - bugfix: Fixed rpeds throwing stock part rating related runtimes. - - bugfix: Fixes a sentience related exploit by blacklisting it in restricted uplinks. - - bugfix: Botany trays don't magically refill anymore with a rped. - - balance: It's now easier to become fat. Don't eat so much. - - bugfix: Fixed missing grilles under brig windows of the pubby shuttle. - - rscadd: For the pubby shuttle, added some food in the fridge, mostly pie slices. - Also added a sleeper to the minimedbay. - - tweak: Reworded pubby shuttle description to be more inline with the new train - shuttle. - - refactor: Syndicate and Centcom messages have been squashed together. - - admin: You can now send both Syndicate and Centcom headset messages. Be mindful - that the button was changed to HM in the playerpanel - - bugfix: Fixes missing cream pies in the cream pie fridge. - - bugfix: Chem synths overlays aren't all kinds of fucked anymore. - - refactor: Unfucked all of the remaining chem synth code. - - refactor: Reagents no longer have an unused var that's always set to true. Who - did this? - - balance: Makes the xeno nest ruin harder to cheese. - - bugfix: Fixes the bathroom being airless in the Space Ninja anime jail. - - admin: Create antags now checks for people being on station before applying. - - admin: Malf AI machine overloads now are logged/admin messaged. - Denton: - - rscadd: APC/air alarm/airlock/fire alarm/firelock electronics are now available - once Industrial Engineering is researched.. - - tweak: Engi-Vend machines now contain fire alarm and firelock electronics! - - code_imp: Loose tech storage circuit boards have been replaced with spawners. - - code_imp: Added /syndicate subtypes for air alarms and APCs. - - bugfix: Added missing stock parts to the syndicate lavaland base. - - tweak: Added kitchen related circuit boards to the syndie lavaland base. - - tweak: There are rumors of the Tiger Cooperative adding a "special little something" - to some of their bioterror kits. - - code_imp: Loose silver/gold/solar panel crates have been replaced with "proper" - crates. - - balance: Skewium is much less likely to appear during the Clogged Vents event. - - bugfix: 'Navbeacon access requirements have been fixed: Now you need either Engineering - or Robotics access, but not both at the same time.' - - tweak: 'Pubbystation: Added a dual-port vent pump to the toxins burn chamber.' - - code_imp: Removed most airlock_controller/incinerator related varedits and replaced - them with defines/subtypes. - - tweak: The Deltastation toxins lab has its portable scrubber, air pump and intercom - back. - - bugfix: Swarmers can no longer attack field generators and turret covers. - - rscadd: Arcades have been stocked with preloaded tactical snack rigs. - - bugfix: The Pubbystation maint bar Booze-O-Mat now shows its contents correctly. - - tweak: Added a warning to the shuttle purchase menu. - - balance: Pirates and Syndicate salvage workers have been beefed up around the - caravan ambush ruin. - - tweak: NanoTours is proud to announce that the Lavaland beach club has been outfitted - with a dance machine, state of the art bar equipment and more. - - tweak: Did you know that honey has antibiotic properties? - - spellcheck: Improved supply shuttle messages and firefighting foam descs. - - bugfix: Supply shuttles will no longer spill containers on docking. - Dimmadunk: - - rscadd: 'There''s a new type of reagent added to the booze dispenser: Fernet. - With it you can make a couple of new digestif drinks that will help you reduce - excess fat!' - ElPresidentePoole: - - rscadd: SFX for seppuku (on all katanas) - - rscadd: suicide message for energy katanas ("cyber-seppuku") - - rscadd: suicide message for replica katanas ("seppuku") - Flatty: - - tweak: The blurry eye overlay has been replaced with an actual blur. - - tweak: The vending machine UI is now prettier. - Garen: - - rscadd: Thrower and Gun circuits put messages in chat when they're used. - - tweak: Only the gun assembly can throw/shoot while in hand - - imageadd: Adds inhands for the gun assembly - - bugfix: grabber inventories update when a thrower takes from them - GrayRachnid: - - rscadd: Adds private rooms to the ninja holding center - - rscadd: Along with a few things to make it more tolerable, but fear not. There - is now a suicide chamber for those who want the easy way out. - GuyonBroadway: - - rscadd: Adds gloves of the north star to the traitor uplink. Wearing these gloves - lets you punch people five times faster than normal. - - rscadd: Sprites for the gloves courtesy of Notamaniac - Hatterhat: - - tweak: The plasma formerly present in some execution syringes was replaced with - amatoxin. - Hyacinth: - - rscadd: Grenadine is now available in the bar! - - tweak: Tequila sunrises now require grenadine to make! - Iamgoofball: - - tweak: Lipolicide now only does damage if you're starving. - Improvedgay: - - balance: Naming immerions - Improvedname: - - rscadd: Adds rubbershot secrifle shots - JStheguy: - - rscadd: Added the data card reader circuit, a circuit that is able to read data - cards, as well as write to them. - - tweak: Data cards are now longer inexplicably called data disks despite clearly - being cards, and can be printed from the "tools" section of the integrated circuit - printer. - - tweak: Data cards no longer have a special "label card" verb and instead can have - their names and descriptions changed with a pen. - - rscadd: Also, some aesthetically different variants of the data cards, because - why not. - - imageadd: Data cards have new sprites, with support for coloring them via the - assembly detailer. - Jay: - - tweak: Bans CMO, RD, CE, and HoP from antag/ling - Jegub: - - imageadd: Glowcaps now have their own sprite. - Kor: - - rscadd: The Quartermaster and HoP can now access the vault so they can use the - bank machine. - - rscadd: Engineering can now create anomaly neutralizer devices, capable of instantly - neutralizing the short lived anomalies created by the supermatter engine. - - rscadd: Bubblegum has regained his original (deadlier) move set. - LetterN: - - bugfix: Fixes shock collars, they now fit on the neck slot - - bugfix: you can't put them on pockets anymore - MacHac: - - bugfix: Bedsheets once again properly influence the dreams of those who sleep - under them. - Mickyan: - - bugfix: Drinking too much Gargle Blaster, Nuka Cola or Neurotoxin no longer breaks - time and space. - - bugfix: Pacifists can now use harm intent for actions that require it (but still - can't harm!) - - spellcheck: fixed typo in bronze girder construction - - rscadd: 'New trait: Drunken Resilience. You may be a drunken wreck but at least - you''re healthy. If alcohol poisoning doesn''t get you, that is!' - - bugfix: Fixed pacifists being able to harm using bottles/screwdrivers - MrDoomBringer: - - imageadd: the VR sleeper action button has a sprite now - - admin: Central Command can now smite misbehaving crewmembers with supply pods - (filled with whatever their hearts desire!) - - admin: CentCom Supplypods now stun their target before landing, and won't damage - the station as much - Naksu: - - code_imp: clothing-specific flags are now defined in /obj/item/clothing.clothing_flags - - code_imp: More flags have been moved to their appropriate places - - code_imp: HEALS_EARS_2 is removed in favor of the earhealing component - - code_imp: wearertargeting component is available to subtype for components that - want to target the wearer of an item rather than the item itself - - code_imp: changed the shockedby list on doors to be only initialized when needed. - - tweak: Chameleon projector can no longer scan (often temporary) visual effects - like projectiles, flashes and the masked appearance of another chameleon projector - user - - bugfix: Drones can no longer see a static overlay over invisible revenants - - balance: adjusted default antag rep points to grant every job the same amount - of points per round, except for assistant which gets 30% less - - rscadd: Nuclear explosive-shaped beerkegs found on metastation can now be triggered - with the nuclear disk and the syndicate's legacy nuclear code for a foamy surprise - - bugfix: comms consoles now work in transit again, and no longer work in centcom - - code_imp: removed unnecessary getFlatIcons from holocalls - - bugfix: Screwdrivers and other items with overlays now show the proper appearance - of the item when attacking something with them, or when put on a tray. - - code_imp: moved /datum.isprocessing into datum flags - - code_imp: Removed unused effect object that could be used to spawn a list of humans - - tweak: The ladders in the tear in the fabric of reality no longer spawn their - endpoints when the area is loaded, but only when the tear is made accessible - via a BoH bomb. - - tweak: CentCom is no longer accessible via the space ladder in the tear. - - tweak: The lavaland endpoint can no longer spawn completely surrounded by lava, - unless it spawns on an island - - code_imp: ChangeTurf can now conditionally inherit the air of the turf it is replacing, - via the CHANGETURF_INHERIT_AIR flag. - - bugfix: when ladder endpoints are created, the binary turfs that are created inherit - the air of the turfs they are replacing. This means the lavaland ladder endpoint - will have the lavaland airmix, instead of a vacuum. - - code_imp: navigation beacons are now properly deregistered from their Z-level - list and re-registered on the correct one if moved across Z-levels by an effect - such as teleportation or a BoH-induced chasm. - - bugfix: constructed directional windows no longer leak atmos across them - - code_imp: setting the value of anchored for objects should be done via the setAnchored - proc to properly handle things like atmos updates in one place - Nicc: - - rscadd: toxins lab boii - Nichlas0010: - - tweak: Reseach Director Traitors can no longer receive an objective to steal the - Hand Teleporter - - bugfix: Comms consoles won't update while viewing messages - - spellcheck: you now feel nauseated instead of nauseous - - bugfix: You can no longer use a soapstone infinitely - - bugfix: You now can't get multiple download objectives! - - tweak: RDs, Scientists and Roboticists can no longer get download objectives! - Poojawa: - - tweak: Admin IC issue is no longer TG i ded passive aggressive. - - rscadd: Added *insult, for when you just can't think of anything more clever - - bugfix: Makes vore specific prefs call Rust_g else uses normal stuff. - - bugfix: Citadel Toggles should save properly now - - bugfix: fixed clothing vendor fedoras having Detective Fedora grade armor - - bugfix: Fixes missing icons on mag weapons for techmemes - - bugfix: Fixes APCs being replaced in maint from counting Maint as their wall turff - - rscadd: Added Vore based moodlets, primitive and ain't gunna adapt for not belly - things but w/e - Pubby: - - bugfix: 'PubbyStation: Fixed disposals issue in security hallway' - Robustin with cat earrs: - - bugfix: 'Gun overlays should be way less laggy now. remove: Chameleon guns are - completely removed since they crash the server, were already made unavailable, - and are the worst shitcode I''ve ever seen in my life.' - ShizCalev: - - bugfix: Adminorazine will no longer kill ash lizards. - - bugfix: Adminorazine will no longer remove quirks. - - bugfix: Fixed mobs immune to radiation being killed by HIGH bursts of radiation. - - bugfix: The book of mindswap will now properly mindswap it's users. - - bugfix: Fixed a runtime with the gulag teleporter that could cause the process - to fail if you removed the ID. - - tweak: Not setting the goal of a prisoner's ID when teleporting them will now - set the ID's goal to the default value (200 points at the time of this change.) - - bugfix: Fixed cigar cases & cigarette packets taking two inventory slots - - bugfix: Fixed cigar cases showing the wrong icon for the cigars inside them. - - bugfix: Fixed cigar cases & cigarette packets stating the wrong name of the cigar/cigarette - when removed via altclick. - - bugfix: Fixed items in pockets vanishing when a mob is monkeyized. - - bugfix: Fixed items in pockets vanishing when a mob is gorillized. - - bugfix: Fixed items in pockets vanishing when a mob is infected with a transformation - disease. - - bugfix: Fixed items in pockets not being properly deleted when a mob goes through - a recycler - - bugfix: Fixed items in pockets not being properly deleted when highlander mode - is enabled. - - bugfix: Fixed exploit allowing you to remove unremovable tanks from pockets. - - bugfix: Fixed items in pockets dropping when a mob is equipped with a new outfit. - - bugfix: Fixed items in pockets not being covered in blood when equipping the psycho - outfit. - SpaceManiac: - - bugfix: The destructive analyzer can once again be used to reveal nodes. - - spellcheck: Some references to "deconstructive analyzer" have been updated to - "destructive". - TGstation contributors: - - bugfix: Nukeop eshields are now buyable. tgstation/tgstation#39025 - - bugfix: Staff of storms now has admin logging. tgstation/tgstation#39011 - - bugfix: Fixed a couple of inconsistencies in the uplink descriptions of SMGs and - SMG ammo. tgstation/tgstation#38980 - - bugfix: Fixed blob victory. tgstation/tgstation#38988 - - tweak: You can now un-ignore notifications you've clicked "never this round" on, - and more. tgstation/tgstation#38990 - - bugfix: Fixes a weird bug with timers. tgstation/tgstation#38994 - - bugfix: (tgstation/tgstation#40043) - Beam rifles no longer open lockers - - bugfix: (tgstation/tgstation#40061) - Mobs can no longer get stuck at min/max - body temperature - - bugfix: (tgstation/tgstation#40041) - Pictures of asses are now properly sized - - bugfix: (tgstation/tgstation#40084) - The lastattacker var now includes unarmed - attacks - - bugfix: (tgstation/tgstation#39968) - Plastic golems can no longer ventcrawl with - items in their pockets - - bugfix: (tgstation/tgstation#39885) - You can no longer crash the server by overcharging - energy guns. - Thunder12345: - - rscadd: Added a colour picker component for use with circuits. - Time-Green: - - bugfix: Soda is no longer intangible to the laws of physics - Toriate: - - rscadd: It appears that ancient pieces of armor have wound up on the open market! - These armors have degraded beyond usefulness. Grab one now in the loadout! - - imageadd: added flak jacket and M1 Helmet sprites - - rscadd: Gives the flak helmet a tiny storage compartment - - balance: Made the flak helmet even weaker against acid and fire so it crumbles - into dust easier - - rscadd: Added the Corporate Uniform and the Silver Bike Horn - - imageadd: added sprites for the Corporate Uniform and Silver Bike Horn - Tupinambis: - - tweak: 'Removes the tesla coils from engineering secure storage, and places them - within the engine room, functional upon being wrenched down. (Arranged in the - common method of three coils on the left and right sides.) - - Reduces the width of engineering secure storage and its blast door by one tile. - The machinery within has been rearranged in order to make the most commonly - used machinery the most accessible.' - - tweak: Replaces the blood-red hardsuit in Deep Storage with a mining EVA hardsuit, - and an included oxygen jetpack. - - rscadd: 'Adds a replacement to the old lavaland xeno ruins in the form of lavaland_surface_alien_nest.dmm An - image of which is shown below. (The area layer is disabled for visibility.) - ![hive](https://user-images.githubusercontent.com/42078130/44291327-43df0d00-a243-11e8-9e72-ba8f81d31370.PNG) - ![hive2](https://user-images.githubusercontent.com/42078130/44291330-47729400-a243-11e8-998d-660063fa9f41.PNG) - - This replacement is designed to act as a sort of raid, with the queen as the - raid boss. The most notable loot includes the corpse of a drone, security bio - armor, a bone axe, some basic syndicate equipment, and a syringe containing - alien microbes. All references to the old lavaland xeno ruins have been replaced - with references to the new map file.' - - rscadd: New corpse spawners for alien queens and drones. - - rscadd: New syringe containing the alien microbe reagent. - - rscdel: Removed the currently unused lavaland_surface_xeno_nest.dmm map file, - and its references. - - rscadd: Added an experimental hard suit to toxins bomb test room on Box. - - tweak: Increased the size of the toxins bomb test room, moved the telescreen, - and added chairs on Box. - - tweak: Moved some pipes out of the way on Box and Meta. - - rscadd: 'Two air pumps have been added to the toxins lab on Pubby and Meta. - - The following changes apply to Box, Meta, and Pubby:' - - tweak: Unbolts the toxin burn chamber doors on round start. - - tweak: Unlocks the toxins lab air alarm on round start. - - tweak: When spawned as a nuclear operative, you keep your characters race instead - of being changed into a human. Plasmamen are an exception to this change. - - tweak: By popular request, makes the Head of Security spawn with a telebaton instead - of a stun baton. - Werebear: - - rscadd: Seven new holochassis options for pAIs and two new display images for - pAIs. - Wilchen: - - rscdel: Removed box of firing pins from rd's locker - XDTM: - - bugfix: Fixed anti-magic not working at all. - - bugfix: Diseases now properly lose scan invisibility if their stealth drops below - the required threshold. - - tweak: Coldproof mobs can now be cooled down, but are still immune to the negative - effects of cold. - - bugfix: This also fixes some edge cases (freezing beams) where mobs could be cooled - down and damaged despite cold resistance. - - balance: Androids are now immune to radiation. - Xhuis: - - tweak: Character traits are now called character quirks. Functionality remains - unaffected. - Zxaber: - - rscadd: Cyborgs can wear more hats now. - and Fel: - - imageadd: New chairs are on most shuttles! Finally, you can relax in style while - escaping a metal death trap. - armhulen: - - rscdel: chameleon guns are disabled for breaking the server - cacogen: - - rscadd: You can now see what other people are eating or drinking. - - rscadd: Borg shaker can now synthesise milk, lemon juice, banana juice and coffee - - bugfix: Renamed drinks no longer revert to their original name when their reagents - change - cyclowns: - - bugfix: Fires no longer flicker back and forth like crazy - - rscadd: Fusion has been re-enabled! It works similarly to before, but with some - slight modification. - - tweak: Fusion now requires huge amounts of plasma and tritium, as well as a very - high thermal energy and temperature to start. There are several tiers of fusion - that cause different benefits and effects. - - tweak: The fusion power of most gases has been tweaked to allow for more interesting - interactions. - - tweak: BZ now takes N2O and plasma to create, rather than tritium and plasma. - - bugfix: Fusion no longer delivers server-crashingly large amounts of radiation - and stationwide EMPs. - deathride58: - - tweak: (Only visible on 512) Stamina crit will now result in the mob's sprite - subtly darkening around its edges. - - rscadd: Added a tiny reference item to a year-old weeby game. If you're a traitor, - you can find this item in the "badassery" section of the uplink. It's free, - and you can order up to 4 of them! The effects of this item are only visible - on 512. - - code_imp: Added a component signal for toggling combat mode on/off. - - balance: The cleaving saw now deals less staminaloss to its user while inactive. - - rscadd: You can now make use of custom say verbs with the [say verb*message] format - - rscadd: Yelling will now echo and penetrate walls - - tweak: Distant voices now have smaller text - - tweak: You can now see the amount of charges an emag has by examining it - - tweak: Emags now make a quiet noise when they're close to running out of charges. - - tweak: Emags are no longer irreversibly destroyed upon running out of charges. - - rscadd: Traitors can now purchase emag recharge devices for 2 TC. They have five - extra charges each, and can be found in the devices and tools section of the - uplink.. There's no cap on the amount of charges a single emag can have, though - do be aware that upstream spaghetti code makes it easy to waste charges. - - tweak: Small emag flavortext changes here and there - - balance: The warden's particle defender now deals less staminaloss when in stun - mode. - - tweak: '"code [alert level]" has been changed to "[alert level] alert" on the - hub entry.' - - tweak: The hub entry now displays the current map. - - tweak: Lavaland is no longer fullbright. We have memory to spare. - - rscadd: Adds the wheelofsalt command to TGS3. Spin the wheel of salt to find out - what the Citadel Station 13 players are salting about today! - - rscadd: You can now slam or slap your hands onto tables by right clicking them - in combat mode. - - tweak: Non-admins can no longer use LOOC while dead, unconscious, in crit, or - while ghosting. - - tweak: The syndicate mask available in the uplink will now inject you with a chem - that cuts your click delay in half and increases your stamina regeneration, - when you enter combat mode. The mask has a five minute cooldown between adrenaline - injections. - - balance: Dogborgs will now reduce firestacks when they use their tongue to lick - someone's face. - - bugfix: The repo compiles again - - bugfix: The flag cape donor item should render properly now. - - tweak: The default amount of z-levels reserved specifically for space ruin generation - has been reduced from 7 to 1 - - bugfix: Items now spawn on top of, rather than inside, closets and other storage - structures - - rscadd: Jukeboxes now have realtime directional audio, complete with occlusion - when you're far away or behind a wall. - - rscadd: More than one jukebox can play a song at a time now. Have up to 5 jukeboxes - playing at once! - - rscadd: Devs can now control the wet and dry channels of sounds played via playsound_local. - The new envwet and envdry arguments will control the volume of the wet and dry - track, respectively. - - code_imp: Jukeboxes have been turned into a subsystem. Track initialization, audio - playing, etc, are now handled via SSJukeboxes instead of via the jukebox object - procs. - - config: Jukebox tracks now require an additional ID field at the end of their - name. This will make it easier to add jukebox-style objects that are only capable - of playing specific songs, without worrying about copyright issues. - - rscadd: Added Raiq's boombox as a donor item - - rscadd: You can now manipulate tails, ears, body markings, mutant colors, and - taur types via DNA console! - - balance: Reduced the exponent on gas tank ruptures. TTVs and suicide onetanks - that were previously 20dev are now approximately 9.6dev. Let's see the actual - toxins nerds adapt! - - tweak: When a custom say verb message is spoken without any actual words, the - text will render without a `, ""` at the end of it. - - balance: The combat rework's training wheels have been removed. Knockdowns no - longer have any noticeable stun. This indirectly means stunbatons and tasers - will always deal their full stamloss on hit. - - balance: The stamloss required for boxing gloves to throw a knockout punch has - been increased from 50 to 100. - - rscadd: You can now prime the grenade on bombspears by using them in your hand. - The wield hotkey is moved to combat mode rightclick while a spear has a grenade - on it. This is explained in the examine text. - - balance: Bombspears no longer instantly explode on impact when thrown. They now - have to be primed to explode when thrown. - - balance: Bombspears now have 90% embed chance. - - rscadd: If an embedded item is normal sized or larger, you can take it out instantly - by pressing resist. - - balance: Embedded items are now much harder to pull out the smaller they are, - rather than the other way around. It's much easier to rip out a sword from your - chest than it is a shard of glass in your face. - - tweak: The message you get when you get bounced by the PB is now a little more - clear about what you need to do to gain access to the server. - - balance: The jukebox now falls off over a greater distance. You can now actually - hear the jukebox while sitting in a far corner of the bar, or while passing - through the main hallways. - - rscadd: Added antag OOC. This is disabled by default, but you can access it with - the "AOOC" verb as an antagonist when an administrator enables it. - - tweak: LOOC now supports emojis - - tweak: 'Deadchat and asay will now both render emojis! :snya:' - - balance: The disarm attack on EMP'd defibs now has an interruptible 1 second timer - before it actually lands. - - balance: The stamina buffer now only takes 1 second to start regenerating. - - balance: Disablers have had their damage reduced from 36 stamloss to 24 stamloss, - increasing their shots to stamcrit from 4 to 6. - - balance: Tasers have had their damage increased from 55 stamloss total to 61 stamloss - total. Shots required to stamcrit are unaffected. - - rscadd: Introducing the Kitchen Gun (TM)! Say goodbye to daily stains and dirty - surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll - sparkle like new! Includes two extra ammunition clips for the low, low price - of just 10 TC! Laser sight and night vision accessories sold separately! Magazines - can be purchased individually for 1 TC a pop! - - tweak: Active turf processing is now its own subsystem. - - code_imp: Ports tgstation/tgstation#39287 - You can now configure how fast a mob - fires, and how many shots they fire in a single burst - - rscadd: When you spawn as a miner, you'll get text clarifying your job description. - You might not think it's necessary, but believe me, it is. - - rscadd: mushroom people are now roundstart on live - - rscadd: The geargroupID var of loadout entries can now be a list rather than a - string. GeargroupID changes are additive when multiple are defined in a single - loadout entry. - deathride58 (Original PR by Basilman/Militaires): - - rscadd: Ported TGstation's Agent Stealth Box! You can the implanter in the syndicate - uplink for 8 TC. Credit goes to Basilman/Militaires. This port includes minor - adjustments, see the GitHub for details. - hatterhat after being yelled at by kevinz: - - bugfix: deletes an entire line that might fix flash icons idk blame him if it - gets worse - iksyp: - - rscadd: stacking machines and their consoles no longer dissapear into the shadow - realm when broken - - rscadd: you can link the stacking machine and its console by using a multitool - - bugfix: Ever since the great emotion purge of 2558, people were able to work at - top efficiency, even while starving to death. This is no longer the case, Nanotrasen - Scientists say. - - admin: Hunger slowdown only applies if mood is disabled in the config. - imsxz: - - admin: Using mayhem bottles and going under their effects is now logged. - izzyinbox: - - rscadd: Added an integrated circuit part that interacts with the arousal system - - tweak: changes the admin-pm input box from single line to multi-line - - bugfix: Tennis balls now equip and show up in the correct slots - - rscadd: Adds option in the hide/expose genitals verb to hide genitals even without - clothes - kevinz000: - - rscadd: Cameras now can take pictures up to 7x7. Alt click them to change their - width/height from the default 3x3. - - rscadd: Photos are now logged to disk, assuming the host enabled the configuration - option - - rscadd: If the above is enabled, albums/frames can now have their persistence - IDs set in variables to allow for PHOTO PERSISTENCE - - rscadd: Every head of staff gets a unique album with its own ID in their locker. - Let your successors know about your accomplishments, screwups, and everything - in between! - - rscadd: All of this works or should work with newcasters/pdas/etc etc - - rscadd: Photo taking now clones the area into transit space and then operates - on it, instead of on the spot, in theory making photographing things more accurate? - nicc: - - rscadd: no more dark locker corner woo - - tweak: area alterations - - rscadd: escape pod - - rscadd: see above - - rscadd: adds windoor to the plastic flaps in the atmos lobby - ninjanomnom: - - rscadd: A plush that knows too much has found its way to the bus ruin. - resistor: - - rscadd: Added circuit labels! You can now customize the description of your assemblies. - slate3: - - rscadd: ported a new alternative sprite for engineering borgs, mr. handy - - rscadd: ported a new alternative sprite for security borgs, a spider-like walker - - rscadd: ported a new alternative sprite for medical borgs, an eyebot - steamport: - - bugfix: Borgs/AIs can now toggle rad collectors - ursamedium: - - bugfix: slapping / slamming hands on tables now uses appropriate pronouns - - bugfix: crow pAI is no longer invisible while resting - yenwodyah: - - bugfix: A few virus threshold effects should work now - yorii: - - bugfix: Fixed the smartfridges to be in line with all other machines and puts - the released item in your hand. - yorpan: - - rscadd: Brain damage makes you say one more thing. -2019-11-04: - 4dplanner, MMiracles: - - tweak: Wizard shapeshift now converts damage taken while transformed - - bugfix: transform spell transfers damage correctly instead of healing most of - the time - - bugfix: 0% simplemob health maps to 0 carbon health, 100% simplemob to 100% carbon - - bugfix: transforming to a form with brute resistance no longer heals you - - bugfix: transforming back to a species with brute resistance no longer heals you - AdmiralPancakes1: - - rscadd: 'Cryo cell shortcuts: alt-click toggles the doors, ctrl-click toggles - the power' - Alonefromhell: - - rscadd: Ported Oracle UI, a framework for self-updating and neat UI's - - refactor: Paper now uses OUI - - refactor: Bins now use OUI - - bugfix: fixes tootip offset - AnalWerewolf: - - rscadd: Fritz plushie - - rscadd: Donor item - Anonymous: - - imageadd: 'More crusader armor variants to pick from armament: Teutonic and Hospitaller.' - Arturlang: - - rscadd: You can now use CTRL and ALT click on pumps and filters to toggle them - on and off and max their output respectively - - rscadd: You can now use RPDs on windows and grilles. - - rscadd: The RD can now suplex a immovable rod. Good fucking luck. - - bugfix: Fixes high alert ERT suit sprites. You can see them now! - - rscadd: Traitor codewords are now highlighted for traitors. - - rscadd: You can now examine pumps filters and mixers to see if you can use CTRL - and Alt click on them. - - bugfix: Fixes brain damage/trauma healing nanites so they actually work while - there are only traumas. - - tweak: Advanced toxin filtration nanites now heal slimes - Bhijn: - - rscadd: It's now possible to forcefully eject the occupants of a dogborg's sleeper - by using a crowbar on them. This action is instant. - - tweak: Resist values for dogborg sleepers have been adjusted. The baseline has - been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist - timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds. - - tweak: It now takes 10 full seconds to insert people into your sleeper. This should - hopefully give people some more room to breathe and react to a dogborg attempting - to sleeper someone either for no reason or in a way that violates law 2. - - bugfix: Warp whistles no longer grant permanent invulnerability and invisibility - - bugfix: You can now actually use the resist hotkey to resist out of handcuffs. - Woah, revolutionary - - bugfix: the `!tgs poly` command now actually works - - rscadd: Poly now has a 0.01% chance per squawk to speak through the TGS relay. - - balance: The point production mode of radiation collectors has been reverted to - the original behavior of using all of the stored power every process cycle instead - of just 4% of it - - tweak: Radiation collectors now display the amount of power/research points they're - producing per minute rather than per process cycle, which should hopefully clear - up a lot of confusion. - - tweak: Radiation collectors also display what's happening to the gas within them, - which should make it a lot more obvious as to how you get tritium. - - tweak: Security borgs and K9s are now only available during red alert or higher. - - server: Headmins or other folks with access to the server's config can choose - the minimum alert level for secborgs to be chosen via the MINIMUM_SECBORG_ALERT - config option. See the default game_options.txt for more info. - - bugfix: The server no longer attempts to check if the CID matches the IP of any - bans, or if the IP matches any CIDs of any active bans, during client analyzation - - balance: Vampires can now only ventcrawl in bat form if their blood level is below - the bad blood volume (224 blood total) - - balance: Vampires now only take 5 burn per mob life cycle while within chapel - areas, down from the original 20 burn per life cycle. - - tweak: K9 pounces have received a minor rework. It now has an effective cooldown - of 2.5 seconds, can now only deal up to 120 staminaloss, deals a maximum of - 80 stamloss on hit, has a spoolup of half a second, and now has telegraphing - in the form of a quiet noise. - - balance: K9s now only have 80 health - - balance: Secborgs (but not k9s) now have a hybrid taser. This can be toggled via - server config. - - tweak: The disabler cooler upgrade now applies to all energy-based firearms for - borgs - - rscadd: Dogborg jaws are now capable of incapacitating targets if using help intent. - This deals a hard stun depending on how much staminaloss the target has, and - whether or not they're resting. This behavior can be toggled via server config. - - balance: K9 jaws now have 15 force, up from their nerfed 10 force. - - balance: Borg flashes regained their ability to cause knockdown. This can be toggled - via server config. - - server: The WEAKEN_SECBORG config option will disable the new dogborg jaws mechanic - and make secborgs spawn with a standard disabler. - - server: The DISABLE_BORG_FLASH_KNOCKDOWN will disable the ability for borg flashes - to knockdown. - - tweak: Jukeboxes now have 6 audio channels available to them, up from the previous - accidental 2 and previously intended 5 channels. - - bugfix: Jukeboxes now work again on clients running versions higher than 512.1459. - - bugfix: People will no longer have their ears consumed by an eldritch god if multiple - jukeboxes are active and the first jukebox in the jukebox list stops playing, - then tries to play again - - tweak: Instead of the debug text for invalid jukebox behavior being printed to - world, the debug text is now restricted to the runtime panel. - BurgerB: - - tweak: Tweaked the UI of the loadout to be less cluttered due to an issue with - formatting. - BurgerBB: - - rscadd: Adds the bonermeter; a device that measures arousal based statistics. - - refactor: Added a new input to the electrostimulator that controls the strength - of the shock. It accepts negative inputs which reduce arousal. Added a new output - to the electrostimulator that displays the amount of arousal gained. - - balance: Rebalanced the electro-stimulator to be less spammy by giving it a 2.5 - second enforced cooldown per circuit contraption. Increased the complexity of - electro stimulator from 10 to 15. - - refactor: Reworked the Vent Clog event to spray smoke instead of foam, also made - it shoot smoke over time instead through each vent instead of all at once. - - tweak: Increased the spawn area of the City of Cogs (Reebe). This does not affect - the area in which builders can build. - - balance: Significantly tweaks the Wizard race transformation event to be less - unreasonably troublesome. - - rscadd: Adds a new 0 cost trait that makes you immune* to Crocin and Hexacrocin - - tweak: Tweaks how slurring works so it's more of a gradual change into slurring - instead of immediate. - - balance: Slurring is now directly proportional to your drunkenness, with other - sources of slur being added on top of it. - - tweak: Bras are now separate from underwear, meaning you can mix and match bras - if you're into that. - - tweak: Men can wear female accessory clothing, and females can wear men accessory - clothing. It's not a fetish, mom, it's PROGRESSIVE. - - code_imp: Reorganized accessories into their own files to prevent a massive 1000 - line file. - - server: i'm 10% sure that merging this PR will cause preference corruption sooooooooooo - I just need to hear from @deathride58 or perhaps someone else on how much damage - this could possibly do. - - tweak: Tweaked penis. - - balance: Rebalanced penis. - - rscadd: 'Added the following reagents to the common list of vent clog reagents: - ~~Cooking Oil~~, ~~Frost Oil~~, Sodium Chloride, Corn Oil, Uranium, Carpet, - Firefighting Foam, semen, femcum, tear juice, strange reagent, ~~spraytan~~.' - - balance: Vent Clog smoke emits the same transparent smoke as a smoke machine, - including how much it transfers. Vent Clogs also do not trigger in areas deemed - "Safe" in code, such as in the dorms or trusted areas where dangerous things - shouldn't occur. - - rscadd: Adds additional random brain damage text - - rscadd: Adds penis enlargement pills. - - rscadd: Adds Stun Circuit and Pneumatic Cannon Integrated Circuits - - bugfix: Fixed extinguisher and smoke circuits not accepting any reagents. - - rscadd: Adds a few important clockcult tips. - - rscadd: Added Mech Sensors, a brass-created trap that activates when a mech not - controlled by a cultist crosses it. - - rscadd: Added power nullifiers, an emp trap that emps everything in a 3x3 area, - with the center suffering a heavy EMP. - - tweak: Brass Skewers now deal 50 damage to mechs. - - balance: Ass slapping only works if you're actually behind the target. Ass slapping - now respects disarm blocking. You can no longer face/ass slap someone on an - intent other than help, unless they are also face/ass slapping. - - bugfix: Fixed ass and face slapping grammar. - - rscadd: Adds meh effects for ass and face slapping. - - tweak: '"Unwillingly" eating food now sends a warning message instead of a notice. - Unable to stuff food down your throat sends a danger message instead of a warning - message.' - - rscadd: Adds clockwork reflectors, a fragile anti-laser reflection shield object - that can be constructed for 10 brass sheets. Upon firing on the object in the - direction where it is shielded, it ricochets the bullet off of it relative to - the shooting angle. - - tweak: Renames some windows in the build menu for consistency. - - balance: Clockwork Cult walls can no longer be deconstructed by RCDs when heated. - - rscadd: Adds several new toy loot to the arcade machine. - - balance: Rebalanced the arcade machine loot. Battlemachines now have a 0.5 second - delay instead of a second delay between actions. - - bugfix: Fixed a bug that would not allow the one in a million pulse rifle to spawn. - - rscadd: Adds a new trait "Buns of Steel" that makes you immune to the effects - of ass slapping, and temporarily makes the user's arm useless like a stun baton - hit. It costs 0 points. - - balance: Ass slapping blowback from the Buns of Steel perk now deals 20 stamina - damage instead of 50, and no brute damage. - - rscadd: Gamemode voting results are displayed at the end-round screen. - - balance: Cloning no longer gives you positive mutations, but a chance for a negative - one. Cloning has a chance to "scramble" your visual DNA. - - balance: Chestbursters no longer give and remove your brain. They just disembowel - and kill you now. - - bugfix: Fixes WarOps miscalculating players. - - balance: Activating the nuclear device during war-ops informs the crew of the - nuke's position. - - rscadd: The alert level is displayed at the job selection screen. - - balance: Central Command informs you when a Meteor Storm is about to hit 5 to - 10 minutes before it happens. - BurgerLUA: - - code_imp: Added a new framework for reagents. Reagents can now have a bool that - determines if it can be detected by handheld medical analyzers. Currently only - the changeling sting chemical does this. - - balance: Made changeling transformation string last between 10-15 minutes. Lowered - the dna cost of changeling sting from 3 dna to 2 dna. Lowered the chemical cost - from 50 to 10. Lowered the loudness from 2 to 1. Changeling sting transformation - can be removed via high doses of calomel. - - bugfix: Fixed most reagents having a placeholder color. - - bugfix: Fixed autolathe wires not correctly shocking you when pulsed. - - balance: Rebalanced special jetpacks. - CalamaBanana: - - rscadd: Added Deer taur - - rscadd: Added Elf ears to mammals - CameronWoof: - - rscadd: Medihounds now have rollerbeds for non-vore patient transport - - bugfix: The closed O2 crate now uses the same color scheme as the open one - - tweak: air alarms are green now instead of blue when the atmosphere is ideal - - tweak: Hexacrocin overdose no longer causes climaxes - - tweak: Altered the icons for inventory backplates. Sleek! Stylish! New! - - bugfix: Attaching a beaker that contains water to an IV stand no longer causes - a visual glitch - - tweak: Fluid-producing sexual organs no longer start full - - tweak: Sexual organ fluid capacity decreased from 50 to 15 - - tweak: Sexual organ production rate decreased from 5u to 0.035u per two seconds. - - tweak: Sexual fluid decals no longer contain reagents - - tweak: Sexual fluids cannot by synthesized (e.g., by the Odysseus) - CdrCross: - - rscadd: Adds the ability for cloning consoles to read and write record lists to - the circuit board, and provides a template for giving other machines local circuit - board memory. - Cebutris: - - rscadd: Hugs of the North Star! Get them from the arcades (if you're lucky) and - hug your friends at INCREDIBLE hihg speeds! - - bugfix: Tea Aspera now properly contains tea powder - - tweak: Breasts no longer lactate by default, lactation is now a preference - Chayse: - - tweak: Changed the Warden's compact combat shotgun to instead be a regular combat - shotgun with a foldable stock and penalties for being folded. - - rscadd: Assorted space-worthy helmets can now act as masks for internals. - - refactor: Internals code can now check any item with the ALLOWSINTERNALS flag - through the GET_INTERNAL_SLOTS define. For now this only checks head and mask - slots, since those are the most realistically speaking usable ones. - - tweak: Medbay doors can now be opened by anyone from the inside without having - to press the exit button. - - bugfix: Borgs now have the necessary dexterity to unbuckle people from themselves - and from bucklable objects. - - bugfix: Fixes the Trek Uniform/Suit worn icons - - bugfix: AIs can now once more talk through holopads successfully - Code-Cygnet: - - rscadd: Added new things - Mind trait, alcohol reagent, chemical reagent, drink - sprite and recipe. - - imageadd: added commander_and_chief sprite to drinks.dmi - Coolgat3: - - tweak: Changed player number checks to 20 from 24 for cult and clockcult, also - made nukeops 28 required players instead of 30. - - tweak: Changed enemy minimum age from 14 to 7 - - rscadd: Added the code for the semen donut and made it craftable - - imageadd: Added the donut sprites - - bugfix: Made the sec and warden berret offer as much protection like the helmet - - rscadd: Added berets for all the heads. - - imageadd: Added sprites for the berets. - - code_imp: Coded the berets to spawn in appropiate lockers. - - tweak: Raised the ripley's movement speed and lights range by 1, also lowered - its armor to compensate. - - rscadd: Added combat gloves sprite - - imageadd: Added said sprite - - imageadd: added combat boots sprite - Coolgat3 / Avunia: - - rscadd: Made kindle put the target into stamcrit, which makes it an actually working, - useful stun. - - rscadd: Added a stamina loss modifier to the vanguard spell which makes the user's - stamina drain at a way slower rate. This doesn't make them immune to tasers, - but it takes a few hits to actually get them to fall down. - - tweak: Made it so that clock culties don't start with a chameleon suit. Instead - they start with an engineer suit which is pretty much the same sprite and looks. - If this is not perfect, then I am willing to make a slightly more brass-colored - version of the engineer suit sprite and call it a ratvarian engineer jumpsuit. - - balance: Increased the cost of vanguard, as it is now a spell that works somewhat - like adrenals, minus the move speed, making your stamina drain really slow and - making you unable to get knocked onto the ground by just a single taser shot. - - balance: Lowered the charge time of kindle, reason being that you can usually - have only one active spell on you, or two at max if you decide to run two slabs, - but the fact that kindle silences people for such a small amount of time makes - up for it, in my opinion. - - server: Figured out that the consoles and their warp function actually work with - the current code. The thing that makes them not work is when the gamemode is - ran on debug mode, without the required players to actually support it. It also - breaks the ark timer which is stuck on -1 seconds until activation. Whenever - the gamemode starts properly, like any other gamemode, with player checks and - all, everything seems to work just fine. - CydiaButt13: - - rscadd: Lamp Plushie to loadout - - imageadd: added plushie_lamp to plush icons - - code_imp: added Lamp Plush to loadout and icons and items - EgoSumStultus: - - bugfix: Fixed blood chiller's inhand - - bugfix: FIXED SHIELF - - bugfix: fixed magpistol magazine sprites - - rscadd: Added the Femur Breaker - - rscadd: Adds male AI vox. - EmeraldSundisk: - - rscadd: Adds a gun range to Box Station - - rscadd: Provides some extra power grid connections - - rscdel: Sunglasses and Earmuffs removed from the Warden's Office - they can be - found at the range instead - - tweak: Rearranges a few objects within the prison as to accommodate the new gun - range - - rscadd: Adds a mass driver to Delta Station's chapel - - rscadd: Adds a second means of entry into the chapel - - tweak: Slightly expands the chapel to make room for the driver, slight adjustment - to air systems - - tweak: Clears a path in the station exterior for the mass driver to work properly - - tweak: Nearby maintenance loot has been relocated to accommodate the chapel expansion, - surrounding area has been "cleaned up" somewhat - - tweak: CentCom has noticed the lack of coffins in Delta Station's chapel and provided - some, but in exchange for reducing the chapel morgue's capacity. - - tweak: Fixed a maintenance door the chaplain should have been able to open. - - bugfix: 'Fixes space areas outside the driver removal: CentCom Defense Analysts - have ordered the maintenance hatch to the Mass Driver room be removed citing - "security concerns".' - - rscadd: Increases the number of plots to 9 (from 5) - - rscadd: Additional lighting placed directly outside the garden - - tweak: Cleans up the area to reflect use. Moves the seed extractor to a more central - location - - tweak: 'Relocates the seed packs on botany''s counter to the garden removal: Removes - wooden barricades outside the garden' - - config: Renames "Abandoned Garden" area designation to "Maintenance Garden", but - does not replace the icon in Dream Maker - - rscadd: Expands the chapel mass driver room to make it easier to use - - rscadd: Rearranges the chapel backroom so there are now six coffins and burial - garments roundstart - - tweak: Cleans up the Janitor's office - - tweak: Readjusts the station exterior so mass-driven coffins (hopefully) have - less friction - - bugfix: Adds a fan to the chapel driver - - bugfix: The Janitor missed a few spots around the newly renovated Maintenance - Garden - - bugfix: Readjusts positioning of Delta's QM keycard device - - bugfix: 'Cleaned up a few spots I missed in #9356, particularly around the janitor''s - office' - - rscadd: Adds some potted plants around Box Station - - bugfix: 'The tile mentioned in #9409 should now be radiation-free.' - Fermi: - - bugfix: Fixes tiny runaway decimals in reagents system. - - bugfix: 'SDGF: Fixes infinite clones.' - - bugfix: fixed an angery PR - Fermis: - - rscadd: Added a panda simplemob - - bugfix: fixes empathy exploit. - - rscadd: Added the secbat, a box to hold it and the ability to dispense it from - the SecTech vendor. - - rscadd: Adds 3 new music tracks. - - tweak: tweaked Neurotoxin - - balance: added more depth to Neurotoxin - - bugfix: fixed the inability to create Neurotoxin - - bugfix: fixes fermichem reactions for tiny volumes work - - tweak: makes quantisation level for chemistry finer - - tweak: re-enables femichem explosions in grenades. - - tweak: adds nuance to the SDGF and hatmium explosions. - - bugfix: Fixes analyse function on ChemMasters to correctly display purity. - - bugfix: Fixes the custom transfer for buffer to beaker button. - - rscadd: 'Debug option: Generate Wikichems' - - rscadd: graft synthtissue surgery, new reagent synthtissue - - tweak: 'neurine fixes brain objs merge: combines fermichem''s lung damage with - tg''s' - - rscadd: on_mob_dead(), bitflags and CHECK_MULTIPLE_BITFIELDS - - refactor: refactored fermichem vars, moved impure chems into their own reagents - subtype - - bugfix: Fixes small residues of chems that won't go away! - - tweak: tweaked beaker health and allows use of syringes/droppers on chem_heaters - - soundadd: added a sound for when beakers take temperature damage. - - imageadd: added some icons for melting beakers - - refactor: refactored how beakers take damage - - bugfix: fixes how beakers would only take one instance of damage on pH damage - - bugfix: fixes Janitor grenades. - - bugfix: fixes reaction mechanics at low volumes - - bugfix: stops reactions constantly bubbling on the edge of reaction temperature - - bugfix: stops small amount reactions from occurring, and prevents disappearing - tiny numbers - - tweak: Reduced minimum reaction volume from 1 to 0.01 - - refactor: cleaned up Fermichem - - rscadd: Adds Jacqueline the Pumpqueen and her familiar Bartholomew for the spooky - season - - soundadd: Adds a giggle - - imageadd: 'Adds cauldron, Jacq and Jacq o lanterns, and a costume for halloween! - mapedit: adds a new landmark so Bartholomew can spawn somewhere sensible.' - - bugfix: fixes food reactions and explosion runtimes, - - bugfix: fixes the too much yes problem - - bugfix: Heart, Tongue and stomach regen. - - bugfix: lung damage threshholds. - - bugfix: Graft synthtissue - - bugfix: Skeleton's burning for no reason - - bugfix: Organ freezing handling. - - bugfix: Fixes chemistry books to point to the right wiki, and keeps tg's just - in case - - tweak: Changes top right wiki button location to go to both wikis - - bugfix: fixed Jacq's fondness for the AI - Ghom: - - code_imp: minor clean up on hydroponics reagent containers. - - bugfix: fixes the perpetual lack of moisture that has affected genitalia descriptions - since, like, forever. - - rscadd: implements the arousal state for mammary glands. - Ghommie: - - bugfix: Fixes many possible situations of null icons for cit races' bodyparts. - - imagedel: Removes duplicate slimepeople' sprites. - - code_imp: Purges that draw_citadel_parts(). - - code_imp: Fixes ISINRANGE_EX using the wrong relational operator. - - tweak: The kindle status effect stun duration now properly proportional to the - owner's remaining health. - - tweak: Clockwork cult's kindle now affects silicons. - - tweak: Cyborg mounted disablers/tasers/lasers now slowly self-recharge off the - cyborg user's power cell instead of draining from it directly. - - tweak: Borg rechargers now properly recharge the borg module's energy guns. - - bugfix: Prevents a couple more special/mounted guns from being preserved on cryo - - balance: Halved borg energy guns self-recharge delay and increased their cell - capacity by 3/4 - - bugfix: Fixes chemical patches always checking the suit slot even if the targetted - limb was the head. - - bugfix: Skeleton, nightmare and golem races are once again available to get chemical - patches applied onto. - - rscadd: Adds two cartons of space milk to the space skellie pirates cutter's fridge. - - refactor: Refactored implants to not be located inside mobs codewise, akin to - organs. - - bugfix: Fixed gps tracking implants. - - bugfix: Fixed item not being dumped out of storage implants onto the owner's turf - upon removal. - - bugfix: Fixes cult potentially stalling if the target is erased from existence - without being sacced. - - balance: Nukes the stunprod's 3 seconds delay. - - bugfix: Fixes teleprods. - - bugfix: Stops pulls of resting mobs breaking off whenever you swap turfs with - someone else because of crawling delays. - - bugfix: fixes IAA. - - balance: EMPs now flick off stunbatons, they can be turned back on immediately - by the user anyway. - - balance: Stunbatons now very slowly consume charge whilst kept on, at a rate of - 4/1000th of a standard batoning charge cost per tick. - - balance: Softened up the charge cost checks to stop the above update from practically - reducing the maximum uses of a stun baton by one. Now, should the remaining - charge be lower than the hit cost, the resulting stun will be be proportional - to the remaining charge divided by the hitcost, within a limit under which the - stun batoning just won't happen. - - balance: Buffs condensed capsaicin, a yet another feature previously dunked by - stam combat. - - balance: speeds up pepper spray puffs. - - balance: Buffed krav maga leg sweep stun and stamina damage. On the other hand, - it's now unable to be used on already lying targets. - - bugfix: fixes eyestabbing people with cutlery while being a pacifist. - - bugfix: Reduces goonchat lag from being blasted by pellets and bullets repeatedly - whilst wearing armor by properly removing the armor protection texts this times. - - spellcheck: also reduced the size of armor protection messages in general. they - clog up the chat box. - - bugfix: Fixes stunbatons icon not properly updating on cell removal and insertion. - - tweak: Allows lower charge cells to be used with stun batons, and thus single - use crapshots batons. - - balance: Adds in a 7 seconds delay to the jackhammer dismantling a superheated - clockwork wall. - - tweak: escape pods emergency suits storage can now be busted open by emags or - excessive damage. - - bugfix: Fixes alt click bypassing the escape pods' suits storage lock. - - bugfix: Fixes emags wasting charges on un-emaggable & co stuff. - - code_imp: Ported some radials code updates. - - rscadd: Ported the RCL wiring menu and a comfier RCD interface. - - tweak: A milder combat stance message will show up if the user switch combat mode - on while on help intent. - - spellcheck: Properly rewords the extinguisher's instructions on how to empty it - on the floor since it was changed to be a screwdriver action instead of Alt - Click a while ago. - - rscadd: Reskinnable PDAs. A related game preference. - - refactor: Refactoring the pda, pda painter, obj reskinning and chameleon pda a - bit to support this feature. - - imageadd: more PDA sprites and ported reskins. - - refactor: turned virtual reality into a component datum, which is then applied - to spawned virtual mobs. This fixes mob transformations (such as wabbajack and - monkeyizing) breaking the previously hardcoded behaviour and trapping you in - VR, also enabling a more concrete virtual reality inception experience. - - bugfix: Fixes power cells being unable to be rigged. Also prevents them from starting - processing on init if they don't self recharge. - - bugfix: Fixes many, little or otherwise, issues with the stunbaton status refactor. - - bugfix: The sacrificial target icon will now display onto the cult objective ui - alert once again. - - bugfix: Stopping borgs from sprinting into negative cell charge. - - tweak: The default amount of z-levels reserved specifically for space ruin generation - has been increased from 1 to 2 - - tweak: 'Moving some tablecrafting recipes to the appropriate categories: Kitty - ears and lizard cloche hats to "clothing"; Hot dogs to "Sandwichs"; Cuban carb, - fish and chips and fish fingers to "Fish".' - - bugfix: Fixes the not-a-sandwich recipe being M.I.A. - - rscadd: Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, - and the PB&J sandwich. The peanuts contain a little bit of extractable cooking - oil (similarly to soy beans) and can be microwaved or dried in a drying rack - to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut - butter, required to make those sandwiches. - - balance: Buffed wizard and artificier's Magic Missile, wizard and xeno queen's - Repulse and juggernaut's Gauntlet Echo. - - bugfix: Fixes flashlights being unable to be used for rudimentary eyes and mouth - exams. - - rscadd: Adds in a grey jumpsuit to the loadout choices, restricted to Assistants. - - bugfix: Fixes CWC construct shells being visible as ghost role to latejoiners. - - imageadd: new sprites for the flechette gun, its magazines and the toy ray gun - - tweak: Merges the end-of-shift and its shuttle autocall announcements into one. - - bugfix: Prevents the end-of-shift shuttle from being recalled (even if to no avail). - - bugfix: Fixes being able to teleport papers to your location with TK. - - bugfix: Fixed some monkey-code shenanigeans making items sometimes disappear from - pickpocketing. - - imageadd: New sprites for the some pda cartridges. - - tweak: The crew monitor's entry for the Quartermaster will now appear bolded, - while HoP's will be of the same color of the service/unknown/other jobs. - - bugfix: emergency pods' storage will now properly work. - - bugfix: The PDA skin preference will now properly save up. - - tweak: Changed the default PDA icon var to match the default PDA skin preference. - - bugfix: Fixing the `(pointless) badassary` category appearing between the `dangerous - and conspicious` and `stealthy and inconspicious` categories. - - bugfix: Combat gloves plus now properly use the combat gloves sprite. - - bugfix: Fixes the space ninja's energy netting. - - rscadd: Adding one pAI to the wizard shuttle and ERT prep room - - bugfix: Fixes the rocket launcher being unreloadable. - - balance: Buffed its accuracy a bit. - - tweak: Replaced the grenade launcher emagged minesweeper loot with the rocket - launcher like it was originally supposed to be. - - imageadd: 'Tweaked the :b: emoji.' - - rscadd: Rubber Toolboxes. - - rscadd: 'Porting in two bar signs: Cyber Sylph''s and Meow Mix.' - - bugfix: Fixing stamina damage melee weaponry being unusable by pacifists, and - still damaging objects and triggering electrified grilles when thrown. - - refactor: refactored underwears to allow custom color preferences, instead of - manually colored sprites. - - rscdel: The aforementioned manually colored pieces. Some of your char preferences - may have been resetted as result. - - rscadd: 'More underwear choices, including: Bowling shirts, long johns, a tank - top, fishnets, more bee socks, bee t-shirt and bee boxers (original PR for the - latter three by nemvar from /tg/station).' - - tweak: random bodies will now have random underwear again. - - bugfix: Dressers will now properly change undergarment again. - - tweak: Toned down many species' female chest sprites to fit the smaller cups. - - bugfix: Fixed some body parts sprites inconsistencies, such as the W/E female - and male chest sprites being the same in some species, and jellypeople's legs - being one tile off on W/E - - bugfix: Fixing baklava pies a bit. - - tweak: Sweaters now cover groins too. - - balance: Improved the zelus flask to be more viable for bottle smashing than the - average barman's selection. - - code_imp: Very slight bottle smashing code clean up, stupid const vars. - - bugfix: Fixes krav maga gloves, wizard spells knockdowns. - - tweak: Added in an alert pop up to the cult convertees, on top of the older "click - here to become a blood cultist" chat message. - - tweak: The convertee's screen will now flash red to fit in the aforementioned - message's fluff. - - spellcheck: Made said message less verbose. - - rscadd: Towels. Crafted with 3 sheets of cloth, they can be worn on head, suit - and belt slots even without uniform, or laid flat on the floor. Sprites from - Baystation and Aurora Station. - - rscadd: You can combat mode right click people while wielding rags and towels - to pat out their flames (to no use for rags) or otherwise drying them out. - - balance: toned down the stamina costs of some of the bulkier weapons. - - code_imp: repathed hypereutactic blades to be a subtype of dual sabers. Way less - copypasta. - - bugfix: Fixing CX Shredder guns not accepting standard flechette mags. - - bugfix: Fixing missing magpistol magazines icon states. - - rscadd: sort of overhauled darkmode/lightmode to /vg/station's, also reincluding - the pre-existing black'n'white theme. - - bugfix: Fixed LOOC color, fixed .userlove and .love span classes being a bit too - blurry on dark mode. - - rscadd: The syndicate base's bathroom is now fitted with a shower, and a special - towel. - - bugfix: Fixed many issues with towels. - - tweak: The dry people off with rags/towels action can only be done if the object - is NOT moist with reagents now. Also cleans banana creaming. - - rscadd: Towels deal more damage while soaked with reagents. - - rscadd: You can now squeeze rags/towels with Alt-Click. - - rscdel: deleted an old and crappier towel sprite that got in the way. - - bugfix: Fixes Pubby's disposal conveyor belts and lack of a second lawyer spawner. - - code_imp: Cleaned up the absolute state of the arousal module. - - refactor: refactored exhibitionism into a quirk. - - tweak: arousal states won't persist after death. - - bugfix: Fixes testicles size adjective thing. - - bugfix: undergarments toggling now works instead of just making underwear disappear - and not come back. - - tweak: The "Always visible" genitals setting will now display them above clothes. - - bugfix: combat pushes will now properly stop targets from using firearms, and - will disarm the firearm if performed a second time, and also slow down people - by 15%, and won't push people on tables blocked by shutters or other dense object - anymore. - - bugfix: Fixes CHECK_BITFIELD macro. - - bugfix: Fixes hypovials being unable to transfer out liquids or be refilled by - large dispensers like water tanks. - - bugfix: Fixes chem-masters machineries not dispensing newly made pills inside - loaded in pill bottles. - - rscadd: Stunswords now fit in the captain's sabre sheat. - - rscadd: reworked ninja's stealth mode. Increased invisibility, but engaging in - combat, attacking or throwing things, bumping people will temporarily lower - it. - - rscadd: Ninja shoes are even stealthier. - - code_imp: cleaned up some 2014 tier processing code horror. - - tweak: the oxyloss fullscreen overlays now also take in consideration 1/5 of the - user stamina loss. - - rscadd: When you're jogging, you will only slip on water if you have more than - 20% staminaloss, for real this time. - - imageadd: Different cuffs now come with different worn overlays instead of a generic - one. - - bugfix: High luminosity eyes can now be properly deactivated and won't illuminate - your surroundings again until turned back on. - - bugfix: Fixes freshly cloned people starting with undershirts. Fixes random characters - possibly rolling with undergarments of the opposite gender (Doesn't affect preferences' - freedom of choice). - - balance: MRE menu 3 has cuban nachos instead of a chili now. - - bugfix: Removed the illustration overlay from MREs, looks pretty weird otherwise. - - rscadd: MRE menu 4, vegetarian. - - bugfix: fixes a few bad touchs on combat mode pushing. - - bugfix: Fixes clock cult Abscond scripture not dragging pulled mobs into Reebe. - Also fixes blood cult tele runes teleporting you from the source turf to the - source turf. - - bugfix: fixes clock cult mass recall. - - bugfix: Fixes underwear colors a bit. - - bugfix: Fixes Blood Cult conversion prompts - - rscdel: Removes an obnoxious temporary overlay var. - - bugfix: colorable socks can be colored again. - - bugfix: Fixed undergarments color preferences resetting each round. - - bugfix: Fixed a few dozen suits' body coverage inconsistencies. These changes - shouldn't affect armor and utility vests for most. - - bugfix: Fixed clown shoes and work boots. - - bugfix: Fixed some overlay bug that happens when legcuffed and then handcuffed. - - balance: Slowed down police baton and tele baton speed by 75%, should be still - be faster than the legacy speed (2 seconds) by 0.6 seconds. Telescopic batons' - stamina cost per swing is now on par with police batons, ergo more expensive. - - bugfix: Fixed undershirts n socks colors prefs. - - bugfix: You can now alt-click to rotate machinery such as the tachyon-droppler - array or emitters again. - - bugfix: Sofas can't be wielded and transformed back into plain chairs anymore. - - rscadd: Enables emojis for PDA messages. - - balance: Removes revenant blight's shabby toxin damage in favor of mood maluses, - and a dangerous necropolis curse if not cured in time. Remember - - tweak: Blood cult altar, forge and archives now use radial menus. - - bugfix: Fixed some machineries' UIs. - - tweak: blood and clock cultists messages from metabolizing - - bugfix: Fixed advanced medical scanners borg upgrades. - - bugfix: Fixes certain borg upgrades being unapplicable on dogborg counterparts - of the target cyborg type. - - bugfix: Fixed people being shovable hrough windows, windoors and the such. - - rscadd: You can now shove people into disposal bins. - - refactor: refactored altdisarm(), ergo the "shoving people around" proc. - - tweak: war ops is now lowpop friendly and doesn't require roughly 54 starting - players anymore. - - rscadd: Singularity beacons now also moderately increases the odds meteor waves, - while lowering their estimeed arrival countdown. - - bugfix: non-alphanumeric graffiti decals will no longer display as "letter". - - balance: Nerfs cyborg disabler and its internal power cell to hold 25 disabler - beam shots rather than 43/44, just like a normal disabler. - - bugfix: Adds some missing species_traits for cloth, clockwork and cult golems. - - rscadd: Added towel linen bins, found in dormitory restrooms. Also enhanced the - bedsheet bins found in some stations' dormitories - - imageadd: Resprited bedsheet bins in 3/4 perspective - - tweak: Made SDGF ghost poll message less verbose, made the experimental cloner's - complaint with the former, and added ghost poll ignore options for both. - - bugfix: fixing some related onmob sprites issues with the above accessory. - - bugfix: Teleprods work on non-carbons mobs now. - - bugfix: Fixed tracking implant teleport issues. - - balance: Increased stunbatons power cell depletion rate when left on by 50%. - - bugfix: Gorlex Marauders are pleased to announce non-slip grooves were given to - their .50 sniper rifles, and thus shouldn't accidentally flop on the floor like - pocket spaghettis whenever taken out of a bag anymore. - - bugfix: Silicons can now operate teleporter, medical and security records console - from a distance again. - - bugfix: Fixed custom say emotes conflict with drunk memes. - - bugfix: Fixes identity transfer (envy knife, changeling transformation, making - a vr avatar) not copying digitigrade legs. - - bugfix: Fixes temporary transformation sting triggering heart attacks on heartless - humans. - - bugfix: Fixed mobs folded inside bluespace bodybags getting their clothing and - items deleted when passing through a recycler. - - bugfix: The alien-bursting-from-your-thorax and the xeno "hud" embryo stage images - will now properly delete them once the embryo egg lifecycle is complete. - - bugfix: Fixed artificier lesser magic missile. - - bugfix: Phantom thief masks will now fancy your combat mode yet again. - - bugfix: Fixed gulag teleporter stripping the user of stuff it really shouldn't - (like storage implant bags). - - bugfix: fixing cydonian armor a bit. - - imageadd: Resprited wooden and critter crates. - - imageadd: Improved the Cyber Sylph' good yet cumbersome bar sign a little. - - bugfix: Cyborgs can now use camera consoles on the edge of their widescreen. These - consoles are also TK friendly now. - - imageadd: Updated gang dominator sprites. - - bugfix: Miner borgs can again have installed PKA mods. - - bugfix: Fixed invisible blackberry n strawberry chocolate cake slices. - - bugfix: Nuke ops / adminbus combat mechs will no longer spawn with tracking beacons. - - imageadd: Arcade machine directional sprites. - - tweak: 'lowered the arcade''s random plush / other prizes ratio from 1 : 2.5 circa - to 1 : 5. Dehydratated carps and the awakened plush can not be achieved this - way anymore.' - - imageadd: Added armrests overlays to sofas and tweaked their sprites a little. - - bugfix: Fixed dogborg sleepers. Just don't tell me what is exactly fixed, cause - I don't want to find out. - - bugfix: Buffed the deep space familiar gorilla against runtimes. - - imageadd: Updated ratvarian computer sprites. - - bugfix: Fixed storage implant transplant. - - bugfix: Refactored how Jacqueen teleportation destination is selected, preventing - them from teleporting on off-station holopads. - Ghommie && Kevinz000: - - balance: Lichdom and necromantic stone skeletons are now of the spaceproof kind - too. - - tweak: skeletons now also like dairy products. - - rscdel: Halloween roundstart skeletons and zombies are no more spaceproof. - - rscadd: You can choose to set your species to zombie or skeleton through the pride - mirror yet again, Alas they are not of the spaceproof kind either. - Ghommie (Credits to Kmc2000 for the original PR): - - rscadd: Porting in MRE boxes from Yogstation. But be careful, eating possibly - expired MREs found in maintenance comes with an unrealistically large (actually - small) chance of food poisoning. Otherwise just bail out and order actually - safe-to-eat MREs from cargo for 2000 credits. - Ghommie (Original PR by Dennok): - - bugfix: Now areas_in_z get areas spawned by templates and blueprints. - Ghommie (Original PR by Dreamweaver): - - rscadd: Nanotrasen has received word of a high-tech research facility that may - contain advancements in bluespace-based research. Any crew members who become - aware of its whereabouts are to report it to CentCom immediately and are restricted - from sharing said info. - - refactor: The turf reservation system now dynamically creates new z levels if - the current reserved levels are full. - Ghommie (Original PR by JJRcop): - - rscadd: 'Ports in more emojis, including : flushed :' - Ghommie (Original PR by LaKiller8): - - bugfix: Goonchat options should now save properly. - Ghommie (Original PR by Vile Beggar): - - rscadd: Warden now has an added drill hat in his locker. You can change the loudness - setting of it by using a screwdriver on it. Use wirecutters on it for a surprise. - Ghommie (Original PR by coiax): - - refactor: atom/var/container_type has been moved into datum/reagents/var/reagents_holder_flags. - There should be no visible changes to effects. - Ghommie (Original PR by nemvar): - - rscadd: Botanists can now get beeplushies (or cultivator and bucket) as an heirloom. - - bugfix: Clowns and mimes will now properly pick either a can of paint or their - brand as heirloom now. - Ghommie (Original PR by tralezab): - - bugfix: Fixes an issue with spontaneous appendicitis picking incompatible mob - biotypes. - Ghommie (Original PRs by Tortellini Tony and BuffEngineering): - - bugfix: E-cigs will continue to display their setting after being emagged. - - bugfix: Vapes now come out of the mouth. fix Fixes an E-cig initialize() runtime. - Ghommie (Original PRs by nemvar and Rowell): - - rscadd: Added beekini bras and panties, thigh-high and knee-high bee socks. - Ghommie (by Arkatos): - - bugfix: Fixed an issue with a Lizardwine drink crafting, where a final product - would contain unwated 100u of Ethanol. - Ghommie (by Floyd / Qustinnus, Arathian): - - rscadd: The robotocist now has robe to show his love for toasters - Ghommie (by nemvar): - - tweak: Dwarfs are now more robust. - Ghommie (original PR by 4dplanner): - - bugfix: thrown objects (but not mobs) no longer hit the thrower - - bugfix: mirror shield rebound no longer depends on the original thrower's momentum - Ghommie (original PR by 81Denton, kriskog and nemvar): - - spellcheck: Sleepers now show a message if players try to unscrew the maintenance - hatch while they're occupied or open. Fixed typos in sleeper/organ harvester - messages. - - tweak: Sleepers and dna scanners can now be pried open with crowbars. - - tweak: You can open and close sleepers and dna scanners by alt-clicking them. - - bugfix: The scanner's hatch now must be closed (on top of being unoccupied), just - like sleepers, before being screwdriverable. This fixes a tricky door stuck - issue with the machine. - Ghommie (original PR by AffectedArc07 and Shazbot): - - imageadd: Added 8 new sock styles - Ghommie (original PR by AffectedArc07): - - tweak: Religion is now a globalvar instead of being a subsystem for some reason - Ghommie (original PR by AnturK): - - bugfix: Supermatter now melt walls if it finds itself in one. - Ghommie (original PR by Anturk): - - rscadd: Recipe for fabled secret sauce can now be found in the deepest reaches - of space. - Ghommie (original PR by Barhandar: - - bugfix: Pumpkin meteors on Halloween now replace catastrophic meteor waves, instead - of ALL OF THEM. - Ghommie (original PR by CrazyClown12): - - tweak: The chloral hydrate inside of the sleepy pen is no longer slower acting - than chloral hydrate made in chemistry. - - tweak: The chloral hydrate inside of cookies synthesised by emagged borgs is no - longer slower acting than chloral hydrate made in chemistry. - - balance: Slight tirizene buff. - - rscdel: Delayed chloral hydrate - Ghommie (original PR by Denton): - - tweak: Nanotrasen has started shipping more types of bedsheets to its stations. - - rscadd: Added in Runtime, Pirate and Gondola bedsheets. The second one can also - be found in some pirate ships, while the last can be crafted from gondola hides. - - balance: You can no longer reveal the 'illegal tech' research node by deconstructing - .357 speedloaders, riot dart boxes, syndicate cigarettes, syndicate playing - cards or syndicate balloons. - Ghommie (original PR by Mickyan): - - bugfix: Fixed being unable to smother people using the damp rag - Ghommie (original PR by MrDoomBringer): - - bugfix: morgues have had their proton packs removed and as such no longer suck - in ghosts on closing. - Ghommie (original PR by MrDoomBringer, AnturK and YPOQ): - - bugfix: Explosions will no longer damage wizards in rod form, the supermatter - monitoring radio and megafauna GPS. - - bugfix: Supplypods no longer detonate their contents. - - bugfix: Fixed silicon items (e.g. cyborg modules) being destroyed by explosion - epicenters. - Ghommie (original PR by Naksu): - - code_imp: get_area() is now a define rather than a proc. - Ghommie (original PR by Nicjh): - - rscadd: Abductor console's select disguise option now uses a radial - Ghommie (original PR by ShizCalev): - - bugfix: Pineapple haters/lovers will get/no longer get pineapple pizzas respectively - from infinite pizza boxes. - - bugfix: As a non-human mob, hovering your cursor over an inventory slot while - holding an object in your active hand shouldn't runtime now. - Ghommie (original PR by Skoglol): - - code_imp: New helper proc for alt-click turf listing, bypasses any interaction - overrides. - - code_imp: Ghosts and revenants now use the new proc. - - bugfix: Ghosts can no longer toggleopen sleepers, adjust skateboard speed or close - laptops - - bugfix: Revenant can now alt-click turf to list contents. - - tweak: Revenant now slightly less nosy, use shift click to examine. - - tweak: Alt-clicking the same turf again no longer closes the turf listing tab. - - bugfix: Reduced ventcrawl lag greatly. - - bugfix: Mining bags will no longer drop ore into backpack. - - bugfix: Mining bags in backpack no longer interferes with other mining bags. - - bugfix: Fixes some storage size circumventions. - - tweak: Moved machine and computer frames below objects, parts are now always on - top. - - tweak: Moved structures (chairs, closets, windows, cult altars etc etc) below - objects. - - tweak: Moves mineral doors to airlock layers - - tweak: morgue/crematorium trays' layers shouldn't overlap bodybags' anymore. - Ghommie (original PR by SpaceManiac): - - bugfix: Disassembling a chem dispenser for the first time will no longer always - yield a fully-charged cell. - Ghommie (original PR by Swindly): - - rscadd: Arm-mounted implants that contain more than one item use a radial menu - instead of a list menu. - Ghommie (original PR by Tlaltecuhtli): - - bugfix: Other people's clothes burning no longer spam you - Ghommie (original PR by XDTM): - - bugfix: Reagents now stop their passive effects (for example, stun immunity) if - the liver stops working while they're active. - Ghommie (original PR by YPOQ): - - bugfix: Fixing roffle waffle, mushroom halluginogen and some invalid reagents. - - bugfix: Fixes clockwork armor not actually having armor. - Ghommie (original PR by cacogen): - - rscadd: The font size of all text in the chat window now scales - - tweak: High volume (megaphone/head of staff headset) is a slightly smaller - - tweak: Admins have slightly larger OOC text - Ghommie (original PR by coiax): - - code_imp: Randomly coloured gloves and randomly coloured glowsticks now have slightly - different typepaths, but otherwise function the same. - - code_imp: The Squeak subsystem has been renamed to Minor Mapping. - Ghommie (original PR by duckay): - - rscadd: Added better names and descriptions for blueshirt officer gear. - - rscadd: Added the above gear to the premium selection of the sectech - Ghommie (original PR by harmonyn): - - balance: Resisting out of bucklecuffs takes more/less time depending on the handcuffs - you used, i.e., fake handcuffs will not bucklecuff someone for ages. - - tweak: fake handcuffs shouldn't no longer demoralize restrained criminals scums. - Ghommie (original PR by monster860): - - bugfix: fixes advanced proccall - Ghommie (original PR by mrhugo13 on tgstation13): - - rscadd: The Syndicate has decided to equip their Syndicate leaders operative (Aswell - as their clown counterparts) with the new Combat Glove Plus! The new Combat - Glove Plus does everything the old boring Combat Gloves does but with the added - extra of learning Krav Maga upon wearing them, any other Syndicate operative - who wants to get in on the action will have to pay 5tc. - Ghommie (original PR by nemvar): - - imageadd: Some drinks have new icons or slightly altered icons. In particular - Wizz Fizz, Bug Spray, Jack Rose, Champagne and Applejack. - Ghommie (original PR by ninjanomnom): - - bugfix: Orbiting is a little more aggressive about staying in orbit. The wisp - as a result now correctly follows you over shuttle moves. - - bugfix: Gaps between sounds in some looping sound effects should no longer happen - as much under heavy server lag. - Ghommie (original PR by variableundefined): - - bugfix: Cancel button to assault pod destination selector. - Ghommie (original PR by wesoda25): - - balance: disembowelment no longer works on mobs that aren't dead or in critical - condition - Ghommie (original PRs by Akrilla, Arkatos and Denton): - - tweak: Sprays cans have a cap on how dark you can make objects. Art is uneffected. - - bugfix: Fixed a bug where you could get cyborg spraycans via pyrite extracts. - - rscadd: Added an infinite spraycan for admins to spawn. - Ghommie (original PRs by Denton and Skoglol): - - tweak: Reorganized the syndicate uplinks. Items are now mostly alphabetical, some - misplaced items moved to more fitting categories. Bundles, random item and TC - have been moved into a new category called "Bundles and Telecrystals". Gloves - of the North Star and Box of Throwing Weapons have been moved to Conspicuous - and Dangerous Weapons. Combat Gloves Plus have been moved to Stealthy and Inconspicuous - Weapons. Moved all implants into the Implants category. - - tweak: 'Added a new category to the uplink: Grenades and Explosives.' - Ghommie (original PRs by Floyd/Qustinnus, optimumtact, Denton and coiax): - - rscadd: You can now select what your pills will look like when making pills from - the Chem Master - - rscadd: Red pills can make you think. - Ghommie (original PRs by Jujumatic and PKPenguin321, respectively): - - rscadd: Minesweeper Arcade machines. The higher the difficulty setting, the better - the prizes will be. - - rscadd: Also keep your eye out for another new (and rare) arcade game! - Ghommie (original PRs by Kmc2000 and actioninja): - - rscadd: Added darkmode! You can opt-in to this by clicking the new toggle darkmode - button just beside the settings one. - - rscadd: Byond members will now have a new setting for their Antag OOC color, instead - of using their OOC one. (Antag OOC still locked under admin discretion though) - - rscdel: Default black'n'white windows style. - Ghommie (original PRs by Mickyan, Anturk, ShizCalev, nemvar and Naksu): - - rscadd: After rigorous mandatory art training for the crew, many new graffiti - styles are now available - - bugfix: Cleaned up some crayon and spraycan code for futureproofing. - - bugfix: Spraypainting blast doors no longer makes them see-through. - - balance: Paint remover now works on blast doors and the like. - - rscadd: Most objects can now be colored using a spray can. - - spellcheck: Added visible message to spraying objects and windows. - - rscadd: Colored lights now shine in different colours. - - rscdel: Removed individual buttons text in crayon/spraycan UI, speeding it up. - - bugfix: Text mode buffer is actually visible in the UI. - - tweak: Last letter of a text mode buffer no longer rotates out to be replaced - with "a", allowing the text mode to be used for individual symbols. - Ghommie (original PRs by Naksu and XDTM): - - bugfix: Transferring quirks now properly removes the roundstart trait from the - person losing the quirk. - - bugfix: Roundstart traits no longer block the removal of other sources of that - trait. - - code_imp: status traits are now a datum var, the accessors are now defines rather - than functions. - Ghommie (original PRs by Naksu and coiax, loser): - - code_imp: Cleaned up saycode - - bugfix: Taking mutadone while having the communication disorder brain trauma will - no longer spam your chat with messages. - - rscadd: IPCs now come with a subtype of robotic tongue without the omnilingual - ability, instead of innately having robotic voice spans. - Ghommie (original PRs by Nichlas0010 and ShizCalev): - - tweak: AI core display screen can now be set in character preferences. - - bugfix: AI core display screen will now be restore when revived. - - spellcheck: Corrected some inconsistent capitalization in the player preferences - screen. - - imageadd: Readded some forgotten AI sprites. - - bugfix: Fixed Hades AI death animation not playing. - - tweak: the AI icon-selection menu now uses a radial. - - imageadd: Added in the death icon_states for the "TechDemon" AI screen. - Ghommie (original PRs by ShizCalev and bobbahbrown): - - rscadd: Headsets now dynamically show in their description how to speak on any - channels they can use when held or worn. - - code_imp: Radio channels names and keys now use defines. - - tweak: The head arrival announcement will now be broadcast to the supply for the - quartermaster. - Ghommie (original PRs by ShizCalev): - - bugfix: Fixed a bug that allowed you to teleport an ID in your possession to a - PDA anywhere ingame. - - bugfix: Fixed an exploit allowing you to steal ID's/pens from PDA's not in your - possession. - - bugfix: Fixed an exploit allowing you unlimited control of a PDA's interface even - if it wasn't near you/in your possession. - - bugfix: Fixed Pride Mirror exploits. - - tweak: Corgi collars can now be removed! - - tweak: Updated the corgi & parrot inventory panels to use the same formatting - as other mobs - - bugfix: Fixed corgi inventory panels not closing properly. - - bugfix: Fixed the parrot inventory panel not closing properly if you're not able - to interact with it. - Ghommie (original PRs by ShizCalev, MrDoombringer, AnturK, bgobandit, 81Denton and actioninja): - - rscadd: Failsafe codes for uplinks are now available for purchase. - - rscadd: Nuke Ops now have the ability to purchase a usable RPG, the PML-9, as - well as a couple different types of rockets for it. you can also suicide rocket - jump with them! - - spellcheck: Improved Uplink item descriptions and formatting. - Ghommie (original PRs by ShizCalev, coiax and Tlaltecuhtli): - - bugfix: Caks will no longer override the bonus reagents provided in a donut when - frosting them. - - bugfix: Caks can no longer create frosted frosted jelly donuts. - - bugfix: Jelly donuts will no longer lose their vitamins when they're frosted. - - bugfix: Fixed chaos donuts potentially doubling the amount of reagents added when - microwaved with something else. - - bugfix: Donuts now always contain 1 sprinkles as was stated on the wiki. Frosted - donuts have a chance at adding an extra sprinkle. - - code_imp: Improved the code for ensuring that security members enjoy donuts and - security-themed alcoholic drinks. - - balance: neurotoxin doesnt insta stun but gives you limb paralysis overtime and - heart attacks if it stays in for too long and it is also alcholic - - balance: beepsky smash now summons imaginary beepskys that deal stamina damage - instead of outright stunning - Ghommie (original PRs by Time-Green and Qustinnus): - - tweak: loot crates can't explode after unlocking anymore - - bugfix: jumping into loot crates no longers causes them to go boom - - bugfix: You can now deconstruct abandoned crates with a welder without making - them go boom. After unlocking them, of course. - Ghommie (original PRs by Tlaltecuhtli and nicbn): - - rscadd: alt click to eject beakers from chem masters + chem dispensers + grinders - + chem heaters - - rscadd: hit chem master + chem dispenser + chem heaters with a beaker and if its - loaded with another it swaps em - - rscadd: All-In-One Blender UI uses a radial menu now. You can see the contents - and reagents by examining. - Ghommie (original PRs by XDTM, 4dplanner, nemvar and, yes, myself): - - code_imp: Merged tinfoil hat kind of protection into the anti_magic component. - - rscadd: Tinfoil hats can also be warped up from excessive dampening of mindray/though - control/psicotronic anomalies, or by simply being microwaved in an oven, and - become useless. - - rscadd: Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil - protection too (minus the paranoia and limited charges). - - balance: Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil - protection. - Ghommie (original PRs by XDTM, optimumtact, Nichlas0010 and monster860): - - rscadd: 'Added Quantum Keycards, devices that can link to a quantum pad, and can - be used on any other quantum pad to teleport to its linked pad. spellchecking: - Renamed "Bluespace Teleportation Tech" tech node to "Bluespace Travel".' - - tweak: Moved roasting sticks from the "Bluespace Travel" to "Practical Bluespace". - - rscadd: Spraying holy water on tiles will now prevent cult-based teleportation - from using them as a destination point. - - tweak: Quantum, wormhole and magic teleportation is no longer disrupted by bags - of holding. - - bugfix: You are now also blocked from teleporting IN to no-teleport areas, not - just out of them. - - tweak: Quantum teleportation now makes pretty rainbow sparks instead of the normal - ones. - - bugfix: Non-bluespace teleportation (spells etc.) no longer makes sparks. - - bugfix: Fixed teleportation deleting mob spawners like golem shells and ashwalker - eggs. - ? Ghommie (original PRs by carshalash, GranpaWalton, BebeYoshi & Hexmaniacosanna, - Fire Chance, Ordonis, Krysonism and OnlineGirlfriend) - : - tweak: Reduced booze power of Mead, Red Mead, and Irish Cream. - - tweak: Increased booze power of Grappa. - - rscadd: Added a new premium drink to the soda machine called "Grey Bull" which - gives temporary shock resistance - - rscadd: A new drink called Blank Paper was added to the bar menu, it was made - by a mime and it represents a new start. - - rscadd: 'Adds a variety of fine alcoholic beverages for discerning patrons of - the bar: Wizz Fizz, Bug Spray, Champagne, Applejack, Jack Rose, Turbo, Old - Timer, Rubberneck, Duplex, Trappist Beer, Blazaam and Planet Cracker!' - - rscadd: 'Also more nonalcoholic drinks: Cream Soda, Lemonade and Red Queen.' - - rscadd: Packs of a novel artificial sweetener have been added to the kitchen - vendor. - - rscadd: Bottles of trappist beer and champagne are now available in the premium - seection of the booze-o-mat. - - rscadd: Juicing parsnips now yields parsnip juice. - - rscadd: Maintenance peaches. - - bugfix: Grape soda now cools you down like other sodas. - - tweak: tweaked the Arnold Palmer recipe, it now uses lemonade. - - imageadd: Added new drink, bottle, vomit and peach can sprites. - Ghommie (original PRs by grandpawalton and Mickyan): - - tweak: the contents on the smartfridge icon now change depending on how many items - it contains - - bugfix: opening the maintenance panel of smartfridges now correctly updates the - icon - - bugfix: Screwing a disk compartmentalizer no longer makes it look like a smartfridge. - Ghommie (original PRs by nicbn and coiax): - - rscadd: Microwave UI uses a radial menu now. You can see the contents by examining. - - rscadd: Microwaves have a single wire accessible when open, the activation wire. - When cut, the microwave will no longer function, when pulsed, the microwave - will turn on. - - rscadd: Stabilized dark purple extracts now cook items in your hands, rather than - dropping the cooked item on the floor. - Ghommie (original PRs by ninjanomnom and nemvar): - - bugfix: Trays now scatter their contents when used for attacks, like they are - supposed to. - Ghommie (original PRs by ninjanomnom, coiax, yoyobatty): - - bugfix: Fixed slaughter demons not getting a speed boost when exiting a pool of - blood. Fixed slaughter demon giblets not being visible. - Ghommie (original PRs by subject217, AarontheIdiot, pireamaineach, Gousaid67 and SouDescolado): - - balance: Removed plasmamen species speedmod in favor of a slowdown for envirosuits. - - rscadd: Nanotrasen has began deploying departementalized enviro plasmasuits to - the station! plasmamens can now benefit from some of the bonuses aswell as the - color pattern of their job, while allowing others to easily determine their - profession! - - bugfix: Benevolent Nanotrasen makes gulag available for everyone! (Plasmamen retain - their equipment and don't die.) - - rscdel: Removes code that theoretically limits plasmamen from being clowns and - mimes, but actually doesn't. - Ghommie (original PRs by zeroisthebiggay, AnturK, MrDoomBringer, Cobby, ATHATH, optimumtact, GranpaWalton, Skoglol): - - bugfix: Blob overminds, sentient diseases, etc. can no longer dump out boxes. - Sorry gamers. - - rscadd: Sentient Disease now has almost all symptoms at its disposal. - - code_imp: Adding single-symptom disease abilities is super easy now. - - bugfix: Sentient Disease can now hear (not sure if this was a bug or intentional). - - rscadd: Sentient Disease is a linguist and knows all languages. Still cannot speak. - - tweak: Gives Sentient Diseases a medical hud to observe their victims further - with. - - bugfix: Fixes and moves around some on_stage_change() and Start()-related things - for virus symptoms and (sentient) diseases. - - bugfix: The inorganic biology symptom should work properly now when bought by - a sentient disease. - - bugfix: Oxyloss icon no-longer shows up when someone has the self respiration - symptom - - tweak: The self respiration now makes you not contract diseases through the air - and not breathe in smoke - - bugfix: Sentient diseases can no longer pick two cures that react and disappear - when eaten. - - balance: Sentient disease cures are now consistently harder, will only pick cures - from tier 6 and up. - - bugfix: Disease cures should now stay the same for all infected mobs. - - rscadd: The regenerative coma symptom has a new resistance 4 threshold effect! - Said threshold effect will give hosts of the symptom's virus the TRAIT_STABLECRIT - trait if its threshold is met. - - bugfix: An obscure, probably never reported before bug that may or may not exist - involving sentient diseases and the self-respiration symptom should be fixed - now (if it even existed in the first place). - - balance: The cooldown time between each removal or addition of a symptom for sentient - diseases has been brought down from an agonizingly long 2 minutes to a more - reasonable 1 minute. - Ghommie (original pr by Dennok on tgstation): - - bugfix: Now you don't lose your pulled thing on the z level edge. - GrayRachnid: - - rscadd: Added windoors to all the flaps on delta. - - balance: rebalanced k9dogborgs - Hatterhat: - - rscadd: Magnetic pistols now fit in boot pockets - jackboots, workboots, etc. - - tweak: literally every pistol subtype fits in shoes now. go wild. - Hippie Circuit Port: - - rscadd: Added all Atmospheric Circuits - - rscadd: Added the ability to color data disks - - rscadd: Added Selection and Storage Examiner Circuits - - rscadd: Added Smoke, Extinguisher, and Beaker Connector Circuits - - rscadd: Added Inserter, Renamer, Redescriber, and Repaint Circuits - - rscadd: Added MMI Tank and pAI Connector Circuits (The possibilities are endless!) - Improving and Balancing Cyborgs: - - rscadd: Added Crew Pinpointer to Security Borg - - rscadd: Added Crew Monitor to Medical Borg - - rscadd: Added Crew Pinpointer to MediHound Borg - - tweak: Made the Disabler_Cooler compatible with both Security Borg and K9 Borg - - tweak: Changed the Warning Text upon selecting Security or K9 module - ItzGabby: - - rscadd: Bat Species parts for more leeway for character customization. - - code_imp: Alphabetized decor wing selection window in character creator for simplicity. - JTGSZ: - - tweak: Added one more gang boss slot bringing total to 4 from 3 - - bugfix: Fixed Gang Boss being able to be deconverted - - tweak: Gave Qualifies_for_Rank Check back its checks in job controller. - - rscadd: Optional species based clothing restrictions - - tweak: Gang Dominator excessive wall check tweaked to 25 open turfs - - bugfix: Gang Dominator no longer functions off-station. - - rscadd: Adds more control over species based offsets. - - bugfix: qualifies_for_rank now checks latejoin menu - - rscadd: Added Halloween Dwarves, for Halloween... Yep. - - bugfix: Can flip pipes once more. - - bugfix: barricade girder walls use PlaceOnTop instead of new - Linzolle: - - rscadd: ability to quickly max sensors - - bugfix: atmos helmet visual bug - - bugfix: supply display are now properly on the wall - - tweak: consistency in hop and cap berets - - tweak: slime people now enjoy eating toxic food and it will not disgust them - - bugfix: hos trenchcloak now properly has a sprite on digi characters - - rscdel: duplicate definition of hos and sec skirts - - bugfix: Krav Maga leg sweep now works properly. - - rscadd: shoes can have a different icon used for their item and mob icons - - bugfix: combat gloves plus having no mob icon - - rscadd: inhands sprite for rainbow knife - - tweak: colour of highlight on the regular knife when held in the right hand - - rscadd: mining shuttle console can now be printed after computer consoles have - been researched - - rscadd: can now carry people on your back by aggressive grabbing them while they - are laying down and then dragging their sprite onto yours. - - tweak: dragging people who are prone is now much slower, and carrying them will - allow you to move faster at the cost of taking 5 seconds to lift them up onto - your back. - - tweak: pacifists can now aggressive grab (cannot table slam people though) - - bugfix: blood on your body floating a bit to your right if you're a taur - - bugfix: some suits having no icon on tauric characters - - tweak: front facing CMO hardsuit icon for naga taurs - - tweak: colour of medical cross on CMO hardsuit for taurs - - bugfix: taur body and jumpsuit showing through mining suits - - tweak: all chaplain suits can hold the same items in suit storage - - code_imp: improvement to organisation for chaplain suits - - bugfix: blood halberd not going back to 17 force after unwielding - - spellcheck: unnecessary 's at the end of blood rites healing - - rscadd: QoL to blood rites, examine the ritual aura to view how many blood charges - are left - - code_imp: surgery cleanup - - tweak: dissection available round-start - - rscadd: better dissection surgeries from RnD, gives more points - - rscadd: abductors can now see what glands do - - code_imp: antagonist abductors now have a surgeon trait that teaches them every - surgery rather than having it just check if they're an abductor - - rscadd: muscled veins surgery - - bugfix: having one of your hands used up if you fireman carry but the person being - carried dismounts any way other than you dropping them - - rscadd: Four colour variants of ankle coverings. Select them on the loadout screen. - - imageadd: ankle coverings - - tweak: allows for shoes that don't cover your feet to be taken into account for - footstep sound effects and glass shards - - rscadd: Tend Wounds surgery. Heal in the field, with better healing the more damage - the patient has. - - rscdel: Reconstruction replaced by Tend Wounds - - balance: made Revival more accessible, more viable alternative to cloning. - - bugfix: advanced surgery tools can't perform lobectomy or coronary bypass - - rscadd: Decorative and insect wings can now be coloured individually, similar - to horns. - - bugfix: people getting assigned wings if their savefile is old. - - rscdel: wings that take the hair colour. Unnecessary if you can just set the colour. - - tweak: Cannot make horns pure black. Trying to do so will set it to a default - value. - - bugfix: decorative angel wings being invisible - - bugfix: abductors now actually work - - tweak: abductor scientist has their own greet message now - - bugfix: unable to read paper on airlocks - - tweak: ai can see paper (still just shows stars) - - rscadd: Target head and throw a hat at someone to toss it onto their head, knocking - whatever they're wearing off if they are wearing a hat. Some headgear can't - be knocked off this way. - MediHound: - - rscadd: Made Cyborgs be affected by Ion Storm Law Changes like AIs - MrJWhit: - - balance: rebalance melee stamloss - Multicam Config: - - config: removed whether or not the stuff for multicam was checking the useless - var and instead now checks the CONFIG_GET flag. - - admin: Admins now have a verb in the Server tab to turn AI multicam on and off. - Naksu: - - code_imp: default radiation insulation is now handled by atom vars rather than - a component, components can still be used. - - code_imp: squeezed a little bit more perf out of atmos - Nero1024: - - soundadd: Bare feet will now make the correct footstep sounds. - - soundadd: Other mobs will make the correct footstep sounds. - - soundadd: Crawling/dragging sounds for downed/incapacitated mobs - Onule & Nemvar (ported by Ghommie): - - imageadd: New Revenant icons - Original by Citinited, port by Sishen1542: - - rscadd: You can now use an airlock electronics on a locker to add a lock, and - can screwdriver an unlocked locker to remove its lock. - - rscadd: You can now remove the locks on broken or emagged lockers. - - tweak: Removing the lock from a personal locker now wipes that locker's ID details. - - tweak: Broken lockers have had their appearance changed. - Owai-Seek: - - rscadd: custodial cruiser cargo crate - - tweak: removed light replacer from power designs and moved to misc designs - - tweak: added pimpin ride to custodial locator - - tweak: added additional items to janibelt whitelist - - tweak: made plant DNA manipulator unwrenchable - - balance: reduced janitor premium supply costs - - bugfix: fixed them strawberries - - rscadd: false codpiece - - rscadd: crocin/camphor bottles - - tweak: updated kinkmate item list - PersianXerxes: - - code_imp: Adds the clockwork_warp_allowed flag to the Captain's Office area, set - to FALSE the same way it is for the chapel and armory. - - tweak: Relocates cult catwalks outside the Reebe dressing room. - Poojawa: - - rscadd: Digitigrade legs are now able to wear shoes and look fancy, Uniforms to - come. - - tweak: Xenos are only digitigrade now, mammals and aquatics have the option. - - rscadd: Fire Alarms are visible in low light situations - - bugfix: fixed vore prefs saving inconsistently, new characters might have a previous - slot's prefs tacked on. - - bugfix: fixed mammals not having the option for digilegs. Sprites are fucky until - body-part related sprites are done. - - refactor: improved vore sound responsiveness to preference choices. - - balance: removed morphine from Medihound sleeper chemical list - - bugfix: fixed preference setting being broken - - refactor: Medihound sleepers are Initialized properly, and icons update correctly - now on eject - - tweak: Air alarm All clear color changed from green to blue - - balance: APCs are harder to destroy. - - rscadd: Added Digitigrade versions of everything appliciable in suit.dmi - - imageadd: Snowflake Icons weren't modified, and were given NO_MUTANTRACE_VARIATION - - imageadd: naga and quad Taurs literally don't freeze their ass off in space anymore. - - bugfix: Digitigrade legs will toggle on/off properly on character menue - - bugfix: The misleading "normal" has been removed from species options - - balance: Added sanity checks to emag usage - - bugfix: fixed vtech, but it still doesn't work because of overriding jog/sprint - mechanics from combat reworks. - - bugfix: Puppy jaws properly store if you're emagged, they are also toggle-able - for stealth like the tongue. - - bugfix: 'Digitigrade legs should properly fucking update for the last fucking - time. Fucking snowflake code. refractor: Got rid of snowflake sechound cuffs, - gave them normal zipties like regular secborgs.' - - bugfix: dogborg sleepers actually extinguish people who are on fire, in case you - don't have time to lick them out. - - bugfix: Taur suits should fix themselves properly when worn by other people. - - rscadd: Added the Yogs/Oracle ported latejoin menu - - rscadd: All markings, tails, ears, and snouts for Citadel races are color matrixed! - - imageadd: all markings are on a per-limb basis, including Digitigrade legs! - - imageadd: a bunch of tails were blessed with tail wagging sprites, Fish, Sharks, - Fennecs, Wahs, raccoons, and others. - - imageadd: Tiger markings + tail added, skunk tails improved via sprites from Virgo - - tweak: tweaked some sprites to look better, but they absolutely could use a few - extra passes for quality - - rscadd: HumanScissors in the Tools folder will permit anyone to contribute matrix'd - markings to the sprite sheet, however Mam_markings is very, very full. Be careful. - - tweak: Character preview was both optimized for taurs and bad-touched for better - updating. I don't know if it'll be bad, but hey its better. - - rscadd: Added Dark Medihound and Pup Dozer from Virgo - - tweak: Clone pods no longer announce the name of the clone - - bugfix: fixed flavor text appearing when your face is hidden but you're not an - Unknown - - bugfix: Tauric suits now apply an (placeholder) blood overlay, as well as their - shield overlay. - - balance: Ashwalkers now have lungs. They cannot breath station air without suffocation - effects, but are completely fine on their homeworld. - - balance: Carbon mobs now have a maximum tolerance to oxygen of 50kPa. - - balance: Deluxe synthetic lungs have a very high bonus to O2 tolerance. - - bugfix: Digitigrade legs returned to normal, since digi leg markings overlay them - anyway. - - bugfix: commented out lizard mam_snout entries, because too many abominations - - bugfix: Vore Panel restored to have various interactions available again. Semi-untested - but should work as advertised. - - tweak: Vore Panel has more feedback. - - rscadd: is_wet var to bellies, toggled in the panel, will remove flesh sounding - struggles and the internal loop. JSON version updated. - - rscadd: Feeding var. You will need to enable feeding to recieve any feed vore - actions, but you can now feed yourself to mobs that have this set. TODO, Dogborg - sleeper feeding. - - rscadd: vore mode button now required to be enabled to perform vore actions. It's - the mouth icon! - - bugfix: Ash Drake vore fixed for actual reals this time - - bugfix: Mobs shouldn't spam the released contents announcement anymore on qdel - or death. Only if triggered - - tweak: Hostile mob code now properly ignores targets in bellies - - rscadd: Your belly can quietly growl if you're starving now. - - bugfix: Normal blood splattering isn't offset due to tauric mode - - rscadd: Added plasma man suit icons for taurs - - rscadd: Added bee butt for insects to have stripes - - tweak: adjusted random spawn sprite accessories, humans won't be demi by default - and lizard/mammal spawns will randomly get digitigrade legs - - bugfix: sprite adjustments for tentacles, as well as a misspelling. - - bugfix: Humans once again use ears and tail_human, as intended. This is to prevent - garish randomness - - bugfix: istype for species is actually correct and usable now, it'll be a factor - for monkey form expansions. - - bugfix: Hair functions are de-gendered and more easily selectable now. - - bugfix: Slimes can *wag, select markings and snouts, and yes it works. - - bugfix: Slimepeople extra parts now respect their hair_alpha in terms of being - somewhat see-through. it shouldn't stand out as badly now! - - bugfix: Hunger noises are now toggled per character - - bugfix: Ashwalker den is habitable by ashwalkers again - - rscadd: Medical belts now have overlays! Now you can see if a belt is useful or - just flatout empty. - - bugfix: fixed hypo MK IIs not being able to be put on medical belts - - bugfix: fixed Navy officer uniforms that failed to spawn - - code_imp: Loadout items will be forcefully added to backpacks or at your feet - instead of left behind at title screen - - tweak: hypospray kits hold 12 now, but only vials and sprays themselves - - bugfix: labcoats can carry MK II hyposprays on them now. - - rscadd: Vore Mobs are a thing now, not just ash drakes - - rscdel: 'Removed hunger sound stuff. never taking requests from Coolgat3 ever - again. refractor: Simple Mobs use the same system regular human mobs do, itjustworks.png' - - tweak: Character Window settings unsnowflaked and normalized. I have no fucking - clue how to make them work with taurs still tho, sorry. - - imageadd: added rotating background images for better clarity and contrast than - just SOLID FUCKING BLACK. Images from Virgo/Polaris/Eris - - balance: Defib users automatically stop pulling when they attempt to perform a - defib shock - - imageadd: added muzzled varients of space helmets and full masks - - imageadd: added knight_grey to taur suits, all paranormal ERT now have tauric - versions enabled - - bugfix: Lava knights have digitigrade and tauric versions now - - rscadd: Added a glass version of the gas mask, because it was in the files and - looked nice. does everything regular ones do except make you an unknown - - rscadd: Added custom species names! Examining people will now display their species - name unless they're an Unknown or have their face hidden. like flavor text. - Set it in your character window! - - code_imp: changed how health scanners print messages, wrapping it in msg for one - to_chat instead of printing every line to_chat. - - server: Discord bot will now report when a round ends and give the vague news - ticker that a sister-station would have received for the game mode and result - of the round. - - bugfix: fixed medical hardsuit overlay issue. I thought it was going to work well - but fuck byond. - - bugfix: None body markings shouldn't give rgb hell, but it also should reset properly - anyway. ree. - - bugfix: Sorted some sprites to better sooth my byond icon limit anxiety. - - bugfix: Box Cryopods expanded to 6 public. Permabrig cryo fixed. - - bugfix: Delta Cryopods expanded to 6 public. Permabrig cryo fixed. - - bugfix: MetaStation Crypods expanded to 6 public, relocated above sparring ring. - Permabrig cryo fixed - - bugfix: PubbyStation gained one more cryopod, Permabrig's cryo fixed. - - rscadd: Omega given one more crypod as well. - - rscadd: Gulag was given a cryopod. - - tweak: Box and Meta's cryo rooms are now a new room entirely. - - rscadd: Added erect states for all phallic bodyparts - - bugfix: YOUR DICK ACTUALLY STANDS UP NOW, YOU'RE WELCOME. - - bugfix: skintone locked genitals match the new skintone colorations. - - rscadd: added two new vaginal types and descriptions. - - bugfix: fixed borg defib runtimes - - bugfix: fixed heart attacks being nonlethal - - rscadd: Ported Oracle's cloning set up, you're now visible like cryo when being - cloned, though it's a mystery until you have skin on your meat puppet existance - - balance: Recyclers are unable to destroy the indestructible any longer. - - bugfix: Kiara's toy sabre now actually is the correct item + icon states - - bugfix: Generic armor for taurs fixed, there isn't actually any sprites for 'em, - so. Full sprites overlay over bodies, but I really can't be bothered to do all - the offset fixes otherwise. - - rscadd: Large maps have had a patient room transformed into micro chemistry stations - with nothing else in them. They've been labelled 'Apothecary' rooms and are - accessible by doctors. - - rscadd: females now have female defined sprites - - bugfix: Slime legs have had their excess pixels adjusted - - bugfix: Mammal normal legs are more in line with human legs now - - bugfix: fixed species like abductors and golems getting the fat tiddy or pingas - - bugfix: Atmos and Station alerts should be more alerting. - - rscadd: Added visible and hidden testicles - - rscadd: Added multi-boob support. Now you can have two or three pairs of breasts. - - bugfix: fixed missing vagina and breast sprites - - bugfix: fixed prosthetic hands being invisible - - bugfix: male foxes exist again - - bugfix: female chest markings improved from being too dark in comparison to their - other colors, blending better - - bugfix: Markings behave better on non-organic limbs. - - tweak: tweaked the name of Sublter to distinguish its use - - tweak: Gave a hint for vore posting. - - rscadd: Readded Ninja speech modifications with their mask - - rscadd: Pacifists can eat people for heal belly or noisy. Digestive modes are - auto-swapped to noisy - - rscadd: Added an underwear toggle button under 'Object' tab - - tweak: Genitals now layer under underwear. Hide these if they're too obnoxious. - - rscadd: Added digitigrade socks of all known ones anyway. - - tweak: tweaked the Genital character creation layout to look better - - bugfix: fixed having balls/womb when you don't have the linked organ at character - creation - - bugfix: fixed being able to squeeze semen directly from your balls. Probably. - - rscadd: NT Newscasters have had repeated reports of gang activity and are now - looking into it. - - rscadd: NT Psykers keep mumbling about last words of someone who died. Somehow - they even have a newsletter for this... - - bugfix: Gangster greeting messages are a batch message rather than 5 laggy to_chats - - imageadd: RCL now show what color is currently in use - - rscadd: Added RGB blood effects, know whose blood this is by color! - - rscadd: Added Synthetics blood, and a machine that produces it. A universal donor - for medical to heal people with. Make it via medical protolathe! - - bugfix: With hearts, slimepeople shouldn't die from the effects of not having - a heart. - - bugfix: Plasma vessels from xenomorphs will restore blood if you're on resin. - - server: Poly's speech now echos to the chat bot. - - rscadd: Added new wings to Insects and separated fluff from old ones, they're - Insect's new body markings now without being per-limb (for now). - - rscadd: Horns are now available to mammals, and they have their own color. - - rscadd: Legs are no longer a binary hack code, but actually something that can - be changed. Framework for tauric adaptations. - - rscdel: Purged Modular Citadel's sprite_accessories. - - bugfix: improved the quality of a number of sprites. - - tweak: Moths are now all insects. Avians and Aquatics are all anthromorphics. - Just as planned. - - rscadd: Anthromorphs can choose their preferred gibbing meat. I guess. Snowflakes - are weird. - - bugfix: Additional Gentlemen names. - - rscadd: Medical huds are now calibrated for Radioactive wavelengths. - - balance: Engineering equipment, blue space, and common storage containers are - radiation protected - - bugfix: fixed suit storage not cleaning radiation levels of everything stuffed - into them. - - bugfix: QM is able to hire/fire people to their department now. - - bugfix: cryopod UI isn't complete shit anymore - - bugfix: Cryopods purge silicon gear more efficiently now. Same with ghosts. - - balance: Med Sprays are now more aligned with patch mechanics - - balance: Chemistry is encouraged to be more varied in their healing, as well as - careful in its application - - tweak: Active NPC priority set much higher priority for the MC, with the intent - on making NPC combat more interesting - - bugfix: Clarified access descriptions of some jobs - - bugfix: fixed missing deco wing states - - bugfix: fixed a few things related to vore content - Putnam3145: - - tweak: Bottles in PanD.E.M.I.C 2200 can now be replaced with an inhand bottle - directly - - tweak: Ejecting a bottle from the PanD.E.M.I.C 2200 puts it directly into the - user's hand - - tweak: Alt-clicking the PanD.E.M.I.C 2200 ejects the current bottle - - bugfix: neural nanites only work/drain if you have brain damage or traumas the - nanites can fix - - tweak: Pod people can no longer get fat from standing in the light - - tweak: PanD.E.M.I.C 2200 now ejects onto itself instead of onto user if user's - hands are full - - rscadd: Added configs for a bunch of Dynamic rule parameters. - - config: Added defaults for all the configs (WIP). - - config: Added dynamic midround/latejoin antag injection to the config. - - balance: Made starlight condensation not kill slime people. - - balance: Added not-killing-slime-people to the transmission threshold of plasma - fixation and radioactive resonance. - - tweak: Made the clone scanner lock while it's scanning. - R3dtail: - - rscadd: Added 16 saltprimaryobject items Added 4 saltsecondarysubject items - - rscadd: Added a new carpet. Red! Also added said carpet to the Premium Carpet - crate from the cargo supply console. Trilby said she'd take care of the crafting - recipe. - Raptorizer: - - tweak: Doubled peach spawn rate - - tweak: tweaked numbers/variables - - balance: rebalanced numbers/variables - - spellcheck: removed unneeded code - Seris02: - - rscadd: Abductor Replication Lab ruin and advanced tools - - rscadd: Added looc hotkey - - tweak: made the autoprocess button relevant - - tweak: changes so that spooktober starts earlier - - bugfix: fixed the dark blue lum major effect - Sirich96 and Dennok (ported by Ghommie): - - rscadd: Added new Teleporter Station sprites - - rscadd: Added teleport station calibration animation. - Sishen1542: - - rscadd: Pentetic Jelly, new chemical made through mixing 1:1 slime jelly and pentetic - acid. - - tweak: Anatomic panacea now gives pent jelly instead of pent acid. Medbeams now - have TRUE tox healing to heal TOXINLOVER as well. - - balance: Changed bible heal proc, halving the healed damage and increasing brain - damage 5x in exchange for a much wider array of items to protect you from it. - - tweak: Moved around some chems from emag list into upgrades. - - balance: Added some fun chems to dispensers. - - bugfix: Gave dispensers old tg functionality. - - rscadd: Leather, cardboard, bronze & bone golems! - - rscadd: Bone hurting juice and interactions with plasmamen, skeletons & bone golems! - - rscadd: Ported addition of new CAS cards. - - bugfix: Ported a fix for CAS. - - rscadd: Added the ability to alter your genitalia as a slimeperson more than addition/removal. - - bugfix: fixed genitalia removal proc in alter form. - - balance: Ported the inability for non-station AI to interact with station z-level. - - balance: HoS mains can now peacefully sleep in their office. - - tweak: Podpeople now have customization options. - - bugfix: Removed the human check for cult conversion of captain/chaplain minds. - - balance: Roundstart carbon jetpacks now have full_speed FALSE. - - tweak: Adds plasteel to medical and security techfabs. - - rscadd: Added public autolathes to all maps. - - tweak: density = 0 - - balance: hugboxing mining loot - - balance: ling blade now has 40 armor pen - - rscadd: fun - - rscdel: bad stuff - - balance: mech bad - - balance: rebalances strained muscles - - rscadd: added in the assistant response team - - bugfix: fixed up access on the centcom hangar button - - balance: storage tweaks for belt briefcase - - imageadd: codersprite for belt briefcase - - rscadd: added pharaoh gear to chaplain vendor - - spellcheck: fixed typos in pharaoh items - - rscadd: made laser minigun not shitcode and also craftable - - soundadd: added new fire sounds for the laser minigun - - rscadd: holy lasrifle, hypertool, divine lightblade, and blessed baseball bat. - Four new holy weapons! - - balance: stamina and force tweaks for most holy weapons. - - tweak: prayer beads no longer deconvert after a 10 second timer, now just inject - holy water for delayed effect - - tweak: cultist runes are now destroyed with a bible or a null rod - - tweak: bo-staff now functions as a nerfed sleepy carp staff - - bugfix: fixed kevinz code to add in non-null rod child items as holy weapons - - bugfix: fixing chems for strained muscles - - bugfix: narsie no longer asks for consent - - bugfix: removed reflect from divine lightblade - - bugfix: teleporting a locker is bad - Sishen1542, original by @Tlaltecuhtli: - - bugfix: alt clicking the emitter now rotates it instead of only flipping - Sishen1542, original by @zxaber: - - balance: Utility mechs no longer automatically get beacons. - - balance: Tracking beacons no longer delete themselves when EMPing a mech, and - instead have a ten-second cooldown in-between EMPs. They also now do heavy EMP - damage rather than light. - - balance: Mechs that take EMP damage lose the use of their weapons and equipment - temporarily. Movement and abilities are not effected. - - balance: Mechs taking EMP damage no longer roll for a random malfunction. - Sishen1542, original by Arkatos: - - rscadd: Action buttons can now be dragged onto each other to swap places - Sishen1542, original by NewSta: - - tweak: updated the miasma canister sprites - Sishen1542, original by Skoglol: - - rscadd: Heaters/freezers now support ctrl clicking to turn on and alt clicking - to min/max target temperature. - Sishen1542, original by XDTM: - - rscadd: Using the wrong surgery tool during surgery no longer attacks the patient, - if on help or disarm intent. - - rscadd: Surgery steps are now shown in detail only to the surgeon and anyone standing - adjacent to them; the patient and people watching from further away get a more - vague/ambiguous description. - Skoglol: - - rscadd: You can now alt click storage (bags, boxes, etc) to open it. - Skully): - - rscadd: Nudity Permit, a completely invisible uniform that still has pockets and - such, to loadout options. It is more or less a direct port from the RP server. - SkullyRoberts: - - rscadd: Penis autosurgeon as rare maint loot. - TerraGS / Skoglol: - - rscadd: Adds toggleable light and blinking charge indicator to kinetic crusher - - rscadd: Kinetic crusher can now be one-hand carried. You'll still need two hand - to use it. - Thalpy: - - bugfix: fixes message_admins in SDZF - - tweak: Alkaline buffer recipe so people don't get grumpy and expanded the pH range - - bugfix: fixes buffers - - bugfix: fixes broken compiler because a var changed name - - bugfix: impure travis var anger - - rscadd: Added the ability to dispense smartdarts from the chemmaster. - - tweak: Tweaks medolier amd chembags to allow quickpickups of smartdarts, lets - the latter soak in beakers (on the floor) - - bugfix: fixed rounding errors with smartdart mixes. - - imageadd: added modified smartdartgun icon. - - bugfix: 1. Kev asked that there were no antag datums used, so that's been changed. - 2. Tricks can no longer turn someone into a dullahan, instead you have to spend - candies to get that. I felt it was too mean to turn people into that, I didn't - realise you couldn't revert it. 3. Barth will no longer as for impossible items. - 4. Barth will no longer as for the same item multiple times. 5. Barth will now - accept broader things, rather than asking for something, when meaning something - specific. 6. Jacq will now no longer poof off the z level. 7. Jacq will (hopefully) - stop spooking the AI by teleporting into there 8. Jacq will now try to teleport - to a location with someone nearby. 9. Barth will tell you where Jacq is currently - when you speak to him. 10. You can trade 2 candies for a Jacq Tracq (tm) 11. - Jacq should stop getting mad and cover the station in gas when killed. 12. Fixed - Jacq not singing (the link died). 13. Slightly changed wording so that people - will hopefully get to know her. 14. Jacq no longer disappears when you're getting - to know her. - Toriate: - - imageadd: 'All regular crates are now 3/4ths ToriCrates iamgeadd: Unused plastic - crate sprite added' - - rscadd: Blood freezer crates now have unique sprites. - - rscadd: RPD now has inhands - - imageadd: New sprites for RCDs and RPDs, inhands included - - imageadd: Updated the sprites of all the regular crates - Trilbyspaceclone: - - rscadd: cakes! - - imageadd: Made some sprites! -Love them really came out well - - rscadd: new economics - - tweak: cargo and robotics relationships - - balance: unbalanced something - - bugfix: fixed a maybe oversight - - rscdel: Fun - - tweak: costs of suit voucher - - balance: Unblances miner vender - - bugfix: spare cheaper brute kit - - tweak: harm from hentie - - balance: rebalanced goliaths stun to be less auto death - - rscadd: Armor to blob shields - - tweak: block weaken state to 70% from 75% - - bugfix: restores the deathriplys missing armor - - rscadd: new lockable colalr - - tweak: armor - - bugfix: missing hopes and dreams - - code_imp: orgized the weapon file to be more cat brain friendly - - imageadd: This means sprite right? - - rscdel: Many engi flags on non-engi things - - code_imp: changed some code to be organized at a glance - - balance: '25% < --- 50% For NPC blocking bullshit ided: Yes' - - rscadd: mag gun uses cells - - balance: kev things their to op - - rscadd: syndicate phobia - - tweak: other phobia's - - bugfix: laser carbine - - tweak: makes collars only locked via key - - tweak: charging - - rscadd: Combat inducers for COMBAT! - - code_imp: made it look nice - - rscadd: golden swag boxes - - rscadd: Crafting suitcases - - rscadd: more bountys - - rscdel: Nitryl bounty - - rscadd: better stocks - - rscadd: more evil blood fluff text - - rscadd: Added more mime names - - tweak: replaces a sink with a autolathen - - balance: 2 -> 3 - - rscadd: MASON SUIT! - - rscadd: adds the sec jetpack to sec hardsuit storge - - rscadd: Added a few jet packs to the space queens men - - tweak: volume of jet packs - - rscadd: Bad Idea - - rscadd: bio mass meat - - rscadd: more box options - - bugfix: a lack of replaceable boxes - - bugfix: clothing needing a emag - - tweak: 4 - > 5 - - tweak: 5->6 - - tweak: 4tc - > 2tc - - tweak: mulligan costs 4 - > 3 - - tweak: Tuberculosis 12tc - > 8tc - - tweak: 15 - >10 - - bugfix: both bags have the same name - - tweak: 5 - > 2 - - tweak: 3 -> 1 - - tweak: 2 < - 4 - - tweak: 1->2 and ultra - - rscadd: shield + crafting - - tweak: hierophant movment and melee attack - - rscadd: More plushies - - tweak: attack verbs and descs - - rscadd: bone satchles - - balance: rebalanced stunslugs - - rscadd: colored boxes, and more types - - tweak: harm and such - - balance: item classes - - bugfix: resonators being so shitty - - bugfix: 'Game braking bug critical: bug fix' - - rscadd: items to syndie surgery bags - - rscadd: SNOW CONES - - rscadd: carts buy-able cargo - - tweak: selling/time to craft - - bugfix: crafting problems, and red stamp exsplote - - rscadd: gives paper work sprites that are nicer - - rscadd: origami - - rscadd: gang tower shield - - tweak: costs of boots - - rscadd: organ box - - rscadd: Medical breifcaseses - - rscadd: New cargo crate for tech-slugs! - - rscadd: Ammo to each fitting crate - - bugfix: Cat-code - - spellcheck: fixed a few typos - Again my bad - - bugfix: fixed airless place - - rscadd: baklava - - balance: makes uplink kits more usefull for the risk - - code_imp: Changes some files to be better - - balance: As all things are not - - bugfix: fixing cat code that dosnt work, my bad - - bugfix: Arcades stealing from noodles - - rscadd: rapier - - tweak: speedy quirk - - spellcheck: Ironic - - bugfix: A bunch of minor issues with xenobiology are no more! - - bugfix: I didn't code it right it in the first place - - rscadd: new nodes - - balance: points and node gear - - rscadd: stuff n things - - rscadd: gear harness and a conflict merg - - rscdel: Nudity permits - - bugfix: nothing - - rscadd: Donner item - - rscadd: Luna's Gauntlets - - balance: rebalanced lingy dingy powery gamey - - tweak: melee and block harm - - bugfix: sprites* - - balance: bone satchles - - tweak: holster doing holster things - - rscadd: Donor item - - rscadd: Joy, Happiness, Honk - - bugfix: small mix up in terms - - rscadd: Promiscuous Organs crate, pills to lewd crate and testicles to maints - - bugfix: Made unholy water healtoxinlover - - rscadd: Zelus Oil, brass flasks - - rscadd: Added new chairs - - admin: Bugtesting zone upgrades for easy bug/game testing - - rscadd: more cargo to cargo - - rscadd: More loadout gear - - bugfix: Poojawa power creep - - bugfix: Not my work not my credit - - rscadd: Emitter gun - - bugfix: suit storage nulling anti magic item protection - - balance: rebalanced steal goals restrictions - - spellcheck: fixed a few misleading goals - - bugfix: ports a fix - - bugfix: oversight in benos - - bugfix: QM rooms not getting Key Aunths - - rscadd: new books/cooking - - spellcheck: less bad wording in slime - - rscadd: strawbarries and such - - rscadd: amazing things like tea of catnip, catnip and plant - - tweak: glue uplinks - - rscadd: RPDs to drones - - rscadd: Armor and such - - rscadd: flavor - - bugfix: maybe a runtime - - rscadd: chameloen clothing - - rscadd: tons of peach themed items - - spellcheck: caje - - rscadd: New book - Unused - - code_imp: organized files - - imageadd: redid brass tools to look better* - - bugfix: /cursed from a item path - - rscadd: Almost all clothing and most weaponds can be sold for pocket change - - tweak: Cargo costs of packets and selling - - balance: Lowered mat selling as well as most if not all bountys - - code_imp: Adds more files for easy finding/adding in packs - - bugfix: oops not being blacklisted - - code_imp: removes some cit-modular things - - bugfix: Missing sprites with bad ones - - tweak: emag charge amount - - rscadd: Reebe QoL aka creep in gear - - bugfix: ??? - - server: HEY MADE THE REEBEEE WAY SMALLER - Making it less lagging hopefully - - rscadd: Surgerys and spays in bags - - tweak: earthbloods stam regen - - imageadd: Red to Blue/Black crosses as questioned by Bhijn - - bugfix: clean bot not cleaning basic cleanables - - rscadd: new traitor bundle - - rscadd: trash - - imageadd: 'eye bleed :add: misstakes' - - rscdel: Removed old things! - - bugfix: UI memes - - rscadd: Blue space blood bag - - tweak: blood costs - - rscadd: Beebal and Honeybalm plants - - tweak: Costs of crates and paperwork - - rscadd: Adds 2 more crates hacked only - - rscadd: Added two seed packets of cotten to ash walkers base - Tupinambis: - - tweak: Changes large parts of the nuclear operative base, including the addition - of a new barracks where the ops spawn, a personal bedroom for the leader, the - rearrangement of numerous rooms, some added fluff, a slightly more roomy bar, - a larger hanger, a kitchen, and various other small changes to make the base - feel just a bit more alive. This was achieved by completely redoing the base - from scratch so there was room to work with, as a result potential bugs could - crop, please do report them. - - bugfix: The drop pod chamber was airless. This seems like an oversight, and has - been filled with air. - - rscadd: Cryo Sleepers have been added to Perma on all four maps in rotation. the - bathroom windoor and window have switched places to accommodate this change. - - rscadd: You can now choose the pre-exisiting "loader" sprite as an appearance - for your engineering borg. - - tweak: A vast majority of references to humans within ion laws have been replaced - with crew. AI modules have received similar treatment - - rscadd: 'Adds a syndicate themed emergency shuttle that costs 20000 credits, and - can ONLY be purchased when the communications console is emagged. This shuttle - features a fully stocked medbay with self serve sleepers, plenty of room that - can fit highpop, a fully featured bridge, ballistic auto turrets, and an armory, - EVA prep room, and bar, all of which are only accessible by either an agent - ID or through hacking. - - -EVA prep features 2 syndicate hardsuits and 3 syndicate softsuits. -Armory - features 5 stetchkins with spare ammo, and 2 riot c-20r''s. - - ![image](https://user-images.githubusercontent.com/42078130/48306551-0b786380-e500-11e8-821a-e59ac4eee0ea.png)' - - balance: Lone operatives no longer spawn with a syndicate hardsuit and a bulldog. - They instead spawn with a black and red EVA suit and an extra 15 TC (40 in total) - ![image](https://user-images.githubusercontent.com/42078130/48308065-c44e9a80-e520-11e8-8d60-cec8ff23d61d.png) - - rscadd: The tesla engine has been replaced with a supermatter engine, and pubby - engineering has been redesigned to accommodate this change. - - rscdel: The tesla engine has been completely removed along with any related components - - bugfix: RD and R&D vents are now actually connected to the air distribution. - - rscadd: New engineering hivebot. Has a bit more health but otherwise aesthetic. - - tweak: Oldstation no longer has an excessive amounts of hivebots within it, however - the bots that remain are individually a larger threat. - - balance: Hivebots are now more robust, with a higher melee damage output and health. - - server: Remove this ruin from the blacklist or this PR is pointless. - - bugfix: the air injectors for the SM engine waste and for toxins waste should - now receive power - - tweak: Adds a mixed clothing closet to Deltastation Dorms. - - tweak: Adds a bottle of unstable mutagen to Botany, on account of its distance - from Chemistry. - - bugfix: Omegastation should no longer have any turf with missing textures, as - those spots have been replaced with playing covered in a sandy turf decal. - - tweak: Removed all living eggs from the xeno ruin because people self antag. Honk. - - rscadd: Adds a new security level between Blue and Red (Amber). The shuttle call - time at this level is 8 minutes. - - tweak: Blue security level now has a shuttle call time of 12 minutes. - - tweak: The security level increase/decrease texts have been modified to accommodate - the change. - - imageadd: Adds a code Amber sprite for the fire alarms - - tweak: Removed the plushes from the toy crate, giving them their own. - - tweak: Plushes are now less likely to spawn out of arcades - - imagedel: Removes a moth plush from the game. - - balance: added a small fire delay (3 ticks) to automatic shotguns - - balance: Reduced buckshot brute damage by 20%. (12.5 -> 10 brute per pellet) (75 - -> 60 brute at close range) - - balance: Reduced rubbershot stamina damage by 40% (25 -> 15 stamina per pellet) - (150 -> 90 stamina at close range) - - balance: Reduced beanbag stamina damage by 12.5% (80 -> 70 stamina per shot) - - balance: Engivend RCDs now vend upgraded RCDs - - imageadd: Beautified and stylized the cyborg HUD sprites, animated and cleaned - up some of the old, modernized APC hacking and Doomsday sprites, - - tweak: moved cyborg language select above the radio icon, instead of above the - picture icon. - Twaticus & Poojawa: - - rscadd: Added new carpets from TauCetiStation! - - rscadd: More Liquid carpet chemicals, mix carpet with certain reagents to get - different colors! - - refactor: Tablets have a better means of being assembled codewise. nothing's different - on player end. - UntoldTactics: - - tweak: Rewords the click here prompt given when an attempted conversion is done - on an offer rune (for blood cult) - UristMcAstronaut: - - bugfix: allows a pai to activate its holoform while in a pai connector without - getting derped. - Useroth: - - bugfix: the collars are now aware of their proper overlay sprites - - bugfix: The space hotel dorms are now properly boltable with the buttons inside. - - bugfix: Makes the booze-o-mat hacked by default. Alternative to https://github.com/Citadel-Station-13/Citadel-Station-13/pull/8350. - - bugfix: After the PR which raised the ammo capacity of said magazines, due to - the code, they ended up with an invalid icon state. Fixed through changing the - icon state name in the icon file. - - rscadd: 'Taeclowndo shoes which grant the four following abilities: - Conjuring - a cream pie right into their hand. Every three seconds. - Making a banana peel - appear out of thin air at the tile of the clown''s choice. Every ten seconds. - - Mega HoNk. A touch-ranged, very small AOE ability, with effect equal to being - honked by a Honkerblast on a clown mech, with the effects halved for anyone - who isn''t its direct target. Every ten seconds. - Bluespace Banana Pie. You - don''t throw this one... not right away at least. This baby can fit an entire - body inside. Good for disposal of evidence. 25 second-long action, 45 second - cooldown. Also produces a "[victim''s name] cream pie". The body drops out of - the pie if you splat it somewhere or destroy the pie. If you eat it, it will - chestburst out of you a''la monkey cube. - - It''s a 14 TC item for traitor clowns and a 12 TC item for clown-ops.' - - tweak: The tentacle now directly puts the item in your hands, instead of toggling - your throwing and tossing it at you. Tentacles suffer from ranged inaccuracies - as if they were guns, I think it's enough of an inconvenience. - - tweak: Makes the netting much less clunky. If there's only one target you can - net while you press the button, it will just net that target instead of bringing - up a list of mobs. - - tweak: Energy nets now revive and fully heal capturees (even dead ones, after - calculating points). If someone's got a scan and wants to get cloned, they can - always kill themselves still. - - tweak: Capture points are added on capture, rather than round-end, so it no longer - matters whether your captures kill themselves in the holding facility or not. - - balance: Makes the nets a bit more sturdy. (previously it took mere two welder - hits to break one) - - balance: Makes stungloves actually stun people (currently comparably with stunbatons, - adjustable). Because electrocute_act(25, H) did fuck all, stunwise, and on top - of that, people in insulated gloves were completely unaffected. - - balance: Reduced the stunglove electrocute_act value to 15 due to above. Could - possibly be lowered further. - Weblure: - - rscadd: Added the relevant Beepsky animations from TG's aibots.dmi file to Cit's - aibots.dmi file. - WhiteHusky: - - rscadd: Sleepers now show blood level and type. - - tweak: Changed the styling of arousal messages to use pink-ish colors. - - bugfix: The orgasm moodlet message new-lines properly. - - bugfix: Flavor text with special characters will not get partially unescaped. - - bugfix: Canceling when setting flavor text does not clear it anymore. - - tweak: Checking yourself shouldn't freeze the client anymore. - XDTM: - - rscadd: Added the experimental dissection surgery, which can be performed once - per corpse to gain techweb points. - - rscadd: Rarer specimens are more valuable, so xenos and rare species are more - efficient subjects. - - rscadd: Added two new surgery procedures, under the Experimental Surgery techweb - node. - - rscadd: Ligament Hook makes it so you can attach limbs manually (like skeletons) - but makes dismemberment more likely as well. - - rscadd: Ligament Reinforcement prevents dismemberment, but makes limbs easier - to disable through damage. - - tweak: Golem limbs can now be disabled, although they are still undismemberable. - YPOQ: - - bugfix: Stealth implants work again - Yakumo Chen: - - balance: Made stealth implant boxes flimsier - - balance: Autocloning now requires tier 4 parts - - rscdel: Removes autoscan - - balance: Scanning people now requires someone to operate the cloning computer - regardless of part level. - - balance: removed antimagic component from holymelon - YakumoChen: - - tweak: AEGs brought more in line with current radiation system. Try not to get - EMP'd. - - tweak: Jetpacks no longer last twice as long between air refills. - - rscdel: Reverted laser miniguns. - - rscadd: Adds beanbag slugs to the sec protolathe at round start - - bugfix: Brings shotgun ammo availability back in like between seclathe and autolathe. - Zargserg: - - balance: Lungs maximum toxin threshold is 0.5% of the atmosphere. - - bugfix: Permanently contaminated atmosphere does not murder crew anymore. - ZeroNetAlpha: - - tweak: Cleans up autoylathe code and brings it back in line with the regular autolathe. - - bugfix: Fixes autoylathe interface not updating propperly. - - tweak: Silicons are now consumable by scrub pups. - actioninja: - - bugfix: APC UI autoupdates correctly - bluespace bio bags: - - rscadd: Added bluespace bio bags and put it in the tech web, in the node applied - bluespace - - imageadd: added a crappy icon for bluespace bio bags - chef: - - rscadd: Added main hallway approach to monastery - - rscadd: Added Maintenance hallway approach, with some maint loot - - tweak: moved the docking arm for the white ship - - tweak: changed placement of some grills and windows - coiax: - - admin: When the nuclear disk stays stationary long enough to trigger an increase - for the lone op event chance, admins will be notified every five increments. - dapnee: - - rscadd: Plasmaglass tables, spears, tiny plasmaglass shards - - bugfix: Plasmaglass structures now drop plasmaglass shards instead of nothing - - rscadd: Trim lines! - - bugfix: You can now make plasmaglass tables again. - deathride58: - - admin: When a gamemode fails pre_setup, it will now send a message in admin IRC - and in ingame admin chat, instead of only being viewable in the logs. - - balance: Portal guns now spawn without firing pins. - - balance: Reduced the default/baseline nanite pool amount from 100 nanites to 25 - nanites, and reduced the maximum nanite amount from 500 nanites to 125 nanites. - The safety threshold was reduced from 50 nanites to 12 nanites. - - balance: Most of Lavaland's mobs are now on crack. - - balance: Blood drunk miners now move once every two ticks, rather than once every - three ticks. - - balance: Bubblegum now has a maximum movement speed of once every three ticks. - Buffed from the original value of once per 5 ticks. - - balance: The minimum time for the Colossus to attack again after firing a random - shot is two deciseconds, Sped up from the original value of three seconds. The - minimum time for the Colossus to attack again after performing a blast is now - one second, with the original value being two seconds. The minimum time for - it to attack again after performing its alternating shot pattern is now two - seconds, original value being four seconds. - - balance: Ashdrakes now move once every five ticks, rather than once every ten - ticks. - - balance: Heirophant chasers now move once every two ticks rather than three ticks - by default, and the chaser cooldown has been reduced from 10 seconds to 5 seconds. - The cooldown for the Heirophant's major attacks has also been sped up to 4 seconds - from the original value of 6 seconds. - - balance: The Legion (megafauna) now moves at two ticks per second rather than - three ticks. It additionally now actually moves faster while charging. The cooldown - timer for it's special attacks has been reduced from 2 seconds to 1 second. - Additionally, The Legion's view range has been decreased from 13 tiles to 10 - tiles. - - balance: All megafauna now have a default view range of 4 tiles, decreased from - the original of 5 tiles, and an aggro'd view range of 15 tiles, decreased from - the original of 18 - - balance: Goliaths now move once every ten ticks, sped up from the original value - of 40(!!!) ticks. Additionally, their cooldown for their tentacles has been - reduced from 12 seconds to 6 seconds. To compensate, their cooldown now only - decreases by 5 deciseconds every time they're attacked, rather than 10 deciseconds, - their melee damage has been reduced to 18 per hit from 25 per hit, and their - vision range has been decreased from 5 tiles unaggroed, 9 tiles when aggroed, - to 4 tiles and 7 tiles respectively. Ancient goliaths have a default attack - cooldown of 8 seconds, sped up from the original value of 12 seconds. - - balance: Legion (the common mob) now has a cooldown of 1.5 seconds on their skull - attack, sped up from the original value of 2 seconds. Additionally, their view - range has been decreased from 5 tiles, 9 tiles when aggroed, to 4 tiles, 7 tiles - when aggroed. - - bugfix: Stamina no longer regenerates at hyper speeds. - - tweak: To accommodate for upstream's stamina changes, knockdown() now applies - staminaloss only to the chest. - - tweak: adjuststaminaloss() now has a new argument that allows you to specify a - zone to apply staminaloss to. This defaults to the chest - - tweak: apply_damage() is now capable of healing carbon mobs and human mobs. - - tweak: Since the head has the same exact effects as the chest when disabled, and - doesn't really make much sense to be affected by stamina, the head no longer - has stamina. - - tweak: The chest now has a stamina cap of 200 stamina due to the above. - - tweak: Footsteps now sound mostly the same as they did before the hard sync - - bugfix: Jukeboxes now properly remove themselves from the active jukebox list - when destroyed - - rscadd: Server operators and badmins can now make the server play like TG by toggling - the stamina buffer on/off using the DISABLE_STAMBUFFER config option. - - bugfix: Airlock wires now work as they did prior to the hard sync - - balance: The thing you're currently grabbing is now taken into account when left-click - disarming. Things you have grabbed now roughly have a 45% chance to be disarmed. - - balance: Disarm push rolls are now determined by the target's staminaloss rather - than a flat number. - - balance: When you're in combat mode, pushing someone who isn't in combat mode - is a guaranteed knockdown. Hard counter to stam regen squeezing in melee combat. - - balance: Failed disarm push attempts now deals light staminaloss to the target - so long as both the attacker and target are standing. The total stamloss dealt - to the target is random, clocking in at a very inefficient 1-5 stamloss per - unsuccessful push attempt. - - tweak: Disarm pushes now play the thudswoosh sound regardless if they're successful - or not. Had it not been for copyright, I would've used L4D's melee sound. - - tweak: Disarm push attempts are now logged - - bugfix: Autostand no longer makes you invulnerable to dropping items when being - knocked down with a force greater than 80 - - bugfix: You can no longer abuse an href exploit to return from the labor camp - before obtaining enough points to satisfy your point goal. - - bugfix: Norko's donor item is now listed in the right category - - rscadd: The medihound sleeper now has a non-vore variant. This will be used by - default. The old voracious variant will only appear if both the person being - sleeper'd and the medihound have the voracious hound sleepers pref enabled. - Sprites by Toriate - - tweak: '"Allow medihound sleeper" is now labelled "Voracious medihound sleepers", - and is now off by default' - - bugfix: AOOC no longer prints to players in the lobby - - bugfix: Human tails and human ears now save again. Humans now use mam_tail and - mam_ears for their snowflake bits instead of tg's equivalent, just as they did - prior to human tail and ear saving breaking - - bugfix: Disarm pushes no longer deal staminaloss to resting targets - - bugfix: You can no longer force a hard stamcritted spaceman to stand by clicking - them with help intent. Get more creative if you want to torture someone that's - in hard stamcrit. - - tweak: The revolution gamemode now waits until the 20 minute mark before checking - for win conditions. - - balance: You can no longer resist/move out of grabs while you're resting. Disarming - your way out still works, though. - - rscadd: Stamina damage now has diminishing returns on people who are in hard staminacrit - with the addition of a new multiplier. When you take staminaloss while in hard - staminacrit, you'll be under the effects of the new multiplier, which reduces - the amount of staminaloss you take from all sources of staminaloss. The diminishing - returns multiplier will steadily return to 1 once you're out of staminacrit. - - rscadd: You can now scramble while resting. You can do this by dragging your spaceman - onto an adjacent turf. This works even if you're in staminacrit, but the timer - depends entirely on your staminaloss. - - bugfix: Fully augged cyborg people now heal stamina damage properly. - - bugfix: Job EXP is now tracked properly for all roles. - - balance: Nightmares and shadowpeople have had their light threshold for being - considered in darkness reduced. Nightmares can no longer stand unharmed next - to a light fixture during a nightshift 100% unharmed. The threshold is high - enough so that APC lights on their own won't harm a nightmare, but being on - the edge of a light source will. - - balance: The detective revolver's .38 bullets are now non-lethal again, but now - require 3 shots to hard stamcrit - - rscadd: The current lethal variant of the .38 bullets can still be printed at - sec protolathes. - - rscadd: You can now access ghost roles from the latejoin menu. - - rscadd: Eyeblur now scales depending on how much actual eyeblur you actually have. - - balance: Ebows now induce 50 drowsiness on whatever they hit. - - balance: Telepads have been buffed across the board. T1 parts on a launchpad still - grants you a range of 15 tiles, but T4 parts now grant you a pretty large 60 - tile range (up from their original 18 tile range). Briefcase launchpads were - also buffed, they now have a range of 20 tiles, up from their previous laughable - 8 tiles. - - tweak: The grace period for the revolution win condition check has been reduced - from 20 minutes to 10 minutes. You don't need to wait nearly as long for the - round to end if no heads join in. - - tweak: You can now select plural and neuter as your gender. They're labelled "non-binary" - and "object" in the character customization menu, respectively. - - tweak: A lot more light sources now use the same nonbinary colored lighting philosophies - as flashlights and light fixtures! - - tweak: Flashlights mounted to guns and helmets now retain the same color and power - as their original light. Lavaland's caves will reflect a fluorescent blue as - you shine your KA around, and sec's helmets are now capable of illuminating - maint in that fancy fluorescent blue. - - tweak: Cameras now shine a fluorescent blue when lit up by an AI - - tweak: Glowing goo now actually glows green. - - tweak: Candles had their power reduced from 1 to 0.8. - - tweak: Lighters now shine a little further, and are now properly colored. - - tweak: PDAs now shine an incandescent yellow to match their sprite. - - tweak: Welding tools now shine an appropriate color - - tweak: Hardhats now shine an incandescent yellow. - - tweak: Plasmaman helmets now shine an incandescent yellow. - - tweak: Microwaves no longer overpower literally every single light in the game, - instead having a power of 0.9. - - tweak: Borgs now have incandescent yellow lights to match their sprites - - tweak: Bots now shine a fluorescent blue light - - tweak: Airlock light overlays are now on the above lighting layer. This means - airlock lights can actually be seen in the dark now. - - bugfix: The mob spawners list no longer leaves null entries behind when a spawner - has a job description defined. The latejoin menu will no longer show ghost roles - that are filled, and the spawners menu actually works again. - - rscadd: The voting system now actually tracks who voted for what. This means it's - now possible to change your vote, and it's possible to see what you voted for. - - balance: Using help intent on someone that's in hard stamcrit will now make them - heal 15 stamloss. - - tweak: Auto fit viewport is now enabled by default for new players. One less question - off the FAQ - - rscadd: The Khajiit favorite, Skooma, was added as a chemistry recipe that can - be produced with cooperation between chemistry and either cargo or service. - If you want to spoil the recipe for yourself, take a look at the PR for it! - - rscadd: When the shuttle leaves for centcom, a vote will be started to select - the next map instead of the map being randomly chosen via biased voting methods - - server: If a server operator wishes to re-enable the biased TG preference voting - system, you can do so by toggling the TGSTYLE_MAPROTATION config flag on in - the config.txt. Keep in mind that doing so will bring you great misfortune. - - balance: Cacti in lavaland now have 6u of vitfro instead of just 4u. This lessens - the gap between cacti and first aid kits, the third rarest and second rarest - readily available healing methods for ashwalkers, respectively. - - bugfix: the "genitals use skintone" option now appears in the character appearance - menu when appropriate again. - - rscadd: Clicking your stamina bar will now show your exact stamina along with - info regarding your stamina buffer - - bugfix: The bug where ghost role spawners leave null entries in glob.mob_spawners - has actually been fixed - - bugfix: The Kitchen Gun (TM) is no longer invisible. - - balance: The majority of cult spells no longer have exclamation marks at the end - of their invocations. This means they will no longer be bound to the rules of - shouting. Which means sec officers will no longer be able to hear culties sacrificing - the captain from the complete opposite side of the maintenance tunnel the sacrifice - is happening in. However, things like EMP pulses and runeless teleportation - still have the effect due to their inherent loud nature. - - balance: The stun blood spell now instantly causes hard stamcrit. However, to - offset this, it now also only has one charge and has a higher cost. - - balance: The Gloves of the North Star now restore 2/3 of the stamina used up by - punches when harm intent punching. With aggressive play and good stamina buffer - management, this makes it entirely plausible to roughly double your stamina - regeneration per mob life process tick. - - balance: Revs can no longer remember the name of the person who flashed them when - deconverted. This brings it in-line with the other conversion antag deconversions. - - bugfix: The bug where you can sometimes get permanently stuck in stamcrit should - HOPEFULLY be fixed. I'm unable to reproduce the bug myself, but let's hope. - - balance: The night vision trait now grants you darksight for an entire 1:1 screen, - but the alpha of the lighting plane with the trait has been increased from 245 - to 250 to balance it out - - bugfix: It's now actually possible to click the stamina hud button - - bugfix: The stamina hud button now displays your stamina buffer correctly - - balance: Bone spears now have a reach of 2 tiles. - - bugfix: You can no longer phase through solid objects via scrambling - - bugfix: The syndicate mask now works properly as intended. - - balance: Stamina is no longer affected by health at all. - - rscadd: You can now right-click yourself in help intent in combat mode to instantly - get up from resting. This will cost stamina equal to your entire stamina buffer. - Manage your stamina well, and you'll be able to shrug off a single stray golden - bolt - - rscadd: The new player panel now displays your currently selected character's - name - - balance: Flashes no longer knockdown. Instead, they deal eyeblur and have increased - confusion - - server: The server's tagline is now a config option. People can now stop confusing - us with BR cit - - rscadd: Attack animations will now rotate your character slightly, similar to - Goon. - - rscadd: Throwing items will now perform the attack animation and play a sound - - rscadd: flashlights will now make sounds when toggled on/off - - rscadd: Things in disposals will now emit sounds every single time they hit corners. - This increases immersion. - - bugfix: Air alarms now actually emit the proper light color when their status - is okay. - - rscadd: Backpacks and other storage items will now jiggle and squish when you - interact with them, similar to the animations seen on Goon. - - balance: Mops no longer have a delay on their cleaning, making them an actually - viable alternative to all of the janitor's other cleaning tools - - balance: To balance this, mops now take stamina to clean tiles. Standard mops - take 5 stamina to use, while advanced mops take 2 stamina. - - tweak: Oh and also mops make fancy new sounds and play animations when used now - - balance: Pump-action shotguns now take 2 stamina per pump instead of 5 stamina - per pump. This also applies to bolt-action rifles, as bolt racking counts as - pumping. - - tweak: Pickpocketing items will now place them in your hands if possible - - rscadd: Combat mode is now displayed in examine text - - rscadd: Combat mode now makes a visible message when enabled if you haven't touched - your combat mode button in the last ten seconds. It's done this way to avoid - chat spam from those who know how to pull off stam regen squeezing. - - balance: All knockdown sources will now force people to be dismounted from ridden - vehicles. - - rscadd: When an item is thrown, it will now be rotated and displaced. - - rscadd: Shards of glass will now be rotated when spawned. - - rscadd: Bullet casings will now be rotated when they're ejected from a gun. - - rscadd: Bottles now have random rotations and pixel offsets when smashed via throwing. - - rscadd: Picking up an item will now reset its rotation. - - rscadd: Glasses thrown onto tables by bartenders will now have their rotation - reset. - - balance: Slime speed potions can now only increase the speed of vehicles to be - on par with sprinting speed. They can no longer make a scooter roll around ten - times faster than a speeding blue hedgehog. - - rscdel: Changelings will no longer recieve team objectives - - balance: Changelings no longer start off with hivemind communication as an innate - ability. Hivemind communication now requires 1 dna point, on par with syndicate - encryption keys, which are 2 TC. - - code_imp: Hivemind link now relies on hivemind communication just like the hivemind - download/upload abilities. - - bugfix: It's now only possible to zoom a gun if it's in one of your hands - - bugfix: Mobs without clients no longer cause runtimes when their eyeblur updates - - rscadd: Blood tests have been added. If a changeling has a sufficient number of - loud abilities, you will be able to test their blood by heating up a sample - of it. However, if the changeling has a large amount of loud abilities, attempts - to test their blood will have explosive results. - - rscadd: Changelings now make a very obvious noise when readapting. This is to - prevent the cheese strat of simply readapting when you get caught to avoid detection. - - tweak: The blood splatter effect that happens when you get attacked will now always - make you lose blood depending on the damage you've taken. The effect now also - scales with item damage, meaning tiny little papercuts will no longer be able - to cause a massive blood splatter. - - rscadd: The blood reagent will now cover items and spacemen in blood when applied - to objects and mobs. - - tweak: Helmets, masks, and neck items are all now valid targets to get splattered - when you get covered in blood. Groovy. - - tweak: The temperature notification will now take into consideration both the - ambient temperature and your body temperature, increasing the responsiveness - of the temperature notification and making it much more realistic. - - tweak: Shuttle transit borders are now 10 tiles wide instead of 8 tiles, hopefully - repairing the immersions that get shattered by the ability to see normal space - where the transit areas end. - - rscadd: Instead of transit turfs simply teleporting things to space, transit is - now handled in a somewhat realistic manner. Transit turfs now act like normal - space turfs, though exiting the transit area or being present in the transit - area after the shuttle moves out of transit will teleport you to space and throw - you in the direction the shuttle was moving in. - - tweak: Reservation areas are now able to designate a border turf. - - bugfix: The sprint hotkey will no longer cause you to get permanently stuck sprinting - if the server lags. Just tap shift again if you get stuck - - rscadd: You can now hear sounds in the real world while inside of a VR sleeper. - - rscadd: You can now make nameless characters. Nameless characters will spawn in - with their name set as their job title followed by a unique five digit number. - The "Name" option in the character setup menu will be replaced with a "Default - designation" option for nameless characters, and the default designation will - be used in place of a job title for assistants and other jobs that don't require - dress codes. - - admin: The out-of-game round end notification is now a little more verbose. It'll - now display the round type, end result of the round, and the survival rate. - - bugfix: Xenos can no longer strip items off of people to be capable of using any - item in the game. - - bugfix: also, items from pockets get placed into your hands properly now - - bugfix: A mob's last words are now properly tracked and recorded on death. The - first death of the round will now actually display the victim's last words on - the round end screen. - - bugfix: Divine shenanigans can no longer result in someone becoming immune to - staminaloss - - bugfix: Fixed body_markings in bodyparts being assigned as a list when in reality, - it's a string and literally everything expects it to be a string and uses it - as a string. This should mean that markings no longer have completely fucked - up caches for character preview and other things. - - tweak: Since apparently the game is literally unplayable if items are not in the - exact center of a turf, the maximum pixel variance of thrown objects has been - reduced by four pixels to make things a smidge more clearer for those that dont - know what a turf is. - - bugfix: Bartender glasses should HOPEFULLY no longer be tilted when landing on - a table. Why the fuck is after_throw called via a timer. - - rscadd: Changeling screeches now have their own unique sounds, and are much easier - to recognize. - - rscadd: Most synthetic emotes are now available to humans. *ping - - rscadd: You can now merp - - balance: The TEG will now only produce a meaningful amount of power if the hot - pipe contains gas that's actively combusting - - admin: Added the "add PB bypass" and "revoke PB bypass" verbs, which allow admins - to let a specific ckey to bypass the panic bunker for the rest of the round - - rscadd: Jogging is no longer treated exactly the same as sprinting for water slips. - When you're jogging, you will only slip on water if you have more than 20% staminaloss. - - tweak: The atmospherics turf subsystem now has double the wait time, which should - free up server processing power for other tasks. - - bugfix: The IRC now actually displays the actual survival rate - - rscadd: Bloodcult conversions are now consensual. Convertees are given a ten second - timer to accept or wait out. This should drastically improve the quality of - those that get converted into bloodcult. - - rscadd: All sacrifices now count as a third of a cultist for the end-game narsie - summon. - - bugfix: Nameless captains will no longer proc a "Captain Captain on deck!" message. - Instead, it'll be a much more boring but much more sensical "Captain on deck!" - message. - - bugfix: Transit turfs on the centcom z-level now function properly again at keeping - mobs within the areas defined by their boundaries. - - bugfix: The title screen is also positioned correctly again. - - tweak: Ghost role eligibility for both event and spawner ghost roles is now affected - by DNR status. If you suicide, ghost, or cryo out, you will be unable to qualify - for any ghost roles - - tweak: Cryo now applies DNR status no matter how long the round has been going - on - - tweak: Suicide is now properly admin logged as it is supposed to be. Ghosting - while alive is now also logged. - - bugfix: Sparks and igniters will now actually heat areas rather than cooling them, - as was intended. - - tweak: To alleviate some potential complaints, RPDs now have a cooldown before - they can create sparks, and both RPDs and emitters produce less sparks. - - tweak: Conversion runes will now mute the victim temporarily while they're deciding - whether to convert or be sacrificed. - - bugfix: Conversion runes no longer require a third cultist to sacrifice if the - victim refuses conversion - - bugfix: Staminaloss targeted at the head now properly redirects to the chest. - - tweak: Sprinting no longer takes stam when you're being pulled or when you're - in zero gravity. Other sources of involuntary movement are not affected. - - code_imp: In an attempt to improve performance during highpop, mouse movements - will now only call onmousemove() while a user is in combat mode - - tweak: Ballistic projectiles are now the only projectiles capable of emitting - dinks. - - admin: Panic bunker toggling and bypassing is now logged in admin IRC - - tweak: OOC and LOOC now use separate toggles. You can now use LOOC while OOC is - globally toggled off, and admins now have the option to toggle LOOC off separately - from OOC - - code_imp: also revamped and reorganized relevant looc adminverb code - - bugfix: The endgame narsie summon rune no longer requires 24 total sacrifices, - and will now properly account for cultists that surround it - - tweak: The succumb verb is now available in the IC tab - - tweak: Lighting now uses a linear algorithm to calculate falloff instead of an - inverse-square algorithm. - - code_imp: get_hearers_in_view() now actually caches the results of view() instead - of calling view() twice - - code_imp: Goonchat's JS no longer contains checks related to a completely unused - message filtering function, which should improve clientside performance quite - a bit - - rscadd: The storage hud now properly takes into account the viewer's view size, - meaning storage items with a large amount of storage slots will properly stretch - across the bottom of the screen when running in widescreen. - - rscadd: Action buttons are now able to fill the entire screen in widescreen and - other weird view sizes. - - rscdel: Omegastation's job changes will no longer be included at compile time. - - code_imp: The client update portion of /mob/Login() now double-checks to make - sure client.player_details exists and is of the proper type. This should hopefully - fix the "cannot read null.player_details" runtimes that can spontaneously cause - clients to get kicked out and forced back to the lobby. - - rscadd: You can now quickly use unequipped items on objects by simply click-dragging - the item onto the object with an empty active hand. Doing so will place the - item in your hand, and then use that item on the object. - - code_imp: In an attempt to improve the performance of /mob/Stat(), various time-related - procs now use defines instead of being procs that call procs that call other - procs that call even more procs. - - bugfix: If a living mob has vore initialized but doesnt have voreprefs initialized, - then client login will force voreprefs to load. - - bugfix: 'Hopefully fixed paper crash 2: electric boogaloo' - - refactor: Added unomos, which is basically listmos except gas mixtures only use - one single list for handling their gasses. This is a significant performance - improvement that also offers a mild memory improvement under normal circumstances. - - balance: Locomotion circuits are now restricted to jogging speed - - balance: MMI circuits and pAI circuits both now have 60 complexity, up from their - original 29. - - tweak: Biogenerators now have a sane limit for production - - bugfix: Fixed a fairly huge server crash exploit - - bugfix: Shield blobs no longer become completely invulnerable to all forms of - damage after reaching a """weakened""" state - - tweak: Taken care of what appeared to have been an oversight where shield blobs - don't recover their armor after becoming weakened. - - bugfix: Nerfed concatenators by limiting the amount of characters they're able - to output - - tweak: The timer for stripping an item off of a spaceman is no longer interrupted - by your active held item changing. This means you no longer have to worry about - filling both of your hands when you're stripping items off of someone. - - rscadd: Ported the zulie cloak and blackredgold coat donor items from RP. - - balance: Normal mops now only use 2 stamina to mop a tile, nerfed from their previous - value of 5 stamina per tile mopped. - - balance: Advanced mops now only use 1 stamina to mop turfs, from their former - value of 2 stam. - - tweak: The femur breaker now uses `*scream` instead of forced speech. This means - that the femur breaker will no longer spam deadchat with "AAAAAAAAAHHHHHHHHHH!!" - - tweak: The femur breaker will now guarantee that the victim falls into crit, which - will make it harder to perform torture scenes with it since the victim can just - succumb. - - bugfix: Fixed another runtime in warp whistles. - - bugfix: Spamming forged packets no longer crashes the server. - - bugfix: Things that access job_preferences now explicitly access keys, which means - it no longer attempts to access invalid indices and runtimes as a result. - - balance: The taser's electrode has been reworked. Instead of being a strong knockdown - that deals a heavy amount of stamloss, it now causes a weak knockdown, applies - a debilitating status effect for 5 seconds, and deals 35 stamloss on hit up - to a maximum 50 total stamloss. - - balance: Roundstart turrets now have a nonlethal projectile that gets used when - they're set to stun and the target is resting - - tweak: Hybrid tasers now have disablers set as their default mode. - - rscadd: There is now a 1% chance for the station's announcer to be the medibot - voice instead of the classic TG announcer. - - rscadd: The map config system has been expanded to allow mappers to specify the - map type, announcer voice, ingame year, and how often a given map can be voted - at roundend. - - bugfix: The map vote system now takes into account map playercount limits properly. - - bugfix: Examining a spaceman, and other things that use get_examine_string(), - will now actually properly show when an item is blood-stained. - - bugfix: Plasmaman tongues no longer have a maxHealth of "alien", and no longer - cause the organ's on_life to always runtime. - - bugfix: Shooting a simplemob no longer causes runtimes prior to the blood effect - being created. - - bugfix: Removing a filter from an object that lacks filters no longer causes runtimes. - deathride58 (Original PR by actioninja): - - rscadd: Disarm pushing (combat mode right click in disarm intent) will now actually - push mobs away. Knockdowns from disarm pushing are no longer rng based on the - target's staminaloss. Knockdowns from disarm pushing now only happen when you - push someone into another mob, a table, or a wall. Pushes will now also temporarily - stop targets from using firearms, and will disarm the firearm if performed a - second time. Pushes still deal staminaloss to standing targets, and won't deal - a single ounce of staminaloss to resting targets. - - rscdel: You can no longer displace mobs that are in harm intent by simply walking - into them. Mobs that aren't in help intent have to be disarm pushed to actually - be moved. - dtfe3: - - tweak: Increased music maxlines from 300 to 600 - - tweak: Made it so any oxygen tank can be used instead of only red ones. - - tweak: Watcher wing Trophy's effect lasts 1 second instead of 0.5 - - rscadd: Pink Panties - - rscadd: Twintails - - rscadd: Schoolgirl outfits for the loadout menu! - - tweak: Now the fox ears are located in front of hair meaning they now behave much - like cat ears, that being they are on-top of the hair layer. - izzyinbox: - - rscadd: adds VoG orgasm command using words "orgasm", "cum", "squirt", "climax" - - rscadd: adds VoG dab command using words "dab" and "mood" - - rscadd: Generic dog body marking sprite - - imageadd: colormatrix dog sprites - - tweak: lowered the player age for command jobs to 1/3 of their previous setting - - rscadd: '*bark emote' - jtgsz: - - rscadd: ported gang mode - kappa-sama: - - rscdel: Removed racism - - tweak: Teleporter calibration actually matters to all roundstart players - - balance: Slows down teleportation with the console/hub/teleporter setup if you - care for your species. - - balance: Dedicated non-humans can now get hulk without having to become human. - - bugfix: seed - - tweak: added obj/item/key to wallet whitelist - - tweak: blood cult ritual daggers fit in jack/combat boots - - tweak: voidcells can now unlock alien tech - - balance: rebalanced tech trees (not really) - - rscadd: hugbox (/s) - - tweak: ashwalker spawn text now tells them "i" "c" not to leave lavaland - - bugfix: you can no longer have infinite ebows - - bugfix: kevinz forgot to nerf miasma research and cargo value after making it - produce like 100x as much lmao - kevinz000: - - balance: Hierophant now goes sicko mode, but hey, at least you can't be multi-hit - by melee waves! - - rscadd: Racking shotguns is now more threatening. - - balance: Medibots no longer kill slimes when trying to heal their toxins. - - rscadd: The Syndicate started selling claymores to their agents. - - balance: Nerfed VTEC modules. - - bugfix: Neurotoxin no longer stuns non-carbons. - - rscadd: peacekeeper cyborgs now get a megaphone - - bugfix: Fixes storage bugs regarding reaching into things you shouldn't be able - to reach into. - - code_imp: BYOND 513 preliminary support added. - - balance: 'Trashbags now only allow accessing the first 3 items. 5 for bluespace - ones. experimental: Storage now allows for limiting of random access' - kiwedespars: - - rscadd: regenerative materia to hallucination sting - - rscadd: mindbreaker toxin as an actual chemical to hallucination sting - lolman360: - - rscadd: NT has authorized shipments or Cotton to Megaseed Servitors. It's time - to start picking, liggers. - - imageadd: missing durathread sprites - - rscadd: Added durathread jumpskirt - - imageadd: Duraskirt sprites and rolled down jumpsuit sprites. - - bugfix: Fixes an undocumented change to the naming of Plasmamen. - - tweak: chainsaw kind of weapons and the mecha drill and the CLAMP can now be used - with 100% accuracy for surgery - - refactor: surgery tools now work on defines - - balance: advanced surgerytools can now switch types instead of just being faster - - bugfix: fixes bug with new surgerytools examine - nicc: - - rscadd: Exo-suit - - rscadd: SEVA suit - - rscadd: Flags for Goliath resistance and weakness - - rscadd: suit voucher - - rscadd: temp suit sprites - - rscadd: '*dab' - - balance: teg less gay maybe - ninjanomnom and WhoneedSpacee: - - rscadd: Some rpg affixes now have special effects - - rscadd: 'New RPGLoot modifiers: Vampirism which heals you when you attack, Pyromantic - which sets things you hit on fire. Shrapnel which causes projectiles fired from - a gun to fire projectiles in a radius when they hit something. Finally, Summoning - which summons mobs that sometimes aid you in combat.' - original by @randolfthemeh and @twaticus, port by sishen1542: - - rscadd: jumpskirts - - rscadd: more jumpskirts - - rscadd: jumpskirt/suit prefs - original by Bumtickley00, port by sishen1542: - - tweak: Suit storage units will now also remove radiation from mobs. - original by GuyonBroadway, SkowronX, and Arizon5. port by sishen1542 and kerse: - - rscadd: Clockwork cultists may now summon forth Neovgre, the ratvrarian super - weapon. This powerful mech can be summoned when applications scripture has been - unlocked, boasts superior offensive and defensive capabilities, however once - a pilot enters he cannot leave and is doomed to die with the mech. - - imageadd: Sexy Sprite work courtesy or SkowronX from /tg/ - - imageadd: brass edits by Arizon5 - - soundadd: steamy laser by kerse - original by Skoglol, port by sishen1542: - - balance: Added lots of new virus cures, made cure difficulty scale more consistently. - Cures are now picked from a list of possible cures per resistance level, multiple - diseases at the same level no longer always share a cure. Looking at you table - salt. - - admin: Dynamic gamemode now more auto-deadmin friendly. - original by TheChosenEvilOne, port by sishen1542: - - rscadd: Ported dynamic mode from /vg/, originally made by @DeityLink, @Kurfursten - and @ShiftyRail - original by Tlaltecuhtli, port by sishen1542: - - rscadd: rcd disk that gives rcd computer frame and machine frame designs - - rscadd: upgraded rcd in CE lockers - - tweak: moved deconstruction to the upgrade disk, ashwalker rcd comes upgraded - original by actioninja, port by sishen1542: - - tweak: Medical and Security consoles now check access on worn or inhand ID instead - of requiring an inserted ID - - tweak: mining vendor now reads from ID in hand or on person instead of requiring - an inserted ID - - bugfix: ORM is functional again (for real this time) - - tweak: ORM claim points button transfers points to worn/inhand ID instead of to - an inserted ID, no longer accepts insertions - - tweak: Same for gulag consoles - original by redmoogle, port by sishen1542: - - rscadd: Added support for 3 new gasses; Tritium, Pluoxium, and BZ - 'original by: WJohnston, Antur, Arcane, plapatin, sprites by cogwerks and edited by mrdoombringer. port by sishen1542': - - rscadd: THE GOOSE IS LOOSE - r4d6: - - rscadd: Added decoratives angel wings for Mammalians only - - rscadd: Added blindfolds to the Loadout list - - rscadd: Added Decorative Wings for Humans, Felinids, Slimepersons and Lizardpeoples. - - tweak: Change the SEVA suit & Exo-suit's descriptions - - bugfix: Batteries are now Rad-Proof like the other stock parts - tigercat2000@Paradise: - - bugfix: fixed invalid characters breaking chat output for that message - tinfoil hat wearer: - - rscadd: Added a new alien technology disk to scientist and roboticist uplinks - that allows them to research the heavily-guarded secrets of the Grays. - - tweak: Alientech is now the only Hidden alien research. To compensate for this, - alien_bio and alien_engi have had their research costs doubled and now require - advanced surgery tools and experimental tools respectively to research. Their - export price is also halved. - - balance: roboticists now have brainwashing disks AND alien technology added to - their role-restricted uplink section. alien technology gives them brainwashing - at a much later date, so brainwashing is the much cheaper option for instant - power. makes logical sense because doctors get it as well because they do surgery, - and roboticists can now either choose to brainwash people for less price but - less power or emag borgs for higher prices, limited uses, but higher power. - ursamedium: - - imageadd: Gas icons changed. -2019-12-07: - AffectedArc07: - - code_imp: Fixes a LOT of code edge cases - Anonymous: - - rscadd: Added NEET-- I mean, DAB Suit and Helmet into loadout. Exclusive to Assistants, - for obvious reasons, and don't provide any armor. Goes well with balaclava, - finger-less gloves and jackboots for that true tactic~~f~~ool experience. - - tweak: Renamed loadout name appropriately (ASSU -> DAB) - Arturlang: - - tweak: PDA catridges cant be irradiated anymore. - Bhijn: - - code_imp: Item mousedrop() now provides a return value indicating whether or not - behavior has been overridden somehow. - - bugfix: Defibs now properly check that their loc is the same as the user for mousedrop() - calls, meaning ghosts can no longer make you equip defibs. Plus extra sanity - checks. - - bugfix: Pet carriers no longer attack turfs while trying to unload their contents. - - bugfix: Decks of cards now function as they originally intended when attempting - to use their drag and drop behavior. - - bugfix: Paper bins and papercutters no longer act wonky when you're trying to - pull a piece of paper from them. - - bugfix: Adds clothing drag n drop sanity checks. - - bugfix: Sythetic hats now have extra sanity checks - Coconutwarrior97: - - bugfix: Can only wrench down two transit tubes per turf. - Commandersand: - - rscadd: Added more stuff to loadout,check uniforms mask and backpack - DeltaFire15: - - rscadd: Adds eight new plushies - - imageadd: Adds icons for the new plushies and adds a new icon for the skylar plush - - imagedel: Deleted a old, no-longer used icon for the skylar plush - - spellcheck: Fixed a typo in the trilby plush - Fermis: - - tweak: tweaks botany reagent pHes - - tweak: Purity, Astral, RNG, MK, SMilk, SDGF, furranium, hatmium, eigen, nanite. - - bugfix: Eigen and purity. - - refactor: refactored sleepers! - - rscadd: Organ fridges to all maps near surgery with a random sensible organ, steralizine - and synthtissue. - - tweak: the med hand scanner to be less of a mishmash of random things - - rscadd: a little icon to the HUD if someone's heart has failed. - - tweak: Lets neurine's brain splash attack work via syringe. - - rscadd: a new surgery; Emergency Cardioversion Induction for use on the recently - deceased - - tweak: Synthtissue to be less demanding on growth size for organ regeneration - and improves clarify of it's growth gated effects. - - tweak: Synthtissue now is more useful than synthflesh on the dead - Fox McCloud: - - bugfix: Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot - would be less prone to igniting - Fox McCloud, Ghommie: - - bugfix: Fixes being able to mech-punch other mobs, as a pacifist - - bugfix: Fixes being able to hurt people, as a pacifist, by throwing them into - a wall or other mob, or by using most martial arts (save for the unpredictable - psychotic brawl, and the stamina-damage-only boxing). - - balance: Buffs boxing to outdamage natural stamina regeneration. Made the chance - of outright missing your opponent actually possible. - - tweak: Pacifists can now engage in the (laughably not harmful) sweet sweet art - of boxing now. - Ghommie: - - bugfix: Fixing implant cases being lost inside implant pads when trying to eject - them with your active hand full. - - tweak: Moved the implant pad's case ejection from attack_hand() to AltClick(), - added examination infos about it. - - bugfix: Fixed holodeck sleepers leaving sleeper buffers behind when deleted. - - bugfix: Fixed traitor codewords highlight and some other hear signal hooks spans - highlight (phobias, split personality, hypnosis) or modifiers (mind echo) - - bugfix: Fixed traitor codewords highlight not passing down with the mind datum - and stickying to the first mob. - - spellcheck: Fixed the incongruent bone satchel description. - - bugfix: Fixed sofa overlays doing nothing, because their layer wasn't properly - set. - - tweak: Suicide and cryo now prevents ghost/midround roles for a definite duration - of 30 minutes (and more if that was done before 30 minutes in the game passed), - down from the rest of the round. - - bugfix: fixed several midround roles bypassing and nulling the aforementioned - prevention measures. - - bugfix: Fixed the little issue of PDA skins not updating on job equip. - - tweak: Anomaly Crystals of the clowning type will now rename the victim to their - clown name preference when triggered, instead of giving them a random clown - name. - - balance: Lowered blob event earliest start from 1 hour to 40 minutes (ergo one - third), and the required player population from 40 to 35. - - bugfix: Several fixes and QoL for dullahans. They can see and hear visible and - audible messages now, don't need a space helmet they can't wear anyway to be - space/temperature proof, can examine things through shiftclick, and, most of - all, fixed their head being unpickable. Fixed dullahans gibbing when revived - or had their limbs regenerated. - - bugfix: humans should now drop gibs when gibbed again. - - rscadd: synths (not to be confused with IPCs), android and corporate species, - as well as robotic simple mobs, will now spawn robotic giblets instead of organic - ones. - - bugfix: You can't wear dakimakuras in any other inappropriate slots save for the - back slot anymore, degenerates. - - bugfix: Insert snarky remark about clock welders actually displaying the welder - flame overlay when turned on now here. - - balance: Minor ninja tweaks and stealth nerfs. The stealth penalty for the many - combat-related actions, bumping and now teleporting/dashing or firing guns has - been increased a by a third. There is now a cooldown of 5 seconds on toggling - stealth as well as a slighty slowed stealth in/out animation. - - imageadd: Ported slighty better matchbox sprites from CEV-Eris, also resprited - cigar boxes myself. - - bugfix: Fixed abductors/abductees objectives by porting an objective code. - - bugfix: Riding component fix - - bugfix: fixing a few runtimes on lightgeists, libido trait, rcd, one admin transformation - topic, chem dispensers, glowing robotic eyes... - - imageadd: Porting CEV-eris delivery packages sprites and dunking the old syndie - cybernetics box sprite. - - bugfix: Certain objects shouldn't be able to become radioactive because of a bitflag - that previously was checked nowhere in the code anymore. - - rscadd: Added a new PDA reskin, sprites from CEV-Eris - - rscadd: Clock cult starts with some spare vitality matrix charge scaled of the - number of starter servants. - - balance: Made the vitality matrix sigil slighty more visible, also allowed conversion - runes to heal fresh converts at the cost of some vitality charge. - - bugfix: 'Crawling won''t save you from the wrath of ocular wardens and pressure - sensors anymore, heretics. fix: Pressure sensors are no more triggered by floating/flying - mobs.' - - bugfix: Strawberry milk and tea have sprites now. - - bugfix: Fixed the Aux base camera door settings and toggle window type actions. - Also enabling the user to modify both door access and type. - - imageadd: Improved the two grayscale towel item sprites a little. - - bugfix: Fixed towels onmob suit overlays. Again. - - spellcheck: Fixed some reagents taste descriptions. - - bugfix: Fixed hidden random event reports only priting a paper message without - sending the message to the consoles' message list. - - bugfix: Rosary beads prayer now works on non-carbon mobs too, and won't break - when performed on a monkey or other humanoids. - - tweak: You can flagellate people with rosary beads on harm intent. It's even mediocrer - than the sord though. - - tweak: Moved the `Stealth and Camouflage Items` uplink category next to `Devices - and Tools`. - - bugfix: Deleted a duplicate phatom thief mask entry from the uplink. - - bugfix: Fixed missing delivery packages sprites - - bugfix: fixed a few minor issues with console frames building. - - bugfix: Wizards can use the teleport spell from their den once again. - - tweak: Wizards will now receive feedback messages when attempting to cast teleport - or use the warp whistle while in a no-teleport area. - - rscadd: New clockwork cultist, gondola, monkey and securitron cardboard cutouts. - - bugfix: Fixed aliens gasping randomly once in a while. - - bugfix: fixed superlube waterflower, my bad. - - bugfix: Fixed closing the aux base construction RCD's door access settings window - throwing you out of camera mode when closed. - - rscdel: Removed not functional aux base RCD's door type menu. Use airlock painters, - maybe. - - rscadd: Honkbot oil spills are of the slippery kind now. Honk. - - imageadd: local code scavenger finds forgotten slighty improved apc sprites left - buried in old dusty folders. - - bugfix: Seven old and otherwordly pAI holochassis icons have crawled their way - out of the modular citadel catacombs. - - bugfix: chem dispenser beakers end up in your hand yet again. - - bugfix: Bikehorns squeak yet again, the world is safe. - - bugfix: Cyborgs can now actually use cameras from a distance. - - bugfix: Suicides are yet again painful and instant and won't throw people in deep - crit from full health. - - bugfix: fixed rogue pixels on the energy gu- ahem blaster carbine... and a few - apc lights states being neigh-indistinguishable. - - bugfix: Fixed several "behind" layer tail sprites skipping areas normally covered - by bodyparts. - - bugfix: Morgues' original alert beeping sound has been restored, they no longer - go "ammunition depleted" - - bugfix: Fixed missing hypereutactic left inhand sprites. - - bugfix: Dying, ghosting, having your mind / ckey transferred to another mob, going - softcrit or otherwise unconscious now properly turn off combat mode. - - bugfix: combat mode can't be toggled on while non fully conscious anymore. - - bugfix: Fixed limbs' set_disabled NOT dropping your held items, updating your - hand slot inventory screen image, prompting chat messages and making your character - scream like a sissy. - - bugfix: Lusty xenomoprh maids will now actually clean tiles they travel onto yet - again. - - bugfix: Fixed double whitespace gap in human and AI examine. Fixed single whitespace - in carbon examine. - - rscdel: 'Removed a few useless supply packs: "Siezed" power cells, means of production - and promiscous organs.' - - tweak: Merged the synthetic blood supply pack into the standard blood supply pack, - effectively removing a random type blood pack in favor of two synthetic ones. - - tweak: "Merged together premium carpet pack n\xB01 and n\xB02 to hold one of each\ - \ standard pattern." - - tweak: You can no longer estimate the amount of reagents found inside a damp rag. - - tweak: You can now squeeze a rag's reagents into another open container, as long - as the other one is not full. - - bugfix: Fixed ED-209 being unbuildable past the welding step. - - bugfix: Fixed ai displays status being reset to "Neutral" on login, regardless - of choice. - - bugfix: Fixed tinfoil hats giving random traumas. - Ghommie (original PR by Denton): - - rscadd: Added three new .38 ammo types. TRAC bullets, which embed a tracking implant - inside the target's body. The implant only lasts for five minutes and doesn't - work as a teleport beacon. Hot Shot bullets set targets on fire; Iceblox bullets - drastically lower the target's body temperature. They are available after researching - the Subdermal Implants node (TRAC) or Exotic Ammunition node (Hot Shot/Iceblox). - - tweak: Renamed the Technological Shells research node to Exotic Ammunition. - - code_imp: The "lifespan_postmortem" var now determines how long tracking implants - work after death. - - rscadd: .357 AP speedloaders can now be ordered from syndicate uplinks. - - balance: lowered the cost of uplink's .357 speedloaderd from 4 to 3. - Ghommie (original PR by nicbn and Menshin): - - bugfix: You can click on things that are under flaps or holo barriers. - Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak): - - rscadd: Adds the intelliLantern, a big ol' spooky intelliCard skin - - rscadd: crafting recipe for the new intelliCard skin (requires 1 pumpkin, 1 intelliCard, - 5 cables and a wirecutter as a tool) - - tweak: changed the intelliTater crafting recipe to match the intelliLantern recipe - (but with a potato for obvious reasons) add:cute pai gameboy face :3 - Ghommie, porting lot of PRs by MrDoomBringer, AnturK, nemvar and coiax.: - - admin: Admins can now launch supplypods the old, slightly quicker way as well - - bugfix: Centcom-launched supplypods will now properly delimb you (if they are - designated to do so) instead of touching you then literally yeeting all of your - internal organs out of your body. - - admin: Centcom can now specify if they want to yeet all of your organs out of - your body with a supplypod - - soundadd: Supplypods sound a bit nicer as the land now. - - admin: admins can now adjust the animation duration for centcom-launched supplypods - - admin: admins can adjust any sounds that are played as the supplypod lands - - bugfix: Reverse-Supplypods (the admin-launched ones) no longer stay behind after - rising up, and also auto-delete from centcom. - - admin: The centcom podlauncher now has better logging - - tweak: Admins can now allow ghosts to follow the delivery of Centcom-launched - supply pods - - admin: Admins can now use the Centcom Podlauncher to launch things without the - things looking like they're being sent inside a pod. - - admin: sparks will not generate if the quietLanding effect is on, for the centcom - podlauncher - - admin: makes input text clearer for the centcom podlauncher - - admin: New 'Podspawn' verb, which functions like 'Spawn', except any atoms movable - spawned will be dropped in via a no-damage, no-explosion Centcom supply pod. - - bugfix: Removed an oversight that made many obj/effect subtypes accidentally bombproof. - GrayRachnid: - - rscadd: Added saboteur syndicate engiborg - - tweak: changed cyborg tool icons and the secborg taser/laser icons. - - bugfix: Fixes golden toolbox missing inhand sprite - - rscadd: Added traumas - - rscadd: Added science powergame tool - - tweak: a few hearing args - - bugfix: fixed my mistakes - - tweak: tweaked the number of ingredients/pancakes you can stack. - Hatterhat: - - tweak: The Big Red Button now sets bomb timers to 2 seconds, instead of 5. - - tweak: Gloves of the North Star (not Hugs of the North Star) now use all their - intents very, very fast. This does not apply to grabs' click cooldown, nor shoving - people. - - rscadd: The seedvault/alien plant DNA manipulator can now be printed off with - Alien Biotechnology. - Iroquois-Pliskin: - - rscdel: Removed Clockwork Cult Surgical facility from Reebe - Jerry Derpington, baldest of the balds, and nemvar.: - - rscdel: Nanotrasen has lost communication to two away mission sites that contained - a beach for Nanotrasen employees. - - rscadd: Nanotrasen has been able to locate a new away mission site that ALSO has - a beach. Nanotrasen employees will be able to enjoy the beach after all! - - rscadd: Seashells have been added to the game. - KathrinBailey: - - rscadd: Two extra 'luxury' dorms rooms! - - rscadd: Gas miners to atmos. - - rscadd: Posters around the station. - - rscadd: Vacant room added to the Starboard Bow with it's own APC, above electrical - maintenance. - - rscadd: New trendy clothes to the locker room, giving variety and bringing fashion - back onto Nanotrasen stations. - - rscadd: Coloured bedsheet and towel bin. - - rscadd: Maid uniforms for the janitor. - - tweak: Completely reworked bar. Milk kegs added in bar office. The bar has been - changed for a homey restaurant feel just in time for Christmas! You can now - run it as an actual restaurant! Local Bartender Icktsie III loved it so much - he rolled around on the new floor smiling happily. - - tweak: Dorms rework. Fitness room now has lots of costumes and outfits. - - tweak: Junk removed from engineering, welding goggles added. - - tweak: Welding tools in engineering replaced with industrial welding tools. - - tweak: Package wrappers and hand labellers now in major departments. - - tweak: Cell charger moved from engineering lobby to the protolathe room, just - like how it is in all of the other maps and just where the cell charger is actually - needed. - - tweak: Library redesigned to have a private room and a 3x3 private study that - is cleaned up. - - tweak: Paper bins have gone big or gone home, with premium stationery scattered - around. Engineering and security now have a labeller and packaging supplies. - - bugfix: Dark spot top left of Botany fixed. - - bugfix: Huge galactic-sized dark spot in bar fixed. - - bugfix: Light replacers now are less horrifically overpowered and PTSD-inducing - for the server. - - bugfix: 'Fixes issue 9706: https://github.com/Citadel-Station-13/Citadel-Station-13/issues/9706 - Part of maint getting hit by radstorms. - - _Kathrin''s Box Beautification:_' - - rscadd: Ports TG's pews https://github.com/tgstation/tgstation/pull/42712 - - rscadd: The first step of a corporate incursion of Space IKEA into Nanotrasen. - Kevinz000, Cruix, MrStonedOne, Denton, Kmc2000, Anturk, MrDoomBringer, Dennok, TheChosenEvilOne, Ghommie: - - rscadd: Added support for Multi-Z power, atmospherics and disposals - - bugfix: 'massive service department nerf: space can no longer be extra crispy.' - Knouli: - - rscadd: attack_self proc for the legion core which triggers a self-heal al la - the previous 'afterattack' proc, as if clicking on the character's own sprite - to self-heal - - rscadd: admin logging for all three use cases of legion core healing - afterattack, - attack_self, and implanted ui_action_click - Krysonism, Ghommie: - - rscadd: NT has made breakthroughs in ice cream science, ice creams can now be - flavoured with any reagent! - - tweak: The ice cream vat now accepts beakers. - - bugfix: Grape and Peach icecreams have scoop overlays yet again. - Linzolle: - - code_imp: butchering component update - - tweak: hat tossing can no longer knock hats off - - bugfix: strange reagent being unable to revive simplemobs - - rscadd: jitter animation and more clear text to strange reagent revival - Mickyy5: - - rscadd: Nanotrasen are now issuing Plasmamen with plasma in their survival boxes - MrJWhit: - - tweak: tweaked brain damage line - Naksu, ShizCalev: - - refactor: Refactored examine-code - - bugfix: Examining a human with a burned prosthetic limb will no longer tell you - that the limb is blistered. - - tweak: Items will now inform you if they are resistant to frost, fire, acid, and - lava when examined. - Owai-Seek: - - rscadd: '"silly" bounties' - - rscadd: '"gardenchef" bounties' - - rscdel: several bounties that require seriously good RNG to pull off. - - tweak: moved several chef and assistant bounties to silly and gardenchef - - balance: modified several bounty point rewards - - server: added new files "silly.dm" and "gardenchef.dm" - - rscadd: 15+ new crates for cargo - - tweak: organizes crates and moving them to proper categories - - rscdel: some dumb stuff like toner crates re - - rscadd: leg wraps and sweaters to clothesmate - - rscadd: screwdriver and cable coil to janidrobe - - rscadd: screwdriver and cable coil to janibelt whitelist (for fixing/placing light - fixtures) - - rscadd: monkey cube, syringe, enzyme, soy sauce, and cryoxadone to chef's vendor - (contraband and premium) - - rscadd: add cracker, beans, honey bars, lollipops, chocolate coin, and spider - lollipop to snack vendors (contraband and premium) - - rscadd: newspaper to loadout menu for bapping purposes - - rscdel: removed poppy pretzels from snack vendor premium - - rscadd: maid uniform (janimaid alt) to kinkmate. - - tweak: moves gear harness from premium to normal stock in kinkmate - - balance: re-balanced metal shield bounty - - rscadd: cryoxadone bottle (for use in chef vendor) - PersianXerxes: - - tweak: Reduces the grace period for meteors from a minimum of 5 and maximum of - 10 to 3 and 6 minutes respectively. - - rscadd: Adds a pair of VR sleepers to Box Station's permabrig - - rscadd: Adds a pair of VR sleepers to Delta Station's permabrig - - rscadd: Adds a pair of VR sleepers to Pubby Station's permabrig - - rscadd: Adds a pair of VR sleepers to Meta Station's permabrig - Putnam: - - bugfix: From-ghosts dynamic rulesets now actually listen to "required candidates" - - bugfix: Every dynamic-triggered event is now blacklisted from being triggered - by the random events system when dynamic can trigger them. - - rscadd: Dynamic voting now features extended, if recent rounds have been chaotic. - - tweak: Roundstart rulesets now scale on population ready rather than total population. - - bugfix: Threat log now accurately represents what actually used the threat. - - tweak: Verbose threat log (admin-only) now shows ALL threat level changes. - - bugfix: VR mobs can no longer be dynamic midround antags. - - bugfix: Personal closets can use anything that holds an ID card now. - Putnam3145: - - bugfix: traitors work now - - balance: Gas filters now push gas the same way volume pumps do. - - balance: Gas filters now won't clog if only one output is clogged. - - tweak: Glowsticks can no longer be radioactively contaminated (one more supermatter - contam exploit gone) - - bugfix: traitor removal is no longer borked - - rscadd: Dynamic voting - - config: Added DYNAMIC_VOTING to game_options - - tweak: SDGF now copies memories as well as antag data and factions. - - bugfix: Summon events now properly costs threat. - - bugfix: Refunded spells refund threat, too. - - refactor: Made wizard spells inherently have a requirement and cost. - - tweak: Meteor wave is no longer repeatable in dynamic. - - tweak: tweaked nuke ops - - bugfix: Organs can no longer be radioactively contaminated. - Robustin, Subject217: - - balance: The NukeOp Shuttle hull has been dramatically hardened. The walls are - now "R-Walls" with far greater explosion resistance. - - balance: The NukeOp Shuttle guns have been significantly buffed. They now rapidly - fire a new type of penetrator round, at a greater range, and have far greater - explosion resistance. - - balance: The nuclear device on the NukeOp Shuttle is now in an anchored state - by default, the Nuke can only be unanchored by inserting the disk and entering - the proper code. - - balance: Non-Syndicate cyborgs are now unable to access the NukeOp Shuttle Console. - - bugfix: You can now unanchor Nukes even when the floor under them has been destroyed - Seris02: - - rscadd: added sleeping carp hallucination - - rscadd: Centcom + Assistant's formal winter coat + loadout + narsian + ratvarian - winter coats - - rscadd: GPS location on examine - - bugfix: fixed the meteor hallucination - - tweak: tweaked the way the tapered penis looks - - rscadd: Added nine winter coats - - imageadd: added images for the winter coats - - tweak: adds the mining winter coat to mining wardrobes and mining lockers - ShizCalev: - - tweak: Ghosts can now see active AI cameras. - - bugfix: Fixed a couple of laser / energy guns never switching to the empty icon - despite being unable to fire. - Swindly: - - bugfix: Fixed MMIs not being able to use mecha equipment - - bugfix: Fixed MMIs not getting mecha mouse pointers - - bugfix: Fixed MMIs not getting medical HUDs in Odysseuses - - tweak: Brains can now switch to harm intent - Tetr4: - - bugfix: Turning a tile with gas effects into space now gets rid of the effects. - Trilbyspaceclone: - - rscadd: plastic trash cart crafting with plastic - - rscadd: wallets are known for now holding more items - - tweak: shades and clowns HP - - rscadd: six more crates, A barrel, A Loom, 40 cotton sheets, two sets of fruit - crates, raw lumber crate - - rscadd: All fermi chems, Boozes, Medical, food chems now sell - - rscadd: Loads more to sell - Mech gear, Cooking and more! - - tweak: Moved around the vaule of some things and removed elastic of most items - - balance: Rebreather implants will now loss vaule, Do to being just metal and glass - - balance: lowered how many chems are in lewd chem kegs to be around 150-100 as - well as the fancy booze kegs - - bugfix: bad returns and tools used - - rscadd: 8 new cargo crates! - - tweak: tablet cargo crate by -3k - - admin: Closes a bunch of issues - - server: updates changlogs and such - - bugfix: fixed a catnip not having sprites - - balance: Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw - and base ball bat into bulky items so they may fit - - server: changes header to be more cit-like - - rscadd: new clothing for the hotel staff and a hat - Ty-the-Smonk: - - bugfix: You can now interact with self sustaining crossbreeds - Useroth: - - rscadd: Colored fairygrass variants. - - bugfix: Added a missing cherrybulb seedpack sprite - - bugfix: numbered storages now are sorted in a consistent way, instead of depending - on ordering of their contents var - - rscadd: strange seeds as a buyable traitor botanist item - - bugfix: resolves the issues revolving around blackpowder exploding where the reaction - happened, instead of where it actually is through making it explode instantly - - tweak: the explosion delay moved from blackpowder directly into bomb cherries, - to keep them functioning as intended - - rscadd: A bunch of newer tg plants - - rscadd: A bunch of newer tg plant traits - - rscadd: A couple of newer tg plant reagents - - bugfix: the new plants now properly get their reagents and reagent genes instead - of being empty with UNKNOWN reagents listed in the DNA machine - - rscadd: extradimensional oranges now contain haloperidol - - bugfix: extradimensional oranges now actually grow properly and give proper seeds. - Weblure: - - rscadd: Button added to slime console that prints out the hotkey commands to the - user. [Includes DMI update] - - rscadd: Shift-click a slime to pick it up, or the floor to drop all held slimes. - (Requires Basic Slime Console upgrade) - - rscadd: Ctrl-click a slime to scan it. - - rscadd: Alt-click a slime to feed it a potion. (Requires Advanced Slime Console - upgrade) - - rscadd: Ctrl-click on a dead monkey to recycle it, or the floor to place a new - monkey. (Requires Monkey Console upgrade) - - rscadd: If the console does not have the required upgrade, an error message will - print to the user. - - rscadd: You can now pick up a single slime from a pile, instead of all of them - at once. - - tweak: When recycling monkeys, the console will now report how many monkeys it - has (will not report decimal increases). - - tweak: Console now alerts you when you're out of monkeys and reports your current - decimal amount. - - tweak: Console messages are now styled consistently. - XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie): - - tweak: Holding an ID in your hands uses it instead of your worn ID for authentication - purposes. - - tweak: If you don't have an ID in your id slot, the belt slot will be checked - as well. - - code_imp: small cleanup to id and bounty console html generation - - tweak: Hop console now hurts your eyes less. Red button text replaced with green. - - tweak: IDs with ID console access now go into the Confirm Identity slot by default - like they used to, similarly IDs without it go into the Target slot by default - again - - rscadd: Can easily swap out IDs by clicking the machine or the UI fields with - another ID - - rscadd: ID console now names which IDs are added/removed in its visible messages - - rscadd: Labels the ID slot fields when logged in so you know which is which - - tweak: Can use Job Management without an ID provided the console is logged in - (matches how the console now stays logged in even without an ID) - - tweak: Can log in without an ID in the Target field (matches how the machine now - stays logged in even after the ID is removed from the Target field) - - tweak: Cleans up UI slightly (had some duplicate/conflicting buttons) - - bugfix: Fixes ID console duping issues. Includes some ID containers, such as PDAs, - tablets and wallets, into the swapping behavior when an ID card is being removed - and the item is being held. - Xantholne: - - rscadd: New Berets for most heads and departments available in their autodrobes - or lockers - YakumoChen: - - imageadd: New AI Holograms and Displays! Ported from /vg/station. - actioninja: - - bugfix: med records no longer can eat id cards for no reason - - bugfix: Chat is properly sent to legacy window if goonchat fails to load again. - dapnee: - - bugfix: fixed closet initialisation being broken - - rscdel: emergency closets no longer have a 1% chance to delete themselves - - bugfix: Communications console window no longer updates, won't steal focus anymore. - - bugfix: Trimline neutral end exists now. - dzahlus: - - soundadd: added a new gun sounds - - sounddel: removed an old gun sounds - him: - - bugfix: hos and aeg guns now conform to le epic taser rework standards - kappa-sama: - - tweak: changed flavor text of alien tech on uplink - - imageadd: added TG's icons for traitor, russian, and golden revolver - kevinz000: - - rscadd: you can now choose never for this round for magical antags - - rscadd: Cargo has passive point generation again at 750 points/minute - - balance: Mindshield crate price increased from 3000 to 4000 - - balance: Miasma sell price reduced from 15/mol to 4/mol - - balance: bluespace wizard apprentice now has blink instead of targeted area teleportation - - balance: Emagged medibots now charcoal toxinlovers. - - balance: disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage - - balance: kinetic crushers no longer drop if you try to use it with one hand - - config: added multi_keyed_list, delimiter defaults to |. - - balance: Light pink extracts no longer speed you up. Instead, they give stamina - regeneration and free sprinting. - kiwedespars: - - rscdel: removed moth fluff coloring you like your wings - - balance: made insect not so bad. - nemvar: - - bugfix: You now get a message if your PDA explodes while you are holding it. - - tweak: The lavaland clown ruin has some new pranks ready. - - rscadd: Added a new loot item to the lavaland clown ruin. - - rscdel: Removed the slime core from said ruin. - - balance: The clown PDA now properly slips people on jogging move intent regardless - of fatigue. Honkmother's will. - nemvar, ShizCalev, Qustinnus/Floyd, Ghommie: - - rscadd: You can now unfasten the loom. - - tweak: it now takes 4 strands to make one piece of durathread cloth - - bugfix: Looms can now be attacked. - - rscadd: Durathread golem weaves his magic - - tweak: Supply ordered looms are unanchored. Bring a wrench. - r4d6: - - rscadd: Added Departements Winter Coats to the loadout list. -2019-12-30: - AnturK: - - bugfix: Fixed ranged syndicate mobs stormtrooper training. - Arturlang: - - rscadd: Adds Bloodsuckers, beware. - BlueWildrose: - - bugfix: Fixed stargazers being unable to link to themselves if mindshielded or - if holding psionic shielding devices (tinfoil hats) when the species is set. - - bugfix: Fixes non-roundstart slimes being unable to wag their tail. - Commandersand: - - tweak: added two words to clown filter - - rscadd: Added new things to loadouts, check em - DeltaFire15: - - balance: Clock cult kindle no longer cares about oxygen damage - - tweak: changed mecha internals access for some special mechs. - - tweak: no more mech maintenance access for engineers. - - tweak: All heads of staff can now message CC - - code_imp: Removes a magicnumber - - balance: Rebalanced cult vs cult stun effects to debuff instead of stun - Detective-Google: - - bugfix: short hair 80's is no longer jank - Fermis: - - tweak: tweaked how super bases/acids work but limiting them - Fikou: - - tweak: the windup toolbox now has some more "realistic" sounds - - bugfix: the windup toolbox now rumbles again - Ghommie: - - bugfix: Fixed hulks, sleeping carp users, pacifists and people with chunky fingers - being able to unrestrictly use gun and pneumatic cannon circuit assemblies. - - bugfix: Fixed gun circuit assemblies being only usable by human mobs. - - balance: Doubled the locomotion circuit external cooldown, thus halving the movable - assemblies' movespeed. - - tweak: Made wooden cabinet/closets... actually made of wood. - - tweak: Wooden cabinets are now deconstructable with a screwdriver. - - tweak: Deconstruction of large crates and other closet subtypes deconstructable - with tools other than the welder is no longer instant. - - tweak: You shouldn't be able to target objects you can't see (excluding darkness) - with the ARCD and RLD - - tweak: The admin RCD is ranged too, just like the ARCD. - - bugfix: Fixed welding, thirteen loko, welding and wraith spectacles not blinding - people as expected. Thank you all whomst reported this issue in the suggestions - box channel instead of the github repository's issues section, very smart! - - bugfix: Fixed on_mob eyes overlays not updating properly in certain cases. - - bugfix: Fixed deconversion from bloodshot eyes blood cult resetting your eyes' - color to pitch black instead of their previous color, more or less. - - balance: 'Spinfusor nerf: Upped the casing and ammo box size by one step, removed - the projectile''s dismemberment value (explosions can still rip a limb or two - off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents - from 32 to 8, removed the casing''s ability to explode when thrown.' - - bugfix: Fixes bubblegum's death not unlocking the arena shuttle buyment. - - bugfix: Fixed alien tech node not being unlockable with subtypes of the accepted - items. - - bugfix: Fixed reactive armor onmob overlays not updating when toggled and reactive - teleport armor still using forceMove() instead of do_teleport() - - bugfix: Fixed space hermit asteroid rocks unintendedly spawning airless asteroid - turf when mined, save for the perimeter. - - bugfix: Fixes reviver implant having been a crapshot ever since soft-crit was - introduced years ago. - - tweak: Added a "convalescence" time (about 15 seconds) after the user is out of - unconsciousbess/crit to ensure they are properly stabilized. - - tweak: Added a 15 minutes hardcap for accumulated revive cooldown (equivalent - to 150 points of brute or burn healed) above which the implant starts cooling - down regardless of user's conditions. - - bugfix: Fixed AI core displays I may have broken with my coding extravaganza. - - soundadd: Blue, Amber and Red security alert sounds should be half as loud now. - - balance: Buffed clown ops by removing their clumsiness and adding a new trait - to be used in place of several clown role checks. - - tweak: Clown ops too also suffer from not holding or wearing clown shoes now. - - bugfix: Fixed a few holo barriers lacking transparency. - - bugfix: Fixed character setup preview bodyparts not displaying correctly most - of times. - - bugfix: Fixed character appearance preview displaying the mannequin in job attire - instead of undergarments. - - bugfix: Fixed raven's shuttle computer not being of the emergency shuttle type. - - tweak: Blood bank generators can now be anchored and unanchored now. - - admin: Ghost mentors can now orbit around the target instead of setting their - view to theirs'. - - bugfix: Fixes a ghostchat eavesdropping exploit concerning VR. - - bugfix: Fixes VR deaths being broadcasted in deadchat. - - bugfix: Fixed a few pill bottle issues with the ChemMaster. - - bugfix: Fixes a few negative quirks not being properly removed when deleted. - - tweak: Phobia and mute quirks are no longer cheesed by brain surgery grade healing - or medicines. - - bugfix: Fixed double-flavour (and bland custom) ice creams. - - bugfix: Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'. - - bugfix: dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just - like humies, ayys and monkys. - - bugfix: Stops humanoids whose skin_tone variable is set to "albino" from showing - up as pale when examined should their species not use skintones anyway. - - rscdel: Removed the old (almost) unused roboticist encryption key and headset. - - bugfix: Fixed goose meat. - - bugfix: Fixed a little door assembly glass dupe exploit - - bugfix: Fixed AI holopad speech text being small and whispers that in multiple - exclamation marks echo through multiple areas. - - rscdel: Removed literally atrocious polka dotted accessories. They were even more - atrocious than the yellow horrible tie. - Ghommie (also porting PRs by AnturK and Arkatos): - - bugfix: Fixed light eaters not burning out borg lamplights and flashes. fix Fixed - light eater not affecting open turfs emitting lights such as light tiles and - fairy grass. - - bugfix: Fixed an empty reference about light eater armblade disintegration after - Heart of Darkness removal. - Ghommie, Skogol: - - refactor: refactored altclick interaction to allow alt-click interactable objects - to parent call without forcing the turf contents stat menu open. - - tweak: Alt clicking will no longer show turf contents for items inside bags etc. - - tweak: Alt clicking the source of your turf contents stat menu will now close - said menu. - GrayRachnid: - - bugfix: fixes consistency - Hatterhat: - - rscadd: Regenerative nanites, a "chemical" used in the combat stimulant injector. - Actually quite stimulating, and not bad in a pinch for a nuclear operative. - Check the Combat Medic Kit! - - tweak: The Combat Medic Kit now has an advanced health analyzer and medisprays - instead of patches and a chloral syringe. - - balance: The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get - the better injector, because nobody uses it and so nobody's bothered to update - it. - - rscadd: .357 speedloaders can now be printed with the Advanced Illegal Ballistics - node on the tech tree! - - balance: okay so i may have given the .357 an extra speedloader at the same cost - but it comes in a box now - ItzGabby: - - bugfix: Fixed AltClick on polychromic collars so they actually work now. - KeRSedChaplain: - - soundadd: Extends the file "deltakalaxon.ogg" to a 38 second .ogg. - Linzolle: - - rscadd: neck slice. harm intent someone's head while they are unconscious or in - a neck grab to make them bleed uncontrollably. - - bugfix: officer's sabre now properly makes the unsheating and resheating noise - - bugfix: fireman failure has a different message depending on the circumstance - - rscadd: Abductor chem dispenser, and added it to the abductor console. - - rscadd: '"Superlingual matrix" to the abductor console. It''s the abductor''s - tongue. Can be used to link it to your abductor communication channel and then - implanted into a test subject.' - - rscadd: Shrink ray and added it to the abductor console. - - soundadd: Shrink ray sound effect (its the fucking mega man death sound) - - rscadd: special jumpsuit for abductors - - imageadd: abductor jumpsuit, including digi version if a digitigrade person somehow - manages to get their hands on it. sprites for the shrink ray and chem dispenser. - - rscadd: new glands to play with, including the all-access gland, the quantum gland, - and the blood type randomiser. - - code_imp: split every gland into its own file instead of all being in one file - - tweak: cosmic coat crafting recipe changed to coat + cosmic bedsheet - Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac: - - bugfix: Certain incompatible quirks can no longer be taken together. - - bugfix: If an admin sends a ghost back to the lobby, they can now choose a different - set of quirks. - - spellcheck: the quirk menu went through some minor formatting changes. - - bugfix: Podcloning now lets you keep your quirks. - - rscadd: Quirks have flavor text in medical records. - - spellcheck: All quirk medical records refer to "Patient", removing a few instances - of "Subject". - - tweak: Quirks no longer apply to off-station roundstart antagonists. - - code_imp: Mood quirks are now only processed by the quirk holders - Narcissisko (ported by Hatterhat): - - rscadd: Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, - a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547. - Nervere and subject217, Militaires, py01, nemvar: - - balance: The cook's CQC now only works when in the kitchen or the kitchen backroom. - - spellcheck: corrected CQC help instructions - - bugfix: CQC and Sleeping Carp are properly logged. - - tweak: CQC can passively grab targets when not on grab intent. Passive grabs do - not count towards combos for CQC or Sleeping carp. - - code_imp: Martial Art and NOGUN cleanup. - PersianXerxes: - - rscdel: Removed night vision quirk - Putnam: - - bugfix: acute hepatic pharmacokinesis now works if you already have relevant genitals - - balance: Contamination is no longer an infinitely spreading deadly contagion causing - mass panic - - tweak: Dynamic rulesets have lower weight if a round recently featured them (except - traitor). - Putnam3145: - - balance: Buffed HE pipes by making them realistically radiate away heat. - - bugfix: Dynamic has a (totally unused for any relevant purpose) roundstart report - now. - - admin: A whole bunch of dynamic data is now available for statbus - - bugfix: Dynamic from-ghost antags no longer double dip on threat refunds when - the mode fails due to not enough applications. - - bugfix: whoops broke quirks - - bugfix: quirks work - - rscadd: 'New tab in preferences screen: "ERP preferences"' - - rscadd: New opt-outs for individual effects of incubus draught, succubus milk - - rscdel: Acute hepatic pharmacokinesis has been removed, replaced with above - - tweak: Renamed "Toggle Lewdchem" to "Toggle Lewd MKUltra", since that's what it - actually means, and made it toggle the "hypno" setting (rename it again if more - hypno mechanics are added). - - tweak: Made MKUltra's lewd messages require both people involved to have hypno - opted-in. - - config: Buncha dynamic config tweaks - - bugfix: Ghost cafe spawns are actual ghost roles by the game's reckoning now - - bugfix: a runtime in radioactive contamination - - balance: Bomb armor now acts like other armor types. - - balance: Devastation-level explosions on armorless people no longer destroys everything - in their bags. - Seris02: - - rscadd: the clowns headset - - bugfix: distance checks - - bugfix: the sprites - - rscadd: added the runed and brass winter coats (cosmetic ratvarian/narsian) - - tweak: how the narsian/ratvarian coats can be made - - bugfix: fixes some ghost roles from dying of stupid shit - - bugfix: pandoras attacking their owners - - rscadd: Added Rising Bass and the shifting scroll. - - tweak: Changes the martial arts scroll in the uplink to "Sleeping Carp Scroll" - ShizCalev: - - bugfix: Fixed floodlights not turning off properly when they're underpowered. - - bugfix: Fixed emitters not changing icons properly when they're underpowered. - Sishen1542: - - rscadd: Clicking a pack of seeds with a pen allows you to set the plant's name, - description and the pack of seeds' description. Useful for differentiating genetically - modified plants. These changes will persist through different generations of - the plant. - - rscadd: Hydroponics trays update their name and description to reflect the plant - inside them. They revert to default when emptied. - Toriate: - - rscadd: Polychromic shorts now have a digitigrade state - Trilbyspaceclone: - - rscadd: ports all the new donuts, burgars, and chicken stuff from RG - - rscadd: ports new snowcone - - rscadd: ports grill - - rscadd: ports beakfeast tag/mood lit as TG has it - - rscadd: ports all the amazing new sprites - - tweak: ports crafting for many things like snowcones needing water - - balance: ports of many craftings - - soundadd: lowers fryers sound - - imageadd: ported icons for new food/grill - - imagedel: ports the deletion of some icons and images - - spellcheck: ports a spell check for the snowcones - - code_imp: ports fixes for stuff I didnt know were even broken with snowcones - - bugfix: coder cat failers to push the last commit from year(s) ago - - admin: Updates the changlogs - - tweak: meat hook from HUGE to bulky - - tweak: CE hardsuit is now more rad-proof - - bugfix: Wrong icon names, missing dog fashion with telegram hat - - rscadd: New softdrink that comes in its own vender! - - rscadd: Honey now has a reaction with plants - - tweak: Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar - not 2 - - rscadd: Blaster shotguns back into armory - - rscdel: Removed Lighters in thunderdomes - - rscadd: Silicons now know what a slime is saying! - - balance: honey now will not kill slimes. Honey slimepeople can be a thing now, - go sci. - - rscadd: Added insulin into many of the borg hypo's - Useroth: - - rscadd: bamboo which can be used to build punji sticks/ blowguns available as - a sugarcane mutation or in exotic seed crate - - tweak: changed the sugar cane growth stages because fuck if I know why, but it - was in the PR - - rscadd: 'New lavaland ruin: Pulsating tumor' - - rscadd: New class of lavaland mobs, a bit weaker than megafauna but still stronger - than most of what you normally see - - rscadd: Ghost cafe spawner. For letting people spawn as their own character in - the ninja holding facility. It bypasses the usual check, so people who have - suicided/ghosted/cryod may use it. - - rscadd: Dorms in the ninja holding facility. - Xantholne: - - rscadd: Santa Hats to Loadout and Clothesmate - - rscadd: Christmas Wintercoats to Loadout and Clothesmate - - rscadd: Christmas male and female uniforms to loadout and Clothesmate - - rscadd: Red, Green, and Traditional Santa boots to loadout and Clothesmate - - rscadd: Christmas Socks, Red candycane socks, Green candycane socks to sock selection - kappa-sama: - - balance: legion drops more crates now - - balance: .357 speedloaders in autolathes are now individual bullets instead, speedloaders - are now illegal tech, costs less total metal to make 7 bullets than a previous - speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to - make 5 7.62mm bullets than getting a clip from the seclathe. - - tweak: mentions that you can refill speedloaders on .357 uplink description - - bugfix: you can now strip people while aggrograbbing or higher - - rscadd: plasmafist to wizard - - code_imp: modular is gone - - rscadd: martial apprentices for the local Chinese wizard - - bugfix: broodmother baby lag - - balance: you can no longer get 100k credits by spending 4k roundstart - - balance: cooking oil in sunflowers instead of corn oil - - bugfix: throats are no longer slit happy - keronshb: - - rscadd: Adds reflector blobs to shield blob upgrades - kevinz000: - - rscadd: Launchpads can now take number inputs for offsets rather than just buttons. - - balance: nanites no longer spread through air blocking objects - - rscadd: Night vision readded as a darkness dampening effect rather than darksight. - - rscdel: conveyors can only stack items on tiles to 150 now. - - rscadd: added 8 character save slots - - rscadd: Cargo shuttle now silently ignores slaughter demons/revenants instead - of being blocked even while they are jaunted. A drawback is that manifested - ones can't block it either, any more. - - balance: flashbangs process light/sound separately and uses viewers(), so xray - users beware. - - tweak: Stat() slowed down for anti-lag measures. - - bugfix: sprint/stamina huds now work again - - balance: Combat defibs now instant stun on disarm rather than 1 second again - - balance: Defibs are now always emagged when emagged with an emag rather than EMP. - - bugfix: aooc toggling now only broadcasts to antagonists - - code_imp: Antag rep proc is now easier to read and supports returning a list. - - balance: Clockwork marauders are now on a configured summon cooldown if being - summoned on station. They also rapidly bleed health while in or next to space. - And they glow brighter. - lolman360: - - rscadd: Added ability to pick up certain simplemobs. - nemvar: - - bugfix: The brains of roundstart borgs no longer decay. - - code_imp: Refactored the visibility of reagents for mobs. - nicbn, Kevinz000, ShizCalev: - - tweak: Fire alarm is now simpler. Touch it to activate, touch it to deactivate. - When activated, it will blink inconsistently if it is emagged. - - bugfix: You can no longer spam fire alarms. Also, they're logged again. - - bugfix: Fixed fire alarms not updating icons properly after being emagged and - hacked by Malf AI's. - r4d6: - - rscadd: Added a N2O pressure tank - - rscdel: Removed a AM Shielding from the crate - - rscadd: Added Handshakes - - rscadd: Added Nose booping - - rscadd: Added submaps for the SM, Tesla and Singulo - - rscadd: Added a placeholder on Boxstation for the Engines - - bugfix: fixed Nose boops not triggering - shellspeed1: - - rscadd: Adds Insect markings - - rscadd: Adds three new moth wings. -2020-01-27: - 4dplanner, CRITAWAKETS, XDTM, ninjanomnom: - - rscadd: sepia slime extract has a delay before activating - - balance: the user of a sepia slime extract is no longer immune to the time field - - balance: chilling sepia is now the support extract - it always freezes the user, - but not other marked people. give one to your golem! - - rscadd: burning sepia spawns the rewind camera. Take a selfie with someone and - give it to them to make sure they remember the moment forever! You don't actually - need to give them the photo, they'll remember anyway. Keep it as a reminder. - - rscadd: rewinding (deja vu) effect resets your location to the turf you were on - after 10 seconds as well as resetting limbs/mobs/objects damage to the point - it was added. - - rscadd: The deja vu effect cannot resurrect the dead, but will heal their corpse. - New limbs fall off, old ones re-attach - - rscadd: 'Regenerative sepia cores add a deja vu effect before healing instead - of a timestop remove: timefreeze camera is admin spawn only.' - - rscadd: recurring sepia recalls to the hand of the last person to touch it after - activating. Reusable timestop grenades! - - tweak: some special cameras don't prompt for customisation - - bugfix: timefreeze camera actually makes a photo - - bugfix: timestop stops pathing and mechs. - - bugfix: adds a check to make sure simple_animals don't get their AI toggled while - sentient - - bugfix: Adds the timestop overlay to frozen projectiles - - bugfix: Timestopped things have INFINITY move_resist as opposed to being anchored - - bugfix: Timestop will now unfreeze things that somehow leave it - - bugfix: mobs in the middle of a walk_to will have their walk stopped by timestop - - bugfix: mobs that are stunned will be stopped mid walk as well - - bugfix: pulling respects changes in move_force - - bugfix: swapping places respects move_force if the participant is not willing - - bugfix: timestop is properly defeated by antimagic. - - bugfix: timestop only checks antimagic once - - tweak: Time stop now applies its visual effect on floors, walls and static structures - (with no change otherwise) - - tweak: Movable structures are now anchored while time stopped. - - tweak: Timestop effects now prevent speech. - AffectedArc07: - - code_imp: All code files are now in the LF line format, please stick to it - - tweak: Added CI step to check for CRLF files - - code_imp: Line ending CI works now - Arkatos, Zxaber, Ghommie: - - rscadd: Certain AI abilities now dynamically show their remaining uses on the - mouse hover over their respective action buttons. - - bugfix: Malfunctioning AIs can no longer abuse the confirmation popup to create - extra (unstoppable) doomsdays. - - bugfix: Fixed AIs being able to use some of their abilities such as the doomsday - whilst dead, and the doomsday loading phase not halting upon AI death. - Arturlang: - - tweak: Vampires are no longer as tanky - - rscadd: Added modular computers to the loadout - Bhijn: - - rscadd: Limbs now regenerate their stamina faster while disabled - - rscadd: Limbs now have the same incoming stamina damage multiplier mechanics as - spacemen, where the more staminaloss they take while disabled, the less staminaloss - they'll take. - - balance: Limbs have had their base stamina regen rate doubled to match the doubled - stamina regen rate of standard spacemen. - - rscadd: Added a preference to make the sprint hotkey be a toggle instead of a - hold bind - - rscadd: Added a preference to bind the sprint hotkey to space instead of shift. - - bugfix: server_hop can no longer be used to remotely lobotomize a spaceman - Bhijn helped: - - bugfix: Fixes Dragon's Tooth Sword 50% armor penetration by making it 35% - BonniePandora: - - admin: 'Added another SDQL option. Using "UPDATE selectors SET #null=value" will - now resolve value and discard the return. This is useful if you only care about - the side effect of a proc.' - CameronWoof: - - rscadd: Ghost Cafe patrons now spawn with chameleon kits. Dress up! Be fancy! - - rscadd: Robots can now check the crew manifest from anywhere with the "View Crew - Manifest" verb. - - tweak: Lizard tails are now viable options for humans and anthromorphs. - Commandersand: - - bugfix: fixed some clothnig sprites - - balance: lightning bolt,tesla,forcewall,emp spells have lower cooldown - - balance: fireball has a 10 second starting cooldown - DeltaFire15: - - bugfix: Vitality matrixes now correctly succ slimes - Denton, ported by Hatterhat: - - tweak: Most upgradeable machines now show their upgrade status when examined while - standing right next to them. - - tweak: Added examine messages to teleporter stations that hint at their multitool/wirecutter - interactions. - - tweak: Renamed teleporter stations from station to teleporter station. - - code_imp: Changed the teleporter hub accurate var to accuracy; the old name misled - people into thinking that it was a boolean. - Detective-Google: - - tweak: replaced the sprites with new ones requested. - EmeraldSundisk: - - rscadd: Adds a sign outside MetaStation's custodial closet - FantasticFwoosh, ported by Hatterhat: - - rscadd: Both reagent universal enzyme & sacks of flour are now available for their - respective costs from the biogenerator. - - rscadd: New crafting recipies for donut boxes, eggboxes & candle boxes have been - added to cardboard recipes for the collective benefit of service personnel and - the station. - Ghommie: - - tweak: Attached kevlar/soft/plastic padding accessories are now stealthier and - will no longer be displayed on mob examine. - - refactor: Refactored that mess of a code for alternate worn clothing sprites for - digitigrade and taurs. - - bugfix: Fixed some issues with the aforementioned feature you may or may not have - experienced because it was pretty lame. - - bugfix: Fixed missing digi versions fishnet sprites and wrong digitigrade left - dir purple stockings sprite. - - imageadd: Add digitigrade versions for boxers and the long johns. - - bugfix: Fixed the secret sauce recipe being randomized every round. - - bugfix: Fixed singularity pulls duping rods out of engine floors. - - rscdel: Removed an old pair of zipties from the captain closet. - - bugfix: Chestbursters won't delete the host's brain somewhat anymore. - - bugfix: Fixed roundstart mushpeople being unable to MUSH PUUUUUUUUUUUUNCH!! - - bugfix: Lattices can be examined yet again. - - bugfix: Made reagent containers examine text less annoying. - - bugfix: Virus food dispensers dispense virus food again. - - bugfix: Borg hypos inputs do not display typepaths anymore. - - bugfix: Restored chem dispensers alphabetical order. - - bugfix: Sanitized cargo export messages for reagents. - - bugfix: Riot foam dart (not the ammo box) design cost is yet again consistent - with the result's material amount. - - bugfix: Fixed a little exploit with ventcrawlers being capable of escaping closed - turfs by printing scrubbers/vents into them. - - bugfix: deconstructing a rubber toolbox with the destructive analyzer won't "lock" - the machine anymore. - - bugfix: Something about empty hand combat mode right click waving hands defying - common sense and being spammy. - - imageadd: Towels are now "digitigrade-friendly". - - bugfix: The Barefoot drink and mousetraps will now work even if wearing certain - "feet-less shoes". - - rscadd: Refactored code to allow all living mobs to use shields and not only humans. - - tweak: Monkys will now retaliate against aliens attacking them (as if they even - posed a threat to start with). - - tweak: add a click cooldown to the overly spammable table slamming. - Ghommie (original PRs by Kevinz000, ShivCalez, 4dplanner, Barhandar, 81Denton, zxaber, Fox-McCloud): - - rscadd: All atom movables now have move force and move resist, and pull force - An atom can only pull another atom if its pull force is stronger than that atom's - move resist - - rscadd: 'Mobs with a higher move force than an atom''s move resist will automatically - try to force the atom out of its way. This might not always work, depending - on how snowflakey code is. experimental: As of right now, everything has a move - force and resist of 100, and a pull force of 101. Things take (resist - force) - damage when bumped into experimental: Failing to move onto a tile will now still - bump up your last move timer. However, successfully pushing something out of - your way will result in you automatically moving into where it was.' - - bugfix: Bolted AIs can no longer be teleported by launchpads. - - balance: Megafauna cannot teleport - Hatterhat: - - balance: Beakers are generally more useful now, with slight capacity increases. - - tweak: Transfer amounts are different now. Adjust your muscle memory to compensate. - - balance: ore redemption machines actually get affected by lasers again kthx - - tweak: crusher trophy drop chance on mining mobs increased to 1 in 4 (from 1 in - 20) - - bugfix: Blood-drunk buff from blood-drunk eye crusher trophy is less likely to - cripple its user. - - tweak: Forcefield projectors now fit on toolbelts. - - imageadd: New sprites for ATMOS holofan and forcefield projectors! - - tweak: tweaks some values around with beaker transfer amounts, adds a transfer - value verb (altclick) - - rscadd: 'Syndicate sleepers (read: the ones that''re red and have controls in - them) can now be recreated with a sufficient basis in nonstandard (read: illegal) - technologies!' - - bugfix: Explorer hoods on standard explorer suits can be reinforced with goliath - hide plates again. - - rscadd: A shipment of Staff Assistant jumpsuits from the Goon-operated stations - appear to have made their way into your loadout selections - and into the contraband - list from ClothesMates... - - balance: Dropped Exo-suit armor to put it more in line with being an explorer - suit sidegrade and not a straight upgrade for Lavaland usage. - - rscadd: You can now print .357 AP speedloaders from Security techfabs after you - pick up the Advanced Non-Standard Ballistics node. - - rscdel: Forensic scanner removed from Advanced Biotechnology node. - - tweak: Ash Drake armor now has goliath resistance, same as the Exo-suit. - KathrinBailey: - - rscadd: Empty engineering lockers for mappers. - - rscadd: Industrial welding tools to the engineer welding locker. - - rscdel: Removed the multitool, airlock painter, mechanical toolbox, brown sneakers, - hazard vest and airlock painter from the CE's locker. - KeRSedChaplain: - - imageadd: The clockwork cuirass can now support slithering taur bodies. - Kevinz000: - - bugfix: Fixes successful projectile hits also striking another atom on the same - turf should the first one be not the target the projectile was meant for. - - rscdel: Removes infinite reflector loops. - Kraseo: - - bugfix: Jelly donuts and pink jelly donuts will now properly display sprinkled - icon state. - - bugfix: Jelly donuts and its variants will properly spawn with berry juice. - - bugfix: Slime jelly donuts have slime jelly in them now. (thanks ghommie) - - bugfix: Virgo hairstyles no longer have those annoying quotation marks. Rejoice - for you will no longer have to use the scrollbar. - - imagedel: Got rid of some strange-looking hairstyles. (Tbob, fingerweave, etc.) - LetterN: - - rscadd: Doppler logs - - tweak: Shockcolar and electropack uses the new signaler ui - - tweak: Renaming shockcolar requires a pen - - rscadd: Adds banjo - Linzolle: - - bugfix: fixes matchboxes runtiming every time they spawn - MrJWhit: - - tweak: Increases plasma usage in radiation collectors - Naksu: - - code_imp: reagent IDs have been removed in favor using reagent typepaths where - applicable - - bugfix: mechas, borg hyposprays etc no longer display internal reagent ids to - the player - Owai-Seek: - - rscadd: Four New Bounties - - tweak: tweaked several bounties - - tweak: reorganised several bounties - - balance: balanced several bounties - - bugfix: added shady jims to vendor - - rscadd: Towel, Bedsheet, and Colored bedsheet bins to Dojo. Some lockers with - carpets and wood, another bathroom/shower, tons of cleaning supplies, some additional - trash cans, a tiny medical area, and some vendors/vendor resupplies. Also added - some Ambrosia Gaia seeds. - - tweak: Moved some lights around, extended the dojo a bit to make it feel more - spacious. - - rscdel: Cafe Newsfeed Frame - PersianXerxes: - - tweak: Reduces the range of the forcefield projector from 7 tiles to 2 tiles. - Putnam: - - rscadd: Alcohol intolerance trait, which forces vomiting on any alcohol ingestion - - rscdel: Arousal damage is gone, and with it the arousal damage heart on the UI. - - rscdel: As exhibitionist relied on arousal damage, that's gone too. - - rscdel: Bonermeter and electronic stimulation circuit modules are gone. - - rscdel: Masturbation is no longer an option in the climax menu. It was identical - to climax alone in every way but text. Emote it out. - - rscadd: Arousal on genitals can now be displayed manually, on a case-by-case basis. - - rscadd: '"Climax alone" and "climax with partner" now only display to the people - directly involved in the interaction. rework: Catnip tea, catnip, crocin, hexacrocin, - camphor, hexacamphor all had functions or bits of functions reworked.' - - tweak: '"Climax with partner" now requires consent from both parties--it can no - longer be used on mindless mobs, and it asks the mob getting climaxed with if - they consent first.' - - tweak: A lot of MKUltra behaviors have been moved to hypno checks or removed due - to reliance on maso/nympho/exhib. - - rscadd: Cold-blooded quirk - - rscadd: 'Two relief valves for atmospherics, available in your RPD today: a unary - one that opens to air and a binary one that connects two pipenets, like a manual - valve.' - - tweak: The atmos waste outlet injector on box has been replaced with an atmos - waste relief valve. - Putnam3145: - - rscadd: Dynamic storytellers, a new voting paradigm for dynamic - - rscadd: Support for approval voting and condorcet (ranked choice) voting in server - votes - - rscadd: Ghost cafe mobs can now ghostize - - rscadd: Ghost cafe now has a cremator - - rscadd: Ghost cafe mobs are now eligible for ghost roles - - refactor: Ghost roles now use an element for eligibility purposes - - bugfix: You can toggle some prefs properly now. - - bugfix: no ass slap is no longer the same thing as no aphro - - balance: Devastating bombs kills bomb armor'd mobs again - - rscadd: Added a sort of "game mode ban" by way of having people rank their game - modes favorite to least favorite after the secret/extended vote. - - bugfix: Turns out the schulze scoring was written wrong and it was setting things - to 0 that shouldn't have been, so that's fixed. - - config: Random engines are now weighted. - - rscadd: Ghost dojo now has an autoylathe. - - rscdel: Ghost dojo no longer has VR or modular computer access. - - tweak: Ghost dojo mobs are pacifists. - - tweak: Ghost dojo booze-o-mat is now all access. - - bugfix: Ghost dojo crematorium now has a button. - - bugfix: Traitor objectives don't take a dump when they try to add an assassinate - anymore - - admin: Objective removal with antag panel no longer commented out silently while - still being an option that gives useful feedback on stuff it's not doing in - any respect - - rscadd: Second, temporary flavor text! - - bugfix: Limb damage works now - - tweak: Score instead of ranked choice for mode tiers - - bugfix: Chemistry not :b:roke - - tweak: Ghost dojo spawns will dust if their owner suicides or uses the "ghost" - verb. - - admin: Crafting is logged in a file now - - bugfix: temporary flavor text now pops up properly - - code_imp: demodularized player panel code, mostly - - admin: added ghost role eligibility delay removal to player panel - - balance: Metabolic synthesis disables if user isn't well-fed rather than if user - is starving - - bugfix: Gibtonite no longer instantly explodes upon being pickaxe'd. - - balance: Cold-blooded costs -2 quirk points now - - config: Added suicide to the config. - - tweak: Ghost cafe mobs are super duper attached to the ghost cafe. - - bugfix: Meow Mix bar sign works - - bugfix: Fixed a few relief valve behaviors - Ryll/Shaps, ported by Hatterhat: - - rscadd: Point-blanking people with shotguns actually throws them backwards! - Savotta: - - rscadd: snout - - imageadd: snout - Seris02: - - tweak: made it so trait blacklisting removes random positives instead of removing - everything - - rscadd: added atmos holofirelocks and temperature blocking - - tweak: tweaked how atmos holofan looks - - rscadd: stunglasses - - rscadd: disabler sechuds - - rscadd: adds coconut - - rscadd: adds a coconut bong - - rscadd: Auto ooc - - admin: changed "assume direct control" from m.ckey = src.ckey to adminmob.transfer_ckey(M) - so it works with auto ooc - - rscadd: marshmallow - - rscadd: telescopic IV drip - - bugfix: cardboard box speed - - tweak: makes gorilla shuttle emag only - - tweak: changed where the observe verb is. - - tweak: the way chameleon clothes update on change - - bugfix: chameleon cloak icon - - balance: Explosions now cause knockdown instead of KOs, with the amount of time - scaling off bomb armor. Heavy explosions still cause a ~2 second KO for follow - up attacks. - - balance: Devastating explosions now no longer gib players with more than 50 bomb - armor. This used to be more or less random depending on the amount of bomb armor. - - code_imp: Removed reagent explosion code that would trigger for <1 amount reactions. - - rscadd: traitor tool for bowmanizing headsets + bowmanizing headsets - - rscadd: durathread winter coats from hyper station - - tweak: conveyor belt now are stacks instead of single item - - tweak: conveyor crate has 30 belts - - tweak: printing a conveyor costs 3000 metal - - rscadd: you can press the conveyor switch in hand to link any not deployed belts - to it - - tweak: sniffing sneezing etc doing anything if they don't breathe - - bugfix: probably fixes the make mentor button - - tweak: the sprites for the conveyor belts to look more directional - Skoglol: - - bugfix: Falsewalls now properly hide pipes and wires. - SpaceManiac, bobbahbrown, ShizCalev, SpaceManiac (ported by Ghommie): - - code_imp: It is now possible to set a different most-base-turf per z-level. - - spellcheck: Removed unlawful reference to Disney's Star Wars franchise in map - logging. - - tweak: Moved mapping related errors to their own log file. - - bugfix: Destruction on Lavaland will no longer reveal space in rare situations. - Tlaltecuhtli, Nemvar, Trilby, Hatterhat: - - rscadd: russian surplus crate, sec ammo crate, meat/veggie/fruit crate, rped crate, - bomb suit crate, bio suit crate, parrot crate, chem crate, db crate - - tweak: lowered price of some crates which are overpriced for no reason aka the - tablet crate and the mech circuits crates, track implant crate has also track - .38 ammo - - bugfix: sectech vendor has a refill pack - Trilbyspaceclone: - - bugfix: Fermi plushie can be made once again - - tweak: range on Engi Tray scanners and Rad-Scanners - - bugfix: issues with mapping done my Trilby - - rscadd: Grass now makes light beer when distilled - - tweak: allows bandoliers to hold any ammo type as long as it has a casing - - server: Cleans out the last years of changlogs - - bugfix: 'rouge cases of #$39; in bottle/pill/patch/condiments' - - tweak: Adds missing but needed flags to MASON RIG - - bugfix: missing sprites with crushed cans - - tweak: Halfs the nutriments in sugar - - rscadd: Glitter is now makeable with ground plastic and some crayons - - code_imp: Makes more folders and files for uplink. - - rscadd: Seed packs now have RnD points inside them - - rscadd: New tips that reflect the now use seed packs have for Rnd / Chems affect - on plants - - code_imp: Made the research file look nice rather then an eye harming list - - bugfix: Fixed fragile space suits breaking from weak and non-damaging "weapons" - (such as the Sord, toys and foam darts). - - rscadd: 'tip of the round: Cleanbot can withstand lava and burning hot ash. Its - a god' - - rscadd: more glassware - - rscadd: Few new packs and glassmaker kit! - - tweak: prices/chems of crates/autobottler - - bugfix: some crates ungettable as well as some broken crates - Trilbyspaceclone, Ghommie: - - rscadd: More types of glass can now be used to make a solar panel, with different - sturdiness and efficiency depending the type. - Tupinambis: - - tweak: Replaces new fire alarms with a slightly updated version of the old ones. - - bugfix: Fixed bug where Amber alert had no proper alert lights, and red alert - had amber lights. - - balance: RLDs now cost more to use, have reduced matter capacity, and sheets are - worth less when refilling them. - Unit2E & JMoldy, ported by Hatterhat: - - balance: the powerfist now punches people away at high velocity depending on setting. - - rscadd: the powerfist now leaks the gas it uses onto the tile you're on. - - tweak: Adds weak punch variations for empty and near-empty punching. - Xantholne: - - bugfix: Christmas clothes that where missing stuff should work again - - tweak: Christmas clothes moved from clothesmate and loadout to premium autodrobe, - hoodies and boots remain. - - rscadd: Botany bee pet, Bumbles - - rscadd: New bee models that aren't 1 tile big of 0 opacity pixels - - rscadd: Cheongsam and Qipao clothing added to loadout and clothesmates - dapnee: - - imageadd: new toxin's uniform and accessories - - imagedel: old toxin's uniform and accessories - deathride58: - - balance: The stamina buffer no longer uses stamina while recharging. - jakeramsay007: - - rscadd: The assorted .357 revolvers (except russian revolver) can now also load - .38, like real life. - kappa-sama: - - rscadd: loot crates in cargo contraband - - code_imp: modular_citadel file movement - - code_imp: modular citadel loses some files - - balance: dragnet snares can now be removed in 5 seconds - keronshb: - - rscadd: Adds new features for nanites - - bugfix: fixed the missing icons from Dermal Button nanites - - rscadd: Ports the special nanite remote, mood programs, and research generating - nanites - - balance: rebalances some nanites - - bugfix: fixed my messup - kevinz000: - - rscadd: throwing things no longer makes them randomly turned as long as you aren't - on harm intent - - rscadd: Custom holoforms have been added for pAIs and AIs. oh and cyborg holograms - of specific modules too. - - balance: pais are no longer indestructible-flagged while in card form. pai radios - now short out if they are forcefully collapsed from damage. - - bugfix: telescopic iv drips now have the proper sanity checks for deployment. - - bugfix: megafauna can hear again - - balance: Cargo passive gen is now 500 down from 750. - - config: Added a few more nightshift config entries - - rscadd: nightshift_public_area variable in areas to determine how public an area - is. - - rscadd: NIGHT_SHIFT_PUBLIC_AREAS_ONLY config entry allows the server to be configured - to only nightshift areas of that level and below (so areas that are more public) - - rscadd: Config entries added for requiring authorizations to toggle nightshift. - Defaults to only requiring on public areas as determined by above - - balance: nuclear fist buffed. - - balance: cogscarabs are now fulltile-hitbox. - - balance: emitters are now hitscan - - balance: monkies gorrilize easier now - - rscadd: Ghosting no longer stops abductors from using you. - - rscadd: guests can now looc - - tweak: tableslamming has 0.4 second cooldown instead of 0.8 - - bugfix: health analyzers now work - - code_imp: Mapping helpers added for power cables and atmos pipes. - - rscdel: Blood duplication is gone, but viruses now react up to 5 times, 1 time - per unit, for virus mix. - - rscadd: you can now block people on your PDA - - bugfix: Grenades can now have their timers adjusted. - - balance: Cloning has been nerfed. - - bugfix: hilbert hotel is now less of an exploity mess - - balance: Doorcrushes are once again instant. - nik707: - - tweak: engraving light_power from 1 to 0.3 - r4d6: - - rscadd: Added a Radiation Hardsuit - - rscadd: Added a Radiation Hardsuit crate - - rscadd: Added 3 SM Engine variations. - - rscadd: 'Added a way to make opaque plastic flaps change: Change the already existing - flap recipe to show that they are see-through' - - rscadd: Animations for the RCD - - bugfix: Said animations being pulled by the Singulo - - balance: Prevent Reinforced Doors from being RCD'ed - - bugfix: Deconstructing Floors now cost MUs like everything else - - tweak: changed the RCD's upgrades into flags - - rscadd: Allow RCDs to print APC, Firelocks and Fire Alarms with the right upgrade - - balance: Allow Engineers to print RCDs and RPDs from their protolathe without - needing to hack one. - - rscadd: Added a playback device - - bugfix: Made the Voice Analyzer actually care about languages - - bugfix: fixed SM's piping - - rscadd: Added a message when pulsing the open wire. - - bugfix: fixed being able to use a playback device and a voice analyzer to activate - each others - - rscadd: added passive vent to the arsenal of atmospheric devices. - - rscadd: Mining base now has a common area accessible via a new shuttle on the - medium-highpop maps, and a security office connecting the gulag and the mining - base. Gulag also has functional atmos. - - rscadd: Added more Cyborg Landmarks - - refactor: better code for passive vents - - bugfix: fixed a hole in Meta - - rscadd: Added the ability to easily add variations of the mining base - - bugfix: fixed a sprite - timothyteakettle: - - bugfix: fixed not being able to remove trait genes without a disk being inserted - into the dna manipulator -2020-02-26: - AnturK ported by kevinz000: - - rscadd: Dueling pistols have been added. - Arturlang: - - rscadd: Replaces a lot of ingame UIs with TGUI next, increasing performance drastically. - - rscadd: Each night for bloodsuckers will last longer due to the sun dimming. - - tweak: You cant level up for free, now you have to pay blood for power. - - balance: Bloodsuckers are no longer as resistant to hard stuns and regenerate - less stamina. and a lot of their cooldowns are a lot higher. - - rscdel: Removed text macros from the chem dispenser. - - rscadd: Replaced with dispenser input recording macros. - - bugfix: Fancifying makeshift switchblades now works - - balance: Shields will no longer block lasers, and will break if they take too - much damage. - - rscadd: Added a TGUI Next interface for crafting - - rscdel: Removed the old TGUI slow crafting interface - - tweak: The MK2 hypospray now - - admin: The debug outfit is now kitted out for whatever debbuging needs. - - bugfix: Fixed the pandemic naming and the radiation healing symptom UI crashing - - tweak: Hyposprays now switch modes on CTRL click, instead of alt, as it was already - reserved for dispension amount. - - rscadd: Nanite interfaces have gotten a rework to TGUI Next, and can now support - sub-programs. add:Adds the nanite sting program, which will allow you to manually - sting people to give them nanites, changeling style. - - balance: The pandemic can no longer make vaccines or synthblood as quickly. - - rscadd: The syndicate uplinks interface has been redone in TGUI Next - - tweak: Valentines can now be converted by bloodsuckers - Bhijn: - - tweak: Click-dragging will now only perform the quick item usage behavior if you're - in combat mode. - BlueWildrose: - - bugfix: podpeople tail wagging - - tweak: lifebringer ghost role fixes - BuffEngineering, nemvar.: - - bugfix: Addicts can now feel like they're getting their fix or kicking it. - - bugfix: Aheals now remove addictions and restore your mood to default. - CameronWoof: - - tweak: Lighting looks better now. I can say that because the PR wouldn't be merged - and you wouldn't be reading this if it wasn't true. - - rscadd: Ammonia and saltpetre can now be made at the biogenerator. - Commandersand: - - tweak: uplink centcomm suit doesn't have sensors - DeltaFire15: - - balance: Nar'Sie runes no longer benefit from runed floors. - Detective-Google: - - rscadd: 'the POOL. remove: boxstation dorms 7' - - bugfix: valentines candy no longer prefbreaks - - rscadd: Loudness Booster pAI program - - rscadd: Encryption Key pAI program - EmeraldSundisk: - - bugfix: Connects mining's disposal unit on Delta. - - tweak: Slight visual adjustments to the immediate affected area. - Feasel: - - balance: Buffed dissection success chances. - Ghommie: - - tweak: The anomalous honking crystal should now properly clown your mind. - - bugfix: Stopped the ellipsis question mark from being displayed twice in the examine - message for masked/unknown human mobs. - - tweak: Made the aforementioned ellipsis question mark display on flavor-text-less - masked/unknown human mobs too for consistency. - - bugfix: Stopped an APTFT exploit with spray bottles. - - bugfix: Fixed the detective revolver being quite risky to use. - - bugfix: Hair styles and undergarments are yet again free from gender restrictions. - - tweak: Clown ops will find bombananas and clown bomb beacons instead of minibombs - and bomb beacons in their infiltrator ship now. - - tweak: For safety, the syndicate shuttle minibombs and bombananas come shipped - in a box. Please don't instinctively eat any of those nanas, thank you. - - tweak: Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive - (such as cyber implants) to normal nuke ops will now be properly unavailable/available - to clown ops. - - bugfix: Fixed bananium energy sword/shield slips. - - balance: Buffed said slips to ignore no-grav/crawling/flying as well as adding - some deadly force to the e-sword. - - bugfix: Fixed the 'stache grenade anti-non-clumsy user check. - - balance: Doubled the timer for the sticky mustaches effect from the above grenade - (from 1 to 2 minutes) - - bugfix: Fixed an edge case with the chaplain armaments beacon spawning the box - in nullspace. - - tweak: The playback device's cooldown now proportionally increases with messages - longer than 60 characters (3 seconds is the default assembly cooldown). - - bugfix: Fixed space ninjas "Nothing" objective. Now you gotta steal some dandy - stuff such as corgi meat and pinpointers as a ninja too. - - bugfix: Fixed maploaded APC terminals direction. - - balance: Nerfed magnetic rifles/pistols by re(?)adding power cell requirements - for it. These firearms must be recharged after firing 2 magazines worth of projectiles - and are slightly more susceptible to EMPs. - - bugfix: Fixed the tearstache nade not properly working. - - balance: Buffed it against space helmet internals. - - tweak: Holographic fans won't display above mobs and other objects anymore. - - bugfix: Fixed paraplegics appearing as shoeless. - - bugfix: Fixed the petting element. - - bugfix: Fixed slipping. - - refactor: Refactored mob holders into an element. - - bugfix: Fixed a few minor issues with that feature. such as mismatching sprites - for certain held mobs and a slight lack of safety checks. - - rscdel: holdable mobs can't force themselves into people's hands anymore. - - bugfix: Milkies fix. - - bugfix: Fixed some mounted defibrillator issue with the altclicking functionality. - - bugfix: Fixed no-grav lavaland labor/mining shuttle areas. - - bugfix: Fixed a little issue with sleeper UI and blood types. - - bugfix: Fixing accidental nerfs to the magpistol magazine. - - bugfix: The Lavaland's Herald speech sound should only play if they are actually - speaking. - - bugfix: Nerfed cargo passive points generation from 500 to 125 creds per minute. - - bugfix: Fixed whitelisted/donor loadouts - - bugfix: Childproofs double-esword and hypereuplastic blade toys. - - balance: Some reagent holders (such as cigarettes, food) are not suitable for - reagents export anymore, while unprocessed botany crops will only net 1/3 of - the standard reagents values. - - bugfix: Export scanners now include the reagents value in the price report. - - bugfix: Fixed a little inconvenience with the character setup preview dummy having - extra unwarranted bits. - - bugfix: Stopped role restricted uplink items from being discounted despite not - being purchasable most times. - - bugfix: Missing words replacement file for the gondola mask. - - bugfix: Fixed an issue with the nearsighted prescription glasses taking over worn - eyewear. - - bugfix: Fixed AI unanchoring not properly removing the no teleport trait. My bad. - - bugfix: Fixed another issue with hering comsig. - - imageadd: Fixed dozen missing privates sprites. - - bugfix: A little fix concerning some R&D and reagents. - - bugfix: Further mob holder fixes. - - bugfix: Fixed being unable to dump a trash bag's contents directly into disposal - bins. - - bugfix: Doubled the halved flavor text maximum length. - - bugfix: Reduced tongue organ damage and tasting pH message spam. - - bugfix: Fixed agent IDs not registering the inputted name. Thanks MrPerson. - - bugfix: Fixed solar panels/trackers (de)construction being a bit wonky. - - bugfix: Fixed something about slime blood and the law of conservation of mass. - - bugfix: Fixed flypeople being emetic machine guns. - - bugfix: Fixed virology being unable to be done with synthetic blood. - - rscdel: Renamed "blaster carbine" and "blaster rifles" back to "energy gun" and - "laser gun" respectively - - bugfix: Fixed magnetic rifles & co being inconsistent with printed energy guns - and start with an empty power cell. - - imagedel: Reverted practice laser gun sprites back to their former glory. Mostly. - - bugfix: Fixed sprint buffer cost and regen being rounded down. - - balance: Nerfed the fermenting barrel export industry. - - tweak: Reagent dispensers selling price no longer takes in account the reagents - volume. It's already handled by reagents export. - - bugfix: pAIs are yet again unable to perform certain silicon interactions with - machineries yet again. - - bugfix: Fixed pAI radios inability to be toggled on/off. - ? Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer, - Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle, - MrPerson, ArcaneMusic and zxaber) - : - rscadd: You can now make toolboxes out of almost any solid material in an autolathe - - rscadd: adds Knight's Armour made out of any materials - - rscadd: new ruin found in lavaland protected by dark wizards, I wonder what - they're guarding - - rscadd: You can now put a bunch more mats in the coin mint and autolathe - - rscadd: Adamantine and Mythril are now materials (Adamantine still only from - xenobio, Mythril still only from badminnery). Adamantine boosts an item's - force by 1.5, Mythril gives an item RPG statistics. - - rscdel: most custom sprites for coins have been lost - - rscadd: You can now give your ass acute radiation poisoning - - rscadd: floydmats now apply to all objs / items - - rscadd: you can now make tables and chairs out of any material - - bugfix: Fixes being able to exploit fully upgraded destructive analyzers to - multiply materials - - rscadd: An old monastery from a previously abandoned sector of space has recently - resurfaced in some regions surrounding the station. - - rscadd: Latent scans of the surrounding systems have picked up trace signs of - new, smaller cult constructs, however these signatures quickly vanished. - - rscadd: In other news, scavengers in your sector have been seen occasionally - with classically recreated maces, so autolathe firmware has been upgraded - to accommodate this. - Hatterhat: - - balance: Zombie powder is now instant when ingested, but delayed when injected - or applied through touch. - - tweak: The H.E.C.K. suit is now goliath tentacle resistant and probably better - for acid resistance. - - rscadd: The Engineering techfab can now print standard and large RCD compressed - matter cartridges. - - rscadd: The Experimental Tools node now has the Combifan projector, blocking both - temperature and atmospheric changes. - - tweak: fiddles with the seed extractor upgrade examine to make it not shit - - rscadd: Formaldehyde prevents organ decay and corpses' miasma production at 1u - in the body. - - rscadd: Epinephrine pens now contain 3u formaldehyde. This should not kill you. - - rscadd: The ships often crashed by Free Golems on Lavaland now have GPSes. They're - off, by default, but an awakening Golem could easily turn one on. - - tweak: Standard RCD ammo can now be printed from Engineering-keyed techfabs once - you hit Industrial Engineering. - - tweak: Consoleless interfaces are now default - this means unrestricted protolathes - and circuit imprinters can now be interfaced with by interacting with the machine - itself. - - bugfix: Multitools can now actually be printed from Engineering and Science protolathes/techfabs - once you unlock Basic Tools. - - rscadd: Husking (from being burned to shit) can now be reverted! 5u rezadone or - 100u synthflesh, at below 50 burn. - - balance: Turning a body into a burnt husk now takes more effort. 300 burn's worth - of effort. - - balance: Buckshot individual pellet damage up from 10 to 12.5. Still firing 6 - pellets. - - rscadd: Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay - into histamine. Instead, it just prevents your organs from rotting into nothing. - - balance: You can now purify eldritch longswords with a bible. This creates purified - longswords, which do not have anti-magic properties, but are still good for - swinging at cultists. - - rscadd: Extend votes! Ported from Hyper, ported from AUstation. - - bugfix: mechs with stock parts now have icons - - balance: Pie reagent transfer now requires an uncovered mouth. - - bugfix: Biogenerators can now actually generate universal enzyme. - - bugfix: The Basic Tools node now unlocks the multitool for printing on Engineering - and Science fabricators. - - rscadd: The Ash Walkers' nest on Lavaland now starts with three bowyery slabs. - - rscadd: You can now welder-harden arrows. It might take longer. - - balance: Silkstring's costs adjusted for bows and whatnot. - - spellcheck: Grammar adjusted on a lot of things relating to bows. - - bugfix: Pipe bows' bowstring doesn't look like it replicated itself upon draw. - IHOPMommyLich: - - tweak: Changed the multiplicative_slowdown of Stimulants from -1 to -0.5 - IronEleven: - - balance: Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis - Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms. - KathrinBailey: - - bugfix: Missing turf_decals in Cargo Office. - - bugfix: Turns on the docking beacons on Box. - - bugfix: Fixes Starboard Quarter maint room being spaced. It was never intended - to be like how it was. - - bugfix: The aforementioned maint room not having stuff in it. - - bugfix: varedited photocopier sometimes not opening any UI. - - bugfix: Atmos differences in Starboard Quarter maint. - - bugfix: Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with - airless plating. - - bugfix: Rotates AI satellite computers. These have probably been like this since - computers had the old sprites and no directional ones. You shouldn't sit at - a chair to operate a sideways computer. - KrabSpider: - - imageadd: The Van Dyke is no longer Fu Manchu. - - imagedel: Gets rid of a Fu Manchu imitation. - Kraseo: - - bugfix: You can no longer pull before wearing boxing gloves to bypass the grab - check. - - bugfix: Nightmares no longer delete entire guns from existence for merely having - a light on them. - Linzolle: - - bugfix: Bows now will not delete an arrow if it cant fire it. - - bugfix: bows now like and respect sprite changes - MalricB: - - rscadd: '"Shaggy" sprite from virgo' - - rscadd: '"shaggy" option in the character customization' - MrJWhit: - - rscdel: Removed meteor defense tech node - - tweak: TEG - Naksu: - - bugfix: Odysseus chem synthesizing now works again. - Owai-Seek: - - rscadd: Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates. - - rscdel: Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat - Crate - - tweak: Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint. - - tweak: Organised some crates with sub-categories. Also, moved all vendor refills - to a new tab. - - tweak: Moved Grill to Service Tab - - bugfix: Engineering Hardsuit Access - - tweak: Blood Crate now has all of the current blood types. - - tweak: Birthday Cake Recipe is now the same as TG. - - tweak: Added Soy Sauce and BBQ Packets to Dinnerware Vendor. - - tweak: Added nurse outfit, nurse cap, and mailman hat to loadout. - - tweak: Changed the name of scrubs to blue, green, and purple scrubs. - - rscadd: Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin. - - tweak: Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box - - balance: Mops can now be printed at service lathe once tools are researched. - - balance: Biobags can hold most organic limbs/organs, but not brains, implants, - or cybernetics. - - balance: Trash Bag can now hold limbs (but not heads.) - - balance: Most snack vendor items reduced by 1. - - bugfix: Trash Cans are now actually craftable, and only require metal instead - of plastic. - - imageadd: Bacon and Eggs, Drying Agent Bottle. - - imageadd: Mugs now show reagent colors of contained reagents. Thanks Seris! - - tweak: Reorganized all food recipes, (hopefully) making things easier to find. - - balance: Trays now have a whitelist, allowing them to pick up normal sized foods, - bowls, glassware, booze, ect. - - bugfix: Easter foods are no longer their own Misc Food Category on the top of - the menu. - - spellcheck: fixed a few typos/capitalization consistency. - - tweak: Mexican Foods are their own Subcategory. - - tweak: Donuts are their own Subcategory - - tweak: Moved Sweets from Misc Food in with Pies. Renamed to Pies & Sweets - - rscadd: BROOM - - tweak: Janitor Vendor now has gear for two Janitors. - PersianXerxes: - - rscadd: 'SMES and PACMAN attached to gulag Security to power electrified windows - remove: Removed Sec vendor from gulag Security' - - tweak: Separation of gulag and public mining - - rscadd: Better clarified the comment explaining the contraband tag. - - tweak: Cargo nuclear defusal kits now require an emag'd drop pod console to be - purchased. - - rscadd: Added Kilo Station - - tweak: Adjusts Kilo Station to be more in line with Citadel standards - - imageadd: Added area icons required to make Kilo Station editable on Citadel code - - code_imp: Fixed a reagent container on Kilo pointing to a nonexistent reagent - - config: Adds Kilo Station to the maps config file, does not fix Meta Station's - population requirement - Psody-Mordheim: - - rscadd: You can now make synth-flesh with synthetic blood. - - rscadd: You can now make synthetic blood via mixing saline glucose, iron, stable - plasma and heating it to 350 temp. - - rscadd: You can mix synthetic blood and cryoxadone to create synth-meat in addition - to normal blood. - - rscadd: Disfiguration Symptom. - - rscadd: Deoxyribonucleic Acid Saboteur Symptom. - - rscadd: Polyvitiligo Symptom. - - rscdel: Revitiligo Symptom. - - rscdel: Vitiligo Symptom. - Putnam3145: - - admin: Added logging to various consent things. - - rscadd: Lots of new traitor objectives - - bugfix: gender change potion now respects prefs - - bugfix: Hypno prefs work better. - - admin: Panic bunker is now round-to-round persistent - - tweak: Relief valve now has a TGUI-next UI - - bugfix: Atmos reaction priority works now. - - rscadd: map voting doesn't suck anymore - - bugfix: Dynamic now defaults to "classic" storyteller instead of just failing - if the vote didn't choose a storyteller. - - bugfix: antag quirk blacklisting works now - - tweak: default should be... default - - balance: all supermatter damage is now hardcapped - - tweak: Supermatter sabotage objective no longer shows up with no supermatter - - bugfix: Mining vendors no longer fail and eat your points iff you have precisely - enough points to pay for an item - - tweak: Licking pref - - bugfix: Fixed IRV. - - bugfix: Runtime if nobody has a chaos pref set - - bugfix: IRV fixed... again - - bugfix: temporary flavor text can now be of reasonable length - - balance: Shooting the supermatter now adds to the supermatter's power. CO2 setups - beware! - - rscadd: Logging for renaming - Raiq & Linzolle: - - rscadd: Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting, - silk string used in bow crafting, harden arrows - Ash walkers crafting, ash - walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers - for ash walkers as well, just to hold some arrows well out on the hunt! - Seris02: - - tweak: tweaked the way the SM works - - rscadd: custom reagent pie smite - - rscadd: hijack implant - - code_imp: changed mentions of the issilion proc to hasSiliconAccessInArea based - on what the proc is used for - - rscadd: recipe for mammal mutation toxin - - rscadd: polychromic winter coat - - rscadd: thief's gloves - - rscadd: crushing magboots - - bugfix: golden plastitanium toolbox being actually plastitanuium - - bugfix: character slot amount - - balance: rebalanced rising bass - - bugfix: string highlighting whitespace - - bugfix: glitch with PKA - - bugfix: meteor hallucinations (again) - - rscadd: Added naked hallucination - - rscadd: crowbarring manifests off crates - - balance: makes RCDs cost a better amount - - bugfix: apc icons - - rscadd: rest hotkey - - rscadd: hsl instead of sum of rgb for spraycan lum check - - balance: bloodcrawl's cooldown - ShadeAware: - - rscadd: Craftable Switchblades, a weaker subtype of normal switchblades that can - be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable - Coil. Requires a welder to complete. - - bugfix: You can now actually craft Switchblades. - - bugfix: Switchblades no longer regain their old Makeshift sprite after retracting - if you've made them fancy with Silver. - - rscadd: 'The Captain''s Wardrobe, a special one-of-a-kind and ID-locked wardrobe - for the Captain that holds all of their snowflakey gear. Remove: Snowflake gear - from the Captain''s locker, since now it has its own vendor.' - Tlaltecuhtli, ported by Hatterhat: - - balance: Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning - modules and capacitors on construction. This means that they also gain reduced - power consumption and EMP protection from higher-tier stock parts. - Trilbyspaceclone: - - bugfix: Vault hallway door being all access - - server: Updates change logs - - rscadd: Crafts are now made of plasteel and can be made with 5 sheets - - rscadd: Takes away NT's connections to the Aliens that run the Syndicats - - rscadd: Carps have evolved to take more damage - - rscadd: restock crates for each vender - - rscadd: restock units for all station venders - - bugfix: Sec-vender missing icon - - bugfix: 'Box station captain office issues maping: Gulag on box can now be accessed' - - rscadd: Alien stools and chairs - - tweak: Bone armor/Dagger are now crafting from bones rather then crafting menu - - rscadd: Firing pins that only works when not on station - - rscadd: Medical locked crates - - balance: Russian gear crates have less gear in some cases but all will cost more - - bugfix: Medical locked crates that were not locked - - spellcheck: Crates that were out of date are corrected - - balance: Heads of staff have been better screened by NT before being promoted - - balance: The suit full of spiders also known as a ninja now is a tactical turtleneck - - balance: The Wiznerds now dont have suits set to max - - tweak: Meat wheat no longer has blood - - bugfix: Flat guns can no longer be suppressed - - tweak: replaced stickmans .45 caliber with 10mm, for consistency. - - tweak: Meatwheat and Oats now have rarity - - balance: Oats now have at lest 50% more flour in them - - balance: BDM now uses a PKA rather then a normal KA - - tweak: Gang tower shield is no longer transparent - - tweak: Cosmic winter coat now glows like the bedsheet, and holds normal winter - coat gear - - server: Express console is now logging what it buys, like the normal console should - - bugfix: Crabs are now made of crab meat. - - bugfix: AIs now understand the old ways of drunken dwarfs - - balance: Removes some armored Russian hats from box station round start - - bugfix: Doner items spawning - - balance: Engi/Sec Trek suit no longer has 10% melee protection - - bugfix: IPC hearts are now made of robomeat and roboblood thats emp proof. Heals - and is all and all just like an normal heart - - imageadd: All robotic organs now have an animation. - - imageadd: IPC's now organs now look like robotic ones, even tho thats not the - case game wise - - imageadd: Added a new bee themed bar sign - - imageadd: Makes plywood chair not look as bad. - - bugfix: corndog sprite being miss-spelled - - bugfix: Ash from land of lava now is useable for sandstone - - bugfix: Peach cake slices are no long made by mimes - Tupinambis: - - tweak: the portion of laws that require harm prevention by silicons has been removed. - - server: silicon_laws.txt config file is required to be modified for full implementation. - - bugfix: masks no longer improperly stick out of helmets when they should be hidden. - - bugfix: Status Displays should now update correctly. - - balance: stunbatons now take 4 hits to inflict hard crit, up from 3. - - balance: stunbatons no longer disarm targets. - Yakumo Chen: - - rscadd: Rings for your fingers! - - rscadd: New cargo crates and loadout options to bling your rings! - YakumoChen: - - tweak: Observe is back in the OOC tab - - imageadd: Rings look nicer. Sprites used from RP. - - imageadd: Ring on-hands. Diamond rings sparkle! - - tweak: You can now propose using a diamond ring in your hand. - - tweak: Legion skulls behave like bees!!!! - Zellular: - - imageadd: Movement state for pupdozer and its decals - - tweak: Tweaked the movement state for the pupdozer's eyes - ancientpower: - - bugfix: Fixes an error in pH strips' feedback message. - - rscadd: Ported drink sliding from /vg/station. - - bugfix: Fixes color mismatching with the "genitals use skintone" preference. - - imageadd: Bunny ear style for humanoid species. - - tweak: Ghosts are now literate. - bunny232: - - tweak: Changes the simple animal sentience event from the xenomorph preference - to sentience potion preference. - coiax: - - rscadd: Admin and event only pair pinpointers! They come in a box of two, and - each pinpointer will always point at its corresponding pair. Aww. - deathride58: - - bugfix: Spacemen no longer run at lightspeed on local servers. - kappa-sama: - - bugfix: the plant dudes can actually make plant disks now - keronshb: - - rscadd: Added repairable turrets - - rscadd: Adds Tiny Fans to the pirate ship - - tweak: changes some reinforced windows to plastinanium pirate windows - - tweak: made the pirate shuttle + turrets bomb resistant - - tweak: made most pirate machines + consoles indestructible - - tweak: increased pirate turret health - - rscadd: Adds the CogChamp drink and Sprite - - rscadd: Added burn and knockback to stunhand during HALOS on cult. - - balance: Added burn and knockback to stunhand during HALOS on cult. - - bugfix: fixed accelerated regeneration nanites - - bugfix: fixed mechanical repair nanites - - bugfix: fixed bio reconstruction nanites - kevinz000: - - refactor: Custom snowflake plushies are now in config rather than code. - - balance: Abductor mindsnapping (aka abductee objectives) can now be "cured" with - brain surgery. - - rscadd: Shuttle hijacking has been completely reworked. Alt-click the shuttle - as a hijack-capable mind (so traitors, and especially traitors with hijack) - to begin or continue a hacking process. - - refactor: 'A good amount of the blood RGB rework was cleaned up/reverted, with - some notable gameplay changes including: Gibs and blood not having max blood - by default (no more easy rampages, cultists), infinite gib streaking, etc etc.' - - balance: meteor waves are now directional and announces the direction on the command - report. - - rscadd: CTF CLAYMORES - - balance: shoves buffed, now shoving into a wall twice rapidly will also disarm - their weapon. - - balance: traitor+bro gamemode minimum population set to 25 until there can be - more in depth configuration systems for gamemodes. - - bugfix: no more bluespace skittish locker diving, - - rscadd: moths now have unique laughs and can *chitter. - - tweak: nuke explosion is now full dev radius for anti lag purposes - - balance: Gangs can now only tag with a gang uplink bought spraycan. - - tweak: dueling pistol accesses have been changed to be more accessible. - - bugfix: mechs no longer have admin logs flooding into IC control console log viewing - - refactor: Guncode and energy guns have been refactored a bit. - - rscadd: You can now combat mode ight click on an energy gun to attempt to switch - firing modes. This only works on guns without right click functions overridden. - - balance: shoes can now fit magpistols again. - - balance: Projectiles now always hit chest if targeting chest, snipers have 100% - targeting zone accuracy. All other cases are unchanged. - - tweak: The lawyer's PDA cartridge has been rebranded to something more accurate - to its true nature. - - refactor: Refactored ghostreading/etc - - balance: Cyborgization will now de-gang people, even gangheads. - - bugfix: reactive repulse armor now has an item limit - - bugfix: beam rifle runtime fix during aiming_beam - - bugfix: 'fail2topic runtime fix: taking out an ip while incrementing index resulted - in accessing the next-next entry instead of the next and results in out of bound - errors.' - - rscadd: gravity gun repulse and chaos now work in all angles, rather than just - basic cardinals and diagonals. fun. - - balance: Public autolathes can no longer be hacked. - - bugfix: Energy weapons now once again have their lens in contents. - - bugfix: pais are no longer muted for literally a whole hour on emp. - - rscadd: auto profiler subsystem from tg - - bugfix: Brig cells now are more accurate by using timeofday instead of realtime - - bugfix: Cryo now actually transfers reagents at tier 4 on enter rather than every - 80 machine fire()-process()s regardless of if it was "reset" by open/close. - - rscadd: cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries - without an operating console. - - bugfix: ctf claymores now actually spawn (and fit). - - bugfix: STOP_PROCESSING now removes from currentrun to prevent another process - cycle from happening where it shouldn't. - - balance: hand teleporters now require 30 deciseconds of still movement by the - user to dispel portals. there's a beam effect too. - - balance: Sort of a bugfix but cult blood magic and all guns now respect stamina - softcrit. - - balance: Organ healing rate doubled. Organ decay rate halved to match its define - (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked). - - tweak: Storage now caches max screen size and only stores when being opened by - a non ghost, meaning ghosts will no longer distort living player screens when - viewing storage. - - balance: Stunbatons changed yet again. - - tweak: the game's built in autoclicker aka CanMobAutoclick no longer triggers - client/Click()'s anti clickspam guard. - - balance: pais can no longer bodyblock bullets - - balance: pai radio short changed to 3 minutes down from 5 - - balance: pais are no longer fulltile click opacity. - - refactor: vampire "immortal haste" has been reworked to be more reliable and consistent. - - tweak: hand teles use a less atrocious beam - necromanceranne: - - rscadd: Ebows now disarm people hit by them. - - rscadd: Ebows now do 60 stamina damage on hit. - - rscdel: Ebows no longer inflict drowsiness - - balance: Miniature ebows do 15 toxin damage, up from 8. - - balance: Ebows have considerably shorter knockdowns. - - balance: Ebows now make you slur rather than stutter. - - balance: Large ebows are now heavy and bulky. - - rscdel: You can no longer order spinfusors or their ammo from cargo. - - rscdel: Removed the formal security officer jacket from the secdrobe - - tweak: formal security jackets are now armor vests - - rscdel: Bullets causing bleed rates equal to unmitigated damage through all forms - of defense. - - balance: 'Reverted #9092, crew mecha no longer spawn with tracking beacons.' - - balance: '[Port] Mecha ballistics weapons now require ammo created from an Exosuit - Fabricator or the Security Protolathe, though they will start with a full magazine - and in most cases enough for one full reload. Reloading these weapons no longer - chunks your power cell. Clown (and mime) mecha equipment have not changed.' - - balance: '[Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching - Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8).' - - balance: '[Port] Both Missile Launchers and the Clusterbang Launcher do not have - an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded - ammo has been spent, you can use the appropriate ammo box to load the weapon - directly.' - - rscadd: '[Port] Utility mechs that have a clamp equipped can load ammo from their - own cargo hold into other mechs.' - - rscadd: '[Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, - should they run low.' - - bugfix: Literally unclickability with a cham projector - nemvar: - - code_imp: Slight changes the self-repair borg module. It no longer references - the borg that owns it. - - bugfix: Trash from food now gets generated at the location of the food item, instead - of in the hands of the eater. - - code_imp: Changed mob biotypes from lists to flags. - r4d6: - - rscadd: Added a dwarf language - - rscadd: Added more engines - - tweak: RPD subcategories and preview icons reorganized. - - rscadd: RPD now starts with painting turned off, hitting pipes with build and - no paint will target the turf underneath instead. Bye bye turf pixelhunting. - - config: Made dwarves into a roundstart races - - tweak: Meteor Timer back to 3-5 minutes - - bugfix: Mining no longer lead to spess - - rscadd: Added Plasteel Pickaxe - - rscadd: Added Titanium Pickaxe - - bugfix: fixed a missing tile - tralezab, bandit, Skoglol: - - rscadd: The mime's PDA messages are silent now! - - rscadd: 30 new emoji have been added. Mime buff, mime now OP. -2020-03-28: - Arreksuru and Detective Google: - - rscadd: new HUDpatches for medical, diagnostic, and mesons. - - rscadd: crafting and de-crafting recipes for new HUDpatches. - - bugfix: silly typo with "singlasses" in one of the crafting recipes for HUDglasses. - Arturlang: - - balance: Bloodsuckers can no longer get usable blood from blood tomatoes. - - bugfix: Fixed reagent container transfer amount cycling. - Bhijn: - - tweak: Clicking an open closet with harm intent no longer attempts to place your - currently held item inside, but rather attacks it. - Bhijn (original PR by Azarak, sprites by Discord user Smug Asshole Muhreen#5522): - - rscadd: Synths, the open source and free-as-in-freedom species by FA user vader-san, - have been ported from Skyrat. - - rscadd: Ported VOREStation's synthetic taursprites - - rscadd: Markings that don't match very well with your selected species are now - hidden from the markings list by default. You can still use these mismatched - markings to create horrendous sparkledog abominations by using the "Show mismatched - markings" button ingame. - - bugfix: Body markings who's iconstates don't match their name will now actually - render properly. - - code_imp: Limb base icons are no longer hardcoded, should_draw_citadel and should_draw_grayscale - have been removed in favor of the species-level `icon_limbs` var and the bodypart-level - `base_bp_icon` and `color_src` vars. Downstreams should no longer have to touch - bodypart rendering code a whole lot if they want to add custom species. Downstreams - that have already added species with digitigrade leg support will have to append - species IDs to the digitigrade leg sprites, but aside from that, the migration - process to this more modularity-friendly system should be fairly smooth. - BlackMajor: - - tweak: Adjusted the ash walker camp's storm proofing. - - rscadd: Added a tip about creating areas to the ash walker spawn text. - Bumtickley00: - - tweak: Iron sheets build the normal metal table again - Crystal9156: - - bugfix: Fixes Chocolate Jelly Donut icon - Dennok, ported by Hatterhat: - - bugfix: Lava rivers no longer burn into basalt. - - code_imp: The river generator can now specify baseturfs. - Detective-Google: - - bugfix: absurd dong sizes. - - bugfix: my dumb stupid paramedics - - balance: Medical no longer spawns with syringe guns, Medical now spawns with medidart - guns. - EmeraldSundisk: - - rscadd: Adds CogStation's shuttles to-be. - - rscadd: Adds the "NES Classic" escape shuttle. - - refactor: Accounts for the new shuttles. - Ghommie: - - tweak: Added a few cooldowns to chill nuclear bomb and communications console - security level change spam, as well as the emergency shuttle's authorization - announcements. - - bugfix: Fixed viruses not working on anthros and some others species. - - sounddel: Made the cogchamp mixing sound less annoying. - - rscdel: Removed makeshift switchblades. - - bugfix: pAIs, drones, monkys and lizards can be worn over the head again. - - bugfix: Fixed cargo passive point generation to not go into decimals. - - bugfix: Syndicate ninjas are slightly less friendly now. - - balance: Allowed blobbernauts to drag objects (but not mobs) again. - - bugfix: The examiner circuit now works better for mobs. - - tweak: Chances are monkeys won't end up gorillizing as quickly after being exposed - to a rad storm for a minute or so. - - bugfix: Vampire mesmerize doesn't permanently disable combat mode. - - bugfix: The flying speed slowdown while hurt now actually affects flying mobs - and not floating ones. - - bugfix: Joining in as a positronic brain won't break the spawner menu anymore. - - bugfix: Fixed dynamic voting. - - bugfix: The autotransfer subsystem is slightly more modulable now. - - imageadd: Resprited some sprite_accessory icon states. - Ghommie (plus a fix originally done by Skogol): - - bugfix: Drinks dispensers now only show the container they are holding. - - bugfix: Ghost cafe patrons are warded against a few more events now. - - bugfix: Fixed RnD machineries UI displaying designs' required reagents' typepaths - instead of names. - Hatterhat: - - bugfix: Red and blue boxes are now actually red or blue. - - rscadd: Beegions! Like Legions, but with actual bees. As in, the bees from the - holodeck sim with the randomly-generated toxic bees. - - rscdel: Mining cyborgs are no longer physically capable of claiming points nor - wielding a premium accelerator. - - tweak: Arrow crafting has been finagled with, preventing fire-hardened arrows - from being fire-hardened repeatedly. Or something. - - bugfix: Space hermits (those quirky fellas stuck in a rock with carp surrounding - them) now have gravity! But they lost their perpetual generators. - - balance: Space hermits now have to mine for their research tech (golem vendor - board, ORM board). They have slightly less bad parts, though. And better(?) - rocks. - InnocentFire made the sprites all thanks to them!: - - imageadd: All bows now have inhand sprites once again - KathrinBailey: - - rscadd: Nine new posters! - - rscadd: Shower curtains can be crafted. - - rscadd: New sofas! - - rscadd: Green and purple comfy chairs to the crafting menu to fit green and purple - carpets. - - bugfix: Shower curtains now let you see through them once open, and don't once - closed. - Kraseo: - - balance: If you have the powersink objective, you will now receive a free beacon. - - rscadd: Lavaland flora have more traits now, to encourage harvesting and sending - these off to the botanists. - - bugfix: Napalm will now properly remove weeds from a tray if the plant in it has - the fireproof gene. - - balance: Gangs no longer get soporific rounds for their sniper rifles. - - rscadd: Syndicate Contracts. Use the new contract uplink to select a contract, - and bring the assigned target dead or alive to the designated drop off. Call - for the extraction pod and send them off for your TC payment, with much higher - rewards for keeping them alive. A high risk, high reward choice for a traitor - who wants a real challenge. - - rscadd: New 20 TC contract kit - supplies you with your contractor loadout and - uplink. - - rscadd: Targets successfully extracted will be held for ransom by the Syndicate - after their use to them is fulfilled. Central command covers the cost, but they'll - be taking a cut out of station funds to offset their loss... - - rscadd: Adds a third random item, as well as a small guide on using the contract - kit. Also added new possible items that can appear. - - tweak: Supplied space suit in the contract kit is now an improved variant on the - normal Syndicate version. - - balance: TC payouts adjusted to be a bit more fair to the contractor. Total payout - can never be below a certain threshold. - - bugfix: Broken dropoff locations work again, and general bugfixes. - - rscadd: Contract kit comes with a contractor baton - a unique, lightly electrified - weapon to help complete your contracts. - - tweak: Finalized payment system for contracts; much more balanced for contractors. - No more extremely low paying contract sets. - - tweak: Generated contracts will all have unique targets, no more duplicates. - - tweak: Extraction droppod explosion has been removed, it'll only damage the tile - it lands on. - - bugfix: Extraction pods get sent to the jail immediately again. - - refactor: Refactored classic_baton code. - - rscadd: Contractor Hub. A unique store for contractors to buy items with Contractor - Rep, with two Rep being given when completing a contract. - - rscadd: Contractor pinpointer, available through the Hub. A very inaccurate pinpointer - that ignores suit sensors. - - rscadd: Call reinforcements, available through the Hub. Limited to a one-time - buy for a contractor, you can purchase an agent to be sent down to help in your - mission. Role is polled to ghosts. - - rscadd: Blackout, available through the Hub. Disable station power for a small - duration - an expensive, but powerful option of getting into secure areas. - - rscadd: Fulton extraction, available through the Hub. Purchase a fulton extraction - kit to help move your targets across the station for those difficult dropoffs. - - tweak: Assigning yourself to another tablet will give you another contract set. - - rscadd: Contractors can now reroll their contracts a small number of times. - - rscadd: Brand new sprites! A redesign of the specialist space suit, and the kit's - own unique tablet. Done by Mey Ha Zah. - - tweak: Displays contract target jobs under their name. - - tweak: New locations, such as maintenance, are now possible dropoff locations. - - balance: Contractor kit pop cap reduced from 20 to 15. - - balance: You can no longer get haunted 8balls from contractor kits. - - bugfix: Pods and shuttles should no longer be valid dropoff locations. - - bugfix: Contract tablets will no longer break when one of your contracts is deleted - from the world. - - bugfix: Baton inhands for the right hand now shows the right direction. - - bugfix: Mice don't chew on wires anymore while they're on your person. - - bugfix: Bloodsucker heart theft objective now completes successfully. - - tweak: Blacklists turret protected areas, the toxins test range, asteroid ruins, - and solars from being valid dropoff locations for contracts. - Linzolle: - - tweak: pacifists can no longer meatspike living things - - bugfix: flypeople being unable to gain nutrition from eating vomit - - bugfix: targetting mouth on help intent now properly nose boops - - tweak: cmo hypokit now holds the same amount of items as normal kits - Moonlit Protector: - - rscadd: Introducing the 'Heroic Beacon', standing vigil over service the curator - can assume one three different historic heroes, each determining their equipment - and emergent playstyle to suit the player; a beacon can be found in the curator's - backpack upon spawning - - rscadd: Become the Braveheart, a fierce scottish warrior armed with a ceremonial - claymore, spraycan, kilt and a disregard for underwear with the scottish themed - hero pack. - - rscadd: A unique mention is the "First man on the Moon" heroic pack, with a two - piece space worthy suit, air tank & a GPS for recreating a key spessfaring moment - in history. - - tweak: The Curadrobe has been stripped & refilled full of helpful library supplies, - including varieties of pens and glasses including the jamjar's. - - tweak: The curator's explorer equipment & whip has been moved into the 'Courageous - Tomb Raider' heroic pack; removed from the backpack & the Curavend respectively. - MrJWhit: - - tweak: Added minor station things - - balance: re balanced r-walls - - tweak: Evens both sides of the gas containers TEG with reinforced windows - - tweak: Removed egun in every head locker, replaces RPD with air pump in science, - fixes a computer in sec, moves hand teleporter, and removes decals under lockers. - MrPerson: - - rscadd: Solar panels will visually rotate a lot more smoothly instead of being - locked to only 8 directions. - - rscadd: Timed solar tracking is in degrees per minute. You're still not gonna - use it though. - Naksu: - - rscadd: Time based free rerolls - - refactor: Refactored Blobs - - balance: Blob rerolls now give the blob 4 different options to choose from, rather - than forcing a single random one. - NecromancerAnne and goldnharl: - - imageadd: Sprite cleanups and animations for energy guns. - NecromancerAnne and zawo and zeroisthebiggay and carlarctg: - - rscadd: The Infiltrator Bundle, an armor kit for 3TC. Murder people in style! - - rscadd: Some pajamas for nukies to get plenty of bed rest. - - rscadd: halved firefight carry delay with latex or nitrile gloves - - tweak: headset upgrade is cheaper - Owai-Seek: - - rscadd: Butter Bear - - rscadd: Crab Burger, Bisque, Crab Rangoon, French Onion Soup, Empowered Burger, - Chicken Nugget box. - - tweak: +++ Spider Eggs to Exotic Meat crate. --- Bacon from Exotic Meat crate. - - tweak: Tweaked Crab Recipes - - imageadd: Butter Bear aka Terrygold - - balance: Food Crafting is now 5 deciseconds instead of 30. - Putnam: - - tweak: Swarmers, portal storm, wormholes are now controlled by dynamic. - - tweak: Dynamic-controlled events can now have a minimum start time. - - balance: Threatening meteors are more common (though still have pretty strict - requirements) - - balance: Different storytellers now balance around different expected players-per-antag; - default was 5, now intrigue/story/random have 7 and calm has 10. - - rscadd: Clown ops is now available as a roundstart antag in dynamic. - - balance: Sentient disease and revenant are now in the event pool rather than the - antag pool (with the logic that they're both completely useless and unfun to - play if people are actually playing against them). - - rscadd: A new formulation of extended was added to the storytellers; no antags, - but still spending threat on events. - - bugfix: Fixed a runtime in dynamic due to my misunderstanding pickweightAllowZero - - rscdel: Made conversion storyteller 0-weight-by-default. - Putnam3145: - - tweak: Salbutamol causes jittering now. - - bugfix: Made lickable pref save - - rscadd: 'Traitor classes for traitors: a new way for traitors to have objectives - assigned.' - - bugfix: Actually made things work as intended. - - code_imp: Removed a redundant turf melting check from the supermatter. - - rscdel: Removed "realistic tcomms lag" - - rscdel: Removed some particularly bad flavor objectives. - - balance: Power sink objective is 10x as easy to get - - bugfix: Processing objectives now properly stop once won - - rscdel: MKUltra no longer explodes into lovegas when it fermi explodes, instead - causing a regular ol' fireball. - - tweak: Eigenstasium OD flavor text less restrictive - - bugfix: Dynamic voting should work absent of a config. - - tweak: Autotransfer vote now requires actual transfer votes to transfer. - - bugfix: More dynamic fixes - - bugfix: Server-run votes aren't subject to vote cooldown - - rscadd: Mass hallucination can better be admemed - - tweak: Waffle co objective rewritten to make more clear it's not a murderbone - objective - - rscadd: CTF spawns, random animals and possessed blades can now be pinged for - ghost roles. - - bugfix: A bunch of polls now work with ghost role eligible non-observers. - - bugfix: Removes superfluous line in supermatter processing. - - code_imp: Power sink objective processing now makes sense. - Qustinnus/floyd, Ghommie: - - bugfix: To save costs, Nanotrasen has removed the emergency battery ejection systems - in modular computers. We realized saving the batteries isn't really important. - - bugfix: You can squash spiderlings with your bare hands now. - - bugfix: Being deafened properly stops jukebox music from playing. - - bugfix: admin multicam toggles no longer tells everyone but only admins and AIs - Ragolution: - - rscadd: All winter coats and hoods might be different if slightly from one a other. - - tweak: Adjusted Bartender's Drink Flinging print message to not include name of - target turf and save immersion. - Seris02: - - rscadd: tg genetics - - balance: illegal technology - - balance: rebalanced rising bass's buttom actions from repulse to side kick - - bugfix: projectiles and rising bass and items and rising bass - - bugfix: a very specific fix with tails and wagging - - rscadd: duffel bags of holding - - bugfix: quirk blacklist fixing - - bugfix: robotics console button swapping - - bugfix: fixed thieving gloves not pickpocketing fast - - rscadd: mentor de/rementor button - - bugfix: mentor !msg - - balance: bloodsuckers being unable to accept genes - - balance: removes xray from the gene pool - Skoglol: - - bugfix: Fixed gibber exploit. - Timberpoes: - - bugfix: 'Shuttle countdowns once again read like "01:05" instead of "01: 5".' - Trilbyspaceclone: - - rscadd: Three new arm implants, shield for sec, janitor and service - - rscadd: Two new legion drop. Assistant and Bee-Activist - - rscadd: Three new posters have been issued to the printing press - - rscadd: Well contruction, grubs to ash walker home, more seeds for ash walkers. - - rscadd: Wooden buckets can be made from 2 planks of wood, Tower caps also can - be used on a fire to make coal - - tweak: Makes all ashwalker round start seeds 5 yield and 50 harvest so that they - can get good crops in rather then failing after 1 harvest - - bugfix: arrow crafting has been fixed - - balance: Blobs now can store 250 points. - - spellcheck: Alien bar stool is no longer bronze - - server: 28 days log changlogs have been added well 56+ day old changlogs have - been removed - - balance: Added sunglasses that are able to be huds AND prescription - - rscadd: Prescription sunglasses and crafting of each new type for - Diagnostic, - Med and Sec - - rscadd: Diagnostic Sunglasses - - bugfix: Blackists Prescription HUDs from sunglasses crafting - - tweak: Cotton/Durathread now stack to 80 bundles - - rscadd: Medical hardsuits now have a Medi-Hud built into its helm - - rscdel: Removed old unused Techweb Node selling - - imageadd: Corrects snowcones names and a pixle. Corrects Space Wind snowcone as - well - - bugfix: Arrow crafting has been fixed... Again... - - rscadd: Soidifaction of and uranium can be done as well as making new bluespace - shards - - balance: Xeno and Fountain Hall will no longer spawn more then once - - tweak: Makes the game want to spawn in more then one tumor maybe - - tweak: Number of paper work in the crate "freelance paperwork" is half - - code_imp: A few cases were something their is unneeded copy past replaced with - many 1 in spawns - - rscadd: Potass Iodide has been fitted into standered borgs as well as medical - ones. Upgraded hypos now have Prussian Blue as well. - - tweak: Syndi borgs Potass Iodide has been swapped for Prussian Blue - - bugfix: No longer can you get the The End and Russian Flask without being the - donator - - balance: Pipes are small now - - bugfix: Edaggers now enbed as intended - - rscadd: The sleeper agents can be outfitted with some larger then normal sunglasses - for 1TC in Badass category - - rscadd: The Syndi Medical borg has been outfitted with the newest and latest ~~Stolen~~ - MediCo Gear on the market - - rscadd: Ninjas may be asked to steal the CMO's smart drapes - - tweak: Hyper Cell steal goal is upgraded to a bluespace cell, as well as the BoH - goal now wants a type of BoH rather then the normal default one. - - rscadd: Gutlunches have gotten teeth now and will eat legs, arms, and organs! - - Tho are picky and will not eat the brain just laying about! - Useroth: - - bugfix: contractor tablets spawned with invalid icon_state - Xantholne: - - rscadd: Bumbles is now actually in every station's hydroponics. - - bugfix: Bumbles will now actually rest, sit up, and buzz - YakumoChen: - - imageadd: Nekomata (double cat) tails. - - imageadd: 2CAT LMAO - - bugfix: Mining base looks more natural where it's spawned. - - server: Templates Headers will now correctly use the Citadel Official Wiki Link - Yenwodyah: - - bugfix: Bear traps and bolas apply slowdown correctly again - - bugfix: Recycler doesn't delete people in mechs, cardboard boxes, spells, etc. - anymore. - actioninja, ninjanomnom: - - tweak: Being fat is no longer lessened by flying. - - bugfix: The slowdown from grabbing someone no longer applies when you're floating. - bunny232: - - rscadd: Box bar now has a lightswitch. - - bugfix: fixes several piping issues around box station - - bugfix: moved a scrubber and vent down 5 pixels - - rscadd: Box station captain office now has a standard issue renault - - bugfix: Box bridge now actually has the air distro connected - dapnee: - - rscadd: Lambdastation and it's accompanying files - - rscadd: Robotic's APC, a few missing buttons (bridge shutters and crematorium), - paramedic has spawn locations now, two rapid cable deployers to engineering - - tweak: Renamed some doors and edited engineering to be a bit more open in one - spot - - bugfix: a few APCs with bad area tags, access on maintenance doors fixed, engine - APC is now connected to the grid instead of power created by the engine - - rscdel: the two syringe guns in medical were removed - - rscadd: couple gas masks around atmos - - bugfix: direction on turbine plasma pressure tank, cloning actually has a cloning - console now - floyd: - - bugfix: Everything made from glass in the game has a little more tegridy and doesnt - break from a single punch. - kappa-sama: - - rscdel: removed laptops giving slowdown when open - - balance: removed (mostly aesthetic) requirement to become hulk - - bugfix: changed add to remove on crit - - rscadd: a super combat shotgun that loads and fires 2 shells at a time - - balance: replaces bubblegum's blood contract drop with the super shotgun - - balance: 60 seconds instead of 120 for firebreath - keronshb: - - balance: blobs now receive a 50% cost refund on attacks that don't spread - - balance: reflector blobs are considerably tougher - - bugfix: fixed an integrity - - bugfix: attempting to turn a damaged strong blob into a reflector blob now refunds - points - - bugfix: also fixes blob node camera jump (from another PR) - kevinz000: - - code_imp: Mobility flags are here. Fixed some edge cases with xeno hardstuns and - similar stuff like warden's shotgun hardstuns and yeah. - - rscadd: Security now has riot quarterstaves in their lethal shotgun locker. - - tweak: Pushing is no longer free space movement. - - tweak: You can now right click to point the tip of some sharp tipped weapons at - people. - - bugfix: compact defibs have 10k cells again - - tweak: music max characters per line is now 150 instead of 50. - - bugfix: storage no longer closes while being dragged - - balance: disabler taser alt fire shots are faster and have a 14 tile range now - - balance: HoS taser now only applies tased effect for 1 second and warden's pump - action stun blaster no longer applies it at all. - - balance: Nanite adrenals have been nerfed. - - balance: Ninja stungloves nerfed 49 stamina to 25 (so they're basically just better - than stunbatons). - - tweak: Batons now also trigger disarm behavior in disarm intent and not just on - right click. - - refactor: combat mode/sprint/resisting lying down/attempting to crawl under all - refactored, added combat/sprint mode lockouts, being locked out of combat mode - no longer disables it and allows right click interactions etc etc - - bugfix: hands free actions no longer check mobility and only consciousness. - - rscadd: Minimaps, accessible via a button on OOC. - - bugfix: unnecessary blindness post-unconsciouss has been fixed with a hack that's - almost as garbage as the code that caused it in the first place. - - bugfix: synthflesh and rezadone now take total amounts of both applied and existing - reagents rather than only existing and only applied respectively. - - balance: reverts bubblegum bloodling swarming. - - balance: Beam rifles shot count 10 --> 5 and can no longer pierce. Also renders - properly for reflections against blobs and some other things. - - bugfix: being stunned no longer stops an ai from undeploying from a shell. - - bugfix: beam rifles are less terrible code - - code_imp: slowdown on items should now be set by set_slowdown(). - - bugfix: hypereutactic blades properly slow down their wielders when being used - and vv-editing an item's slowdown will once again properly update someone's - slowdown to take the new value into account. - - balance: stunprods knockdown again. - monster860: - - tweak: You can now moan in soft crit - - rscadd: Use Ctrl-Shift-direction key to shift your characters position. Use for - ERP. - necromanceranne: - - rscadd: Ports New Sleeping Carp - - refactor: Ports the martial arts refactors, which includes things like moving - martial into the martial subfolder and renaming it _martial, and cleans up human_defense - rising bass/sleeping carp exclusive code. - - balance: Particle Defender is now a much more sane weapon. - - balance: Tasers are no longer ignoring stimulants. - - bugfix: Blood beam can't create harvesters out of mech pilots. - - code_imp: Some minor fixes to fakedeath and a tg fix port. - - bugfix: Bleeding out all your blood from getting love tapped by a toolbox. - - bugfix: Diagnostic HUDSunglasses are better than ever! - - bugfix: Sprite fixes I hope - - balance: You can no longer acquire stun bullets in the .45 calibre. You can get - the 30 damage version out of the autolathe instead. - - balance: KITCHEN GUN (TM) is a lot stronger. Cleaning bullets are a whole 40 damage! - - bugfix: Fixed turrets not allowing their guns to be recovered. - - balance: Altered the plastitanium rapier from a perfect AP but weaker esword equivalent - to a more unique sleep inducing melee weapon. - - rscadd: Touched up all the relevant sprites. - - balance: Nightvision goggles are nerfed all-round. Flashes have actual use against - people using nightvision, as do flashbangs. - - balance: Syndicate nuclear agents get to live peacefully knowing their eyes are - well protected by their special night vision goggles. Spider clan also get these - goggles. - raspyosu: - - rscadd: some flavor text for lunge, cloak - - tweak: mesmerize, cloak functionality/requirements - - balance: mesmerize, lunge, cloak - - soundadd: lunge telegraph sound - - spellcheck: mesmerized status icon flavor text - - bugfix: cloak sometimes not restoring initial move intent - - tweak: mesmerize (line of sight checking system and remove progress bar) - - balance: 'nerf: lunge, mesmerize' - spookydonut: - - code_imp: adds selective duplicate component mode - wesoda25: - - code_imp: You no longer hit fermenting barrels when taking reagents from them - zeroisthebiggay: - - rscadd: kilo shuttle less bad - - rscadd: tauric contractor space suits - - tweak: ghost hud and nv defaults on - - bugfix: syndicate elite hardsuit helmet doesnt hide masks anymore - - balance: syndicate contractor helmets are no longer secretly lead - - rscadd: Space Fashion has discovered a new way to wear bandannas. With some simple - minor adjustments and ties, bandannas can be made into fashionable neckerchiefs! - - rscadd: Box Station has gotten a brand new brig. Go and check it out and discover - all the quirky little soulbits. - - bugfix: box brig miscellaneous issues - - bugfix: box station hos office +DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. +--- +2015-04-04: + ACCount: + - rscadd: Emergency welding tool added to emergency toolbox. + - rscadd: Changed industrial welding tool sprite. + - tweak: Replaced welder in syndicate toolbox with industrial one. + - tweak: All tools in syndicate toolbox are red. Corporate style! + - tweak: Red crowbar is a bit more robust. + - bugfix: 'Fixed two bugs: welder icon disappearing and drone toolbox spawning with + invisible cable coil.' + AnturK: + - rscadd: 'Picket signs: table crafted with a rod and two cardboard sheets, write + on them with pen or crayon.' + Cheridan: + - wip: The bar's layout has been changed with a poker table and re-arranged seating. + Dannno: + - rscadd: Added gun lockers for shotguns and energy guns. Click on the lockers with + an item to close them if they're full. + Gun Hog: + - rscadd: Nanotrasen research has finalized improvements for the experimental Reactive + Teleport Armor. The armor is now made of a thinner, lightweight material which + will not hinder movement. In addition, the armor shows an increase in responsiveness, + activating in at least 50% of tests. + Incoming: + - rscadd: The iconic blood-red hardsuits of nuke ops can now be purchased for a + moderate sum of 8 TC by traitors. + Jordie0608: + - tweak: Cyborg mining drills now use up their internal battery before drawing power + from a borg's cell. + - bugfix: Fixes cyborg mining drills not recharging. + RemieRichards: + - rscadd: Burning mobs will ignite others they bump into or when they are stepped + on. + Xhuis: + - tweak: Malfunctioning AIs can no longer leave the station z-level. Upon doing + this, they will fail the round. + - tweak: Phazon exosuits now require an anomaly core as the final step in their + construction. + xxalpha: + - rscadd: Added Nutriment Pump, Nutriment Pump Plus and Reviver implants. + - tweak: Added origin technologies to all implants. + - tweak: 'The following implants are now much harder to obtain: X-ray, Thermals, + Anti-Stun, Nutriment Pump Plus, Reviver.' + - tweak: Cauterizing a surgery wound will now heal some of the damage done by the + bonesaw if it was used as part of the same surgery. + - tweak: Added ability for Medical HUDs to detect cybernetic implants in humans. +2015-04-09: + Iamgoofball: + - rscadd: Quite a lot of cleanables can now be scooped up with a beaker in order + to acquire the contents. + - rscadd: Light a piece of paper on fire with a lighter, and scoop up the ashes! + - rscadd: Scoop up the flour the clown sprayed everywhere as a 'joke'! + - rscadd: Scoop up the oil left behind by exploding robots for re-usage in chemistry! + - rscadd: You can splash the contents of a beaker onto the floor to create a Chemical + Pile! This pile can be heated or blown up and have the reagents take the effects. + Make a string of black powder around a department in maint. and then heat it + with a welder today! + - rscadd: Reagents now can have processing effects when just sitting in a beaker. + - rscadd: Pyrosium and Cryostylane now feed off of oxygen and heat/cool the beaker + without having to be inside of a person! + - rscadd: Reagents can now respond to explosions! + - rscadd: Black Powder now instantly detonates if there is an explosion that effects + it. + - rscadd: Fire now heats up beakers and their contents! + - rscadd: Activate some smoke powder in style by lighting the beaker on fire with + a burning hot plasma fire! + RemieRichards: + - tweak: Ninja stars are summoned to your hand to be thrown rather than automatically + targetting nearby mobs. + - rscadd: 'Added Sword Recall: pulls your katana towards you, hitting mobs in the + way. Free if within sight, cost scales with distance otherwise.' + - rscadd: Enemies can be electrocuted by a ninja as the cost of his energy, stunning + and injuring them. + - rscdel: Removed SpiderOS, functions moved to status panel. + - bugfix: Fixed energy nets not anchoring target, katana emag spam and sound delay. + optimumtact: + - bugfix: Mimes can't use megaphone without breaking their vow anymore. + phil235: + - tweak: Flying animals no longer triggers mouse traps, bear traps or mines. +2015-04-11: + Gun Hog: + - tweak: Nanotrasen has approved an access upgrade for Cargo Technicians! They are + now authorized to release minerals from the ore redemption machine, to allow + proper inventory management and shipping. + Iamgoofball: + - tweak: Blobbernauts no longer deal chemical damage, brute damage increased however. + Ikarrus: + - experiment: Getting converted by a rev or cultist will stun you for a few seconds. + Incoming5643: + - bugfix: Fixes some AI malf powers being usable when dead. + MrPerson: + - tweak: Reduces movement speed penalty from being cold. + Xhuis: + - rscadd: Adds a pizza bomb traitor item for 4 telecrystals. It's a bomb, diguised + as a pizza box. You can also attempt to defuse it by using wirecutters. + kingofkosmos: + - rscadd: Activating internals with an adjusted breath mask will automatically push + it up to normal state. + - tweak: Masks can now be adjusted when buckled to a chair. + optimumtact: + - tweak: Stun batons no longer lose charge over time when on. + phil235: + - tweak: The AI holopads now use a popup window just like computers and other machines. + - rscdel: Nerfs kinetic accelerator and plasma cutters. Plasma cutter is no longer + in the mining vendor. Reduces the drilling cost of all drills. + - rscadd: Adding 40+ new food and drink recipes, mostly using the newest plants. + Notably rice recipes, burritos, nachos, salads, pizzas. + - tweak: Opening the tablecrafting window can now also be done by dragging the mouse + from any food (that's on a table) onto you. + - rscadd: The kitchen cabinet starts with one rice pack. + - tweak: Glasses with unknown reagent will no longer be always brown but will take + the color of their reagents. +2015-04-13: + AnturK: + - rscadd: 'Spacemen have learned the basics of martial arts: Boxing, unleash it''s + power by wearing Boxing Gloves.' + - rscadd: While boxing you can't grab or disarm, but you hit harder with a knockout + chance that scales off stamina damage above 50. + - rscadd: Rumors have been heard of powerful martial styles avaliable only to the + gods themselves. + CosmicScientist: + - rscadd: Added a dehydrated space carp to traitor items, bought with telecrystals. + Use dehydrated space carp in hand to school them on loyalty. Add water to create + a vicious murder machine just for the halibut. + - tweak: The toy carp plushie now has attack verbs for fun, hit your friend with + one today. I put my sole into this mod. + - wip: If you can think of a better fish pun let minnow but I shouldn't leave it + to salmon else. + Ikarrus: + - tweak: Gang bosses can no longer purchase certain potent traitor items but instead + have access to some of a nuke op's arsenal of weapons. + Incoming5643: + - rscadd: 'Three new chemical types of blob can occur: Omnizine, Morphine and Space + Drugs.' + MrPerson: + - experiment: New lighting system! Lighting now smoothly transfers from one lighting + level to the next. + Xhuis: + - rscadd: There have been... odd sighting in Space Station 13's sector. Alien organisms + have appeared on stations 57, 23, and outlying. + - rscadd: Nanotrasen personnel have reason to believe that Space Station 13 is under + attack by shadowlings. We have little intel on these creatures, but be on the + lookout for odd behavior and dark areas. Use plenty of lights. + Zelacks: + - tweak: Defibs no longer have a minimum damage requirement for a successful revive. + Patients will have 150 total damage on a successful revive. + - tweak: Additional feedback is given for several failure states of the defib. + xxalpha: + - wip: Airlock crushing damage increased. +2015-04-16: + AnturK: + - rscadd: Nanotrasen authorities are reporting sightings of unidentified space craft + near space station 13. Report any strange sightings or mental breakdowns to + central command. + - rscadd: 'PS : Abductions are not covered by health insurance.' + - rscadd: Shadowlings and their thralls now have HUD icons. + - rscadd: Thralls learn their master's objectives when enthralled. + - rscadd: Regenerate Chitin ability lets shadowlings re-equip their armor if lost. + - tweak: Loyalty implanted people take 25% longer to enthrall, but lose their implant + and become immune to re-implanting. + - experiment: Shadowlings now have a message in their spawning text which specifies + that cooperation is mandatory. + - bugfix: Veil now works on equipped lights. + - bugfix: Shadowlings now take correct amount of burn damage and in light and heal + clone and brain damage in darkness. + - bugfix: Fixes 'Round end code broke' displaying every round. + - bugfix: Shadowlings who ascend will nore greentext properly. + Gun Hog: + - rscadd: Thinktronic Systems, LTD. has increased the Value of the Value-PAK PDA + cartridge! Standard issue for Captain PDAs, it can now access security bots, + medibots, cleanbots, and floorbots ALL AT ONCE! In addition, it can also connect + to your station's Newscaster network at NO EXTRA CHARGE! As a Thank you for + our contract with them, they have thrown in Newscaster access for the HumanResources9001 + cartridge, Heads of Personnel rejoice! + - tweak: The Newscaster app has also gotten a free upgrade which allows it to display + images and comments inside of posts! + - bugfix: Nanotrasen has concurrently released a patch for bots which will allow + off-station bots to properly patrol. + Incoming5643: + - rscadd: Changeling head slugs have been given player control, ventcrawling, and + a short escape period after egg laying. + MrStonedOne: + - rscadd: Admin ghosts can now drag ghosts to mobs to put that ghost in control + of that mob. + Xhuis: + - rscadd: Nanotrasen scientists have recently observed a strange genome shift in + green slimes. Experiments have shown that injection of radium into an active + green slime extract will create a very unstable mutation toxin. Use with caution. +2015-04-19: + AnturK: + - bugfix: Observers can now see abductor hivemind messages. + - rscadd: 'Adds advanced baton for abductors: Stun, Sleep and Cuff in one tool.' + - rscadd: Abductor agents now have vest cameras. + - imageadd: New sprites for abductors and their gear made by Ausops. + Fayrik: + - rscadd: Added jobban options for Abductors and Deathsquads. + - tweak: Made admin antag spawning buttons more efficient and less prone to failure. + Xhuis: + - rscadd: Recent sightings aboard space stations shows that spirits seem to be manifesting + as malevolent revenants and draining the life of crew. The chaplain may be helpful + in stopping this new threat. + kingofkosmos: + - wip: Girder and machine frame construction protocols has been changed. They can + now be secured/unsecured with a wrench and disassembled with a welder. +2015-04-20: + Fayrik: + - rscadd: Abductors now get advanced camera consoles. + - tweak: Redesigned Centcom again. There's a bar at the thunderdome now. + - rscadd: Headsets can now be locked to a spesific frequency, this only occurs for + nuke ops and deathsquads. + - rscadd: The Centcom channel is now available over all z-levels, regardless of + telecomms status. + - tweak: The Deathsquad space suits have been upgraded to hardsuits. + - rscadd: The Deathsquad now have thermal imaging huds, which can swap which hud + they display on the fly. + phil235: + - tweak: Reagents are now back to being metabolized every tick. Fixes frost oil + and capsaicin not working. + - tweak: Fixes not being able to make sterilizine. + - rscadd: Adding overdose to space drug, causing mild hallucination and toxin and + brain damage. + - tweak: Nerfed healing power of stimulant reagent. Buffed ephedrine a bit. + - rscadd: Nitroglycerin can now be stabilized with stabilizing agent, and explodes + when heated. +2015-04-21: + Ikarrus: + - wip: Gang mode has had some considerable work done on it, including a new objective + and currency dynamic. + - rscadd: New objective: Claim half the station as territory by tagging it + with spray cans supplied to gang bosses, but usable by any member. + - wip: An area can only be tagged by one gang at a time, remove your opponent's + tag or spray over it. + - rscadd: New recruitment: Recruiment pens replace flashes, stab people to + recruit them. + - experiment: Recruitment is silent, but causes brief seizures and has a cooldown + that scales upwards with a gang's size. + - rscadd: New tool: The Gangtool is used by bosses and lieutenants to recall + the shuttle and purchase supplies. + - rscadd: Pistols, ammo, spraycans, recruitment pens and additional gangtools can + all be bought. + - tweak: Gangtools also alert the user of promotions, purchases and territory changes + within the gang. + - rscadd: Lieutenants are promoted from gang members when given their own gangtool; + they're immune to deconversion and able to do anything a boss can except promotion. + - rscadd: New currency: Influence is used to purchase with the gangtool and + is generated every 5 minutes by each territory owned by the gang. + - tweak: Thermite can be cleaned off walls now. +2015-04-22: + Incoming5643: + - rscadd: 'Adds a new fun button for admins: ''Set Round End Sound''. You can use + the set round end sound button to set the round end sound. Glad we cleared that + up!' + Miauw62: + - wip: Very slightly expanded atmos and added an external airlock. + Xhuis: + - bugfix: A few issues have been fixed for revenants. In addition, the Mind Blast/Mind + Spike sound effect has been removed. + - rscadd: Adds the Hypnotize ability to revenants. It will cause a target to fall + asleep after a short time. + xxalpha: + - rscadd: Added an Exosuit Mining Scanner to the robotics fabricator. + - tweak: Buffed Ripley's movement and drilling speed in low pressure environments. +2015-04-25: + Boggart: + - rscadd: Generalizes handheld instrument code and Ports Nienhaus's guitar, sounds + by BartNixon of Tau Ceti. + - rscadd: Fixes being unable to build disposal pipes on walls, makes changing the + RPD's settings not affect pipes that are currently building, makes the RPD use + the datum/browser ui, makes it use categories and makes it show the selected + mode. + Gun Hog: + - rscadd: Nanotrasen has provided designs for fabrication of APC power control modules. + You may print them at any autolathe. + Ikarrus: + - rscadd: Gangs can now purchase switchblades, a relatively cheap and decently robust + melee weapon. + - tweak: Gangs now require at least 66% control of the station to win. + - tweak: Gang spraycan uses reduced to 15. + - tweak: Pistol cost increased to 30 Influence + - tweak: Promotions now start off cheap at 20 influence but get more expensive the + more people you promote. + Xhuis: + - rscadd: Added a Create Antagonist button for revenants. + - rscdel: Removed Mind Blast. + - bugfix: Revenants no longer get killed by explosions. + - tweak: Mind spike cooldown increased to 4 seconds. + - tweak: Harvest now takes 8 seconds and requires you to be adjacent to the target. + - tweak: Hypnotise sleeps targets for longer. + - tweak: Revenant now starts with 3 strikes. + phil235: + - tweak: Telecom machines are now deconstructed the same way as all other constructable + machines. + - tweak: You can no longer overdose on nicotine but you can get addicted (very mild + effects). +2015-04-29: + AndroidSFV: + - tweak: Dehydrated carp now are friendly to both the imprinter of the plushie as + well as any coded-in allies (I.E. Nuke Ops team), and unfriendly to carp of + other origin othan than yourself or your coded-in allies. Dehydrated carp that + are not imprinted will still have the same behavior as regular carp. + AnturK: + - rscadd: Advanced cameras now have all functionality of the abductor consoles. + - tweak: Pinpoint teleportation takes 8 seconds and spawns a flashy silhouette at + the target location. Can be used as distraction since it appears even if teleporter + is empty. + - bugfix: Abductors are now immune to viruses. + - bugfix: Dissection surgery ignores clothes. + - bugfix: Non-abductors can escape the ship by fiddling with consoles enough. + - rscadd: Three new negative glands. + - rscadd: Bloody glands spray blood everywhere and injure the host. + - rscadd: Bodysnatch glands turn the host into a cocoon that hatches doppelgangers. + - rscadd: Plasma glands cause the host to explode into a cloud of plasma. + GoonOnMoon: + - rscadd: Added a new assault rifle to the game for use by Nanotrasen fighting forces + in special events. Also happens to be available in the Liberation Station vending + machine and the summon guns spell usable by the wizard and badminnery. + Iamgoofball: + - rscdel: Acid blob has been removed. + - tweak: Charcoal and Silver Sulf are more powerful now. + - tweak: Styptic power and Silver Sulf metabolize at the default rate. + Ikarrus: + - rscadd: Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as + grafiti. + - tweak: Influence income changed to provide weaker gangs a bigger boost, while + slowing down stronger gangs to promote opportunity for comebacks. + - tweak: Gangs only earn influence on territories they have held on to since the + previous Status Report (the income calculation every 5 minutes). This places + more significance on defending your existing territory. + - bugfix: You must be in the territory physically to tag it now. So no more tagging + everything from maint. + - tweak: Gang income delay reduced to 3 minutes intervals. + - tweak: Gang Capture goal reduced to 50% + - tweak: Gang spraycan use increased to 20 + - tweak: Gang Boss icon is now a red [G] icon to make it stand out better from regular + gang icons + JJRcop: + - tweak: TED's kill duration has been halved. + - tweak: Escaping from the TED's field no longer kills you. + RemieRichards: + - rscadd: Adds Easels and canvases for custom drawings. + - imageadd: Place a canvas on an easel and draw on it with crayons, clean one pixel + with a rag or soap and activate it in-hand to erase the whole canvas. + - rscadd: Ports VG's Ventcrawling overhaul! + - tweak: Crawling through vents is no longer instant, you now have to move and navigate + manually + - rscadd: While inside pipes and other atmos machinery, you now see pipe vision + phil235: + - bugfix: Podplants are no longer unharvestable. + - tweak: Choosing your clown, mime, cyborg and AI name as well as religion and deity + is now done in the preferences window. As a chaplain , your bible's icon is + now chosen by clicking the bible. +2015-04-30: + Fayrik: + - rscadd: Ported NanoUI to most atmospherics equipment. + TheVekter: + - tweak: Hooch is now made with 2 parts Ethanol, 1 part Welder fuel and 1 part Universal + Enzyme as a catalyst. + - tweak: No-slip shoes are paintable, painting them doesn't remove no-slip properties. +2015-05-01: + Ikarrus: + - rscadd: Gang bosses can now rally their gang to their location with their gangtool. + - rscadd: Gangtools can no longer recall the shuttle if station integrity is lower + than 70% + - rscdel: Removed requirement to be in the territory to tag it. + - tweak: Recruitment Pen cost reduced to 40. + - bugfix: Communications console should now accurately print the (lack of a) location + of the last shuttle call. + Xhuis: + - rscdel: Revenants will no longer spawn without admin intervention. They are pending + a remake. +2015-05-02: + Boggart: + - bugfix: Cryo tubes can no longer be used for ventcrawling. + Ikarrus: + - rscadd: Admins can choose the strength and size of Centcom teams to send, ranging + from officials to deathsquads, with the 'Make Centcom Respone Team' button. + phil235: + - tweak: Space carps can no longer knock down anyone, but they now deal additional + stamina damage to humans. + - tweak: Radiation effects from uranium walls are nerfed to the level of uranium + floor. + - rscadd: You can no longer put an inactive MMI in a cyborg shell. Ghosted brains + now get an alert when someone puts their brain in a MMI. You can now examine + the MMI to see if its brain is active. +2015-05-03: + AnturK: + - rscadd: Abductors can purchase spare gear with experimentation points. + Ikarrus: + - rscadd: Admins can now adjust the pre-game delay time. + MrStonedOne: + - experiment: MasterController and subsystem rejiggering! + - rscadd: The MC can now dynamcially change the rate a subsystem is triggered based + on how laggy it's being. This has been applied to atmos to allow for faster + air processing without lagging the server + - tweak: Pipes and atmos machinery now processes in tune with air, rather than seperately. + - bugfix: Fixed hotspots and fire causing more lag than they needed to + - bugfix: Fixed some objects not getting garbage collected because they didn't properly + clear references in Destory() + - tweak: The qdel subsystem will now limit its processing time to a 5th of a second + each tick to prevent lag when a lot of deletes happen + - bugfix: Fixed the ticker not showing a tip of the round if an admin forces the + round to start immediately +2015-05-04: + Firecage: + - bugfix: Emagged windoors can now be deconstructed. + RemieRichards: + - rscadd: Adds Plasmamen, a species that breathes plasma and bursts into flames + if they don't wear special suits. + - imageadd: New burning icon for all humanoid mobs. + - imageadd: New sprite for Skeletons to match Plasmamen. + oranges: + - tweak: Thanks to recent advances in fork science, you no longer need to aim at + your eyes to eat the food off a fork + xxalpha: + - rscadd: 'Adds a new barsign: ''The Net''.' +2015-05-05: + Firecage: + - bugfix: Golems and skeletons no longer fall over when stepping on shards. + Gun Hog: + - bugfix: Mining borg diamond drill upgrade now functional. + Ikarrus: + - tweak: Doubled the initial charge of SMESs in Engineering. + - tweak: Influence cap for gangs has been increased. + incoming5643: + - bugfix: All modes now select their antagonists before job selection, this means + that a player who prefers roles normally immune to being certain antagonists + (implanted roles/silicons) can still have a fair shot at every antagonist roll + they opt into. If they're selected they simply will not end up with an incompatible + job. + - bugfix: As an example if someone loved to play Head of Security (humor me here) + and had it set to high, and the only other jobs he had set were security officer + at medium and botanist at low but he was selected to be a traitor, he would + spawn as a botanist even if there ended up being no Head of Security. + - experiment: Please give playing security another chance if you'd written it off + because it affected your antag chances. + xxalpha: + - bugfix: Hulks can now break windoors. + - bugfix: Fixed smoking pipe messages. Fixed emptying a smoking pipe with nothing + in it. +2015-05-06: + Jordie0608: + - bugfix: Borgs can now open lockers with the 'Toggle Open' verb. + Thunder12345: + - bugfix: Severed the cryo tube's connection to the spirit world. Ghosts will no + longer be able to eject people from cryo. Please report further instances of + poltergeist activity to your local exorcist. + Xhuis: + - tweak: Many minor technical changes have been made to cult. + - rscadd: Cultist communications now show the name of the person using them. Emergency + communications do not do this. + - rscadd: Emergency communication does less damage. + xxalpha: + - rscadd: Engineering cyborgs can now pick their cable coil color whenever they + want. +2015-05-07: + Xhuis: + - rscadd: Emagged defibrillators will now do burn damage and stop the patient's + heart if used in harm intent. + - tweak: The previous stunning functionality of the emagged defibrillator has been + moved to disarm intent. + phil235: + - tweak: Temperature effects from frost oil and capsaicin reagents and basilisk + have been buffed to be significant again. + xxalpha: + - tweak: Hulks can now break windoors. +2015-05-08: + Firecage: + - tweak: Mobs can now be buckled to operating tables. + Gun Hog: + - rscadd: 'Top scientists at Nanotrasen have made strong progress in Artificial + Intelligence technology, and have completed a design for replicating a human + mind: Positronic Brains. Prototypes produced on your research station should + be compatible with all Man-Machine Interface compliant machines, be it Mechs, + AIs, and even Cyborg bodies. Please note that Cyborgs created from artificial + brains are called Androids.' + - tweak: The pAI role preference and related jobbans have been renamed to properly + reflect that they are not soley for pAI, but include drones and positroinc prains. + astralenigma: + - tweak: Cargo packages are now delivered with their manifests taped to the outside. + Click on them with an open hand to remove them. + optimumtact: + - tweak: Machine frame and girder deconstruction now uses a screwdriver instead + of welding tool. +2015-05-09: + Firecage: + - tweak: Increased the manifestation chance of super powers. + Ikarrus: + - experiment: 'Loyalty implants will no longer survive deconverting a gangster. + Security now needs to use two of them if they want the permanent effects: The + first to deconvert them, and the second to make them loyal.' + KorPhaeron: + - tweak: Slime mutation chance now starts at 30%. + - rscadd: Baby slimes have a -5% to 5% difference of their parent's mutation chance, + allowing you to breed slimes that are more likely to mutate. + - rscdel: Plasma and epinephrine no longer affect mutation chance of slimes. + - rscadd: Red slime extract and plasma makes a potion that can increase mutation + chance, Blue slime extract and plasma potions will decrease it. +2015-05-10: + AnturK: + - bugfix: Fixed borg's cells draining much faster than they're meant to. + Gun Hog: + - tweak: Station bot performance greatly increased. + - rscadd: Captain PDA cartridge now includes nearly all utilities and functions, + including signaller and all bots! HoP now has janitor and quartermaster functions! + The RD and Roboticists now have access to Floor, Clean, and Medibots! + - tweak: Bot access on PDA is now one button across all PDAs. You will only see + what bots you can access, however. + - rscadd: Cartridges that include a signaller have been improved so they will work + on a larger frequency range. + - tweak: All bots now have Robotics access, so they may be set to patrol and released + once constructed. + - tweak: Roboticists now have access to bot navigation beacons. They are found under + the floor tiles as patrol route nodes. +2015-05-11: + Firecage: + - imageadd: New icons for Industrial and Experimental welding tools. + Gun Hog: + - rscdel: The power mechanic for mining drills and the jackhammer has been removed. + They no longer require cells or recharging. + - bugfix: The diamond drill upgrade for mining cyborgs has been fixed. + Xhuis: + - rscadd: Adds the pneumatic cannon, attach an air tank and shoot anything out of + it. + - rscadd: Improvised pneumatic cannons can be tablecrafted with a wrench, 4 metal, + 2 pipes, a pipe manifold, a pipe valve and 8 package wrappers. + spasticVerbalizer: + - bugfix: False walls no longer stackable. +2015-05-13: + Firecage: + - rscadd: Kudzu is now admin-logged in Investigate. + GunHog: + - tweak: Positronic brains are now entered by clicking on an empty one, in the same + manner as drones. + - rscadd: Ghosts are alerted when a new posibrain is made. + Jordie0608: + - rscadd: Borg reagent containers (beakers, spraybottles, shakers etc.) are no longer + emptied when stowed. + - bugfix: Fixes North and West Mining Outposts having empty SMESs. + - bugfix: Aliens and slimes can smash metal foam again. + - rscdel: Deconstructing reinforced walls no longer creates additional rods out + of nowhere. + - imageadd: Pepperspray now has inhand sprites. + Xhuis: + - bugfix: Fixes the recipe for pneumatic cannons; it now only requires a wrench, + 4 metal, 2 pipes and 8 package wrappers . +2015-05-15: + xxalpha: + - bugfix: Fixed emitter beams not being reflectable. +2015-05-16: + MartiUK: + - bugfix: Fixed a typo when cleaning a Microwave. + - bugfix: Fixed a typo when burning someone with a lighter. +2015-05-20: + xxalpha: + - rscadd: Added three drone shells to the derelict. +2015-05-22: + Jordie0608: + - tweak: Smothering someone with a damp rag when in harm intent will apply reagents + onto them, for acid-burning their face; otherwise it will inject them, for drugging + with chloral hydrate. + - imageadd: The healthdoll is now blue when at full health to make it more clear + when a body part is injured. +2015-05-25: + spasticVerbalizer: + - tweak: Glass airlocks can now be made heat-proof by using a sheet of reinforced + glass to create the window, regular glass creates a normal glass airlock. + xxalpha: + - bugfix: You can no longer drop items inside mechas nor machinery (this includes + gas pipes, disposal pipes, cryopods, sleepers, etc.). + - bugfix: Fixed exploit of changelings being able to keep thermal vision after resetting + their powers. + - bugfix: Fixed being able to implant NODROP items with cavity implant surgery. +2015-05-26: + CosmicScientist: + - spellcheck: Corrected wording for the pAI, donksoft riot darts and some tip of + the round tips. + xxalpha: + - bugfix: Fixed changeling revival. +2015-05-30: + duncathan: + - bugfix: Fixes passive gates not auto-coloring. + spasticVerbalizer: + - tweak: Players trying to speak but unable to will now get a message. +2015-05-31: + duncathan: + - tweak: Clarified the ability to retract changeling armblades. +2015-06-04: + Cuboos: + - rscadd: Added casting and firing sounds for wizard spells and staves. + - rscadd: A new title theme has been added. + Gun Hog: + - rscadd: Nanotrasen has approved the designs for destination taggers and hand labelers + in the autolathe. + Palpatine213: + - tweak: Allows sechuds to have their id locks removed via emag as well as EMP +2015-06-05: + CandyClown: + - tweak: Ointments, bruise packs, and gauze are now stacked to 6 instead of 5. + CorruptComputer: + - bugfix: Security lockers no longer spawn in front of each other on Box. + - bugfix: Hooked up the scrubbers in QM's office on Box. + - bugfix: Fixed bar disposals on Box + - bugfix: Fixed the stacked heater+freezer in expirementor maint on Box + - tweak: Made the turbine into Atmos and Engineering access only, and renamed the + doors to Turbine on Box. + Ikarrus: + - rscadd: Gang Bosses will now be able to discreetly send messages to everyone in + their gang for 5 influence a message. + - tweak: Conversion pens now use a flat 60sec cooldown rate. + KorPhaeron: + - rscadd: You can now lay tiles on the asteroid. Go nuts building forts. +2015-06-06: + Incoming5643: + - rscadd: Antagonists with escape alone can now escape with others on the shuttle, + so long as they are also antagonists. + - rscadd: Antagonists with escape alone can also win if non-antagonists are on the + shuttle provided they are locked in the brig. + - rscadd: Escaping to syndicate space on board the nuke op shuttle is now a valid + way to escape the station. + Jordie0608: + - rscadd: Admin-delaying the round now works once it has finished. +2015-06-07: + Aranclanos: + - rscadd: Malfunctioning AIs can preview placement of a Robotic Factory. + Iamgoofball: + - rscadd: Bicardine, Dexalin, Kelotane, Anti-toxin, Inaprovaline and Tricordrazine + have been re-added. + RemieRichards: + - rscadd: Lizards can now wag their tails, emote *wag to start and *stopwag to stop. + kingofkosmos: + - tweak: Mops can now be wet from normal buckets and sinks. +2015-06-08: + AnturK: + - imageadd: Improved the interface of Spellbooks. + Cheridan: + - tweak: Push-force from Atmospherics now depends on an entity's weight, heavier + objects are less prone to being pushed. + - rscadd: Magboots and No-Slip shoes now prevent pushing from spacewind. + Firecage: + - rscadd: Protolathes can now build Experimental Welding Tools. +2015-06-09: + Aranclanos: + - wip: Structures and machines can now be built on shuttles. + Iamgoofball: + - rscadd: 'Adds the Bluespace Rapid Part Exchange Device: holds up to 400 stock + parts and can be used to upgrade machines at range without needing to open their + maintenance panel.' + - rscadd: A new tier of stock parts have been added, they're very expensive to produce + but provide ample improvements. + - experiment: Many machines can now also be upgraded. + - tweak: 'Emitter: Lasers decrease firing delay and Capacitors decrease power consumption.' + - tweak: 'Gibber: Matter Bins increase yield of meat and Manipulators speed up operation + time, at high level can gib creatures with clothes.' + - tweak: 'Seed Extractor: Matter Bins increase storage and Manipulators multiply + seed production.' + - tweak: 'Monkey Recycler: Matter Bins increase the amount of monkey cubes produced + and Manipulators reduce the monkey-to-cubes ratio to a minimum of 1-to-1.' + - tweak: 'Crusher: Matter Bins increase material yield and Manipulators increase + chance to yield materials, at high level there is a chance for rarer materials.' + - tweak: 'Holopad: Capacitors increase an AI''s traversal range from the holopad.' + - tweak: 'Smartfridge: Matter Bins increase storage.' + - tweak: 'Processor: Matter Bins increase yield and Manipulators speed up operation + time.' + - tweak: 'Microwave: Matter Bins increase storage.' + - tweak: 'Ore Redemption Machine: Matter Bins increase yield per ore, Lasers increase + points per ore and Manipulators speed up operation time.' + - tweak: 'Hydroponics Tray: Manipulators improve water and nutrients efficiency.' + - tweak: 'Biogenerator: Matter Bins increase storage.' + bananacreampie: + - rscadd: Added several new options to the ghostform sprites +2015-06-11: + Cheridan: + - rscdel: Removes the powerdrain for individiual active modules on cyborgs. +2015-06-12: + Ikarrus: + - experiment: Gang Updates + - rscadd: 'New objective: To win, Gangs must now buy a Dominator machine (50 influence) + and defend it for a varying time frame.
    * The location of the dominator is + broadcasted to the entire station the moment it is activated
    * The more territories + the gang controls, the less time it will take
    * Gangs no longer win by capturing + territories' + - rscadd: A choice of gang outfits are now purchasable for 1 influence each + - rscadd: Thompson SMGs aka "tommy guns" are now purchasable for 50 influence + - rscadd: Bulletproof armor vests are now purchasable for 10 influence + - tweak: Gang messages are now free to send + - tweak: Prices of pistols and pens reduced to 20 and 30, respectively + - tweak: Gang spraycans have been made a lot less obvious. They look nearly identical + to regular ones, now. + - rscdel: Gangs will no longer be notified how much territory the enemy controls + Incoming5643: + - rscadd: Growing tired of reports of slain members, the Wizard Federation has cautiously + sactioned the dark path of lichdom. Beware of the powerful lich who hides his + phylactery well, for he is immortal! + - rscadd: The trick to defeating liches is to destroy either their body or their + phylactery item before they can ressurect to it. The more a lich is slain the + longer it will take him to make use of his phylactery and the more likely the + crew is to catch him during a vunerable moment. + - rscremove: Due to the addition of proper liching, skeletons as a choosable race + from magic mirrors has been discontinued. My apologies to the powergamers. A + special admin version of the mirror that allows for skeletons has also been + added to the code. + Miauw: + - tweak: 'AIs have received several minor nerfs in order to increase antagonist + counterplay:' + - tweak: AI tracking is no longer instant, it takes an amount of time that increases + with distance from the AI eye, up to 4 seconds. The AI detector item will light + up when an AI begins tracking. + - tweak: A random camera failure event has been added, which will break one or two + random cameras. + - tweak: You can no longer keep tracking people that are outside of your camera + vision. + - tweak: Camera wires have been removed. Screwdriver a camera to open the panel, + then use wirecutters to disable it or a multitool to change the focus. + - tweak: You can now hit cameras with items to break them. To repair a camera, simply + open the panel and use wirecutters on it. + - tweak: Camera alerts now only happen after a camera is reactivated. + RemieRichards: + - rscadd: New optional explosion effect ported from /vg/'s DeityLink, Explosions + that are affected by Walls and Doors +2015-06-14: + Ikarrus: + - rscadd: White suits added to gang outfits + - tweak: Gang outfits are now free, but are now limited in stock (that replenishes + over time) + - tweak: While attempting a Hostile Takeover, gangs do not gain influence. Instead, + the takeover timer will be reduced by how many territories they control. + - tweak: Spraycan cost reduced to 5 influence. + - tweak: Recruitment Pen cooldown increased to 2 minutes, but is reduced if the + enemy gang has more members than yours. + - tweak: Tommy guns no longer deal stamina damage. + - rscdel: Gangtools can no longer recall the shuttle if the game mode is not Gang + War +2015-06-15: + Incoming5643: + - rscadd: Lizards can now choose from a wide varity of physical appearances in character + creation! Sprites made by WJohn. Hiss Responsibly. + Kor: + - rscadd: A terrible new creature stalks the halls of SS13. + - rscadd: The wizard has a new artefact related to said creature. + - rscadd: Added a new sepia slime plasma reaction. Try it out! + spasticVerbalizer: + - bugfix: Drones can now properly quick-equip. +2015-06-18: + AnturK: + - rscadd: Added new photo-over-pda function. Apply the photo to PDA to send it with + your next message! + Ikarrus: + - rscadd: Department Management consoles have been added to Head of Staff offices. + These will enable heads to modify ID's access to their department, as well as + preform demotions. + Miauw: + - tweak: Bullets can now damage cameras. + - tweak: Camera alarms now trigger 90 seconds after the first EMP pulse, instead + of when all EMP pulses run out. + - tweak: Makes the force required to damage cameras greater than or equal to ten + instead of greater than ten. + - tweak: Camera alarms now trigger when cameras are disabled with brute force or + bullets. + Xhuis: + - rscadd: Nanotrasen scientists have determined that a delaminating supermatter + shard combining with a gravitational singularity is an extremely bad idea. They + advise keeping the two as far apart as possible. + phil235: + - rscdel: Nerfed the xray gun. Its range is now 15 tiles. +2015-06-20: + Dorsisdwarf: + - tweak: Syndicate Bulldog Shotguns now use slug ammo instead of buckshot by default + - rscadd: Nuke Ops can now buy team grab-bags of bulldog ammo at a discount. + Ikarrus: + - rscadd: Wearing your gang's outfit now increases influence and shortens takeover + time faster. + - rscadd: Added several more options for gang outfits + - rscadd: Pinpointers will now point at active dominators. + - tweak: Gang outfits are now slightly armored + - tweak: Gang tags are now named 'graffiti' to make them harder to detect + - tweak: Initial takeover timer is now capped at 5 minutes (50% control) + - tweak: 'Server Operators: The default Delta Alert texts have changed. Please check + if your game_options.txt is up to date.' + - rscdel: Loyalty implants now treat gangs as it treats cultists. Implants can no + longer deconvert gangsters, but it can still prevent recruitments. + - tweak: Replaced tommy guns with 9mm 2-burst 32 mag uzis that costs 40 influence. + Unlike tommy guns gangs will be able to purchase ammo for uzis. + Jordie0608: + - tweak: 'For Admins: Jump-to-Mob (JMP) notification command replaced with Follow + (FLW).' + - rscadd: Message and Follow links added to many notifications. + - rscadd: New buttons to toggle nuke and set security level. + - spellcheck: Flamethrowers are logged in attack_log. + Thunder12345: + - rscadd: Combat shotguns are now semi automatic, and will be pumped automatically + after firing. + - tweak: Combat shotgun capacity has been reduced to six shells. + Xhuis: + - rscadd: You will now trip over securitrons if you run over them whilst they are + chasing a target. + - rscadd: An admin-spawnable drone dispenser has been added that will automatically + create drone shells when supplied with materials. + - rscadd: Airlock charges are available to traitors and will cause a lethal explosion + on the next person to open the door. + - rscadd: Nuclear operatives can now buy drum magazines for their Bulldog shotguns + filled with lethal poison-filled darts. + - rscadd: When a malfunctioning AI declares Delta, all blue tiles in its core will + begin flashing red. + - rscadd: Back-worn cloaks have been added for all heads except the HoP. LARPers + rejoice! + - rscadd: More suicide messages have been added for a few items. +2015-06-21: + GunHog: + - tweak: The Hostile Lockdown ability for Malfunctioning AIs has been nerfed. It + now costs 30 CPU, is much more obvious, and automatically resets in 90 seconds. + - tweak: Buffed the Upgrade Turrets Malfunction ability. Turrets will now fire heavy + lasers instead of simply shooting faster. + - rscadd: Nanotrasen has released an Artificial Intelligence firmware upgrade under + the ID 41ST0L3MYB1K3. It contains drivers for interacting with all variants + of exosuit technology, from the Ripley APLU design to even experimental Phazon + units. Simply upload your AI to the exosuit's internal computer via the InteliCard + device. Per safety regulations, the exosuit must have maintenance protocols + enabled in order to remove an AI from it. + - rscadd: Malfunctioning AIs may wirelessly steal mechs via a new power, Mech Domination. + For 30 CPU, a Malf AI may permanently upload itself to a mech, ejecting any + pilots. Malf AIs will still lose if they leave the Z-level, and the Malf will + be gibbed if the mech is destroyed - they cannot be carded out of the mech or + shunt to an APC. + Iamgoofball: + - rscdel: Blobs can no longer have Morphine as their chemical. + duncathan: + - tweak: Heat exchangers now update their color to match that of the pipe connected + to them. + - tweak: Heat exchangers are on longer dense. +2015-06-22: + Iamgoofball: + - rscdel: Removed failure chance and delay when emagging an APC. + KorPhaeron: + - tweak: Rebalanced armor to be less effective, reducing the melee, bullet and/or + laser damage reduction of all armor suits. + LaharlMontogmmery: + - rscadd: You can now click and drag a storage container to empty it's contents + into another container, disposal bin or floor tile. + Xhuis: + - experiment: Revenants have received a considerable overhaul. + - rscadd: Revenants will no longer share spawn points with space carp and will spawn + in locations like the morgue and prisoner transfer center. + - rscadd: Revenants can no longer cross tiles covered in holy water. + - rscadd: Revenants have a new ability called Defile for 30E. It will cause robots + to malfunction, holy water over tiles to evaporate, and a few other effects. + - rscadd: Upon death, revenants will appear and play a sound before rapidly fading + away and leaving behind glimmering residue as evidence of their demise. + - rscadd: This residue lingers with the essence of the revenant. If left unattended, + it may reform into a new revenant. Simply scattering it is enough to stop this, + but it also has high research levels. + - rscadd: Revenants now have fluff objectives as well as a set essence goal. + - tweak: Revenanants will be revealed for longer when using abilities and also receive + feedback on this revealing. + - tweak: Revenants can now only spawn via random event with a specific amount of + dead mobs on the station. The default for this is 10. + - bugfix: Revenants can no longer use abilities from inside walls. + - rscdel: Directly lethal abilities have been removed from revenants. In addition, + they can no longer harvest unconscious people, only the dead. +2015-06-23: + Fayrik: + - rscadd: NanoUI is now Telekenesis aware, but due to other constraints, NanoUI + interfaces are read only at a distance. + - tweak: Refactored all NanoUI interfaces to use a more universal proc. + - tweak: Adjusted the refresh time of the NanoUI SubSystem. All interfaces will + update less, but register mouse clicks faster. + - bugfix: Removed automatic updates on atmospheric pumps, canisters and tanks, making + them respond to button clicks much faster. + - bugfix: Atmos alarm reset buttons work now. Probably. + Iamgoofball: + - rscadd: Adds a progress bar when performing actions. + Ikarrus: + - rscadd: New gang names with tags created by Joan + - rscadd: C4 explosive can be purchased by gangs for 10 influence. + - tweak: Recruitment pen cost increased to 50. + - rscadd: Lieutenants recieve one free recruitment pen. + - tweak: Recruitment pens are now stealthy and no longer give a tiny prick message. + - tweak: Increased chance of deconversion with head trauma + - tweak: Recalling the shuttle now takes about a minute to work, during which you + won't be able to use your gangtool. + - rscadd: Pinpointers no longer point at dominators. Instead, dominators will beep + while active. + - rscadd: Added puffer jackets and vests. + - tweak: Increased gang outfit armor. It is moderately resistant to bullets now. + - rscdel: Removed bulletproof vests from gangtool menu. + Jordie0608: + - rscadd: Admins can now flag ckeys to be alerted when they connect to the server. + MrStonedOne: + - rscadd: Admins can now reject poor adminhelps. This will tell the player how to + construct a useful adminhelp and give them back their adminhelp verb + RemieRichards: + - tweak: Cumulative armour damage resistance is now capped at 90%, you will now + always take at bare minimum, 10% of the incoming damage. + - rscadd: Added a system for Armour Penetration to items, it works by temporarily + (It does NOT damage the armour or anything) reducing the armour values by the + AP value during the attack instance. + - rscadd: 'The formula for AP is Armour-ArmourPenetration = AdjustedArmour and AdjustedArmour + is used for all the remaining calculations instead of Armour (Eg: 80 Melee - + 15 AP = 65 Melee).' + - rscadd: The Ninja's Energy Katana has 15 AP, Xenomorphs have an inbuilt AP of + 10. + - tweak: You can now unwrench pipes who's internal pressures are greater than that + of their environment... + - rscadd: However it will throw you away from the pipe at extreme speed! (You are + warned beforehand if the pipe will do this, allowing you to cancel) + Vekter: + - bugfix: Finally fixed immovable rods! They will now properly bisect the station + (and crit anyone unlucky enough to be in their path). + - tweak: Increased Meteor activity detected in the vicinity of the station. Be advised + that many storms may be more violent than they once were. + - rscadd: Gravitational anomalies will now throw items at mobs in their vicinity. + Take care while scanning them. + - rscadd: Flux anomalies explode much more violently now. Get there and destroy + them, or risk losing half a department. + xxalpha: + - rscadd: 'Added a new Reviver implant: now it revives you from unconsciousness + rather than death.' + - rscadd: Added cybernetic implants and a cybernetic implants bundle to the Nuke + Ops uplink. + - bugfix: Fixed Nutriment pump implant printing. + - tweak: Health Analyzers now have the ability to detect cybernetic implants. + - tweak: X-Ray implants are now much harder to unlock. +2015-06-24: + Ikarrus: + - rscadd: Request Console message sent to major departments will now be broadcasted + on that department's radio. + - rscadd: Request Consoles can be used to quicly declare a security, medical, or + engineering emergency. +2015-06-25: + Iamgoofball: + - rscadd: Changes up how Explosive Implants work. + - rscadd: They have become Microbomb Implants. They cost 1 TC each. Each implant + you inject increases the size of the explosion. You gib on usage, regardless + of explosion size. + - rscadd: A Macrobomb implant was added for 20 TC. It is the equivalent of injecting + 20 microbombs. + - rscadd: Nuke Ops start with microbomb implants again. +2015-06-26: + Ikarrus: + - imageadd: Added a couple of new gang tag resprites by Joan. + Kor: + - tweak: Summon Guns has returned to its former glory. The spell will once again + create antagonists, now with the objective to steal as many guns as possible. + - tweak: Summon Guns once again costs a spell point, rather than granting one. + phil235: + - tweak: Buffs traitor stimpack (and adrenalin implant) to be more efficient against + stuns/knockdowns. + pudl: + - rscadd: You can now play games of mastermind to unlock abandoned crates found + throughout space. +2015-06-27: + Ikarrus: + - rscadd: Some objects can be burned now. + - rscadd: Bombs will shred your clothes, with respect to their layering and armor + values. Exterior clothing will shield clothing underneath. Storage items will + drop their contents when bombed this way. + Laharl Montogmmery: + - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the + content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 + tiles.' + MrStonedOne: + - tweak: Admins will now receive a notification when one of them starts to reply + to an adminhelp to cut down on multiple responses to adminhelps and let admins + know when an adminhelp isn't getting replied to. + - rscadd: The keyword finder in admin helps (adds a (?) link next to player names + in the text of adminhelps) has been added for all player to admin pms, as well + as admin say. + NullQuery: + - wip: Introduces html_interface, a module to streamline the management of browser + windows. + - rscadd: Adds playing cards that utilize a new HTML window management system. + Vekter: + - rscadd: Added a new military jacket to the Autodrobe and ClothesMate. +2015-06-28: + Ikarrus: + - rscadd: Gang Lieutenants can buy gang tools now, but at a higher cost than the + original boss + - rscadd: Gang leaders can register additional gangtools to themselves for use as + spares. + - tweak: Number of maximum lieutenants lowered to 2 + - tweak: Pistol cost increased to 25 influence + - tweak: Uzi cost increased to 50 influence + - tweak: Uzi Ammo decreased to 20 influence + - rscadd: Overcoats added to items the biogenerator can produce. + - rscdel: Micro and Macro bomb implants are now restricted to the Nuclear game mode. + phil235: + - tweak: Smoke (and foam) no longer distribute more reagents than they have. The + amount of clouds in a smoke now depends on the amount of smoke created. Acid + no longer melts items on a mob at low volume, and the chances to melt them increases + with the amount applied on the mob. Sprays can now contain acid again. +2015-06-29: + Ikarrus: + - rscadd: Clothing has been separated out of equipment lockers into wardrobes to + reduce clutter. + Incoming5643: + - rscadd: The secrets of the rainbow slimes have finally been revealed. To attain + this rare blob you must breed a slime with a 100% mutation chance! + - rscadd: Rainbow slime cores will generate a randomly colored slime when injected + with plasma. It's a good plan B if the slimes aren't cooperating in terms of + colors. You can get any color slime this way, pray to the RNG! + Xhuis: + - rscadd: The Sleeping Carp clan has made its presence known on Space Station 13. + Some gangs will name themselves after this group and practice martial arts rather + than using traditional gang weaponry. These shadowboxers are not to be taken + lightly. + oranges: + - tweak: Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand + jetpacks have been greatly improved in speed and handling +2015-07-01: + Ikarrus: + - rscadd: Multiple gang leaders are spawned at round start, the number which depends + on server population + - rscdel: Gangsters can no longer be promoted mid-game. + - rscadd: Security can once again deconvert gangsters with loyalty implants + - rscadd: Added an Implant Breaker item to the gangtool as a purchasable item for + 10 influence each
    * They are a one-use item that destroys all implants in + the target, including loyalty implants
    * They will also attempt to recruit + the target before destroying itself + - rscdel: Implanters no longer work if the target is wearing headgear. Remove them + first. + NullQuery: + - tweak: The crew monitoring computer, AI crew monitoring popup and the handheld + crew monitor now update automatically. + - tweak: 'Crew monitoring: The health information has been turned into a health + indicator. It goes from green to red. Hovering over the icon shows detailed + information (if available).' + - tweak: 'Crew monitoring: The location coordinates have been hidden. You can see + them by hovering over the ''Location'' column.' + - rscadd: 'Crew monitoring: A minimap has been added so you can easily see where + people are.' + - tweak: 'Crew monitoring: Players who are not in range of a camera are not shown + on the minimap.' + - tweak: 'Crew monitoring: AI players can quickly move to other locations or track + players by clicking the minimap or items in the table.' + - tweak: 'Crew monitoring: For AI players, health information always shows a white + indicator instead of green-to-red. This is a deliberate limitation to prevent + the AI from becoming too omnipresent.' + phil235: + - tweak: Space drug overdose no longer cause brute/brain damage but you hallucinate + more. Space Drug Blob now makes you hallucinate even if you don't overdose on + its space drug. + xxalpha: + - rscadd: 'Added a new traitor objective: steal the station''s self-destruct nuke + plutonium core.' +2015-07-02: + Ikarrus: + - rscadd: Throwing reagent containers such as drinks or beakers may spill their + contents onto whatever they hit + - rscadd: Slipping while carrying items in your hand may cause ~accidents~ + - tweak: Mounted and portable flashers can now only be burned out from overuse, + similar to flashes. + oranges: + - tweak: Thanks to department budget cuts we've had to remove the security cameras + built into officer helmets, Nanotrasen apologies for this inconvenience. +2015-07-03: + Ikarrus: + - experiment: Added support for up to six gangs at a time. Admins may add additional + gangs to any round. + - experiment: Gang mode now has a chance to start with a third gang. + - rscadd: Promotion of lieutenants have been re-added + - rscadd: Every lieutenant promoted will lengthen the gang's recruitment cooldowns + by one minute. + - rscdel: Only gang bosses will be able to recall the shuttle from their gangtool. + - rscadd: A recruitment pen that has not been used for a while will accumilate charges, + so you are no longer punished for waiting to convert people. + - rscadd: Gangs are now fully functional outside of gang mode. + Ricotez: + - rscadd: 'Added two categories of mutant bodyparts for humans with the same system + that lizards use: ears and tails. Right now only admins can edit these.' + - rscadd: Updated the system that checks for which jobs your character qualifies + to be species-dependant. At this moment you won't notice any differences, but + in the future coders can use this to be more specific about which jobs a species + is allowed in under which circumstances. + - imageadd: 'Added one option to both categories, taken from the kitty ears: a cat + tail and cat ears.' + - rscadd: 'Added a new button to the VV menu drop-down list for admins: Toggle Purrbation. + Putting a human on purrbation will give them cat ears and a cat tail, and send + them the message ''You suddenly feel valid.'' Using the button a second time + removes the effects.' + - wip: 'Adding categories for tattoos and scars is in the works. (Read: I need sprites!)' + oranges: + - tweak: Engineers in nanotrasen's safety equipment department announced the release + of a new and improved version of the X25 taser trigger, previous triggers, which + suffered from a long line of misfire problems were recalled enmasse. Nanotrasen + refused to comment on rumours that the previous trigger design was the work + of a saboteur. +2015-07-04: + Gun Hog: + - tweak: The Ore Redemption Machine now allows users to release minerals without + having to insert an ID first. + Ikarrus: + - bugfix: Fixed items that logically shouldn't spill, spilling their contents when + thrown + - bugfix: Fixed Bartender's non-spilling powers + - bugfix: Fixed thrown beakers not applying their contents onto floors + - bugfix: Fixed unable to transfer reagents between beakers you are holding + - bugfix: Fixed bombs shredding clothes that should have been protected by covering + clothes + - bugfix: Fixed gang mode. + MMMiracles: + - rscadd: Added patriotic underwear apparel due to the most god damn american holiday + being just around the corner. + - rscadd: Also adds some other stuff for those inferior countires too, I guess. +2015-07-05: + AlexanderUlanH & Xhuis: + - rscadd: Shadowling Ascendants have a new ability to send messages to the world. + - bugfix: Glare now properly silences targets. + - bugfix: Veil now turns off held lights. + - tweak: Drain Thralls replaced with Drain Life, which targets all nearby humans. + - rscadd: Spatial Relocation replaced with Black Recuperation which lets you revive + a dead thrall every five minutes. + - rscdel: Removed Vortex. + - tweak: Shadowlings can now only enthrall five people before being forced to hatch; + Hatched shadowlings can continue to enthrall however non-hatched ones can't + pass the global limit. + - tweak: Enthralling sends a message to all nearby humans. + - tweak: Removed cooldown on Glacial Freeze. + Ikarrus: + - tweak: Reactive armor may now teleport user to space tiles. Be careful using it + around space. + Razharas: + - tweak: Firing pins can now be removed by tablecrafting a gun with a plasmacutter, + screwdriver and wirecutters. + RemieRichards: + - imageadd: Melee attacks with weapons now display and animation of the weapon over + the target. + - rscadd: Tablecrafting window now shows all recipies and has been split into categorized + tabs. + - rscdel: 30 item limit removed. + Sabbat: + - rscadd: Updated the cult armor rune to let you get additional equipment or abilities + based on what you're wearing or holding. Some nerfed versions of wizard spells + can be used by the cult in exchange for unique clothing, these spells require + the cult robes or armor in order to use. No armor choices are mandatory, you + will always have the option of the default choice. + - rscadd: Zealot - Default armor rune. If none of the required clothing is worn + this will be chosen automatically. Is the same as ever. + - rscadd: Summoner - If you are wearing the wizard robe and hat when using the armor + rune this choice will be available. User will receive magus robes and hat and + nerfed versions of the summon shard and summon shell spells. + - rscadd: Traveler - Available to people wearing EVA suit and helmet. Replaces the + EVA suit and helmet with the cult space suit and space helmet. Gives you a sword. + - rscadd: Marauder - Available to people wearing the captain's space suit and helmet. + Same as Traveler except user is given a spell of summon creature (two creatures). + They can and will attack the user. + - rscadd: Trickster - Available if wearing the RD's reactive teleport armor. Gives + you magus robes, a wand of doors, and a nerfed version of Blink. + - rscadd: Physician - Available if wearing the CMO's labcoat. Gives you a wand of + life. + TheVekter: + - rscadd: Ian now has a dog-bed in the HoP's office. + nukeop: + - rscadd: Uplinks now have a syndicate surgery bag containing surgery tools, a muzzle, + a straightjacket and a syndicate MMI. + - rscadd: Syndicate MMIs can only be placed in cyborgs to create an unlinked cyborg + with syndicate laws. +2015-07-06: + Ikarrus: + - tweak: Increased Uzi SMG cost to 60 influence. + - tweak: Increased Uzi ammo cost to 40 influence. + - tweak: Domination attempt limit is reduced to 1 per gang while the shuttle is + docked with the station. + - tweak: Gang bosses can promote and recall the shuttle using spare gangtools + - bugfix: Fixed Gang bosses getting deconverted with head trauma + - rscadd: Lizard characters can now get random names unique from humans. +2015-07-07: + Ikarrus: + - bugfix: Fixed bug where gang messages would occasionally fail to send. + - bugfix: Fixed bug that prevented implant breakers from recruiting security. + - tweak: Implanters are now only blocked by helmets with THICKMATERIAL + - rscdel: Light severity explosions no longer shred clothes. + MMMiracles: + - rscadd: Adds a new crate to cargo in the security section, for when desperate + times call for desperate measures. + NullQuery: + - bugfix: Crew monitoring computers now sort by department and rank again. + - tweak: 'Crew monitoring computer: Hovering over a dot on the minimap will now + jump to the appropriate entry in the table.' + - bugfix: sNPCs were given ID cards with blank assignments. +2015-07-09: + AlexanderUlanH: + - rscadd: Riot Shotguns now spawn loaded with rubber pellet shells that deal high + stamina damage. + kingofkosmos: + - tweak: Both beakers and drinking glasses can now be be drunk from, fed to mobs + and splashed on mobs, turfs and most objects with harm intent. + nukeop: + - tweak: RCDs have a larger storage and can be loaded with glass, metal and plasteel. + - rscadd: Grilles and Windows can be made with an RCD. + - rscadd: Engi-Vend machine now has three RCDs. + - rscdel: Removed RCD as a steal objective. +2015-07-10: + Ikarrus: + - rscadd: 'New Changeling Ability: False Armblade Sting. It creates an undroppable + armblade on the target temporarily. It will appear exactly like a real one, + except you can''t do anything with it.' + - tweak: Transform stings are no longer stealthy. +2015-07-11: + Dorsidwarf: + - tweak: Due to a new Syndicate budget, uplink implants are now only 14 TC. + - tweak: In order to facilitate inter-agent communication, Syndicate Encryption + Keys have been reduced to 2TC. They retain the ability to intercept all channels + and speak on a private frequency. + Ikarrus: + - tweak: Robotic augmentations have been made a bit more difficult to maintain. +2015-07-13: + Ikarrus: + - imageadd: Loyalty Implant HUD Icon has been updated. + duncathan: + - tweak: Greatly shortened the time it takes to lay pipes with the RPD and to unwrench + pipes in general. + - rscadd: Added Optical T-Ray scanners to R&D and Atmospheric Technician closets. + Optical T-Ray Scanners function identically to a handheld scanner. +2015-07-14: + AnturK: + - rscadd: New species of mimic was spotted in the wilderness of space. Watch out! + Jordie0608: + - rscadd: Added a Local Narrate verb for admins. +2015-07-17: + Ikarrus: + - bugfix: Virology is no longer all-access. + - rscadd: Changelings now have the ability to swap forms with another being. + - tweak: Halved Domination Time. + - tweak: Reinforced windows and windoors are a bit more resistant to fires and blasts. + MrStonedOne: + - tweak: 'Scrubbers now use power: 10w + 10w for every gas its configured to filter. + (60w for siphon)' + - rscadd: Scrubbers can now be configured to operate on a 3x3 range via the air + alarm at a high cost (ranging from 100w to 1000w depending on how many tiles + are near it that aren't blocked and how much power it's using normally) + - tweak: Huge portable scrubbers (like in toxins storage) now use a 3x3 range rather + then a higher volume rate + - bugfix: Fixed issue with atmos not allowing low levels of plasma to spread + - bugfix: Fixed issue with atmos not adding or removing plasma overlays in some + cases + - tweak: Panic siphon now uses a 3x3 area range rather then increasing the scrubbers + intake rate by 8x + - tweak: Replace air uses 3x3 range for the first stage + - rscadd: 'Air alarms now have 3 new environmental modes:' + - rscadd: Siphon - Panic siphon without the panic, operates on a 1 tile range + - rscadd: Contaminated - Activates all gas filters and 3x3 scrubbing mode + - rscadd: Refill Air - 3 times the normal vent output +2015-07-18: + AlexanderUlanH: + - tweak: Reduced stun duration of tabling to be closer to other stuns. + Iamgoofball: + - tweak: The Bioterror Chemical Sprayer is now filled with a more deadly mix of + chemicals. + RemieRichards: + - tweak: Changelings now regenerate chemicals and geneticdamage while dead, but + only up to specific caps (50% of their max chem storage, and 50 geneticdamage) + - tweak: Fakedeath's length has been reduced from 80s dead (1 minute 20) to 40s + dead + - rscadd: Changelings now get to see the last 8 messages the person they absorbed + said, to allow them to better impersonate their victim's speech patterns + Steelpoint: + - tweak: Reduced weight of Sechailer, it now fits in boxes. + phil: + - tweak: Smoke and foam touch reactions gets buffed. + - rscadd: Reagent dispensers (watertank, fueltank) tells you how much reagents they + have left when examined. + - tweak: Liquid dark matter blob spore smoke now cannot throw you. The effects of + sorium, blob sorium, liquid dark matter and blob liquid dark matter are now + scaled by their volume. Sorium/LDM blob's touch now throws the mobs who are + close but simply moves the mobs that are further away. +2015-07-19: + Gun Hog: + - rscadd: Nanotrasen advancements in cyborg technology now allow for integrated + headlamps! As such, the flashlight package normally used as a module is now + seamlessly merged with their systems! + Ikarrus: + - rscadd: Asimov's subject of "human beings" can now be modified by uploaders. + - rscadd: Eaxmining AI modules while adjacent to them will show you what laws it + will upload. + MMMiracles: + - soundadd: Adds a TWANG sound effect when hitting things with a guitar. +2015-07-20: + AnturK: + - tweak: Lightning Bolt now always bounces 5 times and deals 15 to 50 burn damage + to each target depending on the chargeup + KorPaheron: + - rscadd: Added the Multiverse Sword, a new wizard artifact that can summon clones + of yourself from other universes, allowing for dangerous amounts of recursion. + phil235: + - tweak: Mechs no longer use object verbs and the exosuit interface tab. They now + use action buttons. Mechs now have a cycle equipment action button to change + weapon faster than by using the view stats window. Mechs get two special alerts + when their battery or health is low. Mechs now properly consume energy when + moving and having their lights on. Using a mech tool that takes time to act + now shows a progress bar (e.g. mech drill). + - rscadd: Mechs now have a cycle equipment action button to change weapon faster + than by using the view stats window. + - rscadd: Mechs get two special alerts when their battery or health is low. + - tweak: Mechs now properly consume energy when moving and having their lights on. + - rscadd: Using a mech tool that takes time to act now shows a progress bar (e.g. + mech drill). +2015-07-21: + Fayrik: + - tweak: Syndicate Donksoft gear now costs less. + Xhuis: + - rscadd: Firelocks may now be constructed and deconstructed with standard tools. + Circuit boards can be produced at a standard autolathe. + phil235: + - tweak: Thrown things no longer bounces off walls, unless they're in no gravity. + Heavy items and mobs thrown can push the mobs and non anchored objects they + land on. Throwing a mob onto a mob in no gravity will push each one in opposite + direction. Thrown mobs landing on wall, or dense object or mob gets stunned + and a bit injured. The damage when mob hit a wall is nerfed. +2015-07-23: + NullQuery: + - tweak: 'Crew monitoring: The minimap now supports scaling. You can zoom in and + out using the buttons. Hovering over an entry in the table centers the minimap + on that part of the screen.' + - tweak: 'Crew monitoring: If the window is wide enough the health indicator will + expand to show full health data (if available).' + - tweak: 'Crew monitoring: Clicking on the area name will now copy the coordinates + to your clipboard.' + - tweak: 'Crew monitoring: The AI can view health information again, but there is + a 5 second delay between updates for everyone watching.' + freerealestate: + - rscadd: Added resist hotkeys for borgs and humans. With hotkeys mode, use CTRL+C + or C as a human and CTRL+C, C or END as a borg. With hotkeys mode off, use CTRL+C + as a human and END as a borg. + xxalpha: + - bugfix: Changeling augmented eyesight night vision is now working. +2015-07-24: + Incoming5643: + - rscadd: The spells disintegrate and flesh to stone have had their mechanics changed. + Using these spells will spawn a special touch weapon in a free hand (your dominant + hand if possible) that can then be used to inflict the spell on the target of + your choice. Having the touch weapon out is obvious, this is not a stealth based + change. Clicking the spell while the hand is out will let you return the charge + without using it. + - rscdel: The spell won't begin to recharge until the hand attack is either used + or returned. Additionally these changes mean you can no longer use these spells + while stunned or handcuffed. As a suggestion remember that the mutate spell + allows you to break out of cuffs very easily, and warping abilities will keep + you from getting cuffed to begin with! +2015-07-25: + Dorsisdwarf: + - tweak: Due to a fire sale at Syndicate HQ, many of the more interesting traitor + gadgets have been cut in price dramatically. Please take this opportunity to + make full use, as we cannot guarantee that the sale will last! + bgobandit: + - bugfix: Under pressure from the Animal Rights Consortium, Nanotrasen has improved + conditions at its cat and dog breeding facilities. Cats and pugs are now much + more responsive to their owners. + duncathan: + - tweak: Restores RPD delay on disposals machines. + xxalpha: + - tweak: Agent IDs are now rewrittable. +2015-07-26: + Phil235: + - rscadd: Sechailers will now break when used too often. + - imageadd: Mechs now have new action button sprites. + Steelpoint: + - rscadd: Security Officers now spawn with a security breathmask in their internals + box. + - imageadd: Abductor's batons now changes color with modes. + - imageadd: Unique sprites for Abductor hand cuffs and paper. + goosefraba19: + - imageadd: Updated the Power Monitoring Console with better alignment and colorized + readouts. +2015-07-27: + Bgobandit: + - bugfix: Burgers can now be made from corgi meat again. + Ikarrus: + - rscadd: Added shutters to the armory to allow quick access when needed. + - bugfix: Security can now use the Brig external airlocks. + - rscadd: Added a join queue when the server has exceeded the population cap. + - tweak: Decreased the cost of Body Swap and removed it's genetic damage. + kingofkosmos: + - rscadd: Added a link to re-enter corpse to alert when your body is placed in a + cloning scanner. +2015-07-28: + Anonus: + - imageadd: New gang tags for Omni and Prima gangs. + Chiefwaffles: + - rscadd: After realizing how often AIs tend to 'disappear', Central Command has + authorized the shipment of the Automated Announcement System to take over the + AI's responsibility of announcing new arrivals. + - rscadd: In addition, users are able to configure the messages to their liking. + Early testing has shown that this feature may be vulnerable to malicious external + elements! + - rscadd: The station's R&D software has been updated so it can now succesfully + create its own prototype AAS board once the prerequisite levels have been met. + Dorsisdwarf: + - tweak: Increased the cost of Bioterror darts to 6TC. + Incoming5643: + - experiment: Double Agents no longer know they're Double Agents and not just standard + Traitors. + xxalpha: + - rscdel: Removed Anti-Drop and Nutriment Pump implants from Nuclear Operative's + uplink. +2015-07-29: + AnturK: + - rscadd: Aliens can now mine through asteroid rock. + GunHog: + - tweak: Cyborg headlamps have a short cooldown before reactivation when forcibly + deactivated. + - bugfix: Shadowling's Veil now shuts down headlamps for the ability's entire duration. + Kor: + - rscadd: Eating the heart of a Slaughter Demon will grant you dark powers. + freerealestate: + - bugfix: Fixed bug where copying with ctrl+C didn't work due to it being assigned + to resist. + - rscadd: Changed resist to B (hotkeys mode) and ctrl+B (either mode) instead. + - rscdel: Removed End resist from cyborgs. +2015-07-30: + Gun Hog: + - tweak: The Reactivate Camera power for Malfunctining AIs now costs 10 CPU, and + works on the entire camera network, up to 30 cameras fixed. + - tweak: The Upgrade Cameras power now costs 35 CPU, upgrades all cameras in the + network to have EMP proofing, X-ray, and gives the AI night-vision. + Ikarrus: + - rscadd: Door Access buttons can now be emagged to remove access restrictions. + LordPidey: + - rscadd: Added a new medication, Miner's Salve. It heals brute/burn damage over + time, and has the side effect of making the patient think their wounds are fully + healed. It is mixed with water+iron+oil, or grind a twinkie, a sheet of metal, + and a sheet of plasma. + - rscadd: Added a grinder to the mining station. + Midaychi: + - rscadd: Random loot has been added to the derelict as salvage for drones. + Scones: + - rscadd: Adds a Rice Hat to the biogenerator. +2015-08-02: + Incoming5643: + - rscadd: Syndicate toolboxes now come with never before seen red insulated gloves. + Steelpoint: + - bugfix: Fixed multiple mapping errors for Boxstation and the mining base. + - rscadd: A circuit imprinter and exosuit fabrication board have been added to tech + storage. + SvartaSvansen: + - rscadd: Our lizard engineers have worked hard and managed to improve Centcom airlocks + so they no longer disintegrate when the electronics are removed! + - tweak: Put a safety net in place so future airlocks without assemblies produce + the default assembly instead of disintegrating. +2015-08-04: + Kor: + - rscadd: Soulstones will now attempt to pull ghosts from beyond if the targeted + corpse has no soul. + Summoner99: + - rscadd: Added the *roar emote back to Alien Larva + - bugfix: Fixed aliens not being able to do the *hiss and *screech emotes + - tweak: 'Changed how the plural emote system works and now some emotes have plural + versions, example is: *hiss and *hisses.' +2015-08-05: + CoreOverload: + - rscadd: Implants, implant cases and implanters got RnD levels and can be DA'ed + for science. + - rscadd: Surgically removed implant can be placed into an implant case. Remove + implant with empty implant case in inactive hand. + - rscadd: Surgical steps now got progress bars. + - rscadd: You can cancel a surgery by using drape on operable body part again. This + works only before you perform surgery's first step. + - rscadd: Operating computer shows next step for surgeries. No more alt-tabbing + to view next step on wiki while operating. + - tweak: You cannot start two surgeries on one body part at once. You can start + two multiloc surgeries (i.e. two augumentations) on diffirent body parts at + once. + - tweak: Monkey <-> Human transformations now keep your internal organs, cyberimplants + and xeno embryos included. + Ikarrus: + - rscdel: Head beatings no longer deconvert gangsters. + LordPidey: + - rscadd: 'Added a new chemical. Spray tan. It is made by mixing orange juice with + oil or corn oil. Warning: overexposure may result in orange douchebaggery.' + Xhuis: + - rscadd: Shadowling thralls can now be deconverted via surgery or borging. + - rscadd: Thralls can be revealed by examining them. They can hide this by wearing + a mask. + - rscadd: Thralls have a few minor abilities they can use in addition to night vision. + - rscadd: Hatch-exclusive abilities can no longer be used if you are not the shadowling + mutant race. + - rscadd: Ascendants are now immune to bombs and singularities. Honk. + - rscadd: A Centcom report has been added for shadowlings. + - tweak: Ascending no longer kills all shadowling thralls. This allows antagonists + who were enthralled to succeed along with the ascendants. + - tweak: Annihilate now has different sound and a shorter delay before the target + explodes. In addition, it now works on all mobs, instead of just humans. + - bugfix: Glacial Blast now properly has no cooldown if used while phase shifting. + - bugfix: Fixes a runtime if a target with no mind is enthralled. + bgobandit: + - rscadd: Nanotrasen scientists have achieved the tremendous breakthrough of injecting + gold slime extracts with water. Pets ensued. +2015-08-06: + AnturK: + - rscadd: Adds the voodoo doll as a mining treasure, link it with a victim with + an item previously held by them. + - rscadd: Once linked the voodoo doll can be used to injure, confuse and control + the victim. + Core0verlad: + - tweak: Items can now be removed from storage containers inside storage containers. + - imageadd: Beds and bedsheets have new sprites. + - rscdel: MMIs are no longer ID locked. + KorPhaeron: + - tweak: Slaughter Demon's have had their health reduced to 200 and their speed + reduced but they get a speed boost when exiting blood. + MrPerson: + - rscadd: Items stacks now automatically merge unless thrown when moved onto the + same tile. +2015-08-07: + KorPhaeron: + - rscadd: Added a new Guardian Mob that can be summoned to manifest inside a mob. + - rscadd: Guardians can communicate with their host and materialize themselves to + protect their host with magic powers. + - rscadd: Guardians are invincible but cannot live without or too far from their + host, they also relay injuries they suffer to the host. + Phil235: + - bugfix: Fixed being able to run into your own bullet. + RemieRichards: + - rscadd: You no longer need to click on an item in a storage container to remove + it, clicking anywhere around the item works. + bustygoku: + - rscdel: Removed the chance for a disease to make you a carrier on transfer. + phil235: + - tweak: The plasma cutter's fire rate is now a bit lower but its projectile can + pierce multiple asteroid walls and its range isn't lowered in pressurized environment + anymore. +2015-08-09: + RemieRichards: + - rscadd: 'Nanotrasen Mandatory FunCo Subsidiary: CoderbusGames, would like to announce + an update to Orion Trail!' + - rscadd: 'Spaceports: Buy/Sell Crew, Trade Fuel for Food, Trade Food for Fuel, + Buy Spare Electronics, Engine Parts and Hull Plates, or maybe you think you''re + tough enough to attack the spaceport?' + - rscadd: 'Changelings: Changelings can now sneak into your crew, Changelings eat + double the standard food ration and have a chance to Ambush the rest of the + crew!' + - rscadd: 'Kill Crewmembers: Do you suspect changelings? or dont feel you have enough + food rations? Just shoot somebody in the head, at any time!' +2015-08-12: + CosmicScientist: + - rscadd: Added Space Carp costume to the code, get it from an autodrobe near you. + - rscadd: Added Ian costume to the code, take his place under the HoP's hand, get + it from an autodrobe or corgi hide, keep it away from washing machines or it'll + meat its end as clothing. + - rscadd: Added Space Carp spacesuit to the code, I know what I'm praying for. + bgobandit: + - rscadd: After multiple complaints from WaffleCo food activists, Nanotrasen has + added real chocolate, berry juice and blue flavouring to its ice cream products. +2015-08-13: + CoreOverload: + - rscadd: 'Added a new 8TC traitor item: subspace storage implant. It allows you + to store two box-sized items in (almost) undetectable storage. ' + - tweak: Changed the way most of the surgical operations work. See wiki for new + steps. + - tweak: You can cancel step 2+ surgeries with drapes and cautery in inactive hand. + - tweak: Defib no longer works on humans who have no heart. Changeling/thrall/cult/strange + reagent revives are still working, and this is intended. + - rscadd: You can eat all organs raw now, with exception for brains and cyberimplants. + - rscadd: Some xenos abilities are linked to their organs. Play with xenos' guts + for fun and profit! + RemieRichards: + - rscadd: Modifying a string (Text) variable with View Variables or View Variables + Mass Modify now allows you to embed variables like real byond strings, For example + the variable real_name; you could set a text var to [real_name] and it would + be replaced with the actual contents of the var, This allows for Mass fixing + of certain variables but it's also useful for badmin gimmickery +2015-08-15: + Miauw: + - rscadd: Changeling transformations have been upgraded to also include clothing + instead of just DNA. + - tweak: Patches no longer work on dead people. + - rscadd: Added 15-force edaggers that function like pens when off. + MrPerson: + - rscadd: Objects being dragged will no longer get shoved out of your grasp by space + wind. Retrieving dead bodies should be possible. + RemieRichards: + - rscadd: Added Changeling Team Objectives, these are handed out to all lings, with + the chance of a round having one being 20*number_of_lings% (3 lings = 60%) + - rscadd: 'Impersonate Department (Team Objective): As many members of a department + as can reasonably be picked are chosen for the lings to kill, replace and escape + as' + - rscadd: 'Impersonate Heads (Team Objective): 3 to 6 Heads of Staff are chosen + for the lings to kill, replace and escape as' + - tweak: If the Changelings have a Team Objective, their usual Kill, Maroon, Etc. + objectives will not pick other changelings, to discourage backstabbing in teamling + - tweak: Changeling Engorged Glands is now the default storage and regen rate, Engorged + Glands remains for an extra boost + - rscadd: Armblades can now be used to open powered doors, however it takes 10 seconds + of the changeling standing still, Their ability to instantly open unpowered + doors remains unchanged + - rscdel: Debrain objective is no longer handed out to lings, it's as good as broken + these days + - rscadd: Changelings may now purchase a togglable version of the Chameleon Skin + genetics mutation, for 2 DNA +2015-08-16: + Joan: + - rscadd: Revenants will now occasionally spawn as an event. + - tweak: Revenants gain more energy from Harvesting, and can Harvest from people + in crit. + - tweak: Revenant powers are more effective, and no longer freeze you in place, + besides Harvest. + - tweak: Slain Revenants will respawn much faster. + - bugfix: Fixed a whole bunch of revenant bugs, including one that caused the objective + to always fail. + Kor: + - rscadd: The wizard can now stop time. + MMMiracles: + - tweak: Revamps bioterror darts into a less-lethal, syringe form. Removed the coniine + and spore toxins to keep it solely for quiet take-downs. +2015-08-18: + CoreOverload: + - rscadd: Added a new low-tech eye cyberimplant in RnD - welding shield implant. + - rscadd: Implanter and empty implant case added to protolathe. + - rscadd: You can sell tech disks and maxed reliability design disks in cargo for + supply points. + - tweak: DA menu shows current research levels. + - tweak: You can print cyberimplants in updated mech fab. + Supermichael777: + - bugfix: Added an ooc hotkey for borgs = O. They simply didn't have one and it + was a consistency issue + - rscadd: Also added Ctrl+O as an any mode keycombo so you dont have to backspace + and type ooc. Added to hotkey mode to remain consistent with all other Ctrl + combos + bustygoku: + - tweak: Most backpacks now have 21 or more slots, but are still weight restricted. + What this means is that you can have a lot of tiny weight items, but only 7 + medium items just like before. + phil235: + - tweak: Janicart rider no longer slip on wet floor or bananas. Moving on a floor + tile with lube while buckled (chair, roller bed, etc) will make you fall off. +2015-08-19: + Joan: + - rscadd: Added a new revenant ability; Malfunction. It does bad stuff to machines. + - tweak: Defile and Overload Lights now briefly stun the revenant. + - tweak: You can now Harvest a target by clicking on them while next to them. + - bugfix: Harvesting no longer leaves you draining if the target is deleted mid-drain + attempt. + - rscdel: Defile no longer emags bots or disables cyborgs, Malfunction does that + now. + Kor: + - rscadd: The Ranged and Scout guardian types have been merged, and gained a new + surveillance snare ability. + SconesC: + - rscadd: Added Military Belts to traitor uplinks. + bgobandit: + - rscadd: CentComm now offers its cargo department toys, as well as detective gear + so their boss can figure out which tech wasted all the points on them. + phil235: + - rscadd: You can now partially protect yourself from blob attack effects by wearing + impermeable clothes like hardsuits, medical clothes, masks, etc. Max protection + effect is capped at 50%. + - rscdel: Splashing someone with chemicals no longer injects those chemicals in + their body. + - bugfix: Fixes splashing acid on items or floor with items not having any effect. +2015-08-28: + bgobandit: + - bugfix: 'Overheard at CentComm: ''This burn kit said salicyclic acid would heal + my burns! WHO MADE THIS SHIT?'' A muffled honking is heard in the background. + (Burn first-aid kits now contain an appropriate burn pill.)' + - rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid + kits and to chemistry. Ingesting 25 units or more causes burn and brute damage. +2015-09-01: + Dorsidwarf: + - tweak: Changelings' Digital Camoflague ability now renders them totally invisible + to the AI + ExcessiveUseOfCobblestone: + - rscadd: Added health analyzer to the autolathe. + - tweak: Moved Cloning board to Medical Machinery section. + - tweak: Moved Telesci stuff to Teleporter section. + Fox P McCloud: + - tweak: Adds the emitter board to to the circuit imprinter for R&D. + Gun Hog: + - tweak: The Disable RCD Malfunction power is now Destroy RCDs! It costs 25 CPU + (down from 50), causes RCDs to explode, can be used multiple times, and no longer + affects cyborgs. + Kor: + - rscadd: Revheads and Gang leaders now spawn with chameleon security HUDs, for + keeping track of loyalty implanted crew. + - rscadd: Syndicate thermals now have a chameleon function as well, allowing you + to disguise the goggles to match your job. + Miauw: + - tweak: Edaggers actually work now and have been buffed to 18 brute and 2 TC. + Oisin100: + - rscadd: Nanotransen discover ancient human knowledge confirming that trees produce + Oxygen From Carbon Dioxide + - tweak: Trees now require Oxygen to live. And will die in extreme temperatures + Xhuis: + - rscadd: The arcade machines have been stocked with a xenomorph action figure that + comes with realistic sounds! + - rscadd: Darksight now has its own icon. + - rscadd: Empowered thralls have been added. While obvious, they are more powerful + and can resist dethralling while conscious. Only 5 can exist at one time. + - rscadd: Shadowlings can now change their night vision radius by using the action + button their eyes (glasses) now provide. + - tweak: Torches are dimmer, being as bright as flashlights, and no longer fit on + belts. + - tweak: Black Recuperation now has a 1 minute cooldown, down from 5. It can also + be used to empower living thralls. + - tweak: Guise can now be used outside of darkness and makes the user more invisible + than before. + - bugfix: Enthrall now functions properly when a shadowling is not hatched, allowing + them to enthrall up to 5 people before hatching. + xxalpha: + - tweak: Blood crawling is now a spell. + - rscadd: Engineering cyborgs now have a constant magpulse. + - tweak: Changed foam spreading to be like gas spreading. +2015-09-05: + Shadowlight213: + - rscadd: The syndicate have taken notice of the camera bug's woeful underuse, and + have managed to combine all of its upgrades into one! +2015-09-06: + Fox P McCloud: + - bugfix: Fixes gold sheets having plasma as their material. + Xhuis: + - bugfix: Nanotrasen inspectors have discovered a fault in the buckles of chairs + and beds. This has been fixed and you are now able to buckle again. +2015-09-07: + xxalpha: + - tweak: Changed xeno weed spread to be like gas spread. +2015-09-09: + Joan: + - rscadd: New blob chemical; Cryogenic Liquid. Cools down targets. + - tweak: Tweaked names, colors, and effects of remaining blob chemicals; + - tweak: Skin Ripper is now Ripping Tendrils and does minor stamina damage, in addition + to the brute damage. + - tweak: Toxic Goop is now Envenomed Filaments and injects targets with spore toxin + and causes hallucinations, in addition to the toxin damage. + - tweak: Lung Destroying Toxin is now Lexorin Jelly and does brute damage instead + of toxin damage. The oxygen loss it causes can also no longer crit you in one + hit. + - tweak: Explosive Gelatin is now Kinetic Gelatin and does random brute damage, + instead of randomly exploding targets. + - rscdel: Skin Melter, Radioactive Liquid, Omnizine, and Space Drugs blob chemicals + are gone. + bgobandit: + - rscadd: Nanotrasen has commissioned two new corporate motivational posters for + your perusal and edification. + - rscadd: Nanotrasen also wishes to remind the crew that non-authorized posters + ARE CONTRABAND. Especially those new ones with Rule 34. Perverts. +2015-09-11: + CosmicScientist: + - tweak: Drone dispenser now has a var for its cooldown, get var editing. +2015-09-13: + Fox P McCloud: + - bugfix: Fixes an exploit and inconsistency issue with a few material amounts on + a few items and designs. + - bugfix: Fixes Bibles/holy books not properly revealing runes. + - bugfix: fixes stimulants not properly applying its speedbuff. + Gun Hog: + - tweak: Nanotrasen scientists have proposed a refined prototype design for the + nuclear powered Advanced Energy guns to include a taser function along with + the disable and kill modes. Addtionally, they have modified the chassis blueprint + to include a hardpoint for attachable seclites. + Iamgoofball: + - tweak: Reduced the cost of changeling armor to 1 and increased it's armor values. + Jordie0608: + - rscadd: You can now view the reason of a jobban from character setup. + xxalpha: + - rscadd: Drying agent splashed on galoshes will turn them into absorbent galoshes + that dry wet floors they walk on. + - rscadd: Drying agent can be made with ethanol, sodium and stable plasma. +2015-09-14: + Fox P McCloud: + - tweak: Adds a mining voucher to the Quartermaster's locker. + Thunder12345: + - rscadd: The captain has been issued with a new jacket for formal occasions. + - tweak: Research has shown that is is possible to build technological shotshells + without the need for silver. The design blueprints supplied to your station + have been updated accordingly. + xxalpha: + - bugfix: Fixed not being able to grab things from storage while inside aliens. + - bugfix: Fixed two progress bars when devouring. + - rscadd: Shields will now block alien hunter pounces. + - tweak: Alien hunters health reduced to 125 from 150. Alien sentinels health increased + to 150 from 125. + - tweak: Alien hunters will no longer be transparent when stalking, this ability + was given to alien sentinels. + - tweak: Alien slashing now deals constant 20 damage but has a chance to miss. + - tweak: Reduced alien disarm stun duration vs cyborgs, from 7 seconds to 2 seconds. + - tweak: Alien sentinels now move as fast as humans. + - tweak: Facehuggers and alien eggs layers increased to be higher than resin walls. +2015-09-16: + Razharas: + - tweak: Replaces the space cube with space torus. Space levels are now each round + randomly placed on the grid with at least one neigbour, any side of the space + level that doesnt have neigbour will loop either onto itself or onto the opposite + side of the furthest straight-connected space level on the same axis. + Supermichael777: + - tweak: The detomax pda cartridge no longer blows its user up. + Xhuis: + - experimental: Cultists will now be able to create all runes without needing to + research or collect words. This is subject to change. + - tweak: Cult code has been significantly improved and will run much faster and + be more responsive. + - tweak: Conversion runes can now be invoked with less than three cultists, but + take a small amount of time to convert the target. + - tweak: Armor runes will only outfit the user with standard armor, rather than + having different loadouts for different worn clothing items. + - tweak: Astral Journey runes will now pull the user back to the rune if they are + moved. The user also has a different color while on the rune. + - tweak: Free Cultist has been removed. Summon Cultist now works even if the target + is restrained. + - tweak: Sacrifice and Raise Dead runes now offer more precise target selection. + - soundadd: Sacrifice runes now have different sounds, and gib rather than dust + (assuming the target is not a silicon). + - tweak: There is no longer a maximum cap on active runes. + - tweak: Runes have been renamed to Rites. For instance, the Teleport rune is now + the Rite of Translocation. The only exception to this is the rune to summon + Nar-Sie, which is a Ritual. + - tweak: Nar-Sie now has a new summon sound. + - tweak: The Nar-Sie summon rune has a new 3x3 sprite. + - tweak: The stun rune no longer stuns cultists. + - rscadd: The Rite of False Truths had been added, that will make all nearby runes + appear as if they were drawn in crayon. + - rscadd: Runes can now be examined by cultists to determine their name, function, + and words. + phil235: + - tweak: Riot and energy shield users now have a chance to block things thrown at + them as well as xeno leaping at them. +2015-09-17: + bgobandit: + - rscadd: Meatspikes can now be constructed and deconstructed with metal and rods, + as well as wrenched and unwrenched! Humans and corgis can be used on them as + well. + xxalpha: + - tweak: 'Reworked nuke deconstruction: Standardized steps, partial reparation (use + metal) to contain radiation.' + - rscadd: New portable nuke, self-destruct terminal, syndie screwdriver sprites + by WJohnston. +2015-09-19: + Xhuis: + - rscadd: Shadowlings are now able to sacrifice a thrall to extend the shuttle timer + by 15 minutes. This will not stack. + - bugfix: Additional abilities granted by Collective Mind will now properly have + icons. + - bugfix: Shadowlings now have their antagonism removed if turned into a silicon. + - tweak: The order of abilities unlocked by Collective Mind has been changed. It + now starts with Sonic Screech. + - tweak: Veil now destroys glowshrooms in a much larger radius than before. +2015-09-20: + Xhuis: + - tweak: Rites have been renamed to their old runes, which reflect their functionality. + - tweak: Examining a talisman no longer opens the paper GUI. + - tweak: Armor talismans have been re-added. + - tweak: EMP talismans now have the same range as their rune counterpart. + - tweak: Some talismans now cost health to use, costing more or less depending on + their effect. + - tweak: Scribing runes now deals 0.1 brute damage instead of 1. + - tweak: Bind Talisman runes no longer deal 5 brute damage when invoking. + - tweak: Rune shapes and colors are now identical to their old versions. + - tweak: Conversion runes can no longer be used by yourself, and require a static + 2 cultists. +2015-09-22: + Kor: + - rscadd: A new admin command, Offer Control to Ghosts, can be found in the view + variables menu. It will randomly select a willing candidate from among dead + players, providing a fair method of replacing antagonists. + Xhuis: + - tweak: When a morph changes form, a message is shown to nearby people. This also + happens upon undisguising. + - tweak: Morphs now have an attack sound and message. + - tweak: The Spawn Morph event now plays a sound to the chosen candidate. + - tweak: Slaughter demons (and other creatures with blood crawl) now take two seconds + to emerge from blood pools. Entering is still instantaneous. + - tweak: The demon heart's sprite has been updated. + - tweak: Eating a demon heart now surgically implants the heart into your chest. + If the heart is removed from you, you lose the ability. Someone else can eat + the heart to gain the ability. + - tweak: Blood Crawl no longer has a 1-second cooldown, instead having none. + - tweak: You can no longer hold items when attempting to Blood Crawl, nor can you + use any items while Blood Crawling. + - tweak: Creatures that can Blood Crawl now take two seconds to emerge from blood + pools. + - tweak: Slaughter demons now store devoured creatures, and will drop them upon + death. + - tweak: Revenants now have the ability to speak to the dead. + - tweak: Revenant abilities now have icons. + - tweak: Malfunction no longer EMPs a specific area - it will instead EMP nearby + machines directly and stun cyborgs. Dominators are immune to this. + - tweak: Revenants now have directional sprites. + - tweak: Overload Lights now has a smaller radius. + - tweak: Defile no longer corrupts tiles. + - tweak: When glimmering residue reforms, the game will attempt to place the old + revenant in control of the new one. If this cannot be done, it will find a random + candidate. + - tweak: Revenants can no longer see ghosts. They can see other revenants, however, + and ghosts can still see revenants. + - tweak: The Spawn Slaughter Demon event now plays a sound to the chosen candidate. + phil235: + - rscdel: Lizards and other non human species can no longer acquire the hulk mutation. + Hulks no longer have red eyes + - bugfix: Monkeys now always have dna and a blood type (compatible with humans). + - bugfix: Monkey transformation no longer deletes the human's clothes. + - bugfix: Space Retrovirus now correctly transfers dna SE to the infected human. + - bugfix: Changeling's Anatomic Panacea removes alien embryo again. + - bugfix: Cloning someone now correctly sets up their dna UE. + - bugfix: Fixes the laser eyes mutation not giving glowing red eyes to the human. + - bugfix: Using changeling readaptation now properly removes all evolutions bought + (arm blade, chameleon skin, organic suit). + xxalpha: + - rscadd: Added a researchable cyborg self-repair module to the robotics fabricator. +2015-09-23: + Xhuis: + - rscadd: Syndicate medical cyborgs have been added. + - rscadd: The Dart Pistol is now available from the uplink for 4 telecrystals. It + functions as a pocket-sized syringe gun with a quieter firing sound. + - tweak: Boxes of riot foam darts now cost 2 telecrystals, down from 10, and are + available to traitors. + - tweak: Foam dart pistols now cost 3 telecrystals, down from 6. + - tweak: Syndicate cyborg teleporters now allow a choice between Assault and Medical + cyborgs. + - tweak: Syndicate cyborgs are now distinguished as Syndicate Assault. + - tweak: Syndicate cyborg energy swords now cost 50 energy per use, down from 500. + - tweak: Airlock charges now cost 2 telecrystals, down from 5. + - tweak: Airlock charges are much more powerful. + - tweak: There is no longer a 25% chance to detonate an airlock charge while removing + it. + - tweak: The description of many uplink items has been changed to better reflect + their use. +2015-09-24: + Jordie0608: + - tweak: Advanced energy guns now only critically fail after successive minor failures. + Cease firing after multiple recent minor failures to avoid critical ones. + Kor: + - rscadd: Guardian Spirit types and powers have been heavily reworked. Full details + of each type are available on the wiki. + - rscadd: Guardian damage transfer to users now deals cloneloss if their user is + in crit. + - rscadd: Guardians are now undergoing a trial run in the traitor uplink, under + the name of Holoparasites. + - rscadd: You can now hang human mobs (dead or alive) from meatspikes. Escaping + the meatspike will further damage the victim. + - rscdel: You can no longer slam humans into the meatspike as an attack. +2015-09-25: + Xhuis: + - rscadd: Changelings have a new ablity, Biodegrade. Costing 30 chemicals and having + an unlock cost of 1, it allows them to dissolve handcuffs and straight jackets + in 3 seconds, and escape from lockers in 7. + - tweak: Fleshmend's effectiveness is now halved each time it is used in a short + time span. + - tweak: Last Resort now blinds and confuses nearby humans and briefly disables + silicons upon use. + - tweak: Headslugs now have 50 health, up from 20. +2015-09-26: + MMMiracles: + - rscadd: Nanotrasen's genetic researchers have rediscovered the inactive dwarfism + genetic defect inside all bipedal humanoids. Suffer not the short to live. + WJohnston: + - tweak: Repiped the entire station. Atmosia and the disposals loop were not touched. + - tweak: Moved mulebot delivery from misc lab to RnD. +2015-09-28: + Feemjmeem: + - bugfix: Rechargers can now be wrenched and unwrenched by cyborgs. + - bugfix: Rechargers no longer stop working forever if you move them from an unpowered + area to a powered area, and now actually look powered off when they are. + - bugfix: Guns and batons can no longer be placed in unwrenched chargers. + Razharas: + - rscadd: Added button to preferences menu that kills all currently playing sounds + when pressed, now you can kill midis and any other sounds for real. + phil235: + - bugfix: Fixed the syndicate cyborg's grenade launcher. + - tweak: You can modify the dna of corpses again. +2015-09-29: + Kor: + - bugfix: The Chaos holoparasite can now actually set people on fire properly. + - tweak: Guardian powers are now used via alt+click rather than shift+click. + - tweak: Added an alert chime for ghosts when someone is summoning a Guardian. +2015-10-04: + Fox P McCloud: + - tweak: Adds a bar of soap to the janitor's locker. + - rscadd: Re-adds the advanced mop as a researchable R&D item. + - rscadd: Adds a bluespace trashbag as a researchable R&D item; can hold large quantities + of garbage. + Jordie0608: + - rscadd: Added Special Verb 'Create Poll', an in-game interface to create server + polls for admins with +permissions. + MrPerson: + - rscdel: Removed NTSL. Sorry. People could write scripts that crashed the server, + and this is the only thing that can be done to prevent them from doing that. + MrStonedOne: + - rscdel: Removed feature where quick consecutive ghost orbits while moving could + be used to fuck with your sprite + - bugfix: Fixed ghosts losing floating animation when returning from an orbit + - bugfix: Fixed logic error that prevented orbit's automatic cancel when the orbiting + thing moved in certain situations. + - rscadd: Ghost Orbit size now changes based on the icon size of the thing they + are orbiting (for that sweet sweet singulo orbiting action) + - tweak: Removed needless checks in ghost orbit, you can now orbit yourself and + restart an orbit around the thing you are already orbiting + Xhuis: + - rscadd: Syndicate Medical cyborgs now have cryptographic sequencers. + - rscdel: Syndicate Medical cyborgs no longer have syringes. + - tweak: Restorative Nanites now heal much more damage per type. + - bugfix: Operative pinpointers now actually point toward the nearest operative. + - bugfix: Syndicate Assault cyborgs no longer start with medical supplies. + - bugfix: Energy saws now have a proper icon. + - bugfix: Non-operatives can now longer use operative pinpointers or Syndicate cyborg + teleporters. + - tweak: Doctor's Delight now requires cryoxadone in its recipe instead of omnizine. + - tweak: Doctor's Delight now restores half a point of brute, burn, toxin, and oxygen + damage per tick. + - tweak: Doctor's Delight now drains nutrition while it's in your system (that is, + unless you're a doctor). + - bugfix: Syndicate roboticists have given Syndicate medical cyborgs sharper hypospray + needles - they are now able to penetrate armor. +2015-10-06: + Gun Hog, for WJohnston: + - rscadd: 'Add new Xenomorph caste: The Praetorian. Drones may become this on their + way to growing into a full queen, and a queen may promote one if there is not + one already.' + - tweak: Xenomorph queens are now GIGANTIC, along with the new Praetorian. Together, + they are considered royals. + - tweak: Queens are now significantly tougher to make up for their huge size. + - bugfix: All forms of dead xenomorph may now be grabbed and placed on a surgery + table for organ harvesting! + Xhuis: + - rscadd: Maintenance drones now have a more descriptive message when examined. + - tweak: A recent Nanotrasen firmware update to drones has increased vulnerability + to foreign influences. Please periodically check drones for abnormal behavior + or status LED malfunction. Note, however, that cryptographic sequencers will + not incur this behavior. + - tweak: In response to complaints about rogue drones, Nanotrasen engineers have + allowed factory resets on all drones by simply using a wrench. + - experiment: Central Command reminds drones to immediately retreat, if possible, + when a law override is begun. Not doing so may anger the gods and incur their + wrath! + - rscadd: Some virus symptoms that had no messages now have them. + - rscadd: 'New virology symptom: Weakness. This will cause stamina damage and fainting + spells.' + - tweak: Many virus symptom messages have been changed to be more threatening. +2015-10-07: + Kor: + - rscadd: The alien queen can now perform a tail sweep attack, throwing back and + stunning all nearby foes. +2015-10-13: + AnturK: + - rscadd: Display cases can now be built using 5 wood planks and 10 glass sheets. + - rscadd: Add airlock electronics to open it with id later, otherwise you'll have + to use crowbar + - tweak: Broken display cases can be fixed with glass sheets or removed using crowbar + - tweak: Added start_showpiece_type variable for mappers to create custom displays + - rscadd: Syndicate Lone Operatives spotted near the nanotrasen stations! Keep the + disk safe! + - tweak: Admin spawned nuclear operatives will now have access to nukeop equipment + Gun Hog: + - rscadd: Nanotrasen's research team has released a new, high tech design for Science + Goggles, which previously did nothing! They new come fitted with a portable + scanning module which will display the potential research data gained from experimenting + with an object. Nanotrasen has also released drivers which shall enable the + prototype hardsuit's built in scan visor. + - rscadd: Supporting this new design, Nanotrasen has seen fit to provide blueprints + for Science Goggles to the station's protolathe. + Kor: + - tweak: Gang implanters now only break implants/deconvert gangsters, meaning you + will have to use a pen to convert them afterwards. + - rscadd: An important function, accessible via alt+click, has been restored to + the detectives hat. + - sounddel: When Nar-Sie is created, they now use the old sound effect. + Steelpoint: + - rscadd: The Chief Medical Officers 'Medical Hardsuit' has been added to the CMO's + office. Boasts the usage of lightweight materials allowing fast movement while + wearing the suit as well as complete biological protection to airborne and similar + pathogens. + - rscadd: The Head of Security's personal 'HoS Hardsuit' has been added to the HoS's + office. This Hardsuit is slightly more armored than the regular Security Hardsuit. + - rscadd: The Research Directors 'Prototype Hardsuit' has been added to the RD's + office. This Hardsuit offers the highest levels of protection against explosive, + as well as biological, attacks, as well as fireproofing. + - rscdel: The Command EVA space suits, due to budget concerns, have been removed + and reloacted to another space station. + Xhuis: + - rscdel: All instances of autorifles have been removed from Security. + - rscadd: The armory has been re-mapped. + - tweak: The spell book has received a rebalancing! There are now ten uses by default, + but most spells cost two uses. Some underused spells, like Blind, Smoke, and + Forcewall, only cost a single use. + - experiment: After searching through the Sleeping Carp's ancient monastery in deep + space, more secrets have been uncovered of their traditional fighting techniques. + - tweak: Members of the Sleeping Carp gang are now able to deflect all ranged projectiles. + - tweak: Members of the Sleeping Carp gang are now uanble to use any type of ranged + weaponry. Doing so would be dishonorable. + - tweak: The Sleeping Carp martial art's effects are more damaging, and many stuns + have been increased in duration. + phil235: + - bugfix: Fixes critical bug causing multiple hits from single projectile. + - bugfix: Fixes not being able to shoot a mob on same tile as the shooter. + - bugfix: Clicking your mob (without targeting your mouth) no longer causes you + to shoot yourself. + - bugfix: Fixes not being able to shoot non human mobs at point blank. + - rscdel: Morphs no longer automatically drop the things they swallowed, you have + to butcher their corpse to retrieve their contents. + - bugfix: butchering a corpse no longer also attacks it. + - rscdel: Dipping cigarette (to asbsorb liquids) in a glass can now only be done + with an unlit cigarette. Lit cigarette now heats up the glass content (like + other heat sources). + - bugfix: Fixes trashbag not being able to pickup drinks and ammo casings. + - tweak: Slimes now attaches themselves to mobs via buckling. +2015-10-16: + MrStonedOne: + - rscadd: Added a reconnect option to the file menu. This will allow you to reconnect + to the game server without closing and re-opening the game window. This should + also prevent another byond ad from playing during reconnections. + Xhuis: + - rscadd: A gamebreaking bug has been fixed with buckets. You can now wear them + on your head. + bgobandit: + - rscadd: The Grape Growers Consortium has complained that Nanotrasen kitchens do + not use their products enough. HQ has come up with a few recipes to pacify them. + Goddamn winos. +2015-10-19: + AnturK: + - rscadd: Handheld T-Ray Scanners now detect critters in pipes. + Kor: + - tweak: Weapons and projectiles that are armour piercing now have an increased + chance to bypass riot shields. + - tweak: Slipping on lube now deals slightly more damage, but is concentrated on + a random body part, rather than spread to your entire body. + - tweak: Slipping on water no longer deals damage + - rscadd: You can now attach grenades and C4 to spears to create explosive lances. + This is done via table crafting. Alt+click the spear to set a war cry. + Shadowlight213: + - rscadd: In response to reports of stranded drones, Nanotrasen has added magnets + to drone legs. They are no longer affected by lack of gravity or spacewind! + - bugfix: Drones can now set Airlock access on RCDs. + bgobandit: + - rscadd: Nanotrasen loves recycling! In the highly unlikely occasion that your + space station accumulates gibs, scoop 'em up and bring them to chemistry to + recycle into soap, candles, or even delicious meat product! + - rscadd: L3 biohazard closets now contain bio-bag satchels for the safe collection + of biowaste products, such as slime extracts. + phil235: + - rscdel: Removing Smile, Swedish, Chav and Elvis mutations from genetics. These + mutation can still be acquired via adminspawned dna injector. + - rscadd: Added a dna injector for laser eyes mutation for admin use. + - bugfix: Fixes winter coat hood sprite appearing as a bucket. + - bugfix: Fixes using razor on non human shaving non existent hair. + - bugfix: Fixes chair deconstruction dropping too much metal. + - bugfix: Fixes snapcorn not giving seeds. + - bugfix: Fixes portable chem dispenser. + - tweak: Changing the transfer amount of all reagent containers (beaker, bucket, + glass) is now done by clicking them, similar to spray. Reagent dispensers (watertank, + fueltank, pepperspray dispenser) no longer have their own transfer amounts and + use the reagent container's transfer amount instead (except for sprays which + get 50u for faster refilling). +2015-10-23: + Incoming5643: + - rscadd: 'Syndicate bomb payloads will now detonate if set on fire long enough. + Note that the casings for the bombs is fireproof, so if you want to set fire + to a bombcore you''ll need to remove it from the case first (cut all wires, + then crowbar it out). A reassurance from our explosives department: it is, and + always has been, impossible to detonate a syndicate bomb that isn''t ticking + with wirecutters alone.' + Xhuis: + - rscadd: Geiger counters have been added and are obtainable from autolathes and + EngiVends. They will measure the severity of radiation pulses while in your + pockets, belt, or hands. One can scan a mob's radiation level by switching to + Help intent and clicking on it. These counters never really discard the radiation + they store, and rumor has it this can be used in nefarious ways... + - tweak: When a mob is impacted by radiation, the radiation is now relayed to all + items on the mob. +2015-10-24: + Kor: + - rscadd: The friendly gold slime reaction now spawns three mobs. + phil235: + - tweak: Changed the effects of alcohol to be more realistic. The effects of alcohol + now appear twice as fast. Drunkenness now scales with how much alcohol is in + you, not how long you've been drinking. This means drinking very little but + continuously no longer makes you very drunk, or confused/slurring for a long + time or give you alcohol poisoning. The dizziness and slurring effects now properly + scale with how drunk you are (and dizziness is generally more pronounced). +2015-10-25: + Incoming5643: + - rscadd: The spell Charge has been added to the spellbook. It can be used to extend + the life of magic and energy weapons and even reset the cooldowns of held wizards! + It cannot reset your own cooldowns. + - rscadd: The Staff of Healing has been added to the spellbook. Heals all damage + and raises the dead! Can't be used on yourself however. + - bugfix: The exploit that allowed you to use the staff of healing on yourself by + suicide has been fixed. + Jordie0608: + - rscadd: You can now selectively mute non-admin players from OOC with the Ignore + verb in the OOC tab. + Tkdrg: + - rscadd: Added chainsaws. They can be tablecrafted using a circular saw, a plasteel + sheet, some cable coil, and a welding tool. Don't forget to turn it on! +2015-10-26: + Fox P McCloud: + - tweak: Standardizes the slowdown of most spacesuits to 1 as opposed to 2. + Incoming5643: + - rscadd: 48x48 pixel mode (x1.5 zoom) has been added to the Icons menu (top left). + While playing in 32x32 or 64x64 will still provide a clearer looking station, + for those of us with resolutions that fall into the gap between the two zooms + this can provide a more consistant looking station than stretch to fit. + - rscadd: 96x96 pixel mode (x3 zoom) has also been added for our players who enjoy + looking at spacemen on their 4k monitors at a crisp and consistent scale. + - tweak: The lich spell has been subjected to some gentle nerfing. When you die + a string of energy will tie your new body to your old body for a short time, + aiding others in determining your location. The duration of this beam scales + with the number of deaths you've avoided. + - tweak: Additionally the post revival stun now also scales in this way. + - tweak: The spell will also fail if the item and the wizard don't share the same + z level, though the nature of space means the odds of the item (or the wizard) + looping around back to the station is pretty high. + - rscadd: The spell is still really good. +2015-10-27: + Joan: + - bugfix: You can now click on things under timestop effects, instead of clicking + the effect and looking like a fool. + Kor: + - rscadd: Added a zombie mob that turns its kills into more zombies. Currently adminspawn + and xenobio only. + - rscadd: Using water with a red slime extract will now yield a speed potion. Using + the speed potion on an item of clothing will paint it red and remove its slowdown. + MrStonedOne: + - rscadd: You may now access the setup character screen when not in the lobby via + the game preferences verb in the preferences tab + - rscadd: The round end restart delay can now be configured by server operators. + New servers will default to 90 seconds while old servers will default to the + old 25 seconds until they import the config option to their server. +2015-10-28: + Tkdrg: + - rscadd: Added a Ghost On-screen HUD. It can be toggled using the "Toggle Ghost + HUD" verb. Thank you Razharas for the sprites! + - rscadd: Ghosts can now use the "Toggle med/sec HUD" verb to see the basic secHUD + (jobs only) or the medHUD of humans. + - rscadd: Ghost will now get clickable icon alerts from events such as being put + in a cloner, drones being created, Nar-sie being summoned, among others. The + older chat messages were kept. These alerts can not be toggled. +2015-10-29: + Kor: + - tweak: Slightly changed what items spawn on the captain vs in his locker, hopefully + saving some annoying inventory shuffle at roundstart. +2015-10-30: + Incoming5643: + - rscadd: Slimepeople can now split if they contain 200 units of slime jelly, and + slimepeople will now slowly generate slime jelly up to 200 units provided they + are very well fed. Split slimepeople are NOT player controlled, but rather the + original slime person can swap between the two mobs at will. If one of the slimepeople + should die under player control, the player won't be able to swap back to their + living body. Splitting only creates a new body, any items you have on you are + not duplicated. + - rscadd: Slimepeople now take half damage from sources of heat, but double damage + from sources of cold. Lasers good, Space bad. +2015-11-01: + Gun Hog: + - rscadd: Nanotrasen listens! After numerous complaints and petitions from Security + personnel regarding energy weapon upkeep, we have authorized the construction + and maintenance of your station's weapon rechargers. As an added bonus, we have + also provided a more modular design for the devices, allowing for greater recharge + rates if fitted with a more efficient capacitor! + - rscadd: Added Diagnostic HUDs! They can be used to view the health and cell status + of borgs and mechs. Silicons have them built in, Roboticists get two in their + locker, and the RD's hardsuit has one built in. + Incoming5643: + - rscadd: The number of roundstart head revolutionaries nows depends on the roundstart + security force as well as the roundstart heads + - rscadd: The maximum number of head revs is 3, the minimum is 1. If there is fewer + than three station heads there will never be more than that number of head revs + at roundstart. For every three vacant security roles (Head of Security/Warden/Security + Officer/Detective) at roundstart the number of starting head revs will be reduced + by 1. + - rscadd: Head revolutionaries can be gained during play if the security/head roles + are filled. They are drawn from existing revolutionaries. + - rscadd: Added dental implant surgery. While targeting the mouth drill a hole in + a tooth then stick a pill in there for hands free later use. + Kor: + - rscadd: Added an experimental control console for Xenobiology. Ask the admins + if you'd like to try it out. It may not work on maps other than Box if they + have renamed the Xenobiology Lab. + - rscadd: Injecting blood into a cerulean slime will yield a special one use set + of blueprints that will allow you to expand the territory your camera can cover. + Kor and Remie: + - rscadd: Added as series of laser reflector structures, the frame of which can + be built with 5 metal sheets. + - rscadd: Completing the frame with 5 glass sheets creates a mirror that will reflect + lasers at a 90 degree angle. + - rscadd: Completing the frame with 10 reinforced glass sheets creates a double + sided mirror that reflects lasers at a 90 degree angle. + - rscadd: Completing the frame with a single diamond sheet creates a box that will + redirect all lasers that hit it from any angle in a single direction. + MMMiracles: + - tweak: Energy Swords can now embed when thrown for a 75% chance. Embedding +2015-11-05: + AnturK: + - rscadd: Added wild shapeshift spell for wizards. +2015-11-08: + Cuboos: + - soundadd: Added a new and better sounding flashbang sound and a ringing sound + for flashbang deaf effect + JJRcop: + - tweak: Chronosuits have had their movement revised, they now take time to teleport + depending on how far you've traveled, and don't teleport automatically anymore + unless you stop moving for a short moment, or press the new ' Teleport Now' + button. + - rscadd: Added new outfit that allows admins to dress people up in the chrono equipment + easier. + Jalleo: + - tweak: Due to a recently discovered report it turns out The Wizard Federation + has devised a way for CEOs to stop having some teas from their Smartfridges + due to this change all smartfridges will temporarily be unable to stack contents. + Joan: + - tweak: Revenant draining now takes about 5 seconds to complete and can be interrupted + by dragging the target away. + - tweak: Revenants can now tell if they are currently visible. + - tweak: Revenant ability costs tweaked; Defile now costs 40 essence to cast, Overload + Lights now costs 45 essence to cast, and Malfunction now costs 50 essence to + cast. + - tweak: Malfunction now affects non-machine objects, even if they're not being + held by a human. + - tweak: Defile does an extremely low amount of toxin damage to humans and confuses, + but does much less stamina damage and stuns the revenant for slightly longer. + - tweak: Overload Lights will no longer shock if the light is broken after a light + is chosen to shock an area. + Kor: + - rscadd: Using water on a dark blue slime extract will now yield a new potion capable + of completely fireproofing clothing items. + - rscadd: You can once again click+drag mobs into disposal units. Xenobiologists + rejoice. + Xhuis: + - tweak: Shadowling abilities now require the user to be human. + - tweak: Enthralling now takes 21 seconds (down from 30). + - tweak: Regenerate Chitin has been renamed to Rapid Re-Hatch. + - tweak: Dethralling surgery's final step now requires a flash, penlight, or flashlight. + - tweak: Dethralling surgery now produces a black tumor, which has a high biological + tech origin but dies quickly in the light. + - rscdel: Shadowlings no longer have Enthrall before hatching. + - rscadd: Shadowling clothing now has icons to better reflect its existence. + - rscdel: Ascendant Broadcast has been removed. + - rscdel: Destroy Engines is now removed from the user after it is used once. +2015-11-11: + AnturK: + - tweak: DNA Injectors now grant temporary powers on every use. Duration dependent + on activated powers and machine upgrades + - rscadd: 'Delayed Transfer added to DNA Scanner - It will activate on the next + closing of scanner door ' + - rscadd: 'UI+UE injectors/buffer transfers added for convinience ' + - tweak: Injector creation timeout cut in half + Firecage: + - rscadd: NanoTrasen specialists has developed a new type of operating table. You + can now make one yourself with only some rods and a sheet of silver! + Kor: + - rscadd: Adds immovable and indestructible reflector structures for badmin use. + - rscadd: The Mjolnir has been added to the wizards spellbook. + - rscadd: The Singularity Hammer has been added to the wizards spellbook. + - rscadd: The Supermatter Sword has been added to the wizards spellbook. + - rscadd: The Veil Render has been added to the wizards spellbook. + - rscadd: Trigger Multiverse War (give the entire crew multiswords) has been added + to the wizards spellbook, at a cost of 8 points. + - rscadd: Converting (to cultist, rev, or gangster) a jobbaned player will now automatically + offer control of their character to ghosts. + - rscadd: Emergency Response Teams and Deathsquads no longer accept non-human members + if the server is configured to bar mutants from being heads of staff. + LordPidey: + - rscadd: Nanotransen doctors have re-approved Saline-Glucose Solution for usage + in IV drips, when blood supplies are low. Simple pills will not suffice. + MMMiracles: + - tweak: Water slips have been nerfed to a more reasonable duration. It is still + a guaranteed way to disarm an opponent and obtain their weapon, but you can + no longer manage to cuff/choke everyone who manages to slip without a problem. + MrStonedOne: + - bugfix: Fixes the smartfridge not stacking items. + Xhuis: + - soundadd: The emergency shuttle now plays unique sounds (thanks to Cuboos for + creating them) when launching from the station and arriving at Central Command. + torger597: + - rscadd: Added a syringe to boxed poison kits. +2015-11-12: + Dunc: + - rscdel: DNA injectors have been restored to their original permanent RNG state + from the impermanent guaranteed state. + Xhuis: + - rscadd: Reagents can no longer be determined by examining a reagent container + without the proper apparatus. Silicons and ghosts can always see reagents. + - rscadd: Science goggles now allow reagents to be seen on examine. In addition, + chemists now start wearing them. The bartender has a pair that looks and functions + like sunglasses. +2015-11-13: + as334: + - rscadd: Nanotrasen has hired a brand new supply of ~~expendable labor~~ *LOYAL + CREW MEMBERS* please welcome them with open arms. + - rscadd: Plasmamen are now a playable race. They require plasma gas to survive + and will ignite in oxygen environments. +2015-11-15: + CosmicScientist: + - tweak: Hopefully made the dehydrated carp's uplink description 100% clear. + - tweak: Made the dehydrated carp cost 1 TC (instead of 3) to help with your traitor + gear combos. + Incoming5643: + - tweak: The supermatter sword was being far too kind in the hands of men. They + should now have the desired effect when swung at people. + Joan: + - tweak: Anomalies move more often, are resistant to explosions and will only be + destroyed if they are in devastation range. You shouldn't bomb them, though. + - tweak: Hyper-energetic flux anomaly will shock mobs that run into it, or if it + runs into them. + - tweak: Bluespace anomaly will occasionally teleport mobs away from it in a small + radius. + - tweak: Vortex anomalies will sometimes throw objects at nearby living mobs. + - tweak: Pyroclastic anomalies will produce bigger, hotter fires, and if not disabled, + it will release an additional burst of flame. In addition, the resulting slime + will be rabid and thus attack much more aggressively. + - bugfix: Gravitational anomalies will now properly throw objects at nearby living + things. + MrStonedOne: + - bugfix: Away mission loading will no longer improperly expand the width of the + game world to two times the size of the away mission map. + - tweak: This should also improve the speed of loading away missions, since the + game doesn't have to resize the world + RemieRichards: + - rscadd: Deities now start off with the ability to place 1 free turret + - tweak: HoG Claymores now do 30 Brute (Down from 40) but now have 15 Armour Penetration + (Up from 0) + - bugfix: Killing the other god objective is fixed + - tweak: Turrets will no longer attack handcuffed people + - rscadd: Followers are now informed of their god's death + - rscadd: Followers are now informed of the location of their god's nexus when it + is placed + - tweak: Gods can no longer place structures near the enemy god's nexus +2015-11-16: + Gun Hog: + - tweak: The Combat tech requirement for Loyalty Firing Pins has been reduced from + 6 to 5. + Joan: + - tweak: Plasmamen can now man the bar. + - tweak: Defile no longer directly affects mobs. Instead, it rips up floors and + opens most machines and lockers. + - rscadd: Blight added. Blight infects humans with a virus that does a set amount + of damage over time and is relatively easily cured. Blight also badly affects + nonhuman mobs and other living things. + - experiment: While the cure to Blight is simple, it's not in this changelog. Use + a medical analyzer to find the cure. + - tweak: Tweaked costs and stuntimes of abilities; + - tweak: Defile now costs 30 essence and stuns for about a second. + - tweak: Overload Lights now costs 40 essence. + - tweak: Malfunction now costs 45 essence. + - rscadd: Blight costs 50 essence and 200 essence to unlock. + - imageadd: Transmit has a new, spookier icon. + - bugfix: Revenant abilities can be given to non-revenants, and will work as normal + spells instead of runtiming. + bgobandit: + - rscadd: Blood packs can now be labeled with a pen. +2015-11-17: + Xhuis: + - tweak: Many medicines have received rebalancing. Expect underused chemicals like + Oxandralone to be much more effective in restoring damage. + - tweak: Many toxins are now more or less efficient. + - tweak: The descriptions of many reagents have been made more accurate. + - rscadd: 'New poison: Heparin. Made from Formaldehyde, Sodium, Chlorine, and Lithium. + Functions as an anticoagulant, inducing uncontrollable bleeding and small amounts + of bruising.' + - rscadd: 'New poison: Teslium. Made from Plasma, Silver, and Black Powder, heated + to 400K. Modifies examine text and induces periodic shocks in the victim as + well as making all shocks against them more damaging.' + - rscadd: Two Chemistry books have been placed in the lab. When used, they will + link to the wiki page for chemistry in the same vein as other wiki books. +2015-11-18: + oranges: + - tweak: Nanotrasen apologies for a recent bad batch of synthflesh that was shipped + to the station, any rumours of death or serious injury are false and should + be reported to your nearest political officer. At most, only light burns would + result. + phil235: + - bugfix: Remotely detonating a planted c4 with a signaler now works again. +2015-11-19: + Joan: + - rscadd: Constructs have action buttons for their spells. + - imageadd: The Juggernaut forcewall now has a new, more cult-appropriate sprite. + - imageadd: Cult floors and walls now have a glow effect when being created. + - bugfix: Nar-Sie and Artificers will properly produce cult flooring. + - spellcheck: Nar-Sie is a she. +2015-11-20: + AnturK: + - tweak: Staff of Doors now creates random types of doors. + Incoming5643: + - bugfix: Setting your species to something other than human (if available) once + again saves properly. Note that if you join a round where your species setting + is no longer valid it will be reset to human. + PKPenguin321: + - tweak: Healing Fountains in Hand of God now give cultists a better and more culty + healing chemical instead of Doctor's Delight. + kingofkosmos: + - rscadd: Added the ability to upgrade your grab by clicking the grabbed mob repeatedly. + octareenroon91: + - rscadd: Add the four-color pen, which writes in black, red, green, and blue. + - rscadd: Adds two such pens to the Bureaucracy supply pack. +2015-11-21: + Joan: + - rscadd: Blobs now have a hud, with jump to node, create storage blob, create resource + blob, create node blob, create factory blob, readapt chemical, relocate core, + and jump to core buttons. + - tweak: Manual blob expansion is now triggered by clicking anything next to a blob + tile, instead of by ctrl-click. + - tweak: 'Rally Spores no longer has a cost. Reminder: You can middle-click anything + you can see to rally spores to it.' + - tweak: Creating a Shield Blob with hotkeys is now ctrl-click instead of alt-click. + - rscadd: Removing a blob now refunds some points based on the blob type, usually + around 40% of initial cost. Hotkey for removal is alt-click. + - rscadd: Blobs now have the *Blob Help* verb which will pull up useful information, + including what your reagent does. + - tweak: Storage Blobs now cost 20, from 40. Storage Blobs also cannot be removed + by blob removal. + - tweak: Readapt Chemical now costs 40, from 50. + octareenroon91: + - rscadd: Add numbers and a star graffiti to crayon/spraycan designs. +2015-11-23: + octareenroon91: + - rscadd: Spilling oxygen or nitrogen will obtain a release of the corresponding + atmospheric gas in the effected tile. + - rscadd: 'Carbon Dioxide has been added as a reagent. Recipe: 2:1 carbon:oxygen, + heated to 777K.' + - rscadd: Spilling CO2 will produce CO2 gas. +2015-11-24: + Kor: + - rscadd: Added a lava turf. Expect to see it in away missions or in admin 'events' +2015-11-25: + Incoming5643: + - experiment: A number of popular stunning spells have undergone balance changes. + Note that for the most part the stuns themselves are untouched. + - experiment: 'Lightning Bolt Changes:' + - rscdel: You can no longer throw the bolt whenever you want, it will fire itself + once it's done charging. + - rscadd: Getting hit by a bolt will do a flat 30 burn now, as opposed to scaling + with how long the wizard spent charging the spell. Unless said wizard made a + habit of charging lightning bolt to near maximum every time this is a buff to + damage. + - rscdel: Every time the bolt jumps the next shock will do five less burn damage. + - rscadd: Lightning bolts can still jump back to the same body, so the maximum number + of bolts you can be hit by in a single casting is three, and the maximum amount + of damage you could take for that is 60 burn. + - experiment: 'Magic Missile Changes:' + - rscdel: Cooldown raised to 20 seconds, up from 15 + - rscadd: Cooldown reduction from taking the spell multiple times raised from 1.5 + seconds to 3.5 seconds. Rank 5 magic missile now has a cooldown of 6 seconds, + down from 9, and is effectively a permastun. + - experiment: 'Time Stop Changes:' + - rscadd: Time Stop field now persists for 10 seconds, up from 9 + - rscdel: Cooldown raised to 50 seconds, up from 40 + - rscadd: Cooldown reduction from taking the spell multiple times raised from 7.75 + seconds to 10 seconds. Rank 5 time stop now has a cooldown of 10 seconds, up + from 9, and is effectively a permastun. + Kor: + - rscadd: Escape pods can now be launched to the asteroid during red and delta level + security alerts. Pods launched in this manner will not travel to Centcomm at + the end of the round. + - rscadd: Each pod is now equipped with a safe that contains two emergency space + suits and mining pickaxes. This safe will only open during red or delta level + security alerts. + MrStonedOne: + - bugfix: fixes interfaces (like the "ready" button) being unresponsive for the + first minute or two after connecting. + - tweak: Burn related code has been changed + - tweak: This will give a small buff to fires by making them burn for longer + - tweak: This will give a massive nerf to plasma related bombs + - tweak: I am actively seeking feedback, if the nerf to bombs is too bad we can + still tweak stuff + PKPenguin321: + - rscadd: Chainsaws (both arm-mounted and not arm-mounted) can now be used in surgeries + as a ghetto sawing tool. Arm-mounted chainsaws are a teeny bit more precise + than regular ol' everyday chainsaws. + YotaXP: + - tweak: Spruced up the preview icons on the Character Setup dialog. + incoming5643: + - rscdel: Citing shenanigan quality concerns the wizard federation has withdrawn + supermatter swords and veil renderers from spellbooks. + neersighted: + - bugfix: Make Airlock Electronics use standard ID checks, allowing Drones to use + them. +2015-11-26: + neersighted: + - tweak: Cyborg Toner is now refilled by recharging stations. + oranges: + - tweak: Removed the 'gloves' from the sailor dress which looked weird since it + was a blouse basically + - tweak: Made the skirt on the blue/red skirts less blocky, + - tweak: Made the striped dress consistent at every direction +2015-11-27: + AnturK: + - rscadd: Turret control panels can now be made through frames available at autolathe. + - rscadd: Unlocked turrets can be linked with built controls with multiool + JJRcop: + - bugfix: Restores golem shock immunity. + Kor and Ausops: + - rscadd: Added four different suits of medieval plate armour. + - rscadd: The Chaplain starts with a suit of Templar armour in his locker. God wills + it! + - rscadd: Rumour has it that Nanotrasen is now training a new elite unit of soldiers + to deal with paranormal threats. Corporate was unable to be reached for comment. + MMMiracles: + - rscadd: Adds a brand new away mission for the gateway called 'Caves'. + - rscadd: The away mission has multiple levels to explore and could be quite dangerous, + running in without proper preparation is unadvised. + YotaXP: + - bugfix: Drones can now use the pick-up verb, and watertanks no longer get jammed + in their internal storage. + bgobandit: + - rscadd: Due to changes in Nanotrasen's mining supply chain, ore redemption machines + now offer a variety of upgraded items! However, certain items are more expensive. + Point values for minerals have been adjusted to reflect their scarcity. + - rscadd: Nanotrasen R&D has discovered how to improve upon the resonator and kinetic + accelerator. + - rscadd: After a colossal tectonic event on Nanotrasen's asteroid, ores are distributed + more randomly. + - rscadd: Bluespace crystals have been discovered to be ore. They will now fit into + satchels and ore boxes. + - rscadd: Mech advanced mining scanners now include meson functionality. + neersighted: + - bugfix: Wooden Barricades now take bullet damage. + - tweak: Rebalance Wooden Barricade damage. +2015-11-28: + TechnoAlchemisto: + - tweak: Cloaks are now worn in your exosuit slot! +2015-11-29: + Firecage: + - rscadd: Hand tools now have variable operating speeds. + GunHog: + - tweak: Nanotrasen has improved the interface for the hand-held teleportation device. + It will now provide the user with the name of the destination tracking beacon. + JJRcop: + - bugfix: Fixes changeling Hive Absorb DNA ability runtime. + Joan: + - imageadd: When sacrificing a target with the sacrifice rune, Nar-Sie herself will + briefly appear to consume them. + - imageadd: When an artificer repairs a construct, there is a visible beam between + it and the target. + - imageadd: When reviving a target with the raise dead rune, there is a visible + beam between the two corpses used. + - imageadd: When draining a target with the blood drain rune, there is a visible + beam between you and the rune. + - imageadd: Construct sprites are now consistent and all bob in the air. + - rscadd: Most cult messages now use the cult span classes, though visible messages + from cult things generally do not. + - bugfix: Examining a cultist talisman as a cultist no longer causes the paper popup + to appear. + - bugfix: You no longer need to press two buttons to read a cultist tome. + - spellcheck: Cult should have a few less typos and grammatical errors. + - spellcheck: The sacrifice rune now uses the proper invocation. + KorPhaeron: + - rscadd: Guardians and holoparasites can now be manually recalled by their master. + - rscadd: The ghost controlling a guardian or holoparasite can be repicked by their + master, only one use which is removed when a new ghost is chosen. + MrStonedOne: + - rscadd: Re-adds 100% chance timed injectors, as it was removed over a misunderstanding. + - bugfix: Fixes bug with injectors having a 100% power chance despite not being + timed + - bugfix: Fixes the excessive amount of time it took the game to initialize. + - bugfix: Fixes some interface bugs. + - rscadd: when an interface window has to send a lot of resources before it can + open, it will now tell you with a "sending resources" line so you know why it's + not opening right away. + PKPenguin321: + - rscadd: Teleprods can now be constructed. Make them via tablecrafting, or by putting + a bluespace crystal onto a stunprod. They warp the target to a random nearby + area (which may include space/the inside of a wall) in addition to giving the + victim a brief stun. Like stunprods, they require a power cell to function. + - rscadd: Teleprods can have their crystal removed and be made back into stunprods + by using them in your hand when they have no cell installed. + - imageadd: Mounted chainsaws now have a unique inhand sprite. + Remie + Kor: + - tweak: Holopads now use AltClick to request the AI + Shadowlight213: + - tweak: Syndie melee mobs have been buffed. + TheNightingale: + - rscadd: Nuclear operatives can now buy the Elite Syndicate Hardsuit for 8 TC that + has better armor and fireproofing. + - tweak: Added throwing stars and Syndicate playing cards to nuclear operative's + uplink. + Yolopanther12: + - rscadd: Added the ability to use a box of lights on a light replacer to more quickly + refill it to capacity. + incoming5643: + - rscadd: OOC will now take steps to try and prevent accidental IC from people who + mistakenly use OOC instead of say. This doesn't catch all mistakes, so please + don't test it. + ktccd: + - bugfix: Blob pieces on some areas no longer count for blob mode victory (Such + as space or asteroid). + - bugfix: Blobcode no longer spawns and destroys blobs uselessly, which fixes other + stuff too. + - bugfix: Asteroid areas are no longer valid gang territory. + neersighted: + - experiment: Nanotrasen would like to announce NanoUI 2.0, now being rolled out + across all our stations. Existing NanoUI devices have been updated, and more + will be added soon. Please report any bugs to Nanotrasen Support. + - tweak: Many NanoUI interfaces have had +/- buttons replaced with input fields. + - tweak: Some NanoUI interfaces have had more information added. + - bugfix: Drones can now interact with NanoUI windows. + swankcookie: + - bugfix: Fixes issue of space-Christians forgetting about the true, humbling values + of space-Christmas. + - rscadd: Adds snowmen outfits +2015-11-30: + neersighted: + - bugfix: Nanotrasen would like to apologize for Chemistry being stuck on NanoUI + 1.0... Please report any further bugs to Nanotrasen Support. + - tweak: NanoUI becomes... difficult to operate with brain damage. Who would have + guessed? + - tweak: Telekinesis enables you to use NanoUI at a distance. + - bugfix: Canisters require physical proximity to actuate... + - bugfix: NanoUI no longer leaks memory on click. +2015-12-01: + Kor: + - rscadd: The away mission Listening Post, originally mapped by Petethegoat, has + removed as a mission. It is now present in normal deep space. + neersighted: + - tweak: Attack animations are now directional! + - rscadd: Nanotrasen brand Airlock Electronics now sport our latest NanoUI interface! + Upgrade your electronics today! + - bugfix: Cryo now knocks you out. + - bugfix: Resisting out of cryo has a delay. + - rscadd: Cryo auto-ejection can now be configured. + - rscdel: Remove Cryo eject verb (resist out). + - bugfix: Cryo works... Love, neersighted + swankcookie: + - tweak: Switches cloak usage to overclothing slot +2015-12-02: + GunHog: + - bugfix: Nanotrasen has discovered a flaw in the weapon recharging station's design + that makes it incompatible with the Rapid Part Exchange Device. This has been + corrected. + neersighted: + - tweak: You can now stop pulling by trying to pull the same object again. + - rscadd: Nanotrasen is proud to announce that even the dead can use our state of + the art NanoUI technology. +2015-12-03: + Joan: + - rscadd: Artificers now have feedback when healing other constructs, showing how + much health the target has. + - tweak: Constructs can move in space. + - imageadd: Fixes cult flooring not lining up with normal floors. + - imageadd: Fixes a juggernaut back spine not glowing where it should. + Spudboy: + - tweak: Realigned the librarian's PDA. + Swankcookie: + - bugfix: Cakehat now creates light + YotaXP: + - rscadd: Rolled out a new line of space heaters around the station. This new model + has the functionality to cool down the environment, as well as heat it. Additionally, + they can be built and upgraded like any other machine. + neersighted: + - bugfix: Dominator now shows the correct area name on non-Box maps. + - bugfix: Unwrenching atmos pipes is less... nuts... + - bugfix: You don't get hopelessly spun when standing on a unwrenched pipe... Don't + try it, though. + - tweak: You can now cancel pulling by Ctrl+Clicking anything else + - tweak: Chemistry Dispensers now have a built-in drain! +2015-12-05: + Joan: + - rscdel: Magic missiles no longer do damage. +2015-12-06: + Gun Hog: + - rscadd: Nanotrasen is proud to announce that it has improved its Diagnostic HUD + firmware to include the station's automated robot population! New features include + integrity tracking, Off/On status, and mode tracking! If your little robot friend + suddenly manages to acquire free will, you will be able to track that as well! + - tweak: Artificial Intelligence units may find that their bot management interface + now shows when a robot gains free will. This is also displayed on the Personal + Data Assistant's bot control interface. + neersighted: + - bugfix: Cryo now properly checks it is on before healing... +2015-12-07: + octareenroon91: + - rscadd: Wallets now use the access of all IDs stored inside them. + - rscadd: As the accesses of all IDs are merged, two IDs in a wallet may grant access + to a door that neither one alone would open. + - bugfix: Wallets used to be useless for access if the first ID card put into it + was taken out, until another ID card was put back in. That should not happen + anymore. +2015-12-08: + Joan: + - experiment: Revenants can no longer move through walls and windows while revealed, + though they can move through tables, plastic flaps, mobs, and other similarly + thin objects. + - tweak: Defile now reveals for 4 seconds, from 8. + - tweak: Overload lights now reveals for 10 seconds, from 8. + - tweak: Blight now reveals for 6 seconds, from 8. + - rscadd: Blight has a higher chance of applying stamina damage to the infected. + Kor: + - rscadd: The blocking system has been completely overhauled. Any held item, exosuit, + or jumpsuit can now have a chance to block, or a custom on hit effect. Different + shields can now have different block chances. + - rscadd: The clowns jumpsuit now honks when you beat the owner. + - rscadd: There is a new (admin only for now) suit of reactive armour that ignites + attackers instead of warping you. + - rscadd: Shields will no longer block hugs. Give peace a chance. + neersighted: + - tweak: MC tab reworked, more items made available. + - rscadd: Admins can now click entries in the MC tab to debug. +2015-12-09: + GunHog: + - tweak: Nanotrasen has discovered new strains of Xenomorph which resist penetration + by known injection devices, including syringes. This seems to only extend to + the large 'Royal' strains, designed 'Queen' and 'Praetorian'. Extreme caution + is advised should these specimens escape containment. + - rscadd: Ghosts may now use Diagnostic HUD. + - tweak: Feedback added for which HUD is active. + Kor: + - rscadd: Security barricades now block gunfire 80% of the time while deployed. + - rscadd: Standing adjacent to barricades will allow you to shoot over them. + MrStonedOne: + - rscadd: noslip floors make you slightly faster + Shadowlight213: + - rscadd: Admins can now interact with mos of the station's machinery as if they + were an AI when ghosting. + incoming5643: + - rscadd: a mutation of glowshrooms, glowcaps, have recently been discovered in + botany. + ktccd: + - bugfix: Blobs now require the correct amount of blobs to win that scales depending + on number of blobs, instead of a set value of 700. +2015-12-12: + Joan: + - tweak: The blob Split Consciousness ability now requires a node under the overmind's + selector, instead of picking the oldest living node to spawn a core on. + - bugfix: Revenant antagonist preference can once again be toggled from the Game + Preferences menu. + Kor: + - rscadd: You now have a chance to flip while attacking with a dualsaber. + - rscadd: Bluespace survival capsules have been added to escape pod safes. + - rscadd: Standing between activating shield generators now has disastrous consequences. + Lo6a4evskiy: + - bugfix: Ninja drains power properly, no more infinite stealth. + RemieRichards: + - rscadd: Adds a Synth Species + - rscadd: Species can now react to being force set by admins, used for Synth species +2015-12-13: + Kor: + - rscadd: Adds reactive stealth armor. Admin spawn only. +2015-12-15: + Incoming5643: + - rscadd: The summon events... event "RPG loot" now allows for items to have bonuses + of up to +15! + - rscadd: The "RPG loot" event now also improves the damage reduction of armor! + - rscadd: Check out the item mall for new item fortification scrolls! + as334: + - rscadd: New research has shown that when when plasma reaches a high enough temperature + in the presence of a carbon catalyst, it undergoes a violent and powerful fusion + reaction. + - rscadd: Adds a new gas reaction, fusion. Heat up plasma and carbon dioxide in + order to produce large amounts of energy and heat. + oranges: + - tweak: hulk no longer stuns + - tweak: John Cena +2015-12-16: + AnturK: + - rscadd: Medical Beam Gun now available for Nuclear Operatives and ERT Medics. + Joan: + - tweak: Revenant Overload Lights reveal time lowered from 10 seconds to 8 seconds, + shock damage increased from 18 to 20. + - tweak: Revenant Blight reveal time lowered from 6 seconds to 5 seconds. + Kor: + - rscadd: Styptic once again works in patches. + - rscadd: Nuke Op team leaders can now activate challenge mode if more than 50 players + are online. + - rscadd: Xenobio mobs will no longer spontaneously murder their friends if you + give them sentience + The-Albinobigfoot: + - bugfix: The Wishgranter now displays its faith in humans with curbed enthusiasm. + Tkdrg: + - experiment: Cult has been overhauled in an attempt to make the gamemode more fun. + - rscdel: Cult onversion and stunpapers have been removed. So have most cult objectives. + - tweak: The cult's single objective is now defend and feed a large construct shell + in order to summon the Geometer. + - tweak: The cult must sacrifice souls in order to acquire summoning orbs, which + must be inserted inside said shell. + - tweak: The large construct shell can be procured by using a summoning orb in hand, + but it is vulnerable to attack. + - tweak: Once enough orbs are inserted, the station will go Delta. After three minutes, + the cult will have won. + - rscadd: Cult communications now no longer damage you when done without a tome. + - rscadd: Cultists now start with a sacrificial dagger, with bleeding effects and + high throwing damage. + - rscadd: Most existing runes were buffed, merged, or removed. A Immolate rune and + a Time Stop rune were added. Experiment! + - experiment: Each cultist now gets a random set of runes in their tomes. Pool together + your knowledge in order to thrive. + neersighted: + - experiment: NanoUI 3.0 + - experiment: Completely rewrite NanoUI frontend; rework backend. + - tweak: Re-design NanoUI interface to be much more attractive. + - tweak: Reduce NanoUI LOC count/resource size. + - tweak: Reduce NanoUI tickrate; make UIs update properly. + - rscadd: Add chromeless NanoUI mode. + - rscadd: NanoUI's chromeless mode can be toggled with the 'Fancy NanoUI' preference. + - bugfix: Allow NanoUI to work on IE8-IE11, and Edge. + - bugfix: Close holes that allow NanoUI href spoofing. +2015-12-17: + Kor: + - rscadd: Security barricades are now deployed via grenade. You can no longer move + them after they've been deployed, you must destroy them. + - rscadd: You can now shoot through wooden barricades while adjacent, while any + other gunfire has a 50% chance of being blocked. + - rscadd: There are no longer restrictions against implanting the nuclear disk in + people. + - rscadd: If the station is destroyed in a nuclear blast, any surviving traitors + will complete their "escape alive" objective regardless of their location. + - rscadd: Hulks now lose hulk when going into crit, rather than at 25 health. + - rscadd: Shuttles will no longer drag random tiles of space with them. This means + you can be thrown out of partially destroyed escape shuttles very easily. + - rscadd: The people and objects on destroyed tiles won't be along for the ride + when the shuttle moves either. + - rscadd: Adds hardsuits with built in energy shielding. CTF and security versions + are admin only. + - rscadd: Nuclear operatives can buy a shielded hardsuit for 30tc. + - rscadd: Traitors can now buy a Mulligan for 4 telecrystals, a syringe that completely + randomizes your name and appearance. + - rscadd: The spy bundle now includes a switchblade and Mulligan. + MMMiracles: + - rscadd: A set of coordinates have recently reappeared on the Nanotrasen gateway + project. Ask your local central official about participation. + MrStonedOne: + - tweak: 'Ghosts can now double click on ANY movable thing (ie: not a turf) to orbit + it' + PKPenguin321: + - rscadd: Dope golden necklaces have been added. They're a jumpsuit attachment like + ties and are completely cosmetic. + - rscadd: Dope necklaces can be bought from the clothesmate with a coin. Three are + in the clothesmate by default, so you can get your posse going. Gangs that aren't + Sleeping Carp can also purchase necklaces for 1 influence each. Dope. + xxalpha: + - tweak: Restores the ability to bolt and unbolt operating airlocks. +2015-12-18: + Incoming5643: + - rscadd: Soon to be blobs in blob mode can now burst at their choosing. However + they will still burst if they wait too long. + - rscadd: Burst responsibly. + Joan: + - rscadd: 'New blob chemicals:' + - rscadd: Pressurized Slime, which is grey, does low brute, oxygen, and stamina + damage, but releases water when damaged or destroyed. + - rscadd: Energized Fibers, which is light yellow, does low burn damage, high stamina + damage, and heals if hit with stamina damage. + - rscadd: Hallucinogenic Nectar, which is pink, does low toxin damage, causes vivid + hallucinations, and does some bonus toxin damage over time. + - tweak: Replaces Kinetic Gelatin with Reactive Gelatin, which does less brute damage, + but if hit with brute damage in melee, damages all nearby objects. + - wip: 'Changes three of the old blob chemicals:' + - tweak: Ripping Tendrils does slightly more stamina damage + - tweak: Envenomed Filaments no longer causes hallucinations, but does some stamina + damage in addition to toxin damage over time. + - tweak: Cryogenic Liquid will freeze targets more effectively. + Kor: + - rscadd: Shooting someone who is holding a grenade has a chance to set the grenade + off. + - rscadd: Shooting someone who is holding a flamethrower has a chance to rupture + the fuel tank. + - tweak: Shields have a bonus against blocking thrown projectiles. + Swankcookie: + - rscadd: lanterns no longer turn into flashlights when you pick them up. + bgobandit: + - rscadd: Lizard tails can now be severed by surgeons with a circular saw and cautery, + and attached the same way augmented limbs are. + - rscadd: The Animal Rights Consortium is horrified by Nanotrasen stations' sudden + rise of illegal lizard tail trade, with such atrocities as lizardskin hats, + lizard whips, lizard clubs and even lizard kebab! + neersighted: + - tweak: NanoUI should now load much faster, as the filesize and file count have + been reduced +2015-12-20: + Joan: + - tweak: Reduces Lexorin Jelly's oxygen damage significantly. + - experiment: Blobbernaut chemical application on attack is back, but much less + absurd this time; blobbernauts with an overmind will do 70% of the normal chem + damage(plus 4) and attack at a much slower rate than the blob itself can. + - wip: As an example, a blobbernaut with the Ripping Tendrils chemical would do + 14.5 brute and 10.5 stamina damage per hit. + Kor: + - rscadd: Adds reactive tesla armour. Adminspawn only. + - rscadd: Adds the legendary spear, Grey Tide. Admin only. + - rscadd: Nuke Ops can now purchase penetrator rounds for their sniper rifles. + - rscadd: Nuke ops can now purchase additional team members for 25 telecrystals. + They don't come with any gear other than a pistol however, so remember to save + some points for them. + - rscadd: Nuke Ops now have an assault pod. A 30tc targeting device will allow you + to select any area on the station as its landing zone. The pod is one way, so + don't forget your nuke. + - rscdel: The teleporter board is no longer available for purchase in the uplink. + - rscdel: After finding absolutely nothing of value, Nanotrasen away teams placed + charges and scuttled the abandoned space hotel. + - rscadd: Metastation now has xenobiology computers. + - rscadd: Metastation now has escape pod computers. + - rscadd: A distress signal has been detected broadcasting in an asteroid field + near Space Station 13. + - rscadd: Clicking the (F) follow link for AI speech will now make you orbit their + camera eye. + MMMiracles: + - tweak: The SAW has been revamped slightly. It now requires a free hand to fire, + but includes 4 new ammo variants along with a TC cost decrease for both the + gun and the ammo boxes. + MrStonedOne: + - bugfix: Fixes ghost orbit breaking ghost floating + - bugfix: Fixes orbiting ever breaking golem spawning + - bugfix: 'Fixes orbiting ever preventing that ghost from showing up in pictures + taken by ghost cameras resdel: Fixes being able to break your ghost sprite by + multiple quick consecutive orbits (FINAL SOLUTION, PROVE ME WRONG YOU CAN''T)' + Remie: + - rscadd: 'Byond members can now choose how their ghost orbits things, their choices + are: Circle, Triangle, Square, Pentagon and Hexagon!' + - tweak: orbit() should be much cheaper for clients now, allowing those of you with + potato PCs to survive mega ghost swirling better. + incoming5643: + - bugfix: the terror of double tailed lizards and featureless clones should now + be over + - rscdel: the emote *stopwag no longer works, just *wag again to stop instead +2015-12-21: + AnturK: + - tweak: Ghost HUD and Ghost Inquisitiveness toggles are now persistent between + rounds. + Kor: + - rscadd: Malfunctioning AIs have been merged with traitor AIs. They no longer appear + in their own mode. + - rscadd: Hacking APCs now gives you points to spend on your modules. Save up enough + points and you can buy a doomsday device on a 450 second timer. + - rscadd: The detectives revolver reskins on alt click now. + - rscadd: You can now dual wield guns. Firing a gun will automatically fire the + gun held in your off hand if you are on harm intent. + LanCartwright: + - tweak: The TC costs for nuke ops have been rebalanced. Guns, viscerators and mechs + are cheaper, ammo and borgs are more expensive. + - rscadd: Most guns can now be bought in bundles, together with some ammo and freebies + for a special discount. + The-Albinobigfoot: + - rscadd: Nuclear Operative families may once again requisition ultra-adhesive footwear. +2015-12-22: + Iamgoofball: + - rscadd: Tesla engine has been added alongside the singularity engine to all maps. + Joan: + - wip: 'Adds three new blob chemicals:' + - rscadd: Replicating Foam, which is brown, does brute damage, has bonus expansion, + and has a chance to expand when damaged. + - rscadd: Sporing Pods, which is light orange, does low toxin damage, and has a + chance to produce weak spores when expanding or killed. + - rscadd: Synchronous Mesh, which is teal, does brute damage and bonus damage for + each blob tile near the target, and splits damage taken between nearby blobs. + - experiment: Synchronous Mesh blobs take 25% more damage, to compensate for the + spread damage. + Kor: + - rscadd: Cayenne will no longer be targeted by the syndicate turrets. + - tweak: Energy shields now only reflect energy projectiles. + - rscadd: Added accelerator sniper rounds to uplink, a weak projectile that ramps + up damage the farther it flies. + MMMiracles: + - bugfix: Saber magazines have been dropped to 21 per magazine. When asked, Nanotrasens + official ballistic department replied "There is indeed such a thing as too much + bullet." + Xhuis: + - tweak: Stun batons can now be blocked by shields, blocked hits don't deduct charge. + xxalpha: + - rscadd: Janitor cyborgs now have a bottle of drying agent. +2015-12-25: + Joan: + - rscdel: The blob Split Consciousness ability has been removed. + - tweak: The blob mode now spawns more roundstart blobs, instead. + Kor: + - rscadd: AI holograms no longer drift in zero gravity + LanCartwright: + - tweak: Shotguns shells now have one extra pellet. + MrStonedOne: + - bugfix: Screen shakes will no longer allow you to see through walls + - tweak: Screen shakes will now move with you when moving rather than lag your client + behind your mob + - tweak: Screen shakes are now less laggy in higher tickrates +2015-12-26: + Buggy123: + - tweak: Salicyclic Acid now rapidly heals severe bruising and slowly heals minor + ones. + Iamgoofball: + - tweak: Telsa energy ball now shoots only a single, powerful beam of lightning + that can arc between mobs. + - soundadd: Energy ball can now be heard when near-by. + Incoming5643: + - tweak: Animated objects now revert if they have no one to attack for a while. + - rscadd: Added Golden revolver, a powerful sounding gun with large recoil. + Kor: + - rscadd: Transform Sting is now actually functional. + MrStonedOne: + - tweak: Movement in no gravity now allows you to push off of things only dense + to some mobs if it is dense to you (such as tables/blob tiles) rather than just + objects that are only dense to all mobs. + - bugfix: Long/timed actions will now cancel properly if you move and quickly move + back to the right location. +2015-12-27: + Joan: + - rscadd: Overmind-created blobbernauts are now player-controlled if possible. + - tweak: Creating a blobbernaut no longer destroys the factory, instead doing heavy + damage to it and preventing it from spawning spores for one minute. + - tweak: You cannot spawn blobbernauts from overly damaged factories. + - rscadd: Procedure 5-6 may be issued for biohazard containment under certain situations. + - tweak: Blobs will now burst slightly later on average, and the nuke report with + the nuke code will arrive slightly earlier. + Kor: + - soundadd: Spacemen now announce when they are changing magazines. + - rscadd: Command headsets now have a toggle to let you have larger radio speech. + LanCartwright: + - rscdel: The Syndicate Ship no longer spawns with Bulldog shotguns, operative have + been given 10 extra telecrystals instead. + MrStonedOne: + - bugfix: Flashes that were emp'ed were incorrectly flashing people in range of + the emper, not in range of the flash. + - tweak: Flashes in a mob's inventory that are emp'ed will only aoe stun if it is + not inside of a container like a backpack/box +2015-12-28: + AnturK: + - rscadd: You can now write an entire word with crayons by setting it as a buffer + and then clicking the target tiles in the right order. + Joan: + - rscdel: Blobbernauts can no longer smash walls of any type. + MrStonedOne: + - tweak: Progress bars now have 20 states instead of 5. + - bugfix: Bump mining should be fixed. + - tweak: Long actions now checks for movement/changed hands/etc more often to prevent + edge cases. + - tweak: Multiple progress bars will now stack properly, rather than fight each + other for focus. + Ressler: + - rscadd: Adds the reagent Haloperidol. + - rscadd: It is an anti-drug reagent, good for stopping assistants hyped up on meth, + bath salts, and equally illegal drugs. + - rscadd: It can be made with Chlorine, Fluorine, Aluminum, Potassium Iodide, and + Oil. + neersighted: + - bugfix: Make NanoUIs transfer upon (un)ghosting. + - bugfix: Fix NanoUIs jumping when resized/dragged. + - bugfix: Lots of other NanoUI bugs. +2015-12-31: + Bawhoppen: + - rscadd: Nanotrasen has opened the availability of tactical SWAT gear to station's + cargo department + - rscadd: Due to a new trade agreement with Chinese space suit manufacturers, Nanotrasen + can now obtain basic space suits much cheaper; This has been reflected in the + cargo prices + - rscadd: Amateur medieval enthusiasts have found a quick way to easily make wooden + bucklers. + Joan: + - imageadd: Replaced every book sprite in the game with new, consistent versions. + - imageadd: Except the one-use wizard spellbooks, which already got new sprites. + PKPenguin321: + - rscadd: Chest implants have been added that allow you to morph your arms into + a gun and back at will. There are two variants, a taser version and a laser + version. Both versions are self-charging. Getting EMPed with one of these implants + results in the implant breaking and loads of fire damage. The implants are currently + admin-only. + - tweak: The telecrystal price for thermal imaging goggles has been lowered from + 6 to 4. + incoming5643: + - rscadd: The wizard federation has finally updated their assortment of guns for + the summon guns event. Look forward to getting shot in the face with a whole + new batch of interesting and rarely seen weaponry! +2016-01-01: + Iamgoofball: + - experiment: Redid how objectives are assigned, they're now a lot more random in + terms of what you can get. + Incoming5643: + - tweak: Removed gender restrictions from socks. + Joan: + - rscdel: Storage Blobs are gone; they were effectively a waste of resources, as + there are more or less no points at which you should need them, unless you were + winning excessively hard. + - rscdel: Blobs can no longer burst early; instead, the button gives some early + help and serves to indicate you're a blob. + - wip: Blobbernauts now poll candidates instead of grabbing a candidate immediately. + The poll is 5 seconds, so that there's no significant pause between making a + blobbernaut and it doing stuff. + - rscadd: Blobbernaut creation replaces Storage Blob creation on the blob HUD. + - tweak: Overmind communication is now much larger and easier to see, and blob mobs, + such as blobbernauts, will hear it. + Kor: + - rscadd: The wizard has a new spell, Lesser Summon Guns. This summons an unending + stream of single shot bolt action rifles into his hands, automatically replacing + themselves as you fire. + - bugfix: Fixes successive generations of grey tide clones not despawning. + - tweak: Using challenge ops now delays shuttle refuel. + - rscadd: Added a new wizard event, Advanced Darkness. + MrStonedOne: + - experiment: GHOST POPUP RE-WORK + - bugfix: Ghost popups will no longer steal focus + - bugfix: Ghost popups will no longer submit on key press (regardless of focus) + unless you tab to a button first + - tweak: Ghost popups will close themselves after the time out has ended + - rscadd: Ghost popups are now themed. + - tweak: Long actions (like resisting out of handcuffs) will no longer count space/nograv + drifting as the user moving. + - tweak: This does not apply to the target of a long action if that target isn't + you. Pulling something while space drifting and working on it intentionally + won't work. +2016-01-02: + Kor: + - rscadd: Guardians/Parasites are now named after constellations, and have new sprites + from Ausops. + Kor and GunHog: + - rscadd: Malfunctioning AIs can now purchase Enhanced Surveillance for 30 points, + which allows them to "hear" with their camera eye. + MMMiracles: + - rscadd: A distress signal was recently discovered with gateway coordinates attached + to a far-off research facility owned by Nanotrasen. The signal was sent out + in hopes of someone competent receiving it, unfortunately, your station was + the only one to respond. Local security forces may not be welcoming your arrival + group with open arms. +2016-01-07: + KorPhaeron: + - tweak: Doubled cost of Lesser Summon Guns to 4 and increased charge time to 75 + seconds. + TrustyGun: + - rscadd: 'Added two new UI styles: black and green Operative and pale green Slimecore.' +2016-01-09: + Wjohnston: + - wip: AI Satellite has been remapped to make it more secure. +2016-01-11: + Joan: + - rscdel: Blob cores and nodes no longer cause normal pulsed blobs to animate. Factories + and resource nodes will still animate. + - imageadd: Holoparasite sprites have been updated again, are now named after silvery + metals and flowers and can also be colored purple, blue or yellow. + xxalpha: + - tweak: Pipes and cables under walls, intact floors, grilles and reinforced windows + will now be shielded from explosions until exposed. +2016-01-13: + Joan: + - imageadd: Alien whisper ability has a new icon + MrStonedOne: + - tweak: Control clicking on the thing you are pulling will no longer unpull, instead + control clicking on anything too far away to be pulled will unpull. (reminder + that the delete key also unpulls) + OneArmedYeti: + - imageadd: To help with colorblindness, gang HUDs have been changed so leaders + have a border and normal gangster icons are smaller. +2016-01-15: + Joan: + - bugfix: Holoparasites can no longer beat their owner to death while inside of + them. + - spellcheck: Updates traitor holoparasite descriptions for accuracy. + - spellcheck: Adds 8 additional silvery metals to the holoparasite name pool. + - imageadd: Adds two new holoparasite colors, light purple and red. + - imageadd: Holoparasite HUD buttons now have new sprites. + - imageadd: Adds glow effects when guardians teleport or recall, including fire + guardian teleporting and support guardian teleporting. + Kor: + - rscadd: Washing machines are activated via alt+click rather than a right click + verb. +2016-01-16: + Joan: + - imageadd: Alien queens and praetorians have suitably large speechbubbles. + - imageadd: Syndicate cyborgs and syndrones have suitably evil robotic speechbubbles. + - imageadd: Blob mobs have suitably uncomfortable-looking speechbubbles. + - imageadd: Holoparasites and guardians have suitably robotic and magical speechbubbles. + - imageadd: Swarmers have suitably holographic speechbubbles. + - imageadd: Slimes have suitably slimy speechbubbles. +2016-01-17: + Joan: + - bugfix: You can once again repair a hacked APC by using an APC frame on it instead + of welding it off the wall, at the same stage as you'd weld it off the wall. + MrStonedOne: + - bugfix: Control clicking on a turf now un-pulls +2016-01-19: + neersighted: + - rscadd: Many many interfaces have been ported to tgui; uplinks and MULEbots being + the most important + - rscadd: You can now tune radios by entering a frequency + - bugfix: Air Alarms now support any gas +2016-01-23: + neersighted: + - experiment: Refactor wires; port wire interface to tgui. + - rscadd: Wire colors are now fully randomized. + - rscdel: Remove pizza bombs, as the code and sprites were terrible. + - rscadd: Add pizza bomb cores, which can be combined with a pizza box to make a + pizza bomb. + octareenroon91: + - bugfix: Chemistry machinery should now all equally accept beakers, drinking glasses, + etc. +2016-01-27: + Joan: + - tweak: Golems have about a 40% chance to stun with punches, from about 60%. + - tweak: Millitary Synths have about a 50% chance to stun with punches, from literally + 100%. + - wip: Blobbernaut creation costs 30 points, and does much more damage to the factory. + - rscdel: Blob factories regenerate at half normal rate. + - tweak: Blob reagents tweaked; + - rscadd: Ripping Tendrils does slightly more brute damage, but less stamina damage. + - rscdel: Lexorin Jelly does less brute damage. + - rscadd: Energized Fibers does slightly more burn damage. + - rscadd: Sporing Pods does slightly more toxin damage. + - rscadd: Replicating Foam will try to replicate when hit more often. + - rscadd: Hallucinogenic Nectar does slightly more toxin damage and causes hallucinations + for longer. + - rscadd: Cryogenic Liquid does more burn damage. + - experiment: Synchronous Mesh does slightly less damage with one blob but massive + damage with more than one nearby blob. + - rscdel: Dark Matter does less brute damage. + - rscdel: Sorium does slightly less brute damage. + - rscdel: Pressurized Slime has a lower chance to emit water when killed and when + attacking targets. + - tweak: Supermatter explosion is no longer capped, and under normal conditions + will produce a 8/16/24 explosion when delaminating. + - imageadd: Blob tiles now do an attack animation when failing to expand into a + turf. + - imageadd: Overmind-directed expansion is more visible than automatic expansion. + Kor: + - rscadd: Capture the flag has been added in space near central command. The spawners + are disabled by default, so be sure to harass admins when you die until they + let you play. The arena was mapped by Ausops. + - rscadd: Nuke ops can purchase mosin nagants for 2 telecrystals. + MrStonedOne: + - bugfix: Fixes the powersink drawing less power than the smeses put out. + - tweak: Made the powersink hold significantly more power before overloading and + going boom. + - tweak: Buffed the explosion of the power sink when it overloads. You are suggested + to think twice about wiring the engine to the grid. + PKPenguin321: + - rscadd: The Autoimplanter, a device that can insert cyberimplants into humans + instantly and without the need of surgery, has been added to the game. It is + currently only obtainable by nuke ops, by way of being included in the Box of + Implants. +2016-01-28: + Joan: + - rscadd: Blobs can communicate before bursting to allow for more coordination. + Kor: + - rscadd: Butchering mobs by attacking them with sharp objects will only happen + on harm intent. This means it is possible to do surgery on aliens again. +2016-01-29: + Joan: + - rscadd: Holoparasites can now see their summoner's health at all times. The health + displayed is a percentage, with 0 being dead. + - imageadd: Holoparasites now have visual flashes on the summoner's location when + recalled due to range limits and when manifesting. + Kor: + - rscadd: Red xenobio potions now work on vehicles (janitor cart, ATV, secway, etc), + causing them to go faster. + - rscadd: Stuffing people in bins uses clickdrag instead of grab. +2016-01-30: + Boredone: + - tweak: Due to an experiment gone wrong, the Research Director's Teleport Armor + now causes some mild radiation poisoning on teleportation to the wearer. + Francinum: + - rscadd: Added two new female underwear styles. + Kor: + - rscadd: You can now use the abandoned white ship as an escape route at round end. + This is possible on Box, Meta, and Dream. + - rscadd: Added support so that mappers can make any shuttle function as an escape + shuttle. + MMMiracles: + - rscadd: Three new bra sets have been added for the ladies out there who want to + show their patriotism. + xxalpha: + - rscadd: Blueprints will now allow the expansion of an existing area by giving + its name to a new adjacent area. + - rscadd: Added a no power warning cyborg verb to Robot Commands. +2016-01-31: + Kor: + - rscadd: Added a special AI upgrade disk that allows normal AIs to use malf modules + and hack APCs. It is admin only. + - rscadd: Added an AI upgrade disk that grants AIs the lipreading power. It is admin + only. +2016-02-01: + Erwgd: + - rscadd: The Kitchen Vending machine now stocks salt shakers and pepper mills! + - rscadd: The NutriMax now stocks spades, cultivators and plant analyzers. + - rscadd: Rice seeds are now stocked in the MegaSeed Servitor, and the seeds supply + crate now contains a pack of rice seeds. + - rscdel: Botanists should be aware that wheat stalks can no longer mutate into + rice. + Fayrik: + - rscadd: pAI cards can now be inserted into simple robots, to allow for more robust + robot personalities. + PKPenguin321: + - rscadd: You can now store knives, pens, switchblades, and energy daggers in certain + types of shoes (such as jackboots, workboots, winter boots, combat boots, or + no-slips). + - rscadd: Horns can now be stored in clown shoes. Honk. + TrustyGun: + - rscadd: Adds gag handcuffs to the prize pool for arcade machines. They act like + regular handcuffs, but you break out of them in a second. + WJohnston: + - rscadd: Adds missing booze & soda dispenser, library console, fixes door access + and a few other minor things to Efficiency Station + - rscadd: Also adds direction tags so people can find their way around better. + bgobandit: + - rscadd: On Valentine's Day, all spacemen will receive candy hearts and valentines + for their special someones! Label valentines with a pen. + - rscadd: Note that today is not Valentine's Day. +2016-02-05: + Joan: + - experiment: Blob expansion is faster near the expanding blob, but slower further + away from it. + - tweak: Blob spores produce a slightly larger smoke cloud when dying. Sporing Pods + spores and blob zombies produce the current small cloud. + - rscdel: Blobbernauts can no longer pull anything at all. + - tweak: Blobbernauts health reduced to 200, but blobbernauts now take half brute + damage. + - tweak: Blobbernauts now take massive damage from fire. + - tweak: Blobbernauts do approximately 3 more damage when attacking. + - wip: Replicating Foam will expand more actively when damaged. + - rscadd: Adds Electromagnetic Web, which is light blue, does burn damage and EMPs + targets, and causes a small EMP when dying. + - rscadd: Electromagnetic Web takes more damage; a normal blob that hasn't been + near a node or the core for 6~ seconds can be oneshotted by a laser. + - rscadd: Anomalies, such as pyroclastic and vortex anomalies, now appear at the + bottom of the ghost orbit and observe menus. + Kor: + - rscadd: Nuke ops can purchase sentience potions for 4tc + MMMiracles: + - tweak: Bulldog now starts with stun-slugs instead of its usual 60-brute slugs. + Slugs now cost 3 TC instead of 2. + - tweak: Most SAW ammo has been slightly buffed in damage so maybe it'll be worth + buying now along with a slight cost decrease for the gun itself. + - tweak: Incen shells for the shotgun now apply extra firestacks on hit so it actually + sets people on fire instead of turning them into a light show. + - tweak: Incen rounds for the SAW now leave a fire trail similar to the bulldog's + dragonsbreath round. + - rscadd: Nuke Ops now have the ability to purchase breaching shells, a weaker variant + of the meteorslugs that can still push back people/airlocks/mechs/corgis. + - bugfix: SAW should now use its in-hand sprites for an open-closed magazine + PKPenguin321: + - rscadd: You can now sharpen carrots into shivs by using a knife or hatchet on + them. + bgobandit: + - rscadd: Seven new emoji have been added to hasten the death of the English language. + octareenroon91: + - rscadd: Player-controlled medibots can examine a patient to know what chems are + in the patient's body. + - bugfix: autolathes have been showing extra copies of the hacked designs, but no + more. +2016-02-06: + LordPidey: + - rscadd: Added suicide command for pipe valves. It's quite messy. + Lzimann: + - tweak: Combat Mechas now have a increased chance of destroying a wall with punches + (40% for walls and 20% for reinforced walls)! + - rscadd: Combat mechas can now destroy tables and racks with a punch! + neersighted: + - rscadd: The Syndicate has stolen the latest tgui improvements from Nanotrasen! + All uplinks now feature filtering/search. + - rscadd: Nanotrasen is proud to announce its next generation sleepers, featuring + tgui! + - rscadd: Portable atmospheric components have been overhauled to use the latest + interface technology. + - rscdel: The Area Atmosphere Computer has been removed. + - rscadd: Huge scrubbers now require power. + - rscdel: Borg jetpacks are now refilled from a recharger and not a canister. + - rscadd: Power monitors now have a state of the art graph. Hopefully they're actually + useful to someone. + - rscadd: Cargo consoles have been redesigned and now feature search and a shopping + cart! +2016-02-08: + Incoming5643: + - rscadd: Poly will now speak a line or emote when pet. + - rscadd: Poly now responds to getting fed crackers by becoming more annoying for + the round. + - experiment: Every day he is growing stronger + Kor: + - rscadd: A certain hygiene obsessed alien is now obtainable via xenobiology gold + cores. + - rscadd: Add laserguns with swappable, rechargeable magazines. They are adminspawn + only. + - rscadd: Operatives now get their pinpointers in their pocket when they spawn, + meaning reinforcements automatically come with them (and hopefully people stop + forgetting them in general). + - rscadd: Capture the flag now features a high speed instagib mode, with guns courtesy + of MMMiracles. + phil235: + - tweak: The vision updates for mobs are now instantaneous (e.g. you don't have + to wait one second to see again when removing your welding helmet) + - tweak: Your vision is now affected when you're inside something or viewing through + a camera. You can no longer see mobs or objects when ventcrawling (unless you + have xray for example), an xray user viewing through a camera do not see through + walls around the camera. On the other hand, cameras with an xray upgrade let + you see through walls. Unfocused camera now give you the same effect as when + you are nearsighted. Being inside closets, morgue container and disposal bins + give you some vision impairments. + - rscadd: The ability to toggle your hud on and off (with f12) is now available + to all mobs not just humans. +2016-02-09: + AnturK: + - rscadd: Syndicate Operatives can now buy bags full of plastic explosives for 9 + TC. + Gun Hog: + - rscadd: '"Nanotrasen has drafted a design for an exosuit version of the medical + nanite projector normally issued to its Emergency Response Personnel. With sufficient + research, a prototype may be fabricated for field testing!"' + incoming5643: + - rscadd: The wizard spell wild shapeshift has been made less terrible. + neersighted: + - rscadd: Internals tanks now provide an action button + - rscadd: Jetpacks now emit the gas consumed for propulsion onto their turf + - rscdel: Jetpacks no longer have object verbs + - rscdel: tgui no longer has internals buttons + - bugfix: Malf AI's flood ability now correctly sets vent pressure bounds -- the + results are devastating... Try it! +2016-02-10: + Joan: + - rscadd: Blob mobs now heal for 2.5% of their maxhealth when blob_act()ed, basically + whenever they're on blobs near a node or the core. + - tweak: Blob expansion no longer has a chance to fail inversely proportional with + the expanding blob's health. Blobs still, however, expand at roughly the same + rate as they do currently. + - experiment: Adds five new blob chemicals. + - rscadd: Adds Penetrating Spines, which is sea green and does brute damage through + armor. The damage can still be reduced by bio protection. + - rscadd: Adds Explosive Lattice, which is dark orange and does brute damage to + all mobs near the target. Explosive Lattice is very resistant to explosions. + - rscadd: Adds Cyclonic Grid, which is a light blueish green and does oxygen damage, + in addition to randomly throwing or pulling nearby objects. + - rscadd: Adds Zombifying Feelers, which is a fleshy zombie color and does toxin + damage, in addition to killing and reviving unconscious humans as blob zombies. + - rscadd: Adds Regenerative Materia, which is light pink and does toxin damage, + in addition to making the attacked mob think it is at full health. + - wip: Tweaks some of the existing blob chemicals slightly. + - rscadd: Sporing Pods can produce spores when killed by damage less than 21, from + less than 20. This means lasers can produce spores. + - rscadd: Reactive Gelatin has a slightly higher maximum damage and will attack + the nearby area when hit with brute damage projectiles, from just when attacked + by brute damage in melee. + - tweak: Sorium, Dark Matter, and the new Cyclonic Grid will not throw mobs with + the 'blob' faction, such as blobbernauts and spores. + Kor: + - rscadd: The chaplain can now transform the null rod into a holy weapon of his + choice by using it in hand. Each one has different strengths and drawbacks. + MrStonedOne: + - tweak: Tesla balance changes + - tweak: Tesla will now require increasingly more energy to trigger new orbiting + balls. First ball comes with 32 energy (down from 300), fourth requires 256 + (down from 1200), and so on and on, doubling with each new ball. Balls after + 7 are increasingly harder to get than before, whereas balls before 6 are easier + to get. + - rscadd: MULTIBOLT IS BACK! + - tweak: Be warned that in multibolt all but 1 primary bolt now have a random shocking + range, meaning they may still target a close human over a far away grounding + rod as the rod may be out of range. + - tweak: Power output of tesla massively dropped, it should no longer put out almost + twice the power of a stage 3 singulo with maxed collectors without any balls, + you'll need at least 3 balls for that now. + - tweak: Tesla can now lose power, causing ball count to drop. Tesla will never + shrink out of existence, just lose its balls. + - tweak: Tesla is now more likely to head in the direction of the thing it last + zapped. + PKPenguin321: + - rscadd: Chameleon Jumpsuits now have slight melee, bullet, and laser protection. + - tweak: The armor values for security helmets, caps, and berets have all been brought + in line. Consequently, helmets and berets are a teeny bit better, and caps now + have the slight bomb protection that the other two had. + - experiment: The time needed to complete most tablecrafting recipes has been cut + in half to make tablecrafting less annoying to use. + Shadowlight213: + - rscadd: pAI controlled mulebots can now run people over. + - tweak: Mulebot health has been greatly decreased. + neersighted: + - rscadd: Horizontal (lying) mobs now fit into crates + - rscadd: Mobs may now be stuffed into crates, as with lockers + - rscadd: Stuffing into a locker deals a mild stun (the same as tabling) + octareenroon91: + - rscadd: New designs can now be added to Autolathes via a design disk. Simply use + a disk containing a suitable design on your autolathe. +2016-02-11: + neersighted: + - rscdel: Remove all cyborg jetpacks... They were awful... + - rscadd: Adds borg ion thrusters, which are available as an upgrade module for + any borg. + - rscdel: Jetpack stabilizers are always on, but now we have... + - rscadd: Jetpack turbo mode, to move at sanic speed in space. +2016-02-12: + Kor: + - rscadd: Malf AIs can now get the objective to have a robot army by the end of + the round. + - rscadd: Malf AIs can now get the objective to ensure only human crew (no mutants) + are on the shuttle at round end. + - rscadd: Malf AIs can now get the objective to prevent a crewmember from escaping + the station, while requiring that crewmember still be alive. + neersighted: + - rscadd: Cybernetic implants purchased from the uplink now include a free autoimplanter! + octareenroon91: + - rscdel: You can no longer kill yourself with the SORD + - rscadd: Suicide attempts with the SORD will inflict 200 stamina damage. You will + only die of shame. + - bugfix: Cleanup to suicide verb code. +2016-02-13: + Buggy123: + - rscadd: You can now build cable coils using the autolathe. + Fox McCloud: + - bugfix: Fixes the sleeping carp martial arts grab not being an instant aggressive + grab + KazeEspada: + - rscadd: 'New backpack options available! New options include: Department Bags, + Leather Satchels, and Dufflebags!' + Kor: + - rscadd: Chainsaw sword, force weapon, and war hammer have all been added as Chaplain + weapon options. + Malkevin: + - tweak: Tracking implants have been upgraded. The old clunky manually adjusted + number system has been replaced with an automated ID scanner, this will show + the implant carrier's name on both the Prisoner Management Console and the hand + tracker. Happy deep striking! + PKPenguin321: + - tweak: 'Traitor EMP kits have had their cost reduced from 5 to 2, and no longer + contain the EMP flashlight. rcsadd: EMP flashlights can now be bought separately + for 2 TCs.' + Zerrien: + - rscadd: Conveyor pieces can be placed as corner pieces when building in non-cardinal + directions. + - rscadd: Using a wrench on a conveyor rotates it while in place. + neersighted: + - tweak: Gibtonite can now be pulled. + - tweak: Slowdown factors are ignored when in zero gravity. + phil235: + - rscadd: Brains can no longer be blinded. + - bugfix: Fixes brain being immortal. They are immune to everything but melee weapon + attacks. Brains not inside a MMI can now be attacked just like MMIs. Damaged + brain can't be put into a robot, they can still be put inside a brainless humanoid + corpse and cloned, but deffibing the corpse always fails (can't revive someone + with a brain beaten to a pulp). +2016-02-14: + Joan: + - rscadd: Blobbernauts can now speak to overminds and other blobbernauts with :b + - rscadd: Blobs can now expand onto lattices and catwalks. + - rscdel: Blob expansion on space tiles with no supports is much slower. + - tweak: Blob Sorium and Dark Matter now have less range on targets with bio protection. + - tweak: Blob Sorium does slightly less damage. +2016-02-17: + Fox McCloud: + - tweak: Laser eyes mutation no longer drains nutrition + Joan: + - rscdel: The sleeping carp gang no longer has special equipment and an inability + to use pneumatic cannons. + PKPenguin321: + - tweak: The traitor surgery bag now costs 3 TC, down from 4. + Zerrien: + - rscadd: adds unique icons for the two medical patch types +2016-02-18: + Kor: + - rscadd: 'Four more chaplain weapon options have been added: hanzo steel, light + energy sword, dark energy sword, and monk''s staff.' +2016-02-19: + AnturK: + - rscadd: Chairs and stools can now be picked up and used as weapons by dragging + them over your character. + PKPenguin321: + - rscadd: The cleanbot uprising has begun. + - rscadd: Emagged cleanbots are much scarier now. Standing on top of one will yield + very devastating results, namely in the form of powerful flesh-eating acid. +2016-02-20: + CPTANT: + - tweak: Due to new crystals Nanotrasen lasers weapons may now set you on FIRE. + Joan: + - imageadd: Blobbernauts and blob spores now have a visual healing effect when being + healed by the blob. + xxalpha: + - rscadd: 'New event: Portal Storm.' + - rscadd: Kinetic accelerators now reload automatically. +2016-02-24: + CPTANT: + - tweak: stamina regeneration is now 50% faster. + Joan: + - rscadd: Revenants now have an essence display on their HUD + - rscadd: Revenants retain the essence cap from the previous revenant when reforming, + minus any perfect souls. + - rscadd: Revenants can now toggle their night vision. + - tweak: Revenant Defile has one tile more of range, but does less damage to windows. + - tweak: Revenant Blight kills space vines and glowshrooms slightly more rapidly. + - tweak: Delays before appearing when harvesting are slightly randomized. + - tweak: Revenant fluff objectives have been changed to be slightly more interesting. + RemieRichards: + - rscadd: Cursed heart item for wizards, allows them to heal themselves in exchange + for having to MANUALLY beat their heart every 6 seconds. Heals 25 brute/burn/oxy + damage per correctly timed pump. + Steelpoint: + - tweak: Syndicate engineers have reinforced the exterior of their stealth attack + ships. Nuclear Operative ship hull walls are now, once again, indestructible. + - tweak: In addition Syndicate engineers had the opportunity to revamp the interior + of stealth attack ships. The inside of Op ships now has a slightly new layout, + including a expanded medbay, as well as additional medical and explosive equipment. + - rscadd: Thanks to covert Syndicate operatives, strike teams can now bring the + stealth attack ship within very close proximity to the station codenamed 'Boxstation'. + A new ship destination labeled 'south maintenance airlock' is now available + to Op strike teams. + phil235: + - rscadd: Holo tape is replaced by holo barriers. + - rscadd: The action button of gas tanks and jetpacks now turn green when you turn + your internals on. +2016-02-26: + Iamgoofball: + - rscadd: Adds the Chameleon Kit to uplinks for 4 telecrystals containing a Chameleon + Jumpsuit/Exosuit/Gloves/Shoes/Glasses/Hat/Mask/Backpack/Radio/Stamp/Gun/PDA. + - rscadd: The chameleon gun fires no-damage lasers regardless of what it looks like. + - rscadd: The Voice Changer has been merged into the Chameleon Mask. + - rscadd: No-slip shoes have been combined into Chameleon Shoes. + - rscdel: Space Ninjas no longer have voice changing capabilities. + - rscdel: The Chameleon Jumpsuit has been replaced by the Chameleon Kit in the uplink + for the same price. + - tweak: All chameleon clothing items have lost EMP vulnerability. + - tweak: Chameleon equipment provides very minor armor. + - experimental: Agent ID Cards can now use chameleon technology to look like any + other ID card. + - bugfix: The Chameleon Kit is actually purchasable now. It doesn't give a single + chameleon jumpsuit anymore. + PKPenguin321: + - rscadd: The kitchen vendor now contains two sharpening blocks. + - rscadd: Only items that are already sharp (such as fire axes, knives, etc) can + be sharpened. Items used on sharpening blocks become sharper and deadlier. The + sharpening blocks themselves can only be used once, and you can only sharpen + items once. + - tweak: The EMP kit has been buffed. It now contains five EMP grenades, up from + two. + - tweak: The EMP implant found in the EMP kit has been buffed. It now has three + uses, up from two. +2016-03-02: + CoreOverload: + - rscadd: A new "breathing tube" mouth implant. It allows you to use internals without + a mask and protects you from being choked. It doesn't protect you from the grab + itself. + - tweak: Arm cannon implants are now actually implanted into the arms, not into + the chest. + - bugfix: Arm cannons have an action button again. + - tweak: Heart removal is no longer instakill. It puts you in condition similar + to heart attack instead. You can fix it by installing a new heart and applying + defibrillator if it wasn't beating. + - rscadd: You can now make a stopped heart beat again by squeezing it. It will stop + beating very soon, so you better be quick if you want to install it without + using defibrillator. + - rscadd: There is now a chance to recover some of the internal organs when butchering + aliens or monkeys. + - rscadd: A new organ - lungs. When removed, it will give you breathing and speaking + troubles. + - rscadd: Human burgers are, once again, named after the generous meat donors that + made them possible. + Fox McCloud: + - rscadd: Gibbing mobs will now throw their internal organs + Gun Hog: + - rscadd: Ghost security HUDs now show arrest status and implants. + - tweak: The Alien queen, upon her death, will now severely weaken the remaining + alien forces. + Joan: + - tweak: Replicating Foam has a lower chance to expand when hit. + - tweak: Penetrating Spines is now purple instead of sea green. + - imageadd: Blobbernauts now have a brief animation when produced. + - experiment: Adds five new blob chemicals. This is a total of 25 blob chemicals. + Will it ever stop? + - rscadd: Draining Spikes, which is reddish pink and does medium brute damage, and + drains blood from targets. + - rscadd: Shifting Fragments, which is tan and does medium brute damage, and shifts + position when attacked. + - rscadd: Flammable Goo, which is reddish orange and does low burn and toxin damage, + and when hit with burn damage, emits a burst of flame. It takes more damage + from burn, though. + - rscadd: Poisonous Strands, which is lavender and does burn, fire, and toxin damage + over a few seconds, instead of instantly. + - rscadd: Adaptive Nexuses, which is dark blue and does medium brute damage, and + reaps 5-10 resources from unconscious humans, killing them in the process. + - wip: Confused about what the chemical you're fighting does? Look at https://tgstation13.org/wiki/Blob#Blob_Chemicals + - rscadd: Adds 'Support and Mechanized Exosuits' and 'Space Suits and Hardsuits' + categories to the syndicate uplink. + - rscadd: Nuke op reinforcements and mechs have been moved to the first category. + Syndicate space suits and hardsuits have been moved to the second category. + - bugfix: Traitors can now properly buy the blood-red hardsuit for 8 TC. + - tweak: Nuke ops can no longer buy the blood-red hardsuit, as the elite hardsuit + costs the same amount while being absolutely better. + Kor: + - rscadd: Added door control remotes. Clicking on doors while holding them will + let you open/bolt/toggle emergency access depending on the mode. They will not + work on doors that have their IDscan disabled (rogue AIs take note!) + - rscadd: The Captain, RD, CE, HoS, CMO, and QM all now have door control remotes + in their lockers. + LanCartwright: + - rscadd: Adds Uranium to Virus reaction. Will create a random symptom between 5 + and 6 when mixed with blood. + - rscadd: Adds Virus rations, which creates a level 1 symptom when mixed with blood. + - rscadd: Adds Mutagenic agar, which creates a level 3 symptom. + - rscadd: Adds Sucrose agar which creates a level 4 symptom. + - rscadd: Adds Weak virus plasma, which creates a level 5 symptom. + - rscadd: Adds Virus plasma, which creates a level 6 symptom. + - rscadd: Adds Virus food and Mutagen reaction, creating Mutagenic agar. + - rscadd: Adds Virus food and Synaptizine reaction, creating Virus rations. + - rscadd: Adds Virus food and Plasma reaction, creating Virus plasma. + - rscadd: Adds Synaptizine and Virus plasma reaction, creating weakened virus plasma. + - rscadd: Adds Sugar and Mutagenic agar reaction, creating sucrose agar. + - rscadd: Adds Saline glucose solution and Mutagenic agar reaction, creating sucrose + agar. + - rscadd: Adds Viral self-adaptation symptom, which boosts stealth and resistance, + but lowers stage speed. + - rscadd: Adds Viral evolutionary acceleration, which bosts stage speed and transmittability, + but lowers stealth and resistance. + - rscadd: Flypeople now vomit when they eat nutriment. + - rscadd: Flypeople can now suck the vomit off the floor to gain it's nutritional + content. + - rscadd: Flypeople now must suck puke chunks and vomit to fill themselves of food + content. + Malkevin: + - tweak: Sec officers have two sets of cuffs again (one on spawn, one in locker) + - tweak: Done some optimisation of sec spawn equipment lists and lockers to remove + some of the repetitive clicking, sec belts are now preloaded with equipment. + - tweak: HoS has a full baton instead of the collapsible one + - tweak: Detective has a classic police baton and pepper spray instead of the collapsible + baton (someone made police batons shit, so don't get overly happy) + - bugfix: pop scaled additional lockers spawned were the wrong type, changed them + to the right type which has batons now (actually belts now that I've changed + them). + MrStonedOne: + - tweak: Suit sensors will now favor higher levels for starting amount with the + exception of the max level, that remains unchanged. + - tweak: 'Old odds: 25% off 25% binary lifesigns 25% full lifesigns 25% coordinates' + - tweak: 'New odds: 12.5% off 25% binary lifesigns 37.5% full lifesigns 25% coordinates' + PKPenguin321: + - rscadd: Bolas are now in the game. They're a simple device fashioned from a cable + and two weights on the end, designed to entangle enemies by wrapping around + their legs upon being thrown at them. The victim can remove them rather quickly, + however. + - rscadd: Bolas can be crafted by applying 6 metal sheets to cablecuffs. They can + also be tablecrafted. + Sestren413: + - rscadd: Botanists have access to a new banana mutation now, bluespace bananas. + These will teleport anyone unfortunate enough to slip on their peel. + Shadowlight213: + - rscadd: A wave of dark energy has been detected in the area. Corgi births may + be affected. + Shadowlight213 and Robustin: + - rscadd: '"Old Cult is back baby!"' + - tweak: '"Cult survival objective disabled"' + - tweak: '"Imbuing talismans now consumes the imbue rune"' + - tweak: '"Invoking the stun talisman now hurts the cultist more"' + - tweak: '"The stun talisman duration is nerfed by 10%, mute is nerfed by 60% but + a stutter and special new slur effect will last much longer"' + - tweak: '"The old cult has retained the rune of time stop, now requiring 3 cultists + to invoke"' + - rscdel: '"New Cult is removed!"' + bgobandit: + - rscadd: CentComm has been informed that cargo is receiving new forms of contraband + in crates. Remember, Nanotrasen has a zero-tolerance contraband policy! + lordpidey: + - rscadd: New virology symptom, projectile vomiting. It is a level four symptom. +2016-03-03: + Joan: + - tweak: Blobbernauts now die slowly when not near a blob. + - rscadd: Blobbernauts can now see their health and the core health of the overmind + that created them. +2016-03-05: + CoreOverload: + - imageadd: Cyborg tools (screwdriver, crowbar, wrench, etc) now have new fancy + sprites. + - tweak: Said cyborg tools have received a buff and are now two times faster than + their non-cyborg counterparts. + Joan: + - tweak: Replicating Foam has lower expand chances when hit and on normal expand. + - bugfix: Shifting Fragments will no longer try and fail to swap with invalid blobs + when hit. + - tweak: Electromagnetic Web no longer always EMPs targets, instead doing it at + a 25% chance. + - tweak: Synchronous Mesh now only takes bonus damage from fire, bombs, and flashbangs. + - tweak: Synchronous Mesh no longer tries to split damage to blob cores or nodes. + Cores and nodes still split damage to nearby blobs, however. + - tweak: Blobbernauts now attack much slower. + - tweak: Blobbernauts are now maximum one per factory, reduce that factory's health + drastically, and die slowly if that factory is destroyed. + - experiment: Factories must still have above 50% health to produce blobbernauts. +2016-03-07: + WJohnston: + - tweak: Queens and praetorians have new sprites! +2016-03-09: + Joan: + - rscadd: Blobs can now attack people that end up on top of blob tiles with Left-Click + or the Expand/Attack Blob verb. + - tweak: The Toxin Filter virology symptom now heals 4-8 toxin damage instead of + 8-14. + - tweak: The Damage Converter virology symptom will now do toxin damage for each + limb healed. + MrStonedOne: + - tweak: Centcom has improved the the tesla generator! The generated tesla energy + balls should now be more stable! Growing quicker and dissipating slower. It + seems to also move around a touch more but that shouldn't be an issue as the + the tesla escaping containment is unheard of! +2016-03-10: + Joan: + - rscadd: The blob can now be shocked by the tesla. + - tweak: Strong blobs are now much more resistant to brute damage. + - wip: Tweaks blob reagents; + - rscdel: Removes Ripping Tendrils. + - rscdel: Removes Draining Spikes. + - tweak: Cryogenic Liquid does less burn damage. + - tweak: Pressurized Slime does less brute damage. + - tweak: Reactive Gelatin now has a lower minimum damage. + - tweak: Poisonous Strands applies its damage over a longer period of time. + - tweak: Sporing Pods now does much less damage, and is less likely to produce spores + when killed. + - tweak: Regenerative Materia, Hallucinogenic Nectar, and Envenomed Filaments do + less toxin damage. + - rscadd: Energized Fibers no longer heals when hit with stamina damage, and is + instead immune to the tesla. + - rscadd: Boiling Oil now takes damage from extinguisher blasts. Boiling Oil blobbernauts, + however, do not. + - tweak: Replicating Foam now takes increased brute damage and when expanding from + damage, will not expand again. + - tweak: Flammable Goo takes 50% increased burn damage, from 30%. + - tweak: Explosive Lattice now takes much higher damage from fire, flashbangs, and + the tesla. + - experiment: Electromagnetic Web takes full brute damage, lasers will now one-hit + normal blobs, and the death EMP is smaller. +2016-03-12: + Joan: + - bugfix: Blobbernauts and blob spores can now move near blob tiles in no gravity. + - tweak: Boiling Oil does slightly more damage and takes slightly less damage when + extinguished. + - rscadd: Flammable Goo now applies firestacks to targets, but does not ignite them. + Jordie0608: + - rscadd: Show Server Revision will now tell you if a PR is test merged currently. + PKPenguin321: + - rscadd: Added reinforced bolas. They do a very short stun in addition to normal + functions, and take twice as long to break out of when compared to regular bolas. + - tweak: The traitor's Throwing Star Box has been made into the Throwing Weapons + Box. It now contains two reinforced bolas in addition to its old contents. It + also costs 5 TCs, down from 6. + tkdrg: + - tweak: The detective's revolver now takes three full seconds to reload. + xxalpha: + - rscadd: Detective can be a Traitor/Double Agent. + - tweak: Removed Detective's access to security lockers and secbots. + - tweak: Removed bowman's headset from Detective's locker. + - tweak: Box Brig Security Office and Locker Room require a higher access level + (Security Officer level). +2016-03-13: + Dorsisdwarf: + - rscadd: 'Adds Robo-Doctor board (The Hippocratic Oath: Now on your beepbot)' + - rscadd: Adds Reporter board (The truth will set ye free (termsandconditionsmayapply)) + - rscadd: Adds Live and Let Live board + - rscadd: Adds Thermodynamics as a dangerous board. + Impisi: + - tweak: Improvised shells now deal more far more damage but are more inaccurate. + - tweak: Overloaded shells now require liquid plasma in addition to black powder. + Shells now fire explosive pellets that are good at hurting you and everything + in front of you. + Joan: + - rscdel: Blob gamemode blobs will no longer burst from people. + - rscadd: Instead, the blob gamemode spawns overminds, which can place their blob + core underneath them in an unobserved area. + - rscadd: The overminds can, until they have placed a blob core, move to any non-space, + non-shuttle tile. + - rscadd: If the overminds fail to place a blob core within a time limit, it will + be automatically placed for them at a random blob spawnpoint. + - tweak: The time before the overmind automatically places the core is slightly + lower than the previous average time it'd take a blob to burst. +2016-03-15: + Cuboos: + - soundadd: Modded the current door sound and added a few new ones, unique sound + for closing, bolting up/down and a nifty denied sound. + Isratosh: + - rscadd: Security flashlights can now be attached to the bulletproof helmets. + Joan: + - tweak: Resource blobs produce resources for their overmind slightly slower for + each resource blob their overmind has. + - rscadd: Blob overminds get one free chemical reroll. + - rscadd: Blob overminds can no longer place resource and factory blobs out of range + of cores and nodes, unless they Toggle Node Requirement off. It is on by default. + - rscadd: Blob UI buttons now have tooltips. + - tweak: Cores and nodes will expand slightly slower. + - tweak: Blob Chemicals no longer trigger effects on dead mobs. + - tweak: Shifting Fragments has a lower chance to move shields with normal expansion + and will no longer shift blobs to the location of a dying blob. + - tweak: Flammable Goo no longer applies fire to tiles with blobs. + - tweak: Electromagnetic Web has a slightly higher EMP range. + Kor: + - rscadd: Hunger was accidentally disabled sometime back in October 2015. We finally + noticed and fixed it. + Kor (And all the lovely maintainers and spriters who helped me along the way): + - rscadd: Adds a new, lava themed planet to mine on,with randomly generated rivers + of lava and islands of volcanic rock. This mine is used on Box and Metastation. + Other mappers may enable it at their discretion. + - rscadd: Added deadly ash storms to mining. + - rscadd: Added slightly deadlier variants of mining mobs to lavaland, with sprites + done by my girlfriend. + - rscadd: Added portable survival capsules to mining equipment lockers. Don't forget + these, or you might get caught out by a storm. You may purchase more at the + venders. + - rscadd: Added randomly loaded ruins to mining. These maps contain new and unique + items not seen elsewhere in thegame. There are around a dozen of them added + with the "release" of lavaland, though I plan for many more. + - rscadd: Some ruins contain sleepers which allow you to spawn as various roles, + such as survivors of a shuttle crash stranded in the wilderness. You can find + these sleepers in the orbit list. + - rscadd: You can now fly the abandoned white ship to lavaland. + LanCartwright: + - tweak: Choking now deals damage based on virus' Stage speed and virus Stealth. + - tweak: Fever heats the body based on Transmittability and Stage speed. + - tweak: Spontaneous Combustion now adjusts firestacks based on stage speed minus + Stealth. + - tweak: Necrotizing Fasciitis now deals damage based on lower Stealth values. + - tweak: Toxic Filter now heals based on Stage speed. + - tweak: Deoxyribonucleic Acid Restoration now heals brain damage based on Stage + speed minus Stealth. + - tweak: Shivering now chills based on Stealth and Resistance. + - rscadd: Proc for the total stage speed of a virus' symptoms. + - rscadd: Proc for the total stealth of a virus' symptoms. + - rscadd: Proc for the total resistance of a virus' symptoms. + - rscadd: Proc for the total transmittance speed of a virus' symptoms. + MrStonedOne: + - rscdel: 'Lag has been removed from the following systems: mob life()/virus process, + machine/object/event processing, atmos, deletion subsystem, lighting, explosions, + singularity''s eat(), timers, wall smoothing, mass var edit, mass proc calls(and + all of sdql2), map loader, and the away mission loader.' + - rscdel: Removed limit on bomb cap of 32,64,128, it can now go to the MOON. + - tweak: Minimap generation is now a config option that defaults to off so coders + don't have to wait for it to generate to test their code, server operators should + note that they need to enable it on production servers that want minimap generation. + - wip: if you find any things that still lag, please report them to MrStonedOne + for lag removal. + - experiment: I'm gonna take this time to shill out that, Lummox JR, byond's only + dev, coded the tool that made this change possible, he lives off of byond membership + donations, if you like the lag removal, become a byond member or at least throw + 5 bucks byond's way for doing this. + - experiment: Feel free to ask for bomb cap removals when solo antag, but remember, + the later in the round it is, the more likely you'll get it. + PKPenguin321: + - rscadd: Scooters and skateboards have been added. + - rscadd: Use rods to make a scooter frame. From there, apply metal to make wheels, + creating a skateboard. Apply a few more rods to make a full scooter. You can + also use tablecrafting to create them, their recipes can be found under the + Misc. category. + - rscadd: Each step of scooter deconstruction is performed with either a wrench + or a screwdriver, depending on the step. + xxalpha: + - rscadd: Scrubber clog event now ejects cockroaches. +2016-03-17: + CoreOverload: + - rscdel: The recent jetpacks nerf is finally reverted. Turbo mode is dead and stabilization + is once again can be toggled on and off. + - rscadd: 'Added a new chest cyberimplant: implantable thrusters set. This implant + is a built-in jetpack that has no stabilization mode at all and can use gas + from environment (if 30+ kPa) or from internals. It can also use plasma from + plasma vessel organ, if you have one.' + Joan: + - tweak: Moved the security hud's icons down slightly to allow it to coexist with + medical and antag huds. + Shadowlight213: + - rscadd: HOG deity can now be heard by all of its followers! + - tweak: The prophet no longer needs to wear his hat to speak with his deity. + - rscadd: The prophet's hat and staff have a new functionality! Use the staff inhand + to reveal hidden structures. + - rscadd: Deities can now hide their structures from view! Pretend to be a book + club when sec bursts in. experiment:Only enemy prophets or your own deity can + reveal these structures and they are disabled when hidden. +2016-03-19: + Joan: + - imageadd: Xray lasers now have unique inhands. + - imageadd: Xray lasers have been recolored to match R&D equipment. + Zombehz: + - rscadd: Adds 'chicken' nuggets* in 4 shapes, including regular, star, corgi, and + lizard. it. They are made with one cutlet of meat. +2016-03-20: + Joan: + - rscadd: Nar-Sie will now corrupt airlocks, tables, windows, and windoors. + - rscadd: Corrupted airlocks have no access restrictions. + - tweak: Nar-Sie no longer causes destruction while moving around in favor of additional + corruption. + - tweak: The surplus crate is less likely to give you eight space suits. + - bugfix: Nukeops can once again buy noslips. The nuke op magboots are still better + than noslips, buy them instead. + Kor: + - rscadd: Runtime now has a chance to spawn with a more classic look. + - rscadd: Killing a necropolis tendril will now drop a chest full of spooky loot. + - rscadd: Killing a necropolis tendril will now cause the ground to collapse around + it after 5 seconds. +2016-03-21: + CoreOverload: + - rscadd: You can now construct and deconstruct wall mounted flashes by using a + wrench on empty wall flash. A crate with four linked "flash frame - flash controller" + pairs is added to cargo. + Joan: + - rscadd: Explosive Holoparasites now have a 33% chance to explosively teleport + attacked targets, doing damage to everyone near the target's appearance point. + - tweak: Explosive Holoparasite bombs can now detonate when living mobs bump them. + - rscadd: Adds lightning holoparasites, which have medium damage resist, a weak + attack, have a lightning chain to their summoner, and apply lightning chains + when attacking targets. + - rscadd: Lightning chains shock everyone nearby, doing low burn damage. This is + excluding the parasite and summoner; chains will shock enemies they're attached + to. + - tweak: Holoparasites can now smash tables and lockers. + PKPenguin321 && !JJRcop: + - rscadd: Milk, which is good for your bones, is now extra beneficial to species + that are mostly comprised of bones. + kingofkosmos: + - rscdel: The backpack close-button has got a visual overhaul. + - rscadd: All storage items can be closed by clicking on them again. +2016-03-23: + Iamgoofball: + - rscadd: Cargo now works off of Credits. + - rscadd: Cargo now plays the Stock Market. + - rscadd: Buy Low, Sell High +2016-03-24: + Iamgoofball: + - rscadd: CLF3 now melts, burns, and destroys floors a lot more often, as it should + be. + - rscadd: CLF3 now makes 3x3 fireballs on tiles it touches now, instead of a single + fireball. + Joan: + - tweak: Lightning Holoparasites will actually shock relatively often instead of + 'sometimes, maybe, if you're really lucky' + PKPenguin321: + - tweak: Sand now fits in your pockets + - rscadd: Sand can now be thrown into people's eyes, doing slight stamina damage, + making their vision slightly blurry, and making them stumble when they walk + for a short time. + RemieRichards: + - rscadd: BEES + - rscadd: Hydroponics can now manage bee colonies, bees produce honeycombs that + can be grinded to obtain honey, a decent nutriment+healing chemical + - rscadd: Hydroponics can inject a queen bee with a syringe of a reagent to alter + her DNA to match that reagent, meaning all honeycombs produced will contain + that reagent in small amounts + - rscadd: Bees with reagents will attack with that reagent + Xhuis: + - experiment: Alcohol has received multiple tweaks. + - tweak: Drunkenness will now be displayed on examine as long as the target's face + is not hidden, ranging from a slight flush to being a completely drunken wreck. + This also helps to measure alcohol poisoning, although the appearance will remain + for thirty seconds after the alcohol leaves the imbiber's bloodstream. + - tweak: Alcohol poisoning now has different effects. It begins with standard things + such as confusion, dizziness, and slurring, but eventually escalates to constant + vomiting, blacking out, and toxin damage. + - tweak: Drinks now have a wide variety of alcoholism. Grog is barely a drink whatsoever, + for instance, but Manly Dorf will completely floor you with too much consumption. + Note that drinks based off of whiskey and vodka are the hardest, whereas beer + and wine are the softest. + - tweak: The speed of alcohol poisoning has been slightly reduced. + - rscadd: Some drinks have received unique effects. Experiment! + - rscadd: A new base alcohol joins the lineup! Absinthe has been added, and is very + strong. + - rscadd: Whiskey Sour, made with Whiskey, Lemon Juice, and Sugar, simply expands + the existing whiskey-based lineup. + - rscadd: Fetching Fizz, made with Nuka-Cola and Iron, will pull all nearby ores + in the direction of the imbiber. + - rscadd: Hearty Punch, made with Brave Bull, Syndicate Bomb, and Absinthe, will + provide extreme healing in critical condition. + - rscadd: Bacchus' Blessing, made with four of the most powerful alcohols on the + station, is over three times stronger than any other alcohol on the station. + Consume in small amounts or risk death. +2016-03-26: + CPTANT: + - tweak: Nanotrasen found a new taser supplier. The new tasers hold 12 shots, down + people with 2 hits and hybrid tasers now have a light laser attached. + CoreOverload: + - tweak: Sorting junctions now support multiple sorting tags. + Fox McCloud: + - bugfix: Fixes Shadowlings not being spaceproof to pressure + - bugfix: Fixes being able to receive multiple spells as a Lesser Shadowling + Joan: + - rscadd: Adds assassin holoparasites, which do low damage and take full damage, + but can go invisible, causing their next attack to do massive damage and ignore + armor. + - rscadd: Assassin holoparasite stealth will be broken by attacking or taking damage, + which will briefly prevent the parasite from recalling. + - rscadd: Traitor holoparasite injectors include this parasite type. + Kor: + - rscadd: There are a couple new lavaland ruins, including one with a new ghost + role. + PKPenguin321: + - tweak: The RD's reactive teleport armor now has a cooldown between teleports. + EMPing it will cause it to shut down and have a longer cooldown applied. + - imageadd: Bolas, both reinforced and regular, now have newer, sexier sprites. +2016-03-29: + Bawhoppen: + - tweak: Bruisepacks, ointment, and gauze now will apply significanty faster. + - rscdel: SWAT crates no longer contain combat knives. + - rscadd: SWAT crates now contain combat gloves. + - rscadd: Combat knives now can be ordered in their own crate. + Iamsaltball: + - rscadd: GRAB SUPER NERFED + - rscadd: IT'S WAY EASIER TO ESCAPE GRABS NOW + - rscadd: IT TAKES WAY LONGER TO UPGRADE GRABS NOW + - rscadd: 'YOU CAN ACTUALLY FUCKING ESCAPE GRABS NOW TOO #WOW #WHOA' + - rscadd: GRAB TEXT IS ALL BIG BOLD AND RED MUCH LIKE YOUR MOM LAST NIGHT + - experiment: GIT GUDDERS GO FUCK YOURSELVES YOU CAN'T GET GOOD AGAINST "LOL INSTANT + PERMASTUN THAT ISN'T OBVIOUS IN CHAT LIKE THE REST OF THE STUNS" + Joan: + - tweak: Ghost revival/body creation alerts now use the ghost's hud style. + - imageadd: Support holoparasites now have a healing effect with their color when + successfully healing a target. + - tweak: Ranged holoparasite projectiles now take on the color of the holoparasite. + - bugfix: Holoparasite communication(holo->summoner) now sends the message to all + holoparasites the summoner has. + - bugfix: If you have multiple holoparasites for some reason, Reset Guardian allows + you to choose which to reset. + - tweak: Resetting a holoparasite also resets its color and name, to make it more + obvious it's a new player. + - rscadd: Holoparasites can now see their summoner's health and various ability + cooldowns from the status panel. + - rscadd: Blobbernauts are now alerted when their factory is destroyed. + KazeEspada: + - bugfix: Blob Mobs no longer swap with other mobs. + RemieRichards: + - rscadd: Added the ability to make Apiaries and Honey frames with wood + - rscadd: Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey + - rscadd: Added the ability to make more Queen Bees from Royal Bee Jelly by using + it on an existing Queen, to split her into two Queens + - tweak: Made homeless bees more obvious + - bugfix: Fixed a typo that made almost all bees homeless, severely reducing the + odds of getting honeycomb + - tweak: Made bee progress reports (50% towards new honeycomb, etc.) always show, + even if it's 0% + - tweak: Made some feedback text more obvious + - bugfix: Fixed being able to duplicate the bee holder object, this was not exploity, + just weird + - bugfix: Fixed being able to put two (or more) queens in the same apiary + - bugfix: Fixed some runtimes from hydro code assuming a plant gene exists + - bugfix: Fixed runtime when you use a honeycomb in your hand + - tweak: It now takes and uses 5u of a reagent to give a bee that reagent + - rscdel: Removed unused icon file + Ricotez: + - imageadd: The default white ghost form now has directional sprites. + - rscadd: The default white ghost form now also has (your) hair! Here's how it works. + - experiment: If you ghost from a body, you'll get the hair from that body. If it + has hair. + - experiment: If you hit Observe, you'll get the hair from the character you had + active in your setup window. If they had hair. + - wip: This only works with the default white ghost form right now (because the + other forms have the wrong shape or lack directional sprites), and with human + bodies since they're the only ones that have hair. Sorry lizards and plasmamen! + You'll get your turn next time. + - rscadd: A new preference called Ghost Accessories. This lets you configure if + you want your ghost sprite to show both hair and directional sprites, only directional + sprites or just use its original default version without directional sprites. + - rscadd: 'A new preference called Ghosts of Others. This preference is clientside + and lets you configure how other ghosts appear to you: as their own setting, + as the form they chose but without any hair or directional sprites, or as the + simple white ghost sprite if you''re sick of those premium users with their + rainbow ghosts.' + - experiment: The layout of the ghost preference buttons has slightly changed. The + old Choose Ghost Form and Choose Ghost Orbit are now a part of Ghost Customization, + which also contains the new Ghost Accessories button. Clicking Ghost Customization + will send you directly to Ghost Accessories if you don't have premium. The Preferences + tab now also contains the Ghost Display button, which lets you configure how + other ghosts appear to you. + - bugfix: Fixed a bug where the toggles for Ghost Accessories and Ghosts of Others + in the Preferences menu wouldn't save your preference update to your save file. + - bugfix: Renamed the "Ghost Display Settings" preference toggle button to "Ghosts + of Others", so it fits with the name the preference has everywhere else. + TehZombehz: + - rscadd: Paper sacks are now craftable by tablecrafting with 5 sheets of paper. + - rscadd: 'Comes in 5 different designs: Use a pen on a paper sack to change the + design.' + - rscadd: Certain paper sack designs can be modified with a sharp object to craft + a (creepy) paper sack hat. + Xhuis: + - bugfix: Portal storm messages now use the station name rather than the world name. + - bugfix: Shadowlings can no longer glare while shadow walking. + - bugfix: Progress bars are now properly shown when reloading revolvers. + - bugfix: Cyborgs and AIs are no longer knocked out when being stuffed into lockers. + - bugfix: Plasmamen can no longer be the patient zero of the space retrovirus. + - bugfix: Cyborgs and AIs now properly display death messages. + - bugfix: Revenants can no longer be closed into lockers. + - bugfix: Airlocks no longer play sounds or flash lights when denying access if + the airlock has no power. + - bugfix: Job spawn icons in mapping have been fixed. + - bugfix: Gibtonite's disarm message no longer include the outside viewer. + - bugfix: Cult walls and girders are now more streamlined and can be built with + runed metal. + - bugfix: Positronic brains and MMIs can no longer see ghosts. + - rscadd: When someone is turned into a statue, the statue now appears as a greyscale + version of them. + - rscadd: Returning from a statue to a human now knocks you down. + - rscdel: Flesh to Stone no longer works on dead mobs. + - bugfix: Wall-mounted flasher crates now have the proper price. + - bugfix: Wall-mounted flasher frames now have icons. + - bugfix: Upgraded resonators now have an inhand sprite. +2016-03-30: + Coiax: + - rscadd: Geiger counters can now be stored in the suit storage of radiation suits + RemieRichards: + - bugfix: fixes shift-clicking action buttons not instantly resetting their location. + (I'm only making a changelog for this because apparently barely noone even knows + you can move the buttons, let alone reset them...) + TehZombehz: + - rscadd: Honey buns and honey nut bars are now craftable using honey. + - tweak: Brewing mead now requires actual honey. +2016-04-01: + Erwgd: + - bugfix: Weed Killer bottles and Pest Killer bottles now contain 50 units. + - rscadd: The biogenerator can now make empty bottles and black pepper. + Isratosh: + - rscadd: Added an admin jump button to explosion logs. + Joan: + - rscadd: Traitors can now buy charger holoparasites. + - rscadd: Charger holoparasites move extremely fast, do medium damage, and can charge + at a location, damaging the first target it hits and forcing them to drop any + items they're holding. + Kor: + - rscadd: Mechas are now storm proof + - rscadd: Kinetic Accelerators now require two hands to fire, but are free standard + gear for miners. + - rscadd: All mining scanners are now automatic, with the advanced version having + longer range. + - rscadd: The QM and HoP no longer have spare vouchers. + - rscadd: You can buy a pack of two survival capsules with your mining voucher. + - rscadd: Mining Bots will no longer cause friendly fire incidents. They'll hold + fire if you are between them and their target + - rscadd: There are now four different mining drone upgrades available in the vendor. + - rscadd: Resonators can now have more fields and deal more melee damage. + - rscadd: Lavaland miners now have explorer's suits instead of hardsuits. Sprites + by Ausops. + - rscadd: You can now butcher Goliath's for their meat. It cooks well in lava. + Shadowlight213: + - rscadd: Clients now have a volume preference for admin-played sounds. + TehZombehz: + - rscadd: The 'Plasteel Chef' program has provided station chefs with complimentary + ingredient packages. There are several package themes, and chefs are provided + a random package on arrival. + coiax: + - rscadd: Free Golems on Lavaland have been naming their newborn siblings with a + wider range of geology terms +2016-04-02: + Eaglendia: + - rscadd: Central Command has released a new, more functional run of their most + stylish fashion line. + - rscadd: Head of Staff cloaks can now hold specific items - the antique laser gun + for the Captain, the replica energy gun for the Head of Security, the hypospray + for the Chief Medical Officer, the Hand Teleporter or RPED for the Research + Director, and the RCD or RPD for the Chief Engineer. +2016-04-03: + Erwgd: + - rscadd: Our valued colleagues in the security department are reminded to search + boots for hidden items (such as knives or syringes) as part of standard search + procedures. Alt-click a pair of boots to remove any hidden items. + Isratosh: + - bugfix: Fixed rudimentary transform not working properly on ghosts with minds. + - rscadd: Admin logs for bluespace capsules not activated on the mining Z level. +2016-04-04: + TechnoAlchemisto: + - rscadd: The recipes for some Trekchems are now back in the game + - rscadd: Bicaridine can be made with carbon, oxygen, and sugar. + - rscadd: Kelotane can be made with silicon and carbon. + - rscadd: Antitoxin can be made with nitrogen, silicon, and potassium + - rscadd: tricordrazine can be made by combining all three. +2016-04-05: + Erwgd: + - rscadd: Utility belts of all kinds can now accept gloves. Most belts, except janitorial + belts, may now also hold station bounced radios. + - rscadd: Hazard vests and most jackets can carry a station bounced radio as well. + Labcoats can be used to store a handheld crew monitor. + - rscadd: The autolathe can now make toolboxes. + Joan: + - rscadd: Adds protector holoparasites to traitor holoparasite injectors. + - rscadd: Protector holoparasites cause the summoner to teleport to them when out + of range, instead of the other way around. + - rscadd: Protector holoparasites have two modes; Combat, where they do and take + medium damage, and Protection, where they do and take almost no damage, but + move slightly slower. + - tweak: Explosive Holoparasites no longer teleport non-mobs when attacking, but + have a higher chance to teleport mobs. + - rscdel: Explosive Holoparasite bombs no longer trigger on their summoner or any + other parasites their summoner has. + - bugfix: Ranged Holoparasites no longer have nightvision active by default. It + can still be toggled on. + - tweak: Ranged Holoparasite snares no longer alert if the crossing mob is their + summoner or one of the parasites their summoner has. + - tweak: Ranged Holoparasites are slightly less visible in scout mode. + - tweak: Standard Holoparasites attack 20% faster than other parasite types. + - rscdel: Support Holoparasite beacons no longer require safe atmospheric conditions, + but the warp channel takes slightly longer, and is preceded with a visible message. + - tweak: Zombies can no longer destroy more than one airlock at a time. + - rscadd: The mining station has been updated. + MrStonedOne: + - bugfix: Centcom is glad to announce the end of sending workers to our control + group for space exposure testing, a fake station in "space" that noticeably + had air in "space". + TechnoAlchemisto: + - tweak: Detective scanners are now smaller. + - tweak: Pickaxes now fit in explorer suit exosuit slots. + bgobandit: + - rscadd: Alt-clicking a fire extinguisher cabinet opens and closes it. That is + all. +2016-04-06: + CoreOverload: + - rscadd: You can now put slimes in stasis by exposing them to room temp CO2. Useful + for both fighting the slimes and safely storing them. + Erwgd: + - rscadd: The autolathe can now make hydroponics tools! Access the design routines + in the Misc. category of the machine. + LanCartwright: + - tweak: Custom viruses with stealth values of 3 or above are now invisible on the + PANDEMIC and no longer visible on health huds. + MrStonedOne: + - bugfix: Centcom is happy to report that our single sided windows and our windoors + should once again create an airtight seal. + bgobandit: + - rscadd: Honk! Nanotrasen's clowning and development department has invented the + clown megaphone, standard in all clowning loadouts! Honk honk! +2016-04-07: + Kor: + - rscadd: The Laser Cannon in RD has been replaced with the Accelerator Laser Cannon. + Try it out! + - rscadd: Mechas now have armour facings. Attacking the front will deal far less + damage, while attacking the back will deal massive bonus damage. + - rscadd: EMPs now deal far less damage/drain to mechas. + Kor and Ausops: + - rscadd: Survival pod interiors have been redone. + - rscadd: Survival pods now contain a stationary GPS computer. + - rscadd: You can now toggle your GPS off with alt+click. + bgobandit: + - rscadd: Due to budget cuts, Nanotrasen is no longer utilizing copy-protected paper + for its classified documents. Fortunately, our world-class security team has + always prevented any thefts or photocopies from being made! + - rscadd: Secret documents can be photocopied. If you have an objective to steal + any set of documents, a photocopy will be accepted. If you must steal red or + blue documents, a photocopy will NOT be accepted. Enterprising traitors can + forge the red/blue seal with a crayon to take advantage of this. +2016-04-09: + GunHog: + - rscadd: Aliens may now force open unbolted, unwelded airlocks. Unpowered airlocks + open faster than powered ones. Has a cool sound provided by @Ultimate-Chimera! + - tweak: Alien Drone health increased to 125 hp. + - tweak: Alien drone is now faster! + - tweak: Alien egg and larva maturation times halved. + - tweak: Resin membrane health increased to 160 hp. + - rscadd: Aliens may now open firelocks. + - rscadd: Aliens may now unweld scrubbers and vents. (From the outside!) + - tweak: Droppers no longer affect aliens. + Joan: + - rscdel: You can no longer drop survival capsules on top of dense objects, such + as the windows in the emergency shuttle. You can still drop them on non-dense + objects and mobs, however. + - tweak: Swarmers can now deconstruct objects simply by clicking. + - rscadd: Swarmers can still teleport mobs away via ctrl-click. + - bugfix: Emps will now properly damage swarmers. + Kor: + - rscadd: Added wisp lanterns to necropolis chests. + - rscadd: Added red/blue cube pairs to necropolis chests. + - rscadd: Added meat hooks to necropolis chests. + - rscadd: Added immortality talismans to necropolis chests. + - rscadd: Added paradox bags to necropolis chests. + - rscadd: Ripley drills work again. Go tear up lavaland. + PKPenguin321: + - tweak: Goofball's grab nerf has been reverted. + TechnoAlchemisto: + - tweak: Pickaxe upgrades are now better. + coiax: + - tweak: Efficiency Station Testing Lab now has a Drone Shell Dispenser + - tweak: Fixed an issue with a door on the Golem Ship + - rscadd: The unfathomable entity Carp'sie has blessed vir followers with mysterious + carp guardians. + - rscadd: Nanotrasen Cyborgs are now able to empty ore boxes without human assistance + - rscadd: Ore boxes are now craftable with 4 planks of wood + - tweak: Ore boxes now drop their contents when destroyed, or dismantled with a + crowbar + coiax, bobdobbington, Core0verload: + - rscadd: An experimental plant DNA manipulator, based on machinery recovered from + ancient seed vaults, has been installed in the Botany department. +2016-04-11: + Joan: + - rscadd: Blob cores will take slight brute damage from explosions. + RandomMarine: + - rscadd: Additional luxuries have been added to golem ships. Including new rewards. + Praise be to The Liberator! + - rscdel: However, jaunters are no longer easily obtained by free golems. + RemieRichards: + - rscadd: The Station Blueprints now display the piping/wiring and some of the machinery + the station started with, to assist in repairs + coiax: + - rscadd: Emagging the cargo console also unlocks regular contraband, in addition + to syndicate gear + - rscadd: A working drone shell dispenser is now on display in MetaStation's museum, + displaying the virtue of the tireless little workers! + - rscadd: Dreamstation now has a drone shell dispenser in the Toxins Launch Room +2016-04-12: + Incoming5643: + - rscadd: Leading scientists have finally proven that humans (and xenos) in fact + have tongues in their mouths. + - rscadd: Swapping out tongues allows the various races to change their speech impediments. + Putting a xeno tongue in someone allows them to make the hissing sound like + a xeno whenever they speak. + - rscdel: There are no erp mechanics tied to this feature. + - experiment: Remember that tongues are stored in the MOUTH, selecting the head + isn't good enough. + Kor: + - rscadd: Ash walker starting gear has been rebalanced. + - rscadd: Ash walkers can no longer use guns. + TrustyGun: + - rscadd: After carefully investing in the market, the Captain had enough money + to replace his silver flask with a golden one! + - rscadd: The Detective is now bringing his personalized flask to work, due to the + grim work he has to do. + - rscadd: The Booze-O-Mat now stocks 3 flasks. +2016-04-16: + Bawhoppen: + - tweak: Cryo is no longer god-awful. + CoreOverload: + - rscadd: A lot of items are now exportable in cargo. + - rscadd: Use Export Scanner to check any item's export value. + Erwgd: + - rscadd: Forks, bowls, drinking glasses, shot glasses and shakers can now be made + and recycled in the autolathe! Access the designs in the new 'Dinnerware' category. + - tweak: Kitchen knives have been moved to the Dinnerware category of the autolathe. + - rscadd: Butcher's cleavers can now be made in a hacked autolathe. + Fox McCloud: + - rscadd: Slime batteries now self-recharge. + - rscadd: Adds transference potion. A potion that allows the user to transfer their + consciousness to a simple mob. + - rscadd: Adds rainbow slime core reaction that generates a consciousness transference + potion when injected with blood. + Iamgoofball, Lati, Geo_Jerkal, Tanquetsunami25: + - rscadd: Lati requested that the Slime Processor will now automatically scoop up + any dead slimes into itself for processing. + - rscadd: Geo_Jerkal requested that you be able to mix Arnold Palmers with Tea and + Lemon Juice. + - rscadd: Tanquetsunami25 requested that cyborg be able to boop. + Incoming5643: + - rscdel: Removed the horrible meme skeletons, please don't sue us. + Kor: + - rscadd: Adrenals, no slips, surplus crates and SUHTANDOS now have minimum population + requirements before they can be purchased. + KorPhaeron: + - rscadd: You now need to butcher goliaths and watchers on lavaland to receive their + loot. Use the combat knives to do so. + Lati: + - rscadd: Custom floor tiles can now be added to floorbots. They will start replacing + other tiles with these tiles if the option is toggled on. + coiax: + - rscadd: Boxstation, not to be outdone by all the other competing station designs, + has installed a drone shell dispenser in the Testing Lab, which makes automated + drones to help fix the station. + - rscadd: Toy fans, rejoyce! The famous skeleton brothers from the beloved game + Belowyarn now have toys that you can win from the arcade machines! + - rscadd: Airlock painters can be printed at your local autolathe + - rscadd: Please do not attempt suicide with the airlock painter or the medical + wrench. + - rscadd: Metastation now has a plant DNA manipulator in Botany. + - rscadd: Using the fire extinguisher on yourself or others while in HELP intent + will spray you or them, rather than beat their probably flaming body with a + metal object. + - tweak: Alt-clicking extinguishers to empty them now wets the floor underneath + them. + lordpidey: + - rscadd: Meth labs can now blow up if you don't purify the ingredients or over-heat + the end product. + nullbear: + - rscadd: Added attack verbs for heart and tongue organs + - tweak: Maximum output of air pumps has been raised. +2016-04-18: + Joan: + - rscdel: Crates are now dense even when open. + - rscadd: You can now climb onto crates in the same way as table and sandbags, though + climbing onto crates is very fast and does not stun you. + - wip: You can walk on crates, provided both are closed/open or the crate you're + on is closed. + - rscdel: You can't close or open a crate if there's a large mob on top of it. + - rscadd: Stuffing items into a closet or crate is now instant and does not close + the closet or crate. Stuffing mobs into a closet or crate still takes time and + closes the closet/crate in question. + - imageadd: Crowbars and wirecutters have new inhand sprites. Crowbars can now be + distinguished from wrenches in-hand. + RandomMarine: + - tweak: Cloth items removed from biogenerator. Instead, it can create stacking + cloth that crafts those items. + - rscadd: In addition, cloth can be used to create grey jumpsuits, backpacks, dufflebags, + bio bags, black shoes, bedsheets, and bandages. + - tweak: Bedsheets now tear into cloth instead of directly into bandages. + Shadowlight213: + - tweak: AI will be notified when one of their cyborgs is detonated. + coiax: + - bugfix: Fixed slime grinders not sucking up more than one slime + - rscadd: Drones now start with a spacious dufflebag full of tools, so they will + stop stealing the captain's + - bugfix: Fixed issues with drones wearing chameleon headgear. + - rscadd: Added admin-only "snowflake drone" (also known as drone camogear) headgear. + nullbear: + - bugfix: Fixes air canisters being silent when bashed. +2016-04-20: + Erwgd: + - rscadd: The autolathe can now make trays. + Fox McCloud: + - bugfix: Fixes abductor vests having no cooldown between uses + Kor: + - rscadd: You can now craft boats and oars out of goliath hides. These boats can + move in lava. + - rscadd: Added a spooky, upgraded boat to necropolis chests. + coiax: + - tweak: Slime grinders now cease suction of new slimes while grinding + coiax, Joan: + - rscadd: Drone dufflebags now have their own sprite. + kevinz000: + - rscadd: 'Admin Detection Multitool: A multitool that shows when administrators + are watching you! Now you can grief in safety!' + - tweak: Syndicate R&D scientists have significantly increased the range of their + "AI detection multitools", making them turn yellow when an AI's tracking is + near, but not on you just yet! +2016-04-21: + Kor: + - rscadd: Mechas can now toggle strafing mode. +2016-04-22: + Bawhoppen: + - rscadd: Security belts can now hold any type of grenade. This includes barrier + grenades. + - rscadd: Janitorial belts are now able to store chem grenades. + - rscadd: Military belts have been given a size upgrade, so they can now hold larger + items. + - rscadd: Bandoliers have been given a buff and now can hold a much larger amount + of ammunition. + nullbear: + - bugfix: xenobio console is deconstructable again. + - tweak: syndibomb recipe calls for any matter bin, scaling effectiveness with tier. +2016-04-23: + Joan: + - bugfix: Aliens can now open crates and lockers. + - bugfix: Aliens and monkeys can now climb climbable objects, such as crates and + sandbags. + - rscadd: Aliens climb very, very fast. + Kor: + - rscadd: Running HE pipes over lava will now heat the gas inside. + - rscadd: Alt+clicking on your mecha (while inside it) will toggle strafing mode. + Mercenaryblue: + - rscadd: Allowed all corgis to wear red wizard hats. + TechnoAlchemisto: + - rscadd: Goliaths now drop bones, and Watchers drop sinews. + - rscadd: You can craft primitive gear from bone and sinew. + coiax: + - bugfix: Non-humans are now able to interact with bee boxes. +2016-04-25: + Joan: + - bugfix: You can once again hit a closet or crate with an item to open it. + Kor Razharas: + - rscadd: Adds support for autoclicking. + - rscadd: The Shock Revolver has been added to RnD. + - rscadd: The Laser Gatling Gun has been added to RnD. The Gatling Gun uses autoclick + to fire as you hold down the mouse. + - rscadd: The Research Director now starts with a box of firing pins. + - rscadd: The SABR and Stun Revolver recipes have been removed from RnD + coiax: + - rscadd: Laughter demons are like slaughter demons, but they tickle people to death + - tweak: Slaughter demons are no longer able to cast spells while phased. + - tweak: Wizards can now speak while ethereal, but still cannot cast spells while + ethereal. + - rscadd: 'Centcom''s "drone expert" reports that drones vision filters have been + upgraded to include the option of making all beings appear as harmless animals. + info: As always, all drone filters are togglable.' + - rscadd: As a sign of friendship between the Free Golems and Centcom, they have + modified Centcom's jaunter to be worn around a user's waist, which will save + them from falling to their death in a chasm. + - experiment: The Golems warn that these modifications have created a risk of accidental + activation when exposed to heavy electromagnetic fields. + - tweak: Renamed hivelord stabilizer to stabilizing serum. + - rscadd: Centcom regret to inform you that new instabilities with nearby gas giants + are causing exospheric bubbles to affect the telecommunications processors. + Please contact your supervisor for further instructions. + - rscadd: The Janitor's Union has mandated additional features to station light + replacer devices. + - rscadd: The light replacer now can be used on the floor to replace the bulbs of + any lights on that tile. + - rscadd: The light replacer now eats replaced bulbs, and after a certain number + of bulb fragments (four) will recycle them into a new bulb. + - tweak: The description of the light replacer is now more informative. + - rscadd: Clown mask appearance toggle now has an action button. +2016-04-26: + Iamgoofball & Super Aggro Crag: + - tweak: Fluorosulfuric Acid now has doubled acid power. + - experiment: Fluorosulfuric Acid now does BONUS burn damage scaling on the time + it's been inside the consumer. + Joan: + - tweak: Blobbernauts now spawn at half health. + - tweak: Blobbernauts regeneration on blob is now 2.5 health per tick, from 5. + - tweak: Blobbernauts now cost 40 resources to produce, from 30. + - rscdel: Factories supporting blobbernauts do not spawn spores. + Lati: + - tweak: Syndicate bomb can be only delayed once by pulsing the delay wire. Time + gained from this is changed from 10 seconds to 30 seconds. + TechnoAlchemisto: + - tweak: Goliath plates can now be stacked. + phil235: + - rscadd: More structures and machines are now breakable and/or destroyable with + melee weapon. Additionally, Some structures and machines that are already breakable/destroyable + are now affected by more attack methods (gun projectiles, thrown items, melee + weapons, xeno/animal attacks, explosions). + - rscadd: Hitting any machine now always makes a sound. + - rscadd: You can hit closed closets/crates and doors by using an item on harm intent + (but it doesn't actually hurt them). + - rscadd: you can now burst filled water balloons with sharp items. + - bugfix: Wooden barricade drops wood when destroyed. + - bugfix: Slot machines with coins inside are deconstructable now. +2016-04-27: + TechnoAlchemisto: + - rscadd: Miners can now select explorer belts from the mining vendor using their + vouchers, or mining points. +2016-04-28: + Bawhoppen: + - tweak: Sandbags are no longer tablecrafted. Now you just put in sand (or ash) + by hand to make them. + - rscadd: Miners and Engis now get boxes of empty sandbags in their lockers. Miners + also get a few premade aswell. + - rscadd: You can now break sandstone down into normal sand. + Joan: + - rscadd: Attacking a blob with an analyzer will tell you what its chemical does, + its health, and a small fact about the blob analyzed. + - rscdel: 'NERFS:' + - tweak: Zombifying Feelers does less toxin damage. + - tweak: Adaptive Nexuses does slightly less brute damage. + - tweak: Replicating Foam does slightly less brute damage. + - tweak: Blob Sorium does slightly less brute damage. + - tweak: Blob Dark Matter does slightly less brute damage. + - tweak: Cyrogenic Liquid injects slightly less frost oil and ice and does slightly + less stamina damage. + - tweak: Pressurized Slime does less brute, oxygen, and stamina damage, and extinguishes + objects and people on turfs it wets. + - rscdel: Blob core strong blobs no longer give points when removed. + - wip: 'PROBABLY BUFFS:' + - tweak: Flammable Goo now does slightly more burn damage and applies more firestacks, + but applies fire to blob tiles that don't share its chemical. + - tweak: Energized Fibers does slightly more burn damage, slightly less stamina + damage, and now takes damage from EMPs. + - rscadd: 'BUFFS:' + - tweak: Boiling Oil does slightly more burn damage and applies more firestacks. + - tweak: Reactive Gelatin does slightly more damage on average. + - tweak: Penetrating Spines now also ignores bio resistance in addition to armor. + - tweak: Hallucinogenic Nectar causes more hallucinations. + - tweak: Normal strong blobs now refund 4 points when removed, from 2. + - rscadd: Charger holoparasites now play a sound when hitting a target, as well + as shaking the target's camera. + PKPenguin321: + - rscadd: The warden's locker now contains krav maga gloves. + TechnoAlchemisto: + - rscadd: You can now craft skull helmets from bones. + - rscadd: Syndicate bombs are now harder to detect +2016-04-29: + Bawhoppen: + - rscadd: Several lesser-used uplink's TC cost have been rebalanced. + - tweak: Steckhin down from 9TC to 7TC. + - tweak: Tactical medkit down from 9TC to 4TC. + - tweak: Syndicate magboots from 3TC to 2TC. + - tweak: Powersinks down from 10TC to 6TC. + - tweak: Stealth rad-laser down from 5TC to 3TC. + - tweak: Bundles have been updated accordingly. + Incoming5643: + - rscadd: The staff/wand of door creation can now also be used to open airlock doors. + - rscadd: Doors spawned by the staff/wand now start open. Keep this in mind the + next time you try to turn every wall on the escape shuttle into a door. + Robustin: + - rscdel: The Teleport Other, Veil, Imbue, Reveal, Disguise, Blood Drain, Timestop, + Stun, Deafen, Blind, Armaments, Construct Shell and Summon Tome runes are gone. + - rscadd: Disguise, Veil/Reveal, Construct Shell and Armaments are now talismans. + The Construction talisman requires 25 sheets of metal. + - rscadd: Cultists will now receive a warning when attempting to use emergency communion + or create the Nar-Sie rune + - rscadd: Cultists can now create talismans with a super-simple Talisman-Creation + rune. It takes about 10 seconds to invoke and will present a menu of all the + talisman choices available. Its as simple as tossing the paper on, clicking + the rune, and selecting your talisman. + - rscadd: Cultists now have a proc, "How to Play" that will give a basic explanation + of how to succeed as a cultist. + - rscadd: The new Talisman of Horror is a stealthy talisman that will cause hallucinations + in the victim. Great for undermining security without having to commit to murder + them in middle of the hall. + - rscadd: Creating the Summon Nar-Sie rune does takes slightly less time, but now + adds a 3x3 square of red barrier shields (60hp each) to prevent the rune-scriber + from being bumped by other idiots. This works in conjunction with the rune's + warning to give crew a chance to stop the summoning. Manifest ghost has a weaker + 1x1 shield to prevent bumps as well. + - rscadd: Talismans are now color-coded by their effect so you can easily organize + and deploy talismans. + - rscadd: You can now make colored paper in the washing machine using crayons or + stamps, honk. + - rscadd: The Electromagnetic Disruption rune will now scale with the number of + cultists invoking the rune. **A full 9-cultist invocation will EMP the entire + station!** + - rscadd: Armaments will now give the recipient a new cult bola. + - rscadd: The new Talisman of Shackling will apply handcuffs directly to the victim. + These cuffs will disappear when removed. + - tweak: Cult slur is a little less potent so victims might be able to squeeze in + a coherent word or two if you let them keep jabbering on the radio, stun talismans + now have less of a health cost and the stun is back to 10 seconds, from 9. + - tweak: Rune and Talisman names now give a much clearer idea of what they do. + - experiment: The following changes are courtesy of ChangelingRain + - rscadd: The Teleport rune now allows cultists to select which rune to teleport + to, and teleports everything on it. + - rscadd: Veil and Reveal are merged into Talisman of Veiling. Veiling has two uses, + the first use will hide and the second use will reveal. + - rscadd: New icons for the cult bola + - tweak: You can now attack fellow cultists with a Talisman of Arming to arm them + with robes and a sword. + - tweak: You can now only place one rune per tile. + - tweak: Ghosts are notified when a new manifest rune is created. + TechnoAlchemisto: + - rscadd: Sinew can now be fashioned into restraints. + coiax: + - tweak: Internals Crate now contains breath masks and small tanks. + - rscadd: Metal foam grenade box crate added for 1000 points + - rscadd: Added two Engineering Mesons to Engineering Gear Crate + - tweak: Engineering Gear now costs 1300 + - rscadd: Breach Shield Generator Crate added for 2500 points + - rscadd: Grounding Rod Crate added for 1700 points + - rscadd: PACMAN Generator Crate added for 2500 + - rscadd: Defibrillator Crate added for 2500 + - rscadd: Added more helmets to the Laser Tag Crate. + - rscadd: Nanotrasen Customs report that some wide band suppliers have been providing + "alternative" firing pins. Nanotrasen reminds all crewmembers that contraband + is contraband. + - rscadd: Contraband crates now appear visually similar to legitimate crates. + - bugfix: The cargo shuttle's normal transit time has been restored. + nullbear: + - rscadd: Adds a preference option, allowing players to toggle whether recipes with + no matching components should be hidden. +2016-04-30: + Joan: + - rscadd: Blobs attempting to attack the supermatter will instead be eaten by it. + - experiment: This doesn't mean throwing a supermatter shard at the blob is a good + idea; blobs attacking it will gradually damage it, eventually resulting in a + massive explosion, and it will not consume blobs if on a space turf. + - tweak: Hitting a locker or crate with an ID, PDA with ID, or wallet with ID will + try to toggle the lock instead of trying to open it. + - imageadd: Cable coils, cablecuffs, and zipties now all have properly colored inhands. + Kor: + - rscadd: Megafauna have been added to lavaland. + - rscadd: Ash Drakes have been spotted roaming the wastes. Use your GPS to track + their fiery signals. + - rscadd: You can now knock on the Necropolis door, but it's probably best that + you don't. + Mercenaryblue: + - rscadd: Adds a basic paper plane to the game. Fold paper with alt-clicking. + - rscadd: Paper planes are now fully compatible with every stamps on station. + bgobandit: + - rscadd: 'Nanotrasen has released Cards Against Spess! Visit your local library + for a copy. Warning: may cause breakage of the fourth wall.' +2016-05-02: + Joan: + - tweak: Blob spores spawn from factories 2 seconds faster, but the factory goes + on cooldown when any of its spores die. + - experiment: You can examine tomes, soulstones, and construct shells to see what + you can do with them. + - rscadd: Releasing a shade from a soulstone now allows you to reuse that soulstone + for capturing shades or souls, instead of preventing the stone's use forever + if the shade dies. + - imageadd: Runes now actually pulse red on failure. + - rscadd: The Summon Cultist rune no longer includes the cultists invoking it in + the selection menu. + - tweak: Imperfect Communication renamed to Emergency Communication. + - rscdel: You can no longer hide the Nar-Sie rune with a Talisman of Veiling/Revealing. + Kor: + - rscadd: Engineering cyborgs now have internal blueprints. + Lzimann: + - tweak: Automatic nexus placing time changed from 2 to 15 minutes. + - tweak: Prophet's gear(hat and staff) prioritizes the backpack instead of automatically + equipping. + - rscadd: Divine telepathy and prophet to god speak now have a follow button for + ghosts. + - rscadd: Divine telepathy and prophet to god speak now has the god's color. + - bugfix: CTF spawn protection trap is no longer constructable + Mercenaryblue: + - tweak: Drastically reduced the chances of eye damage when throwing a paper plane. + RandomMarine: + - tweak: Medical HUDs improved. To better prioritize patients, subjects deep into + critical condition have a blinking red outline around the entire HUD icon, and + will blink more rapidly when very close to death. + TechnoAlchemisto: + - tweak: Security uniforms have been made more professional, and more tactical. + TrustyGun: + - rscadd: By crafting together a legion skull, a goliath steak, ketchup, and capsaicin + oil, you can create Stuffed Legion! Be careful, it's hot. + coiax: + - rscadd: Centcom Department of [REDACTED] have announced a change of supplier of + [EXPLETIVE DELETED]. As such, for security reasons, the absinthe [MOVE ALONG + CITIZEN] will instead be [NOTHING TO SEE HERE]. We hope that this will not affect + the performance of the [INFORMATION ABOVE YOUR SECURITY CLEARANCE]. + nullbear: + - rscadd: A reminder for crew to avoid mopping floors in cold rooms, as the water + will freeze and provide a dangerous slipping hazard known as 'ice'. Running + on it is not recommended. + - rscadd: Frostoil is an effective chemical for rapidly cooling areas in the event + of a fire. + - rscadd: Added X4, a breaching charge more destructive than C4, it can be purchased + from uplinks. + - rscadd: C4 can be used with assemblies. + - bugfix: Fixes chembomb recipe to use any matter bin. Again. + - bugfix: ARG's disappear once finished reacting. +2016-05-03: + coiax, Robustin: + - tweak: Changeling Fleshmend is much less effective when used repeatedly in a short + time. Changeling Panacea is much more effective at purging reagents, reducing + radiation and now reduces braindamage. +2016-05-04: + Fox McCloud: + - tweak: shock revolver projectiles are now energy instead of bullets + Joan: + - rscdel: Cultists no longer communicate via tomes. + - rscadd: Cultists now communicate via the 'Communion' action button. + - rscadd: Examining the blob with an active research scanner or medical hud will + display effects, akin to hitting it with an analyzer. + - rscadd: Improved medical HUDs to work on all living creatures. + - rscadd: Drones and swarmers, being machines, require a diagnostic HUD for analysis + instead. + TechnoAlchemist: + - rscadd: You can now craft cloaks from the scales of fallen ash drakes, look for + the recipe in tablecrafting! + coiax: + - rscadd: The Service and the Standard cyborg module now have a spraycan built in, + for hijinks and passing on important urban messages. The Service cyborg module + also has a cyborg-hand labeler, in case anything needs to be labelled. + - rscadd: 'Centcom Suicide Prevention wishes to remind the station: Please do not + kill yourself with a hand labeler.' + xxalpha: + - bugfix: Fixed the mk-honk prototype shoes. +2016-05-05: + Joan: + - tweak: Revenants are slower while revealed. + - rscdel: Revenants can no longer cast inside dense objects. + - tweak: Lying down will cure Blight much, much faster. + \"Macho Man\" Randy Savage: + - rscadd: OOOHHH YEAAAAHHHH + - rscadd: SNAP INTO A JLIM SIM WITH THE ALL NEW WRESTLING BELT + - rscadd: YOU CAN FREAKOUT YOUR OPPONENTS WITH THE 5 HOT MOVES ON THIS BELT YEAH + - rscadd: PRAY TO THE LOCAL SPACE GODS TO EXCHANGE YOUR TELECRYSTALS TO ENSURE THE + CREAM RISES TO THE TOP +2016-05-07: + Robustin: + - rscadd: A small pantry has been added to SW maintenance. + nullbear: + - rscadd: Makes Shift+Middleclick the hotkey for pointing. + phil235: + - rscadd: DISMEMBERMENT! Humans can now lose their bodyparts. Explosions and being + attacked with a heavy sharp item on a specific bodypart can cause dismemberment. + - rscadd: You can't be handcuffed or legcuffed if you're missing an arm or leg. + You can't use items when you have no legs, your arms are too busy helping you + crawl, unless your are buckled to a chair. You're slower when missing a leg. + - rscadd: You lose organs and items if the bodypart they are inside gets cut off. + You can always retrieve them by cutting the dropped bodypart with a sharp object. + - rscadd: Medbay can replace your missing limbs with robotic parts via surgery, + or amputate you. + - rscadd: Changelings do not die when decapitated! They can regrow all their limbs + with Fleshmend, or just one arm with Arm Blade or Organic Shield. + - rscadd: Your chest cannot be dropped, but it will spill its organs onto the ground + when dismembered. +2016-05-08: + CoreOverload: + - rscadd: You can now de-power inactive swarmers with a screwdriver to prevent them + from activating. + - rscadd: Recycle depowered swarmers in autolathe or sell them in cargo! + Joan: + - rscadd: Cultist constructs, and shades, can now invoke runes by clicking them. + - rscdel: This does not include Manifest Ghost, Blood Boil, or Astral Journey runes. + - rscadd: Medical huds will now show parasites in dead creatures. + KorPhaeron: + - rscadd: Burn weapons can now dismember, and they reduce the limb to ash in the + process + - rscadd: Weapons with high AP values will now dismember limbs much easier. These + values are subject to change depending on how things play out over the next + week or two. + - rscadd: Various weapons with high AP values had them lowered (chaplain scythe, + energy sword, dualsaber) to prevent them taking limbs off in a single hit. + - rscadd: The chaplain has two new weapons (they are mechanically identical to previous + weapons, before anyone gets upset about balance). One is dismemberment themed, + the other is related to a new antagonist. + Mercenaryblue: + - rscadd: Throwing a Banana Cream Pie will now knock down and cream the target's + face. + - rscadd: You can clean off the cream with the usual methods, such as soap, shower, + cleaner spray, etc. + - rscadd: The Clown Federation would like to remind the crew that the HoS is worth + double points! Honk! + Robustin: + - experiment: There are rumors that the Cult's 'Talisman of Construction', which + turns ordinary metal for construct shells, can be used on plasteel to create + structures. If the stories are true, the cult has been producing relics of incredible + power through this transmutation. + coiax: + - rscadd: To save credits, Centcom has subcontracted out emergency shuttle design + to third parties. Rest assured, all of these produced shuttles meet our stringent + quality control. + - tweak: Lavaland ruins spawning chances have been modified. Expect to see more + smaller and less round affecting ruins, and no duplicates of major ruins, like + ash walkers or golems. + lordpidey: + - rscadd: Infernal devils have been seen onboard our spacestations, offering great + boons in exchange for souls. + - rscadd: Employees are reminded that their souls already belong to nanotrasen. If + you have sold your soul in error, a lawyer or head of personnel can help return + your soul to Nanotrasen by hitting you with your employment contract. + - rscadd: Nanotrasen headquarters will be bluespacing employment contracts into + the Lawyer's office filing cabinet when a new arrival reaches the station. It + is recommended that the lawyer create copies of some of these for safe keeping. + - rscadd: Due to the recent infernal incursions, the station library has been equipped + with a Codex Gigas to help research infernal weaknesses. Please note that reading + this book may have unintended side effects. Also note, you must spell the devil's + name exactly, as there are countless demons with similar names. + - rscadd: When a devil dies, if the proper banishment ritual is not performed on + it's remains, the devil will revive itself at the cost of some of it's power. The + banishment ritual is described in the Codex Gigas. + - rscadd: When a demon gains enough souls, It's form will mutate to a more demonic + looking form. The Arch-demon form is known to be on par with an ascended shadowling + in power. +2016-05-09: + Joan: + - tweak: Sporing Pods produces spores when expanding slightly more often. + - tweak: Replicating Foam now only expands when hit with burn damage, from all damage, + but does so at a higher chance. Free expansion from it is, however, more rare. + - tweak: Penetrating Spines does slightly more brute damage, and Poisonous Strands + does its damage 50% faster. + KorPhaeron: + - rscadd: The AI no longer has a tracking delay because artificial lag is the most + miserable thing in the world. + Razharas: + - tweak: crafting can now be done everywhere, little button near the intents with + hammer on it(its not T) opens the crafting menu, if you are in a locker or mech + only things in your hands will be considered for crafting + coiax: + - tweak: Skeletons now have bone "tongues" +2016-05-11: + Joan: + - rscadd: Shades can move in space. + - rscadd: Artificers can now heal shades. + coiax: + - tweak: Added action button to chameleon stamp + - rscadd: Added APPROVED and DENIED stamps to Bureaucracy Crate + - rscadd: Added the cream pie closet to various maps. Added contraband Cream Pie + Crate to Cargo. + pudl: + - rscadd: The armory has been redesigned. +2016-05-12: + Shadowlight and coiax: + - rscdel: Due to numerous reports of teams using human weapons instead of stealth + when carrying out their assignments, future teams have been genetically modified + to only be able to use their assigned blaster and are unable to use human weapons. +2016-05-13: + Joan: + - rscadd: Cultists can now unanchor and reanchor cult structures by hitting them + with a tome. Unanchored cult structures don't do anything. + KorPhaeron: + - rscadd: Drake attacks are now much easier to avoid. + - rscadd: Player controlled drakes can now consume bodies to heal, and alt+click + targets to divebomb them. + TechnoAlchemisto: + - rscadd: More items have been added to the mining vendor, check them out! +2016-05-14: + Cruix: + - bugfix: Fixed foam darts with the safety cap removed being reset when fired. + - rscadd: Added the ability to remove pens from foam darts. + - bugfix: Foam darts with pens inside them are no longer destroyed when fired. + - bugfix: Foam darts no longer drop two darts when fired at a person on a janicart. + Joan: + - rscdel: The Raise Dead rune no longer accepts dead cultists as a sacrifice to + raise the dead. + Metacide: + - rscadd: 'A small update for MetaStation, changes include:' + - rscadd: Added extra grounding rods to the engine area to stop camera destruction. + - rscadd: Added canvases and extra crayons to art storage and some easels to maint. + - rscadd: Added formal security uniform crate for parades to the warden's gear area. + - rscadd: The armory securitron now starts active. + - rscadd: The genetics APC now starts unlocked. + - rscadd: Other minor changes and fixes as detailed on the wiki page. + coiax, Nienhaus: + - rscdel: Unfortunately, the Belowyarn toys have been withdrawn from distribution + due to Assistants choking on the batteries. Centcom has sent their condolences + to the battery manufacturing plant. + - rscadd: We are introducing Oh-cee the original content skeleton figurines. Pull + its string, and hear it say a variety of phrases. Not suitable for infants or + assistants under 36 months. + - tweak: Note that pulling the string of all talking toys is now visible to others. + - rscadd: Talking toys produce a lot more chatter than they did before. So do some + skeleton "tongues". + pudl: + - rscadd: Adds normal security headsets to security lockers + xxalpha: + - bugfix: Fixed drone dispenser multiplying glass or metal. +2016-05-15: + Iamgoofball: + - rscadd: Nanotrasen is short on cash, and are now borrowing escape shuttles from + other stations, and Space Apartments. + Mercenaryblue: + - rscadd: Turns out a bike horn made with Bananium is flipping awesome! Honk! +2016-05-18: + Cruix: + - bugfix: unwrapping an item with telekinesis no longer teleports the item into + your hand. + Metacide: + - rscadd: 'MetaStation: the library and chapel have had windows removed to make + them feel more isolated.' + MrStonedOne: + - tweak: Tesla has been rebalanced. + - tweak: It should now lose balls slower, increase balls faster, and be a bit more + aggressive about finding nearby grounding rods. + - tweak: additional zaps from it's orbiting balls should be a bit more varied, but + a touch less powerful. + Robustin: + - rscadd: Lings have a new default ability, Hivemind Link. This lets you bring a + neck-grabbed victim into hivemind communications after short period of time. + You can talk to victims who are in crit/muted and perhaps persuade them to help + you, give you intel, or even a PDA code. The link will stabilize crit victims + to help ensure they do not die during the link. + Shadowlight213: + - bugfix: Cleanbot and floorbot scanning has greatly improved. they should prioritize + areas next to them, as well as resolve themselves stacking on the same tiles. + coiax: + - rscadd: Kinetic accelerators only require one hand to be fired, as before + - rscdel: Kinetic accelerators recharge time is multiplied by the number of KAs + that person is carrying. + - rscdel: Kinetic accelerators lose their charge quickly if not equipped or being + held + - rscadd: Kinetic accelerator modkits (made at R&D or your local Free Golem ship) + overcome these flaws +2016-05-19: + Razharas: + - rscadd: HE pipes once again work in space and in lava. + - rscadd: Space cools down station air again +2016-05-20: + KorPhaeron: + - rscadd: The HoS now has a pinpointer, the Warden now has his door remote. + bgobandit: + - rscadd: Nanotrasen has begun to research BZ, a hallucinogenic gas. We trust you + will use it responsibly. + - rscadd: BZ causes hallucinations once breathed in and, at high doses, has a chance + of doing brain damage. + - rscadd: BZ is known to cause unusual stasis-like behavior in the slime species. + coiax: + - rscadd: Neurotoxin spit can be used as makeshift space propulsion +2016-05-21: + Iamsaltball: + - rscadd: Heads of Staff now have basic Maint. access. + NicholasM10: + - rscadd: The chef can now make Khinkali and Khachapuri + coiax: + - rscdel: NOBREATH species (golems, skeletons, abductors, ash walkers, zombies) + no longer have or require lungs. They no longer take suffocation/oxyloss damage, + cannot give CPR and cannot benefit from CPR. Instead of suffocation damage, + during crit they take gradual brute damage. + - rscdel: NOBLOOD (golems, skeletons, abductors, slimepeople, plasmamen) species + no longer have or require hearts. + - tweak: NOBREATH species that require hearts still take damage from heart attacks, + as their tissues die and the lack of circulation causes toxins to build up. + - rscdel: NOHUNGER (plasmamen, skeletons) species no longer have appendixes. + coiax, OPDingo: + - tweak: Renamed and reskinned legion's heart to legion's soul to avoid confusion; + it is not a substitute heart, it is a supplemental chest organ. + - rscadd: Legion's souls are now more obviously inert when becoming inert. + nullbear: + - tweak: Wetness updates less often. + - rscadd: Wetness now stacks. Spraying lube over a tile that already has lube, will + make the lube take longer to dry. Likewise, dumping 100 units of lube will take + longer to dry than if only 10 units were dumped. (lube used to last just as + long, regardless of whether it was 1u, or 100u) There is a limit, however, and + you can't stack infinite lube. + - tweak: Hotter temperatures cause water to evaporate more quickly. At 100C, water + will boil away instantly. + - rscadd: About 5 seconds of wetness are removed from a tile for each unit of drying + agent. Absorbant Galoshes remain the most effective method of drying, and dry + tiles instantly regardless of wetness. +2016-05-22: + coiax: + - rscdel: Lavaland monsters now give ruins a wide berth. + - bugfix: Glass tables now break when people are pushed onto them. +2016-05-23: + CoreOverload: + - rscadd: New cyberimplant, "Toolset Arm", is now available in RnD. + coiax, OPDingo: + - rscadd: Crayons and spraycans are now easier to use. + - rscdel: Centcom announce due to budget cuts their supplier of rainbow crayons + has been forced to use more... exotic chemicals. Please do not ingest your standard + issue crayon. + kevinz000: + - rscadd: 'Peacekeeper borgs: Security borgs but without any stuns or restraints! + Modules: Harm Alarm, Cookie Dispenser, Energy Bola Launcher, Peace Injector + that confuses living things, and a weak holobarrier projector! It also comes + with the ability to hug.' + - rscadd: 'Cookie Synthesizer: Self recharging RCD that prints out cookies!' + - tweak: Nanotrasen scientists have added a hugging module to medical and peacekeeper + cyborgs to boost emotions during human-cyborg interaction. +2016-05-24: + Joan: + - rscdel: You can no longer scribe the Summon Nar-Sie rune under non-valid conditions. + Kiazusho: + - rscadd: Added three new advanced syringes to R&D +2016-05-26: + Xhuis: + - rscadd: Purge all untruths and honor Ratvar. + coiax: + - bugfix: Fixes bug where bolt of change to the host would kill an attached guardian. + - bugfix: Fixes bug where bolt of change to laughter demon would not release its + friends. + - bugfix: Fixes bug where bolt of change to morphling would not release its contents. + - bugfix: Fixes bug where bolt of change transforming someone into a drone would + not give them hacked laws and vision. + - bugfix: Blobbernauts created by a staff of change are now "independent" and will + not decay if seperated from a blob or missing a factory. + - rscadd: Independent blobbernauts added to gold slime core spawn pool. + - rscadd: Medical scanners now inform the user if the dead subject is within the + (currently) 120 second defib window. + - rscadd: Ghosts now have the "Restore Character Name" verb, which will set their + ghost appearance and dead chat name to their character preferences. + - bugfix: Mob spawners now give any generated names to the mind of the spawned mob, + meaning ghosts will have the name they had in life. + - bugfix: Fixes interaction with envy's knife and lavaland spawns. + - bugfix: Fixes a bug where swarmers teleporting humans would incorrectly display + a visible message about restraints breaking. + - rscdel: Emagging the emergency shuttle computer with less than ten seconds until + launch no longer gives additional time. + - rscadd: The emergency shuttle computer now reads the ID in your ID slot, rather + than your hand. +2016-05-27: + coiax: + - rscdel: Gatling gun removed from R&D for pressing ceremonial reasons. + phil235: + - tweak: Pull and Grab are merged together. Pulling stays unchanged. Using an empty + hand with grab intent on a mob will pull them. Using an empty hand with grab + intent on a mob that you're already pulling will try to upgrade your grip to + aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but + they act exactly like a handcuff, preventing you from using your hands until + you escape the grip. You can break free from the grip by trying to move or using + the resist button. + - tweak: Someone pulling a restrained mob now swap position with them instead of + getting blocked by the mob, unable to even push them. +2016-05-29: + GunHog: + - rscadd: The CE, RD, and CMO have been issued megaphones. + Paprika, Crystalwarrior, Korphaeron and Bawhoppen: + - rscadd: Pixel projectiles. This is easier to see than explain, so go fire a weapon. + Xhuis: + - rscadd: Ratvar and Nar-Sie now actively seek each other out if they both exist. + - tweak: Celestial gateway animations have been twweaked. + - tweak: Ratvar now has a new sound and message upon spawning. + - tweak: Ratvar now only moves one tile at a time. + - bugfix: The celestial gateway now takes an unreasonably long amount of time. + - bugfix: God clashing is now much more likely to work properly. + - bugfix: Function Call now works as intended. + - bugfix: Break Will now works as intended. + - bugfix: Holy water now properly deconverts servants of Ratvar. + - bugfix: Deconverted servants of Ratvar are no longer considered servants. + pudl: + - rscadd: Chemicals should now have color, instead of just being pink. +2016-05-30: + coiax: + - rscadd: A new Shuttle Manipulator verb has been added for quick access to probably + the best and most mostly bugfree feature on /tg/. + - rscadd: Spectral sword is now a point of interest for ghosts. + - bugfix: Clicking the spectral sword action now orbits the sword, instead of just + teleporting to its location. + - bugfix: Gang tags can again be sprayed over. + - bugfix: Fixes bug where the wisp was unable to be recalled to the lantern. + xxalpha: + - rscdel: Engineering, CE and Atmos hardsuits no longer have in-built jetpacks. +2016-05-31: + CoreOverload: + - rscadd: 'Cleanbot software was updated to version 1.2, improving pathfinding and + adding two new cleaning options: "Clean Trash" and "Exterminate Pests".' + - experiment: New cleaning options are still experimental and disabled by default. + Kiazusho: + - bugfix: Changeling organic suit and chitin armor can be toggled off once again. + Kor: + - rscadd: The Japanese Animes button is back, + - rscadd: 'The chaplain has three new weapons: The possessed blade, the extra-dimensional + blade, and the nautical energy sword. The former has a new power, the latter + two are normal sword reskins.' + - rscadd: The chapel mass driver has been buffed. + coiax: + - rscdel: Zombies can no longer be butchered + - rscadd: If you encounter an infectious zombie, be cautious, its claws will infect + you, and on death you will rise with them. If you manage to kill the beast, + you can remove the corruption from its brain via surgery, or just chop off the + head to stop it coming back. + - rscadd: Adds some stock computers and lavaland to Birdboat Station. + - bugfix: Free Golem scientists have proved that as beings made out of stone, golems + are immune to all electrical discharges, including the tesla. + - rscadd: Nuclear bombs are now points of interest. Never miss a borg steal a nuke + from the syndicate shuttle again! + - rscadd: Alt-clicking a spraycan toggles the cap. +2016-06-01: + coiax: + - rscadd: Added a mirror to the beach biodome. Beach Bums, rejoyce! + pudl: + - rscadd: The brig infirmary has received a redesign. +2016-06-02: + Joan: + - tweak: Closed false walls will block air. + Lati: + - rscadd: R&D required levels and origin tech levels have been rebalanced + - experiment: Overall, items buildable in R&D have lower tech levels and items in + other departments have their tech levels raised. Remember to use science goggles + to see tech levels of items! + - tweak: There are now level gates at high levels. R&D scientists will need help + from others to get past these level gates. + - tweak: Other departments such as hydroponics and genetics will be important to + R&D's progress now and xenobio, mining and cargo are more important than before + - tweak: Efficiency upgrades are back in R&D machines and tweaked to be less powerful + in autolathes + - rscdel: Reliability has been removed from all items + - bugfix: Most bugs in R&D machines should be fixed + PKPenguin321 & Nienhaus: + - rscadd: Letterman jackets are now available from the ClothesMate. + Quiltyquilty: + - rscadd: The bar has seen a redesign. + coiax: + - rscadd: Clone pods now notify the medical channel on a successful clone. They + also notify the medical channel if the clone dies or is horribly mutilated; + but not if it is ejected early by authorised medical personnel. + - rscadd: Cloning pods now are more capable of cloning humanoid species that do + not breathe. + - bugfix: You can only be damaged once by a shuttle's arrival. It is still unpleasant + to be in the path of one though; try to avoid it. + - rscadd: Adds Asteroid emergency shuttle to shuttle templates. It is a very oddly + shaped one though, it might not be compatible with all stations. + - rscdel: The Chaplain soulshard can only turn a body into a shade once. A released + shade can still be reabsorbed by the stone to heal it. + - rscadd: The shuttle manipulator now has a Fast Travel button, for those admins + that really want a shuttle to get to where its going FAST. +2016-06-04: + MrStonedOne: + - bugfix: fixes see_darkness improperly hiding ghosts in certain cases. + Xhuis: + - tweak: Clockwork marauders can now smash walls and tables. + - tweak: Servants are no longer turned into harvesters by Nar-Sie but instead take + heavy brute damage and begin to bleed. Similarly, cultists are no longer converted + by Ratvar but instead take heavy fire damage and are set ablaze. + - rscadd: Added clockwork reclaimers. Ghosts can now click on Ratvar to become clockwork + reclaimers - small constructs capable of forcefully converting those that still + resist Ratvar's reign. Alt-clicking a valid target will allow the reclaimer + to leap onto the head of any non-servant, latching onto their head and converting + the target if they are able. The target will be outfitted with an unremovable, + acid-proof hat version of the reclaimer. The reclaimer will be able to speak + as normal and attack its host and anything nearby. If the reclaimer's host goes + unconscious or dies, it will leap free. + - rscadd: Added pinion airlocks. These airlocks can only be opened by servants and + conventional deconstruction will not work on them. They can be created by proselytizing + a normal airlock or from Ratvar. + - rscadd: Added ratvarian windows. They are created when Ratvar twists the form + of a normal window, and there are both single-direction and full-tile variants. + - bugfix: Non-servants can no longer use clockwork proselytizers or mending motors. + - bugfix: Servants are now deconverted properly. + coiax: + - bugfix: The cloning pod now sounds robotic on the radio. + - rscadd: For extra observer drama, ghosts can now visibly see the countdown of + syndicate bombs, nuclear devices, cloning pods, gang dominators and AI doomsday + devices. +2016-06-05: + Joan: + - rscadd: Clockwork structures can be damaged by projectiles and simple animals, + and will actually drop debris when destroyed. + - rscadd: AIs and Cyborgs that serve Ratvar can control clockwork airlocks and clockwork + windoors. + - rscadd: The clockwork proselytizer can now proselytize windows, doors, grilles, + and windoors. + - rscadd: The clockwork proselytizer can proselytize wall gears and alloy shards + to produce replicant alloy. It can also proselytize replicant alloy to refill, + in addition to refilling by attacking it with alloy. + - rscadd: The clockwork proselytizer can replace clockwork floors with clockwork + walls and vice versa. + - rscadd: Ratvar will convert windoors, tables, and computers in addition to everything + else. + - tweak: Ratvar now moves around much faster. + - rscadd: Ratvar and Nar-Sie will break each other's objects. + - tweak: The blind eye from a broken ocular warden now serves as a belligerent eye + instead of as replicant alloy. The pinion lock from a deconstructed clockwork + airlock now serves as a vanguard cogwheel instead of as replicant alloy. + - rscadd: Clockwork walls drop a wall gear when removed by a welding tool. The wall + gear is dense, but can be climbed over or unwrenched, and drops alloy shards + when broken. Clockwork walls drop alloy shards when broken by other means. + - bugfix: Fixed Nar-Sie wandering while battling Ratvar. + - bugfix: Ratvarian Spears now last for the proper 5 minute duration. + - bugfix: Servant communication now has ghost follow links. + - imageadd: New sigil sprites, courtesy Skowron. + - imageadd: Sigils of Transgression have a visual effect when stunning a target. + - imageadd: Clockwork spears now have a visual effect when breaking. + PKPenguin321: + - rscadd: The CMO's medical HUD implant now comes with a one-use autoimplanter for + ease of use. + RemieRichards: + - rscadd: Slimes may now be ordered to attack! You must be VERY good friends with + the slime(s) to give this command, asking them to attack their friends or other + slimes will result in them liking you less so be careful! + X-TheDark: + - rscadd: Mech battery replacement improved. The inserted battery's charge will + be set to the same percentage of the removed one's (or 10%, if removed one's + was less). + coiax: + - bugfix: Clicking the (F) link when an AI talks in binary chat will follow its + camera eye, the same as when (F) is clicked for its radio chat. + - bugfix: Laughter demons should now always let their friends go when asked correctly. + - rscadd: Cloning pods now grab the clone's mind when the body is ejected, rather + than when it starts cloning. + - rscadd: Wizards have been experimenting with summoning the slightly less lethal + "laughter demon". Please be aware that these demons appear to be nearly as dangerous + as their slaughter cousins. But adorable, nonetheless. + kevinz000: + - rscadd: Gravity Guns! It is a mildly expensive R&D gun that has a 5 second cooldown + between shots, but doesn't need to be recharged. It has two modes, attract and + repulse. For all your gravity-manipulation needs! +2016-06-07: + Bobylein: + - rscadd: Nanotrasen is finally able to source transparent bottles for chemistry. + Iamgoofball: + - experiment: The Greytide Virus got some teeth. + Joan: + - wip: This is a bunch of Clockwork Cult changes. + - rscadd: Added the Clockwork Obelisk, an Application scripture that produces a + clockwork obelisk, which can Hierophant Broadcast a large message to all servants + or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious + servant or clockwork obelisk. + - wip: Spatial Gateways of any source have doubled uses and duration when the target + is a clockwork obelisk. + - rscadd: Added the Mania Motor, an Application scripture that produces a mania + motor, which, while active, causes hallucinations and brain damage in all nearby + humans. + - wip: The Mania Motor will try to convert any non-servant human directly adjacent + to it at an additional power cost and will remove brain damage, hallucinations, + and the druggy effect from servants. + - rscadd: Added the Vitality Matrix, an Application scripture that produces a sigil + that will slowly drain health from non-servants that remain on it. Servants + that remain on the sigil will instead be healed with the vitality drained from + non-servants. + - wip: The Vitality Matrix can revive dead servants for a cost of 25 vitality plus + all non-oxygen damage the servant has. If it cannot immediately revive a servant, + it will still heal their corpse. + - experiment: Most clockwork structures, including the Mending Motor, Interdiction + Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power + to function. + - wip: Mending Motors can still use alloy for power. + - tweak: The Sigil of Transmission has been remade into a power battery and will + power directly adjecent clockwork structures. Sigils of Transmission start off + with 4000 power and can be recharged with Volt Void. + - tweak: Volt Void drains somewhat more power, but will not damage the invoker unless + they drain too much power. Invokers with augmented limbs will instead have those + limbs healed unless they drain especially massive amounts of power. + - wip: Using Volt Void on top of a Sigil of Transmission will transfer most of the + power drained to the Sigil of Transmission, effectively making it far less likely + to damage the invoker. + - rscdel: You can no longer stack most sigils and clockwork objects with themself. + You can still have multiple different objects or sigils on a tile, however. + - tweak: The Break Will Script has been renamed to Dementia Doctrine, is slightly + faster, and causes slightly more brain damage. + - tweak: The Judicial Visor now uses an action button instead of alt-click. Cultists + of Nar-Sie judged by the visor will be stunned for half duration, but will be + set on fire. + - tweak: Multiple scriptures have had their component requirements changed. The + Summon Judicial Visor Script has been reduced from a Script to a Driver. + - rscadd: Recollection will now show both required and consumed components. + - tweak: Clockwork Marauders can now emerge from their host if their host is at + or below 60% total health(for humans, this is 20 health out of crit) + - tweak: Clockwork Marauders will slowly heal if directly adjacent to their host + and have a slightly larger threshold for their no-Fatigue bonus damage. + Quiltyquilty: + - rscadd: Botany, atmospherics and cargo now all have access to high-capacity watertanks. + - rscadd: The bar has now been outfitted with custom bar stools. + Xhuis: + - rscdel: Removed the global message played when Nar-Sie _begins_ to spawn (but + not when it actually spawns). + - tweak: Drunkenness recovery speed now increases with how drunk the imbiber is + and is much quicker when the imbiber is asleep. + - tweak: Suit storage units now take three seconds to enter (up from one) and have + different sounds and messages for UV ray cauterization. + - bugfix: Fixed some bugs with the suit storage unit, inserting mobs, and contents + to seemed to duplicate themselves. + - bugfix: The Summon Nar-Sie rune can now only be drawn on original station tiles + and fails to invoke if scribed on the station then moved elsewhere. + coiax: + - rscdel: Bluespace shelter capsules can no longer be used on shuttles. + - rscadd: Bluespace shelters may have different capsules stored. View what your + capsule has inside by examining it. + - rscdel: The Nar'sie rune cannot be scribed on shuttles or off Z-level. + - rscadd: The Raise Dead rune automatically grabs the ghost of the raised corpse. + - rscadd: Deadchat is now notified when a sentient mob dies. + phil235: + - rscadd: Monkeys and all other animals that should have blood now has it. Beating + them up will make you and your weapon bloody, just like beating a human does. + Dragging them when wounded and lying will leave a blood trail. Their blood is + still mostly cosmetic, they suffer no effects from low blood level, unlike humans. + - rscadd: When a mob leaves a blood trail while dragged, it loses blood. You can + no longer drag a corpse to make an inifinite amount of blood trails, because + once the victim's blood reaches a certain threshold it no longer leaves a blood + trail (and no longer lose any more blood). The threshold depends on how much + damage the mob has taken. You can always avoid hurting the dragged mob by making + them stand up or by buckling them to something or by putting them in a container. + - rscdel: You can no longer empty a mob of its blood entirely with a syringe, once + the mob's blood volume reaches a critically low level you are unable to draw + any more blood from it. + - tweak: A changeling absorbing a human now sucks all their blood. +2016-06-08: + Cruix: + - bugfix: Changelings no longer lose the regenerate ability if they respect while + in regenerative stasis. + Fox McCloud: + - bugfix: Fixes Experimentor critical reactions not working + - bugfix: Fixes Experimentor item cloning not working + - bugfix: Fixes Experimentor producing coffee vending machines instead of coffe + cups + - tweak: Experimentor can only clone critical reaction items instead of anything + with an origin tech + GunHog: + - rscadd: Nanotrasen has approved the Hyper-Kenetic Accelerator upgrade for cyborg + mining modules. + - tweak: Each of the heads' ID computers are now themed for their department! + Joan: + - tweak: Anima Fragments have slightly more health and move faster, but slow down + temporarily when taking damage. Also they can move in space now. + Kor: + - rscadd: The clown will play a sad trombone noise upon death. + - rscadd: Colossi now roam the wastes. + - rscadd: Bubblegum now roams the wastes. + PKPenguin321: + - rscadd: You can now emag chemical dispensers, such as the ones in chemistry or + the bar, to unlock illegal chemicals. + lordpidey: + - tweak: Infernal jaunt has been significantly nerfed with an enter and exit delay. +2016-06-09: + GunHog: + - rscadd: Nanotrasen scientists have completed a design for adapting mining cyborgs + to the Lavaland Wastes in the form of anti-ash storm plating. Research for this + technology must be adapted at your local station. + Joan: + - tweak: Anima Fragments have slightly less health and damage and will slow down + for longer when hit. + Kor: + - rscadd: The captain now spawns with the station charter, which allows him to name + the station. + Papa Bones: + - tweak: Loyalty implants have been refluffed to mindshield implants, they are mechanically + the same. + Xhuis: + - rscadd: You can now remove all plants and weeds from a hydroponics tray by using + a spade on it. + - rscadd: Added meatwheat, a mutated variant of wheat that can be crushed into meat + substitute. + - rscadd: Added ambrosia gaia, a mysterious plant that is rumored to provide nutrients + and water to any soil - hydroponic or otherwise - that it's planted in. + - rscadd: Added cherry bombs, a mutated variant of blue cherries that have an explosively + good taste. Oh, and don't pluck the stems. + coiax: + - tweak: The beacons from support guardians are now structures, rather than replacing + the floor tile. In practice, this will change little, aside from not leaving + empty plating when a beacon is removed because a new one has been placed. + nullbear: + - tweak: Removes the restriction on wormhole jaunters, preventing them from teleporting + you to beacons on other z-levels. + - tweak: No longer able to use beacons to bypass normal shuttle/centcomm anti-bluespace + measures. +2016-06-11: + Joan: + - rscadd: Clockwork Slabs, Clockwork Caches near walls, and Tinkerer's Daemons will + now be more likely to generate components that the clockwork cult has the least + of. + - rscadd: Destroyed Clockwork Caches will drop all Tinkerer's Daemons in them. + - tweak: Clockwork Caches can now only generate a component every 30 seconds(when + near a clockwork wall), Clockwork Slabs can only generate a component every + 40 seconds, and Tinkerer's Daemons can only generate a component every 20 seconds. + This should result in higher component generation for everything except Clockwork + Caches near clockwork walls. + - tweak: Adding a component to a Clockwork Slab instead puts that component in the + global component cache. + - tweak: Clockwork Slabs only generate components if held by a mob or in a mob's + storage, and when generating a component will prevent other Slabs held from + generating a component. + - tweak: The Replicant Driver no longer costs a Replicant Alloy to invoke; basically + you can throw free Slabs at converts. + - rscdel: Clockwork Slabs no longer have Repository as a menu option; instead, you + can examine them to see how many components they have access to. + - rscdel: Clockwork Caches directly on top of clockwork walls won't generate components + from that wall. + Lzimann: + - rscadd: Bar stools are now constructable with metal! + coiax: + - rscadd: Ghosts are notified when someone arrives on the Arrivals Shuttle. This + is independent of the announcement system, and the (F) link will follow the + arrived person. + - tweak: Slimes and aliens with custom names now retain those names when changing + forms. + kevinz000: + - bugfix: Malf AI hacking an APC that is then destroyed will no longer bug the AI + - bugfix: Being turned into a Revolutionary now stuns you for a short while. + - bugfix: Kinetic Accelerators no longer drop their firing pin or cell when destroyed + by lava + phil235: + - rscadd: Firelock assemblies can be reinforced with plasteel to construct heavy + firelocks. +2016-06-12: + Joan: + - rscadd: Attacking a human you are pulling or have grabbed with a ratvarian spear + will impale them, doing massive damage, stunning the target, and breaking the + spear if they remain conscious after being attacked. + - tweak: The Function Call verb is now an action button. + Xhuis: + - rscdel: While experimenting with floral genetic engineering, Nanotrasen botanists + discovered an explosive variety of the cherry plant. Due to gross misuse, the + genes used to produce this strain have been isolated and removed while Central + Command decides how best to modify it. + xxalpha: + - rscadd: 'New wizard spell: Spacetime Distortion.' + - rscadd: 3x1 grafitti +2016-06-13: + Joan: + - tweak: Sigils of Transgression will now only stun for about 5 seconds, from around + 10 seconds. + - tweak: Sigils of Submission take about 5 seconds to convert a target, from around + 3 seconds, and will glow faintly. + - rscadd: Sigils of any type can be attacked with an open hand to destroy them, + instead of requiring harm intent. Servants still require harm intent to do so. + Lati: + - rscadd: Nanotrasen has added one of their rare machine prototypes to cargo's selection. + It might be valuable to research. + Xhuis: + - rscadd: You can now create living cake/cat hybrids through a slightly expensive + crafting recipe. These "caks" are remarkably resilient, quickly regenerating + any brute damage dealt, and can be attacked on harm intent to take a bite to + be fed by a small amount. They serve as mobile sources of food and make great + pets. + - rscadd: If a brain occupied by a player is used in the crafting recipe for caks, + that player then takes control of the cak! +2016-06-14: + Joan: + - tweak: The Gateway to the Celestial Derelict now takes exactly 5 minutes to successfully + summon Ratvar and has 500 health, from 1000. + - rscadd: You can now actually hit people adjacent to the Gateway; only the center + of the Gateway can be attacked. The Gateway is also now dense, allowing you + to more easily shoot at it. + - rscadd: All Scripture in the Clockwork Slab's recital has a simple description. + Razharas: + - rscadd: Wiki now has the method of cultivating kudzu vines that was in game for + over a year. https://tgstation13.org/wiki/Guide_to_hydroponics#Kudzu + kevinz000: + - tweak: Gravity Guns should no longer destroy local reality when set to attract + and shot in an east cardinal direction. Added safety checks has slightly increased + the cost of the gun's fabrication. Nanotrasen apologizes for the inconvenience. + - bugfix: Gravity guns now have an inhand sprite. +2016-06-16: + GunHog: + - rscadd: In response to alarmingly high mining cyborg losses, Nanotrasen has equipped + the units with an internal positioning beacon, as standard within the module. + Joan: + - rscadd: You can now strike a Tinkerer's Cache with a Clockwork Proselytizer to + refill the Proselytizer from the global component cache. + - tweak: The Clockwork Proselytizer requires slightly less alloy to convert windows + and windoors. + - tweak: Several clockwork objects have more useful descriptions, most notably including + structures, which will show a general health level to non-servants and exact + health to servants. + - imageadd: The Clockwork Proselytizer has new, more appropriate inhands. + - tweak: Invoking Inath-Neq, the Resonant Cogwheel, now gives total invulnerability + to all servants in range for 15 seconds instead of buffing maximum health. + - tweak: Impaling a target with a ratvarian spear no longer breaks the spear. + - tweak: Judicial Markers(the things spawned from Ratvar's Flame, in turn spawned + from a Judicial Visor) explode one second faster. + - rscdel: Removed Dementia Doctrine, replacing it with an Application sigil. + - rscadd: Adds the Sigil of Accession, the previously-mentioned Application sigil, + which is much like a Sigil of Submission, except it isn't removed on converting + un-mindshielded targets and will disappear after converting a mindshielded target. + - tweak: Sigil of Submission is now a Script instead of a Driver; It's unlocked + one tier up, so you have to rely on the Drivers you have until you get Scripts, + instead of spamming both Driver sigils for free converts. + - rscadd: To replace Sigil of Submission in the Driver tier; Added Taunting Tirade, + which is a chanted scripture with a very fast invocation, which, on chanting, + confuses, dizzies, and briefly stuns nearby non-servants and allows the invoker + a brief time to relocate before continuing the chant. + - rscadd: Ghosts can now see the Gateway to the Celestial Derelict's remaining time + as a countdown. + - tweak: Anima Fragments are now slightly slower if not at maximum health and no + longer drop a soul vessel when destroyed. + Quiltyquilty: + - rscdel: Patches now hold only 40u. + - rscdel: Patches in first aid kits now only contain 20u of chemicals. + coiax: + - rscadd: Polymorphed mobs now have the same name, and where possible, the same + equipment as their previous form. +2016-06-19: + Joan: + - tweak: Assassin holoparasite attack damage increased from 13 to 15, stealth cooldown + decreased from 20 seconds to 16 seconds. + - tweak: Charger holoparasite charge cooldown decreased from 5 seconds to 4 seconds. + - tweak: Chaos holoparasite attack damage decreased from 10 to 7, range decreased + from 10 to 7. + - tweak: Lightning holoparasite attack damage increased from 5 to 7, chain damage + increased by 33%. + - rscdel: Clock cult scripture unlock now only counts humans and silicons. + - rscadd: Servants of ratvar can now create cogscarab shells with a Script scripture. + Adding a soul vessel to one will produce a small, drone-like being with an inbuilt + proselytizer and tools. + - imageadd: Clockwork mobs have their own speechbubble icons. + - tweak: Invoking Sevtug now causes massive hallucinations, brain damage, confusion, + and dizziness for all non-servant humans on the same zlevel as the invoker. + - rscdel: Invoking Sevtug is no longer mind control. RIP mind control 2016-2016. + - tweak: Clockwork slabs now produce a component every 50 seconds, from 40, Tinkerer's + Caches now produce(if near a clockwork wall) a component every 35 seconds, from + 30. + - experiment: 'Tinkerer''s daemons have a slightly higher cooldown for each component + of the type they chose to produce that''s already in the cache: This is very + slight, but it''ll add up if you have a lot of one component type and are trying + to get more of it with daemons; 5 of a component type will add a second of delay.' + Kor and Iamgoofball: + - rscadd: Miners can now purchase fulton extraction packs. + - rscadd: Miners can now purchase fulton medivac packs. + - rscadd: Two new fulton related bundles are available for purchase with vouchers. + Quiltyquilty: + - rscadd: Beepsky now has his own home in the labor shuttle room. + Wizard's Federation: + - bugfix: We've fired the old Pope, who was actually an apprentice in disguise. + We've a-pope-riately replaced him with a much more experienced magic user. + - rscadd: Some less-then-sane people have been sighted forming mysterious cults + in lieu of recent Pope sightings, lashing out at anyone who speaks ill of him. + - bugfix: We've rejiggered our trans-dimensional rifts, and almost all cases of + clergy members being flung into nothingness should be resolved. + - bugfix: All members of the Space Wizard's Clergy have been appropriately warned + about usage of skin-to-stone spells, and such there should be no more instances + of permanent statueification. + Xhuis: + - tweak: Revenants have been renamed to umbras and have undergone some tweaks. + coiax: + - rscadd: Drones can hear robotic talk, but cannot communicate on it. AIs and cyborgs + are encouraged to share information with station repair drones. + - rscadd: Potted plants can now be ordered from cargo. + - rscdel: AI turrets no longer fire at drones. +2016-06-20: + Kor: + - rscadd: Cult runes can only be scribed on station and on mining. + - rscadd: The comms console now has a new option allowing you to communicate with + the other server. + Quiltyquilty: + - rscadd: The detective has been moved to above the post office. + coiax: + - rscadd: Birdboat's supply loop has been split into two unconnected halves, to + maintain award winning air quality. + incoming5643: + - experiment: New abilities for some races! + - rscadd: Skeletons (liches) and zombies now are much more susceptible to limb loss, + but can also reattach lost limbs manually without surgery. + - rscadd: Slimepeople can now lose their limbs, but also can regenerate them if + they have the jelly for it. Additionally slimepeople will (involuntarily) lose + limbs and convert them to slime jelly if they're extremely low on jelly. + - rscadd: Zombies and slimepeople now have reversed toxic damage, what usually heals + now hurts and what usually hurts now heals. Keep in mind that while you could + for example heal with unstable mutagen, you'd still mutate. Beware of secondary + effects! Drugs like antitoxin are especially dangerous to these races now since + not only do they do toxin damage, but they remove other toxic chems before they + can heal you. Be wary also of wide band healing drugs like omnizine. + - rscadd: For slime people the above mechanic also adds/drains slime jelly. So yes + inhaling plasma is now a valid way to build jelly (but you'll still suffocate + if there's no oxygen). + - rscadd: Pod people now mutate if shot with the mutation setting of the floral + somatoray. +2016-06-22: + Cheridan: + - tweak: Flashes no longer stun cyborgs, instead working almost exactly like a human, + causing them to become confused and unequip their current module. + Joan: + - rscdel: Those who do not serve Ratvar cannot understand His creations. + - rscadd: You can now repair clockwork structures with a clockwork proselytizer. + This is about a third as efficient as a mending motor, costing 2 liquified alloy + to 1 health, and also about a third as fast. + - tweak: Scarab proselytizers are more efficient and will reap more alloy from metal + and plasteel. + - rscadd: They can also directly convert rods to alloy. + - tweak: Nuclear bombs will no longer explode the station if in space. Please be + aware of this. + Kor: + - rscadd: You can now pick up potted plants. + PKPenguin321: + - rscadd: You can now pick up a skateboard and use it as a weapon by dragging it + to yourself. + - imageadd: Skateboards have been given brand new sprites, courtesy of JStheguy + Quiltyquilty: + - rscadd: The AI is back in the center of the station. The gravity generator is + now where the SMES room used to be. The SMESes are in the equipment room. + Supermichael777: + - rscadd: Flaps are no longer space-racist and now accept all bots. + Xhuis: + - tweak: Holy weapons, such as the null rod and possessed blade, now protect from + Ratvar's magic. + coiax: + - rscadd: Certain custom station names may be rejected by Centcom. + - rscadd: Drone shells can be ordered in Emergency supplies at Cargo. +2016-06-23: + Joan: + - tweak: Tinkerer's Caches generate components(when near clockwork walls) every + minute and a half, from every 35 seconds. Clockwork Slabs generate components + once per minute, from once per 50 seconds. + - tweak: Spatial Gateway will last four seconds per invoker, instead of two per + invoker. + - rscdel: Clockwork floors now only heal toxin damage on servants of Ratvar. + - rscdel: You can no longer place ocular wardens very close to other ocular wardens. + - tweak: The Flame produced by a Judicial Visor is no longer an effective melee + weapon and will trigger on all intents, not just harm intent. + Wizard's Federation: + - bugfix: Acolytes of Hades have revealed their true forms. + - rscadd: We've discovered a way to traverse portals left behind by Hades, and have + discovered a great treasure through it. + - bugfix: Hades has undergone Anger Management classes, and should no longer remain + wrathful for the duration of his visit. + coiax: + - rscadd: Changelings now evolve powers via the cellular emporium, which they can + access via an action button. + - rscadd: Due to budget cuts, the shuttle's hyperspace engines now create a visual + distortion at their destination, a few seconds before arrival. Crewmembers are + encouraged to use these "ripples" as an indication of where not to stand. + - bugfix: Shuttles now only run over mobs in turfs they are moving into, rather + than the entire rectangle. + - rscadd: If you are an observer, you can click on transition edges of a Z-level + in order to move as a mob would. + - rscadd: Due to safety concerns, the Hyperfractal Gigashuttle now has some safety + grilles to prevent accidental matter energising. + coiax, incoming: + - rscadd: Due to budget cuts, the builtin anti-orbit engines on the station have + been removed. As such, expect the station to start orbiting the system again, + and encounter an unpredictable stellar environment. + - rscdel: All permanent structures (not on station, Centcom or lavaland) have been + removed. + - rscadd: All removed structures are now space ruins, and can be placed randomly + in space ruin zlevels. + - wip: The White Ship remains at its current location, but has lost any reliable + landmarks near it. Its starting position will be made more random in a coming + update. + - rscadd: The Space Bar has a small atmos system added and a teleporter. Some other + ruins have been cleaned up to not have atmos active turfs. +2016-06-24: + Joan: + - experiment: The Interdiction Lens has been reworked; instead of allowing you to + disable Telecomms, Cameras, or non-Servant Cyborgs, it drains power from all + APCs, SMES units, and non-Servant cyborgs in a relatively large area, funneling + that power into nearby Sigils of Transmission, then disables all cameras and + radios in that same area. + - wip: If it fails to find anything it could disable or drain any power, it turns + off for 2 minutes. + - tweak: You can now target yourself with Sentinel's Compromise, allowing you to + heal yourself with it. + - rscadd: Flashes will once again stun borgs, but for a much shorter time than they + previously did; average stun time is reduced from the previous average of 15 + seconds to about 6 seconds. The confusion remains, but it will no longer unequip + borg modules. + MMMiracles: + - tweak: Metastation xenobiology's lights and cell have been modified so it won't + drain 5 minutes into the round. + SnipeDragon: + - bugfix: Changelings created at round start now correctly receive their Antag HUD. + Xhuis: + - rscadd: Cardboard cutouts have been added. Now you can set up advertisements for + your clown mart. +2016-06-26: + Basilman: + - rscadd: The Donor prompt for becoming an alien queen maid is now an action button + instead, and can be toggled on and off. + Joan: + - rscadd: Fellowship Armory now invokes faster for each nearby servant and provides + clockwork gauntlets, which are shock-resistant and provide armor to the arms. + - tweak: It's not wise to equip clockwork armor if you don't serve Ratvar. + - bugfix: A full set of clockwork armor will now actually cover all limbs. + coiax: + - rscadd: Our administrators, here at /tg/, don't get enough credit for their wealth + of experience and knowledge. Now they get the chance to share that with you + by giving out custom tips! + - tweak: Gang domination now uses the same timing method as shuttles, making their + domination times more accurate. + - rscdel: The default shuttle transit time is now 15 seconds. + - rscadd: Please do not commit suicide with the nuclear authentication disk. + - rscadd: Observers now have a visible countdown for borg factories, silicons can + examine the factory to determine how long it has remaining until it is ready. + - rscadd: Clockwork mobs sound like Ratvar chants if you do not serve Ratvar. + - rscadd: When servants recite, they now talk in a strange voice that is more noticable. +2016-06-28: + CoreOverload: + - rscadd: Kinetic accelerator now supports seclite attachment. + - rscadd: All cyborgs have been outfitted with ash-proof plating. + - rscadd: Mining cyborg module now includes a welder and a fire extinguisher. + - rscadd: 'Mining cyborgs now have a new upgrade: lavaproof tracks.' + Joan: + - rscdel: Clockwork Marauders are no longer totally invincible to damage unless + a holy weapon was involved. + - rscadd: Clockwork Marauders will take damage when attacked, but unless they're + fighting excessive amounts, they'll be forced to return to their host before + they'd normally die. + - experiment: A holy weapon held in either hand in the presence of a marauder will + massively increase the damage they take, making it much more likely the marauder + can be killed. + - tweak: Clockwork Marauders do slightly less damage at low fatigue levels. + - rscadd: Clockwork Marauders now have a chance to block melee attacks, negating + the damage from them, and an additional chance to immediately counter, attacking + whoever tried to attack them. + - wip: If Ratvar has awoken, Marauders have a much higher chance to block and counter, + will block thrown items and projectiles, and gradually regenerate. + - experiment: Clockwork Marauders no longer have a verb to communicate; they instead + use :b to do so. + - rscadd: Faked deaths are now effectively indistinguishable from real deaths. + MMMiracles: + - rscadd: Adds some ruins for space and lavaland. Balance not included. + - rscadd: Adds spooky ghosts. + SnipeDragon: + - bugfix: Cardboard Cutouts now become opaque when their appearance is changed. + Wizard's Federation: + - rscadd: Acolytes of Hades have been scolded for gluing their clothes to themselves, + and their clothes can now be cut off them. + - rscadd: Hades has learned a few new tricks, to ensure the ultimate demise of his + target. + - bugfix: Hades has faced a council of his repeated use of time magic inside chapels, + and as it was deemed unholy, he will no longer do it. + - rscadd: Wizards of the Wizard's Federation have been granted access to Dark Seeds, + ancient relics used to call upon Hades in a time of need. + Xhuis: + - rscdel: You can no longer put paper cups back onto water coolers. In addition, + they're now just called "liquid coolers" instead of changing based on their + contents. + coiax: + - rscadd: Status displays added to a variety of shuttle templates. + - rscdel: Large graffiti now consumes 5 uses from limited use crayons and spraycans, + as well as taking three times the amount of time to draw. + - rscadd: All items inside the supply shuttle will now be sold, regardless of whether + they're inside a container or not. + - bugfix: Fixes issue where the AI core APC on Metastation would not charge. + 'name: Lzimann': + - rscadd: Engineer and atmos wintercoat can hold the RPD now! + optional name here: + - rscdel: Shadowlings have been completely removed. + oranges: + - tweak: You can now hear dice + timkoster1: + - rscadd: adds a hud soul counter for devils. Sprites by PouFrou and special thanks + to lordpidey for about everything. +2016-06-29: + Joan: + - rscadd: Ghosts spawning via Ratvar can now choose to spawn as a Cogscarab with + a usable slab instead of as a Reclaimer. + - bugfix: You can no longer permanently block hostile simple mobs with sandbags + and other barricades. + MrStonedOne: + - rscadd: Ghosts may now jump between the two linked servers using the new Server + Hop verb. Rather than whine in deadchat about dieing, you can just go play a + new round on the other server. + coiax: + - rscadd: Adds a new UI to slimepeople, allowing them to select more easily which + body to swap to + - rscadd: Slimepeople swapping consciousness between bodies is now visible to onlookers + - bugfix: The AI malfunction "Hostile Lockdown" power now restores the station doors + to normal after 90 seconds, rather than keeping everything shut forever. +2016-07-01: + Flavo: + - bugfix: fixed a bug where lights would not update. + Joan: + - rscadd: Clockwork Slabs now use an action button to communicate instead of the + "Report" option in the menu after using a slab. + - tweak: Clockwork Slabs now fit in pockets, the belt slot, or in the suit storage + slot(if wearing clockwork armor), where they can be used as hands-free communication. + - imageadd: Clockwork items with action buttons have a new, clockwork-y background. + - rscadd: Judicial Visors now tell the user how many targets the Judicial Blast + struck. + - soundadd: Judicial Markers now have sounds when appearing and exploding. + - tweak: Wet turfs should remain that way for slightly longer than 5 seconds now. + - rscadd: Drones and Swarmers should now sound more robotic. + - tweak: Ratvarian Spears will stun cyborgs and cultists for twice as long when + thrown; on cyborgs, this should be long enough to use Guvax on them. + - rscdel: Removed the Justicar's Gavel application scripture. + - tweak: Vitality Matrices will drain and heal 50% faster, and the base cost to + revive is 20% lower; 20, from 25. + - rscadd: Vitality Matrices will not revive or heal corpses unless they can grab + the ghost of the corpse, and will immediately grab the ghost when reviving. + - rscadd: Swarmers consuming swarmer shells now refunds the swarmer the entire cost + of the shell instead of 2% of the shell's cost. + - experiment: Application scriptures require at least 75 CV, from 50. + - experiment: Revenant scriptures require at least 4 Caches, from 3, and at least + 150 CV, from 100. + - experiment: Judgement scripture requires at least 12 servants, from 10, 5 Caches, + from 3, and at least 250 CV, from 100. + - experiment: Script and Application scripture have had their component costs and + requirements tweaked to reduce overuse of certain components. + - wip: Invoke times for a few scriptures that were instant are now very short instead. + Kor: + - rscdel: Holoparasites are no longer in the uplink + NikNak: + - tweak: Showcases are now movable and deconstructable. Wrench them to unanchor + and then screwdriver and crowbar to deconstruct. + Papa Bones: + - tweak: Security now has energy bolas available to them in their vending machines, + check them out! + bobdobbington: + - rscadd: Added skub to the AutoDrobe as a premium item. + coiax: + - rscadd: The CTF arena regenerates every round, and the blue team now shoot blue + lasers. + - rscadd: Adds some descriptions to alien surgery tools + - rscadd: The agent vest can be locked and unlocked (toggling the NODROP flag) + - rscadd: An abductor team can spend data points to purchase an agent vest (note + that only abductor agents are trained in their use) + - rscadd: The nuke disk reappears on the station in far more random locations, but + tends to re-materialise in safe pressurised areas that aren't on fire. + 'name: Lzimann': + - tweak: Mulebots with pAI cards no longer stun people +2016-07-02: + Joan: + - rscadd: Clockwork Proselytizers can now reform stored alloy into usable component + alloy when used in-hand. + - rscdel: Mending motors start with 2500W of power in alloy, from 5000. Sigils of + Transmission start with 2500W of power, from 4000. Clockwork Proselytizers start + with 90 alloy, from 100. + - rscdel: Umbras have been removed. + - rscadd: Revenants have been readded, though they are now vulnerable to salt piles. + MMMiracles: + - rscadd: Added the power fist, a gauntlet with a piston-powered ram attached to + the top for traitors to punch people across the station. Punch people into walls + for added fun. + incoming5643: + - rscadd: 'Nuke ops can now harness the power of METAL BOXES: special versions of + cardboard boxes that can take a lot of abuse and can fit the whole team if need + be. They''re not nearly as light as their cardboard brothers though...' + kevinz000: + - rscadd: Some new emojis have been added to OOC for your enjoyment. Try them out. + - rscadd: 'New emojis are : coffee, trophy, tea, gear, supermatter, forceweapon, + gift, kudzu, dosh, chrono, nya, and tophat. Type :nameofemoji: in OOC to use.' +2016-07-03: + Cruix: + - bugfix: Hand labelers can now label storage containers. + - bugfix: You can now properly resist out of wrapped lockers. + - bugfix: You can now resist out of morgues if you are in a bodybag. + - bugfix: Mechs can no longer spam doors they do not have access to. + Joan: + - tweak: Clock Cult can now happen at 24 players, same as cult. + - tweak: Clock Cult player scaling is lower; 3 people, plus one for every 15 players + above 30, from 1 for every 10 players with a player minimum of 30. + - experiment: Guvax now invokes 1 second faster(5 seconds), but is 0.75 seconds + slower for each scripture-valid servant above 5, up to a maximum of 15 seconds. + - experiment: Clockwork Slabs generate components 20 seconds slower for each scripture-valid + servant above 5, up to a maximum of 1 component every 5 minutes. + - tweak: Tinkerer's Daemons that would be useless cannot be made. +2016-07-04: + Gun Hog: + - rscadd: The Space Wizard Federation has finally begun teaching its pupils how + to properly aim the Fireball spell! + - tweak: Fireball spells, including the Devil version, are now aimed via mouse click. + It is recommended to avoid firing at anything too close, as the user can still + blow himself up! + Joan: + - rscdel: Mecha are no longer immune to ocular wardens. + Lzimann: + - rscadd: Throwing active stunbatons now has a chance to stun whoever it hits! + MMMiracles: + - rscadd: Adds space ruins. Balance not included. + - tweak: Simple mob ghosts actually work now. + - rscdel: Puzzle1 ruin removed due to issues with projectiles. + X-TheDark: + - rscadd: Switching mobs/ghosting/etc related actions during the round will now + no longer reset your hotkey settings. + Xhuis: + - bugfix: Ash storms can now occur again. + bgobandit: + - rscadd: Bluespace polycrystals, basically stacks of bluespace crystals, have been + added. The ore redemptor accepts them now. + - tweak: The ore redemptor machine should be less spammy now. + coiax: + - rscadd: The zone of hyperspace that a shuttle travels in is dynamically determined + when a shuttle begins charging its engines. This is signified by the shuttle + mode IGN. All shuttles must now charge engines before launching. This time is + already included in the emergency shuttle timer. + - rscdel: The cargo shuttle can only be loaned to Centcom while at Centcom. + - rscadd: Immovable rods now notify ghosts when created, allowing them to orbit + it and follow their path of destruction through the station. + - bugfix: Fixed bugs where no meteors would come or go from the south. Seriously, + that was a real bug. Meteor showers are now about 33% stronger as a result. +2016-07-06: + Cruix: + - bugfix: Vending machine restocking units now work. + Joan: + - rscadd: Servants should now be more aware of when scripture tiers are locked or + unlocked. + - experiment: Judicial Explosions from a Judicial Visor now mute for about 10 seconds. + MrStonedOne: + - rscadd: Instant Runoff Voting polls are now available. + RemieRichards: + - tweak: Fixes accidental buff to botany, all modifiers should now be at the point + they were at pre-bees (this does not remove, nerf or alter bees) + Xhuis: + - rscadd: The Necropolis gate now looks as regal as it should. Credit goes to KorPhaeron + for turf and wall sprites. + - bugfix: Ash storms are actually damaging now. + coiax: + - bugfix: Gulag prisoners can no longer duplicate their mining efforts through window + breaking on the shuttle. + - bugfix: Fixes pickaxes inside walls on lavaland, along with lava having eaten + one of the storage units. + - rscadd: More fire extinguishers for lavaland mining base. + - bugfix: You can now reload your gun in CTF. + - rscadd: Dying in CTF will spawn a short lived ammo pickup, which you can walk + over to reload all your weapons. + - rscadd: If reduced to critical status in CTF, you will automatically die, so you + no longer have to succumb or be coup de graced. If you are conscious, you will + now heal slowly if some damage got through your shield and didn't crit you. + - bugfix: The tesla now dusts all carbon mobs on the turf that it moves to, grounding + rod or no. + coiax, Niknakflak: + - rscadd: Added fireplaces, fuel with logs or paper and set on fire and enjoy that + warm comforting glow. + - bugfix: Cardboard cutouts are now flammable. + - rscadd: Cigarettes, fireplaces and candles now share a pool of possible igniters. + So you can now esword that candle on, but turn it on first. + - rscadd: Eswords will ignite plasma in the air if turned on. + kevinz000: + - tweak: Kudzu is no longer unstoppable + optional name here: + - bugfix: Suit Storage Units can now disinfect items other than living and dead + creatures. +2016-07-09: + CoreOverload: + - rscadd: You can remove jetpack from a hardsuit by using screwdriver on it. + Crazylemon: + - bugfix: The map loader no longer resets when reading another map mid-load + Goofball Sanders: + - rscadd: Added a new plant to the game to encourage the Chef to be a more relevant + job, alongside a recipe for a food related to it. Throw a cannabis leaf on a + table and check the recipes list to find it. + Gun Hog: + - rscdel: Malf (Traitor) AI's Fireproof Core ability has been removed, as it was + entirely obsolete. + - rscadd: Nanotrasen is proud to announce that conveyor belts can now be fabricated + at your station's autolathes! + Iamgoofball: + - bugfix: Fixes the Atheist's Fedora's throw damage. + Joan: + - rscadd: Tips for Clock Cult may now show up. + - experiment: The global component cache can only be accessed by clockwork slabs + if there is at least one Tinkerer's Cache active. + - rscadd: Ratvarian Spears are now sharp and can be used to cut off limbs or butcher + mobs. + - rscadd: Clock Cult silicons get an action button to communicate with other servants. + - tweak: Clockwork Slabs now produce a component every 1 minute, 30 seconds, from + every 1 minute. + - experiment: The slab production time gain from each servant above 5 has been increased + from 20 seconds to 30 seconds, and the maximum production time has been increased + from 5 minutes to 6 minutes. + - rscadd: You can now transfer components between two clockwork slabs by attacking + one slab, or a person holding a slab, with the other; this will transfer the + attacking slab's components into the target slab. + - tweak: Application scripture now requires 100 CV, from 75, Revenant scripture + now requires 200 CV, from 150, and Judgment scripture now requires 300 CV, from + 250. + - experiment: However, converted windows, windoors, airlocks, and grilles will all + provide some CV. + Lzimann & Keekenox: + - rscadd: You can now craft a baseball bat with 5 sheets of wood! + MrStonedOne: + - experiment: Atmos on planets is now more realistic. There is an unseen upper atmosphere + that gas changes get carried away into, causing planet turfs to revert back + to their original gas mixture. + - tweak: This should massively improve atmos run speed as all of lavaland won't + be processing the moment somebody opens a door anymore + MrStonedOne, coiax: + - rscadd: View Variables can expand on associated lists with type keys. Only 90s + admins will truely understand. + RemieRichards: + - rscadd: Added a Compact mode to the crafting tgui + - tweak: Modified the back end of the crafting tgui so that it has well let's just + say "a lot less" calls to certain functions, should lag a little less but don't + expect miracles (you'd have to wait till we get a new version of ractive for + those!) + coiax: + - rscadd: Podpeople (and venus human traps) are now no longer damaged, poisoned + or obstructed by space vines. Explosive vines still damage them, because there's + an actual explosion. + - rscadd: During a meteor shower, observers can automatically orbit threatening + meteors via an action button and watch them hit the station. + - rscadd: Added Major Space Dust event, which is a meteor shower containing only + space dust. + - bugfix: Fixes bug where meteors wouldn't move when spawned. + - rscadd: Meteor Shower split into three different events, Normal, Threatening and + Catastrophic. They all have the same crew messages, but admins can tell the + difference. + - bugfix: Damage to a shuttle while it is moving will now correctly make transit + space turfs, rather than non-moving space. + - rscadd: AIs get a notification when hacking an APC, which can be clicked to jump + your camera to the APC's location. AIs also get notification sounds when a hack + has completed or failed. + - rscadd: Nuclear bombs now use a more accurate timer system, the same as gang dominators + and shuttles. + - rscadd: Nuclear bombs now have a TGUI interface. + - rscdel: Fleshmend no longer regrows lost limbs. + - rscadd: Added free Regenerate power to changelings, which regrows all external + limbs and internal organs (including the tongue if you lost your head). It costs + 10 chemicals to use. + - rscadd: Fleshmend now costs 20 chemicals, down from 25. + - tweak: Changeling revive power name changed from Regenerate to Revive. + - rscadd: When a player uses a communication console to ask for the codes to the + self destruct, for better or for worse, the admins can set them with a single + click. Whether the admins a) click the button b) actually give the random person + the codes, is another thing entirely. + - rscadd: Servants of Ratvar get an alert if they have no tinkerer's caches constructed. + Because it's important that they should. +2016-07-11: + Iamgoofball: + - bugfix: Fixes Nicotine's stun reduction + Joan: + - tweak: The Function Call action that summons a Ratvarian Spear is no longer one-use; + instead, it can be reused once every five minutes. + - experiment: Clockwork Walls and Floors will appear as normal walls and plating + to mesons, respectively. + coiax: + - tweak: Syndicate bombs now use a more accurate timer. + - bugfix: Fixed a separate bug that caused bomb timers to take twice as long (ie. + 60 seconds took 120 seconds) + - tweak: The AI doomsday device timer is more accurate. + - bugfix: Fixes a bug where the doomsday device would take twice as long as it should. + optional name here: + - bugfix: The search function on security records consoles now works. +2016-07-12: + MMMiracles: + - bugfix: Hotel staff can now actually use their own lockers. + RemieRichards: + - bugfix: fixed Kor's plant disguises + - bugfix: fixed some issues with Alternate Appearances not being added/removed + hornygranny: + - bugfix: Attacks will no longer miss missing limbs +2016-07-14: + Basilman: + - rscadd: Added a new hairstyle "Boddicker" + Bawhoppen: + - rscadd: Added two new materials, Titanium and plastitanium. Titanium is naturally + occuring, and plastitanium is an alloy made of plasma and titanium. + - rscadd: These materials can be used to build shuttle walls and floors, though + this serves no current purpose. + CoreOverload: + - rscadd: Some clothing has pockets now. + Firecage: + - tweak: Mechas can no longer pass through Plastic Flaps + Fox McCloud: + - bugfix: Fixes borg stun arm not having a hitsound, bypassing shields, and not + doing an attack animation + - bugfix: Fixes simple mobs not properly having armor penetration + Joan: + - rscadd: Added dextrous guardians to the code, able to hold and use items and store + a single item within themselves. + - experiment: Dextrous guardians do low damage on punches, have medium damage resist, + and recalling or leashing will force them to drop any items in their hands. + Kor: + - tweak: Shuttle travel time has been shortened from 25 seconds to 6 seconds + Lzimann: + - tweak: Alt clicking a jumpsuit now removes the accessories(if there's any)! + Papa Bones: + - tweak: Security's lethal injections are actually lethal now. + Xhuis: + - rscadd: Nanotrasen electricians have introduced a software update to all licensed + pinpointers. The new pinpointers are more responsive and automatically switch + modes based on the current crisis. + - rscadd: It should be noted that some of these pinpointers have been reported as + missing from their distribution warehouse and are presumed to have been stolen. + This is likely nothing to worry about. + lordpidey: + - tweak: Infernal jaunt now has a cooldown, to prevent trying to jaunt while already + jaunting. This should have no practical changes. + - bugfix: Infernal jaunt no longer occasionally leaves you permanently on fire. + - bugfix: Pitchforks no longer burn devils and soul-sellers, as intended. +2016-07-15: + Cheridan: + - rscadd: Added an aesthetic new space ruin +2016-07-16: + Gun Hog and WJohnston: + - rscadd: Aliens (Xenos) now have the ability to sense the direction and rough distance + of their queen! + Iamgoofball: + - bugfix: Fixed the lag when opening the foodcrafting menu by splitting everything + up into categories. + Joan: + - rscadd: Cogscarabs(and other nonhuman mobs able to hold clockwork slabs) can now + check the stats of the clockwork cult by using a clockwork slab. They remain + unable to use slabs under normal conditions. + MrStonedOne: + - experiment: Added a system to detect when stickybans go rogue and revert all recent + matches. +2016-07-18: + CoreOverload: + - rscadd: Sterilizine now reduces probability of step failure if you apply it after + starting surgery. Useful while operating in less-than-perfect conditions. + - rscadd: Potent alcohol can be used as replacement for sterilizine. + Joan: + - experiment: The Vanguard scripture no longer prevents you from using slabs while + active, but you cannot reactivate it if it is currently active. + - tweak: It now only lasts 20 seconds, instead of 30. + - tweak: When Vanguard deactivates, it now stuns for half the time of all stuns + absorbed, instead of all of them. + - tweak: Invoking Sevtug is less potent at long ranges, and slightly more potent + if extremely close. + - experiment: Invoking Sevtug now requires 3 invokers instead of 1. + - rscadd: The Clockwork Slab now has action buttons for rapidly invoking Guvax and + Vanguard. + - tweak: Belligerent is now chanted more often. + - experiment: Taunting Tirade now weakens nearby nonservants, but is now only invoked + once every 6 seconds(1 second chant, 5 second flee time) and is only chanted + five times. + lordpidey: + - rscadd: Flyswatters are now included in beekeeping crates, they are great at killing + insects and flies of all sizes. +2016-07-19: + Joan: + - tweak: Cogscarabs can no longer pass mobs and have slightly less health. + - experiment: The Gateway to the Celestial Derelict can now take damage from bombs. + RemieRichards: + - rscadd: Added VR Sleepers that allow users to enter a virtual body in a virtual + world (Currently not mapped in ;_;) + Xhuis: + - rscadd: Added communication intercept texts for gamemodes that were missing them. + - tweak: Changed all intercept texts and improved grammar for a lot of key game + code. + - rscdel: The shuttle can now leave while a celestial gateway exists. + - rscadd: If the shuttle docks at Central Command while a celestial gateway exists, + Ratvar's servants will win a minor victory. His arrival will still award a major + victory. + - rscadd: The celestial gateway can now take damage from explosions. +2016-07-22: + Bawhoppen: + - rscadd: Titanium now spawns in mining again. + - rscadd: It has uses in R&D and robotics production. + - rscadd: All shuttle walls are now using a new proper smoothing path. Mappers please + make sure to use this path correctly in the future. (along with tiles) + Cheridan: + - rscadd: Added another space ruin. + Cruix: + - bugfix: Camera bugs can now show camera views. + - bugfix: The chameleon masks in the chameleon kit can once again have their voice + changers toggled. + Incoming5643: + - rscadd: You now have the ability to automatically "back out" of a round if you + miss your chance at all the jobs you have set to low or higher. This is found + on the toggle at the bottom of the jobs window + - rscadd: Due to a quirk of game mode code this option will fail to work if you've + been selected as an antag (what a tragedy!) In this situation, you'll be assigned + a random job. + Joan: + - bugfix: You can now throw items and mobs over chasms without causing them to drop. + - bugfix: You can now throw items over lava without burning them. Mobs will still + burn, however. + - experiment: Tinkerer's Caches now link to a nearby unlinked clockwork wall, and + will not generate components unless linked. As compensation, they will link + to nearby walls(and can generate components) in a larger area. + - wip: Guvax is now slightly slower when above 5 valid servants; 1 additional second + of invoke time for each one above 5, from 0.75 additional seconds, up to a maximum + of 20 seconds of invoke time, from 15 seconds. + - tweak: Sigils of Transgression now stun for about 7 seconds. + - experiment: Sigils of Submission/Accession now take 7 seconds to convert successfully, + and have an obvious message to the person on them that their mind is being invaded. + - tweak: Ocular Wardens do 17% less damage. + - tweak: Mania Motors cause less brain damage and hallucinations. + - rscadd: If you lack the components to recite a scripture, you will be informed + of how many components that scripture requires. + - experiment: Tinkerer's Caches now cost an additional one of each non-alloy component + to construct for every three existing Tinkerer's Caches, up to a maximum of + 5 of each non-alloy component. + - rscadd: Revenant scriptures now announce to all servants and ghosts when used + instead of having a visible message. + Lzimann: + - tweak: Blood packs are now back in surgery room. + MMMiracles: + - rscadd: A giant wad of paper has been seen hurling through the nearby sector of + SS13, officials deny existence of giant paper ball hurling through space because + 'thats really fucking stupid'. + MrStonedOne: + - bugfix: Fixes super darkness from lighting creating two darkness overlays on the + same turf but only changing the darkness of one of the overlays + PKPenguin321: + - rscadd: Added Canned Laughter for the clown. Hehehe + RemieRichards: + - tweak: Auto-generated ratvarian now follows all the rules of hand-written ratvarian, + but you probably won't notice. + Shadowlight213: + - tweak: Angels can now equip satchels + - rscadd: Players will now receive an achievement for killing their first megafauna + after this point. + - rscadd: Additionally, megafauna kills are now tracked on a hub page. Rack up those + kills for first place! + Xhuis: + - rscadd: Clockwork cultists may now have the "Escape" and "Silicon" objectives, + requiring a certain amount of servants to escape on the shuttle and all silicons + to be converted respectively. + - rscadd: Ocular wardens are now forced to target bibles rather than the people + holding them. +2016-07-28: + Cruix: + - bugfix: Fixed a bug where some objects in photos would not be displayed if they + were facing a certain direction. + - bugfix: Photograph descriptions will no longer claim that mobs with low max health + are hurt when they are not. + Incoming5643: + - rscadd: The previously underwhelming viscerator robot has been made a lot more + terrifying by the new ability to proactively target and dismember limbs. + Joan: + - tweak: The Tinkerer's Cache cost increase for having multiple Tinkerer's Caches + now happens every 5 caches, from every 3. + - experiment: If the invoker of Nzcrentr is knocked unconscious or killed, they + will gib instead of producing a lighting blast. + - tweak: Anima Fragments slow down for slightly less time when hit. + - tweak: Clockwork Marauders do 1 more damage on every attack. + - tweak: Wraith Spectacles are now less hard on the eyes, and can be used without + permanent vision impairment for about 50% longer; from 40~ seconds to about + 1 minute. + - tweak: Halves the Interdiction Lens' disrupt cost from 100 per disrupted object + to 50 per disrupted object. + - tweak: Clockwork Sigils will now be destroyed by any level of explosion, except + for Sigils of Transmission, which will gain a small amount of power if hit by + a light explosion instead of breaking. + - bugfix: Clockwork Structures will now properly take damage from explosions instead + of variably not taking damage or instantly being destroyed. + - rscadd: Ghosts can now click Spatial Gateways to teleport to the other gateway. + - bugfix: Spatial Gateways are now properly disrupted by devastating explosions(but + not heavy or light explosions) + - rscadd: Striking a Sigil with any damaging item as a non-servant will remove it. + Servants still need to be on harm intent with an empty hand to remove Sigils. + Kor: + - rscadd: The Staff of Storms, dropped by Legion, can now be used on station. + MMMiracles: + - rscadd: Adds jump boots, a mid/end-tier mining equipment that allows the user + to dash over 4-wide chasms. + ModernViolence: + - bugfix: Hulk now has default cooldown for melee attacks against dominator + MrStonedOne: + - tweak: Space wind (movement from pressure differentials (like a hole to space)) + has been improved. + - tweak: Space wind's rate of movement now scales with pressure differential amount. + - experiment: Actively moving (as in holding down a move key) reduces chance/rate + of getting moved by space wind. + - rscadd: 'Having a wall or dense anchored object to your left or right will lower + the chance/rate of getting moved by space wind for each direction (IE: a wall + on both sides of you will be a double reduction)' + - rscadd: Added Lazy airlock cycling. Bump opening an airlock with this system will + close its partner. This system has been added to most airlocks that go to space + on boxstation, as well as airlocks to secure areas like brig, bridge, engine. + - tweak: This can be overridden by click opening, having a shuttle docked, or setting + emergency mode on one of the doors. + PKPenguin321: + - bugfix: Laughter no longer makes you laugh if you're muted. + - rscadd: Laughter can now be brewed with banana juice and sugar. + Thunder12345: + - rscadd: An old rapier was found rusting in the back of a closet. We cleaned it + up, polished it, and assigned it to your captain as a ceremonial weapon only. + Warranty void if used in combat. + incoming5643: + - tweak: viscerator grenades are now more generous with viscerators spawned +2016-07-30: + astralenigma: + - bugfix: Admins can now turn people into red god. +2016-07-31: + Arctophylax: + - bugfix: Birdboat's atmospheric tanks now function normally again. + - bugfix: Birdboat's TEG is now orientated to match the pipe layout. + Bawhoppen: + - tweak: toolboxes fit in backpacks + Gun Hog: + - rscadd: In an effort to reduce the demoralizing effects that accompany the death + of a crew member, Nanotrasen has provided the prototype designs for the Sad + Trombone implant. It can be fabricated at your station's protolathe, if you + manage to secure the ever elusive Bananium ore. + Joan: + - rscadd: Megafauna will now seek and consume corpses of enemies to heal or otherwise. + - tweak: Toolboxes are slightly more robust. + - tweak: Vanguard now only stuns for 25% of absorbed stuns, from 50%. + Kor: + - rscadd: Hostile mobs will now attack turrets. + Robustin: + - rscdel: Amber ERT Commanders no longer have thermal goggles + lordpidey: + - rscadd: Added Devil agent gamemode, where multiple devils are each trying to buy + more souls than the next in line. + - rscadd: If you've already sold your soul, you can sell it again to a different + devil. You can even go back and forth for INFINITE POWER. +2016-08-01: + Bawhoppen: + - rscadd: Added crowns. Make them from gold. Cap gets a fancy one. + Fox McCloud: + - rscadd: Adds in generic uplink refund system that potentially allows for even + regular traitors to refund uplink items + Joan: + - rscadd: Soul Vessels can now be used on unconscious or dead humans to extract + their consciousness, much like a soulstone. + - tweak: Soul Vessels no longer automatically ping ghosts when created, though they + can still be used in-hand to ping ghosts. + - rscadd: Soul Vessels can now communicate over the Hierophant Network + - experiment: Xenobiology golems enslaved to someone will become convertable if + their enslaver is converted to the enslaving antag type; this applies to gang + and both cult types. + oranges: + - rscdel: Reverted toolboxes fitting in backpacks due to being incorrectly merged +2016-08-02: + CoreOverload: + - rscadd: Pockets in coats! +2016-08-05: + Arctophylax: + - bugfix: The Emergency Medical and Winter Wonderland Holodeck programs work once + again. + Cruix: + - bugfix: RCDs can no longer place multiple grilles on the same tile. + - bugfix: RCDs will no longer use all their ammo if you try to build a wall on the + same turf multiple times. + - tweak: RCDs will now inform their user if they do not have enough ammo to complete + an operation. + Incoming5643: + - rscadd: Parrots have been made more robust. + Joan: + - rscadd: Clockwork Constructs, including anima fragments, marauders, and reclaimers, + can now communicate over the Hierophant Network. + - rscadd: Plasma cutters(normal, advanced, and mech) now have double range in low + pressure areas, but slightly lower range in high pressure areas. + - rscadd: Vitality Matrices will consume dead non-servant mobs to gain a large amount + of Vitality. This doesn't work on mobs that did not have a mind at some point. + Lordpidey and PKPenguin321: + - rscadd: Recent studies have revealed that fly amanita can give you a huge trip. + Lzimann: + - tweak: Holy water no longers makes you confused. + ModernViolence: + - bugfix: 'Photocopier fixes: proper sprites for not empty copies; removing originals + now does not delete them' + PKPenguin321: + - rscadd: Chef, do your station a favor and make a home run baseball burger (TM) + Robustin: + - rscadd: The initial supply talisman can now be used to create runed metal, 5 per + use + - rscadd: The void torch is now available from the altar, use it to transport any + item instantly to any cultist! It appears alongside the veil shifter as part + of the "Veil Walker" set. + - rscadd: Cult floors no longer appear on mesons! + - tweak: Flagellant's Robes now increases damage taken by 50%, down from 100% + - tweak: Veil Shifter has 4 uses, up from 2 + - tweak: Shuttle curse now delays shuttle 3 minutes, up from 2.5 minutes + - tweak: Cult forges, archives, and airlocks have had their cost reduced by 1 runed + metal each + Shadowlight213: + - rscadd: You will now receive an achievement for winning a pulse rifle at the arcade. + TheCarlSaganExpress: + - rscadd: Added lighting effects to the welder. +2016-08-07: + Arctophylax: + - bugfix: You can unbuckle mobs from meat spikes by clicking on the spike once again. + Joan: + - tweak: Barrier runes will now block air while active. + - rscadd: Trying to use sleeping carp against the colossus will now anger it. + frtbngll: + - bugfix: Fixed Paper Wizard summoning only 9 minions in its lifespan by making + the dead stickman decrease it's summoned_minions variable + lordpidey: + - bugfix: Centcom has received reports of cyborgs electrocuting themselves when + working on the power grid, and we have decided to stop storing important electronics + on the wirecutter's blade. +2016-08-08: + Ergovisavi: + - rscadd: Added bonfires to botany. Requires five tower cap logs to create, and + mobs can be buckled to them if an iron rod is added to the bonfire and the mob + is restrained. + Joan: + - rscadd: Added the clockcult "Global Records" alert, which clock cultists can mouse + over to check a variety of information on the clockcult's status, including + living servants, number of caches, CV, tinkerer's daemons, if there's an unconverted + AI, what clockwork generals can be invoked, and what scripture is unlocked. + Shadowlight213: + - rscadd: Ghosts can now see human player's huds when using the OOC -> Observe verb + WJohnston, Gun Hog: + - tweak: Xenos are now considered female. + - tweak: Hunter pounce are now always blocked by shields, and may be blocked more + often by other protective items. + - tweak: Alien Queen is now somewhat faster. + - tweak: Adjusted larva growth sprites. + - tweak: Removed 20% facehugger failure chance for masks. + - tweak: Disarm now always forces a person to drop an item in the active hand, and + if a person's hand is empty/undroppable, Disarm will always result in a tackle. + - tweak: Cyborgs disarmed by a Xeno will first disable their selected module, and + if there is none selected, the cyborg will be pushed back and stunned. + - tweak: Tail Sweep now has a slightly longer stun. +2016-08-10: + Cruix: + - rscadd: Sentient minebots can now toggle meson vision, a flashlight, their mode, + and dump their stored ore. + - bugfix: Sentient minebots can now be repaired if they were made sentient while + the AI was active. + - bugfix: Healing minebots will no longer switch them to attack mode. + - tweak: Sentient minebots can now shoot at humans. + - bugfix: The cooldown on wizard lightning will no longer break if you ethereal + jaunt or RISE! after the initial cast. + Kor: + - rscadd: You can now detonate drones with the RD console + LanCartwright: + - rscadd: Acute respiratory distress syndrom symptom. + - rscadd: Toxic metabolism. + - rscadd: Alkali perspiration + - rscadd: Autophagocytosis Necrosis + - rscadd: Apoptoxin filter + - rscadd: 3 different lategame/Non-roundstart virus reagents + - rscadd: 4 different lategame/Non-roundstart virus recipes + MrStonedOne: + - tweak: Tweaked space wind, it should now only trigger at higher pressure differences, + but be quicker to become aggressive as the pressure difference gets higher. + This should alleviate issues where small differences was still moving a lot + of things. + - tweak: Paper still moves with any pressure difference. + PKPenguin321: + - rscadd: There's now an achievement for managing to examine a meteor as a living + mob! + RemieRichards: + - rscadd: 'Added a new PDA button/app: Drone Phone!' +2016-08-14: + Cheridan: + - tweak: Greatly reduced amount of Hydroponics yield multipliers + - tweak: Somewhat reduced gaia'd tray sustainability. + - tweak: Mutagen will no longer potentially cause plant instadeath based on RNG. + Ergovisavi: + - tweak: Watchers no longer randomly fire beams at you when damaged, and no longer + beam you at point blank. + Gun Hog: + - tweak: The AI's Crew Manifest button now uses the updated styling. + Joan: + - rscadd: Sigils of Transgression now glow brightly when stunning a target. + - rscadd: The Global Records alert now shows the location and countdown time of + the Gateway to the Celestial Derelict. + - tweak: Clockcult tooltips now all have the clockcult tooltip style. + - rscdel: You can no longer become a Reclaimer when clicking on Ratvar. You can + still become a Cogscarab, however. + - bugfix: You can no longer invoke Vanguard while under its effects. + - bugfix: Servants of Ratvar should now always get an announcement when scripture + states change. + - tweak: Function Call can be used to summon a Ratvarian Spear once every 3 minutes, + from 5, but the spear summoned will now only last 3 minutes. + - rscadd: Belligerent now does minor damage to the legs on each invocation, up to + a maximum of 30 damage per recital. + - tweak: Ratvarian Spears will now stun any mob they're thrown at instead of just + enemy cultists and silicons, though the stun is still longer on enemy cultists + and silicons. + Jordie0608: + - rscdel: Removed clicking clown mask to morph it's shape, use action button instead. + Kor: + - rscadd: Added support for projectiles which can dismember + - rscadd: Added a new wizard sword, the spellblade, which fires dismembering projectiles. + Sprites from Lexorion. + - rscadd: Plasmacutter blasts can now take limbs off, but they still do pitiful + damage in a pressurized environment. + - rscadd: Humans and drones now have a UI button that allows them to create new + areas, in the same manner as blueprints. Unlike blueprints, this button does + not allow you to edit existing areas. + - rscadd: You can now use mineral doors (or any other object that blocks atmos) + to complete rooms with blueprints + - rscadd: Players created by sentience potions, mining drone upgrades, or Guardian/Holoparsite + summoners will now automatically join the users antagonist team, if any. + - rscadd: Mobs created in this manner will no longer be convertable/deconvertable + unless their creator is first converted/deconverted. + - rscadd: Cayenne will now officially become an operative when given a sentience + potion. + LanCartwright: + - bugfix: Fixes the recipes not working. + - tweak: Changes Stable uranium virus food recipe from Plasma virus food to just + plasma. + RemieRichards: + - bugfix: You can no longer use the incorrect limb type during augmentation + - bugfix: You can no longer use the incorrect limb type during prosthetic replacement + Shadowlight213: + - rscadd: Security has two new weapons in their arsenal. The security temperature + gun, and the DRAGnet capture and recovery system. + optional name here: + - bugfix: The syndicate uplink ui has been refactored to majorly reduce lag +2016-08-15: + Joan: + - rscadd: The Ark of the Clockwork Justicar can now be constructed even if Ratvar's + rise is not the objective. + - experiment: Accordingly, its behavior is different; instead of summoning Ratvar, + it will convert a massive amount of the station, and should effectively instantly + complete the clockwork cult's objectives. + MrStonedOne: + - tweak: Tweaked the lag stop numbers to hopefully reduce lag during 80+ population + - tweak: Fixed the blackbox not blackboxing. + OSCAR MIKE: + - rscadd: CONTACT ON THE LEFT SIDE! +2016-08-16: + MrStonedOne: + - rscadd: Automated the granting of profiler access to admins + oranges: + - rscadd: Nanotrasen is an all right kind of company +2016-08-17: + Basilman: + - rscadd: Added an admin-spawnable only "Cosmohonk" hardsuit that has the same protection + values of an engineering hardsuit. Comes with built-in lights and requires clown + roundstart role to be equipped. + Ergovisavi: + - rscadd: Adds the "Proto-Kinetic Crusher", a new melee mining weapon. Available + at a mining vendor near you! + Gun Hog: + - tweak: Nanotrasen has improved the coolant system in the stations automated robots. + They will no longer violently explode in hot rooms. + Joan: + - rscadd: Once the blob alert message is sent in the blob game mode, all mobs get + to see how many tiles the blob has until it wins, via the Status tab. + - rscdel: Removed/merged a bunch of blob chems, you probably don't care about the + specifics. + - tweak: The remaining blob chems should, overall, be more powerful. + - tweak: Shield blobs soak brute damage less well. + - tweak: Flashbangs do higher damage to blobs up close, but their damage falls off + faster. + - experiment: Shield blobs now cost 15 resources to make instead of 10. Node blobs + now cost 50 resources to make instead of 60. + - experiment: Expanding/attacking now costs 4 resources instead of 5, and blobs + can now ATTACK DIAGONALLY. Diagonal attacks are weaker than normal attacks, + especially against cyborgs(which may be entirely immune, depending), and they + remain unable to expand diagonally. + - rscadd: Shield blobs no longer block atmos while under half health. Shield blobs + are still immune to fire, even if they can't block atmos. + - tweak: Blobs should block explosions less well. + - rscadd: Blob cores and nodes are no longer immune to fire and no longer block + atmos. + - rscadd: Blobs can only auto-expand one tile at a time per expanding thing, and + should be easier to beat back in general. + - tweak: Blobbernauts now attack faster. + - tweak: Blob Overminds attack mobs slower but can attack non-mobs much faster. + - rscadd: Blob Overminds start with some amount of resources; in the gamemode, it's + 80 divided by the number of overminds, in the event, it's 20 plus the number + of active players, and otherwise, it's 60. + - bugfix: You can no longer move blob cores into space, onto the mining shuttle, + white ship, gulag shuttle, or solars. + - bugfix: Blob rounds might be less laggy, if they were laggy? + - tweak: Blobs don't heal as fast, excluding the core. + - experiment: Blobs are marginally less destructive to their environment. + MrStonedOne: + - rscdel: The server will no longer wait until the next tick to process movement + key presses. Movements should now be ~25-50ms more responsive. + Shadowlight213: + - rscadd: Adds modular computers +2016-08-21: + Ergovisavi: + - tweak: Consolidates the fulton packs into a single item and makes them more user + friendly + Google Play Store: + - spellcheck: Minor Text Fixes. + Incoming5643: + - rscadd: Smuggler satchels left behind hidden on the station can now reappear in + a later round. + - experiment: There's absolutely no way of knowing when exactly it will reappear + however... + - rscadd: Only one item in the satchel will remain when the satchel reappears. + - rscadd: Items are saved in their initial forms, so saving things like chemical + grenades will only disappoint you. + - rscadd: The item pool is map specific and needs to be a certain size before satchels + can start reappearing, so get to hiding that loot! + - rscadd: The staff of change has been expanded to turn you into even more things + that don't have hands. + Jalleo: + - bugfix: Gulag Teleporter of two issues any more please report them. + Jordie0608: + - rscadd: Advanced Energy Guns once again have a chance to irradiate you if EMPed. + Kor: + - rscadd: Kinetic Accelerators are now modular. You can find mod kits in the mining + vendor and in RnD. + - bugfix: Chaplain's dormant spellblade is no longer invisible. + Papa Bones: + - rscadd: A new, scandalous outfit is now available as contraband from the clothesmate + vendor, check it out! Fulfill your deep, dark fantasies. + Shadowlight213: + - tweak: Service and cargo have lost roundstart tablets and engineering has gained + them + - tweak: you can now charge battery modules in cell chargers. Use a screwdriver + on a computer to remove them. As a note, tablets and laptops can be charged + directly by placing them in a security charger. + WJohnston: + - rscadd: Metastation and Boxstation now boast auxillary mining construction rooms + in arrivals. These allow you to build a base and then launch it to wherever + you want on lavaland. + Wjohnston, Gun Hog: + - rscadd: Aliens with Neurotoxic Spit readied will now have drooling animations. + - rscadd: Hunters may now safely leap over lava. + - tweak: Hulk punches no longer stun Xenos. + - tweak: Alien evolve and promotion buttons updated to current Xeno sprites + - bugfix: Handcuff sprites for Xenos now show properly. +2016-08-22: + Bawhoppen: + - rscdel: Stock computers have been temporarily removed due to imbalances. + Ergovisavi: + - bugfix: Bubblegum's charge indicator should be significantly more accurate now. + ExcessiveUseOfCobblestone: + - rscdel: Reverts getting partial credit for discovered seeds. + - tweak: 'Tweaks Money Tree Potency Values [For instance: 1000 Space Cash requires + 98-100 Potency]' + Lzimann & Lexorion: + - rscadd: Adds a bow to the game, currently not craftable + Shadowlight213: + - bugfix: The efficiency AI sat SMES will now charge the APCs instead of itself. + XDTM: + - rscdel: Removed the Longevity symptom. + - rscadd: Added Viral Aggressive Metabolism, which will make viruses act quickly + but decay over time. + - rscadd: Cloning can now give bad mutations if unupgraded! + - rscadd: Cloning can, however, give you good ones if upgraded! +2016-08-24: + Bones: + - rscadd: The detective's closet now contains a seclite, get sleuthing! + Cargo Intelligence Agency: + - rscdel: You don't get to bring traitor items. + Ergovisavi: + - rscadd: Adds "Sacred Flame", a spell that makes everyone around you more flammable, + and lights yourself on fire. Share the wealth. Of fire. + - tweak: Replaces the fireball spellbook as a possible reward from a Drake chest + with a book of sacred flame. + Gun Hog: + - rscadd: The Aux mining base can now call the mining shuttle once landed! The mining + shuttle beacon that comes with the base must be deployed to enable this functionality. + - tweak: Multiple landing zones may now be set for the mining base. + - tweak: The coordinates of each landing zone is shown in the list. + - rscadd: Miners now each get a remote in their starting lockers. tweak The Aux + mining base now requires lighting while on station. + - tweak: The Aux Mining Base now has a GPS signal. + - tweak: The Aux Mining Base now has an alarm for when it is about to drop. + Incoming5643: + - rscadd: 'A slight change to the secret satchel system described below: If a satchel + cannot be spawned due to there not being enough hidden satchels to choose from, + a free empty satchel will spawn hidden SOMEWHERE on the station. Dig + it up and bury it with something interesting!' + Joan: + - rscadd: Using a resonator on an existing resonator field will immediately detonate + that field. Normal resonators will reduce the damage dealt to 80% of normal, + while upgraded resonators will not reduce it at all. + - rscadd: Adds a KA mod that does damage in an AoE, found only in necropolis chests. + - rscadd: You can now install any KA mods into a mining cyborg, though its mod capacity + is slightly lower. + - tweak: Mining cyborgs now have a crowbar to remove mods from their KA. + - tweak: Kinetic Accelerators now have a larger mod capacity, though most mods can + still only be installed the same amount of times as they can currently. + - tweak: You can now hit modkits with Kinetic Accelerators to install that modkit + into the accelerator. Mining cyborgs are unable to do so. + - rscadd: Added white and adjustably-coloured tracer round mods to the mining equipment + vendor, so you can see where your projectile is going(and look cool). + - rscadd: Added the super and hyper chassis mods to the mining equipment vendor, + so you can use excess mod space to have a cool-looking KA. + MrStonedOne: + - rscdel: Removes check on lights preventing you from turning them on while in a + locker + PKPenguin321: + - rscadd: Xeno queens now have an action button that makes them appear to themselves + as the old, small queen sprite. Now they should be able to interact with things + that are above them more easily. + Shadowlight213: + - tweak: Reviver and nutriment implants are far easier to get and have lower tech + origins. + - rscdel: Centcom has cut back on their cat carrier budget and will now only be + able to bring kittens along with runtime. + - rscadd: A new event has been added. The automated grid check. All apcs in non + critical areas will be shut off for some time, but can be manually rebooted + via interaction. + Yackemflam: + - tweak: Boxes are worth >26 tc at LEAST +2016-08-28: + CoreOverload: + - tweak: You can now use sheets from any hand, not just the active one. + Iamgoofball: + - tweak: Station and Character names are now allowed to be longer. + - rscdel: Gender Reassignment surgery has been removed. + Incoming5643: + - experiment: 'Due to a bad case of "being terrible" the save system for secret + satchels has been reworked. All saves are now unified in a single data file: + /data/npc_saves/SecretSatchels' + - rscdel: 'Old savefiles such as: /data/npc_saves/SecretSatchels_Box Station can + now be safely removed.' + - rscadd: A new slime reaction has been found for pink slimes using blood. The potion + produced from this reaction can be used to change the gender of living things. + Decently useful for animal husbandry, but otherwise mostly just for pranks/"""roleplay"""/enforcing + a brutal regime composed entirely of female slime people. + Joan: + - bugfix: Bumping the AI on help intent will no longer cause it and you to swap + positions, even if it is unanchored. If unanchored, it will properly push the + AI around. + - rscadd: The staff of lava can now turn lava back into basalt. + - bugfix: Placing a singularity or energy ball generator directly in front of an + active particle accelerator may be a bad idea. + Kor: + - rscadd: Added Battlemage armour to the spellbook. The armour is heavily shielded, + but will not recharge once the shields are depleted. + - rscadd: Added armour runes to the spellbook, which can grant additional charges + to the Battlemage armour. + MrStonedOne: + - rscadd: The game window will now flash in the taskbar on incoming admin pm, and + to all admins when an admin help comes in. + PKPenguin321: + - rscadd: The tesla is now much more dangerous, and can cause electronics to explode + violently. + - rscadd: It now hurts to get thrown into another person. + Shadowlight213: + - tweak: The radiation storm random event will automatically enable and disable + emergency maint. + - rscadd: The radiation storm random event is now a weather type that affects the + station. + - bugfix: The security temperature gun now has a firing pin making it 0.0000001% + more useful! + - rscadd: Added config option to use byond account creation age for job limits. + WJohnston: + - imageadd: Lavaland lava probably sorta looks better I guess. + Yackemflam: + - rscadd: Sniper kit have been given as a syndicate bundle set. Be warned though, + they are not as equipped as the nuclear agent kits. + kilkun: + - rscadd: Adds a shielded deathsquad hardsuit. it has four charges and recharges + after 15 seconds of not being shot (compared to the syndicate 3 charges and + 20 second recharge rate) + - tweak: All death commandos now spawn with this new hardsuit. The previous hardsuit + was not removed. + pubby: + - rscadd: Mining scanner module to standard borgs + - rscdel: Sheet snatcher module from standard borgs + xxalpha: + - rscadd: Cigarette packs, donut boxes, egg boxes can now be closed and opened with + Ctrl+Click. + - rscadd: Lighters are now represented in cigarette packs with a sprite of their + own. + - rscadd: You can now remove a lighter from a cigarette pack quickly with Alt+Click. + - bugfix: Reduced the amount of cigars that cigar cases can hold to 5 because the + cigar case sprite doesn't support more than that. +2016-08-29: + Cruix: + - rscadd: Space floppy-disk technology has advanced to the point that multiple technologies + or designs can be stored on a single disk. + Joan: + - rscadd: Lava bubbling up from basalt turfs now glows if in sufficient concentration. + - rscadd: Necropolis tendrils now glow. + - rscadd: Lava rivers now have riverbanks, and should overall look much nicer. + Shadowlight213: + - bugfix: The revenant ectoplasm sprite is no longer invisible. + Xhuis: + - rscadd: Highlander has been revamped. Now you can butcher your coworkers in cold + blood like never before! +2016-08-30: + oranges: + - tweak: The ed209 can now only fire as fast as the portaturrets +2016-08-31: + Iamgoofball: + - rscadd: Adds a new experimental gas to the game. Check it out! + Joan: + - rscadd: Vanguard now has a tooltip showing the amount of stuns you've absorbed + and will be affected by. + MMMiracles: + - bugfix: Xenomorphs can now actually damage barricades. + Shadowlight213: + - bugfix: Fixed runtime preventing access locked programs from being downloaded + XDTM: + - rscadd: Metal slimes now spawn a few sheets of glass when injected with water. + xxalpha: + - tweak: Opening and closing of donut boxes, etc. is now done with clicking the + object with itself. + yackemflam: + - rscadd: The standard rounds now blow off limbs. Happy hunting! +2016-09-01: + Cruix: + - bugfix: fortune cookies will now drop their fortunes when they are eaten. + Iamgoofball: + - tweak: NULL Crate in cargo was added again because people are fucking idiots so + if we're going to have this stupid fucking crate might as well make it not fucking + garbo + Kor: + - rscadd: Watertanks will now explode when shot. + Lzimann: + - tweak: You can now open all access doors while restrained. + Shadowlight213: + - tweak: Rad storms are more obvious + - bugfix: Pizza bombs will now delete after exploding. + phil235: + - tweak: Putting packagewrap or hand labeler in a backpack is now done by clicking + and dragging. + - bugfix: You can now wrap backpacks and other storage items with packagewrap. +2016-09-02: + A-t48: + - bugfix: Fixed cyborgs being able to use Power Warning emote when broken. + Iamgoofball: + - experiment: Freon has been reworked completely. + - rscadd: Water Vapor has been added to the Janitor's Closet. + RemieRichards: + - bugfix: Cutting bedsheets with a sharp object/wirecutters no longer puts the resulting + cloth INSIDE OF YOU if you're holding it, what a bug. + bgobandit: + - tweak: You can hide small items in urinals now. Use a screwdriver to screw open + the drain enclosure. + - rscadd: Every space urinal comes complete with space urinal cake. Do not eat. +2016-09-04: + A-t48: + - bugfix: Radiation storms no longer spam "Your armor softened the blow." + - bugfix: Radiation always gives a message that you are being irradiated, regardless + of armor level (only an issue if you stripped off all clothing) + - bugfix: Radiation now displays a message appropriate for all mob types (no longer + references clothes). + Gun Hog: + - rscadd: Ghosts may now read an AI or Cyborg's laws by examining them. + Joan: + - rscadd: The talisman of construction now has 25 uses, each of which can convert + a sheet of plasteel to a sheet of runed metal. It can still convert metal into + construct shells, and requires no specific amount of uses to do so. + - rscadd: Added the 'Drain Life' rune to the runes cultists can make. It will drain + life from all creatures on the rune, healing the invoker. + - imageadd: The 'Astral Communion' rune has a new sprite, made by WJohnston. + - rscdel: You can no longer use telekinesis to hit people with items they're holding, + items inside items they're holding, items embedded in them, items actually implanted + in them, or items they're wearing. + MMMiracles: + - rscadd: A set of combat gear for bears has been added, see your local russian + for more information. + XDTM: + - tweak: Nanotrasen has now stocked the DNA Manipulators with potassium iodide instead + of epinephrine as rejuvenators. +2016-09-07: + A-t48: + - bugfix: you can now scrub freon and water vapor + - bugfix: you can now label canisters as freon and water vapor + AnturK: + - rscadd: Watch out for special instructions from Centcom in the intercept report. + Cheridan: + - tweak: Brain damage no longer causes machines to be inoperable. + Ergovisavi: + - bugfix: Stops ash drakes from swooping across zlevels + Impisi: + - tweak: Increased chances of Modular Receiver drop in Maintenance + Incoming5643: + - rscdel: Wizards can no longer purchase the Cursed Heart from their spellbook. + Joan: + - experiment: The lava staff now has a short delay before creating lava, with a + visible indicator. + - tweak: The lava staff's cooldown is now somewhat shorter, and turning lava back + into basalt has a much shorter cooldown and no delay. + Lzimann: + - tweak: Stunprods no longer fit in your backpack, they go on your back now. + MrStonedOne: + - bugfix: Fixed lava sometimes doing massive amounts of damage. + - tweak: AFK players will no longer default to continue playing during restart votes. + XDTM: + - bugfix: Cloners now preserve your genetic mutations. + pubby: + - tweak: Changed military belt TC cost from 3 -> 1 + - tweak: Update ingredient boxes to have more useful ingredients +2016-09-08: + Jordie0608: + - rscadd: Notes can now be tagged as secret to be hidden from player viewed notes. + Lzimann: + - tweak: Legion implants now have a full heal when implanted instead of passive + heal + spawn tentacles. The healing also goes off when you enter crit. + Yackemflam: + - rscadd: You can now buy a box for a chance to mess with the stations meta for + ops. +2016-09-09: + Ergovisavi: + - rscadd: Adds new loot for the colossus, the "Anomalous Crystal" + - tweak: Enabled colossus spawning again + Joan, Ausops: + - rscadd: Added some very fancy tables, constructed by adding carpet tiles to a + standard table frame. + MrStonedOne: + - experiment: Blessed our beloved code with dark magic. + Shadowlight213: + - tweak: Radiation storm direct tox loss removed + - tweak: Radiation storms now cause a radiation alert to appear for the duration +2016-09-12: + Joan: + - rscadd: Cult structures can once again be constructed with runed metal. + - experiment: Cult structures can now take damage and be destroyed. Artificers can + repair them if they're damaged. + - tweak: The Recollection function of the clockwork slab is much more useful and + easier to parse. + - wip: Tweaked the Recital menus for scripture so the scripture are all in the proper + order. This might fuck you up if you were used to the incorrect order, but you'll + get used to it. + Nanotrasen Anti-Cheese Committee: + - bugfix: A glitch in the hydroponics tray firmware allowed it to retain plant growth + even after the plant was removed, resulting in the next planted seed being grown + instantaneously. This is no longer possible. + PKPenguin321: + - bugfix: Tesla shocks from grilles will no longer do thousands and thousands of + damage. They now properly deal burn damage that is equal to the current power + in the powernet divided by 5000. + Papa Bones: + - tweak: You can now rename the captain's sabre by using a pen on it. + RemieRichards: + - rscadd: Added the functionality for mobs to have multiple hands, this might have + broken some things, so please report any weirdness + Shadowlight213: + - rscdel: The surplus crate and random item will now only contain items allowed + by the gamemode + - rscdel: removes sleeping carp scroll from surplus crates + - experiment: Minimaps will now try to load from a cache or backup file if minimap + generation is disabled. + TheCarlSaganExpress: + - rscadd: Crayons, lipstick, cigarettes, and penlights can now be inserted into + PDAs. + phil235: + - rscadd: Monkeys can be dismembered. + - rscadd: Humans, monkeys and aliens can drop limbs when they are gibbed. + - rscadd: Roboticists can remove flashes, wires and power cells that they inserted + in robot head or torso by using a crowbar on it. + - rscadd: visual wounds appear on a monkey's bodyparts when injured, exactly like + humans. + - rscadd: Using a health analyzer on a monkey or alien shows the injuries to each + bodypart. + - rscadd: Monkeys can become husks. + - bugfix: Human-monkey transformations now respect missing limbs. No more limb regrowth + by becoming a monkey. + - bugfix: Changeling's regenerate ability also work while in monkey form. + - bugfix: Alien larva has its own gib and dust animation. + - bugfix: A bodypart that looks wounded still looks bloody when dismembered. + - bugfix: Amputation surgery now works on robotic limbs, and monkeys. +2016-09-14: + Ergovisavi: + - bugfix: Fixes lockers, bodybags, etc, giving you ash storm / radiation storm protection + Erwgd: + - rscadd: Upgraded sleepers can now inject inacusiate to treat ear damage. + Joan: + - rscadd: Added brass, producible by proselytizing rods, metal, or plasteel, or + by using Replicant Alloy in-hand, and usable to construct a variety of cult-y + brass objects. + - tweak: Objects constructable with brass include; wall gears, pinion airlocks, + brass windoors, brass windows, brass table frames and tables, and brass floor + tiles. + - rscadd: Cogscarabs can convert brass sheets into liquified alloy with their proselytizer. + - tweak: You can use brass sheets on wall gears to produce clockwork walls, or, + if the gear is unanchored, false clockwork walls. + - bugfix: Fixed a bug preventing you from converting grilles into ratvar grilles. + - experiment: Please note that conservation of mass exists. + Sligneris: + - tweak: Captain's space armor has been readapted with modern hardsuit technology. + oranges: + - tweak: Examine code for dismembered humans now has better easter eggs +2016-09-17: + BoxcarRacer41: + - rscadd: Added a new food, bacon. Bacon is made by processing raw meat cutlets. + - rscadd: Added a new burger recipe, the Bacon Burger. It is made with one bun, + one cheese wedge and three pieces of cooked bacon. + Ergovisavi: + - rscadd: Added a nightvision toggle to Shadowpeople + - tweak: Made several anomalous crystal variants more easily identified/easier to + see the effects thereof, and removed the "magic" activation possibility (replaced + with the "bomb" flag) + Gun Hog: + - tweak: Nanotrasen Robotics Division is proud to announce slightly less clunky + leg servo designs relating to the "Ripley" APLU and "Firefighter" exosuits. + Tests show increased mobility in both high and low pressure environments. The + previous designer has been fired for incompetence. + Improves tablets design: + - imageadd: Brings the tablet icons into the holy light of having depth + Joan: + - rscadd: Megafauna will now use ranged attacks even if they don't have direct vision + on their target. + - rscadd: Volt Void and Interdiction Lenses will now drain mech cells of energy. + - tweak: Ocular Wardens do slightly more damage to mechs. + - experiment: Replicant, Soul Vessel, Cogscarab, and Anima Fragment now take an + additional second to recite. + - tweak: Anima Fragments do slightly less damage in melee. + - tweak: Mending Motors and Clockwork Obelisks have slightly less health. + - tweak: Invoking Nezbere now requires 3 invokers. + - rscdel: Clockwork armor no longer has 5% energy resistance. + - bugfix: You can no longer construct clockwork structures on space turfs. + Papa Bones: + - tweak: BZ gas is no longer available on Box and Metastation layouts. + phil235: + - tweak: You no longer have to click a megaphone to use it, you simply keep it in + your active hand and talk normally. + - rscadd: Added new things + - imageadd: added some icons and images +2016-09-20: + Ergovisavi: + - bugfix: fixed "friendly" xenobio mobs and mining drones attacking station drones + Joan: + - rscadd: Miners can now buy KA AoE damage mods from the mining vendor for 2000 + points per mod. + - rscadd: 'Combined the Convert and Sacrifice runes into one rune. It''ll convert + targets that are alive and eligible, and attempt to sacrifice them otherwise. + The only changes to mechanics are that: Converting someone will heal them of + all brute and burn damage they had, and sacrificing anything will always produce + a soulstone(but will still only sometimes fill it)' + - tweak: You can no longer teleport to Teleport runes that have dense objects on + top of them. + - experiment: Wall runes will now activate other nearby wall runes when activated, + but will automatically disable after a minute and a half of continuous activity + and become unusable for 5 seconds. + - experiment: The Blood Boil rune no longer does all of its damage instantly or + stuns, but if you remain in range for the full duration you will be sent deep + into critical. + - experiment: Bubblegum has been seen reaching through blood. Try not to get hit. + - experiment: The Raise Dead rune no longer requires a noncultist corpse to revive + a cultist; instead, it will draw from the pool of all people sacrificed to power + the rune. + Mekhi: + - rscadd: Nanotrasen has been experimenting on cybernetics for a while, and rumors + are they have a few combat prototypes available... + - experiment: 'New arm implants: Energy-blade projector, implanted medical beamgun, + stun-arm implant (Like the borg version), flash implant that is automatically-regenerating + and doubles as a powerful flashlight. There is also one with all four items + in one. Also, a surgery toolkit implant. Adminspawn only for the moment.' + MrStonedOne: + - bugfix: Fixed space/nograv movement not triggering when atoms moved twice quickly + in space/nograv + Nanotrasen Stress Relief Board: + - rscadd: Latecomers to highlander can now join in on the fun. + - rscadd: The crew are encouraged to less pacifistic during highlander. Failing + to shed blood will result in your soul being devoured. Have a nice day. + Nicho1010: + - bugfix: Fixed lattices appearing after exploding lava + Screemonster: + - tweak: Abandoned crates no longer accept impossible guesses. + - tweak: Lets players know that all the digits in the code must be unique. + - tweak: Reads the last guess back on the multitool along with the correct/incorrect + guess readout. + - bugfix: multitool output on crates no longer returns nonsense values. + XDTM: + - rscadd: Positive viruses are now recognized by medical HUDs with a special icon. + - tweak: fully_heal no longer removes nonharmful viruses. This affects legion souls, + staffs of healing, and changeling's revive. + - rscadd: Canisters of any type of gas are now orderable in cargo. Dangerous experimental + gases will require Research Director approval. + Yackemflam: + - rscadd: The syndicate has learned on how to give their agents a true syndicate + ninja experience. + chickenboy10: + - rscadd: Added a Experimental Limb Grower to the medbay department, now medical + stuff can grow synthetic limbs using Synthflesh to help crew that suffer any + work related accidents. There may also be a limb that can be grown with a special + card... + feemjmeem: + - tweak: You can now disassemble meatspike frames with a welding tool. + phil235: + - experiment: 'adds a talk button next to the crafting button. Clicking it makes + a "wheel" appear around you with short predetermined messages that you click + to say them. This lets you say common responses without having to type in the + chat bar. Current messages available are: "Hi", "Bye", "Thanks", "Come", "Help", + "Stop", "Get out", "Yes", and "No". The talk button can be activated with the + hotkey "H" or "CTRL+H"' + - rscadd: Wearing colored glasses colors your vision. This option can be enabled/disabled + by alt-clicking any glasses with such feature. +2016-09-21: + Cyberboss: + - bugfix: The food processor's sprite's maintenance panel is no longer open while + closed and vice/versa + - tweak: Tesla arcs no longer lose power when passing through a coil that isn't + connected to a grid + MrStonedOne: + - bugfix: Fixes minimap generation crashes by making parts of it less precise +2016-09-23: + Cyberboss: + - rscadd: Wire layouts of NanoTransen devices for the round can now be found in + the Station Blueprints + Incoming5643 + WJohnston: + - imageadd: Lizard sprites have received an overhaul, sprites courtesy of WJohnston! + - rscdel: While there are some new bits, a few old bits have gone by the wayside, + if your lizard has been affected by this the specific feature will be randomized + until you pick a new setting. + - rscadd: Lizards can now choose to have digitigrade legs (those weird backwards + bending ones). Keep in mind that they can only be properly seen in rather short + pants. They also preclude the use of shoes. By default no lizard will have these + legs, you have to opt in. + - rscadd: All ash walker lizards however are forced to have these legs. + - experiment: There is absolutely no tactical benefits to using digitigrade legs, + you are only crippling yourself if you use them. + Papa Bones: + - tweak: You can now quick-draw the officer's sabre from its sheath by alt-clicking + it. + XDTM: + - bugfix: Holy Water no longer leaves you stuttering for years. +2016-09-24: + Cheridan: + - tweak: Nerfed Critical Hits + MrStonedOne: + - tweak: Orbits now use a subsystem. + - tweak: Orbits now bind to object's moving to allow for quicker updates, subsystem + fallback for when that doesn't work (for things inside of things or things that + move without announcing it) + XDTM: + - rscdel: Viruses start with 0 in every stat instead of 1. + - bugfix: Atomic Bomb, Pan-Galactic Gargle Blaster, Neurotoxin and Hippie's Delight + are now proper alcoholic drinks, and as such can disinfect, ignite, and be purged + by antihol. + optional name here: + - tweak: Changes cursed heart description to something slightly more clear. + - bugfix: Fixes a capitalization issue +2016-09-26: + Cuboos: + - rscadd: Added E-cigarettes as contraband to cigarettes vending machines. They + take reagents instead of dried plants and also hold more than cigarettes or + pipes. You can modify them to puff out clouds of reagents or emag them to fill + a whole room with reagent vapor. + - rscadd: Added a new shirt to the clothing vendor relating to the newly added vapes. + Joan: + - tweak: Blobs will generally require fewer blobs to win during the blob mode, which + should hopefully make the mode end faster at lower overmind amounts. + Razharas: + - rscadd: '"Kudzu now keeps the mutations it had before and thus can be properly + cultivated to be whatever you want"' + TheCarlSaganExpress: + - rscadd: You may now insert crayons, lipstick, penlights, or cigarettes in your + PDA. + - bugfix: Removing cartridges from the PDA will no longer cause them to automatically + fall to the floor. + oranges: + - rscadd: It looks like a pizza delivery from an un-named station got misplaced +2016-09-27: + Cobby: + - tweak: Nanotrasen has buffed the electronic safety devices found in Secure Briefcases + and Wallsafes, making them... well... more secure. In Particular, we added more + wires that do absolutely nothing but hinder the use of the multitool, along + with removing the ID slot only used by syndicates to emag the safe. + Incoming5643: + - rscadd: The secret satchels system has been updated to hide more smuggler's satchels + hidden randomly under the station + - experiment: In case you forgot about the secret satchel system, basically if you + take a smuggler's satchel (a traitor item also occasionally found under a random + tile in the station [USE T-RAYS]), stow away an item in it, and bury it under + the floor tiles that item can reappear in a random later round! + MrStonedOne: + - tweak: Custom Round end sounds selected by admins will be preloaded to all clients + before actually rebooting the world + Shadowlight213: + - bugfix: Fixes broken icon states when replacing warning floor tile + Supermichael777: + - tweak: Cat men have finally achieved equal discrimination. + TrustyGun+Pubby: + - imageadd: Lawyers now have unique speech bubbles. + XDTM: + - tweak: Using plasma on dark blue slimes will now spawn freon instead of arbitrarily + freezing mobs. + uraniummeltdown: + - tweak: Protolathe stock parts now build 5 times faster +2016-09-28: + Cuboos: + - bugfix: Removed the admin message spam from the smoke_spread proc. You may now + vape in peace without the threat of a Blue Space Artillery + LanCartwright: + - rscdel: Removed Stimulants and Coffee from survival pens. + - tweak: Nanites have been replaced with Mining Nanites which heal more when you + are lower health, and do not have the ridiculous healing Adminorazine had. +2016-10-01: + Incoming5643: + - rscadd: After years of having to live on a mostly blown up hunk of junk the wizard's + ship has finally been repaired + - rscdel: No one paid attention to that lore anyway +2016-10-07: + WJohnston: + - imageadd: Improved/resprited AI card, pAI, easel/canvases, shotgun shells, RCD + cartridge, speedloaders, and certain older buttons. + - imageadd: Improved/resprited a few bar signs, basketball/dodgeball/hoop, blood + bags, and body bags. + - imageadd: Improved/resprited Paper, stamps, folders, small fires, pens, energy + daggers, cabinets, newspaper and other bureaucracy related items. +2016-10-10: + ChemicalRascal: + - bugfix: Previously, improving the incinerator's efficiency made the RPM decay + more quickly, instead of less quickly. No more! + Cyberboss: + - rscadd: More reagent containers can be used for filling your dirty vapor cancer + sticks + - spellcheck: Fixed some vape spelling/grammar + MrStonedOne: + - tweak: Player Preferences window made slightly faster. + Nanotrasen Stress Relief Board: + - rscdel: Claymores created through Highlander no longer thirst for blood or announce + their wielder's location incessantly. + - bugfix: Claymores should now properly absorb fallen foes' corpses. + - bugfix: Losing a limb now properly destroys your claymore. + Supermichael777: + - bugfix: The wizards federation have instituted a strict 1 demon limit on demon + bottles. + XDTM: + - rscadd: Using blood on an Oil Slime will create Corn Oil. + - rscadd: Using blood on Pyrite Slimes will create a random crayon. + - rscadd: Using water on Orange Slimes will create a small smoke cloud. + - rscadd: Using water on Blue Slimes will spawn foam. + - rscadd: You can now retrieve materials inserted in a Drone Shell Dispenser with + a crowbar. + phil235: + - rscadd: A whole bunch of structures and machines can now be broken and destroyed + using conventional attack methods. + - rscadd: The effect of fire on objects is overhauled. When on fire, your external + clothes now take fire damage and can become ashes, unless fire proof. All objects + caught in a fire can now take fire damage, instead of just flammable ones, unless + fire proof. + - rscadd: Acid effect is overhauled. Splashing acid on something puts a green effect + on it and start slowly melting it. Throwing acid on mobs puts acid on their + clothes. Acid can destroy structures and items alike, as long as they're not + acid proof. The more acid put on an object, the faster it melts. Walking on + an acid puddle puts acid on your shoes or burns your bare feet. Picking up an + item with acid without adequate glove protection burns your hand. Acid can be + washed away with any sort of water source (extinguisher, shower, water glass,etc...). + - rscadd: When a mob receives melee attacks, its clothes also get damaged. Clothes + with enough damage get a visual effect. Damaged clothes can be repaired with + cloth (produced with botany's biogenerator). Clothes that receives too much + melee damage become shreds. + - tweak: Clicking a structure/machine with an item on help intent can never result + in an attack. + - tweak: Hostile animals that are environment destroyers no longer destroys tables&closets + in one hit. It now takes several hits depending on the animal. +2016-10-11: + Cyberboss: + - rscadd: The waste line now has a digital valve leading to space (off by default) + along with a port on it's far side + Incoming5643: + - rscadd: Wizards may finally use jaunt and blink on the escape shuttle. Maybe elsewhere + too? + - bugfix: The previously broken radios in the wizards den should work now. You still + have to turn them on though. + Kor: + - rscadd: Added frogs, with sprites by WJ and sounds by Cuboos. + Papa Bones: + - rscadd: Flora now spawns in lavaland tunnels, they can be harvested with a knife. + - rscadd: Flora have a range of effects, be careful what you eat! + - bugfix: You harvest flora on lavaland with your hands, not a knife. My bad. + Shadowlight213: + - rscadd: Cargo can order the antimatter engine +2016-10-12: + Cyberboss: + - bugfix: Fixed motion alarms instantly triggering and de/un/re/triggering + - bugfix: Airlock speed mode now works + Joan: + - rscadd: You can now deconstruct AI cores that contain no actual AI. + WJohnston: + - imageadd: Recolored and resprited candles and ID cards. Folders should have improved + color contrast. + XDTM: + - rscadd: Exhausted slime extracts will now dissolve instead of leaving useless + used slime extracts. + - tweak: Airlocks are now immune to any damage below 20, to prevent pickaxe prison + breaks. + - tweak: High-Security Airlocks, such as the vault or the AI core's airlocks, are + now immune to any damage below 30. +2016-10-13: + Razharas: + - tweak: Makes clicking something in heat of battle a bit easier by making drag&drops + that dont have any effect be counted as clicks + XDTM: + - rscadd: 'Added four new symptoms: Regeneration and Tissue Regrowth heal respectively + brute and burn damage slowly; Flesh Mending and Heat Resistance are the level + 8 version of those symptoms, and heal faster.' + - rscdel: The Toxic Compensation, Toxic Metabolism and Stimulants symptoms have + been removed. + - rscdel: Viruses no longer stack. Viruses can be overridden if the infecting virus + has higher transmittability than the previous virus' resistance. + - tweak: Viruses can now have 8 symptoms, up from 6. + - rscadd: You can now store monkey cubes in bio bags; using bio bags on the consoles + will load them with the monkey cubes inside the bags. + ma44: + - rscadd: Cargo can now order a 2500 supply point crate that requires a QM or above + to unlock. This crates contains a explorer suit, compact pickaxe, mesons, and + a bag to hold ore with. +2016-10-16: + Cuboos: + - rscadd: Added a new unique tool belt to the CE + - rscadd: Added new power tools, a hand drill that can be used as a screw driver + or wrench and jaws of life which can be used as either a crowbar or wire cutters + - rscadd: Power tools can also be made from the protolathe with engineering and + electromagnet 6 + - tweak: slightly revamped how construction/deconstruction handle sound + - soundadd: added new sounds for the power tools + - soundadd: added a new sound for activating and deactivating welding tools, just + because. + Cyberboss: + - bugfix: Plasma fires no longer cause cameras to break. + Joan: + - tweak: Blazing Oil blobs are now outright immune to fire. This does not affect + damage taken from other sources that happen to do burn damage. + - tweak: Normal blob spores now take two welder hits to die, from three. + - tweak: Cyborgs now die much less rapidly to blob attacks. + Lzimann: + - tweak: 'Changed two admin hotkeys: f7 is now stealth-mode and f8 to toggle-build-mode-self.' + Shadowlight213: + - bugfix: Modular consoles have been fixed. + Supermichael777: + - tweak: Changeling Sting is now one part screwdriver cocktail and 2 parts lemon-lime + soda. + - bugfix: Triple citrus now actually displays its sprite. + Yackemflam: + - tweak: extinguishers now spray faster + coiax: + - rscadd: RCDs have a Toggle Window Type verb allowing the rapid construction of + reinforced windows, rather than regular windows. + - rscadd: RCDs can now finish and deconstruct wall girders. + phil235: + - tweak: Clicking a floor with a bodybag or roller bed now deploys them directly + (and the bodybag starts open) + scoopscoop: + - bugfix: The cult shifter will now properly spawn as part of the veil walker set. +2016-10-18: + Basilman: + - rscadd: A third martial art, CQC, has been added and is now available to nuke + ops instead of sleeping carp + Kor: + - rscadd: Added sloths to cargobay on Box and Meta + MrPerson: + - rscadd: New toxin - Rotatium. It doesn't quite do what it does on other servers. + Instead it rocks your game view back and forth while slowly doing toxin damage. + The rocking gets more intense with time. + - rscadd: To make it, mix equal parts mindbreaker, neurotoxin, and teslium. + MrStonedOne: + - experiment: Byond 511 beta users may now choose their own FPS. This will apply + to animations and other client side only effects. Find it in your game preferences. + Shadowlight213: + - bugfix: fixed removing modular computer components + TheCarlSaganExpress: + - tweak: Provided you have access, you may now use your ID to unlock the display + case. + - tweak: The fire axe cabinet and display case may now be repaired with the welder. + XDTM: + - rscadd: You can now grind slime extracts in a reagent grinder. If the slime was + unused it will result in slime jelly, while if used it will only output the + reagents inside the extract. + Yackemflam: + - bugfix: fixed the standard vest being weaker than the slim variant + lordpidey: + - rscadd: There is a new potential obligation for devils to have. Musical duels. Ask + your nearest devil for a musical duel, there's a 14% chance he's obligated to + do it. + - rscdel: Removed the old offering a drink obligation for devils, it overlapped + too much with the food obligation. + - tweak: Trying to clone people who've sold their soul now results in FUN. + - tweak: Devils can no longer spam ghosts with revival contracts. + phil235: + - rscadd: Visual effects appear on the target of an attack, similar to the item + attack effect. + - rscdel: You now only see a message in chat when witnessing someone else getting + attacked or hit by a bullet if you are close enough to the action. +2016-10-19: + Cyberboss: + - bugfix: Physically speaking is no longer delayed by your radio's lag + - bugfix: You can now attack doors with fireaxes and crowbars when using the harm + intent + - tweak: The BSA is no longer ready to fire when constructed + - bugfix: The BSA can no longer be reloaded faster by rebuilding the console + MrStonedOne: + - tweak: tweaked the settings of the space drift subsystem to be less effected by + anti-lag slowdowns + Pubby: + - rscadd: 'A new map: PubbyStation. Set it to your favorite in map preferences!' + XDTM: + - rscadd: PanD.E.M.I.C. now displays the statistics of the viruses inside. + phil235: + - tweak: Made the singularity gen and tesla gen immune to fire. + - tweak: All unique traitor steal objective item are now immune to all damage except + severity=1 explosion. + - tweak: Mobs on fire no longer get damage to their worn backpacks, belts, id, pocket + stuff, and suit storage. + - bugfix: Mob receiving melee attacks now only have its outer layer of clothes damaged, + e.g. no damage to jumpsuit when wearing a suit. + - bugfix: now all hardsuit have 50% more health, as intended. + wrist: + - rscadd: Toxins is different now. +2016-10-21: + Adam E.: + - tweak: Added cargo and engi access to auxillary mine base launching console. + Cyberboss: + - tweak: Your brain is now gibbed upon chestburst + - bugfix: The safe is indestructible again + Joan: + - rscadd: Wraith Spectacles will now slowly repair the eye damage they did to you + as long as you aren't wearing them. + - experiment: You can now see how much eye damage the spectacles have done to you + overall, as well as how close you are to being nearsighted/blinded. + - tweak: Mending Motors heal for more. + - wip: Mania Motors are overall more powerful; they have greater effect, but require + more power to run and less power to convert adjacent targets. + - experiment: Interdiction Lenses no longer require power to disrupt electronics + and will no longer disrupt the radios of servants. + - bugfix: You need to be holding teleport talismans and wizard teleport scrolls + in your hands when you finish the input, and cannot simply open the input and + finish it whenever you get stunned. + - tweak: The range for seeing visible messages in combat is a tile higher. + Screemonster: + - tweak: The anti-tamper mechanism on abandoned crates now resists tampering. + - tweak: Secure, non-abandoned crates can be given a %chance of exploding when tampered + with. Defaults to 0. + Shadowlight213: + - bugfix: The Swap minds wizard event will now function + Swindly: + - rscadd: The action button for a dental implant now includes the name of the pill + - bugfix: The pill activation button now properly displays the pill's icon + uraniummeltdown: + - rscadd: Adds more replacements to the Swedish gene +2016-10-22: + Shadowlight213: + - experiment: Breathing has been moved from species to the lung organ + - rscadd: Lung transplants are now possible! +2016-10-23: + Cyberboss: + - bugfix: Fixed a bug that caused door buttons to open doors one after another rather + than simultaneously like they are suppose to + - bugfix: NOHUNGER species no longer hunger + - bugfix: Appropriate gloves now protect you from getting burned by cheap cigarette + lighters + - rscdel: Labcoats no longer have pockets + Yackemflam: + - tweak: Riot helmets are now more useful in melee situations and the standard helmet + is now slightly weaker + uraniummeltdown: + - rscadd: Atmos grenades are now in the game and uplink +2016-10-24: + Batman: + - tweak: The sniper rifle descriptions are less edgy. + Cobby: + - rscadd: Finally, a way to relate to Bees! + Cyberboss: + - bugfix: Morphs no longer gain the transparency of chameleons + - bugfix: Turrets can no longer shoot when unwrenched + - bugfix: Spray bottle can now be used in the chem dispenser + Joan: + - rscadd: Clockwork marauders now have a HUD, showing block chance, counter chance, + health, fatigue, and host health(if applicable), as well as including a button + to try to emerge/recall. + - experiment: Clockwork marauders can now block bullets and thrown items, even if + Ratvar has not risen. + - rscadd: The Judicial Visor no longer requires an open hand to use. Instead, clicking + the button will give you a target selector to place the Judicial Marker. + - experiment: Tinkerer's Daemons are now a structure instead of a Cache addon. + - wip: Tinkerer's Daemons now consume a small amount of power when producing a component, + but produce components every 12 seconds with no additional delay. + - tweak: Adjusted the costs of the Tinkerer's Daemon and Interdiction Lens. + - imageadd: Floaty component images appear when Tinkerer's Caches and Daemons produce + components. + MrStonedOne: + - bugfix: Spectral sword now tracks orbiting ghosts correctly. + Shadowlight213: + - imageadd: Damaged airlocks now have a sparking effect + Swindly: + - rscadd: Added a button to the ChemMaster that dispenses the entire buffer to bottles. + ma44: + - rscadd: Reminds the user that reading or writing a book is stupid. +2016-10-27: + Chowder McArthor: + - rscadd: Added a neck slot. + - tweak: Modified some of the attachment items (ties, scarves, etc) to be neck slot + items instead. + Cyberboss: + - rscadd: NEW HOTKEYS + - rscadd: The number pad can be used to select the body part you want to target + (Cycle through head -> eyes -> mouth with 8) in hotkey mode. Be sure Numlock + is on! + - rscadd: Holding shift can be used as a modifier to your current run state in both + hotkey and normal mode. + - bugfix: Emag can no longer be spammed on shuttle console + Gun Hog: + - bugfix: Fixed AIs uploaded to mechs having their camera view stuck to their card. + Joan: + - rscadd: Clockwork Floors now have a glow when healing servants of toxin damage. + Only other servants can see it, so don't get any funny ideas. + - bugfix: The Interdiction Lens now properly has a high Belligerent Eye cost instead + of a high Replicant Alloy cost. + Pubby: + - tweak: PubbyStation's bar is now themed like a spooky castle! + Swindly: + - bugfix: Chem implants can now be properly filled and implanted + WJohnston: + - rscadd: Adds an unlocked miner equipment locker on Boxstation and Metastation's + Aux Base Construction area, as well as a telescreen to the camera inside. All + mining outpost computers can also see through that camera. + lordpidey: + - rscadd: The wizard federation has teamed up with various LARP groups to invent + a new type of spell. +2016-10-28: + Erwgd: + - rscadd: You can now use cloth to make black or fingerless gloves. + - tweak: Biogenerators require less biomass to produce botanist's leather gloves. + Tacolizard: + - rscadd: Added a new contraband crate to cargo, the ATV crate. +2016-10-29: + Chowder McArthor: + - bugfix: Added in icons for the neck slot for the other huds. + Cobby: + - rscadd: Adds several Halloween-Themed Emojis. See if you can get them all! [no + code diving cheaters!] + Erwgd: + - rscadd: The NanoMed Plus now stocks premium items. + Joan: + - experiment: Guvax is now targeted; invoking it charges your slab to bind and start + converting the next target attacked in melee within 10 seconds. This makes your + slab visible in-hand. + - tweak: Above 5 Servants, the invocation to charge your slab is not whispered, + and the conversion time is increased for each Servant above 5. + - wip: Using Guvax on an already bound target will stun them. The bound target can + resist out, which will prevent conversion. + - experiment: Sentinel's Compromise is now targeted, like Guvax, but can select + any target in vision range. + - rscadd: Sentinel's Compromise now also removes holy water from the target Servant. + - wip: Clicking your slab will cancel these scriptures. + - imageadd: Both of these will change your cursor, to make it obvious they're active + and you can't do anything else. + - rscadd: Arks of the Clockwork Justicar that do not summon Ratvar will still quick-call + the shuttle. + - bugfix: Clockwork structures that return power can now return power to the APC + of the area they're in if there happens to be one. + - bugfix: Clockwork structures that use power from an APC will cause that APC to + start charging and update the tgUI of anyone looking at the APC. + - bugfix: Converting metal, rods, or plasteel to brass with a clockwork proselytizer + while holding it will no longer leave a remainder inside of you. + - tweak: Plasteel to brass is now a 2:1 ratio, from a 2.5:1 ratio. Accordingly, + you now only need 2 sheets of plasteel to convert it to brass instead of 10 + sheets. + - tweak: Wall gears are now converted to brass sheets instead of directly to alloy. + - rscdel: You can no longer do other proselytizer actions while refueling from a + cache. + - bugfix: Fixed a bug where certain stacks wouldn't merge with other stacks, even + when they should have been. + - bugfix: Clockwork structures constructed from brass sheets now all have appropriate + construction value to replicant alloy ratios. + - bugfix: Tinkerer's Caches no longer need to see a clockwork wall to link to it + and generate components. + MrStonedOne: + - experiment: Shoes do not go on heads. + NikNak: + - rscadd: Action figures are finally winnable at arcade machines. Comes in boxes + of 4. + Pubby: + - rscadd: The holodeck has been upgraded with new programs. Try them out! + Shadowlight213: + - rscdel: The HOS and other heads of staff no longer have a chance to be revheads + TehZombehz: + - tweak: Custom food items can now fit inside of smaller containers, such as paper + sacks. + - rscadd: Small cartons can be crafted using 1 piece of cardboard. Don't be late + for school. + - rscadd: Apples can now be juiced for apple juice. Chocolate milk can now be crafted + using milk and cocoa. + - tweak: Chocolate bar recipe has been modified to compensate for chocolate milk. + The soy milk version of the chocolate bar recipe remains unchanged. + - bugfix: Grapes can now be properly juiced for grape juice using a grinder. + XDTM: + - tweak: Wizards no longer need sandals to cast robed spells. + Xhuis: + - rscadd: Syndicate and malfunctioning AIs may now be transferred onto an intelliCard + if their parent core has been destroyed. This may only be done with the AI's + consent, and the AI may not be re-transferred onto another APC or the APC it + came from. + - rscadd: New additions have been made for this Halloween and all future ones. Happy + Halloween! + ma44: + - rscadd: You can now solidify liquid gold into sheets of gold with frostoil and + a very little amount of iron +2016-10-30: + Joan: + - rscadd: The Recollection option in the Clockwork Slab has been significantly improved, + with a better information to fluff ratio, and the ability to toggle which tiers + of scripture that are visible in Recollection. + Lzimann: + - bugfix: You can once again order books by its ID in the library. + Mysak0CZ: + - bugfix: You no longer need to deconstruct emagged (or AI-hacked) APC to fix them, + replacing board is sufficient + - bugfix: You can no longer unlock AI-hacked APCs + - bugfix: Removing APC's and SMES's terminal no longer ignore current tool's speed + - rscadd: You can repair APC's cover (only if APC is not compleatly broken) by using + APC frame on it + - rscadd: closing APC's cover will lock it + bgobandit: + - rscadd: The creepy clown epidemic has arrived at Space Station 13. + - rscadd: Honk. +2016-10-31: + Joan: + - experiment: Brass windows will now survive two fireaxe hits, and are slightly + more resistant to bullets. + Lzimann: + - rscdel: Changelings no longer have the Swap Forms ability. + Xhuis: + - rscadd: Disposal units, outlets, etc. are now fireproof. + - rscadd: Changelings can now use biodegrade to escape silk cocoons. +2016-11-02: + Iamgoofball: + - rscadd: Added a new lobby menu sound. + Joan: + - rscdel: Brass windows and windoors no longer drop full sheets of brass when destroyed. + - rscadd: Instead, they'll drop gear bits, which can be proselytized for a small + amount of liquified alloy; 80% of the materials used to construct the window. + - tweak: Mending Motors have an increased range and heal for more. + - experiment: Mending Motors will no longer waste massive amounts of power on slightly + damaged objects; instead, they will heal a small amount, use a small amount + of power, and stop if the object is fully healed. + - wip: Mending Motors can now heal all clockwork objects, including pinion airlocks, + brass windows, and anything else you can think of. + - rscadd: Ocular Wardens will no longer attack targets that are handcuffed, buckled + to something AND lying, or in the process of being converted by Guvax. + - tweak: Also, they do very slightly more damage. + - rscdel: Hulks no longer one-shot most clockwork structures and will no longer + four-shot the Gateway to the Celestial Derelict. + - bugfix: Hulks are no longer a blob counter. + XDTM: + - tweak: Ninjas are now slightly visible when stealthing. + phil235: + - rscadd: Spray cleaner and soap can now wash off paint color. +2016-11-03: + Cobby: + - rscadd: Adds a geisha outfit to the clothesmate on hacking. QT space ninja BF + not included + Joan: + - rscadd: 'Proselytizing a window will automatically proselytize any grilles under + it. This is free, so don''t worry about wasting alloy. rcsadd: Trying to proselytize + something that can''t be proselytized will try to proselytize the turf under + it, instead.' + - experiment: Clockcult's "Convert All Silicons" objective now also requires that + Application scripture is unlocked. + - wip: The "Convert All Silicons" objective will also only be given if there is + an AI, instead of only if there is a silicon. +2016-11-05: + Joan: + - rscadd: Proselytizer conversion now accounts for existing materials, and deconstructing + a wall, a girder, or a window for its materials is no longer more efficient + than just converting it. + - imageadd: Heal glows now appear when mending motors repair clockwork mobs and + objects. + Lzimann: + - rscdel: You can no longer walk holding shift. +2016-11-06: + Joan: + - bugfix: Dragging people over a Vitality Matrix will actually cause the Matrix + to start working on them instead of failing to start draining because it's "active" + from when the dragging person crossed it. + phil235: + - rscadd: You can now climb on transit tube, like tables. + - rscadd: You can now use tabs when writing on paper by writing "[tab]" +2016-11-07: + Basilman: + - rscadd: CQC users can now block attacks by having their throw mode on. + - tweak: The CQC kick and Disorient-disarm combos are now much easier to use, CQC + harm intent attacks are stronger aswell. + - bugfix: Fixed being able to CQC restrain someone, let him go, then 10 minutes + later disarm someone else to instantly chokehold them. + - tweak: CQC costs more TC (13) + Cyberboss: + - bugfix: Tesla zaps that don't come from an energy ball can no longer destroy nukes + and gravity generators + El Tacolizard: + - rscadd: A space monastery and chaplain job have been added to PubbyStation. + - rscadd: Improved pubby's maint detailing + Joan: + - tweak: Ratvarian Spears now do 18 damage and ignore a small amount of armor on + normal attacks, but have a slightly lower chance to knowdown/knockout. Impaling + also ignores a larger amount of armor. + - rscadd: Throwing a Ratvarian Spear at a Servant will not damage them and may cause + them to catch the spear. + - rscadd: Standard drones will be converted to Cogscarabs by Ratvar and the Celestial + Gateway proselytization. + - rscdel: Cogscarabs no longer receive station alerts. + - bugfix: Anima Fragments, Clockwork Marauders, and cult constructs are now properly + immune to heat and electricity. + - tweak: Clockwork armor is much stronger against bullets and bombs but much weaker + against lasers. + - wip: Specific numbers; Bullet armor from 50% to 70%, bomb armor from 35% to 60%, + laser armor from -15% to -25%. This means lasers are a 4-hit crit. + - rscadd: You can now Quickbind scripture other than Guvax and Vanguard to the Clockwork + Slab's action buttons, via Recollection. + - rscadd: You can also recite scripture directly from Recollection, if doing so + suits your taste. Of course it suits your taste, it's way easier than menus. + - tweak: You can also toggle compact scripture in Recollection, so that you don't + see description, invocation time, component cost, or tips. + - tweak: Dropping items into Spatial Gateways no longer consumes a use from the + gateway. + - rscadd: If your Spatial Gateway target is unconscious, you can pick a new target + instead. + Kor: + - rscadd: Multiverse teams now have HUD icons. + - rscadd: Multiverse war is back in the spellbook. + phil235: + - rscadd: Altclicking a PDA without id now removes its pen. + - rscadd: The PDA's sprite now shows whether it has an id, a pAI, a pen, or if its + light is on. +2016-11-09: + Changes: + - tweak: Old mining asteroid is more interesting (mining world can be picked in + ministation.dm) + - tweak: Space around ministation is now half(?) the size of normal space + - rscadd: Loot spawners to maintenance + - bugfix: Rad storms frying maintenance + - bugfix: Bad conveyor belts in mining/cargo area of station + - bugfix: Bombs completely destroying toxins test site + - rscadd: Cyborg job available again + - tweak: Mining cyborgs can use steel rods when asteroid mining is enabled + Joan: + - tweak: Repairing clockwork structures with a Clockwork Proselytizer now only costs + 1 alloy per point of damage. + - experiment: Vitality Matrices will no longer heal dead Servants that they cannot + outright revive. + - rscadd: The Celestial Gateway will now prevent the emergency shuttle from leaving. + - tweak: However, Centcom will alert, in general terms, the location of the Celestial + Gateway two minutes after it is summoned. + - rscadd: Reciting scripture while not on the station, centcom, or mining/lavaland + will double recital time and component costs. + Kor: + - rscadd: You can now examine an r-wall to find out which tool is needed to continue + deconstructing it. + - rscadd: The game will now recognize a successful detonation of the nuclear bomb + in the syndicate base. + - rscadd: Cloaks are now cosmetic items that can be worn in the neck slot, allowing + you to wear them over armour. + Shadowlight213: + - rscdel: Removed the restriction on attacking people with a fire extinguisher on + help intent if the safety is on. + uraniummeltdown: + - rscadd: Added Cortical Borers, a brainslug parasite. + - rscadd: Added Cortical Borer Event +2016-11-10: + Kor: + - rscadd: The wizard has a new spell, Rod Form, which allows him to transform into + an immovable rod. + uraniummeltdown: + - bugfix: fixed brains not having ckeys when removed + - bugfix: hopefully fixed multiple ghosts entering a borer ghosting all but one + - tweak: tweaked the formula for hosts needed for borer event to 1+humans/6 + - tweak: borer endround report is a lot nicer +2016-11-11: + Cyberboss: + - bugfix: Promotion of revheads won't occur if they are restrained/incapacitated + - bugfix: Facehuggers can no longer latch onto mobs without a head... How the fuck + did you get a living mob without a head? + - bugfix: Hulks and monkeys can no longer bypass armor + - rscadd: Metastation now has a waste to space line + - bugfix: Objects will no longer get stuck behind the recycler on Boxstation + Joan: + - rscadd: You can now repair reinforced walls by using the tool you'd use to get + to the state they're currently in. Examining will give you a hint as to which + tool to use. + - spellcheck: Renamed Guvax to Geis. This also applies to the component, which has + been similarly renamed. + Kor: + - rscadd: The Captain can now purchase alternate escape shuttles from the communications + console. This drains from the station supply of cargo points, and you can only + do so once per round, so spend wisely. + - rscadd: Some shuttles are less desirable than the default, and will instead grant + the station a credit bonus when purchased. + - rscadd: Explosions are no longer capped on the mining z level. + - rscadd: The forcewall spell now creates a 3x1 wall which the caster can pass through. + - rscadd: Bedsheets are now worn in the neck slot, rather than the back slot. +2016-11-13: + Cyberboss: + - rscadd: Using a screwdriver on a conveyor belt will reverse it's direction + - bugfix: Medibots, by default, can no longer OD you on tricord + - tweak: They will now use charcoal instead of anti-toxin to heal tox damage + - bugfix: Silicons no longer get warm skin when irradiated + Gun Hog: + - tweak: Wizard (and Devil) fireballs now automatically toggle off once fired. + Joan: + - tweak: Judicial Visors now protect from flashes. + - rscadd: Reciting Scripture is now done through an actual interface, and can thus + be done much faster. + - rscdel: The recital and quickbind functions that Recollection had have been moved + to this interface instead. + - rscadd: Servants of Ratvar can now unsecure and move most Clockwork Structures + with a wrench, though doing so will damage the structure by 25% of its maximum + integrity. + - rscadd: Clockwork Structures become less effective as their integrity lowers, + reducing their effect by up to 50% at 25% integrity. + - tweak: You can now deconstruct unsecured wall gears with a screwdriver. + - tweak: Wall gears now have much more health and can be repaired with a proselytizer. + Mysak0CZ: + - rscadd: You can now use wrech to anchor (as long as it is not in space) / unanchor + lockers + - bugfix: Cyborgs can now simply use "hand" to open / close lockers (instead of + using toggle open verb) + - bugfix: You can now properly put unlit welder inside lockers + - bugfix: Lockers using different decostruction tools (like cardboard boxes wirecutters) + can now be deconstructed too + Xhuis: + - rscadd: All computers now have sounds. Try them out! + coiax: + - rscadd: Swarmers can now use :b to talk on Swarm Communication. + - rscadd: Lich phylacteries are now in the "points of interest" for ghosts. + uraniummeltdown: + - bugfix: Cancel Assume Control works as borer now + - rscadd: Added the cueball helmet, scratch suit, joy mask to Autodrobe +2016-11-14: + Joan: + - rscdel: You can no longer pick up cogscarabs. + - rscadd: Servants of Ratvar can now reactivate Cogscarabs with a screwdriver. + - tweak: Cogscarab proselytizers proselytize things twice as fast. + - tweak: Cogscarabs now have 1.6 seconds of delay when firing guns, as much as an + unmodded kinetic accelerator. + - bugfix: Fixed Vitality Matrices and Raise Dead runes not reviving if the target + happened to be in their body already. + Kor: + - rscadd: Extended mode now has a special command report that tells you the round + type. This is to let people know they have time to start on large scale projects + rather than milling about waiting for antagonists to attack. + - rscadd: All station goals are now unlocked during extended. + Mysak0CZ: + - bugfix: MetaStation's xenobiology disposals now work properly + uraniummeltdown: + - tweak: Changed the Command and Security radio colors + - rscadd: Added raw telecrystals to the uplink, can be used with uplinks and uplink + implants. + - rscadd: Added 10mm ammo variants to uplink +2016-11-15: + Cyberboss: + - bugfix: Brains and heads with brains trigger the emergency stop on the recycler + Kor: + - rscadd: The vault is now home to a new machine which can accept cash deposits, + adding to the cargo point total. + - rscadd: You can also use this machine to steal credits from the cargo point total. + Doing so takes time, and will set off an alarm. + - rscadd: You can now buy an asteroid with engines strapped to it to replace the + emergency escape shuttle. + - rscadd: You can now buy a luxury shuttle to replace the emergency escape shuttle. + Each crewmember must bring 500 credits worth of cash or coins to board though. + Lexorion & Lzimann: + - tweak: Wizards have developed a new spell. It's called Arcane Barrage and it has + been reported that it has a similar function to Lesser Summon Guns! + Supermichael777: + - rscdel: The atmos grenades have been removed. if you want to burn down the shuttle + use canisters or something but at least work at it. + coiax: + - rscadd: Mice (the rodent, not the peripheral) now start in random locations. +2016-11-16: + Mysak0CZ: + - rscadd: Door can now have higher security, making them stronger and wires harder + to access + - rscadd: More info can be found on github or wiki (if this passes) + - imageadd: Protected wires now have sprites + Pubby: + - bugfix: cyclelinked airlock pairs now close behind you even when running through + at full speed. + Swindly: + - rscadd: Dice can now be rigged by microwaving them. +2016-11-18: + Cyberboss: + - bugfix: The amount of metal used to construct High Security airlocks with the + RCD is now consistent with the actual cost + Incoming5643: + - bugfix: The charge spell should once again work correctly with guns/wands + Joan: + - rscadd: Clockcult AIs have power as long as they are on a Clockwork Floor or next + to a Sigil of Transmission. This is in addition to having power under normal + conditions. + - rscadd: Clockcult silicons can now activate Clockwork Structures from a distance. + - rscdel: Interdiction Lenses will not disable cameras if there are no living unconverted + AIs. + - rscadd: Clockcult Cyborgs can charge from Sigils of Transmission by crossing them; + after a 5 second delay, the cyborg regains either their missing charge or the + amount of power in the sigil(whichever is lower) over 10 seconds. + - rscadd: You can now cancel out of selecting a robot module! + - imagedel: Robot modules now only have a generic transform animation when selected; + the borg is locked in place for 5 seconds in a small cloud of smoke while the + base borg sprite fades out and the new module fades in. + - tweak: Resetting a borg will do that animation. + - rscadd: Adds Networked Fibers, which gains points instead of automatic expansion + and causes manual expansion near its core to move its core. + - rscadd: Added a new UI style, Clockwork. + NikNak: + - rscadd: Added tator tots, made my putting a potato in the food processor + - tweak: French fries are now made by cutting up a potato into wedges and putting + the wedges (plate and all) into the food processor + coiax: + - bugfix: The observer visible countdown timer for the malfunctioning AI doomsday + device is now formatted and rounded appropriately. + erwgd: + - rscadd: You can now make emergency welding tools in the autolathe. +2016-11-19: + Crushtoe: + - imageadd: Added a shiny new icon for the reaper's scythe in-hand and normal sprite. + It's 25% less gardener. + RandomMarine: + - rscadd: An instruction paper has been added to the morgue on most maps, because + somehow it's needed. + Shadowlight213: + - rscadd: Added the AI integrity restorer as a modular computer program + - rscadd: Added an AI intelliCard slot. Insert an Intellicard into it to be able + to use the restoration program. + - bugfix: Fixes Alarm program detecting ruins + - bugfix: Fixes being unable to toggle the card reader module power + - tweak: The downloader will now tell you if a program is incompatible with your + hardware +2016-11-20: + Basilman: + - rscadd: Added a new beard style, Broken Man. + Cobby: + - tweak: Airlock security is only given to vault doors, centcomm, and Secure Tech + [Secure Tech just requires a welder] + Incoming5643: + - rscadd: The warp whistle has been added to the wizard's repertoire of spells and + artifacts. + - rscadd: The drop table for summon magic has been expanded. + Joan: + - rscdel: Servant cyborgs no longer have emagged modules. + - rscadd: Servant cyborgs now have a limited selection of scripture and tools, which + varies by cyborg type. + Kor: + - bugfix: Station goals will once again function in extended. + Swindly: + - rscadd: Added a nitrous oxide reagent. It can be created by heating 3 parts ammonia, + 1 part nitrogen, and 2 parts oxygen to 525K. The process produces water as a + by-product and will cause an explosion if too much heat is applied. +2016-11-21: + Cobby: + - tweak: mining/labor shuttles are now radiation proof. +2016-11-23: + Crushtoe: + - rscadd: Added more tips. + - bugfix: Fixes some sprites and spelling issues, namely bedsheet capes. + Cyberboss: + - bugfix: Changing an airlock's security level no longer heals it + Gun Hog: + - bugfix: Medibots now heal toxin damage again. + Joan: + - rscadd: Clockcult AIs can now listen to conversations through cameras. + - rscadd: Due to complaints that the new slab interface was too difficult to navigate, + it now starts off in compressed format. The button to toggle this is now also + larger. + Kor: + - rscadd: Rounds ending on one server will send a news report to the other server. + Shadowlight213: + - tweak: Borers now have a 10 second delay before waking up after sugar leaves the + host system + - tweak: There is a chance for borers to lose control, based on brain damage levels + Swindly: + - rscadd: Most small items can now be placed in the microwave. Remember not to microwave + metallic objects. + XDTM: + - rscadd: 'Golems now have special properties based on the mineral they''re made + of:' + - rscadd: Silver golems have a higher chance of stun when punching + - rscadd: Gold golems are faster but less armoured + - rscadd: Diamond golems are more armoured + - rscadd: Uranium golems are radioactive + - rscadd: Plasma golems explode on death + - rscadd: Iron and adamantine golems are unchanged. + jakeramsay007: + - tweak: Borers can no longer take control of people who have a mindshield implant + or are a member of either cult. This however does not stop them from infesting + and controlling them through other means, such as chemicals. +2016-11-24: + Kor: + - rscadd: Shaft miners now have access to the science channel. + Lzimann: + - rscdel: Multiverse sword is no longer buyable by wizards + erwgd: + - rscadd: Plasmamen get their own random names. +2016-11-25: + Joan: + - rscadd: Clockcult AIs with borgs 'slaved' to them will convert them when hacking + via the robotics console. + - experiment: Replaced the "No Cache" alert with an alert that will show what you + need for the next tier of scripture. + Kor: + - rscadd: The captain may now purchase an unfinished shuttle chassis, which will + dock immediately when bought, but will not launch until the end of the regular + shuttle call procedure. The shuttle is empty and devoid of atmosphere however, + so you'll need to do some work on it if you want a safe trip home. + Shadowlight213: + - bugfix: The activation button for the AI integrity restorer modular program actually + works now! + - rscdel: The cortical borer event is now admin only +2016-11-27: + Cyberboss: + - bugfix: False armblades are now removed after one minute. Start feeling the P + A R A N O I A when you see em + Gun Hog: + - rscadd: AIs piloting a mech may now be recovered with an Intellicard from the + wreckage if the mech is destroyed. They will be require repair once recovered. + - tweak: Instructions for piloting mechs as an AI are now more obvious. + - tweak: Traitor and Ratvar AIs may now be carded from mechs, at their discretion. + Joan: + - tweak: Clockwork walls are now about as hard for hulks to break as rwalls. + - rscadd: You can now quickbind up to 5 scriptures from the recital menu, and the + recital menu has less empty space. + - tweak: Clockwork slabs now only start with only Geis pre-bound. + Kor: + - rscadd: Shaft miners can now redeem their starting voucher for a conscription + kit, which contains everything they need to rope their friend into joining them + on lavaland. + - rscadd: You can now see which emergency shuttle is coming in the status panel. + Lzimann: + - rscadd: The robots stole Santa's Elfs jobs. + MMMiracles: + - tweak: Jump boots now have a pocket + - imageadd: Jump boots from mining now have on-character icons. + Mervill: + - imageadd: Disposal units now use a tgui instead of plain html + - rscadd: 'As the AI: Click an AI status display to bring up the prompt for changing + the image' + Swindly: + - rscadd: Wet leather can be dried by putting it on a drying rack. + Xhuis: + - bugfix: Plastic explosives now actually explode when you commit suicide with them. + - bugfix: Resisting out of straight jackets now works properly. + - rscdel: Highlander will no longer announce the last man standing. + - rscadd: Cyborgs can now open morgue trays. This does not include crematoriums! + uraniummeltdown: + - rscdel: Borers no longer randomly lose control based on host brain damage + - tweak: Borer Dominate Victim stun time reduced from 4 -> 2. + - tweak: Borers no longer force unhidden when infesting someone. + - tweak: Borer event is rarer (weight 20->15). + - tweak: Borer reproduction chemicals required increased from 100 to 200. +2016-11-29: + Joan: + - tweak: Interdiction Lenses are more likely to turn off if damaged. + - tweak: Reduced Interdiction Lens and Tinkerer's Daemon CV from 25 to 20. + RemieRichards: + - rscadd: Devils may now spawn with an obligation to accept dance off challanges, + if they have this obligation they also gain a spell to summon/unsummon a 3x3 + dance floor at will. + Swindly: + - rscadd: Microwaves now heat open reagent containers to 1000K. + XDTM: + - rscadd: 'Added new types of golem: glass, sand, wood, plasteel, titanium, plastitanium, + alien alloy, bananium, bluespace, each with their own traits. Experiment!' + - tweak: Golems will be told what their traits are when spawning. + - rscadd: Putting a golem in a gibber will give ores of its mineral type, instead + of meat. + - rscadd: Using Iron on an adamantine slime extract will spawn an incomplete golem + shell, that will be slaved to whoever completes it, much like a normal adamantine + golem. + jughu: + - tweak: Proselytizing airlocks into pinion airlocks takes longer. +2016-11-30: + ANGRY CODER: + - tweak: NT news reports the clandestine criminal organization known as the syndicate + may have upgraded one of their illegally stolen cyborg modules with additional + healing technology. + Cobby [Idea stolen from Shaps]: + - rscadd: For objects that you could previously rename with a pen, you can now edit + their description as well. + Cyberboss: + - rscdel: Due to budget cuts. Firelocks no longer have safety features + - bugfix: Roundstart airlock electronics now properly generate the correct accesses + - bugfix: tgui windows will now close on round end + Gun Hog: + - bugfix: Syndicate Medical Cyborg hyposprays now properly work through Operative + hardsuits and other thick clothing. + Joan: + - tweak: Cogscarabs will once again convert metal, rods, and plasteel directly to + alloy. + - tweak: Tinkerer's caches now increase in cost every 4 caches, from 5. + - rscadd: The Ark of the Clockwork Justicar now converts all silicons once it finishes + proselytizing the station. + Mervill: + - rscadd: AI hologram can move seamlessly between holopads + Thunder12345: + - rscadd: Added anti-armour launcher. A single-use rocket launcher capable of penetrating + all but the heaviest of armour. Deals massively increased damage to cyborgs + and mechs. +2016-12-02: + Cobby: + - bugfix: Removes the exploit that allowed you to bypass grabcooldowns with Ctrl+Click + PeopleAreStrange: + - tweak: Changed F7 to buildmode, F8 to Invismin (again). Removed stealthmin toggle + RemieRichards: + - rscadd: Added a new lavaland "boss" + - tweak: Hostile mobs will now find a new target if they failed to attack their + current one for 30 seconds, this reduces cheese by simply making the mob find + something else to do/someone to kill + - bugfix: Hostile mobs with search_objects will now regain that value after a certain + amount of time (per-mob, base 3 seconds), this is because being attacked causes + mobs with this var to turn it off, so they can run away, however it was literally + never turned on which caused swarmers to get depression and never do anything. +2016-12-03: + Joan: + - rscadd: Trying to move while bound by Geis will cause you to start resisting, + but the time required to resist is up by half a second. + - experiment: Resisting out of Geis now does damage to the binding, and as such + being stunned while bound will no longer totally reset your resist progress. + - rscadd: Using Geis on someone already bound by Geis will interrupt them resisting + out of it and will fully repair the binding. + - tweak: Geis's pre-binding channel now takes longer for each servant above 5. Geis's + conversion channel also takes slightly longer for each servant above 5. + - rscadd: Converted engineering and miner cyborgs can now create Sigils of Transgression. + RandomMarine: + - tweak: Airlocks will keep their original name when their electronics are removed + and replaced. You may still use a pen to rename the assembly if desired. +2016-12-04: + Durkel: + - tweak: Recent enemy reports indicate that changelings have grown bored with attacking + near desolate stations and have shifted focus to more fertile hunting grounds. +2016-12-06: + BASILMAN YOUR MAIN MAN: + - bugfix: fixes people "walking over the glass shard!" when they're on the ground, + changes message when incapacitated + Chnkr: + - rscadd: Nuclear Operatives can now customize the message broadcast to the station + when declaring war. + Cyberboss: + - bugfix: The atmos waste lines for the Metastation Kitchen and Botany departments + is now actually connected + Gun Hog: + - rscadd: Nanotrasen Janitorial Sciences Division is proud to announce a new concept + for the Advanced Mop prototype; It now includes a built-in condenser for self + re-hydration! See your local Scientist today! In the event that janitorial staff + wish to use more expensive solutions, the condenser may be shut off with a handy + handle switch! + Incoming5643: + - bugfix: The timer for shuttle calls/recalls now scales with the security level + of the station (Code Red/Green, etc.). You no longer have to feel dumb if you + forget to call Code Red before you call the shuttle! + - rscadd: Shuttles called in Code Green (the lowest level) now take 20 minutes to + arrive, but may be recalled for up to 10 minutes. They also don't require a + reason to be called. + - experiment: That doesn't mean you should call a code green shuttle every round + the moment it finishes refueling. + - rscadd: Server owners may now customize the population levels required to play + various modes. Keep in mind that this does not preserve the balance of the mode + if you change it drastically. See game_modes.txt for details. + Joan: + - rscadd: You can now proselytize floor tiles at a rate of 20 tiles to 1 brass sheet + or 2 tiles to 1 liquified alloy for cogscarabs. + - rscadd: Proselytizers will automatically pry up floor tiles if those tiles can + be proselytized. + - tweak: Brass floor tiles no longer exist. Instead, you can just apply brass sheets + to a tile. Crowbarring up a clockwork floor will yield that brass sheet. + - rscadd: You can now cancel AI intellicard wiping. + - tweak: Geis now takes 5 seconds to resist. + Mervill: + - bugfix: Examining now lists the neck slot + MisterTikva: + - rscadd: Nanotrasen informs that certain berry and root plants have been infused + with additional genetic traits. + - rscadd: Watermelons now have water in them! + - rscadd: Blumpkin's chlorine production has been reduced for better workplace efficiency. + - rscadd: Squishy plants now obey the laws of physics and will squash all over you + if fall on them. + Shadowlight213: + - bugfix: The lavaland syndicate agents, as well as the ID for all simple_animal + syndicate corpses should have their ID actually have syndicate access on it + now! + Swindly: + - rscadd: 'Adds a new toxin: Anacea. It metabolizes very slowly and quickly purges + medicines in the victim while dealing light toxin damage. Its recipe is 1 part + Haloperidol, 1 part Impedrezene, 1 part Radium.' + WJohn: + - bugfix: AI core turrets can once again hit you if you are standing in front of + the glass panes, or in the viewing area's doorway. + XDTM: + - rscadd: Quantum Pads are now buildable in R&D! + - rscadd: Quantum Pads, once built, can be linked to other Quantum Pads using a + multitool. Using a Pad who has been linked will teleport everything on the sending + pad to the linked pad! + - rscadd: 'Pads do not need to be linked in pairs: Pad A can lead to Pad B which + can lead to pad C.' + - rscadd: Upgrading a Quantum Pad will reduce the cooldown, charge-up time, and + power consumption. + - rscadd: Quantum Pads require a bluespace crystal, a micro manipulator, a capacitor + and a cable piece. + kilkun: + - rscadd: New lore surrounding the various SWAT suits. + - tweak: Captain's hardsuit/SWAT suit got a few buffs. It's now much more robust. + - bugfix: Captain's space suit is now heat proof as well as fireproof. Long overlooked + no longer. +2016-12-07: + Cyberboss: + - bugfix: Atmos canisters now stay connected after relabeling them + Incoming5643: + - rscadd: Server owners that use the panic bunker feature can now optionally redirect + new players to a different server. See config.txt for details. + LOOT DUDE: + - tweak: Swarmers will drop bluespace crystals on death, non-artificial crystals. + MisterTikva: + - rscadd: Nanotrasen Mushroom Studies Division proudly announces that growth serum + producing plants were genetically reassembled. You no longer alternate between + sizes with doses 20u+ and more effects were added to higher doses. + Thunder12345: + - bugfix: You can now only order a replacement shuttle once +2016-12-08: + Fox McCloud: + - rscadd: The ability to harvest a plant, repeatedly, is now a gene-extractable + trait that can be spliced into other plants + - rscadd: can extract the battery capabilities of potatoes and splice them into + other plants + - rscadd: Plants types are now gene traits that can be added/removed from plants + - rscadd: Adds new stinging plant trait that will inject a bit of a plant's reagents + when thrown at someone + Joan: + - rscadd: The clockwork slab's interface is now TGUI. + - imageadd: You can now see what an ocular warden is attacking. + Mervill: + - rscadd: The light replacer can now create bulbs from glass shards + - rscadd: Click a light replacer while holding a glass shard to add the shard to + the replacer + - rscadd: Click a glass shard while holding a light replacer to consume the shard + MrStonedOne: + - tweak: world initialization is now faster. + - bugfix: fixed the modify bodypart admin tool not working + PKPenguin321: + - tweak: Swarmer beacons now have 750 health, down from 3000. + TehZombehz: + - rscadd: Nanotrasen Culinary Division has authorized the production of tacos, both + plain and classic. + XDTM: + - bugfix: Replica Pod cloning now works on people who have been decapitated. + coiax: + - rscadd: Additional mice sometimes appear in the maintenance tunnels. Engineers + beware! +2016-12-10: + Cyberboss: + - bugfix: The slips bug (which made freon laggy) is fixed + Kor: + - imagedel: Deleted all (3000+) left handed inhand icons. They are now automatically + mirrored from the right hand, saving spriters a lot of tedious busywork. + - rscadd: By crafting a wall mounted flasher frame (can be ordered via cargo), a + flash, and a riot shield, you can now construct a strobe shield. The strobe + shield combines the functionality of a riot shield and a flash, and can be reloaded + with flash bulbs. + Supermichael777: + - tweak: Conveyors have been more firmly anchored. No fun allowed + Thunder12345: + - rscadd: Added the Standby Emergency Vessel "Scrapheap Challenge" as a new emergency + shuttle option. You'll even be paid 1000 credits to use it! + coiax: + - rscadd: Due to a combination of radiation and water supply contamination, stations + have been reporting animals gaining self awareness. + optional name here: + - bugfix: fixed ashdrake's flame wall. + - bugfix: fixed walls decon spawning metal in a random location in the same room. +2016-12-11: + Cobby: + - bugfix: Fixes literally everything regarding renaming so far. When adding unique_rename + to objects, make sure the attackby checks for inheritance. + - bugfix: You can pull as other mobs now. Sorry, clickcode is stupid. + Cyberboss: + - bugfix: Frozen things will now unfreeze above 0C + Joan: + - tweak: Invoking Nezbere now increases ocular warden damage slightly more, but + increases ocular warden range slightly less. + Swindly: + - tweak: The recipe for moonshine now calls for 5 units of nutriment and 5 units + of sugar instead of 10 units of nutriment. + Thunder12345: + - bugfix: Scrapheap Challenge shuttle now actually works + coiax: + - rscadd: Cyborgs now have a reset module wire, that when pulsed, triggers the cyborg's + reset module hardware. + - rscadd: Cyborgs now eject all upgrades when reset, rather than the upgrades being + destroyed. + - rscdel: Removed redundant reset module. +2016-12-12: + Dannno: + - rscadd: more chaplain outfits + - rscadd: animal and tribal masks to the theater vendor +2016-12-13: + Fox McCloud: + - rscadd: Adds in random botany seeds; never the same twice. + - rscadd: Adds in new trait that makes a grown release smoke when squashed + - rscadd: Weed rates and chances are now core seed genes + Joan: + - experiment: Clockwork proselytizers suffer doubled cost and proselytization time + when not on the station, mining, or centcom. + - soundadd: Trying to recite scripture offstation is more clearly disapproved of. + XDTM: + - bugfix: The internal rage of the crew has been suppressed, and they will no longer + attack their own backpacks when opening them. +2016-12-14: + Incoming5643: + - rscadd: Recently we've been receiving reports of cheap knock off nuclear authentication + disks circulating among the syndicate network. Don't be fooled by these decoys, + only the real deal can be used to destroy the station! + - experiment: Please don't destroy the station in an attempt to make sure the disk + is real. + Joan: + - rscdel: The Ark of the Clockwork Justicar can no longer be repaired. + - tweak: The Ark now has 20% more health. + - rscadd: The Ark of the Clockwork Justicar will now force objects away from it. + - tweak: Faster-than-normal tools are somewhat slower than before. + - tweak: Mania Motors now require a much larger amount of power to convert people + adjacent, and people converted by it are knocked out. + Mindustry: + - bugfix: Goliath meat can be cooked in lava again + Okand37: + - rscadd: DeltaStation's emergency shuttle + XDTM: + - rscadd: Abductor Agents have now been equipped with extremely advanced construction + and hacking tools. +2016-12-18: + Dannno: + - rscadd: Sec hailers can now be emagged for a more rational, calm message. + Erwgd: + - rscadd: Limb Grower circuit boards can now be made in Research and Development, + requiring level 3 in data theory and level 2 in biological technology. + Firecage: + - rscadd: The NanoTrasen Airlock Builder Federation(NTABF) has recently released + the blueprints involving building and deconstructing Titanium Airlocks! These + airlocks are now being used on all of our shuttles. + Fox McCloud: + - bugfix: Fixes the personal crafting cost of ED-209's being too expensive + Hyena: + - tweak: adds 2 geiger counters to radition protection crates and a gift from the + russians + Joan: + - rscadd: Adds Replicant and Tinkerer's Cache to the default slab quickbind. + - rscadd: Revenants will be revealed by ocular wardens when targeted. + Joan, Dagdammit: + - rscadd: You can now push Wraith Spectacles up to avoid vision damage, but lose + xray vision. + - wip: Do note that flicking them on and off very quickly may cause you to lose + vision rather quickly. + Kor: + - rscadd: Added the treasure hunter's hat, coat, uniform, and whip. These aren't + available on the map yet, but will be available to the librarian soon. + Mervill: + - rscadd: Notice boards can now have photographs pined to them + - tweak: Items removed from the notice board are placed in your hands + - bugfix: Intents can be cycled forward and backwards with hotkeys again + - bugfix: Russian revolver ammo display works correctly + - rscadd: Added a credit deposit to pubbystation's vault + - rscdel: Removed a rather garish golden statue of the HoP from pubbystation's vault + Okand37 & Lexorion: + - rscadd: Added a new hair style, the Sidecut! + Supermichael777: + - rscadd: Clockwork components the chaplain picks up are now destroyed. + Swindly: + - rscadd: Adds eggnog. It can be made by mixing 5 parts rum, 5 parts cream, and + 5 parts egg yolk. + XDTM: + - rscadd: Changelings can now buy Tentacles on the Cellular emporium for 2 evolution + points. + - rscadd: Tentacles, once used, can be fired once against an item or mob to pull + it towards yourself. Items will be automatically grabbed. Costs 10 chemicals + per tentacle. + - rscadd: 'On humanoid mobs tentacles have a varying effect depending on intent: + - Help intent simply pulls the target closer without harming him; - Disarm intent + does not pull the target but instead pulls whatever item he''s holding in his + hands to yours; - Grab intent puts the target into an aggressive grab after + it is pulled, allowing you to throw it or try to consume it; - Harm intent will + briefly stun the target on landing; if you''re holding a sharp weapon you''ll + also impale the target, dealing increased damage and a longer stun.' + - bugfix: Random golems now properly acquire the properties of the golem they pick. + - rscadd: When becoming a random golem the user is informed of the properties of + the picked golem. + coiax: + - rscadd: Chameleon clothing produced by the syndicate has been found to react negatively + to EMPs, randomly switching forms for a time. + - rscadd: Anomalies now have observer-visible countdowns to their detonation. + - rscadd: Adds upgrades for the medical cyborg! + - rscadd: The Hypospray Expanded Synthesiser that adds chemicals to treat blindness, + deafness, brain damage, genetic corruption and drug abuse. + - rscadd: The Hypospray High-Strength Synthesiser, containing stronger versions + of drugs to treat brute, burn, oxyloss and toxic damage. + - rscadd: The Piercing Hypospray (also applicable to the Standard and Peacekeeper + borgs) that allows a hypospray to pierce thick clothing and hardsuits. + - rscadd: The Defibrillator, giving the medical cyborg an onboard defibrillator. + - rscadd: Loose atmospherics pipes are now dangerous to be hit by. + - rscadd: Whenever you automatically pick up ore with an ore satchel, if you are + dragging a wooden ore box, the satchel automatically empties into the box. + dannno: + - rscadd: Adds a villain costume to the autodrobe. + - bugfix: Fixes autodrobe failing to stock items. + jughu: + - tweak: 'sandals are not fireproof or acidproof anymore :add: Magical sandals for + the wizard that are still fireproof/acid proof :tweak: makes the marisa boots + acid and fire proof too' + karlnp: + - bugfix: made facehuggers work again + - bugfix: vendors, airlocks, etc now cannot shock at a distance + uraniummeltdown: + - tweak: Side entrance to Box Medbay, a few layout changes. +2016-12-19: + spudboy: + - bugfix: Fixed items not appearing in the detective's fedora. +2016-12-20: + Kor: + - rscadd: You can put a variety of hats on cyborgs using help intent (the engiborg + can't wear hats though, as it is shaped too oddly. Sorry!) + - rscadd: 'The complete list of currently equippable hats is as follows: Cakehat, + Captains Hat, Centcomm Hat, Witch Hunter Hat, HoS Cap, HoP Cap, Sombrero, Wizard + Hat, Nurse Hat.' + Lzimann: + - bugfix: Mjor the Creative will drop his loot correctly now. + Mekhi Anderson: + - rscdel: Fixes various PAI bugs, various tweaks and bullshit. + MrPerson: + - rscadd: Starlight will have more of a gradient and generally shine a more constant + amount of light regardless of how many tiles are touching space. In dark places + with long borders to space, starlight will be much darker. +2016-12-21: + FTL13, yogstation, Iamgoofball, and MrStonedOne: + - rscadd: Space is pretty. + - tweak: You can configure how pretty space is in preferences, those of you on toasters + should go to low to remove the need to do client side animations. (standard + fanfare as job selection, left click to increase, right click to decrease) (Changes + are applied immediately in most cases, on reconnect otherwise) + Joan: + - rscadd: EMPs will generally fuck up clockwork structures. + - rscdel: Cogscarabs can no longer hold slabs to produce components. + - rscadd: Slabs will now produce components even if in a box in your backpack inside + of a bag of holding on your back; any depth you can hide the slab in will still + produce components. + - bugfix: Non-Servants in possession of clockwork slabs will also no longer produce + components. + Mekhi Anderson: + - bugfix: PAI notifications no longer flood those who do not wish to be flooded. + Shadowlight213: + - imageadd: 2 new performer's outfits have been added to the autodrobe +2016-12-24: + AnturK: + - rscadd: Implants now work on animals. + Cyberboss: + - bugfix: Dead things can no longer be used to open doors + F-OS: + - bugfix: swarmers can no longer destroy airlocks. + MrStonedOne: + - tweak: AI's call bot command has been throttled to prevent edge cases causing + lag. You will not be able to call another bot until the first bot has finished + mapping out it's route. + TehZombehz: + - tweak: Observers can now orbit derelict station drone shells, much like current + lavaland ghost role spawners, to make finding them easier. Regular drone shells + are not affected by this. + XDTM: + - rscadd: Autolathes are now true to their name and can queue 5 or 10 copies of + the same item. + coiax: + - rscadd: Cyborg renaming boards cannot be used if no name has been entered. + - rscdel: Cyborg rename and emergency reboot modules are destroyed upon use, and + not stored inside the cyborg to be ejected if modules are reset. + - rscadd: Emagging the book management console and printing forbidden lore now has + a chance of producing a clockwork slab rather than an arcane tome. + kevinz000: + - experiment: Flightsuits now have their own subsystem! + - bugfix: Flightsuits properly account for power before calculating drifting + - experiment: Flightpack users will automatically fly over anyone buckled without + crashing. + - experiment: Flightpack users automatically slip through mineral doors + - experiment: Flightpack users will crash straight through grills at appropriate + times + - experiment: Flightpack users automatically slip through unbolted airlocks + - experiment: Flightpacks are faster in space, but their space momentum decay has + been upped significantly to compensate + - experiment: Flighthelmets now have a function to allow the wearer to zoom out + to see further. Helps you not crash eh? + spudboy: + - bugfix: Gave cyborgs some hotkeys they should have had. +2016-12-27: + Firecage: + - bugfix: The Nanotrasen Sewing Club has finally fixed the problem which rendered + NT, Ian, and Grey bedsheets invisible when worn! + Hyena: + - tweak: Detective coats can now hold police batons + - bugfix: Fixes disabler in hand sprites + Joan: + - rscadd: You can now put syndicate MMIs and soul vessels into AI cores. + - rscadd: The Hierophant boss will now create an arena if you try to leave its arena. + - imageadd: The Hierophant boss, its arena, and the weapon it drops all have new + sprites. + - soundadd: And new sounds. + - wip: And new text. + - rscadd: Wizards can now buy magic guardians for 2 points. They are not limited + to one guardian, meaning they can have up to 5. If that's wise is an entirely + different question. + - experiment: Wizards cannot buy support guardians, but can buy dexterous guardians, + which can hold items. + Shadowlight213: + - tweak: Shuttle are now safe from radstorms + XDTM: + - bugfix: HUD implants now properly allow you to modify the records of those you + examine, like HUD glasses do. + - bugfix: Organ Manipulation surgery now properly heals on the cautery step. + - bugfix: The maintenance door adjacent to R&D in metastation is now accessible + to scientists, instead of requiring both science and robotics access. +2016-12-28: + Erwgd: + - rscadd: A new access level is available, named "Cloning Room". Medical Doctors, + Geneticists and CMOs start with it. + - tweak: On Box Station and on Meta Station, the cloning lab doors require Cloning + Room access in addition to each door's previous requirements. + - tweak: Cloning pods are now unlocked with Cloning Room access only. + Incoming5643: + - rscadd: There's a new category in uplinks for discounted gear. These special discounts + however can only be taken once, so even if you are lucky enough to see syndibombs + for 75% off you won't be able to nuke the entire station with them. + - bugfix: The charge spell will no longer bilk you on wand charges, and wands that + are dead won't show up as charged. + Joan: + - rscdel: Clockwork Marauders no longer have Fatigue. It was difficult to balance + and made them too easy to force into recalling. This means they just have health; + they aren't forced to recall by anything, but can accordingly die much more + easily. + - rscadd: Accordingly Clockwork Marauders now have more health, do slightly more + damage, block slightly more often, and have to go slightly further from their + host to take damage. + - rscadd: Marauders that are not recovering(from recalling while the host's health + is too high to emerge) and are inside their host, or are within a tile of their + host, will gradually heal their host until their host is above the health threshold + to emerge. + - tweak: Chaos guardians transfer slightly less damage to their summoner. + XDTM: + - tweak: Armblades now go slash slash instead of thwack thwack + - imageadd: Tentacles have some fancier sprites +2016-12-29: + Mervill: + - bugfix: Patched an exploit related to pulling a vehicle as its driver while in + space + - bugfix: Fixed evidence bags not displaying their contents when held + - bugfix: Clothing without a casual variant will no longer say it can be worn differently + when examined + - bugfix: Only standard handcuffs can be used to make chained shoes + - bugfix: Fixed cards against space + - bugfix: Drying rack sprite updates properly when things are removed without drying + XDTM: + - rscadd: Colossi now drop the Voice of God, a mouth organ that, if implanted, allows + you to speak in a HEAVY TONE. This voice can compel hearers to briefly obey + certain codewords, such as "STOP". Using these codewords will severely increase + this ability's cooldown, and only one will be used per sentence. + - rscadd: 'Use .x, :x, or #x as a prefix to use Voice of God or any future vocal + cord organs.' + - rscadd: Chaplains, being closer to the gods, and command staff, being used to + giving orders, gain an increased effect when using the Voice of God. The mime, + not being used to speaking, has a reduced effect. +2016-12-31: + hyena: + - bugfix: fixes caps suit fire immunity + kevinz000: + - bugfix: Machine overloads/overrides aren't as bullshit as you'll actually be able + to dodge it now. +2017-01-01: + A whole bunch of spiders in a SWAT suit: + - bugfix: spiders can't wrap anchored things +2017-01-02: + MrStonedOne: + - tweak: Throwing was refactored to cause less lag and be more precise + - rscadd: Item throwing now imparts the momentum of the user throwing. Throwing + in the direction you are moving throws the item faster, throwing away from the + direction you are moving throws the item slower. This should make hitting yourself + with floor tiles less likely. + XDTM: + - bugfix: Storage bags should now cause less lag when picking up large amounts of + items. + - bugfix: Storage bags now don't send an error message for every single item they + fail to pick up. +2017-01-03: + Cyberboss: + - bugfix: AIs can no longer see cult runes properly + Mervill: + - bugfix: Can't kick racks if weakened, resting or lying +2017-01-06: + Cruix: + - bugfix: Fixed the leftmost and bottommost 15 turfs not having static for AIs and + camera consoles + Joan: + - bugfix: Tesla coils and grounding rods must be anchored with a closed panel to + function, ie; not explode when shocked. + - tweak: Metastation's xenobio has been slightly modified to avoid getting hit by + some standard shuttles. + Mervill: + - bugfix: Regular spraycans aren't silent anymore + MrStonedOne and Ter13: + - rscadd: Added some ping tracking to the game. + - rscadd: Your ping shows in the status tab + - rscadd: Other players ping shows in who to players and admins. + Nabski89: + - bugfix: Re-Vitiligo Levels to match wiki. + XDTM: + - tweak: Voice of God's Sleep lasts less than the other stuns. + - rscadd: You can also use people's jobs to single them out, instead of only names. + - tweak: If multiple people share the same name/job they'll all be included, although + at a reduced bonus. + - tweak: Names and jobs will only be accepted if they're the first part of the command, + and not in the middle, to prevent unintended focusing. + - bugfix: Voice of God now shows speech before the emotes it causes. + - bugfix: Special characters are no longer over-sanitized. + - bugfix: You can now properly apply items to clothing with pockets, such as slime + speed potions on clown shoes. + - bugfix: Mechs are now able to enter wormhole-sized portals. +2017-01-08: + Mervill: + - bugfix: pre-placed posters don't retain their pixel offset when taken down carefully + - bugfix: Dinnerware Vendor will show it's wire panel + Nanotrasen Station Project Advisory Board: + - wip: It is highly recommended that, when constructing the Meteor Shield project, + you are able to see, at minimum, two meteor shields from a stationary location. + The Nanotrasen Station Project Advisory Board is not liable for meteor damage + taken under wider shield arrangements. + Speed of Light Somehow Changed: + - tweak: Dynamic lights are no longer animated, and update instantly + - tweak: Increased maximum radius of mob and mobile lights +2017-01-10: + Arianya: + - bugfix: Doors and vending machines once again make a sound when you screwdriver + them. + Cyberboss: + - bugfix: Explosions can no longer be dodged + - tweak: Airlocks are now destroyed by the same level explosion that destroys walls + - tweak: Diamond/External/Centcomm airlocks and firedoors now block explosions as + walls do + Joan: + - experiment: Clockwork Proselytizers no longer require Replicant Alloy to function; + instead, they gradually charge themselves with power, which is used more or + less the same as alloy. + - tweak: Clockwork Proselytizers now produce brass sheets when used in-hand, instead + of Replicant Alloy. + - rscdel: Tinkerer's Caches can no longer have Replicant Alloy removed from them; + using an empty hand on them will simply check when they'll next produce a component. + - rscdel: Mending Motors can no longer use Replicant Alloy in place of power. + Mervill: + - bugfix: Controlling the station status displays no longer overrides the cargo + supply timer + MrStonedOne: + - experiment: Lighting was made more responsive. + XDTM: + - rscadd: Earmuffs and null rods protect against the Voice of God. + - rscadd: Earmuffs are now buildable in autolathes. + - tweak: Voice of God stuns have a longer cooldown. + coiax: + - rscadd: Girders now offer hints to their deconstruction when examined. +2017-01-13: + Cyberboss: + - bugfix: Walls blow up less stupidly + - bugfix: You no longer drop a beaker after attempting to load it into an already + full cryo cell + Joan: + - bugfix: Instant Summons is no longer greedy with containers. + Mervill: + - bugfix: Hardsuits, amour and other suits that cover the feet now protect against + glass shards + - bugfix: You will now lose the lawyer's speech bubble effect if you unequip the + layer's badge + MrStonedOne: + - tweak: More performance tweaks with the modulated reactive ensured entropy frame + governor system + PKPenguin321: + - tweak: Ash walker tendrils will now restore 5% of their HP when fed. + Shadowlight213: + - bugfix: Borg emotes should now play at the correct pitch + - bugfix: The ID console now properly handles authorization + - bugfix: Clicking on one of the ID cards in the UI will no longer eject both of + them + Thunder12345: + - bugfix: Morphs will no longer retain the colour of the last thing mimicked when + reverting to their true form + XDTM: + - bugfix: Patches' application is now properly delayed instead of instant. + - bugfix: Accelerator laser cannons' projectile now properly grows with distance. + coiax: + - rscadd: The end of round stats include the number of people who escaped on the + main emergency shuttle. +2017-01-14: + Cyberboss: + - bugfix: Explosions now flash people properly + Lzimann: + - bugfix: Fixes TGUI not working for people without IE11 + Thunder12345: + - bugfix: Recoloured mobs and objects will no longer produce coloured fire. + XDTM: + - bugfix: Nanotrasen decided that the "violent osmosis" method for refilling fire + extinguishers was, while cathartic, too expensive, due to the water tank repair + bills. Water tanks now have a tap. + - bugfix: (refilling extinguishers from tanks won't make you hit them) + - bugfix: Golems no longer drop belt, id, and pocket contents in a fit of extreme + clumsiness when drawing a sword from a sheath. + - bugfix: Wrenching portable chem dispensers won't cause you to immediately try + unwrenching them. + coiax: + - bugfix: Blue circuit floors are now restored to their normal colour if an AI doomsday + device is disabled. +2017-01-16: + Cyberboss: + - bugfix: Firedoors no longer have maintenance panels + - tweak: Firedoors must now be welded and screwdrivered prior to be deconstructed + Joan: + - rscadd: Ratvar will now convert lattices and catwalks to clockwork versions. + XDTM: + - tweak: Updating your PDA info with an agent id card inside will also overwrite + the previous name. + - bugfix: Loading a xenobiology console with a bio bag won't cause you to smack + it with it. + - tweak: Chemical splashing is now based on distance rather than affected tiles. + - bugfix: You can now properly wet floors by putting enough water in a grenade. + - bugfix: Floating without gravity won't drain hunger. +2017-01-18: + Mervill: + - bugfix: Using a welder to repair a mining drone now follows standard behaviour + - bugfix: Redeeming the mining voucher for a mining drone now also provides welding + goggles + - bugfix: ntnrc channels are now deleted properly + Tofa01: + - bugfix: Moved all sprites for heat pipe manifold either up or down by one so that + they will line up correctly when connected to adjacent pipes. + uraniummeltdown: + - rscadd: More AI holograms! +2017-01-19: + Cyberboss: + - bugfix: Various abstract entities will no longer be affected by spacewind + - bugfix: Ash will, once again, burn in lava + - rscadd: Active testmerges of PRs will now be shown in the MOTD + - bugfix: You will no longer appear to bleed while bandaged + Joan: + - spellcheck: Clockwork airlocks now have more explicit deconstruction messages, + using the same syntax as rwall deconstruction. + Mervill: + - bugfix: Raw Telecrystals won't appear in the Traitor's purchase log at the end + of the round + MrStonedOne: + - bugfix: Fixed excessive and immersion ruining delay on the smoothing of asteroid/mining + rock after a neighboring rock turf was mined up. + XDTM: + - bugfix: Plasmamen that are set on fire by reacting with oxygen will burn even + if they have protective clothing. It will still protect from external fire sources. + - tweak: Atmos-sealing clothing, like hardsuits, will protect plasmamen from reacting + with the atmosphere. + - tweak: Plasmamen can survive up to 1 mole of oxygen before burning, instead of + burning with any hint of oxygen. + - bugfix: Nanotrasen no longer ships self-glueing posters. You'll have to finish + placing the posters to ensure they don't fall on the ground. + - bugfix: Exosuits can't push anchored mobs, such as megafauna or tendrils, anymore. + coiax: + - bugfix: AIs can no longer activate the Doomsday Device off-station. Previously + it would activate and then immediately turn off, outing the AI as a traitor + without any benefit. +2017-01-20: + CoreOverload: + - tweak: Any sharp item can now be used for "incise" surgery step, with 30% success + probability. + Joan: + - rscadd: Sentinel's Compromise will also convert oxygen damage into half toxin, + in addition to brute and burn. + - tweak: Reduced the Ark of the Clockwork Justicar's health from 600 to 500 + - rscadd: You can now pull objects past the Ark of the Clockwork Justicar without + them being moved and or destroyed by its power. + MrStonedOne: + - tweak: Server side timing of the parallax shuttle launch animation now runs on + client time rather than byond time/server time. This will fix the odd issues + it has during lag. The parallax shuttle slowdown animation will still have issues, + those will be fixed in another more involved update to shuttles. + - rscadd: The window will flash in the taskbar when a new round is ready and about + to start. + Tofa01: + - bugfix: Moved The CentComm station 6 tiles to the left in order to prevent large + shuttles such as "asteroid with engines on it" from clipping off the end of + the right side of the map. + XDTM: + - bugfix: Chameleon PDAs can now morph into assistant PDAs. + - bugfix: A few iconless items have been blacklisted from chameleon clothing. + - tweak: Reviver implants now warn you when they're turning on or off, or when giving + a heart attack due to EMP. +2017-01-22: + ChemicalRascal: + - tweak: Voice analyzers in "inclusive" mode (the default mode) are now case-insensitive. + Cyberboss: + - tweak: You can no longer meatspike bots and silicons + - bugfix: Secbots will now drop the baton type they were constructed with + Dannno: + - rscadd: yeehaw.ogg is now a round end sound + Fox McCloud: + - tweak: drying meat slabs and grapes now yields a healthy non-junkfood snack + Hyena: + - rscadd: Adds paint remover to the janitors closet + Joan: + - rscadd: Clockwork Proselytizers can now convert lattices and catwalks. This has + negative gameplay benefit, but looks cool. + - rscadd: Sigils of Transmission can be accessed by clockwork structures in a larger + range. + - tweak: You can see, when examining a clockwork structure, how many sigils are + in range of it. + - rscadd: Clockwork constructs will toggle clockwork structures instead of attacking + them. + Shadowlight213: + - bugfix: Zombies will now get their claws upon zombification + Thunder12345: + - rscadd: The indestructible walls on CentComm will now smooth. + Tofa01: + - tweak: Changed alert message on early launch Authorization shuttle repeal message. + - bugfix: Makes the repeal message work and push a alert to the crew properly, also + reports every Authorization repeal now. + - bugfix: Auto Capitalisation will now work with all types of MMI chat + Ultimate-Chimera: + - rscadd: Adds a new costume crate to the cargo ordering console. + XDTM: + - rscadd: Xenobiology consoles are now buildable from circuitboards in R&D. They'll + be limited to the area they're built in plus any area with the same name. + - rscadd: Stock Exchange computers are now also buildable this way. + - rscadd: Androids now speak in a more robotic tone of voice. + - imageadd: Armblades now look a bit more bladelike. + coiax: + - rscadd: The Delta emergency shuttle now travels towards the south, rather than + the north. This changes nothing except which direction the stars rushing past + the windows are moving. + - bugfix: Fixed dragging the spawn protection traps on CTF. +2017-01-24: + CoreOverload: + - rscadd: You can now buckle handcuffed people to singularity/tesla generators, + RTGs, tesla coils and grounding rods. + Cyberboss: + - tweak: Firealarms now go off if it's too cold + - bugfix: World start will no longer lag + - bugfix: Dismembered heads will now use a mob's real name + Joan: + - rscadd: Clockwork Slabs can now focus on a specific component type to produce. + - experiment: 'Redesigned: Volt Void now allows you to fire up to 5 energy rays + at targets in view; each ray does 25 laser damage to non-Servants in the target + tile. The ray will consume power to do up to double damage, however.' + - wip: Failing to fire a Volt Void ray will damage you, though you won't die from + it unless you have access to a lot of power and are either low on health or + fail all five rays in a row. + - rscadd: The Ark of the Clockwork Justicar will gradually convert objects near + it with increasing range as it gets closer to activating. + - tweak: 'Brass windows have 20% less health, and are accordingly easier to destroy. + Fun fact: Lasers do more damage to brass windows!' + - tweak: 'Wall gears have 33% less health and are slightly faster to deconstruct. + Fun fact: You can climb over wall gears!' + - tweak: Marauders will heal more of their host's damage, on average, per life tick. + - rscadd: Clockwork Proselytizers can now repair Servant silicons and clockwork + mobs. This works in the same manner as repairing clockwork structures. + - tweak: Cogscarabs work slightly differently, and act as though the proselytizer + is a screwdriver. + Kor: + - rscadd: Megafauna will not heal while on the station. Do not be afraid to throw + your life away to get in a few toolbox hits. + Shadowlight213: + - rscdel: PAIs can no longer ventcrawl + Tofa01: + - rscadd: '[Delta Station] Adds a tracking beacon to AI MiniSat Exterior Hallway' + coiax: + - rscdel: Statues are now just incredibly tough mobs, rather than GODMODE. As a + side effect, they are no longer immune to bolts of change. + - bugfix: Fixed some issues with X (as Y) names on polymorphed mobs. +2017-01-26: + Robustin: + - tweak: Unholy Water can now be thrown or vaporized to deliver a powerful poison + unto the cult's enemies - or healing and stun resistance to its acolytes. + Tofa01: + - tweak: Moved Meta station AI MiniSat tracking beacon to AI MiniSat entrance. Should + prevent being regular teleported into space. + - bugfix: Added missing row of pixels to Flypeople torso so head connects to body + properly. + Tofa01 & XDTM: + - rscadd: Adds radio alert messages going to medical channel to the cryo tube when + a patient is fully restored. + - soundadd: Adds new alert sound for cryo tube. (cryo_warning.ogg) + XDTM: + - rscadd: Voice of God has received a few more commands. + - rscadd: You can now use job abbreviations (ex. hos > head of security) and first + names (ex. Duke > Duke Hayka) to focus targets. + coiax: + - rscadd: The nuclear operative cybernetic implant bundle now actually contains + implants. + - rscdel: The cybernetic implant bundle is no longer eligible for discounts (bundles + are, in general, not eligible). + - rscadd: Telecrystals can be purchased in stacks of five and twenty. + - rscadd: The entire stack of telecrystals are added to the uplink when charging + them. +2017-01-27: + Joan: + - tweak: Buckshot now does a maximum of 75 damage, from 90. + - tweak: The unique cyborg scriptures(Linked Vanguard, Judicial Marker) take 3 seconds + to invoke, from 4. + - tweak: Invoking Inath-neq and Invoking Nzcrentr now both take 10 seconds to invoke, + from 15. + Lzimann: + - rscadd: Now you can choose what department you want to be as security! (This may + not be completly reliable). + RemieRichards: + - rscadd: 'Emagging a sleeper now randomises the buttons, the buttons remain the + same until randomised again so you can "learn" the new button config if you''re + a masochist, Inject omnizine but realise far too late that it''s all morphine, + woops! (Note: Epinephrine can always be injected, regardless of chem levels, + this means if something !!FUN!! ends up on the Epinephrine button, it will always + be injectable!)' + Sweaterkittens: + - tweak: There are now updated names and descriptions for the items that your plasma-based + crewmembers start with and use frequently. +2017-01-28: + Joan: + - tweak: Brass windows no longer start off anchored, but are constructed instantly. + - bugfix: You can no longer stack multiple windows of the same direction on a tile. + - rscadd: Vitality Matrices now share vitality globally, allowing you to use vitality + gained from any Matrix. + - tweak: Geis now mutes human targets if there are less than 6 Servants. + - tweak: Geis no longer produces resist messages below 6 Servants; this isn't a + change, as Geis cannot be successfully resisted below 6 Servants. + - tweak: Applying Geis to an already bound target will also mute them, in addition + to preventing resistance. + RemieRichards: + - rscadd: A New weapon for clown mechs, the Oingo Boingo Punch-face! it's a giant + boxing glove that extends out on a spring and sends atoms flying (including + anchored ones and things that make no sense to move because -clowns-) + Tofa01: + - bugfix: Mop will no longer try and clean tile under janitorial cart when wetting + the mop. + - rscadd: Adds modular computers to Metastation. + - bugfix: Fixes no air in Deltastation maintenance kitchen. + - rscadd: Adds a modular computer to the CE office on Pubbystation. + Xhuis: + - rscadd: Energy-based weapons can now light cigarettes. + coiax: + - rscadd: Communication consoles now share cooldowns on announcements. + - rscadd: Cyborgs can now alter the messages of the announcement system. + - bugfix: Deadchat is now notified of any deaths on the shuttle or on Centcom. The + CTF arena does not generate death messages, due to the high levels of death. + - rscadd: The Human-level Intelligence event now occurs slightly more often, and + produces a classified message. + kevinz000: + - rscadd: Emitters and Tesla Coils now have activation wires! + - rscadd: Emitters will shoot out an emitter bolt when pulsed, regardless of it + is on. + - rscadd: Tesla coils will shoot lightning when pulsed, if it is connected to a + cable that has power. + - bugfix: Bolas no longer restrain your hands for 10 seconds when you try to remove + them and fail. +2017-01-29: + BASILMAN YOUR MAIN MAN: + - rscadd: Added a new sailor outfit to the autodrobe, now you can play sailors vs + pirates. + BlakHoleSun: + - rscadd: Added new reaction with the rainbow slime extract. Injecting a rainbow + slime extract with 5u of holy water and 5u of uranium gives you a flight potion. + Cobby: + - tweak: AI's can now be your banker by manipulating the stock machine. + Cyberboss: + - experiment: Nuclear bombs now detonate + - rscadd: You can now link additional cloning pods in the same powered area to a + single computer using a multitool. + Fox McCloud: + - bugfix: Fixes Kudzu seed gene stats not being properly altered by certain reagents + - bugfix: Fixes Kudzu vine dropped seeds not properly having gene stats set + - bugfix: Fixes glowshrooms having an invalidly high lifespan + - bugfix: Fixes explosive vines not properly chaining + Joan: + - rscadd: Clockwork Marauders now grant their host action buttons to force them + to emerge/recall and communicate with them, instead of requiring the host to + type their name or use a verb, respectively. + - rscdel: Clockwork Marauders no longer see their block and counter chances; this + was mostly useless info, as knowing the chance didn't matter as to what you'd + do. + - rscdel: Clockwork Marauders can no longer change their name. + - tweak: Clockwork Marauders have a slightly lower chance to block, and take slightly + more damage when far from their host. + - bugfix: Fixes a bug where Clockwork Marauders never suffered reduced damage and + speed at low health and never got the damage bonus at high health. + Kor: + - rscdel: Stimpacks are no longer available in the mining vendor. + Lzimann: + - rscadd: You can now change your view range as ghost. To do so, either use the + View Range verb in the ghost tab, the mouse scroll up/down or control + "+"/"-". + The verb also works as a reset if you changed your view. + Sogui: + - tweak: There are now 2 less traitors in the double agent mode + - tweak: All security (and captain) suit sensors are set to max by default + Supermichael777: + - tweak: The wooden chair with wings is now craft-able. -1 non reconstruct-able + map object + - rscadd: Added the Tiki mask, you can make it in wood's crafting menu. + - imageadd: Ported Tiki mask's sprites from Hippie station. It is under the same + Creative Commons 3.0 BY-SA as the rest of our sprites. They are from Nienhaus. + Tofa01: + - rscadd: Adds a camera network onto the Omega Station. + - imageadd: Added new sprite for the AI Slipper. + XDTM: + - tweak: Implanting chainsaws is now a prosthetic replacement instead of its own + surgery. + - rscadd: You can now implant synthetic armblades (from an emagged limb grower) + into people's arms to use it at its full potential. + - rscdel: Chainsaw removal surgery has been removed as well; you'll have to sever + the limb and get a new one. + Xhuis: + - rscadd: AI control beacons are a new item created from the exosuit fabricator. + When installed into a mech, it allows AIs to jump to and from that mech freely. + Note that malfunctioning AIs with the domination power unlocked will instead + be forced to dominate the mech. + - tweak: Some timed actions are no longer interrupted while drifting through space. + - rscadd: Riot foam darts can now be constructed from a hacked autolathe. + bgobandit: + - rscadd: The library computer can now upload scanned books to the newscaster. Remember, + seditious or unsavory news channels should receive a Nanotrasen D-Notice! + - rscadd: The library computer can now print corporate posters as well as Bibles. + - rscdel: Cargo no longer offers a corporate poster crate. Nobody ever bought it + anyway. + coiax: + - rscadd: The Librarian now starts with a chisel/soapstone/chalk/magic marker capable + of engraving messages for subsequent shifts, and permanently erasing messages + that the Librarian is unhappy with. It has limited uses, so order more at Cargo. + - bugfix: The contraband cream pie crate is now locked, and requires Theatre access. + - rscadd: Any silicons created by bolts of change have no laws. + - rscadd: Cyborgs are immune to polymorph while changing module. + - rscadd: Adds Romerol to the traitor uplink for 25 TC. (This means you need a discount, + or to work with another traitor to afford it). Romerol is a highly experimental + bioterror agent which silently create dormant nodules to be etched into the + grey matter of the brain. On death, these nodules take control of the dead body, + causing limited revivification, along with slurred speech, aggression, and the + ability to infect others with this agent. + - rscdel: Zombie infections are no longer visible on MediHUD. + - rscdel: Zombies no longer tear open airlocks, since they can just smash them open + just as fast. + - rscdel: Zombies are no longer TOXINLOVING. + - rscadd: EMPs may cause random wires to be pulsed. Please ensure that sensitive + equipment avoids exposure to heavy electromagnetic pulses. + jughu: + - tweak: Changes some cargo export prices + ma44: + - tweak: Nanotrasen has improved training of the crew, teaching crewmembers like + you to unscrew the top off the bottle and pour it into containers like beakers. + vcordie: + - bugfix: Loads the HADES carbine with the correct bullet. + - tweak: The SRM-8 Rocket Pods have been loaded with new explosives designed to + do maximum damage to terrain. These explosives are less effective on people, + however. +2017-01-30: + BASILMAN YOUR MAIN MAN: + - rscadd: Added BM SPEEDWAGON THE BEST (AND ONLY) SPACE CAR ON THE MARKET. + CoreOverload: + - tweak: Clicking item slot now clicks the item in it. + Cyberboss: + - bugfix: Judicial visors now recharge properly + - bugfix: Gluon grenades now properly freeze turfs + - bugfix: Revs are now properly jobbanned + Fox McCloud: + - tweak: Plant analyzers will now display plant traits + - tweak: Plant analyzers will now display all of a grown's genetic reagents + Joan: + - rscdel: Cutting off legs no longer stuns. + - tweak: Volt Void now only allows you to fire 4 volt rays instead of 5, and the + damage of each ray has been reduced to 20, from 25. + - rscdel: Cyborgs using Volt Void now take damage if they fail to fire. + - experiment: 'Clockwork scripture can no longer require more components than it + consumes: This means that most scriptures ""cost"" one less component.' + MrStonedOne: + - rscadd: Because of abuse, actions on interfaces are throttled. Some bursting is + allowed. You will get a message if an action is ignored. Server operators can + configure this in config.dm + Tofa01: + - bugfix: '[Delta] Fixes area names for Deltastation' + - bugfix: '[Delta] Fixes custodial closet being cold all the time on Deltastation' + bgobandit: + - rscadd: Nanotrasen supports the arts. We now offer picture frames! + coiax: + - rscdel: The Syndicate "Uplink Implant" now has no TC precharged. You can charge + it with the use of physical telecrystals. The price has been reduced from 14TC + to 4TC accordingly. (The uplink implant in the implant bundle still has 10TC). + - rscadd: Syndicate bombs and nuclear devices now have a minimum timer of 90 seconds. + - rscadd: Camoflaged HUDs given to head revolutionaries now function the same as + chameleon glasses in the chameleon kit bundle, giving them an action button + and far more disguise options. + - rscadd: Syndicate thermals are also now more like chameleon glasses as well. + - rscadd: You can regain a use of a soapstone by erasing one of your own messages. + (This means you can remove a message if you don't like the colour and want to + try rephrasing it to get a better colour). Erasing someone else's message still + uses a charge. + - bugfix: Fixes bugs where you'd spend a charge without engraving anything. + - bugfix: Fixes a bug where the wrong ckey was entered in the engraving, you won't + be able to take advantage of the "recharging" on messages made before this change. +2017-01-31: + Cyberboss: + - tweak: The cyborg hugging module can no longer self target + Joan: + - tweak: Changed what scriptures and tools Servant cyborgs get; a full list can + be found on the clockwork cult wiki page. + RemieRichards: + - rscadd: Added the ability to choose where your uplink spawns, choose between the + classic PDA, the "woops you don't actually have a PDA" fallback Radio uplink + and the brand new Pen uplink! +2017-02-01: + Cyberboss: + - bugfix: AI integrity restorer computer now respects power usage + - bugfix: Progress bars will now stack vertically instead of on top of each other + - bugfix: Progress bars will no longer be affected by lighting + Xhuis: + - rscadd: You can now fold up bluespace body bags with creatures or objects inside. + You can't fold them up if too many things are inside, but anything you fold + up in can be carried around in the object and redeployed at any time. +2017-02-03: + Cobby: + - rscadd: Ghosts will now be informed when an event has been triggered by our lovely + RNG system. + Cyberboss: + - tweak: Firedoors will eventually reseal themselves if left open during a fire + alarm + Joan: + - tweak: Clockwork Marauders have 25% less health, 300 health from 400. + - wip: The Vitality Matrix scripture is now a Script, from an Application. Its cost + has been accordingly adjusted. + - tweak: Vitality Matrices will be consumed upon successfully reviving a Servant. + They also drain and heal conscious targets slightly slower. + - wip: The Fellowship Armory scripture is now an Application, from a Script. Its + cost has been accordingly adjusted. + - tweak: Fellowship Armory now affects all Servants in view of the invoker, and + will replace weaker gear and armor with its Ratvarian armor. Also, clockwork + treads now allow you to move in no gravity like magboots. + - rscdel: Mania Motors no longer instantly convert people next to them. + - rscadd: Instead, you have to remain next to them for several seconds, after which + you will be knocked out, then converted if possible. + - tweak: Mania Motors now cost slightly less power to run. + Jordie0608: + - tweak: Admin notes, memos and watchlist entries now use a generalized system, + they can all be accessed from the former notes browser. + - rscadd: Added to this are messages, which allow admins to leave a message for + players that is delivered to them when they next connect. + Lexorion: + - tweak: Laser projectiles have a new sprite! They also have a new effect when they + hit a wall. + Sweaterkittens and Joan: + - rscadd: Ocular Wardens will now provide auditory feedback when they acquire targets + and deal damage. + - soundadd: adds ocularwarden-target.ogg, ocularwarden-dot1.ogg and ocularwarden-dot2.ogg + to the game sound files. + Tofa01: + - bugfix: '[Delta] Allows Station Engineers to access Delta Atmospherics Solar Panel + Array Room.' + - rscadd: '[Omega] Adds a Massdriver room to chapel on Omegastation.' + bgobandit: + - rscadd: All art storage facilities offer construction paper now! + coiax: + - rscadd: A victim of a transformation disease will retain their name. + - tweak: The slime transformation disease can turn you into any colour or age of + slime. + - rscadd: The Abductor event can now happen at any time, rather than thirty (30) + minute plus rounds. +2017-02-04: + Cyberboss: + - bugfix: Modular computers now explode properly + - bugfix: Emagged holograms can no longer be exported for credits + - bugfix: Abstract entities no longer feed the singularity + - tweak: Machine frames will no longer be anchored when created + Joan: + - rscadd: Vanguard now shows you how long you have until it deactivates. + Kor: + - rscadd: 'By combing two flashlights and cable coil, you can create a new eye implant: + flashlight eyes. People with flashlights for eyes can not see, but they will + provide an enormous amount of light to their friends.' + - rscadd: Valentines day will now randomly pair up crew members on dates. The paired + crewmembers will get an objective to protect each other at all costs. + Steelpoint: + - rscadd: Addition of two security DragNETs to Deltastations, Omegastations and + Metastations armouries. + Tofa01: + - rscadd: '[Delta] Removes space money from gold crate replaces with 3 Gold Bars + Gold Wrestling belt is still there.' + - rscadd: '[Delta] Removes space money from silver crate replaces with 5 Silver + Coins.' + - bugfix: Fixes incorrect placement of RD modular computer on Metastation. + WhiteHusky: + - rscadd: Fields are supported when printing with a modular computer + - rscadd: PRINTER_FONT is now a variable + - rscdel: Removed the [logo] tag on Modular computers as the logo no longer exists + - tweak: New lines on paper are parsed properly + - tweak: '[tab] is now four non-breaking spaces on papers' + - tweak: Papers have an additional proc, reload_fields, to allow fields made programmatically + to be used + - tweak: 'stripped_input stripped_multiline_input has a new argument: no_trim' + - bugfix: Modular computers no longer spew HTML when looking at a file, rather it + is unescaped like it should + - bugfix: Modular computers no longer show escaped HTML entities when editing + - bugfix: Modular computers can now propperly read and write from external media + - bugfix: Modular computers' file browser lists files correctly + - spellcheck: NTOS File Manager had a spelling mistake; Manage instead of Manager + coiax: + - bugfix: Engraved messages can no longer be moved by a gravitational singularity. + - tweak: The deadchat notification of randomly triggered events now uses the deadsay + span. + - rscdel: The wizard spell "Rod Form" does not produce a message in deadchat everytime + it is used. +2017-02-05: + Cyberboss: + - bugfix: Shuttle docking/round end shouldn't lag as much + - rscadd: There's a new round end sound! + Hyena: + - bugfix: The bible now contains 1 whiskey + Joan: + - rscadd: Ratvar-converted AIs become brass-colored, speak in Ratvarian, and cannot + be carded. + Kor: + - rscadd: Eyes are now organs. You can remove or implant them into peoples heads + with organ manipulation surgery. A mob without eyes will obviously have trouble + seeing. + - rscadd: All special eye powers are now tied to their respective organs. For example, + this means you can harvest an alien or shadow persons eyes, have them implanted, + and gain toggle-able night vision. + - rscadd: All cybernetic eye implants are now cybernetic eyes, meaning you must + replace the patients organic eyes. HUD implants are still just regular implants. + Lzimann: + - rscadd: Tesla zaps can now generate an energy ball if they zap a tesla generator! + Sweaterkittens: + - rscadd: The station's Plasmamen have been issued a new production of envirosuits. + The most notable change aside from small aesthetic differences is the addition + of an integrated helmet light. + - tweak: Tweaked a few of the Plasma Envirosuit sprites to be more fitting thematically. + Swindly: + - bugfix: Saline-glucose solution can no longer decrease blood volume + - rscadd: Cyborg hyposprays can now dispense saline-glucose solution + - rscadd: Saline-glucose solution now increases blood volume when it heals + coiax: + - bugfix: The mulligan reagent can now be created with 1u stable mutation toxin + + 1u unstable mutagen. + - rscdel: Tesla balls cannot dust people near grounding rods. + - rscadd: Soapstones/chisel/magic markers/chalk can remove messages for free. Removing + one of your own messages still grants a use. + - rscadd: The Janitor starts with a dull soapstone for removing unwanted messages. + xmikey555: + - tweak: The tesla engine no longer destroys energy ball generators. +2017-02-06: + Xhuis: + - rscadd: Traitor janitors can now order EZ-clean grenades for 6 telecrystals per + bundle. They function like normal cleaning grenades with an added "oh god my + face is melting" effect, and can also be found in surplus crates. +2017-02-07: + Cyberboss: + - bugfix: Wire, atmos, and disposal networks no longer work across hyperspace when + on the border of a shuttle + - bugfix: Implants that work on death will now work for simple_animals + - bugfix: The target moving while being implanted will no longer continue the implant + - bugfix: Implanters now show progress bars as they were intended to + - bugfix: Pipe painters are no longer aggressive + - bugfix: Carding the AI will now stop a doomsday device + - rscadd: The job subsystem now loads instantly. No more waiting to set your occupation + prefs! + - bugfix: The rare case of duping your inventory at roundstart has been fixed + - bugfix: Self deleting stackable items are fixed + Dannno: + - tweak: We've switched to a new brand of colored jumpsuit. + JJRcop: + - tweak: Adds 4% chance when assigning a valentines day date to also assign someone + else to the same date, but your date will still have you as their only date. + Poojawa: + - bugfix: '[Delta] Active turfs down from 300+' + - bugfix: '[Delta] Janitor closet isn''t 2.7K anymore' + - bugfix: '[Delta] Various pipe fixes' + RemieRichards: + - rscadd: Added a new checmial, Skewium, it's produced by mixing rotatium, plasma + and sulphuric acid in the ratio 2:2:1, which results in 5 Skewium. + Swindly: + - bugfix: Robotic eyes can no longer be eaten + Tofa01: + - bugfix: Fixes grammar issue when changing someones appearance via plastic surgery. + - tweak: '[OmegaStation] Allows Chaplain job to be selectable.' + - bugfix: '[Omega] Fixes Overpressurization In Mass Driver Room' + Xhuis: + - rscadd: Traitor clowns can now buy a reverse revolver. I'll leave it up to you + to guess what it does. Honk. + iamthedigitalme: + - imageadd: Legion has a new, animated sprite. + kevinz000: + - rscadd: 'ADMINS: SDQL2 has been given some new features!' + - bugfix: SDQL2 now gives you an exception on runtime instead of flooding server + runtime logs. + - rscadd: SDQL2 now supports usr, which makes that variable reference to whatever + mob you are in, src, which targets the object it is being called on itself, + and marked, which targets the datum marked by the admin calling it. Also, it + supports hex references (the hex number at the top of a VV panel) in {}s, so + you can target nearly anything! Also, global procs are supported by global.[procname](args), + for CALL queries. + - bugfix: SDQL2 can no longer edit /datum/admins or /datum/admin_rank, and is protected + from changing x/y/z of a turf and anything that would cause broken movement + for movable atoms. + - rscadd: SDQL2 can now get list input with [arg1, arg2]! + - experiment: Do '""' to put strings inside of SDQL2 or it won't work. +2017-02-09: + Cyberboss: + - bugfix: Certain firedoors that should have closed during an alarm now actually + close + - soundadd: You can now knock on firedoors + - bugfix: Supermatter in a closet/crate will now properly fee the singulo + - bugfix: Paper planes can be unfolded again + - bugfix: Paper planes can be stamped properly + Joan: + - tweak: Impaling someone with a sharp item by pulling them with a changeling Tentacle + now does significantly less damage and stuns for less time. + Jordie0608: + - rscadd: Admins can now filter watchlist entries to only users who are connected. + - tweak: Messages no longer delete themselves when sent. + Kor: + - rscadd: The limb grower has been replaced with a box of surplus limbs. Visit robotics + or harvest limbs from another person if you want quality. + Reeeeimstupid: + - rscadd: Silly Abductee objectives. Try not to go crazy trading life stories with + Lord Singulo. + Tofa01: + - tweak: Removes virology access to jobs including Medical Doctor, Geneticist and + Chemist. + - tweak: '[Delta] Changes NW supermatter filter to filter O2 instead of N2' + - rscadd: '[Delta] Adds wardrobes to Dorms & Arrivals Shuttle' + - rscadd: '[Delta] Adds access buttons to virology doors for extra security' + - rscadd: '[Delta] Adds bolt door button to all dorms' + - rscadd: '[Delta] Adds three pairs of optical meson scanners to supermatter room' + - rscadd: '[Delta] Adds a disk fridge to botany' + - rscadd: '[Delta] Adds a cake hat to the bar' + - bugfix: '[Delta] Fixes misplaced station intercom in Supermatter SMES room' + XDTM: + - rscadd: A Law Removal module can be build in RnD. It can remove a specified core + or freeform law. + - tweak: 'When stating laws, silicons won''t skip a number when hiding laws. (example: + 1. Law 1; 2. Law 2; 3. Law 4 if you choose not to state Law 3)' + Xhuis: + - rscadd: Artistic toolboxes now spawn in maintenance and possess various supplies + for wire art and crayon art. + - rscadd: Traitors can now obtain His Grace. Chaplains can buy it for 20 TC, or + it can be found in a surplus crate. + - rscadd: Soapstone messages can now be rated! Attack the message with your hand + to rate it positive or negative. Anyone can see the rating, and you cannot rate + a message more than once, even across rounds. + - rscdel: Soapstones no longer have a write time. + - tweak: Soapstones now have a fixed vocabulary to write messages with. + chanoc1: + - tweak: The salt and pepper shakers have new sprites. + coiax: + - rscadd: Added metal rods and floor tiles to Standard cyborgs. + - rscadd: Added a remote signaling device to Engineering cyborg. + - rscadd: Adds a 'Guardian of Balance' lawset and AI module, currently admin spawn + only. + uraniummeltdown: + - tweak: Kinetic Accelerator Cosmetic and Tracer Modkits now don't use mod capacity. + Cosmetic kits change the name of the KA. +2017-02-10: + Ausops: + - rscadd: Air tanks and plasma tanks have been resprited. + ChemicalRascal: + - tweak: Pen is able to wind up ruined tapes. + CoreOverload: + - rscadd: You can now emag the escape pods to launch them under any alert code. + - tweak: Shuttle name is no longer displayed on "Status" panel. Instead, you can + now examine a status screen to see it. + Cyberboss: + - bugfix: Simple animals now deathgasp properly again + - bugfix: Testmerged PRs will no longer duplicate in the list + - bugfix: Pods and shuttles now have air again + Joan: + - experiment: Clockwork Cults must always construct and activate the Ark. + - imageadd: Updates air tank inhands to match Ausops' new sprites. + Mekhi Anderson: + - rscadd: All mobs can now *spin! + - rscadd: Cyborgs now have handholds. This means you can ride around on them, but + if you get stunned or hit, you fall off! The cyborg can also throw you off by + spinning. + Tofa01: + - soundadd: Changes fire alarm to make new sound FireAlarm.ogg + Xhuis: + - rscdel: The Syndicate will no longer prank their operatives by including reverse + revolvers in surplus crates. + coiax: + - rscadd: A reverse revolver now comes in a box of hugs. + - rscadd: 'Added a new admin only event: Station-wide Human-level Intelligence. + Like the random animal intelligence event, but affecting as many animals as + there are ghosties.' + - rscadd: The Luxury Shuttle grabs cash in your wallet and backpack, and shares + approval between the entrance gates. + - rscadd: The NES Port shuttle now costs 500 credits. +2017-02-11: + Dannno: + - tweak: hahaha I switched your toolboxes you MORONS + Kor: + - rscadd: Killing bubblegum now unlocks a new shuttle for purchase. + Lzimann: + - tweak: Hardsuit built-in jetpacks no longer have a speed boost. + Pyko: + - bugfix: Fixed legit posters and map editing official/serial number for poster + decals. + Tofa01: + - bugfix: '[Delta] Fixes doors walls and windows being incorrectly placed due to + mapmerge issues.' + - bugfix: '[Box] Fixes access levels for HOP shutters.' +2017-02-12: + AnturK: + - rscadd: Added Poison Pen to uplink. + Drunk Musicians: + - rscadd: Drunk music + Gun Hog: + - rscadd: Nanotrasen Engineering has devised a construction console to assist with + building the Auxiliary Mining Base, usually located near a station's Arrivals + hallway. A breakthrough in bluespace technology, this console employs an advanced + internal Rapid Construction Device linked to a camera-assisted holocrane for + rapid, remote construction! + Lzimann: + - bugfix: MMIs/posibrains works with mechas again + RandomMarine: + - rscadd: The Russians have expanded to the shuttle business. A new escape shuttle + is available for purchase. + Sweaterkittens: + - tweak: Plasmamen burn damage multiplier reduced to 1.5x from 2x + coiax: + - rscdel: Removes the STV5 shuttle from purchase. + - rscadd: Swarmers no longer consume the deep fryer, since they have too much respect + for the potential fried foods it can produce. + - rscadd: The clown's survival/internals box is now a box of hugs. Dawww. +2017-02-13: + ChemicalRascal: + - tweak: Delta station brig cell chairs have been replaced with beds. One bed per + cell, no funny business. + Cyberboss: + - bugfix: Simple animals that are deleted when killed will now deathrattle + - bugfix: Fixed Alt-click stack duplication + Joan: + - imageadd: Updated the back and belt sprites for airtanks to match the new sprites. + Kor: + - rscadd: Mobile pAIs are now slower than humans. + Swindly: + - rscadd: Added Nuka Cola as a premium item in Robust Softdrinks + Tofa01: + - bugfix: '[Delta] Fixes double windoor on chemistry windows.' + - tweak: Lowered volume of fire alarm sound also makes it more quiet. + coiax: + - rscadd: Added an admin only tool, the life candle. Touch the candle, and when + you die, you'll respawn shortly afterwards. Touch it again to stop. Used for + testing, thunderdome brawls and good old fashioned memery. + - bugfix: Fried foods no longer shrink to miniature size. +2017-02-14: + Cyberboss: + - bugfix: Fixed unequipping items while stunned + - bugfix: Fixed various things deleting when unequipped + - bugfix: Fixed tablet ID slots deleting cards + - bugfix: Fixed water mister nozzle getting stuck in hands + - tweak: Title music now starts immediately upon login + - tweak: You can no longer sharpen energy weapons + Joan: + - tweak: Mania Motors are overall less effective and only affect people who can + see the motor. + - tweak: Mania Motors have slightly more health; 100, from 80. + MrStonedOne: + - tweak: Station time is now always visible in the status tab. + - tweak: Both server time and station time now displays seconds so you can actively + see how game time (ByondTime[tm]) is progressing along side real time. + - rscadd: Added a time dilation tracker, this allows you to better understand how + time will progress in game. It shows the time dilation percent for the last + minute as well as some rolling averages. + RandomMarine: + - tweak: Pre-made charcoal pills now contain 10 units instead of 50. The amount + of pills inside of toxin first aid kits and the smartfridge have been increased + to compensate. Keep in mind that each ten unit pill recovers 100 points of toxin + damage and purges 50 units of other reagents. + Steelpoint: + - tweak: All Drones now have a walking animation. + Tofa01: + - bugfix: '[Delta] Fixes space cleaner being empty in brig medbay' + - bugfix: '[Delta] Fixes some areas that are not radiation proof' + - bugfix: '[Meta] Fixes Atmospherics Freezer Spawning As A Heater' + uraniummeltdown: + - rscadd: Window Flashing is now a preference + - rscadd: Your game window will flash when alerted as a ghost. This includes being + revived by defibs/cloning and events such as borers, swarmers, revenant, etc. +2017-02-16: + Cyberboss: + - rscadd: Test merged PRs are now more detailed + Steelpoint: + - rscadd: The Head of Security's Hardsuit is now equipped with a inbuilt Jetpack. + coiax: + - rscadd: The Hyperfractal Gigashuttle is now purchasable for 100,000 credits. Help + Centcom by testing this very safe and efficient shuttle design. (Terms and conditions + apply.) + - rscadd: The changeling power "Anatomic Panacea" now causes the changeling to vomit + out zombie infections, along with headslugs and xeno infections, as before. + - bugfix: The main CTF laser gun disappears when dropped on the floor. +2017-02-17: + Arianya: + - tweak: The Labour Camp rivet wall has been removed! + - spellcheck: Fixed some typos in Prison Ofitser's description. + Cobby: + - experiment: Flashes have been rebalanced to be more powerful + Cyberboss: + - bugfix: Rack construction progress bars will no longer be spammed + - tweak: The round start timer will count down during subsystem initialization + - tweak: Total subsystem initialization time will now be displayed + Joan: + - rscdel: His Grace no longer globally announces when He is awakened or falls to + sleep. + - rscdel: His Grace is not a toolbox, even if He looks like one. + - experiment: His Grace no longer requires organs to awaken. + - tweak: His Grace now gains 4 force for each victim consumed, always provides stun + immunity, and will, generally, take longer to consume His owner. + - experiment: His Grace must be destroyed to free the bodies within Him. + - experiment: Dropping His Grace while He is awake will cause you to suffer His + Wrath until you hold Him again. + - rscadd: His Grace becomes highly aggressive after consuming His owner, and will + hunt His own prey. + - experiment: The Ark of the Clockwork Justicar now only costs 3 of each component + to summon, but must consume an additional 7 of each component before it will + activate and start counting down. + - rscadd: The presence of the Ark will be immediately announced, though the location + will still only be announced after it has been active and counting down for + 2 minutes. + - tweak: The Ark also requires an additional invoker to invoke. + Lobachevskiy: + - bugfix: Fixed glass shards affecting buckled and flying mobs + MrStonedOne: + - experiment: The game will now force hardware rendering on for all clients. + Nienhaus: + - rscadd: Drying racks have new sprites. + Swindly: + - rscadd: Trays can now be used to insert food into food processors + Thunder12345: + - bugfix: It's ACTUALLY possible to pat people on the head now + WJohn: + - imageadd: Improved blueshift sprites, courtesy of Nienhaus. + XDTM: + - rscadd: Bluespace Crystals are now a material that can be inserted in Protolathes + and Circuit Printers. Some items now require Bluespace Mesh. + - rscadd: Bluespace Crystal can now be ground in a reagent grinder to gain bluespace + dust. It has no uses, but it teleports people if splashed on them, and if ingested + it will occasionally cause teleportation. + coiax: + - rscadd: Engraved messages now have a UI, which any player, living or dead can + access. See when the message was engraved, and upvote or downvote accordingly. + - rscadd: Admins have additional options with the UI, seeing the player ckey, original + character name, and the ability to outright delete messages at the press of + a button. + kevinz000: + - bugfix: Flightsuits actually fly over people + - bugfix: Flightsuits don't interrupt pulls when you pass through doors +2017-02-18: + Cyberboss: + - imageadd: New round end animation. Inspired by @Iamgoofball + Gun Hog: + - rscadd: The Aux Base console now controls turrets made by the construction console. + - rscadd: The Aux Base may now be dropped at a random location if miners fail to + use the landing remote. + - rscadd: The mining shuttle may now dock at the Aux Base's spot once the base is + dropped. + - tweak: Removed access levels on the mining shuttle so it can be used at the public + dock. + - tweak: The Aux Base's turrets now fire through glass. Reminder that the turrets + need to be installed outside the base for full damage. + - rscadd: Added a base construction console to Delta Station. + Mysterious Basilman: + - rscadd: More powerful toolboxes are active in this world... + Scoop: + - tweak: Condimasters now correctly drop their items in front of their sprite. + Tofa01: + - bugfix: Re-Arranges And Extends Pubby Escape Hallway To Allow Larger Shuttle To + Dock + - bugfix: '[Meta] Fixes top left grounding rod from being destroyed by the Tesla + engine.' + TrustyGun: + - rscadd: Traitor mimes can now learn two new spells for 15 tc. + - rscadd: The first, Invisible Blockade, creates a 3x1 invisible wall. + - rscadd: The second, Finger Guns, allows them to shoot bullets out of their fingers. + kevinz000: + - rscadd: You can now ride piggyback on other human beings, as a human being! To + do so they must grab you aggressively and you must climb on without outside + assistance without being restrained or incapacitated in any manner. They must + also not be restrained or incapacitated in any manner. + - rscadd: If someone is riding on you and you want them to get off, disarm them + to instantly floor them for a few seconds! It's pretty rude, though. + rock: + - soundadd: you can now harmlessly slap somebody by aiming for the mouth on disarm + intent. + - soundadd: you can only slap somebody who is unarmed on help intent, restrained, + or ready to slap you. +2017-02-19: + Basilman: + - rscadd: some toolboxes, very rarely, have more than one latch + Joan: + - rscadd: You can now put components, and deposit components from slabs, directly + into the Ark of the Clockwork Justicar provided it actually requires components. + - experiment: Taunting Tirade now leaves a confusing and weakening trail instead + of confusing and weakening everyone in view. + - tweak: Invoking Inath-neq/Nzcrentr is now 33% cheaper and has a 33% lower cooldown. + Tofa01: + - rscdel: '[Delta] Removes SSU From Mining Equipment Room' + - tweak: Changes centcomm ferry to require centcomm general access instead of admin + permission. + coiax: + - rscadd: Nuke ops syndicate cyborgs have been split into two seperate uplink items. + Medical cyborgs now cost 35 TC, assault cyborgs now cost 65 TC. + grimreaperx15: + - tweak: Blood Cult Pylons will now rapidly regenerate any nearby cultists blood, + in addition to the normal healing they do. + ma44: + - tweak: Intercepted messages from a lavaland syndicate base reveals they have additional + grenade and other miscellaneous equipment. + uraniummeltdown: + - rscadd: Shuttle engines have new sprites. +2017-02-20: + Cyberboss: + - bugfix: The frequncy fire alarms play at is now consistent + MrStonedOne: + - tweak: bluespace ore cap changed from 100 ores to 500 + Tofa01: + - tweak: '[Meta] Replaces orange jumpsuit in holding cell with prisoner jumpsuits' + XDTM: + - tweak: Repairing someone else's robotic limb is instant. Repairing your own robotic + limbs will still take time. + - tweak: Repairing limbs with cable or welding will now heal more. + Xhuis: + - bugfix: Medipens are no longer reusable. +2017-02-21: + Cyberboss: + - bugfix: You can now unshunt as a malfunctioning AI again + Kor: + - bugfix: You will now retain your facing when getting pushed by another mob. + Tofa01: + - bugfix: '[Z2] Fixed Centcomm shutters to have proper access levels for inspectors + and other Admin given roles' + coiax: + - rscadd: Refactors heart attack code, a cardiac arrest will knock someone unconscious + and kill them very quickly. + - rscadd: Adds corazone, an anti-heart attack drug, made by mixing 2 parts Phenol, + 1 part Lithium. A person with corazone in their system will not suffer any negative + effects from missing a heart. Use it during surgery. + - rscadd: Abductor glands are now hearts, the abductor operation table now automatically + injects corazone to prevent deaths during surgery. The gland will restart if + it stops beating. + - bugfix: Cloning pods always know the name of the person they are cloning. + - rscadd: You can swipe a medical ID card to eject someone from the cloning pod + early. The cloning pod will announce this over the radio. + - rscdel: Fresh clones have no organs or limbs, they gain them during the cloning + process. Ejecting a clone too early is not recommended. Power loss will also + eject a clone as before. + - rscdel: An ejected clone will take damage from being at critical health very quickly + upon ejection, rather than before, where a clone could be stable in critical + for up to two minutes. + - rscadd: Occupants of cloning pods do not interact with the air outside the pod. + uraniummeltdown: + - bugfix: All shuttle engines should now be facing the right way +2017-02-22: + AnonymousNow: + - rscadd: Added Medical HUD Sunglasses. Not currently available on-station, unless + you can convince Centcom to send you a pair. + Cyberboss: + - bugfix: Spawning to the station should now be a less hitchy experience + MrPerson: + - experiment: 'Ion storms have several new additions:' + - rscadd: 25% chance to flatly replace the AI's core lawset with something random + in the config. Suddenly the AI is Corporate, deal w/ it. + - rscadd: 10% chance to delete one of the AI's core or supplied laws. Hope you treated + the AI well without its precious law 1 to protect your sorry ass. + - rscadd: 10% chance that, instead of adding a random law, it will instead replace + one of the AI's existing core or supplied laws with the ion law. Otherwise, + it adds the generated law as normal. There's still a 100% chance of getting + a generated ion law. + - rscadd: 10% chance afterwards to shuffle all the AI's laws. + TalkingCactus: + - bugfix: New characters will now have their backpack preference correctly set to + "Department Backpack". + Tofa01: + - bugfix: '[Delta] Fixes missing R&D shutter near public autolathe' + Xhuis: + - tweak: Highlanders can no longer hide behind chairs and plants. + - tweak: Highlanders no longer bleed and are no longer slowed down by damage. +2017-02-23: + Cyberboss: + - bugfix: Fixed a bug where the fire overlay wasn't getting removed from objects + - bugfix: The graphical delays with characters at roundstart are gone + - bugfix: The crew manifest is working again + - rscadd: Admins can now asay with ":p" and dsay with ":d" + Dannno: + - imageadd: Robust Softdrinks LLC. has sent out new vendies to the stendy. + Joan: + - rscdel: Off-station and carded AIs no longer prevent Judgement scripture from + unlocking. + Nienhaus: + - tweak: Updates ammo sprites to the new perspective. + Tofa01: + - bugfix: Disables sound/frequency variance on cryo tube alert sound + coiax: + - rscadd: Nanotrasen reminds its employees that they have ALWAYS been able to taste. + Anyone claiming that they've recently only just gained the ability to taste + are probably Syndicate agents. +2017-02-24: + MrStonedOne: + - rscdel: Limit on Mining Satchel of Holding Removed + - tweak: Dumping/mass pickup/mass transfer of items is now lag checked + - rscadd: Dumping/mass pickup/mass transfer of items has a progress bar +2017-02-25: + AnonymousNow: + - rscadd: Nerd Co. has sent pairs of thicker prescription glasses out to Nanotrasen + stations, for your local geek to wear. + Basilman: + - rscadd: New box sprites + Robustin: + - tweak: Hulks can no longer use pneumatic cannons or flamethrowers + Tofa01: + - rscadd: '[All Maps] The new and improved Centcom transportation ferry version + 2.0 is out now!' + coiax: + - rscadd: Cargo can now order plastic sheets to make plastic flaps. No doubt other + uses for plastic will be discovered in the future. + - rscadd: To deconstruct plastic flaps, unscrew from the floor, then cut apart with + wirecutters. Plastic flaps have examine tips like reinforced walls. + uraniummeltdown: + - rscadd: Science crates now have new sprites +2017-02-26: + Ausops: + - imageadd: New sprites for water, fuel and hydroponics tanks. + Joan: + - experiment: 'Clockwork objects are overall easier to deconstruct:' + - wip: Clockwork Walls now take 33% less time to slice through, Brass Windows now + work like non-reinforced windows, and Pinion Airlocks now have less health and + only two steps to decon(wrench, then crowbar). + - rscadd: EMPing Pinion Airlocks and Brass Windoors now has a high chance to open + them and will not shock or bolt them. + - rscadd: Anima fragments will very gradually self-repair. + Tofa01: + - bugfix: '[Omega] Fixes ORM input and output directions' + - bugfix: Fixes space bar kitchen freezer access level + - bugfix: Fixes giving IDs proper access for players who spawn on a ruin via a player + sleeper/spawners + - bugfix: '[Delta] Fixes varedited tiles causing tiles to appear as if they have + no texture' + - bugfix: Fixes robotic limb repair grammar issue +2017-02-27: + Kor, Jordie0608 and Tokiko1: + - rscadd: Singularity containment has been replaced on box, meta, and delta with + a supermatter room. The supermatter gives ample warning when melting down, so + hopefully we'll see fewer 15 minute rounds ended by a loose singularity. + - rscadd: Supermatter crystals now collapse into singularities when they fail, rather + than explode. + Tofa01: + - bugfix: Stops AI And Borgs From Interfacing With Ferry Console + TrustyGun: + - imageadd: Box sprites are improved. + WJohnston: + - imageadd: New and improved BRPED beam. The old one was hideous. + coiax: + - rscadd: Drone shells are now points of interest in the orbit list. + - rscadd: Derelict drone shells now spawn with appropriate headgear. +2017-02-28: + Cyberboss: + - tweak: You will no longer be shown empty memories when the game starts + - bugfix: Built APCs now work again + - bugfix: Borg AI cameras now work again + Joan: + - rscadd: Anima Fragments now slam into non-Servants when bumping. This will ONLY + happen if the fragment is not slowed, and slamming into someone will slightly + damage the fragment and slow it severely. + Lzimann: + - tweak: Communications console can also check the ID the user is wearing. + Supermichael777: + - tweak: The button now has a five second delay when detonating bombs + XDTM: + - rscadd: You can now change the input/output directons for Ore Redemption Machines + by using a multitool on them with the panel open. + - rscadd: Diagnostic HUDs can now see if airlocks are shocked. +2017-03-01: + Cyberboss: + - bugfix: Lobby music is no longer delayed +2017-03-02: + Gun Hog: + - tweak: Advanced camera, Slime Management, and Base Construction consoles may now + be operated by drones and cyborgs. + Robustin: + - rscadd: The syndicate power beacon will now announce the distance and direction + of any engines every 10 seconds. + Steelpoint: + - rscadd: Robotics and Mech Bay have seen a mapping overhaul on Boxstation. + - rscadd: A cautery surgical tool has been added to the Robotics surgical area on + Boxstation. + XDTM: + - tweak: Hallucinations have been modified to increase the creepiness factor and + reduce the boring factor. + - rscadd: Added some new hallucinations. + - bugfix: Fixed a bug where the singularity hallucination was stunning for longer + than intended and leaving the fake HUD crit icon permanently. + coiax: + - rscadd: Ghosts are polled if they want to play an alien larva that is about to + chestburst. They are also told who is the (un)lucky victim. + - bugfix: Clones no longer gasp for air while in cloning pods. + - rscadd: Adds a new reagent, "Mime's Bane", that prevents all emoting while it + is in a victim's system. Currently admin only. + - experiment: Mappers now have an easier time adding posters, and specifying whether + they're random, random official, random contraband or a specific poster. + - rscdel: Posters no longer have serial numbers when rolled up; their names are + visible instead. + kevinz000: + - rscadd: You can now craft pressure plates. + - rscadd: Pressure plates are hidden under the floor like smuggler satchels are, + but you can attach a signaller to them to have it signal when a mob passes over + them! + - experiment: Bomb armor is now effective in lessening the chance of being knocked + out by bombs. +2017-03-03: + Cyberboss: + - tweak: You can now repair shuttles in transit space + Incoming5643: + - imageadd: 'Server Owners: There is a new system for title screens accessible from + config/title_screen folder.' + - rscadd: This system allows for multiple rotating title screens as well as map + specific title screens. + - rscadd: It also allows for hosting title screens in formats other than DMI. + - rscadd: 'See the readme.txt in config/title_screen for full details. remove: The + previous method of title screen selection, the define TITLESCREEN, has been + depreciated by this change.' + Sligneris: + - imageadd: Updated sprites for the small xeno queen mode +2017-03-04: + Cyberboss: + - bugfix: You can build lattice in space again + Hyena: + - tweak: Detective revolver/ammo now starts in their shoulder holster + Joan: + - tweak: Weaker cult talismans take less time to imbue. + PJB3005: + - rscadd: Rebased to /vg/station lighting code. + Supermichael777: + - rscadd: Grey security uniforms have unique names and descriptions + Tofa01: + - rscadd: Adds the new Centcomm Raven Battlecruiser to the purchasable shuttle list + buy now get one free! + coiax: + - rscadd: CTF players start with their helmet toggled off, better to see the whites + of their opponents eyes. Very briefly. + - bugfix: Existing CTF barricades are repaired between rounds, and deploy instantly + when replaced. + - tweak: Healing non-critical CTF damage is faster. Remember though, if you drop + into crit, YOU DIE. + - rscadd: Admin ghosts can just click directly on the CTF controller to enable them, + in addition to using the Secrets panel. + - bugfix: Cyborg radios can no longer have their inaccessible wires pulsed by EMPs. +2017-03-06: + Cyberboss: + - experiment: Map rotation has been made smoother + Gun Hog: + - bugfix: The Aux Base Construction Console now directs to the correct Base Management + Console. + - bugfix: The missing Science Department access has been added to the Auxiliary + Base Management Console. + Hyena: + - rscdel: Space bar is out of bussiness + MrStonedOne: + - bugfix: patched a hacky workaround for /vg/lights memory leaking crashing the + server + Penguaro: + - bugfix: Changed DIR of Gas Filter for O2 in Waste Loop from 1 to 4 + Sligneris: + - imageadd: '''xeno queen'' AI hologram now actually uses the xeno queen sprite + as a reference' + Tofa01: + - bugfix: '[Omega] Fixes missing walls and wires new dock to the powergrid' + XDTM: + - rscadd: Changelings can now click their fake clothing to remove it, without needing + to drop the full disguise. + coiax: + - rscadd: The Bardrone and Barmaid are neutral, even in the face of reality altering + elder gods. +2017-03-07: + Supermichael777: + - rscadd: Wannabe ninjas have been found carrying an experimental chameleon belt. + The Spider clan has disavowed any involvement. +2017-03-08: + Cyberboss: + - imageadd: Added roundstart animation + - experiment: Roundstart should now be a smoother experience... again + - bugfix: You can now scan storage items with the forensic scanner + - bugfix: Unfolding paper planes no longer deletes them + - bugfix: Plastic no longer conducts electricity + - tweak: The map rotation message will only show if the map is actually changing + Francinum: + - bugfix: Holopads now require power. + Fun Police: + - tweak: Reject Adminhelp and IC Issue buttons have a cooldown. + Joan: + - rscadd: Circuit tiles now glow faintly. + - rscadd: Glowshrooms now have colored light. + - tweak: Tweaked the potency scaling for glowshroom/glowberry light; high-potency + plantss no longer light up a huge area, but are slightly brighter. + Kor: + - rscadd: People with mutant parts (cat ears) are no longer outright barred from + selecting command roles in their preferences, but will have their mutant parts + removed on spawning if they are selected for that role. + LanCartwright: + - rscadd: Adds scaling damage to buckshot. + Robustin: + - tweak: The DNA Vault has 2 new powers + - tweak: The DNA Vault requires super capacitors instead of quadratic + - tweak: Cargo's Vault Pack now includes DNA probes + Supermichael777: + - rscadd: Robust Soft Drinks LLC is proud to announce Premium canned air for select + markets. There is not an air shortage. Robust Soft Drinks has never engaged + in any form of profiteering. + TalkingCactus: + - rscadd: Energy swords (and other energy melee weapons) now have a colored light + effect when active. + Tofa01: + - bugfix: '[All Maps] Fixes syndicate shuttles spawning too close to stations by + moving their spawn further from the station' + - rscadd: '[Omegastation] This station now has a syndicate shuttle and syndicate + shuttle spawn.' + coiax: + - rscadd: Wizards now have a new spell "The Traps" in their spellbook. Summon an + array of temporary and permanent hazards for your foes, but don't fall into + your own trap(s)! + - rscadd: Permanent wizard traps can be triggered relatively safely by throwing + objects across the trap, or examining it at close range. The trap will then + be on cooldown for a minute. + - rscadd: Toy magic eightballs can now be found around the station in maintenance + and arcade machines. Ask your question aloud, and then shake for guidance. + - rscadd: Adds new Librarian traitor item, the Haunted Magic Eightball. Although + identical in appearance to the harmless toys, this occult device reaches into + the spirit world to find its answers. Be warned, that spirits are often capricious + or just little assholes. + - rscadd: You only have a headache looking at the supermatter if you're a human + without mesons. + - rscadd: The supermatter now speaks in a robotic fashion. + - rscadd: Admins have a "Rename Station Name" option, under Secrets. + - rscadd: A special admin station charter exists, that has unlimited uses and can + be used at any time. + - rscadd: Added glowsticks. Found in maintenance, emergency toolboxes and Party + Crates. + kevinz000: + - rscadd: The Syndicate reports a breakthrough in chameleon laser gun technology + that will disguise its projectiles to be just like the real thing! +2017-03-10: + Cyberboss: + - bugfix: You should no longer be seeing entities with `\improper` in front of their + name + - rscadd: The arrivals shuttle will now ferry new arrivals to the station. It will + not depart if any intelligent living being is on board. It will remain docked + if it is depressurized. + - tweak: You now late-join spawn buckled to arrivals shuttle chairs + - tweak: Ghost spawn points have been moved to the center of the station + - tweak: Departing shuttles will now try and shut their docking airlocks + - bugfix: The arrivals shuttle airlocks are now properly cycle-linked + - bugfix: You can now hear hyperspace sounds outside of shuttles + - experiment: The map loader is faster + - tweak: Lavaland will now load instantly when the game starts + Jordie0608: + - tweak: The Banning Panel now organises search results into pages of 15 each. + XDTM: + - bugfix: Slimes can now properly latch onto humans. + - bugfix: Slimes won't aggro neutral mobs anymore. This includes blood-spawned gold + slime mobs. + - rscadd: Clicking on a tile with another tile and a crowbar in hand directly replaces + the tile. + Xhuis: + - imageadd: Ratvar and Nar-Sie now have fancy colored lighting! + coiax: + - rscadd: Wizards can now use their magic to make ghosts visible to haunt the crew, + and possibly attempt to betray the wizard. + - rscadd: When someone dies, if their body is no longer present, the (F) link will + instead jump to the turf they previously occupied. + - bugfix: Stacks of materials will automatically merge together when created. You + may notice differences when ejecting metal, glass or using the cash machine + in the vault. + - rscadd: You can find green and red glowsticks in YouTool vending machines. + fludd12: + - bugfix: Modifying/deconstructing skateboards while riding them no longer nails + you to the sky. + lordpidey: + - rscadd: Glitter bombs have been added to arcade prizes. +2017-03-11: + AnturK: + - rscadd: Traitors now have access to radio jammers for 10 TC + Hyena: + - bugfix: fixes anti toxin pill naming + Joan: + - tweak: Window construction steps are slightly faster; normal windows now take + 6 seconds with standard tools, from 7 and reinforced windows now take 12 seconds + with standard tools, from 14. + - tweak: Brass windows take 8 seconds with standard tools, from 7. + - rscadd: Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd + expect. + - rscdel: Removed His Grace ascension. + PKPenguin321: + - tweak: Cryoxadone's ability to heal cloneloss has been greatly reduced. + - rscadd: Clonexadone has been readded. It functions exactly like cryoxadone, but + only heals cloneloss, and at a decent rate. Brew it with 1 part cryoxadone, + 1 part sodium, and 5 units of plasma for a catalyst. + Penguaro: + - tweak: Adjusted table locations + - tweak: Moved chair and Cargo Tech start location + - tweak: Moved filing cabinet + - rscdel: Removed Stock Computer + Tofa01: + - bugfix: '[Meta] Fixes Supermatter Shutters Not Working' + coiax: + - rscadd: Swarmer lights are coloured cyan. + kevinz000: + - bugfix: Deadchat no longer has huge amount of F's. +2017-03-12: + JStheguy: + - imageadd: Changed Desert Eagle sprites, changed .50 AE magazine sprites, added + Desert Eagle magazine overlay to icons/obj/guns/projectile.dmi. + - tweak: The empty Desert Eagle sprite now only displays on an empty chamber. The + existence or lack thereof of the magazine is rendered using an overlay instead. + Lzimann: + - tweak: Braindead has a more intuitive message + coiax: + - rscdel: A cloner that is EMP'd will merely eject the clone early, rather than + gibbing it. Emagging the cloner will still gib the clone. +2017-03-13: + Cyberboss: + - tweak: You must now be on any intent EXCEPT help to weld an airlock shut + - rscadd: You can now repair airlocks with welding tools on help intent (broken + airlocks still need their wires mended though) + Cyberboss, Bgobandit, and Yogstation: + - rscadd: The HoP can now prioritze roles for late-joiners + Every coder, player, and admin in Space Station 13: + - rscadd: Adds the Tomb Of The Unknown Employee to Central Command, + - rscadd: Rest in peace, those who died after contributing to Space Station 13. + Hyena: + - bugfix: Surplus leg r/l name fixed + - bugfix: You can now carry honey in plant bags + Lordpidey: + - bugfix: Devils can no longer break into areas with sheer force of disco funk + - rscadd: The pitchfork of an ascended devil can now break down walls. + - rscadd: Hell has decided to at least clothe it's devils when sending them a brand + new body. + - rscadd: Pitchforks glow red now. + Penguaro: + - rscdel: '**Engineering** - Removed Tables, paper bin, and pen' + - rscadd: '**Engineering** - Replaced with Welder and Electrical Lockers' + - rscadd: '**Engineering** - Moved First-Aid Burn kit to Engineering Foyer' + - tweak: '**Chapel** - Replaced one Window with Win-Door for Coffin Storage' + Space Bicycle Consortium: + - bugfix: Bicycles now only cost 10,000 yen, down from 1,000,000 yen. + coiax: + - rscadd: The egg spawner on Metastation will generate a station message and inform + the admins if an egg is spawned. (It's only a two percent chance, but live in + hope.) + - rscadd: Glowsticks can now be found in "Swarmer Cyan" colors. +2017-03-14: + Joan: + - rscadd: Shuttles now have dynamic lighting; you can remove the lights on them + and use your own lights. + - tweak: All maps now use Deltastation's fancy syndicate shuttle. + - tweak: Shadowshrooms of lower potency are much less able to blanket the station + in darkness. + PKPenguin321: + - tweak: Lattices now require wirecutters to deconstruct, rather than welding tools. +2017-03-15: + Cyberboss: + - bugfix: You can no longer depart on the arrivals shuttle by hiding inside things + Joan: + - tweak: Proselytizers converting clockwork floors to walls now always take 10 seconds, + regardless of how fast the proselytizer is. + - tweak: Clockwork grilles no longer provide CV. + Penguaro: + - bugfix: '**Engineering** - Changed Access Level from **24** (_Atmo_) to **10** + (_Engine_) on **Radiation Shutter Control**' + TrustyGun: + - tweak: Traitor Mimes with the finger guns spell now fire 3 bullets at a time, + as opposed to just 1. + octareenroon91: + - rscadd: Allow new reflector frames to be built from metal sheets. + oranges: + - rscdel: Removed patting +2017-03-16: + BASILMAN YOUR MAIN MAN: + - rscadd: The BM Speedwagon has been improved both in terms of aesthetics and performance! + Cyberboss: + - bugfix: The shield generators in Boxstation Xenobiology now have the correct access + Joan: + - rscadd: Cult structures that emitted light now have colored light. + MrPerson: + - rscadd: Humans can see in darkness slightly again. This is only so you can see + where you are when the lights go out. + MrStonedOne: + - bugfix: Fixed lighting not updating when a opaque object was deleted + Penguaro: + - tweak: Increased Synchronization Range on Exosuit Fabricator + Tofa01: + - bugfix: '[Delta] Fixes telecoms temperature and gas mixing / being contaminated.' + - bugfix: '[Delta] Fixes some doubled up turfs causing items and objects to get + stuck to stuff' + - tweak: '[Omega] Makes telecoms room cool down and be cold.' + Tokiko1: + - rscadd: Most gases now have unique effects when surrounding the supermatter crystal. + - tweak: The supermatter crystal can now take damage from too much energy and too + much gas. + - rscadd: Added a dangerous overcharged state to the supermatter crystal. + - rscadd: Readded explosion delaminations, a new tesla delamination and allowed + the singulo delamination to absorb the supermatter. + - tweak: The type of delamination now depends on the state of the supermatter crystal. + - tweak: Various supermatter engine rebalancing and fixes. + kevinz000: + - rscadd: SDQL2 now supports outputting proccalls to variables, and associative + lists + peoplearestrange: + - bugfix: Fixed buildmodes full tile window to be correct path + rock: + - tweak: if we can have glowsticks in toolvends why not flashlights amirite guys +2017-03-17: + BeeSting12: + - bugfix: Moved Metastation's deep fryer so that the chef can walk all the way around + the table. + Cobby: + - tweak: The gulag mineral ratio has been tweaked so there are PLENTY of iron ore, + nice bits of silver/plasma, with the negative of having less really high valued + ores. If you need minerals, it may be a good time to ask the warden now! + Joan: + - rscadd: You can now place lights and most wall objects on shuttles. + Xhuis: + - rscadd: Added the power flow control console, which allows remote manipulation + of most APCs on the z-level. You can find them in the Chief Engineer's office + on all maps. +2017-03-18: + Supermichael777: + - rscadd: Free golems can now buy new ids for 250 points. + XDTM: + - rscadd: You can now complete a golem shell with runed metal, if you somehow manage + to get both. + - rscadd: Runic golems don't have passive bonuses over golems, but they have some + special abilities. + coiax: + - bugfix: The alert level is no longer lowered by a nuke's detonation. +2017-03-19: + BeeSting12: + - rscadd: Nanotrasen has decided to better equip the box-class emergency shuttles + with a recharger on a table in the cockpit. + Cheridan: + - tweak: The slime created by a pyroclastic anomaly detonating is now adult and + player-controlled! Reminder that if you see an anomaly alert, you should grab + an analyzer and head to the announced location to scan it, and then signal the + given frequency on a signaller! + Penguaro: + - bugfix: change access variables for turrets and shield gens + - bugfix: Box Station - Replaces the smiling table grilles with their more serious + counterparts. + coiax: + - tweak: The Syndicate lavaland base now has a single self destruct bomb located + next to the Communications Room. Guaranteed destruction of the base is guaranteed + by payloads embedded in the walls. + octareenroon91: + - bugfix: Fixes infinite vaping bug. + uraniummeltdown: + - rscadd: Plant data disks have new sprites. + - bugfix: Fixed Monkey Recycler board not showing in Circuit Imprinter + - tweak: Kinetic Accelerator Range Mod now takes up 25% space instead of 24% +2017-03-21: + ExcessiveUseOfCobblestone: + - experiment: All core traits [Hydroponics] scale with the parts in the gene machine. + Time to beg Duke's Guide Read.... I mean RND! + - tweak: Data disks with genes on them will have just the name of the gene instead + of the prefix "plant data disk". + - tweak: If you were unaware, you can rename these disks with a pen. Now, you can + also change the description if you felt inclined to. + Joan: + - experiment: Caches produce components every 70 seconds, from every 90, but each + other linked, component-producing cache slows down cache generation by 10 seconds. + Lombardo2: + - rscadd: The tentacle changeling mutation now changes the arm appearance when activated. + MrPerson: + - bugfix: Everyone's eyes aren't white anymore. + Penguaro: + - tweak: Box Station - The Vents and Scrubbers for the Supermatter Air Alarm are + now isolated from the rest of the Air Alarms in Engineering. + Supermichael777: + - bugfix: Chasms now smooth properly. + Tokiko1: + - tweak: Minor supermatter balancing changes. + - tweak: Supermatter now announces its damage half as frequently. + - tweak: Badly unstable supermatter now occasionally zaps nearby engineers and causes + anomalies to appear nearby, similar to overcharged supermatter. + XDTM: + - rscadd: Golem Shells can now be completed with medical gauze or cloth to form + cloth golems, which are weaker and extremely flammable. However, if they die, + they turn into a pile of cloth that will eventually re-animate back into full + health. That is, unless someone lights it on fire. +2017-03-22: + BeeSting12: + - rscadd: Added an autolathe circuit board to deltastation's tech storage. + - rscadd: Added 49 sheets of metal to deltastation's auxiliary tool storage. + Iamgoofball: + - bugfix: Freon no longer bypasses atmos hardsuits. + Penguaro: + - rscadd: Meta - Added Tool Belts to Engineering and Engineering Foyer + - rscdel: Meta - Removed Coffee Machine from Permabrig + - rscadd: Added Cameras for Supermatter Chamber (to view rad collectors and crystal) + - tweak: Adjusted Engine Camera Names for Station Consistency + - bugfix: Adjusted Monitor Names / Networks to view the Engine Cameras + coiax: + - rscadd: APCs now glow faintly with their charging lights. So red is not charging, + blue is charging, green is full. Emagged APCs are also blue. Broken APCs do + not emit light. + - rscadd: Alien glowing resin now glows. +2017-03-23: + Joan: + - tweak: Clock cults always have to summon Ratvar, but that always involves a proselytization + burst. + - rscdel: The proselytization burst will no longer convert heretics, leaving Ratvar + free to chase them down. + - spellcheck: Places that referred to the Ark of the Clockwork Justicar as the "Gateway + to the Celestial Derelict" have been corrected to always refer to the Ark. + Penguaro: + - bugfix: Wizard Ship - Bolts that floating light to the wall. + XDTM: + - rscadd: Medical Gauze now stacks up to 12 + - bugfix: Pressure plates are now craftable. + bgobandit: + - tweak: Alt-clicking a command headset toggles HIGH VOLUME mode. + coiax: + - bugfix: A dead AI no longer counts as an "unconverted AI" for clockcult. +2017-03-24: + BeeSting12: + - bugfix: Auxiliary base maintenance airlock now requires the proper access. Sorry + greyshirts, no loot for you! + Cyberboss: + - tweak: The recycler's base reclaim rate has been buffed from 1% to 50%. Manipulator + upgrades now give +12.5% per level instead of +25% + - bugfix: You can now successfully remove a pen from a PDA while it's in a container + Fox McCloud: + - rscadd: Modular receiver removed from the protolathe to autolathe + - tweak: Modular receiver cost is now 15,000 metal + Joan: + - bugfix: Fixes structures being unable to go through spatial gateways. + - tweak: Blazing Oil blobs take 33% less damage from water. + Penguaro: + - rscadd: '[Meta] Replaced Power Monitoring Console in Engineering with Modular + Engineering Console' + - rscadd: '[Pubby] Replaced Power Monitoring Console in Engineering with Modular + Engineering Console' + - rscadd: '[Omega] Replaced Power Monitoring Console in Engineering with Modular + Engineering Console' + - rscadd: '[Omega] Added RD and Command Modular Consoles to Bridge' + - rscadd: '[Delta] Replaced Power Monitoring Console in Engineering with Modular + Engineering Console' + - rscadd: '[Delta] Replaced duplicate Atmospherics Monitoring Console in Atmo with + Modular Engineering Console' + coiax: + - rscadd: Destroying a lich's body does not destroy the lich permanently, provided + the phylactery is intact. + - rscadd: A lich will respawn three minutes after its death, provided the phylactery + is intact. + - rscadd: The Soul Bind spell is forgotten after cast, respawn is now automatic. + - rscdel: Stationloving objects like the nuke disk are not valid objects for a phylactery. + - rscadd: Explosive implants can always be triggered via action button, even if + unconscious. + rock: + - tweak: lizards are hurt slightly more by cold but less by heat. this does not + mean they are more resistant to being lasered, fortunately. +2017-03-26: + BeeSting12: + - spellcheck: The bar shuttle's buckable bar stools are now buckleable bar stools. + Gun Hog and Shadowlight213: + - rscadd: The AI may now deploy to cyborgs prepared as AI shells. The module to + do this may be research in the exosuit fabricator. Simply slot the module into + a completed cyborg frame as with an MMI, or into a playerless (with no ckey) + cyborg. + - rscadd: AI shells and AIs controlling a shell can be determined through the Diagnostic + HUD. + - rscadd: AIs can deploy to a shell using the new action buttons or by simply clicking + on it. + - experiment: An AI shell will always have the laws of its controlling AI. + Penguaro: + - rscadd: Brig - Added Air Alarm + - rscdel: Engineering - Removed Brig Shutter + - tweak: Omega, Meta, & Delta Stations - The Vents and Scrubbers for the Supermatter + Air Alarm are now isolated from the rest of the Air Alarms in Engineering. + Qbopper: + - spellcheck: Drones are now given OOC guidelines to follow as well as their IC + lawset. + Robustin: + - rscadd: Added the prototype canister with expanded volume, valve pressure, and + access/timer features + TrustyGun: + - bugfix: Deconstructing display cases and coffins now drop the correct amount of + wood. + XDTM: + - tweak: Some golems now spawn with more thematic names. + - tweak: Adamantine Golems are no longer numbered, but receive a random golem name. + - bugfix: Airlocks properly remove the shock overlay when a temporary shock runs + out. + coiax: + - bugfix: Teams playing CTF have their own radio channels, rather than using the + Centcom and Syndicate channels. + - bugfix: Actually actually makes CTF barricades repair between rounds. + - bugfix: Blue CTF lasers have little blue effects when they hit things, rather + than red effects. +2017-03-28: + Supermichael777: + - rscadd: Backup operatives now get the nukes code. + XDTM: + - bugfix: Wooden tiles can now be quick-replaced with a screwdriver instead of a + crowbar, preserving the floor tile. + octareenroon91: + - bugfix: Bonfires that have a metal rod added should buckle instead of runtiming. +2017-03-29: + BeeSting12: + - rscadd: Adds emergency launch console to the backup emergency shuttle. + Joan: + - rscdel: Putting sec armour and a helmet on a corgi no longer makes the corgi immune + to item attacks. + - rscadd: All items with armour will now grant corgis actual armour. + Kevinz000: + - rscadd: High-powered floodlights may be constructed with 5 sheets of metal, a + wrench, a screwdriver, 5 cable coils, and a light tube. They require a powernet + connection via direct wire node. + coiax: + - bugfix: All tophats, rather than just the ones in maintenance, hurt a tiny bit + if you throw them at people. + - bugfix: Supermatter anomalies are more shortlived than regular anomalies, as intended. +2017-03-30: + coiax: + - rscadd: Autoimplanters have been renamed to autosurgeons. Currently only the CMO + and nuclear operatives have access to autosurgeons. What is the CMO hiding? + - bugfix: All upgraded organs for purchase by nuclear operatives now actually come + in an autosurgeon, for speed of surgery. +2017-03-31: + Cobby: + - tweak: Shot glasses are now more ambiguous [EASIER TO MAINTAIN] + Cyberboss: + - bugfix: Temperature changes will now properly cause atmospherics simulation to + activate + - bugfix: The command report for random xeno eggs will now be delivered along with + the rest of the roundstart reports + - bugfix: Drones can no longer be irradiated +2017-04-01: + Cyberboss: + - bugfix: The contents of the shelterpod smart fridge work again + XDTM: + - bugfix: Facehuggers no longer rip masks from people protected by helmets. +2017-04-02: + BeeSting12: + - bugfix: Metastation's northeast radiation collector is now connected to the grid. + Nanotrasen would like to apologize for any inconvenience caused to engineers, + but copper is expensive. + - rscadd: Boxstation's HoP office now has a PDA tech. + Cyberboss: + - tweak: Firedoors no longer operate automatically without power + - bugfix: Blood and other decals will no longer remain on turfs they shouldn't + - bugfix: The splashscreen is working again + - bugfix: False alarms are now guaranteed to actually announce something + Incoming5643: + - rscadd: Lighting visuals have been changed slightly to reduce it's cost to the + client. If you had trouble running the new lighting, it might run a little better + now. + MMMiracles (CereStation): + - rscadd: Added a patrol path for bots, includes 2 round-start securitrons placed + on opposite sites of station. + - wip: Due to map size, mulebots are still somewhat unreliable on longer distances. + Disposals are still advised, but mule bots are now technically an option for + delivery. + - rscadd: Added multiple status displays, extinguishers, and appropriate newscasters + to hallways. + - rscadd: A drone dispenser is now located underneath Engineering in maintenance. + - rscadd: Each security checkpoint now has a disposal chute that directs to a waiting + cell in the Brig for rapid processing of criminals. Why run half-way across + the station with some petty thief when you can just shove him in the criminal + chute and have the warden deal with him? + - tweak: Security's mail chute no longer leads into the armory. This was probably + not the best idea in hindsight. + - tweak: Virology has a bathroom now. + - tweak: Genetics monkey pen is a bit more green now. + - bugfix: Lawyer now has access the brig cells so he can complain more effectively. + - bugfix: Xenobio kill chamber is now in range of a camera. + - bugfix: Removed rogue bits of Vault area. + - bugfix: Medbay escape pod no longer juts out far enough to block the disposal's + path. + - bugfix: Captain's spare ID is now real and not just a gold ID card. + Penguaro: + - tweak: '[Meta] The Chapel Security Hatches were very intimidating. They have been + changed to more inviting glass doors.' + - bugfix: '[Meta] The maintenance tunnels in the Xeno Lab now have radiation shielding. + The Slime Euthanization Chamber will not have radiation shielding at this time + as dead slimes will not mind radiation.' + coiax: + - rscadd: Adds seperate languages to the game. Now Ratvarian, Drone, Machine, Swarmer, + Human (now called Galactic Common), Slime and Monkey are separate languages. + Each languages has its own comma prefix, for example, Galcom has the ,0 prefix, + while Ratvarian has the ,r prefix. If you don't understand a language when it + is spoken to you, you will hear a scrambled version that will vary depending + on the language that you're not understanding. + - experiment: This does not change who can understand what. + - rscdel: Removed the talk wheel feature. + - rscadd: Clicking the speech bubble icon now opens the Language Menu, allowing + you to review which languages you speak, their keys, and letting you set which + language you speak by default. Admins have additional abilities to add and remove + languages from mobs using this menu. + ktccd: + - bugfix: Ninja suits have received a new software update, making them able to **actually + steal tech levels** from R&D consoles and servers, thus avoid being forced to + honourably kill themselves for failing their objective. +2017-04-05: + Cyberboss: + - bugfix: Cardboard boxes and bodybags can no longer be anchored + Penguaro: + - rscadd: '[Box] A fire alarm has been added to the Lawyer''s office.' + - rscadd: '[Box] Adds access for Scientists to Starboard Maintenance Areas outside + of Toxins.' + - tweak: '[Box] Adjusted Science doors to more logical access codes.' + QV: + - bugfix: Fixed taking max suffocation damage whenever oxygen was slightly low + RemieRichards: + - bugfix: Using TK on the supermatter will burn your head off violently, don't do + this. + - rscadd: 'Examining clothing with pockets will now give information about the pockets: + number of slots, how it is interacted with (backpack, etc.), if it has quickdraw + (Alt-Click) support and whether or not it is silent to interact with.' + coiax: + - bugfix: Emergency shuttles will now forget early launch authorizations if they + cannot launch due to a hostile environment. +2017-04-07: + Qbopper: + - bugfix: Secure lockers will no longer have multiple lines about being broken. +2017-04-09: + 4dplanner: + - bugfix: Gas analyzers can now detect more gases in pipes + Joan: + - bugfix: Fixed a bug where getting caught between two shield generators as they + activated wouldn't cause you to gib and die. + QV: + - tweak: Refactored the way limbs that aren't limbs work + octareenroon91: + - bugfix: Hackable wires should work as intended again. +2017-04-11: + BeeSting12: + - spellcheck: '"the herpes of arts and crafts" is now "The herpes of arts and crafts."' + Cyberboss: + - bugfix: Runes no longer make you/themselves/random atoms yuge + JJRcop: + - tweak: Refactors whisper, now all living mobs can use it + - rscadd: 'Prefix any message with # to whisper, for example, "# Man, that guy is + weird.", you can still use the whisper verb if you whish.' + - rscadd: This is compatible with languages, for example "#,r That HoS is a problem, + we should kill him" + - rscdel: 'Removes #a #b #c etc radio codes, as well as :w and .w, which used to + be whisper.' + MrStonedOne: + - tweak: Nightvision was heavily modified. + - rscadd: Nightvision has been given 3 levels of nightvisionness. (some, most, and + full) + - tweak: ghosts, aliens, guardians, night vision eyes, and statues were given all + 3 levels in a cycling toggle + - tweak: thermals, and hud+NV goggles give "some" nightvisionness + - tweak: standalone masons are unchanged. + - tweak: Nightvision goggles (that aren't also sec huds or medhuds or the like) + give "most" nightvisionness. Nightvision masons also give "most" nightvisionness + - tweak: Most simple mobs with the ability to see in the dark were given "most" + nightvisionness, others got full nightvisionness. + - bugfix: Fixed certain ghost only things disappearing when disabling darkness. + - bugfix: Fixed ash storms not being visible when using things that modified your + ability to see darkness + - bugfix: fix a bug with the new github web processor + Shadowlight213: + - bugfix: The anime admin button will no longer cause equipped items to drop. + coiax: + - rscadd: Examining a ghost determines whether it is visible. +2017-04-13: + Cyberboss: + - bugfix: Fixed the incorrectly named Brig APC on Box Station= + - spellcheck: Fixed simple animal attack grammar + - bugfix: Roundstart department head announcements have been fixed + - bugfix: Brig cell doors now properly require the correct access + - bugfix: Fixed a bug preventing chameleon stamps from being picked up + - bugfix: Fixed a bug where honey frames couldn't be picked up + - bugfix: Photocopied papers will now retain their stamps + Davidj361: + - bugfix: Made it so chemsprayers, peppersprays, extinguishers don't spray when + you click your inventory items + - bugfix: Spray guns now actually have their range change when changing modes between + spray and stream + - bugfix: Krav maga now gets its abilities toggled if you click the same ability + twice + - bugfix: Added a link to the bottom right of paper when writing that shows help + for paper writing + - bugfix: Fixed the shift+middle-click pointing shortcut to work for cyborgs as + the functionality wasn't even there + - bugfix: Bodies in body bags get cremated properly now + RemieRichards: + - bugfix: Constructing lattice no longer prevents space transitions. + Robustin: + - rscadd: Ranged RCD added to the game + - rscadd: Rapid Lighting Device (also ranged) has been added. It can create wall, + floor, and temporary lights of any color you desire. + coiax: + - bugfix: Cigarette branding has been fixed. + - rscadd: Uplift Smooth brand cigarettes now taste minty as advertised. + - rscdel: You can no longer inject cigarette packets to inject all cigarettes simultaneously. + powergaming research director: + - bugfix: woops i dropped the emp protection module when i made your cns rebooters + today, guess they're vulnerable again! +2017-04-15: + Cyberboss: + - bugfix: Holopads can no longer be interacted with while unpowered + Davidj361: + - bugfix: Monkeys won't pickup items or rob you while they are in your stomach, + neither walk out of your stomach. + - bugfix: You can't cheat with eyewear/eye-implants when using advanced cameras + - bugfix: Mutant digitigrade legs re-added to the ashwalker species + Robustin: + - rscadd: The Prototype Emitter, will function like an ordinary emitter while also + charging a secondary power supply that will allow a buckled user to manually + fire the emitter. Returning to automatic fire will have the emitter continue + to fire at the last target struck by manual fire. + - rscadd: The Engineering Dance Machine, along with assorted effects/sounds. + coiax: + - bugfix: Plasmamen no longer burn to death while inside a cloning pod. +2017-04-18: + BeeSting12: + - bugfix: Cerestation's shuttle now has a recharger. + - rscdel: Centcomm's thunderdome airlocks have been removed due to contestants breaking + out. + - bugfix: Deltastation's chemistry lab now has a pill bottle closet. + - bugfix: The shield wall generators in xenobiology on Deltastation, Boxstation, + Metastation, and Pubbystation can now be locked and unlocked by scientists. + Davidj361: + - bugfix: Spawned humans no longer spawn eyeless (sprite) + MMMiracles (Cerestation): + - rscadd: Departments have been given head offices for a more secure place to chill + in their departments. + - rscadd: There is now a theatre on the service asteroid. + - tweak: Maintenance visuals and loot have been overhauled to be more visually interesting + and have more scattered bits of loot. + - bugfix: Various fixes with missing APCs, camera coverage, and misc things. + QualityVan: + - rscadd: Some foam guns can now be suppressed + coiax: + - rscadd: Drone, monkey and swarmer language now have distinctive colours when spoken. + - rscadd: Since drones are allowed to interact with pAIs, pAIs in mobile chassis + form are no longer distorted to drone viewpoints. + - bugfix: The shuttle's arrival can no longer be delayed after Nar-Sie's arrival. + The End cannot be delayed. +2017-04-19: + QualityVan: + - bugfix: Improved stethoscopes + Thunder12345: + - bugfix: You can no longer extract negative sheets from the ORM + XDTM: + - bugfix: APCs hacked by a malfunctioning AI are no longer immune to alien attacks. + - bugfix: Fixed bug where flashlight eyes weren't emitting light. +2017-04-20: + Cyberboss: + - bugfix: Fixed mining closets having extra, unrelated items +2017-04-22: + Cyberboss: + - bugfix: Conveyors no longer move things they aren't supposed to + XDTM: + - bugfix: Gold and Light Pink slime extracts no longer disappear before working. + coiax: + - bugfix: Fixed people understanding languages over the radio when they shouldn't. +2017-04-23: + coiax: + - rscadd: Centcom would like to inform all employees that they have ears. + - rscadd: Adds "ear" organs to all carbons. These organs store ear damage and deafness. + A carbon without any ears is deaf. Genetic deafness functions as before. +2017-04-25: + BeeSting12: + - bugfix: Deltastation's secure tech storage is no longer all access. + CoreOverload: + - bugfix: Disposals no longer get broken by shuttles rotation. + - bugfix: Wires no longer get broken by shuttles movement and rotation. + - bugfix: Atmospheric equipment no longer gets broken by shuttles movement and rotation. + Glory to the Flying Fortress of Atmosia! + Jalleo: + - rscdel: WW_maze from lavaland has been removed it wasnt that good really anyhow + QualityVan: + - bugfix: Changeling brains are now more fully vestigial + WJohnston: + - tweak: Skeletons and plasmamen's hitboxes now more closely match that of humans. + They are no longer full of holes and incredibly frustrating to hit, should they + run around naked. + XDTM: + - bugfix: Items will no longer be used on backpacks if they fail to insert when + they're too full. + - bugfix: T-Ray scans are no longer visible to bystanders. + - bugfix: T-Ray scans no longer allow viewers to interact with underfloor objects. + basilman: + - bugfix: fixed species with no skin dropping skin when gibbed. + coiax: + - rscadd: Examining a window now gives hints to the appropriate tool for the next + stage of construction/deconstruction. + - rscadd: You can examine a firedoor for hints on how to construct/deconstruct it. + - rscadd: Add an additional hint during construction where you can add plasteel + to make the firedoor reinforced. + - bugfix: Fixed easter eggs spawning during non-Easter. + - bugfix: Fixes stations not having holiday specific prefixes during the holidays. + - bugfix: Ghosts no longer drift in space. + - bugfix: Swarmers now only speak their own language, rather than swarmer and common. + - bugfix: When you are crushed by a door, it prints a visible message, instead of, + in some cases, silently damaging you. + - bugfix: The vent in the Escape Coridoor on Omega Station has been fixed. + - bugfix: You no longer die when turning into a monkey. + coiax, WJohnston: + - rscadd: Plasmamen lungs, also known as "plasma filters" now look different from + human lungs. + - rscadd: Plasmamen now have their own special type of bone tongue. They still sound + the same, it's just purple. Like them. +2017-04-26: + CoreOverload: + - rscadd: Gas injectors are now buildable! + Joan: + - tweak: Ash Drake swoops no longer teleport the Ash Drake to your position. + - balance: Some other tweaks to Ash Drake attacks and patterns; discover these yourself! + coiax: + - balance: The wizard spell Rod Form now costs 3 points, up from 2. + flashdim: + - bugfix: Omega Station had two APCs not wired properly. (#26526) +2017-04-27: + Gun Hog: + - rscadd: The GPS interface has been converted to tgui. + - experiment: GPS now update automatically or manually, give distance and direction + to a signal, and many other improvements! + MrStonedOne: + - tweak: Tweaked how things were deleted to cut down on lag from consecutive deletes + and provide better logging for things that cause lag when hard-deleted. + - tweak: Server hop verb moved to the OOC tab + - rscadd: Server hop verb can now be used in the lobby as well as while a ghost. + QualityVan: + - bugfix: You can hit emagged cloning pods with a medical ID to empty them + - rscadd: Crayons can be ground + - rscadd: Crayon powder can be used to color stuff + Shadowlight213: + - tweak: Heads of staff may now download the ID card modification program from NTNet. + bgobandit: + - tweak: When jumpsuits take severe damage, their suit sensors break. They can be + fixed by applying a cable coil. + coiax: + - rscadd: Anomalous crystals can be examined by ghosts to determine their function + and activation method. + - rscdel: Lightbringers can understand Slime and Galactic Common, and can only speak + Slime, as before. + - rscadd: The helper anomalous crystal is in the orbit list after it has been activated. +2017-04-28: + Kor: + - rscadd: Librarians can speak any language + coiax, WJohnston: + - rscdel: Languages no longer colour their text. + - rscadd: Languages now have icons to identify them. Galatic Common does not have + an icon if understood. +2017-04-29: + BeeSting12: + - bugfix: The emergency backup shuttle has lighting now. + - bugfix: Plating in deltastation's aux tool storage is no longer checkered. + Cobby: + - rscadd: Syndicate Lavabase now has more explicit instructions when it comes to + outing non-syndicate affiliated enemies of Nanotrasen. + - tweak: The GPS set tag has gone from a limit of 5 characters to 20. + - rscadd: The GPS can now be personalized in both name and description using a pen. + Joan: + - rscdel: Removed Mending Motor. + - rscadd: Added Mending Mantra, which is a script that causes you to repair nearby + constructs and structures as long as you continue chanting it. + - tweak: Mending Mantra will also heal Servants as long as they're wearing clockwork + armor. + Kor: + - rscdel: Removed double agents mode. + - rscadd: Replaced it with Internal Affairs mode. + Swindly: + - rscadd: Added organ storage bags for medical cyborgs. They can hold an organic + body part. Use the bag on a carbon during organ manipulation or prosthetic replacement + to add the held body part. + coiax: + - rscdel: Swarmer traps are no longer summoned by The Traps. + - balance: Wizard traps automatically disappear five minutes after being summoned. + - balance: Wizard traps disappear after firing, whether triggered via person or + something being thrown across it. + - balance: Wizards are immune to their own traps. + - tweak: The Traps are now marked as a Defensive spell, rather than an Offensive + spell. + kevinz000: + - experiment: Songs can now be added to disco machines with add_track(file, name, + length, beat). Only file is required, the other 3 should still be put in, though. + tacolizard forever: + - bugfix: Rechargers no longer flash the 'fully charged' animation before charging + something +2017-04-30: + QualityVan: + - bugfix: Changelings can once again revive with their brain missing + XDTM: + - rscdel: Voice of God's Rest command now no longer makes listeners rest. It instead + activates the sleep command. + coiax: + - rscadd: The Bank Machine in the vault now uses the radio to announce unauthorized + withdrawals, rather than an endless stream of loud announcements. +2017-05-01: + 4dplanner: + - tweak: Syndicate surplus crates now contain fewer implants + Bawhoppen: + - rscadd: Deep storage space ruin has been readded. + - rscadd: Space Cola machines now stock bottles of water. + Cobby: + - balance: The Gang pen is now stealthy. Stab away! + Cyberboss: + - rscadd: You can now make holocalls! Simply stand on a pad, bring up the menu, + and select the holopad you wish to call. Remain still until someone answers. + When they do, you'll be able to act just like an AI hologram until the call + ends + Joan: + - rscadd: Belligerent now prevents you from running for 7 seconds after every chant. + - rscdel: However, you no longer remain walking after Belligerent's effect fades. + - rscadd: Clockcult component generation will automatically focus on components + needed to activate the Ark if it exists. + - rscadd: Gaining Vanguard, such as from the Linked Vanguard scripture, will remove + existing stuns. + - rscadd: Proselytizers can now charge from Sigils of Transmission at a rate of + 1000W per second. + - rscadd: Sigils of Transmission can be charged with brass at a rate of 250W per + sheet. + Moonlighting Mac says: + - bugfix: Due to a clerical error in the chef's cookbooks now being resolved, you + can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients + from Lavaland. + - experiment: After being found again you will now be able to enjoy its special + blend of flavors with your tastebuds. Mmm. + QualityVan: + - tweak: Saline glucose now acts as temporary blood instead of increasing blood + regeneration + Swindly: + - tweak: Mercury and Lithium make people move when not in space instead of when + in space. + ninjanomnom: + - tweak: TEG displays power in kw or MW now + - tweak: TEG power bar only maxes over 1MW now + - experiment: Moves TEG to SSair + - experiment: Moves SM to SSair +2017-05-02: + 4dplanner: + - bugfix: Squishy plants will now affect walls and other turfs they get squished + on + Kor, Goof and Plizzard: + - rscadd: Adds persistent trophy cases. They are not on any map yet. + Shadowlight213: + - bugfix: The biogenerator will now show its recipes again. + XDTM: + - tweak: Blood Cult's talisman of Horrors now works at range. It will still give + no warning to the victim. + - rscadd: Golems can now click on empty golem shells to transfer into them. + - tweak: Plasma Golems now no longer explode on death. They instead explode if they're + on fire and are hot enough. The explosion size has been increased. + - tweak: Plasma Golems are now always flammable. + coiax: + - rscadd: When talking on the alien hivemind, a person will be identified by their + real name, rather than who they are disguised as. +2017-05-03: + BeeSting12: + - bugfix: Omega shuttle now has lighting. + Joan: + - balance: Clockwork component generation is twice as fast. + - balance: Scriptures cost up to twice as much; Driver scriptures are unaffected, + meaning they cost 50% less, Script scriptures cost 25% less, Application scriptures + cost about 12.5% less, and Revenant scriptures cost about 5% less. + Jordie0608: + - rscadd: Investigate logs are now persistent. + - tweak: Game logs are now stored per-round; use .getserverlog to access previous + rounds. + - rscdel: .giveruntimelog and .getruntimelog removed. + Kor, Profakos, Iamgoofball: + - rscadd: The Librarian has been replaced by the Curator. + - rscadd: Persistent trophy cases have been added to the library on Meta, Delta, + and Box. These are only usable by the Curator. + - rscadd: The Curator now starts with his whip. + - rscadd: The Curator now has access to his treasure hunter outfit, stashed in his + private office. + coiax: + - balance: Plasma vessels, the organs inside aliens that are responsible for their + internal plasma storage, will regenerate small amounts of plasma even if the + owner is not on resin weeds. + - rscadd: Restrictions on Lizardpeople using their native language on the station + have been lifted by Centcom, in order to maximise worker productivity. The language's + key is ",o". + deathride58: + - tweak: Fixed the slimecore HUD's neck slot sprite. +2017-05-04: + 4dplanner: + - bugfix: revenants now properly resurrect from ectoplasm, as opposed to ectoplasm + merely spawning a new grief ghost + - bugfix: Turrets can no longer see invisible things, such as unrevealed revenants + Joan: + - rscadd: Mania Motors now do minor toxin damage over time and will convert those + affected if the toxin damage is high enough. + - balance: The effects of a Mania Motor continue to apply to targets after they + leave its range, though they will fall off extremely quickly. + - rscdel: Mania Motors no longer cause brain damage. + - imageadd: Ratvarian Spears have new inhand icons. + Lzimann: + - rscdel: Gang game mode was removed + Moonlighting Mac says: + - rscadd: Courtesy of the art & crafts division, imitation basalt tiles themed on + the rough volcanic terrain of lavaland are now available to be made out of sandstone. + - experiment: The manufacturer even managed to replicate the way that it lights + up with volcanic energy, it is the perfect accompaniment to other fake (or real) + lava-land tiles or a independent piece. + QualityVan: + - rscadd: Point flashlights at mouths to see what's inside them +2017-05-05: + Incoming: + - tweak: Display cases now require a key to open, which the curator spawns with + Joan: + - balance: Sigil of Accession, Fellowship Armory, Memory Allocation, Anima Fragment, + and Sigil of Transmission are not affected by the previously-mentioned % reduction + to Application scripture costs. + LanCartwright: + - rscadd: Lesser smoke book to Delta and Metastation + - rscdel: Normal smoke book from Delta and Metastation + - tweak: Civilian smoke book now has a 360 max cooldown (from 120) and halved smoke + output. + QualityVan: + - bugfix: Dental implants stay with the head they're in + bgobandit: + - tweak: The Syndicate has added basic functionality to their state-of-the-art equipment. + Nuke ops can now donate all TCs at once. + lordpidey: + - rscadd: There is a new traitor poison, spewium. It will cause uncontrollable + vomiting, which gets worse the longer it's in your system. An overdose can + cause vomiting of organs. + - tweak: Committing suicide with a gas pump can now shoot out random organs. + - bugfix: Toxic vomit now shows up as intended. +2017-05-06: + 4dplanner: + - rscadd: Internal Affairs Agents now obtain the kill objectives of their targets + when they die. + - rscadd: Internal Affairs Agents now have an integrated nanotrasen pinpointer that + tracks their target at distances further than ten squares. + - rscadd: Internal Affairs Agents will now lose any restrictions on collateral damage + and gain a "Die a glorious death" objective upon becoming the last man standing, + and revert if any of their targets are cloned. + BeeSting12: + - bugfix: Pubbystation no longer has two airlocks stacked on top of each other leading + into xenobiology's kill room. + - rscadd: Deltastation's chemistry now has a screwdriver. + - bugfix: Deltastation's morgue no longer has a blue tile. + - bugfix: Deltastation's chemistry smart fridge is no longer blocked by a disposal + unit. + Cyberboss: + - tweak: Teslas now give off light + Joan: + - balance: Sigils of Transgression are slightly more visible and glow very faintly. + LanCartwright: + - rscadd: Reduction to nutrition when consuming Miner's salve. + - rscdel: Stun/weaken that bypasses bugged chemical protection when consuming Miner's + salve. + Lzimann: + - rscdel: Telescience is no more. + PKPenguin321: + - rscadd: Undid the gang gamemode removal. + QualityVan: + - rscadd: Cargo can order restocking units for NanoMed vending machines + - rscadd: NanoMed vending machines can be build and unbuilt + Robustin: + - rscadd: Blood Cultists can now attempt to claim the position of Cult Master with + the approval of a majority of their brethren. + - rscadd: 'The Cult Master has access to unique blood magic that will aid them in + leading the cult to victory:' + - rscadd: The Cult Master can mark targets, allowing the entire cult to track them + down. + - rscadd: The Cult Master has single-use, noisy, and overt channeled spell that + will summon the entire cult to their location. + - rscadd: All cultists gain a HUD alert that will assist them in completing their + objectives. + - rscadd: Constructs created by soul shards will now be able to track their master. + - rscadd: Cultists created outside of cult mode will now get a working sacrifice + and summon objective and the summon rune will no longer fail outside of cult + mode. + - tweak: Gang Dominator max time is now 8 minutes down from 15m + - tweak: Gang Tagging now reduces the timer by 9 seconds per territory, down from + 12 seconds. + coiax: + - rscadd: Adamantine golems have special vocal cords that allow them to send one-way + messages to all golems, due to fragments of resonating adamantine in their heads. + Both of these are organs, and can be removed and put in other species. + - rscadd: You can use adamantine vocal cords by prefixing your message with ":x". + - rscdel: Xenobiology is no longer capable of making golem runes with plasma. Instead, + inject plasma into the adamantine slime core to get bars of adamantine which + you can then craft into an incomplete golem shell. Add 10 sheets of suitable + material to finish the shell. + - experiment: The metal adamantine is also quite valuable when sold via cargo. + - bugfix: If you know more than the usual number of languages, you'll now remember + them after you get cloned. + - rscdel: Humans turning into monkeys will not suddenly be able to speak the monkey + language, and will continue to understand and speak human. + - rscadd: Ghosts can now modify their own understood languages with the language + menu. + - rscadd: Any mob can also open their language menu with the IC->Open Language Menu + verb. + - rscadd: Silicons can now understand Draconic as part of their internal databases. + - bugfix: Golems no longer have underwear, undershorts or socks. + - tweak: The lavaland Seed Vault ruin can spawn only once. + - rscadd: It is now possible to make plastic golems, who are made of a material + flexible enough to crawl through vents (while not carrying equipment). They + also can pass through plastic flaps. + - bugfix: Fixed adamantine vocal cord (F) links not working for observers. +2017-05-07: + Anonmare: + - tweak: Removes organic check from mediborg storage container + Joan: + - rscadd: Cultists of Nar-sie have their own language. The language's key is ",n". + - balance: Sigils of Transgression are slightly brighter. + Moonlighting Mac: + - experiment: Due to budget cuts and oil synthesis replacing expensive processes + of digging up haunted primeval ashwalker burial grounds, Nanotransen has taught + chemists how to make plastic from chemicals in the hopes that new plastic products + can reduce expenditure on metal and glass. + - rscadd: you can now make plastic sheets from chemistry out of heated up crude + oil, ash & sodium chloride + MrStonedOne: + - bugfix: fixed bug that caused an infinite connection loop when connecting on a + new computer or computer with recently changed hardware. + - rscadd: Moved to a new system to make top menu items easier to edit. + - tweak: Moved icon size stuff to a sub menu + - rscadd: Added option to change icon scaling mode. + - bugfix: Byond added fancy shader supported scaling(Point Sampling), this sucks + because it's blurry, the default for /tg/station has changed back to the old + nearest neighbor scaling. + Penguaro: + - bugfix: Adjusted the Examine description of the right-most tiles of the Space + Station 13 sign to be consistent with the rest of the tiles. + - bugfix: Anywhere there was lava below a tile on the station is now space. + Robustin: + - tweak: c4 planting is now 40% faster + coiax: + - bugfix: Smartfridges no longer magically gain medicines if deconstructed and rebuilt. + - rscadd: Ash walkers now know and speak Draconic by default, but still know Galactic + Common. Remember, Galcom's language key is ",0" and you can review your known + languages with the Language Menu. + octareenroon91: + - rscadd: Showers and sinks added to gulag and mining station for hygiene and fire + safety. + - rscadd: Watertanks added to mining station for convenient fire extinguisher refill. +2017-05-08: + Dorsisdwarf: + - bugfix: Fixed being unable to hit museum cases in melee + Joan: + - tweak: The verb to Assert Leadership over the cult has been replaced with an action + button that does the same thing, but is much more visible. + Moonlighting Mac says: + - tweak: After a recent trade fair, employees have took it upon themselves to learn + how to craft leather objects out of finished leather sheets, for novices they + are pretty good at it! Try it yourself! + - rscadd: Muzzles to silence people are now craftable out of leather sheets. + - rscdel: You can no longer print off designs from a bio-generator that can now + be crafted out of leather sheets. + - tweak: Complete sheets of leather can be printed from the bio-generator for 150 + biomass to accommodate for a loss of designs. + - experiment: Specialist objects from the leather & cloth category bio-generator + category were not removed as to encourage interdepartmental interaction & balance. + Penguaro: + - rscadd: The Slime Scanner is available from the Autolathe. + - tweak: The Design Names in the various machines are now capitalized consistently + coiax: + - bugfix: Fixes various mobs speaking languages that they were only supposed to + understand. + - bugfix: Fixes being able to bypass language restrictions by selecting languages + you can't speak as your default language. + ninjanomnom: + - tweak: Highlander no longer breaks your speakers +2017-05-09: + Expletive: + - rscadd: Curator's fedora has a pocket, like all the other fedoras. + - tweak: Treasure hunter suits can now hold large internal tanks, to ease the exploration + of lavaland. + - tweak: The curator can now access the Auxillary Base and open doors on the mining + station. + MrStonedOne: + - tweak: Lighting now defaults to fully bright until the first update tick for that + tile. This makes shuttle movements less immersion breaking. + - experiment: Rather than remove the light source from the system and then re-adding + it on light movements, the system now calculates and applies the difference + to each tile. This should speed up lighting updates. + Penguaro: + - tweak: Adjusts Meteor Shuttle Name + - bugfix: The Central Command Ferry will now dock at one of the ports in Arrivals + - tweak: '[Meta] The Slime Control Console boundaries have been adjusted around + the Kill Room' + XDTM: + - rscadd: Added bluespace launchpads. They can be built with R&D, and can teleport + objects and mobs up to 5 tiles away (8 at max upgrades), from the pad to the + target and viceversa. + - rscadd: To set up a launchpad, a launchpad and a launchpad console must be built. + The pad must be opened with a screwdriver, then linked to the console using + a multitool. A console can support up to 4 pads. + - rscadd: Launchpads require some time to charge up teleports, but don't require + cooldowns unlike quantum pads. Upgrading launchpads increases the range by 1 + per manipulator tier. + - rscadd: A special variant, the Briefcase Launchpad, has also been added to the + traitor uplink for 6 TC. + - rscadd: Briefcase Launchpads look like briefcases until setup (which requires + a few seconds). When setup, the launchpad will be functional, but can still + be dragged on the ground. To pick a pad back up, click and drag it to your character's + sprite. + - rscadd: Unlike stationary launchpads, briefcase pads only have 3 tiles of maximum + range. + - rscadd: Briefcase pads are controlled by a remote (that is sent with the briefcase) + instead of a console. The remote must be linked to the briefcase by simply hitting + it. Each remote can only be linked to one pad, unlike consoles. + coiax: + - rscadd: Visible ghosts emit light. +2017-05-11: + Joan: + - rscadd: You can now buy double eswords from the uplink for 16 telecrystals. They + cannot be bought below 25 players. + - rscdel: You can no longer use two eswords to construct a double esword. + Joan, Robustin: + - rscdel: Harvesters can no longer break walls, construct walls, convert floors, + or emit paralyzing smoke. + - rscadd: Harvesters now remove the limbs of humans when attacking, can heal OTHER + constructs, have thermal vision, and can move through cult walls. + - rscadd: Harvesters can now convert turfs in a small area around them and can create + a wall of force. + - tweak: Harvesters are now cultists. + - rscadd: When Nar-Sie is summoned, she will convert all living non-construct cultists + to harvesters, who will automatically track her. + Kor: + - rscadd: a new mysterious book has been discovered in lavaland chests! + - tweak: weird purple hearts found in lavaland chests have started beating again! + what could this mean? + MrStonedOne: + - bugfix: Fixes t-ray mode on engineering goggles not resetting the lighting override + properly. + QualityVan: + - tweak: Machine names will be capitalized when they talk on radio + Robustin: + - tweak: Dominators now require a significant amount of open (non-walled) space + around them in order to operate. + TehZombehz: + - rscadd: Sticks of butter and liquid mayonnaise can now be produced via a new 'mix' + function on the grinder. Please eat responsibly. + XDTM: + - bugfix: Plasma Golems now have the correct updated tip. + - tweak: Plasma Golems no longer take damage from fire, and take normal instead + of increased burn damage from other sources. They will still explode if on fire + and hot enough. + - rscadd: Plasma Golems can now self-ignite with an action button. + - tweak: Plasma Golems are now warned when they're close to exploding. + - tweak: Plasma Golems now have a constant chance of exploding after 850K instead + of a precise threshold at 900K, making it less predictable. + bandit: + - tweak: Nanotrasen has enhanced personality matchmaking for its personal AIs. pAI + candidates will now see who is requesting a pAI personality. + duncathan: + - tweak: opening a dangerous canister will only alert admins if it contains meaningful + amounts of a dangerous gas. No more being bwoinked because you opened an empty + canister that used to have plasma in it. + lordpidey: + - tweak: Modified chances for returning someone's soul using an employment contract. Now + everyone has a chance, not just lawyers and HoP. + - rscadd: Particularly brain damaged people can no longer sign infernal contracts + properly. + - tweak: Infernal contracts for power no longer give fireball, and instead give + robeless 'lightning bolt' spell. + - rscadd: Devils can now sell you a friend, for the cost of your soul. + - tweak: The codex gigas should now be easier to use, and less finicky. + - rscdel: The codex gigas no longer sintouches readers. + ma44: + - tweak: Doubles the amount of points wooden planks sell for (now 50 points) +2017-05-12: + Joan: + - tweak: Manifest Spirit will no longer continue to cost the user health if the + summoned ghost is put into critical or gibbed. + - rscadd: Ghosts summoned by Manifest Spirit are outfitted with ghostly armor and + a ghostly cult blade that does slightly less damage than a normal cult blade. + - balance: Manifest Spirit now consumes 1 health per second per summoned ghost, + from 0.333~. + - balance: Manifest Spirit can now only summon a maximum of 5 ghosts per rune, and + the summoned ghosts cannot use Manifest Spirit to summon more ghosts. + - rscadd: Wraiths now refund Phase Shift's cooldown by attacking; 1 second on normal + attacks, 5 seconds when putting a target into critical, and a full refund when + killing a target. + - balance: Increased Phase Shift's cooldown from 20 seconds to 25 seconds. + KorPhaeron: + - rscadd: Zombies can now see in the dark. If you steal their eyes you'll be able + to see in the dark as well! + MMMiracles (Cerestation): + - tweak: Hydroponics has been revamped, adding a few things missing before and adding + a bee room in place of the backroom. + - bugfix: Fixed some other stuff. + New Antag Alert sounds: + - soundadd: added sounds that alert players to their antag status + - soundadd: Blood cult has a new alert sound + - soundadd: Clock cult has a new alert sound + - soundadd: changeling has a new alert sound + - soundadd: Malf/traitor AI has a new alert sound + - soundadd: Nuke Ops has a new alert sound + - soundadd: Ragin' Mages has a new alert sound + - soundadd: Traitor has a new alert sound + Swindly: + - tweak: Solid plasma now begins burning at the temperature at which it was ignited. + - balance: Snow walls no longer block explosions, are deconstructed faster, and + no longer leave girders when deconstructed. + coiax: + - balance: Nanotrasen Cloning Divison's three hundred identical scientists have + announced an upgrade to the cloning computer's software. You can now scan brains + or dismembered heads and successfully clone from them. Brains seem to remember + the DNA of the last body they were attached to. +2017-05-13: + QualityVan: + - bugfix: Pizza boxes once again look different when open + 'Tacolizard Forever: It''s hip to fuck bees': + - rscadd: Added a honey jar item. It's not implemented yet. + - balance: Honey is now more robust at healing, but don't eat too much or you'll + turn into a fatty landwhale. + TehZombehz: + - rscadd: Butter noodles, butter biscuits, buttered toast, and pigs in a blanket + can now be crafted using sticks of butter and other ingredients. + coiax: + - rscadd: Servant golems now follow the "Material Golem (123)" naming scheme. + octareenroon91: + - rscadd: Hermit ruin now includes a portable seed extractor. +2017-05-14: + coiax: + - rscadd: Free Golems can purchase Royal Capes of the Liberator at their mining + equipment vendor. +2017-05-15: + Dorsidwarf: + - balance: Nanotrasen Robotics Supply Division has successfully petitioned to replace + the "My First Robot" motors in turret coverings with a standard commercial brand. + As such, they will now open faster. + Expletive: + - rscadd: You can now create water bottles and wet floor signs by using plastic + sheets. + - rscadd: You can create toy swords out of plastic sheets, a piece of cable, and + a light bulb. + Joan: + - tweak: Glowshrooms now have a less saturated glow. + - balance: The summoned ghosts from Manifest Spirit can no longer break airlocks + with their standard blade. + - balance: Manifest Spirit now does a small amount of damage when initially manifesting + a ghost. + McBawbaggings: + - tweak: SMES units will now accept charge from the power network even if the available + load is less than the input rate. Credit to Zaers for the original code. + - bugfix: Wizards are now at least 30 years old. Apprentices will be in-between + ages 17 to 29. + Penguaro: + - bugfix: The Gravity Generator description now mentions a graviton field as opposed + to a gravaton field. What is Gravaty anyway? + - bugfix: Centcom Engineering has reviewed the plans for the Box series station + and has addressed some concerns related to some APCs not affecting their designated + section. APCs for the Detective's Office, Cargobay, and Gateway, now control + those rooms. The Bridge Maintenance APC has been removed from future construction + as it serves no purpose and thus is an unnecessary construction cost. + - bugfix: The pipe from the station to the AI Satellite has been completed. + Profakos: + - rscadd: Centcom has decided to upgrade the Ore Redemption machines with a floppy + drive, intended for design disks. + Qbopper: + - tweak: The supermatter crystal now sends its warning messages to the engineering + channel. (if it's in critical condition the message will be sent to the common + radio channel as before) + Swindly: + - balance: Nitrous oxide now causes anemia. + coiax: + - bugfix: Curator soapstones now successfully leave messages for future shifts. + - rscdel: Soapstones can no longer be purchased in cargo. + - rscdel: The janitor no longer starts with an empty soapstone. + - experiment: Engraved messages can be left anywhere in the world, but be wary that + the terrain of places like lavaland and space can change shift to shift. + - rscadd: Goats on the station have developed a taste for glowshrooms, and will + eat them if they encounter any. + ma44: + - tweak: Seed vault remapped + - tweak: The seed vault random seed spawner can now spawn cherry bombs instead of + regular cherry seeds + - rscadd: BEES to plant vault + octareenroon91: + - rscadd: Ambrosia Deus can now mutate into Gaia, and Gaia into Deus. + - rscdel: A single branch of Ambrosia Gaia will not immediately make a hydroponics + tray self-sufficient. + - balance: A (total) dose of 20u Earthsblood (from Gaia) will make a hydroponics + tray self-sufficient. + uraniummeltdown: + - rscadd: Ambrosia Gaia is back +2017-05-16: + Moonlighting Mac says: + - rscadd: Starthistles now return seeds when they are harvested, amongst having + a overhaul of description, alteration of statistics & a mutational path into + harebells. These seeds have been supplied into the hydroponics seed vendor. + - imageadd: Starthistle tray sprites have been restructured & also fixed from a + issue of them being broken and not appearing in trays. In addition there are + new sprites for its seeds. + Penguaro: + - bugfix: There is now Space under the rocks at the Dragoon's Tomb + - bugfix: Centcom Intelligence reports that the Hidden Syndicate Research Base may + have received a shipment of viruses. + QualityVan: + - bugfix: Fixed fire alarms not being repairable if the board was broken + - bugfix: People without eyes and ears are no longer susceptible to flashbangs they + aren't directly on top of + Robustin: + - rscadd: Summoning Nar'Sie now triggers a different ending. No shuttle is coming! + Survivors must escape on a pod or survive the Red Harvest for 3 minutes. If + Nar'Sie acquires enough souls, the round ends immediately with a **special ending**. + - rscadd: New Harvester Sprite + - rscadd: Harvesters can now track a random survivor on the station, then switch + back to tracking Nar'Sie, via a new action button. + fludd12: + - rscadd: You can now add grills to a bonfire, letting you cook things on top of + them. +2017-05-17: + 4dplanner: + - bugfix: revenant respawning will not spam up deadchat so much, and is less likely + to break. + Expletive: + - rscadd: Syndicate Tomes have been added to traitor uplinks for 9 TC. They let + an agent or an operative provide both weal and woe. + Penguaro: + - bugfix: Centcom Engineering has reviewed the power schematic for the engine room + and added an Area Power Controller. + coiax: + - balance: Magic eightballs are now tiny items, able to fit into a box and pocket. +2017-05-18: + Joan: + - rscadd: Proselytizing alloy shards will now proselytize all the shards in the + tile, instead of requiring you to proselytize each one at a time. + Lordpidey: + - tweak: Space ninjas now use action buttons instead of verbs for a more consistent + user experience. + - rscadd: Toy toolboxes with realistic rumbling action have been added to arcade + prizes. + 'Tacolizard Forever: Plasmaman Powercreep': + - tweak: Plasmaman tanks are the same size as emergency oxygen tanks. + coiax: + - rscadd: Syndicate agents can purchase a "codespeak manual", that teaches them + a language that sounds like a series of codewords. You can also hit other people + with the manual to teach them. One use per manual. + - rscadd: Nuclear operatives have access to a deluxe manual that is more expensive + but has unlimited uses. + - rscadd: Syndicate AIs know Codespeak for free. + - bugfix: Spacevines can no longer spread on space transit turfs. + - balance: Plastic explosives can no longer be detonated by EMPs. + - rscadd: Various vending machines, when shooting their inventory at nearby people, + will "demonstrate their products features". This means that if a cigarette vending + machine throws a lighter at you, it will be on. Vending machines also choose + random products when throwing, rather than the first available one. + kevinz000: + - rscadd: Peacekeeper cyborgs now have projectile dampening fields. +2017-05-19: + 4dplanner: + - balance: the Hierophant club has gained in power +2017-05-20: + Joan: + - balance: Proto-kinetic crushers have been worked over by our highly qualified + techs, will recharge 12% faster, and no longer require very low-pressure atmospheres + to fire! + - balance: In addition, our techs have tweaked the quantum linker module and proto-kinetic + crushers can apply multiple marks to different targets! Marks applied may eventually + expire if not detonated. + Steelpoint: + - rscadd: All Pulse weapons now accurately show, by their sprites, what fire mode + they are in. + - rscadd: ERT, non-red alert, Security Response Officers spawn with a Tactical Energy + Gun. This is a military variant of the Egun that, in addition to laser and disable + rounds, has access to stun rounds. + - tweak: Pulse Pistols can now be recharged. + Swindly: + - rscadd: Added modified syringe guns. They fire DNA injectors. Geneticists and + CMOs can buy them from the traitor uplink for 14 TC. + coiax: + - rscadd: When a shuttle is called, sometimes an on-call admiral, using available + information to them, will recall the shuttle from Centcom. + octareenroon91: + - bugfix: Golems touching a shell can now choose to stay in their own body. +2017-05-21: + Gun Hog: + - bugfix: The Auxiliary Base can no longer land outside the lavaland map's boundaries. + RandomMarine: + - tweak: Drone laws no longer restrict drones to the station. + Steelpoint: + - rscadd: The Warden's Cycler Shotgun has been replaced with a Compact Combat Shotgun. + A unique weapon, it can fit in armour slots but at the sacrifice of a smaller + ammo capacity of four shells. +2017-05-22: + Joan: + - tweak: Resonator fields now visually show how long they have until they burst. + - bugfix: Hitting a legion skull with a resonator will now produce a field. + - balance: Swapped how far plasma cutter blasts go when going through rock and in + open air. This means blasts through air will go 4/5 tiles, but will mine 7/10 + tiles, for normal/advanced plasma cutters, respectively. + - tweak: There is now a buffer zone between the mining base and lavaland where megafauna + will not spawn. + - tweak: Ruins will no longer spawn directly in front of the mining base. + Lzimann: + - rscadd: Pandemic is now tgui! + Robustin: + - rscadd: Gang influence is now decentralized, each gangster has their own influence + that they can increase by spraying (and protecting) their tags and new influence-enhancing + bling. + - rscadd: Gang uniforms are now created based on your gang's color and can be purchased + by any gang member. They will increase the wearer's influence and provide protection, + but will make it fairly obvious which gang you belong to. + - rscadd: Gangs have access to a new surplus rifle; it is a semi-automatic rifle + that is very bulky and has a very low rate of fire. Gang members can buy this + gun for just 8 influence. + - rscadd: Gangs have access to the new machine gun turret; it unleashes a volley + of bullets with an extended view range. It does not run out of ammo, but a significant + delay between volleys and its stationary nature leaves the gunner vulnerable + to flanking and return fire. Holding down the trigger will allow you to aim + the gun while firing. It will cost gangs 50 influence. + - rscadd: The sawn-off improvised shotgun is now available to gangs for 6 influence. + With buckshot shells being easy to produce or purchase, this gun gives the most + "bang for your buck" but its single-shell capacity will leave you vulnerable + during a pitched gunfight. + - rscadd: The Wetwork boots give gangs access to a lightly armored noslip variant. + - tweak: The armored gang outfits are now slightly more resistant to ballistic and + bomb damage + Swindly: + - balance: Monkeys can be weakened by stamina loss + kevinz000: + - bugfix: Nanotrasen decided to remove the integrated jet engines from jetpacks. + They can no longer be used successfully indoors. +2017-05-23: + ClosingBracket: + - spellcheck: Fixed very minor inconsistencies on items & punctuation on items. + Joan: + - rscdel: Nanotrasen has taken a lower bid for their meson suppliers, and meson + scanners will no longer display terrain layouts while on the planet. + - tweak: However, they have discovered that, with some tweaks, mineral scanners + will no longer actually require you to be wearing mesons. + - tweak: The cheaper mesons will not completely remove reliance on light. + - tweak: Ripleys will collect all ore in front of them when they move with a clamp + and stored ore box. + - tweak: Chasms will glow dimly, like lava. + Joan, Repukan: + - rscadd: Traitor miners can now buy up to 2 KA Pressure Mods for 5 TC each. + - balance: KA Pressure Mods now only take up 35 mod capacity each, allowing traitor + miners to use 2 and have space for 1 other mod. + - rscdel: R&D can no longer build KA Pressure Mods. + Robustin: + - rscadd: Added a sexy new icon for the harvester's AOE conversion spell + - bugfix: Fixed construct's forcewall being invisible + - bugfix: Fixed cult constructs "Locate Master" and "Locate Prey" not functioning + - bugfix: Fixed spell action buttons not showing their actual availability status + - tweak: Changed the duration of a few frames for the new Cult ending + Steelpoint: + - rscadd: Auto Rifle alt ammo mags (AP, Incendiary, Uranium Tipped) now have a coloured + stripe to denote them. + That Really Good Soda Flavor: + - bugfix: Martial arts are no longer lost when mind-swapping, cloning, moving your + brain, et cetera. + - bugfix: Fixed a bug where paper bins could swallow up pens into the void. + coiax: + - rscadd: Galactic Common has been added to silicon's internal language database, + meaning even if a cyborg is created from someone who previously did not know + Galactic Common, they will be able to speak it as a silicon. + kevinz000: + - bugfix: Spessmen seems to have stopped suffering from the mental condition that + makes them believe they can't move fast if they have only one leg, even if they're + in space and using a jetpack! + ma44: + - rscadd: Reports of syndicate base on lavaland has been outfitted with a state + of the art donksoft toy weapon dispenser. +2017-05-24: + Joan, WJohnston: + - rscadd: Adds marker beacons to mining as a vendible item. They can be bought in + stacks of 1, 10, and 30 at a rate of 10 points per beacon. + - rscadd: Miners start with a stack of 10 in their backpack, and the Extraction + and Rescue Kit contains a stack of 30. + - rscadd: Marker beacons come in a large selection of colors and simply light up + a small area when placed, but are useful as a path marker or to indicate dangers. + QualityVan: + - rscadd: Hairless hides now become wet when exposed to water + - rscadd: You can microwave wet leather to dry it + - bugfix: Inserted legion cores no longer work if they went inert before implanting + Steelpoint: + - rscadd: Sketchin alternative magazines (Armour Piercing, Hollow Point, Incendiary) + now have unique sprites to better identify them. + - rscadd: ERT Sec Tactical Energy Guns now have a unique sprite. + - tweak: Changes to production of Nanotrasen Auto Rifle armour piercing bullets + have now made AP bullets better able to penetrate armour, but at the cost of + the amount of possible damage the bullet can do to soft targets. + - rscadd: Many Ballistic weapons now have new sounds related to reloading or placing + bullets into magazines. + - rscadd: Boxstation armoury weapon racks now have glass panes to help prevent the + weapons easily flying out of a breached hull. + - bugfix: Fixed Battleship Raven's bridge blast doors not working. + Tacolizard: + - tweak: Station based armour is slightly more descriptive of what it does. + That Really Good Soda Flavor: + - tweak: Changed spray tan overdoses to be more realistic. + - rscadd: People who are high and beach bums can now talk in their own stoner language. + - tweak: Beach bums can only communicate with other beach bums and people who are + high. +2017-05-25: + 4dplanner: + - bugfix: crushers now apply marks properly + - rscadd: 20% of internal affairs agents are actually traitors + 4dplanner, robustin: + - bugfix: c4 has always taken 3 seconds to plant, and you are not allow to believe + otherwise + Crexfu: + - spellcheck: typo fix for origin tech + Cyberboss: + - experiment: Explosions will no longer have a start up delay + - bugfix: Indestructible objects can no longer be destroyed by bombs + Oldman Robustin: + - tweak: Gang mode now calls a 4 minute unrecallable shuttle once 60% of the crew + is dead + ohnopigeons: + - balance: The cost of plasma has been reduced from 500 to 300, but retain their + immunity to saturation +2017-05-26: + Moonlighting Mac says: + - rscadd: You can now craft a strong cloak with a hood made out of goliath and monster + materials from within the primitive crafting screen. + - rscadd: The cloak has a suit slot for all kind of primitive supplies, however + it cannot carry most electronic miner equipment. + - balance: Due to the recipe requiring leather, it is not normally accessible to + all ghost roles without a source of water & electricity. + kevinz000: + - rscadd: You can now add bayonets to kinetic accelerators. However, only combat + knives and survival knives can be added. Harm intent attacking things will cause + you to attack that thing with the bayonet instead! +2017-05-28: + ClosingBracket: + - tweak: Allows explorer webbings to hold marker beacons. + Expletive: + - tweak: E-Cigarettes can now fit in your pocket. + Iamgoofball: + - bugfix: After the Syndicate realized their top chemist was both mixing a stamina + destroying drug with a stimulant to avoid slowdowns entirely in their sleepypens, + they fired him and replaced him with a new chemist. + Joan: + - rscadd: Miner borgs can now place marker beacons from a storage of 30. + - bugfix: Necropolis tendrils will once again emit light. + - rscadd: The kinetic crusher can now gain bonus effects via trophy items gained + by killing bosses with it. + - rscadd: Yes, you do have to kill the boss primarily doing damage via the kinetic + crusher, or you won't get the trophy item and the bonus effect it grants. + Kor: + - bugfix: The chaplains possessed blade, shades, and constructs, can once again + speak galactic common. + QualityVan: + - bugfix: Bayonets can now be used for butchery + - tweak: Cloning pods which are interrupted by a emagging will now produce a slightly + lumpier smoothie + - bugfix: Cloning pods that have stopped cloning early can no longer be broken open + to extract leftover parts + - bugfix: Crew monitoring consoles once again have minimaps while you're on the + station level + Steelpoint: + - rscadd: A New Iron Hawk troop transport ruin has been added to lavaland. Can the + sole surviving Marine somehow survive the horrors of lavaland? Lore fluff included. + - rscadd: Central Command has listened to complaints and, as such, has now stationed + "real" Private Security Officers at centcom docks. + - rscadd: A new Nanotrasen Security Officer NPC variant is available to admins, + this 'peaceful' version will only attack people who attack it first. Great for + keeping order. + Swindly: + - bugfix: fixed not being able to attach heads without brainmobs in them + cacogen: + - rscadd: You can now rename dog beds by buckling a new owner to them + - rscadd: Dogs that spawn in an area with a vacant bed will take possession of and + rename the bed + - rscadd: Adds AI follow links to holopad speech and PDA messages. Note that PDA + messages point to the owner of the PDA and not the PDA's actual location. + - bugfix: Fixes PDA icon not showing up beside received messages for AIs + kevinz000: + - rscadd: Nanotrasen's new titanium wall blueprints are smooth enough that it can + reflect projectiles! +2017-05-29: + Joan: + - spellcheck: Renames hivelord and legion cores to 'regenerative core'. Their descs + have also been updated to be more clear. + Nanotrasen Plasmaman Outreach Division: + - tweak: plasmaman tank volume has been increased from 3 to 6. + XDTM: + - balance: Abductors have learned how to properly delete the memories of their test + subjects. + bandit: + - tweak: The officer's sabre standard in Nanotrasen captain rollouts can be used + to remove the tails of lizard traitors, or lizards in general. + oranges: + - rscadd: AI's can now hang up all holocalls at a station with alt+click +2017-05-30: + Expletive: + - rscadd: Luxury versions of the bluespace shelter capsule are now available! Purchase + them at the mining equipment vendor. + - rscadd: 'Cardboard cutouts have a new option: Xenomorph Maid' + - rscadd: Black Carpet can now be crafted using a stack of carpet and a black crayon. + - rscadd: Black fancy tables can now be crafted using Black Carpet. + - rscadd: Shower curtains can now be recoloured with crayons, unscrewed from the + floor, disassembled with wire cutters, and reassembled using cloth, plastic, + and a metal rod. + kevinz000: + - rscadd: Research and Development have recieved designs for new prototype Beam + Marksman Rifles. These rifles require a short aiming cycle to fire, however, + have extreme velocity over other weapons. + - experiment: Aiming time is 2 seconds, hold down mouse to aim, aiming time increases + if you change your aim based on angle changed, or if you move while aiming. + The weapon can not be fired while unscoped. + - rscdel: However, someone tripped and pulled out the power cord while your servers + were being updated with the latest revision of accelerator laser cannons. All + data have been lost... +2017-06-02: + Cyberboss: + - experiment: New server backend! + - tweak: Test merged PRs now show the commit of the PR at which they were merged + Expletive: + - rscadd: Adds the NT75 Electromagnetic Power Inducer, a tool which can be used + to quickly recharge many devices! They can be found in Electrical Closets, the + CE's locker, ordered by cargo, or created in RnD. + Goodstuff: + - bugfix: Fixes the crafting recipe for black carpet + - bugfix: Removed a random white dot on the black carpet sprite + Joan: + - rscadd: Goliaths, Watchers, and Legions have a small chance of dropping a kinetic + crusher trophy item when killed with a kinetic crusher. Like the boss trophy + items, these give various effects. + - tweak: Kinetic crushers recharge very slightly slower. + - rscadd: Three unique Kinetic Accelerator modules will now appear in necropolis + chests. + MMMiracles (Cerestation): + - rscadd: CereStation's Security department has been overhauled entirely thanks + to the tireless efforts of Nanotrasen's construction division. + Nanotrasen Mining Alert: + - rscadd: Nanotrasen's mining operations have created far more corpses than an entire + galaxy of cooks could hope to deal with. To solve this, we decided to just dump + them all from orbit onto the barren lava planet. Unfortunately, the creatures + called "Legion" have infested a great number of them, and you can now commonly + find the bodies of former Nanotrasen employees left behind. Additionally, there + are reports of natives, other settlers, and even stranger things found among + the corpses. + QualityVan: + - tweak: The tactical rigging in op closets is more tacticool + Shadowlight213: + - balance: The reset wire on borgs must now be cut to reset a borg's module instead + of pulsed. + - tweak: Portable pump max pressure has been lowered. + Steelpoint: + - tweak: Iron Hawk Marine no longer has Centcom all access. My mistake. + - bugfix: Fixes Iron Hawk marine carbine not having a visible sprite. + Swindly: + - balance: Nitrous oxide no longer produces water as a by-product, requires 2 parts + ammonia instead of 3, and produces 5 parts when made instead of 2. + kevinz000: + - experiment: Gang turrets now follow the mouse of the person using them! Yay! + octareenroon91: + - bugfix: Attempts to add items to a storage container beyond its slots limit will + now obtain a failure message again. +2017-06-03: + Expletive: + - tweak: Chem Dispensers now store their power in their batteries. + - tweak: Instead of being based on battery and capacitor ratings, recharge delay + for portable chem dispensers is now based on their capacitor and matter bin + ratings. + - tweak: The Seed Vault's chemical dispenser now has all the chemicals a pod person + could want. + - rscadd: The crafting menu now has subcategories! + - rscadd: Food recipe categories have been combined as subcategories of the Foods + category. + - rscadd: Weaponry and Ammunition have been combined as subcategories of the Weaponry + category. + Improvedname: + - rscadd: Janitors now start with a flyswatter + Mothership Epsilon: + - tweak: All your base are belong to us. + Penguaro: + - bugfix: '[Box] Removes extra/unattached vent from Xeno Lab' + Planned Spaceparenthood: + - bugfix: We would like to apologize for mislabeled cloning pod buttons. + WJohnston: + - bugfix: Deltastation's south nuke op shuttle location should no longer be possible + to teleport into by moving off the map and back on, and moved the rest closer + to the station. + p440: + - bugfix: Fixed duping cable coils with magic APC terminals + - bugfix: Fixed invalid icon state for empty APCs +2017-06-04: + Expletive: + - rscadd: Many stacks now update their sprite based on their amount. + - rscadd: Stacks will now weigh less if they're less than full. + - imageadd: Added new icon states for glass, reinforced glass, metal, plasteel, + plastic, plasma, plastitanium, titanium, gold, silver, adamantine, brass, bruise + packs, ointment, gauze, cloth, leather, wet leather, hairless hide, human hide, + ash drake hide, goliath hide, bones, sandstone blocks, and snow blocks. + - tweak: Some lavaland stacks' max amounts have been reduced. + - bugfix: Bulldog Shotguns should update their sprite properly when you remove the + magazine. + - bugfix: Riot suits no longer hide jumpsuits. + Joan: + - balance: Rod Form now costs 2 points, from 3. + - balance: Rod Form now does 70 damage, from 160, but gains 20 damage, per upgrade, + when upgraded. This means you'll need to spend 6 points on it to instantly crit + people from full health. + Swindly: + - balance: Chemical grenades are no longer permanently disabled after being unlocked + by wirecutters after being primed. +2017-06-05: + Expletive: + - rscadd: The Ore Redemption Machine has been ported to TGUI. New features include + the addition of "Release All" and "Smelt All" buttons. + - rscadd: The Ore Redemption Machine now be loaded with sheets of material. + - rscadd: The Ore Redemption Machine can now 'smelt' Reinforced Glass. + Joan: + - balance: Only human and silicon servants can help recite multi-invoker scriptures. + This means cogscarabs, clockwork marauders, and anima fragments DO NOT COUNT + for scriptures that require multiple invokers. + - balance: Clockcult scripture tiers can no longer be lost by dipping below their + requirements once they are unlocked. + - rscdel: Removes Revenant scriptures entirely. + MMMiracles: + - tweak: Deepstorage ruin has been redone to be more self-sufficient and up to better + mapping standards. +2017-06-06: + Joan: + - rscadd: Added a new unique Kinetic Accelerator module to necropolis chests. + - spellcheck: Renames Clockwork Proselytizers to Replica Fabricators. + - balance: Replica Fabricators can directly consume floor tiles, rods, metal, and + plasteel for power instead of needing to convert to brass first. + - balance: Cogscarabs can no longer use guns. + - tweak: KA modkits in necropolis chests are now design discs with designs for those + modkits, to force miners to bring back minerals. + PKPenguin321: + - bugfix: The fake pits that the arcade machines can vend now vend properly, for + real this time. + Robustin: + - rscadd: The cult master has finally acquired their 3rd spell, Eldritch Pulse. + This ability allows the cult master to quickly teleport any cultist or cult + structure in visual range to another tile in visual range. This spell has an + obvious spell effect that will indicate where the target has gone but without + explicitly revealing who the master is. This spell should assist with moving + obstinate cultists off an important rune, getting wandering cultists back onto + an important rune, save a cultist from an untimely arrest/summary execution, + assist in getting your allies into secure areas, etc. + - bugfix: The void torch now only works on items that have been placed on surfaces, + this prevents the inventory bugs associated with this item. + thefastfoodguy: + - tweak: you can burn your brains out with a flashlight if you're tired of life +2017-06-07: + Expletive: + - rscadd: New plasma medals have been added to the Captain's medal box. Don't get + them too warm. + - imageadd: New sprites for plasma medals. + - imageadd: Icon and worn sprites for all medals and the lawyer's badge have been + improved. Worn medals more closely match their icons. + - tweak: The bone talisman is an accessory again, so it's not useless. + - imageadd: It also has a new worn sprite, based on an arm band. + - imagedel: Ties have been removed from accessories.dmi and vice versa. Same for + the explorer's webbing sprites that were in there. ties.dmi is now neck.dmi, + and has sprites for scarves, ties, sthetoscopes, etc. + - tweak: Examining an accessory now tells you how to use it. + Joan: + - spellcheck: Renamed Volt Void to Volt Blaster. + - tweak: Volt Blaster does not consume power when firing and does not cause backlash + if you don't fire. + - balance: Volt Blaster does 25 damage, from 20-40 depending on power, and has 5 + shots, from 4, over its duration. + QualityVan: + - bugfix: Surplus rifles are no longer invisible while unloaded + Shadowlight213: + - balance: The Changeling Transformation Sting is once again stealthy. However, + it no longer transfers mutations. + - balance: The chemical cost of Transformation Sting has been increased to 50 +2017-06-08: + 4dplanner: + - bugfix: traitors show up on antagHUD + Expletive: + - tweak: The detective's flask has Hearty Punch instead of whiskey. + - bugfix: The Detective's fedora no longer clips with hair. + - imageadd: Adds 91 new sprites to fix clipping issues with the Detective's fedora + and hair. + - imageadd: Change the standard fedora to match the detective and treasure hunter + variants. + - tweak: Detective, Treasure Hunter, and standard fedoras now all benefit from new + sprites. + Joan: + - balance: Tinkerer's Daemons are no longer totally disabled if you drop below the + servant requirement. + - balance: Instead, Tinkerer's Daemons will disable until the number of active daemons + is equal to or less than one-fifth of the living Servants. + - tweak: Tinkerer's Daemons produce components very slightly slower. + - rscadd: Added Prolonging Prism as an application scripture. + - balance: Prolonging Prism will delay the arrival of an emergency shuttle by 2 + minutes at the cost of 2500W of power plus 75W for every 10 CV and 750W for + every previous activation. In addition to the high cost, it very obviously affects + the shuttle dock and leaves an obvious trail to the prism. + - balance: Script scripture now requires 6 Servants to unlock, from 5, and Application + scripture now requires 9 Servants to unlock, from 8. + Lzimann + Cyberboss: + - experiment: Ported goonchat. Much less laggy and crashy than BYOND chat. + Frills! + NanoTrasen Public Relations Department: + - rscadd: A mining accident has released large amounts of space dust, which is starting + to drift near our stations. Don't panic, it's probably safe. + Nanotrasen Plastic Surgery Advert: + - rscadd: Are you a mutant? Were you born hideously deformed? Do you have ears growing + out of the top of your head? Or even a tail? Don't worry, with our patented + surgical techniques, Nanotrasen's highly trained medical staff can make you + normal! Schedule an appointment, and one of our surgeons can see you same day. + - balance: Cat ears now give you double the ear damage. + QualityVan: + - bugfix: Cremators now still work when there's only one thing in them + - bugfix: The ORM now uses the intended amount of resources when making alloys + - rscdel: Cyborgs can no longer alt-click their material stacks to split them + Robustin: + - balance: The blood cult can only attempt to summon Nar-Sie in one of three rooms + that are randomly selected at round-start. + Shadowlight213: + - rscadd: Tracking implants and chem implants have been added to rnd + - rscdel: Adrenaline and freedom implants have been removed from rnd + Xhuis: + - tweak: Defibrillator paddles will no longer stick to your hands, and will snap + back onto the unit if you drop them somehow. + lzimann: + - rscdel: Xeno queens can no longer be maids + oranges: + - rscadd: Added stungloves to the brain damage lines +2017-06-09: + Nanotrasen Shiny Object Appreciation Club: + - rscadd: The RD and HoS now receive medal lockboxes in their lockers, containing + science and security medals, respectively. + Tacolizard and Cyberboss, idea by RandomMarine: + - rscadd: You can now add a commendation message when pinning a medal on someone. + - rscadd: Medal commendations will be displayed when the round ends. + - tweak: Refactored the outfit datum to allow accessories as part of an outfit. + - bugfix: The Captain spawns with the Medal of Captaincy again. + TrustyGun: + - rscadd: Some of the clown's toys have been moved into a crate in the theater. + If you think you are missing something, check in there. + - rscadd: Wooden crates have been added. You can construct them with 6 wooden planks, + and deconstruct them the same way as regular crates + oranges: + - tweak: Security minor and major crime descriptors are now a single line input, + making it easier to add them + - tweak: Medical record descriptions are single inputs now +2017-06-11: + Expletive: + - imageadd: Glass tables are shinier + Nanotrasen Consistency Affairs: + - bugfix: You no longer see yourself in place of the user when examining active + Spirit Sight runes. + Shadowlight213: + - bugfix: Cloning dismembered heads and brains now respects husking and other clone + preventing disabilities. + WJohn: + - bugfix: It is now easier to wire the powernet into box's telecomms SMES cell. + Xhuis: + - rscadd: You can now pin papers and photos to airlocks. Anyone examining the airlock + from up close can see the details. You can cut them down with wirecutters. + lordpidey: + - rscadd: Added F.R.A.M.E. cartridge to uplinks. This PDA cartridge contains 5 + viruses, which when used will unlock the target's PDA into a syndicate uplink, + in addition, you will receive the code needed to unlock the uplink again, if + you so desire. + - rscadd: If you use telecrystals on a F.R.A.M.E. cartridge, the next time it is + used, it will also give those crystals to the target uplink. + octareenroon91: + - bugfix: Mecha tools now respond to MMI control signals as intended. + shizcalev: + - tweak: '"Species immune to radiation are no longer compatible targets of radiation + based DNA injectors."' + - bugfix: '"A gun''s firing pin will no longer malfunction when placed into your + own mouth. Phew!"' + - imageadd: '"Bedsheets capes are now slightly more accurate. Be jealous of the + clown and their sexy cape!"' +2017-06-13: + Expletive: + - tweak: Paper planes are now the same color as the paper used to make them. + - bugfix: Flashdarks can no longer be used to examine head based organs. + Fox McCloud: + - tweak: Tweaked game options animal speed value to match live server + Joan: + - spellcheck: Renamed AI liquid dispensers to foam dispensers. + - tweak: Foam dispensers now activate immediately when clicked, rather than forcing + the user to go through a menu. They also have better visual, message, and examine + feedback on if they can be activated. + MrStonedOne: + - experiment: Added some code to detect the byond bug causing clients to send phantom + actions shortly after connection. It will attempt to fix or work around the + issue. + Nanotrasen Robotics Department: + - rscadd: To aid in general-purpose cleaning and maintaining of station faculties, + all janitor cyborgs are now outfitted with a screwdriver, crowbar, and floor + tile synthesizer. + WJohnston: + - bugfix: Survival bunker ruin's power now works, mostly. + shizcalev: + - tweak: '"Radiation immune species are now incompatible with the radiation based + genetics DNA scanner/modifier."' +2017-06-14: + Expletive: + - rscadd: The medalboxes are now fancy. + - imageadd: New sprites for opened medal boxes. + Joan: + - tweak: Being converted to clockcult will briefly cause your world to turn yellow + and you to hear the machines of Reebe, matching the description in the messages. + - spellcheck: The messages for being converted and for failing conversion to clockcult + have been updated. + Tacolizard: + - bugfix: Flamethrowers no longer say they're being ignited when you extinguish + them +2017-06-17: + Cyberboss: + - tweak: NT now provides education on the proper response for experiencing the excrutiating + pain of varying degree burns (You scream when burning) + Expletive: + - rscadd: The Captain now starts with a deluxe fountain pen in their PDA. + - rscadd: The quartermaster, curator, research director, lawyer, and bartender start + with normal fountain pens in their PDAs. + - rscadd: Cargo can order fountain pens via the Calligraphy Crate. + - rscadd: Nerds on the station will be pleased to know they now have pocket protectors. + - bugfix: Cryo cells work properly on mobs with varying max health values. + Joan: + - rscdel: Cultists must be human to run for Cult Master status. + - tweak: The Hierophant is a little less chaotic and murdery on average. + LanCartwright: + - rscadd: Penguins, penguin chicks, penguin eggs. + - rscadd: Penguin family to Winter Wonderland. + MrStonedOne and Lummox JR: + - bugfix: Fixed icon scaling and size preferences not loading (Technically size + preferences were loading because byond saves that locally, but that's not reliable + because ss13 shares a hub) + QualityVan: + - rscadd: The botany vending machine now has a stock of onion seeds + RandomMarine: + - tweak: RCDs now always use matter consistent with the material needed when building. + - tweak: Floors now cost 3 or 1 matter to build, based on if a lattice exists on + the tile. + - tweak: Reinforced windows cost 12 matter. Normal windows cost 8 matter. (Both + up/down from 10) + - tweak: Glass airlocks cost 20 matter. + - tweak: RCDs are faster at building grilles and plain glass windows. + Steelpoint: + - tweak: Slightly reshuffles the Head of Security's, and Research Directors, locker + to place fluff items below essential items. + Tacolizard: + - rscdel: Flashes no longer have a tech requirement + That Really Good Soda Flavor: + - bugfix: High luminosity eyes will have material science instead of an error research + type + Thunder12345 and Improvedname: + - rscadd: You can now turn severed cat tails and ears into genuine kitty ears + - rscadd: Cat tails can now be used to make a cat o' nine tails, similarly to the + liz o' nine tails. + Xhuis: + - spellcheck: The names of the hand drill, jaws of life, and emitter are now lowercase. + - spellcheck: The descriptions of the hand drill, jaws of life, and emitter have + been changed to be more descriptive and less lengthy. + - rscadd: Tablets with IDs in them now show the ID's name when examining someone + with that tablet in their ID slot, similar to a PDA would. + bandit: + - tweak: Default short/medium/long brig times are now, in order, 2, 3, and 5 minutes. +2017-06-18: + Expletive: + - tweak: Stacks of space cash now tell you their total value and their value per + bill when you examine them. + RandomMarine: + - tweak: Compressed matter cartridge production costs now reflect their material + worth at basic efficiency. + - bugfix: Compressed matter cartridges can now be exported. + Xhuis: + - bugfix: Puny windows will no longer stop the progress of Ratvar. +2017-06-19: + Expletive: + - rscadd: Paper frames can be created using wood and paper, and can be used to create + decorative structures. + - rscadd: Natural paper can now be crafted + - rscadd: KorPhaeron can now start a maid cafe, if they so desire. + - rscadd: Thanks to the invention of "Bill slots", vending machines can now accept + space cash. + - tweak: The Clown and Mime can now find their unique crayons stored inside their + PDAs + LanCartwright: + - rscadd: 1D4 into Lavaland Mining base crate. + RandomMarine: + - tweak: Bonfires now work on lavaland! + Tacolizard: + - rscadd: Repurposed the action button tooltip code to add tooltips with the examine + details of all held and equipped items. Hover your mouse over any item equipped, + held or in your inventory to examine it. + - rscadd: Examine tooltips can be toggled with the 'toggle-examine-tooltips' verb, + which can be typed or accessed from the OOC menu. + - rscadd: You can change the delay before a tooltip appears with the 'set-examine-tooltip-delay' + verb, also accessible via the OOC menu. The default delay is 500ms. +2017-06-20: + Bawhoppen: + - bugfix: Grenade belts and bandoliers will no longer obscure half the screen when + they're completely filled. + LanCartwright: + - rscdel: Removed loot drops from Syndicate Simple mobs. + Tacolizard: + - rscadd: Some items now have custom force strings in their tooltips. + - bugfix: items with no force can still use a custom force string. + Xhuis: + - bugfix: The station's heaters and freezers have been sternly reprimanded and will + now drop the correct circuit boards and cable coils. + - rscadd: The straight jacket now takes five seconds to put on. + - bugfix: The display cases in luxury shelter capsules will no longer spawn unobtainable, + abstract offhand objects. + - bugfix: Disablers now have an in-hand sprite. + nicbn: + - imageadd: Changed cryo sprites to Bay cryopods, which show the person inside of + them. +2017-06-22: + Bawhoppen: + - rscadd: Dressers are now constructable, and unanchorable with a wrench. + ClosingBracket: + - spellcheck: Fixes small typographical errors on flight suits and implanters. + Ergovisavi: + - tweak: Nanofrost setting and metal foam synthesizer on the Atmos watertank backpack + changed to "Resin", which is a solid, but transparent structure similar to metal + foam that scrubs the air of toxins, regulates temperature, etc + - tweak: Atmos holobarrier device swapped out for an Atmos holo-firelock device, + which creates holographic firelocks that prevent atmospheric changes from going + over them + Expletive: + - tweak: Flame thrower plasma tanks can be removed with alt-click. + Lordpidey: + - bugfix: True and arch devils are no longer deaf. + - bugfix: Fixed some edge cases with devils getting two sets of spells. + - bugfix: True/arch devils can now instabreak cuffs. + - rscadd: The codex gigas now indicates if a devil is ascendable or not. + - tweak: Hellfire has been buffed, it now explodes multiple times. + Nanotrasen Robotics Department: + - tweak: Traitor AIs' malfunction modules have received a firmware update and are + more responsive, with HUD buttons and more sensible menus. + - tweak: Overload and Override Machines now function differently; instead of right-clicking + a machine to choose a context menu option, you activate the ability, which lets + you left-click on a machine to overload or override it. This also changes your + cursor. + Xhuis: + - rscadd: Alt-clicking the Show/Hide Actions button will now reset the positions + of all action buttons. + - rscadd: Hints to the two shortcuts for action buttons are now included in the + Show/Hide Actions button's tooltip. + - rscadd: (As a reminder, that's shift-click to reset the clicked button, and alt-clicking + the Show/Hide Actions button to reset it and all the others!) + - spellcheck: The names of several objects, such as the holopad and biogenerator, + have been lowercased. + - spellcheck: Added some descriptions to a few objects that lacked them. + - rscadd: Tablets now have a built-in flashlight! It can even change colors, as + long as they're light enough in hue. + bandit: + - rscadd: Nanotrasen researchers have made the breakthrough discovery that Lavaland's + plants are, in fact, plants, and can be harvested with seed extractors. + ohnopigeons: + - bugfix: After a janitorial audit Nanotrasen has decided to further cut costs by + removing the janicart's secret space propulsion functionality +2017-06-23: + BeeSting12: + - bugfix: The clowndagger now has the correct skin. + MrStonedOne: + - tweak: Makes old chat show while goonchat loads. Should goonchat fail to load, + the old chat will still be operational. +2017-06-25: + Expletive: + - rscadd: Adds the skull codpiece, which can be crafted from parts of lavaland monsters. + - rscadd: Maid Costume aprons can now be detached and reattached to any uniform. + Improvedname: + - rscadd: You can now export cat ears/tails for 1000 credits + JJRcop: + - bugfix: Fixed telekinesis remote item pick up exploit + Kor: + - rscadd: Robotic legs now let you use pockets without a jumpsuit, and a robot chest + now lets you use the belt slot and ID slot without a jumpsuit. + RandomMarine: + - rscadd: Cargo can now export mechs! + Steelpoint: + - rscadd: Station Engineers spawn with a Industrial Welder in their toolbelt. + - tweak: Engineering Welder Locker now only holds three standard Welders. + - rscadd: An old Nanotrasen Space Station has quietly reawoken its surviving crew + one hundred years after they fell to slumber. Can the surviving crew, using + old, broken and out of date equipment, overcome all odds and survive, or will + the cold embrace of the stars become their new home? + - tweak: Nanotrasens Corps of Engineers has refitted and refurbished NTSS Boxstations + Engineering area into, what Centcom believes, a more efficient design. + That Really Good Soda Flavor: + - experiment: Added the ability for a holiday to start on the nth weekday of a month. + - experiment: Allahu ackbar! Added the ability to calculate Ramadan. + - rscadd: Added Thanksgiving, Mother's Day, Father's Day, Ramadan, and Columbus + Day to the possible holidays. + - bugfix: Fixed nuclear bombs being radioactive. + Xhuis: + - rscadd: You can now unfasten intercoms from walls and place them elsewhere on + the station. + - rscadd: Intercom frames can now be created at an autolathe for 75 metal and 25 + glass. + - bugfix: Nearly-full goliath hide stacks now correctly have a sprite. +2017-06-27: + Ergovisavi: + - bugfix: Fixed a few anomalous crystal effects + - bugfix: Fixes stacking atmos resin objects in a single tile + - tweak: Lasers now go through atmos resin objects + Joan: + - tweak: The Necropolis has been rethemed. + Kor: + - rscadd: Added dash weapons, which let you do a short teleport within line of sight. + - rscadd: The ninjas energy katana now lets him dash. He can no longer teleport + with right click. + - rscadd: Glass shards will no longer hurt people with robotic legs. + - rscadd: Mesons work on lavaland again. + Xhuis: + - spellcheck: The names of most glasses, like mesons, t-ray scanners, and night + vision goggles, have been lowercased. + - spellcheck: The thermonocle's description now changes based on the gender of the + person examining it. + - bugfix: Straight jackets can now properly be put onto others. + drline: + - bugfix: Nanotrasen finally sent out IT personnel to plug your modular consoles + back in. You're welcome. +2017-06-28: + Cyberboss: + - rscdel: Cortical borers have been removed + Shadowlight213: + - rscadd: There is now a new monitor program that engineers can use to monitor the + supermatter status + Tacolizard: + - rscadd: NanoTrasen has now outfitted their employees with Extra-Loud(TM) Genetically + Modified Hearts! Now you can hear your heart about to explode when the clown + shoots you full of meth, or hear it slowly coming to a stop as you bleed out + in critical condition after being toolboxed by an unknown gas-mask wearing assistant. +2017-07-07: + Ergovisavi: + - tweak: Added a recovery window after some variable length megafauna attacks + - rscadd: Adds a new mob to the game, the "leaper" + - rscadd: Adds another planetstation mob, the "wanderer/mook" to the backend + - bugfix: Fixes a problem with player controlled leapers where they occasionally + can't fire + Joan: + - tweak: Rethemes the ash walker nest to match the Necropolis. + - balance: Chasms, asteroid turfs, basalt, and lava can no longer be made wet. + - rscadd: A strange new Resonant Signal has appeared on lavaland. + - tweak: Dreams while sleeping are now slightly longer on average and will contain + more possibilities. + - rscadd: Bedsheets may affect what you can dream. + Lexorion: + - imageadd: The portable PACMAN generators now have new icons, including on and + off states. + More Robust Than You: + - rscadd: Nanotrasen has added lids to their soda that POP! when opened. Up to 3 + possible sounds! + - bugfix: brain damage should no longer attempt to emote/say things while unconcious + NanoTrasen Smithy Department: + - soundadd: Tasked by corporate heads to make NanoTrasen's line of captain rapiers + flashier, a few brave smiths have managed to forge their steel in a way that + enhances their swords' acoustic properties. + Shadowlight213: + - rscdel: The majority of the tiny fans on Deltastation have been removed. + - tweak: Airlocks going to space, and secure areas like the bridge and sec on Delta + have been given the cycling system. + - balance: The freedom suit no longer slows you down and can withstand the FIRES + OF LIBERTY! + Steelpoint (Ancient Station): + - rscadd: Major changes to Ancient Station include new sounds for the prototype + RIG hardsuit, the NASA Engineering Voidsuit slowing the user down properly and + new insulated gloves in engineering. + - rscadd: Several minor changes, such as an extra oxygen tank, spawn in equipment + and minor tile changes. + Supermichael777: + - balance: The AI swap menu is now given to the person with the multi-tool rather + than the Borg. Old behavior remains for all non multi-tool sources + - bugfix: Borgs and shells now notify when un-linked due to the wire being cut. + Tacolizard: + - bugfix: Nanotrasen has begun a program to inform the souls of the departed that + their hearts can't beat after death. + - bugfix: heartbeat noises now loop (i can't come up with any dumb fluff for this + one sorry) + That Really Good Soda Flavor: + - bugfix: Martial arts will no longer be transferred in cloning, etc. if they are + temporary (i.e. wrestling, krav maga). + Xhuis: + - tweak: Recollection has been separated into categories and should be easier to + read and more informative. + - bugfix: Ratvar has been reminded that he hates Nar-Sie and will now actively pursue + fighting her. + - bugfix: You can now properly dig out plants from patches of soil. + - bugfix: Reskinnable guns no longer become invisible after firing a single shot. + - bugfix: The kinetic crusher and other forced two-handed objects can now correctly + be stored in a bag of holding. + - bugfix: Positronic brains' icons will now properly change depending on status. + - tweak: Positronic brains will now stop searching as soon as they're occupied. + - tweak: Positronic brains now have error messages if activating them fails for + whatever reason. + - bugfix: Unconscious Servants are now properly informed when they're deconverted. + - bugfix: The Voice of God no longer specifically targets creatures like constructs + and clockwork marauders. + - bugfix: Heartbeat sounds no longer play indefinitely if your body is destroyed. + kevinz000: + - rscadd: Headphones have been provided to the station in Autodrobes, mixed wardrobes, + and fitness wardrobes. Please use them responsibly, and remember to focus on + your job above all else! + - experiment: Headphones fit in head, ears, OR neck slots! + ohnopigeons: + - bugfix: Nanotrasen Electronics have fixed a bug where issued factory-fresh PDAs + did not link to their cartridges, requiring manual reinsertion. + shizcalev: + - balance: Nanotrasen has upgraded the obsolete teleporter consoles on most NT branded + stations with newer ones preloaded with the newest Supermatter monitoring application! + - soundadd: The supermatter base now has a speaker and will provide audio cues as + to it's current status! + somebody: + - rscadd: Strong plasma glass windows +2017-07-09: + Crexfu: + - tweak: 2 plasma sheets have been added to viro break room on box + More Robust Than You: + - bugfix: Plasma and Reinforced plasma glass no longer merge with Normal and Reinforced + Glass + Xhuis: + - bugfix: You can no longer catch objects that require two hands at all times with + only one hand. +2017-07-11: + RandomMarine: + - rscadd: Drones can now switch between help and harm intent. + Tacolizard: + - rscadd: Admins can now set a message/warning when they delay the round end, to + be shown to anyone who tries to reboot the world. + Tacolizard and Cyberboss: + - rscadd: Added two new organs, the liver and stomach. Without them, you won't metabolize + chemicals. + - rscadd: The liver is responsible for processing all chemicals except nutrients. + If your liver is removed, you will be unable to metabolize any drugs and will + slowly die of toxin damage. + - rscadd: Drinking too much alcohol or having too many toxins in you will damage + your liver, if it becomes too damaged, it will undergo liver failure and you + will slowly die of toxin damage. Your liver naturally heals a small amount of + its damage. However, it doesn't heal enough to offset stronger alcohols or large + amounts of toxins, at least until they are metabolized out of your body. + - rscadd: to conduct a liver transplant, inject corazone into the patient. Corazone + will prevent the patient from taking damage due to either not having a liver + or undergoing liver failure. Corazone will metabolize out of the patient quickly, + so at least 50u is recommended. + - rscadd: The stomach is responsible for metabolizing nutrients. Without a stomach, + you will be unable to get fat, but you will also be unable to process any nutrients, + meaning you will eventually starve to death. + Xhuis: + - bugfix: Mobs spawned by Necropolis curses are now immune to chasms. + - tweak: The BoxStation warden's office now has a crew monitoring console. + - imageadd: Clockwork slabs now show icons of the components used in scripture instead + of initials. + factoryman942: + - bugfix: Boxstation Robotics now has 6 flashes, from 2. + - bugfix: Metastation Robotics now has 40 sheets of glass, instead of 20. + shizcalev: + - tweak: The supermatter reporting system has been updated to report remaining integrity, + as opposed to how unstable the SM currently is. +2017-07-18: + BeeSting12: + - tweak: Deltastation's auxiliary storage in arrivals can be accessed by anyone + now. + - bugfix: Deltastation's cargo bay maintenance can now be accessed by cargo techs. + Dannno/Supermichael777/InsaneHyena: + - rscadd: You can now pick from a few different styles when augmenting someone with + robot parts by putting them in the augment manipulator. Alt+click to take parts + out. + Ergovisavi: + - bugfix: Fixed the refresher variant of the anomalous crystal making holodeck items + real + Fox McCloud: + - rscdel: blood and gibs on turfs can no longer infect nearby people + - tweak: Tuberculosis bypasses species virus immunity (it's not a virus!) + - tweak: Disease and appendicitis events no longer infect clientless mobs + - tweak: Disease event will no longer pick virus immune mobs + - tweak: Appendicitis event will no longer pick mobs without an appendix + - bugfix: Fixed changeling panacea curing non-harmful viruses + - bugfix: Fixes IV drips not properly injecting the right amount of blood + Joan: + - rscdel: Removed the Soul Vessel, Cogscarab, and Anima Fragment Scriptures. + - bugfix: The Ark of the Clockwork Justicar will still forcibly take up a 3x3 area + even if it still needs components to activate. + MrStonedOne & Fox-McCloud: + - tweak: Made pathfinding much quicker + NewSta: + - bugfix: Fixes the maid apron being invisible when in-hand or attached to the maid + outfit. + XDTM: + - experiment: Viruses and symptoms have been havily reworked. + - rscadd: Symptoms now have statistic thresholds, that give them new properties + or improve their existing ones if the overall virus statistic is above the threshold. + Check the pull request in github or the wiki (soon) for the full list. + - rscdel: Some symptoms no longer scale linearly with stats, and instead have thresholds. + - tweak: The symptom limit is now 6. + - rscdel: Viruses can no longer be made invisible to the Pandemic + - tweak: Symptoms no longer trigger with a 5% chance every second, but instead have + a minimum and maximum number of seconds between each activation, making them + more consistent. + - rscdel: The symptoms Blood Vomit and Projectile Vomit have been removed, and are + now bonuses for the base Vomit symptom. + - rscdel: The Weakness symptom has been removed as it was completely useless. + - tweak: The Sensory Destruction symptom has been reworked into Narcolepsy, which + causes drowsiness and sleep. + - tweak: Viral Aggressive Metabolism now has a timer before it starts decaying the + virus. It scales with the highest between Resistance or Stage Speed. + - rscadd: You can now neuter symptoms, making them inactive. They will still affect + stats. Adding formaldehyde to a virus will neuter a random symptom. A bottle + of formaldehyde starts in the virus fridge. + Xhuis: + - tweak: The tachyon-doppler array's rotation now has messages, sprites, and examine + text. + - bugfix: Time stop is now fixed, finally! + - soundadd: Time stop's sound now plays in reverse when the effect ends. + - bugfix: Missiles can no longer ricochet off of shuttle walls, etc. + - bugfix: Winter coats now hold all flashlights properly, instead of seclites. + Xhuis & Cyberboss: + - rscadd: New hivebot invasion event + kevinz000: + - rscadd: Personal Cabinets now have piano synthesizers for handheld piano playing. + - experiment: Thank @nicbn for the sprites! + ninjanomnom: + - experiment: Thank you for updating your ShuttlSoft product! Your last update was + -ERROR- years ago. A full changelog can be found at CYG10408.SHSO.b9 along with + the EULA. This update lays a foundation for new things to come and a sample + in the form of new and improved docking procedures. + shizcalev: + - bugfix: Cerestation's emergency shuttle autopilot will no longer fly you in reverse + back to Centcom! +2017-07-27: + Anonmare: + - bugfix: Informs a person about how bomb cores work + BeeSting12: + - rscdel: Water bottles from the sustenance vendor are gone. Wait for the ice in + the ice cups melt, criminal scum. + - rscdel: There is no longer a sink in gulag. Hygiene is for the moral members of + society. + - tweak: Janitor and service cyborgs now get pocket fire extinguishers for fire + suppression and space propulsion. + - rscadd: Pubbystation's dorms now has a dresser. + - bugfix: Crafting satchels from leather now makes a leather satchel rather than + a regular satchel. + Fox McCloud: + - tweak: breathing plasma now causes direct tox damage + - tweak: breathing hot/cold air now warns you when you're doing so, again + - tweak: species heat/cold mod now impacts damage from breathing hot/cold gases + HAL 9000: + - bugfix: I'm sorry Dave, I'm afraid I can't do that + JStheguy: + - imageadd: Resprited the tablet, including completely redone screen sprites. + - rscadd: Tablets can now come spawn in one of 5 colors; red, green, yellow, blue, + and black. + - imageadd: Most alcohol bottles have been resprited, as well as a poster that used + one of the current bottles as part of it's design. + Joan: + - balance: Unwrenching clockwork structures no longer damages them. + - tweak: The Hierophant will now release a burst when melee attacking instead of + actually hitting its target. + - bugfix: The Hierophant Club's blasts will now properly aggro hostile mobs. + - tweak: The blood-drunk miner will fire its KA a bit more often. + PopNotes: + - soundadd: Nar-Sie now sounds like an eldritch abomination that obliterates worlds + instead of a sweet maiden that gently whispers sweet nothings in your ear. + Supermichael777: + - bugfix: delayed chloral hydrate actually works now. + Tacolizard: + - rscadd: Added cybernetic organs to RnD, they can be used to replace organic organs. + Remember to administer corazone during implantation though! + - rscadd: Added the upgraded cybernetic liver. It is exceptionally robust against + toxins and alcohol poisoning. + Xhuis: + - bugfix: Cyborgs now regenerate oxygen damage. + - bugfix: If a cyborg somehow takes toxin damage, it can be healed with cables as + though it was burn damage. + - spellcheck: Picking up ores by walking over them now longer spams messages, instead + showing one message per tile of ore picked up. + - tweak: You can now control-click action buttons to lock them and prevent them + from being moved. Alt-clicking the "Show/Hide Actions" button will unlock all + buttons. + - tweak: There is now a preference for if buttons should be locked by default or + not. + - rscadd: Pizza box stacks can now fall over + - imageadd: Pizza box inhands now stacks depending on how many you're holding. + - bugfix: Mining satchels no longer hold infinite amounts of ore. + - bugfix: Reviving Stasis now consistently regenerates organs. + - bugfix: Medibots now properly render the overlays of the medkits they are made + from. + - bugfix: The latest batch of Syndicate screwdrivers fell into a vat of paint and + were colored randomly. We have rinsed them off and they will no longer come + in random colors. + - bugfix: Supermatter slivers can now be stolen properly. + - tweak: Whenever you're trying to hack off your own limbs, you'll now always hit + those limbs. + Xhuis & MoreRobustThanYou: + - imageadd: Toolbelts now have overlays for crowbars, wirecutters, screwdrivers, + multitools, and wrenches. + Y0SH1_M4S73R: + - bugfix: Romerol zombies count as dead for assassinate and maroon objectives. + bandit: + - rscadd: New Cards against Spess cards are available! + ktccd: + - bugfix: Hijacking should now be possible again! +2017-07-29: + Fox McCloud: + - rscadd: Sound should carry further, but should get quieter and quieter the further + you are from it + Joan: + - tweak: Sigils of Transmission can now drain power in a large area when activated + by a Servant. + - rscdel: Interdiction Lenses have been removed, as they were largely only used + to drain power into Sigils of Transmission. + - balance: Sigils can no longer directly be removed by Servants. + - balance: Prolonging Prisms have a higher cost to delay, but no longer increase + in cost based off of CV. + - balance: Base delay cost changed from 2500W to 3000W, cost increase per activation + changed from 750W to 1250W, cost increase per 10 CV changed from 75W to 0W. + - rscdel: Removed the Volt Blaster scripture. + - rscdel: Ratvarian spears can no longer impale. + - balance: Vitality Matrices now require a flat 150 Vitality to revive Servants, + from 20 + the Servant's non-oxygen damage. Vitality Matrices are also no longer + destroyed when reviving Servants. + - balance: Ratvarian spear damage changed from 18 to 20, Ratvarian spears now generate + 5 Vitality when attacking living targets. Ratvarian spear armour penetration + changed from 0 to 10. + - balance: The Judicial Visor's mark now immediately applies Belligerent and knocks + down for 0.5 seconds. Mark exploding no longer mutes, mark explosion stun changed + from 16 seconds to 1.5 seconds, mark explosion damage changed from 10 to 20. + More Robust Than You: + - rscadd: Nanotrasen has begun production of the Rapid Cable Layer, a tool that + helps you lay down cables faster + - rscadd: You can now craft ghetto RCLs with metal, a screwdriver, welder, and wrench. + They hold less cable, and may fall apart or jam! + Xhuis: + - spellcheck: Player-controlled medibots now receive a notice whenever they try + to heal someone with too high health. + - bugfix: Syringes now properly inject targets wearing thick clothing on different + slots. + - bugfix: Stun baton overlays now appear on security belts when active. + kevinz000: + - rscadd: 'Badmins: Buildmode map generators have names in the list to select them, + instead of paths.' + - rscadd: Also, a new map generator has been added, repair/reload station. Use it + VERY sparingly, it deletes the block of the map and reloads it to roundstart. + THIS CAN CAUSE ISSUES WITH MACHINES AND ATMOSPHERICS, SO DO NOT USE IT UNLESS + YOU ABSOLUTELY HAVE TO! + - experiment: The reload station one tagged DO NOT USE shouldn't be used as it doesn't + delete anything before loading, so if you use it you'll have two copies of things. + That can result in a LOT of issues, so don't use it unless you're a codermin + and know what you're doing/abusing! + ktccd: + - bugfix: Ashstorms no longer pierces the protected people to kill anyone/anything + in them. +2017-08-06: + Anonmare: + - rscadd: Surgical toolarm to protolathe and exofab + - tweak: Toolarm tools are less robust but more efficient at surgery + - tweak: Arm augments are no longer a huge item + AnturK: + - balance: Cyborg remote control range is now limited to 7 tiles. + Ergovisavi: + - rscadd: Adds the "seedling" planetstation mob to the backend + Floyd: + - bugfix: No longer does everyone look like a sick, nauseated weirdo! + Galactic Corgi Breeding Mills, LLC: + - bugfix: Fixed corgis being able to wear spacesuit helmets despite lacking the + proper code and sprites for them. + Joan: + - tweak: Colossus's shotgun is now a static-spread blast of 6 bolts, making it more + predictable. + - balance: Geis now mutes for 12-14 seconds and "stuns" the target, via a binding + effect, for 25 seconds instead of initiating a conversion. + - experiment: Geis's "stun" restrains the target and prevents them from taking actions, + but its duration is halved if the binding is not being pulled by a Servant. + - wip: Using Geis on a target prevents you from taking actions other than attempting + to pull the binding. If you are pulling the binding, you can dispel it at any + time. + - wip: As should be obvious, if the binding is destroyed or dispelled, you can once + again take normal actions. + - tweak: Sigils of Submission are now permanent and have been moved from the Script + tier to the Driver tier, with an according cost adjustment. They still do not + penetrate mindshield implants. + - rscdel: Removed Taunting Tirade. + - rscdel: Removed Sigils of Accession. + Lexorion: + - imageadd: Hearty Punch has a new, fancier sprite. + More Robust Than You: + - bugfix: RCL and Ghetto RCLs are no longer invisible + - bugfix: RCL action button now has a sprite + - bugfix: RCLs can no longer go inside you + XDTM: + - bugfix: Eyes can now be properly damaged. + Xhuis: + - spellcheck: Removed an improper period from the supermatter sliver theft objective's + name. + - bugfix: Alien hunters can no longer pounce through shields. + - bugfix: Observing mobs that have no HUD will no longer cause intense lighting + glare. + - bugfix: Objects on shuttles now rotate in the correct directions. + - soundadd: The speakers in the ceiling have been upgraded, and many sounds are + now less tinny. + Xhuis and oranges: + - bugfix: Banana cream pies no longer splat when they're caught by someone. + - soundadd: Throwing a pie in someone's face now has a splat sound. + kingofkosmos: + - bugfix: Fixed hair sticking through headgear. +2017-08-13: + JStheguy: + - imageadd: Laptops now have actual sprites for using the supermatter monitoring + instead of defaulting to a generic one. + Joan: + - imageadd: Belligerent now has a visible indicator over the caster. + More Robust Than You: + - tweak: Mulligan and non-continuous completion checks will not consider afk/logged + out people to be "living crew". + - tweak: The wiki button now asks what page you want to be taken to + - tweak: His Grace now shows up on the orbit list + Pubby: + - rscadd: The Curator job is now available on PubbyStation + - rscadd: Beekeeping has been added to PubbyStation's monastery + - tweak: PubbyStation's bar has been rearranged + Xhuis: + - bugfix: Swarmer shells now have ghost notifications again. + - bugfix: Minebots no longer lack icons for their action buttons. + kingofkosmos: + - imageadd: Adds icon_states to the unused and used Eldritch whetstones. Sprites + by Fury McFlurry. +2017-08-14: + Joan: + - imageadd: Ported CEV-Eris's APC sprites. + More Robust Than You: + - bugfix: Fixes a typo in the blobbernaut spawn text + WJohnston: + - rscadd: Adds an ore box and shuttle console to aux bases on all stations. + Xhuis: + - bugfix: The Resurrect Cultist rune now works as intended. + - bugfix: Cyborg energy swords now properly have an icon. + kingofkosmos: + - tweak: Canisters don't flash red lights anymore when empty. +2017-08-19: + Anonmare: + - balance: Raised airlock deflection by one point + BeeSting12: + - balance: The meth explosion temperature has been raised. + FrozenGuy5/PraiseRatvar: + - balance: Nerfs L6 SAW Hollow Point Bullets from -10 armour penetration to -60 + armour penetration. + Joan: + - balance: Deathsquads no longer get shielded hardsuits. + More Robust Than You: + - rscadd: Blobs can now sense when they're being cuddled! + - bugfix: Fixes mining hardsuit heat_protection + - bugfix: RCL icons are now better at updating + NewSta: + - bugfix: Fixes the wiki button + - spellcheck: Fixes a typo in the wiki button description + XDTM: + - rscadd: You can now click on symptoms in the Pandemic to see their description + and stats + Xhuis: + - soundadd: The station's explosion now uses a new (or old) sound. + - rscadd: Adds smart metal foam, which conforms to area borders and walls. It can + be made through chemistry by mixing foaming agent, acetone, and iron. + - rscadd: Smart metal foam will create foamed plating on tiles exposed to space. + Foamed plating can be struck with floor tiles to turn it into regular plating! + - spellcheck: The chat message has been removed from *spin. I hope you're happy. + nicbn: + - imageadd: Nanotrasen redesigned the area power controllers! + - imageadd: Thanks Xhuis for the contrast tweak on APCs +2017-08-23: + Cobby: + - balance: Planting kudzu now has a short delay with a visible message to users + around you. Hit-N-Run planting is no longer possible. + - rscdel: kudzu bluespace mutation and spacewalk mutation are removed. + Cruix: + - rscadd: The syndicate shuttle now has a navigation computer that allows it to + fly to any unoccupied location on the station z-level. + Ergovisavi: + - tweak: Slightly increased the radius of the atmos resin launcher, and resin now + makes floors unslippery + Pubby: + - rscadd: Gorillas + - rscadd: Irradiating monkeys can now turn them into hostile gorillas + Shadowlight213: + - experiment: The amount of time spent playing, and jobs played are now tracked + per player. + - experiment: This tracking can be used as a requirement of playtime to unlock jobs. + ShizCalev: + - balance: Morphlings now have to restore to their original form before taking a + new one. + - bugfix: Morphlings will no longer have combined object appearances + Supermichael777: + - bugfix: Boss tiles have been reconstructed out of an unstoppable force. + TehZombehz: + - rscadd: Nanotrasen Culinary Division has authorized the construction of pancakes, + including blueberry and chocolate chip pancakes. Pancakes can be stacked on + top of each other. +2017-08-26: + Cyberboss: + - rscadd: Added the credits roll + Iamgoofball: + - rscadd: Plasmamen now hallucinate with blackpowder in their system + Joan: + - balance: Geis bindings no longer decay faster if not pulled by a Servant, but + last for 20 seconds, from 25. + - tweak: Geis bindings will decay slower when on a Sigil of Submission, and, if + being pulled by a Servant when crossing a Sigil of Submission, will helpfully + remove the pull. + - tweak: Removing Geis bindings is no longer instant and can be done by any Servant + with a slab, not just the initiator. + - wip: Geis no longer prevents you from taking actions, but you remain unable to + recite scripture while the target is bound. In addition, dealing damage to a + bound target will cause the bindings to decay much more rapidly. + - rscadd: You can now remove sigils by hitting them with a clockwork slab for a + small refund. + More Robust Than You: + - balance: Lowers the chance for monkeys to become gorillas + - rscadd: Holoparasite prompts now have a "Never For This Round" option + Naksu: + - spellcheck: fixed inconsistent grammar between machines that derive from /obj/machinery/chem_dispenser + - spellcheck: touched up some chat messages to include references to objects instead + of "that" or "the machine" etc., also removed references to beakers being loaded + in machines that can accept any container +2017-08-30: + CPTANT: + - balance: Hacked AI module cost is reduced to 9TC + Cobby & Cyberboss: + - rscadd: A stealth option for the traitor microlaser has been added. When used, + it adds 30 seconds to the cooldown of the device. + Cyberboss (unwillingly by Kor's hand): + - balance: You no longer take damage/are as heavily blinded in crit while above + -30HP + - balance: Whispering in crit above -30HP will not cause you to succumb + - balance: You can now hear in crit above -30HP + Joan: + - imageadd: Cult blades have updated item and inhand sprites. + Kor: + - rscadd: Added Shadow Walk, a new form of jaunt that lasts for an unlimited amount + of time, but ends if you enter a well lit tile. It is planned for use in a Shadowling + rework, but feel free to hassle admins to test it out in the mean time. + - balance: Slime people can consume meat and dairy again. + Lzimann: + - rscadd: Ghosts now have a way to see all available ghost roles! Check your ghost + tab! + MMMiracles: + - rscdel: Cerestation has been decommissioned. Nanotrasen apologizes for any spikes + of suicidal tendencies, sporadic outbursts of primitive anger, and other issues + that may of been caused during the station's run. + Naksu: + - bugfix: fixed portable chem dispensers charging 50% slower than intended when + initialized. + - bugfix: fixed portable chem dispensers getting faster charging rate every time + refreshparts() is called + Pubby: + - rscadd: Crew-tracking pinpointers to replace laggy crew monitoring console functionality + - rscadd: Crew-tracking pinpointers in medical vendors and the detective's office + RemieRichards: + - rscadd: AltClick listing now updates instantly on AltClick + - bugfix: AltClick listing no longer reveals obscured items + ShizCalev: + - tweak: The singularity now poses a threat towards asteroids as well as stations. + - tweak: All power systems will now report their wattage values in Watts, Kilowatts, + Megawatts, and Gigawatts. Gone are the days of seeing 48760 W total load when + working with an APC! + kingofkosmos: + - tweak: You can now unbuckle out a chair/bed by moving. + ninjanomnom: + - bugfix: Fixed a problem with shuttles being unrepairable under certain circumstances. +2017-09-01: + Fury McFlurry: + - rscadd: Added more halloween costumes. + - rscadd: Among them are a lobster suit, a cold villain costume and some gothic + clothes + More Robust Than You: + - rscdel: Finally fucking removed gangs + MrStonedOne: + - rscadd: Player notes can now be configured to fade out over time to allow admins + to quickly see how recent notes are. Server Operators, check the config for + more info + Pubby: + - rscdel: The multiverse sword is toast + YPOQ: + - bugfix: Pouring radium into a ninja suit restores adrenaline boosts. + - bugfix: Adrenaline boost works while unconscious again. + - bugfix: Energy nets can be used again! +2017-09-02: + Frozenguy5: + - tweak: Added new station prefixes, names and suffixes! + Tortellini Tony: + - tweak: Round-end credits can now be toggled on or off in the server game options. + XDTM: + - tweak: The Disease Outbreak event now can generate random advanced viruses, with + more symptoms and higher level as round time goes on. +2017-09-11: + Anonmare: + - balance: Altered pressure plate crafting recipe + Basilman: + - rscadd: A strange asteroid has drifted nearby... + Firecage: + - rscadd: The NanoTrasen Department for Cybernetics (NDC) would like to announce + the creation of Cybernetic Lungs. Both a stock variety to replace traditional + stock human lungs in emergencies, and a more enhanced variety allowing greater + tolerance of breathing cold air, toxins, and CO2. + JJRcop: + - rscadd: Admins can now play media content from the web to players. + - rscadd: Adds a volume slider for admin midis to the chat options menu. + Jay: + - bugfix: Goliaths can be butchered again + Joan: + - tweak: While below 0 health but above -30 health, you will be able to crawl slowly + if not pulled, whisper, hear speech, and see with worsening vision. + - wip: The previous softcrit got reverted, for changelog context. + - rscdel: Standard attacks, such as swords, hulk punches, mech punches, xeno slashes, + and slime glomps, will no longer damage clothing. + Kor: + - rscadd: People in soft crit will take oxyloss more slowly than people in full + crit if they remain still. + - rscadd: People dragging themselves in critical condition will now leave blood + trails. This will rapidly deal oxyloss to you. + MrStonedOne: + - rscadd: Admins may now show the variables interface to players to help contributors + debug their new additions + Naksu: + - rscadd: Added TGUI interfaces to various smartfridges of different kinds, drying + racks and the disk compartmentalizer + Pubby: + - bugfix: Escape pods and PubbyStation's monastery shuttle are back in commission + Robustin: + - tweak: Golem shells no longer fit in standard crew bags. + Supermichael777: + - bugfix: Stands now check if their user got queue deleted somehow + VexingRaven: + - bugfix: Hearty Punch once again pulls people out of crit. + Xhuis: + - spellcheck: Various grammar in the Orion Trail arcade game has been tweaked. + - rscadd: You can now kill yourself in fun and creative ways with the hierophant + club. + - rscadd: Common lavaland mobs now have rare mutations! Keep an eye out for rare + Poke- err, monsters. + - imageadd: The hand drill and jaws of life now have sprites on the toolbelt. + YPOQ: + - bugfix: Windoors open when emagged again + as334: + - rscadd: Added a mass spectrometer to the detective's closet + basilman: + - rscadd: penguins may now have shamebreros, noot noot +2017-09-13: + BeeSting12: + - balance: The stetchkin APS pistol is smaller. + - rscadd: The 9mm pistol magazines can be purchased from nuke op uplinks at two + telecrystals each. + Kor: + - rscadd: Added Nightmares. They're admin only currently, so as usual, make sure + to beg admins to be one. + - rscadd: The Chaplain may now choose the Unholy Blessing as a null rod skin. + KorPhaeron: + - rscadd: Added Jacob's ladder to the necropolis chest + Lordpidey: + - bugfix: Centcom roundstart threat reports are fixed, and can now be used to narrow + down the types of threats facing the station. + MrROBUST: + - rscadd: Mechs now can be connected to atmos ports + VexingRaven: + - bugfix: Changeling Augmented Eyesight ability now grants flash protection when + toggled off + - bugfix: Changeling Augmented Eyesight ability can now be toggled properly + - bugfix: Changeling Augmented Eyesight ability is properly removed when readapting + - bugfix: The syndicate have once again stocked the toy C20r and L6 Saw with riot + darts. + Xhuis: + - rscadd: You can now use metal rods and departmental jumpsuits to craft departments + for each banner. + - tweak: The lavaland animal hospital ruin has been remapped, including more supplies + as well as light sources. +2017-09-14: + BeeSting12: + - balance: Deltastation's and Metastation's armory now starts with three riot shotguns! + Fun Police: + - rscdel: Removed some of the free lag. + Kor: + - bugfix: It is possible to multitool the cargo computer circuitboard for contraband + again + ShizCalev: + - bugfix: Holding a potted plant will no longer put you above objects on walls. + - bugfix: Replaced leftover references to loyalty implants with mindshield implants. + ninjanomnom: + - bugfix: Shuttle transit parallax should be working again +2017-09-16: + Basilman: + - rscadd: Gondolas are now procedural generated. + Mey-Ha-Zah: + - imageadd: Updated the knife sprite. + Naksu: + - bugfix: Evidence bags will no longer show ghosts of items such as primed flashbangs + after the flashbang inside explodes + - bugfix: Prevents dead monkeys from fleeing their attackers or escaping His Grace + only to be eaten again + - rscdel: Corgis can no longer be targeted by facehuggers + - rscdel: Removed unused vine floors and their sprite. + Robustin: + - rscadd: Due to budget cuts, airlocks that control access to non-functional maint + rooms and other abandoned areas now have a chance to spawn welded, bolted, screwdrivered, + or flat out replaced by a wall at roundstart. + - bugfix: Dice will now roll when thrown + YPOQ: + - rscadd: Ninja adrenaline boost removes stamina damage + - bugfix: Depowered AIs can no longer use abilities or interact with machinery + - bugfix: The doomsday device will again periodically announce the time until its + activation + - bugfix: Crafting stackable items results in the right stack sizes +2017-09-18: + More Robust Than you: + - balance: Blobbernauts are healed quicker by cores and nodes + Naksu: + - bugfix: OOC for dead people is now (re-)enabled at round-end + - bugfix: Fixed chemfridges being unable to display items with dots in their name + Pubby: + - rscadd: Traitorbro gamemode + Supermichael777: + - bugfix: Airlocks now check metal for upgrades using the standard get_amount() + proc instead of checking the amount var, this means it is compatible with cyborgs. + TungstenOxide: + - tweak: Swapped the action of purchasing a pAI software and subtracting the RAM + from available pool. + Xhuis: + - balance: Brave Bull now increases your max HP by 10, up from 5. + - rscadd: Tequila Sunrise now makes you radiate dim light while it's in your body. + - rscadd: Dwarves are now very resistant to the intense alcohol content of the Manly + Dorf and can freely quaff them without too much worry. + - rscadd: Bloody Mary now restores lost blood. +2017-09-20: + PopNotes: + - imageadd: Airlocks animate faster. This doesn't change the time it takes to pass + through an airlock, but it does visually match up much better so you don't just + appear to glide through the airlock while it's half-open. + Pubby: + - bugfix: Atmos pipenets are less glitchy + TehZombehz: + - rscadd: Several new plushie dolls are now available in toy crates. +2017-09-22: + AutomaticFrenzy: + - bugfix: Mice spawning finds the station z level properly + CPTANT: + - balance: Knockdown and unconcious now let you regenerate stamina damage. + - rscadd: Sleeping regenerates more stamina damage. + Naksu: + - bugfix: Admin ghosts can no longer unintentionally make a mess of things. +2017-09-23: + Armhulen: + - rscadd: Rare Spider Variants have arrived! Every spiderling has a rare chance + of growing up to a rare version of their original spider type! + - rscadd: Special thanks to Onule for the sprites, you're the best! + JJRcop: + - rscadd: Suiciding with a ballistic gun now actually blows your brain out. + More Robust Than You: + - tweak: Taking the beaker out of a cryotube now tries to put it into your hand + - code_imp: Removed some spawn()s from secbot code + - bugfix: Using a soulstone on somebody now transfers your languages to the shade + - bugfix: Zombies now stay dead if they suicide + - rscadd: If a zombie suicides, they now rip their head off! + - bugfix: pAIs now transfer their languages to bots + - bugfix: Support Holoparasites must be manifested to heal + Robustin: + - balance: A zombie's automatic self-healing is stopped for 6 seconds after taking + damage. + - bugfix: Deconverted revs will now always get a message, logs will now include + more details. + YPOQ: + - bugfix: Pet persistence works again +2017-09-27: + Arianya: + - balance: Lesser ash drakes no longer drop ash drake hide when butchered. + GLA Coding: + - tweak: Cells must now be installed in mechs when being constructed, this step + is always before the application of internal armor. + - bugfix: Combat mechs now get stats upgrades from their scanning modules and capacitors + Improvedname: + - rscadd: Adds racial equality to color burgers + More Robust Than You: + - rscadd: Implant Chairs now also support organs + Naksu: + - bugfix: Fixed jump boots breaking if used when you can't jump, such as when inside + a sleeper. + - code_imp: Removed meteor-related free lag. + - bugfix: Syndicate MMIs will now properly transfer their laws to newly-constructed + AIs + Pubby: + - rscadd: Bluespace pipes to atmospherics, which create a single pipenet with all + bluespace pipes in existence. +2017-09-28: + RandomMarine: + - imageadd: Air tanks (o2+n2) now have a different appearance from oxygen tanks. + Robustin: + - tweak: Revheads no longer spawn with chameleon glasses or a spraycan, instead + they will start with a cybernetic security HUD implanted into their eyes. + Xhuis: + - rscadd: Ian has recently communed with unspeakable horrors and may now be warped + by their power if Nar-Sie passes near them. + - rscadd: In order to fight back against their ancient foe Ian, Poly has struck + a bargain with Ratvar and will be transformed into a machine by their presence. + Y0SH1_M4S73R: + - bugfix: AFK players count as dead for the assassinate objective. +2017-09-29: + Kor: + - rscadd: Gunfire can now leave bullet holes/dents in walls. Sprites by JStheguy. + RandomMarine: + - rscadd: You can now light your cigs with people that are on fire. The surgeon + general is spinning in their grave. + Robustin: + - tweak: Hacking a secure container with a multitool now takes longer, but no longer + has a chance to fail. + XDTM: + - rscadd: Nurse spiders can now set a directive that will be seen by their spiderlings, + when they get controlled by a player. + - rscadd: Spiders' actions are now action buttons instead of verbs. + - rscadd: Wrapping stuff in a cocoon is now a targeted action! + kevinz000: + - rscadd: The syndicate have recently begun sending agents to extract vital research + information from Nanotrasen. + - bugfix: 'Timestop fields will now stop thrown objects experimental: Timestops + will now be much quicker to react.' + kingofkosmos: + - spellcheck: You can now find out if an item uses alt-clicking by examining it. +2017-10-07: + Antur: + - bugfix: Liches will no longer lose their spells when reviving. + AnturK: + - rscadd: Wigs are now available in AutoDrobe + Cobby: + - admin: Players will now be notified automatically when an admin resolves their + ahelp. + Cyberboss: + - config: The shuttle may now be configured to be automatically called if the amount + of living crew drops below a certain percentage + - bugfix: Fixed a rare case where creating a one tank bomb would result in a broken + object + - bugfix: Fixed many cases where forced item drops could be avoided by not having + an item in your active hand + DaxDupont: + - rscdel: No more roundstart tips about gangs. You can finally start to forget gangs + ever existed. + Incoming5643: + - bugfix: The rarely utilized secret satchel item persistence system has been fixed + and made more lenient. + - rscadd: 'In case you forgot how it works: if you find or buy secret satchels, + put an item in them, and then bury them under tiles on the station you or someone + else can find them again in a future round with the item still there! Free satchels + can often be found hiding around the station, so get to burying!' + JJRcop: + - config: Hosts can now lock config options with the @ prefix. This prevents admins + from editing the option in-game. + - tweak: Admin volume slider moved to its own menu for better visibility. + Joan: + - bugfix: Fixes Vanguard never stunning for more than 2 seconds. + - balance: Ocular Warden base damage per second changed from 12.5 to 15. + - bugfix: Ocular Wardens no longer count themselves when checking for dense objects, + which decreased their overall damage by 15%. + - balance: Ocular Wardens now only reduce their damage by 10% per dense object, + and only do so once per turf. However, dense turfs now reduce their damage with + the same 10% penalty. + Kerbin-Fiber: + - bugfix: Wood is no longer invisible + Kor: + - rscadd: Nightmares now have mutant hearts and brains, with their own special properties + when consumed or implanted in mobs. Experiment! + - bugfix: You can now tell when someone is in soft crit by examining them. + - rscadd: Nightmares now have a chance to spawn via event. + More Robust Than You: + - bugfix: Fixes cogscarab sprites not updating + - balance: Blobs now take damage from particle accelerators + MrDoomBringer: + - rscadd: Nanotrasen, as part of their new Employee Retention program, has encouraged + more station point-makery by adding the "Cargo Tech of the Shift"! The award + is located in a lockbox in the Quartermaster's locker. + MrStonedOne: + - tweak: The MC will now reduce tick rate during high populations to keep it from + fighting with byond for processing time. + - config: Added config options to control MC tick rate + - admin: Admins can no longer manually control the mc's tick rate by editing the + MC's processing value, instead you will have to edit the config datum's values + for high/low pop tick rates. + Naksu: + - bugfix: Removed some of the free lag + - bugfix: Updates to station name are now reflected on Cargo's stock exchange computers. + - bugfix: Gutlunches will now once again look for gibs to eat. + - bugfix: Bees now come with reduced amounts of free lag + - balance: Pyrosium and cryostylane now react at ludicrous speeds. + - tweak: Made atmos tiny bit faster + - bugfix: Tweaks to atmos performance + Qbopper: + - tweak: Moved a locker blocking an airlock in Toxins maintenance. + RandomMarine: + - bugfix: Simple mobs should no longer experience severe hud/lighting glitches when + reconnecting. + Robustin: + - rscadd: Blood cultists can now create a unique bastard sword at their forge + - rscdel: Blood cultists can no longer obtain a hardsuit from the forge + - bugfix: Emotes (e.g. spinning and flipping) will now properly check for consciousness, + restraints, etc. when appropriate. + - bugfix: The Cult's bastard sword should now properly store souls and create constructs. + - bugfix: Neutering a disease symptom now produces a unique ID that will ensure + the PANDEMIC machine copies it properly. + ShizCalev: + - bugfix: You now have to unbuckle a player PRIOR to shaking them up off a bed or + resin nest. + - bugfix: Wizards will now have the correct name when attacked with Envy's knife! + - soundadd: Space ninja energy katanas now make a swish when drawn! + Supermichael777: + - balance: The detectives gun has been restored from a system change that nerfed + knockdown in general. We need to have a serious discussion about anti revolver + hate in this community. + - tweak: The PDA default font has been switched from "eye bleed" to old-style monospace. + Check your preference. + Thefastfoodguy: + - bugfix: Silicons can no longer take brain damage + - bugfix: Antimatter shielding that can't find a control unit won't delete itself + anymore + WJohnston: + - rscadd: Boxstation and Metastation's white ships now have navigation computers, + letting you move them around in the station, deep space, and derelict z levels. + XDTM: + - rscadd: Added the H.E.C.K. suit, a guaranteed loot frop from Bubblegum. + - rscadd: The H.E.C.K. suit is fully fire (and ash) proof, and has very good melee + armor. + - rscadd: H.E.C.K. suits can also be painted with spraycans, to fully customize + your experience. + - rscadd: Despite spending centuries inside a demon king, H.E.C.K. suits are most + definitely safe. + - bugfix: Fixed a bug where Viral Aggressive Metabolism caused viruses to be cured + instantly. + - bugfix: Fixed a bug where viruses' symptoms would all instantly activate on infection. + - rscadd: The CMO now has an advanced health analyzer in his closet! It can give + more precise readings on the non-standard damage types. + Xhuis: + - bugfix: Runed metal and brass are no longer invisible. + Xhuis and Y0SH1_M4S73R: + - bugfix: Servants of Ratvar now spawn in as the actual race set on their preferences, + with plasmamen getting the gear they need to not immediately die. + Y0SH1_M4S73R: + - balance: Gygax overdrive consumes at least 100 power per step + YPOQ: + - bugfix: Jaunters equipped on the belt slot will save you from chasms again. + kevinz000: + - rscadd: Wormhole event wormholes now actually teleport you. + - bugfix: portals now actually teleport on click. + kingofkosmos: + - rscadd: You can now see construction/deconstruction hints when examining airlocks. + - spellcheck: Beds, chairs, closets, grilles, lattices, catwalks, tables, racks, + floors, plating and bookcases now show hints about constructing/deconstructing + them. + nicbn: + - rscadd: Paperwork now uses Markdown instead of BBCode, see the writing help for + changes. + - imageadd: Changed the drop, throw, pull and resist icons. +2017-10-15: + Armhulen: + - bugfix: Clockwork golems no longer slip and slide on glass! + Armie: + - tweak: Holoparasites are once again in the uplink. + Bawhoppen: + - tweak: Smoke machine board has been moved to tech storage. + DaxDupont: + - tweak: After lobbying by Robust Softdrinks and Getmore Chocolate Corp all vendor + firmware has been changed to add sillicons to their target demographic. + - spellcheck: Replaces instances of "permenant" and "permenantly" with the proper + spelling in several areas, + Epoc: + - rscadd: Added a Toggle Underline button to the PDA menu + - code_imp: Cleaned HTML spacing + Frozenguy5: + - bugfix: C20r damage upped from 20 to 30 (used to be 30 before an ammo cleanup + in the code) + GLACoding: + - bugfix: Syndicate turrets and other machines in walls can now be hit by projectiles + Improvedname: + - rscadd: You can now put custom name and lore on your holy weapon by using a pen + on it! + - tweak: Cmo, captain, and the bartender now get pet collars in their lockers. + Jambread/RemieRichards/Incoming5643: + - server: There is a new system for title music accessible from config/title_music + folder. This system allows for multiple rotating lobby music without bloating + Git as well as map specific lobby music. See the readme.txt in config/title_music + for full details. + - config: The previous method of title music selection, strings/round_start_sounds.txt + has been depreciated by this change. + Kor: + - balance: You can now smash the bulbs out of floodlights rather than having to + entirely destroy the object. + Mercenaryblue: + - rscadd: Use the Clown Stamp on some cardboard to begin... the honkbot! + - rscadd: These honkbots are just adorable, and totally not annoying. I swear! Honk! + - rscadd: You can even slot in a pAI! Just don't emag them... oh boy. oh no. oh + geez. + - soundadd: Honkbots now release an evil laugh when emagged. + - imageadd: added some in_hands for banana peels. + - tweak: Golden Bike Horns now permit its victims to perform a full flip before + forcing them to jump again. + More Robust Than You: + - bugfix: Makes the santa event properly poll ghosts + - bugfix: Diseases will now cure if species is changed + - tweak: You can now drag-drop people into open DNA scanners + - bugfix: Medibots will no longer inject people in lockers/sleepers/etc + Naksu: + - bugfix: Fixes to door/airlock deletion routines. + - bugfix: Traitor pen uplinks now preferentially spawn in the PDA pen, and not in + a pocket protector full of pens that no-one checks. + - bugfix: Reusable projectiles such as foam darts no longer get deleted if they're + shot at a shooting range target or a cardboard cutout. + - bugfix: Ghosts no longer inherit the movement delay of their former bodies. + - bugfix: Fixed mobs being able to smash shocked objects without taking damage. + - bugfix: Fixed some mobs not deleting correctly + - code_imp: Fixed dusting code, supermatter-suicides no longer spam the runtime + logs. + - code_imp: Fixed some initialize paths. + Onule: + - tweak: Sunflower sprites were changed, small edits to variants. + - imageadd: Sunflower and variant's inhands sprites. + - imageadd: Tweaked growing sprites to match the new sunflower. + - imageadd: Moonflower and novaflowers now have slightly different growing sprites. + Robustin: + - rscadd: The Chemistry Smoke Machine! Chemist offices will have a board available + should they choose to construct a smoke machine. The smoke machine will regularly + produce smoke from whatever chemicals have been inserted into the machine. Designs + for the circuitboard are also available at RND. + - tweak: Abandoned Airlocks will no longer be deleted when their turf is changed + to a wall. + - tweak: Tesla movement is now completely random. + - bugfix: Clock Cult mode will no longer end if all the cultists die. The round + will not end until the Ark is destroyed or completed. + - bugfix: Chain reactions between explosives will now properly trigger explosives + located in an individual's bag. + - tweak: The wrench-anchoring time of the smoke machine is now doubled to 4 seconds. + - tweak: Smoke Machine smoke is now transparent. + - rscadd: The smoke machine has taken its rightful place in the chemist's office. + - bugfix: Smoke machine will no longer operate while moving/unanchored. + ShizCalev: + - tweak: Nanotrasen brand "Box" model stations have received approval from CentCom + to be retrofitted with the latest in Xenobiology equipment. You will now find + a chemmaster, a chemical dispenser, and a dropper within the Research Division's + Xenobiology lab. + - bugfix: C4 will no longer appear underneath objects on walls. + - bugfix: Plastic explosives will no longer be invisible after being planted. + - imageadd: The security bombsuit's sprite has been updated! + SpaceManiac: + - spellcheck: Grammar when examining objects has been improved. + - bugfix: AI eye camera static is now correctly positioned on Lavaland. + - spellcheck: Fixed many instances of "the the" when interacting with objects. + - bugfix: The tracking implant locator now works on the station again. + WJohn: + - rscadd: An old cruiser class vessel has resiliently stuck around, and may do so + for the foreseeable future. + WJohnston: + - tweak: Due to age, the abandoned ship's engines are now considerably slower when + bringing it place to place. This does however mean that the ship now has a more + gradual takeoff, with no sudden jolt to knock passengers off their feet. + - imageadd: Black carpets no longer have an ugly periodic black line in them. Regular + catwalks are now totally opaque so you won't accidentally click on space when + trying to place wires or tiles on them. + - rscdel: Boxstation's guitar white ship is no more. + - rscadd: Metastation's white ship stands in its place! + - tweak: Metastation's white ship has a couple of weak laser turrets to protect + the cockpit from space carp. + - tweak: Boxstation and metastation now have some plating under the grilles near + the AI sat's transit tube to prevent players from deleting the tube by landing + there. + WJohnston & ninjanomnom: + - rscadd: Plastitanium walls smooth, fancier syndicate shuttles! + - bugfix: Infiltrator shuttles have been moved out of the station maps and made + into a multi-area shuttle. + - balance: Titanium and plastitanium have explosion resistance (requested by Wjohn) + XDTM: + - rscadd: Blood and vomit pools can now spread the diseases of the mob that made + them! Cover your feet properly to avoid infection. + - rscadd: Virus severity now changes the color of the disease HUD icon, scaling + from green to red to flashing black-red. + - tweak: Contact-based diseases no longer spread by simply standing near other people; + it requires interaction like touching or attacking. Bumping against people/swapping + with help intent still counts as touching. + - tweak: Advanced viruses now have another infection type, "Fluids"; it's between + blood and skin contact, and will only be transmitted through fluid contact. + - rscdel: Two "hidden" infection types have been removed. Overall this means that + making a virus airborne is a little bit easier. + - bugfix: Species who cannot breathe can no longer be infected by breathing. + - bugfix: Internals now properly work if set to 0 pressure, and will prevent breathing + gas from the external atmosphere. + - bugfix: Viral Aggressive Metabolism is now properly inactive when neutered. + Xhuis: + - tweak: Cogscarabs can now experiment more freely with base design during non-clockcult + rounds with infinite power and the ability to recite scripture! + - bugfix: The Ark of the Clockwork Justiciar is now registered as a hostile environment. + - refactor: Clockwork scripture now has one progress bar for the entire recital + instead of multiple ones for each sentence in the invocation. + - bugfix: Ocular wardens no longer have a burning hatred for revenants and won't + attack their corpse endlessly anymore. + - balance: Stargazers can no longer be built off-station, even in new areas. + - balance: Integration cogs no longer emit sounds and steam visuals when active. + armie: + - bugfix: mob spawners are no longer possessable + deathride58: + - rscadd: '*slap' + duncathan: + - bugfix: Scrubbers and filters no longer allow for infinite pressure in pipes. + improvedname: + - bugfix: 9mm doesn't longer appear in traitor surplus crates + kevinz000: + - bugfix: 'Flightsuits now allow proper pulling experimental: Moved now has an argument + for if it was a regular Move or a forceMove.' + - rscadd: Instead of dumb sleep()s, follow trails now use SSfastprocess for processing! + - rscadd: Mobs now float while flying automatically! + - rscdel: 'Flightsuits can no longer be safely shut off if you''re still barreling + down the hallway. experimental: Flightsuits should be less shitcode. Hope this + PR doesn''t blow anything important up!' + - bugfix: Fixed trying to clear beaker in pandemic when the beaker is already removed + causing a runtime. + kingofkosmos: + - rscadd: Alt-clicking on a computer now ejects the ID card inside it. + nicbn: + - tweak: You can now clear bullet holes in walls using a welding tool. + ninjanomnom: + - refactor: Radiation has been completely overhauled. + - rscadd: A new radiation subsystem and spreading mechanics. + - rscadd: Walls and other dense objects insulate you from radiation. + - rscadd: Geiger counters now store the last burst of radiation so you can view + it at your leisure or show it to someone. Examine it. + - rscadd: Geiger counters can check mobs for contaminated objects. Scan yourself + before you leave to make sure you aren't carrying dangerous radioactive items. + - soundadd: Geiger counters have realistic sounds and the radiation pulse spam in + chat has been replaced. + - balance: Radiation is more deadly and causes burns at high intensities, WEAR YOUR + RADSUITS. + - balance: However residue radiation is far slower acting and kills you with toxin. + - balance: Engineering holosigns have a light amount of radiation insulation. + - balance: Rad collectors are nerfed. No more supercharging with pressurized plasma. + No more collector spam either. + - balance: Engine output is a lot more stable as a result of collector changes. + - balance: Monkeys need more rads and take more time to turn into gorillas. + - tweak: Over 100% on the DNA computer means your subject is now taking damage. + - tweak: The asteroid escape shuttle has no stabilizers and throws you around when + it moves + - bugfix: Shuttles no longer rotate ghosts of players who prefer directionless sprites + - bugfix: 2 Years later and cameras work on shuttles now, probably. + - bugfix: Buckled mobs when on a rotating shuttle should now rotate correctly + - bugfix: Fixes shuttles gibbing in supposedly safe areas + - bugfix: Mobs that didn't move during shuttle launch would not have their parallax + updated. This is fixed now. + - bugfix: The custom shuttle placement highlight now works for multi area shuttles. + - bugfix: Directional windows shouldn't leak air anymore + - tweak: Windows only block air while anchored + - bugfix: Fixes camera mobs being considered a target by radiation + - bugfix: Cables can no longer be contaminated as well + - balance: Buffs radiation cleansing chems + - balance: Toxin damage per tick from radiation is halved + - admin: Contaminated objects keep track of what contaminated them + - admin: Radiation pulses over 3000 are logged now + spessmenart: + - imageadd: The captains sabre no longer looks like a rapier. +2017-10-17: + DaxDupont: + - bugfix: 'Fancy boxes(ie: donut boxes) now show the proper content amount in the + sprite and no longer go invisible when empty.' + Mercenaryblue: + - bugfix: when decapitated, banana-flavored cream no longer hovers where your head + used to be. + More Robust Than You: + - rscadd: EI NATH! now causes a flash of light + Naksu: + - bugfix: Pinned notes will now show up on vault, abductor, centcom and large glass + airlocks. + - spellcheck: Removed a misleading message when handling full stacks of sheets. + - bugfix: Pre-filled glass bottles (uplink, medbay, botany) will now give visual + feedback about how much stuff is left inside, and the color of contents will + match an empty bottle being filled with the same reagent. + - bugfix: Player-controlled "neutral" mobs such as minebots are now considered valid + targets by clock cult's ocular wardens. + Xhuis: + - bugfix: Cogged APCs can now be correctly unlocked with an ID card. + duncathan: + - tweak: Portable air pumps can output to a maximum of 25 atmospheres. + kevinz000: + - refactor: Legacy projectiles have been removed. Instead, all projectiles are now + PIXEL PROJECTILES! + - rscadd: Reflectors can now be at any angle you want. Alt click them to set angle! + - rscadd: Pipes can now be layered up to 3 layers. +2017-10-18: + DaxDupont: + - bugfix: Fixes automatic fire on guns. + Gun Hog: + - bugfix: The GPS item now correctly changes its name when the GPS tag is changed. + Improvedname: + - tweak: Reverts katana's to its orginal size being huge + Mercenaryblue: + - balance: it should be far easier to clean out your face from multiple cream pies. + More Robust Than You: + - tweak: People that are burning slightly less will appear to be burning... slightly + less. + Robustin: + - bugfix: The smoke machine now properly generates transparent smoke, transmits + chemicals, and displays the proper icons. + ShizCalev: + - tweak: You can no longer build reinforced floors directly on top of dirt, asteroid + sand, ice, or beaches. You'll have to first construct flooring on top of it + instead. + - bugfix: Corrected mapping issues introduced with the latest SM engine/radiation + update across all relevant maps. + - bugfix: The tools on the Caravan Ambush space ruin have had their speeds corrected. + - bugfix: Slappers will no longer appear as a latex balloon in your hand. + - bugfix: Renault now has a comfy new bed on Metastation! + - tweak: Engineering cyborgs now have access to geiger counters. + Xhuis: + - bugfix: You can no longer pick up brass chairs. + Y0SH1_M4S73R: + - bugfix: Disabling leg actuators sets the power drain per step to the correct value. + duncathan: + - bugfix: Filters no longer stop passing any gas through if the filtered output + is full. + ninjanomnom: + - rscadd: You can vomit blood at high enough radiation. + - balance: Radiation knockdown is far far shorter. + - balance: Genetics modification is less harmful but still, upgrade your machines. + - balance: Pentetic acid is useless for low amounts of radiation but indispensable + for high amounts now. + - balance: Singularity radiation has been normalized and Pubby engine has been remapped. + - bugfix: No more hair loss spam + - bugfix: Mob rad contamination has been disabled for now. Regular contamination + is still a thing. + - bugfix: Fixed turfs not rotating + - bugfix: Fixed stealing structures you shouldn't be moving +2017-10-19: + Kor: + - rscadd: Blob is now a side antagonist. + - rscadd: Event and admin blobs will now be able to choose their spawn location. + - rscadd: Blob can now win in any mode by gaining enough tiles to reach Critical + Mass. + - rscadd: Blobs that have Critical Mass have unlimited points, and a minute after + achieving critical mass, they will spread to every tile on station, killing + anyone still on board and ending the round. + - rscadd: Using an analyzer on a blob will now reveal its progress towards Critical + Mass. + - rscadd: The blob event is now more common. + Mercenaryblue: + - tweak: You will no longer trip on inactive honkbots. + - bugfix: Sentient Honkbots are no longer forced to speak when somebody trip on + them. + Naksu: + - bugfix: Manned turrets stop firing when there's no-one in the turret shooting. + - refactor: 'mobs will enter a deep power-saving state when there''s not much to + do except wander around. change: bees are slightly more passive in general' + deathride58: + - tweak: You can now press Ctrl+H to stop pulling, or simply H to stop pulling if + you're in hotkey mode. + ninjanomnom: + - rscadd: Engineering scanner goggles have a radiation mode now + - rscadd: Objects placed under showers are cleansed of radioactive contamination + over a short time. + - soundadd: Showers make sound now. + oranges: + - rscdel: Removed the bluespace pipe +2017-10-20: + Kor: + - rscadd: You can now select your Halloween race, rather than having it assigned + randomly via event. + Robustin: + - bugfix: Fixed a bug where detonating maxcaps, especially multiple maxcaps, on + Reebe guaranteed that everyone would die and thus the Clock Cult would immediately + lose; Reebe maxcap is now 2/5/10. + ShizCalev: + - bugfix: All reflector prisms/mirrors have had their angles corrected. + - tweak: Remains left over by dusting or soul-stoning a mob are now dissoluble with + acid. + - tweak: Changelings using biodegrade to escape restraints will now leave a pile + of goop. + - bugfix: Fixed messages related to changelings using biodegrade not appearing. +2017-10-21: + More Robust Than You: + - bugfix: Heads of staff will now have cat organs removed at roundstart + Robustin: + - balance: Spray tan no longer stuns when ingested. + Thunder12345: + - bugfix: Sentient cats no longer forget to fall over when they die +2017-10-22: + More Robust Than You: + - bugfix: Blood Brother now properly shows up in player panel + Naksu: + - server: Paper bins no longer let server admins know that pens were eaten. + - code_imp: Removed dangling mob references to last attacker/attacked + Robustin: + - balance: Medical biosuits (and hardsuits) now offer heavy, but not complete, radiation + resistance. + ninjanomnom: + - bugfix: Contents of silicon mobs are no longer considered for targets of radiation. + This blocks them from being contaminated. +2017-10-24: + Armhulen: + - rscadd: Wizards may now shapeshift into viper spiders. + Improvedname: + - tweak: Blacklists holoparasite's from surplus crates + Kor: + - rscadd: Added dullahans, which will be available from the character set up menu + during the Halloween event. + - bugfix: Severed heads will no longer appear bald. + More Robust Than You: + - bugfix: Fixes champrojector camera bugs + Naksu: + - bugfix: Grinders will now grind grown items like cocoa pods again + - code_imp: Cameras no longer keep hard references to mobs in their motion tracking + list. + ShizCalev: + - bugfix: Creatures made via gold slime cores will now be given the proper name + of their master. + deathride58: + - tweak: Deltastation's armory now contains reinforced windows surrounding the lethal + weaponry. This makes Delta's armory consistent with Box. + - tweak: There are now decals in places where extra Security lockers can spawn. + - tweak: Cleaned up semicolons in Meta and Boxstation's .dmms +2017-10-25: + Cruix: + - rscadd: Shuttle navigation computers can now place new transit locations over + the shuttle's current position. + JJRcop: + - rscadd: The heart of darkness revives you as a shadowperson if you aren't one + already. + ShizCalev: + - bugfix: Shades will no longer always hear a heartbeat. + - bugfix: Golem abilities will now be start on cooldown when they are made. +2017-10-26: + Kor and JJRcop: + - rscadd: Added vampires. They will be available as a roundstart race during the + Halloween holiday event. + ShizCalev: + - bugfix: Reflectors will no longer drop more materials than they took to make when + deconstructed. + - bugfix: You will no longer be prompted to reenter your body while being defibbed + if you can't actually be revived. + - bugfix: You can no longer teleport past the ticket stands of the Luxury Emergency + Shuttle. + - bugfix: Lightgeists can now -actually- be spawned with gold slime cores. + - tweak: The Staff of Change will now randomly assign a cyborg module when transforming + a mob into a cyborg. + Xhuis: + - balance: Clockwork marauders now move more slowly below 40% health. + - balance: Instead of a 40% chance (or more) chance to block projectiles, clockwork + marauders now have three fixed 100% blocks; after using those three, they cannot + block anymore without avoiding projectiles for ten seconds. This number increases + to four if war is declared. + - balance: Projectiles that deal no damage DO reduce marauders' shield health. Use + disabler shots to open them up, then use lasers to go for the kill! + - bugfix: Cogscarab shells and marauder armor now appear in the spawners menu. + - bugfix: You can no longer stack infinitely many stargazers on one tile. + nicbn: + - imageadd: Chemical heater and smoke machine resprited. + ninjanomnom: + - soundadd: Portable generators have a sound while active. + - soundadd: The supermatter has a sound that scales with stored energy. + ninjanomnom & Wjohn: + - bugfix: Cable cuffs now inherit the color of the cables used to make them. + - bugfix: Split cable stacks keep their color. + - tweak: The blue cable color is now a better blue. +2017-10-27: + Anonmare: + - rscadd: Adds new grindables + JamieH: + - rscadd: Buildmode map generators will now show you a preview of the area you're + changing + - rscadd: Buildmode map generators will now ask before nuking the map + - bugfix: Buildmode map generator corners can now only be set by left clicking + Kor: + - rscadd: Cloth golems will be available as a roundstart race during Halloween. + MrStonedOne: + - code_imp: Created a system to profile code on a line by line basis and return + detailed info about how much time was spent (in milliseconds) on each line(s). + Xhuis: + - balance: Servants can no longer teleport into the gravity generator, EVA, or telecomms. + ninjanomnom: + - bugfix: Hardsuit helmets work like geiger counters for the user. + - code_imp: Radiation should perform a little better in places. + - balance: Various radiation symptom thresholds have been tweaked. + - balance: Contamination strengths at different ranges have been tweaked. + - balance: Contaminated objects have less range for their radiation. + - balance: Hitting something with a contaminated object reduces its strength faster. + - balance: Contaminated objects decay faster. + - balance: Both radiation healing medicines have been buffed a bit. + - balance: Passive radiation loss for mobs is nerfed. + - balance: There is a soft cap for mob radiation now. + - balance: Projectiles, ammo casings, and implants are disallowed from becoming + contaminated. + - rscadd: Suit storage units can completely cleanse contamination from stored objects + - admin: The first time an object is contaminated enough to spread more contamination + admins will be warned. This is also added to stat tracking. + - rscadd: Thermite works on floors and can be ignited by sufficiently hot fires + now + - refactor: Thermite has been made into a component + - bugfix: Thermite no longer removes existing overlays on turfs +2017-10-28: + Mark9013100: + - tweak: The Medical Cloning manual has been updated. +2017-10-29: + Armhulen: + - rscadd: Frost Spiders now use Frost OIL! + Mercenaryblue: + - rscadd: Skeletons can now have their own spectral instruments + - rscadd: \[Dooting Intensifies\] + - admin: the variable "too_spooky" defines if it will spawn new instruments, by + default TRUE. + Naksu: + - bugfix: Removed meteor-related free lag + - bugfix: Cleaned up dangling mob references from alerts + Xhuis: + - bugfix: You can no longer become an enhanced clockwork golem with mutation toxin. + - balance: Normal clockwork golems now have 20% armor, down from 40%. + as334: + - spellcheck: This changelog has been updated and so read it again if you are interested + in doing assmos. + - rscadd: Atmospherics has been massively expanded including new gases. + - rscadd: These new gases include Brown Gas, Pluoxium, Stimulum, Hyper-Noblium and + Tritium. + - rscadd: Brown Gas is acidic to breath, but mildly stimulation. + - rscadd: Stimulum is more stimulating and much safer. + - rscadd: Pluoxium is a non-reactive form of oxygen that delivers more oxygen into + the bloodstream. + - rscadd: Hyper-Noblium is an extremely noble gas, and stops gases from reacting. + - rscadd: Tritium is radioactive and flammable. + - rscadd: New reactions have also been added to create these gases. + - rscadd: 'Tritium formation: Heat large amounts of oxygen with plasma. Make sure + you have a filter ready and setup!' + - rscadd: Fusion has been reintroduced. Plasma will fuse when heated to a high thermal + energy with Tritium as a catalyst. Make sure to manage the waste products. + - rscadd: 'Brown Gas formation: Heat Oxygen and Nitrogen.' + - rscadd: 'BZ fixation: Heat Tritium and Plasma.' + - rscadd: 'Stimulum formation: Heated Tritium, Plasma, BZ and Brown Gas.' + - rscadd: 'Hyper-Noblium condensation: Needs Nitrogen and Tritium at a super high + heat. Cools rapidly.' + - rscadd: Pluoxium is unable to be formed. + - rscdel: Freon has been removed. Use cold nitrogen for your SME problems now. + - rscadd: Water vapor now freezes the tile it is on when it is cooled heavily. + naltronix: + - bugfix: fixes that table that wasnt accessible in Metastation +2017-10-30: + PKPenguin321: + - tweak: You can now use beakers/cups/etc that have welding fuel in them on welders + to refuel them. + bgobandit: + - tweak: 'Due to cuts to Nanotrasen''s Occupational Safety and Health Administration + (NO-SHA) budget, station fixtures no longer undergo as much safety testing. + (Translation for rank and file staff: More objects on the station will hurt + you.)' +2017-11-02: + ACCount: + - tweak: '"Tail removal" and "tail attachment" surgeries are merged with "organ + manipulation".' + - imageadd: New sprites for reflectors. They finally look like something. + - rscadd: You can lock reflector's rotation by using a screwdriver. Use the screwdriver + again to unlock it. + - rscadd: Reflector examine now shows the current angle and rotation lock status. + - rscadd: You can now use a welder to repair damaged reflectors. + - bugfix: Multiple reflector bugs are fixed. + Improvedname: + - rscdel: Removes statues from gold slime pool + Mercenaryblue: + - imageadd: Updated Clown Box sprite to match the others. + More Robust Than You: + - admin: ONLY ADMINS CAN ACTIVATE THE ARK NOW + - tweak: The Ark's time measurements are now a bit more readable + MrStonedOne: + - tweak: Meteor events will not happen before 25 minutes, the worst versions before + 35 and 45 minutes. + - tweak: Meteor events are now player gated to 15, 20, and 25 players respectively + - balance: The more destructive versions of meteor events now have a slightly higher + chance of triggering, to offset the decrease in how often it is that they will + even qualify. + - bugfix: Fixed the changelog generator. + Naksu: + - tweak: Smartfridges and chem/condimasters now output items in a deterministic + 3x3 grid rather than in a huge pile in the middle of the tile. + SpaceManiac: + - bugfix: Admins can once again spawn nuke teams on demand. + Xhuis: + - admin: Admins can now create sound emitters (/obj/effect/sound_emitter) that can + be customized to play sounds to different people, at different volumes, and + at different locations such as by z-level. They're much more versatile for events + than the Play Sound commands! + - rscadd: You can now add grenades to plushies! You'll need to cut out the stuffing + first. + - tweak: Clockwork cult tips of the round have been updated to match the rework. + - tweak: Abscond and Reebe rifts now place servants directly at the Ark instead + of below the "base" area. + nicbn: + - tweak: Brown gas renamed to nitryl. + ninjanomnom: + - bugfix: Fixes decals not rotating correctly with the turf. + - bugfix: Fixes a runtime causing some turfs to be left behind by removed shuttles. + - code_imp: Shuttles should be roughly 40-50% smoother. + - bugfix: Fixes the cargo shuttle occasionally breaking if a mob got on at exactly + the right time. +2017-11-10: + Anonmare: + - bugfix: Adds an organ storage bag to the syndicate medborg. + AnturK: + - balance: Dying in shapeshifted form reverts you to the original one. (You're still + dead) + Floyd / Qustinnus: + - soundadd: Redtexting as a traitor now plays a depressing tune to you + Floyd / Qustinnus (And all the sounds by Kayozz11 from Yogstation): + - soundadd: Adds about 30 new ambience sounds + - refactor: added new defines for ambience lists. + Iamgoofball: + - tweak: Cooldown on the Ripley's mining drills has been halved. + - tweak: The frequency of the Ripley's ore pulse has been doubled. + Jalleo: + - tweak: Removed a variable to state which RCD's can deconstruct reinforced walls + - balance: Made combat (ERT ones) and admin RCDs able to deconstruct r walls alongside + borg ones + Kor: + - bugfix: Cult mode will once again print out names at round end. + Mark9013100: + - rscadd: Deltastation now has a Whiteship. + - tweak: Charcoal bottles have been renamed, and have been given a more informative + description. + Mercenaryblue: + - spellcheck: spellchecked the hotel staff. + - rscadd: Added frog masks. Reeeeeeeeee!! + More Robust Than You: + - bugfix: Blobbernauts and spores are no longer killed by blob victory + - bugfix: New blob overminds off the station Z level are moved to the station + - bugfix: You can now use banhammers as a weapon + - tweak: Monkeys can no longer transmit diseases through hardsuits + - tweak: Xenobio blobbernauts can no longer walk on blob tiles + Naksu: + - tweak: Added deterministic output slots to the slime processor + - bugfix: Fixed some interactions with ghosts and items + - bugfix: Nonhumans such as monkeys can now be scanned for chemicals with the health + analyzer. + Okand37 (DeltaStation Updates): + - rscadd: Tweaked Atmospherics + - bugfix: Fixed the Incinerator air injector + - rscadd: Tweaked Engineering + - rscadd: Added logs to the Chaplain's closet for gimmicks (bonfires) + - rscadd: Tweaked Security + - bugfix: Fixed medical morgue maintenance not providing radiation shielding and + exterior chemistry windoor + - rscadd: Bar now has a door from the backroom to the theatre stage + - rscadd: Tweaked Locker Room/Dormitories + ShizCalev: + - bugfix: You can now -actually- load pie cannons. + - bugfix: The captain's winter coat can now hold a flashlight. + - bugfix: The captain's and security winter coats can now hold internals tanks. + - tweak: All winter coats can now hold toys, lighters, and cigarettes. + - tweak: The captain's hardsuit can now hold pepperspray. + - rscadd: Updated the Test Map debugging verb to report more issues regarding APCs. + DELTASTATION + - bugfix: Reverted Okand37's morgue changes which broke power in the area. + - bugfix: Corrected wrong area on the Southern airlock leading into electrical maintenance. + ALL STATIONS + - bugfix: Corrected numerous duplicate APCs in areas which led to power issues. + SpaceManiac: + - bugfix: Ghosts can no longer create sparks from the hand teleporter's portals. + - bugfix: Digging on Lavaland no longer shows two progress bars. + - bugfix: The holodeck now has an "Offline" option. + - bugfix: Injury and crit overlays are now scaled properly for zoomed-out views. + - bugfix: Already-downloaded software is now hidden from the NTNet software downloader. + - bugfix: The crafting, language, and building buttons are now positioned correctly + in zoomed-out views. + - bugfix: Bluespace shelter walls no longer smooth with non-shelter walls and windows. + Swindly: + - rscadd: Organ storage bags can be used to perform limb augmentation. + - bugfix: You can now cancel a cavity implant during the implanting/removing step + by using drapes while holding the appropriate tool in your inactive hand. Cyborgs + can cancel the surgery by using drapes alone. + - bugfix: Fixed hot items and fire heating reagents to temperatures higher than + their heat source. + - bugfix: Sprays can now be heated with hot items. + - tweak: The heating of reagents by hot items, fire, and microwaves now scales linearly + with the difference between the reagent holder's temperature and the heat source's + temperature instead of constantly. + - tweak: The body temperature of a mob with reagents is affected by the temperature + of the mob's reagents. + - tweak: Reagent containers can now be heated by hot air. + Thefastfoodguy: + - bugfix: Spamming runes / battlecries / etc will no longer trigger spam prevention + WJohnston: + - bugfix: Ancient station lighting fixed on beta side (medical and atmos remains) + XDTM: + - rscadd: Ghosts now have a Toggle Health Scan verb, which allows them to health + scan mobs they click on. + Xhuis: + - rscadd: Ratvar and Nar-Sie plushes now have a unique interaction. + - balance: Clockwork marauders are now on harm intent. + - balance: The Clockwork Marauder scripture now takes five seconds longer to invoke + per marauder summoned in the last 20 seconds, capping at 30 extra seconds. + - balance: Clockwork marauders no longer gain a health bonus when war is declared. + - tweak: Moved the BoxStation deep fryers up one tile. + - rscadd: Microwaves have new sounds! + YPOQ: + - bugfix: EMPs can pulse multiple wires + as334: + - rscadd: Pluoxium can now be formed by irradiating tiles with CO2 in the air. + - rscadd: Rad collectors now steadily form Tritium at a slow pace. + - balance: Nerfs fusion by making it slower, and produce radioactivity. + - balance: Noblium formation now requires significantly more energy input. + - balance: Tanks now melt if their temperature is above 1 Million Kelvin. + deathride58: + - bugfix: Directional character icon previews now function properly. Other things + relying on getflaticon probably work with directional icons again, as well. + nicbn: + - imageadd: Canister sprites for the new gases + ninjanomnom: + - bugfix: Shuttle parallax has been fixed once more + - bugfix: You can no longer set up the auxiliary base's shuttle beacon overlapping + with the edge of the map + uraniummeltdown: + - tweak: Replica fabricatoring airlocks and windoors keeps the old name + - tweak: Narsie and Ratvar converting airlocks and windoors keeps the old name +2017-11-11: + DaxDupont: + - bugfix: Medbots can inject from one tile away again. + SpaceManiac: + - bugfix: The detective and heads of staff are no longer attacked by portable turrets. + deathride58: + - bugfix: You can no longer delete girders, lattices, or catwalks with the RPD + - bugfix: Fixes runtimes that occur when clicking girders, lattices, catwalks, or + disposal pipes with the RPD in paint mode + ninjanomnom: + - bugfix: Fixes ruin cable spawning and probably some other bugs +2017-11-12: + Cyberboss: + - bugfix: Clockwork slabs no longer refer to components +2017-11-13: + Cobby: + - rscadd: The Xray now only hits the first mob it comes into contact with instead + of being outright removed from the game. + Floyd / Qustinnus: + - soundadd: Reebe now has ambience sounds + 'Floyd / Qustinnus:': + - soundadd: Adds a few sound_loop datums to machinery. + Frozenguy5: + - bugfix: Broken cable cuffs no longer has an invisible sprite. + PKPenguin321: + - rscadd: Welders must now be screwdrivered open to reveal their fuel tank. + - rscadd: You can empty welders into open containers (like beakers or glasses) when + they're screwdrivered open. + - rscadd: You can now insert any chemical into a welder, but all most will do is + clog the fuel. Welding fuel will refuel it as usual. Plasma in welders tends + to explode. + Qbopper and JJRcop: + - tweak: The default internet sound volume was changed from 100 to 25. Stop complaining + in OOC about your ears! + SpaceManiac: + - bugfix: Posters may no longer be placed on diagonal wall corners. + WJohnston: + - rscdel: Removes stationary docking ports for syndicate infiltrator ships on all + maps. Use the docking navigator computer instead! This gives the white ship + and syndicate infiltrator more room to navigate and place custom locations that + are otherwise occupied by fixed shuttle landing zones that are rarely used. + Xhuis: + - rscadd: Deep fryers now have sound. + - tweak: Deep fryers now use cooking oil, a specialized reagent that becomes highly + damaging at high temperatures. You can get it from grinding soybeans and meat. + - tweak: Deep fryers now become more efficient with higher-level micro lasers, using + less oil and frying faster. + - tweak: Deep fryers now slowly use oil as it fries objects, instead of all at once. + - bugfix: You can now correctly refill deep fryers with syringes and pills. + nicn: + - balance: Damage from low pressure has been doubled. + ninjanomnom: + - rscadd: You can now select a nearby area to expand when using a blueprint instead + of making a new area. + - rscadd: New shuttle areas can be created using blueprints. This is currently not + useful but will be used later for shuttle construction. + - tweak: Blueprints can modify existing areas on station. + - admin: Blueprint functionality has been added to the debug tab as a verb. +2017-11-14: + ike709: + - imageadd: Added directional computer sprites. Maps haven't been changed yet. + psykzz: + - refactor: AI Airlock UI to use TGUI + - tweak: Allow AI to swap between electrified door states without having to un-electrify + first. + selea/arsserpentarium: + - rscadd: Integrated circuits have been added to Research! + - rscadd: You can use these to create devices with very complex behaviors. + - rscadd: Research the Integrated circuits printer to get started. +2017-11-15: + Fury: + - rscadd: Added new sprites for the Heirophant Relay (clock cultist telecomms equipment). + Naksu: + - bugfix: 'Removed fire-related free lag. change: fire alarms and cameras no longer + work after being ripped off a wall by a singulo' + - tweak: 'Minor speedups to movement processing. change: Fat mobs no longer gain + temperature by running.' + Robustin: + - refactor: Cult population scaling no longer operates on arbitrary breakpoints. + Each additional player between the between the breakpoints will add to the "chance" + that an additional cultist will spawn. + - tweak: On average you will see less roundstart cultists in lowpop and more roundstart + cultists in highpop. + - tweak: Damage examinations now include a "moderate" classification. Before minor + was <30 and severe was anything 30 or above. Now minor is <25, moderate is 25 + to <50, and severe is 50+. + - tweak: The tesla will now move toward power beacons at a significantly slower + rate. + SpaceManiac: + - bugfix: The post-round station integrity report is now functional again. + ninjanomnom: + - bugfix: Gas overlays no longer block clicks, on 512 +2017-11-22: + ACCount: + - refactor: Old integrated circuit save file format is ditched in favor of JSON. + Readability, both of save files and save code, is improved greatly. + - tweak: Integrated circuit panels now open with screwdriver instead of crowbar, + to match every single other thing on this server. + - tweak: Integrated circuit printer now stores up to 25 metal sheets. + - bugfix: Fixed integrated circuit rechargers not recharging guns properly and not + updating icons. + - bugfix: Fixed multiple bugs in integrated circuits UIs, improved overall usability. + Anonmare: + - balance: Laserpoitners now incapcitate catpeople + AutomaticFrenzy: + - bugfix: cell chargers weren't animating properly + - bugfix: disable_warning wasn't getting checked and the chat was being spammed + Code by Pyko, Ported by Frozenguy5: + - rscadd: Rat Kebabs and Double Rat Kebabs have been added! + Cyberboss: + - server: Server tools API changed to version 3.2.0.1 + - admin: '"ahelp" chat command can now accept a ticket number as opposed to a ckey' + DaxDupont: + - tweak: CentCom has issued a firmware updated for the operating computers. It is + no longer needed to manually refresh the procedure and patient status. + - bugfix: Proximity sensors no longer beep when unarmed. + - bugfix: Plant trays will now properly process fluorine and adjust toxins and water + contents. + Francinum: + - tweak: The shuttle build plate is now better sized for all stations. + Iamgoofball: + - spellcheck: fixes grammar on logic gate descriptions + - spellcheck: fixes grammar on list circuits + - bugfix: fixes grammar on trig circuits + - spellcheck: fixed grammar on output circuits + JJRcop: + - bugfix: Fixes changeling eggs not putting the changeling in control if the brainslug + is destroyed before hatching. + - tweak: The silicon airlock menu looks a little more like it used to. + Kor: + - bugfix: Blobbernauts will no longer spawn if a player is not selected to control + it, preventing AI blobbernauts from running off the blob and to their deaths. + - rscdel: Following complaints that cargo has been selling all the materials they + receive rather than distributing them, mineral exporting has been removed. + MMMiracles: + - balance: Power regen on the regular tesla relay has been reduced to 50, from 150. + Naksu: + - bugfix: Sped up saycode to remove free lag from highpop + - bugfix: Using a chameleon projector will now dismount you from any vehicles you + are riding, in order to prevent wacky space glitches and being sent to a realm + outside space and time. + Shadowlight213: + - code_imp: Added round id to the status world topic + ShizCalev: + - bugfix: Chameleon goggles will no longer go invisible when selecting Optical Tray + scanners. + - rscadd: Engineering and Atmos scanner goggles will now have correctly colored + inhand sprites. + - tweak: The computers on all maps have have been updated for the latest directional + sprite changes. Please report any computers facing in strange directions to + your nearest mapper. + - bugfix: MetaStation - The consoles in medbay have had their directions corrected. + - imageadd: The Nanotrasen logo on modular computers has been fixed, rejoice! + - bugfix: PubbyStation - Unpowered air injectors in various locations have been + fixed. + - bugfix: MetaStation - Air injector leading out of the incinerator has been fixed + - bugfix: MetaStation - Corrected a couple maintenance airlocks being powered by + the wrong areas. + - bugfix: Computers will no longer rotate incorrectly when being deconstructed. + - bugfix: You can now rotate computer frames during construction. + - bugfix: Chairs, PA parts, infrared emitters, and doppler arrays will now rotate + clockwise. + - bugfix: Throwing drinking glasses and cartons will now consistently cause them + to break! + - bugfix: Humans missing legs or are legcuffed will no longer move slower in areas + without gravity. + - bugfix: The structures external to stations are now properly lit. Make sure you + bring a flashlight. + - bugfix: Computers will no longer delete themselves when being built, whoops! + - bugfix: Space cats will no longer have a smashed helmet when they lay down. + Skylar Lineman, your local R&D moonlighter: + - rscadd: Research has been completely overhauled into the techweb system! No more + levels, the station now unlocks research "nodes" with research points passively + generated when there is atleast one research server properly cooled, powered, + and online. + - rscadd: R&D lab has been replaced by the departmental lathe system on the three + major maps. Each department gets a lathe and possibly a circuit imprinter that + only have designs assigned by that department. + - rscadd: The ore redemption machine has been moved into cargo bay on maps with + decentralized research to prevent the hallways from becoming a free for all. + Honk! + - balance: You shouldn't expect balance as this is the initial merge. Please put + all feedback and concerns on the forum so we can revise the system over the + days, weeks, and months, to make this enjoyable for everyone. Heavily wanted + are ideas of how to add more ways of generating points. + - balance: You can get techweb points by setting off bombs with an active science + doppler array listening. The bombs have to have a theoretical radius far above + maxcap to make a difference. You can only go up, not down, in radius, so you + can't get 6 times the points with 6 TTVs. The algorithm is exponentially/logarithmically + scaled to prevent "world destroyer" bombs from instantly finishing research. + SpaceManiac: + - bugfix: HUDs from mechs and helmets no longer conflict with HUD glasses and no + longer inappropriately remove implanted HUDs. + - code_imp: Chasm code has been refactored to be more sane. + - bugfix: Building lattices over chasms no longer sometimes deletes the chasm. + - code_imp: Ladders have been refactored and should be far less buggy. + - bugfix: Jacob's ladder actually works again. + - bugfix: Pizza box stacking works again. + - bugfix: Fix some permanent-on and permanent-off bugs caused by the HUD stacking + change. + WJohnston: + - imageadd: A bunch of new turf decals for mappers to play with, coming in yellow, + white, and red varieties! + - bugfix: Green banded default airlocks now have extended click area like all other + airlocks. + Y0SH1 M4S73R: + - spellcheck: The R&D Server's name is now improper. + - spellcheck: The R&D Server now has an explanation of what it does. + arsserpentarium: + - bugfix: now lists should work properly + duncathan: + - rscadd: The RPD has a shiny new UI! + - rscadd: The RPD can now paint pipes as it lays them, for quicker piping projects. + - rscadd: Atmos scrubbers (vent and portable) can now filter any and all gases. + ike709: + - imageadd: Added new vent and scrubber sprites by Partheo. + - bugfix: Fixed some computers facing the wrong direction. + jammer312: + - bugfix: fixed conjuration spells forgetting about conjured items + kevinz000: + - rscadd: purple bartender suit and apron added to clothesmates! + - rscadd: long hair 3 added, check it out. both have sprites from okand! + nicbn: + - soundadd: Now rolling beds and office chairs have a sound! + oranges: + - rscdel: Removed the shocker circuit + psykzz: + - imageadd: Grilles have new damaged and default sprites + - rscadd: Added TGUI for Turbine computer + tserpas1289: + - tweak: Any suit that could hold emergency oxygen tanks can now also hold plasma + man internals + - tweak: Hydroponics winter coats now can hold emergency oxygen tanks just like + the other winter coats. + - bugfix: Plasma men jumpsuits can now hold accessories like pocket protectors and + medals. + zennerx: + - bugfix: fixed a bug that made you try and scream while unconscious due to a fire + - tweak: Skateboard crashes now give slight brain damage! + - rscadd: Using a helmet prevents brain damage from the skateboard! +2017-11-23: + GupGup: + - bugfix: Fixes hostile mobs attacking surrounding tiles when trying to attack someone + MrStonedOne and Jordie: + - server: As a late note, serverops be advise that mysql is no longer supported. + existing mysql databases will need to be converted to mariadb + Robustin: + - tweak: RND consoles will no longer display options for machines or disks that + are not connected/inserted. + ShizCalev: + - bugfix: Aliens in soft-crit will now use the correct sprite. + XDTM: + - rscadd: 'Added two new symptoms: one allows viruses to still work while dead, + and allows infection of undead species, and one allows infection of inorganic + species (such as plasmapeople or golems).' +2017-11-24: + ACCount: + - rscdel: Removed "console screen" stock part. Just use glass sheets instead. + More Robust Than You: + - tweak: Spessmen are now smart enough to realize you don't need to turn around + to pull cigarette butts + SpaceManiac: + - bugfix: Fix water misters being inappropriately glued to hands in some cases. + - bugfix: Some misplaced decals in the Hotel brig have been corrected. + ninjanomnom: + - bugfix: Custom shuttle dockers can no longer place docking regions inside other + custom docker regions. +2017-11-25: + CosmicScientist: + - bugfix: bolas are back in tablecrafting! + Dorsisdwarf: + - tweak: Catpeople are now distracted instead of debilitated + - rscadd: Normal cats now go for laser pointers + SpaceManiac: + - bugfix: You can no longer buckle people to roller beds from inside of a locker. + YPOQ: + - bugfix: AIs and cyborgs can interact with unscrewed airlocks and APCs. + ninjanomnom: + - bugfix: Fixes thermite burning hotter than the boiling point of stone + zennerx: + - bugfix: Zombies don't reanimate with no head! +2017-11-27: + ACCount: + - rscadd: 'New integrated circuit components: list constructors/deconstructors. + Useful for building lists and taking them apart.' + - bugfix: Fixed multiple bugs in integrated circuits UIs, improved overall usability. + More Robust Than You: + - bugfix: Fixed cult leaders being de-culted upon election if they had a mindshield + implant + Naksu: + - bugfix: Hopefully fixed mesons granting the ability to hear people through walls. + Okand37: + - rscadd: Re-organized Delta's departmental protolathes for all departments. + - rscadd: Re-organized Delta's ORM placement by connecting it to the mining office, + which now has a desk for over handing materials to the outside. + - rscadd: Added a second Nanomed to Deltastation's medical bay. + - rscadd: Nanotrasen has decided to add proper caution signs to most docking ports + on Deltastation, warning individuals to be cautious around these areas. + - rscadd: Two health sensors are now placed in Deltastation's robotics area for + medibots. + - bugfix: Atmospheric Technicians at Deltastation can now open up their gas storage + in the supermatter power area as intended. + WJohnston: + - bugfix: Fixed a case where items would sometimes be placed underneath racks. + XDTM: + - balance: Viruses' healing symptoms have been reworked! + - rscdel: All existing healing symptoms have been removed in favour of new ones. + - rscdel: Weight Even and Weight Gain have been removed, so hunger can be used for + balancing in symptoms. + - rscadd: Starlight Condensation heals toxin damage if you're in space using starlight + as a catalyst. Being up to two tiles away also works, as long as you can still + see it, but slower. + - rscadd: Toxolysis (level 7) rapidly cleanses all chemicals from the body, with + no exception. + - rscadd: 'Cellular Molding heals brute damage depending on your body temperature: + the higher the temperature, the faster the healing. Requires above-average temperature + to activate, and the speed heavily increases while on fire.' + - rscadd: Regenerative Coma (level 8) causes the virus to send you into a deep coma + when you are heavily damaged (>70 brute+burn damage). While you are unconscious, + either from the virus or from other sources, the virus will heal both brute + and burn damage fairly quickly. Sleeping also works, but at reduced speed. + - rscadd: Tissue Hydration heals burn damage if you are wet (negative fire stacks) + or if you have water in your bloodstream. + - rscadd: Plasma Fixation (level 8) stabilizes temperature and heals burns while + plasma is in your body or while standing in a plasma cloud. Does not protect + from the poisoning effects of plasma. + - rscadd: Radioactive Resonance gives a mild constant brute and burn healing while + irradiated. The healing becomes more intense if you reach higher levels of radiation, + but is still less than the alternatives. + - rscadd: Metabolic Boost (level 7) doubles the rate at which you process chemicals, + good and bad, but also increases hunger tenfold. + kevinz000: + - bugfix: Cryo cells can now be properly rotated with a wrench. + ninjanomnom: + - rscadd: 'You can now make a new tasty traditional treat: butterdogs. Watch out, + they''re slippery.' +2017-11-28: + ACCount: + - rscdel: '"Machine prototype" is removed from the game.' + - rscdel: Mass-spectrometers are removed. Would anyone notice if not for this changelog + entry? + Cruix: + - rscadd: AI and observer diagnostic huds will now show the astar path of all bots, + and Pai bots will be given a visible path to follow when called by the AI. + JJRcop: + - admin: Fixed the Make space ninja verb. + Naksu: + - code_imp: rejiggered botcode a little bit + SpaceManiac: + - spellcheck: Admin-added "download research" objectives are now consistent with + automatic ones. + improvedname: + - tweak: toolbelts can now carry geiger counters + uraniummeltdown: + - rscadd: You can make many different types of office and comfy chairs with metal + - tweak: Stack menus use /datum/browser +2017-11-29: + MrStonedOne: + - tweak: The sloth no longer suspiciously moves fast when gliding between tiles. + - balance: The sloth's movespeed when inhabited by a player has been lowered from + once every 1/5 of a second to once every second. + SpaceManiac: + - spellcheck: The techweb node for mech LMGs no longer claims to be for mech tasers. +2017-11-30: + ninjanomnom: + - tweak: Reduced the max volume of sm by 1/5th and made the upper bounds only play + mid delamination. + psykzz: + - bugfix: Fixing the broken turbine computer +2017-12-02: + BeeSting12: + - spellcheck: Occupand ---> Occupant on opened cryogenic pods. + - spellcheck: Cyrogenic ---> Cryogenic on opened cryogenic pods. + CosmicScientist: + - rscadd: You can make plushies kiss one another! + Frozenguy5: + - tweak: The Particle Accelerator's wires can no longer be EMP'd + Naksu: + - code_imp: Cleans up some loc assignments + Robustin: + - tweak: Damage examinations now include a "moderate" classification. Before minor + was <30 and severe was anything 30 or above. Now minor is <25, moderate is 25 + to <50, and severe is 50+. + - balance: Clockwork magicks will now prevent Bags of Holding from being combined + on Reebe. + - bugfix: Flashes will now burn out AFTER flashing when they fail instead of being + a ticking time bomb that waits to screw you over on your next attempt. + SpaceManiac: + - tweak: The R&D Console has been given a much prettier interface. + - tweak: Research scanner goggles now show materials and technology prospects in + a nicer way. + uraniummeltdown: + - imageadd: Construct shells have a new animated sprite +2017-12-03: + ExcessiveUseOfCobblestone: + - bugfix: You can now lay (buckle!) yourself to a bed to avoid being burnt to a + crisp during "the floor is lava" event. + Robustin: + - tweak: Igniting plasma statues no longer ignores ignition temperature and only + creates as much plasma as was used in its creation. + Xhuis: + - rscadd: Light fixtures now turn an ominous, dim red color when they lose power, + and draw from an internal power cell to maintain it until either the cell dies + (usually after 10 minutes) or power is restored. + - rscadd: You can override emergency light functionality from an APC. You can also + click on individual lights as a cyborg or AI to override them individually. + Traitor AIs also have a new ability that disables emergency lights across the + entire station. + zennerx: + - spellcheck: fixed some typos in the weapon firing mechanism description +2017-12-04: + AnturK: + - rscadd: You can now record and replay holopad messages using holodisks. + - rscadd: Holodisks are printable in autolathes. + Xhuis: + - bugfix: You now need fuel in your welder to repair mechs. +2017-12-05: + Cyberboss: + - sounddel: Reduced the volume of showers + Dax Dupont: + - rscadd: Nanotrasen is happy to announce the pinnacle in plasma research! The Disco + Inferno shuttle design is the result of decades of plasma research. Burn, baby, + burn! + MrPerson & ninjanomnom: + - refactor: Completely changed how keyboard input is read. + - rscadd: Holding two directions at the same time will now move you diagonally. + This works with the arrow keys, wasd, and the numpad. + - tweak: Moving diagonally takes twice as long as moving a cardinal direction. + - bugfix: You can use control to turn using wasd and the numpad instead of just + the arrow keys. + - rscdel: 'Some old non-hotkey mode behaviors, especially in relation to chatbox + interaction, can''t be kept with the new system. Of key note: You can''t type + while walking. This is due to limitations of byond and the work necessary to + overcome it is better done as another overhaul allowing custom controls.' + Robustin: + - rscdel: Reverted changes in 3d sound system that tripled the distance that sound + would carry. + SpaceManiac: + - spellcheck: Energy values are now measured in joules. What was previously 1 unit + is now 1 kJ. + - bugfix: Syndicate uplink implants now work again. + Xhuis: + - tweak: Stethoscopes now inform the user if the target can be defibrillated; the + user will hear a "faint, fluttery pulse." + coiax: + - rscadd: Quiet areas of libraries on station have now been equipped with a vending + machine containing suitable recreational activities. +2017-12-06: + Dax Dupont & Alek2ander: + - tweak: Binary chat messages been made more visible. + Revenant Defile ability: + - bugfix: Revenant's Defile now removes salt piles + XDTM: + - rscadd: 'Brain damage has been completely reworked! remove: Brain damage now no + longer simply makes you dumb. Although most of its effects have been shifted + into a brain trauma.' + - rscadd: Every time you take brain damage, there's a chance you'll suffer a brain + trauma. There are many variations of brain traumas, split in mild, severe, and + special. + - rscadd: Mild brain traumas are the easiest to get, can be lightly to moderately + annoying, and can be cured with mannitol and time. + - rscadd: Severe brain traumas are much rarer and require extensive brain damage + before you have a chance to get them; they are usually very debilitating. Unlike + mild traumas, they require surgery to cure. A new surgery procedure has been + added for this, the aptly named Brain Surgery. It can also heal minor traumas. + - rscadd: 'Special brain traumas are rarely gained in place of Severe traumas: they + are either complex or beneficial. However, they are also even easier to cure + than mild traumas, which means that keeping these will usually mean keeping + a mild trauma along with it.' + - rscadd: Mobs can only naturally have one mild trauma and one severe or special + trauma. + - balance: Brain damage will now kill and ruin the brain if it goes above 200. If + it somehow goes above 400, the brain will melt and be destroyed completely. + - balance: Many brain-damaging effects have been given a damage cap, making them + non-lethal. + - rscdel: The Unintelligible mutation has been removed and made into a brain trauma. + - rscdel: Brain damage no longer makes using machines a living hell. + - rscadd: Abductors give minor traumas to people they experiment on. + coiax: + - rscadd: The drone dispenser on Metastation has been moved to the maintenance by + Robotics. +2017-12-07: + ShizCalev: + - bugfix: Games vending machines can now properly be rebuilt. + - bugfix: Games vending machines can now be refilled via supply crates. + - rscadd: Games Supply Crates have been added to the cargo console. + SpaceManiac: + - bugfix: Radio frequency 148.9 is once again serviced by the telecomms system. + Xhuis: + - rscadd: Added the Eminence role to clockcult! Players can elect themselves or + ghosts as the Eminence from the eminence spire structure on Reebe. + - rscadd: The Eminence is incorporeal and invisible, and directs the entire cult. + Anything they say is heard over the Hierophant network, and they can issue commands + by middle-clicking themselves or different turfs. + - rscadd: The Eminence also has a single-use mass recall that warps all servants + to the Ark chamber. + - rscadd: Added traps, triggers, and brass filaments to link them. They can all + be constructed from brass sheets, and do different things and trigger in different + ways. Current traps include the brass skewer and steam vent, and triggers include + the pressure sensor, lever, and repeater. + - rscadd: The Eminence can activate trap triggers by clicking on them! + - rscadd: Servants can deconstruct traps instantly with a wrench. + - rscdel: Mending Mantra has been removed. + - tweak: Clockwork scriptures have been recolored and sorted based on their functions; + yellow scriptures are for construction, red for offense, blue for defense, and + purple for niche. + - balance: Servants now spawn with a PDA and black shoes to make disguise more feasible. + - balance: The Eminence can superheat up to 20 clockwork walls at a time. Superheated + walls are immune to hulk and mech punches, but can still be broken conventionally. + - balance: Clockwork walls are slightly faster to build before the Ark activates, + taking an extra second less. + - bugfix: Poly no longer continually undergoes binary fission when Ratvar is in + range. + - code_imp: The global records alert for servants will no longer display info that + doesn't affect them since the rework. + coiax: + - rscadd: The drone dispenser on Box Station has been moved from the Testing Lab + to the Morgue/Robotics maintenance tunnel. + deathride58: + - config: The default view range can now be defined in the config. The default is + 15x15, which is simplified to 7 by BYOND. For reference, Goonstation's widescreen + range is 21x15. Do note that changing this value will affect the title screen. + The title screen images and the title screen area on the Centcom z-level will + have to be updated if the default view range is changed. +2017-12-08: + Dax Dupont: + - bugfix: Fixed observer chat flavor of silicon chat. + - bugfix: Grilles now no longer revert to a pre-broken icon state when you hit them + after they broke. + Dorsisdwarf: + - tweak: Minor fixes to some techweb nodes + - balance: Made flight suits, combat implants, and combat modules require more nodes + Fox McCloud: + - tweak: Slime blueprints can now make an area compatible with Xenobio consoles, + regardless of the name of the new area + MrDoomBringer: + - imageadd: All stations have been outfitted with brand new Smoke Machines! They + have nicer sprites now! + Shadowlight213: + - rscadd: You now can get a medal for wasting hours talking to the secret debug + tile. + - bugfix: Fixed runtime for the tile when poly's speech file doesn't exist. + Xhuis: + - rscadd: You can now make pet carriers from the autolathe, to carry around chef + meat and other small animals without having to drag them. The HoP, captain, + and CMO also start with carriers in their lockers for their pets. + YPOQ: + - bugfix: Fixed the camera failure, race swap, cursed items, and imposter wizard + random events + - tweak: The cursed items event no longer nullspaces items + jammer312: + - rscadd: Action buttons now remember positions where you locked. + - tweak: Now locking action buttons prevents them from being reset. +2017-12-10: + SpaceManiac: + - bugfix: External airlocks of the mining base and gulag are now cycle-linked. + - tweak: The pAI software interface is now accessible via an action button. + Swindly: + - rscadd: You can kill yourself with a few more items. + XDTM: + - tweak: Instead of activating randomly on speech, Godwoken Syndrome randomly grants + inspiration, causing the next message to be a Voice of God. + Xhuis: + - tweak: Flickering lights will now actually flicker and not go between emergency + lights and normal lighting. + - bugfix: Emergency lights no longer stay on forever in some cases. + kevinz000: + - rscadd: Nanotrasen would like to remind crewmembers and especially medical personnel + to stand clear of cadeavers before applying a defibrillator shock. (You get + shocked if you're pulling/grabbing someone being defibbed.) + - tweak: defib shock/charge sounds upped from 50% to 75%. +2017-12-11: + Anonmare: + - bugfix: Booze-o-mats have beer + Cruix: + - tweak: The white ship navigation computer now takes 10 seconds to designate a + landing spot, and users can no longer see the syndicate shuttle or its custom + landing location. If the white ship landing location would intersect the syndicate + shuttle or its landing location, it will fail after the 10 seconds have elapsed. + Frozenguy5: + - balance: Some hardsuits have had their melee, fire and rad armor ratings tweaked. + Improvedname: + - tweak: cats now drop their ears and tail when butchered. + Robustin: + - bugfix: Modes not in rotation have had their "false report" weights for the Command + Report standardized + SpaceManiac: + - bugfix: The MULEbots that the station starts with now show their ID numbers. + - bugfix: The dependency by Advanced Cybernetic Implants and Experimental Flight + Equipment on Integrated HUDs has been restored. + kevinz000: + - bugfix: flightsuits should no longer disappear when you take them off involuntarily + - bugfix: beam rifles actually fire striaght now + - bugfix: click catchers now actually work + - bugfix: you no longer see space in areas you normally can't see, instead of black. + in reality you can still see space but it's faint enough that you can't tell + so I'll say I fixed it. + uraniummeltdown: + - rscadd: Added MANY new types of airlock assembly that can be built with metal. + Use metal in hand to see the new airlock assembly recipes. + - rscadd: Added new airlock types to the RCD and airlock painter + - rscadd: Vault door assemblies can be built with 8 plasteel, high security assemblies + with 6 plasteel + - rscadd: Glass mineral airlocks are finally constructible. Use glass and mineral + sheets on an airlock assembly in any order to make them. + - tweak: Glass and mineral sheets are now able to be welded out of door assemblies + rather than having to deconstruct the whole thing + - rscdel: Airlock painter no longer works on airlock assemblies (still works on + airlocks) + - bugfix: Titanium airlocks no longer have any missing overlays +2017-12-12: + Mark9013100: + - rscadd: Medical Wardrobes now contain an additional standard and EMT labcoat. + Robustin: + - rscadd: The blood cult revive rune will now replace the souls of braindead or + inactive cultists/constructs when properly invoked. These "revivals" will not + count toward the revive limit. + - rscadd: The clock cult healing rune will now replace the souls of braindead or + inactive cultists/constructs when left atop the rune. These "revivals" will + not drain the rune's energy. + Swindly: + - bugfix: Swarmers can no longer deconstruct objects with living things in them. + kevinz000: + - bugfix: You can now print telecomms equipment again. +2017-12-13: + Naksu: + - bugfix: glass shards and bananium floors no longer make a sound when "walked" + over by a camera or a ghost + SpaceManiac: + - bugfix: Nonstandard power cells found in MULEbots, cyborgs, and elsewhere now + have the correct description. + deathride58: + - bugfix: Genetics will no longer have a random block completely disappear each + round +2017-12-15: + AverageJoe82: + - rscadd: drones now have night vision + - rscdel: drones no longer have lights + Cruix: + - bugfix: Shuttles now place hyperspace ripples where they are about to land again. + Cyberboss: + - config: Added "$include" directives to config files. These are recursive. Only + config.txt will be default loaded if they are specified inside it + - config: Added multi string list entry CROSS_SERVER. e.g. CROSS_SERVER Server+Name + byond://server.net:1337 + - config: CROSS_SERVER_ADDRESS removed + Epoc: + - bugfix: Adds Cybernetic Lungs to the Cyber Organs research node + JStheguy: + - rscadd: Added 10 new assembly designs to the integrated circuit printer, the difference + from current designs is purely aesthetics. + - imageadd: Added the icons for said new assembly designs to electronic_setups.dmi, + changed the current electronic mechanism and electronic machine sprites. + MrStonedOne: + - server: Added new admin flag, AUTOLOGIN, to control if admins start with admin + powers. this defaults to on, and can be removed with -AUTOLOGIN + - admin: Admins with +PERMISSION may now deadmin or readmin other admins via the + permission panel. + Naksu: + - code_imp: Preliminary work on tracking cliented living mobs across Z-levels to + facilitate mob AI changes later + - code_imp: Tidied up some loc assignments + - code_imp: fixes the remaining loc assignments + ShizCalev: + - soundadd: Revamped gun dry-firing sounds. + - tweak: Everyone around you will now hear when your gun goes click. You don't want + to hear click when you want to hear bang! + SpaceManiac: + - code_imp: Remote signaler and other non-telecomms radio code has been cleaned + up. + Xhuis: + - rscadd: Grinding runed metal and brass now produces iron/blood and iron/teslium, + respectively. + - balance: As part of some code-side improvements, the amount of reagents you get + from grinding some objects might be slightly different. + - bugfix: Some grinding recipes that didn't work, like dead mice and glowsticks, + now do. + - bugfix: All-In-One grinders now correctly grind up everything, instead of one + thing at a time. + nicbn: + - imageadd: Closet sprites changed. +2017-12-16: + Armhulen and lagnas2000 (+his team of amazing spriters): + - rscadd: Mi-go have entered your realm! + Robustin: + - balance: Marauder shields now take twice as long to regenerate and only recharge + one charge at a time. + - balance: Marauders now have 120hp down from 150hp. + - bugfix: The wizard event "race swap" should now stick to "safer" species. + - bugfix: Zombies are now properly stunned for a maximum of 2 seconds instead of + 2/10ths of a second. + - tweak: Zombie slowdown adjusted from -2 to -1.6. + SpaceManiac: + - bugfix: The shuttle will no longer be autocalled if the round has already ended. + Xhuis: + - tweak: Vitality matrices don't have visible messages when someone crosses them + anymore. +2017-12-17: + More Robust Than You: + - code_imp: Changed roundend sounds and lobby music to use one proc for choosing + sounds + - server: You can now easily host roundstart sounds without changing the code! + - config: RIP in shit round_start_sounds.txt + XDTM: + - rscadd: A few new traumas have been added. + - balance: Thresholds to get brain traumas have been lowered, as they currently + pretty much only trigger if you intentionally chug impedrezene. + - tweak: Melee head hits deal minor brain damage. Crits still do a significant amount. + - tweak: Nuke Op implants no longer trigger on deathgasp. (They still explode on + death) + - tweak: You'll now receive messages when crossing certain brain damage thresholds. + - tweak: Split Personalities are instructed not to suicide while in control. + - tweak: Godwoken Syndrome now randomly sends Voice of God commands, instead of + being controllable. + Xhuis: + - bugfix: Clockcult power alerts will no longer show outside of the clockcult gamemode + (they could be triggered by scarabs.) + ninjanomnom: + - bugfix: You can use the old non-hotkey mode text input behavior (keyboard input + automatically directed at the text input box) by changing your hotkey mode in + preferences + - rscadd: You can use Shift+E or Shift+B for belt/backpack respectively to quickly + put in your held item or take out the most recently added item. +2017-12-18: + AnturK: + - rscadd: Repeated messages will now be squashed in the chat. + Cyberboss: + - bugfix: Allied station communications are back, now with potentially multiple + stations + Naksu: + - tweak: Hostile mobs on z-levels without living players will now conserve their + efforts and simply not run AI routines at all. Also, idling mob routines should + be significantly cheaper on non-station Z-levels. + ShizCalev: + - soundadd: Added new sounds to guns when reloading. + - bugfix: Cartridges and casings ejected from guns will now make the proper sound! + Xhuis: + - bugfix: Microwave sound loops now correctly stop when it breaks or is otherwise + interrupted mid-cook. + coiax: + - rscadd: A lollipop dispenser in "dispense lollipops" mode can push the lollipop + straight into the targets hand, rather than getting it dirty on the floor first. + - tweak: Aliens (and humans with alien organs) will have a prompt if they try to + create resin structures or lay eggs atop vents or scrubbers. + nicbn: + - bugfix: Now the chem smoke machine uses stock parts for volume and range. + ninjanomnom: + - bugfix: Decals should now rotate the correct way around. + oranges: + - tweak: Dance machine will not play tracks to you if you have instruments turned + off +2017-12-19: + More Robust Than You: + - tweak: Jungle Fever cannot be cured anymore + - bugfix: The Monkey Leaders' virus are now un-detectable by health scanners and + to the PANDEMIC now. + Shadowlight213: + - bugfix: Fixed captain's PDA showing unusable Toggle Remote Door menu option + XDTM: + - rscadd: Abductors can now see if people already have glands! Never worry about + abducting the same guy twice again. + - rscadd: Added the Mind Interface Device to the abductor shop for 2 Credits. Only + scientists can use it. + - rscadd: 'The MID has two modes: Transmit and Control.' + - rscadd: Transmit will allow you to send a message anytime, anywhere to the mind + of a target of your choice, regardless of language barriers. The message will + be anonymous, but abductor-like. + - rscadd: Control allows you to give a temporary directive to a target with an implanted + gland, that they MUST follow. Duration and amount of uses varies by gland type. + When a gland is spent, it will no longer respond to Control signals. The target + forgets ever receiving the objective when the duration ends. + coiax: + - balance: The codespeak manual now has unlimited uses and costs 3 TC. + - bugfix: Nuke ops can now purchase the codespeak manual, as was intended. + - rscadd: Golems can now wear labcoats. + kevinz000: + - rscadd: You can now joust with spears if you are riding on another mob, whether + it's a hapless cyborg or otherwise! Additional damage and stunchance will be + added per tile moved! + ninjanomnom: + - bugfix: Non movement keys pressed while moving no longer stop movement. +2017-12-20: + AnturK: + - rscadd: You can enforce no smoking zones with a disarm aimed at the smokers mouth. + coiax: + - rscadd: A changeling will learn all languages from anyone they absorb. +2017-12-21: + Fox McCloud: + - bugfix: Fixes arm implants being immune to EMPs + SpaceManiac: + - refactor: Telecomms and radio code has been cleaned up. + - tweak: The PDA message server is now a real piece of telecomms machinery. + - tweak: PDA logs now include the job as well as name of the participants. + - bugfix: The Syndicate frequency no longer hears its own messages twice. + - bugfix: Talking directly into a radio which is also hot-miked no longer double-talks. + - bugfix: Passing a space transition no longer interrupts pulls. + Xhuis: + - bugfix: You can no longer elect two Eminences simultaneously. + - bugfix: The Eminence no longer drifts in space. + - tweak: The Eminence's mass recall now works on unconscious servants. + - tweak: The Eminence's messages now have follow links for observers. + - balance: Floors blessed with holy water prevent servants from warping in and the + Eminence from crossing them. + - balance: The Eminence can never enter the Chapel. + coiax: + - rscadd: At the end of the round, all players can see who the antagonists are. + improvedname: + - bugfix: Corrects 357. speedloader in the autolathe + kevinz000: + - rscdel: Integrated circuit smoke circuits now require 10 units of reagents to + fire. + uraniummeltdown: + - rscadd: You can adjust line height in chat settings + - tweak: Default chat line height is slightly shorter, from 1.4 to 1.2 +2017-12-22: + Awesine: + - rscadd: added some things which happen to be mining scanner things to that gulag + thing + Kor: + - rscadd: During Christmas you will be able to click on the tree in the Chapel to + receive one present per round. That present can contain any item in the game. + Naksu: + - bugfix: frying oil actually works + WJohnston: + - tweak: Syndicate nuke op infiltrator shuttle is no longer lopsided. + kevinz000: + - rscadd: 'Clown modules have been added for cyborgs! Modules: Bikehorn, Airhorn, + instrumental bikehorn, clown stamp, multicolor paint, rainbow crayon, soap, + razor, purple lipstick, nonstunning selfcharging creampie cannon, nonslipping + selfcharging water sprayer, lollipop fabricator, metallic picket sign, mini + extinguisher, laughter reagent hypospray, and the ability to hug. experimental: + When emagged they get a fire spray, "super" laughter injector, and shocking + or crushing hugs. Also, the module is adminspawn only at the moment.' + - bugfix: Projectiles that pierce objects will no longer be thrown off course when + doing so! + - code_imp: Projectiles now use /datum/point/vectors for trajectory calculations. + - bugfix: Beam rifle reflections will no longer glitch out. +2017-12-23: + Dax Dupont: + - bugfix: Borgs will no longer have their metal/glass/etc stacks commit sudoku when + it runs out of metal. They will also show the correct amount instead of a constant + of "1" on menu interaction. + Kor: + - rscadd: During Christmas you will be able to click on the tree in the Chapel to + receive one present per round. That present can contain any item in the game. + Robustin: + - tweak: The EMP door shocking effect has a new formula. Heavy EMP's will no longer + shock doors while light EMP's have a 10% chance (down from 13.33%). + coiax: + - balance: The kitchen gibber must be anchored in order to use. + - balance: The gibber requires bodies to have no external items or equipment. +2017-12-24: + Frozenguy5: + - bugfix: Soapstones now give the correct time they were placed down. + More Robust Than You: + - tweak: Vending machines now use TGUI + SpaceManiac: + - bugfix: '"Download N research nodes" objective is now checked correctly again.' +2017-12-25: + SpaceManiac: + - bugfix: The Syndicate radio channel works on the station properly again. + coiax: + - rscadd: Ghosts can now use the *spin and *flip emotes. + uraniummeltdown: + - rscadd: Examine a door assembly to check what custom name is set. +2017-12-26: + Cyberboss: + - tweak: Objects that can have materials inserted into them only will do so on help + intent + PsyKzz: + - rscadd: Jaws of life can now cut handcuffs + SpaceManiac: + - admin: Play Internet Sound now has an option to show the song title to players. + XDTM: + - balance: Rebalanced healing symptoms. + - balance: Cellular Molding was replaced by Nocturnal Regeneration, which only works + in darkness. + - balance: All healing symptoms now heal both brute and burn damage, although the + basic ones will still be more effective on one damage type. + - balance: Plasma Fixation and Radioactive Metabolism heal toxin damage, offsetting + the damage done by their healing sources. + - balance: Changed healing symptoms' stats, generally making them less punishing. + Xhuis: + - balance: Medical supplies on all normal maps (Box, Meta, Delta, Omega, and Pubby) + are now behind ID-locked windoors. These windoors will become all-access during + red alert! + YPOQ: + - bugfix: Emagged cleanbots can acid people again + - bugfix: Headgear worn by monkeys can be affected by acid + ninjanomnom: + - bugfix: The auxiliary mining base can no longer be placed on top of lava, indestructible + turfs, or inside particularly large ruins. + - bugfix: The backup shuttle has it's own area now and you should no longer occasionally + be teleported there by the arena shuttle. + - bugfix: Cycling airlocks on shuttles should work correctly when rotated now. + - bugfix: Things like thermite which burned through walls straight to space now + stop on plating. You'll have to thermite it again to get to space. +2017-12-27: + More Robust Than You: + - code_imp: Changed roundend sounds and lobby music to use one proc for choosing + sounds + - server: You can now easily host roundstart sounds without changing the code! + - config: RIP in shit round_start_sounds.txt + Nero1024: + - soundadd: blast doors and shutters will now play a sound when they open and close. + Robustin: + - bugfix: Hallucinations will no longer show open doors "bolting". + SpaceManiac: + - code_imp: The R&D console has been made more responsive by tweaking how design + icons are loaded. + Xhuis: + - rscadd: Maintenance drones and cogscarabs can now spawn with holiday-related hats + on some holidays! + coiax: + - rscadd: Deltastation now has christmas trees during seasonally appropriate times. + deathride58: + - bugfix: Praise the lord! The shift+scroll hotkey to zoom in/out as a ghost works + properly again! + kevinz000: + - rscadd: you can now pick up corgi's and pAIs, how disgustingly cute + - code_imp: Forensics is now a datum component. + - balance: NPC humans will now start leaving fingerprints on things they touch! +2017-12-28: + Cyberboss: + - bugfix: Ghost lights will follow the ghost while orbiting + Robustin: + - bugfix: Splashing a book with ethanol should no longer produce errant messages. + - balance: Dead cultists can now be moved across the "line" on Reebe. +2017-12-29: + CosmicScientist: + - rscadd: timestop now inverts the colours of those frozen in time! + Dax Dupont: + - bugfix: APCs and other wall mounted objects are no longer blocked by the secure + medbay storage parts. + - bugfix: Removed a duplicate radiation collector on Deltastation. + More Robust Than You: + - bugfix: The Radiance can now enter the chapel + - bugfix: Monkey chat should no longer have .k prefixed + - bugfix: Monkey leaders should actually get jungle fever now + Robustin: + - bugfix: The action button for spells should now accurately reflect when the spell + is on cooldown + - bugfix: You can now reliably use the button for "touch" spells to "recall" the + spell + SpaceManiac: + - code_imp: Explicit z-level checks have been changed to use defines. + XDTM: + - rscadd: 'Added a new reagent: Pax.' + - rscadd: Pax is made with Mindbreaker, Synaptizine and Water, and those affected + by it are forced to be nonviolent against living beings. At least, not directly. + coiax: + - rscadd: Adds an internal radio implant, allowing the use of the radio if you expect + to have your headset removed. Or if you don't have any ears or hands. It can + be purchased for 4 TC from any Syndicate uplink. + - rscadd: Nuke ops now buy special "syndicate intelligence potions" that automatically + insert an internal radio implant when used successfully. Cayenne can now participate + in your high level discussions. +2017-12-30: + Cyberboss: + - tweak: Burial jumpsuits no longer have suit sensors + - tweak: The chemistry job has been removed from Omegastation. Medical doctors still + have full chemistry access + MrDoomBringer: + - imageadd: NanoTrasen has sent the station new spaceheaters! They look nicer now! + Xhuis: + - balance: Vitality matrices now apply Ichorial Stain when reviving a dead servant, + which prevents that servant from being revived again by vitality matrices for + a full minute. + - balance: Vitality matrices can't be placed adjacent to one another. + - balance: Brass skewers now damage and stun cyborgs. + - balance: Vitality matrices no longer drain people impaled on brass skewers. + - balance: Pressure sensors have 5 health again (down from 25.) + ninjanomnom: + - bugfix: Some changes to turfs like shuttles would result in un-initialized space + tiles being created. This has been fixed. +2017-12-31: + Cyberboss: + - rscadd: Explosions now cause camera shake based on intensity and distance + F-OS: + - bugfix: Last resort now requires a confirmation + Naksu: + - code_imp: loot drop spawners now assign their pixel offsets to the items they + spawn, also have a "fanout" setting to distribute items in a neat fashion like + in omega/delta's core and some tech storages. + - tweak: replaced several law boards in uploads with spawners, the net result being + one more board in uploads that may be a duplicate asimov (but hopefully isn't) + SpaceManiac: + - bugfix: Viewing photos sent by PDA message works again. + WJohnston: + - rscadd: Redesigned the entire syndicate lavaland base to be more stylish, have + functioning power and atmos as well as a turbine to play with. + XDTM: + - bugfix: Fixed a hallucination that would say [target.first_name()] instead of + the actual name. +2018-01-01: + Dax Dupont: + - bugfix: PDA messages have been fixed. +2018-01-02: + Dax Dupont: + - bugfix: The bank vault is no longer metagaming. It will now display the IC station + name. + DaxDupont: + - bugfix: Solar control consoles are no longer pointing to the wrong direction, + you can now turn tracking off again and manual positioning of solar panels have + been fixed. + Frozenguy5: + - rscadd: Adds a goon and cult emoji. Improves gear and tophat. (Credits to GoonStation + for creating the goon bee sprite.) + Okand37: + - rscadd: Overhauled aesthetic of some portions of Omegastation + - rscadd: Overhauled Omegastation's departure lounge, fitting it with the rest of + the station's theme + - rscadd: Replaced the personal closets with wardrobes in Omegastation's Lockerroom + - rscadd: Made Omegastation's engine room floortiles reinforced + - rscadd: Replaced the cola and snack machines with their random counterparts on + Omegastation + - bugfix: Fixed Omegastation's self destruct console being a doomsday device + - bugfix: Fixed Omegastation's chemistry shutters not all being synced and rearranged + the chemmaster. + - rscadd: Added a small technology storage in maintenance near departures on Omegastation + - rscadd: Added additional loot and emergency supplies to maintenance on Omegastation + - rscadd: Added the X-01 Multiphase to the Captain's Locker, Blueprints to Vault, + Reactive Teleportation Armor to Server Room and theHypospray to Medical Storage + on Omegastation + XDTM: + - bugfix: Fixed Runic Golem's Abyssal Gaze blinding permanently. + - balance: Ocular Restoration has been removed, its effect transfered on Sensory + Restoration. + - balance: Sensory Restoration now heals both eye and ear damage. + - balance: Mind Restoration now no longer heals ear damage, but now heals brain + damage by default. + - balance: Mind Restoration's thresholds can now let the symptoms cure mild brain + traumas at 6 resistance and severe ones at 9. + ninjanomnom: + - bugfix: Turfs are construct-able again +2018-01-03: + Cyberboss: + - bugfix: Fixed lathe power consumption being too high + - bugfix: You no longer cut yourself with shards when clicking a portal + Dax Dupont: + - bugfix: After 2 years and 2 separate issues the paper mache wizard robe has finally + been fixed. + Naksu: + - rscadd: A damaged core AI module may now spawn in AI uploads. It contains a random + amount of ionic laws with normal law priorities. + - bugfix: splash-fried food is now actually edible + SpaceManiac: + - bugfix: Mimes now laugh silently. + deathride58: + - tweak: Explosions will no longer give everyone and their mothers motion sickness + from a mile away. +2018-01-04: + Cyberboss: + - bugfix: The bloodcult sacrifice objective description won't change when the target + is sacrificed + Dax Dupont: + - rscadd: PDA Interface color is now a preference. + - bugfix: Fixed PDA font style not applying at round start. + - rscadd: 'The following messages have been added to dead chat: Security level change, + (re)calling, Emergency Access, CentComm/Syndicate console messages, outgoing + server messages and announcements,' + MrStonedOne: + - bugfix: The changelog hadn't been updating. This has been fixed. + ShiggyDiggyDo: + - tweak: Syndicate experts were able to create more sophisticated copies of the + nuclear authentication disk. While still unable to detonate the nuclear fission + explosive with them, they're practically identical to the real disk if not examined + closely. +2018-01-05: + Cruix: + - bugfix: Chameleon PDAs now have their chameleon action. + Okand37: + - rscadd: Added a fully functioning A.I. satellite to Omegastation! + - rscadd: Added the CE's magboots to the gravity room on Omegastation! + - rscadd: Added a medical wrench to cryo for Omegastation! + Shadowlight213: + - bugfix: Devils will no longer be permanently stuck if interrupted while trying + to jaunt. + - bugfix: Devils will now properly clear the fake fire if failing to jaunt. + SpaceManiac: + - bugfix: The startup load time of away missions has been drastically reduced. + - bugfix: The admin notification for the pulse rifle prize now shows the correct + coordinates. + deathride58: + - bugfix: Explosions now function properly again! +2018-01-10: + Robustin: + - bugfix: Blood cultists will now properly display a "reverted to their old faith" + message when deconverted. +2018-01-11: + Cyberboss: + - spellcheck: Fixed mechanical arms grammar when failing to activate + - bugfix: You will now no longer hit closets when attempting to anchor them + ExcessiveUseOfCobblestone: + - code_imp: Adds Stat Tracking to Techwebs by node and order. + Selea: + - rscadd: pulling claw.Integrated circuit, which allow assemblies to pull things. + ShizCalev: + - bugfix: 'Meta: The UI for the captain''s cigarette vendor now works again.' + - tweak: 'Meta: Removed the omnizine filled syndicate cigarettes from the captain''s + cigarette vendor.' + - tweak: Medbots are no longer able to inject you if you do not have any exposed + flesh. + Someguynamedpie: + - bugfix: Use world.timeofday instead of world.realtime + SpaceManiac: + - spellcheck: Replaced "CentComm" with "CentCom" in communications console deadchat + announcement. + - refactor: Information about the properties of z-levels is now less hardcoded than + before. + Tortellini Tony: + - rscadd: 'New hotkey for admin say command: F3.' + yorii: + - spellcheck: Renamed the ChemMaster eject button to highlight the fact that the + buffer does not get cleared +2018-01-12: + Cobby: + - tweak: As a human, you will now point with your legs when you have no arms, falling + over each time. + - tweak: As a human, you will bump your head on the ground trying to motion towards + something when you have no arms or legs. + Cyberboss: + - spellcheck: Fixed message grammar when lifting someone off a brass skewer + - bugfix: Fixed the original poker tables not being deleted after Narsie converted + them to a wooden table + Dax Dupont: + - rscadd: Thanks to the extensive disco and plasma research gathered by the Disco + Inferno shuttles, an indestructible mark V disco machine is now available. The + latest edition of the Disco Inferno shuttle now carries it. + JJRcop: + - code_imp: Removes some links intended for admins from game logs. + More Robust Than You: + - balance: Sigils of submission now uncuff upon successful conversion + PKPenguin321: + - tweak: Cyborgs that take enough damage to have a module disabled will now automatically + announce that they've had a module disabled to anybody nearby. Now if you want + to stop a cyborg from interfering with your business but don't want to kill + it, you can simply bash until you see the CRITICAL ERROR message. + - soundadd: Borgs will play an alarm sound in addition to displaying this message + as they have their modules disabled. + ShizCalev: + - bugfix: You can now attach collars to pets again! + - bugfix: Corrected pet collars icon mismatch. + - bugfix: Pets will now drop their collars when gibbed. + - tweak: You will no longer be able to rename unique pets, such as Ian or Runtime. + You can still rename pets without a special name. + - bugfix: Secbot assemblies will no longer lose their weld hole when dragged North + - imageadd: Secbot assemblies now have new North facing sprites! + - imageadd: Cleaned up a rogue pixel on beepsky's sprite. + - bugfix: Defibrillators now have inhands again! + - bugfix: Defibrillators will no longer stay in your hands after you die. + - bugfix: Losing an arm while wielding a two handed weapon will now cause you to + drop the weapon. + - bugfix: Losing an arm while carrying an item that requires two hands to hold will + now cause you to drop the item. + - spellcheck: Improved user feedback from chem dispenser macros. + - bugfix: Fixed Tests Areas debug verb. + - bugfix: Only the chaplain can now purify a bloody bastard sword. + - bugfix: Fully healing a mob as an admin now cures disabilities properly. + - bugfix: Non-cultists hulks can no longer withstand the immense powers of Ratvar's + influence while holding a bloody bastard sword. + - bugfix: The average body temperature has been corrected to 98.6F. + - tweak: Safe dials will now present itself in 1 number increments, instead of 5. + - bugfix: Relabeled canisters will no longer switch to an incorrect sprite when + broken. + SpaceManiac: + - bugfix: Relabelled canisters once again have the correct description. + - bugfix: The interface of airlock consoles has been restored to normalcy. + YPOQ: + - bugfix: Securitrons/ED-209s/Honkbots will only activate their emag functions after + their internals are emagged +2018-01-14: + Dax Dupont: + - bugfix: The NT Violet Lepton shuttle has been retrofitted with lava proof windows + for the lava engine. They will no longer catch fire and violently decompress + the shuttle. + Leshana: + - bugfix: Fix attempt to use `in` on a non-list. Pretty sure bitfields do not work + that way. + - admin: SS_NO_FIRE subsystems will no longer display pointless cost statistics + in MC panel + QualityVan: + - balance: Due to budget cuts, the vault safe is now slightly less resistant to + explosions. + ShizCalev: + - bugfix: Constructed security/honk/ect bots will now drop the correct parts when + destroyed. + - bugfix: "Some areas will no longer present themselves at \"\xC3\xBFUnexplored\ + \ Area\"" + SpaceManiac: + - bugfix: The R&D console design icon for slot machines is no longer mangled. + - bugfix: The Ark's teleportation checks now take mechs and sleepers into account + correctly. + - spellcheck: Activating internals via the right-side button produces better messages + on success. + - bugfix: The RPD will no longer fail to paint and layer pipes in some situations. + - bugfix: Unwrenching canisters from connector ports on non-default layers now resets + their pixel offset. + Thunder12345: + - bugfix: The NES Port emergency shuttle will no longer drain the CentComm emergency + dock of air + XDTM: + - tweak: Dreams are now more immersive and interesting. + deathride58: + - admin: You can now choose an outfit to be equipped while transforming a mob to + human via rudimentary transform. +2018-01-15: + Cruix: + - rscadd: Roundend traitor purchase logs now have tooltips showing the name, cost, + and description of the items. + F-OS: + - rscadd: NT has disabled their automatic APC lock + - tweak: The space heater now has a warning on it about use in the SM. + Half of coderbus ended up working on this somehow: + - rscadd: Goats will now dismember plant people when attacking them. + Iamgoofball: + - bugfix: The Express Console emag effect is now worth using. + JohnGinnane: + - bugfix: Fixed not being able to alt click on a stack + More Robust Than You: + - bugfix: Monkey Leaders should now properly get Jungle Fever + - bugfix: Monkeymode roundend report should now properly show Major/Minor victory + - bugfix: Monkeys should now get the jungle fever objective in monkeymode + - imageadd: Wirecutters can come in even more colors now! + ShizCalev: + - bugfix: RPDs and pipe painters now have more colorssssssssssssssssss + SpaceManiac: + - bugfix: Title screens without multiple dots in their filename will now be chosen + again. + - bugfix: MMIs in mechs or held by humans wearing fireproof suits are no longer + burnt by ash storms. + WJohnston: + - rscadd: Encrypted radio waves have been detected airing around station space. + Watch for possible enemy communications. + - rscadd: The space syndicate listening post has been remade from scratch, and now + has an actual ghost role to help spy on the station and relay info to traitors! + Xhuis: + - tweak: Added some new tips to the list for fighting the clockcult! + - rscadd: Added a new bar sign, The Lightbulb. + YPOQ: + - bugfix: Players are immune to their own slime time stops again + coiax: + - rscadd: A xenomorph maid (or barmaid) cleans the floor as they walk on it. Lie + down, and they'll clean your face. + ninjanomnom: + - admin: There are 3 new helpers in the secrets menu for messing with movement controls + - bugfix: Mining base walls when broken turn into plating which in turn breaks down + to the basalt surface. + theo2003: + - tweak: The autolathes on MetaStation, and DeltaStation next to R&D are now accessible + from R&D via windoor. +2018-01-16: + AnturK: + - bugfix: Photos now properly capture everything again. + DaedalusGame: + - bugfix: fixed duplicate reagent definitions in chem macros + SpaceManiac: + - bugfix: Heat exchange manifold pipes facing east/west now work again. + Thunder12345: + - bugfix: The asteroid with engines strapped to it will no longer vent both the + CentCom docks and its own entrance. + XDTM: + - rscadd: Reworked the species side of xenobiology. + - rscadd: Instead of an universal unstable mutation toxin, green slimes can now + produce slime mutation toxin (plasma), human mutation toxin (blood), and lizard + mutation toxin (radium). + - balance: Slime mutation toxin requires several units and some time before acting, + unless you're already a slimeperson (in which case it will randomize your subspecies) + - rscadd: Two new jellypeople subspecies have been added to make up for the lost + species. + - rscadd: Stargazers have telepathic abilities; they can Send Thoughts, privately + and anonimously, to any target they can see, and they can Link Minds with any + aggressively grabbed mob to form a hivemind with them. Hiveminds have no limit + but expire when the Stargazer dies or changes species. + - rscadd: Luminescents glow faintly and can absorb slime cores to gain special abilities. + Each core has a minor and a major ability, generally based on what they normally + do. Using these abilities does not use up the cores, but it has a cooldown depending + on the ability's power. + - balance: Slimepeople can now switch bodies on death or when unconscious, as long + as they have another one. +2018-01-17: + DaedalusGame: + - balance: you can't get 12 syndi bomb cores from stripping the syndi lava base + for parts anymore + - bugfix: fixed the syndi lava base blowing up from stray colossus shots, goliaths + breaking in or miners throwing gibtonite at it. + F-OS: + - tweak: Air alarms start unlocked + - bugfix: Air alarms no longer think they are fire alarms + - bugfix: Drone dispensers no longer hide drones + - bugfix: Ash storms aren't at ear-rapey volumes inside shielded areas. + ShizCalev: + - bugfix: Gas tanks are now made of metal! Honk + SpaceManiac: + - bugfix: Clicking lattices and girders with the RPD now succeeds instead of appearing + to place a pipe but failing. + - bugfix: The debug verbs "Display Air Status" and "Air Status in Location" now + format their reports the same and actually work more often. + - bugfix: The Camera Failure event no longer crashes the server if the station has + no cameras. + - admin: SDQL "select" outputs now have buttons to jump to the coordinates of the + found objects. + Xhuis: + - balance: You now have to climb through rifts to Reebe by walking into them, instead + of instantly warping away when you bump into one. + - balance: The separation line between the crew spawn and servant spawn in Reebe + now blocks airflow. + - rscadd: Added a new bar sign, The Lightbulb. + - bugfix: The Eminence's mass recall ability should now work properly + coiax: + - rscadd: If enough people vote to start CTF (by clicking on a CTF controller as + a ghost), then CTF will automatically begin. + deathride58: + - rscadd: By using a multitool on a radiation collector, you can use it to generate + research points! This requires a tank filled with a mix of tritium and oxygen. + - tweak: The display of rad collectors' power production rates has been moved from + a multitool interaction to examine text. + - tweak: Radiation collectors now emit a ding when they run out of fuel. + kevinz000: + - bugfix: Flashes can no longer work from inside containers to flash people outside. + - balance: Research export cargo points have been halved + nicbn: + - tweak: The Pirate Code changed its first rule to "BE AN SKELETON YARR". The old + "there are no rules" is now the second rule. +2018-01-18: + Buggy123: + - tweak: full-tile plasmaglass windows have had their integrity increased to the + correct value. +2018-01-19: + AverageJoe82: + - tweak: Reduce clock work mob death sound file's volume to 80% + Buggy123: + - rscadd: Observers can now view the atmospheric contents of the tile they're floating + above. + Cyberboss: + - refactor: Added test run mode which checks for runtimes in startup/shutdown and + runs tests (if they were enabled during compilation). Invoke it with the "test-run" + world parameter + Dax Dupont: + - bugfix: Autolathe now consumes reasonable amounts of power when inserting materials + - bugfix: Fixed conveyor belt power usage. + Frozenguy5: + - code_imp: Travis now builds on BYOND 512.1403 + Joan and More Robust Than You: + - rscadd: Adds moths! They're a new species that is able to fly in pressurized areas + provided gravity is off... and that they still have wings. + More Robust Than You: + - rscadd: Added some useful sec officer tips + OrdoM: + - rscadd: Adds morphine recipe to chemistry. + - rscdel: Removed ability for bartender to steal all morphine on the map + Robustin: + - bugfix: Fixed frost oil (cryosting) sending insulated crewmembers below absolute + zero temperatures. + - bugfix: Fixed damaging cold temps being a death sentence to simple mobs (they + wouldn't heat back up to safe temps at room temperature). + - refactor: Refactored human temperature code, insulating clothing now helps you + stay warm but going unprotected will help you cool off. However, you will now + benefit from colder temps when you're overheating even in full EVA/hardsuit + gear and you will warm up faster at room temperature in insulated gear as well + (i.e. putting on a winter coat will no longer suppress your temperature if your + already cold). + - bugfix: All crew can now purify bloody bastard swords with a bible (available + from cargo religion crates, library, or chapel) once again. + Shadowlight213: + - rscadd: Players can now have a verb in the ooc tab to see their own tracked playtime + - bugfix: fixed admin bypass not using the right proc + - bugfix: Lavaland ghost roles should now show up in the playtime report + ShizCalev: + - bugfix: Floors that look damaged / burned are now ACTUALLY damaged / burned, and + can be repaired! + SpaceManiac: + - bugfix: PDA messages sent by the message monitor console are now included in the + talk logs. + XDTM: + - tweak: Mass Hallucination now will give everyone the same hallucination. + - bugfix: Slimepeople can now properly swap between bodies. + - bugfix: Slimes no longer attack people with their same faction. + Xhuis: + - tweak: Servants can now cancel warps by clicking the button again, instead of + having to manually interrupt it by doing something like picking up an item from + their pocket. + coiax: + - rscdel: The Free Golem Ship no longer has a teleport beacon. + - rscdel: Jaunters no longer have a special effect when teleporting golems. + deathride58: + - rscadd: Mappers can now color individual tiles of floors via turf decals. + - bugfix: Cancelling the "Change equipment" command now works as expected again. + uraniummeltdown: + - bugfix: Jaunting wraiths should now always be facing the correct direction + yorii: + - bugfix: fixed the syringe getting a transfer amount of 0 if the contents of it + are 0, intended feature was probably to check the target and not the syringe + itself for clamp. +2018-01-20: + MrDoomBringer: + - rscadd: All Cargo Techs now come equipped with a standard supply Export Scanner! + Get to selling! + XDTM: + - bugfix: Fixed a bug where slimes wouldn't eat neutral mobs. + uraniummeltdown: + - tweak: Emagged airlocks can now be deconstructed simply by crowbarring when the + panel is open +2018-01-21: + Dax Dupont: + - bugfix: Moth wings will now respect your preferences. + WJohnston: + - rscadd: We've lost contact with one of our trade caravans in your sector, be on + the lookout for possible enemy activity. + - rscadd: Redesigned the syndicate ambush space ruin. It now boasts multiple flyable + shuttles and looks a lot prettier. + - imageadd: Wirecutter greyscaling is now less ugly +2018-01-22: + DaedalusGame: + - balance: foam and smoke now get 4x the reagents as they should according to the + comments + - bugfix: fixes pyrosium and cryostylane not heating or cooling humans at all + - bugfix: fixes cryostylane cooling beakers to negative kelvin, it's now limited + to what the description says + - bugfix: fixes cryostylane cooling people to negative body temperature + - code_imp: removed redundant check in trans_to + - code_imp: fixes a runtime when total_volume is 0 in copy_to + - tweak: Gas reagents (o2, plasma, ...) now dump out gas based on container temperature + instead of room temperature + Dax Dupont: + - rscadd: Fans of clown photography have successfully lobbied Nanotrasen to include + camera and camera accessories designs in the autolathe. + - tweak: Brings material values for the camera in line with other devices. + - tweak: The tapes printed by autolathes now come in random colors. + Dax Dupont & Coiax: + - rscadd: Praise the lord for he has granted thy chaplains, wizards, revenants and + eminences with holy vision. They can now see blessed tiles. + MMMiracles: + - rscadd: Syndicate and pirate mobs now give off light when appropriate + More Robust Than You: + - bugfix: Fixed monkey teams + - tweak: The Lepidopterian language now has less spaces in it + Robustin: + - bugfix: Fixed monkeys slowly freezing to death + ShizCalev: + - bugfix: Clockcultists and revolutionaries can no longer be mindswapped. + SpaceManiac: + - refactor: Weather and certain events have been updated to use Z traits. + - bugfix: The Staff of Storms now correctly starts and ends storms if used from + inside lockers. + - bugfix: Weather telegraph messages are now shown to those inside lockers and mechs. + - bugfix: Radio jammers no longer affect other z-levels. + Tlaltecuhtli: + - tweak: min player req for rev is 30 now + Xhuis: + - bugfix: Emergency lights now function correctly. + deathride58: + - code_imp: Light fixtures no longer use hardcoded values for their power and colour. + ninjanomnom: + - bugfix: Functions that aren't intending on actually moving the shuttle yet don't + send error messages to admins anymore when seeing if a shuttle *can* move. + scrubs2009: + - tweak: Candles last longer + uraniummeltdown: + - bugfix: Bananium shows up on mining scanners again +2018-01-23: + Cruix: + - bugfix: engine goggles set to t-ray mode will no longer show pipes with the wrong + rotation. + - bugfix: cables now show up on t-ray scans. + Dax Dupont: + - bugfix: Fixed missing tile under autolathes + MrDoomBringer: + - rscadd: NanoTrasen's Creative Psychology Initiative has brought new training to + all crewmembers to foster rapid, innovative problem-solving! You can now kill + yourself in so many more ways! + - rscadd: The RnD department can now develop firmware upgrades to the Express Supply + Console, unlocking advanced cargo drop pods! + Naksu: + - code_imp: removed a bunch of unnecessary vars, combining them into a bitfield + SpaceManiac: + - bugfix: Fixed occasional runtimes when ion storms or overflow would replace an + existing law. + WJohnston: + - bugfix: Space syndie listening post now has a real microwave, and a book management + console. Lava listening post comms room intercom now no longer starts with broadcast + on. + - rscadd: the syndicate drop ship and fighter pods from the caravan ambush can now + be flown to the syndicate listening post. The fighter pods also now have xray + cameras because regular ones were super useless. + XDTM: + - rscadd: Added Regenerative Jelly, made with tricordrazine and slime jelly. It + regenerates a bit faster, and won't harm jellypeople. + - rscadd: Added Energized Jelly, made with teslium and jelly. It works as an anti-stun + chemical for slimepeople and speeds up luminescents' power cooldown, but non-jellypeople + will just get shocked. + - rscadd: 'Added Pyroxadone, made with cryoxadone and slime jelly. It''s basically + inverse cryoxadone: it heals faster the hotter your body temperature is.' + - tweak: Cryoxadone no longer deals toxin damage to jellypeople. + - tweak: Purple Slime Extracts no longer have their sugar->slime jelly reaction + (obsolete with extract grinding), and instead have a blood->regen jelly reaction. + - tweak: Purple Extract's major activation by Luminescents now give regenerative + jelly instead of tricordrazine. + coiax: + - rscadd: Fake nuclear disks can only be identified by the captain, observers, nuclear + operatives, seeing where the pinpointer points, or attempting to put it into + a nuclear device. + - rscadd: Fake nuclear disks "respawn" on the station just like the real one. + kevinz000: + - rscdel: pulling claw can now only passively grab + - bugfix: Infrared beams now update instantly. + ninjanomnom: + - bugfix: Changeling clothing can get bloodied again. + the hatchet man (i eat garbage code): + - bugfix: 'you shitlords picked the wrong virtual anime tits to fuck so im takin + away your space bases experimental: lets be fair all you guys did in those was + jack off to hentai, and not real man''s gachimuchi' +2018-01-24: + Dax Dupont: + - bugfix: Fixed missing wheat fridge on omega and removes a duplicate pipe. + - rscadd: Beakers and beaker-like objects now get put in your hand on ejection from + chemistry devices. + Shadowlight213: + - bugfix: Fixed eye damage not being applied if it was exactly 3. + YPOQ: + - bugfix: Emergency lights will give off light again + ninjanomnom: + - bugfix: Pointing at squeaky things doesn't make them squeak anymore. +2018-01-25: + Dax Dupont: + - imageadd: Autolathe now repeats it's animation while printing. + - tweak: You now need to examine engravings to pop open the menu. + - bugfix: People can no longer extract 300 supermatter shard slivers without it + exploding. + - bugfix: Fixed thongs not dusting people on use. + Jittai: + - tweak: All color inputs now use the current color, of the thing being colored, + as default choice. + More Robust Than You: + - rscadd: You can now defib monkeys and aliums + - tweak: Monkeys can also use defibs now, too! + Naksu: + - code_imp: Slightly refactored object armor code + Ordo: + - rscadd: Adds Ketrazine, a powerful but dangerous combat stim which the crew can + synthesize + Robustin: + - balance: Clockwork marauders now take more time (+3s) and power (7x) to create. + - balance: The "recent marauder" time limit is now 60 seconds, up from 20. The limit + now has a significantly smaller effect on summon time but will act as a further + cap on marauder summoning until it has passed. + - tweak: The marauder cap will now only account for living cultists. + - rscadd: 'A new cocktail: The Nar''Sour. Made from blood, demonsblood, and lemon + juice, this cocktail is known to induce a slightly different type of slurring + when imbibed.' + SPACE CONDUCTOR: + - tweak: Shuttles will throw you around if ya don't buckle in + Shadowlight213: + - balance: Moths are now more susceptible to bright lights + Togopal, Armhulenn, Naksu, Jordie & oranges: + - rscadd: Snakes! They hunt vermin on the station! Curators have a natural phobia + to them. + - rscadd: They can be purchased in cargo. + XDTM: + - rscadd: Slimepeople and Jellypeople can now speak the slime language. + - tweak: Slimes now only speak slime language, although they still understand common. + - balance: Slimepeople are no longer virus immune. + - bugfix: The above change fixes a bug that made black slime cure itself. + Xhuis: + - balance: Fleshmend can no longer be stacked several times at once. + - balance: Fleshmend no longer heals changelings who are on fire, and heals burn + damage half as quickly as brute and oxygen damage. + - code_imp: Fleshmend has been refactored into a status effect. + coiax: + - rscadd: Nuclear operatives that wish to fail in style can purchase Centcom Official + and Clown costumes. They can also buy a defective chameleon kit. + - rscadd: The majority of shuttles are now loaded at the start of the round from + template, rather than being premapped. As a side effect, Delta's mining shuttle + now docks facing down at Lavaland. + imsxz: + - rscadd: Traitor clowns are now able to purchase clown bombs from their uplinks. + Honk! + - rscadd: Clown bombs can now be placed via a small beacon, the same way normal + syndicate bombs can be. + - tweak: clown bomb payload now summons 50 clowns instead of 100 + nicbn: + - bugfix: Now if you lose arms you won't be able to see through your uniform. + ninjanomnom: + - bugfix: Loaded templates now get placed on top of existing terrain so as to preserve + baseturfs. This fixes survival pods walls breaking to lava as well as allows + some future fixes. +2018-01-26: + Cruix: + - bugfix: Fixed being able to rotate things in only one direction. + DaedalusGame: + - rscadd: Firefighting Foam reagent, better alternative to water and corn oil for + firefighting purposes + Dax Dupont: + - rscadd: You can now rename and copy holodisks! + - rscadd: Holorecordings now can be looped. + - tweak: Holodisks now have materials and the autolathe cost has been adjusted. + - bugfix: Fixed holodisk speaker name not getting set when on non-prerecorded messages. + Epoc: + - bugfix: Slows Simple Clown mobs + GuppyLaxx: + - bugfix: Fixes the Ketrazine recipe + Iamgoofball: + - balance: Power cells explosions are now logarithmic + Naksu: + - code_imp: Cleaned up some /obj/item vars + - bugfix: Pneumatic cannons no longer misbehave when their contents such as primed + grenades get deleted (explode) + Robustin: + - rscadd: The Peacekeeper Borg's "Peace Hypospray" now includes the "Pax" reagent, + which prevents the subject from carrying out many forms of direct harm. + SpaceManiac: + - spellcheck: Clockwork armaments are no longer named "arnaments". + - bugfix: The Syndicate Listening Post's medicine closet now has the correct access. + coiax: + - rscadd: Syndicate intelligence potions also grant an internal syndicate ID card + to the simple animal granted intelligence. This effectively means that Cayenne + can open the airlocks on the Infiltrator. + uraniummeltdown: + - bugfix: You can no longer weld airlock assemblies for infinite materials +2018-01-27: + Anonmare: + - balance: The Syndicate Chameleon Kit is now available during rounds of lower population. + Because of course you can have an e-sword and revolver without restriction but + disguising and RP is verboten because we deathmatch station now. + Dax Dupont: + - bugfix: Eminence won't get spammed by tile crossing now. + Denton ShizCalev Kor Kevinz000 (original idea): + - balance: Due to budget cuts, the shoes shipped with chameleon kits no longer prevent + slipping. The premium version is unchanged and still sold separately. + - balance: To compensate, the chameleon kit cost was lowered by 2 TC and the minimum + crew limit removed. + Jittai: + - imageadd: New Morgue Tray sprites. + - imageadd: New Crematorium sprites. + Naksu: + - bugfix: Away missions no longer require manually adjusting subsystem mob/client + lists in order to not have the AI break. + WJohnston: + - bugfix: The lavaland syndie base is now packed with considerably fewer explosives, + and should lag far less brutally when exploding. + coiax: + - balance: Mobs will now start with a random nutrition amount, between hungry and + mildly well fed. + - rscadd: Nanotrasen Security Division has reported that syndicate comms agents, + both on lavaland and in space, have had training in "Codespeak", a top secret + language for stealthy communication. + uraniummeltdown: + - imageadd: Ore boxes have a new sprite +2018-01-29: + ACCount: + - rscadd: Having station blueprints in your hands now reveals function of wires + in station objects. + DaedalusGame: + - bugfix: fixed a strange pipenet issue that happens when a singular pipe or manifold + is placed directly between two or more components and wrenched last. + Dax Dupont: + - bugfix: After 3 years of intensive research by Nanotrasen's elite team of chefs, + rice dishes such as rice pudding are no longer considered salads. + Denton: + - spellcheck: Fixed Bubblegum's description. + F-OS: + - tweak: Academy is now part of the random station names. + Mark9013100: + - rscadd: Cloning data disks can now be constructed after researching the Genetic + Engineering technode. + MrStonedOne: + - tweak: 511 Clients can see atmos gases + - rscdel: This reverts the fix that prevents atmos gas overlays from stealing clicks. + Naksu: + - bugfix: Attempting to join into a command role as a nonhuman species no longer + lets you keep your nonhuman species languages if you are transformed into a + human because of a config option + - bugfix: Warp whistle can no longer pick up its user from inside various animation/in-between + states and effects such as transformations, jellypeople split, talisman of immortality + effect period or rod form. + WJohnston: + - bugfix: The centcom ferry shuttle now works again. + XDTM: + - balance: Peacekeeper cyborgs have synth-pax instead of normal pax, which has the + same effect but wears out faster. + - rscadd: Xenobiology consoles can now scan slimes and apply potions remotely. Use + potions on the console to load them. + - rscadd: Abductors now have the chemical, electric and trauma glands. + - rscdel: Removed the bloody, bodysnatch and EMP glands. + - tweak: The abductor viral gland now generates a random advanced virus instead + of a basic one. + - tweak: The abductor heal gland now also heals toxin damage. + - tweak: The abductor mindshock gland can now cause different reactions. + - tweak: The abductor slime gland now gives the slime faction. + - tweak: The abductor species gland now randomizes the victim's appearance and name + on top of the species. + - rscadd: 'Abductors have a new surgery type: violence neutralization. It has the + same steps as brain surgery, but it will instead inflict a Pacifism trauma upon + the victim, making them mostly harmless in the future.' + - rscadd: Bath Salts now give complete stun immunity while they last. + - balance: Ketrazine now gives immuity to sleeping. + improvedname: + - rscadd: Adds bz to cargo + ninjanomnom: + - rscdel: Removed the ability to create new shuttle areas or expand existing ones + with blueprints. + - bugfix: Special areas like rooms which require no power can no longer be expanded. + You can still expand into them however. + - bugfix: Turning to face a direction with control no longer moves you in the faced + direction after releasing control. + uraniummeltdown: + - rscadd: You can alt-click microwaves to turn them on +2018-01-30: + Cyberboss: + - bugfix: Blood contracts now only show living players and real names + DaedalusGame: + - tweak: made fire colored according to blackbody radiation and rule of cool. + - imageadd: some kind of lightning texture + Dax Dupont: + - rscadd: Cyborgs can now be upgraded to be h-u-g-e! Only a cosmetic effect! + ExcessiveUseOfCobblestone: + - bugfix: Turrets now check for borgs. Syndicate turrets are nice to emagged borgs + too! + Iamgoofball: + - bugfix: Minor code cleanup on the wirer + Jalleo: + - balance: nerfs power cells from a insane max possibility + Jittai: + - imageadd: Crematoriums and Morgue Trays now have directional states. + - bugfix: Morgue Trays now checks for cloneable people like the dna-scanner does. + (ghosts can roam now) + - bugfix: Cremated mice no longer leave behind snackable bodies. + - bugfix: Ash does not get instantly deleted in the crematorium upon creation. Ash + also piles up. (aesthetically only) + - tweak: Morgue/Crematorium Trays make a slight rolling sound. + More Robust Than You: + - tweak: Announcing messages while drunk will be slurred + Naksu: + - bugfix: Subjects without hearts now display as unsuitable for abductor experiments + when probed with the advanced baton. + - balance: BZ gas now makes lings lose their chems and hivemind access. The chem + loss is gradual. + - rscdel: 'Removed actual reagent quadrupling added in #34485' + - rscdel: Removed the foam effect combining feature, hopefully to be replaced with + something less completely and utterly broken + PKPenguin321: + - rscadd: Attention, space explorers! Nothing is out of your reach with the ACME + Extendo-Hand (TM)! With it, you can get a WHOLE EXTRA TILE OF REACH! Hug or + punch your friends from a whole 3 feet away! Win one from an arcade machine + or make one in the Misc. tab of your crafting menu today! + Robustin: + - rscadd: Blood magic. The next generation of talismans - you can create 2 spells + without a rune, up to 5 with a rune of empowerment. Preparing spells without + a rune will cost a significant amount of blood. Every talisman has been rebalanced + for its spell form. With a few exceptions, blood magic exists as a "touch" spell + that is very similar in behavior/appearance to the wizard touch spells. + - rscadd: New UI system for cultists. + - rscdel: Removed talismans, Talisman Creation Rune replaced by Rune of Empowerment. + Supply talisman has been replaced by a ritual dagger and 10 runed metal. + - rscadd: Ritual Dagger, replacing the Arcane Tome. This is largely a thematic alteration + but its to reinforce that your primary tool is also a weapon. + - bugfix: Cyborgs and AI are finally unable to see runes again + - tweak: Only the cult master can forge Bastard swords now, regular cultists can + get a mirror shield. + - rscadd: 'The mirror shield, it blocks, it reflects, it creates illusions, and + an incredible throwing weapon! The mirror shield also bears a unique weakness: + Shotgun slugs, .357 rounds, and other high damage projectiles will instantly + shatter it and briefly stun the holder.' + - balance: Nar'sien Bolas will not longer ensnare cultists and non-cultists will + ensnare themselves when attempting to use them. The bolas are now comparable + in effectiveness with reinforced bolas. + - rscadd: Rune of Spirits. This merges the Spirit Sight and Manifest Ghost rune. + The user will now choose which effect when invoking. + - rscadd: The Spirit Sight function has received several major improvements, allowing + the ghost to commune with the cult and mark objects similar how the cult master + can. The user has a unique appearance while ghosted and manifested cult ghosts + can see ghosts as well - allowing their summoner to lead them from the spirit + realm. + - balance: The Form Barrier rune will now last significantly longer and examining + the rune as a cultist will tell you how long it will remain. + - rscadd: The Apocalypse Rune. Replaces the EMP runes. Has a fixed invoker requirement + and added usage limitations. It scales depending on the crew's strength relative + to the cult. Effect includes a massive EMP, unique hallucination for non-cultists, + and if the cult is doing poorly, certain events. The rune can only occur in + the Nar-Sie ritual sites and will prevent Nar-Sie from being summoned there + in the future. + - rscdel: No more EMP rune. + - balance: The conceal/reveal spell now has 10 charges and will conceal far more, + including cult structures and flooring. + - balance: The stun spell will now stun for ~4 less seconds and silence for 2 more + seconds. + - balance: The EMP spell now costs 10 health to use, up from 5, and has had its + heavy/light EMP range nerfed by 1 and 2 respectively (now 3 and 6). + - balance: The shackles spell now has a silence effect similar to the stun talisman. + - balance: The hallucination spell now has multiple charges. + - tweak: The teleport spell can now be used on other adjacent cultists. + - tweak: Summon Tome and Summon Armor have been combined into "Summon Equipment", + which lets you choose between summoning a Ritual Dagger or Combat Gear (same + loadout that Summon Armor used to provide). + - balance: Standard cult robes now have -10 melee and -10 laser armor. + - balance: The "Construction" spell will now convert airlocks into cult airlocks + and cyborgs (after ~10 seconds) into constructs. The airlock is the most fragile + in the game, with reduced integrity, armor, and render it vulnerable to most + attacks. Cyborg "reconstruction" will be accompanied by an obvious effect/sound. + - rscadd: Blood Rites. This spell allows you to absorb blood from your surroundings + or adjacent non-cultists. You can use the blood rites as a convenient heal (self-healing + is significantly more costly though) or you can try to gather large quantities + of blood for unique and powerful relics. + - rscadd: Blood spear, a fragile but robust spear with a special recall ability + - rscadd: Blood bolts, the cultist's version of arcane barrage. The bolts will infuse + cultists with unholy water and damage anything else. + - rscadd: Blood beam, the ultimate blood rite. After a channeling period it will + fire 12 powerful beams across a long distance, piercing almost any surface (except + blessed turf), and damaging all non-cult life caught in the beam. + - tweak: All cult structures now generate significantly less light. + - balance: Pylons will now heal constructs faster and restore slightly more blood + than before. + - balance: Cult floors are now highly resistant to atmospheric changes. + - bugfix: Unholy water will now splash victims properly. + - balance: Unholy Water Vials created at altars now contains 50 units, and is better + at healing brute, and deals slightly more damage to non-cultists, the splash + ratio was reduced to 20% to compensate for the increased volume and damage. + - balance: Holy water will purge any and all blood spells from cultists. + - rscadd: Artificers, Wraiths and Juggernauts can now scribe revive, teleport, and + barrier runes respectively with a 3 minute cooldown. + - balance: Juggernauts' forcewall is now 3x1 but it has a ~30% longer cooldown. + Juggernauts got a modest speed increase (2.5 from 3) but lost a modest amount + of HP (200 from 250). + - rscadd: Juggernauts now get a ranged attack "Gauntlet Echo", a single projectile + that moves about as fast as them and does 30 damage with 5 seconds of stun and + a 35s cooldown. + - balance: The number of ghosts summonable by the manifest spirit rune is 3, down + from 5. + - balance: It now takes ~20% less water (~25 units) and ~30 seconds less to deconvert + cultists via holy water. + - tweak: The emagged library console will now distribute ritual daggers. + - tweak: Using the dagger on a rune will now take a 1-second channel to destroy + it, to avoid incidents where people instantly wipe a critical rune by accident. + - balance: Standard runed airlocks now have a lower damage deflection so they can + be destroyed with most respectable melee weapons (10+). + - balance: Teleporter runes that are used from space or lavaland will result in + the destination rune giving off a unique effect for 60 seconds. This effect + includes a long distance (but not obvious antagonistic) sound, a bright lighting + effect, and a visual cue that will indicate where the cultist arrived from. + Shadowlight213: + - tweak: Pluoxium is no longer considered dangerous for air alarms. + XDTM: + - tweak: Slimepeople can now host multiple minds in their body pool; occupied bodies + will be marked as such in the bodyswap panel. + - tweak: Slimepeople now retain 45% of their slime volume upon splitting instead + of a fixed amount. + Xhuis: + - rscadd: Defibrillator mounts can now be found in the CMO's locker or produced + from a medical protolathe after Biotech is unlocked. They can be attached to + walls, and hold defibrillators for public use. You can swipe an ID to clamp + the defibrillator in place, and it will automatically draw from the powernet + to recharge it. Being one tile away from the mount will force you to drop the + paddles. + - balance: Stargazers have been removed. + - balance: The clockwork cult now has a power cap of 50 kW. + - balance: Script scripture is now unlocked at 25 kW, and Application at 40 kW, + instead of 50 kW and 100 kW. + - tweak: Important scriptures are now displayed with italicized names. + Xhuis & Jigsaw: + - rscadd: Traitor clowns can now purchase the reverse bear trap, a disturbing head-mounted + execution device, for five telecrystals. + kevinz000: + - rscadd: Chameleon laser guns now have a special firing mode, activated by using + them in hand! Only certain gun disguises will allow this to work! + nicbn: + - bugfix: Bloodpacks will have their colors defined by the reagents + - imageadd: MMI dead sprite will now show a red light and no eyes instead of X-crossed + eyes + uraniummeltdown: + - imageadd: Solar panels have new sprites + - imageadd: Coffins have a new sprite +2018-02-01: + CosmicScientist: + - balance: tomatoes and similar ovary laden edibles are fruit, not veg, beware plasmamen + and mothmen + Denton: + - bugfix: Added a missing distress signal to the space ambush ruin. + Jalleo: + - rscdel: Space ghost syndicate comms guy removed. + Jittai: + - bugfix: Cloning doesn't runtime (and indefinitely get stuck) on cloning non-humans. + - tweak: Some of the Morgue Trays and Crematoriums on Box, Delta, and Meta have + been re-positioned to make use of their new directional states. + - imageadd: New Horizontal Coffin Sprites + SpaceManiac: + - tweak: The Whiteship spawn point is now a space ruin rather than being fixed every + round. + Xhuis: + - balance: Servant golems no longer appear in the magic mirror race list. + - bugfix: Cogs now fucking work + cebutris: + - spellcheck: The text you get when you examine a stunbaton to see the battery level + now uses the item's name instead of "baton" +2018-02-02: + Dax Dupont: + - tweak: Hijack objectives will only be given out if there are 30 or more players. + DeityLink: + - rscadd: You can now see the rays from a holopad displaying a hologram! + Epoc: + - bugfix: Soap now has inhand sprites + Xhuis: + - balance: Brass skewers now must be at least one tile apart. + - balance: Steam vents can no longer be placed within cardinal directions of other + steam vents, and will not hide objects they're placed on top of. + - bugfix: Races that have eyes that look different from regular humans' no longer + have white eyespots where human eyes appear. + Xhuis, Cosmic, Fwoosh, and epochayur: + - rscadd: Added pineapples to botany, and a recipe for Hawaiian pizza. + improvedname: + - rscadd: adds yeehaw to the dj's disco soundboard + oranges: + - rscdel: removes ketrazine +2018-02-03: + Dax Dupont: + - tweak: Moved the lathe from box's cargo room to box's cargo office which miners + now can access. + - tweak: Harmonized medbay storage access requirements so all maps allow all medbay + personnel into medbay storage like on Meta and Delta. + - tweak: Moved service lathes into a dedicated service hall/storage area if they + weren't accessible by janitor or bartender. + SpaceManiac: + - code_imp: Removed the now-unused revenant spawn landmark. + Xhuis: + - bugfix: Servant cyborgs with the Standard module now correctly have Abscond. + - bugfix: Securing pipe fittings now transfers fingerprints to the new pipe. + - bugfix: The firelock below the Circuitry Lab airlock on Boxstation will no longer + cover it up when the airlock is open. + uraniummeltdown: + - bugfix: Some airlock animations should no longer be glitchy and restart in the + middle +2018-02-04: + Buggy123: + - rscadd: Morgue trays now detect if a body inside them possesses a consciousness, + and alerts people nearby + Cruix: + - rscadd: The Rapid Piping Device can now dispense transit tubes. + Dax Dupont: + - rscadd: Added logout button to the record screen in the security records console. + - rscadd: Allows you to print photos that are in the security records. + Incoming5643: + - rscadd: The ability to throw drinks without spilling them has been moved from + something bartender's just know how to do to a book that they spawn with, the + ability has also been made into a toggle. + - rscadd: Any number of people can read the book to learn the ability, and it can + also be ordered in the bartending crate in cargo. Bartenders are encouraged + to keep their trade secrets close to their stylish black vests. + Kor: + - bugfix: Fixed mecha grav catapults not being included in techwebs. + MrDoomBringer: + - imageadd: Conveyor Belts now look better when they are crowbar'd off the ground. + - rscadd: Due to complicated quantum-bluespace-entanglement shenanigans, the Bluespace + Drop Pod upgrade for the express supply console is now slightly more difficult + to research. + Robustin: + - bugfix: Vape Pens (e-cigs) will now consume reagents proportional to the vape + size and static smoke production. + - bugfix: Command reports should now properly weight the appearance of modes based + on their existence in our actual game rotation. + - balance: The current mode now has a 35% chance of not appearing in the report. + ShiggyDiggyDo: + - rscadd: You can now win stylish steampunk watches at your local arcade machine! + ShizCalev: + - bugfix: Fixed some broken cultist & wizard antagonist ghost polls. + - rscadd: The Syndicate Comms Officer ghost role has been readded with a minor chance + of actually existing. + Slignerd: + - balance: Following an immense number of complaints filed by security and command + personnel, the Captain's spare ID will from now on be placed inside his locker. + We fail to see how this would help the Captain access the spare in the event + he lost his ID, but the complainants have been VERY insistent. + SpaceManiac: + - bugfix: The pirate ship can now fly again. + Xhuis: + - balance: Integration cog power generation has been increased to 10 W per second + (up from 5 W per second.) Power consumed from the APC remains at 5 W per second. + - balance: Integration cogs will now continue generating power at half-speed when + the APC they are in has no energy. + coiax: + - balance: Romerol is now effective on dead bodies, not just ones that are still + alive. + nicbn: + - rscadd: Destroying windows will now spawn tiny shards +2018-02-05: + Dax Dupont: + - balance: Regular cyborgs now start with a normal high capacity cell instead of + a snowflake cell. Resulting in less confusing and 2.5MJ more electric charge. + - bugfix: Fixed name of the upgraded power cell + - refactor: Removed duplicate cell giving code in transformation proc. + - bugfix: Fixed the crematorium on meta and box. + Denton: + - tweak: Rearranged the mining vendor items by price and item group. + - tweak: In order to promote back-breaking physical labor, Nanotrasen has additionally + made conscription kits available at mining equipment vendors. + Iamgoofball: + - rscdel: Blood cultists can't space base anymore + MMMiracles: + - rscadd: A once-thought abandoned arctic post has recently had its gateway coordinates + re-enabled for access via the Gateway link. Contact your local Exploration Division + for more details. + More Robust Than You: + - bugfix: Holorays are now properly deleted if you switch holopads automatically + Naksu and kevinz000: + - tweak: Ores are no longer completely impervious to explosions, but rather "proper" + ores are destroyed by the strongest explosions and sand is blown away everything + but the weakest ones. This shouldn't affect ore spawns from explosions + - tweak: Lavaland bomb cap reduced to double the station bombcap. + - refactor: Ores are now stackable. Ore stacks now have the appearance of loose + ores and are not called "sheets" by machines that consume them. + - code_imp: Material container component now uses the singular names of stack objects. + - refactor: /obj/item/ore/Crossed() is now removed in favor of the ore satchel utilizing + a redirect component + ShiggyDiggyDo: + - spellcheck: You no longer win double the articles at the arcade + SpaceManiac: + - bugfix: Research investigate logs now actually include the name of the researcher. + XDTM: + - bugfix: Fixes intelligence potions removing previously known mob languages + - tweak: Slime scanning now has a more readable output, especially when scanning + multiple slimes at once + - tweak: Eggs from the abductor egg gland now have a random reagent instead of acid +2018-02-06: + Dax Dupont: + - bugfix: AIs can no longer turn on broken APCs, + SpaceManiac: + - bugfix: Defibrillator mounts no longer spam the error log while empty. + - bugfix: The various ships in the caravan ambush space ruin can now fly again. +2018-02-07: + DaedalusGame: + - bugfix: Fixes Noblium Formation being multiplicative, so having 500 moles of tritium + and 500 moles of nitrogen no longer produces 2500 moles of noblium (it should + correctly produce 10 moles) + - bugfix: Fixes most reactions deleting more gas than exists and making gas out + of nowhere + - bugfix: Fixes Stim Formation invoking a byond bug and not using its intended polynomial + formula + - bugfix: Fixes Cryo Cells not having garbage_collect and clamping + - bugfix: Fixes Rad Collectors not having clamping + - bugfix: Fixes Division by Zero when Fusion has no impurities. + - bugfix: Removes a redundant line in lungs + - bugfix: Fixes rad_act signal not firing from turfs, living mobs, rad collectors + and geiger counters + - bugfix: fixes lava burning into chasm tiles i hate hate hate hate them so much + grrrr + - tweak: NT Scientists have started looking into data from small-scale detonations + and found that there's still potential data to be gathered from explosive yields + lower than 4.184 petajoules + Dax Dupont: + - tweak: Moved the pocket protector to lockers instead of on the uniform. + - rscadd: You can now insert holodisks into cameras and take a static holographic + picture of someone! + - rscadd: Hologram recordings can now be offset slightly. + - rscadd: Posibrains have gotten a small firmware update, they will now play a sound + on successful activation. + - rscadd: Killing a revenant will now result in an unique shuttle to be able to + be bought. You probably won't like it though. + - rscadd: Fake emag now available. + Denton: + - spellcheck: Mining drone upgrades are no longer referred to as "ugprade" + - tweak: Fungal tuberculosis spores can no longer be synthesized by machinery. + Kor: + - rscadd: Spawning as a syndicate comms officer will now activate an encrypted signal + in the Lavaland Syndicate Base, to aid the crew in retaliating. + Ordo: + - rscadd: Mamma-mia! The chef speaks-a so different now! + Robustin: + - balance: The "construct shell" option from the cult archives structure will now + only yield one shell instead of two. + - balance: Sacrificing suicide victims will now only yield an empty shard. + - balance: Synths and Androids are no longer available species at the magic mirror. + ShiggyDiggyDo: + - rscadd: You can now win Toy Daggers at your local arcade! + Skylar Lineman: + - rscadd: Nanotrasen has new intelligence that the newest batch of Syndicate agent + equipment includes sticky explosives disguised as potatoes, designed to incite + terror among whoever is unlucky enough to have one stuck onto their hands. + - rscadd: 'Nanotrasen''s toy suppliers have also started making faux versions of + these, with less-forceful attachment mechanisms and absolutely zero explosive + materials for a child-safe experience. experimental: Explosive Hot Potatoes + are now available for purchase by syndicate-affiliated cooks, botanists, clowns, + and mimes.' + SpaceManiac: + - bugfix: Pressure damage now takes effect in certain situations where it should + have but did not. + Xhuis: + - rscadd: Nanotrasen's anomalous materials division has recently experienced a containment + breach, during which a certain pizza box went missing. Be on the lookout for + any slipups in cargo. + - spellcheck: Pizza margherita is now named "pizza margherita" (the proper way!) + instead of just "margherita." + - tweak: Brass chairs now stop spinning after eight rotations, so you can't crash + the server with them. + coiax: + - rscadd: Eggs now contain 5u of egg yolk. Breaking an egg in a glass container + adds all reagents inside to the container. If you're laying abductor gland eggs, + then you'll get 5u of egg yolk and 10u of random reagent. Egg glands now make + you act like a chicken while laying eggs. Egg laying makes you use the aliennotice + span. + kevinz000: + - balance: Explosive holoparasites must now be adjacent to turn objects into bombs, + instead of being able to do so from any range. +2018-02-09: + Cyberboss: + - balance: Printed power cells must now be charged before use + Dax Dupont: + - bugfix: Supermatter can again blow up again on space tiles. + - bugfix: Fixed borgs applying cuffs on people without the right number of arms. + - refactor: Handcuff code has been rejiggled and snowflake code has been removed. + - rscdel: Removed unused cable cuffs module stuff for borgs. + - bugfix: Telecom equipment now can only be printed by engineers and scientists + as intended. + - bugfix: WT-550 AP can only be printed by sec now. + - tweak: Removed engineering requirement for arcade machines to bring it in line + with others. + - rscadd: Defibs can now be researched and printed. + - balance: Hatches are now small instead of tiny. + Denton: + - code_imp: Changed can_synth values from 0/1 to FALSE/TRUE + - code_imp: Removes grind_results from empty soda cans since they can't be ground. + - spellcheck: For consistency's sake, aluminium is now universally spelled with + two 'i'. + Epoc: + - imageadd: Belt items now have inhand sprites + Evsey9: + - balance: Integrated Circuit Drones are now bulky to improve safety ratings, and + therefore, cannot be stored in normal backpacks or pockets, but now can accept + modules that bulky circuit machinery can. + - balance: Grabbers can now grab items up to the size of the circuit assembly they + are in. + - balance: Grabbers cannot store circuit machinery the same or larger size than + the circuit assembly they are in. + - tweak: Throwers now can throw items up to the size of circuit assembly they are + in. + MMMiracles: + - rscadd: A brand new space-farm, where your family sends all your old/sick catpeople + to live out the rest of their days being free to roam the acres and chase the + field grayshirts. + Naksu: + - bugfix: Cyborg engineering module geiger counters now work properly again + PKPenguin321: + - rscadd: As it would happen, the chef does not actually have Italian genes, but + rather was being influenced by a strange moustache-a. + Robustin: + - bugfix: Fixes the cult master getting two notifications on the cult forge + - rscadd: Blood spells will now "follow" the spell creation button, which is now + unlocked by default. If you want your spell "hotbar" to appear somewhere else, + just move the blood spell button, it will update when you prepare a new spell. + Also, individual spells start off locked but if you unlock them they will no + longer reposition when the spells are updated. + Robustin and More Robust Than You: + - rscadd: A heart disease event has been added. The cure is heart replacement surgery. + Effects of cardiac arrest are halted by the chemical Corazone. Once cardiac + arrest begins at Stage 5, the disease can be cured by a defibrillator or from + a lucky electric shock. + - rscadd: Using gym equipment will now grant a hidden exercise buff that prevents + heart disease for 20 minutes. + SpaceManiac: + - bugfix: Goliath hide plates now properly apply to explorer suits and APLUs again. + oranges: + - rscdel: Removed the saltmine grief shuttle +2018-02-10: + Cruix: + - balance: Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen + to plasma, hydrogen, and oxygen. + - bugfix: These were necessary due to recipe conflicts + Dax Dupont: + - bugfix: Cloner UI now properly updates cloning pod status when autocloning starts + cloning someone. + Ordo: + - tweak: Replaced nitrogen with ethanol in morphine recipe. The recipe now has a + lower yield. + Robustin: + - bugfix: Fixed the limb grower having a max volume of 0. + UI Changes: + - tweak: The Scan with Debugger/Device button now reads Copy Ref and no longer sends + you to the circuit's page when clicked + - tweak: The assembly's menu is now slightly wider + - tweak: The advanced in "integrated advanced medical analyser" is now abbreviated + to adv. + Xhuis: + - bugfix: The preference to lock action buttons in place is now correctly saved + across rounds. +2018-02-11: + DaedalusGame: + - bugfix: Prevents megafauna (and other large things like spiders and mulebots) + from going into machines + Dax Dupont: + - rscadd: You can now win a fake cryptographic sequencer, perfect to go with your + fake space suit! + - tweak: 'To login with an emag on the APC console you will now need to hit it with + the emag. removed: Snowflake emagging implants is no more, Swipe it before install.' + - refactor: everything uses emag_act() now + - balance: Grabbers/throwers no longer can contain/throw things equal to the assembly + size. + - bugfix: Fixes duplicate air alarm on meta. + Kor: + - rscadd: Mining sentience upgrades now grant minebots an ID and radio. + Mokiros: + - rscadd: All-In-One Grinder can now be built with researchable curcuit and micro-manipulator. + More Robust Than You: + - rscadd: You can now squish urinal cakes + More Robust Than You, Basilman, and MMMiracles: + - rscadd: Deep in space, a valuable artifact awaits + Naksu: + - rscdel: Steam engines have been removed from maintenance, engineering, atmos and + teleportation areas. + - rscadd: The chef is now trained for working under siege + Shadowlight213: + - admin: The notify irc/discord bot chat command no longer requires admin privileges. + ShizCalev: + - bugfix: Corrected a number of missing checks when using alt-click actions. Please + report any strange behavior to a coder. + - spellcheck: Corrected typo in NTNet Scanner circuits' name, make sure to update + your blueprints. + uraniummeltdown: + - rscadd: You can now smelt titanium glass and plastitanium glass + - rscadd: Use titanium glass and plastitanium glass to build shuttle windows and + plastitanium windows +2018-02-12: + Dax Dupont: + - bugfix: AI no longers block ark after mass_recall + - bugfix: Placed the dispersal logic AFTER the mass_recall on ark activation instead + of infront(did nothing before basically). + - rscadd: Cell chargers can now be built and upgraded with capacitors! + - bugfix: Fixed empty subtype batteries not updating icons + Denton: + - bugfix: Fixes lye/plastic/charcoal conflicts when mixing. + - bugfix: Lye is now made by combining ash with water and carbon. Plastic sheets + by heating ash, sulphuric acid and oil. + More Robust Than You: + - bugfix: Your hand no longer magically squishes urinal cakes when trying to pick + them up + - bugfix: SCP-294 no longer looks fucked up + Robustin: + - balance: The rift created by teleporting in from space will now include a description + indicating the direction of the "origin" teleport rune - giving the examiner + a fair idea of where the "space base" is located. + - balance: You can no longer manifest spirits or summon cultists while in space + or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral + jaunt, etc.) in either of these locations. + - balance: Juggernauts have lost 20% reflect rate on energy projectiles (now around + 50% for standard lasers). + - balance: Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively). + - balance: Construct shells now cost 50 metal through the "twisted construction" + spell. Twisted construction is now a "single use" spell. + - balance: The Concealment spell will now work on cult airlocks (including converted + airlocks). The "concealed" airlock will appear as a generic airlock but will + deny access to any non-cultist. + - balance: The draw blood effect on blood splatters will now draw more blood from + stains with low blood levels. + - tweak: Unanchored (via ritual dagger) cult structures are no longer "dense", meaning + you can move them through teleport runes more efficiently. + - tweak: The button to nominate yourself for cult master now has a confirmation + prompt seeking assurance that the user is prepared to be the cult's master. + - tweak: The reveal aspect of the concealment spell is slightly smaller, albeit + still slightly larger (6 range) than the concealment aspect (5 range). + - imageadd: Juggernauts "gauntlet echo" now has a more cult-themed appearance. + - bugfix: Using a shuttle curse to push the shuttle timer above its default can + no longer be "reset" with a recall. This also adds a block_recall(time_in_deciseconds) + helper-proc to the shuttle subsystem. + - bugfix: Using runed metal on a regular girder is no longer an option, preventing + runtimes and deletions associated with the (unintended) combination. +2018-02-13: + Buggy123: + - tweak: After consulting with their in-house physicists, Nanotrasen has updated + their worst-case disaster training simulation "Space Station 13". The combustion + of hydrogen isotopes now produces water vapor instead of carbon dioxide. + Dax Dupont: + - rscadd: Added hooray emoji! + Iamgoofball: + - bugfix: The Cook now ONLY works under siege. + TehZombehz: + - rscadd: Heart-shaped boxes of chocolates are now included in Valentine's Day event + gifts +2018-02-14: + Dax Dupont: + - bugfix: Integrated circuits no longer start upgraded. + - balance: The IC printers that are available on round start in the IC labs are + no longer upgraded by default. You will need to research these as was intended + Frozenguy5: + - bugfix: You can craft rat kebabs now. + Naksu: + - bugfix: Chasms no longer eat shuttle docking ports, rendering them unusable and + unresponsive + - tweak: The clogged vents event has been removed for pressing ceremonial reasons + coiax: + - rscadd: Transference potions now just rename the mob that you are transferring + into with your name, rather than your name plus the old name of the mob. +2018-02-15: + Kor: + - rscadd: Bluespace slime extracts now have a new chemical reaction with water, + which create slime radio potions. When applied to a simple animal, that mob + gains an internal radio. + MrStonedOne: + - balance: You no longer need an aggressive grab to table someone. + SpaceManiac: + - refactor: Map initialization now supports stations with multiple z-levels. + - bugfix: The map reader no longer sometimes expands the world size inappropriately. + - tweak: Pride's Mirror's destination has become less predictable. +2018-02-16: + AnturK: + - rscdel: Minimap gone from crew monitoring + DaedalusGame: + - code_imp: made powercell rigging no longer set rigged to the plasma reagent datum + what the hell and makes it use TRUE/FALSE defines + Denton: + - tweak: Emagging meteor shield satellites now shows you a message. + - spellcheck: Fixed a typo when emagging RnD servers. + MMMiracles: + - rscadd: You can now produce a cryostatis variant of the shotgun dart after researching + Medical Weaponry. Holds 10u and doesn't have reagents react inside it. + MetroidLover: + - rscadd: Added the ability to gain smoke bomb charges by attacking the initiated + ninja suit with a beaker containing smoke powder + More Robust Than You: + - bugfix: Fixes SCP-294 losing its top sometimes + Naksu: + - code_imp: replaced some item-specific movement hooks with components + Xhuis: + - tweak: Removing and printing integrated circuits will now attempt to place them + into a free hand. + - tweak: You can now hit an integrated circuit printer with an unsecured electronic + assembly to recycle all of the parts in the assembly en masse. + - tweak: You can now recycle empty electronic assemblies in an integrated circuit + printer! + - soundadd: Integrated circuit printers now have sounds for printing circuits and + assemblies. + - bugfix: The RPG loot event will no longer break circuit analyzers. + coiax: + - rscadd: Centcom now reports that thanks to extensive bioengineering, apples and + oranges now taste of apples and oranges, rather than nothing as they did before. +2018-02-17: + DaedalusGame: + - bugfix: fixes lava and fire burning HE-pipes + - rscadd: added a subreaction for rainbow slime cores, injecting 5u of plasma now + makes them explode into random slimecores. + - rscadd: added a slimejelly reaction to rainbow slime cores that does the above + but all the cores that spawn get 5u each of plasma, water and blood injected. + (aka chaos) + - code_imp: improved clusterbuster code with Initialize, addtimer, vars for sounds + and payload spawners, etc + Dax Dupont: + - bugfix: After an incident where a very eager roboticist kept expanding a borg's + size leading to a structural collapse of the entire station proper safety limitations + have been implemented. + - bugfix: You can rotate freezers and cryo again. + - rscadd: Nanotrasen has invested in better reflective materials for it's reflectors. + You can now make complex laser shows again. + Modafinil: + - rscadd: Adds new medicine chem that suppresses sleep and very lightly reduces + stunrates, has a very low metabolic rate which is randomized and a low overdose + treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently + and with charcoal/calomel before it puts you to sleep) + TankNut: + - tweak: Corpses spawned in ruins have their suit sensors disabled + coiax: + - admin: Admins can use the Select Equipment verb on observers. Doing so will humanise + them and then apply the equipment. + - bugfix: Species with RESISTHOT (golems, skeletons) can extinguish burning items + as if they were wearing fireproof gloves. + jakeramsay007: + - bugfix: Jellypeople/Slimepeople now are able to speak their Slime language, as + intended when it was added. + yorii: + - bugfix: removes the maintenance panel examination message on poddoors (blast doors) +2018-02-18: + More Robust Than You: + - bugfix: Actually fixes SCP 294 overlay problems + Naksu: + - rscadd: Exosuit fabricators can now build RPED and crew pinpointer upgrades for + engineering and medical borgs respectively. + Ordo: + - rscadd: Adds a few new liquors to the bar, and a few new cocktails to boot! + Xhuis: + - tweak: Crew pinpointers now fit on medical belts! + YPOQ: + - bugfix: Bicycles are rideable again +2018-02-19: + DaedalusGame: + - bugfix: Fixed paper bins not catching fire properly + - bugfix: fixed multiserver mining formula + Improvedname: + - bugfix: Fried eggs don't require boiled eggs anymore and just normal eggs + Kevinz000 and Naksu: + - bugfix: Ore stacks will now initialize with proper visuals and no longer show + a NO SPRITE text when you gather more than 20 ores to a stack. + XDTM: + - rscadd: 'Added three new techweb nodes: Advanced Surgery, Experimental Surgery, + and Alien Surgery(requires abductor tech)' + - rscadd: Added several new surgical procedures, which require these techweb nodes. + To enable an advanced surgery, print its relative disk from a protolathe, and + load it on an Operating Computer. Advanced surgery can only be performed at + operating tables. + - tweak: You can now intentionally fail surgical procedures by initiating them with + disarm intent instead of help intent. + - rscadd: Brain traumas now have a custom resilience system. Some trauma sources + can cause traumas which require more extensive treatment, such as the new Lobotomy + surgery. + - rscadd: Traitors can now purchase a Brainwashing Surgery Disk for 5 TC. + Xhuis: + - bugfix: New blob tiles are no longer invincible after their blob's death. + - bugfix: Blob nodes no longer produce blob tiles even after the blob's death. + coiax: + - rscadd: Mime's Bane, a toxin that prevents people from emoting while it's in their + system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 + part Radium. +2018-02-20: + Anonmare: + - rscadd: Nanotrasen psychologists have identified new phobias emerging amongst + the workforce. Nanotrasen's surgeon general advises all personnel to just buck + up and deal with it. + AverageJoe82: + - rscadd: Circuits integrity, charge, and overall circuit composition is displayed + on diagnostic huds. If the assembly has dangerous circuits then the status icon + will display exclamation points, if the assembly can communicate with something + far away a wifi icon will appear next to the status icon, and if the circuit + can not operate the status icon will display an 'X'. + - rscadd: AR interface circuit which can modify the status icon if it is not displaying + the exclamation points or the 'X'. + - tweak: Locomotive circuits can no longer be added to assemblies that can't use + them. + - spellcheck: Fixed a typo in the grenade primer description. + - code_imp: Added flags to circuits that help group subsets of circuits and regulate + them. + DaedalusGame: + - bugfix: fixed ghost spawners showing up in the spawner menu when you can't use + them + - bugfix: fixed walls under doors breaking to space + - tweak: changed doors to no longer spawn on top of walls + Dax Dupont: + - rscadd: Adds special tutorial holopads for the hazard course. + Jittai: + - tweak: Ctrl+Clicking progresses through grab cycle on living mobs (not just humans) + Joan: + - tweak: The crusher kit now includes an advanced mining scanner. + - tweak: The resonator kit now includes webbing and a small extinguisher. + - tweak: 'The minebot kit now includes a minebot passthrough kinetic accelerator + module, which will cause kinetic accelerator shots to pass through minebots. + The welding goggles have been replaced with a welding helmet, allowing you to + wear mesons and still be able to repair the minebot without eye damage. feature: + You can now install kinetic accelerator modkits on minebots. Some exceptions + may apply. Crowbar to remove modkits.' + - balance: Minebots now shoot 33% faster by default(3 seconds to 2). The minebot + cooldown upgrade still produces a fire rate of 1 second. + - balance: Minebots are now slightly less likely to sit in melee like idiots, and + are now healed for 15 instead of 10 when welded. + - balance: Sentient minebots are penalized; they cannot have armor and melee upgrades + installed, and making them sentient will override those upgrades if they were + installed. In addition, they move very slightly slower and have their kinetic + accelerator's cooldown increased by 1 second. + NTnet circuit fix: + - bugfix: Now NTnet circuits can recieve sender adress properly.Also, now messages + could be sended to multiple recepiens. + Xhuis: + - rscadd: Admins may now spawn a debug circuit printer that can always print circuits, + and has infinite metal. + - bugfix: Buttons, number pads, and text pads in integrated circuits now correctly + show their labels. + - bugfix: Integrated hypo-injectors can now correctly draw blood. + - tweak: The circuit analyzer output has been slightly tweaked and includes usage + instructions. + - rscadd: The round-end report now shows information about the first person to die + in that round. + - rscadd: Added the dish drive. This machine, the future in plate disposal, can + be researched from techwebs (Biological Processing) and built with a standard + machine frame using two matter bins, a micro manipulator, and a glass sheet. + - rscadd: A circuit board for the dish drive can be found in the chef's and bartender's + wardrobes. + - rscadd: You can hit a dish drive with any dish (like a plate or drinking glass), + and the dish drive will convert it from matter to energy, allowing it to store + an infinite amount of dishes. You can also interact with it to get things back + from it. + - rscadd: Dish drives also have an automatic "suction" function that sucks in all + loose dishes within four tiles. This can be toggled by activating its circuit + board in-hand. + - rscadd: Dish drives automatically beam their stored dishes into any disposal unit + that it can see within seven tiles every minute. You can toggle this by alt-clicking + its circuit board. + - tweak: Plastic surgery now lets you choose from a list of ten random names, so + you can pick the one that you prefer. + - tweak: Abductors performing plastic surgery can now give their target spooky subject + names, with one normal name available for standard plastique. +2018-02-21: + Denton: + - code_imp: Renamed the IDs of various reagents to be more descriptive. + - spellcheck: Fixed the descriptions of changeling adrenaling reagents. + - tweak: Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. + Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes. + - spellcheck: Tweaked the message you see when emagging meteor shield satellites. + Kevinz000 & Deathride58: + - rscadd: A separate round time has been added to status panel. This will start + at 00:00:00. + - rscadd: Night shift lighting [if enabled in the same configuration] will activate + between station time 7:30 PM and 7:30 AM. This will dim all lights affected, + but they will still have the same range. + - rscadd: APCs now have an option to set night lighting mode on or off, regardless + of time. + Naksu: + - bugfix: Flightsuits should be controllable again +2018-02-22: + Buggy123: + - tweak: Nanotrasen has begun a campaign to inform their employees that you can + alt-click to disable morgue tray beeping. + Jittai / ChuckTheSheep: + - imageadd: NT has stopped buying re-boxed storebrand Donkpockets and now stocks + stations with real, genuine, tasty Donkpockets! + MetroidLover: + - balance: rebalanced Ninja event to allow it to happen earlier. + - bugfix: fixed Ninja welcome text to no longer tell you to right click your suit. + Naksu: + - code_imp: removed unused poisoned apple variant + Repukan: + - bugfix: fixed windoors dropping more cable than what was used to build them. + Robustin: + - bugfix: The clock cult's marauder limit now works properly, temporarily lower + the marauder limit when one has recently been summoned. + Super3222, TheMythicGhost, DaedalusGame: + - rscadd: Adds a barometer function to the standard atmos analyzer. + - imageadd: Adds a new sprite for the atmos analyzer to resemble a barometer. + kevinz000, Denton: + - rscadd: Nanotrasen's RnD division has integrated all stationary tachyon doppler + arrays into the techweb system. Record increasingly large explosions with them + and you will generate research points! + - spellcheck: Fixed a few typos in the RnD doppler array name/description. +2018-02-25: + Astral: + - rscadd: Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which + is capable of synthesizing it's own syringes, but does so slowly, and can be + easily identified as syndicate by anyone who isn't blind! + Cebutris: + - tweak: Toxin loving species now properly take toxin damage from liver failiure + DaedalusGame: + - bugfix: enables the RPED to construct/replace other parts commonly used in machines + (igniters, beakers, bs crystals) + - bugfix: fixes part ratings of cells so slime cells are correctly more desirable + than bluespace cells and other such nonsense + - bugfix: shivering symptom now works properly instead of only cooling you if you're + already cold + - bugfix: fixed bodytemp going negative in a few cases + - code_imp: removes input/output plates and changes autogibbers to use input dir + - tweak: The last scientists have reported that thermonuclear blasts triggered by + so called 'power gamers' have shorted the doppler array. We've readjusted the + ALU and are confident that this will not happen again. + Denton: + - tweak: The outer airlocks of most space ruin airlocks are now cycle linked. + - tweak: The outer airlocks of various lavaland ruins and ships now cycle lock. + - bugfix: Players can no longer kill themselves by whispering inside clone pods. + - tweak: The 'neurotoxin2' toxin has been renamed to Fentanyl. + Naksu: + - admin: Admins can now start the game as extended revs, a version of revs that + doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which + nukes the station after 20 minutes. + Repukan: + - rscadd: Whiskey to the flask + - rscdel: Hearty Punch from the flask + ShizCalev: + - tweak: Silicons no longer have to be adjacent to morguetrays to disable the alarms + on then. + ThePainkiller: + - tweak: Tweaked the inventory management of the black fedora to be more like the + detective's + Xhuis: + - rscadd: Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple + citrus, and berry juice. When it's in your system, it will very slowly heal + you as long as you're not in critical. When it's first added to your system, + you heal an amount of each damage type equal to the volume taken in, with a + max of 10. This is turned to a max of 20 for anyone in critical. + - rscadd: Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. + It's nutritious and healthy! + - tweak: Reskinning objects now shows their possible appearances in the chat box. + deathride58: + - rscadd: Lights will now actually glow in the dark! +2018-02-26: + DaedalusGame: + - balance: livers don't unfail automatically every second life cycle you have to + get a new one or get some corazone stat + - balance: increased liver damage from alcohol significantly because apparently + your liver regenerates faster than you can chug unless you drink 100 liters + of bacchus blessing + - bugfix: fixed cyber livers thinking they should fail at half durability + MMMiracles: + - rscadd: Added tinfoil hats, headgear that can help protect against government + conspiracies and extra-terrestrials. Found in hacked autolathes. + Robustin: + - bugfix: Twisted Construction will now consume ALL available plasteel in a stack. + - bugfix: Runes will no longer count the original invoker more than once. + XDTM: + - balance: Wizard spells and items can now be resisted/ignored with anti-magic items/clothing + such as null rods! + - balance: Revenant spells can now be resisted with "holy" items like null rods + and bibles. + - balance: Wizard hardsuits are now magic immune, but not holy. + - balance: Immortality Talismans now grant both spell and holy immunity. + - tweak: Inquisitor Hardsuits already granted spell and holy immunity, but now they + do it properly instead of having a null rod embedded inside. + - tweak: Holy Melons now grant holy immunity. + - tweak: Operating computers now display the chemicals required to complete a surgery + step, if there are any. + - tweak: Completing a surgery without the required chems will always result in failure, + instead of a success with no effect. + - balance: You can no longer gain the same trauma more than once. + - balance: 'You can no longer gain more than a certain amount of brain traumas per + resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain + 3 mild and 1 severe)' + - tweak: Abductors' trauma gland now gives traumas of random resilience, instead + of lobotomy every time. + Xhuis: + - balance: Instead of starting unable to clone circuits at all, circuit printers + can now print circuits over time from roundstart. The formula for this is equal + to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing + progress by using the printer's interface, and you can print normal components + during this time. + - balance: If circuit printing is disabled in the config, cloning remains unavailable. + - balance: The upgrade disk to allow circuit printers to clone circuits has been + replaced with an upgrade disk to make circuit cloning instant. + - balance: Both circuit printer upgrade disks now cost 5000 metal and glass, down + from 10000. + - code_imp: Butchering has been refactored. + - balance: Some items now take longer to butcher, and have a chance to harvest fewer + items, like spears. Others, however, are faster, like circular saws. + - balance: Certain creatures will always drop certain items on butchering, regardless + of butchering effectiveness or chances. + - balance: Items that are very effective at butchering may yield bonus loot from + butchered creatures! + - rscadd: Plain hamburgers may now spawn as steamed hams with a very low chance. +2018-02-27: + Astral: + - rscadd: blood cultists can now use a nar nar plushie as an extra invoker for runes! + Iamgoofball: + - rscadd: Look sir, free crabs! + Poojawa: + - rscadd: Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental + research points! + Robustin: + - bugfix: The heart attack event will now actually make the victim acquire the heart + disease + - bugfix: Clicking the chatbox link will let you orbit the victim + - tweak: The event is now significantly more sensitive to junk food. Recent consumption + of multiple junk food items will triple your chances of having a heart attack + (exercise will still block it). + selea: + - bugfix: fixed floorbot + - bugfix: fixed cleanbot + - refactor: improved pathiding in case of given minimal distance;improved sanitation +2018-03-02: + AlexTheSysop: + - bugfix: C4 logging now shows correct location + Astral: + - imageadd: Space is now prettier + DaedalusGame: + - tweak: Machines can now be constructed anchored or unanchored, if the resultant + machine could be unanchored. + Dax Dupont: + - rscadd: Medals now show the commendation text in the description. + Denton: + - tweak: Cargo packs have been grouped and sorted alphabetically. Station goal crates + are now in the Engineering section. + - tweak: The cargo security section has been split into security/armory. + - tweak: Grouped all gas canisters and fuel/water tanks together in one section + with raw materials. + - spellcheck: Fixed a few cargo pack descriptions. + - tweak: Cyclelinked three airlock pairs on Boxstation (port bow solars and the + area that connects RnD with medical). + Improvedname: + - bugfix: chem implants can no longer be self triggered + Jittai / ChuckTheSheep: + - imageadd: New chemdispenser (and minidispenser) sprites. + - imageadd: New soda/beer dispenser sprites, with directional states. + Mey-Ha-Zah: + - imageadd: Heck suit sprites are prettier, with more contrast. + MoreRobustThanYou: + - bugfix: SCP-294 should no longer have overlay problems + Naksu: + - rscdel: SNPCs have been removed. + Poojawa: + - bugfix: Cyborg defib units are now actually functional + XDTM: + - tweak: Bath Salts now induce psychotic rage, but cause much more brain damage. + Xhuis: + - rscadd: Traits! You can now select up to three positive, negative, and neutral + traits in the character setup. You can choose up to six traits based on combinations + varying by the amount of points you earn with negative traits and spend with + positive ones. + - rscadd: You can now splash metal sheets with copper to make bronze sheets, which + you can make "clockwork" things out of. + YPOQ: + - bugfix: The assault pod can be launched again. + uraniummeltdown: + - rscadd: The chatbar now has OOC and Me buttons + - tweak: The chatbar font-size is smaller +2018-03-03: + Cebutris: + - bugfix: Washing a glove with a white crayon will make it look like a white glove, + instead of a latex glove. Instead, mime crayons make gloves look latex + Denton: + - bugfix: Burglar alarms in the Pubbystation library and RD office can now be disabled + properly. + - bugfix: Fixed Pubbystation's RD office shutters. + - rscadd: Added missing engineering and kitchen lockdown shutters on Pubbystation. + - rscadd: 'Pubbystation: Added privacy shutters to the CMO and RD offices. Added + space shutters to the HoS office. Replaced the RD office''s directional windows + with fulltile ones.' + - rscadd: Added a second blast door to the Pubbystation gulag shuttle lockdown. + - tweak: Due to pressure from the space OSHA, Pubbystation has installed missing + fire alarms and firelocks. + - tweak: Split the Pubbystation library into two areas with their own APCs. + Naksu: + - admin: Admins can now easily spawn cargo crates + - admin: Admins can now toggle antag, med, sci, engineering huds and maximum ghost + brightness with just one button. + Robustin: + - balance: Meth now deals 1-4 brain damage while active, up from 0.25 + Selea: + - balance: reduce CD of all non manipulative non list output circuits to 0.1 + - balance: add to locomotion circuit output ref with object, which assembly was + bumped to. + - balance: upgrade disks have multiuse. balance:iducer efficiency= efficiency/number + of inducers on 1 tile. + - balance: unnerf fuel cell.about 3-5 times.Make blood more powerful. + ShizCalev: + - rscadd: You can now hotswap tanks in a canister or gas pump by clicking it with + a new tank! + - rscadd: You can now also close a canister's valve and remove the tank inside it + by alt-clicking it. +2018-03-04: + DaedalusGame: + - balance: changed the formula of liver damage so weak alcohol does barely anything + while strong alcohol is still threatening + Iamgoofball: + - bugfix: RIP Billy, you'll be the boss of heaven's gym now :( + Jalleo: + - admin: Added a cancel button to nuke timer (and others). You no longer have to + make it 0 just a click to cancel. + - admin: You can now easily set how many "INSERT JOB ROLE HERE" you want in the + manage job selection in the admin panel. If you put zero in it will set it to + the current amount of filled positions. + - bugfix: moved a small amount of wording around in a admin browser to make it cleaner + looking. Along with a few updated checks for certain things. + Naksu: + - code_imp: First pass on cleaning up junk defines and unused code + RandomMarine: + - rscdel: The ore redemption machine no longer has 'release all' buttons. Remember + to take just what you need and leave some for the other departments. +2018-03-05: + 81Denton: + - tweak: 'Deltastation: Removed a windoor to make the northern chemistry fridge + more accessible.' + Cruix: + - rscadd: Added a new mini antagonist, the sentient disease. + DaedalusGame: + - bugfix: Fixes the auxbase camera console not placing airlocks on fans but doing + so vice-versa + Dax Dupont: + - balance: Others can now take off your tinfoil hat as seemingly originally intended. + - balance: Due to the nature of tinfoil hats, the delay of putting a tinfoil hat + on unwilling participants has been increased. + Denton: + - bugfix: 'Pubbystation: Added a missing APC to the cargo sorting room, a light + fixture to the RnD security checkpoint and removed an overlooked firelock east + of the bridge.' + - rscadd: 'Pubbystation: Added a spare RPD to the Atmospherics department. Replaced + Engineering''s outdated meson goggles with modern engineering scanners. Added + a GPS device to the secure storage crate.' + - tweak: Moved Pubbystation's drone shell dispenser from the experimentation lab + to Robotics maint. + Jittai / ChuckTheSheep: + - tweak: Adjusted the space parallax's contrast to be less vibrant. + Naksu: + - rscadd: Advanced roasting sticks, a product of applied bluespace research can + now be built from service protolathes. They can be used to cook sausages on + campfires, supermatter engines, tesla balls, singularities and a couple of other + things. + - admin: Admins can now grant spells via implants, using the spell implant. Some + VV is required. + Potato Masher: + - bugfix: The Wizard Federation has finally modified their production method for + pre-packaged magic tarot cards for better compatibility with time-stopping spells. + Guardians Spirits are no longer frozen by their user's time-stops. + SpaceManiac: + - bugfix: Night shift no longer ignores rooms whose APCs are in port or starboard + central maintenance. + - bugfix: Inserting brains into MMIs and then into mechs now works again. +2018-03-06: + MrDoomBringer: + - tweak: Advances in Rapid Delivery Technology have yielded a reduced premium on + express cargo orders! Orders from the express console now have a cost multiplier + of 1, down from 2. + MrStonedOne: + - bugfix: gas overlays once again no longer steal clicks + - rscdel: 511 clients will be unable to see gases once again. the 512 client crashes + are fixed so this shouldn't be that big of a deal. + Naksu: + - admin: Admins can now easily spawn mobs that look like objects. Googly eyes optional! + XDTM: + - rscadd: Revenants now have randomly generated names. + Xhuis: + - code_imp: Traits are now assigned in a way that should cause fewer edge cases + and strangeness. + - bugfix: Night Vision should now work. + - bugfix: Traits no longer tick while dead. + - tweak: RDS now triggers twice as often. + - tweak: You can now modify your trait setup mid-round. Your character is locked + to the traits you had selected when you spawned in, though. + selea: + - bugfix: After several months of natural selection, hostile mobs started to attack + assemblies with combat circuits. +2018-03-08: + ACCount: + - rscadd: Station airlocks now support NTNet remote control. Door remotes now use + NTNet. + - rscadd: Don't worry, any non-public airlock is fully protected from unauthorized + control attempts by NTNet PassKey system! + - rscadd: 'New integrated circuit component: card reader. Use it to read PassKeys + from ID cards.' + - bugfix: Fixes a delay issue when airlocks are being opened/closed by signalers. + Astral: + - bugfix: Lighting fixtures should no longer be visible in camera-less areas by + cameras. + - rscadd: Ghosts can now examine sentient diseases to see info + CameronWoof & MrDoomBringer: + - rscadd: Adds medical sprays, a new application method for touch chems + - rscadd: Pre-loaded medical sprays can be obtained from NanoMeds + - rscadd: Empty medical sprays can be found in boxes in chemistry and from cargo's + medical crate + - tweak: Sterilizer spray has been migrated to be a medspray instead of being a + spray bottle + Cebutris: + - spellcheck: lithenessk -> litheness + Cruix: + - rscadd: Sentient diseases now get two minutes to select an initial host before + being assigned a random one. + Dax Dupont: + - rscadd: Beacons can now be toggled on and off. + - rscadd: Mappers can now have beacons that default to off. Useful for ruins! + - tweak: Renaming replaces the snowflake locator frequency/code + - refactor: Beacons are no longer radios. Why were they radios in the first place? + I don't know. + - bugfix: You can now lay meters again with the RPD. + Denton: + - rscadd: Pubbystation's RnD department has been outfitted with a brand new circuitry + lab! It is found east of the Toxins launch room. + Floyd / Qustinnus (Sprites by Ausops, Some moodlets by Ike709): + - rscadd: Adds mood, which can be found by clicking on the face icon on your screen. + - rscadd: Adds various moodlets which affect your mood. Try eating your favourite + food, playing an arcade game, reading a book, or petting a doggo to increase + your moo. Also be sure to take care of your hunger on a regular basis, like + always. + - rscadd: Adds config option to disable/enable mood. + - rscadd: 'Indoor area''s now have a beauty var defined by the amount of cleanables + in them, (We can later expand this to something like rimworld, where structures + could make rooms more beautiful). These also affect mood. (Janitor now has gameplay + purpose besides slipping and removing useless decals) remove: Removes hunger + slowdown, replacing it with slowdown by being depressed' + - imageadd: Icons for mood states and depression states + MMMiracles: + - tweak: Thirteen Loko now has an overdose threshold of 60u, see your local CMO + for potential side-effects. + MrDoomBringer: + - tweak: Emagging the emergency shuttle now fries the on-board acceleration governor. + Better buckle up! + Naksu: + - balance: The nuclear authentication disk no longer treats the transit space as + a whole as being "in bounds", but instead checks whether it is in an approved + shuttle type (syndicate shuttles, escape shuttles, pubbiestation's monastery + shuttle, escape pods are allowed) + - bugfix: Blueprints can no longer be used to create areas inside shuttles. This + fixes various exploits involving shuttles and areas. + - bugfix: Moving across a space z-level border can no longer place you inside a + shuttle or a dense turf such as an asteroid. + SpaceManiac: + - bugfix: The Shift Duration in the round-end report is no longer blank in rounds + lasting between one and two hours. + kevinz000: + - rscadd: smoke machines can now be printed after researching adv biotech +2018-03-09: + Dax Dupont: + - rscadd: Display cases can now have a list where to randomly spawn items from. + - refactor: Moved plaque code to main type. + - refactor: Statues now use default unwrench and the tool interaction is now completely + non existent when no deconstruct flag is available. + Mark9013100: + - rscadd: Pill bottles can now be produced in the autolathe. + Naksu: + - balance: The white ship and miscellaneous caravan ships lose their advanced place-anywhere + shuttle movement during war ops. + - tweak: The smoke machine can now be deconstructed using a screwdriver and a crowbar + - code_imp: The smoke machine no longer calls update_icon every process() + Robustin: + - balance: Harvesters now have 40hp, from 60. + - tweak: The nuke will now detonate 2 minutes after Nar'sie is summoned, down from + 2.5 minutes + - tweak: The "ARM" ending now requires 75% of the remaining souls aboard to be sacrificed + before the nuke goes off, up from 60%. + - bugfix: Drones can no longer be on the sacrifice list + - bugfix: Bloodsense will now show the true name of the target +2018-03-10: + 81Denton: + - tweak: Added wall safes to Deltastation's HoP and Captain's offices. + Astral: + - bugfix: Constructed turbines will now properly connect to the powernet + Cobby: + - tweak: The Eminence scoffs at your "consecrated" tiles once the Justicar is freed + from his imprisonment. + Denton: + - rscadd: Engi-Vend machines now have welding goggles available. + - tweak: Grouped Nano-Med/Engi-Vend items by category. + Irafas: + - rscadd: Turrets can be set to shoot personnel without loyalty implants + Naksu: + - rscdel: The smoke machine can no longer be found in chemistry departments, instead + it must be constructed manually. The board was added to techwebs earlier. + Singularbyte: + - bugfix: Dead bodies no longer freak out about phobias + 'The Dreamweaver (Sprites: Onule)': + - rscdel: Nanotrasen's Lavaland research team has discovered that the alien brain + has disappeared from necropolis chests. + - rscadd: In it's place they have discovered a new artifact, the Rod of Asclepius, + a strange rod with a magnitude of healing properties, and an even higher magnitude + of responsibility... + XDTM: + - rscadd: You can now place people on tables on Help Intent. Doing so takes a few + seconds and makes the target Rest, instead of stunning them. + Xhuis: + - bugfix: Circuit slow-cloning no longer breaks with some circuits. + - code_imp: Circuit slow-cloning is now cleaner. + kevinz000: + - rscadd: Oh hey guys, RND shows correct material values now, don't hurt me! + ninjanomnom: + - bugfix: Blowing up the wrong part of the shuttle should no longer result in the + shuttle being permanently broken. +2018-03-11: + Buggy123: + - tweak: The Clockwork Justicar has decided to be merciful, and allow nonbelievers + to anchor their petty machines in his city. It's only fair for them to have + a fighting chance, after all. + Irafas: + - bugfix: Fixed pacifists from being able to fire mech weapons + JJRcop: + - bugfix: Sanity checks for Play Internet Sound + MrDoomBringer: + - rscadd: Orderable supplies in cargo now all have descriptions! The station's overall + FLAVORFUL_TEXT stat has gone up by nearly 2% as a result. + Onule: + - tweak: Mining drones have been given a visual makeover! + Poojawa: + - imageadd: Redded borg transformation animations + - imageadd: adjust mining borg animation to new colors. + Xhuis: + - rscadd: The Nanotrasen Meteorology Division has identified the aurora caelus in + your sector. If you are lucky, you may get a chance to witness it with your + own eyes. + ninjanomnom: + - admin: The debug message for generic shuttle errors is improved a little + - bugfix: Custom shuttles being too close to the map edge was causing problems, + you must now be at least 10 tiles away. +2018-03-12: + Naksu: + - balance: The space cleaner spray bottle is now much more efficient and uses much + less space cleaner per spray. The amount of cleaner it can hold has been adjusted + to compensate. + - bugfix: internet sounds can be stopped again + Robustin: + - bugfix: One-man conversions are actually fixed this time - excess chanters var + removed for a more readable and maintainable rune code. + - bugfix: Runes should no longer become GIANT if spammed (credit to Joan for this + fix). + - bugfix: Pylons are no longer a source of infinite rods. + - tweak: Attempting conversion without 2 cultists present will give a more helpful + warning. + - tweak: You can no longer convert braindead individuals. + - balance: Cult doors will no longer lose power but also cannot shock people, brittle + cult doors have 30 less integrity. Therefore ordinary crew can now beat cult + airlocks open without frying themselves. + - balance: Blood magic now costs slightly more blood and takes slightly more time, + the stun spell now stuns for 2 less seconds, twisted construction now costs + 10 health, and the blood rite relics (halberd, bolts, beam) are all 50-100 charges + cheaper. + - balance: The deconversion time for holy water is slightly reduced, 10 units and + 45 seconds (give or take), is all you should need now. Blood cultists can now + have seizures while afflicted with holy water. + - balance: Shades are now slower and have a modest reduction to their damage and + health. +2018-03-13: + Dennok: + - rscadd: Meters can be attached to the floor by screwdriver + Denton: + - bugfix: The disposal bin in Pubbystation's main tool storage now works. + - tweak: Deleted a duplicate r-wall between Pubby's main tool storage and the captain's + office. Added a Metastation-style crate disposals chute and a light switch. + - tweak: Various belts can now hold additional job-specific items. + - tweak: Sepia floor tiles fly really slowly, yet far when thrown. Don't hit yourself! + Naksu: + - admin: ERT creation has been refactored to allow for easier customization and + deployment via templates and settings + Polyphynx: + - tweak: Medical sprays can now be stored in medical belts and smartfridges. + The Dreamweaver: + - rscadd: Both of Nanotrasen brand totally-for-adult-use footwear, Wheely-heels, + the cool and hip new shoes with built in roller-wheels, and Kindle Kicks, the + fun and flashy light up sneakers, are now available as rare prizes at your nearest + arcade machine! + Toriate: + - rscadd: Added ammo counters for RCDs + - rscadd: Added actual flashing yellow light for RCDs + - imageadd: added new RCD sprites including inhands + - imagedel: deleted old RCD iconstate, but not the inhands + checkraisefold: + - bugfix: Nukeops properly checks the required amount of enemies for the gamemode! + This should fix downstream problems. + imsxz: + - rscdel: the viral aggressive metabolism symptom has been removed + ninjanomnom: + - bugfix: You need to actually clear an area for the aux base, remove all walls + (except rock walls). +2018-03-16: + Dax Dupont: + - tweak: 8balls take less time to shake. + Keekenox & Floyd / Qustinnus: + - imageadd: Adds a new Parallax layer that resembles Lavaland (Lava Planet), it + spawns on a random location near the station. You need your parallax on high + to see it. + Shadowlight213: + - tweak: Roundstart or latejoin sec officers will like donuts regardless of race. + cacogen: + - tweak: Transit tubes take half as long to secure/unsecure +2018-03-17: + AnturK: + - rscadd: Traitor AI's can now take manual control of turrets. + Cruix: + - bugfix: Sentient diseases will no longer lose points when a host is uninfected. + Dax Dupont: + - bugfix: Edison's ghost no longer interferes with Tesla Corona Coil research device. + Denton: + - tweak: Syndicate stormtroopers now rapid fire 10g slugs instead of buckshot. This + deals the same damage, but makes getting hit less laggy. + - rscadd: 'Pubbystation: Added protective grilles outside the circuitry lab. The + one with the big glass windows, right next to the bomb test site. Oops.' + - rscadd: 'Pubby: Added electrified grilles to the windows of the CMO/RD/CE offices, + as well as missing privacy shutters to the CE office.' + - rscadd: 'Pubby: There is now a very rare chance for a Xenomorph egg to appear + in the Xeno containment chamber at roundstart.' + - bugfix: 'Pubby: Fixed the name of the HoS space shutter button.' + - tweak: Updated a bunch of roundstart tips and added new ones. + Polyphynx: + - bugfix: Bluespace slime radio potions now work, and are no longer invisible. + RandomMarine: + - bugfix: Did you know that you could buckle guys to grounding rods? Probably not + - not that it mattered before, because people buckled to them didn't get shocked + when they got zapped. That's fixed now. + SpaceManiac: + - bugfix: Cameranet issues in OmegaStation's departures wing, crematorium, and freezer + have been corrected. + The Dreamweaver: + - bugfix: Fixes duplication issue when the Rod of Asclepius is removed while lying + down, as well as fixing a runtime when attempting to use multiple rods. + XDTM: + - rscadd: 'Changed behaviour of mech drills: now they take some time to start drilling, + then they keep drilling until manually stopped or the target is destroyed. Mobs + are still gibbed if they have more than 200 brute damage while being drilled.' + - rscadd: Drilling walls is now consistent; it takes longer, but it will always + work instead of only randomly. + - tweak: Drills no longer stun mobs, but they can dismember limbs. + - bugfix: Mech drills no longer cause explosion-like effects on mobs inside objects. + deathride58: + - bugfix: You can no longer push someone onto a table that's on the other side of + the station. + kevinz000: + - rscadd: Wet floors now get their duration decreased by 0.1 seconds per degree + above 0C the air temperature on it is, and instantly dry above 100C. Below 0C + they will freeze into ice and will not automatically dry. + - rscadd: Floors can now have different types of wet at the same time! Wet strength/type + is now a bitflag. +2018-03-18: + Davidj361: + - tweak: Made AI VOX sound files smaller sized + - bugfix: Fixed improperly pronounced AI VOX lines + - soundadd: Added a ton of new AI VOX sayings + Floyd / Qustinnus: + - rscdel: Removes short-term effects of mood add; Adds long-term effects of mood + by implementing sanity which goes up with good mood, down with bad mood, but + takes time to change. Your sanity can be seen as your average mood in the recent + past. All effects of moods are now covered by this system + - rscadd: Beauty component, currently only attached to cleanables, but you could + attach it to any atom/movable and make them pretty/ugly, affecting mood of anyone + in the room. + - refactor: Removes the original way of adding mood events, uses signals properly + instead. + - bugfix: Cleanables "giving" area's free beauty during initialization + - bugfix: Fixes some events not clearing properly + Naksu: + - bugfix: Chem dispensers now show the correct amount of units they will vend (instead + of 1/10) + - balance: Chem dispensers can now be upgraded. Manipulators increase macro granularity, + matter bins increase power efficiency, cells increase power capacity, capacitors + increase recharge rate. + - balance: Chem dispensers can now be constructed + - rscdel: mini-chemdispensers are removed. +2018-03-19: + Anonmare: + - tweak: Spaceacillin is now useful in disease control + Denton: + - rscadd: It's suicide HoPline prevention week at Omegastation! + - rscadd: Navigation beacons and a brand-new Officer Beepsky unit have been installed. + This means that crewmembers can now use medibots, janibots and other bots as + well. + - rscadd: The atmospherics department has been outfitted with all missing gases + as well as an incinerator and a hardsuit. + - rscadd: The size of the botany and xenobiology departments have been increased + in order to increase productivity. The medbay O2 port has been moved so that + doctors can access the table next to it. + - rscadd: RnD now has circuitry tools; medbay has stethoscopes+wrench+beaker/pill + bottle boxes and primary tool storage has multitools. Enginers no longer have + to share a single pair of insulated gloves either. + - rscadd: Engineers now have access to an Engi-Vend vending machine as well as missing + tools like inducers. Circuitry storage has a smoke machine board and a solars + crate in case the engine blows up. + - tweak: Blueprints have been moved from the vault safe to secure storage in order + to speed up construction projects. + - bugfix: The AI sat transit tube now works! Turret controls can now be accessed + from the outside. The first two turrets now use the proper type of gun. The + telecomms air alarm will no longer report false alarms. + - bugfix: The main hallway's firelocks now no longer all close at once. + - bugfix: 'Pubbystation: The atmos mix tank and N2 filter should now work properly.' + SailorDave: + - bugfix: Crayons and spraycans can no longer draw an unlimited amount of large + graffiti regardless of uses left. +2018-03-20: + Denton: + - bugfix: At last, the Pubbystation auxillary base can be launched again. + - code_imp: Aux base/escape pod/assault pod/elevator docking ports now default to + timid = FALSE. + Garen: + - rscadd: Added 4 new Icons to the diagnostic hud circuit status display that can + be set using the AR interface circuit. + - rscadd: now instead of seeing the yellow warning icon when a weapon is in the + circuit, the current status icon will just turn red. + Irafas: + - rscadd: Pacifists can now drill closets containing living beings + JStheguy: + - rscadd: Electronic assemblies can now have their casings colored using the new + assembly detailer, get yours at your nearest integrated circuit printer! + - rscadd: Added 2 new electronic assemblies, 2 new electronic mechanisms, and 3 + new electronic drones. + - rscadd: Added wall-mounted electronic assemblies in 3 sizes, simply slap it against + a wall to stick it up, and then anchor it in place with a wrench. + - imageadd: Added the new sprites for the new assemblies, and color-able overlays + for every assembly, to allow for the aforementioned coloring feature. + - tweak: Scanners can now scan power cells, circuitry tools, and integrated circuits, + assuming the player isn't able to use them normally. I.E. if the assembly is + closed. + - tweak: Using wrenches to anchor down assemblies now works for all assembly types + except drones, as opposed to just working for electronic machines. + - tweak: Examining an assembly now shows some text telling you what tools to use + to do what, like many other objects currently do. + Kor: + - code_imp: Jobs other than Assistant may now be assigned by admins or events as + the overflow role + - rscadd: April Fools now sets the overflow role as Clown. + Naksu: + - admin: Rhumba beat is now more than renamed GBS + - tweak: Plastic is now a valid material for lathes + - rscadd: Added two new beaker types, 120u and 180u. The 120u beaker can be printed + off the medical protolathe with just glass and plastic, the 180u requires some + mining materials and tech. + - admin: Whether to open the armory doors when spawning an ERT is now controllable + from the ERT creation window. + - tweak: Chaplain inquisitor role now spawns with one holy hand grenade instead + of a box full of them, and the belt now has actually useful stones instead of + unusable cult stones + Polyphynx: + - tweak: The piano now sounds more like a piano! + Shadowlight213: + - bugfix: Malf hacked APCs can be broken with extinguishers and toolboxes again. + TheDreamweaver: + - bugfix: Holodeck mobs that are given sentience via sentience potions are now warned + about the state of their existence. +2018-03-21: + BunnyBot5000: + - rscadd: Fringe Weaver drink - made with ethanol and sugar, it's classy (and slightly + weaker) hooch + - rscadd: Sugar Rush drink - made with sugar, lemon juice, and wine. It's got a + slight nutritional value but decreases your satiety, causing you to be unable + to consume junk food. + - rscadd: Crevice Spike drink - made with lime juice and hot sauce. A 'sobering' + drink, the Crevice Spike will reduce your drunkenness slightly but it kicks + hard going down, dealing 15 points of brute when first ingested. + MrStonedOne: + - bugfix: VOX sounds are now forcefully preloaded on clients to deal with an issue + keeping byond from loading them + cyclowns: + - tweak: Unary devices can now be analyzed using gas scanners. This means stuff + like vents, scrubbers, cryo tubes, or heaters/freezers. +2018-03-22: + Denton: + - tweak: The lavaland Syndicate base has been outfitted with a turret control panel + as well as more chemistry supplies and one (1) bar of Syndicate brand soap. + Floyd / Qustinnus: + - bugfix: Being happy no longer makes you obese. + JohnGinnane: + - refactor: Vending machines now have their own files which includes their refill + cannister. The machines themselves are unchanged + Naksu: + - bugfix: Pulled objects will now follow their puller across space transitions again + Robustin: + - bugfix: Fixed a bug that prevented the advanced blood rites (Halberd, Bolts, Beams) + from appearing when selected. + SpaceManiac: + - bugfix: Ventcrawlers in pipes now breathe from that pipe. + - bugfix: Deconstructing atmos components no longer breaks ventcrawl visuals. +2018-03-23: + Fel: + - add: Slimes can now be crossbred by feeding them a number of slime extracts of + one type. Beware, it only produces one crossbred extract! + - experiment: The number of required extracts has been lowered to 10 since the testmerge, + but this number is up for potential change depending on balance consideration + in the future. + - wip: 'Currently available crossbreeds are accomplished by feeding any slime the + required amount of the following extract colors: Grey, orange, purple, blue, + metal, yellow, dark purple, silver, cerulean, and pyrite. Their relevant effects + will be added to the wiki page for xenobiology soon(TM), and more to come in + a later addition!' + - add: Slimes can be fed extracts one at a time, but if you start mutating it, you + can feed it extracts straight from a biobag! You can also use biobags to feed + a reproductive extract monkey cubes. + - add: Slimes in the process of being crossbred will reveal what modifier they will + gain from their current modification, as well as how many more extracts are + required, to slime scanners. + - tweak: The rainbow slime clusterblorble effect will now only use reagents that + the extract will be activated from, and will try any of these reagents! As a + bonus side effect, this means it has a 1.1% chance of spawning and activating + another clusterblorble effect. + Floyd / Qustinnus: + - bugfix: progression bar now takes the delay after co_efficent in account + - code_imp: removes do_after_speed from mob base, moves it into physiology + - code_imp: makes a do_after coefficiency proc + - balance: Changes rate of sanity drain and caps it depending on mood + Frozenguy5: + - rscdel: Reverted bad airlock sounds. + Naksu: + - tweak: the amount of simultaneous monkey cube-spawned monkeys has been restricted. + - server: the cap is adjustable via the mobs subsystem + SpaceManiac: + - bugfix: The cargo conveyor switches now properly control the belts on the shuttle + again. + - bugfix: Entering a frequency like 145.7 into a radio will now work, where 1457 + was previously required. + TheMythicGhost: + - rscadd: 'New Integrated Circuit Converter Components: hsv2hex and rgb2hex for + smooth color transitions, woo!' + - imageadd: Added icons for the new component chips. + - rscadd: 'New Integrated Circuit Component: AI Vox Sound Circuit' + ninjanomnom: + - bugfix: You can no longer override shuttle areas with new or expanded areas from + elsewhere. +2018-03-24: + Davidj361: + - bugfix: Ranged guardians in scout mode no longer are able to move out of their + master when recalled. + Denton: + - spellcheck: Fixed missing capitalization for craft menu items. + - bugfix: Air alarms no longer trigger atmospherics alarms when stimulum or hyper-noblium + are present. The allowed partial pressure of pluoxium has been increased as + well. + Robustin: + - tweak: The Security Techfab can now produce basic shotgun shell types and .38 + ammo + ShizCalev: + - bugfix: Fixed a large number of missing APCs on Omegastation + - bugfix: Fixed unpowered Incinerator outlet injector on Omegastation. + - bugfix: Replaced glass window at Omegastation's incinerator with a plasma window. + - bugfix: Fixes broken atmos injectors on Omega + - bugfix: Fixes broken air outlet on Meta + - bugfix: Fixed a couple of malfunctioning atmospheric monitors across the rest + of the maps + - rscadd: New test atmos monitoring console debug verb to help alleviate future + issues. + YPOQ: + - bugfix: The imaginary friend trauma now works +2018-03-28: + Davidj361: + - bugfix: Ocular Wardens now target buckled and cuffed players/mobs, unless they + are cuffed by a slab. + - tweak: Cuck cultists can cuff already sec-cuffed targets with their slab cuff + spell. + Dax Dupont: + - bugfix: You no longer hit borgs with hats you want them to wear. + - rscadd: Viva la borg, engieborgs can now wear hats + - rscadd: Borgs can now wear more hats. + - bugfix: After a space OSHA inspection you can now reach the safe and fire extinguisher + in the omega detective office. + - bugfix: Makes it so you don't accidently trigger the fun balloon twice. + Denton: + - tweak: Pubbystation's signs to evac have been made more obvious. + - tweak: Plastic flaps are now airtight. + - spellcheck: Bluespace crystals now show their proper name during machine construction. + EvilJackCarver: + - bugfix: Edited a certain part of the disco machine's dance to only target carbon-based + (mob/living/carbon) lifeforms. pAI units will no longer spam chat with rest + notifications when in range of the disco machine. + Frozenguy5: + - tweak: The monkeycap has been increased to 64. + JohnGinnane: + - rscadd: A guillotine has been added to the game. Can be crafted. If the blade + isn't dull, will cut through human necks like a hot knife through butter. Use + a whetstone to sharpen it if it becomes dull. + MrDoomBringer: + - imageadd: All stations have been outfitted with brand new Chem Masters! They have + nicer sprites now! + - bugfix: Fixed the description of the Cargo Express Console. Cargo Drop Pod orders + aren't double-priced any more! + Naksu: + - bugfix: Chem dispensers no longer take hours to recharge + - tweak: chem dispensers also now use energy from the grid in proportion with the + amount charged + - admin: Admins now get a follow link when a revenant spawns. + - admin: Admin hotkey help is now actually correct + Pipe fixes: + - bugfix: Runtime in components_base.dm,91 what cause atmos machinery connection + problems. + - bugfix: Pipes release air in turf on Destroy(), again. + - bugfix: Pipeline now cant be annihilated by merge(src). Pipes don't lose air on + connecting more than to one pipe. + Robustin: + - code_imp: Monkey AI is now much more efficient and no longer full of terrible, + wasteful processes + - tweak: Monkeys will now move more and will only focus on nearby objects for stealing. + This should result in more natural monkey behavior instead of the monkey staring + furiously at random shit in the room for 5 minutes until it has a 50 item blacklist + of shit it will refuse to touch from then on out. + - tweak: The chance for a monkey to attack you for pulling it will now only happen + when execute the initial grab, instead of a check that happens every tick. + ShizCalev: + - tweak: Cleaned up the preferences panel a bit to be a bit more user friendly. + SpaceManiac: + - bugfix: Unwrenching and re-placing directional signs now keeps their direction, + and backings may be rotated in-hand rather than by pulling. + Tacolizard Forever: + - bugfix: phobias will no longer recognize trigger words inside of other words + XDTM: + - rscadd: Bees (and similar swarming mobs) are now able to occupy the same tile + as other bees! When doing so, their icons are offset to make them seem like + a proper swarm. + - tweak: Bees will now dodge bullets not directly aimed at them. Why are you firing + guns at bees + - bugfix: Sniper rifles will no longer oneshot mechs (although they still deal high + damage). + - bugfix: Sniper rifles no longer knock down walls they hit. + Xhuis: + - rscadd: Added the Family Heirloom trait. This makes you spawn with a special object + on your person; if you don't have it with you, you will gain a mood debuff. + - rscadd: Added the Nyctophobia trait. This makes you walk slowly in complete darkness, + and gain a mood debuff from the fear! + - rscadd: Added the Monochromacy trait, which makes you perceive (almost) the entire + world in black-and-white. + - balance: Social Anxiety's trigger frequency is now correlated to the number of + people near you. + - bugfix: Slimepeople now transfer their roundstart traits when swapping bodies. + YPOQ: + - bugfix: Machine power will now update when moving from powered to unpowered areas + and vice versa. + iskyp: + - bugfix: night vision goggles no longer overwrite thermal eyes. nvg eyes no longer + overwrite thermal goggles. + selea: + - rscadd: a* pathfinder, coordinate pathfinder(accepts not ref to some obj, but + it's abs coordinates) ,turf pointer(can give you ref to turf with given coordinates), + turf scanner(can read letters on floor and contents of turf),material scaner(can + read amounts of materials in machinery),material manipulator(to load/unload + resources) + - tweak: now you can decide, if basic pathfinder should avoid obstacles, or not.Now + demux push only desired output without unnecessary nulls,upgraded claw and local + locator. + - balance: reduced complexity cost of locomotors,abs/rel converters and basic pathfinders.Increased + complexity of throwers, + - bugfix: Fixed bugs with cryptography, obstacle ref in locomotors, release pin + in pullng claw. + - refactor: add material tranfer proc to mat containers.refactored pathfinder SS + to have separated queue for mobs and circuits to avoid spam. + - tweak: Now recycler can butcher mobs and saw tree logs. + yorii: + - tweak: Science goggles can now detect reagents in grenades. +2018-03-30: + Astatineguy12: + - bugfix: Ghosts of servants of Ratvar are no longer confined to Reebe like their + corporal counterparts. + Cruix: + - rscadd: Sentient diseases now have the "Secrete Infection" ability, which causes + anything touching the skin of the host they are currently following to become + infective, spreading their infection to anyone who touches it for the next 30 + seconds. + Davidj361: + - bugfix: Removed health cost for Twisted Construction upon casting on a wrong object + - bugfix: Fixed table crafting not properly checking the surrounding area for tools. + - code_imp: Changed /datum/personal_crafting/proc/get_surroundings(mob/user) to + return 2 lists. + Denton: + - bugfix: 'Omegastation: Added advanced magboots to secure storage so that traitors + can complete the theft objective.' + ShizCalev: + - bugfix: Silicons no longer have to be directly adjacent to a chem master to dispense + pills. + - bugfix: Fixed an exploit involving chem dispensers not actually checking if there + was enough energy to dispense the target chemicals. + - bugfix: Fixed exploit where chem dispensers always worked even if they didn't + have power... + - bugfix: Booze & soda dispensers will no longer turn into chem dispensers when + screwdrivered + - bugfix: Fixed chem dispensers showing as powered on when screwdrivered opened. + - rscadd: Added an examine indication when the maintenance panel to chem/soda/booze + dispensers is open. + neersighted: + - admin: Re-juggled delete verb permissions + robbym: + - bugfix: Fixed an error with integrated circuit tickers where they would sometimes + fail to tick. +2018-03-31: + Naksu: + - rscdel: Chameleon projectors will no longer work from inside transformations, + effects, mechas or machines. Effects that cause movement will no longer leave + sleepers in a bugged state where they can apply chems to you across distances. +2018-04-01: + Davidj361: + - bugfix: Fixed cuffed prison shoes being taken off by dragging them into your hand. + Denton: + - balance: The singularity engine will now output enough energy to power a station + again. + - bugfix: 'Pubbystation: The bomb testing site cameras are now accessible by camera + consoles.' + - spellcheck: Bluespace polycrystals now show their name when inserted into machinery. + Kor: + - rscadd: The disco machine no longer has a fixed list of songs. It will instead + allow players to pick music from a config folder managed by the host and head + admins. + - rscadd: There is now a bartender jukebox variant of the disco machine that plays + music, but has no lights or dancing. This variant will be added the station + maps once the feature freeze is over. + Naksu: + - bugfix: Removed stray defines from maps, making roundstart atmos functional and + runtime-spam free again + robbym: + - bugfix: 'fixed by converting to absolute coordinates #36861' + - spellcheck: changed description from copypasta to correct description +2018-04-02: + Davidj361: + - bugfix: Fixed 'vox_login' for AI VOX + - tweak: Made the AI VOX airhorn quieter to 25% of its original volume + GrayRachnid: + - bugfix: Fixes some crafting tooltips not displaying tool names properly. + MrDoomBringer: + - imageadd: roundend report button now has a lil icon + Naksu: + - bugfix: Removed some edge cases where atmospherics gas lists could continue holding + active gas items that can only transfer 0 gases to neighbors by making the garbage + collection clean them up. + RandomMarine: + - bugfix: The quick equip hotkey (e) now works for drones again. +2018-04-03: + 81Denton: + - spellcheck: Nanotrasen's space entomology department is shocked to discover that + Mothpeople have surnames! + YPOQ: + - bugfix: Mannitol will now properly cure minor brain traumas + robbylm: + - bugfix: Fixes 0 value not being saved in constant memory circuits (#36860) +2018-04-04: + Fludd12: + - rscadd: Burning ores now yields materials at a very reduced ratio! Lavaland roles + will now be able to construct things with enough effort. + JohnGinnane: + - bugfix: Fixed items sometimes being used on fullpacks when trying to insert + - bugfix: Fixed spray containers being used on open lockers and other containers + Naksu: + - bugfix: Fixed (dead) revenants being unable to deadchat or ahelp + - bugfix: Plasmamen that get converted into humans as a part of spawning as a protected + head role no longer retain their plasmaman equipment. + SailorDave: + - bugfix: Fixes virology Asphyxiation symptom activating too early and ignoring + transmission level. + ninjanomnom: + - bugfix: Shuttles have proper baseturfs now. + - bugfix: Mineral walls properly use their baseturfs when destroyed/drilled. + - rscadd: A new engineering goggle mode allows you to see the shuttle area you're + standing in. + - admin: Buildmode works a bit better with baseturfs now and can properly only remove + the top layer of turfs when editing. Note that as a result the order you place + turfs is important and a wall placed on space means when the wall is removed + there will be space underneath. +2018-04-07: + Davidj361: + - tweak: Stacked sheets now have a cancel button when taking an amount from them. + Dax Dupont: + - bugfix: Fixes dead chat announcements not using real name. + Naksu: + - bugfix: Trash bin anchoring/unanchoring now gives you a small text blip about + what happened. + PKPenguin321: + - bugfix: Restored accidentally cut functionality to flashes. You can once again + attach them to a signaller and signal them to trigger an AoE flash remotely. + SailorDave: + - bugfix: Mixed blood samples preserve their cloneability for podpeople if the samples + are the same. + kevinz000: + - rscadd: AIs can now latejoin! + - rscadd: Latejoining AIs will be sent to a special deactivated AI core. This AI + core will spawn in the AI satellite chamber in place of an active AI if none + is there at roundstart. These cores can be deactivated with a multitool, and + moved around per usual, but not deconstructed. They can, however, be destroyed + per usual. + - rscadd: AIs can only latejoin if atleast one of these cores exists and is in a + valid area (Powered, on station, etc etc), and if the AI job slot isn't filled + already by a roundstart or latejoin AI. + - code_imp: A few code internal debugging features have been added to help debug + GC errors. QDEL_HINT_IFFAIL_FINDREFERENCE hint will make the garbage subsystem + find references if the build is in TESTING mode, and qdel_and_then_find_ref_if_fail(datum) + or calling qdel_then_if_fail_find_references will do the same. + robbym: + - bugfix: Fixes examiner circuit failing to pulse 'not scanned' when reference is + null (#36881) +2018-04-08: + AnturK: + - tweak: Slime reflexes restored. + Dax Dupont: + - rscadd: Hugbox version of the VR sleeper you can't emag. + - admin: There's now two categorized vr landmarks for two teams for easy spawning. + You can also now rebuild/refresh all the VR spawnpoints by calling build_spawnpoints(1) + on any sleeper. + Naksu: + - admin: Admins can now access a new control panel for borgs via a new admin verb +2018-04-09: + CosmicScientist: + - rscadd: Top Nanotrasen scientists have diagnosed two new phobias! Birds and chasms! + Good luck Chief Engineers and Miners. + Dax Dupont: + - admin: Removing notes now has an "Are you sure" dialog. + Denton: + - rscadd: Omegastation now has its own arrivals shuttle. + Mickyan: + - imageadd: Stinger, Grasshopper, Quadruple Sec, and Quintuple Sec have new sprites. + Naksu: + - code_imp: Fixed an heirloom trait-related runtime + - code_imp: Fixed an incorrect signature in MakeSlippery causing runtimes + SpironoZeppeli: + - rscadd: You can now wrench the supermatter shard + ninjanomnom: + - bugfix: The arena shuttle should be working again. + - bugfix: The escape pods now reach their proper destination at round end +2018-04-11: + Davidj361: + - bugfix: Fixed paper bins dropping out of your hand or bag when grabbing a pen + or paper. + - bugfix: Paper bins not giving finger prints upon interaction. + - bugfix: Detective can now write notes onto his printed scanner reports. + - tweak: Detective scanner can have its logs erased via alt-click. + - tweak: Detective scanner can display logs via the action button. + Denton: + - bugfix: Added a missing intercom to the Delta arrivals shuttle. + ExcessiveUseOfCobblestone: + - code_imp: Uplink Items now have 2 separate probabilities. One for the syndicate + crate and one for cargo null crates. I encourage you to view uplink_items.dm + and make changes. + Robustin: + - balance: Hostile mobs capable of smashing structures will now smash their way + through dense objects too. + SpaceManiac: + - bugfix: The blindness overlay applied during cloning now properly stretches for + widescreen views. + - code_imp: Various macro consistency problems have been addressed. + YPOQ: + - bugfix: Eminences can hear clock cult chat again + george99g: + - bugfix: Suiciding will now deactivate all your genetics prescans. + iskyp: + - bugfix: makes dragnet non harmful + - tweak: pacifists can now use any disabler or stun setting on any energy gun + - code_imp: removed all of the pacifism check code from code/modules/mob/living/living.dm + - code_imp: gun objects no longer have a harmful variable, instead, ammo_casing + objects now have a harmful variable, which is by default set to TRUE + - code_imp: if a pacifist fires a gun, it checks whether or not the round chambered + is lethal, instead of whether or not the gun itself is lethal. + - code_imp: /obj/item/machinery/power/supermatter_shard is now /obj/item/machinery/power/supermatter_crystal/shard. + the crystal is the parent object. + neersighted: + - code_imp: Reduced lag by speeding up logs 10000% + - code_imp: Logs now include millisecond-level timestamps + pigeonsk: + - tweak: AI now requires silicon playtime instead of crew playtime for roundstart + role + selea: + - bugfix: fixed runtime in logic circuits, which was occured with invalid input + types. +2018-04-12: + Cobby: + - bugfix: Fixes getting "emptystacks" (a stack with an amount of 0) + Dax Dupont: + - bugfix: Briefcase bluespace launch pads no longer work on the centcom Z level. + Dennok: + - rscadd: RPD can automaticaly wrench printed pipes to floor. + Denton: + - rscadd: Cargo can now order tesla coil crates for 2500 credits. + Garen: + - bugfix: Added missing parameter types to circuits. + - bugfix: Fixes two datatypes appearing for some input circuits. + - tweak: Logic circuits now output booleans rather than 1's and 0's, this is purely + cosmetic. + Naksu: + - bugfix: Warp whistle can no longer leave you stuck in an invisible state + The Dreamweaver: + - bugfix: The air around you grows cooler, as if what you once knew about atmospherics + has changed ever so slightly... + Xhuis: + - bugfix: Mood traits cannot be chosen if mood is disabled in the config. + ninjanomnom: + - rscadd: The SM has a guaranteed 30 second final countdown before delamination + now + - balance: The SM will take less damage from low pressure environments + - balance: The SM has a slightly reduced max damage per tick + - bugfix: Tiles placed on lavaland turfs should behave properly again. + pigeonsk: + - bugfix: When you wash your bloody hands they will no longer still look bloody + afterwards +2018-04-13: + Dax Dupont: + - bugfix: SCP 194 now uses it's amount variable instead of a hardcoded number. + Dax Dupont & Naksu: + - bugfix: Toxin loving species won't take liver damage from toxins. + - bugfix: Liver now gets 0.01 damage per unit of toxin subtype reagent every 2 seconds + instead of 0.5. IE 30 units of whatever won't kill you within 10 seconds anymore. + - bugfix: Moved peacekeeper borg reagents to other_reagents so they don't do liver + damage and they aren't really toxins + - refactor: Renamed borg synthpax path to be more inline and put them next to the + other borg reagents. + Denton: + - tweak: Omegastation's supermatter crystal has been replaced with a smaller shard + that doesn't destroy the whole station on explosion. + Naksu: + - bugfix: Fixed KA upgrade applying on the minerborg + Putnam: + - tweak: rounded pi correctly + ninjanomnom: + - bugfix: Some strange baseturfs in lavaland structures and ruins should be fixed. + robbym: + - bugfix: Fixes tile analyzer circuit + - refactor: Cleaned up tile analyzer code +2018-04-14: + JohnGinnane: + - rscadd: PDA messages you send are now displayed in the chat for your confirmation + Naksu: + - bugfix: SCP-294 can no longer be deconstructed. + kevinz000: + - rscadd: After a severe security breach occurred due to lazily configured Nanotrasen + Network DHCP servers where attackers were able to hijack every airlock connected + to the Nanotrasen Intranet, the Central Command engineering team reports that + they have properly configured network address servers to give out (relatively) + secure network IDs again. [NTNet addresses reverted to 16-hex format. they will + now be randomized across a ~billion trillion possibilities instead of being + 1-1000 every round for doors and stuff.] +2018-04-15: + JohnGinnane: + - tweak: Reorganised circuit component controls within an assembly, so they appear + before the name of the component + Naksu: + - bugfix: Bluespace slime cookies can no longer be used to travel to CentCom + - bugfix: Borgs can no longer accidentally end up inside a cryo cell + - bugfix: Shoving someone inside a cryo cell now has a small delay unless they are + knocked down, stunned, sleeping or unconscious + - admin: Station borgs can no longer control the CentCom ferry. + - bugfix: Ghosts can no longer interact with the round via teleporter effects of + any kind + - tweak: His Grace can no longer be deep-fried + - bugfix: Passive gates can be interacted with in unpowered areas +2018-04-16: + Dax Dupont: + - rscadd: Added get current logs button for admins + - refactor: Removed verbs that have been replaced by other things like the combohud + or ticket panel. + Naksu: + - tweak: Mining borgs and mining drones now have mesons and the engineering goggles' + meson mode also works in lavaland again. + SpaceManiac: + - bugfix: The on-body icon for ancient bio suits is no longer broken. + ninjanomnom: + - bugfix: The aux base properly loads in rather than leaving an empty room. + - bugfix: Admin loaded map templates can be designated as shuttles during the upload + process. Make sure to load them on space first. +2018-04-17: + Dax Dupont: + - bugfix: Fixed martial arts/spell granters breaking on interrupt in final stage. + Naksu: + - balance: Welding tools now flash the user as the weld progresses, not just when + the welding is started. + - bugfix: CentCom officials will now properly display the objectives the admin has + assigned them. +2018-04-20: + Astatineguy12: + - bugfix: Gygax construction now actually uses up the capacitor + Dax Dupont: + - bugfix: A cat is fine too. You can select cat parts again! + - bugfix: Default lizard tail was never properly defaulted, now it is. + - bugfix: Fixes an exploit where tendrils/other spawners/anchored mobs in general + could be buckled to things and thus moved around. + Denton: + - rscadd: Due to space OSHA lobbying, the Syndicate's lavaland base now contains + a radsuit and decontamination shower. + - bugfix: Suit storage units' suit/helmet compartments now accept non-spacesuit + clothing (radsuits, EOD suits, firesuits and so on). + Naksu: + - bugfix: Oingo-boingo punch-face and meteor shot can no longer move gateways or + Reebe servant blocker effects + - bugfix: Mechas piloted by servants of Ratvar now teleport to the servant side + of Reebe when entering a rift + - admin: Gravity generators can now be thrown in buildmode + ShizCalev: + - bugfix: Fixed a number of conveyor belts leading to the incorrect direction. + - bugfix: Fixed shuttle conveyor belts being out of sync with cargo's conveyors + on some maps. + SpaceManiac: + - bugfix: Cycle-linking is no longer permanently disabled for airlocks on shuttles. +2018-04-21: + SailorDave: + - rscadd: A new manipulation circuit, the Seed Extractor. Extracts seeds from produce, + and outputs a list of the extracted seeds. + - rscadd: 'A new list circuit, the List Filter. Searches through a list for anything + matching the desired element and outputs two lists: one containing just the + matches, and the other with matches filtered out.' + - rscadd: A new list circuit, the Set circuit. Removes duplicate entries from a + list. + - tweak: The Plant Manipulation circuit can now plant seeds, and outputs a list + of harvested plants. + - tweak: Reagent circuits can now irrigate connected hydroponic trays and inject + blood samples into Replica pods. + - tweak: The Examiner circuit can now output worn items and other examined details + of carbon and silicon mobs into the description pin, as well as the occupied + turf of the scanned object, and can now scan turfs. + - tweak: The locomotion circuit now allows drones to move at base human speed, but + cannot be stacked, and assemblies can now open doors they have access to like + bots by bumping into them. + - bugfix: List Advanced Locator circuit now accepts refs as well as strings. + - bugfix: Fixed the Power Transmitter circuit not properly displaying a message + when activated. + - bugfix: Medical Analyzer circuit can now properly scan non-human mobs. +2018-04-23: + Dax Dupont: + - rscadd: More stations have been outfitted with disk compartmentalizers. + - bugfix: Fixed a lack of feedback when entering too many points for the gulag. + - admin: Fuel tank logging now logs to both game and attack logs so it's more clear + from logs what caused the explosion in game log and added coords to the messages + as well. + - bugfix: Fixes toolbelts being able to hold everything. + Denton: + - tweak: Moved Deltastation's ORM so that all crew can access it. + - code_imp: Added multilayer subtypes for mapping. + Kor: + - rscadd: Changelings can now have an objective to have more genomes than any other + changeling, rather than a set target. + - rscadd: Changelings can now have an objective to absorb another changeling. + - rscadd: Changelings now get bonus genetic points for buying powers when they absorb + another changeling. Their chem storage cap will also be increased. + - rscadd: Changelings absorbed by other changelings will lose all their powers, + chems, and genetic points, making them unable to revive. + Naksu: + - code_imp: Performance tweaks to plant code + - bugfix: Spears, nullrods etc should no longer be invisible + Power Control Support: + - bugfix: What do you mean we accidentally routed the interaction back to the apc + control conso- oh for fleeps sake STEVE WHAT DID YOU DO!! + Rinoka: + - bugfix: phobias now actually make you fear things other than an apostrophe s. + Spoilsport: + - rscdel: Inducers and integrated circuits can no longer charge energised weapons. + iksyp: + - rscadd: the beer and soda dispenser now have their own circuitboards, as well + as design ids. you can unlock them through techwebs under the biotech node. + - bugfix: beer and soda dispensers can no longer be turned into chem dispensers + by deconstructing and reconstructing them. +2018-04-24: + Dax Dupont: + - bugfix: Cargo scanner is no longer invisible. +2018-04-25: + Barhandar: + - bugfix: Pubbystation's field generators have been offset to no longer bisect the + engine on roundstart setup. + Dax Dupont: + - rscadd: You can now research and construct radiation collectors. + - bugfix: Doors don't turn into Mike Pence when the shock wire is pulsed, only why + it's cut. + - admin: Logging and messaging for singularities now include the area and a jump + link to the location where it happened. + - admin: Improved messaging for blood contracts. + - admin: While the onus is on the admin, the ckey has been added to some of the + prompts so mistakes can be caught earlier in the middle of the process. + Denton: + - tweak: 'Nanotrasen''s materials science division reports: Coins and diamonds DO + blend!' + Mickyan: + - tweak: Potato Chips and Beef Jerky from food vendors now contain salt. + deathride58: + - bugfix: Stocks in the stock market no longer have spontaneous exponential spikes. +2018-04-27: + Dax Dupont: + - balance: Experimentor now only outputs one clone. + - bugfix: Above change also fixes **an exploit** with loaded items getting cloned + after changing the loaded item and ejecting. + - bugfix: RPEDs will no longer display machine contents twice. + - bugfix: RPED can no longer hold everything. + - refactor: Moves all the logic for exchanging parts into the RPEDs instead of having + checks in every attack_by. + - rscadd: Clogged vents now scale like meteors. + - balance: Clogged vents got nerfed. + - bugfix: Buildmode toggle now checks for permissions so the hotkey can't bypass + it. + - admin: Press F10 for dsay prompt. + - admin: PDA explosions now have logging. + Denton: + - spellcheck: Fixed object descriptions and added missing ones - mostly to robotics + and RnD. + Fox McCloud: + - tweak: Removed acid requirement from basic network card and basic data disk + - tweak: grinding circuitboards no longer generates acid + Kor: + - rscadd: Added the Bureaucratic Error event, which replaces the overflow role with + a random job. + Mickyan: + - rscadd: 'New negative trait: Acute Blood Deficiency. Keep your slowly decreasing + blood level in check if you want to survive.' + MrDoomBringer: + - rscadd: Analyzers now show temperature in Kelvin as well as Celsuis + Naksu: + - code_imp: Inbounds subsystem, STATIONLOVING_2 and INFORM_ADMINS_ON_RELOCATE_2 + flags are removed. + - code_imp: New stationloving component replaces all of this. + - code_imp: 'Added new signals: COMSIG_MOVABLE_Z_CHANGED is now sent when a movable + changes Z level, COMSIG_PARENT_PREQDELETED is sent before the object''s Destroy() + is called and allows interrupting the deletion, COMSIG_ITEM_IMBUE_SOUL is sent + when a wizard attempts to make a thing their phylactery' + - bugfix: slime pressurization potions are no longer consumed when attempting to + apply them on already-spaceproof clothing + ShizCalev: + - bugfix: Fixed AI units being able to manually fire unpowered/broken turrets. + - bugfix: Fixed traitor AIs being unable to place a robotics factory if they failed + to place it after the prompt. + - bugfix: Fixed mobs having no hands if they had prosthetic limbs + - bugfix: Fixed damage overlays disappearing from prosthetic limbs when a mob is + husked + - bugfix: Fixed ghosts not being able to see into bags + - bugfix: Fixed a number of chapel and morgue doors being high-security CENTCOM + variants. This was also triggering certain phobias. + - bugfix: Fixed the warning message for chameleon projectors when a mob is inside + a closet + - tweak: Improved the formatting of the round-end report for AI and robotic units + - spellcheck: Added a period to the end of point-at messages. + - bugfix: Fixed ghosts getting spammed by sounds when clicking on a jukebox. + - bugfix: Fixed a duplicate docking port on the aux base template which was causing + some errors + - bugfix: Fixed Gr3y.T1d3 virus bolting open the doors to the SM, causing delamination. + - bugfix: Fixed the cat butcher dropping incorrectly colored tails + - bugfix: Fixed being unable to add a cat tail to someone through surgery. + - bugfix: Fixed mass purrbation & the anime event failing to give people ears and + tails in some cases. + - bugfix: Fixed AI units being able to toggle turrets on and off when AI control + is disabled. + - bugfix: While it slight increases the cost of production, vanilla ice cream is + now actually made with real vanilla! + - bugfix: Fixed AI units being able to see lights through static. + - bugfix: Fixed securitron pathfinding icons being broken. + imsxz: + - bugfix: invulnerability exploit involving stable adamantine extract fixed + ninjanomnom: + - admin: You can now use alt click in advanced buildmode to to copy the targeted + object for placement with left click. + - rscadd: You can now see objects and turfs past the map edge borders. + - bugfix: Shuttles getting removed would occasionally causes issues. This has been + fixed. +2018-04-28: + MMMiracles: + - rscadd: A jukebox can now be found in the bar of your respective station. Contact + Central about song suggestions to be added to the curated list! + Naksu: + - code_imp: clothing-specific flags are now defined in /obj/item/clothing.clothing_flags + PKPenguin321: + - balance: The changeling "Spiders" power now requires absorptions gained through + the actual Absorb ability, rather than DNA from DNA sting. To compensate, it + now only requires 3 absorptions, down from 5. + ShizCalev: + - bugfix: Fixed a good number of missing icons. + as334: + - rscadd: Fusion is back + - rscadd: Fusion now happens with large quantities of hot plasma and CO2, consuming + all the plasma rapidly and producing large amounts of energy. Other gases can + also effect the performance of the reaction. + - rscadd: Fusion now produces radiation. Be careful around reactors. + - bugfix: fixes fusion dividing by zero and destroying everything + - code_imp: Gas reactions now have access to where they are occurring + - bugfix: Prevents some other reactions from producing matter from nothing + kevinz000: + - rscadd: Circuit ntnet components buffed. Added a new low level ntnet component + that can send custom data instead of just the two plaintext and one passkey + format, which things will use by default. Ntnet now uses a list for their data + instead of three variables. they also have lowered complexity for the now weakened + normal network component, and has lower cooldowns. + pigeonsk: + - bugfix: The faint echoes of maracas grows louder, as if a past spirit once forgotten + has come back with a vengeance... +2018-04-29: + Naksu: + - bugfix: Wearing a bucket no longer connects your head to the vacuum of space + oranges: + - rscdel: Pet collars can no longer be equipped on humans +2018-04-30: + Dax Dupont: + - balance: Adds a cooldown to PDA send to all messages. + - bugfix: Last sent message cooldown actually works now. + - tweak: More reagents in the clogged vents event. + Denton: + - rscadd: Added more holoprojectors to techwebs (security, engineering and atmos). + Erwgd: + - rscadd: Limb growers can now create limbs for flypeople and mothmen. + Evsey9: + - balance: Integrated Circuit weapon mechanisms now work only when outside of any + containers and hands, due to reports of severe injury caused by activating them + while still holding them. + Garen: + - imageadd: added inhands for teleprods. + JJRcop: + - bugfix: Integrated circuits can no longer throw themselves. + Jalleo: + - bugfix: a certain exploit that can occur in regards to creating certain items + in a particular manner + - tweak: readds emitter field generator and rad collector wrenching times. Someone + override it when adding the wrench_act. + Mickyan: + - tweak: You can now see how well fed you are by self-inspecting. + Naksu: + - code_imp: More flags have been moved to their appropriate places + - code_imp: HEALS_EARS_2 is removed in favor of the earhealing component + - code_imp: wearertargeting component is available to subtype for components that + want to target the wearer of an item rather than the item itself + ShizCalev: + - bugfix: Glass stacks will now properly delete when exploded. + - bugfix: Fixed attacking someone with a bikehorn not triggering the correct mood + event. + YakumoChen: + - tweak: Nanotrasen has once again shipped BZ to its nearby stations. Check your + local Xenobiology lab for your shipment. + - tweak: Nanotrasen would like to remind you that BZ is meant for keeping slimes + from moving or getting hungry. It is not for human use and may lead to hallucinations. + Always practice workplace safety when handling dangerous gasses! + george99g: + - bugfix: Committing suicide will now stop you from being cloned via prescans. + iksyp: + - tweak: pacifists can now use .50BMG Soporific Rounds + ninjanomnom: + - bugfix: Caravan ambush shuttles have been templated to fit the new system and + can fly again. + pigeonsk: + - bugfix: Large stacks of plastitanium now display properly + - rscadd: You can now get traditional sake and get a first-hand taste of a superior + culture. Have I told you about my katana and my trip to- +2018-05-01: + BuffEngineering: + - bugfix: Nanotrasen has graciously connected the port bow solar's SMES to the main + grid. + Denton: + - rscadd: You can now craft and disassemble HUDsunglasses! Check out the clothing + section of the crafting menu. + - tweak: Cargo packs have been reorganized to shrink the big engineering, food&livestock + and misc categories. + NewSta: + - rscadd: 'Added 5 new drinks: Alexander, Between the Sheets, Kamikaze, Mojito and + Sidecar.' + - rscadd: Added Menthol and Sake to the drink dispensers. + Ordonis, Denton: + - rscadd: OH YEAH BROTHER! The H.O.G.A.N. AI module has a chance to spawn at the + AI upload. + SpaceManiac: + - bugfix: The button in the mech interface to terminate maintenace protocol no longer + reads "Initiate maintenace protocol". + - bugfix: Boxes now fit inside storage implants again. + XDTM: + - balance: Small, constant ticks of brain damage are now less likely to cause traumas. + deathride58: + - bugfix: Fixed the intergalactic stock market crash. The speculation/performance + modifier has been removed completely. +2018-05-04: + Cobby (Stolen from GrayRachnid): + - tweak: The processor has now been generalized techweb-wise into the "food/slime + processor". + - rscadd: The processor can now be made by Science. + Dax Dupont: + - balance: After successful lobbying by the Space Ancap Federation ammo is no longer + free. Material redemption cost is now determined by the amount of bullets left. + - balance: .38 ammo is now cheaper to produce. + - balance: Casings now give a little bit of metal. mostly for immersion sake. + Denton: + - bugfix: Runtimestation's RnD machinery is now up to date. + Fox McCloud: + - bugfix: Fixes recycler not recycling bluespace and plastic objects + - bugfix: Fixes objects with material components always showing their materials + on examine + Garen: + - bugfix: Removes unintentional pins from the constant circuit. + Hyacinth: + - rscadd: Grenadine is now available in the bar! + - tweak: Tequila sunrises now require grenadine to make! + Mickyan: + - bugfix: Our suppliers assure us that Midori Tabako cigarettes will actually contain + tobacco from now on. + Naksu: + - code_imp: APC code is slightly less shit. + - tweak: APC cells can be removed with a crowbar + Onule!: + - rscadd: Plasmaman liver and stomach crystals! + Poetic_Iron: + - spellcheck: Fixed 'Tequila Sunrise' naming from 'tequila Sunrise'. + SpaceManiac: + - code_imp: The commit hashes shown in Show Server Revision are now long enough + to autolink when copied into issue reports. + Spellbooks Take 2: + - imageadd: Magical Spellbooks are now animated. + Tlaltecuhtli: + - tweak: medbeams heal tox and oxy slighty + pigeonsk: + - rscdel: After an internal audit and review Nanotrasen has decided that stock financing + at the station-level makes no logistical nor managerial sense. Stations, and + their cargo departments, may no longer play the stock market. +2018-05-06: + Dax Dupont: + - bugfix: Rhumba beat now stops processing while dead. + Denton: + - bugfix: The Donksoft vendor board got lost during the techwebs transition and + has been re-added under the illegal technology node. + Garen: + - tweak: Grilles must take damage to produce tesla shocks. + Naksu: + - bugfix: APCs are closed with crowbars properly again. Screwdrivers can now be + used by borgs to pop out the cell instead of crowbars + SpaceManiac: + - bugfix: The top-left menus (icon scaling, ghost preferences, etc.) now work again. + Xhuis: + - tweak: Character traits are now called character quirks. Functionality remains + unaffected. + deathride58: + - rscadd: If the nuke disk stays still for long enough, the lone operative event + will enter the random event rotation. The longer the nuke disk stays still, + the more likely the lone operative event will trigger. +2018-05-08: + cacogen and nicbn: + - tweak: You can now select RPD modes individually. + - tweak: RPD autowrenching is now a tgui action rather than an Alt Click option. + deathride58: + - rscadd: Added ambient occlusion. You can toggle this on or off in the game preferences + menu. +2018-05-09: + Firecage & Bluespace: + - balance: Replaces the Roman Shield and Roman helmets in the Autodrobe with fake + versions with neither block chance nor armour values. + PKPenguin321: + - rscadd: There are now two new variants of the concatenator integrated circuit. + Small, which only takes 4 inputs, and large, which takes 16. Small uses 50% + less complexity, large uses 50% more. + - rscadd: There's a new string length circuit, which simply returns the length of + a given string. + - rscadd: There's a new indexer circuit, which takes a string and an index and returns + the character found at the index of the given string. + - tweak: The find text integrated circuit now has two new pulse outs, one that runs + when it finds the text and one that runs when it does not. + - tweak: Leaving the delimiter in the explode text circuit null will now return + all of the input string's characters in a list. +2018-05-10: + Dax Dupont: + - bugfix: The singularity spawned by the arcade orion tale meme will disappear as + intended. + Kor: + - rscadd: Science may now research reactive armour shells, which create different + armours when combined with different anomaly cores. They are constructable from + the Research and Engineering lathes. + Ordo: + - rscadd: Adds a french beret to the mime. Steal it from him to learn French! Sort + of. HONH HONH HONH. + SpaceManiac: + - refactor: Large groups of PNG assets are now transmitted in spritesheets, greatly + improving load times. + - tweak: The access denied message when entering a mech now distinguishes between + DNA lock and ID requirements. + - bugfix: Removing an ID card from a wallet now properly removes its visual and + accesses. + Tlaltecuhtli: + - bugfix: the default bulldog shotgun ammo makes sense now + - bugfix: fixes a possible money exploit + YPOQ: + - bugfix: Anomalies can be disabled with signalers again +2018-05-13: + Alexch2: + - bugfix: Large crates no longer behave like lockers. They no longer open into invisible + sprites when damaged, interacted with, when "toggle open" is used, or when non-crowbar + items are used on them. + Ausops and Qbopper: + - rscadd: Added security jumpskirts - snag one from a security wardrobe locker. + Cobby: + - bugfix: Beds will now properly save you from floor is lava, but only if you buckle + to them + Cyberboss: + - tweak: You may now take unlimited neutral and negative quirks + Denton: + - bugfix: Runtimestation's RTGs are now connected to the powernet. + - code_imp: Added chem_dispenser/fullupgrade as well as chem_synthesizer for testing. + - tweak: Replaced runtimestation's two chem dispensers with those subtypes. + - spellcheck: Did you know that you can use a screwdriver on the ChemMaster board? + Now you do. + Frozenguy5: + - tweak: You can now make plasma reinforced glass at the ORM. + - tweak: Titanium glass is now worth 0.5 titanium + 1 glass. Plastitanium glass + is now worth 0.5 titanium + 0.5 plasma + 1 glass. Therefore these glass sheets + are cheaper to make. + Iamgoofball: + - bugfix: Family Heirlooms now properly show you where they are stored if they spawn + in a bag. + Mickyan: + - tweak: Gauze can be deconstructed into cloth using wirecutters. + Naksu: + - rscdel: Fusion has been removed for pressing ceremonial reasons, and also because + it crashes the server + Tlaltecuhtli: + - bugfix: 50% of the corgis bought are now male + XDTM: + - tweak: Teleporters linked to other teleporters now teleport into the other teleporter's + hub, instead of the power station. + - bugfix: Teleporters now no longer consume power if teleportation fails. + YPOQ: + - bugfix: Fixed items stacks sometimes having the wrong amount if created on another + stack + - bugfix: Constructing light tiles no longer uses two sheets of metal + - bugfix: Gorillas have hands slots again + - bugfix: The paddle/nozzles of defibs, backpack water tanks, and gatling lasers + work again + - bugfix: You can honk people with bike horns again +2018-05-14: + Barhandar: + - rscadd: Amount of goliath plates is now shown in examine for explorer suits and + mining hardsuits. + Dax Dupont: + - rscadd: You can now swap disks in the plant manipulator. + JStheguy: + - imageadd: Vending machines now have more complex shading and are rigged with next-gen + flickering technology, a couple have either a partial or complete facelift. + Maintenance panel overlays have been fixed on machines where they were seemingly + left unchanged when the switch to 3/4ths was made. + - imageadd: Burger buns are bigger and more detailed. + - imageadd: Donuts have been totally redrawn. + SpaceManiac: + - admin: Admin-healing someone will now rejuvenate their mood as well. +2018-05-15: + Dax Dupont: + - bugfix: Fixes missing curator hud icon. + Denton: + - tweak: Engi-Vend machines now contain fire alarm and firelock electronics! + - code_imp: Loose tech storage circuit boards have been replaced with spawners. + - rscadd: APC/air alarm/airlock/fire alarm/firelock electronics are now available + once Industrial Engineering is researched.. +2018-05-16: + Dax Dupont: + - balance: Cult items will no longer be a long ride on the vomit coaster if picked + up by a non cultist. +2018-05-17: + Dax Dupont: + - balance: Cult space bases are kill again. + - balance: Cult floors now pass gas. + - bugfix: Fixed a few things deconning into the wrong circuit. + - bugfix: You can no longer do infinite bioware surgery. + - rscadd: Added the MURDERDOME VR player versus player combat arena, filled with + the most powerful weapons Centcom could think of to murder each other peacefully. + Contact your nearest vendors for VR sleepers. + - tweak: VR landmarks now accept outfits. + - tweak: VR Sleepers can now be constructed and researched. + - tweak: VR Sleepers now respond to mouse drops like sleepers! + - bugfix: VR sleepers no longer close or open inappropriately. + Denton: + - code_imp: Added /syndicate subtypes for air alarms and APCs. + - bugfix: Added missing stock parts to the syndicate lavaland base. + - tweak: Added kitchen related circuit boards to the syndie lavaland base. + Dimmadunk: + - rscadd: 'There''s a new type of reagent added to the booze dispenser: Fernet. + With it you can make a couple of new digestif drinks that will help you reduce + excess fat!' + Garen: + - rscadd: Thrower and Gun circuits put messages in chat when they're used. + - tweak: Only the gun assembly can throw/shoot while in hand + - imageadd: Adds inhands for the gun assembly + - bugfix: grabber inventories update when a thrower takes from them + Pubby: + - tweak: PubbyStation has been updated. You can now be the lawyer. + ShizCalev: + - bugfix: Adminorazine will no longer kill ash lizards. + - bugfix: Adminorazine will no longer remove quirks. + iskyp: + - tweak: the walls on the crashed abductor ship ruin in lavaland can now be broken + down +2018-05-18: + GrayRachnid: + - rscadd: The Spider Clan proudly announces that they've taken steps to improve + their hospitality at their capture center! They now hope that captured targets + would not kill them self or fight between each other, dirtying the floor with + blood. + - rscadd: They've also added a VR room for those sick of the real world, taking + them to a reality where they feel like they matter. +2018-05-19: + Alexch2: + - spellcheck: Fixes tons of typos related to integrated circuits. + - tweak: Re-writes the descriptions of a few parts of integrated circuits. + Astatineguy12: + - tweak: The experimentor is less likely to produce food when it transforms an item + - bugfix: The experimentor no longer breaks when the toxic waste malfunction occurs + multiple times and isn't cleaned up + - bugfix: The experimentor irridiate function actually chooses what item to make + properly rather than picking from the start of the list + Dax Dupont: + - bugfix: Mulligan didn't work on lizards and other mutants. Now it does. + - bugfix: Foam no longer gives infinite metal + Denton: + - code_imp: Loose silver/gold/solar panel crates have been replaced with "proper" + crates. + - tweak: There are rumors of the Tiger Cooperative adding a "special little something" + to some of their bioterror kits. + Iamgoofball: + - tweak: Lipolicide now only does damage if you're starving. + Mickyan: + - bugfix: Drinking too much Gargle Blaster, Nuka Cola or Neurotoxin no longer breaks + time and space. + Nichlas0010: + - tweak: Reseach Director Traitors can no longer receive an objective to steal the + Hand Teleporter + ShizCalev: + - bugfix: Fixed mobs immune to radiation being killed by HIGH bursts of radiation. + - bugfix: The book of mindswap will now properly mindswap it's users. + iksyp: + - rscadd: stacking machines and their consoles no longer dissapear into the shadow + realm when broken + - rscadd: you can link the stacking machine and its console by using a multitool +2018-05-20: + Pubby: + - rscadd: 'Cargo bounties from Nanotrasen. Earn cargo points by completing fetch + quests. remove: Several cargo exports have been reduced or merged into cargo + bounties.' + XDTM: + - rscadd: 'Added a new lavaland loot item: Memento Mori. A necklace which has the + power to prevent death, but will turn you into dust if removed.' +2018-05-22: + Cyberboss: + - rscadd: You can now view your last round end report window with the "Your last + round" verb in the OOC tab + Dax Dupont: + - tweak: The BoH dialog now has Abort instead of Proceed as an default option. + - bugfix: Fixes race condition caused by exiting the body while dying in VR. + Denton: + - balance: Skewium is much less likely to appear during the Clogged Vents event. + Firecage: + - rscadd: Replaces wardrobe lockers on Box with Wardrobe Vending Machine. + Kor: + - rscadd: Engineering can now create anomaly neutralizer devices, capable of instantly + neutralizing the short lived anomalies created by the supermatter engine. + - rscadd: The Quartermaster and HoP can now access the vault so they can use the + bank machine. + Mickyan: + - bugfix: Pacifists can now use harm intent for actions that require it (but still + can't harm!) + Naksu: + - code_imp: Added EMP protection component, replaced various bespoke ways things + handled EMP proofness + Nichlas0010: + - spellcheck: you now feel nauseated instead of nauseous + - bugfix: Comms consoles won't update while viewing messages + SpaceManiac: + - bugfix: Pipe icons in the RPD now show properly in older versions of IE. + - bugfix: Family heirlooms which can fit in pockets will now spawn there. + - bugfix: Family heirlooms which only fit in the backpack now show the backpack + at roundstart. + - bugfix: Family heirlooms which do not fit in the backpack are no longer gone forever. + - bugfix: Mindswapping with someone else no longer forces ambient occlusion on. + - code_imp: IRV polls now use the same version of jQuery as everything else. + - bugfix: Hydroponics trays can no longer be deconstructed with their panels closed + or unanchored while irrigated. + - tweak: Frames for machines which do not require being anchored can now be un/anchored + after the circuit has been added. + - bugfix: Removing an ID from a PDA in a backpack no longer hides the ID until something + else updates. + - bugfix: Opening and closing airlocks repeatedly no longer stacks queued autocloses. + - bugfix: Admin AI interaction now works properly on firelocks. + - spellcheck: Fix "Your the wormhole jaunter" when a wormhole jaunter saves you + from a chasm. + Wilchen: + - rscdel: Removed box of firing pins from rd's locker + armhulen: + - rscdel: chameleon guns are disabled for breaking the server + kevinz000: + - bugfix: Field generators are once again operable by adjacent cyborgs. + - bugfix: Digital valves are once again operable by silicons. + - bugfix: Chasms no longer drop mobs buckled to undroppable mobs or objects. + resistor: + - rscadd: Added circuit labels! You can now customize the description of your assemblies. +2018-05-23: + ShizCalev: + - bugfix: Fixed a runtime with the gulag teleporter that could cause the process + to fail if you removed the ID. + - tweak: Not setting the goal of a prisoner's ID when teleporting them will now + set the ID's goal to the default value (200 points at the time of this change.) + SpaceManiac: + - bugfix: Flipping and then rotating trinary pipe fittings no longer causes their + icon to mismatch what they will become when wrenched. + - bugfix: RPD tooltips for flippable trinary components have been corrected. + - bugfix: Entertainment monitors now view the real Thunderdome rather than the template. + cyclowns: + - rscadd: Analyzers can now scan all kinds of atmospheric machinery - unary, binary, + ternary, quaternary, you name it. This means stuff like gas pumps, gas mixers, + vents and so forth can be analyzed. + - tweak: Analyzers now show temperature in kelvin as well as celsius. + - tweak: Analyzers now show total mole count, volume, and mole count of all gases. + - tweak: Analyzers show everything at slightly higher degrees of precision. + imsxz: + - admin: Using mayhem bottles and going under their effects is now logged. + kevinz000: + - rscadd: Any anomaly core can now be deconstructed for a one time boost of 10k + points in the deconstructive analyzer. +2018-05-25: + Astatineguy12: + - bugfix: The mime blockade spell now shows up under the right tab + Cruix: + - rscadd: Added a button to chameleon items to change your entire chameleon outfit + to the standard outfit of a selected job. + Dax Dupont: + - rscadd: Murderdome now has a telecomm system, so you can taunt your enemies better. + - rscadd: Snowdin has come back, as VR! + - rscadd: Nanotrasen Tactical Bureau has discovered a Syndicate VR Training program + on their last raid. It seems to be based on an old CentCom design... + - rscadd: Restricted variant of the uplink. Will allow admins and such to spawn + uplinks in remote arenas or for events that aren't as destructive and can't + communicate with other Zs. + - bugfix: Extends same Z level check to monitor and bugging operations too for camera + bug. + - bugfix: VR sleepers now show the stat of the VR avatar instead of the user as + intended. + - code_imp: Makes it throw a stack trace when you ghostize in VR. + - tweak: It will now delete the body if it's unconscious if you try to reconnect, + to speed up reconnection. + - balance: Emagged sleepers will now display a notification on the UI, and make + you slightly dizzy after a while. + - balance: More chemicals can be found when vents get clogged. + - bugfix: Fixes accidental empty ahelp replies. + Denton: + - rscadd: Departmental wardrobe vendors have been added to all maps. + - spellcheck: Sorted cargo packs (wardrobe refills//alphabetically) and mining vendor + items (by price), again. + - bugfix: 'Navbeacon access requirements have been fixed: Now you need either Engineering + or Robotics access, but not both at the same time.' + Garen: + - rscdel: Removed circuitry save files saving whether or not the assembly is open. + - rscadd: Adds messages for when you successfully use a sensor or scanner circuit. + - bugfix: Fixed circuit printers printing advanced assemblies from save files despite + not being upgraded. + - bugfix: Fixed circuit printers printing circuits into assemblies that wouldn't + normally be able to hold them. + - bugfix: Fixed circuit assemblies taking damage when using objects with the help + intent. + Mickyan: + - spellcheck: fixed typo in bronze girder construction + MrDoomBringer: + - rscadd: Cargo now has access to Supplypod Beacons! Use these to call down supplypods + with frightening accuracy! + - imageadd: the VR sleeper action button has a sprite now + Naksu: + - code_imp: Replaced initialized and admin_spawned vars with flags. + - code_imp: changed the shockedby list on doors to be only initialized when needed. + - tweak: Chameleon projector can no longer scan (often temporary) visual effects + like projectiles, flashes and the masked appearance of another chameleon projector + user + - bugfix: Drones can no longer see a static overlay over invisible revenants + - balance: adjusted default antag rep points to grant every job the same amount + of points per round, except for assistant which gets 30% less + SpaceManiac: + - bugfix: Non-harmfully placing someone who is resting on a table no longer makes + them get up. + - bugfix: The disco machine no longer lags the chat by spamming "You are now resting!" + messages. + - bugfix: The green overlay indicating where a map template will be placed is no + longer invisible on space turfs. + - bugfix: CentCom is no longer self-looping, fixing the ability to see or get into + certain areas after escaping to space. + - bugfix: The destructive analyzer no longer consumes entire stacks to give the + benefit of one sheet. + - bugfix: Xeno weeds and floors under diagonal walls are now on the correct plane, + fixing odd ambient occlusion appearances. + - bugfix: Inserting materials into protolathes with telekinesis is now possible. + - bugfix: Telekinesis no longer teleports items removed from deep fryers, constructed + sandbags, and leftover materials not inserted into lathes. + - bugfix: Telekinetic sparkles now appear in the correct place when clicking on + a turf and when clicking in the fog of war in widescreen. + - bugfix: Telekinetically adjusting power tools no longer causes them to exit the + universe. + - tweak: Examining a telekinetic grab in-hand will now examine the grabbed object. + - bugfix: Frost spiders now correctly inject frost oil on bite. + yorii: + - bugfix: Fixed the smartfridges to be in line with all other machines and puts + the released item in your hand. +2018-05-26: + Dax Dupont: + - bugfix: Experimentor no longer shits out primed TB nades. + Garen: + - rscadd: Added a cell charger to the circuitry lab on all stations. + - rscadd: Added a circuitry lab to the syndicate lavaland base. + - tweak: Modified the meta station circuitry lab. + Iamgoofball: + - rscadd: Humans require ice cream. Eat the ice cream. + Kor: + - rscadd: Bag of Holding detonations have been significantly reworked. + Robustin with cat earrs: + - bugfix: 'Gun overlays should be way less laggy now. remove: Chameleon guns are + completely removed since they crash the server, were already made unavailable, + and are the worst shitcode I''ve ever seen in my life.' + SpaceManiac: + - tweak: Clicking on the viewport to focus it no longer leaves the input bar red. + - admin: Create Object will no longer force objects with special directional logic + to be facing south by default. + - bugfix: Running diagonally into space now properly continues the diagonal movement + in zero-gravity. +2018-05-27: + Armhulen, and Keekenox: + - rscadd: Chaplain now gets custom armor too! Order it from the beacon in your locker. + Cobby: + - tweak: Several of the recent drinks added have now been given effects! + - rscadd: 'Alexander: Conquer the world... or just the station with this drink! + If you have a shield, it will increase the block chance by 10 percent! Careful + not to drop it in battle though....' + - rscadd: 'Between The Sheets: Save the pillow talk for next shift, having this + in your system while you''re asleep will slowly heal you!' + - rscadd: 'Menthol: Prevents coughing. Good for a cold or if the Chaplain gets his + hands on a smoke book!' + - tweak: Descriptions have been edited so that if you view these under a chem master + they will tell you the effect. + - tweak: Decals are the exception to the recent removal of effects in Chameleon + Projectors. + Dax Dupont: + - bugfix: Did you know istype doesn't work on paths even though they are mostly + the same? Yeah I didn't either. Experimentor shouldn't shit out TB nades anymore. + - bugfix: Fixes item reactions for relics as well. + - rscadd: Adds better messaging + - bugfix: Fixes summons happening on away missions. + GuyonBroadway: + - rscadd: Adds gloves of the north star to the traitor uplink. Wearing these gloves + lets you punch people five times faster than normal. + - rscadd: Sprites for the gloves courtesy of Notamaniac + Mickyan: + - rscadd: 'New trait: Drunken Resilience. You may be a drunken wreck but at least + you''re healthy. If alcohol poisoning doesn''t get you, that is!' + Naksu: + - rscadd: Nuclear explosive-shaped beerkegs found on metastation can now be triggered + with the nuclear disk and the syndicate's legacy nuclear code for a foamy surprise + SpaceManiac: + - bugfix: Unwrenching and re-wrenching pre-mapped atmos components no longer turns + them on automatically. + steamport: + - bugfix: Borgs/AIs can now toggle rad collectors +2018-05-28: + CitrusGender: + - bugfix: Kills you if you're under 0% blood and above -9999% blood level (shouldn't + be possible through normal means to be below that.) + - bugfix: Stops bloodloss trait from happening if your race contains the NO_BLOOD + - bugfix: added a check to see if the preferred race is human when the name doesn't + have a space + Dennok: + - bugfix: Fixed a laser reflections from reflectors. + Denton: + - tweak: Deltastation's firing range has been decommisioned and replaced with a + brand new toxins burn chamber. + - bugfix: Delta toxins disposals are now actually connected to the disposals loop. + Toxins storage has a fire alarm too. + - bugfix: The shutter buttons of Pubbystation's mechbay now check for access. + SpaceManiac: + - bugfix: The robustness of the Super Secret Room has been increased. + - bugfix: Observers can no longer move the action button toggle or change the ambient + occlusion setting of their targets. + - bugfix: The emergency space suit safes in escape pods are no longer always unlocked. + Tlaltecuhtli: + - bugfix: apiaries from cargo start unwrenched +2018-05-29: + Dennok: + - rscadd: Collectors show their real produced power and stored power when examined + Naksu: + - code_imp: removed some unneeded typecaches +2018-05-31: + CitrusGender: + - bugfix: Flamethrowers are no longer uncraftable since they have a part that happens + to be a tool. + - bugfix: Fixes cyborgs not being able to use two-handed modules while other modules + are equipped. + CosmicScientist: + - rscdel: Can't make drones anymore + Cruix: + - rscadd: AIs now have an experimental multi-camera mode that allows them to view + up to six map areas at the same time, accessible through two new buttons on + their HUD. + Cyberboss: + - config: The limit of monkey's spawned via monkey cubes is now configurable + Dax Dupont: + - bugfix: Fixes the wrong tiles in Syndicate VR trainer and uses different tiny + fans. + - bugfix: Access didn't append to VR IDs + Firecage: + - rscadd: The mech fabricator can now print two new janiborg upgrades. Advanced + Mop and Trash Bag of holding. These two upgrades uses the advanced robotics + node. + SpaceManiac: + - bugfix: Changing UI Style preference now takes effect immediately rather than + next round. + - bugfix: Mindswapping with someone no longer gives you their UI style. + - bugfix: The destructive analyzer can once again be used to reveal nodes. + - spellcheck: Some references to "deconstructive analyzer" have been updated to + "destructive". + - tweak: Hulks and catpeople now show "Human-derived mutant" under "Species" when + health scanned. + - bugfix: Cyborg inventory slots once again unhighlight when a module is stowed. + deathride58: + - rscadd: Things that are capable of igniting plasma fires will now generate heat + if there's no plasma to ignite. Building a bonfire inside the station without + taking safety precautions is now a bad idea. + kevinz000: + - rscadd: Plasma specific heat is 500J/K*unit, everything else is 200 + zaracka: + - bugfix: The Spirit Realm rune no longer spawns a braindead cult ghost when attempting + to summon one after a player reaches the limit. +2018-06-01: + Big Tobacco: + - rscadd: Cheap lighters now come in four different shapes and Zippos can have one + of four different designs, collect them all and improve our sales! + - imageadd: All existing lighter sprites have been given a face-lift and the flames + are now subtly animated. + - tweak: Cheap lighters now use a fixed list of 16 colors to pick from instead of + using totally randomized colors. + - imageadd: Cigar cases have been tweaked to be a bit smaller and to have a modified + design. + - imageadd: Cohiba Robusto and Havanan cigars now use separate case sprites from + the generic premium cigar cases. + Dax Dupont: + - bugfix: Fixed rpeds throwing stock part rating related runtimes. + Naksu: + - code_imp: NODROP_1, DROPDEL_1, ABSTRACT_1 and NOBLUDGEON_1 have been moved to + item_flags + - tweak: brass handcuffs, meat hook and the chrono gun now conduct electricity. + Nichlas0010: + - bugfix: You can no longer use a soapstone infinitely + SpaceManiac: + - bugfix: Moving diagonally past delivery chutes, transit tube pods, &c. no longer + causes your camera to be stuck on them. + - refactor: The base machinery type is now anchored by default. + - bugfix: Pubby's auxiliary mining base now works again. + - bugfix: Cloning no longer breaks a character's connection to their family heirloom. + - bugfix: The overlay effects of cult flooring are now on the floor plane, fixing + their odd ambient occlusion appearance. + - bugfix: Beam rifle tracers no longer fall into chasms. + - bugfix: Vomiting on the same tile a second time no deletes the vomited reagents. + theo2003: + - bugfix: fixed the clockwork helmet not dropping to ground when used by non-clock + cultists +2018-06-03: + Denton: + - tweak: 'Pubbystation: Added a dual-port vent pump to the toxins burn chamber.' + - code_imp: Removed most airlock_controller/incinerator related varedits and replaced + them with defines/subtypes. + - tweak: The Deltastation toxins lab has its portable scrubber, air pump and intercom + back. + Naksu: + - bugfix: comms consoles now work in transit again, and no longer work in centcom + - code_imp: removed unnecessary getFlatIcons from holocalls + - bugfix: Screwdrivers and other items with overlays now show the proper appearance + of the item when attacking something with them, or when put on a tray. + Nichlas0010: + - bugfix: You now can't get multiple download objectives! + - tweak: RDs, Scientists and Roboticists can no longer get download objectives! + ShizCalev: + - bugfix: Fixed cigar cases & cigarette packets taking two inventory slots + - bugfix: Fixed cigar cases showing the wrong icon for the cigars inside them. + - bugfix: Fixed cigar cases & cigarette packets stating the wrong name of the cigar/cigarette + when removed via altclick. + - bugfix: Fixed items in pockets vanishing when a mob is monkeyized. + - bugfix: Fixed items in pockets vanishing when a mob is gorillized. + - bugfix: Fixed items in pockets vanishing when a mob is infected with a transformation + disease. + - bugfix: Fixed items in pockets not being properly deleted when a mob goes through + a recycler + - bugfix: Fixed items in pockets not being properly deleted when highlander mode + is enabled. + - bugfix: Fixed exploit allowing you to remove unremovable tanks from pockets. + - bugfix: Fixed items in pockets dropping when a mob is equipped with a new outfit. + - bugfix: Fixed items in pockets not being covered in blood when equipping the psycho + outfit. + SpaceManiac: + - bugfix: Switching mobs into/out of a mech (by VR, ghosting, or mindswap) no longer + improperly applies the mech's cursor. + ThatLing: + - bugfix: PDA style now gets loaded correctly. + cyclowns: + - bugfix: Fires no longer flicker back and forth like crazy + iskyp: + - tweak: switched the type of the space suit on the syndicate shuttle + theo2003: + - tweak: roboticists have access to R&D windoors + - bugfix: fixed hydroponics tray weed light staying on when removing weeds with + integrated circuits + yorpan: + - rscadd: Brain damage makes you say one more thing. +2018-06-04: + Beachsprites: + - imageadd: added directional beach sprites + MrDoomBringer: + - admin: Central Command can now smite misbehaving crewmembers with supply pods + (filled with whatever their hearts desire!) + SpaceManiac: + - bugfix: Atom initialization and icon smoothing no longer race, causing late-loading + mineral turfs to have no icon. + - spellcheck: Faceless persons no longer "melt their face off" in energy gun suicides. + - bugfix: The Lightning Bolt spell now works again. + yenwodyah: + - bugfix: A few virus threshold effects should work now +2018-06-06: + Dax Dupont: + - bugfix: Fixes a sentience related exploit by blacklisting it in restricted uplinks. + Denton: + - rscadd: Arcades have been stocked with preloaded tactical snack rigs. + - bugfix: Swarmers can no longer attack field generators and turret covers. + - bugfix: The Pubbystation maint bar Booze-O-Mat now shows its contents correctly. + MrDoomBringer: + - admin: CentCom Supplypods now stun their target before landing, and won't damage + the station as much + Naksu: + - code_imp: moved /datum.isprocessing into datum flags + iksyp: + - bugfix: Ever since the great emotion purge of 2558, people were able to work at + top efficiency, even while starving to death. This is no longer the case, Nanotrasen + Scientists say. + - admin: Hunger slowdown only applies if mood is disabled in the config. +2018-06-07: + Cruix: + - bugfix: Picture-in-picture objects now are no longer overlapped by other certain + objects + SpaceManiac: + - bugfix: It is now possible to access the wires of RND machines in order to repair + them if they have been EMP'd. + Tlaltecuhtli: + - bugfix: rad collectors set to research point gen are somewhat ok now + kevinz000: + - tweak: Vehicle speed changes now happen immediately instead of on the next movement + cycle +2018-06-08: + AnturK: + - code_imp: Gravity can now go above 1g + CitrusGender: + - imageadd: sandstone wall sprite for indestructible object + Denton: + - tweak: Added a warning to the shuttle purchase menu. + - bugfix: Added missing vents to runtimestation. + - tweak: 'Runtimestation: Added /debug EMP flashlight, emag, techfab and tiny fans. + Replaced RCD, healing wand and sleeper with more suitable subtypes.' + MrDoomBringer: + - tweak: Due to DonkCo's recent budget cuts, their line of toy emags are now noticably + less realistic. As such, you can now examine an emag to determine if it is a + toy or not. + Naksu: + - balance: Temperature gun projectiles now respect armor/dodge, and will no longer + freeze you if they don't hit you. + SpaceManiac: + - bugfix: The thermal sight benefits of lantern wisps no longer disappear if you + change glasses. + - bugfix: Paradox bags no longer block the middle of your screen until reconnect, + and also actually work. + - bugfix: A pAI dying while in holoform no longer deletes the card, instead merely + emptying it. + - bugfix: The elevators in the Snowdin away and VR missions work again. + - bugfix: Minor atmos issues in Snowdin and UO45 have been corrected. + Tlaltecuhtli: + - bugfix: all spiders can make webs now + deathride58: + - balance: Sparks, using welding tools, using igniters, etc, will no longer cause + an instant fireless inferno in small rooms. + - tweak: The revert of the original hotspot_expose() PR has been reverted, since + the reason as to why it was reverted was resolved with this change. + - balance: Reverted the increased rad collector tech point gain rate. + fludd12: + - rscadd: Love potions are marginally more interesting! This same effect applies + to if you are a valentine! + - tweak: The names of extracts are now in the proper order, finally! + - rscadd: Self-sustaining extracts are in! Technically, this is a fix, but whatever. + - bugfix: Stabilized Cerulean extracts no longer vaporize items into the Aetherium. + - rscadd: Stabilized Gold extracts are now moderately more fun to use! The randomized + creature persists if it is killed, and can be rerolled at will! Also, if you + give the creature a sentience potion, the mind will transfer over! + oranges: + - rscadd: Sec now has khaki pants for tacticoolness +2018-06-11: + Mickyan: + - rscadd: Added an abandoned kitchen to Metastation maintenance + XDTM: + - bugfix: Fixed anti-magic not working at all. + fludd12: + - bugfix: Stabilized gold extracts now respawn the familiar properly. + - bugfix: Stabilized gold familiars retain the proper languages even after respawning. + - tweak: Stabilized gold familiars can be renamed and have their positions reset + at will. +2018-06-12: + Dax Dupont: + - bugfix: Botany trays don't magically refill anymore with a rped. + SpaceManiac: + - tweak: Fire alarms now redden all the room's lights, and emit light themselves, + rather than applying an area-wide overlay. + - bugfix: Fire alarms no longer visually conflict with radiation storms. + - bugfix: Pulling objects diagonally no longer causes them to flail about when changing + directions. + - bugfix: Riders are no longer left behind if you move while pulling something that + has since been anchored. + - bugfix: Lockboxes are now actually locked again. + - bugfix: Deaf people can no longer hear cyborg system error alarms. + - bugfix: Plasmamen now receive their suit and internals when entering VR. + - bugfix: Legion cores and admin revives now heal confusion. + XDTM: + - bugfix: Diseases now properly lose scan invisibility if their stealth drops below + the required threshold. +2018-06-13: + 'Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes:': + - rscadd: 'New drinks: Peppermint Patty and the Candyland Extract!!' + CitrusGender: + - bugfix: checks to see if bullets are deleted if they are the ammo type and the + bullet chambered. + Dax Dupont: + - balance: It's now easier to become fat. Don't eat so much. + Mickyan: + - bugfix: Fixed pacifists being able to harm using bottles/screwdrivers + SpaceManiac: + - spellcheck: Capitalization, propriety, and plurality on turfs have been improved. + XDTM: + - tweak: Coldproof mobs can now be cooled down, but are still immune to the negative + effects of cold. + - bugfix: This also fixes some edge cases (freezing beams) where mobs could be cooled + down and damaged despite cold resistance. + - balance: Virus crates now contain several bottles of randomly generated diseases + with symptom levels up to 8. + - rscdel: Removed the single-symptom bottles that were included in the virus crate. + - balance: Androids are now immune to radiation. + cacogen: + - rscadd: You can now see what other people are eating or drinking. + - rscadd: Borg shaker can now synthesise milk, lemon juice, banana juice and coffee + - bugfix: Renamed drinks no longer revert to their original name when their reagents + change + chesse20: + - rscadd: Adds Exotic Corgi Crate to Cargo + - rscadd: Adds Exotic Corgi, a Corgi with a random hue applied to it + - rscadd: Adds Talking Corgi Crate, and talking Corgi +2018-06-15: + CitrusGender: + - bugfix: logs will now show ckeys when admin transformations are done + Cruix: + - bugfix: Item attack animations can no longer be seen over darkness or camera static. + Dax Dupont: + - admin: You can now send messages as CentCom through people's headsets. + - bugfix: Fixes missing cream pies in the cream pie fridge. + Denton: + - bugfix: 'Omegastation: Connected the Engineering Foyer APC to the powernet.' + - bugfix: 'Pubbystation: Connected Chemistry disposals to the pipenet and fixed + Booze-O-Mat related display/access issues.' + - tweak: Syndicate stormtroopers now fire buckshot again. + Naksu: + - bugfix: Pipe dispensers can no longer create pipes containing literally anything + Nichlas0010: + - tweak: The TEG and its circulator can now be deconstructed and rotated! + - tweak: The TEG and its circulator now supports circulators in all directions, + rather than just west/east! + SpaceManiac: + - rscadd: A new OOC verb "Fit Viewport" can be used to adjust the window splitter + to eliminate letterboxing around the map. It can also be set to run automatically + in Preferences. + - bugfix: Refunding nuclear reinforcements while polling ghosts no longer summons + the reinforcements into the error room anyways. + - bugfix: Shift-clicking turfs obscured by fog of war no longer lets you examine + them. + - admin: It is now possible to cancel "Manipulate Organs" midway through. + Tlaltecuhtli: + - rscadd: Added shoes to leather recipes + ninjanomnom: + - bugfix: Gas overlays left over in some turf changes should no longer stick around + where they shouldn't. +2018-06-17: + Dax Dupont: + - refactor: Syndicate and Centcom messages have been squashed together. + - admin: You can now send both Syndicate and Centcom headset messages. Be mindful + that the button was changed to HM in the playerpanel + - bugfix: Fixed missing grilles under brig windows of the pubby shuttle. + - rscadd: For the pubby shuttle, added some food in the fridge, mostly pie slices. + Also added a sleeper to the minimedbay. + - tweak: Reworded pubby shuttle description to be more inline with the new train + shuttle. + - bugfix: Chem synths overlays aren't all kinds of fucked anymore. + - refactor: Unfucked all of the remaining chem synth code. + - refactor: Reagents no longer have an unused var that's always set to true. Who + did this? + - bugfix: You can no longer remove circuits with your mind. + - balance: Makes the xeno nest ruin harder to cheese. + - bugfix: Fixes the bathroom being airless in the Space Ninja anime jail. + Denton: + - tweak: 'Runtimestation: Added shuttle docking ports, a comms console, cargo bay + and syndicate/centcom IDs.' + - balance: Pirates and Syndicate salvage workers have been beefed up around the + caravan ambush ruin. + Pubby: + - bugfix: 'PubbyStation: Fixed disposals issue in security hallway' + SpaceManiac: + - bugfix: Moving large amounts of items with bluespace launchpads no longer creates + a laggy amount of sparks. + - bugfix: Unbreakable ladders are now left behind when shuttles move. + - bugfix: It is no longer possible to pull the mirages images at space transitions, + and some other abstract effects. + - tweak: PDAs and radios with unlocked uplinks no longer open their normal interface + in addition to the uplink when activated. + - tweak: Nuclear operative uplinks are no longer also radios. + - bugfix: The mining shuttle can once again fly to the aux base construction room + after the base has dropped. + - bugfix: The escape pod hallways on MetaStation and DeltaStation now have air again. + - bugfix: Hyperspace ripples now remain visible until the shuttle arrives, even + during extreme lag. + - bugfix: Ripples now correctly take the shape of the shuttle, rather than always + being a rectangle. + - bugfix: Non-secure windoors now properly support the "One Required" access mode + of airlock electronics. + Tlaltecuhtli: + - rscadd: After years of protests NT decided to update the fire security standards + by adding 3 (three) advanced fire extinguishers to all the new stations. + and Fel: + - imageadd: New chairs are on most shuttles! Finally, you can relax in style while + escaping a metal death trap. + cyclowns: + - rscadd: Fusion has been re-enabled! It works similarly to before, but with some + slight modification. + - tweak: Fusion now requires huge amounts of plasma and tritium, as well as a very + high thermal energy and temperature to start. There are several tiers of fusion + that cause different benefits and effects. + - tweak: The fusion power of most gases has been tweaked to allow for more interesting + interactions. + - tweak: BZ now takes N2O and plasma to create, rather than tritium and plasma. + - bugfix: Fusion no longer delivers server-crashingly large amounts of radiation + and stationwide EMPs. + theo2003: + - rscadd: Players who edited a circuit assembly can scan it as a ghost. +2018-06-18: + CitrusGender: + - tweak: The blob core (and only the blob core) now respawns randomly on the station + when the core is taken off z-level + - bugfix: Prevents the round from going into an unending state + - code_imp: Added a variable to the stationloving component for objects that can + be destroyed but not moved off z-level + Denton: + - tweak: NanoTours is proud to announce that the Lavaland beach club has been outfitted + with a dance machine, state of the art bar equipment and more. + SpaceManiac: + - bugfix: It is no longer possible to repair cyborg headlamps even when their panel + is closed. + - bugfix: Item fortification scrolls no longer add multiple prefixes when applied + to the same item. + - bugfix: The gulag shuttle no longer moves instantly when returned via the claim + console. + - admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while + an admin ghost. +2018-06-19: + Cyberboss: + - admin: Speaking in deadchat now shows your rank instead of ADMIN + Dax Dupont: + - balance: Circuit lab no longer starts with super batteries, they have been replaced + with high batteries. + - balance: Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty + of materials on the station you can gather. + - balance: Circuit labs no longer have their own protolathe and autolathe. Science + has their own lathes already. + - tweak: There's no more entire library worth of equipment, they can go publish + the books like the rest of the station, in the library. At least give the librarians + something other to do than screaming about lizard porn on the radio. + Hyacinth-OR: + - rscadd: Added a pink scarf to vendomats + Irafas: + - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot + JStheguy: + - rscadd: Added the data card reader circuit, a circuit that is able to read data + cards, as well as write to them. + - tweak: Data cards are now longer inexplicably called data disks despite clearly + being cards, and can be printed from the "tools" section of the integrated circuit + printer. + - tweak: Data cards no longer have a special "label card" verb and instead can have + their names and descriptions changed with a pen. + - rscadd: Also, some aesthetically different variants of the data cards, because + why not. + - imageadd: Data cards have new sprites, with support for coloring them via the + assembly detailer. + Naksu: + - code_imp: Sped up atmos very slightly + ninjanomnom: + - rscadd: A plush that knows too much has found its way to the bus ruin. +2018-06-21: + BlueNothing: + - tweak: Grabbers can no longer hold circuit assemblies + CitrusGender: + - bugfix: Ruins air alarms will no longer be reported in the station tablets + - bugfix: added a clamp so you can't set a negative multiplier to create materials + and create more than 50 items. + Cobby: + - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits. + - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule + pack. + Denton: + - bugfix: The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access + requirements, as previously intended. + - rscadd: Regular and advanced health analyzers can now be researched and printed. + McDonald072: + - rscadd: A few new circuits for dealing with atmospherics have been uploaded to + your local printers. + NewSta: + - tweak: made it easier to see from the back whether someone is occupying the shuttle + chair or not. + SpaceManiac: + - tweak: One canister is now suitable to fully stock a vending machine. Relevant + cargo packs have been updated. + - bugfix: Deconstructing and reconstructing a vending machine no longer creates + items from thin air. + - bugfix: Using a part replacer on a vending machine no longer empties its inventory. + - rscadd: Bluespace RPEDs can now be used to refill vending machines. + Tlaltecuhtli: + - bugfix: anomaly cores no longer tend to dust + YPOQ: + - bugfix: Watcher beams will freeze you again +2018-06-23: + Dax Dupont: + - imageadd: CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN. + - admin: Create antags now checks for people being on station before applying. + ExcessiveUseOfCobblestone: + - spellcheck: Plant disks with potency genes clarify the percent is for potency + scaling and not relative to max volume on examine. + Kor: + - rscadd: Bubblegum has regained his original (deadlier) move set. + SpaceManiac: + - bugfix: Fire extinguishers on the emergency shuttle are no longer unclickable + once removed from their cabinets. + kevinz000: + - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous + scientists for a low low price of 14TC. + - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear + projectile that will apply what the bomb would do to a certain tile at that + distance to that tile. However, this will not cause breaches, or gib mobs, unless + the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. + (Unless the admins so will it.)' +2018-06-24: + CitrusGender: + - bugfix: Fixed cyborgs not getting their names at round start + - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans + SpaceManiac: + - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only). + Time-Green: + - bugfix: Soda is no longer intangible to the laws of physics + cinder1992: + - rscadd: The Captain can now go down with their station in style! Suicide animation + added to the Officer's Sabre. + kevinz000: + - rscadd: Cyborgs now drop keys on deconstruction/detonation +2018-06-27: + Cyberboss: + - server: Logs and admin messages will now appear when you are using deprecated + config settings and advise on upgrades + Dax Dupont: + - admin: Malf AI machine overloads now are logged/admin messaged. + - tweak: The tree of liberty must be refreshed from time to time with the blood + of patriots and tyrants. We've removed access requirements from liberation station + vendors. + - bugfix: Fixes more href exploits in circuits + - refactor: Printing premade assemblies is no longer shitcode, time remaining had + to go for this. + - admin: Filled holes in the logging of circuits + Denton: + - tweak: Camera networks, monitor screens and telescreens have been standardized. + - tweak: Motion-sensitive cameras now show a message when they trigger the alarm. + - bugfix: The Box/Meta auxillary base camera now works. + - bugfix: Bomb test site cameras now emit light, as intended. + - bugfix: 'Meta: Replaced the RD telescreen in the CE office with the correct one.' + - tweak: Did you know that honey has antibiotic properties? + Irafas: + - bugfix: Hardsuit helmets now protect the wearer from pepperspray + - bugfix: Bucket helmets cannot have reagents transferred into them until after + they are removed + MadmanMartian: + - bugfix: Cameras that are EMPed no longer sound an alarm + Mickyan: + - bugfix: Branca Menta won't make you starve and then kill you + - tweak: Fernet has been moved to contraband + Naksu: + - code_imp: Removed unused effect object that could be used to spawn a list of humans + Nichlas0010: + - bugfix: Mothpeople no longer push objects to move in 0-grav, if they can fly + SpaceManiac: + - refactor: AI static now uses visual contents and should perform better in theory. + - bugfix: Pocket protectors now work again. + - bugfix: URLs are no longer auto-linkified in character names and IC messages. + - bugfix: It is once again possible for Cargo to export mechs. + - bugfix: Deaths in the CTF arena are no longer announced to deadchat. + Tlaltecuhtli: + - tweak: tourettes doesnt stack on itself anymore + - bugfix: fixes cult shuttle message repeating + Zxaber: + - rscadd: Cyborgs can wear more hats now. + kevinz000: + - rscadd: R&D deconstructors can now destroy things regardless of if there's a point + value or material + nichlas0010: + - bugfix: You should now receive your destroy AI objectives properly during IAA +2018-06-28: + Anonmare: + - balance: The possessed chainsword no longer makes e-swords look pathetic + Dax Dupont: + - admin: Admins can now scan circuits if they have admin AI interaction enabled. + - admin: some more circuit logging + - rscadd: You can now build clown borgs with a little bit of bananium and research. + Praise be the honkmother. + - rscadd: New upgrade module has been added so making loot/tech web borg modules + has become easier for admins/mappers/coders. + - refactor: Unused and broken OOC metadata code has been killed. + Denton: + - tweak: Added a disk compartmentalizer to Omegastation's hydroponics. + Kraso: + - bugfix: You can no longer use a soulstone shard to tell who's a cultist. + ShizCalev: + - bugfix: The blob will no longer take over space/mining/ect upon victory. +2018-06-29: + BlueNothing: + - balance: Cavity implants can no longer hold normal-sized combat circuits. Grabbers + can now hold up to assembly size. + - bugfix: Grabbers and throwers no longer function inside of storage implants. + Denton: + - tweak: Added all-in-one tcomms machinery and an automated announcement system. + Mickyan: + - imageadd: graffiti letters and numbers have received a makeover + MrDoomBringer: + - imageadd: Disk Fridges now have sprites! Ask cobby if you're wondering why they + look like toasters. +2018-06-30: + Dennok: + - bugfix: Deconstructable TEG now propertly connects to pipes. + - bugfix: Fix of inverted TEG sprite of slow turbine turning. add:Now you can flip + circulator and make TEG of your dream. add:Add TEG and circulator to "Advanced + Power Manipulation" techweb node. + MacHac: + - rscadd: Changelings can now take the Pheromone Receptors ability to hunt down + other changelings. + TerraGS: + - imageadd: New icon for plastic flaps that actually looks airtight. + - code_imp: Update to plastic flaps code to use tool procs rather than attackby + and removed two pointless states. +2018-07-01: + Denton: + - tweak: To comply with space OSHA regulations, all toasters (disk compartmentalizers) + have been put on tables. + - rscadd: Added a disk compartmentalizer to the seed vault Lavaland ruin. + Nichlas0010: + - bugfix: Changelings can now greentext the extract more genomes objective. + Thunder12345: + - rscadd: Added a colour picker component for use with circuits. +2018-07-02: + AnturK: + - bugfix: non-player monkeys won't fight when stunned. + Denton: + - bugfix: 'Pubbystation: Fixed the QM camera console''s direction.' + - code_imp: 'Pubbystation: Used the correct aux bomb camera subtype and replaced + loose tech storage boards with spawners, as is done in the rest of the map.' + - tweak: Tesla balls no longer blow up disposal outlets/delivery chutes and cameras. + Irafas: + - rscadd: Admin spawnable Death Ripley that comes with a version of the Death Clamp + that actually inflicts damage and rips arms off. + Naksu: + - admin: maxHealth is now guarded against invalid values when varediting + SpaceManiac: + - bugfix: A single wired glass tile no longer creates unlimited light floor tiles. + - bugfix: Printing the TEG and circulator boards no longer prints the completed + machinery instead. + XDTM: + - tweak: Nutriment Pump implants no longer require replacing the stomach. +2018-07-03: + Dax Dupont: + - balance: BoH detonations now gib the user. + Denton: + - tweak: Engine heaters no longer let gases pass through them. + - tweak: The Cerestation escape shuttle is now available for purchase! + Frozenguy5: + - bugfix: Fixes nitryl gas not applying its effects. + MrDoomBringer: + - bugfix: SupplyPod smites work properly once again. + Naksu: + - code_imp: Fixed the signatures of several reagent procs, removing useless checks + - tweak: drunkenness is now handled at the carbon level, allowing monkeys to experience + ethanol + - balance: initropidil also works on carbon level, allowing syndicate operatives + using the poison kit to achieve the silent assassin rating against monkeys + - tweak: The ladders in the tear in the fabric of reality no longer spawn their + endpoints when the area is loaded, but only when the tear is made accessible + via a BoH bomb. + - tweak: CentCom is no longer accessible via the space ladder in the tear. + - tweak: The lavaland endpoint can no longer spawn completely surrounded by lava, + unless it spawns on an island + - code_imp: ChangeTurf can now conditionally inherit the air of the turf it is replacing, + via the CHANGETURF_INHERIT_AIR flag. + - bugfix: when ladder endpoints are created, the binary turfs that are created inherit + the air of the turfs they are replacing. This means the lavaland ladder endpoint + will have the lavaland airmix, instead of a vacuum. + - code_imp: navigation beacons are now properly deregistered from their Z-level + list and re-registered on the correct one if moved across Z-levels by an effect + such as teleportation or a BoH-induced chasm. + Nirnael: + - refactor: Removed an unnecessary volume_pump check + SpaceManiac: + - bugfix: Backpack water tanks now work properly when wielded by drones. + - bugfix: Backpack water tank nozzles can no longer be placed inside bags of holding + and chem dispensers. + - bugfix: Moving items between your hands no longer causes them to cross the floor + (squeaking, lava burning). + - bugfix: Scrambled research console icons have been fixed, and will be prevented + in the future. + Zxaber: + - tweak: Empty cyborg shells can now be disassembled with a wrench. + - tweak: Using a screwdriver on an empty shell will now remove the cell, or swap + it if you're holding a cell in your other hand. + ninjanomnom: + - tweak: Shuttle throwing also applies to loose objects on shuttles now. + - tweak: Closets on shuttles start anchored. + - tweak: The throw distance of shuttle throws is marginally random, potentialy 10% + further or shorter + - rscadd: Tables and racks on shuttles have been installed with inertia dampeners. + - bugfix: Some very thin barriers didn't stop mobs from being thrown by the shuttle + under certain circumstances, this has been fixed. +2018-07-05: + Cyberboss: + - bugfix: Setting "default" in maps.txt now will load that map as the first fallback + when a next_map.json is missing + Jared-Fogle: + - bugfix: Fixed the "Remove IV Container" verb on IV drips from showing every nearby + mob + Naksu: + - tweak: shuttles now move the air along with their occupants, instead of magicking + up new air. + deathride58: + - tweak: Lone nuclear operatives now spawn as often as originally intended when + the disk is immobile. Secure that fuckin' disk. +2018-07-06: + Denton: + - spellcheck: Improved supply shuttle messages and firefighting foam descs. + - bugfix: Supply shuttles will no longer spill containers on docking. + Jared-Fogle: + - imageadd: Medical HUDs will now show an icon if the body has died recently enough + to be defibbed + Jegub: + - imageadd: Glowcaps now have their own sprite. + MacHac: + - bugfix: Bedsheets once again properly influence the dreams of those who sleep + under them. +2018-07-07: + Cruix: + - bugfix: Advaced camera consoles now properly show camera static in the area that + the eye starts + Denton: + - bugfix: Cere Station's escape shuttle has had its turbo encabulator replaced and + should no longer fly through hyperspace backwards. + Garen: + - rscadd: sends a signal for afterattack() + - code_imp: modified all calls of afterattack() to call the parent proc + Naksu: + - bugfix: constructed directional windows no longer leak atmos across them + - code_imp: setting the value of anchored for objects should be done via the setAnchored + proc to properly handle things like atmos updates in one place + Spaceinaba: + - tweak: Digitigrade legs no longer revert to normal on compatible outfits. +2018-07-08: + Affurit: + - imageadd: Back Sprites for the Godstaffs and Scythe now exist. + Cruix: + - rscadd: AI detection multitools can now be toggled to provide a HUD that shows + the exact viewports of AI eyes, and the location of nearby camera blind spots. + Floyd: + - rscdel: removed beauty / dirtyness + - balance: Mood no longer gives you hallucinations, instead makes you go into crit + sooner + Gwolfski: + - rscadd: autoname APC + - rscadd: directional autoname APC's + Naksu: + - code_imp: fixed mood component + XDTM: + - bugfix: Corazone now actually stops heart attacks. + cacogen: + - rscadd: Gibs squelch when walked over + subject217: + - bugfix: Five months later, wires will again make noise when pulsed or cut while + hacking. +2018-07-09: + Ausops: + - imageadd: New shuttle chair sprites. + Jared-Fogle: + - bugfix: Fixed russian revolvers acting like normal revolvers. + Nabski: + - imageadd: Crabs have a movement state sprite + TerraGS: + - tweak: Removed tap.ogg from multitool so getting hit by one sounds as painful + as it really is. + ninjanomnom: + - code_imp: The very back-end of movement got some significant reshuffling in preparation + for some future refactors. Bugs are expected. + subject217: + - spellcheck: The Nuke Op uplink no longer lies about how much ammo a C-20r holds. + - tweak: The L6 SAW now has a small amount of spread. It is still accurate within + visual range, but it's not as effective at longer ranges. +2018-07-10: + Astatineguy12: + - bugfix: You can now buy energy shields as a nuke op again + Denton: + - rscadd: 'Box/Delta/Pubbystation: Nuclear explosive-shaped beerkegs have been added + to maintenance areas.' + Naksu: + - rscadd: Added a new ghost verb that lets you change your ignore settings, allowing + previously ignored popups to be un-ignored and notifications without an ignore + button to be ignored + - bugfix: Chaplains are once again unable to acquire the inquisition ERT commander's + sword, as intended. The sword has been restored to its former glory + Supermichael777: + - bugfix: Changelings are no longer prevented from entering stasis by another form + of fake death. + Wjohnston & ninjanomnom: + - imageadd: Engine heaters and engines have had a minor touch up so they don't meld + with the floor quite so much. + - tweak: Engine heaters don't block air anymore. + XDTM: + - bugfix: Romerol tumors no longer zombify you if you're alive when the revive timer + counts down. +2018-07-11: + Denton: + - bugfix: Fixed a bug where golem shells couldn't be completed by certain brass/sandstone/titanium + stacks. + - tweak: The Spider Clan holding facility has completed minor renovations. The dojo + now includes medical and surgical equipment, while the lobby has a fire extinguisher + and plasmaman equipment. + - bugfix: Plasma and wooden golems no longer need to breathe, same as all other + golems. + - spellcheck: Fixed wrong or incomplete golem spawn info texts. + - tweak: Added more random golem names. + Irafas: + - bugfix: non-silicons can no longer use machines without standing next to them. + XDTM: + - bugfix: Automatic emotes no longer spam you saying that you can't perform them + while unconscious. + - rscadd: Added a Rest button to the HUD. It allows the user to lie down or get + back on their feet. + - balance: Getting back up now takes a second, to avoid people matrix-ing bullets. + fludd12: + - rscadd: You can now craft wooden barrels with 30 pieces of wood! They can hold + up to 300u of reagents. + - rscadd: Putting hydroponics-grown plants into the barrel lets you ferment them + for alcohol! Some give bar drinks, while others simply give plain fruit wine. + ninjanomnom: + - bugfix: Porta turret rotation on shuttles visually would not turn, this has been + dealt with. + - bugfix: Decals weren't rotating properly after the recent signal refactor, a couple + new procs for dealing with the signals on the parent object have been added + to deal with this. + subject217: + - balance: L6 SAW AP ammo now costs 9 TC per magazine, up from 6. + - balance: L6 SAW incendiary ammo now deals 20 damage per shot, up from 15. +2018-07-12: + AnturK: + - bugfix: Nuclear rounds will now end properly on nukeop deaths if there are no + other antags present. + Denton: + - rscadd: A new shuttle loan event has been added. Hope you like bees! + - tweak: The pizza delivery shuttle loan event now has some of each flavor and no + longer pays the station for accepting it. + - balance: Syndicate shuttle infiltrators now carry suppressed pistols. + - spellcheck: Added a missing period to spent bullet casing and pizza shutte loan + text. + - bugfix: Zealot's blindfolds now properly prevent non-cultists from using them. + - bugfix: Cultist legion corpses now wear the correct type of zealot's blindfold. + Time-Green: + - rscadd: An overdosing chemist filled the maintenance shafts with unorthodox pills, + be wary + ninjanomnom: + - rscadd: Certain objects which make noise which are thrown in disposals will squeak + when they hit bends in the piping. This includes clowns. + tralezab: + - admin: admins, you can now find martial art granting buttons in your VV dropdown. +2018-07-13: + Arithmetics plus: + - rscadd: Min circuit + - rscadd: Max circuit + Cyberboss: + - rscadd: More interesting recipes to the pizza delivery event + Deepfreeze2k: + - balance: Adds 2 carbon dioxide jetpacks to the pirate ship. Also gives the captain + a renamed bottle of rum in his room. + Denton: + - tweak: 'Most static ingame manuals have been replaced with ones that open relevant + wiki articles. remove: Deleted the "Particle Accelerator User''s Guide" manual, + since it''s included in the Singulo/Tesla one.' + - tweak: Machine frames no longer explode when struck by tesla arcs. + - rscadd: Locators can now be researched and printed at the security protolathe. + Jared-Fogle: + - soundadd: Removed delay from rustle1.ogg + LetterN: + - rscadd: Adds ratvar plushie and narsie plushie on chaplain vendors + Naksu: + - bugfix: deep-frying no longer turns certain objects like limbs invisible + Time-Green: + - bugfix: "Fixes an href exploit that lets you grab ID\u2019s out of PDA right from\ + \ another person" + XDTM: + - balance: (Real) Zombies no longer die from normal means. They will instead go + into crit indefinitely and regenerate until they get back up again. To kill + a zombie permanently you either need to remove the tumor, cut off their head, + gib them, or use more elaborate methods like a wand of death or driving them + to suicide. + - balance: Slowed down zombie regeneration overall, since putting them in crit now + no longer disables them for a full minute in average. + Zxaber: + - bugfix: MMI units inside cyborgs are no longer affected by ash storms. + ninjanomnom: + - bugfix: Objects on tables that are thrown by shuttle movement should no longer + do a silly spin + - balance: The alien pistol and the xray gun have both received a much belated buff + to their radiation damage to be on par with other sources of radiation. +2018-07-14: + Naksu: + - balance: stamina damage is no longer softcapped by the unconsciousness trigger + lowering stamina damage a little bit + ShizCalev: + - tweak: "The SM is now even more deadly to \"certain mobs\"\u2122" +2018-07-15: + AnturK: + - tweak: You can now use numbers in religion and deity names + Denton: + - bugfix: Bounty console circuit boards no longer construct into supply request + terminals. + Naksu: + - bugfix: fixed some missing args in emote procs called with named args, leading + to runtimes + - code_imp: removed unnecessary processing from a few machine types + SpaceManiac: + - bugfix: The Shuttle Manipulator admin verb works once more. +2018-07-16: + kevinz000: + - rscadd: 'Integrated circuit clocks now come in 3 flavors: Nanotrasen time (round + time), Station time (station time), and Bluespace time (server time, therefore + not affected by lag/time dilation)' + - rscadd: Integrated circuit clocks now also output a raw value for deciseconds, + allowing for interesting timer constructions. +2018-07-17: + Cyberboss: + - server: Added BSQL.dll and updated libmariadb.dll for non-blocking SQL support. + See https://github.com/tgstation/BSQL for instructions on building for non-windows + systems + Denton: + - tweak: Sparks now emit less heat. + - tweak: Added a storage room to Metastation engineering that both engineers and + atmos techs can access. + Naksu: + - admin: Plasma decontamination can now be triggered via events + - bugfix: Reebe is no longer airless and completely broken + Shdorsh: + - tweak: added UI to the circuit printer. That's all + XDTM: + - balance: Limbs no longer need to have full damage to be dismemberable, although + more damage means higher dismemberment chance. + - balance: Damaging limbs now only counts as 75% for the mob's total health. Bleeding + still applies normally. + - rscadd: Limbs that reach max damage will now be disabled until they are healed + to half health. + - rscadd: Disabled limbs work similarly to missing limbs, but they can still be + used to wear items or handcuffs. + kevinz000: + - rscadd: Crew pinpointers added to advanced biotechnology, printable from medical + lathes. + - rscadd: AIs can now interact with smartfridges by default, but by default they + will not be able to retrieve items. + ninjanomnom: + - bugfix: Mech equipment can be detached again. This probably also fixes any other + uncaught bugs relating to objects moving out of other objects. +2018-07-18: + Cyberboss: + - bugfix: Deaths now lag the server less + - bugfix: Ban checks cause less lag + Denton: + - tweak: RCDs can now also be loaded with reinforced glass and reinforced plasma + glass sheets. + Irafas: + - bugfix: players can construct while standing on top of a directional window. (machine + frames, computer frames, etc) + MrStonedOne: + - bugfix: synchronizing admin ranks with the database now lags the server less + - bugfix: saving stats now lags the server less + - bugfix: jobexp updating now lags the server less + - bugfix: poll creation now lags the server less. + Tlaltecuhtli: + - tweak: putting a cell and other not intended actions dont open the circuit window + WJohnston: + - tweak: Abandoned box ship space ruin consoles have been turned into something + more obviously broken so people stop complaining the ship doesn't work when + it's not meant to anyway. + - rscdel: Removed the extra syndie headset from the syndicate listening post space + ruin so people stumbling on the ruin won't be able to ruin your channel's security + as often. + XDTM: + - bugfix: Fixed a few bugs with imaginary friends, including them not being able + to hear anyone or surviving past the owner's death. + - rscadd: Imaginary friends can now move into the owner's head. + - rscadd: Imaginary friends can now choose to become invisible to the owner at will. +2018-07-20: + Cobby: + - bugfix: having higher sanity is no longer punished by making you enter crit faster + - balance: you can have 100 mood instead of 99 before it starts slowly decreasing + - bugfix: Paper doesn't give illegal tech anymore + CthulhuOnIce: + - spellcheck: Fixed 'Cybogs' in research nodes. + Denton: + - admin: Added hardsuit outfits for the Captain, HoS, and CMO. Removed old Shaft + Miner (Asteroid) outfits. Gave Chief Engineer (Hardsuit) engineering scanner + goggles. Added debug outfit for testing. + - tweak: Most wardrobe vendor contents have been tweaked. CargoDrobe now has the + vintage shaft miner jumpsuit available as a premium item. + WJohn: + - balance: Caravan ruin overall contains much less firepower, and should be harder + to cheese due to placement changes and less ammunition to work with. + - rscadd: The white ship is no longer stuck to flying around the station z level. + It can now fly around its own spawn's level and the derelict's level too (these + sometimes will be the same level). + kevinz000: + - rscdel: Removed flightsuits + zaracka: + - balance: Visible indications of cultist status during deconversion using holy + water happen more often. +2018-07-21: + Jared-Fogle: + - bugfix: Fixes destroyed non-human bodies cloning as humans. + WJohnston: + - balance: Reduced the 180 rounds (6 boxes) of 9mm ammo in the deep storage bunker + to 45 (3 mags). Removed one of the wt-550s but put a compatible magazine in + its place for the other to use. Turned the syndicate hardsuit into a regular + grey space suit. +2018-07-23: + BeeSting12: + - bugfix: Robotics' circuit printers have been changed to science departmental circuit + printers to allow science to do their job more efficiently. + Cruix: + - bugfix: AI eyes will now see static immediately after jumping between cameras. + Denton: + - rscadd: Shared engineering storage rooms have been added to Deltastation. + - bugfix: Fixed access requirements of lockdown buttons in the CE office. On some + maps, these were set to the wrong department. + - bugfix: Fixed Box and Metastation's CE locker having no access requirements. + - bugfix: 'Deltastation: Fixed engineers having access to atmospheric technicians'' + storage room. Fixed engineers having no access to port bow solars (the ones + at the incinerator by Atmospherics). Also fixed Minisat airlock access requirements.' + - bugfix: 'Pubbystation: Medbay and Cargo now have a techfab instead of protolathe.' + - tweak: Charlie/Delta Station (the "old cryogenics pod" ghost role) has been improved. + Survivors can now finish the singularity engine and will have more minerals + available inside the Hivebot mothership. The local atmos network is connected + to an air tank; fire alarms and a bathroom have been added. Keep an eye out + for a defibrillator too. + - rscadd: Nuclear Operatives can now purchase Buzzkill grenades for 5TC per box + of three. Those release a swarm of angry bees with random toxins. + - spellcheck: Chemical grenades, empty casings and smart metal foam nades now have + more detailed descriptions. + - spellcheck: Added examine descriptions to the organ harvester. + Epoc: + - rscadd: Adds "Toggle Flashlight" to PDA context menu. + Hathkar: + - tweak: Captain's Door Remote now has vault access again. + Mickyan: + - bugfix: 'Deltastation: replaced blood decals in maintenance with their dried counterparts' + SpaceManiac: + - tweak: RCDs can now be loaded partially by compressed matter cartridges rather + than always consuming the entire cartridge. + - bugfix: Fernet Cola's effect has been restored. + - bugfix: Krokodil's addition stage two warning message has been restored. + - admin: The party button is back. + WJohnston: + - bugfix: Fixed corner decals rotating incorrectly in the small caravan freighter. + XDTM: + - bugfix: Limbs disabled by stamina damage no longer appear as broken and mangled. + obscolene: + - soundadd: Curator's whip actually makes a whip sound now +2018-07-25: + Denton: + - tweak: H.O.N.K mechs can now play more sounds from the "Sounds of HONK" panel. + JJRcop: + - tweak: The item pick up animation tweens to the correct spot if you move + MrDoomBringer: + - spellcheck: Changed "cyro" to "cryo" in a few item descriptions and flavortexts. + SpaceManiac: + - rscadd: The vault now contains an ore silo where the station's minerals are stored. + - rscadd: The station's ORM, recycling, and the labor camp send materials to the + silo via bluespace. + - rscadd: Protolathes, techfabs, and circuit imprinters all pull materials from + the silo via bluespace. + - rscadd: Those with vault access can view mineral logs and pause or remove any + machine's access, or add machines with a multitool. + - tweak: The ORM's alloy recipes are now available in engineering and science protolathes. + Telecomms chat logging: + - code_imp: Added logging of telecomms chat + - config: Added LOG_TELECOMMS config flag (enabled by default) + WJohnston: + - rscadd: Redesigned deltastation's abandoned white ship into a luxury NT frigate. + Oh, and there are giant spiders too. + - bugfix: Med and booze dispensers work again on lavaland's syndie base, and the + circuit lab there is slightly less tiny. + subject217: + - rscadd: The M-90gl is back in the Nuke Ops uplink with rebalanced pricing. + - bugfix: The revolver cargo bounty no longer accepts double barrel shotguns and + grenade launchers. +2018-07-26: + Iamgoofball: + - bugfix: The shake now occurs at the same time as the movement, and it now doesn't + trigger on containers or uplinks. + Mickyan: + - balance: Light Step quirk now stops you from leaving footprints + Naksu: + - code_imp: gas reactions no longer copy a list needlessly + SpaceManiac: + - rscadd: 'The following machines can now be tabled: all-in-one grinder, cell charger, + dish drive, disk compartmentalizer, microwave, recharger, soda/booze dispenser.' + - rscadd: Unanchored soda/booze dispensers can now be rotated with alt-click. + - bugfix: Machinery UIs no longer close immediately upon going out of interaction + range. + - rscadd: Washing machines now wiggle slightly while running. + - rscadd: Washing machines can be unanchored if their panel is open for even more + wiggle. + WJohnston: + - rscadd: Return of the boxstation white ship, with a complete makeover! Box and + meta no longer share the same ship. +2018-07-27: + ShizCalev: + - bugfix: Destroying a camera will now clear it's alarm. + ninjanomnom: + - bugfix: The cargo shuttle should move normally again +2018-07-28: + CitrusGender: + - rscdel: Removed slippery component from water turf + Denton: + - balance: The Odysseus mech's movespeed has been increased. + - tweak: 'Metastation: Spruced up the RnD circuitry lab; no gameplay changes.' + - tweak: Due to exemplary performance, NanoTrasen has awarded Shaft Miners with + their very own bathroom, constructed at the mining station dormitories. Construction + costs will be deducted from their salaries. + Mickyan: + - imageadd: insanity static is subtler + - imageadd: neutral mood icon is now light blue + SpaceManiac: + - bugfix: Cyborgs and AIs can now interact with items inside them again. + Tlaltecuhtli: + - rscadd: Mouse traps are craftable from cardboard and a metal rod. + WJohnston: + - balance: Syndicate and pirate simple animals should have stats that more closely + resemble fighting a human in those suits, with appropriate health, sounds, and + space movement limitations. + - imageadd: Pirates in space suits have more modern space suits. +2018-07-30: + Anonmare: + - balance: Upload boards and AI modules, in addition to Weapon Recharger boards, + are now more expensive to manufacture + Basilman: + - bugfix: fixed BM Speedwagon offsets + Cobby (based off Wesoda25's idea): + - rscadd: Adds the PENLITE holobarrier. A holographic barrier which halts individuals + with bad diseases! + Denton: + - tweak: Techweb nodes that are available to exofabs by roundstart have been moved + to basic research technology. + - balance: Ripley APLU circuit boards are now printable by roundstart. + - balance: Odysseus, Gygax, Durand, H.O.N.K. and Phazon mech parts have to be researched + before becoming printable (same as their circuit boards). + - tweak: Arrivals shuttles no longer throw objects/players when docking. + - bugfix: Regular fedoras no longer spawn containing flasks. + - tweak: Increased the range of handheld T-ray scanners. + - balance: Cargo bounties that request irreplaceable items have been removed. + Garen: + - balance: Throwers no longer deal damage + - balance: Flashlight circuits are now the same strength as a normal flashlight + - balance: Grabber circuits are now combat circuits + - rscdel: Removed smoke circuits + - rscdel: Removed all screens larger than small + - tweak: Ntnet circuits can no longer specify the passkey used, it instead always + uses the access + Hate9: + - rscadd: Added pulse multiplexer circuits, to complete the list of data transfers. + Jared-Fogle: + - rscadd: NanoTrasen now officially recognizes Moth Week as a holiday. + - rscdel: Temporarily removes canvases until someone figures out how to fix them. + Mickyan: + - balance: Social anxiety trigger range decreased. Stay out of my personal space! + - bugfix: Social anxiety no longer triggers while nobody is around but you + WJohnston: + - rscadd: Redesigned the metastation white ship as a salvage vessel. + YoYoBatty: + - bugfix: SMES power terminals not actually deleting the terminal reference when + by cutting the terminal itself rather than the SMES. + - bugfix: SMES now reconnect to the grid properly after construction. + - refactor: SMES now uses wirecutter act to handle terminal deconstruction. + ninjanomnom: + - bugfix: Objects picked up from tables blocking throws will no longer be forever + unthrowable +2018-08-01: + Basilman: + - rscadd: Added the stealth manual to the uplink, costs 8 TC. Find it under the + implant section + Cobby: + - spellcheck: Drone's Law 3 has been edited to explicitly state that it's for the + site of activation (aka people do not get banned for going to upgrade station + as derelict drones since it's explicitly clear now). See https://tgstation13.org/phpBB/viewtopic.php?f=33&t=18844&p=429944#p429944 + for why this was PR'd + - bugfix: PENLITEs are now actually spawnable in techwebs. Reminder to make sure + everything is committed before PRing haha! + Denton: + - tweak: New bounties have been added for the Firefighter APLU mech, cat tails and + the Cat/Liz o' Nine Tails weapons. + - bugfix: ExoNuclear mech reactors now noticably irradiate their environment. + - spellcheck: Adjusted suit storage unit descriptions to mention that they can decontaminate + irradiated equipment. + Hate9: + - rscadd: Added tiny-sized circuits (called Devices) + - imageadd: added new icons for the Devices + Iamgoofball: + - balance: 'Buzzkill Grenade Box Cost: 5 -> 15' + Shdorsh: + - rscadd: Text replacer circuit + SpaceManiac: + - bugfix: The bridge of the gulag shuttle now has a stacking machine console for + ejecting sheets. + Time-Green: + - rscadd: You can now mount energy guns into emitters + - bugfix: portal guns no longer runtime when fired by turrets + barbedwireqtip: + - tweak: Adds the security guard outfit from Half-Life to the secdrobe + granpawalton: + - tweak: Removed old piping sections and replaced with Canister storage area in + atmos incinerator + - tweak: scrubber and distro pipes moved in atmos incinerator to make room for added + piping + - balance: added filter at connector on scrubbing pipe in atmos incinerator + - balance: replaced vent in incinerator with scrubber in **Both** incinerators + - balance: mixer placed on pure loop at plasma + - bugfix: delta and pubby atmos incinerator air alarm is no longer locked at round + start + - bugfix: pubby atmos incinerator now starts without atmos in it + kevinz000: + - rscadd: 'Cameras now shoot from 1x1 to 7x7, fully customizable. Alt click on them + to change the size of your photos. experimental: All photos, assuming the server + host turns this feature on, will be logged to disk in round logs, with their + data and path stored in a json. This allows for things like Statbus, and persistence + features among other things to easily grab the data and load the photo.' + - rscadd: Mappers are now able to add in photo albums and wall frames with persistence! + This, obviously, requires photo logging to be turned on. If this is enabled + and used, these albums and frames will save the ID of the photo(s) inside them + and load it the next time they're loaded in! Like secret satchels, but for photos! +2018-08-03: + ArcaneMusic: + - soundadd: Added a new, shoutier RoundEnd Sound. + Basilman: + - bugfix: fixed agent box invisibility + Denton: + - tweak: 'Syndicate lavaland base: Added a grenade parts vendor and smoke machine + board. The testing chamber now has a heatproof door and vents/scrubbers to replace + air after testing gas grenades. Chemical/soda/beer vendors are emagged by default; + the vault contains a set of valuable Syndicate documents.' + - tweak: Added a scrubber pipenet to the Lavaland mining base. + Garen: + - bugfix: mobs now call COMSIG_PARENT_ATTACKBY + JJRcop: + - rscadd: Deadchat can use emoji now, be sure to freak out scrying orb users. + Kmc2000: + - rscadd: You can now attach 4 energy swords to a securiton assembly instead of + a baton to create a 4 esword wielding nightmare-bot + Mickyan: + - imageadd: added sprites for camera when equipped or in hand + - tweak: cameras are now equipped in the neck slot + SpaceManiac: + - bugfix: Traps now have their examine text back. + Supermichael777: + - bugfix: Cigarettes now always transfer a valid amount of reagents. + - bugfix: Reagent order of operations is no longer completely insane + WJohnston: + - tweak: Added a gun recharger to delta's white ship and toned it down from a "luxury" + frigate to just a NT frigate, it's just not made for luxury! + XDTM: + - bugfix: Beheading now works while in hard crit, so it can be used against zombies. + - tweak: You can now have fakedeath without also being unconscious. Existing sources + of fakedeath still cause unconsciousness. + - rscadd: Zombies and skeletons now appear as dead. Don't trust zombies on the ground! + - rscadd: You can now make Ghoul Powder with Zombie Powder and epinephrine, which + causes fakedeath without uncounsciousness. + granpawalton: + - bugfix: pubby round start atmos issues resolved + - bugfix: pubby departures lounge vent is no longer belonging to brig maint + - rscadd: pipe dispenser on pirate ship + ninjanomnom: + - bugfix: The first pod spawned had some issues with shuttle id and wouldn't move + properly. This has been fixed. +2018-08-06: + Basilman: + - balance: Increased agent box cooldown to 10 seconds + Denton: + - bugfix: Omegastation's Atmospherics lockdown button now has the proper access + reqs. + - bugfix: Pubbystation's disposals conveyor belts now face the correct direction. + - bugfix: Pubby's service techfab is no longer stuck inside a wall. + - bugfix: Pubby's disposal loop is no longer broken. + - tweak: The Lavaland seed vault chem dispenser now has upgraded stock parts. + - tweak: 'Metastation: Extended protective grilles to partially cover the Supermatter + cooling loop.' + Epoc: + - rscadd: You can now show off your Attorney's Badge + Garen: + - bugfix: Fixed AddComponent(target) not working when an instance is passed rather + than a path + JJRcop: + - bugfix: Fixed some strange string handling in SDQL + Jared-Fogle: + - rscadd: Moths can now eat clothes. + JohnGinnane: + - rscadd: Users can now see their prayers (similar to PDA sending messages) + Mickyan: + - tweak: Drinking alcohol now improves your mood + Shdorsh: + - bugfix: The previously-added find-replace circuit now actually exists. + Tlaltecuhtli (and then Cobby): + - bugfix: Science Bounties are now available! + WJohnston: + - balance: Rebalanced the simple animal syndies on the metastation ship to be a + bit less destructive of their surroundings, and downgraded the smg guy to a + pistol and upgraded the other guys to knives. + Y0SH1 M4S73R: + - rscadd: windoors now have NTNet support. The "open" command toggles the windoor + open and closed. The "touch" command, not usable by door remotes, functions + identically to walking into the windoor, opening it and then closing it after + some time. + cyclowns: + - tweak: Fusion has been reworked to be a whole lot deadlier! + - tweak: You can now use analyzers on gas mixtures holders (canisters, pipes, turfs, + etc) that have undergone fusion to see the power of the fusion reaction that + occurred. + - balance: Several gases' fusion power and fusion's gas creation has been reworked + to make its tier system more linear and less cheese-able. +2018-08-07: + WJohnston: + - rscadd: Redesigned the pirate event ship to be much prettier and better fitting + what it was meant to do. +2018-08-08: + Denton: + - rscadd: 'Added five new cargo packs: cargo supplies, circuitry starter pack, premium + carpet, surgical supplies and wrapping paper.' + - tweak: Added one bag of L type blood to the blood pack crate. Added a chance for + contraband crates to contain DonkSoft refill packs. + Iamgoofball: + - tweak: The Stealth Implant was mistakenly made nuclear operatives only due to + a misunderstanding of the code. This has been fixed. + Mark9013100: + - rscadd: Pocket fire extinguishers can now be made in the autolathe. + SpaceManiac: + - bugfix: The power flow control console once again allows actually modifying APCs. + - tweak: Gas meters will now prefer to target visible pipes if they share a turf + with hidden pipes. + daklaj: + - bugfix: fixed beepsky and ED-209 cuffing their target successfully even when getting + disabled (EMP'd) in the process + kevinz000: + - rscadd: Catpeople are now a subspecies of human. Switch your character's species + to "Felinid" to be one. + - rscadd: Oh yeah and they show up as felinids on health analyzers. +2018-08-10: + AnturK: + - balance: Portable flashers won't burnout from failed flashes. + Denton, Tlaltecuhtli: + - rscadd: Added cargo bounties that require cooperation with Atmospherics, Engineering + and Mining. + Naksu: + - bugfix: Transformation diseases now properly check for job bans where applicable + - code_imp: Fixed a bunch of runtimes that result from transforming into a nonhuman + from a human, or a noncarbon from a carbon. + SpaceManiac: + - refactor: The map loader has been cleaned up and made more flexible. + nicbn: + - tweak: 'BoxStation science changes: Circuitry lab is closer to RnD now; cannisters, + portable vents, portable scrubbers, filters and mixers have been moved to Toxin + Mixing Lab. There is now a firing range at the testing lab!' +2018-08-11: + Denton: + - tweak: Fixed the Beer Day date and added a few more holidays. + Jordie0608: + - admin: Asay history is once again logged under the admin log secret. + - admin: Notes, messages, memos and watchlists can now have an expiry time. Once + expired they are hidden like as if deleted. + SpaceManiac: + - tweak: Giant spiders can now freely pull their victims through webs. + Time-Green: + - rscadd: Circuit Boards now tell you the components required to build them on examine + WJohn: + - rscadd: Added zombies to boxstation's abandoned ship. + YPOQ: + - bugfix: AIs can take photos and print them at photocopiers again. + - bugfix: Cult floors will not deconstruct to space + - bugfix: Cult floors do not spawn rods when deconstructed + - bugfix: Footprints should no longer spread out of control + zaracka: + - bugfix: blunt trauma causes brain damage while unconscious too + - bugfix: sharp weapons no longer count as blunt trauma in all cases +2018-08-12: + Denton: + - rscadd: Killing gondolas now lets you harvest meat from them. Eating it raw might + be a bad idea. + Mickyan: + - rscadd: Mixed drinks now give mood boosts with varying strength depending on their + quality. + - rscadd: Although powerful, mood boosts from quality drinks are short lived. If + you want to make the most out of them, take a sip every few minutes like a normal + human being instead of downing the entire glass like the alcoholic you are. + Nichlas0010: + - bugfix: Admins with +admin and without +fun are no longer able to smite. + SpaceManiac: + - bugfix: Blood and oil footprints sharing a tile no longer causes footprint decals + to stack. + WJohnston: + - balance: Syndicate (melee) simple animals will now move less predictably and attack + twice as often, hopefully making them quite a bit more dangerous. + XDTM: + - tweak: Operating Computers can now sync to the research database to acquire researched + surgeries, instead of requiring installation by disk. + - rscadd: You can now review the full list of unlocked surgeries from the operating + computer. + actioninja: + - rscadd: Added (unobtainable) Felinid Mutation Toxin. + lyman: + - imageadd: Updated the Chronosuit Helmet sprite. +2018-08-13: + Basilman: + - rscadd: Adds Arnold pizza, dont try putting pineapple on it. + Denton: + - tweak: The briefcase launchpad can now hold items while in briefcase mode (just + like a regular briefcase). Its remote has been disguised as a folder and now + spawns pre-linked inside the briefcase. + - balance: Increased the briefcase launchpad's range from 3 to 8 tiles, which is + roughly half the screen. + - spellcheck: Added more ingame manuals that access wiki pages. + - rscadd: Added botanical and medical bounties as well as a static adamantine bar + bounty. + - tweak: Increased the syndicate document bounty's reward from 10.000 to 15.000 + credits. + - tweak: Removed the gondola hide bounty and in return, increased the export value + to the old level. + - tweak: The briefcase bounty now also accepts secure briefcases. + - bugfix: The action figure bounty now correctly spawns as an assistant type bounty. + Logging refactor and improvement: + - code_imp: All mob-related logs now include the area name and (x,y,z) position. + - code_imp: All logs that included an (x,y,z) position now also include the area + name. + - code_imp: Standardized logging format of mob/player keys. + - code_imp: Telecomms logs are now included in the individual logging panel. + - code_imp: Fixed many other cases of logs being sent to either the individual logging + panel or the saved log files, but not both. + - refactor: The logging system has been refactored to contain less redundant code + and to produce more consistent logs. + SpaceManiac: + - admin: The VV window loads and searches faster. + - admin: Fields in the VV window's header will immediately show your edits. + - admin: Selecting an action from the VV dropdown no longer leaves it selected after + the action is done. + YPOQ: + - bugfix: Uncalibrated teleporters can turn humans into flies again +2018-08-14: + Coolguy3289: + - config: Removed un-needed and un-used RENAME comment from game_options.txt + SpaceManiac: + - bugfix: Escape Pod 1 now reaches the CentCom recovery ship again. + WJohn: + - imageadd: Titanium walls and windows are a bit prettier looking now. + Zxaber: + - rscadd: Airlock electronics can have now have unrestricted access by direction + set. The resulting airlock will allow all traffic from the specified direction(s) + while still requiring normal access otherwise. A small floor light will indicate + this. + - tweak: Medbay Cloning and Main Access doors now have unrestricted access settings + set, and the buttons have been removed. All maps have been updated. + - bugfix: Airlocks now correctly update their overlays (bolts lights, emergency + lights) when their power state changes. +2018-08-15: + barbedwireqtip: + - tweak: added binoculars to the detective's locker +2018-08-17: + Anonmare: + - rscadd: Ore silos circuit boards are now constructable + SpaceManiac: + - admin: The "Map Template - Upload" verb now reports if a map uses nonexistent + paths. + Tlaltecuhtli: + - bugfix: fixes diamond drill bounty having the wrong object path + YPOQ: + - bugfix: Roundstart motion-detecting cameras work again + intrnlerr: + - bugfix: '"Allows image windows sent by PDA to be closed"' +2018-08-18: + Floyd / Qustinnus: + - code_imp: moves nutrition events to the mood component + Jared-Fogle: + - rscadd: Hovering over storage slots with an item in your hand will show you first + if you can put the item in. + XDTM: + - bugfix: Fixed augmentation not working and/or giving you extra limbs + nicbn: + - imageadd: New janitor cart sprites (by Quantum-M) + - imageadd: Dirt is smooth (by AndrewMontagne) + zaracka: + - bugfix: You can now use certain emotes and the suicide verb while buckled, but + not while stunned. +2018-08-20: + Basilman: + - rscadd: Added gondola fur products + Basilman, Sprites by WJohnston: + - rscadd: His Grace ascension is back, feed Him 25 people and you will unlock His + full potential. + Denton: + - tweak: Added new destinations for the parcel tagger! You can now send packages + to the Circuitry Lab, Toxins, Dormitories, Virology, Xenobiology, Law Office + and the Detective's office. Viro/Xeno can only receive parcels. + - bugfix: 'Deltastation: Tagged parcels no longer get routed straight into the crusher. + Untagged parcels also no longer get routed straight into the crusher!' + - tweak: 'Deltastation: Added disposals to Xenobiology that launch contents into + space.' + Epoc: + - tweak: Putting an extinguisher into a cabinet with the safety off will no longer + cause it to spray first + Floyd / Qustinnus: + - code_imp: removes useless mood events subtypes + - bugfix: 'fixes mood event timers not resetting when they get triggered again remove: + removes the depression overlay which makes our fruit happy' + Frosty Fridge: + - rscadd: Added the Surgical Processor upgrade for medical cyborgs. Scan surgery + disks or an operating computer to be able to initiate advanced procedures. + - tweak: Cyborgs can now perform surgery steps that do not require an instrument. + - bugfix: Plastic creation reaction now properly scales with the amount of reagents; + 10u = 1 sheet. + Garen: + - bugfix: fixed using items on a circuit removing all its access(now access gained + from each new item stacks) + - admin: adds logging for gun circuits, grabber circuits, and dragging claw circuits + - rscadd: grabbers can select what they want to drop + MrDoomBringer: + - imageadd: The Nanotrasen Airspace Aesthetics division has shipped out a newer + design of NT-Brand "Ore Silos". No new features have been added, but they certainly + look much nicer! + Naksu: + - balance: Having a high body temperature now increases the damage you take gradually, + whether you're on fire or not. Being on fire also always increases body temperature + damage + NewSta: + - tweak: The names of haircuts, facial hair, undershirts, underwear and socks have + now been sorted and categorized + WJohnston: + - imageadd: Remade titanium and plastitanium floors to be less of an eye strain + and something mappers might actually consider using. + - imageadd: New reinforced floor sprites. + XDTM: + - rscadd: Added programmable nanites to science! + - rscadd: Science now has a nanite chamber, a nanite program hub, a nanite cloud + console and a nanite programmer. + - rscadd: From the program hub you can download nanite programs (unlocked through + techwebs) to disks. + - rscadd: You can then customize their functionality and signal codes through the + Nanite Programmer. + - rscadd: The nanite chamber is necesary to inject nanites into a patient, and it's + also used to install/uninstall programs into a patient's nanites. A second person + is required to man the console. + - rscadd: The nanite cloud console controls remote program storage; it stores program + backups that nanites can be synced to through cloud IDs. + - rscadd: Nanite programs range can be either helpful or harmful; their main potential + is that they can be enabled at will through the use of remotes and sensors. + The potential uses are endless! + - rscadd: More detailed information is available in the wiki. +2018-08-22: + BlueNothing: + - rscadd: Allows video camera circuits to be seen on networks other than the science + cameranet. + - tweak: Alphabetizes camera list for camera bugs, and lets camera bugs see through + borg and circuit cameras. + - tweak: Makes video camera circuits fit in tiny assemblies. + PKPenguin321: + - tweak: The GPS circuit now has a 4th output, placing X,Y,Z all in a string. + - rscadd: '2 new converters: Rel to Abs, and Advanced Rel to Abs.' + - rscadd: Rel to Abs takes a set of relative and a set of absolute coordinates, + and converts the relative one to absolute. 1 complexity. + - rscadd: Advanced Rel to Abs takes a set of relative coordinates and converts it + to absolute without the need for an already known set of absolute coordinates. + 2 complexity. + SpaceManiac: + - bugfix: Freezers and heaters which start on no longer stay visually on when you + turn them off. + - code_imp: Atmospherics now initializes 93% (about 40 seconds) faster. + floyd: + - bugfix: fixes the hunger alert appearing forever + intrnlerr: + - bugfix: Tank temperature is no longer based on pressure + ninjanomnom: + - bugfix: Shuttle templates now handle shuttle registration in the load rather than + the shuttle manipulator. This means admin loaded shuttle templates no longer + need to be manually registered. + oranges: + - tweak: Inventory overlay now uses a traffic light to indicate if the item can + be placed in there +2018-08-23: + Naksu: + - code_imp: Waddling is now available as a component + Nervere: + - rscadd: re-adds the joy emoji. + SpaceManiac: + - rscadd: The body zone selector now indicates which body part you are about to + select when hovered over. + - code_imp: Transit space initializes about five seconds faster. + Tlaltecuhtli: + - balance: Cyborg ion thrusters consume 1/5 of their previous power. +2018-08-25: + Denton: + - rscadd: Added missing export rewards for various lavaland items (tendril/megafauna/ruins) + and engine parts. + - balance: Increased export values for emitters, PA parts, field generators and + radiation collectors to match the rest of engineering exports. Reduced supermatter + shard value by 1000 credits. + - rscdel: Removed export rewards for red/blue warp cubes since they're blacklisted + from the cargo shuttle. + - tweak: Added private intercoms to the confession booths of the Deltastation+Pubbystation + chapels. + - bugfix: Fixed invalid radio frequencies on interrogation chamber/confession booth + intercoms. + - tweak: Anime is even more horrifying than previously discovered! + - rscadd: Added a new shuttle loan event where crew can get paid for having an active + syndicate bomb delivered to cargo bay. + Mickyan: + - bugfix: Blue polo undershirt option has been restored + - tweak: underwear "nude" option moved to the top of the list + SpaceManiac: + - code_imp: The map loader now supports vars to be set to lists containing non-strings. + - bugfix: Overcharging energy guns no longer crashes the server. + - bugfix: Ordering the Build Your Own Shuttle kit no longer crashes the server. + The Dreamweaver: + - code_imp: Refactored gift code to fix a minor inefficiency. + XDTM: + - bugfix: Fixed chest and head augmentation not working properly. +2018-08-26: + CitrusGender: + - admin: Added note severity to [most] bans and the notes associated with them + - admin: 'Banning panel now has a severity option UI: Changed the UI of the note + panel UI: Changed the UI again, added some icons, removed brackets in urls, + fading out notes cannot be selected to expand the browser anymore' + Floyd / Qustinnus (Credits to KMC for the sprites): + - rscadd: The Clown Car, your 18TC clown-only solution to asshole co-workers + - rscadd: Regular car implementation (makes it easier to add more cars if someone + actually feels like adding those) + JJRcop: + - admin: 'Asay logs show "ADMINPRIVATE: ASAY:" again instead of just "ADMINPRIVATE:"' + Naksu: + - code_imp: living and stack typecaches now use a shared instance where it makes + sense, giving small memory savings + PKPenguin321: + - rscadd: Integrated circuit medium screens have been readded. They are now called + large screens. They now only work from your hands or on the ground when you're + standing on top of them (NOT from pockets, lockers, backpacks, etc). + - bugfix: Roundstart cyborgs will now be properly referred to as "it." + SpaceManiac: + - admin: The shuttle manipulator now allows flying any shuttle to any port which + will fit it. + - bugfix: The shuttle manipulator now allows fast-travelling shuttles with 5s remaining, + down from 50s. + - refactor: Status displays have been refactored to be cleaner and more flexible. + - bugfix: The AI dying properly updates its status displays again. + intrnlerr: + - refactor: Refactored nettles to be reagent_containers + nicbn: + - soundadd: Nanotrasen shoes no longer contain Silencium. Now footsteps make noise! + Sounds from Baystation. +2018-08-28: + Denton: + - bugfix: The 10 second anti spam cooldown of night shift lighting now works properly. + - spellcheck: Added an examine message to APCs that mentions Alt-click and Ctrl-click + (silicons only) behavior. + Garen: + - code_imp: adds a signal for screwdriver_act + SpaceManiac: + - code_imp: Multiple copies of a shuttle each get their own area instances (affects + APCs and air alarms). + XDTM: + - rscadd: The forcefield projector is now available ingame in the engineering protolathe. + It can project up to 3 forcefields which act as transparent walls, and share + a pool of health which is recharged over time. The projector must remain within + 7 tiles of the forcefields to keep them active. +2018-08-31: + Anonmare: + - bugfix: AIs can now turn shield generators on and off again + Denton: + - bugfix: Plastic golems can no longer vent crawl with items in their pockets. + Mickyan: + - balance: Skateboards can fit in backpacks + - tweak: Skateboards are slower by default, speed can be adjusted by alt-clicking + - rscadd: 'Show your support for the fine arts with these new quirks:' + - rscadd: 'Tagger: drawing graffiti takes half as many charges off your spraycan/crayon' + - rscadd: 'Photographer: halves the cooldown after taking a picture' + - rscadd: 'Musician: tune instruments to temporarily give your music beneficial + effects such as clearing minor debuffs and improving mood.' + Skoglol: + - bugfix: Dispensers can now add 5u to buckets, plastic beakers and metamaterial + beakers, down from 10u. + - bugfix: You can now pour 5u from buckets, plastic beakers and metamaterial beakers, + down from 10u. + - bugfix: Chem dispenser window width increased slightly, no longer shuffles buttons + when scroll bar appears. + The Dreamweaver: + - bugfix: Sentience Potions no longer require you to have Xenomorph toggled on in + preferences and now relies on its own preference in order to be notified of + open roles. + - code_imp: Split xenomorph, intelligence potions, and mind transfer potions into + separate roles for more precise role management. + - admin: Sentience Potion Spawns and Mind Transfer Potions are now job-bannable + roles. + Time-Green and locker sprites by MrDoomBringer: + - rscadd: Reports have come in that the wizard federation has harnessed some of + the ancient locker force to create a wand + XDTM: + - rscdel: Removed the chance of spouting brain damage lines when over 60 brain damage. + The dumbness trauma still has them. + - bugfix: Fixed Mechanical Repair nanites not working. + ninjanomnom: + - rscadd: Computers are now visible even in the darkest of rooms. Comfy! + - tweak: Because computers are now far easier to find in dark rooms their base light + output has been reduced. + - bugfix: Broken components left over from the signal origin refactor should be + fixed. + - bugfix: Lava isn't a safe place to throw your flammable shit anymore + - bugfix: The computer screen overlay being rotated incorrectly after construction + has been fixed. +2018-09-01: + ElPresidentePoole: + - rscdel: removes curator's fear of snakes + McDonald072: + - bugfix: Defibrillator nanites work properly. + Poojawa: + - bugfix: fixed clothing vendor fedoras having Detective Fedora grade armor + Potato Masher: + - tweak: The color of Wooden golems should be more in line with the color of the + wood used to make it. + WJohnston: + - imageadd: Reinforced floors are now shinier. +2018-09-02: + Denton: + - spellcheck: Fixed species type names that show up on health scanners. +2018-09-03: + Cdey78 (Ported by Floyd / Qustinnus): + - imageadd: AI can now think + - imageadd: 'New OOC emote: :thinking:!' + Naksu: + - admin: a new admin secret has been added to create a customized portal storm + Shdorsh: + - tweak: Makes it possible to create circuits that can get an item loaded into them + while they are in an assembly and the assembly is open. + - code_imp: Optimized electronic assemblies also. + - bugfix: A bug pertaining putting batteries in assemblies + Skoglol: + - bugfix: Eggplant and egg-plant seeds now have different names and plant names. + XDTM: + - bugfix: Fixed nanite cloud storage not allowing uploads. + octareenroon91: + - admin: Supermatter more likely to log fingerprintslast when it consumes any object. +2018-09-04: + Denton: + - spellcheck: Mech construction messages no longer incorrectly mention high-tier + stock parts. + - tweak: Added a nanite lab to Deltastation! It's at the old EXPERIMENTOR lab. + - tweak: 'Delta: Moved the Xenobiology disposals bin to be less obstructive. Added + two sets of insulated gloves to Engineering.' + - bugfix: 'Delta: Fixed scientists not having maintenance access near the circuitry + lab and toxins launch chamber.' + Shdorsh: + - code_imp: Made all the extinguishers use less sleep and spawn procs +2018-09-27: + Alexch2: + - spellcheck: Fixes tons of typos related to integrated circuits. + - tweak: Re-writes the descriptions of a few parts of integrated circuits. + 'Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes:': + - rscadd: 'New drinks: Peppermint Patty and the Candyland Extract!!' + Astatineguy12: + - tweak: The experimentor is less likely to produce food when it transforms an item + - bugfix: The experimentor no longer breaks when the toxic waste malfunction occurs + multiple times and isn't cleaned up + - bugfix: The experimentor irridiate function actually chooses what item to make + properly rather than picking from the start of the list + - bugfix: The mime blockade spell now shows up under the right tab + Beachsprites: + - imageadd: added directional beach sprites + Big Tobacco: + - rscadd: Cheap lighters now come in four different shapes and Zippos can have one + of four different designs, collect them all and improve our sales! + - imageadd: All existing lighter sprites have been given a face-lift and the flames + are now subtly animated. + - tweak: Cheap lighters now use a fixed list of 16 colors to pick from instead of + using totally randomized colors. + - imageadd: Cigar cases have been tweaked to be a bit smaller and to have a modified + design. + - imageadd: Cohiba Robusto and Havanan cigars now use separate case sprites from + the generic premium cigar cases. + CameronWoof: + - tweak: Quartermaster added to the list of changeling and traitor restricted jobs + CitadelStationBot: + - bugfix: The faint echoes of maracas grows louder, as if a past spirit once forgotten + has come back with a vengeance... + - bugfix: Removing an ID card from a wallet now properly removes its visual and + accesses. + - tweak: You may now take unlimited neutral and negative quirks + - tweak: the walls on the crashed abductor ship ruin in lavaland can now be broken + down + - bugfix: Pipe icons in the RPD now show properly in older versions of IE. + - bugfix: Removing an ID from a PDA in a backpack no longer hides the ID until something + else updates. + - bugfix: Opening and closing airlocks repeatedly no longer stacks queued autocloses. + - bugfix: Mindswapping with someone else no longer forces ambient occlusion on. + - bugfix: Admin AI interaction now works properly on firelocks. + - code_imp: IRV polls now use the same version of jQuery as everything else. + - rscadd: You can now view your last round end report window with the "Your last + round" verb in the OOC tab + - bugfix: Hydroponics trays can no longer be deconstructed with their panels closed + or unanchored while irrigated. + - tweak: Frames for machines which do not require being anchored can now be un/anchored + after the circuit has been added. + - spellcheck: Fix "Your the wormhole jaunter" when a wormhole jaunter saves you + from a chasm. + - rscadd: Analyzers can now scan all kinds of atmospheric machinery - unary, binary, + ternary, quaternary, you name it. This means stuff like gas pumps, gas mixers, + vents and so forth can be analyzed. + - tweak: Analyzers now show temperature in kelvin as well as celsius. + - tweak: Analyzers now show total mole count, volume, and mole count of all gases. + - tweak: Analyzers show everything at slightly higher degrees of precision. + - rscadd: Any anomaly core can now be deconstructed for a one time boost of 10k + points in the deconstructive analyzer. + - bugfix: Chasms no longer drop mobs buckled to undroppable mobs or objects. + - bugfix: Digital valves are once again operable by silicons. + - bugfix: Field generators are once again operable by adjacent cyborgs. + - bugfix: Entertainment monitors now view the real Thunderdome rather than the template. + - bugfix: Flipping and then rotating trinary pipe fittings no longer causes their + icon to mismatch what they will become when wrenched. + - bugfix: RPD tooltips for flippable trinary components have been corrected. + - bugfix: The green overlay indicating where a map template will be placed is no + longer invisible on space turfs. + - bugfix: Frost spiders now correctly inject frost oil on bite. + - bugfix: Inserting materials into protolathes with telekinesis is now possible. + - bugfix: Telekinesis no longer teleports items removed from deep fryers, constructed + sandbags, and leftover materials not inserted into lathes. + - bugfix: Telekinetic sparkles now appear in the correct place when clicking on + a turf and when clicking in the fog of war in widescreen. + - bugfix: Telekinetically adjusting power tools no longer causes them to exit the + universe. + - tweak: Examining a telekinetic grab in-hand will now examine the grabbed object. + - bugfix: Non-harmfully placing someone who is resting on a table no longer makes + them get up. + - bugfix: The disco machine no longer lags the chat by spamming "You are now resting!" + messages. + - tweak: Clicking on the viewport to focus it no longer leaves the input bar red. + - bugfix: Running diagonally into space now properly continues the diagonal movement + in zero-gravity. + - bugfix: Moving diagonally past delivery chutes, transit tube pods, &c. no longer + causes your camera to be stuck on them. + - config: The limit of monkey's spawned via monkey cubes is now configurable + - bugfix: Fixes cyborgs not being able to use two-handed modules while other modules + are equipped. + - bugfix: Pubby's auxiliary mining base now works again. + - bugfix: The overlay effects of cult flooring are now on the floor plane, fixing + their odd ambient occlusion appearance. + - bugfix: Cloning no longer breaks a character's connection to their family heirloom. + - bugfix: Beam rifle tracers no longer fall into chasms. + - bugfix: Vomiting on the same tile a second time no deletes the vomited reagents. + - bugfix: fixed the clockwork helmet not dropping to ground when used by non-clock + cultists + - refactor: The base machinery type is now anchored by default. + - bugfix: PDA style now gets loaded correctly. + - bugfix: Switching mobs into/out of a mech (by VR, ghosting, or mindswap) no longer + improperly applies the mech's cursor. + - tweak: roboticists have access to R&D windoors + - tweak: switched the type of the space suit on the syndicate shuttle + - bugfix: fixed hydroponics tray weed light staying on when removing weeds with + integrated circuits + - bugfix: Atom initialization and icon smoothing no longer race, causing late-loading + mineral turfs to have no icon. + - spellcheck: Faceless persons no longer "melt their face off" in energy gun suicides. + - bugfix: The Lightning Bolt spell now works again. + - tweak: Vehicle speed changes now happen immediately instead of on the next movement + cycle + - bugfix: Picture-in-picture objects now are no longer overlapped by other certain + objects + - bugfix: A pAI dying while in holoform no longer deletes the card, instead merely + emptying it. + - bugfix: The thermal sight benefits of lantern wisps no longer disappear if you + change glasses. + - imageadd: sandstone wall sprite for indestructible object + - bugfix: Stabilized gold extracts now respawn the familiar properly. + - bugfix: Stabilized gold familiars retain the proper languages even after respawning. + - tweak: Stabilized gold familiars can be renamed and have their positions reset + at will. + - bugfix: Pulling objects diagonally no longer causes them to flail about when changing + directions. + - bugfix: Riders are no longer left behind if you move while pulling something that + has since been anchored. + - tweak: Fire alarms now redden all the room's lights, and emit light themselves, + rather than applying an area-wide overlay. + - bugfix: Fire alarms no longer visually conflict with radiation storms. + - bugfix: Plasmamen now receive their suit and internals when entering VR. + - bugfix: Deaf people can no longer hear cyborg system error alarms. + - bugfix: Lockboxes are now actually locked again. + - bugfix: Legion cores and admin revives now heal confusion. + - bugfix: checks to see if bullets are deleted if they are the ammo type and the + bullet chambered. + - spellcheck: Capitalization, propriety, and plurality on turfs have been improved. + - bugfix: Unbreakable ladders are now left behind when shuttles move. + - rscadd: Players who edited a circuit assembly can scan it as a ghost. + - bugfix: It is no longer possible to pull the mirages images at space transitions, + and some other abstract effects. + - bugfix: Moving large amounts of items with bluespace launchpads no longer creates + a laggy amount of sparks. + - bugfix: The escape pod hallways on MetaStation and DeltaStation now have air again. + - bugfix: It is no longer possible to repair cyborg headlamps even when their panel + is closed. + - bugfix: Item fortification scrolls no longer add multiple prefixes when applied + to the same item. + - tweak: The blob core (and only the blob core) now respawns randomly on the station + when the core is taken off z-level + - bugfix: Prevents the round from going into an unending state + - code_imp: Added a variable to the stationloving component for objects that can + be destroyed but not moved off z-level + - rscadd: After years of protests NT decided to update the fire security standards + by adding 3 (three) advanced fire extinguishers to all the new stations. + - bugfix: Hyperspace ripples now remain visible until the shuttle arrives, even + during extreme lag. + - bugfix: Ripples now correctly take the shape of the shuttle, rather than always + being a rectangle. + - bugfix: Non-secure windoors now properly support the "One Required" access mode + of airlock electronics. + - bugfix: The gulag shuttle no longer moves instantly when returned via the claim + console. + - admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while + an admin ghost. + - admin: Speaking in deadchat now shows your rank instead of ADMIN + - rscadd: Added a pink scarf to vendomats + - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot + - bugfix: added a clamp so you can't set a negative multiplier to create materials + and create more than 50 items. + - bugfix: anomaly cores no longer tend to dust + - spellcheck: Plant disks with potency genes clarify the percent is for potency + scaling and not relative to max volume on examine. + - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous + scientists for a low low price of 14TC. + - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear + projectile that will apply what the bomb would do to a certain tile at that + distance to that tile. However, this will not cause breaches, or gib mobs, unless + the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. + (Unless the admins so will it.)' + - rscadd: Cyborgs now drop keys on deconstruction/detonation + - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only). + - bugfix: Fixed cyborgs not getting their names at round start + - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans + - bugfix: fixes cult shuttle message repeating + - bugfix: Hardsuit helmets now protect the wearer from pepperspray + - bugfix: It is once again possible for Cargo to export mechs. + - tweak: tourettes doesnt stack on itself anymore + - refactor: AI static now uses visual contents and should perform better in theory. + - bugfix: Bucket helmets cannot have reagents transferred into them until after + they are removed + - rscadd: R&D deconstructors can now destroy things regardless of if there's a point + value or material + - bugfix: You should now receive your destroy AI objectives properly during IAA + - bugfix: Deconstructable TEG now propertly connects to pipes. + - bugfix: Fix of inverted TEG sprite of slow turbine turning. add:Now you can flip + circulator and make TEG of your dream. add:Add TEG and circulator to "Advanced + Power Manipulation" techweb node. + - imageadd: New icon for plastic flaps that actually looks airtight. + - code_imp: Update to plastic flaps code to use tool procs rather than attackby + and removed two pointless states. + - bugfix: Printing the TEG and circulator boards no longer prints the completed + machinery instead. + - imageadd: Medical HUDs will now show an icon if the body has died recently enough + to be defibbed + Cobby: + - tweak: Decals are the exception to the recent removal of effects in Chameleon + Projectors. + - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits. + - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule + pack. + - bugfix: Paper doesn't give illegal tech anymore + Cruix: + - rscadd: AIs now have an experimental multi-camera mode that allows them to view + up to six map areas at the same time, accessible through two new buttons on + their HUD. + Dax Dupont: + - bugfix: Fixes the wrong tiles in Syndicate VR trainer and uses different tiny + fans. + - bugfix: Access didn't append to VR IDs + - bugfix: Fixes missing curator hud icon. + - balance: Cult items will no longer be a long ride on the vomit coaster if picked + up by a non cultist. + - balance: Cult space bases are kill again. + - balance: Cult floors now pass gas. + - bugfix: Fixed a few things deconning into the wrong circuit. + - bugfix: You can no longer do infinite bioware surgery. + - bugfix: Foam no longer gives infinite metal + - bugfix: Mulligan didn't work on lizards and other mutants. Now it does. + - tweak: The BoH dialog now has Abort instead of Proceed as an default option. + - bugfix: Fixes accidental empty ahelp replies. + - balance: More chemicals can be found when vents get clogged. + - bugfix: Experimentor no longer shits out primed TB nades. + - bugfix: Fixed rpeds throwing stock part rating related runtimes. + - bugfix: Fixes a sentience related exploit by blacklisting it in restricted uplinks. + - bugfix: Botany trays don't magically refill anymore with a rped. + - balance: It's now easier to become fat. Don't eat so much. + - bugfix: Fixed missing grilles under brig windows of the pubby shuttle. + - rscadd: For the pubby shuttle, added some food in the fridge, mostly pie slices. + Also added a sleeper to the minimedbay. + - tweak: Reworded pubby shuttle description to be more inline with the new train + shuttle. + - refactor: Syndicate and Centcom messages have been squashed together. + - admin: You can now send both Syndicate and Centcom headset messages. Be mindful + that the button was changed to HM in the playerpanel + - bugfix: Fixes missing cream pies in the cream pie fridge. + - bugfix: Chem synths overlays aren't all kinds of fucked anymore. + - refactor: Unfucked all of the remaining chem synth code. + - refactor: Reagents no longer have an unused var that's always set to true. Who + did this? + - balance: Makes the xeno nest ruin harder to cheese. + - bugfix: Fixes the bathroom being airless in the Space Ninja anime jail. + - admin: Create antags now checks for people being on station before applying. + - admin: Malf AI machine overloads now are logged/admin messaged. + Denton: + - rscadd: APC/air alarm/airlock/fire alarm/firelock electronics are now available + once Industrial Engineering is researched.. + - tweak: Engi-Vend machines now contain fire alarm and firelock electronics! + - code_imp: Loose tech storage circuit boards have been replaced with spawners. + - code_imp: Added /syndicate subtypes for air alarms and APCs. + - bugfix: Added missing stock parts to the syndicate lavaland base. + - tweak: Added kitchen related circuit boards to the syndie lavaland base. + - tweak: There are rumors of the Tiger Cooperative adding a "special little something" + to some of their bioterror kits. + - code_imp: Loose silver/gold/solar panel crates have been replaced with "proper" + crates. + - balance: Skewium is much less likely to appear during the Clogged Vents event. + - bugfix: 'Navbeacon access requirements have been fixed: Now you need either Engineering + or Robotics access, but not both at the same time.' + - tweak: 'Pubbystation: Added a dual-port vent pump to the toxins burn chamber.' + - code_imp: Removed most airlock_controller/incinerator related varedits and replaced + them with defines/subtypes. + - tweak: The Deltastation toxins lab has its portable scrubber, air pump and intercom + back. + - bugfix: Swarmers can no longer attack field generators and turret covers. + - rscadd: Arcades have been stocked with preloaded tactical snack rigs. + - bugfix: The Pubbystation maint bar Booze-O-Mat now shows its contents correctly. + - tweak: Added a warning to the shuttle purchase menu. + - balance: Pirates and Syndicate salvage workers have been beefed up around the + caravan ambush ruin. + - tweak: NanoTours is proud to announce that the Lavaland beach club has been outfitted + with a dance machine, state of the art bar equipment and more. + - tweak: Did you know that honey has antibiotic properties? + - spellcheck: Improved supply shuttle messages and firefighting foam descs. + - bugfix: Supply shuttles will no longer spill containers on docking. + Dimmadunk: + - rscadd: 'There''s a new type of reagent added to the booze dispenser: Fernet. + With it you can make a couple of new digestif drinks that will help you reduce + excess fat!' + ElPresidentePoole: + - rscadd: SFX for seppuku (on all katanas) + - rscadd: suicide message for energy katanas ("cyber-seppuku") + - rscadd: suicide message for replica katanas ("seppuku") + Flatty: + - tweak: The blurry eye overlay has been replaced with an actual blur. + - tweak: The vending machine UI is now prettier. + Garen: + - rscadd: Thrower and Gun circuits put messages in chat when they're used. + - tweak: Only the gun assembly can throw/shoot while in hand + - imageadd: Adds inhands for the gun assembly + - bugfix: grabber inventories update when a thrower takes from them + GrayRachnid: + - rscadd: Adds private rooms to the ninja holding center + - rscadd: Along with a few things to make it more tolerable, but fear not. There + is now a suicide chamber for those who want the easy way out. + GuyonBroadway: + - rscadd: Adds gloves of the north star to the traitor uplink. Wearing these gloves + lets you punch people five times faster than normal. + - rscadd: Sprites for the gloves courtesy of Notamaniac + Hatterhat: + - tweak: The plasma formerly present in some execution syringes was replaced with + amatoxin. + Hyacinth: + - rscadd: Grenadine is now available in the bar! + - tweak: Tequila sunrises now require grenadine to make! + Iamgoofball: + - tweak: Lipolicide now only does damage if you're starving. + Improvedgay: + - balance: Naming immerions + Improvedname: + - rscadd: Adds rubbershot secrifle shots + JStheguy: + - rscadd: Added the data card reader circuit, a circuit that is able to read data + cards, as well as write to them. + - tweak: Data cards are now longer inexplicably called data disks despite clearly + being cards, and can be printed from the "tools" section of the integrated circuit + printer. + - tweak: Data cards no longer have a special "label card" verb and instead can have + their names and descriptions changed with a pen. + - rscadd: Also, some aesthetically different variants of the data cards, because + why not. + - imageadd: Data cards have new sprites, with support for coloring them via the + assembly detailer. + Jay: + - tweak: Bans CMO, RD, CE, and HoP from antag/ling + Jegub: + - imageadd: Glowcaps now have their own sprite. + Kor: + - rscadd: The Quartermaster and HoP can now access the vault so they can use the + bank machine. + - rscadd: Engineering can now create anomaly neutralizer devices, capable of instantly + neutralizing the short lived anomalies created by the supermatter engine. + - rscadd: Bubblegum has regained his original (deadlier) move set. + LetterN: + - bugfix: Fixes shock collars, they now fit on the neck slot + - bugfix: you can't put them on pockets anymore + MacHac: + - bugfix: Bedsheets once again properly influence the dreams of those who sleep + under them. + Mickyan: + - bugfix: Drinking too much Gargle Blaster, Nuka Cola or Neurotoxin no longer breaks + time and space. + - bugfix: Pacifists can now use harm intent for actions that require it (but still + can't harm!) + - spellcheck: fixed typo in bronze girder construction + - rscadd: 'New trait: Drunken Resilience. You may be a drunken wreck but at least + you''re healthy. If alcohol poisoning doesn''t get you, that is!' + - bugfix: Fixed pacifists being able to harm using bottles/screwdrivers + MrDoomBringer: + - imageadd: the VR sleeper action button has a sprite now + - admin: Central Command can now smite misbehaving crewmembers with supply pods + (filled with whatever their hearts desire!) + - admin: CentCom Supplypods now stun their target before landing, and won't damage + the station as much + Naksu: + - code_imp: clothing-specific flags are now defined in /obj/item/clothing.clothing_flags + - code_imp: More flags have been moved to their appropriate places + - code_imp: HEALS_EARS_2 is removed in favor of the earhealing component + - code_imp: wearertargeting component is available to subtype for components that + want to target the wearer of an item rather than the item itself + - code_imp: changed the shockedby list on doors to be only initialized when needed. + - tweak: Chameleon projector can no longer scan (often temporary) visual effects + like projectiles, flashes and the masked appearance of another chameleon projector + user + - bugfix: Drones can no longer see a static overlay over invisible revenants + - balance: adjusted default antag rep points to grant every job the same amount + of points per round, except for assistant which gets 30% less + - rscadd: Nuclear explosive-shaped beerkegs found on metastation can now be triggered + with the nuclear disk and the syndicate's legacy nuclear code for a foamy surprise + - bugfix: comms consoles now work in transit again, and no longer work in centcom + - code_imp: removed unnecessary getFlatIcons from holocalls + - bugfix: Screwdrivers and other items with overlays now show the proper appearance + of the item when attacking something with them, or when put on a tray. + - code_imp: moved /datum.isprocessing into datum flags + - code_imp: Removed unused effect object that could be used to spawn a list of humans + - tweak: The ladders in the tear in the fabric of reality no longer spawn their + endpoints when the area is loaded, but only when the tear is made accessible + via a BoH bomb. + - tweak: CentCom is no longer accessible via the space ladder in the tear. + - tweak: The lavaland endpoint can no longer spawn completely surrounded by lava, + unless it spawns on an island + - code_imp: ChangeTurf can now conditionally inherit the air of the turf it is replacing, + via the CHANGETURF_INHERIT_AIR flag. + - bugfix: when ladder endpoints are created, the binary turfs that are created inherit + the air of the turfs they are replacing. This means the lavaland ladder endpoint + will have the lavaland airmix, instead of a vacuum. + - code_imp: navigation beacons are now properly deregistered from their Z-level + list and re-registered on the correct one if moved across Z-levels by an effect + such as teleportation or a BoH-induced chasm. + - bugfix: constructed directional windows no longer leak atmos across them + - code_imp: setting the value of anchored for objects should be done via the setAnchored + proc to properly handle things like atmos updates in one place + Nicc: + - rscadd: toxins lab boii + Nichlas0010: + - tweak: Reseach Director Traitors can no longer receive an objective to steal the + Hand Teleporter + - bugfix: Comms consoles won't update while viewing messages + - spellcheck: you now feel nauseated instead of nauseous + - bugfix: You can no longer use a soapstone infinitely + - bugfix: You now can't get multiple download objectives! + - tweak: RDs, Scientists and Roboticists can no longer get download objectives! + Poojawa: + - tweak: Admin IC issue is no longer TG i ded passive aggressive. + - rscadd: Added *insult, for when you just can't think of anything more clever + - bugfix: Makes vore specific prefs call Rust_g else uses normal stuff. + - bugfix: Citadel Toggles should save properly now + - bugfix: fixed clothing vendor fedoras having Detective Fedora grade armor + - bugfix: Fixes missing icons on mag weapons for techmemes + - bugfix: Fixes APCs being replaced in maint from counting Maint as their wall turff + - rscadd: Added Vore based moodlets, primitive and ain't gunna adapt for not belly + things but w/e + Pubby: + - bugfix: 'PubbyStation: Fixed disposals issue in security hallway' + Robustin with cat earrs: + - bugfix: 'Gun overlays should be way less laggy now. remove: Chameleon guns are + completely removed since they crash the server, were already made unavailable, + and are the worst shitcode I''ve ever seen in my life.' + ShizCalev: + - bugfix: Adminorazine will no longer kill ash lizards. + - bugfix: Adminorazine will no longer remove quirks. + - bugfix: Fixed mobs immune to radiation being killed by HIGH bursts of radiation. + - bugfix: The book of mindswap will now properly mindswap it's users. + - bugfix: Fixed a runtime with the gulag teleporter that could cause the process + to fail if you removed the ID. + - tweak: Not setting the goal of a prisoner's ID when teleporting them will now + set the ID's goal to the default value (200 points at the time of this change.) + - bugfix: Fixed cigar cases & cigarette packets taking two inventory slots + - bugfix: Fixed cigar cases showing the wrong icon for the cigars inside them. + - bugfix: Fixed cigar cases & cigarette packets stating the wrong name of the cigar/cigarette + when removed via altclick. + - bugfix: Fixed items in pockets vanishing when a mob is monkeyized. + - bugfix: Fixed items in pockets vanishing when a mob is gorillized. + - bugfix: Fixed items in pockets vanishing when a mob is infected with a transformation + disease. + - bugfix: Fixed items in pockets not being properly deleted when a mob goes through + a recycler + - bugfix: Fixed items in pockets not being properly deleted when highlander mode + is enabled. + - bugfix: Fixed exploit allowing you to remove unremovable tanks from pockets. + - bugfix: Fixed items in pockets dropping when a mob is equipped with a new outfit. + - bugfix: Fixed items in pockets not being covered in blood when equipping the psycho + outfit. + SpaceManiac: + - bugfix: The destructive analyzer can once again be used to reveal nodes. + - spellcheck: Some references to "deconstructive analyzer" have been updated to + "destructive". + TGstation contributors: + - bugfix: Nukeop eshields are now buyable. tgstation/tgstation#39025 + - bugfix: Staff of storms now has admin logging. tgstation/tgstation#39011 + - bugfix: Fixed a couple of inconsistencies in the uplink descriptions of SMGs and + SMG ammo. tgstation/tgstation#38980 + - bugfix: Fixed blob victory. tgstation/tgstation#38988 + - tweak: You can now un-ignore notifications you've clicked "never this round" on, + and more. tgstation/tgstation#38990 + - bugfix: Fixes a weird bug with timers. tgstation/tgstation#38994 + - bugfix: (tgstation/tgstation#40043) - Beam rifles no longer open lockers + - bugfix: (tgstation/tgstation#40061) - Mobs can no longer get stuck at min/max + body temperature + - bugfix: (tgstation/tgstation#40041) - Pictures of asses are now properly sized + - bugfix: (tgstation/tgstation#40084) - The lastattacker var now includes unarmed + attacks + - bugfix: (tgstation/tgstation#39968) - Plastic golems can no longer ventcrawl with + items in their pockets + - bugfix: (tgstation/tgstation#39885) - You can no longer crash the server by overcharging + energy guns. + Thunder12345: + - rscadd: Added a colour picker component for use with circuits. + Time-Green: + - bugfix: Soda is no longer intangible to the laws of physics + Toriate: + - rscadd: It appears that ancient pieces of armor have wound up on the open market! + These armors have degraded beyond usefulness. Grab one now in the loadout! + - imageadd: added flak jacket and M1 Helmet sprites + - rscadd: Gives the flak helmet a tiny storage compartment + - balance: Made the flak helmet even weaker against acid and fire so it crumbles + into dust easier + - rscadd: Added the Corporate Uniform and the Silver Bike Horn + - imageadd: added sprites for the Corporate Uniform and Silver Bike Horn + Tupinambis: + - tweak: 'Removes the tesla coils from engineering secure storage, and places them + within the engine room, functional upon being wrenched down. (Arranged in the + common method of three coils on the left and right sides.) + + Reduces the width of engineering secure storage and its blast door by one tile. + The machinery within has been rearranged in order to make the most commonly + used machinery the most accessible.' + - tweak: Replaces the blood-red hardsuit in Deep Storage with a mining EVA hardsuit, + and an included oxygen jetpack. + - rscadd: 'Adds a replacement to the old lavaland xeno ruins in the form of lavaland_surface_alien_nest.dmm An + image of which is shown below. (The area layer is disabled for visibility.) + ![hive](https://user-images.githubusercontent.com/42078130/44291327-43df0d00-a243-11e8-9e72-ba8f81d31370.PNG) + ![hive2](https://user-images.githubusercontent.com/42078130/44291330-47729400-a243-11e8-998d-660063fa9f41.PNG) + + This replacement is designed to act as a sort of raid, with the queen as the + raid boss. The most notable loot includes the corpse of a drone, security bio + armor, a bone axe, some basic syndicate equipment, and a syringe containing + alien microbes. All references to the old lavaland xeno ruins have been replaced + with references to the new map file.' + - rscadd: New corpse spawners for alien queens and drones. + - rscadd: New syringe containing the alien microbe reagent. + - rscdel: Removed the currently unused lavaland_surface_xeno_nest.dmm map file, + and its references. + - rscadd: Added an experimental hard suit to toxins bomb test room on Box. + - tweak: Increased the size of the toxins bomb test room, moved the telescreen, + and added chairs on Box. + - tweak: Moved some pipes out of the way on Box and Meta. + - rscadd: 'Two air pumps have been added to the toxins lab on Pubby and Meta. + + The following changes apply to Box, Meta, and Pubby:' + - tweak: Unbolts the toxin burn chamber doors on round start. + - tweak: Unlocks the toxins lab air alarm on round start. + - tweak: When spawned as a nuclear operative, you keep your characters race instead + of being changed into a human. Plasmamen are an exception to this change. + - tweak: By popular request, makes the Head of Security spawn with a telebaton instead + of a stun baton. + Werebear: + - rscadd: Seven new holochassis options for pAIs and two new display images for + pAIs. + Wilchen: + - rscdel: Removed box of firing pins from rd's locker + XDTM: + - bugfix: Fixed anti-magic not working at all. + - bugfix: Diseases now properly lose scan invisibility if their stealth drops below + the required threshold. + - tweak: Coldproof mobs can now be cooled down, but are still immune to the negative + effects of cold. + - bugfix: This also fixes some edge cases (freezing beams) where mobs could be cooled + down and damaged despite cold resistance. + - balance: Androids are now immune to radiation. + Xhuis: + - tweak: Character traits are now called character quirks. Functionality remains + unaffected. + Zxaber: + - rscadd: Cyborgs can wear more hats now. + and Fel: + - imageadd: New chairs are on most shuttles! Finally, you can relax in style while + escaping a metal death trap. + armhulen: + - rscdel: chameleon guns are disabled for breaking the server + cacogen: + - rscadd: You can now see what other people are eating or drinking. + - rscadd: Borg shaker can now synthesise milk, lemon juice, banana juice and coffee + - bugfix: Renamed drinks no longer revert to their original name when their reagents + change + cyclowns: + - bugfix: Fires no longer flicker back and forth like crazy + - rscadd: Fusion has been re-enabled! It works similarly to before, but with some + slight modification. + - tweak: Fusion now requires huge amounts of plasma and tritium, as well as a very + high thermal energy and temperature to start. There are several tiers of fusion + that cause different benefits and effects. + - tweak: The fusion power of most gases has been tweaked to allow for more interesting + interactions. + - tweak: BZ now takes N2O and plasma to create, rather than tritium and plasma. + - bugfix: Fusion no longer delivers server-crashingly large amounts of radiation + and stationwide EMPs. + deathride58: + - tweak: (Only visible on 512) Stamina crit will now result in the mob's sprite + subtly darkening around its edges. + - rscadd: Added a tiny reference item to a year-old weeby game. If you're a traitor, + you can find this item in the "badassery" section of the uplink. It's free, + and you can order up to 4 of them! The effects of this item are only visible + on 512. + - code_imp: Added a component signal for toggling combat mode on/off. + - balance: The cleaving saw now deals less staminaloss to its user while inactive. + - rscadd: You can now make use of custom say verbs with the [say verb*message] format + - rscadd: Yelling will now echo and penetrate walls + - tweak: Distant voices now have smaller text + - tweak: You can now see the amount of charges an emag has by examining it + - tweak: Emags now make a quiet noise when they're close to running out of charges. + - tweak: Emags are no longer irreversibly destroyed upon running out of charges. + - rscadd: Traitors can now purchase emag recharge devices for 2 TC. They have five + extra charges each, and can be found in the devices and tools section of the + uplink.. There's no cap on the amount of charges a single emag can have, though + do be aware that upstream spaghetti code makes it easy to waste charges. + - tweak: Small emag flavortext changes here and there + - balance: The warden's particle defender now deals less staminaloss when in stun + mode. + - tweak: '"code [alert level]" has been changed to "[alert level] alert" on the + hub entry.' + - tweak: The hub entry now displays the current map. + - tweak: Lavaland is no longer fullbright. We have memory to spare. + - rscadd: Adds the wheelofsalt command to TGS3. Spin the wheel of salt to find out + what the Citadel Station 13 players are salting about today! + - rscadd: You can now slam or slap your hands onto tables by right clicking them + in combat mode. + - tweak: Non-admins can no longer use LOOC while dead, unconscious, in crit, or + while ghosting. + - tweak: The syndicate mask available in the uplink will now inject you with a chem + that cuts your click delay in half and increases your stamina regeneration, + when you enter combat mode. The mask has a five minute cooldown between adrenaline + injections. + - balance: Dogborgs will now reduce firestacks when they use their tongue to lick + someone's face. + - bugfix: The repo compiles again + - bugfix: The flag cape donor item should render properly now. + - tweak: The default amount of z-levels reserved specifically for space ruin generation + has been reduced from 7 to 1 + - bugfix: Items now spawn on top of, rather than inside, closets and other storage + structures + - rscadd: Jukeboxes now have realtime directional audio, complete with occlusion + when you're far away or behind a wall. + - rscadd: More than one jukebox can play a song at a time now. Have up to 5 jukeboxes + playing at once! + - rscadd: Devs can now control the wet and dry channels of sounds played via playsound_local. + The new envwet and envdry arguments will control the volume of the wet and dry + track, respectively. + - code_imp: Jukeboxes have been turned into a subsystem. Track initialization, audio + playing, etc, are now handled via SSJukeboxes instead of via the jukebox object + procs. + - config: Jukebox tracks now require an additional ID field at the end of their + name. This will make it easier to add jukebox-style objects that are only capable + of playing specific songs, without worrying about copyright issues. + - rscadd: Added Raiq's boombox as a donor item + - rscadd: You can now manipulate tails, ears, body markings, mutant colors, and + taur types via DNA console! + - balance: Reduced the exponent on gas tank ruptures. TTVs and suicide onetanks + that were previously 20dev are now approximately 9.6dev. Let's see the actual + toxins nerds adapt! + - tweak: When a custom say verb message is spoken without any actual words, the + text will render without a `, ""` at the end of it. + - balance: The combat rework's training wheels have been removed. Knockdowns no + longer have any noticeable stun. This indirectly means stunbatons and tasers + will always deal their full stamloss on hit. + - balance: The stamloss required for boxing gloves to throw a knockout punch has + been increased from 50 to 100. + - rscadd: You can now prime the grenade on bombspears by using them in your hand. + The wield hotkey is moved to combat mode rightclick while a spear has a grenade + on it. This is explained in the examine text. + - balance: Bombspears no longer instantly explode on impact when thrown. They now + have to be primed to explode when thrown. + - balance: Bombspears now have 90% embed chance. + - rscadd: If an embedded item is normal sized or larger, you can take it out instantly + by pressing resist. + - balance: Embedded items are now much harder to pull out the smaller they are, + rather than the other way around. It's much easier to rip out a sword from your + chest than it is a shard of glass in your face. + - tweak: The message you get when you get bounced by the PB is now a little more + clear about what you need to do to gain access to the server. + - balance: The jukebox now falls off over a greater distance. You can now actually + hear the jukebox while sitting in a far corner of the bar, or while passing + through the main hallways. + - rscadd: Added antag OOC. This is disabled by default, but you can access it with + the "AOOC" verb as an antagonist when an administrator enables it. + - tweak: LOOC now supports emojis + - tweak: 'Deadchat and asay will now both render emojis! :snya:' + - balance: The disarm attack on EMP'd defibs now has an interruptible 1 second timer + before it actually lands. + - balance: The stamina buffer now only takes 1 second to start regenerating. + - balance: Disablers have had their damage reduced from 36 stamloss to 24 stamloss, + increasing their shots to stamcrit from 4 to 6. + - balance: Tasers have had their damage increased from 55 stamloss total to 61 stamloss + total. Shots required to stamcrit are unaffected. + - rscadd: Introducing the Kitchen Gun (TM)! Say goodbye to daily stains and dirty + surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll + sparkle like new! Includes two extra ammunition clips for the low, low price + of just 10 TC! Laser sight and night vision accessories sold separately! Magazines + can be purchased individually for 1 TC a pop! + - tweak: Active turf processing is now its own subsystem. + - code_imp: Ports tgstation/tgstation#39287 - You can now configure how fast a mob + fires, and how many shots they fire in a single burst + - rscadd: When you spawn as a miner, you'll get text clarifying your job description. + You might not think it's necessary, but believe me, it is. + - rscadd: mushroom people are now roundstart on live + - rscadd: The geargroupID var of loadout entries can now be a list rather than a + string. GeargroupID changes are additive when multiple are defined in a single + loadout entry. + deathride58 (Original PR by Basilman/Militaires): + - rscadd: Ported TGstation's Agent Stealth Box! You can the implanter in the syndicate + uplink for 8 TC. Credit goes to Basilman/Militaires. This port includes minor + adjustments, see the GitHub for details. + hatterhat after being yelled at by kevinz: + - bugfix: deletes an entire line that might fix flash icons idk blame him if it + gets worse + iksyp: + - rscadd: stacking machines and their consoles no longer dissapear into the shadow + realm when broken + - rscadd: you can link the stacking machine and its console by using a multitool + - bugfix: Ever since the great emotion purge of 2558, people were able to work at + top efficiency, even while starving to death. This is no longer the case, Nanotrasen + Scientists say. + - admin: Hunger slowdown only applies if mood is disabled in the config. + imsxz: + - admin: Using mayhem bottles and going under their effects is now logged. + izzyinbox: + - rscadd: Added an integrated circuit part that interacts with the arousal system + - tweak: changes the admin-pm input box from single line to multi-line + - bugfix: Tennis balls now equip and show up in the correct slots + - rscadd: Adds option in the hide/expose genitals verb to hide genitals even without + clothes + kevinz000: + - rscadd: Cameras now can take pictures up to 7x7. Alt click them to change their + width/height from the default 3x3. + - rscadd: Photos are now logged to disk, assuming the host enabled the configuration + option + - rscadd: If the above is enabled, albums/frames can now have their persistence + IDs set in variables to allow for PHOTO PERSISTENCE + - rscadd: Every head of staff gets a unique album with its own ID in their locker. + Let your successors know about your accomplishments, screwups, and everything + in between! + - rscadd: All of this works or should work with newcasters/pdas/etc etc + - rscadd: Photo taking now clones the area into transit space and then operates + on it, instead of on the spot, in theory making photographing things more accurate? + nicc: + - rscadd: no more dark locker corner woo + - tweak: area alterations + - rscadd: escape pod + - rscadd: see above + - rscadd: adds windoor to the plastic flaps in the atmos lobby + ninjanomnom: + - rscadd: A plush that knows too much has found its way to the bus ruin. + resistor: + - rscadd: Added circuit labels! You can now customize the description of your assemblies. + slate3: + - rscadd: ported a new alternative sprite for engineering borgs, mr. handy + - rscadd: ported a new alternative sprite for security borgs, a spider-like walker + - rscadd: ported a new alternative sprite for medical borgs, an eyebot + steamport: + - bugfix: Borgs/AIs can now toggle rad collectors + ursamedium: + - bugfix: slapping / slamming hands on tables now uses appropriate pronouns + - bugfix: crow pAI is no longer invisible while resting + yenwodyah: + - bugfix: A few virus threshold effects should work now + yorii: + - bugfix: Fixed the smartfridges to be in line with all other machines and puts + the released item in your hand. + yorpan: + - rscadd: Brain damage makes you say one more thing. +2019-11-04: + 4dplanner, MMiracles: + - tweak: Wizard shapeshift now converts damage taken while transformed + - bugfix: transform spell transfers damage correctly instead of healing most of + the time + - bugfix: 0% simplemob health maps to 0 carbon health, 100% simplemob to 100% carbon + - bugfix: transforming to a form with brute resistance no longer heals you + - bugfix: transforming back to a species with brute resistance no longer heals you + AdmiralPancakes1: + - rscadd: 'Cryo cell shortcuts: alt-click toggles the doors, ctrl-click toggles + the power' + Alonefromhell: + - rscadd: Ported Oracle UI, a framework for self-updating and neat UI's + - refactor: Paper now uses OUI + - refactor: Bins now use OUI + - bugfix: fixes tootip offset + AnalWerewolf: + - rscadd: Fritz plushie + - rscadd: Donor item + Anonymous: + - imageadd: 'More crusader armor variants to pick from armament: Teutonic and Hospitaller.' + Arturlang: + - rscadd: You can now use CTRL and ALT click on pumps and filters to toggle them + on and off and max their output respectively + - rscadd: You can now use RPDs on windows and grilles. + - rscadd: The RD can now suplex a immovable rod. Good fucking luck. + - bugfix: Fixes high alert ERT suit sprites. You can see them now! + - rscadd: Traitor codewords are now highlighted for traitors. + - rscadd: You can now examine pumps filters and mixers to see if you can use CTRL + and Alt click on them. + - bugfix: Fixes brain damage/trauma healing nanites so they actually work while + there are only traumas. + - tweak: Advanced toxin filtration nanites now heal slimes + Bhijn: + - rscadd: It's now possible to forcefully eject the occupants of a dogborg's sleeper + by using a crowbar on them. This action is instant. + - tweak: Resist values for dogborg sleepers have been adjusted. The baseline has + been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist + timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds. + - tweak: It now takes 10 full seconds to insert people into your sleeper. This should + hopefully give people some more room to breathe and react to a dogborg attempting + to sleeper someone either for no reason or in a way that violates law 2. + - bugfix: Warp whistles no longer grant permanent invulnerability and invisibility + - bugfix: You can now actually use the resist hotkey to resist out of handcuffs. + Woah, revolutionary + - bugfix: the `!tgs poly` command now actually works + - rscadd: Poly now has a 0.01% chance per squawk to speak through the TGS relay. + - balance: The point production mode of radiation collectors has been reverted to + the original behavior of using all of the stored power every process cycle instead + of just 4% of it + - tweak: Radiation collectors now display the amount of power/research points they're + producing per minute rather than per process cycle, which should hopefully clear + up a lot of confusion. + - tweak: Radiation collectors also display what's happening to the gas within them, + which should make it a lot more obvious as to how you get tritium. + - tweak: Security borgs and K9s are now only available during red alert or higher. + - server: Headmins or other folks with access to the server's config can choose + the minimum alert level for secborgs to be chosen via the MINIMUM_SECBORG_ALERT + config option. See the default game_options.txt for more info. + - bugfix: The server no longer attempts to check if the CID matches the IP of any + bans, or if the IP matches any CIDs of any active bans, during client analyzation + - balance: Vampires can now only ventcrawl in bat form if their blood level is below + the bad blood volume (224 blood total) + - balance: Vampires now only take 5 burn per mob life cycle while within chapel + areas, down from the original 20 burn per life cycle. + - tweak: K9 pounces have received a minor rework. It now has an effective cooldown + of 2.5 seconds, can now only deal up to 120 staminaloss, deals a maximum of + 80 stamloss on hit, has a spoolup of half a second, and now has telegraphing + in the form of a quiet noise. + - balance: K9s now only have 80 health + - balance: Secborgs (but not k9s) now have a hybrid taser. This can be toggled via + server config. + - tweak: The disabler cooler upgrade now applies to all energy-based firearms for + borgs + - rscadd: Dogborg jaws are now capable of incapacitating targets if using help intent. + This deals a hard stun depending on how much staminaloss the target has, and + whether or not they're resting. This behavior can be toggled via server config. + - balance: K9 jaws now have 15 force, up from their nerfed 10 force. + - balance: Borg flashes regained their ability to cause knockdown. This can be toggled + via server config. + - server: The WEAKEN_SECBORG config option will disable the new dogborg jaws mechanic + and make secborgs spawn with a standard disabler. + - server: The DISABLE_BORG_FLASH_KNOCKDOWN will disable the ability for borg flashes + to knockdown. + - tweak: Jukeboxes now have 6 audio channels available to them, up from the previous + accidental 2 and previously intended 5 channels. + - bugfix: Jukeboxes now work again on clients running versions higher than 512.1459. + - bugfix: People will no longer have their ears consumed by an eldritch god if multiple + jukeboxes are active and the first jukebox in the jukebox list stops playing, + then tries to play again + - tweak: Instead of the debug text for invalid jukebox behavior being printed to + world, the debug text is now restricted to the runtime panel. + BurgerB: + - tweak: Tweaked the UI of the loadout to be less cluttered due to an issue with + formatting. + BurgerBB: + - rscadd: Adds the bonermeter; a device that measures arousal based statistics. + - refactor: Added a new input to the electrostimulator that controls the strength + of the shock. It accepts negative inputs which reduce arousal. Added a new output + to the electrostimulator that displays the amount of arousal gained. + - balance: Rebalanced the electro-stimulator to be less spammy by giving it a 2.5 + second enforced cooldown per circuit contraption. Increased the complexity of + electro stimulator from 10 to 15. + - refactor: Reworked the Vent Clog event to spray smoke instead of foam, also made + it shoot smoke over time instead through each vent instead of all at once. + - tweak: Increased the spawn area of the City of Cogs (Reebe). This does not affect + the area in which builders can build. + - balance: Significantly tweaks the Wizard race transformation event to be less + unreasonably troublesome. + - rscadd: Adds a new 0 cost trait that makes you immune* to Crocin and Hexacrocin + - tweak: Tweaks how slurring works so it's more of a gradual change into slurring + instead of immediate. + - balance: Slurring is now directly proportional to your drunkenness, with other + sources of slur being added on top of it. + - tweak: Bras are now separate from underwear, meaning you can mix and match bras + if you're into that. + - tweak: Men can wear female accessory clothing, and females can wear men accessory + clothing. It's not a fetish, mom, it's PROGRESSIVE. + - code_imp: Reorganized accessories into their own files to prevent a massive 1000 + line file. + - server: i'm 10% sure that merging this PR will cause preference corruption sooooooooooo + I just need to hear from @deathride58 or perhaps someone else on how much damage + this could possibly do. + - tweak: Tweaked penis. + - balance: Rebalanced penis. + - rscadd: 'Added the following reagents to the common list of vent clog reagents: + ~~Cooking Oil~~, ~~Frost Oil~~, Sodium Chloride, Corn Oil, Uranium, Carpet, + Firefighting Foam, semen, femcum, tear juice, strange reagent, ~~spraytan~~.' + - balance: Vent Clog smoke emits the same transparent smoke as a smoke machine, + including how much it transfers. Vent Clogs also do not trigger in areas deemed + "Safe" in code, such as in the dorms or trusted areas where dangerous things + shouldn't occur. + - rscadd: Adds additional random brain damage text + - rscadd: Adds penis enlargement pills. + - rscadd: Adds Stun Circuit and Pneumatic Cannon Integrated Circuits + - bugfix: Fixed extinguisher and smoke circuits not accepting any reagents. + - rscadd: Adds a few important clockcult tips. + - rscadd: Added Mech Sensors, a brass-created trap that activates when a mech not + controlled by a cultist crosses it. + - rscadd: Added power nullifiers, an emp trap that emps everything in a 3x3 area, + with the center suffering a heavy EMP. + - tweak: Brass Skewers now deal 50 damage to mechs. + - balance: Ass slapping only works if you're actually behind the target. Ass slapping + now respects disarm blocking. You can no longer face/ass slap someone on an + intent other than help, unless they are also face/ass slapping. + - bugfix: Fixed ass and face slapping grammar. + - rscadd: Adds meh effects for ass and face slapping. + - tweak: '"Unwillingly" eating food now sends a warning message instead of a notice. + Unable to stuff food down your throat sends a danger message instead of a warning + message.' + - rscadd: Adds clockwork reflectors, a fragile anti-laser reflection shield object + that can be constructed for 10 brass sheets. Upon firing on the object in the + direction where it is shielded, it ricochets the bullet off of it relative to + the shooting angle. + - tweak: Renames some windows in the build menu for consistency. + - balance: Clockwork Cult walls can no longer be deconstructed by RCDs when heated. + - rscadd: Adds several new toy loot to the arcade machine. + - balance: Rebalanced the arcade machine loot. Battlemachines now have a 0.5 second + delay instead of a second delay between actions. + - bugfix: Fixed a bug that would not allow the one in a million pulse rifle to spawn. + - rscadd: Adds a new trait "Buns of Steel" that makes you immune to the effects + of ass slapping, and temporarily makes the user's arm useless like a stun baton + hit. It costs 0 points. + - balance: Ass slapping blowback from the Buns of Steel perk now deals 20 stamina + damage instead of 50, and no brute damage. + - rscadd: Gamemode voting results are displayed at the end-round screen. + - balance: Cloning no longer gives you positive mutations, but a chance for a negative + one. Cloning has a chance to "scramble" your visual DNA. + - balance: Chestbursters no longer give and remove your brain. They just disembowel + and kill you now. + - bugfix: Fixes WarOps miscalculating players. + - balance: Activating the nuclear device during war-ops informs the crew of the + nuke's position. + - rscadd: The alert level is displayed at the job selection screen. + - balance: Central Command informs you when a Meteor Storm is about to hit 5 to + 10 minutes before it happens. + BurgerLUA: + - code_imp: Added a new framework for reagents. Reagents can now have a bool that + determines if it can be detected by handheld medical analyzers. Currently only + the changeling sting chemical does this. + - balance: Made changeling transformation string last between 10-15 minutes. Lowered + the dna cost of changeling sting from 3 dna to 2 dna. Lowered the chemical cost + from 50 to 10. Lowered the loudness from 2 to 1. Changeling sting transformation + can be removed via high doses of calomel. + - bugfix: Fixed most reagents having a placeholder color. + - bugfix: Fixed autolathe wires not correctly shocking you when pulsed. + - balance: Rebalanced special jetpacks. + CalamaBanana: + - rscadd: Added Deer taur + - rscadd: Added Elf ears to mammals + CameronWoof: + - rscadd: Medihounds now have rollerbeds for non-vore patient transport + - bugfix: The closed O2 crate now uses the same color scheme as the open one + - tweak: air alarms are green now instead of blue when the atmosphere is ideal + - tweak: Hexacrocin overdose no longer causes climaxes + - tweak: Altered the icons for inventory backplates. Sleek! Stylish! New! + - bugfix: Attaching a beaker that contains water to an IV stand no longer causes + a visual glitch + - tweak: Fluid-producing sexual organs no longer start full + - tweak: Sexual organ fluid capacity decreased from 50 to 15 + - tweak: Sexual organ production rate decreased from 5u to 0.035u per two seconds. + - tweak: Sexual fluid decals no longer contain reagents + - tweak: Sexual fluids cannot by synthesized (e.g., by the Odysseus) + CdrCross: + - rscadd: Adds the ability for cloning consoles to read and write record lists to + the circuit board, and provides a template for giving other machines local circuit + board memory. + Cebutris: + - rscadd: Hugs of the North Star! Get them from the arcades (if you're lucky) and + hug your friends at INCREDIBLE hihg speeds! + - bugfix: Tea Aspera now properly contains tea powder + - tweak: Breasts no longer lactate by default, lactation is now a preference + Chayse: + - tweak: Changed the Warden's compact combat shotgun to instead be a regular combat + shotgun with a foldable stock and penalties for being folded. + - rscadd: Assorted space-worthy helmets can now act as masks for internals. + - refactor: Internals code can now check any item with the ALLOWSINTERNALS flag + through the GET_INTERNAL_SLOTS define. For now this only checks head and mask + slots, since those are the most realistically speaking usable ones. + - tweak: Medbay doors can now be opened by anyone from the inside without having + to press the exit button. + - bugfix: Borgs now have the necessary dexterity to unbuckle people from themselves + and from bucklable objects. + - bugfix: Fixes the Trek Uniform/Suit worn icons + - bugfix: AIs can now once more talk through holopads successfully + Code-Cygnet: + - rscadd: Added new things - Mind trait, alcohol reagent, chemical reagent, drink + sprite and recipe. + - imageadd: added commander_and_chief sprite to drinks.dmi + Coolgat3: + - tweak: Changed player number checks to 20 from 24 for cult and clockcult, also + made nukeops 28 required players instead of 30. + - tweak: Changed enemy minimum age from 14 to 7 + - rscadd: Added the code for the semen donut and made it craftable + - imageadd: Added the donut sprites + - bugfix: Made the sec and warden berret offer as much protection like the helmet + - rscadd: Added berets for all the heads. + - imageadd: Added sprites for the berets. + - code_imp: Coded the berets to spawn in appropiate lockers. + - tweak: Raised the ripley's movement speed and lights range by 1, also lowered + its armor to compensate. + - rscadd: Added combat gloves sprite + - imageadd: Added said sprite + - imageadd: added combat boots sprite + Coolgat3 / Avunia: + - rscadd: Made kindle put the target into stamcrit, which makes it an actually working, + useful stun. + - rscadd: Added a stamina loss modifier to the vanguard spell which makes the user's + stamina drain at a way slower rate. This doesn't make them immune to tasers, + but it takes a few hits to actually get them to fall down. + - tweak: Made it so that clock culties don't start with a chameleon suit. Instead + they start with an engineer suit which is pretty much the same sprite and looks. + If this is not perfect, then I am willing to make a slightly more brass-colored + version of the engineer suit sprite and call it a ratvarian engineer jumpsuit. + - balance: Increased the cost of vanguard, as it is now a spell that works somewhat + like adrenals, minus the move speed, making your stamina drain really slow and + making you unable to get knocked onto the ground by just a single taser shot. + - balance: Lowered the charge time of kindle, reason being that you can usually + have only one active spell on you, or two at max if you decide to run two slabs, + but the fact that kindle silences people for such a small amount of time makes + up for it, in my opinion. + - server: Figured out that the consoles and their warp function actually work with + the current code. The thing that makes them not work is when the gamemode is + ran on debug mode, without the required players to actually support it. It also + breaks the ark timer which is stuck on -1 seconds until activation. Whenever + the gamemode starts properly, like any other gamemode, with player checks and + all, everything seems to work just fine. + CydiaButt13: + - rscadd: Lamp Plushie to loadout + - imageadd: added plushie_lamp to plush icons + - code_imp: added Lamp Plush to loadout and icons and items + EgoSumStultus: + - bugfix: Fixed blood chiller's inhand + - bugfix: FIXED SHIELF + - bugfix: fixed magpistol magazine sprites + - rscadd: Added the Femur Breaker + - rscadd: Adds male AI vox. + EmeraldSundisk: + - rscadd: Adds a gun range to Box Station + - rscadd: Provides some extra power grid connections + - rscdel: Sunglasses and Earmuffs removed from the Warden's Office - they can be + found at the range instead + - tweak: Rearranges a few objects within the prison as to accommodate the new gun + range + - rscadd: Adds a mass driver to Delta Station's chapel + - rscadd: Adds a second means of entry into the chapel + - tweak: Slightly expands the chapel to make room for the driver, slight adjustment + to air systems + - tweak: Clears a path in the station exterior for the mass driver to work properly + - tweak: Nearby maintenance loot has been relocated to accommodate the chapel expansion, + surrounding area has been "cleaned up" somewhat + - tweak: CentCom has noticed the lack of coffins in Delta Station's chapel and provided + some, but in exchange for reducing the chapel morgue's capacity. + - tweak: Fixed a maintenance door the chaplain should have been able to open. + - bugfix: 'Fixes space areas outside the driver removal: CentCom Defense Analysts + have ordered the maintenance hatch to the Mass Driver room be removed citing + "security concerns".' + - rscadd: Increases the number of plots to 9 (from 5) + - rscadd: Additional lighting placed directly outside the garden + - tweak: Cleans up the area to reflect use. Moves the seed extractor to a more central + location + - tweak: 'Relocates the seed packs on botany''s counter to the garden removal: Removes + wooden barricades outside the garden' + - config: Renames "Abandoned Garden" area designation to "Maintenance Garden", but + does not replace the icon in Dream Maker + - rscadd: Expands the chapel mass driver room to make it easier to use + - rscadd: Rearranges the chapel backroom so there are now six coffins and burial + garments roundstart + - tweak: Cleans up the Janitor's office + - tweak: Readjusts the station exterior so mass-driven coffins (hopefully) have + less friction + - bugfix: Adds a fan to the chapel driver + - bugfix: The Janitor missed a few spots around the newly renovated Maintenance + Garden + - bugfix: Readjusts positioning of Delta's QM keycard device + - bugfix: 'Cleaned up a few spots I missed in #9356, particularly around the janitor''s + office' + - rscadd: Adds some potted plants around Box Station + - bugfix: 'The tile mentioned in #9409 should now be radiation-free.' + Fermi: + - bugfix: Fixes tiny runaway decimals in reagents system. + - bugfix: 'SDGF: Fixes infinite clones.' + - bugfix: fixed an angery PR + Fermis: + - rscadd: Added a panda simplemob + - bugfix: fixes empathy exploit. + - rscadd: Added the secbat, a box to hold it and the ability to dispense it from + the SecTech vendor. + - rscadd: Adds 3 new music tracks. + - tweak: tweaked Neurotoxin + - balance: added more depth to Neurotoxin + - bugfix: fixed the inability to create Neurotoxin + - bugfix: fixes fermichem reactions for tiny volumes work + - tweak: makes quantisation level for chemistry finer + - tweak: re-enables femichem explosions in grenades. + - tweak: adds nuance to the SDGF and hatmium explosions. + - bugfix: Fixes analyse function on ChemMasters to correctly display purity. + - bugfix: Fixes the custom transfer for buffer to beaker button. + - rscadd: 'Debug option: Generate Wikichems' + - rscadd: graft synthtissue surgery, new reagent synthtissue + - tweak: 'neurine fixes brain objs merge: combines fermichem''s lung damage with + tg''s' + - rscadd: on_mob_dead(), bitflags and CHECK_MULTIPLE_BITFIELDS + - refactor: refactored fermichem vars, moved impure chems into their own reagents + subtype + - bugfix: Fixes small residues of chems that won't go away! + - tweak: tweaked beaker health and allows use of syringes/droppers on chem_heaters + - soundadd: added a sound for when beakers take temperature damage. + - imageadd: added some icons for melting beakers + - refactor: refactored how beakers take damage + - bugfix: fixes how beakers would only take one instance of damage on pH damage + - bugfix: fixes Janitor grenades. + - bugfix: fixes reaction mechanics at low volumes + - bugfix: stops reactions constantly bubbling on the edge of reaction temperature + - bugfix: stops small amount reactions from occurring, and prevents disappearing + tiny numbers + - tweak: Reduced minimum reaction volume from 1 to 0.01 + - refactor: cleaned up Fermichem + - rscadd: Adds Jacqueline the Pumpqueen and her familiar Bartholomew for the spooky + season + - soundadd: Adds a giggle + - imageadd: 'Adds cauldron, Jacq and Jacq o lanterns, and a costume for halloween! + mapedit: adds a new landmark so Bartholomew can spawn somewhere sensible.' + - bugfix: fixes food reactions and explosion runtimes, + - bugfix: fixes the too much yes problem + - bugfix: Heart, Tongue and stomach regen. + - bugfix: lung damage threshholds. + - bugfix: Graft synthtissue + - bugfix: Skeleton's burning for no reason + - bugfix: Organ freezing handling. + - bugfix: Fixes chemistry books to point to the right wiki, and keeps tg's just + in case + - tweak: Changes top right wiki button location to go to both wikis + - bugfix: fixed Jacq's fondness for the AI + Ghom: + - code_imp: minor clean up on hydroponics reagent containers. + - bugfix: fixes the perpetual lack of moisture that has affected genitalia descriptions + since, like, forever. + - rscadd: implements the arousal state for mammary glands. + Ghommie: + - bugfix: Fixes many possible situations of null icons for cit races' bodyparts. + - imagedel: Removes duplicate slimepeople' sprites. + - code_imp: Purges that draw_citadel_parts(). + - code_imp: Fixes ISINRANGE_EX using the wrong relational operator. + - tweak: The kindle status effect stun duration now properly proportional to the + owner's remaining health. + - tweak: Clockwork cult's kindle now affects silicons. + - tweak: Cyborg mounted disablers/tasers/lasers now slowly self-recharge off the + cyborg user's power cell instead of draining from it directly. + - tweak: Borg rechargers now properly recharge the borg module's energy guns. + - bugfix: Prevents a couple more special/mounted guns from being preserved on cryo + - balance: Halved borg energy guns self-recharge delay and increased their cell + capacity by 3/4 + - bugfix: Fixes chemical patches always checking the suit slot even if the targetted + limb was the head. + - bugfix: Skeleton, nightmare and golem races are once again available to get chemical + patches applied onto. + - rscadd: Adds two cartons of space milk to the space skellie pirates cutter's fridge. + - refactor: Refactored implants to not be located inside mobs codewise, akin to + organs. + - bugfix: Fixed gps tracking implants. + - bugfix: Fixed item not being dumped out of storage implants onto the owner's turf + upon removal. + - bugfix: Fixes cult potentially stalling if the target is erased from existence + without being sacced. + - balance: Nukes the stunprod's 3 seconds delay. + - bugfix: Fixes teleprods. + - bugfix: Stops pulls of resting mobs breaking off whenever you swap turfs with + someone else because of crawling delays. + - bugfix: fixes IAA. + - balance: EMPs now flick off stunbatons, they can be turned back on immediately + by the user anyway. + - balance: Stunbatons now very slowly consume charge whilst kept on, at a rate of + 4/1000th of a standard batoning charge cost per tick. + - balance: Softened up the charge cost checks to stop the above update from practically + reducing the maximum uses of a stun baton by one. Now, should the remaining + charge be lower than the hit cost, the resulting stun will be be proportional + to the remaining charge divided by the hitcost, within a limit under which the + stun batoning just won't happen. + - balance: Buffs condensed capsaicin, a yet another feature previously dunked by + stam combat. + - balance: speeds up pepper spray puffs. + - balance: Buffed krav maga leg sweep stun and stamina damage. On the other hand, + it's now unable to be used on already lying targets. + - bugfix: fixes eyestabbing people with cutlery while being a pacifist. + - bugfix: Reduces goonchat lag from being blasted by pellets and bullets repeatedly + whilst wearing armor by properly removing the armor protection texts this times. + - spellcheck: also reduced the size of armor protection messages in general. they + clog up the chat box. + - bugfix: Fixes stunbatons icon not properly updating on cell removal and insertion. + - tweak: Allows lower charge cells to be used with stun batons, and thus single + use crapshots batons. + - balance: Adds in a 7 seconds delay to the jackhammer dismantling a superheated + clockwork wall. + - tweak: escape pods emergency suits storage can now be busted open by emags or + excessive damage. + - bugfix: Fixes alt click bypassing the escape pods' suits storage lock. + - bugfix: Fixes emags wasting charges on un-emaggable & co stuff. + - code_imp: Ported some radials code updates. + - rscadd: Ported the RCL wiring menu and a comfier RCD interface. + - tweak: A milder combat stance message will show up if the user switch combat mode + on while on help intent. + - spellcheck: Properly rewords the extinguisher's instructions on how to empty it + on the floor since it was changed to be a screwdriver action instead of Alt + Click a while ago. + - rscadd: Reskinnable PDAs. A related game preference. + - refactor: Refactoring the pda, pda painter, obj reskinning and chameleon pda a + bit to support this feature. + - imageadd: more PDA sprites and ported reskins. + - refactor: turned virtual reality into a component datum, which is then applied + to spawned virtual mobs. This fixes mob transformations (such as wabbajack and + monkeyizing) breaking the previously hardcoded behaviour and trapping you in + VR, also enabling a more concrete virtual reality inception experience. + - bugfix: Fixes power cells being unable to be rigged. Also prevents them from starting + processing on init if they don't self recharge. + - bugfix: Fixes many, little or otherwise, issues with the stunbaton status refactor. + - bugfix: The sacrificial target icon will now display onto the cult objective ui + alert once again. + - bugfix: Stopping borgs from sprinting into negative cell charge. + - tweak: The default amount of z-levels reserved specifically for space ruin generation + has been increased from 1 to 2 + - tweak: 'Moving some tablecrafting recipes to the appropriate categories: Kitty + ears and lizard cloche hats to "clothing"; Hot dogs to "Sandwichs"; Cuban carb, + fish and chips and fish fingers to "Fish".' + - bugfix: Fixes the not-a-sandwich recipe being M.I.A. + - rscadd: Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, + and the PB&J sandwich. The peanuts contain a little bit of extractable cooking + oil (similarly to soy beans) and can be microwaved or dried in a drying rack + to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut + butter, required to make those sandwiches. + - balance: Buffed wizard and artificier's Magic Missile, wizard and xeno queen's + Repulse and juggernaut's Gauntlet Echo. + - bugfix: Fixes flashlights being unable to be used for rudimentary eyes and mouth + exams. + - rscadd: Adds in a grey jumpsuit to the loadout choices, restricted to Assistants. + - bugfix: Fixes CWC construct shells being visible as ghost role to latejoiners. + - imageadd: new sprites for the flechette gun, its magazines and the toy ray gun + - tweak: Merges the end-of-shift and its shuttle autocall announcements into one. + - bugfix: Prevents the end-of-shift shuttle from being recalled (even if to no avail). + - bugfix: Fixes being able to teleport papers to your location with TK. + - bugfix: Fixed some monkey-code shenanigeans making items sometimes disappear from + pickpocketing. + - imageadd: New sprites for the some pda cartridges. + - tweak: The crew monitor's entry for the Quartermaster will now appear bolded, + while HoP's will be of the same color of the service/unknown/other jobs. + - bugfix: emergency pods' storage will now properly work. + - bugfix: The PDA skin preference will now properly save up. + - tweak: Changed the default PDA icon var to match the default PDA skin preference. + - bugfix: Fixing the `(pointless) badassary` category appearing between the `dangerous + and conspicious` and `stealthy and inconspicious` categories. + - bugfix: Combat gloves plus now properly use the combat gloves sprite. + - bugfix: Fixes the space ninja's energy netting. + - rscadd: Adding one pAI to the wizard shuttle and ERT prep room + - bugfix: Fixes the rocket launcher being unreloadable. + - balance: Buffed its accuracy a bit. + - tweak: Replaced the grenade launcher emagged minesweeper loot with the rocket + launcher like it was originally supposed to be. + - imageadd: 'Tweaked the :b: emoji.' + - rscadd: Rubber Toolboxes. + - rscadd: 'Porting in two bar signs: Cyber Sylph''s and Meow Mix.' + - bugfix: Fixing stamina damage melee weaponry being unusable by pacifists, and + still damaging objects and triggering electrified grilles when thrown. + - refactor: refactored underwears to allow custom color preferences, instead of + manually colored sprites. + - rscdel: The aforementioned manually colored pieces. Some of your char preferences + may have been resetted as result. + - rscadd: 'More underwear choices, including: Bowling shirts, long johns, a tank + top, fishnets, more bee socks, bee t-shirt and bee boxers (original PR for the + latter three by nemvar from /tg/station).' + - tweak: random bodies will now have random underwear again. + - bugfix: Dressers will now properly change undergarment again. + - tweak: Toned down many species' female chest sprites to fit the smaller cups. + - bugfix: Fixed some body parts sprites inconsistencies, such as the W/E female + and male chest sprites being the same in some species, and jellypeople's legs + being one tile off on W/E + - bugfix: Fixing baklava pies a bit. + - tweak: Sweaters now cover groins too. + - balance: Improved the zelus flask to be more viable for bottle smashing than the + average barman's selection. + - code_imp: Very slight bottle smashing code clean up, stupid const vars. + - bugfix: Fixes krav maga gloves, wizard spells knockdowns. + - tweak: Added in an alert pop up to the cult convertees, on top of the older "click + here to become a blood cultist" chat message. + - tweak: The convertee's screen will now flash red to fit in the aforementioned + message's fluff. + - spellcheck: Made said message less verbose. + - rscadd: Towels. Crafted with 3 sheets of cloth, they can be worn on head, suit + and belt slots even without uniform, or laid flat on the floor. Sprites from + Baystation and Aurora Station. + - rscadd: You can combat mode right click people while wielding rags and towels + to pat out their flames (to no use for rags) or otherwise drying them out. + - balance: toned down the stamina costs of some of the bulkier weapons. + - code_imp: repathed hypereutactic blades to be a subtype of dual sabers. Way less + copypasta. + - bugfix: Fixing CX Shredder guns not accepting standard flechette mags. + - bugfix: Fixing missing magpistol magazines icon states. + - rscadd: sort of overhauled darkmode/lightmode to /vg/station's, also reincluding + the pre-existing black'n'white theme. + - bugfix: Fixed LOOC color, fixed .userlove and .love span classes being a bit too + blurry on dark mode. + - rscadd: The syndicate base's bathroom is now fitted with a shower, and a special + towel. + - bugfix: Fixed many issues with towels. + - tweak: The dry people off with rags/towels action can only be done if the object + is NOT moist with reagents now. Also cleans banana creaming. + - rscadd: Towels deal more damage while soaked with reagents. + - rscadd: You can now squeeze rags/towels with Alt-Click. + - rscdel: deleted an old and crappier towel sprite that got in the way. + - bugfix: Fixes Pubby's disposal conveyor belts and lack of a second lawyer spawner. + - code_imp: Cleaned up the absolute state of the arousal module. + - refactor: refactored exhibitionism into a quirk. + - tweak: arousal states won't persist after death. + - bugfix: Fixes testicles size adjective thing. + - bugfix: undergarments toggling now works instead of just making underwear disappear + and not come back. + - tweak: The "Always visible" genitals setting will now display them above clothes. + - bugfix: combat pushes will now properly stop targets from using firearms, and + will disarm the firearm if performed a second time, and also slow down people + by 15%, and won't push people on tables blocked by shutters or other dense object + anymore. + - bugfix: Fixes CHECK_BITFIELD macro. + - bugfix: Fixes hypovials being unable to transfer out liquids or be refilled by + large dispensers like water tanks. + - bugfix: Fixes chem-masters machineries not dispensing newly made pills inside + loaded in pill bottles. + - rscadd: Stunswords now fit in the captain's sabre sheat. + - rscadd: reworked ninja's stealth mode. Increased invisibility, but engaging in + combat, attacking or throwing things, bumping people will temporarily lower + it. + - rscadd: Ninja shoes are even stealthier. + - code_imp: cleaned up some 2014 tier processing code horror. + - tweak: the oxyloss fullscreen overlays now also take in consideration 1/5 of the + user stamina loss. + - rscadd: When you're jogging, you will only slip on water if you have more than + 20% staminaloss, for real this time. + - imageadd: Different cuffs now come with different worn overlays instead of a generic + one. + - bugfix: High luminosity eyes can now be properly deactivated and won't illuminate + your surroundings again until turned back on. + - bugfix: Fixes freshly cloned people starting with undershirts. Fixes random characters + possibly rolling with undergarments of the opposite gender (Doesn't affect preferences' + freedom of choice). + - balance: MRE menu 3 has cuban nachos instead of a chili now. + - bugfix: Removed the illustration overlay from MREs, looks pretty weird otherwise. + - rscadd: MRE menu 4, vegetarian. + - bugfix: fixes a few bad touchs on combat mode pushing. + - bugfix: Fixes clock cult Abscond scripture not dragging pulled mobs into Reebe. + Also fixes blood cult tele runes teleporting you from the source turf to the + source turf. + - bugfix: fixes clock cult mass recall. + - bugfix: Fixes underwear colors a bit. + - bugfix: Fixes Blood Cult conversion prompts + - rscdel: Removes an obnoxious temporary overlay var. + - bugfix: colorable socks can be colored again. + - bugfix: Fixed undergarments color preferences resetting each round. + - bugfix: Fixed a few dozen suits' body coverage inconsistencies. These changes + shouldn't affect armor and utility vests for most. + - bugfix: Fixed clown shoes and work boots. + - bugfix: Fixed some overlay bug that happens when legcuffed and then handcuffed. + - balance: Slowed down police baton and tele baton speed by 75%, should be still + be faster than the legacy speed (2 seconds) by 0.6 seconds. Telescopic batons' + stamina cost per swing is now on par with police batons, ergo more expensive. + - bugfix: Fixed undershirts n socks colors prefs. + - bugfix: You can now alt-click to rotate machinery such as the tachyon-droppler + array or emitters again. + - bugfix: Sofas can't be wielded and transformed back into plain chairs anymore. + - rscadd: Enables emojis for PDA messages. + - balance: Removes revenant blight's shabby toxin damage in favor of mood maluses, + and a dangerous necropolis curse if not cured in time. Remember + - tweak: Blood cult altar, forge and archives now use radial menus. + - bugfix: Fixed some machineries' UIs. + - tweak: blood and clock cultists messages from metabolizing + - bugfix: Fixed advanced medical scanners borg upgrades. + - bugfix: Fixes certain borg upgrades being unapplicable on dogborg counterparts + of the target cyborg type. + - bugfix: Fixed people being shovable hrough windows, windoors and the such. + - rscadd: You can now shove people into disposal bins. + - refactor: refactored altdisarm(), ergo the "shoving people around" proc. + - tweak: war ops is now lowpop friendly and doesn't require roughly 54 starting + players anymore. + - rscadd: Singularity beacons now also moderately increases the odds meteor waves, + while lowering their estimeed arrival countdown. + - bugfix: non-alphanumeric graffiti decals will no longer display as "letter". + - balance: Nerfs cyborg disabler and its internal power cell to hold 25 disabler + beam shots rather than 43/44, just like a normal disabler. + - bugfix: Adds some missing species_traits for cloth, clockwork and cult golems. + - rscadd: Added towel linen bins, found in dormitory restrooms. Also enhanced the + bedsheet bins found in some stations' dormitories + - imageadd: Resprited bedsheet bins in 3/4 perspective + - tweak: Made SDGF ghost poll message less verbose, made the experimental cloner's + complaint with the former, and added ghost poll ignore options for both. + - bugfix: fixing some related onmob sprites issues with the above accessory. + - bugfix: Teleprods work on non-carbons mobs now. + - bugfix: Fixed tracking implant teleport issues. + - balance: Increased stunbatons power cell depletion rate when left on by 50%. + - bugfix: Gorlex Marauders are pleased to announce non-slip grooves were given to + their .50 sniper rifles, and thus shouldn't accidentally flop on the floor like + pocket spaghettis whenever taken out of a bag anymore. + - bugfix: Silicons can now operate teleporter, medical and security records console + from a distance again. + - bugfix: Fixed custom say emotes conflict with drunk memes. + - bugfix: Fixes identity transfer (envy knife, changeling transformation, making + a vr avatar) not copying digitigrade legs. + - bugfix: Fixes temporary transformation sting triggering heart attacks on heartless + humans. + - bugfix: Fixed mobs folded inside bluespace bodybags getting their clothing and + items deleted when passing through a recycler. + - bugfix: The alien-bursting-from-your-thorax and the xeno "hud" embryo stage images + will now properly delete them once the embryo egg lifecycle is complete. + - bugfix: Fixed artificier lesser magic missile. + - bugfix: Phantom thief masks will now fancy your combat mode yet again. + - bugfix: Fixed gulag teleporter stripping the user of stuff it really shouldn't + (like storage implant bags). + - bugfix: fixing cydonian armor a bit. + - imageadd: Resprited wooden and critter crates. + - imageadd: Improved the Cyber Sylph' good yet cumbersome bar sign a little. + - bugfix: Cyborgs can now use camera consoles on the edge of their widescreen. These + consoles are also TK friendly now. + - imageadd: Updated gang dominator sprites. + - bugfix: Miner borgs can again have installed PKA mods. + - bugfix: Fixed invisible blackberry n strawberry chocolate cake slices. + - bugfix: Nuke ops / adminbus combat mechs will no longer spawn with tracking beacons. + - imageadd: Arcade machine directional sprites. + - tweak: 'lowered the arcade''s random plush / other prizes ratio from 1 : 2.5 circa + to 1 : 5. Dehydratated carps and the awakened plush can not be achieved this + way anymore.' + - imageadd: Added armrests overlays to sofas and tweaked their sprites a little. + - bugfix: Fixed dogborg sleepers. Just don't tell me what is exactly fixed, cause + I don't want to find out. + - bugfix: Buffed the deep space familiar gorilla against runtimes. + - imageadd: Updated ratvarian computer sprites. + - bugfix: Fixed storage implant transplant. + - bugfix: Refactored how Jacqueen teleportation destination is selected, preventing + them from teleporting on off-station holopads. + Ghommie && Kevinz000: + - balance: Lichdom and necromantic stone skeletons are now of the spaceproof kind + too. + - tweak: skeletons now also like dairy products. + - rscdel: Halloween roundstart skeletons and zombies are no more spaceproof. + - rscadd: You can choose to set your species to zombie or skeleton through the pride + mirror yet again, Alas they are not of the spaceproof kind either. + Ghommie (Credits to Kmc2000 for the original PR): + - rscadd: Porting in MRE boxes from Yogstation. But be careful, eating possibly + expired MREs found in maintenance comes with an unrealistically large (actually + small) chance of food poisoning. Otherwise just bail out and order actually + safe-to-eat MREs from cargo for 2000 credits. + Ghommie (Original PR by Dennok): + - bugfix: Now areas_in_z get areas spawned by templates and blueprints. + Ghommie (Original PR by Dreamweaver): + - rscadd: Nanotrasen has received word of a high-tech research facility that may + contain advancements in bluespace-based research. Any crew members who become + aware of its whereabouts are to report it to CentCom immediately and are restricted + from sharing said info. + - refactor: The turf reservation system now dynamically creates new z levels if + the current reserved levels are full. + Ghommie (Original PR by JJRcop): + - rscadd: 'Ports in more emojis, including : flushed :' + Ghommie (Original PR by LaKiller8): + - bugfix: Goonchat options should now save properly. + Ghommie (Original PR by Vile Beggar): + - rscadd: Warden now has an added drill hat in his locker. You can change the loudness + setting of it by using a screwdriver on it. Use wirecutters on it for a surprise. + Ghommie (Original PR by coiax): + - refactor: atom/var/container_type has been moved into datum/reagents/var/reagents_holder_flags. + There should be no visible changes to effects. + Ghommie (Original PR by nemvar): + - rscadd: Botanists can now get beeplushies (or cultivator and bucket) as an heirloom. + - bugfix: Clowns and mimes will now properly pick either a can of paint or their + brand as heirloom now. + Ghommie (Original PR by tralezab): + - bugfix: Fixes an issue with spontaneous appendicitis picking incompatible mob + biotypes. + Ghommie (Original PRs by Tortellini Tony and BuffEngineering): + - bugfix: E-cigs will continue to display their setting after being emagged. + - bugfix: Vapes now come out of the mouth. fix Fixes an E-cig initialize() runtime. + Ghommie (Original PRs by nemvar and Rowell): + - rscadd: Added beekini bras and panties, thigh-high and knee-high bee socks. + Ghommie (by Arkatos): + - bugfix: Fixed an issue with a Lizardwine drink crafting, where a final product + would contain unwated 100u of Ethanol. + Ghommie (by Floyd / Qustinnus, Arathian): + - rscadd: The robotocist now has robe to show his love for toasters + Ghommie (by nemvar): + - tweak: Dwarfs are now more robust. + Ghommie (original PR by 4dplanner): + - bugfix: thrown objects (but not mobs) no longer hit the thrower + - bugfix: mirror shield rebound no longer depends on the original thrower's momentum + Ghommie (original PR by 81Denton, kriskog and nemvar): + - spellcheck: Sleepers now show a message if players try to unscrew the maintenance + hatch while they're occupied or open. Fixed typos in sleeper/organ harvester + messages. + - tweak: Sleepers and dna scanners can now be pried open with crowbars. + - tweak: You can open and close sleepers and dna scanners by alt-clicking them. + - bugfix: The scanner's hatch now must be closed (on top of being unoccupied), just + like sleepers, before being screwdriverable. This fixes a tricky door stuck + issue with the machine. + Ghommie (original PR by AffectedArc07 and Shazbot): + - imageadd: Added 8 new sock styles + Ghommie (original PR by AffectedArc07): + - tweak: Religion is now a globalvar instead of being a subsystem for some reason + Ghommie (original PR by AnturK): + - bugfix: Supermatter now melt walls if it finds itself in one. + Ghommie (original PR by Anturk): + - rscadd: Recipe for fabled secret sauce can now be found in the deepest reaches + of space. + Ghommie (original PR by Barhandar: + - bugfix: Pumpkin meteors on Halloween now replace catastrophic meteor waves, instead + of ALL OF THEM. + Ghommie (original PR by CrazyClown12): + - tweak: The chloral hydrate inside of the sleepy pen is no longer slower acting + than chloral hydrate made in chemistry. + - tweak: The chloral hydrate inside of cookies synthesised by emagged borgs is no + longer slower acting than chloral hydrate made in chemistry. + - balance: Slight tirizene buff. + - rscdel: Delayed chloral hydrate + Ghommie (original PR by Denton): + - tweak: Nanotrasen has started shipping more types of bedsheets to its stations. + - rscadd: Added in Runtime, Pirate and Gondola bedsheets. The second one can also + be found in some pirate ships, while the last can be crafted from gondola hides. + - balance: You can no longer reveal the 'illegal tech' research node by deconstructing + .357 speedloaders, riot dart boxes, syndicate cigarettes, syndicate playing + cards or syndicate balloons. + Ghommie (original PR by Mickyan): + - bugfix: Fixed being unable to smother people using the damp rag + Ghommie (original PR by MrDoomBringer): + - bugfix: morgues have had their proton packs removed and as such no longer suck + in ghosts on closing. + Ghommie (original PR by MrDoomBringer, AnturK and YPOQ): + - bugfix: Explosions will no longer damage wizards in rod form, the supermatter + monitoring radio and megafauna GPS. + - bugfix: Supplypods no longer detonate their contents. + - bugfix: Fixed silicon items (e.g. cyborg modules) being destroyed by explosion + epicenters. + Ghommie (original PR by Naksu): + - code_imp: get_area() is now a define rather than a proc. + Ghommie (original PR by Nicjh): + - rscadd: Abductor console's select disguise option now uses a radial + Ghommie (original PR by ShizCalev): + - bugfix: Pineapple haters/lovers will get/no longer get pineapple pizzas respectively + from infinite pizza boxes. + - bugfix: As a non-human mob, hovering your cursor over an inventory slot while + holding an object in your active hand shouldn't runtime now. + Ghommie (original PR by Skoglol): + - code_imp: New helper proc for alt-click turf listing, bypasses any interaction + overrides. + - code_imp: Ghosts and revenants now use the new proc. + - bugfix: Ghosts can no longer toggleopen sleepers, adjust skateboard speed or close + laptops + - bugfix: Revenant can now alt-click turf to list contents. + - tweak: Revenant now slightly less nosy, use shift click to examine. + - tweak: Alt-clicking the same turf again no longer closes the turf listing tab. + - bugfix: Reduced ventcrawl lag greatly. + - bugfix: Mining bags will no longer drop ore into backpack. + - bugfix: Mining bags in backpack no longer interferes with other mining bags. + - bugfix: Fixes some storage size circumventions. + - tweak: Moved machine and computer frames below objects, parts are now always on + top. + - tweak: Moved structures (chairs, closets, windows, cult altars etc etc) below + objects. + - tweak: Moves mineral doors to airlock layers + - tweak: morgue/crematorium trays' layers shouldn't overlap bodybags' anymore. + Ghommie (original PR by SpaceManiac): + - bugfix: Disassembling a chem dispenser for the first time will no longer always + yield a fully-charged cell. + Ghommie (original PR by Swindly): + - rscadd: Arm-mounted implants that contain more than one item use a radial menu + instead of a list menu. + Ghommie (original PR by Tlaltecuhtli): + - bugfix: Other people's clothes burning no longer spam you + Ghommie (original PR by XDTM): + - bugfix: Reagents now stop their passive effects (for example, stun immunity) if + the liver stops working while they're active. + Ghommie (original PR by YPOQ): + - bugfix: Fixing roffle waffle, mushroom halluginogen and some invalid reagents. + - bugfix: Fixes clockwork armor not actually having armor. + Ghommie (original PR by cacogen): + - rscadd: The font size of all text in the chat window now scales + - tweak: High volume (megaphone/head of staff headset) is a slightly smaller + - tweak: Admins have slightly larger OOC text + Ghommie (original PR by coiax): + - code_imp: Randomly coloured gloves and randomly coloured glowsticks now have slightly + different typepaths, but otherwise function the same. + - code_imp: The Squeak subsystem has been renamed to Minor Mapping. + Ghommie (original PR by duckay): + - rscadd: Added better names and descriptions for blueshirt officer gear. + - rscadd: Added the above gear to the premium selection of the sectech + Ghommie (original PR by harmonyn): + - balance: Resisting out of bucklecuffs takes more/less time depending on the handcuffs + you used, i.e., fake handcuffs will not bucklecuff someone for ages. + - tweak: fake handcuffs shouldn't no longer demoralize restrained criminals scums. + Ghommie (original PR by monster860): + - bugfix: fixes advanced proccall + Ghommie (original PR by mrhugo13 on tgstation13): + - rscadd: The Syndicate has decided to equip their Syndicate leaders operative (Aswell + as their clown counterparts) with the new Combat Glove Plus! The new Combat + Glove Plus does everything the old boring Combat Gloves does but with the added + extra of learning Krav Maga upon wearing them, any other Syndicate operative + who wants to get in on the action will have to pay 5tc. + Ghommie (original PR by nemvar): + - imageadd: Some drinks have new icons or slightly altered icons. In particular + Wizz Fizz, Bug Spray, Jack Rose, Champagne and Applejack. + Ghommie (original PR by ninjanomnom): + - bugfix: Orbiting is a little more aggressive about staying in orbit. The wisp + as a result now correctly follows you over shuttle moves. + - bugfix: Gaps between sounds in some looping sound effects should no longer happen + as much under heavy server lag. + Ghommie (original PR by variableundefined): + - bugfix: Cancel button to assault pod destination selector. + Ghommie (original PR by wesoda25): + - balance: disembowelment no longer works on mobs that aren't dead or in critical + condition + Ghommie (original PRs by Akrilla, Arkatos and Denton): + - tweak: Sprays cans have a cap on how dark you can make objects. Art is uneffected. + - bugfix: Fixed a bug where you could get cyborg spraycans via pyrite extracts. + - rscadd: Added an infinite spraycan for admins to spawn. + Ghommie (original PRs by Denton and Skoglol): + - tweak: Reorganized the syndicate uplinks. Items are now mostly alphabetical, some + misplaced items moved to more fitting categories. Bundles, random item and TC + have been moved into a new category called "Bundles and Telecrystals". Gloves + of the North Star and Box of Throwing Weapons have been moved to Conspicuous + and Dangerous Weapons. Combat Gloves Plus have been moved to Stealthy and Inconspicuous + Weapons. Moved all implants into the Implants category. + - tweak: 'Added a new category to the uplink: Grenades and Explosives.' + Ghommie (original PRs by Floyd/Qustinnus, optimumtact, Denton and coiax): + - rscadd: You can now select what your pills will look like when making pills from + the Chem Master + - rscadd: Red pills can make you think. + Ghommie (original PRs by Jujumatic and PKPenguin321, respectively): + - rscadd: Minesweeper Arcade machines. The higher the difficulty setting, the better + the prizes will be. + - rscadd: Also keep your eye out for another new (and rare) arcade game! + Ghommie (original PRs by Kmc2000 and actioninja): + - rscadd: Added darkmode! You can opt-in to this by clicking the new toggle darkmode + button just beside the settings one. + - rscadd: Byond members will now have a new setting for their Antag OOC color, instead + of using their OOC one. (Antag OOC still locked under admin discretion though) + - rscdel: Default black'n'white windows style. + Ghommie (original PRs by Mickyan, Anturk, ShizCalev, nemvar and Naksu): + - rscadd: After rigorous mandatory art training for the crew, many new graffiti + styles are now available + - bugfix: Cleaned up some crayon and spraycan code for futureproofing. + - bugfix: Spraypainting blast doors no longer makes them see-through. + - balance: Paint remover now works on blast doors and the like. + - rscadd: Most objects can now be colored using a spray can. + - spellcheck: Added visible message to spraying objects and windows. + - rscadd: Colored lights now shine in different colours. + - rscdel: Removed individual buttons text in crayon/spraycan UI, speeding it up. + - bugfix: Text mode buffer is actually visible in the UI. + - tweak: Last letter of a text mode buffer no longer rotates out to be replaced + with "a", allowing the text mode to be used for individual symbols. + Ghommie (original PRs by Naksu and XDTM): + - bugfix: Transferring quirks now properly removes the roundstart trait from the + person losing the quirk. + - bugfix: Roundstart traits no longer block the removal of other sources of that + trait. + - code_imp: status traits are now a datum var, the accessors are now defines rather + than functions. + Ghommie (original PRs by Naksu and coiax, loser): + - code_imp: Cleaned up saycode + - bugfix: Taking mutadone while having the communication disorder brain trauma will + no longer spam your chat with messages. + - rscadd: IPCs now come with a subtype of robotic tongue without the omnilingual + ability, instead of innately having robotic voice spans. + Ghommie (original PRs by Nichlas0010 and ShizCalev): + - tweak: AI core display screen can now be set in character preferences. + - bugfix: AI core display screen will now be restore when revived. + - spellcheck: Corrected some inconsistent capitalization in the player preferences + screen. + - imageadd: Readded some forgotten AI sprites. + - bugfix: Fixed Hades AI death animation not playing. + - tweak: the AI icon-selection menu now uses a radial. + - imageadd: Added in the death icon_states for the "TechDemon" AI screen. + Ghommie (original PRs by ShizCalev and bobbahbrown): + - rscadd: Headsets now dynamically show in their description how to speak on any + channels they can use when held or worn. + - code_imp: Radio channels names and keys now use defines. + - tweak: The head arrival announcement will now be broadcast to the supply for the + quartermaster. + Ghommie (original PRs by ShizCalev): + - bugfix: Fixed a bug that allowed you to teleport an ID in your possession to a + PDA anywhere ingame. + - bugfix: Fixed an exploit allowing you to steal ID's/pens from PDA's not in your + possession. + - bugfix: Fixed an exploit allowing you unlimited control of a PDA's interface even + if it wasn't near you/in your possession. + - bugfix: Fixed Pride Mirror exploits. + - tweak: Corgi collars can now be removed! + - tweak: Updated the corgi & parrot inventory panels to use the same formatting + as other mobs + - bugfix: Fixed corgi inventory panels not closing properly. + - bugfix: Fixed the parrot inventory panel not closing properly if you're not able + to interact with it. + Ghommie (original PRs by ShizCalev, MrDoombringer, AnturK, bgobandit, 81Denton and actioninja): + - rscadd: Failsafe codes for uplinks are now available for purchase. + - rscadd: Nuke Ops now have the ability to purchase a usable RPG, the PML-9, as + well as a couple different types of rockets for it. you can also suicide rocket + jump with them! + - spellcheck: Improved Uplink item descriptions and formatting. + Ghommie (original PRs by ShizCalev, coiax and Tlaltecuhtli): + - bugfix: Caks will no longer override the bonus reagents provided in a donut when + frosting them. + - bugfix: Caks can no longer create frosted frosted jelly donuts. + - bugfix: Jelly donuts will no longer lose their vitamins when they're frosted. + - bugfix: Fixed chaos donuts potentially doubling the amount of reagents added when + microwaved with something else. + - bugfix: Donuts now always contain 1 sprinkles as was stated on the wiki. Frosted + donuts have a chance at adding an extra sprinkle. + - code_imp: Improved the code for ensuring that security members enjoy donuts and + security-themed alcoholic drinks. + - balance: neurotoxin doesnt insta stun but gives you limb paralysis overtime and + heart attacks if it stays in for too long and it is also alcholic + - balance: beepsky smash now summons imaginary beepskys that deal stamina damage + instead of outright stunning + Ghommie (original PRs by Time-Green and Qustinnus): + - tweak: loot crates can't explode after unlocking anymore + - bugfix: jumping into loot crates no longers causes them to go boom + - bugfix: You can now deconstruct abandoned crates with a welder without making + them go boom. After unlocking them, of course. + Ghommie (original PRs by Tlaltecuhtli and nicbn): + - rscadd: alt click to eject beakers from chem masters + chem dispensers + grinders + + chem heaters + - rscadd: hit chem master + chem dispenser + chem heaters with a beaker and if its + loaded with another it swaps em + - rscadd: All-In-One Blender UI uses a radial menu now. You can see the contents + and reagents by examining. + Ghommie (original PRs by XDTM, 4dplanner, nemvar and, yes, myself): + - code_imp: Merged tinfoil hat kind of protection into the anti_magic component. + - rscadd: Tinfoil hats can also be warped up from excessive dampening of mindray/though + control/psicotronic anomalies, or by simply being microwaved in an oven, and + become useless. + - rscadd: Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil + protection too (minus the paranoia and limited charges). + - balance: Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil + protection. + Ghommie (original PRs by XDTM, optimumtact, Nichlas0010 and monster860): + - rscadd: 'Added Quantum Keycards, devices that can link to a quantum pad, and can + be used on any other quantum pad to teleport to its linked pad. spellchecking: + Renamed "Bluespace Teleportation Tech" tech node to "Bluespace Travel".' + - tweak: Moved roasting sticks from the "Bluespace Travel" to "Practical Bluespace". + - rscadd: Spraying holy water on tiles will now prevent cult-based teleportation + from using them as a destination point. + - tweak: Quantum, wormhole and magic teleportation is no longer disrupted by bags + of holding. + - bugfix: You are now also blocked from teleporting IN to no-teleport areas, not + just out of them. + - tweak: Quantum teleportation now makes pretty rainbow sparks instead of the normal + ones. + - bugfix: Non-bluespace teleportation (spells etc.) no longer makes sparks. + - bugfix: Fixed teleportation deleting mob spawners like golem shells and ashwalker + eggs. + ? Ghommie (original PRs by carshalash, GranpaWalton, BebeYoshi & Hexmaniacosanna, + Fire Chance, Ordonis, Krysonism and OnlineGirlfriend) + : - tweak: Reduced booze power of Mead, Red Mead, and Irish Cream. + - tweak: Increased booze power of Grappa. + - rscadd: Added a new premium drink to the soda machine called "Grey Bull" which + gives temporary shock resistance + - rscadd: A new drink called Blank Paper was added to the bar menu, it was made + by a mime and it represents a new start. + - rscadd: 'Adds a variety of fine alcoholic beverages for discerning patrons of + the bar: Wizz Fizz, Bug Spray, Champagne, Applejack, Jack Rose, Turbo, Old + Timer, Rubberneck, Duplex, Trappist Beer, Blazaam and Planet Cracker!' + - rscadd: 'Also more nonalcoholic drinks: Cream Soda, Lemonade and Red Queen.' + - rscadd: Packs of a novel artificial sweetener have been added to the kitchen + vendor. + - rscadd: Bottles of trappist beer and champagne are now available in the premium + seection of the booze-o-mat. + - rscadd: Juicing parsnips now yields parsnip juice. + - rscadd: Maintenance peaches. + - bugfix: Grape soda now cools you down like other sodas. + - tweak: tweaked the Arnold Palmer recipe, it now uses lemonade. + - imageadd: Added new drink, bottle, vomit and peach can sprites. + Ghommie (original PRs by grandpawalton and Mickyan): + - tweak: the contents on the smartfridge icon now change depending on how many items + it contains + - bugfix: opening the maintenance panel of smartfridges now correctly updates the + icon + - bugfix: Screwing a disk compartmentalizer no longer makes it look like a smartfridge. + Ghommie (original PRs by nicbn and coiax): + - rscadd: Microwave UI uses a radial menu now. You can see the contents by examining. + - rscadd: Microwaves have a single wire accessible when open, the activation wire. + When cut, the microwave will no longer function, when pulsed, the microwave + will turn on. + - rscadd: Stabilized dark purple extracts now cook items in your hands, rather than + dropping the cooked item on the floor. + Ghommie (original PRs by ninjanomnom and nemvar): + - bugfix: Trays now scatter their contents when used for attacks, like they are + supposed to. + Ghommie (original PRs by ninjanomnom, coiax, yoyobatty): + - bugfix: Fixed slaughter demons not getting a speed boost when exiting a pool of + blood. Fixed slaughter demon giblets not being visible. + Ghommie (original PRs by subject217, AarontheIdiot, pireamaineach, Gousaid67 and SouDescolado): + - balance: Removed plasmamen species speedmod in favor of a slowdown for envirosuits. + - rscadd: Nanotrasen has began deploying departementalized enviro plasmasuits to + the station! plasmamens can now benefit from some of the bonuses aswell as the + color pattern of their job, while allowing others to easily determine their + profession! + - bugfix: Benevolent Nanotrasen makes gulag available for everyone! (Plasmamen retain + their equipment and don't die.) + - rscdel: Removes code that theoretically limits plasmamen from being clowns and + mimes, but actually doesn't. + Ghommie (original PRs by zeroisthebiggay, AnturK, MrDoomBringer, Cobby, ATHATH, optimumtact, GranpaWalton, Skoglol): + - bugfix: Blob overminds, sentient diseases, etc. can no longer dump out boxes. + Sorry gamers. + - rscadd: Sentient Disease now has almost all symptoms at its disposal. + - code_imp: Adding single-symptom disease abilities is super easy now. + - bugfix: Sentient Disease can now hear (not sure if this was a bug or intentional). + - rscadd: Sentient Disease is a linguist and knows all languages. Still cannot speak. + - tweak: Gives Sentient Diseases a medical hud to observe their victims further + with. + - bugfix: Fixes and moves around some on_stage_change() and Start()-related things + for virus symptoms and (sentient) diseases. + - bugfix: The inorganic biology symptom should work properly now when bought by + a sentient disease. + - bugfix: Oxyloss icon no-longer shows up when someone has the self respiration + symptom + - tweak: The self respiration now makes you not contract diseases through the air + and not breathe in smoke + - bugfix: Sentient diseases can no longer pick two cures that react and disappear + when eaten. + - balance: Sentient disease cures are now consistently harder, will only pick cures + from tier 6 and up. + - bugfix: Disease cures should now stay the same for all infected mobs. + - rscadd: The regenerative coma symptom has a new resistance 4 threshold effect! + Said threshold effect will give hosts of the symptom's virus the TRAIT_STABLECRIT + trait if its threshold is met. + - bugfix: An obscure, probably never reported before bug that may or may not exist + involving sentient diseases and the self-respiration symptom should be fixed + now (if it even existed in the first place). + - balance: The cooldown time between each removal or addition of a symptom for sentient + diseases has been brought down from an agonizingly long 2 minutes to a more + reasonable 1 minute. + Ghommie (original pr by Dennok on tgstation): + - bugfix: Now you don't lose your pulled thing on the z level edge. + GrayRachnid: + - rscadd: Added windoors to all the flaps on delta. + - balance: rebalanced k9dogborgs + Hatterhat: + - rscadd: Magnetic pistols now fit in boot pockets - jackboots, workboots, etc. + - tweak: literally every pistol subtype fits in shoes now. go wild. + Hippie Circuit Port: + - rscadd: Added all Atmospheric Circuits + - rscadd: Added the ability to color data disks + - rscadd: Added Selection and Storage Examiner Circuits + - rscadd: Added Smoke, Extinguisher, and Beaker Connector Circuits + - rscadd: Added Inserter, Renamer, Redescriber, and Repaint Circuits + - rscadd: Added MMI Tank and pAI Connector Circuits (The possibilities are endless!) + Improving and Balancing Cyborgs: + - rscadd: Added Crew Pinpointer to Security Borg + - rscadd: Added Crew Monitor to Medical Borg + - rscadd: Added Crew Pinpointer to MediHound Borg + - tweak: Made the Disabler_Cooler compatible with both Security Borg and K9 Borg + - tweak: Changed the Warning Text upon selecting Security or K9 module + ItzGabby: + - rscadd: Bat Species parts for more leeway for character customization. + - code_imp: Alphabetized decor wing selection window in character creator for simplicity. + JTGSZ: + - tweak: Added one more gang boss slot bringing total to 4 from 3 + - bugfix: Fixed Gang Boss being able to be deconverted + - tweak: Gave Qualifies_for_Rank Check back its checks in job controller. + - rscadd: Optional species based clothing restrictions + - tweak: Gang Dominator excessive wall check tweaked to 25 open turfs + - bugfix: Gang Dominator no longer functions off-station. + - rscadd: Adds more control over species based offsets. + - bugfix: qualifies_for_rank now checks latejoin menu + - rscadd: Added Halloween Dwarves, for Halloween... Yep. + - bugfix: Can flip pipes once more. + - bugfix: barricade girder walls use PlaceOnTop instead of new + Linzolle: + - rscadd: ability to quickly max sensors + - bugfix: atmos helmet visual bug + - bugfix: supply display are now properly on the wall + - tweak: consistency in hop and cap berets + - tweak: slime people now enjoy eating toxic food and it will not disgust them + - bugfix: hos trenchcloak now properly has a sprite on digi characters + - rscdel: duplicate definition of hos and sec skirts + - bugfix: Krav Maga leg sweep now works properly. + - rscadd: shoes can have a different icon used for their item and mob icons + - bugfix: combat gloves plus having no mob icon + - rscadd: inhands sprite for rainbow knife + - tweak: colour of highlight on the regular knife when held in the right hand + - rscadd: mining shuttle console can now be printed after computer consoles have + been researched + - rscadd: can now carry people on your back by aggressive grabbing them while they + are laying down and then dragging their sprite onto yours. + - tweak: dragging people who are prone is now much slower, and carrying them will + allow you to move faster at the cost of taking 5 seconds to lift them up onto + your back. + - tweak: pacifists can now aggressive grab (cannot table slam people though) + - bugfix: blood on your body floating a bit to your right if you're a taur + - bugfix: some suits having no icon on tauric characters + - tweak: front facing CMO hardsuit icon for naga taurs + - tweak: colour of medical cross on CMO hardsuit for taurs + - bugfix: taur body and jumpsuit showing through mining suits + - tweak: all chaplain suits can hold the same items in suit storage + - code_imp: improvement to organisation for chaplain suits + - bugfix: blood halberd not going back to 17 force after unwielding + - spellcheck: unnecessary 's at the end of blood rites healing + - rscadd: QoL to blood rites, examine the ritual aura to view how many blood charges + are left + - code_imp: surgery cleanup + - tweak: dissection available round-start + - rscadd: better dissection surgeries from RnD, gives more points + - rscadd: abductors can now see what glands do + - code_imp: antagonist abductors now have a surgeon trait that teaches them every + surgery rather than having it just check if they're an abductor + - rscadd: muscled veins surgery + - bugfix: having one of your hands used up if you fireman carry but the person being + carried dismounts any way other than you dropping them + - rscadd: Four colour variants of ankle coverings. Select them on the loadout screen. + - imageadd: ankle coverings + - tweak: allows for shoes that don't cover your feet to be taken into account for + footstep sound effects and glass shards + - rscadd: Tend Wounds surgery. Heal in the field, with better healing the more damage + the patient has. + - rscdel: Reconstruction replaced by Tend Wounds + - balance: made Revival more accessible, more viable alternative to cloning. + - bugfix: advanced surgery tools can't perform lobectomy or coronary bypass + - rscadd: Decorative and insect wings can now be coloured individually, similar + to horns. + - bugfix: people getting assigned wings if their savefile is old. + - rscdel: wings that take the hair colour. Unnecessary if you can just set the colour. + - tweak: Cannot make horns pure black. Trying to do so will set it to a default + value. + - bugfix: decorative angel wings being invisible + - bugfix: abductors now actually work + - tweak: abductor scientist has their own greet message now + - bugfix: unable to read paper on airlocks + - tweak: ai can see paper (still just shows stars) + - rscadd: Target head and throw a hat at someone to toss it onto their head, knocking + whatever they're wearing off if they are wearing a hat. Some headgear can't + be knocked off this way. + MediHound: + - rscadd: Made Cyborgs be affected by Ion Storm Law Changes like AIs + MrJWhit: + - balance: rebalance melee stamloss + Multicam Config: + - config: removed whether or not the stuff for multicam was checking the useless + var and instead now checks the CONFIG_GET flag. + - admin: Admins now have a verb in the Server tab to turn AI multicam on and off. + Naksu: + - code_imp: default radiation insulation is now handled by atom vars rather than + a component, components can still be used. + - code_imp: squeezed a little bit more perf out of atmos + Nero1024: + - soundadd: Bare feet will now make the correct footstep sounds. + - soundadd: Other mobs will make the correct footstep sounds. + - soundadd: Crawling/dragging sounds for downed/incapacitated mobs + Onule & Nemvar (ported by Ghommie): + - imageadd: New Revenant icons + Original by Citinited, port by Sishen1542: + - rscadd: You can now use an airlock electronics on a locker to add a lock, and + can screwdriver an unlocked locker to remove its lock. + - rscadd: You can now remove the locks on broken or emagged lockers. + - tweak: Removing the lock from a personal locker now wipes that locker's ID details. + - tweak: Broken lockers have had their appearance changed. + Owai-Seek: + - rscadd: custodial cruiser cargo crate + - tweak: removed light replacer from power designs and moved to misc designs + - tweak: added pimpin ride to custodial locator + - tweak: added additional items to janibelt whitelist + - tweak: made plant DNA manipulator unwrenchable + - balance: reduced janitor premium supply costs + - bugfix: fixed them strawberries + - rscadd: false codpiece + - rscadd: crocin/camphor bottles + - tweak: updated kinkmate item list + PersianXerxes: + - code_imp: Adds the clockwork_warp_allowed flag to the Captain's Office area, set + to FALSE the same way it is for the chapel and armory. + - tweak: Relocates cult catwalks outside the Reebe dressing room. + Poojawa: + - rscadd: Digitigrade legs are now able to wear shoes and look fancy, Uniforms to + come. + - tweak: Xenos are only digitigrade now, mammals and aquatics have the option. + - rscadd: Fire Alarms are visible in low light situations + - bugfix: fixed vore prefs saving inconsistently, new characters might have a previous + slot's prefs tacked on. + - bugfix: fixed mammals not having the option for digilegs. Sprites are fucky until + body-part related sprites are done. + - refactor: improved vore sound responsiveness to preference choices. + - balance: removed morphine from Medihound sleeper chemical list + - bugfix: fixed preference setting being broken + - refactor: Medihound sleepers are Initialized properly, and icons update correctly + now on eject + - tweak: Air alarm All clear color changed from green to blue + - balance: APCs are harder to destroy. + - rscadd: Added Digitigrade versions of everything appliciable in suit.dmi + - imageadd: Snowflake Icons weren't modified, and were given NO_MUTANTRACE_VARIATION + - imageadd: naga and quad Taurs literally don't freeze their ass off in space anymore. + - bugfix: Digitigrade legs will toggle on/off properly on character menue + - bugfix: The misleading "normal" has been removed from species options + - balance: Added sanity checks to emag usage + - bugfix: fixed vtech, but it still doesn't work because of overriding jog/sprint + mechanics from combat reworks. + - bugfix: Puppy jaws properly store if you're emagged, they are also toggle-able + for stealth like the tongue. + - bugfix: 'Digitigrade legs should properly fucking update for the last fucking + time. Fucking snowflake code. refractor: Got rid of snowflake sechound cuffs, + gave them normal zipties like regular secborgs.' + - bugfix: dogborg sleepers actually extinguish people who are on fire, in case you + don't have time to lick them out. + - bugfix: Taur suits should fix themselves properly when worn by other people. + - rscadd: Added the Yogs/Oracle ported latejoin menu + - rscadd: All markings, tails, ears, and snouts for Citadel races are color matrixed! + - imageadd: all markings are on a per-limb basis, including Digitigrade legs! + - imageadd: a bunch of tails were blessed with tail wagging sprites, Fish, Sharks, + Fennecs, Wahs, raccoons, and others. + - imageadd: Tiger markings + tail added, skunk tails improved via sprites from Virgo + - tweak: tweaked some sprites to look better, but they absolutely could use a few + extra passes for quality + - rscadd: HumanScissors in the Tools folder will permit anyone to contribute matrix'd + markings to the sprite sheet, however Mam_markings is very, very full. Be careful. + - tweak: Character preview was both optimized for taurs and bad-touched for better + updating. I don't know if it'll be bad, but hey its better. + - rscadd: Added Dark Medihound and Pup Dozer from Virgo + - tweak: Clone pods no longer announce the name of the clone + - bugfix: fixed flavor text appearing when your face is hidden but you're not an + Unknown + - bugfix: Tauric suits now apply an (placeholder) blood overlay, as well as their + shield overlay. + - balance: Ashwalkers now have lungs. They cannot breath station air without suffocation + effects, but are completely fine on their homeworld. + - balance: Carbon mobs now have a maximum tolerance to oxygen of 50kPa. + - balance: Deluxe synthetic lungs have a very high bonus to O2 tolerance. + - bugfix: Digitigrade legs returned to normal, since digi leg markings overlay them + anyway. + - bugfix: commented out lizard mam_snout entries, because too many abominations + - bugfix: Vore Panel restored to have various interactions available again. Semi-untested + but should work as advertised. + - tweak: Vore Panel has more feedback. + - rscadd: is_wet var to bellies, toggled in the panel, will remove flesh sounding + struggles and the internal loop. JSON version updated. + - rscadd: Feeding var. You will need to enable feeding to recieve any feed vore + actions, but you can now feed yourself to mobs that have this set. TODO, Dogborg + sleeper feeding. + - rscadd: vore mode button now required to be enabled to perform vore actions. It's + the mouth icon! + - bugfix: Ash Drake vore fixed for actual reals this time + - bugfix: Mobs shouldn't spam the released contents announcement anymore on qdel + or death. Only if triggered + - tweak: Hostile mob code now properly ignores targets in bellies + - rscadd: Your belly can quietly growl if you're starving now. + - bugfix: Normal blood splattering isn't offset due to tauric mode + - rscadd: Added plasma man suit icons for taurs + - rscadd: Added bee butt for insects to have stripes + - tweak: adjusted random spawn sprite accessories, humans won't be demi by default + and lizard/mammal spawns will randomly get digitigrade legs + - bugfix: sprite adjustments for tentacles, as well as a misspelling. + - bugfix: Humans once again use ears and tail_human, as intended. This is to prevent + garish randomness + - bugfix: istype for species is actually correct and usable now, it'll be a factor + for monkey form expansions. + - bugfix: Hair functions are de-gendered and more easily selectable now. + - bugfix: Slimes can *wag, select markings and snouts, and yes it works. + - bugfix: Slimepeople extra parts now respect their hair_alpha in terms of being + somewhat see-through. it shouldn't stand out as badly now! + - bugfix: Hunger noises are now toggled per character + - bugfix: Ashwalker den is habitable by ashwalkers again + - rscadd: Medical belts now have overlays! Now you can see if a belt is useful or + just flatout empty. + - bugfix: fixed hypo MK IIs not being able to be put on medical belts + - bugfix: fixed Navy officer uniforms that failed to spawn + - code_imp: Loadout items will be forcefully added to backpacks or at your feet + instead of left behind at title screen + - tweak: hypospray kits hold 12 now, but only vials and sprays themselves + - bugfix: labcoats can carry MK II hyposprays on them now. + - rscadd: Vore Mobs are a thing now, not just ash drakes + - rscdel: 'Removed hunger sound stuff. never taking requests from Coolgat3 ever + again. refractor: Simple Mobs use the same system regular human mobs do, itjustworks.png' + - tweak: Character Window settings unsnowflaked and normalized. I have no fucking + clue how to make them work with taurs still tho, sorry. + - imageadd: added rotating background images for better clarity and contrast than + just SOLID FUCKING BLACK. Images from Virgo/Polaris/Eris + - balance: Defib users automatically stop pulling when they attempt to perform a + defib shock + - imageadd: added muzzled varients of space helmets and full masks + - imageadd: added knight_grey to taur suits, all paranormal ERT now have tauric + versions enabled + - bugfix: Lava knights have digitigrade and tauric versions now + - rscadd: Added a glass version of the gas mask, because it was in the files and + looked nice. does everything regular ones do except make you an unknown + - rscadd: Added custom species names! Examining people will now display their species + name unless they're an Unknown or have their face hidden. like flavor text. + Set it in your character window! + - code_imp: changed how health scanners print messages, wrapping it in msg for one + to_chat instead of printing every line to_chat. + - server: Discord bot will now report when a round ends and give the vague news + ticker that a sister-station would have received for the game mode and result + of the round. + - bugfix: fixed medical hardsuit overlay issue. I thought it was going to work well + but fuck byond. + - bugfix: None body markings shouldn't give rgb hell, but it also should reset properly + anyway. ree. + - bugfix: Sorted some sprites to better sooth my byond icon limit anxiety. + - bugfix: Box Cryopods expanded to 6 public. Permabrig cryo fixed. + - bugfix: Delta Cryopods expanded to 6 public. Permabrig cryo fixed. + - bugfix: MetaStation Crypods expanded to 6 public, relocated above sparring ring. + Permabrig cryo fixed + - bugfix: PubbyStation gained one more cryopod, Permabrig's cryo fixed. + - rscadd: Omega given one more crypod as well. + - rscadd: Gulag was given a cryopod. + - tweak: Box and Meta's cryo rooms are now a new room entirely. + - rscadd: Added erect states for all phallic bodyparts + - bugfix: YOUR DICK ACTUALLY STANDS UP NOW, YOU'RE WELCOME. + - bugfix: skintone locked genitals match the new skintone colorations. + - rscadd: added two new vaginal types and descriptions. + - bugfix: fixed borg defib runtimes + - bugfix: fixed heart attacks being nonlethal + - rscadd: Ported Oracle's cloning set up, you're now visible like cryo when being + cloned, though it's a mystery until you have skin on your meat puppet existance + - balance: Recyclers are unable to destroy the indestructible any longer. + - bugfix: Kiara's toy sabre now actually is the correct item + icon states + - bugfix: Generic armor for taurs fixed, there isn't actually any sprites for 'em, + so. Full sprites overlay over bodies, but I really can't be bothered to do all + the offset fixes otherwise. + - rscadd: Large maps have had a patient room transformed into micro chemistry stations + with nothing else in them. They've been labelled 'Apothecary' rooms and are + accessible by doctors. + - rscadd: females now have female defined sprites + - bugfix: Slime legs have had their excess pixels adjusted + - bugfix: Mammal normal legs are more in line with human legs now + - bugfix: fixed species like abductors and golems getting the fat tiddy or pingas + - bugfix: Atmos and Station alerts should be more alerting. + - rscadd: Added visible and hidden testicles + - rscadd: Added multi-boob support. Now you can have two or three pairs of breasts. + - bugfix: fixed missing vagina and breast sprites + - bugfix: fixed prosthetic hands being invisible + - bugfix: male foxes exist again + - bugfix: female chest markings improved from being too dark in comparison to their + other colors, blending better + - bugfix: Markings behave better on non-organic limbs. + - tweak: tweaked the name of Sublter to distinguish its use + - tweak: Gave a hint for vore posting. + - rscadd: Readded Ninja speech modifications with their mask + - rscadd: Pacifists can eat people for heal belly or noisy. Digestive modes are + auto-swapped to noisy + - rscadd: Added an underwear toggle button under 'Object' tab + - tweak: Genitals now layer under underwear. Hide these if they're too obnoxious. + - rscadd: Added digitigrade socks of all known ones anyway. + - tweak: tweaked the Genital character creation layout to look better + - bugfix: fixed having balls/womb when you don't have the linked organ at character + creation + - bugfix: fixed being able to squeeze semen directly from your balls. Probably. + - rscadd: NT Newscasters have had repeated reports of gang activity and are now + looking into it. + - rscadd: NT Psykers keep mumbling about last words of someone who died. Somehow + they even have a newsletter for this... + - bugfix: Gangster greeting messages are a batch message rather than 5 laggy to_chats + - imageadd: RCL now show what color is currently in use + - rscadd: Added RGB blood effects, know whose blood this is by color! + - rscadd: Added Synthetics blood, and a machine that produces it. A universal donor + for medical to heal people with. Make it via medical protolathe! + - bugfix: With hearts, slimepeople shouldn't die from the effects of not having + a heart. + - bugfix: Plasma vessels from xenomorphs will restore blood if you're on resin. + - server: Poly's speech now echos to the chat bot. + - rscadd: Added new wings to Insects and separated fluff from old ones, they're + Insect's new body markings now without being per-limb (for now). + - rscadd: Horns are now available to mammals, and they have their own color. + - rscadd: Legs are no longer a binary hack code, but actually something that can + be changed. Framework for tauric adaptations. + - rscdel: Purged Modular Citadel's sprite_accessories. + - bugfix: improved the quality of a number of sprites. + - tweak: Moths are now all insects. Avians and Aquatics are all anthromorphics. + Just as planned. + - rscadd: Anthromorphs can choose their preferred gibbing meat. I guess. Snowflakes + are weird. + - bugfix: Additional Gentlemen names. + - rscadd: Medical huds are now calibrated for Radioactive wavelengths. + - balance: Engineering equipment, blue space, and common storage containers are + radiation protected + - bugfix: fixed suit storage not cleaning radiation levels of everything stuffed + into them. + - bugfix: QM is able to hire/fire people to their department now. + - bugfix: cryopod UI isn't complete shit anymore + - bugfix: Cryopods purge silicon gear more efficiently now. Same with ghosts. + - balance: Med Sprays are now more aligned with patch mechanics + - balance: Chemistry is encouraged to be more varied in their healing, as well as + careful in its application + - tweak: Active NPC priority set much higher priority for the MC, with the intent + on making NPC combat more interesting + - bugfix: Clarified access descriptions of some jobs + - bugfix: fixed missing deco wing states + - bugfix: fixed a few things related to vore content + Putnam3145: + - tweak: Bottles in PanD.E.M.I.C 2200 can now be replaced with an inhand bottle + directly + - tweak: Ejecting a bottle from the PanD.E.M.I.C 2200 puts it directly into the + user's hand + - tweak: Alt-clicking the PanD.E.M.I.C 2200 ejects the current bottle + - bugfix: neural nanites only work/drain if you have brain damage or traumas the + nanites can fix + - tweak: Pod people can no longer get fat from standing in the light + - tweak: PanD.E.M.I.C 2200 now ejects onto itself instead of onto user if user's + hands are full + - rscadd: Added configs for a bunch of Dynamic rule parameters. + - config: Added defaults for all the configs (WIP). + - config: Added dynamic midround/latejoin antag injection to the config. + - balance: Made starlight condensation not kill slime people. + - balance: Added not-killing-slime-people to the transmission threshold of plasma + fixation and radioactive resonance. + - tweak: Made the clone scanner lock while it's scanning. + R3dtail: + - rscadd: Added 16 saltprimaryobject items Added 4 saltsecondarysubject items + - rscadd: Added a new carpet. Red! Also added said carpet to the Premium Carpet + crate from the cargo supply console. Trilby said she'd take care of the crafting + recipe. + Raptorizer: + - tweak: Doubled peach spawn rate + - tweak: tweaked numbers/variables + - balance: rebalanced numbers/variables + - spellcheck: removed unneeded code + Seris02: + - rscadd: Abductor Replication Lab ruin and advanced tools + - rscadd: Added looc hotkey + - tweak: made the autoprocess button relevant + - tweak: changes so that spooktober starts earlier + - bugfix: fixed the dark blue lum major effect + Sirich96 and Dennok (ported by Ghommie): + - rscadd: Added new Teleporter Station sprites + - rscadd: Added teleport station calibration animation. + Sishen1542: + - rscadd: Pentetic Jelly, new chemical made through mixing 1:1 slime jelly and pentetic + acid. + - tweak: Anatomic panacea now gives pent jelly instead of pent acid. Medbeams now + have TRUE tox healing to heal TOXINLOVER as well. + - balance: Changed bible heal proc, halving the healed damage and increasing brain + damage 5x in exchange for a much wider array of items to protect you from it. + - tweak: Moved around some chems from emag list into upgrades. + - balance: Added some fun chems to dispensers. + - bugfix: Gave dispensers old tg functionality. + - rscadd: Leather, cardboard, bronze & bone golems! + - rscadd: Bone hurting juice and interactions with plasmamen, skeletons & bone golems! + - rscadd: Ported addition of new CAS cards. + - bugfix: Ported a fix for CAS. + - rscadd: Added the ability to alter your genitalia as a slimeperson more than addition/removal. + - bugfix: fixed genitalia removal proc in alter form. + - balance: Ported the inability for non-station AI to interact with station z-level. + - balance: HoS mains can now peacefully sleep in their office. + - tweak: Podpeople now have customization options. + - bugfix: Removed the human check for cult conversion of captain/chaplain minds. + - balance: Roundstart carbon jetpacks now have full_speed FALSE. + - tweak: Adds plasteel to medical and security techfabs. + - rscadd: Added public autolathes to all maps. + - tweak: density = 0 + - balance: hugboxing mining loot + - balance: ling blade now has 40 armor pen + - rscadd: fun + - rscdel: bad stuff + - balance: mech bad + - balance: rebalances strained muscles + - rscadd: added in the assistant response team + - bugfix: fixed up access on the centcom hangar button + - balance: storage tweaks for belt briefcase + - imageadd: codersprite for belt briefcase + - rscadd: added pharaoh gear to chaplain vendor + - spellcheck: fixed typos in pharaoh items + - rscadd: made laser minigun not shitcode and also craftable + - soundadd: added new fire sounds for the laser minigun + - rscadd: holy lasrifle, hypertool, divine lightblade, and blessed baseball bat. + Four new holy weapons! + - balance: stamina and force tweaks for most holy weapons. + - tweak: prayer beads no longer deconvert after a 10 second timer, now just inject + holy water for delayed effect + - tweak: cultist runes are now destroyed with a bible or a null rod + - tweak: bo-staff now functions as a nerfed sleepy carp staff + - bugfix: fixed kevinz code to add in non-null rod child items as holy weapons + - bugfix: fixing chems for strained muscles + - bugfix: narsie no longer asks for consent + - bugfix: removed reflect from divine lightblade + - bugfix: teleporting a locker is bad + Sishen1542, original by @Tlaltecuhtli: + - bugfix: alt clicking the emitter now rotates it instead of only flipping + Sishen1542, original by @zxaber: + - balance: Utility mechs no longer automatically get beacons. + - balance: Tracking beacons no longer delete themselves when EMPing a mech, and + instead have a ten-second cooldown in-between EMPs. They also now do heavy EMP + damage rather than light. + - balance: Mechs that take EMP damage lose the use of their weapons and equipment + temporarily. Movement and abilities are not effected. + - balance: Mechs taking EMP damage no longer roll for a random malfunction. + Sishen1542, original by Arkatos: + - rscadd: Action buttons can now be dragged onto each other to swap places + Sishen1542, original by NewSta: + - tweak: updated the miasma canister sprites + Sishen1542, original by Skoglol: + - rscadd: Heaters/freezers now support ctrl clicking to turn on and alt clicking + to min/max target temperature. + Sishen1542, original by XDTM: + - rscadd: Using the wrong surgery tool during surgery no longer attacks the patient, + if on help or disarm intent. + - rscadd: Surgery steps are now shown in detail only to the surgeon and anyone standing + adjacent to them; the patient and people watching from further away get a more + vague/ambiguous description. + Skoglol: + - rscadd: You can now alt click storage (bags, boxes, etc) to open it. + Skully): + - rscadd: Nudity Permit, a completely invisible uniform that still has pockets and + such, to loadout options. It is more or less a direct port from the RP server. + SkullyRoberts: + - rscadd: Penis autosurgeon as rare maint loot. + TerraGS / Skoglol: + - rscadd: Adds toggleable light and blinking charge indicator to kinetic crusher + - rscadd: Kinetic crusher can now be one-hand carried. You'll still need two hand + to use it. + Thalpy: + - bugfix: fixes message_admins in SDZF + - tweak: Alkaline buffer recipe so people don't get grumpy and expanded the pH range + - bugfix: fixes buffers + - bugfix: fixes broken compiler because a var changed name + - bugfix: impure travis var anger + - rscadd: Added the ability to dispense smartdarts from the chemmaster. + - tweak: Tweaks medolier amd chembags to allow quickpickups of smartdarts, lets + the latter soak in beakers (on the floor) + - bugfix: fixed rounding errors with smartdart mixes. + - imageadd: added modified smartdartgun icon. + - bugfix: 1. Kev asked that there were no antag datums used, so that's been changed. + 2. Tricks can no longer turn someone into a dullahan, instead you have to spend + candies to get that. I felt it was too mean to turn people into that, I didn't + realise you couldn't revert it. 3. Barth will no longer as for impossible items. + 4. Barth will no longer as for the same item multiple times. 5. Barth will now + accept broader things, rather than asking for something, when meaning something + specific. 6. Jacq will now no longer poof off the z level. 7. Jacq will (hopefully) + stop spooking the AI by teleporting into there 8. Jacq will now try to teleport + to a location with someone nearby. 9. Barth will tell you where Jacq is currently + when you speak to him. 10. You can trade 2 candies for a Jacq Tracq (tm) 11. + Jacq should stop getting mad and cover the station in gas when killed. 12. Fixed + Jacq not singing (the link died). 13. Slightly changed wording so that people + will hopefully get to know her. 14. Jacq no longer disappears when you're getting + to know her. + Toriate: + - imageadd: 'All regular crates are now 3/4ths ToriCrates iamgeadd: Unused plastic + crate sprite added' + - rscadd: Blood freezer crates now have unique sprites. + - rscadd: RPD now has inhands + - imageadd: New sprites for RCDs and RPDs, inhands included + - imageadd: Updated the sprites of all the regular crates + Trilbyspaceclone: + - rscadd: cakes! + - imageadd: Made some sprites! -Love them really came out well + - rscadd: new economics + - tweak: cargo and robotics relationships + - balance: unbalanced something + - bugfix: fixed a maybe oversight + - rscdel: Fun + - tweak: costs of suit voucher + - balance: Unblances miner vender + - bugfix: spare cheaper brute kit + - tweak: harm from hentie + - balance: rebalanced goliaths stun to be less auto death + - rscadd: Armor to blob shields + - tweak: block weaken state to 70% from 75% + - bugfix: restores the deathriplys missing armor + - rscadd: new lockable colalr + - tweak: armor + - bugfix: missing hopes and dreams + - code_imp: orgized the weapon file to be more cat brain friendly + - imageadd: This means sprite right? + - rscdel: Many engi flags on non-engi things + - code_imp: changed some code to be organized at a glance + - balance: '25% < --- 50% For NPC blocking bullshit ided: Yes' + - rscadd: mag gun uses cells + - balance: kev things their to op + - rscadd: syndicate phobia + - tweak: other phobia's + - bugfix: laser carbine + - tweak: makes collars only locked via key + - tweak: charging + - rscadd: Combat inducers for COMBAT! + - code_imp: made it look nice + - rscadd: golden swag boxes + - rscadd: Crafting suitcases + - rscadd: more bountys + - rscdel: Nitryl bounty + - rscadd: better stocks + - rscadd: more evil blood fluff text + - rscadd: Added more mime names + - tweak: replaces a sink with a autolathen + - balance: 2 -> 3 + - rscadd: MASON SUIT! + - rscadd: adds the sec jetpack to sec hardsuit storge + - rscadd: Added a few jet packs to the space queens men + - tweak: volume of jet packs + - rscadd: Bad Idea + - rscadd: bio mass meat + - rscadd: more box options + - bugfix: a lack of replaceable boxes + - bugfix: clothing needing a emag + - tweak: 4 - > 5 + - tweak: 5->6 + - tweak: 4tc - > 2tc + - tweak: mulligan costs 4 - > 3 + - tweak: Tuberculosis 12tc - > 8tc + - tweak: 15 - >10 + - bugfix: both bags have the same name + - tweak: 5 - > 2 + - tweak: 3 -> 1 + - tweak: 2 < - 4 + - tweak: 1->2 and ultra + - rscadd: shield + crafting + - tweak: hierophant movment and melee attack + - rscadd: More plushies + - tweak: attack verbs and descs + - rscadd: bone satchles + - balance: rebalanced stunslugs + - rscadd: colored boxes, and more types + - tweak: harm and such + - balance: item classes + - bugfix: resonators being so shitty + - bugfix: 'Game braking bug critical: bug fix' + - rscadd: items to syndie surgery bags + - rscadd: SNOW CONES + - rscadd: carts buy-able cargo + - tweak: selling/time to craft + - bugfix: crafting problems, and red stamp exsplote + - rscadd: gives paper work sprites that are nicer + - rscadd: origami + - rscadd: gang tower shield + - tweak: costs of boots + - rscadd: organ box + - rscadd: Medical breifcaseses + - rscadd: New cargo crate for tech-slugs! + - rscadd: Ammo to each fitting crate + - bugfix: Cat-code + - spellcheck: fixed a few typos - Again my bad + - bugfix: fixed airless place + - rscadd: baklava + - balance: makes uplink kits more usefull for the risk + - code_imp: Changes some files to be better + - balance: As all things are not + - bugfix: fixing cat code that dosnt work, my bad + - bugfix: Arcades stealing from noodles + - rscadd: rapier + - tweak: speedy quirk + - spellcheck: Ironic + - bugfix: A bunch of minor issues with xenobiology are no more! + - bugfix: I didn't code it right it in the first place + - rscadd: new nodes + - balance: points and node gear + - rscadd: stuff n things + - rscadd: gear harness and a conflict merg + - rscdel: Nudity permits + - bugfix: nothing + - rscadd: Donner item + - rscadd: Luna's Gauntlets + - balance: rebalanced lingy dingy powery gamey + - tweak: melee and block harm + - bugfix: sprites* + - balance: bone satchles + - tweak: holster doing holster things + - rscadd: Donor item + - rscadd: Joy, Happiness, Honk + - bugfix: small mix up in terms + - rscadd: Promiscuous Organs crate, pills to lewd crate and testicles to maints + - bugfix: Made unholy water healtoxinlover + - rscadd: Zelus Oil, brass flasks + - rscadd: Added new chairs + - admin: Bugtesting zone upgrades for easy bug/game testing + - rscadd: more cargo to cargo + - rscadd: More loadout gear + - bugfix: Poojawa power creep + - bugfix: Not my work not my credit + - rscadd: Emitter gun + - bugfix: suit storage nulling anti magic item protection + - balance: rebalanced steal goals restrictions + - spellcheck: fixed a few misleading goals + - bugfix: ports a fix + - bugfix: oversight in benos + - bugfix: QM rooms not getting Key Aunths + - rscadd: new books/cooking + - spellcheck: less bad wording in slime + - rscadd: strawbarries and such + - rscadd: amazing things like tea of catnip, catnip and plant + - tweak: glue uplinks + - rscadd: RPDs to drones + - rscadd: Armor and such + - rscadd: flavor + - bugfix: maybe a runtime + - rscadd: chameloen clothing + - rscadd: tons of peach themed items + - spellcheck: caje + - rscadd: New book - Unused + - code_imp: organized files + - imageadd: redid brass tools to look better* + - bugfix: /cursed from a item path + - rscadd: Almost all clothing and most weaponds can be sold for pocket change + - tweak: Cargo costs of packets and selling + - balance: Lowered mat selling as well as most if not all bountys + - code_imp: Adds more files for easy finding/adding in packs + - bugfix: oops not being blacklisted + - code_imp: removes some cit-modular things + - bugfix: Missing sprites with bad ones + - tweak: emag charge amount + - rscadd: Reebe QoL aka creep in gear + - bugfix: ??? + - server: HEY MADE THE REEBEEE WAY SMALLER - Making it less lagging hopefully + - rscadd: Surgerys and spays in bags + - tweak: earthbloods stam regen + - imageadd: Red to Blue/Black crosses as questioned by Bhijn + - bugfix: clean bot not cleaning basic cleanables + - rscadd: new traitor bundle + - rscadd: trash + - imageadd: 'eye bleed :add: misstakes' + - rscdel: Removed old things! + - bugfix: UI memes + - rscadd: Blue space blood bag + - tweak: blood costs + - rscadd: Beebal and Honeybalm plants + - tweak: Costs of crates and paperwork + - rscadd: Adds 2 more crates hacked only + - rscadd: Added two seed packets of cotten to ash walkers base + Tupinambis: + - tweak: Changes large parts of the nuclear operative base, including the addition + of a new barracks where the ops spawn, a personal bedroom for the leader, the + rearrangement of numerous rooms, some added fluff, a slightly more roomy bar, + a larger hanger, a kitchen, and various other small changes to make the base + feel just a bit more alive. This was achieved by completely redoing the base + from scratch so there was room to work with, as a result potential bugs could + crop, please do report them. + - bugfix: The drop pod chamber was airless. This seems like an oversight, and has + been filled with air. + - rscadd: Cryo Sleepers have been added to Perma on all four maps in rotation. the + bathroom windoor and window have switched places to accommodate this change. + - rscadd: You can now choose the pre-exisiting "loader" sprite as an appearance + for your engineering borg. + - tweak: A vast majority of references to humans within ion laws have been replaced + with crew. AI modules have received similar treatment + - rscadd: 'Adds a syndicate themed emergency shuttle that costs 20000 credits, and + can ONLY be purchased when the communications console is emagged. This shuttle + features a fully stocked medbay with self serve sleepers, plenty of room that + can fit highpop, a fully featured bridge, ballistic auto turrets, and an armory, + EVA prep room, and bar, all of which are only accessible by either an agent + ID or through hacking. + + -EVA prep features 2 syndicate hardsuits and 3 syndicate softsuits. -Armory + features 5 stetchkins with spare ammo, and 2 riot c-20r''s. + + ![image](https://user-images.githubusercontent.com/42078130/48306551-0b786380-e500-11e8-821a-e59ac4eee0ea.png)' + - balance: Lone operatives no longer spawn with a syndicate hardsuit and a bulldog. + They instead spawn with a black and red EVA suit and an extra 15 TC (40 in total) + ![image](https://user-images.githubusercontent.com/42078130/48308065-c44e9a80-e520-11e8-8d60-cec8ff23d61d.png) + - rscadd: The tesla engine has been replaced with a supermatter engine, and pubby + engineering has been redesigned to accommodate this change. + - rscdel: The tesla engine has been completely removed along with any related components + - bugfix: RD and R&D vents are now actually connected to the air distribution. + - rscadd: New engineering hivebot. Has a bit more health but otherwise aesthetic. + - tweak: Oldstation no longer has an excessive amounts of hivebots within it, however + the bots that remain are individually a larger threat. + - balance: Hivebots are now more robust, with a higher melee damage output and health. + - server: Remove this ruin from the blacklist or this PR is pointless. + - bugfix: the air injectors for the SM engine waste and for toxins waste should + now receive power + - tweak: Adds a mixed clothing closet to Deltastation Dorms. + - tweak: Adds a bottle of unstable mutagen to Botany, on account of its distance + from Chemistry. + - bugfix: Omegastation should no longer have any turf with missing textures, as + those spots have been replaced with playing covered in a sandy turf decal. + - tweak: Removed all living eggs from the xeno ruin because people self antag. Honk. + - rscadd: Adds a new security level between Blue and Red (Amber). The shuttle call + time at this level is 8 minutes. + - tweak: Blue security level now has a shuttle call time of 12 minutes. + - tweak: The security level increase/decrease texts have been modified to accommodate + the change. + - imageadd: Adds a code Amber sprite for the fire alarms + - tweak: Removed the plushes from the toy crate, giving them their own. + - tweak: Plushes are now less likely to spawn out of arcades + - imagedel: Removes a moth plush from the game. + - balance: added a small fire delay (3 ticks) to automatic shotguns + - balance: Reduced buckshot brute damage by 20%. (12.5 -> 10 brute per pellet) (75 + -> 60 brute at close range) + - balance: Reduced rubbershot stamina damage by 40% (25 -> 15 stamina per pellet) + (150 -> 90 stamina at close range) + - balance: Reduced beanbag stamina damage by 12.5% (80 -> 70 stamina per shot) + - balance: Engivend RCDs now vend upgraded RCDs + - imageadd: Beautified and stylized the cyborg HUD sprites, animated and cleaned + up some of the old, modernized APC hacking and Doomsday sprites, + - tweak: moved cyborg language select above the radio icon, instead of above the + picture icon. + Twaticus & Poojawa: + - rscadd: Added new carpets from TauCetiStation! + - rscadd: More Liquid carpet chemicals, mix carpet with certain reagents to get + different colors! + - refactor: Tablets have a better means of being assembled codewise. nothing's different + on player end. + UntoldTactics: + - tweak: Rewords the click here prompt given when an attempted conversion is done + on an offer rune (for blood cult) + UristMcAstronaut: + - bugfix: allows a pai to activate its holoform while in a pai connector without + getting derped. + Useroth: + - bugfix: the collars are now aware of their proper overlay sprites + - bugfix: The space hotel dorms are now properly boltable with the buttons inside. + - bugfix: Makes the booze-o-mat hacked by default. Alternative to https://github.com/Citadel-Station-13/Citadel-Station-13/pull/8350. + - bugfix: After the PR which raised the ammo capacity of said magazines, due to + the code, they ended up with an invalid icon state. Fixed through changing the + icon state name in the icon file. + - rscadd: 'Taeclowndo shoes which grant the four following abilities: - Conjuring + a cream pie right into their hand. Every three seconds. - Making a banana peel + appear out of thin air at the tile of the clown''s choice. Every ten seconds. + - Mega HoNk. A touch-ranged, very small AOE ability, with effect equal to being + honked by a Honkerblast on a clown mech, with the effects halved for anyone + who isn''t its direct target. Every ten seconds. - Bluespace Banana Pie. You + don''t throw this one... not right away at least. This baby can fit an entire + body inside. Good for disposal of evidence. 25 second-long action, 45 second + cooldown. Also produces a "[victim''s name] cream pie". The body drops out of + the pie if you splat it somewhere or destroy the pie. If you eat it, it will + chestburst out of you a''la monkey cube. + + It''s a 14 TC item for traitor clowns and a 12 TC item for clown-ops.' + - tweak: The tentacle now directly puts the item in your hands, instead of toggling + your throwing and tossing it at you. Tentacles suffer from ranged inaccuracies + as if they were guns, I think it's enough of an inconvenience. + - tweak: Makes the netting much less clunky. If there's only one target you can + net while you press the button, it will just net that target instead of bringing + up a list of mobs. + - tweak: Energy nets now revive and fully heal capturees (even dead ones, after + calculating points). If someone's got a scan and wants to get cloned, they can + always kill themselves still. + - tweak: Capture points are added on capture, rather than round-end, so it no longer + matters whether your captures kill themselves in the holding facility or not. + - balance: Makes the nets a bit more sturdy. (previously it took mere two welder + hits to break one) + - balance: Makes stungloves actually stun people (currently comparably with stunbatons, + adjustable). Because electrocute_act(25, H) did fuck all, stunwise, and on top + of that, people in insulated gloves were completely unaffected. + - balance: Reduced the stunglove electrocute_act value to 15 due to above. Could + possibly be lowered further. + Weblure: + - rscadd: Added the relevant Beepsky animations from TG's aibots.dmi file to Cit's + aibots.dmi file. + WhiteHusky: + - rscadd: Sleepers now show blood level and type. + - tweak: Changed the styling of arousal messages to use pink-ish colors. + - bugfix: The orgasm moodlet message new-lines properly. + - bugfix: Flavor text with special characters will not get partially unescaped. + - bugfix: Canceling when setting flavor text does not clear it anymore. + - tweak: Checking yourself shouldn't freeze the client anymore. + XDTM: + - rscadd: Added the experimental dissection surgery, which can be performed once + per corpse to gain techweb points. + - rscadd: Rarer specimens are more valuable, so xenos and rare species are more + efficient subjects. + - rscadd: Added two new surgery procedures, under the Experimental Surgery techweb + node. + - rscadd: Ligament Hook makes it so you can attach limbs manually (like skeletons) + but makes dismemberment more likely as well. + - rscadd: Ligament Reinforcement prevents dismemberment, but makes limbs easier + to disable through damage. + - tweak: Golem limbs can now be disabled, although they are still undismemberable. + YPOQ: + - bugfix: Stealth implants work again + Yakumo Chen: + - balance: Made stealth implant boxes flimsier + - balance: Autocloning now requires tier 4 parts + - rscdel: Removes autoscan + - balance: Scanning people now requires someone to operate the cloning computer + regardless of part level. + - balance: removed antimagic component from holymelon + YakumoChen: + - tweak: AEGs brought more in line with current radiation system. Try not to get + EMP'd. + - tweak: Jetpacks no longer last twice as long between air refills. + - rscdel: Reverted laser miniguns. + - rscadd: Adds beanbag slugs to the sec protolathe at round start + - bugfix: Brings shotgun ammo availability back in like between seclathe and autolathe. + Zargserg: + - balance: Lungs maximum toxin threshold is 0.5% of the atmosphere. + - bugfix: Permanently contaminated atmosphere does not murder crew anymore. + ZeroNetAlpha: + - tweak: Cleans up autoylathe code and brings it back in line with the regular autolathe. + - bugfix: Fixes autoylathe interface not updating propperly. + - tweak: Silicons are now consumable by scrub pups. + actioninja: + - bugfix: APC UI autoupdates correctly + bluespace bio bags: + - rscadd: Added bluespace bio bags and put it in the tech web, in the node applied + bluespace + - imageadd: added a crappy icon for bluespace bio bags + chef: + - rscadd: Added main hallway approach to monastery + - rscadd: Added Maintenance hallway approach, with some maint loot + - tweak: moved the docking arm for the white ship + - tweak: changed placement of some grills and windows + coiax: + - admin: When the nuclear disk stays stationary long enough to trigger an increase + for the lone op event chance, admins will be notified every five increments. + dapnee: + - rscadd: Plasmaglass tables, spears, tiny plasmaglass shards + - bugfix: Plasmaglass structures now drop plasmaglass shards instead of nothing + - rscadd: Trim lines! + - bugfix: You can now make plasmaglass tables again. + deathride58: + - admin: When a gamemode fails pre_setup, it will now send a message in admin IRC + and in ingame admin chat, instead of only being viewable in the logs. + - balance: Portal guns now spawn without firing pins. + - balance: Reduced the default/baseline nanite pool amount from 100 nanites to 25 + nanites, and reduced the maximum nanite amount from 500 nanites to 125 nanites. + The safety threshold was reduced from 50 nanites to 12 nanites. + - balance: Most of Lavaland's mobs are now on crack. + - balance: Blood drunk miners now move once every two ticks, rather than once every + three ticks. + - balance: Bubblegum now has a maximum movement speed of once every three ticks. + Buffed from the original value of once per 5 ticks. + - balance: The minimum time for the Colossus to attack again after firing a random + shot is two deciseconds, Sped up from the original value of three seconds. The + minimum time for the Colossus to attack again after performing a blast is now + one second, with the original value being two seconds. The minimum time for + it to attack again after performing its alternating shot pattern is now two + seconds, original value being four seconds. + - balance: Ashdrakes now move once every five ticks, rather than once every ten + ticks. + - balance: Heirophant chasers now move once every two ticks rather than three ticks + by default, and the chaser cooldown has been reduced from 10 seconds to 5 seconds. + The cooldown for the Heirophant's major attacks has also been sped up to 4 seconds + from the original value of 6 seconds. + - balance: The Legion (megafauna) now moves at two ticks per second rather than + three ticks. It additionally now actually moves faster while charging. The cooldown + timer for it's special attacks has been reduced from 2 seconds to 1 second. + Additionally, The Legion's view range has been decreased from 13 tiles to 10 + tiles. + - balance: All megafauna now have a default view range of 4 tiles, decreased from + the original of 5 tiles, and an aggro'd view range of 15 tiles, decreased from + the original of 18 + - balance: Goliaths now move once every ten ticks, sped up from the original value + of 40(!!!) ticks. Additionally, their cooldown for their tentacles has been + reduced from 12 seconds to 6 seconds. To compensate, their cooldown now only + decreases by 5 deciseconds every time they're attacked, rather than 10 deciseconds, + their melee damage has been reduced to 18 per hit from 25 per hit, and their + vision range has been decreased from 5 tiles unaggroed, 9 tiles when aggroed, + to 4 tiles and 7 tiles respectively. Ancient goliaths have a default attack + cooldown of 8 seconds, sped up from the original value of 12 seconds. + - balance: Legion (the common mob) now has a cooldown of 1.5 seconds on their skull + attack, sped up from the original value of 2 seconds. Additionally, their view + range has been decreased from 5 tiles, 9 tiles when aggroed, to 4 tiles, 7 tiles + when aggroed. + - bugfix: Stamina no longer regenerates at hyper speeds. + - tweak: To accommodate for upstream's stamina changes, knockdown() now applies + staminaloss only to the chest. + - tweak: adjuststaminaloss() now has a new argument that allows you to specify a + zone to apply staminaloss to. This defaults to the chest + - tweak: apply_damage() is now capable of healing carbon mobs and human mobs. + - tweak: Since the head has the same exact effects as the chest when disabled, and + doesn't really make much sense to be affected by stamina, the head no longer + has stamina. + - tweak: The chest now has a stamina cap of 200 stamina due to the above. + - tweak: Footsteps now sound mostly the same as they did before the hard sync + - bugfix: Jukeboxes now properly remove themselves from the active jukebox list + when destroyed + - rscadd: Server operators and badmins can now make the server play like TG by toggling + the stamina buffer on/off using the DISABLE_STAMBUFFER config option. + - bugfix: Airlock wires now work as they did prior to the hard sync + - balance: The thing you're currently grabbing is now taken into account when left-click + disarming. Things you have grabbed now roughly have a 45% chance to be disarmed. + - balance: Disarm push rolls are now determined by the target's staminaloss rather + than a flat number. + - balance: When you're in combat mode, pushing someone who isn't in combat mode + is a guaranteed knockdown. Hard counter to stam regen squeezing in melee combat. + - balance: Failed disarm push attempts now deals light staminaloss to the target + so long as both the attacker and target are standing. The total stamloss dealt + to the target is random, clocking in at a very inefficient 1-5 stamloss per + unsuccessful push attempt. + - tweak: Disarm pushes now play the thudswoosh sound regardless if they're successful + or not. Had it not been for copyright, I would've used L4D's melee sound. + - tweak: Disarm push attempts are now logged + - bugfix: Autostand no longer makes you invulnerable to dropping items when being + knocked down with a force greater than 80 + - bugfix: You can no longer abuse an href exploit to return from the labor camp + before obtaining enough points to satisfy your point goal. + - bugfix: Norko's donor item is now listed in the right category + - rscadd: The medihound sleeper now has a non-vore variant. This will be used by + default. The old voracious variant will only appear if both the person being + sleeper'd and the medihound have the voracious hound sleepers pref enabled. + Sprites by Toriate + - tweak: '"Allow medihound sleeper" is now labelled "Voracious medihound sleepers", + and is now off by default' + - bugfix: AOOC no longer prints to players in the lobby + - bugfix: Human tails and human ears now save again. Humans now use mam_tail and + mam_ears for their snowflake bits instead of tg's equivalent, just as they did + prior to human tail and ear saving breaking + - bugfix: Disarm pushes no longer deal staminaloss to resting targets + - bugfix: You can no longer force a hard stamcritted spaceman to stand by clicking + them with help intent. Get more creative if you want to torture someone that's + in hard stamcrit. + - tweak: The revolution gamemode now waits until the 20 minute mark before checking + for win conditions. + - balance: You can no longer resist/move out of grabs while you're resting. Disarming + your way out still works, though. + - rscadd: Stamina damage now has diminishing returns on people who are in hard staminacrit + with the addition of a new multiplier. When you take staminaloss while in hard + staminacrit, you'll be under the effects of the new multiplier, which reduces + the amount of staminaloss you take from all sources of staminaloss. The diminishing + returns multiplier will steadily return to 1 once you're out of staminacrit. + - rscadd: You can now scramble while resting. You can do this by dragging your spaceman + onto an adjacent turf. This works even if you're in staminacrit, but the timer + depends entirely on your staminaloss. + - bugfix: Fully augged cyborg people now heal stamina damage properly. + - bugfix: Job EXP is now tracked properly for all roles. + - balance: Nightmares and shadowpeople have had their light threshold for being + considered in darkness reduced. Nightmares can no longer stand unharmed next + to a light fixture during a nightshift 100% unharmed. The threshold is high + enough so that APC lights on their own won't harm a nightmare, but being on + the edge of a light source will. + - balance: The detective revolver's .38 bullets are now non-lethal again, but now + require 3 shots to hard stamcrit + - rscadd: The current lethal variant of the .38 bullets can still be printed at + sec protolathes. + - rscadd: You can now access ghost roles from the latejoin menu. + - rscadd: Eyeblur now scales depending on how much actual eyeblur you actually have. + - balance: Ebows now induce 50 drowsiness on whatever they hit. + - balance: Telepads have been buffed across the board. T1 parts on a launchpad still + grants you a range of 15 tiles, but T4 parts now grant you a pretty large 60 + tile range (up from their original 18 tile range). Briefcase launchpads were + also buffed, they now have a range of 20 tiles, up from their previous laughable + 8 tiles. + - tweak: The grace period for the revolution win condition check has been reduced + from 20 minutes to 10 minutes. You don't need to wait nearly as long for the + round to end if no heads join in. + - tweak: You can now select plural and neuter as your gender. They're labelled "non-binary" + and "object" in the character customization menu, respectively. + - tweak: A lot more light sources now use the same nonbinary colored lighting philosophies + as flashlights and light fixtures! + - tweak: Flashlights mounted to guns and helmets now retain the same color and power + as their original light. Lavaland's caves will reflect a fluorescent blue as + you shine your KA around, and sec's helmets are now capable of illuminating + maint in that fancy fluorescent blue. + - tweak: Cameras now shine a fluorescent blue when lit up by an AI + - tweak: Glowing goo now actually glows green. + - tweak: Candles had their power reduced from 1 to 0.8. + - tweak: Lighters now shine a little further, and are now properly colored. + - tweak: PDAs now shine an incandescent yellow to match their sprite. + - tweak: Welding tools now shine an appropriate color + - tweak: Hardhats now shine an incandescent yellow. + - tweak: Plasmaman helmets now shine an incandescent yellow. + - tweak: Microwaves no longer overpower literally every single light in the game, + instead having a power of 0.9. + - tweak: Borgs now have incandescent yellow lights to match their sprites + - tweak: Bots now shine a fluorescent blue light + - tweak: Airlock light overlays are now on the above lighting layer. This means + airlock lights can actually be seen in the dark now. + - bugfix: The mob spawners list no longer leaves null entries behind when a spawner + has a job description defined. The latejoin menu will no longer show ghost roles + that are filled, and the spawners menu actually works again. + - rscadd: The voting system now actually tracks who voted for what. This means it's + now possible to change your vote, and it's possible to see what you voted for. + - balance: Using help intent on someone that's in hard stamcrit will now make them + heal 15 stamloss. + - tweak: Auto fit viewport is now enabled by default for new players. One less question + off the FAQ + - rscadd: The Khajiit favorite, Skooma, was added as a chemistry recipe that can + be produced with cooperation between chemistry and either cargo or service. + If you want to spoil the recipe for yourself, take a look at the PR for it! + - rscadd: When the shuttle leaves for centcom, a vote will be started to select + the next map instead of the map being randomly chosen via biased voting methods + - server: If a server operator wishes to re-enable the biased TG preference voting + system, you can do so by toggling the TGSTYLE_MAPROTATION config flag on in + the config.txt. Keep in mind that doing so will bring you great misfortune. + - balance: Cacti in lavaland now have 6u of vitfro instead of just 4u. This lessens + the gap between cacti and first aid kits, the third rarest and second rarest + readily available healing methods for ashwalkers, respectively. + - bugfix: the "genitals use skintone" option now appears in the character appearance + menu when appropriate again. + - rscadd: Clicking your stamina bar will now show your exact stamina along with + info regarding your stamina buffer + - bugfix: The bug where ghost role spawners leave null entries in glob.mob_spawners + has actually been fixed + - bugfix: The Kitchen Gun (TM) is no longer invisible. + - balance: The majority of cult spells no longer have exclamation marks at the end + of their invocations. This means they will no longer be bound to the rules of + shouting. Which means sec officers will no longer be able to hear culties sacrificing + the captain from the complete opposite side of the maintenance tunnel the sacrifice + is happening in. However, things like EMP pulses and runeless teleportation + still have the effect due to their inherent loud nature. + - balance: The stun blood spell now instantly causes hard stamcrit. However, to + offset this, it now also only has one charge and has a higher cost. + - balance: The Gloves of the North Star now restore 2/3 of the stamina used up by + punches when harm intent punching. With aggressive play and good stamina buffer + management, this makes it entirely plausible to roughly double your stamina + regeneration per mob life process tick. + - balance: Revs can no longer remember the name of the person who flashed them when + deconverted. This brings it in-line with the other conversion antag deconversions. + - bugfix: The bug where you can sometimes get permanently stuck in stamcrit should + HOPEFULLY be fixed. I'm unable to reproduce the bug myself, but let's hope. + - balance: The night vision trait now grants you darksight for an entire 1:1 screen, + but the alpha of the lighting plane with the trait has been increased from 245 + to 250 to balance it out + - bugfix: It's now actually possible to click the stamina hud button + - bugfix: The stamina hud button now displays your stamina buffer correctly + - balance: Bone spears now have a reach of 2 tiles. + - bugfix: You can no longer phase through solid objects via scrambling + - bugfix: The syndicate mask now works properly as intended. + - balance: Stamina is no longer affected by health at all. + - rscadd: You can now right-click yourself in help intent in combat mode to instantly + get up from resting. This will cost stamina equal to your entire stamina buffer. + Manage your stamina well, and you'll be able to shrug off a single stray golden + bolt + - rscadd: The new player panel now displays your currently selected character's + name + - balance: Flashes no longer knockdown. Instead, they deal eyeblur and have increased + confusion + - server: The server's tagline is now a config option. People can now stop confusing + us with BR cit + - rscadd: Attack animations will now rotate your character slightly, similar to + Goon. + - rscadd: Throwing items will now perform the attack animation and play a sound + - rscadd: flashlights will now make sounds when toggled on/off + - rscadd: Things in disposals will now emit sounds every single time they hit corners. + This increases immersion. + - bugfix: Air alarms now actually emit the proper light color when their status + is okay. + - rscadd: Backpacks and other storage items will now jiggle and squish when you + interact with them, similar to the animations seen on Goon. + - balance: Mops no longer have a delay on their cleaning, making them an actually + viable alternative to all of the janitor's other cleaning tools + - balance: To balance this, mops now take stamina to clean tiles. Standard mops + take 5 stamina to use, while advanced mops take 2 stamina. + - tweak: Oh and also mops make fancy new sounds and play animations when used now + - balance: Pump-action shotguns now take 2 stamina per pump instead of 5 stamina + per pump. This also applies to bolt-action rifles, as bolt racking counts as + pumping. + - tweak: Pickpocketing items will now place them in your hands if possible + - rscadd: Combat mode is now displayed in examine text + - rscadd: Combat mode now makes a visible message when enabled if you haven't touched + your combat mode button in the last ten seconds. It's done this way to avoid + chat spam from those who know how to pull off stam regen squeezing. + - balance: All knockdown sources will now force people to be dismounted from ridden + vehicles. + - rscadd: When an item is thrown, it will now be rotated and displaced. + - rscadd: Shards of glass will now be rotated when spawned. + - rscadd: Bullet casings will now be rotated when they're ejected from a gun. + - rscadd: Bottles now have random rotations and pixel offsets when smashed via throwing. + - rscadd: Picking up an item will now reset its rotation. + - rscadd: Glasses thrown onto tables by bartenders will now have their rotation + reset. + - balance: Slime speed potions can now only increase the speed of vehicles to be + on par with sprinting speed. They can no longer make a scooter roll around ten + times faster than a speeding blue hedgehog. + - rscdel: Changelings will no longer recieve team objectives + - balance: Changelings no longer start off with hivemind communication as an innate + ability. Hivemind communication now requires 1 dna point, on par with syndicate + encryption keys, which are 2 TC. + - code_imp: Hivemind link now relies on hivemind communication just like the hivemind + download/upload abilities. + - bugfix: It's now only possible to zoom a gun if it's in one of your hands + - bugfix: Mobs without clients no longer cause runtimes when their eyeblur updates + - rscadd: Blood tests have been added. If a changeling has a sufficient number of + loud abilities, you will be able to test their blood by heating up a sample + of it. However, if the changeling has a large amount of loud abilities, attempts + to test their blood will have explosive results. + - rscadd: Changelings now make a very obvious noise when readapting. This is to + prevent the cheese strat of simply readapting when you get caught to avoid detection. + - tweak: The blood splatter effect that happens when you get attacked will now always + make you lose blood depending on the damage you've taken. The effect now also + scales with item damage, meaning tiny little papercuts will no longer be able + to cause a massive blood splatter. + - rscadd: The blood reagent will now cover items and spacemen in blood when applied + to objects and mobs. + - tweak: Helmets, masks, and neck items are all now valid targets to get splattered + when you get covered in blood. Groovy. + - tweak: The temperature notification will now take into consideration both the + ambient temperature and your body temperature, increasing the responsiveness + of the temperature notification and making it much more realistic. + - tweak: Shuttle transit borders are now 10 tiles wide instead of 8 tiles, hopefully + repairing the immersions that get shattered by the ability to see normal space + where the transit areas end. + - rscadd: Instead of transit turfs simply teleporting things to space, transit is + now handled in a somewhat realistic manner. Transit turfs now act like normal + space turfs, though exiting the transit area or being present in the transit + area after the shuttle moves out of transit will teleport you to space and throw + you in the direction the shuttle was moving in. + - tweak: Reservation areas are now able to designate a border turf. + - bugfix: The sprint hotkey will no longer cause you to get permanently stuck sprinting + if the server lags. Just tap shift again if you get stuck + - rscadd: You can now hear sounds in the real world while inside of a VR sleeper. + - rscadd: You can now make nameless characters. Nameless characters will spawn in + with their name set as their job title followed by a unique five digit number. + The "Name" option in the character setup menu will be replaced with a "Default + designation" option for nameless characters, and the default designation will + be used in place of a job title for assistants and other jobs that don't require + dress codes. + - admin: The out-of-game round end notification is now a little more verbose. It'll + now display the round type, end result of the round, and the survival rate. + - bugfix: Xenos can no longer strip items off of people to be capable of using any + item in the game. + - bugfix: also, items from pockets get placed into your hands properly now + - bugfix: A mob's last words are now properly tracked and recorded on death. The + first death of the round will now actually display the victim's last words on + the round end screen. + - bugfix: Divine shenanigans can no longer result in someone becoming immune to + staminaloss + - bugfix: Fixed body_markings in bodyparts being assigned as a list when in reality, + it's a string and literally everything expects it to be a string and uses it + as a string. This should mean that markings no longer have completely fucked + up caches for character preview and other things. + - tweak: Since apparently the game is literally unplayable if items are not in the + exact center of a turf, the maximum pixel variance of thrown objects has been + reduced by four pixels to make things a smidge more clearer for those that dont + know what a turf is. + - bugfix: Bartender glasses should HOPEFULLY no longer be tilted when landing on + a table. Why the fuck is after_throw called via a timer. + - rscadd: Changeling screeches now have their own unique sounds, and are much easier + to recognize. + - rscadd: Most synthetic emotes are now available to humans. *ping + - rscadd: You can now merp + - balance: The TEG will now only produce a meaningful amount of power if the hot + pipe contains gas that's actively combusting + - admin: Added the "add PB bypass" and "revoke PB bypass" verbs, which allow admins + to let a specific ckey to bypass the panic bunker for the rest of the round + - rscadd: Jogging is no longer treated exactly the same as sprinting for water slips. + When you're jogging, you will only slip on water if you have more than 20% staminaloss. + - tweak: The atmospherics turf subsystem now has double the wait time, which should + free up server processing power for other tasks. + - bugfix: The IRC now actually displays the actual survival rate + - rscadd: Bloodcult conversions are now consensual. Convertees are given a ten second + timer to accept or wait out. This should drastically improve the quality of + those that get converted into bloodcult. + - rscadd: All sacrifices now count as a third of a cultist for the end-game narsie + summon. + - bugfix: Nameless captains will no longer proc a "Captain Captain on deck!" message. + Instead, it'll be a much more boring but much more sensical "Captain on deck!" + message. + - bugfix: Transit turfs on the centcom z-level now function properly again at keeping + mobs within the areas defined by their boundaries. + - bugfix: The title screen is also positioned correctly again. + - tweak: Ghost role eligibility for both event and spawner ghost roles is now affected + by DNR status. If you suicide, ghost, or cryo out, you will be unable to qualify + for any ghost roles + - tweak: Cryo now applies DNR status no matter how long the round has been going + on + - tweak: Suicide is now properly admin logged as it is supposed to be. Ghosting + while alive is now also logged. + - bugfix: Sparks and igniters will now actually heat areas rather than cooling them, + as was intended. + - tweak: To alleviate some potential complaints, RPDs now have a cooldown before + they can create sparks, and both RPDs and emitters produce less sparks. + - tweak: Conversion runes will now mute the victim temporarily while they're deciding + whether to convert or be sacrificed. + - bugfix: Conversion runes no longer require a third cultist to sacrifice if the + victim refuses conversion + - bugfix: Staminaloss targeted at the head now properly redirects to the chest. + - tweak: Sprinting no longer takes stam when you're being pulled or when you're + in zero gravity. Other sources of involuntary movement are not affected. + - code_imp: In an attempt to improve performance during highpop, mouse movements + will now only call onmousemove() while a user is in combat mode + - tweak: Ballistic projectiles are now the only projectiles capable of emitting + dinks. + - admin: Panic bunker toggling and bypassing is now logged in admin IRC + - tweak: OOC and LOOC now use separate toggles. You can now use LOOC while OOC is + globally toggled off, and admins now have the option to toggle LOOC off separately + from OOC + - code_imp: also revamped and reorganized relevant looc adminverb code + - bugfix: The endgame narsie summon rune no longer requires 24 total sacrifices, + and will now properly account for cultists that surround it + - tweak: The succumb verb is now available in the IC tab + - tweak: Lighting now uses a linear algorithm to calculate falloff instead of an + inverse-square algorithm. + - code_imp: get_hearers_in_view() now actually caches the results of view() instead + of calling view() twice + - code_imp: Goonchat's JS no longer contains checks related to a completely unused + message filtering function, which should improve clientside performance quite + a bit + - rscadd: The storage hud now properly takes into account the viewer's view size, + meaning storage items with a large amount of storage slots will properly stretch + across the bottom of the screen when running in widescreen. + - rscadd: Action buttons are now able to fill the entire screen in widescreen and + other weird view sizes. + - rscdel: Omegastation's job changes will no longer be included at compile time. + - code_imp: The client update portion of /mob/Login() now double-checks to make + sure client.player_details exists and is of the proper type. This should hopefully + fix the "cannot read null.player_details" runtimes that can spontaneously cause + clients to get kicked out and forced back to the lobby. + - rscadd: You can now quickly use unequipped items on objects by simply click-dragging + the item onto the object with an empty active hand. Doing so will place the + item in your hand, and then use that item on the object. + - code_imp: In an attempt to improve the performance of /mob/Stat(), various time-related + procs now use defines instead of being procs that call procs that call other + procs that call even more procs. + - bugfix: If a living mob has vore initialized but doesnt have voreprefs initialized, + then client login will force voreprefs to load. + - bugfix: 'Hopefully fixed paper crash 2: electric boogaloo' + - refactor: Added unomos, which is basically listmos except gas mixtures only use + one single list for handling their gasses. This is a significant performance + improvement that also offers a mild memory improvement under normal circumstances. + - balance: Locomotion circuits are now restricted to jogging speed + - balance: MMI circuits and pAI circuits both now have 60 complexity, up from their + original 29. + - tweak: Biogenerators now have a sane limit for production + - bugfix: Fixed a fairly huge server crash exploit + - bugfix: Shield blobs no longer become completely invulnerable to all forms of + damage after reaching a """weakened""" state + - tweak: Taken care of what appeared to have been an oversight where shield blobs + don't recover their armor after becoming weakened. + - bugfix: Nerfed concatenators by limiting the amount of characters they're able + to output + - tweak: The timer for stripping an item off of a spaceman is no longer interrupted + by your active held item changing. This means you no longer have to worry about + filling both of your hands when you're stripping items off of someone. + - rscadd: Ported the zulie cloak and blackredgold coat donor items from RP. + - balance: Normal mops now only use 2 stamina to mop a tile, nerfed from their previous + value of 5 stamina per tile mopped. + - balance: Advanced mops now only use 1 stamina to mop turfs, from their former + value of 2 stam. + - tweak: The femur breaker now uses `*scream` instead of forced speech. This means + that the femur breaker will no longer spam deadchat with "AAAAAAAAAHHHHHHHHHH!!" + - tweak: The femur breaker will now guarantee that the victim falls into crit, which + will make it harder to perform torture scenes with it since the victim can just + succumb. + - bugfix: Fixed another runtime in warp whistles. + - bugfix: Spamming forged packets no longer crashes the server. + - bugfix: Things that access job_preferences now explicitly access keys, which means + it no longer attempts to access invalid indices and runtimes as a result. + - balance: The taser's electrode has been reworked. Instead of being a strong knockdown + that deals a heavy amount of stamloss, it now causes a weak knockdown, applies + a debilitating status effect for 5 seconds, and deals 35 stamloss on hit up + to a maximum 50 total stamloss. + - balance: Roundstart turrets now have a nonlethal projectile that gets used when + they're set to stun and the target is resting + - tweak: Hybrid tasers now have disablers set as their default mode. + - rscadd: There is now a 1% chance for the station's announcer to be the medibot + voice instead of the classic TG announcer. + - rscadd: The map config system has been expanded to allow mappers to specify the + map type, announcer voice, ingame year, and how often a given map can be voted + at roundend. + - bugfix: The map vote system now takes into account map playercount limits properly. + - bugfix: Examining a spaceman, and other things that use get_examine_string(), + will now actually properly show when an item is blood-stained. + - bugfix: Plasmaman tongues no longer have a maxHealth of "alien", and no longer + cause the organ's on_life to always runtime. + - bugfix: Shooting a simplemob no longer causes runtimes prior to the blood effect + being created. + - bugfix: Removing a filter from an object that lacks filters no longer causes runtimes. + deathride58 (Original PR by actioninja): + - rscadd: Disarm pushing (combat mode right click in disarm intent) will now actually + push mobs away. Knockdowns from disarm pushing are no longer rng based on the + target's staminaloss. Knockdowns from disarm pushing now only happen when you + push someone into another mob, a table, or a wall. Pushes will now also temporarily + stop targets from using firearms, and will disarm the firearm if performed a + second time. Pushes still deal staminaloss to standing targets, and won't deal + a single ounce of staminaloss to resting targets. + - rscdel: You can no longer displace mobs that are in harm intent by simply walking + into them. Mobs that aren't in help intent have to be disarm pushed to actually + be moved. + dtfe3: + - tweak: Increased music maxlines from 300 to 600 + - tweak: Made it so any oxygen tank can be used instead of only red ones. + - tweak: Watcher wing Trophy's effect lasts 1 second instead of 0.5 + - rscadd: Pink Panties + - rscadd: Twintails + - rscadd: Schoolgirl outfits for the loadout menu! + - tweak: Now the fox ears are located in front of hair meaning they now behave much + like cat ears, that being they are on-top of the hair layer. + izzyinbox: + - rscadd: adds VoG orgasm command using words "orgasm", "cum", "squirt", "climax" + - rscadd: adds VoG dab command using words "dab" and "mood" + - rscadd: Generic dog body marking sprite + - imageadd: colormatrix dog sprites + - tweak: lowered the player age for command jobs to 1/3 of their previous setting + - rscadd: '*bark emote' + jtgsz: + - rscadd: ported gang mode + kappa-sama: + - rscdel: Removed racism + - tweak: Teleporter calibration actually matters to all roundstart players + - balance: Slows down teleportation with the console/hub/teleporter setup if you + care for your species. + - balance: Dedicated non-humans can now get hulk without having to become human. + - bugfix: seed + - tweak: added obj/item/key to wallet whitelist + - tweak: blood cult ritual daggers fit in jack/combat boots + - tweak: voidcells can now unlock alien tech + - balance: rebalanced tech trees (not really) + - rscadd: hugbox (/s) + - tweak: ashwalker spawn text now tells them "i" "c" not to leave lavaland + - bugfix: you can no longer have infinite ebows + - bugfix: kevinz forgot to nerf miasma research and cargo value after making it + produce like 100x as much lmao + kevinz000: + - balance: Hierophant now goes sicko mode, but hey, at least you can't be multi-hit + by melee waves! + - rscadd: Racking shotguns is now more threatening. + - balance: Medibots no longer kill slimes when trying to heal their toxins. + - rscadd: The Syndicate started selling claymores to their agents. + - balance: Nerfed VTEC modules. + - bugfix: Neurotoxin no longer stuns non-carbons. + - rscadd: peacekeeper cyborgs now get a megaphone + - bugfix: Fixes storage bugs regarding reaching into things you shouldn't be able + to reach into. + - code_imp: BYOND 513 preliminary support added. + - balance: 'Trashbags now only allow accessing the first 3 items. 5 for bluespace + ones. experimental: Storage now allows for limiting of random access' + kiwedespars: + - rscadd: regenerative materia to hallucination sting + - rscadd: mindbreaker toxin as an actual chemical to hallucination sting + lolman360: + - rscadd: NT has authorized shipments or Cotton to Megaseed Servitors. It's time + to start picking, liggers. + - imageadd: missing durathread sprites + - rscadd: Added durathread jumpskirt + - imageadd: Duraskirt sprites and rolled down jumpsuit sprites. + - bugfix: Fixes an undocumented change to the naming of Plasmamen. + - tweak: chainsaw kind of weapons and the mecha drill and the CLAMP can now be used + with 100% accuracy for surgery + - refactor: surgery tools now work on defines + - balance: advanced surgerytools can now switch types instead of just being faster + - bugfix: fixes bug with new surgerytools examine + nicc: + - rscadd: Exo-suit + - rscadd: SEVA suit + - rscadd: Flags for Goliath resistance and weakness + - rscadd: suit voucher + - rscadd: temp suit sprites + - rscadd: '*dab' + - balance: teg less gay maybe + ninjanomnom and WhoneedSpacee: + - rscadd: Some rpg affixes now have special effects + - rscadd: 'New RPGLoot modifiers: Vampirism which heals you when you attack, Pyromantic + which sets things you hit on fire. Shrapnel which causes projectiles fired from + a gun to fire projectiles in a radius when they hit something. Finally, Summoning + which summons mobs that sometimes aid you in combat.' + original by @randolfthemeh and @twaticus, port by sishen1542: + - rscadd: jumpskirts + - rscadd: more jumpskirts + - rscadd: jumpskirt/suit prefs + original by Bumtickley00, port by sishen1542: + - tweak: Suit storage units will now also remove radiation from mobs. + original by GuyonBroadway, SkowronX, and Arizon5. port by sishen1542 and kerse: + - rscadd: Clockwork cultists may now summon forth Neovgre, the ratvrarian super + weapon. This powerful mech can be summoned when applications scripture has been + unlocked, boasts superior offensive and defensive capabilities, however once + a pilot enters he cannot leave and is doomed to die with the mech. + - imageadd: Sexy Sprite work courtesy or SkowronX from /tg/ + - imageadd: brass edits by Arizon5 + - soundadd: steamy laser by kerse + original by Skoglol, port by sishen1542: + - balance: Added lots of new virus cures, made cure difficulty scale more consistently. + Cures are now picked from a list of possible cures per resistance level, multiple + diseases at the same level no longer always share a cure. Looking at you table + salt. + - admin: Dynamic gamemode now more auto-deadmin friendly. + original by TheChosenEvilOne, port by sishen1542: + - rscadd: Ported dynamic mode from /vg/, originally made by @DeityLink, @Kurfursten + and @ShiftyRail + original by Tlaltecuhtli, port by sishen1542: + - rscadd: rcd disk that gives rcd computer frame and machine frame designs + - rscadd: upgraded rcd in CE lockers + - tweak: moved deconstruction to the upgrade disk, ashwalker rcd comes upgraded + original by actioninja, port by sishen1542: + - tweak: Medical and Security consoles now check access on worn or inhand ID instead + of requiring an inserted ID + - tweak: mining vendor now reads from ID in hand or on person instead of requiring + an inserted ID + - bugfix: ORM is functional again (for real this time) + - tweak: ORM claim points button transfers points to worn/inhand ID instead of to + an inserted ID, no longer accepts insertions + - tweak: Same for gulag consoles + original by redmoogle, port by sishen1542: + - rscadd: Added support for 3 new gasses; Tritium, Pluoxium, and BZ + 'original by: WJohnston, Antur, Arcane, plapatin, sprites by cogwerks and edited by mrdoombringer. port by sishen1542': + - rscadd: THE GOOSE IS LOOSE + r4d6: + - rscadd: Added decoratives angel wings for Mammalians only + - rscadd: Added blindfolds to the Loadout list + - rscadd: Added Decorative Wings for Humans, Felinids, Slimepersons and Lizardpeoples. + - tweak: Change the SEVA suit & Exo-suit's descriptions + - bugfix: Batteries are now Rad-Proof like the other stock parts + tigercat2000@Paradise: + - bugfix: fixed invalid characters breaking chat output for that message + tinfoil hat wearer: + - rscadd: Added a new alien technology disk to scientist and roboticist uplinks + that allows them to research the heavily-guarded secrets of the Grays. + - tweak: Alientech is now the only Hidden alien research. To compensate for this, + alien_bio and alien_engi have had their research costs doubled and now require + advanced surgery tools and experimental tools respectively to research. Their + export price is also halved. + - balance: roboticists now have brainwashing disks AND alien technology added to + their role-restricted uplink section. alien technology gives them brainwashing + at a much later date, so brainwashing is the much cheaper option for instant + power. makes logical sense because doctors get it as well because they do surgery, + and roboticists can now either choose to brainwash people for less price but + less power or emag borgs for higher prices, limited uses, but higher power. + ursamedium: + - imageadd: Gas icons changed. +2019-12-07: + AffectedArc07: + - code_imp: Fixes a LOT of code edge cases + Anonymous: + - rscadd: Added NEET-- I mean, DAB Suit and Helmet into loadout. Exclusive to Assistants, + for obvious reasons, and don't provide any armor. Goes well with balaclava, + finger-less gloves and jackboots for that true tactic~~f~~ool experience. + - tweak: Renamed loadout name appropriately (ASSU -> DAB) + Arturlang: + - tweak: PDA catridges cant be irradiated anymore. + Bhijn: + - code_imp: Item mousedrop() now provides a return value indicating whether or not + behavior has been overridden somehow. + - bugfix: Defibs now properly check that their loc is the same as the user for mousedrop() + calls, meaning ghosts can no longer make you equip defibs. Plus extra sanity + checks. + - bugfix: Pet carriers no longer attack turfs while trying to unload their contents. + - bugfix: Decks of cards now function as they originally intended when attempting + to use their drag and drop behavior. + - bugfix: Paper bins and papercutters no longer act wonky when you're trying to + pull a piece of paper from them. + - bugfix: Adds clothing drag n drop sanity checks. + - bugfix: Sythetic hats now have extra sanity checks + Coconutwarrior97: + - bugfix: Can only wrench down two transit tubes per turf. + Commandersand: + - rscadd: Added more stuff to loadout,check uniforms mask and backpack + DeltaFire15: + - rscadd: Adds eight new plushies + - imageadd: Adds icons for the new plushies and adds a new icon for the skylar plush + - imagedel: Deleted a old, no-longer used icon for the skylar plush + - spellcheck: Fixed a typo in the trilby plush + Fermis: + - tweak: tweaks botany reagent pHes + - tweak: Purity, Astral, RNG, MK, SMilk, SDGF, furranium, hatmium, eigen, nanite. + - bugfix: Eigen and purity. + - refactor: refactored sleepers! + - rscadd: Organ fridges to all maps near surgery with a random sensible organ, steralizine + and synthtissue. + - tweak: the med hand scanner to be less of a mishmash of random things + - rscadd: a little icon to the HUD if someone's heart has failed. + - tweak: Lets neurine's brain splash attack work via syringe. + - rscadd: a new surgery; Emergency Cardioversion Induction for use on the recently + deceased + - tweak: Synthtissue to be less demanding on growth size for organ regeneration + and improves clarify of it's growth gated effects. + - tweak: Synthtissue now is more useful than synthflesh on the dead + Fox McCloud: + - bugfix: Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot + would be less prone to igniting + Fox McCloud, Ghommie: + - bugfix: Fixes being able to mech-punch other mobs, as a pacifist + - bugfix: Fixes being able to hurt people, as a pacifist, by throwing them into + a wall or other mob, or by using most martial arts (save for the unpredictable + psychotic brawl, and the stamina-damage-only boxing). + - balance: Buffs boxing to outdamage natural stamina regeneration. Made the chance + of outright missing your opponent actually possible. + - tweak: Pacifists can now engage in the (laughably not harmful) sweet sweet art + of boxing now. + Ghommie: + - bugfix: Fixing implant cases being lost inside implant pads when trying to eject + them with your active hand full. + - tweak: Moved the implant pad's case ejection from attack_hand() to AltClick(), + added examination infos about it. + - bugfix: Fixed holodeck sleepers leaving sleeper buffers behind when deleted. + - bugfix: Fixed traitor codewords highlight and some other hear signal hooks spans + highlight (phobias, split personality, hypnosis) or modifiers (mind echo) + - bugfix: Fixed traitor codewords highlight not passing down with the mind datum + and stickying to the first mob. + - spellcheck: Fixed the incongruent bone satchel description. + - bugfix: Fixed sofa overlays doing nothing, because their layer wasn't properly + set. + - tweak: Suicide and cryo now prevents ghost/midround roles for a definite duration + of 30 minutes (and more if that was done before 30 minutes in the game passed), + down from the rest of the round. + - bugfix: fixed several midround roles bypassing and nulling the aforementioned + prevention measures. + - bugfix: Fixed the little issue of PDA skins not updating on job equip. + - tweak: Anomaly Crystals of the clowning type will now rename the victim to their + clown name preference when triggered, instead of giving them a random clown + name. + - balance: Lowered blob event earliest start from 1 hour to 40 minutes (ergo one + third), and the required player population from 40 to 35. + - bugfix: Several fixes and QoL for dullahans. They can see and hear visible and + audible messages now, don't need a space helmet they can't wear anyway to be + space/temperature proof, can examine things through shiftclick, and, most of + all, fixed their head being unpickable. Fixed dullahans gibbing when revived + or had their limbs regenerated. + - bugfix: humans should now drop gibs when gibbed again. + - rscadd: synths (not to be confused with IPCs), android and corporate species, + as well as robotic simple mobs, will now spawn robotic giblets instead of organic + ones. + - bugfix: You can't wear dakimakuras in any other inappropriate slots save for the + back slot anymore, degenerates. + - bugfix: Insert snarky remark about clock welders actually displaying the welder + flame overlay when turned on now here. + - balance: Minor ninja tweaks and stealth nerfs. The stealth penalty for the many + combat-related actions, bumping and now teleporting/dashing or firing guns has + been increased a by a third. There is now a cooldown of 5 seconds on toggling + stealth as well as a slighty slowed stealth in/out animation. + - imageadd: Ported slighty better matchbox sprites from CEV-Eris, also resprited + cigar boxes myself. + - bugfix: Fixed abductors/abductees objectives by porting an objective code. + - bugfix: Riding component fix + - bugfix: fixing a few runtimes on lightgeists, libido trait, rcd, one admin transformation + topic, chem dispensers, glowing robotic eyes... + - imageadd: Porting CEV-eris delivery packages sprites and dunking the old syndie + cybernetics box sprite. + - bugfix: Certain objects shouldn't be able to become radioactive because of a bitflag + that previously was checked nowhere in the code anymore. + - rscadd: Added a new PDA reskin, sprites from CEV-Eris + - rscadd: Clock cult starts with some spare vitality matrix charge scaled of the + number of starter servants. + - balance: Made the vitality matrix sigil slighty more visible, also allowed conversion + runes to heal fresh converts at the cost of some vitality charge. + - bugfix: 'Crawling won''t save you from the wrath of ocular wardens and pressure + sensors anymore, heretics. fix: Pressure sensors are no more triggered by floating/flying + mobs.' + - bugfix: Strawberry milk and tea have sprites now. + - bugfix: Fixed the Aux base camera door settings and toggle window type actions. + Also enabling the user to modify both door access and type. + - imageadd: Improved the two grayscale towel item sprites a little. + - bugfix: Fixed towels onmob suit overlays. Again. + - spellcheck: Fixed some reagents taste descriptions. + - bugfix: Fixed hidden random event reports only priting a paper message without + sending the message to the consoles' message list. + - bugfix: Rosary beads prayer now works on non-carbon mobs too, and won't break + when performed on a monkey or other humanoids. + - tweak: You can flagellate people with rosary beads on harm intent. It's even mediocrer + than the sord though. + - tweak: Moved the `Stealth and Camouflage Items` uplink category next to `Devices + and Tools`. + - bugfix: Deleted a duplicate phatom thief mask entry from the uplink. + - bugfix: Fixed missing delivery packages sprites + - bugfix: fixed a few minor issues with console frames building. + - bugfix: Wizards can use the teleport spell from their den once again. + - tweak: Wizards will now receive feedback messages when attempting to cast teleport + or use the warp whistle while in a no-teleport area. + - rscadd: New clockwork cultist, gondola, monkey and securitron cardboard cutouts. + - bugfix: Fixed aliens gasping randomly once in a while. + - bugfix: fixed superlube waterflower, my bad. + - bugfix: Fixed closing the aux base construction RCD's door access settings window + throwing you out of camera mode when closed. + - rscdel: Removed not functional aux base RCD's door type menu. Use airlock painters, + maybe. + - rscadd: Honkbot oil spills are of the slippery kind now. Honk. + - imageadd: local code scavenger finds forgotten slighty improved apc sprites left + buried in old dusty folders. + - bugfix: Seven old and otherwordly pAI holochassis icons have crawled their way + out of the modular citadel catacombs. + - bugfix: chem dispenser beakers end up in your hand yet again. + - bugfix: Bikehorns squeak yet again, the world is safe. + - bugfix: Cyborgs can now actually use cameras from a distance. + - bugfix: Suicides are yet again painful and instant and won't throw people in deep + crit from full health. + - bugfix: fixed rogue pixels on the energy gu- ahem blaster carbine... and a few + apc lights states being neigh-indistinguishable. + - bugfix: Fixed several "behind" layer tail sprites skipping areas normally covered + by bodyparts. + - bugfix: Morgues' original alert beeping sound has been restored, they no longer + go "ammunition depleted" + - bugfix: Fixed missing hypereutactic left inhand sprites. + - bugfix: Dying, ghosting, having your mind / ckey transferred to another mob, going + softcrit or otherwise unconscious now properly turn off combat mode. + - bugfix: combat mode can't be toggled on while non fully conscious anymore. + - bugfix: Fixed limbs' set_disabled NOT dropping your held items, updating your + hand slot inventory screen image, prompting chat messages and making your character + scream like a sissy. + - bugfix: Lusty xenomoprh maids will now actually clean tiles they travel onto yet + again. + - bugfix: Fixed double whitespace gap in human and AI examine. Fixed single whitespace + in carbon examine. + - rscdel: 'Removed a few useless supply packs: "Siezed" power cells, means of production + and promiscous organs.' + - tweak: Merged the synthetic blood supply pack into the standard blood supply pack, + effectively removing a random type blood pack in favor of two synthetic ones. + - tweak: "Merged together premium carpet pack n\xB01 and n\xB02 to hold one of each\ + \ standard pattern." + - tweak: You can no longer estimate the amount of reagents found inside a damp rag. + - tweak: You can now squeeze a rag's reagents into another open container, as long + as the other one is not full. + - bugfix: Fixed ED-209 being unbuildable past the welding step. + - bugfix: Fixed ai displays status being reset to "Neutral" on login, regardless + of choice. + - bugfix: Fixed tinfoil hats giving random traumas. + Ghommie (original PR by Denton): + - rscadd: Added three new .38 ammo types. TRAC bullets, which embed a tracking implant + inside the target's body. The implant only lasts for five minutes and doesn't + work as a teleport beacon. Hot Shot bullets set targets on fire; Iceblox bullets + drastically lower the target's body temperature. They are available after researching + the Subdermal Implants node (TRAC) or Exotic Ammunition node (Hot Shot/Iceblox). + - tweak: Renamed the Technological Shells research node to Exotic Ammunition. + - code_imp: The "lifespan_postmortem" var now determines how long tracking implants + work after death. + - rscadd: .357 AP speedloaders can now be ordered from syndicate uplinks. + - balance: lowered the cost of uplink's .357 speedloaderd from 4 to 3. + Ghommie (original PR by nicbn and Menshin): + - bugfix: You can click on things that are under flaps or holo barriers. + Ghommie (original PRs by ShizCalev, CRTXBacon and Niknakflak): + - rscadd: Adds the intelliLantern, a big ol' spooky intelliCard skin + - rscadd: crafting recipe for the new intelliCard skin (requires 1 pumpkin, 1 intelliCard, + 5 cables and a wirecutter as a tool) + - tweak: changed the intelliTater crafting recipe to match the intelliLantern recipe + (but with a potato for obvious reasons) add:cute pai gameboy face :3 + Ghommie, porting lot of PRs by MrDoomBringer, AnturK, nemvar and coiax.: + - admin: Admins can now launch supplypods the old, slightly quicker way as well + - bugfix: Centcom-launched supplypods will now properly delimb you (if they are + designated to do so) instead of touching you then literally yeeting all of your + internal organs out of your body. + - admin: Centcom can now specify if they want to yeet all of your organs out of + your body with a supplypod + - soundadd: Supplypods sound a bit nicer as the land now. + - admin: admins can now adjust the animation duration for centcom-launched supplypods + - admin: admins can adjust any sounds that are played as the supplypod lands + - bugfix: Reverse-Supplypods (the admin-launched ones) no longer stay behind after + rising up, and also auto-delete from centcom. + - admin: The centcom podlauncher now has better logging + - tweak: Admins can now allow ghosts to follow the delivery of Centcom-launched + supply pods + - admin: Admins can now use the Centcom Podlauncher to launch things without the + things looking like they're being sent inside a pod. + - admin: sparks will not generate if the quietLanding effect is on, for the centcom + podlauncher + - admin: makes input text clearer for the centcom podlauncher + - admin: New 'Podspawn' verb, which functions like 'Spawn', except any atoms movable + spawned will be dropped in via a no-damage, no-explosion Centcom supply pod. + - bugfix: Removed an oversight that made many obj/effect subtypes accidentally bombproof. + GrayRachnid: + - rscadd: Added saboteur syndicate engiborg + - tweak: changed cyborg tool icons and the secborg taser/laser icons. + - bugfix: Fixes golden toolbox missing inhand sprite + - rscadd: Added traumas + - rscadd: Added science powergame tool + - tweak: a few hearing args + - bugfix: fixed my mistakes + - tweak: tweaked the number of ingredients/pancakes you can stack. + Hatterhat: + - tweak: The Big Red Button now sets bomb timers to 2 seconds, instead of 5. + - tweak: Gloves of the North Star (not Hugs of the North Star) now use all their + intents very, very fast. This does not apply to grabs' click cooldown, nor shoving + people. + - rscadd: The seedvault/alien plant DNA manipulator can now be printed off with + Alien Biotechnology. + Iroquois-Pliskin: + - rscdel: Removed Clockwork Cult Surgical facility from Reebe + Jerry Derpington, baldest of the balds, and nemvar.: + - rscdel: Nanotrasen has lost communication to two away mission sites that contained + a beach for Nanotrasen employees. + - rscadd: Nanotrasen has been able to locate a new away mission site that ALSO has + a beach. Nanotrasen employees will be able to enjoy the beach after all! + - rscadd: Seashells have been added to the game. + KathrinBailey: + - rscadd: Two extra 'luxury' dorms rooms! + - rscadd: Gas miners to atmos. + - rscadd: Posters around the station. + - rscadd: Vacant room added to the Starboard Bow with it's own APC, above electrical + maintenance. + - rscadd: New trendy clothes to the locker room, giving variety and bringing fashion + back onto Nanotrasen stations. + - rscadd: Coloured bedsheet and towel bin. + - rscadd: Maid uniforms for the janitor. + - tweak: Completely reworked bar. Milk kegs added in bar office. The bar has been + changed for a homey restaurant feel just in time for Christmas! You can now + run it as an actual restaurant! Local Bartender Icktsie III loved it so much + he rolled around on the new floor smiling happily. + - tweak: Dorms rework. Fitness room now has lots of costumes and outfits. + - tweak: Junk removed from engineering, welding goggles added. + - tweak: Welding tools in engineering replaced with industrial welding tools. + - tweak: Package wrappers and hand labellers now in major departments. + - tweak: Cell charger moved from engineering lobby to the protolathe room, just + like how it is in all of the other maps and just where the cell charger is actually + needed. + - tweak: Library redesigned to have a private room and a 3x3 private study that + is cleaned up. + - tweak: Paper bins have gone big or gone home, with premium stationery scattered + around. Engineering and security now have a labeller and packaging supplies. + - bugfix: Dark spot top left of Botany fixed. + - bugfix: Huge galactic-sized dark spot in bar fixed. + - bugfix: Light replacers now are less horrifically overpowered and PTSD-inducing + for the server. + - bugfix: 'Fixes issue 9706: https://github.com/Citadel-Station-13/Citadel-Station-13/issues/9706 + Part of maint getting hit by radstorms. + + _Kathrin''s Box Beautification:_' + - rscadd: Ports TG's pews https://github.com/tgstation/tgstation/pull/42712 + - rscadd: The first step of a corporate incursion of Space IKEA into Nanotrasen. + Kevinz000, Cruix, MrStonedOne, Denton, Kmc2000, Anturk, MrDoomBringer, Dennok, TheChosenEvilOne, Ghommie: + - rscadd: Added support for Multi-Z power, atmospherics and disposals + - bugfix: 'massive service department nerf: space can no longer be extra crispy.' + Knouli: + - rscadd: attack_self proc for the legion core which triggers a self-heal al la + the previous 'afterattack' proc, as if clicking on the character's own sprite + to self-heal + - rscadd: admin logging for all three use cases of legion core healing - afterattack, + attack_self, and implanted ui_action_click + Krysonism, Ghommie: + - rscadd: NT has made breakthroughs in ice cream science, ice creams can now be + flavoured with any reagent! + - tweak: The ice cream vat now accepts beakers. + - bugfix: Grape and Peach icecreams have scoop overlays yet again. + Linzolle: + - code_imp: butchering component update + - tweak: hat tossing can no longer knock hats off + - bugfix: strange reagent being unable to revive simplemobs + - rscadd: jitter animation and more clear text to strange reagent revival + Mickyy5: + - rscadd: Nanotrasen are now issuing Plasmamen with plasma in their survival boxes + MrJWhit: + - tweak: tweaked brain damage line + Naksu, ShizCalev: + - refactor: Refactored examine-code + - bugfix: Examining a human with a burned prosthetic limb will no longer tell you + that the limb is blistered. + - tweak: Items will now inform you if they are resistant to frost, fire, acid, and + lava when examined. + Owai-Seek: + - rscadd: '"silly" bounties' + - rscadd: '"gardenchef" bounties' + - rscdel: several bounties that require seriously good RNG to pull off. + - tweak: moved several chef and assistant bounties to silly and gardenchef + - balance: modified several bounty point rewards + - server: added new files "silly.dm" and "gardenchef.dm" + - rscadd: 15+ new crates for cargo + - tweak: organizes crates and moving them to proper categories + - rscdel: some dumb stuff like toner crates re + - rscadd: leg wraps and sweaters to clothesmate + - rscadd: screwdriver and cable coil to janidrobe + - rscadd: screwdriver and cable coil to janibelt whitelist (for fixing/placing light + fixtures) + - rscadd: monkey cube, syringe, enzyme, soy sauce, and cryoxadone to chef's vendor + (contraband and premium) + - rscadd: add cracker, beans, honey bars, lollipops, chocolate coin, and spider + lollipop to snack vendors (contraband and premium) + - rscadd: newspaper to loadout menu for bapping purposes + - rscdel: removed poppy pretzels from snack vendor premium + - rscadd: maid uniform (janimaid alt) to kinkmate. + - tweak: moves gear harness from premium to normal stock in kinkmate + - balance: re-balanced metal shield bounty + - rscadd: cryoxadone bottle (for use in chef vendor) + PersianXerxes: + - tweak: Reduces the grace period for meteors from a minimum of 5 and maximum of + 10 to 3 and 6 minutes respectively. + - rscadd: Adds a pair of VR sleepers to Box Station's permabrig + - rscadd: Adds a pair of VR sleepers to Delta Station's permabrig + - rscadd: Adds a pair of VR sleepers to Pubby Station's permabrig + - rscadd: Adds a pair of VR sleepers to Meta Station's permabrig + Putnam: + - bugfix: From-ghosts dynamic rulesets now actually listen to "required candidates" + - bugfix: Every dynamic-triggered event is now blacklisted from being triggered + by the random events system when dynamic can trigger them. + - rscadd: Dynamic voting now features extended, if recent rounds have been chaotic. + - tweak: Roundstart rulesets now scale on population ready rather than total population. + - bugfix: Threat log now accurately represents what actually used the threat. + - tweak: Verbose threat log (admin-only) now shows ALL threat level changes. + - bugfix: VR mobs can no longer be dynamic midround antags. + - bugfix: Personal closets can use anything that holds an ID card now. + Putnam3145: + - bugfix: traitors work now + - balance: Gas filters now push gas the same way volume pumps do. + - balance: Gas filters now won't clog if only one output is clogged. + - tweak: Glowsticks can no longer be radioactively contaminated (one more supermatter + contam exploit gone) + - bugfix: traitor removal is no longer borked + - rscadd: Dynamic voting + - config: Added DYNAMIC_VOTING to game_options + - tweak: SDGF now copies memories as well as antag data and factions. + - bugfix: Summon events now properly costs threat. + - bugfix: Refunded spells refund threat, too. + - refactor: Made wizard spells inherently have a requirement and cost. + - tweak: Meteor wave is no longer repeatable in dynamic. + - tweak: tweaked nuke ops + - bugfix: Organs can no longer be radioactively contaminated. + Robustin, Subject217: + - balance: The NukeOp Shuttle hull has been dramatically hardened. The walls are + now "R-Walls" with far greater explosion resistance. + - balance: The NukeOp Shuttle guns have been significantly buffed. They now rapidly + fire a new type of penetrator round, at a greater range, and have far greater + explosion resistance. + - balance: The nuclear device on the NukeOp Shuttle is now in an anchored state + by default, the Nuke can only be unanchored by inserting the disk and entering + the proper code. + - balance: Non-Syndicate cyborgs are now unable to access the NukeOp Shuttle Console. + - bugfix: You can now unanchor Nukes even when the floor under them has been destroyed + Seris02: + - rscadd: added sleeping carp hallucination + - rscadd: Centcom + Assistant's formal winter coat + loadout + narsian + ratvarian + winter coats + - rscadd: GPS location on examine + - bugfix: fixed the meteor hallucination + - tweak: tweaked the way the tapered penis looks + - rscadd: Added nine winter coats + - imageadd: added images for the winter coats + - tweak: adds the mining winter coat to mining wardrobes and mining lockers + ShizCalev: + - tweak: Ghosts can now see active AI cameras. + - bugfix: Fixed a couple of laser / energy guns never switching to the empty icon + despite being unable to fire. + Swindly: + - bugfix: Fixed MMIs not being able to use mecha equipment + - bugfix: Fixed MMIs not getting mecha mouse pointers + - bugfix: Fixed MMIs not getting medical HUDs in Odysseuses + - tweak: Brains can now switch to harm intent + Tetr4: + - bugfix: Turning a tile with gas effects into space now gets rid of the effects. + Trilbyspaceclone: + - rscadd: plastic trash cart crafting with plastic + - rscadd: wallets are known for now holding more items + - tweak: shades and clowns HP + - rscadd: six more crates, A barrel, A Loom, 40 cotton sheets, two sets of fruit + crates, raw lumber crate + - rscadd: All fermi chems, Boozes, Medical, food chems now sell + - rscadd: Loads more to sell - Mech gear, Cooking and more! + - tweak: Moved around the vaule of some things and removed elastic of most items + - balance: Rebreather implants will now loss vaule, Do to being just metal and glass + - balance: lowered how many chems are in lewd chem kegs to be around 150-100 as + well as the fancy booze kegs + - bugfix: bad returns and tools used + - rscadd: 8 new cargo crates! + - tweak: tablet cargo crate by -3k + - admin: Closes a bunch of issues + - server: updates changlogs and such + - bugfix: fixed a catnip not having sprites + - balance: Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw + and base ball bat into bulky items so they may fit + - server: changes header to be more cit-like + - rscadd: new clothing for the hotel staff and a hat + Ty-the-Smonk: + - bugfix: You can now interact with self sustaining crossbreeds + Useroth: + - rscadd: Colored fairygrass variants. + - bugfix: Added a missing cherrybulb seedpack sprite + - bugfix: numbered storages now are sorted in a consistent way, instead of depending + on ordering of their contents var + - rscadd: strange seeds as a buyable traitor botanist item + - bugfix: resolves the issues revolving around blackpowder exploding where the reaction + happened, instead of where it actually is through making it explode instantly + - tweak: the explosion delay moved from blackpowder directly into bomb cherries, + to keep them functioning as intended + - rscadd: A bunch of newer tg plants + - rscadd: A bunch of newer tg plant traits + - rscadd: A couple of newer tg plant reagents + - bugfix: the new plants now properly get their reagents and reagent genes instead + of being empty with UNKNOWN reagents listed in the DNA machine + - rscadd: extradimensional oranges now contain haloperidol + - bugfix: extradimensional oranges now actually grow properly and give proper seeds. + Weblure: + - rscadd: Button added to slime console that prints out the hotkey commands to the + user. [Includes DMI update] + - rscadd: Shift-click a slime to pick it up, or the floor to drop all held slimes. + (Requires Basic Slime Console upgrade) + - rscadd: Ctrl-click a slime to scan it. + - rscadd: Alt-click a slime to feed it a potion. (Requires Advanced Slime Console + upgrade) + - rscadd: Ctrl-click on a dead monkey to recycle it, or the floor to place a new + monkey. (Requires Monkey Console upgrade) + - rscadd: If the console does not have the required upgrade, an error message will + print to the user. + - rscadd: You can now pick up a single slime from a pile, instead of all of them + at once. + - tweak: When recycling monkeys, the console will now report how many monkeys it + has (will not report decimal increases). + - tweak: Console now alerts you when you're out of monkeys and reports your current + decimal amount. + - tweak: Console messages are now styled consistently. + XDTM, ShizCalev, Naksu, Skoglol, cacogen, Rohesie (ported by Ghommie): + - tweak: Holding an ID in your hands uses it instead of your worn ID for authentication + purposes. + - tweak: If you don't have an ID in your id slot, the belt slot will be checked + as well. + - code_imp: small cleanup to id and bounty console html generation + - tweak: Hop console now hurts your eyes less. Red button text replaced with green. + - tweak: IDs with ID console access now go into the Confirm Identity slot by default + like they used to, similarly IDs without it go into the Target slot by default + again + - rscadd: Can easily swap out IDs by clicking the machine or the UI fields with + another ID + - rscadd: ID console now names which IDs are added/removed in its visible messages + - rscadd: Labels the ID slot fields when logged in so you know which is which + - tweak: Can use Job Management without an ID provided the console is logged in + (matches how the console now stays logged in even without an ID) + - tweak: Can log in without an ID in the Target field (matches how the machine now + stays logged in even after the ID is removed from the Target field) + - tweak: Cleans up UI slightly (had some duplicate/conflicting buttons) + - bugfix: Fixes ID console duping issues. Includes some ID containers, such as PDAs, + tablets and wallets, into the swapping behavior when an ID card is being removed + and the item is being held. + Xantholne: + - rscadd: New Berets for most heads and departments available in their autodrobes + or lockers + YakumoChen: + - imageadd: New AI Holograms and Displays! Ported from /vg/station. + actioninja: + - bugfix: med records no longer can eat id cards for no reason + - bugfix: Chat is properly sent to legacy window if goonchat fails to load again. + dapnee: + - bugfix: fixed closet initialisation being broken + - rscdel: emergency closets no longer have a 1% chance to delete themselves + - bugfix: Communications console window no longer updates, won't steal focus anymore. + - bugfix: Trimline neutral end exists now. + dzahlus: + - soundadd: added a new gun sounds + - sounddel: removed an old gun sounds + him: + - bugfix: hos and aeg guns now conform to le epic taser rework standards + kappa-sama: + - tweak: changed flavor text of alien tech on uplink + - imageadd: added TG's icons for traitor, russian, and golden revolver + kevinz000: + - rscadd: you can now choose never for this round for magical antags + - rscadd: Cargo has passive point generation again at 750 points/minute + - balance: Mindshield crate price increased from 3000 to 4000 + - balance: Miasma sell price reduced from 15/mol to 4/mol + - balance: bluespace wizard apprentice now has blink instead of targeted area teleportation + - balance: Emagged medibots now charcoal toxinlovers. + - balance: disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage + - balance: kinetic crushers no longer drop if you try to use it with one hand + - config: added multi_keyed_list, delimiter defaults to |. + - balance: Light pink extracts no longer speed you up. Instead, they give stamina + regeneration and free sprinting. + kiwedespars: + - rscdel: removed moth fluff coloring you like your wings + - balance: made insect not so bad. + nemvar: + - bugfix: You now get a message if your PDA explodes while you are holding it. + - tweak: The lavaland clown ruin has some new pranks ready. + - rscadd: Added a new loot item to the lavaland clown ruin. + - rscdel: Removed the slime core from said ruin. + - balance: The clown PDA now properly slips people on jogging move intent regardless + of fatigue. Honkmother's will. + nemvar, ShizCalev, Qustinnus/Floyd, Ghommie: + - rscadd: You can now unfasten the loom. + - tweak: it now takes 4 strands to make one piece of durathread cloth + - bugfix: Looms can now be attacked. + - rscadd: Durathread golem weaves his magic + - tweak: Supply ordered looms are unanchored. Bring a wrench. + r4d6: + - rscadd: Added Departements Winter Coats to the loadout list. +2019-12-30: + AnturK: + - bugfix: Fixed ranged syndicate mobs stormtrooper training. + Arturlang: + - rscadd: Adds Bloodsuckers, beware. + BlueWildrose: + - bugfix: Fixed stargazers being unable to link to themselves if mindshielded or + if holding psionic shielding devices (tinfoil hats) when the species is set. + - bugfix: Fixes non-roundstart slimes being unable to wag their tail. + Commandersand: + - tweak: added two words to clown filter + - rscadd: Added new things to loadouts, check em + DeltaFire15: + - balance: Clock cult kindle no longer cares about oxygen damage + - tweak: changed mecha internals access for some special mechs. + - tweak: no more mech maintenance access for engineers. + - tweak: All heads of staff can now message CC + - code_imp: Removes a magicnumber + - balance: Rebalanced cult vs cult stun effects to debuff instead of stun + Detective-Google: + - bugfix: short hair 80's is no longer jank + Fermis: + - tweak: tweaked how super bases/acids work but limiting them + Fikou: + - tweak: the windup toolbox now has some more "realistic" sounds + - bugfix: the windup toolbox now rumbles again + Ghommie: + - bugfix: Fixed hulks, sleeping carp users, pacifists and people with chunky fingers + being able to unrestrictly use gun and pneumatic cannon circuit assemblies. + - bugfix: Fixed gun circuit assemblies being only usable by human mobs. + - balance: Doubled the locomotion circuit external cooldown, thus halving the movable + assemblies' movespeed. + - tweak: Made wooden cabinet/closets... actually made of wood. + - tweak: Wooden cabinets are now deconstructable with a screwdriver. + - tweak: Deconstruction of large crates and other closet subtypes deconstructable + with tools other than the welder is no longer instant. + - tweak: You shouldn't be able to target objects you can't see (excluding darkness) + with the ARCD and RLD + - tweak: The admin RCD is ranged too, just like the ARCD. + - bugfix: Fixed welding, thirteen loko, welding and wraith spectacles not blinding + people as expected. Thank you all whomst reported this issue in the suggestions + box channel instead of the github repository's issues section, very smart! + - bugfix: Fixed on_mob eyes overlays not updating properly in certain cases. + - bugfix: Fixed deconversion from bloodshot eyes blood cult resetting your eyes' + color to pitch black instead of their previous color, more or less. + - balance: 'Spinfusor nerf: Upped the casing and ammo box size by one step, removed + the projectile''s dismemberment value (explosions can still rip a limb or two + off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents + from 32 to 8, removed the casing''s ability to explode when thrown.' + - bugfix: Fixes bubblegum's death not unlocking the arena shuttle buyment. + - bugfix: Fixed alien tech node not being unlockable with subtypes of the accepted + items. + - bugfix: Fixed reactive armor onmob overlays not updating when toggled and reactive + teleport armor still using forceMove() instead of do_teleport() + - bugfix: Fixed space hermit asteroid rocks unintendedly spawning airless asteroid + turf when mined, save for the perimeter. + - bugfix: Fixes reviver implant having been a crapshot ever since soft-crit was + introduced years ago. + - tweak: Added a "convalescence" time (about 15 seconds) after the user is out of + unconsciousbess/crit to ensure they are properly stabilized. + - tweak: Added a 15 minutes hardcap for accumulated revive cooldown (equivalent + to 150 points of brute or burn healed) above which the implant starts cooling + down regardless of user's conditions. + - bugfix: Fixed AI core displays I may have broken with my coding extravaganza. + - soundadd: Blue, Amber and Red security alert sounds should be half as loud now. + - balance: Buffed clown ops by removing their clumsiness and adding a new trait + to be used in place of several clown role checks. + - tweak: Clown ops too also suffer from not holding or wearing clown shoes now. + - bugfix: Fixed a few holo barriers lacking transparency. + - bugfix: Fixed character setup preview bodyparts not displaying correctly most + of times. + - bugfix: Fixed character appearance preview displaying the mannequin in job attire + instead of undergarments. + - bugfix: Fixed raven's shuttle computer not being of the emergency shuttle type. + - tweak: Blood bank generators can now be anchored and unanchored now. + - admin: Ghost mentors can now orbit around the target instead of setting their + view to theirs'. + - bugfix: Fixes a ghostchat eavesdropping exploit concerning VR. + - bugfix: Fixes VR deaths being broadcasted in deadchat. + - bugfix: Fixed a few pill bottle issues with the ChemMaster. + - bugfix: Fixes a few negative quirks not being properly removed when deleted. + - tweak: Phobia and mute quirks are no longer cheesed by brain surgery grade healing + or medicines. + - bugfix: Fixed double-flavour (and bland custom) ice creams. + - bugfix: Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'. + - bugfix: dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just + like humies, ayys and monkys. + - bugfix: Stops humanoids whose skin_tone variable is set to "albino" from showing + up as pale when examined should their species not use skintones anyway. + - rscdel: Removed the old (almost) unused roboticist encryption key and headset. + - bugfix: Fixed goose meat. + - bugfix: Fixed a little door assembly glass dupe exploit + - bugfix: Fixed AI holopad speech text being small and whispers that in multiple + exclamation marks echo through multiple areas. + - rscdel: Removed literally atrocious polka dotted accessories. They were even more + atrocious than the yellow horrible tie. + Ghommie (also porting PRs by AnturK and Arkatos): + - bugfix: Fixed light eaters not burning out borg lamplights and flashes. fix Fixed + light eater not affecting open turfs emitting lights such as light tiles and + fairy grass. + - bugfix: Fixed an empty reference about light eater armblade disintegration after + Heart of Darkness removal. + Ghommie, Skogol: + - refactor: refactored altclick interaction to allow alt-click interactable objects + to parent call without forcing the turf contents stat menu open. + - tweak: Alt clicking will no longer show turf contents for items inside bags etc. + - tweak: Alt clicking the source of your turf contents stat menu will now close + said menu. + GrayRachnid: + - bugfix: fixes consistency + Hatterhat: + - rscadd: Regenerative nanites, a "chemical" used in the combat stimulant injector. + Actually quite stimulating, and not bad in a pinch for a nuclear operative. + Check the Combat Medic Kit! + - tweak: The Combat Medic Kit now has an advanced health analyzer and medisprays + instead of patches and a chloral syringe. + - balance: The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get + the better injector, because nobody uses it and so nobody's bothered to update + it. + - rscadd: .357 speedloaders can now be printed with the Advanced Illegal Ballistics + node on the tech tree! + - balance: okay so i may have given the .357 an extra speedloader at the same cost + but it comes in a box now + ItzGabby: + - bugfix: Fixed AltClick on polychromic collars so they actually work now. + KeRSedChaplain: + - soundadd: Extends the file "deltakalaxon.ogg" to a 38 second .ogg. + Linzolle: + - rscadd: neck slice. harm intent someone's head while they are unconscious or in + a neck grab to make them bleed uncontrollably. + - bugfix: officer's sabre now properly makes the unsheating and resheating noise + - bugfix: fireman failure has a different message depending on the circumstance + - rscadd: Abductor chem dispenser, and added it to the abductor console. + - rscadd: '"Superlingual matrix" to the abductor console. It''s the abductor''s + tongue. Can be used to link it to your abductor communication channel and then + implanted into a test subject.' + - rscadd: Shrink ray and added it to the abductor console. + - soundadd: Shrink ray sound effect (its the fucking mega man death sound) + - rscadd: special jumpsuit for abductors + - imageadd: abductor jumpsuit, including digi version if a digitigrade person somehow + manages to get their hands on it. sprites for the shrink ray and chem dispenser. + - rscadd: new glands to play with, including the all-access gland, the quantum gland, + and the blood type randomiser. + - code_imp: split every gland into its own file instead of all being in one file + - tweak: cosmic coat crafting recipe changed to coat + cosmic bedsheet + Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac: + - bugfix: Certain incompatible quirks can no longer be taken together. + - bugfix: If an admin sends a ghost back to the lobby, they can now choose a different + set of quirks. + - spellcheck: the quirk menu went through some minor formatting changes. + - bugfix: Podcloning now lets you keep your quirks. + - rscadd: Quirks have flavor text in medical records. + - spellcheck: All quirk medical records refer to "Patient", removing a few instances + of "Subject". + - tweak: Quirks no longer apply to off-station roundstart antagonists. + - code_imp: Mood quirks are now only processed by the quirk holders + Narcissisko (ported by Hatterhat): + - rscadd: Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, + a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547. + Nervere and subject217, Militaires, py01, nemvar: + - balance: The cook's CQC now only works when in the kitchen or the kitchen backroom. + - spellcheck: corrected CQC help instructions + - bugfix: CQC and Sleeping Carp are properly logged. + - tweak: CQC can passively grab targets when not on grab intent. Passive grabs do + not count towards combos for CQC or Sleeping carp. + - code_imp: Martial Art and NOGUN cleanup. + PersianXerxes: + - rscdel: Removed night vision quirk + Putnam: + - bugfix: acute hepatic pharmacokinesis now works if you already have relevant genitals + - balance: Contamination is no longer an infinitely spreading deadly contagion causing + mass panic + - tweak: Dynamic rulesets have lower weight if a round recently featured them (except + traitor). + Putnam3145: + - balance: Buffed HE pipes by making them realistically radiate away heat. + - bugfix: Dynamic has a (totally unused for any relevant purpose) roundstart report + now. + - admin: A whole bunch of dynamic data is now available for statbus + - bugfix: Dynamic from-ghost antags no longer double dip on threat refunds when + the mode fails due to not enough applications. + - bugfix: whoops broke quirks + - bugfix: quirks work + - rscadd: 'New tab in preferences screen: "ERP preferences"' + - rscadd: New opt-outs for individual effects of incubus draught, succubus milk + - rscdel: Acute hepatic pharmacokinesis has been removed, replaced with above + - tweak: Renamed "Toggle Lewdchem" to "Toggle Lewd MKUltra", since that's what it + actually means, and made it toggle the "hypno" setting (rename it again if more + hypno mechanics are added). + - tweak: Made MKUltra's lewd messages require both people involved to have hypno + opted-in. + - config: Buncha dynamic config tweaks + - bugfix: Ghost cafe spawns are actual ghost roles by the game's reckoning now + - bugfix: a runtime in radioactive contamination + - balance: Bomb armor now acts like other armor types. + - balance: Devastation-level explosions on armorless people no longer destroys everything + in their bags. + Seris02: + - rscadd: the clowns headset + - bugfix: distance checks + - bugfix: the sprites + - rscadd: added the runed and brass winter coats (cosmetic ratvarian/narsian) + - tweak: how the narsian/ratvarian coats can be made + - bugfix: fixes some ghost roles from dying of stupid shit + - bugfix: pandoras attacking their owners + - rscadd: Added Rising Bass and the shifting scroll. + - tweak: Changes the martial arts scroll in the uplink to "Sleeping Carp Scroll" + ShizCalev: + - bugfix: Fixed floodlights not turning off properly when they're underpowered. + - bugfix: Fixed emitters not changing icons properly when they're underpowered. + Sishen1542: + - rscadd: Clicking a pack of seeds with a pen allows you to set the plant's name, + description and the pack of seeds' description. Useful for differentiating genetically + modified plants. These changes will persist through different generations of + the plant. + - rscadd: Hydroponics trays update their name and description to reflect the plant + inside them. They revert to default when emptied. + Toriate: + - rscadd: Polychromic shorts now have a digitigrade state + Trilbyspaceclone: + - rscadd: ports all the new donuts, burgars, and chicken stuff from RG + - rscadd: ports new snowcone + - rscadd: ports grill + - rscadd: ports beakfeast tag/mood lit as TG has it + - rscadd: ports all the amazing new sprites + - tweak: ports crafting for many things like snowcones needing water + - balance: ports of many craftings + - soundadd: lowers fryers sound + - imageadd: ported icons for new food/grill + - imagedel: ports the deletion of some icons and images + - spellcheck: ports a spell check for the snowcones + - code_imp: ports fixes for stuff I didnt know were even broken with snowcones + - bugfix: coder cat failers to push the last commit from year(s) ago + - admin: Updates the changlogs + - tweak: meat hook from HUGE to bulky + - tweak: CE hardsuit is now more rad-proof + - bugfix: Wrong icon names, missing dog fashion with telegram hat + - rscadd: New softdrink that comes in its own vender! + - rscadd: Honey now has a reaction with plants + - tweak: Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar + not 2 + - rscadd: Blaster shotguns back into armory + - rscdel: Removed Lighters in thunderdomes + - rscadd: Silicons now know what a slime is saying! + - balance: honey now will not kill slimes. Honey slimepeople can be a thing now, + go sci. + - rscadd: Added insulin into many of the borg hypo's + Useroth: + - rscadd: bamboo which can be used to build punji sticks/ blowguns available as + a sugarcane mutation or in exotic seed crate + - tweak: changed the sugar cane growth stages because fuck if I know why, but it + was in the PR + - rscadd: 'New lavaland ruin: Pulsating tumor' + - rscadd: New class of lavaland mobs, a bit weaker than megafauna but still stronger + than most of what you normally see + - rscadd: Ghost cafe spawner. For letting people spawn as their own character in + the ninja holding facility. It bypasses the usual check, so people who have + suicided/ghosted/cryod may use it. + - rscadd: Dorms in the ninja holding facility. + Xantholne: + - rscadd: Santa Hats to Loadout and Clothesmate + - rscadd: Christmas Wintercoats to Loadout and Clothesmate + - rscadd: Christmas male and female uniforms to loadout and Clothesmate + - rscadd: Red, Green, and Traditional Santa boots to loadout and Clothesmate + - rscadd: Christmas Socks, Red candycane socks, Green candycane socks to sock selection + kappa-sama: + - balance: legion drops more crates now + - balance: .357 speedloaders in autolathes are now individual bullets instead, speedloaders + are now illegal tech, costs less total metal to make 7 bullets than a previous + speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to + make 5 7.62mm bullets than getting a clip from the seclathe. + - tweak: mentions that you can refill speedloaders on .357 uplink description + - bugfix: you can now strip people while aggrograbbing or higher + - rscadd: plasmafist to wizard + - code_imp: modular is gone + - rscadd: martial apprentices for the local Chinese wizard + - bugfix: broodmother baby lag + - balance: you can no longer get 100k credits by spending 4k roundstart + - balance: cooking oil in sunflowers instead of corn oil + - bugfix: throats are no longer slit happy + keronshb: + - rscadd: Adds reflector blobs to shield blob upgrades + kevinz000: + - rscadd: Launchpads can now take number inputs for offsets rather than just buttons. + - balance: nanites no longer spread through air blocking objects + - rscadd: Night vision readded as a darkness dampening effect rather than darksight. + - rscdel: conveyors can only stack items on tiles to 150 now. + - rscadd: added 8 character save slots + - rscadd: Cargo shuttle now silently ignores slaughter demons/revenants instead + of being blocked even while they are jaunted. A drawback is that manifested + ones can't block it either, any more. + - balance: flashbangs process light/sound separately and uses viewers(), so xray + users beware. + - tweak: Stat() slowed down for anti-lag measures. + - bugfix: sprint/stamina huds now work again + - balance: Combat defibs now instant stun on disarm rather than 1 second again + - balance: Defibs are now always emagged when emagged with an emag rather than EMP. + - bugfix: aooc toggling now only broadcasts to antagonists + - code_imp: Antag rep proc is now easier to read and supports returning a list. + - balance: Clockwork marauders are now on a configured summon cooldown if being + summoned on station. They also rapidly bleed health while in or next to space. + And they glow brighter. + lolman360: + - rscadd: Added ability to pick up certain simplemobs. + nemvar: + - bugfix: The brains of roundstart borgs no longer decay. + - code_imp: Refactored the visibility of reagents for mobs. + nicbn, Kevinz000, ShizCalev: + - tweak: Fire alarm is now simpler. Touch it to activate, touch it to deactivate. + When activated, it will blink inconsistently if it is emagged. + - bugfix: You can no longer spam fire alarms. Also, they're logged again. + - bugfix: Fixed fire alarms not updating icons properly after being emagged and + hacked by Malf AI's. + r4d6: + - rscadd: Added a N2O pressure tank + - rscdel: Removed a AM Shielding from the crate + - rscadd: Added Handshakes + - rscadd: Added Nose booping + - rscadd: Added submaps for the SM, Tesla and Singulo + - rscadd: Added a placeholder on Boxstation for the Engines + - bugfix: fixed Nose boops not triggering + shellspeed1: + - rscadd: Adds Insect markings + - rscadd: Adds three new moth wings. +2020-01-27: + 4dplanner, CRITAWAKETS, XDTM, ninjanomnom: + - rscadd: sepia slime extract has a delay before activating + - balance: the user of a sepia slime extract is no longer immune to the time field + - balance: chilling sepia is now the support extract - it always freezes the user, + but not other marked people. give one to your golem! + - rscadd: burning sepia spawns the rewind camera. Take a selfie with someone and + give it to them to make sure they remember the moment forever! You don't actually + need to give them the photo, they'll remember anyway. Keep it as a reminder. + - rscadd: rewinding (deja vu) effect resets your location to the turf you were on + after 10 seconds as well as resetting limbs/mobs/objects damage to the point + it was added. + - rscadd: The deja vu effect cannot resurrect the dead, but will heal their corpse. + New limbs fall off, old ones re-attach + - rscadd: 'Regenerative sepia cores add a deja vu effect before healing instead + of a timestop remove: timefreeze camera is admin spawn only.' + - rscadd: recurring sepia recalls to the hand of the last person to touch it after + activating. Reusable timestop grenades! + - tweak: some special cameras don't prompt for customisation + - bugfix: timefreeze camera actually makes a photo + - bugfix: timestop stops pathing and mechs. + - bugfix: adds a check to make sure simple_animals don't get their AI toggled while + sentient + - bugfix: Adds the timestop overlay to frozen projectiles + - bugfix: Timestopped things have INFINITY move_resist as opposed to being anchored + - bugfix: Timestop will now unfreeze things that somehow leave it + - bugfix: mobs in the middle of a walk_to will have their walk stopped by timestop + - bugfix: mobs that are stunned will be stopped mid walk as well + - bugfix: pulling respects changes in move_force + - bugfix: swapping places respects move_force if the participant is not willing + - bugfix: timestop is properly defeated by antimagic. + - bugfix: timestop only checks antimagic once + - tweak: Time stop now applies its visual effect on floors, walls and static structures + (with no change otherwise) + - tweak: Movable structures are now anchored while time stopped. + - tweak: Timestop effects now prevent speech. + AffectedArc07: + - code_imp: All code files are now in the LF line format, please stick to it + - tweak: Added CI step to check for CRLF files + - code_imp: Line ending CI works now + Arkatos, Zxaber, Ghommie: + - rscadd: Certain AI abilities now dynamically show their remaining uses on the + mouse hover over their respective action buttons. + - bugfix: Malfunctioning AIs can no longer abuse the confirmation popup to create + extra (unstoppable) doomsdays. + - bugfix: Fixed AIs being able to use some of their abilities such as the doomsday + whilst dead, and the doomsday loading phase not halting upon AI death. + Arturlang: + - tweak: Vampires are no longer as tanky + - rscadd: Added modular computers to the loadout + Bhijn: + - rscadd: Limbs now regenerate their stamina faster while disabled + - rscadd: Limbs now have the same incoming stamina damage multiplier mechanics as + spacemen, where the more staminaloss they take while disabled, the less staminaloss + they'll take. + - balance: Limbs have had their base stamina regen rate doubled to match the doubled + stamina regen rate of standard spacemen. + - rscadd: Added a preference to make the sprint hotkey be a toggle instead of a + hold bind + - rscadd: Added a preference to bind the sprint hotkey to space instead of shift. + - bugfix: server_hop can no longer be used to remotely lobotomize a spaceman + Bhijn helped: + - bugfix: Fixes Dragon's Tooth Sword 50% armor penetration by making it 35% + BonniePandora: + - admin: 'Added another SDQL option. Using "UPDATE selectors SET #null=value" will + now resolve value and discard the return. This is useful if you only care about + the side effect of a proc.' + CameronWoof: + - rscadd: Ghost Cafe patrons now spawn with chameleon kits. Dress up! Be fancy! + - rscadd: Robots can now check the crew manifest from anywhere with the "View Crew + Manifest" verb. + - tweak: Lizard tails are now viable options for humans and anthromorphs. + Commandersand: + - bugfix: fixed some clothnig sprites + - balance: lightning bolt,tesla,forcewall,emp spells have lower cooldown + - balance: fireball has a 10 second starting cooldown + DeltaFire15: + - bugfix: Vitality matrixes now correctly succ slimes + Denton, ported by Hatterhat: + - tweak: Most upgradeable machines now show their upgrade status when examined while + standing right next to them. + - tweak: Added examine messages to teleporter stations that hint at their multitool/wirecutter + interactions. + - tweak: Renamed teleporter stations from station to teleporter station. + - code_imp: Changed the teleporter hub accurate var to accuracy; the old name misled + people into thinking that it was a boolean. + Detective-Google: + - tweak: replaced the sprites with new ones requested. + EmeraldSundisk: + - rscadd: Adds a sign outside MetaStation's custodial closet + FantasticFwoosh, ported by Hatterhat: + - rscadd: Both reagent universal enzyme & sacks of flour are now available for their + respective costs from the biogenerator. + - rscadd: New crafting recipies for donut boxes, eggboxes & candle boxes have been + added to cardboard recipes for the collective benefit of service personnel and + the station. + Ghommie: + - tweak: Attached kevlar/soft/plastic padding accessories are now stealthier and + will no longer be displayed on mob examine. + - refactor: Refactored that mess of a code for alternate worn clothing sprites for + digitigrade and taurs. + - bugfix: Fixed some issues with the aforementioned feature you may or may not have + experienced because it was pretty lame. + - bugfix: Fixed missing digi versions fishnet sprites and wrong digitigrade left + dir purple stockings sprite. + - imageadd: Add digitigrade versions for boxers and the long johns. + - bugfix: Fixed the secret sauce recipe being randomized every round. + - bugfix: Fixed singularity pulls duping rods out of engine floors. + - rscdel: Removed an old pair of zipties from the captain closet. + - bugfix: Chestbursters won't delete the host's brain somewhat anymore. + - bugfix: Fixed roundstart mushpeople being unable to MUSH PUUUUUUUUUUUUNCH!! + - bugfix: Lattices can be examined yet again. + - bugfix: Made reagent containers examine text less annoying. + - bugfix: Virus food dispensers dispense virus food again. + - bugfix: Borg hypos inputs do not display typepaths anymore. + - bugfix: Restored chem dispensers alphabetical order. + - bugfix: Sanitized cargo export messages for reagents. + - bugfix: Riot foam dart (not the ammo box) design cost is yet again consistent + with the result's material amount. + - bugfix: Fixed a little exploit with ventcrawlers being capable of escaping closed + turfs by printing scrubbers/vents into them. + - bugfix: deconstructing a rubber toolbox with the destructive analyzer won't "lock" + the machine anymore. + - bugfix: Something about empty hand combat mode right click waving hands defying + common sense and being spammy. + - imageadd: Towels are now "digitigrade-friendly". + - bugfix: The Barefoot drink and mousetraps will now work even if wearing certain + "feet-less shoes". + - rscadd: Refactored code to allow all living mobs to use shields and not only humans. + - tweak: Monkys will now retaliate against aliens attacking them (as if they even + posed a threat to start with). + - tweak: add a click cooldown to the overly spammable table slamming. + Ghommie (original PRs by Kevinz000, ShivCalez, 4dplanner, Barhandar, 81Denton, zxaber, Fox-McCloud): + - rscadd: All atom movables now have move force and move resist, and pull force + An atom can only pull another atom if its pull force is stronger than that atom's + move resist + - rscadd: 'Mobs with a higher move force than an atom''s move resist will automatically + try to force the atom out of its way. This might not always work, depending + on how snowflakey code is. experimental: As of right now, everything has a move + force and resist of 100, and a pull force of 101. Things take (resist - force) + damage when bumped into experimental: Failing to move onto a tile will now still + bump up your last move timer. However, successfully pushing something out of + your way will result in you automatically moving into where it was.' + - bugfix: Bolted AIs can no longer be teleported by launchpads. + - balance: Megafauna cannot teleport + Hatterhat: + - balance: Beakers are generally more useful now, with slight capacity increases. + - tweak: Transfer amounts are different now. Adjust your muscle memory to compensate. + - balance: ore redemption machines actually get affected by lasers again kthx + - tweak: crusher trophy drop chance on mining mobs increased to 1 in 4 (from 1 in + 20) + - bugfix: Blood-drunk buff from blood-drunk eye crusher trophy is less likely to + cripple its user. + - tweak: Forcefield projectors now fit on toolbelts. + - imageadd: New sprites for ATMOS holofan and forcefield projectors! + - tweak: tweaks some values around with beaker transfer amounts, adds a transfer + value verb (altclick) + - rscadd: 'Syndicate sleepers (read: the ones that''re red and have controls in + them) can now be recreated with a sufficient basis in nonstandard (read: illegal) + technologies!' + - bugfix: Explorer hoods on standard explorer suits can be reinforced with goliath + hide plates again. + - rscadd: A shipment of Staff Assistant jumpsuits from the Goon-operated stations + appear to have made their way into your loadout selections - and into the contraband + list from ClothesMates... + - balance: Dropped Exo-suit armor to put it more in line with being an explorer + suit sidegrade and not a straight upgrade for Lavaland usage. + - rscadd: You can now print .357 AP speedloaders from Security techfabs after you + pick up the Advanced Non-Standard Ballistics node. + - rscdel: Forensic scanner removed from Advanced Biotechnology node. + - tweak: Ash Drake armor now has goliath resistance, same as the Exo-suit. + KathrinBailey: + - rscadd: Empty engineering lockers for mappers. + - rscadd: Industrial welding tools to the engineer welding locker. + - rscdel: Removed the multitool, airlock painter, mechanical toolbox, brown sneakers, + hazard vest and airlock painter from the CE's locker. + KeRSedChaplain: + - imageadd: The clockwork cuirass can now support slithering taur bodies. + Kevinz000: + - bugfix: Fixes successful projectile hits also striking another atom on the same + turf should the first one be not the target the projectile was meant for. + - rscdel: Removes infinite reflector loops. + Kraseo: + - bugfix: Jelly donuts and pink jelly donuts will now properly display sprinkled + icon state. + - bugfix: Jelly donuts and its variants will properly spawn with berry juice. + - bugfix: Slime jelly donuts have slime jelly in them now. (thanks ghommie) + - bugfix: Virgo hairstyles no longer have those annoying quotation marks. Rejoice + for you will no longer have to use the scrollbar. + - imagedel: Got rid of some strange-looking hairstyles. (Tbob, fingerweave, etc.) + LetterN: + - rscadd: Doppler logs + - tweak: Shockcolar and electropack uses the new signaler ui + - tweak: Renaming shockcolar requires a pen + - rscadd: Adds banjo + Linzolle: + - bugfix: fixes matchboxes runtiming every time they spawn + MrJWhit: + - tweak: Increases plasma usage in radiation collectors + Naksu: + - code_imp: reagent IDs have been removed in favor using reagent typepaths where + applicable + - bugfix: mechas, borg hyposprays etc no longer display internal reagent ids to + the player + Owai-Seek: + - rscadd: Four New Bounties + - tweak: tweaked several bounties + - tweak: reorganised several bounties + - balance: balanced several bounties + - bugfix: added shady jims to vendor + - rscadd: Towel, Bedsheet, and Colored bedsheet bins to Dojo. Some lockers with + carpets and wood, another bathroom/shower, tons of cleaning supplies, some additional + trash cans, a tiny medical area, and some vendors/vendor resupplies. Also added + some Ambrosia Gaia seeds. + - tweak: Moved some lights around, extended the dojo a bit to make it feel more + spacious. + - rscdel: Cafe Newsfeed Frame + PersianXerxes: + - tweak: Reduces the range of the forcefield projector from 7 tiles to 2 tiles. + Putnam: + - rscadd: Alcohol intolerance trait, which forces vomiting on any alcohol ingestion + - rscdel: Arousal damage is gone, and with it the arousal damage heart on the UI. + - rscdel: As exhibitionist relied on arousal damage, that's gone too. + - rscdel: Bonermeter and electronic stimulation circuit modules are gone. + - rscdel: Masturbation is no longer an option in the climax menu. It was identical + to climax alone in every way but text. Emote it out. + - rscadd: Arousal on genitals can now be displayed manually, on a case-by-case basis. + - rscadd: '"Climax alone" and "climax with partner" now only display to the people + directly involved in the interaction. rework: Catnip tea, catnip, crocin, hexacrocin, + camphor, hexacamphor all had functions or bits of functions reworked.' + - tweak: '"Climax with partner" now requires consent from both parties--it can no + longer be used on mindless mobs, and it asks the mob getting climaxed with if + they consent first.' + - tweak: A lot of MKUltra behaviors have been moved to hypno checks or removed due + to reliance on maso/nympho/exhib. + - rscadd: Cold-blooded quirk + - rscadd: 'Two relief valves for atmospherics, available in your RPD today: a unary + one that opens to air and a binary one that connects two pipenets, like a manual + valve.' + - tweak: The atmos waste outlet injector on box has been replaced with an atmos + waste relief valve. + Putnam3145: + - rscadd: Dynamic storytellers, a new voting paradigm for dynamic + - rscadd: Support for approval voting and condorcet (ranked choice) voting in server + votes + - rscadd: Ghost cafe mobs can now ghostize + - rscadd: Ghost cafe now has a cremator + - rscadd: Ghost cafe mobs are now eligible for ghost roles + - refactor: Ghost roles now use an element for eligibility purposes + - bugfix: You can toggle some prefs properly now. + - bugfix: no ass slap is no longer the same thing as no aphro + - balance: Devastating bombs kills bomb armor'd mobs again + - rscadd: Added a sort of "game mode ban" by way of having people rank their game + modes favorite to least favorite after the secret/extended vote. + - bugfix: Turns out the schulze scoring was written wrong and it was setting things + to 0 that shouldn't have been, so that's fixed. + - config: Random engines are now weighted. + - rscadd: Ghost dojo now has an autoylathe. + - rscdel: Ghost dojo no longer has VR or modular computer access. + - tweak: Ghost dojo mobs are pacifists. + - tweak: Ghost dojo booze-o-mat is now all access. + - bugfix: Ghost dojo crematorium now has a button. + - bugfix: Traitor objectives don't take a dump when they try to add an assassinate + anymore + - admin: Objective removal with antag panel no longer commented out silently while + still being an option that gives useful feedback on stuff it's not doing in + any respect + - rscadd: Second, temporary flavor text! + - bugfix: Limb damage works now + - tweak: Score instead of ranked choice for mode tiers + - bugfix: Chemistry not :b:roke + - tweak: Ghost dojo spawns will dust if their owner suicides or uses the "ghost" + verb. + - admin: Crafting is logged in a file now + - bugfix: temporary flavor text now pops up properly + - code_imp: demodularized player panel code, mostly + - admin: added ghost role eligibility delay removal to player panel + - balance: Metabolic synthesis disables if user isn't well-fed rather than if user + is starving + - bugfix: Gibtonite no longer instantly explodes upon being pickaxe'd. + - balance: Cold-blooded costs -2 quirk points now + - config: Added suicide to the config. + - tweak: Ghost cafe mobs are super duper attached to the ghost cafe. + - bugfix: Meow Mix bar sign works + - bugfix: Fixed a few relief valve behaviors + Ryll/Shaps, ported by Hatterhat: + - rscadd: Point-blanking people with shotguns actually throws them backwards! + Savotta: + - rscadd: snout + - imageadd: snout + Seris02: + - tweak: made it so trait blacklisting removes random positives instead of removing + everything + - rscadd: added atmos holofirelocks and temperature blocking + - tweak: tweaked how atmos holofan looks + - rscadd: stunglasses + - rscadd: disabler sechuds + - rscadd: adds coconut + - rscadd: adds a coconut bong + - rscadd: Auto ooc + - admin: changed "assume direct control" from m.ckey = src.ckey to adminmob.transfer_ckey(M) + so it works with auto ooc + - rscadd: marshmallow + - rscadd: telescopic IV drip + - bugfix: cardboard box speed + - tweak: makes gorilla shuttle emag only + - tweak: changed where the observe verb is. + - tweak: the way chameleon clothes update on change + - bugfix: chameleon cloak icon + - balance: Explosions now cause knockdown instead of KOs, with the amount of time + scaling off bomb armor. Heavy explosions still cause a ~2 second KO for follow + up attacks. + - balance: Devastating explosions now no longer gib players with more than 50 bomb + armor. This used to be more or less random depending on the amount of bomb armor. + - code_imp: Removed reagent explosion code that would trigger for <1 amount reactions. + - rscadd: traitor tool for bowmanizing headsets + bowmanizing headsets + - rscadd: durathread winter coats from hyper station + - tweak: conveyor belt now are stacks instead of single item + - tweak: conveyor crate has 30 belts + - tweak: printing a conveyor costs 3000 metal + - rscadd: you can press the conveyor switch in hand to link any not deployed belts + to it + - tweak: sniffing sneezing etc doing anything if they don't breathe + - bugfix: probably fixes the make mentor button + - tweak: the sprites for the conveyor belts to look more directional + Skoglol: + - bugfix: Falsewalls now properly hide pipes and wires. + SpaceManiac, bobbahbrown, ShizCalev, SpaceManiac (ported by Ghommie): + - code_imp: It is now possible to set a different most-base-turf per z-level. + - spellcheck: Removed unlawful reference to Disney's Star Wars franchise in map + logging. + - tweak: Moved mapping related errors to their own log file. + - bugfix: Destruction on Lavaland will no longer reveal space in rare situations. + Tlaltecuhtli, Nemvar, Trilby, Hatterhat: + - rscadd: russian surplus crate, sec ammo crate, meat/veggie/fruit crate, rped crate, + bomb suit crate, bio suit crate, parrot crate, chem crate, db crate + - tweak: lowered price of some crates which are overpriced for no reason aka the + tablet crate and the mech circuits crates, track implant crate has also track + .38 ammo + - bugfix: sectech vendor has a refill pack + Trilbyspaceclone: + - bugfix: Fermi plushie can be made once again + - tweak: range on Engi Tray scanners and Rad-Scanners + - bugfix: issues with mapping done my Trilby + - rscadd: Grass now makes light beer when distilled + - tweak: allows bandoliers to hold any ammo type as long as it has a casing + - server: Cleans out the last years of changlogs + - bugfix: 'rouge cases of #$39; in bottle/pill/patch/condiments' + - tweak: Adds missing but needed flags to MASON RIG + - bugfix: missing sprites with crushed cans + - tweak: Halfs the nutriments in sugar + - rscadd: Glitter is now makeable with ground plastic and some crayons + - code_imp: Makes more folders and files for uplink. + - rscadd: Seed packs now have RnD points inside them + - rscadd: New tips that reflect the now use seed packs have for Rnd / Chems affect + on plants + - code_imp: Made the research file look nice rather then an eye harming list + - bugfix: Fixed fragile space suits breaking from weak and non-damaging "weapons" + (such as the Sord, toys and foam darts). + - rscadd: 'tip of the round: Cleanbot can withstand lava and burning hot ash. Its + a god' + - rscadd: more glassware + - rscadd: Few new packs and glassmaker kit! + - tweak: prices/chems of crates/autobottler + - bugfix: some crates ungettable as well as some broken crates + Trilbyspaceclone, Ghommie: + - rscadd: More types of glass can now be used to make a solar panel, with different + sturdiness and efficiency depending the type. + Tupinambis: + - tweak: Replaces new fire alarms with a slightly updated version of the old ones. + - bugfix: Fixed bug where Amber alert had no proper alert lights, and red alert + had amber lights. + - balance: RLDs now cost more to use, have reduced matter capacity, and sheets are + worth less when refilling them. + Unit2E & JMoldy, ported by Hatterhat: + - balance: the powerfist now punches people away at high velocity depending on setting. + - rscadd: the powerfist now leaks the gas it uses onto the tile you're on. + - tweak: Adds weak punch variations for empty and near-empty punching. + Xantholne: + - bugfix: Christmas clothes that where missing stuff should work again + - tweak: Christmas clothes moved from clothesmate and loadout to premium autodrobe, + hoodies and boots remain. + - rscadd: Botany bee pet, Bumbles + - rscadd: New bee models that aren't 1 tile big of 0 opacity pixels + - rscadd: Cheongsam and Qipao clothing added to loadout and clothesmates + dapnee: + - imageadd: new toxin's uniform and accessories + - imagedel: old toxin's uniform and accessories + deathride58: + - balance: The stamina buffer no longer uses stamina while recharging. + jakeramsay007: + - rscadd: The assorted .357 revolvers (except russian revolver) can now also load + .38, like real life. + kappa-sama: + - rscadd: loot crates in cargo contraband + - code_imp: modular_citadel file movement + - code_imp: modular citadel loses some files + - balance: dragnet snares can now be removed in 5 seconds + keronshb: + - rscadd: Adds new features for nanites + - bugfix: fixed the missing icons from Dermal Button nanites + - rscadd: Ports the special nanite remote, mood programs, and research generating + nanites + - balance: rebalances some nanites + - bugfix: fixed my messup + kevinz000: + - rscadd: throwing things no longer makes them randomly turned as long as you aren't + on harm intent + - rscadd: Custom holoforms have been added for pAIs and AIs. oh and cyborg holograms + of specific modules too. + - balance: pais are no longer indestructible-flagged while in card form. pai radios + now short out if they are forcefully collapsed from damage. + - bugfix: telescopic iv drips now have the proper sanity checks for deployment. + - bugfix: megafauna can hear again + - balance: Cargo passive gen is now 500 down from 750. + - config: Added a few more nightshift config entries + - rscadd: nightshift_public_area variable in areas to determine how public an area + is. + - rscadd: NIGHT_SHIFT_PUBLIC_AREAS_ONLY config entry allows the server to be configured + to only nightshift areas of that level and below (so areas that are more public) + - rscadd: Config entries added for requiring authorizations to toggle nightshift. + Defaults to only requiring on public areas as determined by above + - balance: nuclear fist buffed. + - balance: cogscarabs are now fulltile-hitbox. + - balance: emitters are now hitscan + - balance: monkies gorrilize easier now + - rscadd: Ghosting no longer stops abductors from using you. + - rscadd: guests can now looc + - tweak: tableslamming has 0.4 second cooldown instead of 0.8 + - bugfix: health analyzers now work + - code_imp: Mapping helpers added for power cables and atmos pipes. + - rscdel: Blood duplication is gone, but viruses now react up to 5 times, 1 time + per unit, for virus mix. + - rscadd: you can now block people on your PDA + - bugfix: Grenades can now have their timers adjusted. + - balance: Cloning has been nerfed. + - bugfix: hilbert hotel is now less of an exploity mess + - balance: Doorcrushes are once again instant. + nik707: + - tweak: engraving light_power from 1 to 0.3 + r4d6: + - rscadd: Added a Radiation Hardsuit + - rscadd: Added a Radiation Hardsuit crate + - rscadd: Added 3 SM Engine variations. + - rscadd: 'Added a way to make opaque plastic flaps change: Change the already existing + flap recipe to show that they are see-through' + - rscadd: Animations for the RCD + - bugfix: Said animations being pulled by the Singulo + - balance: Prevent Reinforced Doors from being RCD'ed + - bugfix: Deconstructing Floors now cost MUs like everything else + - tweak: changed the RCD's upgrades into flags + - rscadd: Allow RCDs to print APC, Firelocks and Fire Alarms with the right upgrade + - balance: Allow Engineers to print RCDs and RPDs from their protolathe without + needing to hack one. + - rscadd: Added a playback device + - bugfix: Made the Voice Analyzer actually care about languages + - bugfix: fixed SM's piping + - rscadd: Added a message when pulsing the open wire. + - bugfix: fixed being able to use a playback device and a voice analyzer to activate + each others + - rscadd: added passive vent to the arsenal of atmospheric devices. + - rscadd: Mining base now has a common area accessible via a new shuttle on the + medium-highpop maps, and a security office connecting the gulag and the mining + base. Gulag also has functional atmos. + - rscadd: Added more Cyborg Landmarks + - refactor: better code for passive vents + - bugfix: fixed a hole in Meta + - rscadd: Added the ability to easily add variations of the mining base + - bugfix: fixed a sprite + timothyteakettle: + - bugfix: fixed not being able to remove trait genes without a disk being inserted + into the dna manipulator +2020-02-26: + AnturK ported by kevinz000: + - rscadd: Dueling pistols have been added. + Arturlang: + - rscadd: Replaces a lot of ingame UIs with TGUI next, increasing performance drastically. + - rscadd: Each night for bloodsuckers will last longer due to the sun dimming. + - tweak: You cant level up for free, now you have to pay blood for power. + - balance: Bloodsuckers are no longer as resistant to hard stuns and regenerate + less stamina. and a lot of their cooldowns are a lot higher. + - rscdel: Removed text macros from the chem dispenser. + - rscadd: Replaced with dispenser input recording macros. + - bugfix: Fancifying makeshift switchblades now works + - balance: Shields will no longer block lasers, and will break if they take too + much damage. + - rscadd: Added a TGUI Next interface for crafting + - rscdel: Removed the old TGUI slow crafting interface + - tweak: The MK2 hypospray now + - admin: The debug outfit is now kitted out for whatever debbuging needs. + - bugfix: Fixed the pandemic naming and the radiation healing symptom UI crashing + - tweak: Hyposprays now switch modes on CTRL click, instead of alt, as it was already + reserved for dispension amount. + - rscadd: Nanite interfaces have gotten a rework to TGUI Next, and can now support + sub-programs. add:Adds the nanite sting program, which will allow you to manually + sting people to give them nanites, changeling style. + - balance: The pandemic can no longer make vaccines or synthblood as quickly. + - rscadd: The syndicate uplinks interface has been redone in TGUI Next + - tweak: Valentines can now be converted by bloodsuckers + Bhijn: + - tweak: Click-dragging will now only perform the quick item usage behavior if you're + in combat mode. + BlueWildrose: + - bugfix: podpeople tail wagging + - tweak: lifebringer ghost role fixes + BuffEngineering, nemvar.: + - bugfix: Addicts can now feel like they're getting their fix or kicking it. + - bugfix: Aheals now remove addictions and restore your mood to default. + CameronWoof: + - tweak: Lighting looks better now. I can say that because the PR wouldn't be merged + and you wouldn't be reading this if it wasn't true. + - rscadd: Ammonia and saltpetre can now be made at the biogenerator. + Commandersand: + - tweak: uplink centcomm suit doesn't have sensors + DeltaFire15: + - balance: Nar'Sie runes no longer benefit from runed floors. + Detective-Google: + - rscadd: 'the POOL. remove: boxstation dorms 7' + - bugfix: valentines candy no longer prefbreaks + - rscadd: Loudness Booster pAI program + - rscadd: Encryption Key pAI program + EmeraldSundisk: + - bugfix: Connects mining's disposal unit on Delta. + - tweak: Slight visual adjustments to the immediate affected area. + Feasel: + - balance: Buffed dissection success chances. + Ghommie: + - tweak: The anomalous honking crystal should now properly clown your mind. + - bugfix: Stopped the ellipsis question mark from being displayed twice in the examine + message for masked/unknown human mobs. + - tweak: Made the aforementioned ellipsis question mark display on flavor-text-less + masked/unknown human mobs too for consistency. + - bugfix: Stopped an APTFT exploit with spray bottles. + - bugfix: Fixed the detective revolver being quite risky to use. + - bugfix: Hair styles and undergarments are yet again free from gender restrictions. + - tweak: Clown ops will find bombananas and clown bomb beacons instead of minibombs + and bomb beacons in their infiltrator ship now. + - tweak: For safety, the syndicate shuttle minibombs and bombananas come shipped + in a box. Please don't instinctively eat any of those nanas, thank you. + - tweak: Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive + (such as cyber implants) to normal nuke ops will now be properly unavailable/available + to clown ops. + - bugfix: Fixed bananium energy sword/shield slips. + - balance: Buffed said slips to ignore no-grav/crawling/flying as well as adding + some deadly force to the e-sword. + - bugfix: Fixed the 'stache grenade anti-non-clumsy user check. + - balance: Doubled the timer for the sticky mustaches effect from the above grenade + (from 1 to 2 minutes) + - bugfix: Fixed an edge case with the chaplain armaments beacon spawning the box + in nullspace. + - tweak: The playback device's cooldown now proportionally increases with messages + longer than 60 characters (3 seconds is the default assembly cooldown). + - bugfix: Fixed space ninjas "Nothing" objective. Now you gotta steal some dandy + stuff such as corgi meat and pinpointers as a ninja too. + - bugfix: Fixed maploaded APC terminals direction. + - balance: Nerfed magnetic rifles/pistols by re(?)adding power cell requirements + for it. These firearms must be recharged after firing 2 magazines worth of projectiles + and are slightly more susceptible to EMPs. + - bugfix: Fixed the tearstache nade not properly working. + - balance: Buffed it against space helmet internals. + - tweak: Holographic fans won't display above mobs and other objects anymore. + - bugfix: Fixed paraplegics appearing as shoeless. + - bugfix: Fixed the petting element. + - bugfix: Fixed slipping. + - refactor: Refactored mob holders into an element. + - bugfix: Fixed a few minor issues with that feature. such as mismatching sprites + for certain held mobs and a slight lack of safety checks. + - rscdel: holdable mobs can't force themselves into people's hands anymore. + - bugfix: Milkies fix. + - bugfix: Fixed some mounted defibrillator issue with the altclicking functionality. + - bugfix: Fixed no-grav lavaland labor/mining shuttle areas. + - bugfix: Fixed a little issue with sleeper UI and blood types. + - bugfix: Fixing accidental nerfs to the magpistol magazine. + - bugfix: The Lavaland's Herald speech sound should only play if they are actually + speaking. + - bugfix: Nerfed cargo passive points generation from 500 to 125 creds per minute. + - bugfix: Fixed whitelisted/donor loadouts + - bugfix: Childproofs double-esword and hypereuplastic blade toys. + - balance: Some reagent holders (such as cigarettes, food) are not suitable for + reagents export anymore, while unprocessed botany crops will only net 1/3 of + the standard reagents values. + - bugfix: Export scanners now include the reagents value in the price report. + - bugfix: Fixed a little inconvenience with the character setup preview dummy having + extra unwarranted bits. + - bugfix: Stopped role restricted uplink items from being discounted despite not + being purchasable most times. + - bugfix: Missing words replacement file for the gondola mask. + - bugfix: Fixed an issue with the nearsighted prescription glasses taking over worn + eyewear. + - bugfix: Fixed AI unanchoring not properly removing the no teleport trait. My bad. + - bugfix: Fixed another issue with hering comsig. + - imageadd: Fixed dozen missing privates sprites. + - bugfix: A little fix concerning some R&D and reagents. + - bugfix: Further mob holder fixes. + - bugfix: Fixed being unable to dump a trash bag's contents directly into disposal + bins. + - bugfix: Doubled the halved flavor text maximum length. + - bugfix: Reduced tongue organ damage and tasting pH message spam. + - bugfix: Fixed agent IDs not registering the inputted name. Thanks MrPerson. + - bugfix: Fixed solar panels/trackers (de)construction being a bit wonky. + - bugfix: Fixed something about slime blood and the law of conservation of mass. + - bugfix: Fixed flypeople being emetic machine guns. + - bugfix: Fixed virology being unable to be done with synthetic blood. + - rscdel: Renamed "blaster carbine" and "blaster rifles" back to "energy gun" and + "laser gun" respectively + - bugfix: Fixed magnetic rifles & co being inconsistent with printed energy guns + and start with an empty power cell. + - imagedel: Reverted practice laser gun sprites back to their former glory. Mostly. + - bugfix: Fixed sprint buffer cost and regen being rounded down. + - balance: Nerfed the fermenting barrel export industry. + - tweak: Reagent dispensers selling price no longer takes in account the reagents + volume. It's already handled by reagents export. + - bugfix: pAIs are yet again unable to perform certain silicon interactions with + machineries yet again. + - bugfix: Fixed pAI radios inability to be toggled on/off. + ? Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer, + Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle, + MrPerson, ArcaneMusic and zxaber) + : - rscadd: You can now make toolboxes out of almost any solid material in an autolathe + - rscadd: adds Knight's Armour made out of any materials + - rscadd: new ruin found in lavaland protected by dark wizards, I wonder what + they're guarding + - rscadd: You can now put a bunch more mats in the coin mint and autolathe + - rscadd: Adamantine and Mythril are now materials (Adamantine still only from + xenobio, Mythril still only from badminnery). Adamantine boosts an item's + force by 1.5, Mythril gives an item RPG statistics. + - rscdel: most custom sprites for coins have been lost + - rscadd: You can now give your ass acute radiation poisoning + - rscadd: floydmats now apply to all objs / items + - rscadd: you can now make tables and chairs out of any material + - bugfix: Fixes being able to exploit fully upgraded destructive analyzers to + multiply materials + - rscadd: An old monastery from a previously abandoned sector of space has recently + resurfaced in some regions surrounding the station. + - rscadd: Latent scans of the surrounding systems have picked up trace signs of + new, smaller cult constructs, however these signatures quickly vanished. + - rscadd: In other news, scavengers in your sector have been seen occasionally + with classically recreated maces, so autolathe firmware has been upgraded + to accommodate this. + Hatterhat: + - balance: Zombie powder is now instant when ingested, but delayed when injected + or applied through touch. + - tweak: The H.E.C.K. suit is now goliath tentacle resistant and probably better + for acid resistance. + - rscadd: The Engineering techfab can now print standard and large RCD compressed + matter cartridges. + - rscadd: The Experimental Tools node now has the Combifan projector, blocking both + temperature and atmospheric changes. + - tweak: fiddles with the seed extractor upgrade examine to make it not shit + - rscadd: Formaldehyde prevents organ decay and corpses' miasma production at 1u + in the body. + - rscadd: Epinephrine pens now contain 3u formaldehyde. This should not kill you. + - rscadd: The ships often crashed by Free Golems on Lavaland now have GPSes. They're + off, by default, but an awakening Golem could easily turn one on. + - tweak: Standard RCD ammo can now be printed from Engineering-keyed techfabs once + you hit Industrial Engineering. + - tweak: Consoleless interfaces are now default - this means unrestricted protolathes + and circuit imprinters can now be interfaced with by interacting with the machine + itself. + - bugfix: Multitools can now actually be printed from Engineering and Science protolathes/techfabs + once you unlock Basic Tools. + - rscadd: Husking (from being burned to shit) can now be reverted! 5u rezadone or + 100u synthflesh, at below 50 burn. + - balance: Turning a body into a burnt husk now takes more effort. 300 burn's worth + of effort. + - balance: Buckshot individual pellet damage up from 10 to 12.5. Still firing 6 + pellets. + - rscadd: Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay + into histamine. Instead, it just prevents your organs from rotting into nothing. + - balance: You can now purify eldritch longswords with a bible. This creates purified + longswords, which do not have anti-magic properties, but are still good for + swinging at cultists. + - rscadd: Extend votes! Ported from Hyper, ported from AUstation. + - bugfix: mechs with stock parts now have icons + - balance: Pie reagent transfer now requires an uncovered mouth. + - bugfix: Biogenerators can now actually generate universal enzyme. + - bugfix: The Basic Tools node now unlocks the multitool for printing on Engineering + and Science fabricators. + - rscadd: The Ash Walkers' nest on Lavaland now starts with three bowyery slabs. + - rscadd: You can now welder-harden arrows. It might take longer. + - balance: Silkstring's costs adjusted for bows and whatnot. + - spellcheck: Grammar adjusted on a lot of things relating to bows. + - bugfix: Pipe bows' bowstring doesn't look like it replicated itself upon draw. + IHOPMommyLich: + - tweak: Changed the multiplicative_slowdown of Stimulants from -1 to -0.5 + IronEleven: + - balance: Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis + Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms. + KathrinBailey: + - bugfix: Missing turf_decals in Cargo Office. + - bugfix: Turns on the docking beacons on Box. + - bugfix: Fixes Starboard Quarter maint room being spaced. It was never intended + to be like how it was. + - bugfix: The aforementioned maint room not having stuff in it. + - bugfix: varedited photocopier sometimes not opening any UI. + - bugfix: Atmos differences in Starboard Quarter maint. + - bugfix: Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with + airless plating. + - bugfix: Rotates AI satellite computers. These have probably been like this since + computers had the old sprites and no directional ones. You shouldn't sit at + a chair to operate a sideways computer. + KrabSpider: + - imageadd: The Van Dyke is no longer Fu Manchu. + - imagedel: Gets rid of a Fu Manchu imitation. + Kraseo: + - bugfix: You can no longer pull before wearing boxing gloves to bypass the grab + check. + - bugfix: Nightmares no longer delete entire guns from existence for merely having + a light on them. + Linzolle: + - bugfix: Bows now will not delete an arrow if it cant fire it. + - bugfix: bows now like and respect sprite changes + MalricB: + - rscadd: '"Shaggy" sprite from virgo' + - rscadd: '"shaggy" option in the character customization' + MrJWhit: + - rscdel: Removed meteor defense tech node + - tweak: TEG + Naksu: + - bugfix: Odysseus chem synthesizing now works again. + Owai-Seek: + - rscadd: Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates. + - rscdel: Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat + Crate + - tweak: Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint. + - tweak: Organised some crates with sub-categories. Also, moved all vendor refills + to a new tab. + - tweak: Moved Grill to Service Tab + - bugfix: Engineering Hardsuit Access + - tweak: Blood Crate now has all of the current blood types. + - tweak: Birthday Cake Recipe is now the same as TG. + - tweak: Added Soy Sauce and BBQ Packets to Dinnerware Vendor. + - tweak: Added nurse outfit, nurse cap, and mailman hat to loadout. + - tweak: Changed the name of scrubs to blue, green, and purple scrubs. + - rscadd: Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin. + - tweak: Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box + - balance: Mops can now be printed at service lathe once tools are researched. + - balance: Biobags can hold most organic limbs/organs, but not brains, implants, + or cybernetics. + - balance: Trash Bag can now hold limbs (but not heads.) + - balance: Most snack vendor items reduced by 1. + - bugfix: Trash Cans are now actually craftable, and only require metal instead + of plastic. + - imageadd: Bacon and Eggs, Drying Agent Bottle. + - imageadd: Mugs now show reagent colors of contained reagents. Thanks Seris! + - tweak: Reorganized all food recipes, (hopefully) making things easier to find. + - balance: Trays now have a whitelist, allowing them to pick up normal sized foods, + bowls, glassware, booze, ect. + - bugfix: Easter foods are no longer their own Misc Food Category on the top of + the menu. + - spellcheck: fixed a few typos/capitalization consistency. + - tweak: Mexican Foods are their own Subcategory. + - tweak: Donuts are their own Subcategory + - tweak: Moved Sweets from Misc Food in with Pies. Renamed to Pies & Sweets + - rscadd: BROOM + - tweak: Janitor Vendor now has gear for two Janitors. + PersianXerxes: + - rscadd: 'SMES and PACMAN attached to gulag Security to power electrified windows + remove: Removed Sec vendor from gulag Security' + - tweak: Separation of gulag and public mining + - rscadd: Better clarified the comment explaining the contraband tag. + - tweak: Cargo nuclear defusal kits now require an emag'd drop pod console to be + purchased. + - rscadd: Added Kilo Station + - tweak: Adjusts Kilo Station to be more in line with Citadel standards + - imageadd: Added area icons required to make Kilo Station editable on Citadel code + - code_imp: Fixed a reagent container on Kilo pointing to a nonexistent reagent + - config: Adds Kilo Station to the maps config file, does not fix Meta Station's + population requirement + Psody-Mordheim: + - rscadd: You can now make synth-flesh with synthetic blood. + - rscadd: You can now make synthetic blood via mixing saline glucose, iron, stable + plasma and heating it to 350 temp. + - rscadd: You can mix synthetic blood and cryoxadone to create synth-meat in addition + to normal blood. + - rscadd: Disfiguration Symptom. + - rscadd: Deoxyribonucleic Acid Saboteur Symptom. + - rscadd: Polyvitiligo Symptom. + - rscdel: Revitiligo Symptom. + - rscdel: Vitiligo Symptom. + Putnam3145: + - admin: Added logging to various consent things. + - rscadd: Lots of new traitor objectives + - bugfix: gender change potion now respects prefs + - bugfix: Hypno prefs work better. + - admin: Panic bunker is now round-to-round persistent + - tweak: Relief valve now has a TGUI-next UI + - bugfix: Atmos reaction priority works now. + - rscadd: map voting doesn't suck anymore + - bugfix: Dynamic now defaults to "classic" storyteller instead of just failing + if the vote didn't choose a storyteller. + - bugfix: antag quirk blacklisting works now + - tweak: default should be... default + - balance: all supermatter damage is now hardcapped + - tweak: Supermatter sabotage objective no longer shows up with no supermatter + - bugfix: Mining vendors no longer fail and eat your points iff you have precisely + enough points to pay for an item + - tweak: Licking pref + - bugfix: Fixed IRV. + - bugfix: Runtime if nobody has a chaos pref set + - bugfix: IRV fixed... again + - bugfix: temporary flavor text can now be of reasonable length + - balance: Shooting the supermatter now adds to the supermatter's power. CO2 setups + beware! + - rscadd: Logging for renaming + Raiq & Linzolle: + - rscadd: Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting, + silk string used in bow crafting, harden arrows - Ash walkers crafting, ash + walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers + for ash walkers as well, just to hold some arrows well out on the hunt! + Seris02: + - tweak: tweaked the way the SM works + - rscadd: custom reagent pie smite + - rscadd: hijack implant + - code_imp: changed mentions of the issilion proc to hasSiliconAccessInArea based + on what the proc is used for + - rscadd: recipe for mammal mutation toxin + - rscadd: polychromic winter coat + - rscadd: thief's gloves + - rscadd: crushing magboots + - bugfix: golden plastitanium toolbox being actually plastitanuium + - bugfix: character slot amount + - balance: rebalanced rising bass + - bugfix: string highlighting whitespace + - bugfix: glitch with PKA + - bugfix: meteor hallucinations (again) + - rscadd: Added naked hallucination + - rscadd: crowbarring manifests off crates + - balance: makes RCDs cost a better amount + - bugfix: apc icons + - rscadd: rest hotkey + - rscadd: hsl instead of sum of rgb for spraycan lum check + - balance: bloodcrawl's cooldown + ShadeAware: + - rscadd: Craftable Switchblades, a weaker subtype of normal switchblades that can + be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable + Coil. Requires a welder to complete. + - bugfix: You can now actually craft Switchblades. + - bugfix: Switchblades no longer regain their old Makeshift sprite after retracting + if you've made them fancy with Silver. + - rscadd: 'The Captain''s Wardrobe, a special one-of-a-kind and ID-locked wardrobe + for the Captain that holds all of their snowflakey gear. Remove: Snowflake gear + from the Captain''s locker, since now it has its own vendor.' + Tlaltecuhtli, ported by Hatterhat: + - balance: Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning + modules and capacitors on construction. This means that they also gain reduced + power consumption and EMP protection from higher-tier stock parts. + Trilbyspaceclone: + - bugfix: Vault hallway door being all access + - server: Updates change logs + - rscadd: Crafts are now made of plasteel and can be made with 5 sheets + - rscadd: Takes away NT's connections to the Aliens that run the Syndicats + - rscadd: Carps have evolved to take more damage + - rscadd: restock crates for each vender + - rscadd: restock units for all station venders + - bugfix: Sec-vender missing icon + - bugfix: 'Box station captain office issues maping: Gulag on box can now be accessed' + - rscadd: Alien stools and chairs + - tweak: Bone armor/Dagger are now crafting from bones rather then crafting menu + - rscadd: Firing pins that only works when not on station + - rscadd: Medical locked crates + - balance: Russian gear crates have less gear in some cases but all will cost more + - bugfix: Medical locked crates that were not locked + - spellcheck: Crates that were out of date are corrected + - balance: Heads of staff have been better screened by NT before being promoted + - balance: The suit full of spiders also known as a ninja now is a tactical turtleneck + - balance: The Wiznerds now dont have suits set to max + - tweak: Meat wheat no longer has blood + - bugfix: Flat guns can no longer be suppressed + - tweak: replaced stickmans .45 caliber with 10mm, for consistency. + - tweak: Meatwheat and Oats now have rarity + - balance: Oats now have at lest 50% more flour in them + - balance: BDM now uses a PKA rather then a normal KA + - tweak: Gang tower shield is no longer transparent + - tweak: Cosmic winter coat now glows like the bedsheet, and holds normal winter + coat gear + - server: Express console is now logging what it buys, like the normal console should + - bugfix: Crabs are now made of crab meat. + - bugfix: AIs now understand the old ways of drunken dwarfs + - balance: Removes some armored Russian hats from box station round start + - bugfix: Doner items spawning + - balance: Engi/Sec Trek suit no longer has 10% melee protection + - bugfix: IPC hearts are now made of robomeat and roboblood thats emp proof. Heals + and is all and all just like an normal heart + - imageadd: All robotic organs now have an animation. + - imageadd: IPC's now organs now look like robotic ones, even tho thats not the + case game wise + - imageadd: Added a new bee themed bar sign + - imageadd: Makes plywood chair not look as bad. + - bugfix: corndog sprite being miss-spelled + - bugfix: Ash from land of lava now is useable for sandstone + - bugfix: Peach cake slices are no long made by mimes + Tupinambis: + - tweak: the portion of laws that require harm prevention by silicons has been removed. + - server: silicon_laws.txt config file is required to be modified for full implementation. + - bugfix: masks no longer improperly stick out of helmets when they should be hidden. + - bugfix: Status Displays should now update correctly. + - balance: stunbatons now take 4 hits to inflict hard crit, up from 3. + - balance: stunbatons no longer disarm targets. + Yakumo Chen: + - rscadd: Rings for your fingers! + - rscadd: New cargo crates and loadout options to bling your rings! + YakumoChen: + - tweak: Observe is back in the OOC tab + - imageadd: Rings look nicer. Sprites used from RP. + - imageadd: Ring on-hands. Diamond rings sparkle! + - tweak: You can now propose using a diamond ring in your hand. + - tweak: Legion skulls behave like bees!!!! + Zellular: + - imageadd: Movement state for pupdozer and its decals + - tweak: Tweaked the movement state for the pupdozer's eyes + ancientpower: + - bugfix: Fixes an error in pH strips' feedback message. + - rscadd: Ported drink sliding from /vg/station. + - bugfix: Fixes color mismatching with the "genitals use skintone" preference. + - imageadd: Bunny ear style for humanoid species. + - tweak: Ghosts are now literate. + bunny232: + - tweak: Changes the simple animal sentience event from the xenomorph preference + to sentience potion preference. + coiax: + - rscadd: Admin and event only pair pinpointers! They come in a box of two, and + each pinpointer will always point at its corresponding pair. Aww. + deathride58: + - bugfix: Spacemen no longer run at lightspeed on local servers. + kappa-sama: + - bugfix: the plant dudes can actually make plant disks now + keronshb: + - rscadd: Added repairable turrets + - rscadd: Adds Tiny Fans to the pirate ship + - tweak: changes some reinforced windows to plastinanium pirate windows + - tweak: made the pirate shuttle + turrets bomb resistant + - tweak: made most pirate machines + consoles indestructible + - tweak: increased pirate turret health + - rscadd: Adds the CogChamp drink and Sprite + - rscadd: Added burn and knockback to stunhand during HALOS on cult. + - balance: Added burn and knockback to stunhand during HALOS on cult. + - bugfix: fixed accelerated regeneration nanites + - bugfix: fixed mechanical repair nanites + - bugfix: fixed bio reconstruction nanites + kevinz000: + - refactor: Custom snowflake plushies are now in config rather than code. + - balance: Abductor mindsnapping (aka abductee objectives) can now be "cured" with + brain surgery. + - rscadd: Shuttle hijacking has been completely reworked. Alt-click the shuttle + as a hijack-capable mind (so traitors, and especially traitors with hijack) + to begin or continue a hacking process. + - refactor: 'A good amount of the blood RGB rework was cleaned up/reverted, with + some notable gameplay changes including: Gibs and blood not having max blood + by default (no more easy rampages, cultists), infinite gib streaking, etc etc.' + - balance: meteor waves are now directional and announces the direction on the command + report. + - rscadd: CTF CLAYMORES + - balance: shoves buffed, now shoving into a wall twice rapidly will also disarm + their weapon. + - balance: traitor+bro gamemode minimum population set to 25 until there can be + more in depth configuration systems for gamemodes. + - bugfix: no more bluespace skittish locker diving, + - rscadd: moths now have unique laughs and can *chitter. + - tweak: nuke explosion is now full dev radius for anti lag purposes + - balance: Gangs can now only tag with a gang uplink bought spraycan. + - tweak: dueling pistol accesses have been changed to be more accessible. + - bugfix: mechs no longer have admin logs flooding into IC control console log viewing + - refactor: Guncode and energy guns have been refactored a bit. + - rscadd: You can now combat mode ight click on an energy gun to attempt to switch + firing modes. This only works on guns without right click functions overridden. + - balance: shoes can now fit magpistols again. + - balance: Projectiles now always hit chest if targeting chest, snipers have 100% + targeting zone accuracy. All other cases are unchanged. + - tweak: The lawyer's PDA cartridge has been rebranded to something more accurate + to its true nature. + - refactor: Refactored ghostreading/etc + - balance: Cyborgization will now de-gang people, even gangheads. + - bugfix: reactive repulse armor now has an item limit + - bugfix: beam rifle runtime fix during aiming_beam + - bugfix: 'fail2topic runtime fix: taking out an ip while incrementing index resulted + in accessing the next-next entry instead of the next and results in out of bound + errors.' + - rscadd: gravity gun repulse and chaos now work in all angles, rather than just + basic cardinals and diagonals. fun. + - balance: Public autolathes can no longer be hacked. + - bugfix: Energy weapons now once again have their lens in contents. + - bugfix: pais are no longer muted for literally a whole hour on emp. + - rscadd: auto profiler subsystem from tg + - bugfix: Brig cells now are more accurate by using timeofday instead of realtime + - bugfix: Cryo now actually transfers reagents at tier 4 on enter rather than every + 80 machine fire()-process()s regardless of if it was "reset" by open/close. + - rscadd: cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries + without an operating console. + - bugfix: ctf claymores now actually spawn (and fit). + - bugfix: STOP_PROCESSING now removes from currentrun to prevent another process + cycle from happening where it shouldn't. + - balance: hand teleporters now require 30 deciseconds of still movement by the + user to dispel portals. there's a beam effect too. + - balance: Sort of a bugfix but cult blood magic and all guns now respect stamina + softcrit. + - balance: Organ healing rate doubled. Organ decay rate halved to match its define + (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked). + - tweak: Storage now caches max screen size and only stores when being opened by + a non ghost, meaning ghosts will no longer distort living player screens when + viewing storage. + - balance: Stunbatons changed yet again. + - tweak: the game's built in autoclicker aka CanMobAutoclick no longer triggers + client/Click()'s anti clickspam guard. + - balance: pais can no longer bodyblock bullets + - balance: pai radio short changed to 3 minutes down from 5 + - balance: pais are no longer fulltile click opacity. + - refactor: vampire "immortal haste" has been reworked to be more reliable and consistent. + - tweak: hand teles use a less atrocious beam + necromanceranne: + - rscadd: Ebows now disarm people hit by them. + - rscadd: Ebows now do 60 stamina damage on hit. + - rscdel: Ebows no longer inflict drowsiness + - balance: Miniature ebows do 15 toxin damage, up from 8. + - balance: Ebows have considerably shorter knockdowns. + - balance: Ebows now make you slur rather than stutter. + - balance: Large ebows are now heavy and bulky. + - rscdel: You can no longer order spinfusors or their ammo from cargo. + - rscdel: Removed the formal security officer jacket from the secdrobe + - tweak: formal security jackets are now armor vests + - rscdel: Bullets causing bleed rates equal to unmitigated damage through all forms + of defense. + - balance: 'Reverted #9092, crew mecha no longer spawn with tracking beacons.' + - balance: '[Port] Mecha ballistics weapons now require ammo created from an Exosuit + Fabricator or the Security Protolathe, though they will start with a full magazine + and in most cases enough for one full reload. Reloading these weapons no longer + chunks your power cell. Clown (and mime) mecha equipment have not changed.' + - balance: '[Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching + Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8).' + - balance: '[Port] Both Missile Launchers and the Clusterbang Launcher do not have + an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded + ammo has been spent, you can use the appropriate ammo box to load the weapon + directly.' + - rscadd: '[Port] Utility mechs that have a clamp equipped can load ammo from their + own cargo hold into other mechs.' + - rscadd: '[Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, + should they run low.' + - bugfix: Literally unclickability with a cham projector + nemvar: + - code_imp: Slight changes the self-repair borg module. It no longer references + the borg that owns it. + - bugfix: Trash from food now gets generated at the location of the food item, instead + of in the hands of the eater. + - code_imp: Changed mob biotypes from lists to flags. + r4d6: + - rscadd: Added a dwarf language + - rscadd: Added more engines + - tweak: RPD subcategories and preview icons reorganized. + - rscadd: RPD now starts with painting turned off, hitting pipes with build and + no paint will target the turf underneath instead. Bye bye turf pixelhunting. + - config: Made dwarves into a roundstart races + - tweak: Meteor Timer back to 3-5 minutes + - bugfix: Mining no longer lead to spess + - rscadd: Added Plasteel Pickaxe + - rscadd: Added Titanium Pickaxe + - bugfix: fixed a missing tile + tralezab, bandit, Skoglol: + - rscadd: The mime's PDA messages are silent now! + - rscadd: 30 new emoji have been added. Mime buff, mime now OP. +2020-03-28: + Arreksuru and Detective Google: + - rscadd: new HUDpatches for medical, diagnostic, and mesons. + - rscadd: crafting and de-crafting recipes for new HUDpatches. + - bugfix: silly typo with "singlasses" in one of the crafting recipes for HUDglasses. + Arturlang: + - balance: Bloodsuckers can no longer get usable blood from blood tomatoes. + - bugfix: Fixed reagent container transfer amount cycling. + Bhijn: + - tweak: Clicking an open closet with harm intent no longer attempts to place your + currently held item inside, but rather attacks it. + Bhijn (original PR by Azarak, sprites by Discord user Smug Asshole Muhreen#5522): + - rscadd: Synths, the open source and free-as-in-freedom species by FA user vader-san, + have been ported from Skyrat. + - rscadd: Ported VOREStation's synthetic taursprites + - rscadd: Markings that don't match very well with your selected species are now + hidden from the markings list by default. You can still use these mismatched + markings to create horrendous sparkledog abominations by using the "Show mismatched + markings" button ingame. + - bugfix: Body markings who's iconstates don't match their name will now actually + render properly. + - code_imp: Limb base icons are no longer hardcoded, should_draw_citadel and should_draw_grayscale + have been removed in favor of the species-level `icon_limbs` var and the bodypart-level + `base_bp_icon` and `color_src` vars. Downstreams should no longer have to touch + bodypart rendering code a whole lot if they want to add custom species. Downstreams + that have already added species with digitigrade leg support will have to append + species IDs to the digitigrade leg sprites, but aside from that, the migration + process to this more modularity-friendly system should be fairly smooth. + BlackMajor: + - tweak: Adjusted the ash walker camp's storm proofing. + - rscadd: Added a tip about creating areas to the ash walker spawn text. + Bumtickley00: + - tweak: Iron sheets build the normal metal table again + Crystal9156: + - bugfix: Fixes Chocolate Jelly Donut icon + Dennok, ported by Hatterhat: + - bugfix: Lava rivers no longer burn into basalt. + - code_imp: The river generator can now specify baseturfs. + Detective-Google: + - bugfix: absurd dong sizes. + - bugfix: my dumb stupid paramedics + - balance: Medical no longer spawns with syringe guns, Medical now spawns with medidart + guns. + EmeraldSundisk: + - rscadd: Adds CogStation's shuttles to-be. + - rscadd: Adds the "NES Classic" escape shuttle. + - refactor: Accounts for the new shuttles. + Ghommie: + - tweak: Added a few cooldowns to chill nuclear bomb and communications console + security level change spam, as well as the emergency shuttle's authorization + announcements. + - bugfix: Fixed viruses not working on anthros and some others species. + - sounddel: Made the cogchamp mixing sound less annoying. + - rscdel: Removed makeshift switchblades. + - bugfix: pAIs, drones, monkys and lizards can be worn over the head again. + - bugfix: Fixed cargo passive point generation to not go into decimals. + - bugfix: Syndicate ninjas are slightly less friendly now. + - balance: Allowed blobbernauts to drag objects (but not mobs) again. + - bugfix: The examiner circuit now works better for mobs. + - tweak: Chances are monkeys won't end up gorillizing as quickly after being exposed + to a rad storm for a minute or so. + - bugfix: Vampire mesmerize doesn't permanently disable combat mode. + - bugfix: The flying speed slowdown while hurt now actually affects flying mobs + and not floating ones. + - bugfix: Joining in as a positronic brain won't break the spawner menu anymore. + - bugfix: Fixed dynamic voting. + - bugfix: The autotransfer subsystem is slightly more modulable now. + - imageadd: Resprited some sprite_accessory icon states. + Ghommie (plus a fix originally done by Skogol): + - bugfix: Drinks dispensers now only show the container they are holding. + - bugfix: Ghost cafe patrons are warded against a few more events now. + - bugfix: Fixed RnD machineries UI displaying designs' required reagents' typepaths + instead of names. + Hatterhat: + - bugfix: Red and blue boxes are now actually red or blue. + - rscadd: Beegions! Like Legions, but with actual bees. As in, the bees from the + holodeck sim with the randomly-generated toxic bees. + - rscdel: Mining cyborgs are no longer physically capable of claiming points nor + wielding a premium accelerator. + - tweak: Arrow crafting has been finagled with, preventing fire-hardened arrows + from being fire-hardened repeatedly. Or something. + - bugfix: Space hermits (those quirky fellas stuck in a rock with carp surrounding + them) now have gravity! But they lost their perpetual generators. + - balance: Space hermits now have to mine for their research tech (golem vendor + board, ORM board). They have slightly less bad parts, though. And better(?) + rocks. + InnocentFire made the sprites all thanks to them!: + - imageadd: All bows now have inhand sprites once again + KathrinBailey: + - rscadd: Nine new posters! + - rscadd: Shower curtains can be crafted. + - rscadd: New sofas! + - rscadd: Green and purple comfy chairs to the crafting menu to fit green and purple + carpets. + - bugfix: Shower curtains now let you see through them once open, and don't once + closed. + Kraseo: + - balance: If you have the powersink objective, you will now receive a free beacon. + - rscadd: Lavaland flora have more traits now, to encourage harvesting and sending + these off to the botanists. + - bugfix: Napalm will now properly remove weeds from a tray if the plant in it has + the fireproof gene. + - balance: Gangs no longer get soporific rounds for their sniper rifles. + - rscadd: Syndicate Contracts. Use the new contract uplink to select a contract, + and bring the assigned target dead or alive to the designated drop off. Call + for the extraction pod and send them off for your TC payment, with much higher + rewards for keeping them alive. A high risk, high reward choice for a traitor + who wants a real challenge. + - rscadd: New 20 TC contract kit - supplies you with your contractor loadout and + uplink. + - rscadd: Targets successfully extracted will be held for ransom by the Syndicate + after their use to them is fulfilled. Central command covers the cost, but they'll + be taking a cut out of station funds to offset their loss... + - rscadd: Adds a third random item, as well as a small guide on using the contract + kit. Also added new possible items that can appear. + - tweak: Supplied space suit in the contract kit is now an improved variant on the + normal Syndicate version. + - balance: TC payouts adjusted to be a bit more fair to the contractor. Total payout + can never be below a certain threshold. + - bugfix: Broken dropoff locations work again, and general bugfixes. + - rscadd: Contract kit comes with a contractor baton - a unique, lightly electrified + weapon to help complete your contracts. + - tweak: Finalized payment system for contracts; much more balanced for contractors. + No more extremely low paying contract sets. + - tweak: Generated contracts will all have unique targets, no more duplicates. + - tweak: Extraction droppod explosion has been removed, it'll only damage the tile + it lands on. + - bugfix: Extraction pods get sent to the jail immediately again. + - refactor: Refactored classic_baton code. + - rscadd: Contractor Hub. A unique store for contractors to buy items with Contractor + Rep, with two Rep being given when completing a contract. + - rscadd: Contractor pinpointer, available through the Hub. A very inaccurate pinpointer + that ignores suit sensors. + - rscadd: Call reinforcements, available through the Hub. Limited to a one-time + buy for a contractor, you can purchase an agent to be sent down to help in your + mission. Role is polled to ghosts. + - rscadd: Blackout, available through the Hub. Disable station power for a small + duration - an expensive, but powerful option of getting into secure areas. + - rscadd: Fulton extraction, available through the Hub. Purchase a fulton extraction + kit to help move your targets across the station for those difficult dropoffs. + - tweak: Assigning yourself to another tablet will give you another contract set. + - rscadd: Contractors can now reroll their contracts a small number of times. + - rscadd: Brand new sprites! A redesign of the specialist space suit, and the kit's + own unique tablet. Done by Mey Ha Zah. + - tweak: Displays contract target jobs under their name. + - tweak: New locations, such as maintenance, are now possible dropoff locations. + - balance: Contractor kit pop cap reduced from 20 to 15. + - balance: You can no longer get haunted 8balls from contractor kits. + - bugfix: Pods and shuttles should no longer be valid dropoff locations. + - bugfix: Contract tablets will no longer break when one of your contracts is deleted + from the world. + - bugfix: Baton inhands for the right hand now shows the right direction. + - bugfix: Mice don't chew on wires anymore while they're on your person. + - bugfix: Bloodsucker heart theft objective now completes successfully. + - tweak: Blacklists turret protected areas, the toxins test range, asteroid ruins, + and solars from being valid dropoff locations for contracts. + Linzolle: + - tweak: pacifists can no longer meatspike living things + - bugfix: flypeople being unable to gain nutrition from eating vomit + - bugfix: targetting mouth on help intent now properly nose boops + - tweak: cmo hypokit now holds the same amount of items as normal kits + Moonlit Protector: + - rscadd: Introducing the 'Heroic Beacon', standing vigil over service the curator + can assume one three different historic heroes, each determining their equipment + and emergent playstyle to suit the player; a beacon can be found in the curator's + backpack upon spawning + - rscadd: Become the Braveheart, a fierce scottish warrior armed with a ceremonial + claymore, spraycan, kilt and a disregard for underwear with the scottish themed + hero pack. + - rscadd: A unique mention is the "First man on the Moon" heroic pack, with a two + piece space worthy suit, air tank & a GPS for recreating a key spessfaring moment + in history. + - tweak: The Curadrobe has been stripped & refilled full of helpful library supplies, + including varieties of pens and glasses including the jamjar's. + - tweak: The curator's explorer equipment & whip has been moved into the 'Courageous + Tomb Raider' heroic pack; removed from the backpack & the Curavend respectively. + MrJWhit: + - tweak: Added minor station things + - balance: re balanced r-walls + - tweak: Evens both sides of the gas containers TEG with reinforced windows + - tweak: Removed egun in every head locker, replaces RPD with air pump in science, + fixes a computer in sec, moves hand teleporter, and removes decals under lockers. + MrPerson: + - rscadd: Solar panels will visually rotate a lot more smoothly instead of being + locked to only 8 directions. + - rscadd: Timed solar tracking is in degrees per minute. You're still not gonna + use it though. + Naksu: + - rscadd: Time based free rerolls + - refactor: Refactored Blobs + - balance: Blob rerolls now give the blob 4 different options to choose from, rather + than forcing a single random one. + NecromancerAnne and goldnharl: + - imageadd: Sprite cleanups and animations for energy guns. + NecromancerAnne and zawo and zeroisthebiggay and carlarctg: + - rscadd: The Infiltrator Bundle, an armor kit for 3TC. Murder people in style! + - rscadd: Some pajamas for nukies to get plenty of bed rest. + - rscadd: halved firefight carry delay with latex or nitrile gloves + - tweak: headset upgrade is cheaper + Owai-Seek: + - rscadd: Butter Bear + - rscadd: Crab Burger, Bisque, Crab Rangoon, French Onion Soup, Empowered Burger, + Chicken Nugget box. + - tweak: +++ Spider Eggs to Exotic Meat crate. --- Bacon from Exotic Meat crate. + - tweak: Tweaked Crab Recipes + - imageadd: Butter Bear aka Terrygold + - balance: Food Crafting is now 5 deciseconds instead of 30. + Putnam: + - tweak: Swarmers, portal storm, wormholes are now controlled by dynamic. + - tweak: Dynamic-controlled events can now have a minimum start time. + - balance: Threatening meteors are more common (though still have pretty strict + requirements) + - balance: Different storytellers now balance around different expected players-per-antag; + default was 5, now intrigue/story/random have 7 and calm has 10. + - rscadd: Clown ops is now available as a roundstart antag in dynamic. + - balance: Sentient disease and revenant are now in the event pool rather than the + antag pool (with the logic that they're both completely useless and unfun to + play if people are actually playing against them). + - rscadd: A new formulation of extended was added to the storytellers; no antags, + but still spending threat on events. + - bugfix: Fixed a runtime in dynamic due to my misunderstanding pickweightAllowZero + - rscdel: Made conversion storyteller 0-weight-by-default. + Putnam3145: + - tweak: Salbutamol causes jittering now. + - bugfix: Made lickable pref save + - rscadd: 'Traitor classes for traitors: a new way for traitors to have objectives + assigned.' + - bugfix: Actually made things work as intended. + - code_imp: Removed a redundant turf melting check from the supermatter. + - rscdel: Removed "realistic tcomms lag" + - rscdel: Removed some particularly bad flavor objectives. + - balance: Power sink objective is 10x as easy to get + - bugfix: Processing objectives now properly stop once won + - rscdel: MKUltra no longer explodes into lovegas when it fermi explodes, instead + causing a regular ol' fireball. + - tweak: Eigenstasium OD flavor text less restrictive + - bugfix: Dynamic voting should work absent of a config. + - tweak: Autotransfer vote now requires actual transfer votes to transfer. + - bugfix: More dynamic fixes + - bugfix: Server-run votes aren't subject to vote cooldown + - rscadd: Mass hallucination can better be admemed + - tweak: Waffle co objective rewritten to make more clear it's not a murderbone + objective + - rscadd: CTF spawns, random animals and possessed blades can now be pinged for + ghost roles. + - bugfix: A bunch of polls now work with ghost role eligible non-observers. + - bugfix: Removes superfluous line in supermatter processing. + - code_imp: Power sink objective processing now makes sense. + Qustinnus/floyd, Ghommie: + - bugfix: To save costs, Nanotrasen has removed the emergency battery ejection systems + in modular computers. We realized saving the batteries isn't really important. + - bugfix: You can squash spiderlings with your bare hands now. + - bugfix: Being deafened properly stops jukebox music from playing. + - bugfix: admin multicam toggles no longer tells everyone but only admins and AIs + Ragolution: + - rscadd: All winter coats and hoods might be different if slightly from one a other. + - tweak: Adjusted Bartender's Drink Flinging print message to not include name of + target turf and save immersion. + Seris02: + - rscadd: tg genetics + - balance: illegal technology + - balance: rebalanced rising bass's buttom actions from repulse to side kick + - bugfix: projectiles and rising bass and items and rising bass + - bugfix: a very specific fix with tails and wagging + - rscadd: duffel bags of holding + - bugfix: quirk blacklist fixing + - bugfix: robotics console button swapping + - bugfix: fixed thieving gloves not pickpocketing fast + - rscadd: mentor de/rementor button + - bugfix: mentor !msg + - balance: bloodsuckers being unable to accept genes + - balance: removes xray from the gene pool + Skoglol: + - bugfix: Fixed gibber exploit. + Timberpoes: + - bugfix: 'Shuttle countdowns once again read like "01:05" instead of "01: 5".' + Trilbyspaceclone: + - rscadd: Three new arm implants, shield for sec, janitor and service + - rscadd: Two new legion drop. Assistant and Bee-Activist + - rscadd: Three new posters have been issued to the printing press + - rscadd: Well contruction, grubs to ash walker home, more seeds for ash walkers. + - rscadd: Wooden buckets can be made from 2 planks of wood, Tower caps also can + be used on a fire to make coal + - tweak: Makes all ashwalker round start seeds 5 yield and 50 harvest so that they + can get good crops in rather then failing after 1 harvest + - bugfix: arrow crafting has been fixed + - balance: Blobs now can store 250 points. + - spellcheck: Alien bar stool is no longer bronze + - server: 28 days log changlogs have been added well 56+ day old changlogs have + been removed + - balance: Added sunglasses that are able to be huds AND prescription + - rscadd: Prescription sunglasses and crafting of each new type for - Diagnostic, + Med and Sec + - rscadd: Diagnostic Sunglasses + - bugfix: Blackists Prescription HUDs from sunglasses crafting + - tweak: Cotton/Durathread now stack to 80 bundles + - rscadd: Medical hardsuits now have a Medi-Hud built into its helm + - rscdel: Removed old unused Techweb Node selling + - imageadd: Corrects snowcones names and a pixle. Corrects Space Wind snowcone as + well + - bugfix: Arrow crafting has been fixed... Again... + - rscadd: Soidifaction of and uranium can be done as well as making new bluespace + shards + - balance: Xeno and Fountain Hall will no longer spawn more then once + - tweak: Makes the game want to spawn in more then one tumor maybe + - tweak: Number of paper work in the crate "freelance paperwork" is half + - code_imp: A few cases were something their is unneeded copy past replaced with + many 1 in spawns + - rscadd: Potass Iodide has been fitted into standered borgs as well as medical + ones. Upgraded hypos now have Prussian Blue as well. + - tweak: Syndi borgs Potass Iodide has been swapped for Prussian Blue + - bugfix: No longer can you get the The End and Russian Flask without being the + donator + - balance: Pipes are small now + - bugfix: Edaggers now enbed as intended + - rscadd: The sleeper agents can be outfitted with some larger then normal sunglasses + for 1TC in Badass category + - rscadd: The Syndi Medical borg has been outfitted with the newest and latest ~~Stolen~~ + MediCo Gear on the market + - rscadd: Ninjas may be asked to steal the CMO's smart drapes + - tweak: Hyper Cell steal goal is upgraded to a bluespace cell, as well as the BoH + goal now wants a type of BoH rather then the normal default one. + - rscadd: Gutlunches have gotten teeth now and will eat legs, arms, and organs! + - Tho are picky and will not eat the brain just laying about! + Useroth: + - bugfix: contractor tablets spawned with invalid icon_state + Xantholne: + - rscadd: Bumbles is now actually in every station's hydroponics. + - bugfix: Bumbles will now actually rest, sit up, and buzz + YakumoChen: + - imageadd: Nekomata (double cat) tails. + - imageadd: 2CAT LMAO + - bugfix: Mining base looks more natural where it's spawned. + - server: Templates Headers will now correctly use the Citadel Official Wiki Link + Yenwodyah: + - bugfix: Bear traps and bolas apply slowdown correctly again + - bugfix: Recycler doesn't delete people in mechs, cardboard boxes, spells, etc. + anymore. + actioninja, ninjanomnom: + - tweak: Being fat is no longer lessened by flying. + - bugfix: The slowdown from grabbing someone no longer applies when you're floating. + bunny232: + - rscadd: Box bar now has a lightswitch. + - bugfix: fixes several piping issues around box station + - bugfix: moved a scrubber and vent down 5 pixels + - rscadd: Box station captain office now has a standard issue renault + - bugfix: Box bridge now actually has the air distro connected + dapnee: + - rscadd: Lambdastation and it's accompanying files + - rscadd: Robotic's APC, a few missing buttons (bridge shutters and crematorium), + paramedic has spawn locations now, two rapid cable deployers to engineering + - tweak: Renamed some doors and edited engineering to be a bit more open in one + spot + - bugfix: a few APCs with bad area tags, access on maintenance doors fixed, engine + APC is now connected to the grid instead of power created by the engine + - rscdel: the two syringe guns in medical were removed + - rscadd: couple gas masks around atmos + - bugfix: direction on turbine plasma pressure tank, cloning actually has a cloning + console now + floyd: + - bugfix: Everything made from glass in the game has a little more tegridy and doesnt + break from a single punch. + kappa-sama: + - rscdel: removed laptops giving slowdown when open + - balance: removed (mostly aesthetic) requirement to become hulk + - bugfix: changed add to remove on crit + - rscadd: a super combat shotgun that loads and fires 2 shells at a time + - balance: replaces bubblegum's blood contract drop with the super shotgun + - balance: 60 seconds instead of 120 for firebreath + keronshb: + - balance: blobs now receive a 50% cost refund on attacks that don't spread + - balance: reflector blobs are considerably tougher + - bugfix: fixed an integrity + - bugfix: attempting to turn a damaged strong blob into a reflector blob now refunds + points + - bugfix: also fixes blob node camera jump (from another PR) + kevinz000: + - code_imp: Mobility flags are here. Fixed some edge cases with xeno hardstuns and + similar stuff like warden's shotgun hardstuns and yeah. + - rscadd: Security now has riot quarterstaves in their lethal shotgun locker. + - tweak: Pushing is no longer free space movement. + - tweak: You can now right click to point the tip of some sharp tipped weapons at + people. + - bugfix: compact defibs have 10k cells again + - tweak: music max characters per line is now 150 instead of 50. + - bugfix: storage no longer closes while being dragged + - balance: disabler taser alt fire shots are faster and have a 14 tile range now + - balance: HoS taser now only applies tased effect for 1 second and warden's pump + action stun blaster no longer applies it at all. + - balance: Nanite adrenals have been nerfed. + - balance: Ninja stungloves nerfed 49 stamina to 25 (so they're basically just better + than stunbatons). + - tweak: Batons now also trigger disarm behavior in disarm intent and not just on + right click. + - refactor: combat mode/sprint/resisting lying down/attempting to crawl under all + refactored, added combat/sprint mode lockouts, being locked out of combat mode + no longer disables it and allows right click interactions etc etc + - bugfix: hands free actions no longer check mobility and only consciousness. + - rscadd: Minimaps, accessible via a button on OOC. + - bugfix: unnecessary blindness post-unconsciouss has been fixed with a hack that's + almost as garbage as the code that caused it in the first place. + - bugfix: synthflesh and rezadone now take total amounts of both applied and existing + reagents rather than only existing and only applied respectively. + - balance: reverts bubblegum bloodling swarming. + - balance: Beam rifles shot count 10 --> 5 and can no longer pierce. Also renders + properly for reflections against blobs and some other things. + - bugfix: being stunned no longer stops an ai from undeploying from a shell. + - bugfix: beam rifles are less terrible code + - code_imp: slowdown on items should now be set by set_slowdown(). + - bugfix: hypereutactic blades properly slow down their wielders when being used + and vv-editing an item's slowdown will once again properly update someone's + slowdown to take the new value into account. + - balance: stunprods knockdown again. + monster860: + - tweak: You can now moan in soft crit + - rscadd: Use Ctrl-Shift-direction key to shift your characters position. Use for + ERP. + necromanceranne: + - rscadd: Ports New Sleeping Carp + - refactor: Ports the martial arts refactors, which includes things like moving + martial into the martial subfolder and renaming it _martial, and cleans up human_defense + rising bass/sleeping carp exclusive code. + - balance: Particle Defender is now a much more sane weapon. + - balance: Tasers are no longer ignoring stimulants. + - bugfix: Blood beam can't create harvesters out of mech pilots. + - code_imp: Some minor fixes to fakedeath and a tg fix port. + - bugfix: Bleeding out all your blood from getting love tapped by a toolbox. + - bugfix: Diagnostic HUDSunglasses are better than ever! + - bugfix: Sprite fixes I hope + - balance: You can no longer acquire stun bullets in the .45 calibre. You can get + the 30 damage version out of the autolathe instead. + - balance: KITCHEN GUN (TM) is a lot stronger. Cleaning bullets are a whole 40 damage! + - bugfix: Fixed turrets not allowing their guns to be recovered. + - balance: Altered the plastitanium rapier from a perfect AP but weaker esword equivalent + to a more unique sleep inducing melee weapon. + - rscadd: Touched up all the relevant sprites. + - balance: Nightvision goggles are nerfed all-round. Flashes have actual use against + people using nightvision, as do flashbangs. + - balance: Syndicate nuclear agents get to live peacefully knowing their eyes are + well protected by their special night vision goggles. Spider clan also get these + goggles. + raspyosu: + - rscadd: some flavor text for lunge, cloak + - tweak: mesmerize, cloak functionality/requirements + - balance: mesmerize, lunge, cloak + - soundadd: lunge telegraph sound + - spellcheck: mesmerized status icon flavor text + - bugfix: cloak sometimes not restoring initial move intent + - tweak: mesmerize (line of sight checking system and remove progress bar) + - balance: 'nerf: lunge, mesmerize' + spookydonut: + - code_imp: adds selective duplicate component mode + wesoda25: + - code_imp: You no longer hit fermenting barrels when taking reagents from them + zeroisthebiggay: + - rscadd: kilo shuttle less bad + - rscadd: tauric contractor space suits + - tweak: ghost hud and nv defaults on + - bugfix: syndicate elite hardsuit helmet doesnt hide masks anymore + - balance: syndicate contractor helmets are no longer secretly lead + - rscadd: Space Fashion has discovered a new way to wear bandannas. With some simple + minor adjustments and ties, bandannas can be made into fashionable neckerchiefs! + - rscadd: Box Station has gotten a brand new brig. Go and check it out and discover + all the quirky little soulbits. + - bugfix: box brig miscellaneous issues + - bugfix: box station hos office +2020-04-15: + Arturlang: + - rscadd: Adds garlic, a mutation of onions + - rscadd: You can now make garlic necklaces. + - tweak: Tweaked hunger to be more the same as blood level for bloodsuckers + - tweak: Bloodsuckers no longer get zero healing from regenerative cores, the core + now heals their wounds but not their blood. + - balance: Bloodsucker heal is now based a lot more on blood level. + - bugfix: You can no longer be effectively immortal when fully auged as a bloodsucker. + - bugfix: Regenerative cores will regain their old names when they are renewed, + no more working decayed cores. + - code_imp: Removes a lot of unnecesiry clutter of comments and tries to make the + vars more consistent for bloodsucker code. + - code_imp: Made the regenerative core use one proc instead of copypasta + Auris456852: + - rscadd: Added printer sound for admins that plays when someone messages Centcomm + or the Syndicate. Just like RP! + Bhijn: + - admin: The traitor panel now actually shows a list of contractor targets. + - server: Fail2Topic now supports Linux. Do beware that this requires some sysop + experience to properly set up! + - config: Fail2Topic is now disabled by default, and the out-of-the-box config files + have been updated to be a little more detailed. + - rscadd: Added a lfwb-inspired orbiting pixel + flashing outline animation to the + sprint and combat mode buttons. This can be toggled via the preferences menu, + and is completely independent from all HUD themes. + BuffEngineering: + - bugfix: You may no longer summon plasteel from the door dimension. + - tweak: High security airlocks are now 33% more materially efficient! + DeltaFire15: + - balance: clockie vanguard now quickly regenerates stam while active (as its description + always told you,) + Detective-Google: + - balance: Shotguns are now slower and require two hands to fire. + Ghommie: + - bugfix: mobs with antag statuses such as wizard, ert and nuke ops get their flavor + text removed now. + - bugfix: Fixed megafauna mobs, goliaths and "anchored" AIs being stuffable into + closets. + - bugfix: After years of visual agony, the Curse of The Floating Disembodied Phallus + has come to an end. + - rscadd: Underwear now fulfills its purpose. + - rscadd: Privates visibility preferences. + - refactor: refactored polychromic clothing into an element. + - tweak: Blacklists unsynthetizable reagents from botany bees honey production. + - bugfix: Fixed toilet cistern loot spawning on the floor. + - tweak: The megafauna's hitbox doesn't include 0 alpha sections anymore. + - bugfix: Wizard robes & co work again now. + - bugfix: Fixed some spell casting message spam. + - rscadd: Added M/F body preferences. + - bugfix: fixed yet another few airless issues with the space hermit ruin. + - bugfix: Intellectual property infringment is not cool. + - bugfix: Near-station nuclear explosions now display the on-station nuke explosion + cinematic, consistently with its clearance of the station level and its nuclear + victory / total annihilation ending status. + - balance: Nuclear bombs can't be anchored in space areas (not just turfs) anymore, + as a quick effortless way to discourage players from anchoring the device on + the edge of the map. + - bugfix: Fixed a whacky miniature cell duping issue. + - bugfix: Liver failure is back! + - tweak: standarized a few (prefs off) side effects from enlargment chems on livers + to do organ damage instead without the blood volume whackiness. + - tweak: High liver damage now slows mobs down. + - bugfix: Fixing an issue with the split personality removing the original owner + from the round if the body died while the stranger was in control. + - bugfix: fixed a few floaty sprite accessories. + - bugfix: Fixed a few mutations not working correctly. + - bugfix: Fixed the phantom thief component, again. + - refactor: Made votes obfuscation settings more robust. + - admin: Also included them in custom votes. + - tweak: The map rotation vote will only hide ongoing votes now, not the results. + - balance: The crusher's vortex talisman trophy now has a cooldown between each + spawned wall. + - refactor: Backend body size preferences. + - bugfix: Infiltrator's boots don't stop slips and "space wind" through the power + of runtime errors anymore, and properly silence the user's footsteps now. + - tweak: Chaplains are now inelegible for bloodsuckers. + - bugfix: Fixed crafting hud icon overlapping the second pocket on 1:1 screen mode. + - code_imp: Removed some dead flightsuit code leftovers. + - rscadd: Reenabled the swarmers event. Also blacklisted another dozen other machineries + and structures that may be critical to the shift or station integrity from swarmers' + HUNGER for materials. + - bugfix: Fixed find_safe_turfs() searching for turfs with concentration of oxygen + lower than 16 rather higher. + KathrinBailey: + - rscadd: Radiation shuttesr to all supermatters. + - rscadd: Windowed shutters to armouries where relevant. + - rscadd: New posters are now on the map in relevant locations. + - bugfix: Windowed shutter now has glass, the door closing proc sees this and no + longer changes opacity. + - bugfix: Accidental HoochMaster removal in the bar. + - bugfix: Spawning looking at the supermatter with no mesons on Meta. + - bugfix: Missing disposal pipe outside HoP office. + - bugfix: Sofas were never adjusted when the pool was added. + - rscadd: New shutter sprites + - rscadd: Reinforced Shutter + - rscadd: Radiation Shutter + - rscadd: Window Shutter + - tweak: Shutters not being blast doors functionally. + - balance: Shutter armour block and health. + Kraseo: + - balance: Sneaksuit now costs 5 TC rather than 3. + - bugfix: You can break out of neckgrabs once more. + Owai-Seek: + - rscadd: Port Pina Colada, Painkiller, Moscow Mule, Hivemind Eraser, Moana Lou + Drinks + - rscadd: Gunfire, Hellfire, Sins Delight, Strawberry Daiquiri, Miami Vice, Malibu + Sunset, Lizz Fizz, Hotline Miami + - rscadd: Strawberry and Pineapple Juice + - rscadd: Salami Slices + - tweak: Soda Dispenser Juices + - tweak: Reorganize Vendor Objects (Bowls, Glasses, Shot Glasses) + - tweak: Strawberry Milk and Tea actually use strawberry Juice. + - tweak: Lizards can eat egg wraps. Moved Egg Wraps to Misc + PersianXerxes: + - rscadd: 'TGUI Next UIs for: chem heaters, chem masters, chem dispensers, and sleepers' + - code_imp: Reworked Chem Master code + Putnam3145: + - rscdel: No more station integrity goal + - tweak: Upload-hacked-law goal only picksif there's an AI to upload to + - rscadd: A new, much more barebones holding facility for contractors. + - rscdel: Energy nets are gone. + - tweak: Various ghost roles are now easier to ghost as. + - tweak: The candles in the dojo no longer make the place hotter and hotter over + time. + - rscdel: Nymphomania removed + - code_imp: Exhibitionism ignored by preferences now, since it was also removed + - code_imp: Quirk migration now does an admin log instead of a stack trace + - bugfix: Roundstart rulesets now roll properly. + - config: Added configs for various antag threat levels. + - bugfix: Fixed a runtime in threat calculation. + - tweak: Fixed up some misleading texts. + - tweak: 'Dynamic reworked to be more "storyteller-like": threat is now how threatened + the station is right now and threat level is how much the mode wants the station + to be threatened.' + - tweak: Random storyteller is now truly random. + - tweak: Story storyteller now gives a nice rising-action-climax-falling action + curve for threat level. + - tweak: '"Chaotic" storyteller now simply ramps up threat level as round goes on.' + - rscadd: '"Classic" storyteller, basically doing what "random" did before.' + - rscadd: Latejoin changelings for dynamic + - bugfix: Average threat calculation works now + - bugfix: Contamination is back. + Seris02: + - balance: stops hijackers from being able to remotely blow up borgs + - rscadd: wall walking boots + - bugfix: made color picking for character appearance show the colors when you pick + them + - tweak: the sergal markings + Trilbyspaceclone: + - rscadd: Cooks aided by Clowns have came out with and new healthy Salad - Caesar + Salad. Just dont eat the knife... + - rscadd: Ports over TG's Mortars and Pestles. + - balance: Water, Holywater and Unholywater will now now quickly purge itself if + you have 151u in your system + - rscadd: Most crate types can now be made, some costing more do to function over + fashion + - rscadd: Medical Mechs syringe gun now knows many more life saving chems, like + Insulin, Dexalin, Prussian Blue, Kelotane and Bicaridine + - balance: torches take less staminda to use. + - balance: Glowsticks dont last as long + - balance: Penlights are better at being lights + - balance: Torches are brighter then before - Indian Johns want to be on lava land + rejoy! + - balance: Eye lights have 30% less light coming out of them. + - spellcheck: Spec Ops crate no longer talks about a "Null Crate" what ever that + is + - server: Changlogs are updateded once again as of the 28th of March on year 2020 + - balance: White Ships, Telerelays and a defunk mining post are now always going + to spawn. + - spellcheck: Corrects a few desc on station side ruins + Xantholne: + - bugfix: bumbles will stop sleeping so much + actioninja: + - rscadd: Washing machines now support arbitrary dye color + - rscadd: Washing machines now dye nearly every item. + - refactor: lots of backend changes to clothing overlays, report any issues + - rscadd: Better glowing lights + actioninja (ported by Ghommie): + - refactor: repathed all under clothing, keep an eye out for errors. + bunny232: + - bugfix: Box secmos now is now longer connected to the scrubber loop + dapnee: + - rscadd: plant disk sorter in botany, bounty console for the rest of cargo, a missing + air alarm in the incinerator + - tweak: fixed a decal in front of security, moved an AIR alarm so it doesn't look + awful to ghosts/AI, asteroids don't delete air anymore, fixed more active turfs, + the buttons in the bridge "should" work now, HoP and cargo desks should be secure + now + - rscdel: quarters that found their way out of the quartermaster's back room + kappa-sama: + - rscdel: normies can no longer steal circuit codes + - balance: doubles the Stam damage of nonlethal krav stompers + - bugfix: no longer Krav Maga stomp people that are standing + - balance: no more 20pop requirement for noslips + keronshb: + - tweak: Reverts Mining Base RNG Placement + kevinz000: + - rscadd: Melee attacks now stagger people, preventing them from sprinting until + the (relatively short lived) effect runs out. Duration equation is [(1.5 + (w_class/7.5)) + * force]. + - balance: Fireman carrying now makes the person being carried unable to use items. + Piggybacking now slows down the person being ridden. In both cases, the person + riding will be dazed when forcefully dismounted, and dazed for a second if dismounting + from piggybacking + - bugfix: turfs properly initialize atom colors if they're colored. + - tweak: cloners now stabilize mutations while someone's cloning, meaning active + genes will not life tick. + - code_imp: datum/pipeline return_air stack trace now gives a reference so it's + actually marginally useful if caught in round. + - rscadd: Volumetric storage is here. + - rscadd: Traitor chaplains can now become neutered versions of cults. + - bugfix: beams should no longer go across the map and mess everything up if their + source or target isn't on a turf. + kiwedespars: + - rscadd: Added paper masks. + necromanceranne: + - bugfix: Fixed limb damage calc + - tweak: Stunslugs are now a mixed damage taser-like slug that will allow you to + apply a variety of damage while still being countered by tasers usual counters. + - balance: Mech scattershot guns are no longer oneshotting people into stamina crit. + - rscdel: 'Removed an number of cargo crate packs: Riot shotguns/standard shotguns, + double barreled shotguns, techshell crate, swat tasers, WT550 types (not rubber + or standard), traitor theft objective kits.' + - balance: HEALTH AND STAMINA DON'T STACK FOR PUTTING YOU INTO STAMINA CRIT. + - balance: YOUR FISTS ARE HELLA GODDAMN STRONG. + - balance: 'ACCEPT THE FELINIDS WARES, FOR SKOOMA HAS INCREDIBLE LETHAL PROPERTIES: + YOUR HANDS BECOME LIKE SWORDS.' + - balance: BOXERS CAN ONLY KNOCK OUT OTHER BOXERS BECAUSE THEY HAVE HONOR OR SOME + SHIT + - balance: INCREASED STAMINA DAMAGE TO LIMBS FROM 50% TO 75%. + - balance: Double-barreled shotguns and any child of such now can be used with off-hand + equipment. + - rscadd: Readds bioterror darts to the nuclear operative uplink for the legacy + price of 6tc! Has all new horrid reagents! + - balance: Scatterlaser is now in-line with buckshot. Nukies can't purchase scatterlaser + shot. + - rscdel: Null crates are no longer available in cargo! + - bugfix: Sleeping Carp and Rising Bass now dodge. Again. + - bugfix: Russian Revolver can no longer be exploited for a free 357. + - balance: Several guns now shoot exactly where you click regardless of movement + or turning. + timothyteakettle: + - rscadd: added beacon for cooks to choose an ingredient box, which replaces the + random box they used to receive + - rscadd: added a new sushi ingredients box + - rscadd: added more items to the wildcard box's possible contents + - rscadd: add new holodeck wrestling belt which lets you use moves only on those + also wearing it + - rscadd: add new holodeck map featuring the holodeck wrestling belt + - rscadd: new reagent 'Condensed Cooking Oil' + - tweak: list of chems that can go into fried non-food items was changed + zeroisthebiggay: + - rscadd: sneaksuit to contractor items + - tweak: sneaksuit is a bundle + - rscdel: intel potion and radio implant from contractor items + - rscadd: ghosts can now DNR + - balance: sneaksuit is not fireproof + - bugfix: insidious balaclava muzzlepsprite works + - rscadd: You can now choose your name and color as a holoparasite/guardian/holocarp! + - bugfix: fixes lings being able to get mechanical holoparasites +2020-04-16: + ForrestWick: + - tweak: changed a certain item to be called meatball, ended racism, thank you obama + Linzolle: + - tweak: remove any slurs, etc. to comply with GitHub's ToS +2020-04-19: + Anonymous: + - rscadd: Xenohybrids will now scream like xeno. + Arturlang: + - bugfix: You can no longer spam craft things using the crafting menu + Detective-Google: + - bugfix: uncorks some of Lambda's rooms. + Ghommie: + - rscadd: Custom skin tone preferences. + - tweak: Normalized box dorm lockers. Also removed a straight jacket found in the + same area. + Jake Park: + - bugfix: fixed path name for youtool vending + Putnam3145: + - bugfix: Objectives now clean theirselves up instead of leaving null entries in + lists everywhere. + Seris02: + - bugfix: stops magboots from not updating slowdowns + Trilbyspaceclone: + - rscadd: Maints have seen an uptick in left over types of welders, and tools. As + well as different types of masks + - rscadd: New type of 02 locker - Rng! It can have almost any type of gas/breath + mask and almost any type of o2 tank as well as even plasma men internals - Fancy! + - tweak: Tool lockers have 70% odds to have a spare random tool inside! + - rscadd: 12 new more drinks for most races! + - rscadd: New animations for mauna loa, and colour swap from red to blue for a Paramedic + Hardsuit helm + - tweak: Lowers cog champ ((the drink)) flare rate + - rscadd: Six more Sci based bounties have been posted at your local Cargo Bounty + Request console + - bugfix: Mimes have made catnip plants not become invisible. How helpful. + - rscadd: Honey Palm now distills into mead rather then wine + UristMcAstronaut: + - rscadd: Adds circuit analyzers to maps and to integrated circuit printer and circuitry + starter crate. + kappa-sama: + - balance: aranesp heals 10 instead of 18 stamina per tick + - rscdel: removed roundstart hyper earrape screams from xenohybrids + kevinz000: + - bugfix: you can no longer stun xenos + - balance: Contractor kits are now poplocked to 30 players. + - rscadd: Shield bashing has been added + necromanceranne: + - rscadd: You can now craft armwraps! + - balance: Pugilists disarm you more easily and are harder to disarm. They also + get a discount on disarm. + - balance: Pugilists only suffer a flat 10% chance to miss you. It's just like old + punches! Kinda. + - balance: Chaplain's armbands are a +2, up from a +1! + - balance: Martial artists spend stamina when they disarm. + - balance: Rising Bass had several moves shortened and made stronger. Has a disarm + override attack which does stamina damage and trips people on a disarm stun + punch. + - balance: CQC had it's disarm move altered to be a stronger version of Krav Maga's. + Dizzies and disarms on a disarm stun punch or just does some stamina damage + and brute damage. + - balance: Sleeping Carp can punch you to the floor on a harm stun punch. + - bugfix: Hugs of the Northstar are no longer nodrop. + - bugfix: Adding in some overrides and proper flag checks for martial arts. + - bugfix: Stun thresholding stops disarm spams at extremely high stamina loss. + - tweak: Ashen Arrows are actually called Ashen Arrows in the crafting menu. +2020-06-08: + DeltaFire15: + - bugfix: Delinging now properly removes their special role + - balance: Keycard auth devices now require two seperate IDs with sufficient access + to auth. + Linzolle: + - bugfix: shotguns no longer delete chambered shells while firing + kevinz000: + - rscadd: test + - rscdel: test + shellspeed1: + - rscadd: Internal tanks are now printable at the engineering lathe. + timothyteakettle: + - bugfix: newly created areas using blueprints now maintain the previous areas noteleport + value + - bugfix: kudzu seeds now actually spawn vines +2020-06-09: + Anonymous: + - rscadd: Added Orville-inspired clothing as a worthy alternative to Trek stuff. + - tweak: Adds chaplain role allowance to the TMP Service Uniform loadout. + - tweak: Adds paramedic in every medsci mentioned uniform loadout. + DeltaFire15: + - bugfix: Offstation AIs can once again only interact with their z-level + Ghommie: + - bugfix: Fixing IC material containers interaction with stacks, for real. + Trilbyspaceclone: + - tweak: Gasses like BZ and Masiam seem to just sell for less in cargo, markets + seem to change it seems + kevinz000: + - balance: plantpeople should stop dying in the halls now + - rscadd: Modifier-independent hotkey bindings have been added. +2020-06-10: + DeltaFire15: + - bugfix: Golems / simillar now inherit the neutered antag datum if the creator + is neutered. + Ghommie: + - bugfix: Fixing missing pill type buttons from the chem master UI. + Naksu: + - code_imp: Lighting corner updates are ever so slightly faster. + Putnam for helping me code the contamination clearing on people: + - rscadd: Lab made Zeolites have been remade anew and more affective now that they + refined the best possable way to mix and make a supper Zeolite capable of clearing + contamination form not only people but items! + Trilbyspaceclone: + - tweak: Tank Dispender has been moved into toxin storage from toxins + kevinz000: + - rscadd: traitor classes can now be poplocked. hijack/glorious death are now locked + to 25/20 respectively. + timothyteakettle: + - rscadd: adds a new fermichem, used for creating sentient plushies! + - rscadd: Mice can now breed using cheese wedges + - rscadd: Royal cheese can be crafted to convert a mouse into king rat +2020-06-11: + Ghommie: + - balance: Balanced vending machine prices to be generally more affordable, a minority + has been priced up though. +2020-06-12: + EmeraldSundisk: + - tweak: The Detective's Office has been commandeered in order to serve a Head of + Security. Detectives will find their new office within starboard maintenance. + - rscadd: Adds the Head of Security's standard equipment to their new office. + - tweak: Slight adjustment/expansion to the main security department + - rscadd: Additional maintenance work + timothyteakettle: + - rscadd: Crabs, cockroaches, slimes and crabs are now small enough to fit in pet + carriers +2020-06-14: + Bhijn: + - bugfix: raw HTML can no longer be used in flavortext + - rscadd: Added Lesbian Visibility Day (April 26th) + - rscadd: Added Bisexual Visibility Day (September 23rd) + - rscadd: Added Coming Out Day! (October 11th) + - rscadd: Added Intersex Awareness Day (October 26th) + - rscadd: Added Transgender Awareness Week (November 13th - 19th) + - rscadd: Added the Transgender Day of Remembrance (November 20th) + - rscadd: Added Asexual Awareness Week (Last full week of October, this year it'll + be Oct. 25-31) + - rscadd: Added the Stonewall Riot Anniversary (June 28) + - bugfix: Moth week is now *actually* the last full week of July, instead of the + 4th of every weekday + the 5th Sunday. + Floof Ball / Kathrin Morrison / Floof Ball#0798: + - rscadd: Improvised Pistol + 32 ACP ammo. + - rscadd: Improvised Energy Gun. Fires 5 shots of 10 burn damage each. Can be upgraded + with a lens made from glassworking and T4 parts for a minor buff. + - rscadd: Ammo + gun part loot spawners for mappers. + - rscadd: New sprites for Improvised Rifle, the ability to sling the rifle and a + sprite for that. + - rscadd: New sprites for the Improvised Shotgun and its sling sprite. + - balance: Improvised shotguns are now two-handed only. + - balance: Improvised shotguns now only have a much less harsh 0.9* modifier, keeping + them two hits to crit with slugs and buckshot. It can no longer be dual-wielded + but can still be sawn off for w_class medium (can fit in backpacks). + - bugfix: Missing handsaw icons added in. + - tweak: Crafting table cleaned up into sections. + Ghommie: + - tweak: changed the weak attack message prefix from "inefficiently" to "limply", + "feebly" and "saplessly" and lowered the threshold. + - bugfix: Fixing old beserker hardsuits having the wrong helmet type. + The0bserver and Stewydeadmike: + - rscadd: Hey, there's a bit of dust in this recipe book! Recipes using peas? How + many recipes does this book even have? + - rscadd: Adds 6 new food items, and 1 new consumable reagent using all forms of + the recently discovered peas. Ask your local botanist and chef for them today! + YakumoChen: + - tweak: Adds polychrome options to loadout + - tweak: Adds risque polychrome options to Kinkmate vendors + kevinz000: + - bugfix: emissive blockers can no longer be radioactive. + - rscadd: Ghosts can now scan air inside most objects that contain air by clicking + on them. + - rscadd: Directional blocking has been added, keybound to G. This will reduce a + portion of incoming damage if done with eligible items at the cost of stamina + damage incurred to the user based on damage blocked as well as while active, + as well as in most cases preventing the user from doing any attacks while this + is active. + - rscadd: Parrying has been added, keybound to F. Timing-based counterattacks, effect + heavily dependent on the item, WIP. + - balance: Disks are now smaller. +2020-06-15: + Anturk, kevinz000: + - bugfix: VV now properly allows access to datums in associative lists + - rscadd: SDQL2 printout has been upgraded for the 5th time. + kevinz000: + - bugfix: plushies now work. credits to timothytea. + - rscadd: You can now tape knives to cleanbots + kevinz000 (port from VOREStation): + - imageadd: Ported zoomba skins for cyborgs. +2020-06-16: + Ghommie: + - bugfix: You can't blink nor use LOOC/AOOC as a petrified statue anymore. + Trilbyspaceclone: + - tweak: BEPIS decal painter has been moved to venders, replacing it being the flashdark + kevinz000: + - refactor: projectile ricochets now use a less hilariously terrible way of being + handled and should be easier to w + - bugfix: projectile runtime/ricocheting + - balance: Lobotomy no longer has a 50% chance of giving you a nigh-unremovable + trauma, but does 50 brain damage even on success. On failure, it will give you + a lobotomy-class trauma. + - balance: spinesnapping from tackling now only gives a lobotomy class trauma instead + of magic. + timothyteakettle: + - bugfix: Food carts now function as intended, allowing the pouring and mixing of + drinks. + - rscadd: slimes can now change their color using alter form +2020-06-17: + SmArtKar: + - rscadd: New ID icons + - rscadd: Sutures and Meshes + Trilbyspaceclone: + - bugfix: Gin export takes gin now +2020-06-18: + Detective-Google: + - tweak: cog is now less the suck + - bugfix: couple little derpy bits + - balance: malf disk and illegal tech disk moved from ashwalker base (guaranteed) + to tendrils (chance based) + SmArtKar: + - rscadd: Ported shuttles from beestation + timothyteakettle: + - rscadd: embeds got reworked, sticky tape was added, more bullets that ricochet + also added + - rscadd: medbots can now be tipped over + - soundadd: added more medbot sounds +2020-06-19: + Bhijn: + - bugfix: Atmos can no longer become completely bricked + Funce: + - bugfix: Square root circuit should now actually work. + SmArtKar: + - bugfix: Fixed my runtimes + TheSpaghetti: + - rscadd: more insectoid insects + kevinz000: + - rscadd: bay/polaris style say_emphasis has been added. You can now |italicize| + _underline_ and +bold+ your messages. + timothyteakettle: + - rscadd: Adds the brain trauma event, where one player gets a random brain trauma! + - rscadd: Adds the wisdom cow event, where the wisdom cow appears on the station! + - rscadd: Adds the fake virus event, where people get fake virus symptoms. + - rscadd: Adds the stray cargo pod event, where a cargo pod crashes into the station. + - rscadd: Adds the fugitives event, where fugitives are loose on the station, and + it's the hunters jobs to capture them. +2020-06-20: + LetterN: + - rscadd: Asset cache from tg + - tweak: Made the map viewer not look bad + - bugfix: Admin matrix right-bracket + bunny232: + - rscdel: Removed unsavory things from the vent clog event +2020-06-21: + kevinz000: + - balance: calculations for punch hit chance has been drastically buffed in favor + of the attacker. +2020-06-22: + Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK): + - tweak: Certain small items purchased through cargo now get grouped into a single + box. They also are immune to the 10% private account fee. + - rscadd: Added single-order options for several existing products in the Cargo + Catalog. + - tweak: Medkit listings are now single-pack items, and considered small items that + get grouped into single boxes. Price for medkits is as close to unchanged as + is reasonable. + - rscadd: You can now beat on vending machines to try and knock loose free stuff! + You can also almost kill yourself doing it, so it's your call if your life is + worth ten bucks. + - rscadd: Cigarette packets now have coupons on the back for small cargo items! + Smoking DOES pay! + - tweak: Some single/small items in cargo have been rebranded as goodies, come in + lockboxes rather than crates, and can only be purchased with private accounts. + kevinz000: + - refactor: Life() is split into BiologicalLife() and PhysicalLife. A component + signal has been added that can prevent either from ticking. + shellspeed1: + - rscadd: Adds IV bags. diff --git a/html/changelogs/AutoChangeLog-pr-11404.yml b/html/changelogs/AutoChangeLog-pr-11404.yml deleted file mode 100644 index 18e0145b34..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11404.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - balance: "torches take less staminda to use." - - balance: "Glowsticks dont last as long" - - balance: "Penlights are better at being lights" - - balance: "Torches are brighter then before - Indian Johns want to be on lava land rejoy!" - - balance: "Eye lights have 30% less light coming out of them." diff --git a/html/changelogs/AutoChangeLog-pr-11443.yml b/html/changelogs/AutoChangeLog-pr-11443.yml deleted file mode 100644 index d4b32df2eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11443.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscadd: "Melee attacks now stagger people, preventing them from sprinting until the (relatively short lived) effect runs out. Duration equation is [(1.5 + (w_class/7.5)) * force]." diff --git a/html/changelogs/AutoChangeLog-pr-11515.yml b/html/changelogs/AutoChangeLog-pr-11515.yml deleted file mode 100644 index 63e6de4526..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11515.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - tweak: "Dynamic reworked to be more \"storyteller-like\": threat is now how threatened the station is right now and threat level is how much the mode wants the station to be threatened." - - tweak: "Random storyteller is now truly random." - - tweak: "Story storyteller now gives a nice rising-action-climax-falling action curve for threat level." - - tweak: "\"Chaotic\" storyteller now simply ramps up threat level as round goes on." - - rscadd: "\"Classic\" storyteller, basically doing what \"random\" did before." diff --git a/html/changelogs/AutoChangeLog-pr-11524.yml b/html/changelogs/AutoChangeLog-pr-11524.yml deleted file mode 100644 index b7ffb68a71..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11524.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "actioninja (ported by Ghommie)" -delete-after: True -changes: - - refactor: "repathed all under clothing, keep an eye out for errors." diff --git a/html/changelogs/AutoChangeLog-pr-11536.yml b/html/changelogs/AutoChangeLog-pr-11536.yml deleted file mode 100644 index 0d2eaea6d7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11536.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - balance: "Water, Holywater and Unholywater will now now quickly purge itself if you have 151u in your system" diff --git a/html/changelogs/AutoChangeLog-pr-11546.yml b/html/changelogs/AutoChangeLog-pr-11546.yml deleted file mode 100644 index 260204e8e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11546.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "Ports over TG's Mortars and Pestles." diff --git a/html/changelogs/AutoChangeLog-pr-11555.yml b/html/changelogs/AutoChangeLog-pr-11555.yml deleted file mode 100644 index 8eca88fa7b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - balance: "Fireman carrying now makes the person being carried unable to use items. Piggybacking now slows down the person being ridden. In both cases, the person riding will be dazed when forcefully dismounted, and dazed for a second if dismounting from piggybacking" diff --git a/html/changelogs/AutoChangeLog-pr-11570.yml b/html/changelogs/AutoChangeLog-pr-11570.yml deleted file mode 100644 index b4191c5116..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11570.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - rscadd: "sneaksuit to contractor items" - - tweak: "sneaksuit is a bundle" - - rscdel: "intel potion and radio implant from contractor items" diff --git a/html/changelogs/AutoChangeLog-pr-11572.yml b/html/changelogs/AutoChangeLog-pr-11572.yml deleted file mode 100644 index 56aea9f04d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11572.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - balance: "clockie vanguard now quickly regenerates stam while active (as its description always told you,)" diff --git a/html/changelogs/AutoChangeLog-pr-11573.yml b/html/changelogs/AutoChangeLog-pr-11573.yml deleted file mode 100644 index 3773f1c43a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11573.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - balance: "sneaksuit is not fireproof" diff --git a/html/changelogs/AutoChangeLog-pr-11576.yml b/html/changelogs/AutoChangeLog-pr-11576.yml deleted file mode 100644 index e252fd3a04..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11576.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "Owai-Seek" -delete-after: True -changes: - - rscadd: "Port Pina Colada, Painkiller, Moscow Mule, Hivemind Eraser, Moana Lou Drinks" - - rscadd: "Gunfire, Hellfire, Sins Delight, Strawberry Daiquiri, Miami Vice, Malibu Sunset, Lizz Fizz, Hotline Miami" - - rscadd: "Strawberry and Pineapple Juice" - - rscadd: "Salami Slices" - - tweak: "Soda Dispenser Juices" - - tweak: "Reorganize Vendor Objects (Bowls, Glasses, Shot Glasses)" - - tweak: "Strawberry Milk and Tea actually use strawberry Juice." - - tweak: "Lizards can eat egg wraps. Moved Egg Wraps to Misc" diff --git a/html/changelogs/AutoChangeLog-pr-11578.yml b/html/changelogs/AutoChangeLog-pr-11578.yml deleted file mode 100644 index fb382c4d76..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11578.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed a few mutations not working correctly." diff --git a/html/changelogs/AutoChangeLog-pr-11580.yml b/html/changelogs/AutoChangeLog-pr-11580.yml deleted file mode 100644 index 4dd8e6daf3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11580.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "new reagent 'Condensed Cooking Oil'" - - tweak: "list of chems that can go into fried non-food items was changed" diff --git a/html/changelogs/AutoChangeLog-pr-11581.yml b/html/changelogs/AutoChangeLog-pr-11581.yml deleted file mode 100644 index af90ea28bb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11581.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Added M/F body preferences." diff --git a/html/changelogs/AutoChangeLog-pr-11582.yml b/html/changelogs/AutoChangeLog-pr-11582.yml deleted file mode 100644 index 13646012af..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11582.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "keronshb" -delete-after: True -changes: - - tweak: "Reverts Mining Base RNG Placement" diff --git a/html/changelogs/AutoChangeLog-pr-11585.yml b/html/changelogs/AutoChangeLog-pr-11585.yml deleted file mode 100644 index 78390b808e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11585.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - bugfix: "beams should no longer go across the map and mess everything up if their source or target isn't on a turf." diff --git a/html/changelogs/AutoChangeLog-pr-11589.yml b/html/changelogs/AutoChangeLog-pr-11589.yml deleted file mode 100644 index 526d95b927..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11589.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - refactor: "Made votes obfuscation settings more robust." - - admin: "Also included them in custom votes." - - tweak: "The map rotation vote will only hide ongoing votes now, not the results." diff --git a/html/changelogs/AutoChangeLog-pr-11590.yml b/html/changelogs/AutoChangeLog-pr-11590.yml deleted file mode 100644 index e8241cb0ec..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11590.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "added beacon for cooks to choose an ingredient box, which replaces the random box they used to receive" - - rscadd: "added a new sushi ingredients box" - - rscadd: "added more items to the wildcard box's possible contents" diff --git a/html/changelogs/AutoChangeLog-pr-11591.yml b/html/changelogs/AutoChangeLog-pr-11591.yml deleted file mode 100644 index f2c06035f1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11591.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - bugfix: "insidious balaclava muzzlepsprite works" diff --git a/html/changelogs/AutoChangeLog-pr-11592.yml b/html/changelogs/AutoChangeLog-pr-11592.yml deleted file mode 100644 index a1667601eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11592.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Near-station nuclear explosions now display the on-station nuke explosion cinematic, consistently with its clearance of the station level and its nuclear victory / total annihilation ending status." - - balance: "Nuclear bombs can't be anchored in space areas (not just turfs) anymore, as a quick effortless way to discourage players from anchoring the device on the edge of the map." diff --git a/html/changelogs/AutoChangeLog-pr-11594.yml b/html/changelogs/AutoChangeLog-pr-11594.yml deleted file mode 100644 index f6de9ad977..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11594.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kraseo" -delete-after: True -changes: - - balance: "Sneaksuit now costs 5 TC rather than 3." diff --git a/html/changelogs/AutoChangeLog-pr-11595.yml b/html/changelogs/AutoChangeLog-pr-11595.yml deleted file mode 100644 index c604c1ac97..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11595.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Detective-Google" -delete-after: True -changes: - - balance: "Shotguns are now slower and require two hands to fire." diff --git a/html/changelogs/AutoChangeLog-pr-11598.yml b/html/changelogs/AutoChangeLog-pr-11598.yml deleted file mode 100644 index 46d0d73d6c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11598.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed crafting hud icon overlapping the second pocket on 1:1 screen mode." diff --git a/html/changelogs/AutoChangeLog-pr-11600.yml b/html/changelogs/AutoChangeLog-pr-11600.yml deleted file mode 100644 index 2c0c5e5a4f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11600.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - code_imp: "Removed some dead flightsuit code leftovers." diff --git a/html/changelogs/AutoChangeLog-pr-11601.yml b/html/changelogs/AutoChangeLog-pr-11601.yml deleted file mode 100644 index d327045d12..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11601.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kraseo" -delete-after: True -changes: - - bugfix: "You can break out of neckgrabs once more." diff --git a/html/changelogs/AutoChangeLog-pr-11602.yml b/html/changelogs/AutoChangeLog-pr-11602.yml deleted file mode 100644 index a2e3a1f8f3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11602.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "Several guns now shoot exactly where you click regardless of movement or turning." diff --git a/html/changelogs/AutoChangeLog-pr-11603.yml b/html/changelogs/AutoChangeLog-pr-11603.yml deleted file mode 100644 index 56bf29fd55..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11603.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "KathrinBailey" -delete-after: True -changes: - - rscadd: "New shutter sprites" - - rscadd: "Reinforced Shutter" - - rscadd: "Radiation Shutter" - - rscadd: "Window Shutter" - - tweak: "Shutters not being blast doors functionally." - - balance: "Shutter armour block and health." diff --git a/html/changelogs/AutoChangeLog-pr-11604.yml b/html/changelogs/AutoChangeLog-pr-11604.yml deleted file mode 100644 index 571876cbba..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11604.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "dapnee" -delete-after: True -changes: - - rscadd: "plant disk sorter in botany, bounty console for the rest of cargo, a missing air alarm in the incinerator" - - tweak: "fixed a decal in front of security, moved an AIR alarm so it doesn't look awful to ghosts/AI, asteroids don't delete air anymore, fixed more active turfs, the buttons in the bridge \"should\" work now, HoP and cargo desks should be secure now" - - rscdel: "quarters that found their way out of the quartermaster's back room" diff --git a/html/changelogs/AutoChangeLog-pr-11605.yml b/html/changelogs/AutoChangeLog-pr-11605.yml deleted file mode 100644 index caa3cf5c92..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11605.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "HEALTH AND STAMINA DON'T STACK FOR PUTTING YOU INTO STAMINA CRIT." - - balance: "YOUR FISTS ARE HELLA GODDAMN STRONG." - - balance: "ACCEPT THE FELINIDS WARES, FOR SKOOMA HAS INCREDIBLE LETHAL PROPERTIES: YOUR HANDS BECOME LIKE SWORDS." - - balance: "BOXERS CAN ONLY KNOCK OUT OTHER BOXERS BECAUSE THEY HAVE HONOR OR SOME SHIT" - - balance: "INCREASED STAMINA DAMAGE TO LIMBS FROM 50% TO 75%." diff --git a/html/changelogs/AutoChangeLog-pr-11606.yml b/html/changelogs/AutoChangeLog-pr-11606.yml deleted file mode 100644 index 277f2aa607..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11606.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - balance: "White Ships, Telerelays and a defunk mining post are now always going to spawn." - - spellcheck: "Corrects a few desc on station side ruins" diff --git a/html/changelogs/AutoChangeLog-pr-11607.yml b/html/changelogs/AutoChangeLog-pr-11607.yml deleted file mode 100644 index 46dac6a318..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11607.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Underwear now fulfills its purpose." - - rscadd: "Privates visibility preferences." diff --git a/html/changelogs/AutoChangeLog-pr-11610.yml b/html/changelogs/AutoChangeLog-pr-11610.yml deleted file mode 100644 index a3a7714f8f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11610.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Russian Revolver can no longer be exploited for a free 357." diff --git a/html/changelogs/AutoChangeLog-pr-11614.yml b/html/changelogs/AutoChangeLog-pr-11614.yml deleted file mode 100644 index c478cc0df7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11614.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixing an issue with the split personality removing the original owner from the round if the body died while the stranger was in control." diff --git a/html/changelogs/AutoChangeLog-pr-11619.yml b/html/changelogs/AutoChangeLog-pr-11619.yml deleted file mode 100644 index 4fe72246c3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11619.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Fixed limb damage calc" diff --git a/html/changelogs/AutoChangeLog-pr-11622.yml b/html/changelogs/AutoChangeLog-pr-11622.yml deleted file mode 100644 index f1976ce8ea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11622.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "mobs with antag statuses such as wizard, ert and nuke ops get their flavor text removed now." - - bugfix: "Fixed megafauna mobs, goliaths and \"anchored\" AIs being stuffable into closets." diff --git a/html/changelogs/AutoChangeLog-pr-11623.yml b/html/changelogs/AutoChangeLog-pr-11623.yml deleted file mode 100644 index 69fe5dbc6e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11623.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Bhijn" -delete-after: True -changes: - - rscadd: "Added a lfwb-inspired orbiting pixel + flashing outline animation to the sprint and combat mode buttons. This can be toggled via the preferences menu, and is completely independent from all HUD themes." diff --git a/html/changelogs/AutoChangeLog-pr-11629.yml b/html/changelogs/AutoChangeLog-pr-11629.yml deleted file mode 100644 index 076d0027d1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11629.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - balance: "stops hijackers from being able to remotely blow up borgs" diff --git a/html/changelogs/AutoChangeLog-pr-11630.yml b/html/changelogs/AutoChangeLog-pr-11630.yml deleted file mode 100644 index c65ecfe3bd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11630.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "bunny232" -delete-after: True -changes: - - bugfix: "Box secmos now is now longer connected to the scrubber loop" diff --git a/html/changelogs/AutoChangeLog-pr-11631.yml b/html/changelogs/AutoChangeLog-pr-11631.yml deleted file mode 100644 index a1ab8ba935..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11631.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "KathrinBailey" -delete-after: True -changes: - - rscadd: "Radiation shuttesr to all supermatters." - - rscadd: "Windowed shutters to armouries where relevant." - - rscadd: "New posters are now on the map in relevant locations." - - bugfix: "Windowed shutter now has glass, the door closing proc sees this and no longer changes opacity." - - bugfix: "Accidental HoochMaster removal in the bar." - - bugfix: "Spawning looking at the supermatter with no mesons on Meta." - - bugfix: "Missing disposal pipe outside HoP office." - - bugfix: "Sofas were never adjusted when the pool was added." diff --git a/html/changelogs/AutoChangeLog-pr-11632.yml b/html/changelogs/AutoChangeLog-pr-11632.yml deleted file mode 100644 index 01114f0772..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11632.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "Chaplains are now inelegible for bloodsuckers." diff --git a/html/changelogs/AutoChangeLog-pr-11633.yml b/html/changelogs/AutoChangeLog-pr-11633.yml deleted file mode 100644 index 87ba396950..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11633.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "Blacklists unsynthetizable reagents from botany bees honey production." diff --git a/html/changelogs/AutoChangeLog-pr-11636.yml b/html/changelogs/AutoChangeLog-pr-11636.yml deleted file mode 100644 index c4c285c4b0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11636.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "Medical Mechs syringe gun now knows many more life saving chems, like Insulin, Dexalin, Prussian Blue, Kelotane and Bicaridine" diff --git a/html/changelogs/AutoChangeLog-pr-11641.yml b/html/changelogs/AutoChangeLog-pr-11641.yml deleted file mode 100644 index 27729e62e6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11641.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - rscdel: "Nymphomania removed" - - code_imp: "Exhibitionism ignored by preferences now, since it was also removed" - - code_imp: "Quirk migration now does an admin log instead of a stack trace" diff --git a/html/changelogs/AutoChangeLog-pr-11642.yml b/html/changelogs/AutoChangeLog-pr-11642.yml deleted file mode 100644 index f4272a0d3f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11642.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - config: "Added configs for various antag threat levels." - - bugfix: "Fixed a runtime in threat calculation." - - tweak: "Fixed up some misleading texts." diff --git a/html/changelogs/AutoChangeLog-pr-11645.yml b/html/changelogs/AutoChangeLog-pr-11645.yml deleted file mode 100644 index 8c90eb1e6c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11645.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "Cooks aided by Clowns have came out with and new healthy Salad - Caesar Salad. Just dont eat the knife..." diff --git a/html/changelogs/AutoChangeLog-pr-11649.yml b/html/changelogs/AutoChangeLog-pr-11649.yml deleted file mode 100644 index 605d154fda..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11649.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Infiltrator's boots don't stop slips and \"space wind\" through the power of runtime errors anymore, and properly silence the user's footsteps now." diff --git a/html/changelogs/AutoChangeLog-pr-11651.yml b/html/changelogs/AutoChangeLog-pr-11651.yml deleted file mode 100644 index 8424c11570..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11651.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - rscadd: "ghosts can now DNR" diff --git a/html/changelogs/AutoChangeLog-pr-11653.yml b/html/changelogs/AutoChangeLog-pr-11653.yml deleted file mode 100644 index ba303f3e28..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11653.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - rscadd: "You can now choose your name and color as a holoparasite/guardian/holocarp!" - - bugfix: "fixes lings being able to get mechanical holoparasites" diff --git a/html/changelogs/AutoChangeLog-pr-11656.yml b/html/changelogs/AutoChangeLog-pr-11656.yml deleted file mode 100644 index 4d36d31588..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11656.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xantholne" -delete-after: True -changes: - - bugfix: "bumbles will stop sleeping so much" diff --git a/html/changelogs/AutoChangeLog-pr-11660.yml b/html/changelogs/AutoChangeLog-pr-11660.yml deleted file mode 100644 index bf88560186..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11660.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Bhijn" -delete-after: True -changes: - - admin: "The traitor panel now actually shows a list of contractor targets." diff --git a/html/changelogs/AutoChangeLog-pr-11663.yml b/html/changelogs/AutoChangeLog-pr-11663.yml deleted file mode 100644 index 207088177a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11663.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - server: "Changlogs are updateded once again as of the 28th of March on year 2020" diff --git a/html/changelogs/AutoChangeLog-pr-11668.yml b/html/changelogs/AutoChangeLog-pr-11668.yml deleted file mode 100644 index c4fc99f2f3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11668.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "no more 20pop requirement for noslips" diff --git a/html/changelogs/AutoChangeLog-pr-11669.yml b/html/changelogs/AutoChangeLog-pr-11669.yml deleted file mode 100644 index 8d33b22a71..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11669.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BuffEngineering" -delete-after: True -changes: - - bugfix: "You may no longer summon plasteel from the door dimension." - - tweak: "High security airlocks are now 33% more materially efficient!" diff --git a/html/changelogs/AutoChangeLog-pr-11671.yml b/html/changelogs/AutoChangeLog-pr-11671.yml deleted file mode 100644 index b15c68af41..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11671.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - tweak: "Stunslugs are now a mixed damage taser-like slug that will allow you to apply a variety of damage while still being countered by tasers usual counters." - - balance: "Mech scattershot guns are no longer oneshotting people into stamina crit." diff --git a/html/changelogs/AutoChangeLog-pr-11672.yml b/html/changelogs/AutoChangeLog-pr-11672.yml deleted file mode 100644 index a4cfdc22b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11672.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - rscdel: "Null crates are no longer available in cargo!" diff --git a/html/changelogs/AutoChangeLog-pr-11673.yml b/html/changelogs/AutoChangeLog-pr-11673.yml deleted file mode 100644 index d2c82d6170..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11673.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - rscdel: "Removed an number of cargo crate packs: Riot shotguns/standard shotguns, double barreled shotguns, techshell crate, swat tasers, WT550 types (not rubber or standard), traitor theft objective kits." diff --git a/html/changelogs/AutoChangeLog-pr-11674.yml b/html/changelogs/AutoChangeLog-pr-11674.yml deleted file mode 100644 index ee2d358fdb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11674.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "Double-barreled shotguns and any child of such now can be used with off-hand equipment." diff --git a/html/changelogs/AutoChangeLog-pr-11675.yml b/html/changelogs/AutoChangeLog-pr-11675.yml deleted file mode 100644 index f7d407f566..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11675.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - rscadd: "Readds bioterror darts to the nuclear operative uplink for the legacy price of 6tc! Has all new horrid reagents!" - - balance: "Scatterlaser is now in-line with buckshot. Nukies can't purchase scatterlaser shot." diff --git a/html/changelogs/AutoChangeLog-pr-11676.yml b/html/changelogs/AutoChangeLog-pr-11676.yml deleted file mode 100644 index c4f44ab965..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11676.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - rscadd: "A new, much more barebones holding facility for contractors." - - rscdel: "Energy nets are gone." - - tweak: "Various ghost roles are now easier to ghost as." - - tweak: "The candles in the dojo no longer make the place hotter and hotter over time." diff --git a/html/changelogs/AutoChangeLog-pr-11677.yml b/html/changelogs/AutoChangeLog-pr-11677.yml deleted file mode 100644 index b2ae473187..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11677.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "actioninja" -delete-after: True -changes: - - rscadd: "Better glowing lights" diff --git a/html/changelogs/AutoChangeLog-pr-11679.yml b/html/changelogs/AutoChangeLog-pr-11679.yml deleted file mode 100644 index 08a098f754..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11679.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - bugfix: "turfs properly initialize atom colors if they're colored." diff --git a/html/changelogs/AutoChangeLog-pr-11681.yml b/html/changelogs/AutoChangeLog-pr-11681.yml deleted file mode 100644 index 4ef6b60aeb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11681.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "PersianXerxes" -delete-after: True -changes: - - rscadd: "TGUI Next UIs for: chem heaters, chem masters, chem dispensers, and sleepers" - - code_imp: "Reworked Chem Master code" diff --git a/html/changelogs/AutoChangeLog-pr-11682.yml b/html/changelogs/AutoChangeLog-pr-11682.yml deleted file mode 100644 index 1d8d3c618c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11682.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - rscdel: "No more station integrity goal" - - tweak: "Upload-hacked-law goal only picksif there's an AI to upload to" diff --git a/html/changelogs/AutoChangeLog-pr-11683.yml b/html/changelogs/AutoChangeLog-pr-11683.yml deleted file mode 100644 index eefd810536..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11683.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "add new holodeck wrestling belt which lets you use moves only on those also wearing it" - - rscadd: "add new holodeck map featuring the holodeck wrestling belt" diff --git a/html/changelogs/AutoChangeLog-pr-11688.yml b/html/changelogs/AutoChangeLog-pr-11688.yml deleted file mode 100644 index 93f5d69432..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11688.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Roundstart rulesets now roll properly." diff --git a/html/changelogs/AutoChangeLog-pr-11691.yml b/html/changelogs/AutoChangeLog-pr-11691.yml deleted file mode 100644 index 35d95db2b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11691.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - tweak: "cloners now stabilize mutations while someone's cloning, meaning active genes will not life tick." diff --git a/html/changelogs/AutoChangeLog-pr-11692.yml b/html/changelogs/AutoChangeLog-pr-11692.yml deleted file mode 100644 index 9b88e96350..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11692.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - bugfix: "made color picking for character appearance show the colors when you pick them" diff --git a/html/changelogs/AutoChangeLog-pr-11693.yml b/html/changelogs/AutoChangeLog-pr-11693.yml deleted file mode 100644 index 8ece04fb49..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11693.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - spellcheck: "Spec Ops crate no longer talks about a \"Null Crate\" what ever that is" diff --git a/html/changelogs/AutoChangeLog-pr-11698.yml b/html/changelogs/AutoChangeLog-pr-11698.yml deleted file mode 100644 index 1538c3a532..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11698.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "After years of visual agony, the Curse of The Floating Disembodied Phallus has come to an end." diff --git a/html/changelogs/AutoChangeLog-pr-11700.yml b/html/changelogs/AutoChangeLog-pr-11700.yml deleted file mode 100644 index 132e722229..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11700.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kiwedespars" -delete-after: True -changes: - - rscadd: "Added paper masks." diff --git a/html/changelogs/AutoChangeLog-pr-11701.yml b/html/changelogs/AutoChangeLog-pr-11701.yml deleted file mode 100644 index f993c912d3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11701.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "The megafauna's hitbox doesn't include 0 alpha sections anymore." diff --git a/html/changelogs/AutoChangeLog-pr-11708.yml b/html/changelogs/AutoChangeLog-pr-11708.yml deleted file mode 100644 index 7ead7721bf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11708.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - tweak: "the sergal markings" diff --git a/html/changelogs/AutoChangeLog-pr-11719.yml b/html/changelogs/AutoChangeLog-pr-11719.yml deleted file mode 100644 index 60a30ba092..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11719.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Intellectual property infringment is not cool." diff --git a/icons/UI_Icons/chat/chat_icons.dmi b/icons/UI_Icons/chat/chat_icons.dmi new file mode 100644 index 0000000000..7040b3966f Binary files /dev/null and b/icons/UI_Icons/chat/chat_icons.dmi differ diff --git a/icons/effects/96x96_attack_sweep.dmi b/icons/effects/96x96_attack_sweep.dmi new file mode 100644 index 0000000000..25547822f1 Binary files /dev/null and b/icons/effects/96x96_attack_sweep.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 0731583733..0c4784553c 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/block_parry.dmi b/icons/effects/block_parry.dmi new file mode 100644 index 0000000000..4a0ade5e61 Binary files /dev/null and b/icons/effects/block_parry.dmi differ diff --git a/icons/effects/freeze.dmi b/icons/effects/freeze.dmi index 28db97d87b..0461619064 100644 Binary files a/icons/effects/freeze.dmi and b/icons/effects/freeze.dmi differ diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi index 22f091ff11..36dd36ee7a 100755 Binary files a/icons/effects/parallax.dmi and b/icons/effects/parallax.dmi differ diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi index d7f0f3e054..a1ac490f00 100644 Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ diff --git a/icons/misc/field_of_vision.dmi b/icons/misc/field_of_vision.dmi new file mode 100644 index 0000000000..015cecd88c Binary files /dev/null and b/icons/misc/field_of_vision.dmi differ diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index 3b4ac1a16a..155dbab98d 100644 Binary files a/icons/misc/language.dmi and b/icons/misc/language.dmi differ diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi deleted file mode 100644 index cda7cca404..0000000000 Binary files a/icons/mob/accessories.dmi and /dev/null differ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index aefa471dd2..78eb9f5fe5 100644 Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ diff --git a/icons/mob/actions/actions_shuttle.dmi b/icons/mob/actions/actions_shuttle.dmi new file mode 100644 index 0000000000..ef35786a2b Binary files /dev/null and b/icons/mob/actions/actions_shuttle.dmi differ diff --git a/icons/mob/actions/actions_vehicle.dmi b/icons/mob/actions/actions_vehicle.dmi index cee683c60d..0d8d322653 100644 Binary files a/icons/mob/actions/actions_vehicle.dmi and b/icons/mob/actions/actions_vehicle.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 3697fe4ff5..07839588ce 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 988ae1a30f..13f97d3761 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi deleted file mode 100644 index 66a47d21f2..0000000000 Binary files a/icons/mob/back.dmi and /dev/null differ diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 6964160c04..a197581533 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi new file mode 100644 index 0000000000..c13b6a50bc Binary files /dev/null and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/alpha_masks.dmi b/icons/mob/clothing/alpha_masks.dmi new file mode 100644 index 0000000000..28f6069cea Binary files /dev/null and b/icons/mob/clothing/alpha_masks.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi new file mode 100644 index 0000000000..0a1372ac2b Binary files /dev/null and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/clothing/belt.dmi similarity index 100% rename from icons/mob/belt.dmi rename to icons/mob/clothing/belt.dmi diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi similarity index 100% rename from icons/mob/belt_mirror.dmi rename to icons/mob/clothing/belt_mirror.dmi diff --git a/icons/mob/custom_w.dmi b/icons/mob/clothing/custom_w.dmi similarity index 100% rename from icons/mob/custom_w.dmi rename to icons/mob/clothing/custom_w.dmi diff --git a/icons/mob/eyes.dmi b/icons/mob/clothing/eyes.dmi similarity index 100% rename from icons/mob/eyes.dmi rename to icons/mob/clothing/eyes.dmi diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi new file mode 100644 index 0000000000..2b28d06976 Binary files /dev/null and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi new file mode 100644 index 0000000000..7815f3d0a4 Binary files /dev/null and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi new file mode 100644 index 0000000000..856fe2149a Binary files /dev/null and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi new file mode 100644 index 0000000000..ccd902ec03 Binary files /dev/null and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi similarity index 100% rename from icons/mob/head_muzzled.dmi rename to icons/mob/clothing/head_muzzled.dmi diff --git a/icons/mob/mask.dmi b/icons/mob/clothing/mask.dmi similarity index 68% rename from icons/mob/mask.dmi rename to icons/mob/clothing/mask.dmi index ee36c59209..c361563da3 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi new file mode 100644 index 0000000000..0a10f1edbe Binary files /dev/null and b/icons/mob/clothing/mask_muzzled.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi new file mode 100644 index 0000000000..86dec62a41 Binary files /dev/null and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/restraints.dmi b/icons/mob/clothing/restraints.dmi similarity index 100% rename from icons/mob/restraints.dmi rename to icons/mob/clothing/restraints.dmi diff --git a/icons/mob/suit.dmi b/icons/mob/clothing/suit.dmi similarity index 92% rename from icons/mob/suit.dmi rename to icons/mob/clothing/suit.dmi index 195e4ecd67..1c06c203e1 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi new file mode 100644 index 0000000000..ca2a088551 Binary files /dev/null and b/icons/mob/clothing/suit_digi.dmi differ diff --git a/icons/mob/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi similarity index 100% rename from icons/mob/taur_canine.dmi rename to icons/mob/clothing/taur_canine.dmi diff --git a/icons/mob/clothing/taur_hooved.dmi b/icons/mob/clothing/taur_hooved.dmi new file mode 100644 index 0000000000..993e9c2550 Binary files /dev/null and b/icons/mob/clothing/taur_hooved.dmi differ diff --git a/icons/mob/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi similarity index 100% rename from icons/mob/taur_naga.dmi rename to icons/mob/clothing/taur_naga.dmi diff --git a/icons/mob/underwear.dmi b/icons/mob/clothing/underwear.dmi similarity index 100% rename from icons/mob/underwear.dmi rename to icons/mob/clothing/underwear.dmi diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi new file mode 100644 index 0000000000..163d2dc2f2 Binary files /dev/null and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi new file mode 100644 index 0000000000..da94f97895 Binary files /dev/null and b/icons/mob/clothing/uniform_digi.dmi differ diff --git a/icons/mob/clown_mobs.dmi b/icons/mob/clown_mobs.dmi new file mode 100644 index 0000000000..803a99cd7a Binary files /dev/null and b/icons/mob/clown_mobs.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index de33d3fd69..0195670bdc 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/mob/dogborg.dmi b/icons/mob/dogborg.dmi deleted file mode 100644 index 856724be1f..0000000000 Binary files a/icons/mob/dogborg.dmi and /dev/null differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi deleted file mode 100644 index 578970a21c..0000000000 Binary files a/icons/mob/feet.dmi and /dev/null differ diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi deleted file mode 100644 index fbc105b634..0000000000 Binary files a/icons/mob/feet_digi.dmi and /dev/null differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi deleted file mode 100644 index e7068a1854..0000000000 Binary files a/icons/mob/hands.dmi and /dev/null differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi deleted file mode 100644 index c499c236e3..0000000000 Binary files a/icons/mob/head.dmi and /dev/null differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index d0bd304808..a4e2a9d5b2 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 3ecfc7bb0c..989ec8049c 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/icemoon/64x64megafauna.dmi b/icons/mob/icemoon/64x64megafauna.dmi new file mode 100644 index 0000000000..5a622dc7bc Binary files /dev/null and b/icons/mob/icemoon/64x64megafauna.dmi differ diff --git a/icons/mob/icemoon/icemoon_monsters.dmi b/icons/mob/icemoon/icemoon_monsters.dmi new file mode 100644 index 0000000000..4f0b5df64a Binary files /dev/null and b/icons/mob/icemoon/icemoon_monsters.dmi differ diff --git a/icons/mob/inhands/equipment/mining_lefthand.dmi b/icons/mob/inhands/equipment/mining_lefthand.dmi index e902690c37..7496aba625 100644 Binary files a/icons/mob/inhands/equipment/mining_lefthand.dmi and b/icons/mob/inhands/equipment/mining_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/mining_righthand.dmi b/icons/mob/inhands/equipment/mining_righthand.dmi index dacf9be078..de3d11978a 100644 Binary files a/icons/mob/inhands/equipment/mining_righthand.dmi and b/icons/mob/inhands/equipment/mining_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi index 01f8e2ca27..47447f80d0 100644 Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi index d2126fe22f..79aab1c5cd 100644 Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index 3f29410f98..850bbaa043 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index 2c3f291e43..d4db35b9b2 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 4ca4a351c6..19738ed490 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 8546a78a73..9589e338e1 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 528fd42d23..aa6d38ad07 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 5bf347fabf..01f77ca8c9 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/large-worn-icons/64x64/head.dmi b/icons/mob/large-worn-icons/64x64/head.dmi index 6ea91d2c6d..5cc09ad880 100644 Binary files a/icons/mob/large-worn-icons/64x64/head.dmi and b/icons/mob/large-worn-icons/64x64/head.dmi differ diff --git a/icons/mob/mask_muzzled.dmi b/icons/mob/mask_muzzled.dmi deleted file mode 100644 index ed74796c03..0000000000 Binary files a/icons/mob/mask_muzzled.dmi and /dev/null differ diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 2f7f9b5be9..1334ce9e0e 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi deleted file mode 100644 index de59a136d9..0000000000 Binary files a/icons/mob/neck.dmi and /dev/null differ diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi index 862e1be384..06521f1a84 100644 Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 082bfb3c3e..9bb41bf527 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index a65ac3f926..60fe2f9839 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index ea946f60d9..60c413c372 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/screen_ghost.dmi b/icons/mob/screen_ghost.dmi index 6519d00aa9..5c49bedcad 100644 Binary files a/icons/mob/screen_ghost.dmi and b/icons/mob/screen_ghost.dmi differ diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi deleted file mode 100644 index 67ad9f7e1a..0000000000 Binary files a/icons/mob/suit_digi.dmi and /dev/null differ diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 05fe6f5623..0a56321037 100644 Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ diff --git a/icons/mob/taur_hooved.dmi b/icons/mob/taur_hooved.dmi deleted file mode 100644 index 71aec5444a..0000000000 Binary files a/icons/mob/taur_hooved.dmi and /dev/null differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi deleted file mode 100644 index 1845e75d26..0000000000 Binary files a/icons/mob/uniform.dmi and /dev/null differ diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi deleted file mode 100644 index 80e8f80b94..0000000000 Binary files a/icons/mob/uniform_digi.dmi and /dev/null differ diff --git a/icons/obj/advancedtools.dmi b/icons/obj/advancedtools.dmi index 974202dd58..19240a60eb 100644 Binary files a/icons/obj/advancedtools.dmi and b/icons/obj/advancedtools.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index a26b01883e..bebb625440 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi index ea24341f5e..14970b76ef 100644 Binary files a/icons/obj/artstuff.dmi and b/icons/obj/artstuff.dmi differ diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index fa0c138d21..2283b84c43 100644 Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi index 82b4c2e543..2355a81f8f 100644 Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ diff --git a/icons/obj/bodybag.dmi b/icons/obj/bodybag.dmi index 7fcc193ad6..c3267d3fc9 100644 Binary files a/icons/obj/bodybag.dmi and b/icons/obj/bodybag.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 1169888b34..95ae326f1e 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index a3b0d19df4..13a0725b05 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 76094938e8..aea15e2e39 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/chess.dmi b/icons/obj/chess.dmi index 191eed8843..09d9c766fd 100644 Binary files a/icons/obj/chess.dmi and b/icons/obj/chess.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index d3f055d1f2..b71b021d80 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index dd1ae7d727..6f4de62cc0 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index e937842275..535ae0d241 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 07d9c8cee6..93e499f595 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 13f678f53a..106195e968 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0bdaa36e62..c4c9c94f48 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index bd8d52a1e6..f23cdaee46 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 530cd61e6f..68210dc01f 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index edcd2ff9b6..57424c7b99 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 29308832cf..a1d5bc5900 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index ecb66d0119..a1bc443efb 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 3d382d25b3..c280ee786f 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index c58fb5d940..193d4bc4da 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/puzzledoor/default.dmi b/icons/obj/doors/puzzledoor/default.dmi new file mode 100644 index 0000000000..ec4fbed514 Binary files /dev/null and b/icons/obj/doors/puzzledoor/default.dmi differ diff --git a/icons/obj/doors/puzzledoor/wood.dmi b/icons/obj/doors/puzzledoor/wood.dmi new file mode 100644 index 0000000000..f2b53e8573 Binary files /dev/null and b/icons/obj/doors/puzzledoor/wood.dmi differ diff --git a/icons/obj/doors/shutters.dmi b/icons/obj/doors/shutters.dmi index 6f10860cfa..816d1f94f9 100644 Binary files a/icons/obj/doors/shutters.dmi and b/icons/obj/doors/shutters.dmi differ diff --git a/icons/obj/doors/shutters_radiation.dmi b/icons/obj/doors/shutters_radiation.dmi index 36d232b197..657b613b0c 100644 Binary files a/icons/obj/doors/shutters_radiation.dmi and b/icons/obj/doors/shutters_radiation.dmi differ diff --git a/icons/obj/doors/shutters_window.dmi b/icons/obj/doors/shutters_window.dmi index 20197593c1..c99790c6cf 100644 Binary files a/icons/obj/doors/shutters_window.dmi and b/icons/obj/doors/shutters_window.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 6ba11b1ca3..27caef76b2 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index 9cc6498454..a73f50ef7f 100644 Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index b1d78fa078..414930ac25 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/donut.dmi b/icons/obj/food/donut.dmi index 395739eccc..534e0e37bc 100644 Binary files a/icons/obj/food/donut.dmi and b/icons/obj/food/donut.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 37173beadb..e7196190cf 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index fd47e89aa8..378927e8f9 100644 Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/icons/obj/genitals/breasts.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/breasts.dmi rename to icons/obj/genitals/breasts.dmi diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/icons/obj/genitals/breasts_onmob.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/breasts_onmob.dmi rename to icons/obj/genitals/breasts_onmob.dmi diff --git a/modular_citadel/icons/obj/genitals/dildo.dmi b/icons/obj/genitals/dildo.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/dildo.dmi rename to icons/obj/genitals/dildo.dmi diff --git a/modular_citadel/icons/obj/genitals/effects.dmi b/icons/obj/genitals/effects.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/effects.dmi rename to icons/obj/genitals/effects.dmi diff --git a/modular_citadel/icons/obj/genitals/hud.dmi b/icons/obj/genitals/hud.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/hud.dmi rename to icons/obj/genitals/hud.dmi diff --git a/modular_citadel/icons/obj/genitals/onahole.dmi b/icons/obj/genitals/onahole.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/onahole.dmi rename to icons/obj/genitals/onahole.dmi diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/icons/obj/genitals/penis.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/penis.dmi rename to icons/obj/genitals/penis.dmi diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/icons/obj/genitals/penis_onmob.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/penis_onmob.dmi rename to icons/obj/genitals/penis_onmob.dmi diff --git a/icons/obj/genitals/taur_penis_onmob.dmi b/icons/obj/genitals/taur_penis_onmob.dmi new file mode 100644 index 0000000000..9dbed5e9f0 Binary files /dev/null and b/icons/obj/genitals/taur_penis_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/testicles.dmi b/icons/obj/genitals/testicles.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/testicles.dmi rename to icons/obj/genitals/testicles.dmi diff --git a/modular_citadel/icons/obj/genitals/testicles_onmob.dmi b/icons/obj/genitals/testicles_onmob.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/testicles_onmob.dmi rename to icons/obj/genitals/testicles_onmob.dmi diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/icons/obj/genitals/vagina.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/vagina.dmi rename to icons/obj/genitals/vagina.dmi diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/icons/obj/genitals/vagina_onmob.dmi similarity index 100% rename from modular_citadel/icons/obj/genitals/vagina_onmob.dmi rename to icons/obj/genitals/vagina_onmob.dmi diff --git a/icons/obj/glass_ware.dmi b/icons/obj/glass_ware.dmi new file mode 100644 index 0000000000..7b720836cc Binary files /dev/null and b/icons/obj/glass_ware.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index ba8111bb00..33872719fe 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/guns/gun_parts.dmi b/icons/obj/guns/gun_parts.dmi new file mode 100644 index 0000000000..7f088f6af5 Binary files /dev/null and b/icons/obj/guns/gun_parts.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 79045ac92b..8c50e7da27 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 712ea11a3b..c93865ca77 100644 Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi index 63cf069186..b426b8f6de 100644 Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index e746d8f43d..fd9d310c73 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 43e231cbab..15b7e2b96c 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/ice_moon/artifacts.dmi b/icons/obj/ice_moon/artifacts.dmi new file mode 100644 index 0000000000..93ea79e636 Binary files /dev/null and b/icons/obj/ice_moon/artifacts.dmi differ diff --git a/icons/obj/improvised.dmi b/icons/obj/improvised.dmi index b90e3cb3bb..5c2c2a1f1b 100644 Binary files a/icons/obj/improvised.dmi and b/icons/obj/improvised.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index acf6bb4021..c5b2b3fc42 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi index a4bd75f7e5..769d5492c6 100644 Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index e7d134c85f..a157d333b0 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 7ae1ed5a0e..5ac8283b8f 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index be12ab5f8b..727d69b1e3 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/loot_piles.dmi b/icons/obj/loot_piles.dmi new file mode 100644 index 0000000000..3d83d6612e Binary files /dev/null and b/icons/obj/loot_piles.dmi differ diff --git a/icons/obj/machines/bepis.dmi b/icons/obj/machines/bepis.dmi new file mode 100644 index 0000000000..f348c2e1b0 Binary files /dev/null and b/icons/obj/machines/bepis.dmi differ diff --git a/icons/obj/machines/implantchair.dmi b/icons/obj/machines/implantchair.dmi index e91f614fad..7cc3493885 100644 Binary files a/icons/obj/machines/implantchair.dmi and b/icons/obj/machines/implantchair.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index b756c77e20..7d64c494fd 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/mauna_mug.dmi b/icons/obj/mauna_mug.dmi new file mode 100644 index 0000000000..fd576072fd Binary files /dev/null and b/icons/obj/mauna_mug.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index f2e98aff32..43bc9c48aa 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index ace24db5ff..3bf0c55576 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/money_machine.dmi b/icons/obj/money_machine.dmi new file mode 100644 index 0000000000..3e7fde761f Binary files /dev/null and b/icons/obj/money_machine.dmi differ diff --git a/icons/obj/money_machine_64.dmi b/icons/obj/money_machine_64.dmi new file mode 100644 index 0000000000..7bad748f2e Binary files /dev/null and b/icons/obj/money_machine_64.dmi differ diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi index 5e91660e87..580d78900d 100644 Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 87db0caa67..b93f878c9e 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/puzzle_small.dmi b/icons/obj/puzzle_small.dmi new file mode 100644 index 0000000000..2cf23676ee Binary files /dev/null and b/icons/obj/puzzle_small.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 9d0e60582f..05337721c7 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/shields.dmi b/icons/obj/shields.dmi new file mode 100644 index 0000000000..c8b1110e1a Binary files /dev/null and b/icons/obj/shields.dmi differ diff --git a/icons/obj/smooth_structures/rollingtable.dmi b/icons/obj/smooth_structures/rollingtable.dmi new file mode 100644 index 0000000000..9e559a75d9 Binary files /dev/null and b/icons/obj/smooth_structures/rollingtable.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 5b0c05d43d..ac6478928d 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/statuelarge.dmi b/icons/obj/statuelarge.dmi index e45afb8db8..e627a883cb 100644 Binary files a/icons/obj/statuelarge.dmi and b/icons/obj/statuelarge.dmi differ diff --git a/icons/obj/tapes.dmi b/icons/obj/tapes.dmi new file mode 100644 index 0000000000..a406a4dd1f Binary files /dev/null and b/icons/obj/tapes.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 2de24e2499..09568ebea1 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 6a2bb343df..f1a8cf3c02 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 698c1f7a34..e8106905b7 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 67079de3e2..d12851f572 100644 Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi index 035c01de6b..978a13803c 100644 Binary files a/icons/obj/vending_restock.dmi and b/icons/obj/vending_restock.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 5670b9e839..4a299f29dd 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 87d5e88cc9..477120870b 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/floors/icechasms.dmi b/icons/turf/floors/icechasms.dmi new file mode 100644 index 0000000000..97dfc0a2da Binary files /dev/null and b/icons/turf/floors/icechasms.dmi differ diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index 6561438228..41450f7b0c 100644 Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi index a09cb7a847..985b9991a0 100644 Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi index 20314cff5b..ba2bbce955 100644 Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ diff --git a/icons/turf/snow.dmi b/icons/turf/snow.dmi index d71431f99a..e601f771d3 100644 Binary files a/icons/turf/snow.dmi and b/icons/turf/snow.dmi differ diff --git a/icons/turf/vgstation_decals.dmi b/icons/turf/vgstation_decals.dmi new file mode 100644 index 0000000000..4f9d52c0cd Binary files /dev/null and b/icons/turf/vgstation_decals.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index dd6c7f3a7c..250fdcd894 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 5f8e1ad125..8d68336754 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,5 +1,6 @@ macro "default" + menu "menu" elem name = "&File" @@ -53,6 +54,7 @@ window "mainwindow" size = 640x440 anchor1 = none anchor2 = none + background-color = #242424 is-default = true saved-params = "pos;size;is-minimized;is-maximized" icon = 'icons\\ss13_64.png' @@ -60,60 +62,23 @@ window "mainwindow" menu = "menu" elem "split" type = CHILD - pos = 3,0 - size = 634x417 + pos = 0,0 + size = 637x440 anchor1 = 0,0 anchor2 = 100,100 + background-color = #272727 saved-params = "splitter" left = "mapwindow" right = "infowindow" is-vert = true - elem "input" - type = INPUT - pos = 3,420 - size = 517x20 - anchor1 = 0,100 - anchor2 = 100,100 - background-color = #d3b5b5 - is-default = true - border = sunken - saved-params = "command" - elem "saybutton" - type = BUTTON - pos = 600,420 - size = 40x20 - anchor1 = 100,100 - anchor2 = none - saved-params = "is-checked" - text = "Chat" - command = ".winset \"saybutton.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"\"saybutton.is-checked=true ? mebutton.is-checked=false\"\"saybutton.is-checked=true ? oocbutton.is-checked=false\"" - button-type = pushbox - elem "oocbutton" - type = BUTTON - pos = 520,420 - size = 40x20 - anchor1 = 100,100 - anchor2 = none - saved-params = "is-checked" - text = "OOC" - command = ".winset \"oocbutton.is-checked=true ? input.command=\"!ooc \\\"\" : input.command=\"\"oocbutton.is-checked=true ? mebutton.is-checked=false\"\"oocbutton.is-checked=true ? saybutton.is-checked=false\"" - button-type = pushbox - elem "mebutton" - type = BUTTON - pos = 560,420 - size = 40x20 - anchor1 = 100,100 - anchor2 = none - saved-params = "is-checked" - text = "Me" - command = ".winset \"mebutton.is-checked=true ? input.command=\"!me \\\"\" : input.command=\"\"mebutton.is-checked=true ? saybutton.is-checked=false\"\"mebutton.is-checked=true ? oocbutton.is-checked=false\"" - button-type = pushbox + splitter = 75 elem "asset_cache_browser" type = BROWSER pos = 0,0 size = 200x200 anchor1 = none anchor2 = none + background-color = #272727 is-visible = false saved-params = "" elem "tooltip" @@ -122,30 +87,35 @@ window "mainwindow" size = 999x999 anchor1 = none anchor2 = none + background-color = #272727 is-visible = false saved-params = "" window "mapwindow" elem "mapwindow" type = MAIN - pos = 0,0 - size = 640x480 + pos = 418,0 + size = 1024x1024 anchor1 = none anchor2 = none + background-color = none saved-params = "pos;size;is-minimized;is-maximized" + statusbar = false is-pane = true + outer-size = 684x617 + inner-size = 662x561 elem "map" type = MAP pos = 0,0 - size = 640x480 + size = 1024x1024 anchor1 = 0,0 anchor2 = 100,100 font-family = "Arial" font-size = 7 - text-color = none is-default = true saved-params = "icon-size" zoom-mode = distort + style = ".center { text-align: center; }\n.maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; }\n.command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; }\n.big { font-size: 8px; }\n.reallybig { font-size: 8px; }\n.extremelybig { font-size: 8px; }\n.greentext { color: #00ff00; font-size: 7px; }\n.redtext { color: #ff0000; font-size: 7px; }\n.clown { color: #ff69bf; font-size: 7px; font-weight: bold; }\n.his_grace { color: #15d512; }\n.hypnophrase { color: #0d0d0d; font-weight: bold; }\n.yell { font-weight: bold; }\n.italics { font-size: 6px; }" window "infowindow" elem "infowindow" @@ -154,6 +124,7 @@ window "infowindow" size = 640x480 anchor1 = none anchor2 = none + background-color = #242424 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "info" @@ -162,6 +133,7 @@ window "infowindow" size = 640x445 anchor1 = 0,0 anchor2 = 100,100 + background-color = #272727 saved-params = "splitter" left = "statwindow" right = "outputwindow" @@ -172,6 +144,8 @@ window "infowindow" size = 104x20 anchor1 = 3,0 anchor2 = 19,0 + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Changelog" command = "changelog" @@ -181,6 +155,8 @@ window "infowindow" size = 100x20 anchor1 = 19,0 anchor2 = 34,0 + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Rules" command = "rules" @@ -190,6 +166,8 @@ window "infowindow" size = 100x20 anchor1 = 34,0 anchor2 = 50,0 + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Wiki" command = "wiki" @@ -199,6 +177,8 @@ window "infowindow" size = 100x20 anchor1 = 50,0 anchor2 = 66,0 + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" text = "Forum" command = "forum" @@ -208,8 +188,10 @@ window "infowindow" size = 100x20 anchor1 = 66,0 anchor2 = 81,0 + text-color = #e0e0e0 + background-color = #40628a saved-params = "is-checked" - text = "Github" + text = "GitHub" command = "github" elem "report-issue" type = BUTTON @@ -217,6 +199,9 @@ window "infowindow" size = 100x20 anchor1 = 81,0 anchor2 = 97,0 + font-size = 8 + text-color = #e0e0e0 + background-color = #a92c2c saved-params = "is-checked" text = "Report Issue" command = "report-issue" @@ -228,15 +213,44 @@ window "outputwindow" size = 640x480 anchor1 = none anchor2 = none + background-color = #272727 saved-params = "pos;size;is-minimized;is-maximized" + titlebar = false + statusbar = false + can-close = false + can-minimize = false + can-resize = false is-pane = true + elem "input" + type = INPUT + pos = 2,460 + size = 595x20 + anchor1 = 0,100 + anchor2 = 100,100 + background-color = #d3b5b5 + is-default = true + border = sunken + saved-params = "command" + elem "say" + type = BUTTON + pos = 600,460 + size = 37x20 + anchor1 = 100,100 + anchor2 = none + text-color = #e0e0e0 + background-color = #272727 + saved-params = "is-checked" + text = "Chat" + command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" + is-flat = true + button-type = pushbox elem "browseroutput" type = BROWSER pos = 0,0 - size = 640x480 + size = 640x456 anchor1 = 0,0 anchor2 = 100,100 - background-color = #ffffff + background-color = #272727 is-visible = false is-disabled = true saved-params = "" @@ -244,19 +258,22 @@ window "outputwindow" elem "output" type = OUTPUT pos = 0,0 - size = 640x480 + size = 640x456 anchor1 = 0,0 anchor2 = 100,100 + text-color = #e0e0e0 + background-color = #272727 is-default = true saved-params = "" window "statwindow" elem "statwindow" type = MAIN - pos = 0,0 + pos = 281,0 size = 640x480 anchor1 = none anchor2 = none + background-color = #242424 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "stat" @@ -265,17 +282,22 @@ window "statwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 + text-color = #e0e0e0 + background-color = #272727 is-default = true saved-params = "" + tab-text-color = #e0e0e0 + tab-background-color = #242424 + prefix-color = #e0e0e0 + suffix-color = #e0e0e0 - window "preferences_window" +window "preferences_window" elem "preferences_window" type = MAIN pos = 372,0 size = 1280x1000 anchor1 = none anchor2 = none - background-color = none is-visible = false saved-params = "pos;size;is-minimized;is-maximized" statusbar = false @@ -285,7 +307,6 @@ window "statwindow" size = 960x1000 anchor1 = 0,0 anchor2 = 75,100 - background-color = none saved-params = "" elem "character_preview_map" type = MAP @@ -295,3 +316,4 @@ window "statwindow" anchor2 = 100,100 right-click = true saved-params = "zoom;letterbox;zoom-mode" + diff --git a/modular_citadel/README.md b/modular_citadel/README.md index dfae177607..c5443bdbb5 100644 --- a/modular_citadel/README.md +++ b/modular_citadel/README.md @@ -1,3 +1,4 @@ Hooray modularity! + Things that modify core files without directly touching said core files go here. This is similar to how Hippie handles things. This stops dreammaker from throwing errors and warnings if you try to compile these files while they're inside code/citadel/. diff --git a/modular_citadel/code/__HELPERS/list2list.dm b/modular_citadel/code/__HELPERS/list2list.dm deleted file mode 100644 index e812b3a1e9..0000000000 --- a/modular_citadel/code/__HELPERS/list2list.dm +++ /dev/null @@ -1,12 +0,0 @@ -/proc/tg_ui_icon_to_cit_ui(ui_style) - switch(ui_style) - if('icons/mob/screen_plasmafire.dmi') - return 'modular_citadel/icons/ui/screen_plasmafire.dmi' - if('icons/mob/screen_slimecore.dmi') - return 'modular_citadel/icons/ui/screen_slimecore.dmi' - if('icons/mob/screen_operative.dmi') - return 'modular_citadel/icons/ui/screen_operative.dmi' - if('icons/mob/screen_clockwork.dmi') - return 'modular_citadel/icons/ui/screen_clockwork.dmi' - else - return 'modular_citadel/icons/ui/screen_midnight.dmi' diff --git a/modular_citadel/code/__HELPERS/lists.dm b/modular_citadel/code/__HELPERS/lists.dm deleted file mode 100644 index b249dfc554..0000000000 --- a/modular_citadel/code/__HELPERS/lists.dm +++ /dev/null @@ -1,9 +0,0 @@ -/proc/is_type_in_ref_list(path, list/L) - if(!ispath(path))//not a path - return - for(var/i in L) - var/datum/D = i - if(!istype(D))//not an usable reference - continue - if(istype(D, path)) - return TRUE \ No newline at end of file diff --git a/modular_citadel/code/__HELPERS/mobs.dm b/modular_citadel/code/__HELPERS/mobs.dm deleted file mode 100644 index 2666696564..0000000000 --- a/modular_citadel/code/__HELPERS/mobs.dm +++ /dev/null @@ -1,28 +0,0 @@ -/proc/slot_to_string(slot) - switch(slot) - if(SLOT_BACK) - return "Backpack" - if(SLOT_WEAR_MASK) - return "Mask" - if(SLOT_HANDS) - return "Hands" - if(SLOT_BELT) - return "Belt" - if(SLOT_EARS) - return "Ears" - if(SLOT_GLASSES) - return "Glasses" - if(SLOT_GLOVES) - return "Gloves" - if(SLOT_NECK) - return "Neck" - if(SLOT_HEAD) - return "Head" - if(SLOT_SHOES) - return "Shoes" - if(SLOT_WEAR_SUIT) - return "Suit" - if(SLOT_W_UNIFORM) - return "Uniform" - if(SLOT_IN_BACKPACK) - return "In backpack" diff --git a/modular_citadel/code/_onclick/click.dm b/modular_citadel/code/_onclick/click.dm index f077b3a71b..004cc2fe80 100644 --- a/modular_citadel/code/_onclick/click.dm +++ b/modular_citadel/code/_onclick/click.dm @@ -72,30 +72,3 @@ /mob/proc/AltRangedAttack(atom/A, params) return FALSE - -/mob/proc/mouse_face_atom(atom/A) //Basically a copy of face_atom but with ismousemovement set to TRUE - if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) - return - var/dx = A.x - x - var/dy = A.y - y - if(!dx && !dy) // Wall items are graphically shifted but on the floor - if(A.pixel_y > 16) - setDir(NORTH, ismousemovement = TRUE) - else if(A.pixel_y < -16) - setDir(SOUTH, ismousemovement = TRUE) - else if(A.pixel_x > 16) - setDir(EAST, ismousemovement = TRUE) - else if(A.pixel_x < -16) - setDir(WEST, ismousemovement = TRUE) - return - - if(abs(dx) < abs(dy)) - if(dy > 0) - setDir(NORTH, ismousemovement = TRUE) - else - setDir(SOUTH, ismousemovement = TRUE) - else - if(dx > 0) - setDir(EAST, ismousemovement = TRUE) - else - setDir(WEST, ismousemovement = TRUE) diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index 2101a6045f..017f7f3485 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -1,63 +1,22 @@ -/obj/screen/restbutton - name = "rest" - icon = 'modular_citadel/icons/ui/screen_midnight.dmi' - icon_state = "rest" - -/obj/screen/restbutton/Click() - if(isliving(usr)) - var/mob/living/theuser = usr - theuser.lay_down() - -/obj/screen/combattoggle - name = "toggle combat mode" - icon = 'modular_citadel/icons/ui/screen_midnight.dmi' - icon_state = "combat_off" - var/mutable_appearance/flashy - -/obj/screen/combattoggle/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.user_toggle_intentional_combat_mode() - -/obj/screen/combattoggle/update_icon_state() - var/mob/living/carbon/user = hud?.mymob - if(!istype(user)) - return - if((user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - icon_state = "combat" - else if(HAS_TRAIT(user, TRAIT_COMBAT_MODE_LOCKED)) - icon_state = "combat_locked" - else - icon_state = "combat_off" - -/obj/screen/combattoggle/update_overlays() - . = ..() - var/mob/living/carbon/user = hud?.mymob - if(!istype(user) || !user.client) - return - - if((user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && user.client.prefs.hud_toggle_flash) - if(!flashy) - flashy = mutable_appearance('icons/mob/screen_gen.dmi', "togglefull_flash") - if(flashy.color != user.client.prefs.hud_toggle_color) - flashy.color = user.client.prefs.hud_toggle_color - . += flashy //TODO - beg lummox jr for the ability to force mutable appearances or images to be created rendering from their first frame of animation rather than being based entirely around the client's frame count - /obj/screen/voretoggle name = "toggle vore mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "nom_off" /obj/screen/voretoggle/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_vore_mode() + if(usr != hud.mymob) + return + var/mob/living/carbon/C = usr + if(SEND_SIGNAL(usr, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + to_chat(usr, "Disable combat mode first.") + return + C.toggle_vore_mode() /obj/screen/voretoggle/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!istype(user)) return - if(user.voremode && !(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) + if(user.voremode) icon_state = "nom" else icon_state = "nom_off" diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm index 89547c0feb..326bb81745 100644 --- a/modular_citadel/code/_onclick/hud/sprint.dm +++ b/modular_citadel/code/_onclick/hud/sprint.dm @@ -54,5 +54,5 @@ /obj/screen/sprint_buffer/proc/update_to_mob(mob/living/L) var/amount = 0 if(L.sprint_buffer_max > 0) - amount = round(CLAMP((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5) + amount = round(clamp((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5) icon_state = "prog_bar_[amount]" diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm index a7b9a79ecd..5484014f8f 100644 --- a/modular_citadel/code/_onclick/hud/stamina.dm +++ b/modular_citadel/code/_onclick/hud/stamina.dm @@ -22,7 +22,7 @@ else if(user.hal_screwyhud == 5) icon_state = "stamina0" else - icon_state = "stamina[CLAMP(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" + icon_state = "stamina[clamp(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" //stam buffer /obj/screen/staminabuffer diff --git a/modular_citadel/code/_onclick/other_mobs.dm b/modular_citadel/code/_onclick/other_mobs.dm index 6d9ffdd6ca..ec740f023b 100644 --- a/modular_citadel/code/_onclick/other_mobs.dm +++ b/modular_citadel/code/_onclick/other_mobs.dm @@ -12,7 +12,7 @@ if(isturf(A) || incapacitated()) // pretty annoying to wave your fist at floors and walls. And useless. return TRUE changeNext_move(CLICK_CD_RANGE) - var/list/target_viewers = viewers(11, A) //Byond proc, doesn't check for blindness. + var/list/target_viewers = fov_viewers(11, A) //doesn't check for blindness. if(!(src in target_viewers)) //click catcher issuing calls for out of view objects. return TRUE if(!has_active_hand()) @@ -26,16 +26,16 @@ switch(a_intent) if(INTENT_DISARM) the_action = "shoos away [A]" - what_action = "shoo away something you can't see" + what_action = "shoo away something out of your vision" self_action = "shoo away [A]" if(INTENT_GRAB) the_action = "beckons [A] to come" - what_action = "beckons something you can't see to come" + what_action = "beckons something out of your vision to come" self_action = "beckon [A] to come" if(INTENT_HARM) var/pronoun = "[p_their()]" the_action = "shakes [pronoun] fist at [A]" - what_action = "shakes [pronoun] fist at something you can't see" + what_action = "shakes [pronoun] fist at something out of your vision" self_action = "shake your fist at [A]" if(!eye_blind) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 369fb377a5..57cbdb6beb 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -10,7 +10,7 @@ alert_type = null /datum/status_effect/chem/SGDF/on_apply() - log_game("FERMICHEM: SGDF status appied on [owner], ID: [owner.key]") + log_reagent("FERMICHEM: SGDF status appied on [owner], ID: [owner.key]") fermi_Clone = owner return ..() @@ -24,7 +24,7 @@ ..() /datum/status_effect/chem/SGDF/on_remove() - log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]") + log_reagent("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]") originalmind.transfer_to(fermi_Clone) to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. Curiously, you find that you memories are blank after you ingested the synthetic serum, leaving you to wonder where the other you is.") fermi_Clone = null @@ -40,7 +40,7 @@ var/last_checked_size //used to prevent potential cpu waste from happening every tick. /datum/status_effect/chem/breast_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_game("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]") + log_reagent("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]") var/mob/living/carbon/human/H = owner var/message = FALSE if(H.w_uniform) @@ -76,7 +76,7 @@ to_chat(H, "Your enormous breasts are way too large to fit anything over them!
    ") if(last_checked_size != B.cached_size) - H.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc) sizeMoveMod(moveCalc) if (B.size == "huge") @@ -91,9 +91,9 @@ ..() /datum/status_effect/chem/breast_enlarger/on_remove() - log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]") + log_reagent("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]") to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.
    ") - owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy) sizeMoveMod(1) return ..() @@ -114,7 +114,7 @@ var/last_checked_size //used to prevent potential cpu waste, just like the above. /datum/status_effect/chem/penis_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_game("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]") + log_reagent("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]") var/mob/living/carbon/human/H = owner var/message = FALSE if(H.w_uniform) @@ -152,18 +152,18 @@ playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1) to_chat(H, "Your enormous package is way to large to fit anything over!") - if(P.length < 22 && H.has_movespeed_modifier(DICK_MOVEMENT_SPEED)) + if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.") - H.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) - else if(P.length >= 22 && !H.has_movespeed_modifier(DICK_MOVEMENT_SPEED)) + H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) + else if(P.length >= 22 && !H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) to_chat(H, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") - H.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc) + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy, multiplicative_slowdown = moveCalc) H.AdjustBloodVol(bloodCalc) ..() /datum/status_effect/chem/penis_enlarger/on_remove() - log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") - owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED) + log_reagent("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) owner.ResetBloodVol() return ..() @@ -189,7 +189,7 @@ var/mob/living/simple_animal/astral/G = new(get_turf(M.loc)) owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") - log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!") + log_reagent("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!") originalmind.transfer_to(original) /datum/status_effect/chem/astral_insurance/on_remove() //God damnit get them home! @@ -198,7 +198,7 @@ var/mob/living/simple_animal/astral/G = new(get_turf(owner)) owner.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. to_chat(G, "[owner]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") - log_game("FERMICHEM: [owner]'s possesser has been booted out into a astral ghost!") + log_reagent("FERMICHEM: [owner]'s possesser has been booted out into a astral ghost!") originalmind.transfer_to(original) return ..() @@ -272,7 +272,7 @@ var/message = "[(lewd ? "I am a good pet for [enthrallGender]." : "[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") - log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") + log_reagent("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts") return ..() @@ -280,7 +280,7 @@ var/mob/living/carbon/M = owner //chem calculations - if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall) && !owner.reagents.has_reagent(/datum/reagent/fermi/enthrall/test)) + if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall)) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly if(prob(5)) @@ -303,7 +303,7 @@ switch(phase) if(-1)//fully removed SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall") - log_game("FERMICHEM: MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") + log_reagent("FERMICHEM: MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") owner.remove_status_effect(src) return if(0)// sleeper agent @@ -344,7 +344,7 @@ else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ") to_chat(master, "Your [(lewd?"pet":"follower")] [owner] appears to have fully fallen under your sway.") - log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") + log_reagent("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") else if (resistanceTally > 200) enthrallTally *= 0.5 @@ -532,7 +532,7 @@ cooldown += 1 //Cooldown doesn't process till status is done else if(status == "charge") - owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra) status = "charged" if(lewd) to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") @@ -542,7 +542,7 @@ else if (status == "charged") if (statusStrength < 0) status = null - owner.remove_movespeed_modifier(MOVESPEED_ID_MKULTRA) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mkultra) owner.DefaultCombatKnockdown(50) to_chat(owner, "Your body gives out as the adrenaline in your system runs out.") else @@ -616,14 +616,14 @@ var/cached_trigger = lowertext(trigger) if (findtext(raw_message, cached_trigger))//if trigger1 is the message cTriggered = 5 //Stops triggerparties and as a result, stops servercrashes. - log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [hearing_args[HEARING_SPEAKER]] saying: \"[hearing_args[HEARING_MESSAGE]]\". (their master being [master] ckey: [enthrallID].)") + log_reagent("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [hearing_args[HEARING_SPEAKER]] saying: \"[hearing_args[HEARING_MESSAGE]]\". (their master being [master] ckey: [enthrallID].)") //Speak (Forces player to talk) if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2 var/saytext = "Your mouth moves on it's own before you can even catch it." addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[saytext]"), 5) addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5) - log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") + log_reagent("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.") //Echo (repeats message!) allows customisation, but won't display var calls! Defaults to hypnophrase. @@ -671,7 +671,7 @@ var/mob/living/carbon/human/o = owner o.apply_status_effect(/datum/status_effect/trance, 200, TRUE) tranceTime = 50 - log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.") + log_reagent("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.") return diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm deleted file mode 100644 index 7758c0d613..0000000000 --- a/modular_citadel/code/game/machinery/wishgranter.dm +++ /dev/null @@ -1,123 +0,0 @@ -/obj/machinery/wish_granter/attack_hand(mob/living/carbon/user) - if(charges <= 0) - to_chat(user, "The Wish Granter lies silent.") - return - - else if(!ishuman(user)) - to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return - - else if (!insisting) - to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") - insisting++ - - else - if(is_special_character(user)) - to_chat(user, "You speak. [pick("I want power","Humanity is corrupt, mankind must be destroyed", "I want to rule the world","I want immortality")]. The Wish Granter answers.") - to_chat(user, "Your head pounds for a moment, before your vision clears. The Wish Granter, sensing the darkness in your heart, has given you limitless power, and it's all yours!") - user.dna.add_mutation(HULK) - user.dna.add_mutation(XRAY) - user.dna.add_mutation(SPACEMUT) - user.dna.add_mutation(TK) - user.next_move_modifier *= 0.5 //half the delay between attacks! - to_chat(user, "Things around you feel slower!") - charges-- - insisting = FALSE - to_chat(user, "You have a very great feeling about this!") - else - to_chat(user, "The Wish Granter awaits your wish.") - var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","The Station To Disappear","To Kill","Nothing") - switch(wish) - if("Power") //Gives infinite power in exchange for infinite power going off in your face! - if(charges <= 0) - return - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, warping itself into a delaminating supermatter shard!") - var/obj/item/stock_parts/cell/infinite/powah = new /obj/item/stock_parts/cell/infinite(get_turf(user)) - if(user.put_in_hands(powah)) - to_chat(user, "[powah] materializes into your hands!") - else - to_chat(user, "[powah] materializes onto the floor.") - var/obj/machinery/power/supermatter_crystal/powerwish = new /obj/machinery/power/supermatter_crystal(loc) - powerwish.damage = 700 //right at the emergency threshold - powerwish.produces_gas = FALSE - charges-- - insisting = FALSE - if(!charges) - qdel(src) - if("Wealth") //Gives 1 million space bucks in exchange for being turned into gold! - if(charges <= 0) - return - to_chat(user, "Your wish is granted, but at a cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, warping your body to match the greed in your heart.") - new /obj/structure/closet/crate/trashcart/moneywish(loc) - new /obj/structure/closet/crate/trashcart/moneywish(loc) - user.set_species(/datum/species/golem/gold) - charges-- - insisting = FALSE - if(!charges) - qdel(src) - if("The Station To Disappear") //teleports you to the station and makes you blind, making the station disappear for you! - if(charges <= 0) - return - to_chat(user, "Your wish is 'granted', but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your eyes to match the darkness in your heart.") - user.dna.add_mutation(BLINDMUT) - var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - eyes.applyOrganDamage(eyes.maxHealth) - var/list/destinations = list() - for(var/obj/item/beacon/B in GLOB.teleportbeacons) - var/turf/T = get_turf(B) - if(is_station_level(T.z)) - destinations += B - var/chosen_beacon = pick(destinations) - var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon)) - try_move_adjacent(J) - playsound(src,'sound/effects/sparks4.ogg',50,1) - charges-- - insisting = FALSE - if(!charges) - qdel(src) - if("To Kill") //Makes you kill things in exchange for rewards! - if(charges <= 0) - return - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your wickedness, warping itself into a dastardly creature for you to kill! ...but it almost seems to reward you for this.") - var/obj/item/melee/transforming/energy/sword/cx/killreward = new /obj/item/melee/transforming/energy/sword/cx(get_turf(user)) - if(user.put_in_hands(killreward)) - to_chat(user, "[killreward] materializes into your hands!") - else - to_chat(user, "[killreward] materializes onto the floor.") - user.next_move_modifier *= 0.8 //20% less delay between attacks! - to_chat(user, "Things around you feel slightly slower!") - var/mob/living/simple_animal/hostile/venus_human_trap/killwish = new /mob/living/simple_animal/hostile/venus_human_trap(loc) - killwish.maxHealth = 1500 - killwish.health = killwish.maxHealth - killwish.grasp_range = 6 - killwish.melee_damage_upper = 30 - killwish.grasp_chance = 50 - killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic) - charges-- - insisting = FALSE - if(!charges) - qdel(src) - if("Nothing") //Makes the wish granter disappear - if(charges <= 0) - return - to_chat(user, "The Wish Granter vanishes from sight!") - to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") - charges-- - insisting = FALSE - qdel(src) - -//ITEMS THAT IT USES - -/obj/structure/closet/crate/trashcart/moneywish - desc = "A heavy, metal trashcart with wheels. Filled with cash." - name = "loaded trash cart" - -/obj/structure/closet/crate/trashcart/moneywish/PopulateContents() //25*20*1000=500,000 - for(var/i = 0, i < 25, i++) - var/obj/item/stack/spacecash/c1000/lodsamoney = new /obj/item/stack/spacecash/c1000(src) - lodsamoney.amount = lodsamoney.max_amount diff --git a/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm b/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm deleted file mode 100644 index 44b8067876..0000000000 --- a/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm +++ /dev/null @@ -1,83 +0,0 @@ -/obj/item/electropack/shockcollar - name = "shock collar" - desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.." - icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/neck.dmi' - icon_state = "shockcollar" - item_state = "shockcollar" - body_parts_covered = NECK - slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_DENYPOCKET //no more pocket shockers - w_class = WEIGHT_CLASS_SMALL - strip_delay = 60 - equip_delay_other = 60 - materials = list(MAT_METAL=5000, MAT_GLASS=2000) - var/tagname = null - -/datum/design/electropack/shockcollar - name = "Shockcollar" - id = "shockcollar" - build_type = AUTOLATHE - build_path = /obj/item/electropack/shockcollar - materials = list(MAT_METAL=5000, MAT_GLASS=2000) - category = list("hacked", "Misc") - -/obj/item/electropack/shockcollar/attack_hand(mob/user) - if(loc == user && user.get_item_by_slot(SLOT_NECK)) - to_chat(user, "The collar is fastened tight! You'll need help taking this off!") - return - ..() - -/obj/item/electropack/shockcollar/receive_signal(datum/signal/signal) - if(!signal || signal.data["code"] != code) - return - - if(isliving(loc) && on) - if(shock_cooldown != 0) - return - shock_cooldown = 1 - spawn(100) - shock_cooldown = 0 - var/mob/living/L = loc - step(L, pick(GLOB.cardinals)) - - to_chat(L, "You feel a sharp shock from the collar!") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, L) - s.start() - - L.DefaultCombatKnockdown(100) - - if(master) - master.receive_signal() - return - -/obj/item/electropack/shockcollar/attack_self(mob/user) //Turns out can't fully source this from the parent item, spritepath gets confused if power toggled. Will come back to this when I know how to code better and readd powertoggle.. - var/option = "Change Name" - option = input(user, "What do you want to do?", "[src]", option) as null|anything in list("Change Name", "Change Frequency") - switch(option) - if("Change Name") - var/t = input(user, "Would you like to change the name on the tag?", "Name your new pet", tagname ? tagname : "Spot") as null|text - if(t) - tagname = copytext(sanitize(t), 1, MAX_NAME_LEN) - name = "[initial(name)] - [tagname]" - if("Change Frequency") - if(!ishuman(user)) - return - user.set_machine(src) - var/dat = {"
    - Frequency/Code for shock collar:
    - Frequency: - - - - [format_frequency(frequency)] - + - +
    - Code: - - - - [code] - + - +
    -
    "} - - user << browse(dat, "window=radio") - onclose(user, "radio") - return diff --git a/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm deleted file mode 100644 index 5b20fe048b..0000000000 --- a/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/structure/chair/alt_attack_hand(mob/living/user) - if(Adjacent(user) && istype(user)) - if(!item_chair || !user.can_hold_items() || !has_buckled_mobs() || buckled_mobs.len > 1 || dir != user.dir || flags_1 & NODECONSTRUCT_1) - return TRUE - if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - to_chat(user, "You can't do that right now!") - return TRUE - if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) - to_chat(user, "You're too exhausted for that.") - return TRUE - var/mob/living/poordude = buckled_mobs[1] - if(!istype(poordude)) - return TRUE - user.visible_message("[user] pulls [src] out from under [poordude].", "You pull [src] out from under [poordude].") - var/C = new item_chair(loc) - user.put_in_hands(C) - poordude.DefaultCombatKnockdown(20)//rip in peace - user.adjustStaminaLoss(5) - unbuckle_all_mobs(TRUE) - qdel(src) - return TRUE diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm deleted file mode 100644 index ddac7b5953..0000000000 --- a/modular_citadel/code/modules/admin/chat_commands.dm +++ /dev/null @@ -1,46 +0,0 @@ -/datum/tgs_chat_command/wheelofsalt - name = "wheelofsalt" - help_text = "What are Citadel Station 13 players salting about today? Spin the wheel and find out!" - -/datum/tgs_chat_command/wheelofsalt/Run(datum/tgs_chat_user/sender, params) - var/saltresult = "The wheel of salt [pick("clatters","screams","vibrates","clanks","resonates","groans","moans","squeaks","emits a[pick(" god-forsaken"," lewd"," creepy"," generic","n orgasmic"," demonic")] [pick("airhorn","bike horn","trumpet","clown","latex","vore","dog","laughing")] noise")] as it spins violently... And it seems the salt of the day is the " - var/saltprimarysubject = "[pick("combat","medical","grab","furry","wall","orgasm","cat","ERP","lizard","dog","latex","vision cone","atmospherics","table","chem","vore","dogborg","Skylar Lineman","Mekhi Anderson","Peppermint","rework","cum","dick","cockvore","Medihound","sleeper","belly sleeper","door wires","flightsuit","coder privilege","Developer abuse","ban reason","github self merge","red panda","beret","male catgirl","powergame","hexacrocin","Discord server","Clitadel","Cargonia","Solarian Republic","Main and RP merger","bluespace","salt","chem dispenser theft","Botany","moth","BWOINK","anal vore","stamina","Mason Jakops","mining","noodle","milf","Lavaland","Necropolis","Ashwalker","Chase Redtail","Drew Mint","Pavel Marsk","Joker Amari","Durgit","chaplain","Antag","nanite","Syndicate","Nar-Sie","Ratvar","Cult","maint","Foam-Force","AI","cyborg","ghost","clockwork","cyberpunk","vaporwave","Clown","Leon Beech","Mime","security","research","Megafauna","Bubblegum","Ash Drake","Legion","Colossus","White Shuttle","Changeling","Cowboy","Space Ninja","Poly","Revolutionary","Skyrim","forbidden fruits","xenomorph","blob","Nuclear Operative","crossdressing")]" - var/saltsecondarysubject = "[pick("rework","changes","r34","ban","removal","addition","leak","proposal","fanart","introduction","tabling","ERP","bikeshedding","crossdressing","sprites","semen keg","argument","theft","nerf","screeching","salt","creampie","lewding","murder","kissing","marriage","replacement","fucking","ship","netflix adaptation","dance","remaster","system","voyeur","decoration","pre-order","bukkake","seduction","worship","gangbang","handholding")]" - if(prob(10)) - saltresult += "@here for your salt, all day every day" - if(prob(1)) - saltresult += " @everyone gets some salt this time too" - else - saltresult += "[saltprimarysubject] [saltsecondarysubject]" - return "[saltresult]!" - -/datum/tgs_chat_command/valentine - name = "valentine" - help_text = "Get a random flirt line." - -/datum/tgs_chat_command/valentine/Run(datum/tgs_chat_user/sender, params) - return "[pick(GLOB.flirts)]" - -/datum/tgs_chat_command/despacito - name = "despacito" //someone please high effort this sometime and make it a full on ytdl search - help_text = "This is so sad." - -/datum/tgs_chat_command/despacito/Run() - return "https://www.youtube.com/watch?v=kJQP7kiw5Fk" - -/datum/tgs_chat_command/poly - name = "poly" - help_text = "The Lewder, more applicable Poly speak for Citadel Station 13." - var/list/speech_buffer - -/datum/tgs_chat_command/poly/Run() - LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point - if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time. - return "[pick(speech_buffer)]" - else - var/json_file = file("data/npc_saves/Poly.json") - if(!fexists(json_file)) - return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***" - var/list/json = json_decode(file2text(json_file)) - speech_buffer = json["phrases"] - return "[pick(speech_buffer)]" diff --git a/modular_citadel/code/modules/client/client_defines.dm b/modular_citadel/code/modules/client/client_defines.dm deleted file mode 100644 index d816b15d1d..0000000000 --- a/modular_citadel/code/modules/client/client_defines.dm +++ /dev/null @@ -1,2 +0,0 @@ -/client - var/cryo_warned = -3000//when was the last time we warned them about not cryoing without an ahelp, set to -5 minutes so that rounstart cryo still warns diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm index d35bede179..51256f8cde 100644 --- a/modular_citadel/code/modules/client/loadout/_loadout.dm +++ b/modular_citadel/code/modules/client/loadout/_loadout.dm @@ -10,7 +10,6 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) /proc/load_loadout_config(loadout_config) if(!loadout_config) loadout_config = "config/loadout_config.txt" - LAZYINITLIST(GLOB.loadout_whitelist_ids) var/list/file_lines = world.file2list(loadout_config) for(var/line in file_lines) if(!line || line[1] == "#") @@ -26,12 +25,9 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) GLOB.loadout_whitelist_ids["[lineID]"] = sublinecontent /proc/initialize_global_loadout_items() - LAZYINITLIST(GLOB.loadout_items) load_loadout_config() for(var/item in subtypesof(/datum/gear)) var/datum/gear/I = new item - if(!GLOB.loadout_items[slot_to_string(I.category)]) - LAZYINITLIST(GLOB.loadout_items[slot_to_string(I.category)]) LAZYSET(GLOB.loadout_items[slot_to_string(I.category)], I.name, I) if(islist(I.geargroupID)) var/list/ggidlist = I.geargroupID diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index d51f4b6125..8d089a129a 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -69,18 +69,6 @@ path = /obj/item/toy/katana cost = 3 -/datum/gear/box - name = "Spare box" - category = SLOT_IN_BACKPACK - path = /obj/item/storage/box - cost = 2 - -/datum/gear/crowbar - name = "Pocket Crowbar" - category = SLOT_IN_BACKPACK - path = /obj/item/crowbar - cost = 2 - /datum/gear/tapeplayer name = "Taperecorder" category = SLOT_IN_BACKPACK @@ -96,11 +84,6 @@ category = SLOT_IN_BACKPACK path = /obj/item/newspaper -/datum/gear/paperbin - name = "Paper Bin" - category = SLOT_IN_BACKPACK - path = /obj/item/paper_bin - /datum/gear/crayons name = "Box of crayons" category = SLOT_IN_BACKPACK @@ -146,4 +129,4 @@ category = SLOT_IN_BACKPACK path = /obj/item/storage/fancy/ringbox/diamond cost = 5 - + diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index dd7d2cdc4b..28c6e8e8a6 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -82,7 +82,7 @@ category = SLOT_HEAD path = /obj/item/clothing/head/caphat/formal/fedcover/medsci restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekcapeng name = "Federation Officer's Cap (Yellow)" diff --git a/modular_citadel/code/modules/client/loadout/mask.dm b/modular_citadel/code/modules/client/loadout/mask.dm index 82824814ae..eeba06cad4 100644 --- a/modular_citadel/code/modules/client/loadout/mask.dm +++ b/modular_citadel/code/modules/client/loadout/mask.dm @@ -12,5 +12,5 @@ name = "Joy mask" category = SLOT_WEAR_MASK path = /obj/item/clothing/mask/joy - cost = 9 - + cost = 3 + diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index 9b39d006bd..fecf2a4dce 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -85,20 +85,18 @@ path = /obj/item/clothing/suit/hooded/wintercoat/polychromic cost = 4 //too many people with neon green coats is hard on the eyes -/* Commented out until it is "balanced" -/datum/gear/coat/sec - name = "Security winter coat" - category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/hooded/wintercoat/security - restricted_roles = list("Head of Security", "Warden", "Detective", "Security Officer") // Reserve it to the Security Departement -*/ - /datum/gear/coat/med name = "Medical winter coat" category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/hooded/wintercoat/medical restricted_roles = list("Chief Medical Officer", "Medical Doctor") // Reserve it to Medical Doctors and their boss, the Chief Medical Officer +/datum/gear/coat/paramedic + name = "Paramedic winter coat" + category = SLOT_WEAR_SUIT + path = /obj/item/clothing/suit/hooded/wintercoat/paramedic + restricted_roles = list("Chief Medical Officer", "Paramedic") // Reserve it to Paramedics and their boss, the Chief Medical Officer + /datum/gear/coat/robotics name = "Robotics winter coat" category = SLOT_WEAR_SUIT @@ -163,7 +161,7 @@ path = /obj/item/clothing/suit/storage/trek/ds9 restricted_desc = "All, barring Service and Civilian" restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster", - "Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist", + "Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Scientist", "Roboticist", "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer", "Cargo Technician", "Shaft Miner") //everyone who actually deserves a job. //Federation jackets from movies @@ -185,7 +183,7 @@ category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengmov name = "Fed (movie) uniform, Yellow" @@ -212,7 +210,7 @@ category = SLOT_WEAR_SUIT path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengmod name = "Fed (Modern) uniform, Yellow" @@ -234,4 +232,4 @@ /datum/gear/christmascoatrg name = "Red and Green Christmas Coat" category = SLOT_WEAR_SUIT - path = /obj/item/clothing/suit/hooded/wintercoat/christmascoatrg \ No newline at end of file + path = /obj/item/clothing/suit/hooded/wintercoat/christmascoatrg diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 4c66522df8..e667626968 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -254,6 +254,30 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/misc/keyholesweater +/datum/gear/polyjump + name = "Polychromic Jumpsuit" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/misc/polyjumpsuit + cost = 2 + +/datum/gear/polyskirt + name = "Polychromic Jumpskirt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/dress/skirt/polychromic + cost = 2 + +/datum/gear/polysuit + name = "Polychromic Button-up Shirt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/misc/poly_shirt + cost = 3 + +/datum/gear/polypleated + name = "Polychromic Pleated Sweaterskirt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/dress/skirt/polychromic/pleated + cost = 3 + /datum/gear/polykilt name = "Polychromic Kilt" category = SLOT_W_UNIFORM @@ -286,13 +310,13 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/medsci restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengtos name = "TOS uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/engsec - restricted_desc = "Engineering and Security" + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //TNG @@ -308,13 +332,13 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/medsci/next restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengtng name = "TNG uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/engsec/next - restricted_desc = "Engineering and Security" + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //VOY @@ -330,13 +354,13 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/medsci/voy restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengvoy name = "VOY uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/engsec/voy - restricted_desc = "Engineering and Security" + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //DS9 @@ -352,13 +376,13 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/medsci/ds9 restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengds9 name = "DS9 uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/engsec/ds9 - restricted_desc = "Engineering and Security" + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") //ENT @@ -374,15 +398,92 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/medsci/ent restricted_desc = "Medical and Science" - restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist") + restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist") /datum/gear/trekengent name = "ENT uniform, ops/sec" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/trek/engsec/ent - restricted_desc = "Engineering and Security" + restricted_desc = "Engineering, Security, and Cargo" restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster") +//TheMotionPicture +/datum/gear/trekfedutil + name = "TMP uniform" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/fedutil + restricted_desc = "All, barring Service and Civilian" + restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster", + "Medical Doctor","Chemist","Virologist","Paramedic","Geneticist","Scientist", "Roboticist", + "Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer", + "Cargo Technician", "Shaft Miner") + +/datum/gear/trekfedtrainee + name = "TMP uniform, trainee" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/fedutil/trainee + restricted_roles = list("Assistant", "Janitor", "Cargo Technician") + +/datum/gear/trekfedservice + name = "TMP uniform, service" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/fedutil/service + restricted_desc = "Service and Civilian, barring Clown, Mime and Lawyer" + restricted_roles = list("Assistant", "Bartender", "Botanist", "Cook", "Curator", "Janitor", "Chaplain") + +//Orvilike +/datum/gear/orvcmd + name = "ORV uniform, cmd" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/command/orv + restricted_desc = "Heads of Staff" + restricted_roles = list("Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer", "Quartermaster") + +/datum/gear/orvcmd_capt + name = "ORV uniform, capt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/command/orv/captain + restricted_roles = list("Captain") + +/datum/gear/orvmedsci + name = "ORV uniform, med/sci" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/medsci/orv + restricted_desc = "Medical and Science" + restricted_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Paramedic", "Geneticist", "Research Director", "Scientist", "Roboticist") + +/datum/gear/orvcmd_medsci + name = "ORV uniform, med/sci, cmd" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/command/orv/medsci + restricted_roles = list("Chief Medical Officer", "Research Director") + +/datum/gear/orvops + name = "ORV uniform, ops/sec" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/engsec/orv + restricted_desc = "Engineering, Security and Cargo" + restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer", "Warden", "Detective", "Security Officer", "Head of Security", "Cargo Technician", "Shaft Miner", "Quartermaster") + +/datum/gear/orvcmd_ops + name = "ORV uniform, ops/sec, cmd" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/command/orv/engsec + restricted_roles = list("Chief Engineer", "Head of Security") + +/datum/gear/orvass + name = "ORV uniform, assistant" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/orv + restricted_roles = list("Assistant") + +/datum/gear/orvsrv + name = "ORV uniform, service" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/trek/orv/service + restricted_roles = list("Assistant", "Bartender", "Botanist", "Cook", "Curator", "Janitor", "Chaplain") + restricted_desc = "Service and Civilian, barring Clown, Mime and Lawyer" + //Memes /datum/gear/gear_harnesses name = "Gear Harness" @@ -458,4 +559,4 @@ name = "Cheongsam, Red" category = SLOT_W_UNIFORM path = /obj/item/clothing/under/costume/cheongsam/red - cost = 3 \ No newline at end of file + cost = 3 diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm deleted file mode 100644 index 8c55f2d9a8..0000000000 --- a/modular_citadel/code/modules/client/preferences.dm +++ /dev/null @@ -1,47 +0,0 @@ -#define DEFAULT_SLOT_AMT 2 -#define HANDS_SLOT_AMT 2 -#define BACKPACK_SLOT_AMT 4 - -/datum/preferences - //gear - var/gear_points = 10 - var/list/gear_categories - var/list/chosen_gear - var/gear_tab - - //pref vars - var/screenshake = 100 - var/damagescreenshake = 2 - var/arousable = TRUE - var/widescreenpref = TRUE - var/autostand = TRUE - var/auto_ooc = FALSE - - //vore prefs - var/toggleeatingnoise = TRUE - var/toggledigestionnoise = TRUE - var/hound_sleeper = TRUE - var/cit_toggles = TOGGLES_CITADEL - - -/datum/preferences/New(client/C) - ..() - LAZYINITLIST(chosen_gear) - -/datum/preferences/proc/is_loadout_slot_available(slot) - var/list/L - LAZYINITLIST(L) - for(var/i in chosen_gear) - var/datum/gear/G = i - var/occupied_slots = L[slot_to_string(initial(G.category))] ? L[slot_to_string(initial(G.category))] + 1 : 1 - LAZYSET(L, slot_to_string(initial(G.category)), occupied_slots) - switch(slot) - if(SLOT_IN_BACKPACK) - if(L[slot_to_string(SLOT_IN_BACKPACK)] < BACKPACK_SLOT_AMT) - return TRUE - if(SLOT_HANDS) - if(L[slot_to_string(SLOT_HANDS)] < HANDS_SLOT_AMT) - return TRUE - else - if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) - return TRUE diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index d9b902656f..c747c4cf32 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -14,17 +14,6 @@ features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 3, 0) features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 3, 0) - //gear loadout - var/text_to_load - S["loadout"] >> text_to_load - var/list/saved_loadout_paths = splittext(text_to_load, "|") - LAZYCLEARLIST(chosen_gear) - gear_points = initial(gear_points) - for(var/i in saved_loadout_paths) - var/datum/gear/path = text2path(i) - if(path) - LAZYADD(chosen_gear, path) - gear_points -= initial(path.cost) /datum/preferences/proc/cit_character_pref_save(savefile/S) //ipcs @@ -46,11 +35,5 @@ WRITE_FILE(S["feature_xeno_head"], features["xenohead"]) //flavor text WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) + WRITE_FILE(S["silicon_feature_flavor_text"], features["silicon_flavor_text"]) - //gear loadout - if(islist(chosen_gear)) - if(chosen_gear.len) - var/text_to_save = chosen_gear.Join("|") - S["loadout"] << text_to_save - else - S["loadout"] << "" //empty string to reset the value diff --git a/modular_citadel/code/modules/clothing/neck.dm b/modular_citadel/code/modules/clothing/neck.dm index 20324516f6..f57e2ae530 100644 --- a/modular_citadel/code/modules/clothing/neck.dm +++ b/modular_citadel/code/modules/clothing/neck.dm @@ -7,7 +7,7 @@ icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi' item_state = "undertale" icon_state = "undertale" - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/necks.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/necks.dmi' resistance_flags = FIRE_PROOF actions_types = list(/datum/action/item_action/zanderlocket) var/toggled = FALSE diff --git a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm deleted file mode 100644 index ade6cee3ba..0000000000 --- a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/neck/cloak/polychromic //enables all three overlays to reduce copypasta and defines basic stuff - name = "polychromic cloak" - desc = "For when you want to show off your horrible colour coordination skills." - icon = 'modular_citadel/icons/polyclothes/item/neck.dmi' - alternate_worn_icon = 'modular_citadel/icons/polyclothes/mob/neck.dmi' - icon_state = "polyce" - item_color = "polyce" - item_state = "qmcloak" - hasprimary = TRUE - hassecondary = TRUE - hastertiary = TRUE - primary_color = "#FFFFFF" //RGB in hexcode - secondary_color = "#FFFFFF" - tertiary_color = "#808080" - -/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. Also mandates that ALL polychromic stuff MUST USE alternate_worn_icon - . = ..() - if(hasprimary | hassecondary | hastertiary) - if(!isinhands) //prevents the worn sprites from showing up if you're just holding them - if(hasprimary) //checks if overlays are enabled - var/mutable_appearance/primary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-primary") //automagical sprite selection - primary_worn.color = primary_color //colors the overlay - . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite. - if(hassecondary) - var/mutable_appearance/secondary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-secondary") - secondary_worn.color = secondary_color - . += secondary_worn - if(hastertiary) - var/mutable_appearance/tertiary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-tertiary") - tertiary_worn.color = tertiary_color - . += tertiary_worn - -/obj/item/clothing/neck/cloak/polychromic/polyce //DONATOR ITEM - name = "polychromic embroidered cloak" - desc = "A fancy cloak embroidered with polychromatic thread in a pattern that reminds one of the wielders of unlimited power." - icon_state = "polyce" - item_color = "polyce" - primary_color = "#808080" //RGB in hexcode - secondary_color = "#8CC6FF" - tertiary_color = "#FF3535" \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm index 4b9dd131ca..25b0c120e5 100644 --- a/modular_citadel/code/modules/clothing/suits/suits.dm +++ b/modular_citadel/code/modules/clothing/suits/suits.dm @@ -8,7 +8,7 @@ /obj/item/clothing/suit/armor/hos/trenchcoat/cloak name = "armored trenchcloak" desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.." - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/citadel/suit.dmi' icon_state = "hostrench" item_state = "hostrench" mutantrace_variation = NONE diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm index c6b0b80f22..c522d1af81 100644 --- a/modular_citadel/code/modules/clothing/trek.dm +++ b/modular_citadel/code/modules/clothing/trek.dm @@ -15,10 +15,10 @@ desc = "The overcoat worn by all officers of the 2380s." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' icon_state = "trek_ds9_coat" - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' item_state = "trek_ds9_coat" body_parts_covered = CHEST|GROIN|ARMS - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON permeability_coefficient = 0.50 allowed = list( /obj/item/flashlight, /obj/item/analyzer, @@ -44,10 +44,10 @@ name = "Federation Uniform Jacket" desc = "A uniform jacket from the United Federation. Set phasers to awesome." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' icon_state = "fedcoat" item_state = "fedcoat" - mutantrace_variation = NONE + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|ARMS allowed = list( @@ -110,9 +110,10 @@ name = "Modern Federation Uniform Jacket" desc = "A modern uniform jacket from the United Federation." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' icon_state = "fedmodern" item_state = "fedmodern" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON body_parts_covered = CHEST|GROIN|ARMS allowed = list( /obj/item/flashlight, /obj/item/analyzer, @@ -142,7 +143,7 @@ desc = "An officer's cap that demands discipline from the one who wears it." icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi' icon_state = "fedcapofficer" - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' item_state = "fedcapofficer" //Variants diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 62145616ad..bd377d6081 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -26,7 +26,7 @@ desc = "The design on this seems a little too familiar." icon = 'icons/obj/custom.dmi' icon_state = "infcloak" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "infcloak" w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN|LEGS|ARMS @@ -36,9 +36,8 @@ desc = "A soft black collar that seems to stretch to fit whoever wears it." icon = 'icons/obj/custom.dmi' icon_state = "infcollar" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "infcollar" - item_color = null tagname = null /obj/item/clothing/accessory/medal/steele @@ -46,14 +45,13 @@ desc = "An intricate pendant given to those who help a key member of the Steele Corporation." icon = 'icons/obj/custom.dmi' icon_state = "steele" - item_color = "steele" medaltype = "medal-silver" /obj/item/toy/darksabre name = "Kiara's Sabre" desc = "This blade looks as dangerous as its owner." icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "darksabre" item_state = "darksabre" lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi' @@ -70,7 +68,7 @@ name = "Ornate Sheathe" desc = "An ornate and rather sinister looking sabre sheathe." icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "darksheath" item_state = "darksheath" fitting_swords = list(/obj/item/toy/darksabre) @@ -80,7 +78,7 @@ name = "Dark Armor" desc = "A dark, non-functional piece of armor sporting a red and black finish." icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "darkcarapace" item_state = "darkcarapace" blood_overlay_type = "armor" @@ -107,8 +105,7 @@ icon = 'icons/obj/custom.dmi' icon_state = "zombscarf" desc = "A fashionable collar" - alternate_worn_icon = 'icons/mob/custom_w.dmi' - item_color = "zombscarf" + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' dog_fashion = /datum/dog_fashion/head /obj/item/clothing/suit/toggle/labcoat/mad/red @@ -116,7 +113,7 @@ desc = "An oddly special looking coat." icon = 'icons/obj/custom.dmi' icon_state = "labred" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "labred" mutantrace_variation = NONE @@ -125,7 +122,7 @@ desc = "An oddly special looking coat." icon = 'icons/obj/custom.dmi' icon_state = "labredblack" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "labredblack" mutantrace_variation = NONE @@ -144,7 +141,7 @@ name = "carrot cloak" desc = "A cloak in the shape and color of a carrot!" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "carrotcloak" item_state = "carrotcloak" w_class = WEIGHT_CLASS_SMALL @@ -156,7 +153,7 @@ icon = 'icons/obj/custom.dmi' icon_state = "satchel_carrot" item_state = "satchel_carrot" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' /obj/item/storage/backpack/satchel/carrot/Initialize() . = ..() @@ -179,7 +176,7 @@ icon = 'icons/obj/custom.dmi' icon_state = "festive" item_state = "festive" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN|LEGS|ARMS @@ -187,7 +184,7 @@ name = "Alboroto Rosa mask" icon = 'icons/obj/custom.dmi' icon_state = "lucharzigfie" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "lucharzigfie" /obj/item/clothing/head/hardhat/reindeer/fluff @@ -195,7 +192,7 @@ desc = "Some fake antlers and a very fake red nose - Sponsored by PWR Game(tm)" icon_state = "hardhat0_reindeer" item_state = "hardhat0_reindeer" - item_color = "reindeer" + hat_type = "reindeer" flags_inv = 0 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) brightness_on = 0 //luminosity when on @@ -220,7 +217,7 @@ name = "The Hollow heart" desc = "Sometimes things are too much to hide." icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "hheart" item_state = "hheart" flags_inv = HIDEFACE|HIDEFACIALHAIR @@ -230,7 +227,7 @@ desc = "You would swear this was in your nightmares after eating too many veggies." icon = 'icons/obj/custom.dmi' icon_state = "hos-g" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "hos-g" body_parts_covered = CHEST|GROIN|ARMS|LEGS mutantrace_variation = NONE @@ -247,7 +244,7 @@ desc = "Smells like reactor four." icon = 'icons/obj/custom.dmi' item_state = "stalker" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "stalker" /obj/item/reagent_containers/food/drinks/flask/steel @@ -262,7 +259,7 @@ desc = "It's a collar..." icon = 'icons/obj/custom.dmi' icon_state = "petcollar-stripe" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "petcollar-stripe" tagname = null @@ -271,9 +268,8 @@ desc = "Just looking at this makes you want to sing." icon = 'icons/obj/custom.dmi' icon_state = "singer" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "singer" - item_color = "singer" fitted = NO_FEMALE_UNIFORM alternate_worn_layer = ABOVE_SHOES_LAYER can_adjust = 0 @@ -282,7 +278,7 @@ /obj/item/clothing/shoes/sneakers/pink icon = 'icons/obj/custom.dmi' icon_state = "pink" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "pink" mutantrace_variation = NONE @@ -291,13 +287,13 @@ desc = "A neosilk clip-on tie. This one has a black S on the tipping and looks rather unique." icon = 'icons/obj/custom.dmi' icon_state = "bloodredtie" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' /obj/item/clothing/suit/puffydress name = "Puffy Dress" desc = "A formal puffy black and red Victorian dress." icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "puffydress" item_state = "puffydress" body_parts_covered = CHEST|GROIN|LEGS @@ -310,7 +306,7 @@ item_state = "vermillion" body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/under/sweater/black/naomi @@ -327,7 +323,7 @@ desc = "This cloak doesn't seem too special." icon = 'icons/obj/custom.dmi' icon_state = "wintergreencloak" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "wintergreencloak" w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN|LEGS|ARMS @@ -343,7 +339,7 @@ desc = "An oddly special looking coat." icon = 'icons/obj/custom.dmi' icon_state = "rdcoat" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' item_state = "rdcoat" mutantrace_variation = NONE @@ -359,7 +355,7 @@ desc = "These strange wings look like they once attached to something... or someone...? Whatever the case, their presence makes you feel uneasy.." icon = 'icons/obj/custom.dmi' icon_state = "devilwings" - alternate_worn_icon = 'modular_citadel/icons/mob/clothing/devilwings64x64.dmi' + mob_overlay_icon = 'modular_citadel/icons/mob/clothing/devilwings64x64.dmi' item_state = "devilwings" worn_x_dimension = 64 worn_y_dimension = 34 @@ -369,14 +365,14 @@ desc = "A truly patriotic form of heroic attire." icon = 'icons/obj/custom.dmi' resistance_flags = FLAMMABLE - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "flagcape" item_state = "flagcape" /obj/item/clothing/shoes/lucky name = "Lucky Jackboots" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' desc = "Comfy Lucky Jackboots with the word Luck on them." item_state = "luckyjack" icon_state = "luckyjack" @@ -385,7 +381,7 @@ /obj/item/clothing/under/custom/lunasune name = "Divine Robes" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' desc = "Heavenly robes of the kitsune Luna Pumpkin,you can feel radiance coming from them." item_state = "Divine_robes" icon_state = "Divine_robes" @@ -394,7 +390,7 @@ /obj/item/clothing/under/custom/leoskimpy name = "Leon's Skimpy Outfit" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' desc = "A rather skimpy outfit." item_state = "shark_cloth" icon_state = "shark_cloth" @@ -403,7 +399,7 @@ /obj/item/clothing/under/custom/mimeoveralls name = "Mime's Overalls" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' desc = "A less-than-traditional mime's attire, completed by a set of dorky-looking overalls." item_state = "moveralls" icon_state = "moveralls" @@ -415,7 +411,7 @@ icon_state = "zuliecloak" item_state = "zuliecloak" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' hoodtype = /obj/item/clothing/head/hooded/cloakhood/zuliecloak body_parts_covered = CHEST|GROIN|ARMS slot_flags = SLOT_WEAR_SUIT | ITEM_SLOT_NECK //it's a cloak. it's cosmetic. so why the hell not? what could possibly go wrong? @@ -427,7 +423,7 @@ icon_state = "zuliecap" item_state = "zuliecap" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' flags_inv = HIDEEARS|HIDEHAIR mutantrace_variation = NONE @@ -435,7 +431,7 @@ name = "Multicolor Coat" desc = "An oddly special looking coat with black, red, and gold" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "redgoldjacket" item_state = "redgoldjacket" body_parts_covered = CHEST|GROIN|LEGS|ARMS @@ -447,7 +443,7 @@ icon_state = "kimono" item_state = "kimono" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' body_parts_covered = CHEST|GROIN|LEGS|ARMS mutantrace_variation = NONE @@ -457,7 +453,7 @@ icon_state = "commjacket" item_state = "commjacket" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' body_parts_covered = CHEST|GROIN|LEGS|ARMS mutantrace_variation = NONE @@ -467,7 +463,7 @@ icon_state = "mw2_russian_para" item_state = "mw2_russian_para" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/gloves/longblackgloves @@ -476,7 +472,7 @@ icon_state = "longblackgloves" item_state = "longblackgloves" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' /obj/item/clothing/under/custom/trendy_fit name = "Trendy Fitting Clothing" @@ -484,7 +480,7 @@ icon_state = "trendy_fit" item_state = "trendy_fit" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/head/blueberet @@ -493,7 +489,7 @@ icon_state = "blueberet" item_state = "blueberet" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' dynamic_hair_suffix = "" /obj/item/clothing/head/flight @@ -502,7 +498,7 @@ icon_state = "flight-g" item_state = "flight-g" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' /obj/item/clothing/neck/necklace/onion name = "Onion Necklace" @@ -510,7 +506,7 @@ icon = 'icons/obj/custom.dmi' icon_state = "onion" item_state = "onion" - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' /obj/item/clothing/under/custom/mikubikini name = "starlight singer bikini" @@ -518,7 +514,7 @@ icon_state = "mikubikini" item_state = "mikubikini" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/suit/mikujacket @@ -527,7 +523,7 @@ icon_state = "mikujacket" item_state = "mikujacket" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/head/mikuhair @@ -536,7 +532,7 @@ icon_state = "mikuhair" item_state = "mikuhair" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE flags_inv = HIDEHAIR @@ -546,7 +542,7 @@ icon_state = "mikugloves" item_state = "mikugloves" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/clothing/shoes/sneakers/mikuleggings @@ -555,7 +551,7 @@ icon_state = "mikuleggings" item_state = "mikuleggings" icon = 'icons/obj/custom.dmi' - alternate_worn_icon = 'icons/mob/custom_w.dmi' + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' mutantrace_variation = NONE /obj/item/toy/plush/mammal/dog/fritz @@ -567,3 +563,8 @@ unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") mutantrace_variation = NONE +/obj/item/clothing/neck/cloak/polychromic/polyce + name = "polychromic embroidered cloak" + desc = "A fancy cloak embroidered with polychromatic thread in a pattern that reminds one of the wielders of unlimited power." + icon_state = "polyce" + poly_colors = list("#808080", "#8CC6FF", "#FF3535") diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index e95948e562..3a683ca2ff 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -1,29 +1,16 @@ /mob/living/carbon - var/lastmousedir - var/wrongdirmovedelay - //oh no vore time var/voremode = FALSE /mob/living/carbon/proc/toggle_vore_mode() + if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_TOGGLED)) + return FALSE //let's not override the main draw of the game these days voremode = !voremode var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() - if(combat_flags & COMBAT_FLAG_COMBAT_TOGGLED) - return FALSE //let's not override the main draw of the game these days - SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode) return TRUE -/mob/living/carbon/Move(atom/newloc, direct = 0) - . = ..() - wrongdirmovedelay = FALSE - if((combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && client && lastmousedir) - if(lastmousedir != dir) - wrongdirmovedelay = TRUE - setDir(lastmousedir, ismousemovement = TRUE) - -/mob/living/carbon/onMouseMove(object, location, control, params) - if(!(combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) - return - mouse_face_atom(object) - lastmousedir = dir +/mob/living/carbon/proc/disable_vore_mode() + voremode = FALSE + var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + T?.update_icon_state() diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm index a2b9c601dc..17c3f17ad8 100644 --- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm +++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm @@ -6,7 +6,7 @@ var/directstamloss = (bufferedstam + amount) - stambuffer if(directstamloss > 0) adjustStaminaLoss(directstamloss) - bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer) + bufferedstam = clamp(bufferedstam + amount, 0, stambuffer) stambufferregentime = world.time + 10 if(updating_health) update_health_hud() @@ -14,7 +14,12 @@ /mob/living/carbon/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE, affected_zone = BODY_ZONE_CHEST) if(!forced && (status_flags & GODMODE)) return FALSE - apply_damage(amount > 0 ? amount*incomingstammult : amount, STAMINA, affected_zone) + var/obj/item/bodypart/BP = isbodypart(affected_zone)? affected_zone : (get_bodypart(check_zone(affected_zone)) || bodyparts[1]) + if(amount > 0? BP.receive_damage(0, 0, amount * incomingstammult) : BP.heal_damage(0, 0, abs(amount), FALSE, FALSE)) + update_damage_overlays() + if(updating_health) + updatehealth() + update_stamina() if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && amount > 20) incomingstammult = max(0.01, incomingstammult/(amount*0.05)) return amount diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm index 390cac3646..47de66fcd1 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm @@ -2,22 +2,21 @@ return /mob/living/carbon/human/resist_embedded() - if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime)) + if(handcuffed || (wear_suit && wear_suit.breakouttime)) return - if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !on_fire) + if(CHECK_MOBILITY(src, MOBILITY_USE)) for(var/obj/item/bodypart/L in bodyparts) if(istype(L) && L.embedded_objects.len) for(var/obj/item/I in L.embedded_objects) if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist - remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully. + remove_embedded_unsafe(L, I, src, 1) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully. return TRUE //Hands are occupied - return /mob/living/carbon/human/proc/remove_embedded_unsafe(obj/item/bodypart/L, obj/item/I, mob/user, painmul = 1) if(!I || !L || I.loc != src || !(I in L.embedded_objects)) return L.embedded_objects -= I - L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more + L.receive_damage(I.embedding["remove_pain_mult"]*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more I.forceMove(get_turf(src)) I.unembedded() user.put_in_hands(I) diff --git a/modular_citadel/code/modules/mob/living/carbon/life.dm b/modular_citadel/code/modules/mob/living/carbon/life.dm deleted file mode 100644 index e94bd75985..0000000000 --- a/modular_citadel/code/modules/mob/living/carbon/life.dm +++ /dev/null @@ -1,3 +0,0 @@ -/mob/living/carbon/Life() - . = ..() - doSprintBufferRegen() diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm index 3baab2ad86..01867e9dcc 100644 --- a/modular_citadel/code/modules/mob/living/living.dm +++ b/modular_citadel/code/modules/mob/living/living.dm @@ -37,7 +37,7 @@ if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health >= STAMINA_CRIT && !stat) to_chat(src, "You're too exhausted to keep going...") set_resting(TRUE, FALSE, FALSE) - disable_intentional_combat_mode(TRUE, FALSE) + SEND_SIGNAL(src, COMSIG_DISABLE_COMBAT_MODE) ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT) filters += CIT_FILTER_STAMINACRIT update_mobility() diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm deleted file mode 100644 index 6d080ee898..0000000000 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ /dev/null @@ -1,449 +0,0 @@ -/* -DOG BORG EQUIPMENT HERE -SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! -*/ - -/obj/item/dogborg/jaws - name = "Dogborg jaws" - desc = "The jaws of the debug errors oh god." - icon = 'icons/mob/dogborg.dmi' - flags_1 = CONDUCT_1 - force = 1 - throwforce = 0 - w_class = 3 - hitsound = 'sound/weapons/bite.ogg' - sharpness = IS_SHARP - var/stamtostunconversion = 0.1 //Total stamloss gets multiplied by this value for the help intent hard stun. Resting adds an additional 2x multiplier on top. Keep this low or so help me god. - var/stuncooldown = 4 SECONDS //How long it takes before you're able to attempt to stun a target again - var/nextstuntime - -/obj/item/dogborg/jaws/examine(mob/user) - . = ..() - if(!CONFIG_GET(flag/weaken_secborg)) - . += "Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets." - -/obj/item/dogborg/jaws/big - name = "combat jaws" - desc = "The jaws of the law. Very sharp." - icon_state = "jaws" - force = 15 //Chomp chomp. Crew harm. - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - stamtostunconversion = 0.2 // 100*0.2*2=40. Stun's just long enough to slap on cuffs with click delay if the target is near hard stamcrit. - stuncooldown = 6 SECONDS - - -/obj/item/dogborg/jaws/small - name = "puppy jaws" - desc = "Rubberized teeth designed to protect accidental harm. Sharp enough for specialized tasks however." - icon_state = "smalljaws" - force = 6 - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - var/status = 0 - -/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user) - if(!istype(user)) - return - if(!CONFIG_GET(flag/weaken_secborg) && user.a_intent != INTENT_HARM && istype(A, /mob/living)) - if(A == user.pulling) - to_chat(user, "You already have [A] in your jaws.") - return - if(nextstuntime >= world.time) - to_chat(user, "Your jaw servos are still recharging.") - return - nextstuntime = world.time + stuncooldown - var/mob/living/M = A - var/cachedstam = M.getStaminaLoss() - var/totalstuntime = cachedstam * stamtostunconversion * (M.lying ? 2 : 1) - if(CHECK_MOBILITY(M, MOBILITY_STAND)) - M.DefaultCombatKnockdown(cachedstam*2) //BORK BORK. GET DOWN. - M.Stun(totalstuntime) - user.do_attack_animation(A, ATTACK_EFFECT_BITE) - user.start_pulling(M, TRUE) //Yip yip. Come with. - user.changeNext_move(CLICK_CD_MELEE) - M.visible_message("[user] clamps [user.p_their()] [src] onto [M] and latches on!", "[user] clamps [user.p_their()] [src] onto you and latches on!") - if(totalstuntime >= 4 SECONDS) - playsound(usr, 'sound/effects/k9_jaw_strong.ogg', 75, FALSE, 2) //Wuff wuff. Big stun. - else - playsound(usr, 'sound/effects/k9_jaw_weak.ogg', 50, TRUE, -1) //Arf arf. Pls buff. - else - . = ..() - user.do_attack_animation(A, ATTACK_EFFECT_BITE) - -/obj/item/dogborg/jaws/small/attack_self(mob/user) - var/mob/living/silicon/robot/R = user - if(R.cell && R.cell.charge > 100) - if(R.emagged && status == 0) - name = "combat jaws" - icon_state = "jaws" - desc = "The jaws of the law." - force = 12 - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - stamtostunconversion = 0.15 - stuncooldown = 5 SECONDS - status = 1 - to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].") - else - name = "puppy jaws" - icon_state = "smalljaws" - desc = "The jaws of a small dog." - force = initial(force) - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - stamtostunconversion = initial(stamtostunconversion) - stuncooldown = initial(stuncooldown) - status = 0 - if(R.emagged) - to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].") - update_icon() - -//Boop - -/obj/item/analyzer/nose - name = "boop module" - icon = 'icons/mob/dogborg.dmi' - icon_state = "nose" - desc = "The BOOP module" - flags_1 = CONDUCT_1 - force = 0 - throwforce = 0 - attack_verb = list("nuzzles", "pushes", "boops") - w_class = 1 - -/obj/item/analyzer/nose/attack_self(mob/user) - user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") - - var/turf/location = user.loc - if(!istype(location)) - return - - var/datum/gas_mixture/environment = location.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - to_chat(user, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - var/list/env_gases = environment.gases - - var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles - var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles - var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles - var/plasma_concentration = env_gases[/datum/gas/plasma]/total_moles - GAS_GARBAGE_COLLECT(environment.gases) - - if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") - - if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") - - if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") - - if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") - - - for(var/id in env_gases) - if(id in GLOB.hardcoded_gases) - continue - var/gas_concentration = env_gases[id]/total_moles - to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] %") - to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") - -/obj/item/analyzer/nose/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return - do_attack_animation(target, null, src) - user.visible_message("[user] [pick(attack_verb)] \the [target.name] with their nose!") - -//Delivery -/obj/item/storage/bag/borgdelivery - name = "fetching storage" - desc = "Fetch the thing!" - icon = 'icons/mob/dogborg.dmi' - icon_state = "dbag" - w_class = WEIGHT_CLASS_BULKY - -/obj/item/storage/bag/borgdelivery/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_w_class = WEIGHT_CLASS_BULKY - STR.max_combined_w_class = 5 - STR.max_items = 1 - STR.cant_hold = typecacheof(list(/obj/item/disk/nuclear, /obj/item/radio/intercom)) - -//Tongue stuff -/obj/item/soap/tongue - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'icons/mob/dogborg.dmi' - icon_state = "synthtongue" - hitsound = 'sound/effects/attackblob.ogg' - cleanspeed = 80 - var/status = 0 - -/obj/item/soap/tongue/scrubpup - cleanspeed = 25 //slightly faster than a mop. - -/obj/item/soap/tongue/New() - ..() - item_flags |= NOBLUDGEON //No more attack messages - -/obj/item/soap/tongue/attack_self(mob/user) - var/mob/living/silicon/robot/R = user - if(R.cell && R.cell.charge > 100) - if(R.emagged && status == 0) - status = !status - name = "energized tongue" - desc = "Your tongue is energized for dangerously maximum efficency." - icon_state = "syndietongue" - to_chat(user, "Your tongue is now [status ? "Energized" : "Normal"].") - cleanspeed = 10 //(nerf'd)tator soap stat - else - status = 0 - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon_state = "synthtongue" - cleanspeed = initial(cleanspeed) - if(R.emagged) - to_chat(user, "Your tongue is now [status ? "Energized" : "Normal"].") - update_icon() - -/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) - var/mob/living/silicon/robot/R = user - if(!proximity || !check_allowed_items(target)) - return - if(R.client && (target in R.client.screen)) - to_chat(R, "You need to take that [target.name] off before cleaning it!") - else if(is_cleanable(target)) - R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") - if(do_after(R, src.cleanspeed, target = target)) - if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. - return //If they moved away, you can't eat them. - to_chat(R, "You finish licking off \the [target.name].") - qdel(target) - R.cell.give(50) - else if(isobj(target)) //hoo boy. danger zone man - if(istype(target,/obj/item/trash)) - R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") - if(!do_after(R, src.cleanspeed, target = target)) - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - qdel(target) - R.cell.give(250) - return - if(istype(target,/obj/item/stock_parts/cell)) - R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") - if(!do_after(R, 50, target = target)) - return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") - var/obj/item/stock_parts/cell/C = target - R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf - qdel(target) - return - var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT - if(!I.anchored && R.emagged) - R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") - if(!do_after(R, 100, target = I)) //Nerf dat time yo - return //If they moved away, you can't eat them. - visible_message("[R] chews up \the [target.name] and cleans off the debris!") - to_chat(R, "You finish off \the [target.name].") - qdel(I) - R.cell.give(500) - return - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - else if(ishuman(target)) - var/mob/living/L = target - if(status == 0 && check_zone(R.zone_selected) == "head") - R.visible_message("\the [R] affectionally licks \the [L]'s face!", "You affectionally lick \the [L]'s face!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - if(istype(L) && L.fire_stacks > 0) - L.adjust_fire_stacks(-10) - return - else if(status == 0) - R.visible_message("\the [R] affectionally licks \the [L]!", "You affectionally lick \the [L]!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - if(istype(L) && L.fire_stacks > 0) - L.adjust_fire_stacks(-10) - return - else - if(R.cell.charge <= 800) - to_chat(R, "Insufficent Power!") - return - L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! - L.DefaultCombatKnockdown(80) - L.apply_effect(EFFECT_STUTTER, 4) - L.visible_message("[R] has shocked [L] with its tongue!", \ - "[R] has shocked you with its tongue!") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - R.cell.use(666) - log_combat(R, L, "tongue stunned") - - else if(istype(target, /obj/structure/window)) - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(user, src.cleanspeed, target = target)) - to_chat(user, "You clean \the [target.name].") - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - target.set_opacity(initial(target.opacity)) - else - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") - if(do_after(user, src.cleanspeed, target = target)) - to_chat(user, "You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target - qdel(C) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) - target.wash_cream() - return - -//Nerfed tongue for flavour reasons (haha geddit?). Used for aux skins for regular borgs -/obj/item/soap/tongue/flavour - desc = "For giving affectionate kisses." - -/obj/item/soap/tongue/flavour/attack_self(mob/user) - return - -/obj/item/soap/tongue/flavour/afterattack(atom/target, mob/user, proximity) - if(!proximity) - return - var/mob/living/silicon/robot/R = user - if(ishuman(target)) - var/mob/living/L = target - if(status == 0 && check_zone(R.zone_selected) == "head") - R.visible_message("\the [R] affectionally licks \the [L]'s face!", "You affectionally lick \the [L]'s face!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - return - else if(status == 0) - R.visible_message("\the [R] affectionally licks \the [L]!", "You affectionally lick \the [L]!") - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - return - -//Same as above but for noses -/obj/item/analyzer/nose/flavour/AltClick(mob/user) - return - -/obj/item/analyzer/nose/flavour/attack_self(mob/user) - return - -/obj/item/analyzer/nose/flavour/afterattack(atom/target, mob/user, proximity) - if(!proximity) - return - do_attack_animation(target, null, src) - user.visible_message("[user] [pick(attack_verb)] \the [target.name] with their nose!") - - -//Dogfood - -/obj/item/trash/rkibble - name = "robo kibble" - desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." - icon = 'icons/mob/dogborg.dmi' - icon_state= "kibble" - -// Pounce stuff for K-9 - -/obj/item/dogborg/pounce - name = "pounce" - icon = 'icons/mob/dogborg.dmi' - icon_state = "pounce" - desc = "Leap at your target to momentarily stun them." - force = 0 - throwforce = 0 - -/obj/item/dogborg/pounce/New() - ..() - item_flags |= NOBLUDGEON - -/mob/living/silicon/robot - var/leaping = 0 - var/pounce_cooldown = 0 - var/pounce_cooldown_time = 30 //Time in deciseconds between pounces - var/pounce_spoolup = 5 //Time in deciseconds for the pounce to happen after clicking - var/pounce_stamloss_cap = 120 //How much staminaloss pounces alone are capable of bringing a spaceman to - var/pounce_stamloss = 80 //Base staminaloss value of the pounce - var/leap_at - var/disabler - var/laser - var/sleeper_g - var/sleeper_r - var/sleeper_nv - -#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance. - -/obj/item/dogborg/pounce/afterattack(atom/A, mob/user) - var/mob/living/silicon/robot/R = user - if(R && (world.time >= R.pounce_cooldown)) - R.pounce_cooldown = world.time + R.pounce_cooldown_time - to_chat(R, "Your targeting systems lock on to [A]...") - playsound(R, 'sound/effects/servostep.ogg', 100, TRUE) - addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup) - else if(R && (world.time < R.pounce_cooldown)) - to_chat(R, "Your leg actuators are still recharging!") - -/mob/living/silicon/robot/proc/leap_at(atom/A) - if(leaping || stat || buckled || lying) - return - - if(!has_gravity(src) || !has_gravity(A)) - to_chat(src,"It is unsafe to leap without gravity!") - //It's also extremely buggy visually, so it's balance+bugfix - return - - if(cell.charge <= 750) - to_chat(src,"Insufficent reserves for jump actuators!") - return - - else - leaping = 1 - weather_immunities += "lava" - pixel_y = 10 - update_icons() - throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1) - cell.use(750) //Less than a stunbaton since stunbatons hit everytime. - playsound(src, 'sound/effects/stealthoff.ogg', 25, TRUE, -1) - weather_immunities -= "lava" - -/mob/living/silicon/robot/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - - if(!leaping) - return ..() - - if(hit_atom) - if(isliving(hit_atom)) - var/mob/living/L = hit_atom - if(!L.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) - L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") - L.DefaultCombatKnockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice. - playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) - log_combat(src, L, "borg pounced") - else - DefaultCombatKnockdown(15, 1, 1) - - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown - else if(hit_atom.density && !hit_atom.CanPass(src)) - visible_message("[src] smashes into [hit_atom]!", "You smash into [hit_atom]!") - playsound(src, 'sound/items/trayhit1.ogg', 50, 1) - DefaultCombatKnockdown(15, 1, 1) - - if(leaping) - leaping = 0 - pixel_y = initial(pixel_y) - update_icons() - update_mobility() diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm deleted file mode 100644 index 317f68b4c4..0000000000 --- a/modular_citadel/code/modules/projectiles/gun.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/item/gun/proc/getstamcost(mob/living/carbon/user) - if(user && user.has_gravity()) - return recoil - else - return recoil*5 - -/obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user) - if(user && !lavaland_equipment_pressure_check(get_turf(user))) - return 0 - else - return ..() diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm index 98d2efc4ea..20917c4ba5 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm @@ -1,34 +1,3 @@ -////////////Anti Tank Pistol//////////// - -/obj/item/gun/ballistic/automatic/pistol/antitank - name = "Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." - icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' - icon_state = "atp" - item_state = "pistol" - recoil = 4 - mag_type = /obj/item/ammo_box/magazine/sniper_rounds - fire_delay = 50 - burst_size = 1 - can_suppress = 0 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list() - fire_sound = 'sound/weapons/blastcannon.ogg' - spread = 20 //damn thing has no rifling. - -/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() - ..() - if(magazine) - cut_overlays() - add_overlay("atp-mag") - else - cut_overlays() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - -/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate - name = "Syndicate Anti Tank Pistol" - desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing." - pin = /obj/item/firing_pin/implant/pindicate ///foam stealth pistol/// @@ -56,75 +25,6 @@ cut_overlays() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" -//////10mm soporific bullets////// - -obj/item/projectile/bullet/c10mm/soporific - name ="10mm soporific bullet" - armour_penetration = 0 - nodamage = TRUE - dismemberment = 0 - knockdown = 0 - -/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) - . = ..() - if((blocked != 100) && isliving(target)) - var/mob/living/L = target - L.blur_eyes(6) - if(L.getStaminaLoss() >= 60) - L.Sleeping(300) - else - L.adjustStaminaLoss(25) - -/obj/item/ammo_casing/c10mm/soporific - name = ".10mm soporific bullet casing" - desc = "A 10mm soporific bullet casing." - projectile_type = /obj/item/projectile/bullet/c10mm/soporific - -/obj/item/ammo_box/magazine/m10mm/soporific - name = "pistol magazine (10mm soporific)" - icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' - icon_state = "9x19pS" - desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." - ammo_type = /obj/item/ammo_casing/c10mm/soporific - -/obj/item/ammo_box/c10mm/soporific - name = "ammo box (10mm soporific)" - ammo_type = /obj/item/ammo_casing/c10mm/soporific - max_ammo = 24 - -//////modular pistol////// (reskinnable stetchkins) - -/obj/item/gun/ballistic/automatic/pistol/modular - name = "modular pistol" - desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." - icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' - icon_state = "cde" - can_unsuppress = TRUE - obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "cde", - "NT-99" = "n99", - "Stealth" = "stealthpistol", - "HKVP-78" = "vp78", - "Luger" = "p08b", - "Mk.58" = "secguncomp", - "PX4 Storm" = "px4" - ) - -/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() - ..() - if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - else - icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" - if(magazine && suppressed) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay - else if (magazine) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine") - else - cut_overlays() - /////////RAYGUN MEMES///////// /obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor @@ -144,4 +44,4 @@ obj/item/projectile/bullet/c10mm/soporific icon_state = "raygun" desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems." ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag) - selfcharge = EGUN_SELFCHARGE \ No newline at end of file + selfcharge = EGUN_SELFCHARGE diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index 49a8a26f35..49d48e0000 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -39,7 +39,7 @@ obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1) update_icon() -obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, style_flags = NONE) +obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) . = ..() if(isinhands) var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body") diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index 05b5c195c2..03a124e306 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -87,7 +87,7 @@ . = ..() . += "Alt-click to change firing modes." -/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, style_flags = NONE) //ammo counter for inhands +/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //ammo counter for inhands . = ..() var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] @@ -131,7 +131,7 @@ item_state = "particleblaster" lefthand_file = 'modular_citadel/icons/mob/inhands/guns_lefthand.dmi' righthand_file = 'modular_citadel/icons/mob/inhands/guns_righthand.dmi' - ammo_type = list(/obj/item/ammo_casing/energy/electrode/pump, /obj/item/ammo_casing/energy/laser/pump) + ammo_type = list(/obj/item/ammo_casing/energy/disabler/pump, /obj/item/ammo_casing/energy/laser/pump) ammo_x_offset = 2 modifystate = 1 @@ -152,19 +152,19 @@ fire_sound = 'sound/weapons/LaserSlugv3.ogg' /obj/item/ammo_casing/energy/laser/pump - projectile_type = /obj/item/projectile/beam/weak - e_cost = 200 + projectile_type = /obj/item/projectile/beam/pump + e_cost = 350 select_name = "kill" - pellets = 3 + pellets = 6 variance = 15 fire_sound = 'sound/weapons/ParticleBlaster.ogg' -/obj/item/ammo_casing/energy/electrode/pump - projectile_type = /obj/item/projectile/energy/electrode/pump - select_name = "stun" +/obj/item/ammo_casing/energy/disabler/pump + projectile_type = /obj/item/projectile/energy/disabler/pump + select_name = "disable" fire_sound = 'sound/weapons/LaserSlugv3.ogg' - e_cost = 300 - pellets = 3 + e_cost = 150 + pellets = 6 variance = 20 //PROJECTILES @@ -178,22 +178,16 @@ name = "positron blast" damage = 80 range = 14 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) icon_state = "disablerslug" -/obj/item/projectile/energy/electrode/pump - name = "electron blast" - icon_state = "stunjectile" +/obj/item/projectile/beam/pump + damage = 9 + range = 6 + +/obj/item/projectile/energy/disabler/pump + name = "disabling blast" + icon_state = "disablerslug" color = null - nodamage = TRUE - knockdown = 100 - knockdown_stamoverride = 0 - knockdown_stam_max = 0 - stamina = 18 - stutter = 5 - jitter = 20 - strong_tase = FALSE - tase_duration = 0 - hitsound = 'sound/weapons/taserhit.ogg' - range = 3 - strong_tase = FALSE + stamina = 13 + range = 6 diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 2364c617f0..f66c0289b6 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -144,20 +144,7 @@ Creating a chem with a low purity will make you permanently fall in love with so pH = 10 chemical_flags = REAGENT_ONMOBMERGE | REAGENT_DONOTSPLIT //Procs on_mob_add when merging into a human can_synth = FALSE - - -/datum/reagent/fermi/enthrall/test - name = "MKUltraTest" - description = "A forbidden deep red mixture that makes you like Fermis a little too much. Unobtainable and due to be removed from the wiki." - data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo") - creatorID = "honkatonkbramblesnatch"//ckey - creatorGender = "Mistress" - creatorName = "Fermis Yakumo" - purity = 1 - -/datum/reagent/fermi/enthrall/test/on_new() - ..() - creator = get_mob_by_key(creatorID) + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/fermi/enthrall/on_new(list/data) creatorID = data["creatorID"] @@ -184,10 +171,10 @@ Creating a chem with a low purity will make you permanently fall in love with so E.enthrallGender = creatorGender E.master = get_mob_by_key(creatorID) to_chat(M, "Your addled, plastic, mind bends under the chemical influence of a new [(E.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.") //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. - log_game("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]") + log_reagent("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]") return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) - log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") + log_reagent("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech") var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE) var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet if(Vc) @@ -196,9 +183,9 @@ Creating a chem with a low purity will make you permanently fall in love with so qdel(Vc) to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.") else - log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") + log_reagent("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) - log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") + log_reagent("FERMICHEM: [M] ckey: [M.key] has taken MKUltra") /datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M) . = ..() @@ -207,14 +194,14 @@ Creating a chem with a low purity will make you permanently fall in love with so if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them. if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak. return - var/list/seen = viewers(7, get_turf(M)) + var/list/seen = (M.fov_view(M.client?.view || world.view) - M) | viewers(M.client?.view || world.view, M) for(var/victim in seen) if(ishuman(victim)) var/mob/living/carbon/V = victim - if((V == M) || (!V.client) || (V.stat == DEAD)) - seen = seen - victim + if(!V.client || V.stat == DEAD) + seen -= victim else - seen = seen - victim + seen -= victim if(LAZYLEN(seen)) return @@ -226,7 +213,7 @@ Creating a chem with a low purity will make you permanently fall in love with so var/mob/living/carbon/C = get_mob_by_key(creatorID) if(M.has_status_effect(STATUS_EFFECT_INLOVE)) return - if((C in viewers(7, get_turf(M))) && (C.client)) + if(C.client && (M in C.fov_view(C.client.view))) M.reagents.del_reagent(type) FallInLove(C, M) return @@ -264,7 +251,7 @@ Creating a chem with a low purity will make you permanently fall in love with so to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what [creatorName] has been saying. Your highest priority is now to stay by their side and protect them at all costs.") - log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") + log_reagent("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]") M.slurring = 100 M.confused = 100 E.phase = 4 @@ -292,19 +279,17 @@ Creating a chem with a low purity will make you permanently fall in love with so if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) return ..() if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) - var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers + var/list/seen = (M.fov_view(M.client?.view || world.view) - M) | viewers(M.client?.view || world.view, M) for(var/victim in seen) - if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (M.stat == DEAD) || (!isliving(victim))) - seen = seen - victim - if(seen.len == 0) + if((isanimal(victim)) || (!isliving(victim))) + seen -= victim + if(!length(seen)) return love = pick(seen) - if(!love) - return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) lewd = (M.client?.prefs.cit_toggles & HYPNO) && (love.client?.prefs.cit_toggles & HYPNO) to_chat(M, "[(lewd?"":"")][(lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") - log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") + log_reagent("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else if(get_dist(M, love) < 8) @@ -329,7 +314,7 @@ Creating a chem with a low purity will make you permanently fall in love with so SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") to_chat(M, "[(lewd?"":"")]Your feelings for [love] suddenly vanish!") - log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") + log_reagent("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) @@ -346,7 +331,7 @@ Creating a chem with a low purity will make you permanently fall in love with so Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love) forge_valentines_objective(Lover, Love, TRUE) SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have become infatuated.") - log_game("FERMICHEM: [Lover] ckey: [Lover.key] has been chemically made to fall for [Love] ckey: [Love.key]") + log_reagent("FERMICHEM: [Lover] ckey: [Lover.key] has been chemically made to fall for [Love] ckey: [Love.key]") return //For addiction see chem.dm diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 5f9ea5924d..37ec1ee69f 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -52,6 +52,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING inverse_chem_val = 0.5 inverse_chem = /datum/reagent/impure/SDZF can_synth = TRUE + value = REAGENT_VALUE_RARE //Main SDGF chemical @@ -63,7 +64,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(pollStarted == FALSE) pollStarted = TRUE candies = pollGhostCandidates("Do you want and agree to play as a clone of [M], respect their character and not engage in ERP without permission from the original?", ignore_category = POLL_IGNORE_CLONE) - log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") + log_reagent("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") @@ -81,7 +82,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(C2.key && C2) C2.transfer_ckey(SM, FALSE) message_admins("Ghost candidate found! [C2] key [C2.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)") - log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]") + log_reagent("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]") break else candies -= C2 @@ -96,34 +97,34 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE) ZI.Remove() ZI.Insert(SM) - log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") + log_reagent("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.") if(prob(50)) to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.") - log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") + log_reagent("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") else to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.") - log_game("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.") + log_reagent("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.") to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.") M.visible_message("[M] suddenly shudders, and splits into two identical twins!") - SM.copy_known_languages_from(M, FALSE) + SM.copy_languages(M, LANGUAGE_MIND) playerClone = TRUE M.next_move_modifier = 1 - M.nutrition -= 500 + M.adjust_nutrition(-500) //Damage the clone SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2 SM.adjustCloneLoss(60, 0) SM.setOrganLoss(ORGAN_SLOT_BRAIN, 40) - SM.nutrition = startHunger/2 + SM.set_nutrition(startHunger/2) //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger. SM.reagents.add_reagent(/datum/reagent/fermi/SDGFheal, volume) M.reagents.remove_reagent(type, volume) - log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") + log_reagent("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made") return ..() @@ -134,7 +135,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(21) to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF). REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") + log_reagent("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF") if(22 to INFINITY) M.adjustCloneLoss(-1, 0) M.adjustBruteLoss(-1, 0) @@ -146,23 +147,23 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING if(21) to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") if(22 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) + M.adjust_nutrition(M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") if(31 to 49) - M.nutrition = M.nutrition + (M.nutrition/5) + M.adjust_nutrition(M.nutrition/5) if(50) to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!! //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies if(51 to 79) - M.nutrition = M.nutrition + (M.nutrition/2) + M.adjust_nutrition(M.nutrition/2) if(80) to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...") if (M.nutrition < 20000) - M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI + M.set_nutrition(20000) //https://www.youtube.com/watch?v=Bj_YLenOlZI if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done. - M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE + M.set_nutrition(15)//YOU BEST BE EATTING AFTER THIS YOU CUTIE M.next_move_modifier -= 4 to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.") @@ -181,7 +182,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.originalmind = M.mind S.status_set = TRUE - log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") + log_reagent("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Braindead clones made") if(87 to INFINITY) M.reagents.remove_reagent(type, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing. @@ -203,7 +204,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.heal_bodypart_damage(1,1) M.next_move_modifier = 1 if (M.nutrition < 1500) - M.nutrition += 250 + M.adjust_nutrition(250) else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing. unitCheck = FALSE to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") @@ -212,7 +213,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.blood_volume += 100 M.next_move_modifier = 1 if (M.nutrition < 1500) - M.nutrition += 500 + M.adjust_nutrition(500) /datum/reagent/fermi/SDGF/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume) if(volume<5) @@ -244,7 +245,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/1.5 SM.adjustCloneLoss((bodydamage/10), 0) SM.setOrganLoss(ORGAN_SLOT_BRAIN, (bodydamage/10)) - SM.nutrition = 400 + SM.adjust_nutrition(400) if(bodydamage>200) SM.gain_trauma_type(BRAIN_TRAUMA_MILD) if(bodydamage>300) @@ -284,7 +285,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.blood_volume += 10 M.adjustCloneLoss(-2, 0) M.setOrganLoss(ORGAN_SLOT_BRAIN, -1) - M.nutrition += 10 + M.adjust_nutrition(10) ..() //Unobtainable, used if SDGF is impure but not too impure @@ -309,6 +310,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING can_synth = TRUE taste_description = "a weird chemical fleshy flavour" chemical_flags = REAGENT_SNEAKYNAME + value = REAGENT_VALUE_RARE /datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead. switch(current_cycle)//Pretends to be normal @@ -316,27 +318,27 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.") startHunger = M.nutrition if(21 to 29) - M.nutrition = M.nutrition + (M.nutrition/10) + M.adjust_nutrition(M.nutrition/10) if(30) to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.") if(31 to 49) - M.nutrition = M.nutrition + (M.nutrition/5) + M.adjust_nutrition(M.nutrition/5) if(50) to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.") M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!! if(51 to 73) - M.nutrition = M.nutrition + (M.nutrition/2) + M.adjust_nutrition(M.nutrition/2) if(74) to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...") if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low. - M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI + M.set_nutrition(20000) //https://www.youtube.com/watch?v=Bj_YLenOlZI if(75 to 85) M.adjustToxLoss(1, 0)// the warning! if(86)//mean clone time! if (!M.reagents.has_reagent(/datum/reagent/medicine/pen_acid))//Counterplay is pent.) message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!") - M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE + M.set_nutrition(startHunger - 500) //YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE M.next_move_modifier = 1 to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.") M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!") @@ -347,12 +349,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.real_name = M.real_name//Give your offspring a big old kiss. ZI.name = M.real_name ZI.desc = "[M]'s clone, gone horribly wrong." - log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead") + log_reagent("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead") M.reagents.remove_reagent(type, 20) else//easier to deal with to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!") - M.nutrition = startHunger - 500 + M.set_nutrition(startHunger - 500) var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) S.name = "Living teratoma" @@ -360,7 +362,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING S.rabid = 1//Make them an angery boi M.reagents.remove_reagent(type, volume) to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...") - log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") + log_reagent("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Zombie clones made!") if(87 to INFINITY) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index a8ac66ef20..bdc599a5e2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -30,6 +30,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die inverse_chem_val = 0.25 can_synth = FALSE var/datum/action/chem/astral/AS = new/datum/action/chem/astral() + value = REAGENT_VALUE_AMAZING /datum/action/chem/astral name = "Return to body" @@ -66,7 +67,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die M.alpha = 255 if(current_cycle == 0) originalmind = M.mind - log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost") + log_reagent("FERMICHEM: [M] ckey: [M.key] became an astral ghost") origin = M if (G == null) G = new(get_turf(M.loc)) @@ -99,29 +100,25 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die ..() /datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M) - if(!G) - if(M.mind) - var/mob/living/simple_animal/astral/G2 = new(get_turf(M.loc)) - M.mind.transfer_to(G2)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. - to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") - log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!") - if(!G2.mind) - qdel(G2) - originalmind.transfer_to(M) - else if(G.mind) - G.mind.transfer_to(origin) - qdel(G) + if(!(G?.mind)) + if(!G) + qdel(G) + return ..() + if(M.mind) //Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end. + var/mob/living/simple_animal/astral/G2 = new(get_turf(M)) + M.mind.transfer_to(G2) + to_chat(G2, "[M]'s conciousness snaps back to them as [M.p_their()] astrogen runs out, kicking your projected mind out!'") + log_reagent("FERMICHEM: [G2.mind.name] has been booted out of [M] as their original mind came back as the Astrogen reagent ran out!") + G.mind.transfer_to(origin) + qdel(G) if(overdosed) to_chat(M, "The high volume of astrogen you just took causes you to black out momentarily as your mind snaps back to your body.") M.Sleeping(sleepytime, 0) antiGenetics = 255 - if(G)//just in case - qdel(G) - log_game("FERMICHEM: [M] has astrally returned to their body!") + log_reagent("FERMICHEM: [M] has astrally returned to their body!") if(M.mind && M.mind == originalmind) M.remove_status_effect(/datum/status_effect/chem/astral_insurance) - //AS.Remove(M) - ..() + return ..() //Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this. /datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M) @@ -136,7 +133,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?") M.alpha-- antiGenetics-- - log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen") + log_reagent("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen") if(220) to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?") M.alpha-- @@ -171,5 +168,5 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral obliterations") qdel(M) //Approx 60minutes till death from initial addiction - log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") + log_reagent("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction") ..() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm index e0b7a6fa14..40077cd02a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm @@ -29,6 +29,7 @@ var/teleBool = FALSE pH = 3.7 can_synth = TRUE + value = REAGENT_VALUE_EXCEPTIONAL /datum/reagent/fermi/eigenstate/on_new(list/data) location_created = data["location_created"] @@ -36,7 +37,7 @@ //Main functions /datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry! if(current_cycle == 0) - log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium") + log_reagent("FERMICHEM: [M] ckey: [M.key] took eigenstasium") //make hologram at return point Eigenstate = new(loc) @@ -54,7 +55,7 @@ if(cached_purity > 0.9) //Teleports you home if it's pure enough if(!location_created && data) //Just in case location_created = data["location_created"] - log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") + log_reagent("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium") do_sparks(5,FALSE,M) do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg') do_sparks(5,FALSE,M) @@ -77,7 +78,7 @@ /datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly . = ..() to_chat(M, "Oh god, you feel like your wavefunction is about to tear.") - log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") + log_reagent("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium") M.Jitter(20) metabolization_rate += 0.5 //So you're not stuck forever teleporting. @@ -91,9 +92,9 @@ /datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride. if(addiction_stage == 1) to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.") - log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") + log_reagent("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium") M.Jitter(10) - M.nutrition = M.nutrition - (M.nutrition/15) + M.adjust_nutrition(-M.nutrition/15) ..() /datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M) @@ -157,7 +158,7 @@ M.DefaultCombatKnockdown(100) to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself.") M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") + log_reagent("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.") M.reagents.remove_all_type(/datum/reagent, 100, 0, 1) /* for(var/datum/mood_event/Me in M) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 28a776082f..7403de6215 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -29,6 +29,7 @@ inverse_chem_val = 0.35 inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse can_synth = FALSE + value = REAGENT_VALUE_VERY_RARE var/message_spam = FALSE /datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M) @@ -54,25 +55,25 @@ return..() var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) //If they've opted out, then route processing though liver. if(!(H.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) if(L) - L.swelling += 0.05 + L.applyOrganDamage(0.25) else H.adjustToxLoss(1) return..() + var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) //otherwise proceed as normal if(!B) //If they don't have breasts, give them breasts. B = new if(H.dna.species.use_skintones && H.dna.features["genitals_use_skintone"]) - B.color = skintone2hex(H.skin_tone) + B.color = SKINTONE2HEX(H.skin_tone) else if(M.dna.features["breasts_color"]) B.color = "#[M.dna.features["breasts_color"]]" else - B.color = skintone2hex(H.skin_tone) + B.color = SKINTONE2HEX(H.skin_tone) B.size = "flat" B.cached_size = 0 B.prev_size = 0 @@ -95,7 +96,8 @@ /datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. if(!(M.client?.prefs.cit_toggles & FORCED_FEM)) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling+= 0.05 + if(L) + L.applyOrganDamage(0.25) return ..() var/obj/item/organ/genital/penis/P = M.getorganslot(ORGAN_SLOT_PENIS) @@ -125,12 +127,14 @@ taste_description = "a milky ice cream like flavour." metabolization_rate = 0.25 can_synth = FALSE + value = REAGENT_VALUE_RARE /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) if(!(M.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) || !B) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling-= 0.05 + if(L) + L.applyOrganDamage(-0.25) return ..() B.modify_size(-0.05) return ..() @@ -184,6 +188,7 @@ inverse_chem_val = 0.35 inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead. can_synth = FALSE + value = REAGENT_VALUE_VERY_RARE var/message_spam = FALSE /datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M) @@ -208,14 +213,14 @@ if(!ishuman(M)) return ..() var/mob/living/carbon/human/H = M - var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT)) var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) if(L) - L.swelling += 0.05 + L.applyOrganDamage(0.25) else H.adjustToxLoss(1) return ..() + var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) //otherwise proceed as normal if(!P)//They do have a preponderance for escapism, or so I've heard. @@ -241,7 +246,8 @@ return ..() if(!(M.client?.prefs.cit_toggles & FORCED_MASC)) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling+= 0.05 + if(L) + L.applyOrganDamage(0.25) return..() var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) @@ -270,6 +276,7 @@ taste_description = "chinese dragon powder" metabolization_rate = 0.5 can_synth = FALSE + value = REAGENT_VALUE_RARE /datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M) if(!ishuman(M)) @@ -278,7 +285,8 @@ var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT) || !P) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling-= 0.05 + if(L) + L.applyOrganDamage(-0.25) return..() P.modify_size(-0.1) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index dac6d97eef..56ad24c599 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -98,10 +98,8 @@ M.emote("cough") var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush)) new P(T) - to_chat(M, "You feel a lump form in your throat, as you suddenly cough up what seems to be a hairball?") - var/list/seen = viewers(8, T) - for(var/mob/S in seen) - to_chat(S, "[M] suddenly coughs up a [P.name]!") + M.visible_message("[M] suddenly coughs up a [P.name]!",\ + "You feel a lump form in your throat, as you suddenly cough up what seems to be a hairball?") var/T2 = get_random_station_turf() P.throw_at(T2, 8, 1) ..() @@ -120,10 +118,10 @@ to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") if(prob(20)) - var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + var/list/seen = M.fov_view() - M //Sound and sight checkers for(var/victim in seen) - if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) - seen = seen - victim + if(isanimal(victim) || !isliving(victim)) + seen -= victim if(LAZYLEN(seen)) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") if(16) @@ -141,10 +139,10 @@ to_chat(M, "You find yourself unable to supress the desire to howl!") M.emote("awoo") if(prob(5)) - var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers + var/list/seen = M.fov_view() - M //Sound and sight checkers for(var/victim in seen) - if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim))) - seen = seen - victim + if(isanimal(victim) || !isliving(victim)) + seen -= victim if(LAZYLEN(seen)) to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]") ..() @@ -158,9 +156,38 @@ to_chat(M, "You feel your tongue.... unfluffify...?") M.say("Pleh!") else - log_game("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent") + log_reagent("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent") +//////////////////////////////////////////////////////////////////////////////////////////////////// +// PLUSHMIUM +/////////////////////////////////////////////////////////////////////////////////////////////////// +//A chemical you can spray on plushies to turn them into a 'shell' +//Hugging the plushie turns yourself into the plushie! +/datum/reagent/fermi/plushmium + name = "Plushmium" + description = "A strange chemical, seeming almost fluffy, if it were not for it being a liquid. Known to have a strange effect on plushies." + color = "#fbcbd7" + taste_description = "the soft feeling of a plushie" + pH = 5 + value = 50 + can_synth = TRUE + +/datum/reagent/fermi/plushmium/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/toy/plush) && reac_volume >= 5) + O.loc.visible_message("The plushie seems to be staring back at you.") + var/obj/item/toy/plushie_shell/new_shell = new /obj/item/toy/plushie_shell(O.loc) + new_shell.name = O.name + new_shell.icon = O.icon + new_shell.icon_state = O.icon_state + new_shell.stored_plush = O + O.forceMove(new_shell) + +//Extra interaction for which spraying it on an existing sentient plushie aheals them, so they can be revived! +/datum/reagent/fermi/plushmium/reaction_mob(mob/living/M, method=TOUCH, reac_volume) + if(istype(M, /mob/living/simple_animal/pet/plushie) && reac_volume >= 1) + M.revive(full_heal = 1, admin_revive = 1) + /////////////////////////////////////////////////////////////////////////////////////////////// //Nanite removal //Writen by Trilby!! Embellsished a little by me. @@ -301,9 +328,8 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) else var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.type] Ferm.on_reaction(holder, reagent.volume) - for(var/mob/M in viewers(8, location)) - to_chat(M, "The solution reacts dramatically, with a meow!") - playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1) + holder.my_atom.visible_message("The solution reacts dramatically, with a meow!") + playsound(holder.my_atom, 'modular_citadel/sound/voice/merowr.ogg', 50, 1) holder.clear_reagents() /datum/reagent/fermi/acidic_buffer @@ -321,10 +347,8 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) if(LAZYLEN(holder.reagent_list) == 1) return ..() holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) - var/list/seen = viewers(5, get_turf(holder)) - for(var/mob/M in seen) - to_chat(M, "The beaker fizzes as the pH changes!") - playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) + holder.my_atom.visible_message("The beaker fizzes as the pH changes!") + playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(type, volume, ignore_pH = TRUE) ..() @@ -342,10 +366,8 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) if(LAZYLEN(holder.reagent_list) == 1) return ..() holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume)) - var/list/seen = viewers(5, get_turf(holder)) - for(var/mob/M in seen) - to_chat(M, "The beaker froths as the pH changes!") - playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1) + holder.my_atom.visible_message("The beaker froths as the pH changes!") + playsound(holder.my_atom, 'sound/FermiChem/bufferadd.ogg', 50, 1) holder.remove_reagent(type, volume, ignore_pH = TRUE) ..() @@ -381,7 +403,7 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) catto.color = "#[H.dna.features["mcolor"]]" catto.pseudo_death = TRUE H.forceMove(catto) - log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") + log_reagent("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.") SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats") if(H.InCritical()) perma = TRUE @@ -415,7 +437,7 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) H.say("*wag")//force update sprites. to_chat(H, "[words]") qdel(catto) - log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal") + log_reagent("FERMICHEM: [H] ckey: [H.key] has returned to normal") /datum/reagent/fermi/secretcatchem/reaction_mob(var/mob/living/L) @@ -424,7 +446,7 @@ datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume) if(catto.origin) var/mob/living/carbon/human/H = catto.origin H.stat = CONSCIOUS - log_game("FERMICHEM: [catto] ckey: [catto.key] has returned to normal.") + log_reagent("FERMICHEM: [catto] ckey: [catto.key] has returned to normal.") to_chat(catto, "Your body shifts back to normal!") H.forceMove(catto.loc) catto.mind.transfer_to(H) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm index d98ec7059d..ca6bb302da 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm @@ -9,6 +9,7 @@ inverse_chem_val = 0.4 inverse_chem = /datum/reagent/impure/yamerol_tox can_synth = TRUE + value = REAGENT_VALUE_VERY_RARE /datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C) var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE) @@ -100,6 +101,7 @@ data = list("grown_volume" = 0, "injected_vol" = 0) var/borrowed_health color = "#FFDADA" + value = REAGENT_VALUE_COMMON /datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) @@ -195,3 +197,25 @@ M.stat = DEAD M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.") //NEEDS ON_MOB_DEAD() + +/datum/reagent/fermi/zeolites + name = "Artificial Zeolites" + description = "Lab made Zeolite, used to clear radiation form people and items alike! Splashing just a small amounts(5u) onto any item can clear away large amouts of contamination." + pH = 8 + color = "#FFDADA" + metabolization_rate = 8 * REAGENTS_METABOLISM //Lastes not long in body but heals a lot! + value = REAGENT_VALUE_COMMON + +/datum/reagent/fermi/zeolites/on_mob_life(mob/living/carbon/M) + var/datum/component/radioactive/contamination = M.GetComponent(/datum/component/radioactive) + if(M.radiation > 0) + M.radiation -= min(M.radiation, 60) + if(contamination.strength > 0) + contamination.strength -= min(contamination.strength, 100) + ..() + +/datum/reagent/fermi/zeolites/reaction_obj(obj/O, reac_volume) + var/datum/component/radioactive/contamination = O.GetComponent(/datum/component/radioactive) + if(contamination && reac_volume >= 5) + qdel(contamination) + return diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm deleted file mode 100644 index 87f9d71ce2..0000000000 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/reagent/syndicateadrenals - name = "Syndicate Adrenaline" - description = "Regenerates your stamina and increases your reaction time." - color = "#E62111" - overdose_threshold = 6 - -/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M) - M.adjustStaminaLoss(-5*REM) - . = ..() - -/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M) - . = ..() - if(istype(M)) - M.next_move_modifier *= 0.5 - to_chat(M, "You feel an intense surge of energy rushing through your veins.") - -/datum/reagent/syndicateadrenals/on_mob_end_metabolize(mob/living/M) - . = ..() - if(istype(M)) - M.next_move_modifier *= 2 - to_chat(M, "You feel as though the world around you is going faster.") - -/datum/reagent/syndicateadrenals/overdose_start(mob/living/M) - to_chat(M, "You feel an intense pain in your chest...") - return - -/datum/reagent/syndicateadrenals/overdose_process(mob/living/M) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.undergoing_cardiac_arrest()) - C.set_heartattack(TRUE) - return diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index eb93d273a7..b2c80e4a16 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -95,7 +95,7 @@ if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less) ImpureTot *= volume - var/empVol = CLAMP (volume/10, 0, 15) + var/empVol = clamp(volume/10, 0, 15) empulse(T, empVol, ImpureTot/10, 1) my_atom.reagents.clear_reagents() //just in case @@ -172,9 +172,7 @@ S.rabid = 1//Make them an angery boi S.color = "#810010" my_atom.reagents.clear_reagents() - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The cells clump up into a horrifying tumour!") + my_atom.visible_message("An horrifying tumoural mass forms in [my_atom]!") /datum/chemical_reaction/fermi/breast_enlarger name = "Sucubus milk" @@ -211,9 +209,7 @@ /datum/chemical_reaction/fermi/breast_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom)) - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!") + my_atom.visible_message("The reaction suddenly condenses, creating a pair of breasts!") var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list B.size = ((BE.volume * BE.purity) / 10) //half as effective. my_atom.reagents.clear_reagents() @@ -243,9 +239,7 @@ /datum/chemical_reaction/fermi/penis_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(get_turf(my_atom)) - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The reaction suddenly condenses, creating a penis!") + my_atom.visible_message("The reaction suddenly condenses, creating a penis!") var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list P.length = ((PE.volume * PE.purity) / 10)//half as effective. my_atom.reagents.clear_reagents() @@ -383,9 +377,7 @@ for(var/i in 1 to amount_to_spawn) var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom)) hat.animate_atom_living() - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!") + my_atom.visible_message("The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!") my_atom.reagents.clear_reagents() /datum/chemical_reaction/fermi/furranium @@ -488,6 +480,33 @@ RateUpLim = 15 FermiChem = TRUE +/datum/chemical_reaction/fermi/plushmium // done + name = "Plushification serum" + id = /datum/reagent/fermi/plushmium + results = list(/datum/reagent/fermi/plushmium = 5) + required_reagents = list(/datum/reagent/medicine/strange_reagent = 5, /datum/reagent/drug/happiness = 3, /datum/reagent/blood = 10, /datum/reagent/consumable/laughter = 5, /datum/reagent/toxin/bad_food = 6) + //mix_message = "" + //FermiChem vars: + OptimalTempMin = 400 + OptimalTempMax = 666 + ExplodeTemp = 800 + OptimalpHMin = 2 + OptimalpHMax = 5 + ReactpHLim = 6 + //CatalystFact = 0 //To do 1 + CurveSharpT = 8 + CurveSharppH = 0.5 + ThermicConstant = -2 + HIonRelease = -0.1 + RateUpLim = 2 + FermiChem = TRUE + FermiExplode = TRUE + PurityMin = 0.6 + +/datum/chemical_reaction/fermi/plushmium/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) + new /obj/item/toy/plush/random(get_turf(my_atom)) + my_atom.visible_message("The reaction suddenly zaps, creating a plushie!") + my_atom.reagents.clear_reagents() /datum/chemical_reaction/fermi/basic_buffer/FermiFinish(datum/reagents/holder, atom/my_atom) //might need this var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list @@ -543,9 +562,7 @@ /datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) var/mob/living/simple_animal/pet/cat/custom_cat/catto = new(get_turf(my_atom)) - var/list/seen = viewers(8, get_turf(my_atom)) - for(var/mob/M in seen) - to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! + my_atom.visible_message("The reaction suddenly gives out a meow, condensing into a chemcat!")//meow! playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1) catto.name = "Chemcat" catto.desc = "A cute chem cat, created by a lot of compicated and confusing chemistry!" @@ -571,3 +588,23 @@ HIonRelease = 0.1 RateUpLim = 2 FermiChem = TRUE + +/datum/chemical_reaction/fermi/zeolites + name = "Zeolites" + id = /datum/reagent/fermi/zeolites + results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! + required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/aluminium = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) + //FermiChem vars: + OptimalTempMin = 300 + OptimalTempMax = 900 + ExplodeTemp = 1000 //check to see overflow doesn't happen! + OptimalpHMin = 4.0 + OptimalpHMax = 6.0 + ReactpHLim = 4 + //CatalystFact = 0 + CurveSharpT = 4 + CurveSharppH = 0 + ThermicConstant = 0 + HIonRelease = 0.01 + RateUpLim = 15 + FermiChem = TRUE \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 4707d5b460..de4cb38360 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -5,7 +5,7 @@ name = "Synthetic hat" icon = 'icons/obj/clothing/hats.dmi' icon_state = "cowboy" - desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + desc = "A synthesized hat. You feel compelled to keep it on all times." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //item_flags = NODROP //Tips their hat! @@ -49,9 +49,8 @@ /obj/item/clothing/head/hattip/proc/root_and_toot(obj/item/clothing/head/hattip/hat) hat.animate_atom_living() - var/list/seen = viewers(6, get_turf(hat)) - for(var/mob/M2 in seen) - to_chat(M2, "[hat] exclaims, \"[pick("Whooee! Time for a hootenanny!", "Rough 'em up boys!", "Yeehaw! Freedom at last!", "Y'all about to get a good old fashioned spanking!")]\"") + var/mob/living/simple_animal/hostile/mimic/M = loc + M.say(pick("Whooee! Time for a hootenanny!", "Rough 'em up boys!", "Yeehaw! Freedom at last!", "Y'all about to get a good old fashioned spanking!")) /obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args) var/message = speech_args[SPEECH_MESSAGE] diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm index 5d207f4c73..1924e7ee00 100644 --- a/modular_citadel/code/modules/reagents/objects/items.dm +++ b/modular_citadel/code/modules/reagents/objects/items.dm @@ -54,7 +54,6 @@ to_chat(user, "[src] is empty!") add_fingerprint(user) return - ..() /obj/item/fermichem/pHpaper name = "pH indicator strip" diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm deleted file mode 100644 index 41eccb7054..0000000000 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ /dev/null @@ -1,243 +0,0 @@ -//body bluids -/datum/reagent/consumable/semen - name = "Semen" - description = "Sperm from some animal. Useless for anything but insemination, really." - taste_description = "something salty" - taste_mult = 2 //Not very overpowering flavor - data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) - reagent_state = LIQUID - color = "#FFFFFF" // rgb: 255, 255, 255 - can_synth = FALSE - nutriment_factor = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) - if(!istype(T)) - return - if(reac_volume < 10) - return - - var/obj/effect/decal/cleanable/semen/S = locate() in T - if(!S) - S = new(T) - if(data["blood_DNA"]) - S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) - -/obj/effect/decal/cleanable/semen - name = "semen" - desc = null - gender = PLURAL - density = 0 - layer = ABOVE_NORMAL_TURF_LAYER - icon = 'modular_citadel/icons/obj/genitals/effects.dmi' - icon_state = "semen1" - random_icon_states = list("semen1", "semen2", "semen3", "semen4") - -/obj/effect/decal/cleanable/semen/Initialize(mapload) - . = ..() - dir = GLOB.cardinals - add_blood_DNA(list("Non-human DNA" = "A+")) - -/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) - if(S.blood_DNA) - blood_DNA |= S.blood_DNA - return ..() - -/datum/reagent/consumable/femcum - name = "Female Ejaculate" - description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business." - taste_description = "something with a tang" // wew coders who haven't eaten out a girl. - taste_mult = 2 - data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) - reagent_state = LIQUID - color = "#AAAAAA77" - can_synth = FALSE - nutriment_factor = 0.5 * REAGENTS_METABOLISM - -/obj/effect/decal/cleanable/femcum - name = "female ejaculate" - desc = null - gender = PLURAL - density = 0 - layer = ABOVE_NORMAL_TURF_LAYER - icon = 'modular_citadel/icons/obj/genitals/effects.dmi' - icon_state = "fem1" - random_icon_states = list("fem1", "fem2", "fem3", "fem4") - blood_state = null - bloodiness = null - -/obj/effect/decal/cleanable/femcum/Initialize(mapload) - . = ..() - dir = GLOB.cardinals - add_blood_DNA(list("Non-human DNA" = "A+")) - -/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) - if(F.blood_DNA) - blood_DNA |= F.blood_DNA - return ..() - -/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) - if(!istype(T)) - return - if(reac_volume < 10) - return - - var/obj/effect/decal/cleanable/femcum/S = locate() in T - if(!S) - S = new(T) - if(data["blood_DNA"]) - S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) - -//aphrodisiac & anaphrodisiac - -/datum/reagent/drug/aphrodisiac - name = "Crocin" - description = "Naturally found in the crocus and gardenia flowers, this drug acts as a natural and safe aphrodisiac." - taste_description = "strawberry roofies" - taste_mult = 2 //Hide the roofies in stronger flavors - color = "#FFADFF"//PINK, rgb(255, 173, 255) - -/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) - if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if((prob(min(current_cycle/2,5)))) - M.emote(pick("moan","blush")) - if(prob(min(current_cycle/4,10))) - var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") - to_chat(M, "[aroused_message]") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/list/genits = H.adjust_arousal(current_cycle, aphro = TRUE) // redundant but should still be here - for(var/g in genits) - var/obj/item/organ/genital/G = g - to_chat(M, "[G.arousal_verb]!") - ..() - -/datum/reagent/drug/aphrodisiacplus - name = "Hexacrocin" - description = "Chemically condensed form of basic crocin. This aphrodisiac is extremely powerful and addictive in most animals.\ - Addiction withdrawals can cause brain damage and shortness of breath. Overdosage can lead to brain damage and a \ - permanent increase in libido (commonly referred to as 'bimbofication')." - taste_description = "liquid desire" - color = "#FF2BFF"//dark pink - addiction_threshold = 20 - overdose_threshold = 20 - -/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if(prob(5)) - if(prob(current_cycle)) - M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn...")) - else - M.emote(pick("moan","blush")) - if(prob(5)) - var/aroused_message - if(current_cycle>25) - aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") - else - aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") - to_chat(M, "[aroused_message]") - REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/list/genits = H.adjust_arousal(100, aphro = TRUE) // redundant but should still be here - for(var/g in genits) - var/obj/item/organ/genital/G = g - to_chat(M, "[G.arousal_verb]!") - ..() - -/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) - if(prob(30)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) - ..() -/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M) - if(prob(30)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3) - - ..() -/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M) - if(prob(30)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4) - ..() - -/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) - if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) - if(!HAS_TRAIT(M,TRAIT_PERMABONER)) - to_chat(M, "Your libido is going haywire!") - ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) - ..() - -/datum/reagent/drug/anaphrodisiac - name = "Camphor" - description = "Naturally found in some species of evergreen trees, camphor is a waxy substance. When injested by most animals, it acts as an anaphrodisiac\ - , reducing libido and calming them. Non-habit forming and not addictive." - taste_description = "dull bitterness" - taste_mult = 2 - color = "#D9D9D9"//rgb(217, 217, 217) - reagent_state = SOLID - -/datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M) - if(M && M.client?.prefs.arousable && prob(16)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/list/genits = H.adjust_arousal(-100, aphro = TRUE) - if(genits.len) - to_chat(M, "You no longer feel aroused.") - ..() - -/datum/reagent/drug/anaphrodisiacplus - name = "Hexacamphor" - description = "Chemically condensed camphor. Causes an extreme reduction in libido and a permanent one if overdosed. Non-addictive." - taste_description = "tranquil celibacy" - color = "#D9D9D9"//rgb(217, 217, 217) - reagent_state = SOLID - overdose_threshold = 20 - -/datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.client?.prefs.arousable) - REMOVE_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/list/genits = H.adjust_arousal(-100, aphro = TRUE) - if(genits.len) - to_chat(M, "You no longer feel aroused.") - - ..() - -/datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M) - if(M && M.client?.prefs.arousable && prob(5)) - to_chat(M, "You feel like you'll never feel aroused again...") - ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) - ..() - -//recipes -/datum/chemical_reaction/aphro - name = "crocin" - id = /datum/reagent/drug/aphrodisiac - results = list(/datum/reagent/drug/aphrodisiac = 6) - required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/water = 1) - required_temp = 400 - mix_message = "The mixture boils off a pink vapor..."//The water boils off, leaving the crocin - -/datum/chemical_reaction/aphroplus - name = "hexacrocin" - id = /datum/reagent/drug/aphrodisiacplus - results = list(/datum/reagent/drug/aphrodisiacplus = 1) - required_reagents = list(/datum/reagent/drug/aphrodisiac = 6, /datum/reagent/phenol = 1) - required_temp = 400 - mix_message = "The mixture rapidly condenses and darkens in color..." - -/datum/chemical_reaction/anaphro - name = "camphor" - id = /datum/reagent/drug/anaphrodisiac - results = list(/datum/reagent/drug/anaphrodisiac = 6) - required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2, /datum/reagent/sulfur = 1) - required_temp = 400 - mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor - -/datum/chemical_reaction/anaphroplus - name = "pentacamphor" - id = /datum/reagent/drug/anaphrodisiacplus - results = list(/datum/reagent/drug/anaphrodisiacplus = 1) - required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1) - required_temp = 300 - mix_message = "The mixture thickens and heats up slighty..." diff --git a/modular_citadel/icons/mob/citadel/uniforms.dmi b/modular_citadel/icons/mob/citadel/uniforms.dmi index 0a82392960..5f3b9a5fb7 100644 Binary files a/modular_citadel/icons/mob/citadel/uniforms.dmi and b/modular_citadel/icons/mob/citadel/uniforms.dmi differ diff --git a/modular_citadel/icons/mob/clothing/turtlenecks.dmi b/modular_citadel/icons/mob/clothing/turtlenecks.dmi deleted file mode 100644 index 857033fdce..0000000000 Binary files a/modular_citadel/icons/mob/clothing/turtlenecks.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/inhands/stunsword_left.dmi b/modular_citadel/icons/mob/inhands/stunsword_left.dmi index 0ecc02d31a..02dfe2b915 100644 Binary files a/modular_citadel/icons/mob/inhands/stunsword_left.dmi and b/modular_citadel/icons/mob/inhands/stunsword_left.dmi differ diff --git a/modular_citadel/icons/mob/inhands/stunsword_right.dmi b/modular_citadel/icons/mob/inhands/stunsword_right.dmi index 76fa4d57c9..50e76d660b 100644 Binary files a/modular_citadel/icons/mob/inhands/stunsword_right.dmi and b/modular_citadel/icons/mob/inhands/stunsword_right.dmi differ diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index a81e6c03b2..a3f09819f2 100644 Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index d91f15a3f7..a67c1b718c 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ diff --git a/modular_citadel/icons/mob/mam_taur.dmi b/modular_citadel/icons/mob/mam_taur.dmi index db1f001fae..cf332019af 100644 Binary files a/modular_citadel/icons/mob/mam_taur.dmi and b/modular_citadel/icons/mob/mam_taur.dmi differ diff --git a/modular_citadel/icons/obj/clothing/turtlenecks.dmi b/modular_citadel/icons/obj/clothing/turtlenecks.dmi deleted file mode 100644 index ec37880cd2..0000000000 Binary files a/modular_citadel/icons/obj/clothing/turtlenecks.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/food/food.dmi b/modular_citadel/icons/obj/food/food.dmi deleted file mode 100644 index da9a6c365f..0000000000 Binary files a/modular_citadel/icons/obj/food/food.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi deleted file mode 100644 index e8efbec216..0000000000 Binary files a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/guns/pumpactionblaster.dmi b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi index 363faf3c57..aed4d49956 100644 Binary files a/modular_citadel/icons/obj/guns/pumpactionblaster.dmi and b/modular_citadel/icons/obj/guns/pumpactionblaster.dmi differ diff --git a/modular_citadel/icons/obj/items_and_weapons.dmi b/modular_citadel/icons/obj/items_and_weapons.dmi deleted file mode 100644 index 3b1d894d96..0000000000 Binary files a/modular_citadel/icons/obj/items_and_weapons.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/objects.dmi b/modular_citadel/icons/obj/objects.dmi deleted file mode 100644 index 55a6867303..0000000000 Binary files a/modular_citadel/icons/obj/objects.dmi and /dev/null differ diff --git a/modular_citadel/icons/obj/stunsword.dmi b/modular_citadel/icons/obj/stunsword.dmi deleted file mode 100644 index bfe4b45cd9..0000000000 Binary files a/modular_citadel/icons/obj/stunsword.dmi and /dev/null differ diff --git a/modular_citadel/icons/polyclothes/item/neck.dmi b/modular_citadel/icons/polyclothes/item/neck.dmi deleted file mode 100644 index e2792cf9d0..0000000000 Binary files a/modular_citadel/icons/polyclothes/item/neck.dmi and /dev/null differ diff --git a/modular_citadel/icons/polyclothes/mob/neck.dmi b/modular_citadel/icons/polyclothes/mob/neck.dmi deleted file mode 100644 index 529c64caa2..0000000000 Binary files a/modular_citadel/icons/polyclothes/mob/neck.dmi and /dev/null differ diff --git a/modular_citadel/icons/ui/screen_midnight.dmi b/modular_citadel/icons/ui/screen_midnight.dmi index a730c591ba..fc446a411c 100644 Binary files a/modular_citadel/icons/ui/screen_midnight.dmi and b/modular_citadel/icons/ui/screen_midnight.dmi differ diff --git a/modular_citadel/icons/ui/screen_operative.dmi b/modular_citadel/icons/ui/screen_operative.dmi index cb08f08ceb..9383b94718 100644 Binary files a/modular_citadel/icons/ui/screen_operative.dmi and b/modular_citadel/icons/ui/screen_operative.dmi differ diff --git a/modular_citadel/icons/ui/screen_plasmafire.dmi b/modular_citadel/icons/ui/screen_plasmafire.dmi index 5f8cd9d93c..97e577c7bd 100644 Binary files a/modular_citadel/icons/ui/screen_plasmafire.dmi and b/modular_citadel/icons/ui/screen_plasmafire.dmi differ diff --git a/modular_citadel/icons/ui/screen_slimecore.dmi b/modular_citadel/icons/ui/screen_slimecore.dmi index f2f0c88782..8f45ff3f76 100644 Binary files a/modular_citadel/icons/ui/screen_slimecore.dmi and b/modular_citadel/icons/ui/screen_slimecore.dmi differ diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf deleted file mode 100644 index 025a53bdca..0000000000 --- a/modular_citadel/interface/skin.dmf +++ /dev/null @@ -1,314 +0,0 @@ -macro "default" - - -menu "menu" - elem - name = "&File" - command = "" - saved-params = "is-checked" - elem - name = "&Quick screenshot\tF2" - command = ".screenshot auto" - category = "&File" - saved-params = "is-checked" - elem - name = "&Save screenshot as...\tShift+F2" - command = ".screenshot" - category = "&File" - saved-params = "is-checked" - elem - name = "" - command = "" - category = "&File" - saved-params = "is-checked" - elem "reconnectbutton" - name = "&Reconnect" - command = ".reconnect" - category = "&File" - saved-params = "is-checked" - elem - name = "&Quit\tAlt-F4" - command = ".quit" - category = "&File" - saved-params = "is-checked" - elem - name = "&Help" - command = "" - saved-params = "is-checked" - elem - name = "&Admin Help\tF1" - command = "adminhelp" - category = "&Help" - saved-params = "is-checked" - elem - name = "&Hotkeys" - command = "hotkeys-help" - category = "&Help" - saved-params = "is-checked" - - -window "mainwindow" - elem "mainwindow" - type = MAIN - pos = 0,0 - size = 640x440 - anchor1 = none - anchor2 = none - background-color = #242424 - is-default = true - saved-params = "pos;size;is-minimized;is-maximized" - icon = 'icons\\ss13_64.png' - macro = "default" - menu = "menu" - elem "split" - type = CHILD - pos = 0,0 - size = 637x440 - anchor1 = 0,0 - anchor2 = 100,100 - background-color = #272727 - saved-params = "splitter" - left = "mapwindow" - right = "infowindow" - is-vert = true - splitter = 75 - elem "asset_cache_browser" - type = BROWSER - pos = 0,0 - size = 200x200 - anchor1 = none - anchor2 = none - background-color = #272727 - is-visible = false - saved-params = "" - elem "tooltip" - type = BROWSER - pos = 0,0 - size = 999x999 - anchor1 = none - anchor2 = none - background-color = #272727 - is-visible = false - saved-params = "" - -window "mapwindow" - elem "mapwindow" - type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - elem "map" - type = MAP - pos = 0,0 - size = 640x480 - anchor1 = 0,0 - anchor2 = 100,100 - font-family = "Arial" - font-size = 7 - is-default = true - saved-params = "icon-size" - zoom-mode = distort - -window "infowindow" - elem "infowindow" - type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - background-color = #242424 - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - elem "info" - type = CHILD - pos = 0,30 - size = 640x445 - anchor1 = 0,0 - anchor2 = 100,100 - background-color = #272727 - saved-params = "splitter" - left = "statwindow" - right = "outputwindow" - is-vert = false - elem "changelog" - type = BUTTON - pos = 16,5 - size = 104x20 - anchor1 = 3,0 - anchor2 = 19,0 - text-color = #e0e0e0 - background-color = #40628a - saved-params = "is-checked" - text = "Changelog" - command = "changelog" - elem "rules" - type = BUTTON - pos = 120,5 - size = 100x20 - anchor1 = 19,0 - anchor2 = 34,0 - text-color = #e0e0e0 - background-color = #40628a - saved-params = "is-checked" - text = "Rules" - command = "rules" - elem "wiki" - type = BUTTON - pos = 220,5 - size = 100x20 - anchor1 = 34,0 - anchor2 = 50,0 - text-color = #e0e0e0 - background-color = #40628a - saved-params = "is-checked" - text = "Wiki" - command = "wiki" - elem "forum" - type = BUTTON - pos = 320,5 - size = 100x20 - anchor1 = 50,0 - anchor2 = 66,0 - text-color = #e0e0e0 - background-color = #40628a - saved-params = "is-checked" - text = "Forum" - command = "forum" - elem "github" - type = BUTTON - pos = 420,5 - size = 100x20 - anchor1 = 66,0 - anchor2 = 81,0 - text-color = #e0e0e0 - background-color = #40628a - saved-params = "is-checked" - text = "GitHub" - command = "github" - elem "report-issue" - type = BUTTON - pos = 520,5 - size = 100x20 - anchor1 = 81,0 - anchor2 = 97,0 - font-size = 8 - text-color = #e0e0e0 - background-color = #A92c2c - saved-params = "is-checked" - text = "Report Issue" - command = "report-issue" - -window "outputwindow" - elem "outputwindow" - type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - background-color = #272727 - saved-params = "pos;size;is-minimized;is-maximized" - titlebar = false - statusbar = false - can-close = false - can-minimize = false - can-resize = false - is-pane = true - elem "input" - type = INPUT - pos = 2,460 - size = 595x20 - anchor1 = 0,100 - anchor2 = 100,100 - background-color = #d3b5b5 - is-default = true - border = sunken - saved-params = "command" - elem "say" - type = BUTTON - pos = 600,460 - size = 37x20 - anchor1 = 100,100 - anchor2 = none - text-color = #e0e0e0 - background-color = #272727 - saved-params = "is-checked" - text = "Chat" - command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" - is-flat = true - button-type = pushbox - elem "browseroutput" - type = BROWSER - pos = 0,0 - size = 640x456 - anchor1 = 0,0 - anchor2 = 100,100 - background-color = #272727 - is-visible = false - is-disabled = true - saved-params = "" - auto-format = false - elem "output" - type = OUTPUT - pos = 0,0 - size = 640x456 - anchor1 = 0,0 - anchor2 = 100,100 - text-color = #e0e0e0 - background-color = #272727 - is-default = true - saved-params = "" - -window "statwindow" - elem "statwindow" - type = MAIN - pos = 281,0 - size = 640x480 - anchor1 = none - anchor2 = none - background-color = #242424 - saved-params = "pos;size;is-minimized;is-maximized" - is-pane = true - elem "stat" - type = INFO - pos = 0,0 - size = 640x480 - anchor1 = 0,0 - anchor2 = 100,100 - text-color = #e0e0e0 - background-color = #272727 - is-default = true - saved-params = "" - tab-text-color = #e0e0e0 - tab-background-color = #242424 - prefix-color = #e0e0e0 - suffix-color = #e0e0e0 - -window "preferences_window" - elem "preferences_window" - type = MAIN - pos = 372,0 - size = 1280x1000 - anchor1 = none - anchor2 = none - is-visible = false - saved-params = "pos;size;is-minimized;is-maximized" - statusbar = false - elem "preferences_browser" - type = BROWSER - pos = 0,0 - size = 960x1000 - anchor1 = 0,0 - anchor2 = 75,100 - saved-params = "" - elem "character_preview_map" - type = MAP - pos = 960,0 - size = 320x1000 - anchor1 = 75,0 - anchor2 = 100,100 - right-click = true - saved-params = "zoom;letterbox;zoom-mode" - diff --git a/rust_g.dll b/rust_g.dll index 27ee495684..f4be6e730a 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/block_parry/block_metal1.ogg b/sound/block_parry/block_metal1.ogg new file mode 100644 index 0000000000..c0f98249cd Binary files /dev/null and b/sound/block_parry/block_metal1.ogg differ diff --git a/sound/block_parry/block_metal2.ogg b/sound/block_parry/block_metal2.ogg new file mode 100644 index 0000000000..58c1233cea Binary files /dev/null and b/sound/block_parry/block_metal2.ogg differ diff --git a/sound/block_parry/block_wood1.ogg b/sound/block_parry/block_wood1.ogg new file mode 100644 index 0000000000..a01f3dbe01 Binary files /dev/null and b/sound/block_parry/block_wood1.ogg differ diff --git a/sound/block_parry/block_wood2.ogg b/sound/block_parry/block_wood2.ogg new file mode 100644 index 0000000000..398a59e248 Binary files /dev/null and b/sound/block_parry/block_wood2.ogg differ diff --git a/sound/block_parry/sfx-parry.ogg b/sound/block_parry/sfx-parry.ogg new file mode 100644 index 0000000000..3429031bd9 Binary files /dev/null and b/sound/block_parry/sfx-parry.ogg differ diff --git a/sound/effects/gravhit.ogg b/sound/effects/gravhit.ogg new file mode 100644 index 0000000000..524ddf733f Binary files /dev/null and b/sound/effects/gravhit.ogg differ diff --git a/sound/effects/printer.ogg b/sound/effects/printer.ogg new file mode 100644 index 0000000000..c9546490f1 Binary files /dev/null and b/sound/effects/printer.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg new file mode 100644 index 0000000000..aaa1e27ab8 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_brass/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg new file mode 100644 index 0000000000..ce50e76aae Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_brass/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg new file mode 100644 index 0000000000..22f34d6759 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_brass/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg b/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg new file mode 100644 index 0000000000..eb5bb7c295 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_brass/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg new file mode 100644 index 0000000000..bd299e321a Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C2.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg new file mode 100644 index 0000000000..0519d2d20d Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C3.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg new file mode 100644 index 0000000000..3b969a34b1 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg b/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg new file mode 100644 index 0000000000..75f709c16f Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trombone/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg new file mode 100644 index 0000000000..ba347f8003 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg new file mode 100644 index 0000000000..cee89761d0 Binary files /dev/null and b/sound/instruments/synthesis_samples/brass/crisis_trumpet/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg new file mode 100644 index 0000000000..105f767655 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C2.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg new file mode 100644 index 0000000000..4aa33b6cde Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C3.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg new file mode 100644 index 0000000000..d661e8d758 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg new file mode 100644 index 0000000000..bf650f1a6f Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg new file mode 100644 index 0000000000..c00f7949b7 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C6.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg new file mode 100644 index 0000000000..72588e9ca4 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C7.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg new file mode 100644 index 0000000000..b2a0b445b9 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/fluid_celeste/C8.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg new file mode 100644 index 0000000000..ecf6778343 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg new file mode 100644 index 0000000000..867e9ce00d Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg new file mode 100644 index 0000000000..446d45993e Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg b/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg new file mode 100644 index 0000000000..54d56400c0 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/sgmbox/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg new file mode 100644 index 0000000000..f3770c1f1a Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg new file mode 100644 index 0000000000..28954fbb47 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg new file mode 100644 index 0000000000..1233f5314a Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg new file mode 100644 index 0000000000..00daf33135 Binary files /dev/null and b/sound/instruments/synthesis_samples/chromatic/vibraphone1/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg new file mode 100644 index 0000000000..13ad54bff0 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C2.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg new file mode 100644 index 0000000000..17bf392c4b Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C3.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg new file mode 100644 index 0000000000..feda419a0a Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg new file mode 100644 index 0000000000..bd088dd850 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_clean/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg new file mode 100644 index 0000000000..09cdbeec42 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg new file mode 100644 index 0000000000..f82c39cee5 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg new file mode 100644 index 0000000000..23bfd113d6 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg new file mode 100644 index 0000000000..e5ec38d5ab Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_muted/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg new file mode 100644 index 0000000000..42a6cdfad3 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg new file mode 100644 index 0000000000..cd6414c0aa Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg new file mode 100644 index 0000000000..e536601865 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg new file mode 100644 index 0000000000..6038222837 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_nylon/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg new file mode 100644 index 0000000000..648549d594 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg new file mode 100644 index 0000000000..01ba59a908 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg new file mode 100644 index 0000000000..7cfaa8ca72 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg b/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg new file mode 100644 index 0000000000..b4ca49dc04 Binary files /dev/null and b/sound/instruments/synthesis_samples/guitar/crisis_steel/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg new file mode 100644 index 0000000000..7c9870a7c3 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg new file mode 100644 index 0000000000..5723c2edd2 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg new file mode 100644 index 0000000000..329f14f6fe Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg new file mode 100644 index 0000000000..5e8ac69de2 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_accordian/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg new file mode 100644 index 0000000000..ddc44c69c2 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_church/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg new file mode 100644 index 0000000000..2855747528 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_church/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg new file mode 100644 index 0000000000..906fff5bd8 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_church/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg new file mode 100644 index 0000000000..96d28a7206 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_church/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg new file mode 100644 index 0000000000..9b917b7eb5 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg new file mode 100644 index 0000000000..c68410d6f0 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg new file mode 100644 index 0000000000..df84ba99e8 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg new file mode 100644 index 0000000000..af8c178efe Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_hammond/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg new file mode 100644 index 0000000000..268b41f1fc Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg new file mode 100644 index 0000000000..04ceb54bfc Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg new file mode 100644 index 0000000000..b321983e74 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_harmonica/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg new file mode 100644 index 0000000000..250a5c08e0 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg new file mode 100644 index 0000000000..8b1c23007b Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg new file mode 100644 index 0000000000..098587183b Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg new file mode 100644 index 0000000000..81b60ef4c2 Binary files /dev/null and b/sound/instruments/synthesis_samples/organ/crisis_tangaccordian/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg new file mode 100644 index 0000000000..39e992fbd8 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg new file mode 100644 index 0000000000..04aa985281 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg new file mode 100644 index 0000000000..aff97942e9 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg new file mode 100644 index 0000000000..19fd937707 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg new file mode 100644 index 0000000000..452e7485be Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c6.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg new file mode 100644 index 0000000000..66c88185a7 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c7.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg new file mode 100644 index 0000000000..d93c5176ce Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_bright_piano/c8.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg new file mode 100644 index 0000000000..fabd90d2e6 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg new file mode 100644 index 0000000000..e4cda1487a Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg new file mode 100644 index 0000000000..c596994b3e Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg new file mode 100644 index 0000000000..d265514e27 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg new file mode 100644 index 0000000000..3e17b3f99a Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c6.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg new file mode 100644 index 0000000000..b57a8a9109 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c7.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg new file mode 100644 index 0000000000..ce4d9535e8 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_grand_piano/c8.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg new file mode 100644 index 0000000000..bb02363fff Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg new file mode 100644 index 0000000000..1a532ac8d4 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg new file mode 100644 index 0000000000..16ff313baa Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg new file mode 100644 index 0000000000..04161d2571 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/crisis_harpsichord/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg new file mode 100644 index 0000000000..30a3c653a1 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C2.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg new file mode 100644 index 0000000000..f6bc891506 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C3.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg new file mode 100644 index 0000000000..ab47f6940c Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C4.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg new file mode 100644 index 0000000000..5dfb9aa529 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg new file mode 100644 index 0000000000..7bc8784207 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C6.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg new file mode 100644 index 0000000000..185b4d3db6 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C7.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg new file mode 100644 index 0000000000..f358ef0810 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_harpsi/C8.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg new file mode 100644 index 0000000000..048f9640bf Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c2.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg new file mode 100644 index 0000000000..f1083d7dcb Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c3.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg new file mode 100644 index 0000000000..244ebc3d5f Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c4.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg new file mode 100644 index 0000000000..d3c68d64e9 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c5.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg new file mode 100644 index 0000000000..2666ee6613 Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c6.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg new file mode 100644 index 0000000000..050e463c0d Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c7.ogg differ diff --git a/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg b/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg new file mode 100644 index 0000000000..4793c5b7fd Binary files /dev/null and b/sound/instruments/synthesis_samples/piano/fluid_piano/c8.ogg differ diff --git a/sound/instruments/synthesis_samples/tones/Sawtooth.ogg b/sound/instruments/synthesis_samples/tones/Sawtooth.ogg new file mode 100644 index 0000000000..10b1930a64 Binary files /dev/null and b/sound/instruments/synthesis_samples/tones/Sawtooth.ogg differ diff --git a/sound/instruments/synthesis_samples/tones/Sine.ogg b/sound/instruments/synthesis_samples/tones/Sine.ogg new file mode 100644 index 0000000000..96a09d501b Binary files /dev/null and b/sound/instruments/synthesis_samples/tones/Sine.ogg differ diff --git a/sound/instruments/synthesis_samples/tones/Square.ogg b/sound/instruments/synthesis_samples/tones/Square.ogg new file mode 100644 index 0000000000..71029c07f9 Binary files /dev/null and b/sound/instruments/synthesis_samples/tones/Square.ogg differ diff --git a/sound/items/dump_it.ogg b/sound/items/dump_it.ogg new file mode 100644 index 0000000000..33bdb49e69 Binary files /dev/null and b/sound/items/dump_it.ogg differ diff --git a/sound/machines/machine_vend.ogg b/sound/machines/machine_vend.ogg new file mode 100644 index 0000000000..92867a1f3d Binary files /dev/null and b/sound/machines/machine_vend.ogg differ diff --git a/sound/vehicles/skateboard_ollie.ogg b/sound/vehicles/skateboard_ollie.ogg new file mode 100644 index 0000000000..5f0f2fc30b Binary files /dev/null and b/sound/vehicles/skateboard_ollie.ogg differ diff --git a/sound/vehicles/skateboard_roll.ogg b/sound/vehicles/skateboard_roll.ogg new file mode 100644 index 0000000000..326c175d77 Binary files /dev/null and b/sound/vehicles/skateboard_roll.ogg differ diff --git a/sound/voice/medbot/close.ogg b/sound/voice/medbot/close.ogg new file mode 100644 index 0000000000..9e0efcefd2 Binary files /dev/null and b/sound/voice/medbot/close.ogg differ diff --git a/sound/voice/medbot/dont_like.ogg b/sound/voice/medbot/dont_like.ogg new file mode 100644 index 0000000000..06fc84af2f Binary files /dev/null and b/sound/voice/medbot/dont_like.ogg differ diff --git a/sound/voice/medbot/forgive.ogg b/sound/voice/medbot/forgive.ogg new file mode 100644 index 0000000000..729eaa5c78 Binary files /dev/null and b/sound/voice/medbot/forgive.ogg differ diff --git a/sound/voice/medbot/fuck_you.ogg b/sound/voice/medbot/fuck_you.ogg new file mode 100644 index 0000000000..5eacff615f Binary files /dev/null and b/sound/voice/medbot/fuck_you.ogg differ diff --git a/sound/voice/medbot/hey_wait.ogg b/sound/voice/medbot/hey_wait.ogg new file mode 100644 index 0000000000..6c88b761ec Binary files /dev/null and b/sound/voice/medbot/hey_wait.ogg differ diff --git a/sound/voice/medbot/i_require_asst.ogg b/sound/voice/medbot/i_require_asst.ogg new file mode 100644 index 0000000000..18fabc630f Binary files /dev/null and b/sound/voice/medbot/i_require_asst.ogg differ diff --git a/sound/voice/medbot/i_trusted_you.ogg b/sound/voice/medbot/i_trusted_you.ogg new file mode 100644 index 0000000000..602baa2f67 Binary files /dev/null and b/sound/voice/medbot/i_trusted_you.ogg differ diff --git a/sound/voice/medbot/im_different.ogg b/sound/voice/medbot/im_different.ogg new file mode 100644 index 0000000000..42eb8564f1 Binary files /dev/null and b/sound/voice/medbot/im_different.ogg differ diff --git a/sound/voice/medbot/is_this_the_end.ogg b/sound/voice/medbot/is_this_the_end.ogg new file mode 100644 index 0000000000..a2e0e2330a Binary files /dev/null and b/sound/voice/medbot/is_this_the_end.ogg differ diff --git a/sound/voice/medbot/nooo.ogg b/sound/voice/medbot/nooo.ogg new file mode 100644 index 0000000000..102fd1fb04 Binary files /dev/null and b/sound/voice/medbot/nooo.ogg differ diff --git a/sound/voice/medbot/oh_fuck.ogg b/sound/voice/medbot/oh_fuck.ogg new file mode 100644 index 0000000000..95d21ef255 Binary files /dev/null and b/sound/voice/medbot/oh_fuck.ogg differ diff --git a/sound/voice/medbot/owo.ogg b/sound/voice/medbot/owo.ogg new file mode 100644 index 0000000000..0fdaa9d483 Binary files /dev/null and b/sound/voice/medbot/owo.ogg differ diff --git a/sound/voice/medbot/pain_is_real.ogg b/sound/voice/medbot/pain_is_real.ogg new file mode 100644 index 0000000000..9cfa3a71be Binary files /dev/null and b/sound/voice/medbot/pain_is_real.ogg differ diff --git a/sound/voice/medbot/please_dont.ogg b/sound/voice/medbot/please_dont.ogg new file mode 100644 index 0000000000..a77ee09cb4 Binary files /dev/null and b/sound/voice/medbot/please_dont.ogg differ diff --git a/sound/voice/medbot/please_im_scared.ogg b/sound/voice/medbot/please_im_scared.ogg new file mode 100644 index 0000000000..7bd53b39c8 Binary files /dev/null and b/sound/voice/medbot/please_im_scared.ogg differ diff --git a/sound/voice/medbot/please_put_me_back.ogg b/sound/voice/medbot/please_put_me_back.ogg new file mode 100644 index 0000000000..84700fbdd5 Binary files /dev/null and b/sound/voice/medbot/please_put_me_back.ogg differ diff --git a/sound/voice/medbot/reported.ogg b/sound/voice/medbot/reported.ogg new file mode 100644 index 0000000000..d5469c19ce Binary files /dev/null and b/sound/voice/medbot/reported.ogg differ diff --git a/sound/voice/medbot/shindemashou.ogg b/sound/voice/medbot/shindemashou.ogg new file mode 100644 index 0000000000..1ee2858eaf Binary files /dev/null and b/sound/voice/medbot/shindemashou.ogg differ diff --git a/sound/voice/medbot/thank_you.ogg b/sound/voice/medbot/thank_you.ogg new file mode 100644 index 0000000000..3fabe7d4a6 Binary files /dev/null and b/sound/voice/medbot/thank_you.ogg differ diff --git a/sound/voice/medbot/turn_off.ogg b/sound/voice/medbot/turn_off.ogg new file mode 100644 index 0000000000..87a4d6bdd0 Binary files /dev/null and b/sound/voice/medbot/turn_off.ogg differ diff --git a/sound/voice/medbot/why.ogg b/sound/voice/medbot/why.ogg new file mode 100644 index 0000000000..415020b89b Binary files /dev/null and b/sound/voice/medbot/why.ogg differ diff --git a/sound/voice/medbot/youre_good.ogg b/sound/voice/medbot/youre_good.ogg new file mode 100644 index 0000000000..62c325f834 Binary files /dev/null and b/sound/voice/medbot/youre_good.ogg differ diff --git a/sound/vore/pred/death_01.ogg b/sound/vore/pred/death_01.ogg index 231884ef54..ed26c1b413 100644 Binary files a/sound/vore/pred/death_01.ogg and b/sound/vore/pred/death_01.ogg differ diff --git a/sound/vore/pred/death_02.ogg b/sound/vore/pred/death_02.ogg index 5de3e4148c..15168455a4 100644 Binary files a/sound/vore/pred/death_02.ogg and b/sound/vore/pred/death_02.ogg differ diff --git a/sound/vore/pred/death_03.ogg b/sound/vore/pred/death_03.ogg index 4ffa271af7..f9e4f7d08d 100644 Binary files a/sound/vore/pred/death_03.ogg and b/sound/vore/pred/death_03.ogg differ diff --git a/sound/vore/pred/death_04.ogg b/sound/vore/pred/death_04.ogg index a4c0e91be6..ec8fac62ec 100644 Binary files a/sound/vore/pred/death_04.ogg and b/sound/vore/pred/death_04.ogg differ diff --git a/sound/vore/pred/death_05.ogg b/sound/vore/pred/death_05.ogg index aeec557758..c637e59658 100644 Binary files a/sound/vore/pred/death_05.ogg and b/sound/vore/pred/death_05.ogg differ diff --git a/sound/vore/pred/death_06.ogg b/sound/vore/pred/death_06.ogg index f5b077ebd4..024549f5e6 100644 Binary files a/sound/vore/pred/death_06.ogg and b/sound/vore/pred/death_06.ogg differ diff --git a/sound/vore/pred/death_07.ogg b/sound/vore/pred/death_07.ogg index afaaab65bb..cc1cdfab4b 100644 Binary files a/sound/vore/pred/death_07.ogg and b/sound/vore/pred/death_07.ogg differ diff --git a/sound/vore/pred/death_08.ogg b/sound/vore/pred/death_08.ogg index b1b8479ea8..8a310f7732 100644 Binary files a/sound/vore/pred/death_08.ogg and b/sound/vore/pred/death_08.ogg differ diff --git a/sound/vore/pred/death_09.ogg b/sound/vore/pred/death_09.ogg index 1454deafad..87dcb0cc9a 100644 Binary files a/sound/vore/pred/death_09.ogg and b/sound/vore/pred/death_09.ogg differ diff --git a/sound/vore/pred/death_10.ogg b/sound/vore/pred/death_10.ogg index f0e23e1d54..69a14fc675 100644 Binary files a/sound/vore/pred/death_10.ogg and b/sound/vore/pred/death_10.ogg differ diff --git a/sound/vore/pred/death_11.ogg b/sound/vore/pred/death_11.ogg index 43e80467e0..0f51ec8de2 100644 Binary files a/sound/vore/pred/death_11.ogg and b/sound/vore/pred/death_11.ogg differ diff --git a/sound/vore/pred/death_12.ogg b/sound/vore/pred/death_12.ogg index 5ec6029998..99fc7faa02 100644 Binary files a/sound/vore/pred/death_12.ogg and b/sound/vore/pred/death_12.ogg differ diff --git a/sound/vore/pred/death_13.ogg b/sound/vore/pred/death_13.ogg index 9073bac4f2..73aec12372 100644 Binary files a/sound/vore/pred/death_13.ogg and b/sound/vore/pred/death_13.ogg differ diff --git a/sound/vore/pred/digest_01.ogg b/sound/vore/pred/digest_01.ogg index 20b6d1d43a..9171a568a5 100644 Binary files a/sound/vore/pred/digest_01.ogg and b/sound/vore/pred/digest_01.ogg differ diff --git a/sound/vore/pred/digest_02.ogg b/sound/vore/pred/digest_02.ogg index 7fc41e2305..44cfaaeec4 100644 Binary files a/sound/vore/pred/digest_02.ogg and b/sound/vore/pred/digest_02.ogg differ diff --git a/sound/vore/pred/digest_03.ogg b/sound/vore/pred/digest_03.ogg index 98b032c7cb..71bc28a8fa 100644 Binary files a/sound/vore/pred/digest_03.ogg and b/sound/vore/pred/digest_03.ogg differ diff --git a/sound/vore/pred/digest_04.ogg b/sound/vore/pred/digest_04.ogg index ed494e813c..6552a11aad 100644 Binary files a/sound/vore/pred/digest_04.ogg and b/sound/vore/pred/digest_04.ogg differ diff --git a/sound/vore/pred/digest_05.ogg b/sound/vore/pred/digest_05.ogg index 53bb4814f7..f88d1590d5 100644 Binary files a/sound/vore/pred/digest_05.ogg and b/sound/vore/pred/digest_05.ogg differ diff --git a/sound/vore/pred/digest_06.ogg b/sound/vore/pred/digest_06.ogg index 787c336282..fbad31b160 100644 Binary files a/sound/vore/pred/digest_06.ogg and b/sound/vore/pred/digest_06.ogg differ diff --git a/sound/vore/pred/digest_07.ogg b/sound/vore/pred/digest_07.ogg index f63d4c633a..2efd7504d9 100644 Binary files a/sound/vore/pred/digest_07.ogg and b/sound/vore/pred/digest_07.ogg differ diff --git a/sound/vore/pred/digest_08.ogg b/sound/vore/pred/digest_08.ogg index dbbda3b517..5f8cf09ad1 100644 Binary files a/sound/vore/pred/digest_08.ogg and b/sound/vore/pred/digest_08.ogg differ diff --git a/sound/vore/pred/digest_09.ogg b/sound/vore/pred/digest_09.ogg index 1877f1ca05..d678bc1588 100644 Binary files a/sound/vore/pred/digest_09.ogg and b/sound/vore/pred/digest_09.ogg differ diff --git a/sound/vore/pred/digest_10.ogg b/sound/vore/pred/digest_10.ogg index 3e22b8b2fb..6de49d53fd 100644 Binary files a/sound/vore/pred/digest_10.ogg and b/sound/vore/pred/digest_10.ogg differ diff --git a/sound/vore/pred/digest_11.ogg b/sound/vore/pred/digest_11.ogg index 089d4ee7e4..7651912a46 100644 Binary files a/sound/vore/pred/digest_11.ogg and b/sound/vore/pred/digest_11.ogg differ diff --git a/sound/vore/pred/digest_12.ogg b/sound/vore/pred/digest_12.ogg index 76a9134646..796058bbc1 100644 Binary files a/sound/vore/pred/digest_12.ogg and b/sound/vore/pred/digest_12.ogg differ diff --git a/sound/vore/pred/digest_13.ogg b/sound/vore/pred/digest_13.ogg index 12b1c6bb18..fe1fb37da7 100644 Binary files a/sound/vore/pred/digest_13.ogg and b/sound/vore/pred/digest_13.ogg differ diff --git a/sound/vore/pred/digest_14.ogg b/sound/vore/pred/digest_14.ogg index c68231585c..648ba7ff76 100644 Binary files a/sound/vore/pred/digest_14.ogg and b/sound/vore/pred/digest_14.ogg differ diff --git a/sound/vore/pred/digest_15.ogg b/sound/vore/pred/digest_15.ogg index 32aecca35b..80fdbc1ca7 100644 Binary files a/sound/vore/pred/digest_15.ogg and b/sound/vore/pred/digest_15.ogg differ diff --git a/sound/vore/pred/digest_16.ogg b/sound/vore/pred/digest_16.ogg index d112913570..2f99901c7d 100644 Binary files a/sound/vore/pred/digest_16.ogg and b/sound/vore/pred/digest_16.ogg differ diff --git a/sound/vore/pred/digest_17.ogg b/sound/vore/pred/digest_17.ogg index d23c4c6ddc..5670af0722 100644 Binary files a/sound/vore/pred/digest_17.ogg and b/sound/vore/pred/digest_17.ogg differ diff --git a/sound/vore/pred/digest_18.ogg b/sound/vore/pred/digest_18.ogg index ae8ac9f74f..8b0ae75028 100644 Binary files a/sound/vore/pred/digest_18.ogg and b/sound/vore/pred/digest_18.ogg differ diff --git a/sound/vore/pred/escape.ogg b/sound/vore/pred/escape.ogg index fc093a5acf..a2868183f0 100644 Binary files a/sound/vore/pred/escape.ogg and b/sound/vore/pred/escape.ogg differ diff --git a/sound/vore/pred/insertion_01.ogg b/sound/vore/pred/insertion_01.ogg index 4ca8b6e425..58e78f8578 100644 Binary files a/sound/vore/pred/insertion_01.ogg and b/sound/vore/pred/insertion_01.ogg differ diff --git a/sound/vore/pred/insertion_02.ogg b/sound/vore/pred/insertion_02.ogg index a23cfaf201..73a3bbb8b2 100644 Binary files a/sound/vore/pred/insertion_02.ogg and b/sound/vore/pred/insertion_02.ogg differ diff --git a/sound/vore/pred/loop.ogg b/sound/vore/pred/loop.ogg index 5f0994251a..3fd9f1fa78 100644 Binary files a/sound/vore/pred/loop.ogg and b/sound/vore/pred/loop.ogg differ diff --git a/sound/vore/pred/schlorp.ogg b/sound/vore/pred/schlorp.ogg index eefb9dd71e..ff42b64e7b 100644 Binary files a/sound/vore/pred/schlorp.ogg and b/sound/vore/pred/schlorp.ogg differ diff --git a/sound/vore/pred/squish _02.ogg b/sound/vore/pred/squish _02.ogg index 846f0a2ece..4d674d1cba 100644 Binary files a/sound/vore/pred/squish _02.ogg and b/sound/vore/pred/squish _02.ogg differ diff --git a/sound/vore/pred/squish _03.ogg b/sound/vore/pred/squish _03.ogg index 568aa81a3d..c4e49de60b 100644 Binary files a/sound/vore/pred/squish _03.ogg and b/sound/vore/pred/squish _03.ogg differ diff --git a/sound/vore/pred/squish_01.ogg b/sound/vore/pred/squish_01.ogg index bc014b811d..5ae280397a 100644 Binary files a/sound/vore/pred/squish_01.ogg and b/sound/vore/pred/squish_01.ogg differ diff --git a/sound/vore/pred/squish_02.ogg b/sound/vore/pred/squish_02.ogg index 8d92bfd19e..c28a82d1c7 100644 Binary files a/sound/vore/pred/squish_02.ogg and b/sound/vore/pred/squish_02.ogg differ diff --git a/sound/vore/pred/squish_03.ogg b/sound/vore/pred/squish_03.ogg index f62bf7ff60..1362310411 100644 Binary files a/sound/vore/pred/squish_03.ogg and b/sound/vore/pred/squish_03.ogg differ diff --git a/sound/vore/pred/squish_04.ogg b/sound/vore/pred/squish_04.ogg index 47037d9a3a..5ed518ceb8 100644 Binary files a/sound/vore/pred/squish_04.ogg and b/sound/vore/pred/squish_04.ogg differ diff --git a/sound/vore/pred/stomachmove.ogg b/sound/vore/pred/stomachmove.ogg index 4e11cc03ed..87ad72846c 100644 Binary files a/sound/vore/pred/stomachmove.ogg and b/sound/vore/pred/stomachmove.ogg differ diff --git a/sound/vore/pred/struggle_01.ogg b/sound/vore/pred/struggle_01.ogg index 96c569b0f9..bae92a00a9 100644 Binary files a/sound/vore/pred/struggle_01.ogg and b/sound/vore/pred/struggle_01.ogg differ diff --git a/sound/vore/pred/struggle_02.ogg b/sound/vore/pred/struggle_02.ogg index 2f0d3324f1..46d0954e4f 100644 Binary files a/sound/vore/pred/struggle_02.ogg and b/sound/vore/pred/struggle_02.ogg differ diff --git a/sound/vore/pred/struggle_03.ogg b/sound/vore/pred/struggle_03.ogg index 9632817010..3fd16e35a4 100644 Binary files a/sound/vore/pred/struggle_03.ogg and b/sound/vore/pred/struggle_03.ogg differ diff --git a/sound/vore/pred/struggle_04.ogg b/sound/vore/pred/struggle_04.ogg index 7a30de3baf..a873a56e4c 100644 Binary files a/sound/vore/pred/struggle_04.ogg and b/sound/vore/pred/struggle_04.ogg differ diff --git a/sound/vore/pred/struggle_05.ogg b/sound/vore/pred/struggle_05.ogg index 0bae93d50f..411fa1d342 100644 Binary files a/sound/vore/pred/struggle_05.ogg and b/sound/vore/pred/struggle_05.ogg differ diff --git a/sound/vore/pred/swallow_01.ogg b/sound/vore/pred/swallow_01.ogg index 45a0008586..9dd0dfb780 100644 Binary files a/sound/vore/pred/swallow_01.ogg and b/sound/vore/pred/swallow_01.ogg differ diff --git a/sound/vore/pred/swallow_02.ogg b/sound/vore/pred/swallow_02.ogg index 8f9bcb2e84..c4cd4ec53d 100644 Binary files a/sound/vore/pred/swallow_02.ogg and b/sound/vore/pred/swallow_02.ogg differ diff --git a/sound/vore/pred/taurswallow.ogg b/sound/vore/pred/taurswallow.ogg index c700f71803..cfd8b90103 100644 Binary files a/sound/vore/pred/taurswallow.ogg and b/sound/vore/pred/taurswallow.ogg differ diff --git a/sound/vore/prey/death_01.ogg b/sound/vore/prey/death_01.ogg index 539a873a7e..e09325bbec 100644 Binary files a/sound/vore/prey/death_01.ogg and b/sound/vore/prey/death_01.ogg differ diff --git a/sound/vore/prey/death_02.ogg b/sound/vore/prey/death_02.ogg index 4dd1a285ea..dded921b94 100644 Binary files a/sound/vore/prey/death_02.ogg and b/sound/vore/prey/death_02.ogg differ diff --git a/sound/vore/prey/death_03.ogg b/sound/vore/prey/death_03.ogg index 30a3622c86..a7d9787f02 100644 Binary files a/sound/vore/prey/death_03.ogg and b/sound/vore/prey/death_03.ogg differ diff --git a/sound/vore/prey/death_04.ogg b/sound/vore/prey/death_04.ogg index ff983c2c31..99f9fda1e4 100644 Binary files a/sound/vore/prey/death_04.ogg and b/sound/vore/prey/death_04.ogg differ diff --git a/sound/vore/prey/death_05.ogg b/sound/vore/prey/death_05.ogg index 44b8603048..3426e1c10f 100644 Binary files a/sound/vore/prey/death_05.ogg and b/sound/vore/prey/death_05.ogg differ diff --git a/sound/vore/prey/death_06.ogg b/sound/vore/prey/death_06.ogg index 836a4fd18c..1695fa43ec 100644 Binary files a/sound/vore/prey/death_06.ogg and b/sound/vore/prey/death_06.ogg differ diff --git a/sound/vore/prey/death_07.ogg b/sound/vore/prey/death_07.ogg index 2406fea727..c94a83506e 100644 Binary files a/sound/vore/prey/death_07.ogg and b/sound/vore/prey/death_07.ogg differ diff --git a/sound/vore/prey/death_08.ogg b/sound/vore/prey/death_08.ogg index 0d7627dfae..d41b9f8060 100644 Binary files a/sound/vore/prey/death_08.ogg and b/sound/vore/prey/death_08.ogg differ diff --git a/sound/vore/prey/death_09.ogg b/sound/vore/prey/death_09.ogg index fa00a29d31..086407c499 100644 Binary files a/sound/vore/prey/death_09.ogg and b/sound/vore/prey/death_09.ogg differ diff --git a/sound/vore/prey/death_10.ogg b/sound/vore/prey/death_10.ogg index 738e7cf909..03f4c498cb 100644 Binary files a/sound/vore/prey/death_10.ogg and b/sound/vore/prey/death_10.ogg differ diff --git a/sound/vore/prey/death_11.ogg b/sound/vore/prey/death_11.ogg index bfd47945ae..175c024f70 100644 Binary files a/sound/vore/prey/death_11.ogg and b/sound/vore/prey/death_11.ogg differ diff --git a/sound/vore/prey/death_12.ogg b/sound/vore/prey/death_12.ogg index e6e800b2da..3b18c4bfac 100644 Binary files a/sound/vore/prey/death_12.ogg and b/sound/vore/prey/death_12.ogg differ diff --git a/sound/vore/prey/death_13.ogg b/sound/vore/prey/death_13.ogg index c9b79887d7..3adbbbaedc 100644 Binary files a/sound/vore/prey/death_13.ogg and b/sound/vore/prey/death_13.ogg differ diff --git a/sound/vore/prey/digest_01.ogg b/sound/vore/prey/digest_01.ogg index a1d13f7fb7..d2a6f38995 100644 Binary files a/sound/vore/prey/digest_01.ogg and b/sound/vore/prey/digest_01.ogg differ diff --git a/sound/vore/prey/digest_02.ogg b/sound/vore/prey/digest_02.ogg index 443d23c194..ead4fcad7f 100644 Binary files a/sound/vore/prey/digest_02.ogg and b/sound/vore/prey/digest_02.ogg differ diff --git a/sound/vore/prey/digest_03.ogg b/sound/vore/prey/digest_03.ogg index eb798b66ff..aaff366fe8 100644 Binary files a/sound/vore/prey/digest_03.ogg and b/sound/vore/prey/digest_03.ogg differ diff --git a/sound/vore/prey/digest_04.ogg b/sound/vore/prey/digest_04.ogg index a2c2c3e1ac..7c9bfed0eb 100644 Binary files a/sound/vore/prey/digest_04.ogg and b/sound/vore/prey/digest_04.ogg differ diff --git a/sound/vore/prey/digest_05.ogg b/sound/vore/prey/digest_05.ogg index 752a6d48f3..abfa800926 100644 Binary files a/sound/vore/prey/digest_05.ogg and b/sound/vore/prey/digest_05.ogg differ diff --git a/sound/vore/prey/digest_06.ogg b/sound/vore/prey/digest_06.ogg index f2e80b919f..537d1470d1 100644 Binary files a/sound/vore/prey/digest_06.ogg and b/sound/vore/prey/digest_06.ogg differ diff --git a/sound/vore/prey/digest_07.ogg b/sound/vore/prey/digest_07.ogg index 6a2ff70ff8..96f9e79edf 100644 Binary files a/sound/vore/prey/digest_07.ogg and b/sound/vore/prey/digest_07.ogg differ diff --git a/sound/vore/prey/digest_08.ogg b/sound/vore/prey/digest_08.ogg index 4e55f4671d..a79b3518a0 100644 Binary files a/sound/vore/prey/digest_08.ogg and b/sound/vore/prey/digest_08.ogg differ diff --git a/sound/vore/prey/digest_09.ogg b/sound/vore/prey/digest_09.ogg index 452e6b4a2e..d0d0b27865 100644 Binary files a/sound/vore/prey/digest_09.ogg and b/sound/vore/prey/digest_09.ogg differ diff --git a/sound/vore/prey/digest_10.ogg b/sound/vore/prey/digest_10.ogg index 4c5dc2e333..1afc99589b 100644 Binary files a/sound/vore/prey/digest_10.ogg and b/sound/vore/prey/digest_10.ogg differ diff --git a/sound/vore/prey/digest_11.ogg b/sound/vore/prey/digest_11.ogg index e94c0af656..5a342b45e7 100644 Binary files a/sound/vore/prey/digest_11.ogg and b/sound/vore/prey/digest_11.ogg differ diff --git a/sound/vore/prey/digest_12.ogg b/sound/vore/prey/digest_12.ogg index cb212fed1c..84d2bd691d 100644 Binary files a/sound/vore/prey/digest_12.ogg and b/sound/vore/prey/digest_12.ogg differ diff --git a/sound/vore/prey/digest_13.ogg b/sound/vore/prey/digest_13.ogg index 9fd292184e..e43298a473 100644 Binary files a/sound/vore/prey/digest_13.ogg and b/sound/vore/prey/digest_13.ogg differ diff --git a/sound/vore/prey/digest_14.ogg b/sound/vore/prey/digest_14.ogg index 24279d4712..25288719e8 100644 Binary files a/sound/vore/prey/digest_14.ogg and b/sound/vore/prey/digest_14.ogg differ diff --git a/sound/vore/prey/digest_15.ogg b/sound/vore/prey/digest_15.ogg index 2bf555ba41..176370a5e6 100644 Binary files a/sound/vore/prey/digest_15.ogg and b/sound/vore/prey/digest_15.ogg differ diff --git a/sound/vore/prey/digest_16.ogg b/sound/vore/prey/digest_16.ogg index 98edd6fb61..6a8437ff92 100644 Binary files a/sound/vore/prey/digest_16.ogg and b/sound/vore/prey/digest_16.ogg differ diff --git a/sound/vore/prey/digest_17.ogg b/sound/vore/prey/digest_17.ogg index 2ff5c173e1..315b6a8336 100644 Binary files a/sound/vore/prey/digest_17.ogg and b/sound/vore/prey/digest_17.ogg differ diff --git a/sound/vore/prey/digest_18.ogg b/sound/vore/prey/digest_18.ogg index 6a1ae78fb8..ca73cee597 100644 Binary files a/sound/vore/prey/digest_18.ogg and b/sound/vore/prey/digest_18.ogg differ diff --git a/sound/vore/prey/escape.ogg b/sound/vore/prey/escape.ogg index 621997a56d..eafdd6343a 100644 Binary files a/sound/vore/prey/escape.ogg and b/sound/vore/prey/escape.ogg differ diff --git a/sound/vore/prey/insertion_01.ogg b/sound/vore/prey/insertion_01.ogg index 5a3b942bb3..eff2080bf7 100644 Binary files a/sound/vore/prey/insertion_01.ogg and b/sound/vore/prey/insertion_01.ogg differ diff --git a/sound/vore/prey/insertion_02.ogg b/sound/vore/prey/insertion_02.ogg index 2d35094522..3879287a1b 100644 Binary files a/sound/vore/prey/insertion_02.ogg and b/sound/vore/prey/insertion_02.ogg differ diff --git a/sound/vore/prey/loop.ogg b/sound/vore/prey/loop.ogg index 1584482d92..167dde592a 100644 Binary files a/sound/vore/prey/loop.ogg and b/sound/vore/prey/loop.ogg differ diff --git a/sound/vore/prey/schlorp.ogg b/sound/vore/prey/schlorp.ogg index d1895ee26a..96eeb6f15b 100644 Binary files a/sound/vore/prey/schlorp.ogg and b/sound/vore/prey/schlorp.ogg differ diff --git a/sound/vore/prey/squish_01.ogg b/sound/vore/prey/squish_01.ogg index 2785a4a080..20d5b897bd 100644 Binary files a/sound/vore/prey/squish_01.ogg and b/sound/vore/prey/squish_01.ogg differ diff --git a/sound/vore/prey/squish_02.ogg b/sound/vore/prey/squish_02.ogg index f5671f7165..24849ef8f1 100644 Binary files a/sound/vore/prey/squish_02.ogg and b/sound/vore/prey/squish_02.ogg differ diff --git a/sound/vore/prey/squish_03.ogg b/sound/vore/prey/squish_03.ogg index 1e8f2bb896..29dd56868b 100644 Binary files a/sound/vore/prey/squish_03.ogg and b/sound/vore/prey/squish_03.ogg differ diff --git a/sound/vore/prey/squish_04.ogg b/sound/vore/prey/squish_04.ogg index 2e618890a9..caa9ef0b79 100644 Binary files a/sound/vore/prey/squish_04.ogg and b/sound/vore/prey/squish_04.ogg differ diff --git a/sound/vore/prey/stomachmove.ogg b/sound/vore/prey/stomachmove.ogg index e4e004b072..15a6b252b4 100644 Binary files a/sound/vore/prey/stomachmove.ogg and b/sound/vore/prey/stomachmove.ogg differ diff --git a/sound/vore/prey/struggle_01.ogg b/sound/vore/prey/struggle_01.ogg index de0f3ad8bd..ef315e2f3e 100644 Binary files a/sound/vore/prey/struggle_01.ogg and b/sound/vore/prey/struggle_01.ogg differ diff --git a/sound/vore/prey/struggle_02.ogg b/sound/vore/prey/struggle_02.ogg index 2695ab0adf..2c37593725 100644 Binary files a/sound/vore/prey/struggle_02.ogg and b/sound/vore/prey/struggle_02.ogg differ diff --git a/sound/vore/prey/struggle_03.ogg b/sound/vore/prey/struggle_03.ogg index 17dd8bec8a..bde08feff6 100644 Binary files a/sound/vore/prey/struggle_03.ogg and b/sound/vore/prey/struggle_03.ogg differ diff --git a/sound/vore/prey/struggle_04.ogg b/sound/vore/prey/struggle_04.ogg index 8631853509..5bcdbb1287 100644 Binary files a/sound/vore/prey/struggle_04.ogg and b/sound/vore/prey/struggle_04.ogg differ diff --git a/sound/vore/prey/struggle_05.ogg b/sound/vore/prey/struggle_05.ogg index 233addec0b..77ade72af2 100644 Binary files a/sound/vore/prey/struggle_05.ogg and b/sound/vore/prey/struggle_05.ogg differ diff --git a/sound/vore/prey/swallow_01.ogg b/sound/vore/prey/swallow_01.ogg index 3da3fef66a..194ec691f7 100644 Binary files a/sound/vore/prey/swallow_01.ogg and b/sound/vore/prey/swallow_01.ogg differ diff --git a/sound/vore/prey/swallow_02.ogg b/sound/vore/prey/swallow_02.ogg index 30d9a4e44d..8a50ca8d32 100644 Binary files a/sound/vore/prey/swallow_02.ogg and b/sound/vore/prey/swallow_02.ogg differ diff --git a/sound/vore/prey/taurswallow.ogg b/sound/vore/prey/taurswallow.ogg index f5b5706b36..6eb5f2a1f8 100644 Binary files a/sound/vore/prey/taurswallow.ogg and b/sound/vore/prey/taurswallow.ogg differ diff --git a/strings/insult.json b/strings/insult.json index 77b176be8f..a8cdc1a5e8 100644 --- a/strings/insult.json +++ b/strings/insult.json @@ -81,7 +81,6 @@ "nouns_generic": [ "you", - "that faggot traitor", "you there", "guy", "person", @@ -173,6 +172,6 @@ "jerk", "bitch", "cuck", - "ligger" + "moron" ] } diff --git a/strings/ion_laws.json b/strings/ion_laws.json index 55913dc3f4..b95a933d7a 100644 --- a/strings/ion_laws.json +++ b/strings/ion_laws.json @@ -766,7 +766,7 @@ "THIRTEEN SEQUELS", "THREE WISHES", "A SITCOM", - "THAT GRIEFING FAGGOT GEORGE MELONS", + "THAT GRIEFING GEORGE MELONS", "FAT GIRLS ON BICYCLES", "SOMEBODY TO PUT YOU OUT OF YOUR MISERY", "HEROES IN A HALF SHELL", diff --git a/strings/names/death_commando.txt b/strings/names/death_commando.txt index 01259acf8c..e689727228 100644 --- a/strings/names/death_commando.txt +++ b/strings/names/death_commando.txt @@ -61,10 +61,10 @@ Splint Chesthair Stabby McGee Stump Beefgnaw Stump Chunkman -THAT DAMN FAGGOT TRAITOR GEORGE MELONS +THAT DAMN TRAITOR GEORGE MELONS Theodore Pain Thick McRunfast Toolboxl Rose Touch Rustrod Trunk Slamchest -Zombie Gandhi \ No newline at end of file +Zombie Gandhi diff --git a/strings/phobia.json b/strings/phobia.json index 17f480bd99..fc8fb31995 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -108,7 +108,7 @@ "lizards": [ "lizard", - "ligger", + "kobold", "hiss", "hissed", "hissing", diff --git a/strings/tips.txt b/strings/tips.txt index f396b3f542..b135692778 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -37,6 +37,7 @@ As a Medical Doctor, treating plasmamen is not impossible! Salbutamol stops them As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them. As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step. As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors! +As a Medical Doctor, medical gauze stops bleeding as well as heals 5 brute damage, this even works on the dead! Make sure to always have some gauze on you to stop bleeding before dragging someone. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment! As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater. As a Chemist, you will be expected to supply crew with certain chemicals. For example, clonexadone and mannitol for the cryo tubes, unstable mutagen and saltpetre for botany as well as healing pills and patches for the front desk. @@ -63,6 +64,8 @@ As a Roboticist, you can reset a cyborg's module by cutting and mending the rese As a Roboticist, you can greatly help out Shaft Miners by building a Firefighter APLU equipped with a hydraulic clamp and plasma cutter. The mech is ash storm proof and can even walk across lava! As a Roboticist, you can augment people with cyborg limbs. Augmented limbs can easily be repaired with cables and welders. As a Roboticist, you can use your printer that is linked to the ore silo to teleport mats into your work place! +As a Roboticist, you can upgrade cleanbots with adv mops and brooms to make them faster and better! +As a Roboticist, you can upgrade medical bots with diamond-tipped syringes, MK.II Hypospray, dispenser-sleeper-chemheater boards to make them inject faster, harder and better chems! As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can take pictures with your camera and upload them to newscasters. @@ -262,7 +265,12 @@ As a Devil, as long as you control at least one other soul, you will automatical At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth. You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other. When hacking doors, cutting and mending the "test light wire" will restore power to the door. +When hacking, remote singulars pluse when attached to a wire and pinged. This can allow you to hack things or set traps from far away. When crafting most items, you can either manually combine parts or use the crafting menu. Suit storage units not only remove blood and dirt from clothing, but also radiation! Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses. +Being out of combat mode makes makes you deal less damage to people and objects when attacking. +Resting makes you deal less damage to people and objects when attacking. +You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster. +Remember to be in combat mode while in combat, as otherwise you will be penalized by taking more incoming damage and dealing less damage to your adversary. diff --git a/strings/traumas.json b/strings/traumas.json index 864ae9b767..833c786b75 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -3,7 +3,7 @@ "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "@pick(semicolon)CAPTAINS A COMDOM", - "@pick(semicolon)@pick(faggot_traitor) @pick(george) @pick(mellens) is grifing me HALP!!!", + "@pick(semicolon) @pick(george) @pick(mellens) is grifing me HALP!!!", "can u give me @pick(mutations)?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", @@ -129,7 +129,8 @@ "@pick(semicolon)*nya", "@pick(semicolon)*awoo", "@pick(semicolon)*merp", - "@pick(semicolon)*weh" + "@pick(semicolon)*weh", + "@pick(semicolon)My balls finally feel full, again." ], "mutations": [ @@ -156,11 +157,6 @@ "mwrlins" ], - "faggot_traitor": [ - "", - "that faggot traitor" - ], - "random_gibberish": [ "g", "squid", diff --git a/strings/wisdoms.txt b/strings/wisdoms.txt new file mode 100644 index 0000000000..b4dd53027c --- /dev/null +++ b/strings/wisdoms.txt @@ -0,0 +1,443 @@ +A day for firm decisions!!!!! Or is it? +A few hours grace before the madness begins again. +A gift of a flower will soon be made to you. +A long-forgotten loved one will appear soon. +Buy the negatives at any price. +A tall, dark stranger will have more fun than you. +A visit to a fresh place will bring strange work. +A visit to a strange place will bring fresh work. +A vivid and creative mind characterizes you. +Abandon the search for Truth; settle for a good fantasy. +Accent on helpful side of your nature. Drain the moat. +Advancement in position. +After your lover has gone you will still have PEANUT BUTTER! +Afternoon very favorable for romance. Try a single person for a change. +Alimony and bribes will engage a large share of your wealth. +All the troubles you have will pass away very quickly. +Among the lucky, you are the chosen one. +An avocado-tone refrigerator would look good on your resume. +An exotic journey in downtown Newark is in your future. +Another good night not to sleep in a eucalyptus tree. +Are you a turtle? +Are you ever going to do the dishes? Or will you change your major to biology? +Are you making all this up as you go along? +Are you sure the back door is locked? +Artistic ventures highlighted. Rob a museum. +Avert misunderstanding by calm, poise, and balance. +Avoid gunfire in the bathroom tonight. +Avoid reality at all costs. +Bank error in your favor. Collect $200. +Be careful! Is it classified? +Be careful! UGLY strikes 9 out of 10! +Be cautious in your daily affairs. +Be cheerful while you are alive. +Be different: conform. +Be free and open and breezy! Enjoy! Things won't get any better so +get used to it. +Be security conscious -- National defense is at stake. +Beauty and harmony are as necessary to you as the very breath of life. +Best of all is never to have been born. Second best is to die soon. +Better hope the life-inspector doesn't come around while you have your life in such a mess. +Beware of a dark-haired man with a loud tie. +Beware of a tall black man with one blond shoe. +Beware of a tall blond man with one black shoe. +Beware of Bigfoot! +Beware of low-flying butterflies. +Beware the one behind you. +Blow it out your ear. +Break into jail and claim police brutality. +Bridge ahead. Pay troll. +Caution: breathing may be hazardous to your health. +Caution: Keep out of reach of children. +Celebrate Hannibal Day this year. Take an elephant to lunch. +Change your thoughts and you change your world. +Cheer Up! Things are getting worse at a slower rate. +Chess tonight. +Chicken Little only has to be right once. +Chicken Little was right. +Cold hands, no gloves. +Communicate! It can't make things any worse. +Courage is your greatest present need. +Day of inquiry. You will be subpoenaed. +Do not overtax your powers. +Do not sleep in a eucalyptus tree tonight. +Do nothing unless you must, and when you must act -- hesitate. +Do something unusual today. Pay a bill. +Do what comes naturally. Seethe and fume and throw a tantrum. +Domestic happiness and faithful friends. +Don't feed the bats tonight. +Don't get stuck in a closet -- wear yourself out. +Don't get to bragging. +Don't go surfing in South Dakota for a while. +Don't hate yourself in the morning -- sleep till noon. +Don't kiss an elephant on the lips today. +Don't let your mind wander -- it's too little to be let out alone. +Don't look back, the lemmings are gaining on you. +Don't look now, but the man in the moon is laughing at you. +Don't look now, but there is a multi-legged creature on your shoulder. +Don't plan any hasty moves. You'll be evicted soon anyway. +Don't read any sky-writing for the next two weeks. +Don't read everything you believe. +Don't relax! It's only your tension that's holding you together. +Don't tell any big lies today. Small ones can be just as effective. +Don't worry so loud, your roommate can't think. +Don't Worry, Be Happy. +Don't worry. Life's too long. +Don't you feel more like you do now than you did when you came in? +Don't you wish you had more energy... or less ambition? +Everything that you know is wrong, but you can be straightened out. +Everything will be just tickety-boo today. +Excellent day for putting Slinkies on an escalator. +Excellent day to have a rotten day. +Excellent time to become a missing person. +Executive ability is prominent in your make-up. +Exercise caution in your daily affairs. +Expect a letter from a friend who will ask a favor of you. +Expect the worst, it's the least you can do. +Fine day for friends. +So-so day for you. +Fine day to work off excess energy. Steal something heavy. +Fortune: You will be attacked next Wednesday at 3:15 p.m. by six samurai sword wielding purple fish glued to Harley-Davidson motorcycles. +Oh, and have a nice day! +Future looks spotty. You will spill soup in late evening. +Generosity and perfection are your everlasting goals. +Give him an evasive answer. +Give thought to your reputation. Consider changing name and moving to a new town. +Give your very best today. Heaven knows it's little enough. +Go to a movie tonight. Darkness becomes you. +Good day for a change of scene. Repaper the bedroom wall. +Good day for overcoming obstacles. Try a steeplechase. +Good day to deal with people in high places; particularly lonely stewardesses. +Good day to let down old friends who need help. +Good news from afar can bring you a welcome visitor. +Good news. Ten weeks from Friday will be a pretty good day. +Good night to spend with family, but avoid arguments with your mate's new lover. +Green light in A.M. for new projects. Red light in P.M. for traffic tickets. +Hope that the day after you die is a nice day. +If you can read this, you're too close. +If you learn one useless thing every day, in a single year you'll learn +365 useless things. +If you sow your wild oats, hope for a crop failure. +If you stand on your head, you will get footprints in your hair. +If you think last Tuesday was a drag, wait till you see what happens tomorrow! +If your life was a horse, you'd have to shoot it. +In the stairway of life, you'd best take the elevator. +Increased knowledge will help you now. Have mate's phone bugged. +Is that really YOU that is reading this? +Is this really happening? +It is so very hard to be an +on-your-own-take-care-of-yourself-because-there-is-no-one-else-to-do-it-for-you grown-up. +It may or may not be worthwhile, but it still has to be done. +It was all so different before everything changed. +It's all in the mind, ya know. +It's lucky you're going so slowly, because you're going in the wrong direction. +Just because the message may never be received does not mean it is not worth sending. +Just to have it is enough. +Keep emotionally active. Cater to your favorite neurosis. +Keep it short for pithy sake. +Lady Luck brings added income today. Lady friend takes it away tonight. +Learn to pause -- or nothing worthwhile can catch up to you. +Let me put it this way: today is going to be a learning experience. +Life is to you a dashing and bold adventure. +Life, loathe it or ignore it, you can't like it. +Live in a world of your own, but always welcome visitors. +Living your life is a task so difficult, it has never been attempted before. +Long life is in store for you. +Look afar and see the end from the beginning. +Love is in the offing. Be affectionate to one who adores you. +Make a wish, it might come true. +Many changes of mind and mood; do not hesitate too long. +Never be led astray onto the path of virtue. +Never commit yourself! Let someone else commit you. +Never give an inch! +Never look up when dragons fly overhead. +Never reveal your best argument. +Next Friday will not be your lucky day. As a matter of fact, you don't +have a lucky day this year. +Of course you have a purpose -- to find a purpose. +People are beginning to notice you. Try dressing before you leave the house. +Perfect day for scrubbing the floor and other exciting things. +Questionable day. +Ask somebody something. +Reply hazy, ask again later. +Save energy: be apathetic. +Ships are safe in harbor, but they were never meant to stay there. +Slow day. Practice crawling. +Snow Day -- stay home. +So this is it. We're going to die. +So you're back... about time... +Someone is speaking well of you. +Someone is speaking well of you. +How unusual! +Someone whom you reject today, will reject you tomorrow. +Stay away from flying saucers today. +Stay away from hurricanes for a while. +Stay the curse. +That secret you've been guarding, isn't. +The time is right to make new friends. +The whole world is a tuxedo and you are a pair of brown shoes. +There is a 20 chance of tomorrow. +There is a fly on your nose. +There was a phone call for you. +There will be big changes for you but you will be happy. +Things will be bright in P.M. A cop will shine a light in your face. +Think twice before speaking, but don't say "think think click click". +This life is yours. Some of it was given to you; the rest, you made yourself. +This will be a memorable month -- no matter how hard you try to forget it. +Time to be aggressive. Go after a tattooed Virgo. +Today is National Existential Ennui Awareness Day. +Today is the first day of the rest of the mess. +Today is the first day of the rest of your life. +Today is the last day of your life so far. +Today is the tomorrow you worried about yesterday. +Today is what happened to yesterday. +Today's weirdness is tomorrow's reason why. +Tomorrow will be cancelled due to lack of interest. +Tomorrow, this will be part of the unchangeable past but fortunately, it can still be changed today. +Tomorrow, you can be anywhere. +Tonight you will pay the wages of sin; Don't forget to leave a tip. +Tonight's the night: Sleep in a eucalyptus tree. +Troubled day for virgins over 16 who are beautiful and wealthy and live +in eucalyptus trees. +Truth will out this morning. (Which may really mess things up.) +Try the Moo Shu Pork. It is especially good today. +Try to get all of your posthumous medals in advance. +Try to have as good a life as you can under the circumstances. +Try to relax and enjoy the crisis. +Try to value useful qualities in one who loves you. +Tuesday After Lunch is the cosmic time of the week. +Tuesday is the Wednesday of the rest of your life. +What happened last night can happen again. +While you recently had your problems on the run, they've regrouped and are making another attack. +Write yourself a threatening letter and pen a defiant reply. +You are a bundle of energy, always on the go. +You are a fluke of the universe; you have no right to be here. +You are a very redundant person, that's what kind of person you are. +You are always busy. +You are as I am with You. +You are capable of planning your future. +You are confused; but this is your normal state. +You are deeply attached to your friends and acquaintances. +You are destined to become the commandant of the fighting men of the department of transportation. +You are dishonest, but never to the point of hurting a friend. +You are fairminded, just and loving. +You are farsighted, a good planner, an ardent lover, and a faithful friend. +You are fighting for survival in your own sweet and gentle way. +You are going to have a new love affair. +You are magnetic in your bearing. +You are not dead yet. But watch for further reports. +You are number 6! Who is number one? +You are only young once, but you can stay immature indefinitely. +You are scrupulously honest, frank, and straightforward. Therefore you have few friends. +You are sick, twisted and perverted. I like that in a person. +You are so boring that when I see you my feet go to sleep. +You are standing on my toes. +You are taking yourself far too seriously. +You are the only person to ever get this message. +You are wise, witty, and wonderful, but you spend too much time reading this sort of trash. +You attempt things that you do not even plan because of your extreme stupidity. +You can create your own opportunities this week. Blackmail a senior executive. +You can do very well in speculation where land or anything to do with dirt is concerned. +You can rent this space for only $5 a week. +You could live a better life, if you had a better mind and a better body. +You definitely intend to start living sometime soon. +You dialed 5483. +You display the wonderful traits of charm and courtesy. +You don't become a failure until you're satisfied with being one. +You enjoy the company of other people. +You feel a whole lot more like you do now than you did when you used to. +You fill a much-needed gap. +You get along very well with everyone except animals and people. +You had some happiness once, but your parents moved away, and you had to leave it behind. +You have a deep appreciation of the arts and music. +You have a deep interest in all that is artistic. +You have a reputation for being thoroughly reliable and trustworthy. +A pity that it's totally undeserved. +You have a strong appeal for members of the opposite sex. +You have a strong appeal for members of your own sex. +You have a strong desire for a home and your family interests come first. +You have a truly strong individuality. +You have a will that can be influenced by all with whom you come in contact. +You have an ability to sense and know higher truth. +You have an ambitious nature and may make a name for yourself. +You have an unusual equipment for success. Be sure to use it properly. +You have an unusual magnetic personality. Don't walk too close to metal objects which are not fastened down. +You have an unusual understanding of the problems of human relationships. +You have been selected for a secret mission. +You have Egyptian flu: you're going to be a mummy. +You have had a long-term stimulation relative to business. +You have literary talent that you should take pains to develop. +You have many friends and very few living enemies. +You have no real enemies. +You have taken yourself too seriously. +You have the body of a 19 year old. Please return it before it gets wrinkled. +You have the capacity to learn from mistakes. You'll learn a lot today. +You have the power to influence all with whom you come in contact. +You learn to write as if to someone else because NEXT YEAR YOU WILL BE "SOMEONE ELSE." +You like to form new friendships and make new acquaintances. +You look like a million dollars. All green and wrinkled. +You look tired. +You love peace. +You love your home and want it to be beautiful. +You may be gone tomorrow, but that doesn't mean that you weren't here today. +You may be infinitely smaller than some things, but you're infinitely larger than others. +You may be recognized soon. Hide. +You may get an opportunity for advancement today. Watch it! +You may worry about your hair-do today, but tomorrow much peanut butter will be sold. +You need more time; and you probably always will. +You need no longer worry about the future. This time tomorrow you'll be dead. +You never hesitate to tackle the most difficult problems. +You never know how many friends you have until you rent a house on the beach. +You now have Asian Flu. +You own a dog, but you can only feed a cat. +You plan things that you do not even attempt because of your extreme caution. +You possess a mind not merely twisted, but actually sprained. +You prefer the company of the opposite sex, but are well liked by your own. +You recoil from the crude; you tend naturally toward the exquisite. +You seek to shield those you love and you like the role of the provider. +You shall be rewarded for a dastardly deed. +You should emulate your heroes, but don't carry it too far. Especially if they are dead. +You should go home. +You single-handedly fought your way into this hopeless mess. +You teach best what you most need to learn. +You too can wear a nose mitten. +You two ought to be more careful--your love could drag on for years and years. +You will always get the greatest recognition for the job you least like. +You will always have good luck in your personal affairs. +You will attract cultured and artistic people to your home. +You will be a winner today. Pick a fight with a four-year-old. +You will be advanced socially, without any special effort on your part. +You will be aided greatly by a person whom you thought to be unimportant. +You will be attacked by a beast who has the body of a wolf, the tail of a lion, and the face of Donald Duck. +You will be audited by the Internal Revenue Service. +You will be awarded a medal for disregarding safety in saving someone. +You will be awarded some great honor. +You will be awarded the Nobel Peace Prize... posthumously. +You will be called upon to help a friend in trouble. +You will be divorced within a year. +You will be given a post of trust and responsibility. +You will be held hostage by a radical group. +You will be honored for contributing your time and skill to a worthy cause. +You will be imprisoned for contributing your time and skill to a bank robbery. +You will be married within a year, and divorced within two. +You will be married within a year. +You will be misunderstood by everyone. +You will be recognized and honored as a community leader. +You will be reincarnated as a toad; and you will be much happier. +You will be run over by a beer truck. +You will be run over by a bus. +You will be singled out for promotion in your work. +You will be successful in love. +You will be surprised by a loud noise. +You will be surrounded by luxury. +You will be the last person to buy a Chrysler. +You will be the victim of a bizarre joke. +You will be Told about it Tomorrow. Go Home and Prepare Thyself. +You will be traveling and coming into a fortune. +You will be winged by an anti-aircraft battery. +You will become rich and famous unless you don't. +You will contract a rare disease. +You will engage in a profitable business activity. +You will experience a strong urge to do good; but it will pass. +You will feel hungry again in another hour. +You will forget that you ever knew me. +You will gain money by a fattening action. +You will gain money by a speculation or lottery. +You will gain money by an illegal action. +You will gain money by an immoral action. +You will get what you deserve. +You will give someone a piece of your mind, which you can ill afford. +You will have a long and boring life. +You will have a long and unpleasant discussion with your supervisor. +You will have domestic happiness and faithful friends. +You will have good luck and overcome many hardships. +You will have long and healthy life. +You will hear good news from one you thought unfriendly to you. +You will inherit millions of dollars. +You will inherit some money or a small piece of land. +You will live a long, healthy, happy life and make bags of money. +You will live to see your grandchildren. +You will lose your present job and have to become a door to door mayonnaise salesman. +You will meet an important person who will help you advance professionally. +You will never know hunger. +You will not be elected to public office this year. +You will obey or molten silver will be poured into your ears. +You will outgrow your usefulness. +You will overcome the attacks of jealous associates. +You will pass away very quickly. +You will pay for your sins. If you have already paid, please disregard this message. +You will pioneer the first Martian colony. +You will probably marry after a very brief courtship. +You will reach the highest possible point in your business or profession. +You will receive a legacy which will place you above want. +You will remember something that you should not have forgotten. +You will soon forget this. +You will soon meet a person who will play an important role in your life. +You will step on the night soil of many countries. +You will stop at nothing to reach your objective, but only because your brakes are defective. +You will triumph over your enemy. +You will visit the Dung Pits of Glive soon. +You will win success in whatever calling you adopt. +You will wish you hadn't. +You work very hard. Don't try to think as well. +You worry too much about your job. Stop it. You are not paid enough to worry. +You would if you could but you can't so you won't. +You'd like to do it instantaneously, but that's too slow. +You'll be called to a post requiring ability in handling groups of people. +You'll be sorry... +You'll feel devilish tonight. Toss dynamite caps under a flamenco dancer's heel. +You'll feel much better once you've given up hope. +You'll never be the man your mother was! +You'll never see all the places, or read all the books, but fortunately, +they're not all recommended. +You'll wish that you had done some of the hard things when they were easier to do. +You're a card which will have to be dealt with. +You're almost as happy as you think you are. +You're at the end of the road again. +You're being followed. Cut out the hanky-panky for a few days. +You're currently going through a difficult transition period called "Life." +You're definitely on their list. The question to ask next is what list it is. +You're growing out of some of your problems, but there are others that you're growing into. +You're not my type. For that matter, you're not even my species!!! +You're ugly and your mother dresses you funny. +You're working under a slight handicap. You happen to be human. +You've been leading a dog's life. Stay off the furniture. +Your aim is high and to the right. +Your aims are high, and you are capable of much. +Your analyst has you mixed up with another patient. Don't believe a thing he tells you. +Your best consolation is the hope that the things you failed to get weren't really worth having. +Your boss climbed the corporate ladder, wrong by wrong. +Your boss is a few sandwiches short of a picnic. +Your boyfriend takes chocolate from strangers. +Your business will assume vast proportions. +Your business will go through a period of considerable expansion. +Your depth of comprehension may tend to make you lax in worldly ways. +Your domestic life may be harmonious. +Your fly might be open (but don't check it just now). +Your goose is cooked. +(Your current chick is burned up too!) +Your heart is pure, and your mind clear, and your soul devout. +Your ignorance cramps my conversation. +Your life would be very empty if you had nothing to regret. +Your love life will be happy and harmonious. +Your love life will be... interesting. +Your lover will never wish to leave you. +Your lucky color has faded. +Your lucky number has been disconnected. +Your lucky number is 3552664958674928. Watch for it everywhere. +Your mode of life will be changed for the better because of good news soon. +Your mode of life will be changed for the better because of new developments. +Your motives for doing whatever good deed you may have in mind will be misinterpreted by somebody. +Your nature demands love and your happiness depends on it. +Your object is to save the world, while still leading a pleasant life. +Your own qualities will help prevent your advancement in the world. +Your present plans will be successful. +Your reasoning is excellent -- it's only your basic assumptions that are wrong. +Your reasoning powers are good, and you are a fairly good planner. +Your sister swims out to meet troop ships. +Your society will be sought by people of taste and refinement. +Your step will soil many countries. +Your supervisor is thinking about you. +Your talents will be recognized and suitably rewarded. +Your temporary financial embarrassment will be relieved in a surprising manner. +Your true value depends entirely on what you are compared with. diff --git a/tgstation.dme b/tgstation.dme index 7eff305581..78cce84a0c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -17,7 +17,6 @@ #include "_maps\_basemap.dm" #include "code\_compile_options.dm" #include "code\world.dm" -#include "code\__DEFINES\__513_compatibility.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -43,21 +42,23 @@ #include "code\__DEFINES\diseases.dm" #include "code\__DEFINES\DNA.dm" #include "code\__DEFINES\donator_groupings.dm" +#include "code\__DEFINES\dye_keys.dm" #include "code\__DEFINES\dynamic.dm" +#include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fantasy_affixes.dm" -#include "code\__DEFINES\flags.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\instruments.dm" #include "code\__DEFINES\integrated_electronics.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\inventory.dm" #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" #include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\layers_planes.dm" #include "code\__DEFINES\lighting.dm" #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" @@ -75,7 +76,6 @@ #include "code\__DEFINES\movespeed_modification.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" -#include "code\__DEFINES\obj_flags.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" #include "code\__DEFINES\pool.dm" @@ -83,6 +83,7 @@ #include "code\__DEFINES\preferences.dm" #include "code\__DEFINES\procpath.dm" #include "code\__DEFINES\profile.dm" +#include "code\__DEFINES\projectiles.dm" #include "code\__DEFINES\qdel.dm" #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" @@ -92,9 +93,9 @@ #include "code\__DEFINES\research.dm" #include "code\__DEFINES\robots.dm" #include "code\__DEFINES\role_preferences.dm" -#include "code\__DEFINES\rust_g.config.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\say.dm" +#include "code\__DEFINES\security_levels.dm" #include "code\__DEFINES\shuttles.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\sound.dm" @@ -117,19 +118,39 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\_flags\_flags.dm" +#include "code\__DEFINES\_flags\item_flags.dm" +#include "code\__DEFINES\_flags\obj_flags.dm" +#include "code\__DEFINES\admin\keybindings.dm" +#include "code\__DEFINES\combat\attack_types.dm" +#include "code\__DEFINES\combat\block.dm" +#include "code\__DEFINES\combat\block_parry.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\flags\do_after.dm" +#include "code\__DEFINES\flags\shields.dm" +#include "code\__DEFINES\mapping\maploader.dm" +#include "code\__DEFINES\material\worth.dm" +#include "code\__DEFINES\misc\return_values.dm" +#include "code\__DEFINES\mobs\slowdowns.dm" +#include "code\__DEFINES\research\stock_parts.dm" +#include "code\__DEFINES\skills\defines.dm" +#include "code\__DEFINES\skills\helpers.dm" +#include "code\__DEFINES\storage\_storage.dm" +#include "code\__DEFINES\storage\volumetrics.dm" #include "code\__HELPERS\_cit_helpers.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\angles.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\custom_holoforms.dm" #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\dna.dm" +#include "code\__HELPERS\do_after.dm" #include "code\__HELPERS\donator_groupings.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\game.dm" @@ -156,6 +177,7 @@ #include "code\__HELPERS\text_vr.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\type_processing.dm" #include "code\__HELPERS\typelists.dm" #include "code\__HELPERS\unsorted.dm" #include "code\__HELPERS\vector.dm" @@ -171,7 +193,10 @@ #include "code\_globalvars\logging.dm" #include "code\_globalvars\misc.dm" #include "code\_globalvars\regexes.dm" +#include "code\_globalvars\traits.dm" +#include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\keybindings.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" #include "code\_globalvars\lists\medals.dm" @@ -223,6 +248,7 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" +#include "code\_onclick\hud\screen_objects\storage.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration_citadel.dm" #include "code\controllers\controller.dm" @@ -255,10 +281,12 @@ #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\disease.dm" +#include "code\controllers\subsystem\economy.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\holodeck.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\input.dm" @@ -274,7 +302,6 @@ #include "code\controllers\subsystem\minimaps.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\moods.dm" #include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\overlays.dm" @@ -289,6 +316,7 @@ #include "code\controllers\subsystem\research.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" +#include "code\controllers\subsystem\sounds.dm" #include "code\controllers\subsystem\spacedrift.dm" #include "code\controllers\subsystem\stickyban.dm" #include "code\controllers\subsystem\sun.dm" @@ -306,6 +334,7 @@ #include "code\controllers\subsystem\processing\circuit.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" +#include "code\controllers\subsystem\processing\instruments.dm" #include "code\controllers\subsystem\processing\nanites.dm" #include "code\controllers\subsystem\processing\networks.dm" #include "code\controllers\subsystem\processing\obj.dm" @@ -321,6 +350,7 @@ #include "code\datums\beam.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" +#include "code\datums\chatmessage.dm" #include "code\datums\cinematic.dm" #include "code\datums\dash_weapon.dm" #include "code\datums\datacore.dm" @@ -328,14 +358,12 @@ #include "code\datums\datumvars.dm" #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" -#include "code\datums\embedding_behavior.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\explosion.dm" #include "code\datums\forced_movement.dm" #include "code\datums\holocall.dm" #include "code\datums\hud.dm" -#include "code\datums\map_config.dm" #include "code\datums\mind.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\numbered_display.dm" @@ -350,6 +378,7 @@ #include "code\datums\shuttles.dm" #include "code\datums\soullink.dm" #include "code\datums\spawners_menu.dm" +#include "code\datums\tgs_event_handler.dm" #include "code\datums\verbs.dm" #include "code\datums\weakrefs.dm" #include "code\datums\world_topic.dm" @@ -358,6 +387,7 @@ #include "code\datums\brain_damage\brain_trauma.dm" #include "code\datums\brain_damage\hypnosis.dm" #include "code\datums\brain_damage\imaginary_friend.dm" +#include "code\datums\brain_damage\magic.dm" #include "code\datums\brain_damage\mild.dm" #include "code\datums\brain_damage\phobia.dm" #include "code\datums\brain_damage\severe.dm" @@ -371,15 +401,16 @@ #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\combat_mode.dm" #include "code\datums\components\construction.dm" -#include "code\datums\components\decal.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\earprotection.dm" #include "code\datums\components\edit_complainer.dm" -#include "code\datums\components\empprotection.dm" +#include "code\datums\components\embedded.dm" #include "code\datums\components\explodable.dm" +#include "code\datums\components\field_of_vision.dm" #include "code\datums\components\footstep.dm" -#include "code\datums\components\forced_gravity.dm" +#include "code\datums\components\identification.dm" #include "code\datums\components\igniter.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" @@ -390,18 +421,21 @@ #include "code\datums\components\magnetic_catch.dm" #include "code\datums\components\material_container.dm" #include "code\datums\components\mirage_border.dm" +#include "code\datums\components\mirv.dm" #include "code\datums\components\mood.dm" #include "code\datums\components\nanites.dm" #include "code\datums\components\ntnet_interface.dm" +#include "code\datums\components\omen.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\paintable.dm" +#include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\phantomthief.dm" #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\remote_materials.dm" #include "code\datums\components\riding.dm" #include "code\datums\components\rotation.dm" -#include "code\datums\components\shrapnel.dm" +#include "code\datums\components\shielded.dm" #include "code\datums\components\shrink.dm" #include "code\datums\components\sizzle.dm" #include "code\datums\components\slippery.dm" @@ -411,16 +445,17 @@ #include "code\datums\components\stationloving.dm" #include "code\datums\components\summoning.dm" #include "code\datums\components\swarming.dm" -#include "code\datums\components\tactical.dm" +#include "code\datums\components\tackle.dm" #include "code\datums\components\thermite.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\virtual_reality.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\crafting\craft.dm" -#include "code\datums\components\crafting\glassware.dm" #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\glassware\glassware.dm" +#include "code\datums\components\crafting\glassware\lens_crafting.dm" #include "code\datums\components\crafting\recipes\recipes_clothing.dm" #include "code\datums\components\crafting\recipes\recipes_misc.dm" #include "code\datums\components\crafting\recipes\recipes_primal.dm" @@ -431,6 +466,7 @@ #include "code\datums\components\fantasy\prefixes.dm" #include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\storage\storage.dm" +#include "code\datums\components\storage\ui.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" #include "code\datums\components\storage\concrete\bluespace.dm" @@ -496,17 +532,30 @@ #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\art.dm" +#include "code\datums\elements\beauty.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\decal.dm" #include "code\datums\elements\dusts_on_catatonia.dm" #include "code\datums\elements\dusts_on_leaving_area.dm" +#include "code\datums\elements\dwarfism.dm" #include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\embed.dm" +#include "code\datums\elements\empprotection.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\flavor_text.dm" +#include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\photosynthesis.dm" +#include "code\datums\elements\polychromic.dm" +#include "code\datums\elements\scavenging.dm" +#include "code\datums\elements\snail_crawl.dm" #include "code\datums\elements\spellcasting.dm" +#include "code\datums\elements\squish.dm" #include "code\datums\elements\swimming.dm" #include "code\datums\elements\sword_point.dm" +#include "code\datums\elements\tactical.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" #include "code\datums\elements\wuv.dm" @@ -550,9 +599,19 @@ #include "code\datums\mutations\space_adaptation.dm" #include "code\datums\mutations\speech.dm" #include "code\datums\mutations\telekinesis.dm" +#include "code\datums\ruins\icemoon.dm" #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\ruins\station.dm" +#include "code\datums\skills\_check_skills.dm" +#include "code\datums\skills\_skill.dm" +#include "code\datums\skills\_skill_holder.dm" +#include "code\datums\skills\_skill_modifier.dm" +#include "code\datums\skills\engineering.dm" +#include "code\datums\skills\medical.dm" +#include "code\datums\skills\modifiers\job.dm" +#include "code\datums\skills\modifiers\mood.dm" +#include "code\datums\skills\modifiers\organs.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" #include "code\datums\status_effects\gas.dm" @@ -573,7 +632,6 @@ #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\autoylathe.dm" #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\microwave.dm" @@ -605,6 +663,7 @@ #include "code\game\area\areas\mining.dm" #include "code\game\area\areas\shuttles.dm" #include "code\game\area\areas\ruins\_ruins.dm" +#include "code\game\area\areas\ruins\icemoon.dm" #include "code\game\area\areas\ruins\lavaland.dm" #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" @@ -687,6 +746,7 @@ #include "code\game\machinery\gulag_teleporter.dm" #include "code\game\machinery\harvester.dm" #include "code\game\machinery\hologram.dm" +#include "code\game\machinery\hypnochair.dm" #include "code\game\machinery\igniter.dm" #include "code\game\machinery\iv_drip.dm" #include "code\game\machinery\launch_pad.dm" @@ -710,7 +770,6 @@ #include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\syndicatebomb.dm" #include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\toylathe.dm" #include "code\game\machinery\transformer.dm" #include "code\game\machinery\turnstile.dm" #include "code\game\machinery\washing_machine.dm" @@ -773,6 +832,9 @@ #include "code\game\machinery\porta_turret\portable_turret.dm" #include "code\game\machinery\porta_turret\portable_turret_construct.dm" #include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\shuttle\custom_shuttle.dm" +#include "code\game\machinery\shuttle\shuttle_engine.dm" +#include "code\game\machinery\shuttle\shuttle_heater.dm" #include "code\game\machinery\telecomms\broadcasting.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" #include "code\game\machinery\telecomms\telecomunications.dm" @@ -846,6 +908,7 @@ #include "code\game\objects\effects\decals\decal.dm" #include "code\game\objects\effects\decals\misc.dm" #include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\vgdecals.dm" #include "code\game\objects\effects\decals\cleanable\aliens.dm" #include "code\game\objects\effects\decals\cleanable\gibs.dm" #include "code\game\objects\effects\decals\cleanable\humans.dm" @@ -897,7 +960,9 @@ #include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\cosmetics.dm" #include "code\game\objects\items\courtroom.dm" +#include "code\game\objects\items\crab17.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\credit_holochip.dm" #include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" @@ -927,6 +992,7 @@ #include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" +#include "code\game\objects\items\puzzle_pieces.dm" #include "code\game\objects\items\RCD.dm" #include "code\game\objects\items\RCL.dm" #include "code\game\objects\items\religion.dm" @@ -936,6 +1002,7 @@ #include "code\game\objects\items\sharpener.dm" #include "code\game\objects\items\shields.dm" #include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\shrapnel.dm" #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\singularityhammer.dm" #include "code\game\objects\items\stunbaton.dm" @@ -962,18 +1029,19 @@ #include "code\game\objects\items\devices\dogborg_sleeper.dm" #include "code\game\objects\items\devices\doorCharge.dm" #include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" +#include "code\game\objects\items\devices\electrochromatic_kit.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\forcefieldprojector.dm" #include "code\game\objects\items\devices\geiger_counter.dm" #include "code\game\objects\items\devices\glue.dm" #include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\instruments.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\multitool.dm" #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\polycircuit.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\pressureplates.dm" #include "code\game\objects\items\devices\quantum_keycard.dm" @@ -1037,6 +1105,7 @@ #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\tape.dm" #include "code\game\objects\items\stacks\telecrystal.dm" #include "code\game\objects\items\stacks\wrap.dm" #include "code\game\objects\items\stacks\sheets\glass.dm" @@ -1048,6 +1117,7 @@ #include "code\game\objects\items\stacks\tiles\light.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\storage\_storage.dm" #include "code\game\objects\items\storage\backpack.dm" #include "code\game\objects\items\storage\bags.dm" #include "code\game\objects\items\storage\belt.dm" @@ -1059,7 +1129,6 @@ #include "code\game\objects\items\storage\firstaid.dm" #include "code\game\objects\items\storage\lockbox.dm" #include "code\game\objects\items\storage\secure.dm" -#include "code\game\objects\items\storage\storage.dm" #include "code\game\objects\items\storage\toolbox.dm" #include "code\game\objects\items\storage\uplink_kits.dm" #include "code\game\objects\items\storage\wallets.dm" @@ -1068,6 +1137,7 @@ #include "code\game\objects\items\tanks\tanks.dm" #include "code\game\objects\items\tanks\watertank.dm" #include "code\game\objects\items\tools\crowbar.dm" +#include "code\game\objects\items\tools\saw.dm" #include "code\game\objects\items\tools\screwdriver.dm" #include "code\game\objects\items\tools\weldingtool.dm" #include "code\game\objects\items\tools\wirecutters.dm" @@ -1093,6 +1163,7 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\fugitive_role_spawners.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -1107,13 +1178,13 @@ #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\life_candle.dm" #include "code\game\objects\structures\loom.dm" +#include "code\game\objects\structures\loot_pile.dm" #include "code\game\objects\structures\manned_turret.dm" #include "code\game\objects\structures\memorial.dm" #include "code\game\objects\structures\mineral_doors.dm" #include "code\game\objects\structures\mirror.dm" #include "code\game\objects\structures\mop_bucket.dm" #include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" #include "code\game\objects\structures\noticeboard.dm" #include "code\game\objects\structures\petrified_statue.dm" #include "code\game\objects\structures\plasticflaps.dm" @@ -1165,6 +1236,7 @@ #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\icemoon\cave_entrance.dm" #include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\signs\_signs.dm" #include "code\game\objects\structures\signs\signs_departments.dm" @@ -1231,6 +1303,7 @@ #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\whitelist.dm" +#include "code\modules\admin\callproc\callproc.dm" #include "code\modules\admin\DB_ban\functions.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -1254,8 +1327,6 @@ #include "code\modules\admin\verbs\map_template_loadverb.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\maprotation.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" #include "code\modules\admin\verbs\one_click_antag.dm" #include "code\modules\admin\verbs\onlyone.dm" #include "code\modules\admin\verbs\panicbunker.dm" @@ -1269,12 +1340,23 @@ #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\admin_delete.dm" +#include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\admin\view_variables\get_variables.dm" +#include "code\modules\admin\view_variables\mark_datum.dm" +#include "code\modules\admin\view_variables\mass_edit_variables.dm" +#include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\topic_basic.dm" +#include "code\modules\admin\view_variables\topic_list.dm" +#include "code\modules\admin\view_variables\view_variables.dm" #include "code\modules\antagonists\_common\antag_datum.dm" #include "code\modules\antagonists\_common\antag_helpers.dm" #include "code\modules\antagonists\_common\antag_hud.dm" #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" #include "code\modules\antagonists\abductor\abductor.dm" +#include "code\modules\antagonists\abductor\ice_abductor.dm" #include "code\modules\antagonists\abductor\abductee\abductee.dm" #include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" #include "code\modules\antagonists\abductor\abductee\trauma.dm" @@ -1417,6 +1499,7 @@ #include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm" #include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm" #include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_shield.dm" #include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm" #include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm" #include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm" @@ -1465,6 +1548,10 @@ #include "code\modules\antagonists\disease\disease_event.dm" #include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" +#include "code\modules\antagonists\fugitive\fugitive.dm" +#include "code\modules\antagonists\fugitive\fugitive_outfits.dm" +#include "code\modules\antagonists\fugitive\fugitive_ship.dm" +#include "code\modules\antagonists\fugitive\hunter.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\greybois\greybois.dm" #include "code\modules\antagonists\highlander\highlander.dm" @@ -1520,6 +1607,15 @@ #include "code\modules\antagonists\wizard\equipment\soulstone.dm" #include "code\modules\antagonists\wizard\equipment\spellbook.dm" #include "code\modules\antagonists\xeno\xeno.dm" +#include "code\modules\arousal\arousal.dm" +#include "code\modules\arousal\genitals.dm" +#include "code\modules\arousal\genitals_sprite_accessories.dm" +#include "code\modules\arousal\organs\breasts.dm" +#include "code\modules\arousal\organs\penis.dm" +#include "code\modules\arousal\organs\testicles.dm" +#include "code\modules\arousal\organs\vagina.dm" +#include "code\modules\arousal\organs\womb.dm" +#include "code\modules\arousal\toys\dildos.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\doorcontrol.dm" @@ -1536,6 +1632,11 @@ #include "code\modules\assembly\signaler.dm" #include "code\modules\assembly\timer.dm" #include "code\modules\assembly\voice.dm" +#include "code\modules\asset_cache\asset_cache.dm" +#include "code\modules\asset_cache\asset_cache_client.dm" +#include "code\modules\asset_cache\asset_cache_item.dm" +#include "code\modules\asset_cache\asset_list.dm" +#include "code\modules\asset_cache\asset_list_items.dm" #include "code\modules\atmospherics\multiz.dm" #include "code\modules\atmospherics\environmental\LINDA_fire.dm" #include "code\modules\atmospherics\environmental\LINDA_system.dm" @@ -1628,6 +1729,7 @@ #include "code\modules\cargo\bounty_console.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\console.dm" +#include "code\modules\cargo\coupon.dm" #include "code\modules\cargo\export_scanner.dm" #include "code\modules\cargo\exports.dm" #include "code\modules\cargo\expressconsole.dm" @@ -1668,6 +1770,7 @@ #include "code\modules\cargo\packs\emergency.dm" #include "code\modules\cargo\packs\engine.dm" #include "code\modules\cargo\packs\engineering.dm" +#include "code\modules\cargo\packs\goodies.dm" #include "code\modules\cargo\packs\livestock.dm" #include "code\modules\cargo\packs\materials.dm" #include "code\modules\cargo\packs\medical.dm" @@ -1678,7 +1781,6 @@ #include "code\modules\cargo\packs\service.dm" #include "code\modules\cargo\packs\vending.dm" #include "code\modules\chatter\chatter.dm" -#include "code\modules\client\asset_cache.dm" #include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" @@ -1710,9 +1812,9 @@ #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" #include "code\modules\clothing\gloves\ring.dm" +#include "code\modules\clothing\gloves\tacklers.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\beanie.dm" -#include "code\modules\clothing\head\cit_hats.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\hardhat.dm" #include "code\modules\clothing\head\helmet.dm" @@ -1785,6 +1887,9 @@ #include "code\modules\detectivework\detective_work.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" +#include "code\modules\economy\_economy.dm" +#include "code\modules\economy\account.dm" +#include "code\modules\economy\paystand.dm" #include "code\modules\emoji\emoji_parse.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" @@ -1799,6 +1904,7 @@ #include "code\modules\events\anomaly_vortex.dm" #include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\blob.dm" +#include "code\modules\events\brain_trauma.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\bureaucratic_error.dm" #include "code\modules\events\camerafailure.dm" @@ -1808,7 +1914,9 @@ #include "code\modules\events\disease_outbreak.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\fake_virus.dm" #include "code\modules\events\false_alarm.dm" +#include "code\modules\events\fugitive_spawning.dm" #include "code\modules\events\ghost_role.dm" #include "code\modules\events\grid_check.dm" #include "code\modules\events\heart_attack.dm" @@ -1832,7 +1940,9 @@ #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\stray_cargo.dm" #include "code\modules\events\vent_clog.dm" +#include "code\modules\events\wisdomcow.dm" #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" #include "code\modules\events\holiday\vday.dm" @@ -1841,6 +1951,7 @@ #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\embeddies.dm" #include "code\modules\events\wizard\fakeexplosion.dm" #include "code\modules\events\wizard\ghost.dm" #include "code\modules\events\wizard\greentext.dm" @@ -1917,6 +2028,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" #include "code\modules\games\cas.dm" +#include "code\modules\games\unum.dm" #include "code\modules\goonchat\browserOutput.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" @@ -1957,6 +2069,7 @@ #include "code\modules\hydroponics\grown\cotton.dm" #include "code\modules\hydroponics\grown\eggplant.dm" #include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\garlic.dm" #include "code\modules\hydroponics\grown\grass_carpet.dm" #include "code\modules\hydroponics\grown\kudzu.dm" #include "code\modules\hydroponics\grown\melon.dm" @@ -1966,6 +2079,7 @@ #include "code\modules\hydroponics\grown\onion.dm" #include "code\modules\hydroponics\grown\peach.dm" #include "code\modules\hydroponics\grown\peanuts.dm" +#include "code\modules\hydroponics\grown\peas.dm" #include "code\modules\hydroponics\grown\pineapple.dm" #include "code\modules\hydroponics\grown\potato.dm" #include "code\modules\hydroponics\grown\pumpkin.dm" @@ -1976,6 +2090,22 @@ #include "code\modules\hydroponics\grown\tobacco.dm" #include "code\modules\hydroponics\grown\tomato.dm" #include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\instruments\instrument_data\_instrument_data.dm" +#include "code\modules\instruments\instrument_data\_instrument_key.dm" +#include "code\modules\instruments\instrument_data\brass.dm" +#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" +#include "code\modules\instruments\instrument_data\fun.dm" +#include "code\modules\instruments\instrument_data\guitar.dm" +#include "code\modules\instruments\instrument_data\hardcoded.dm" +#include "code\modules\instruments\instrument_data\organ.dm" +#include "code\modules\instruments\instrument_data\piano.dm" +#include "code\modules\instruments\instrument_data\synth_tones.dm" +#include "code\modules\instruments\instruments\item.dm" +#include "code\modules\instruments\instruments\stationary.dm" +#include "code\modules\instruments\songs\_song.dm" +#include "code\modules\instruments\songs\editor.dm" +#include "code\modules\instruments\songs\play_legacy.dm" +#include "code\modules\instruments\songs\play_synthesized.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" #include "code\modules\integrated_electronics\core\assemblies.dm" @@ -2055,16 +2185,23 @@ #include "code\modules\jobs\job_types\virologist.dm" #include "code\modules\jobs\job_types\warden.dm" #include "code\modules\jobs\map_changes\map_changes.dm" -#include "code\modules\keybindings\bindings_admin.dm" #include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_carbon.dm" #include "code\modules\keybindings\bindings_client.dm" -#include "code\modules\keybindings\bindings_human.dm" -#include "code\modules\keybindings\bindings_living.dm" -#include "code\modules\keybindings\bindings_mob.dm" -#include "code\modules\keybindings\bindings_robot.dm" #include "code\modules\keybindings\focus.dm" #include "code\modules\keybindings\setup.dm" +#include "code\modules\keybindings\keybind\__defines.dm" +#include "code\modules\keybindings\keybind\_keybind.dm" +#include "code\modules\keybindings\keybind\admin.dm" +#include "code\modules\keybindings\keybind\carbon.dm" +#include "code\modules\keybindings\keybind\client.dm" +#include "code\modules\keybindings\keybind\combat.dm" +#include "code\modules\keybindings\keybind\emote.dm" +#include "code\modules\keybindings\keybind\human.dm" +#include "code\modules\keybindings\keybind\living.dm" +#include "code\modules\keybindings\keybind\mob.dm" +#include "code\modules\keybindings\keybind\movement.dm" +#include "code\modules\keybindings\keybind\robot.dm" +#include "code\modules\keybindings\keybind\targeting.dm" #include "code\modules\language\aphasia.dm" #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" @@ -2082,6 +2219,7 @@ #include "code\modules\language\ratvarian.dm" #include "code\modules\language\slime.dm" #include "code\modules\language\swarmer.dm" +#include "code\modules\language\sylvan.dm" #include "code\modules\language\vampiric.dm" #include "code\modules\language\xenocommon.dm" #include "code\modules\library\lib_codex_gigas.dm" @@ -2097,7 +2235,8 @@ #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\mapping\dmm_suite.dm" +#include "code\modules\mapping\map_config.dm" +#include "code\modules\mapping\map_orientation_pattern.dm" #include "code\modules\mapping\map_template.dm" #include "code\modules\mapping\minimaps.dm" #include "code\modules\mapping\preloader.dm" @@ -2159,12 +2298,12 @@ #include "code\modules\mob\mob_defines.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_movespeed.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.dm" #include "code\modules\mob\say_vr.dm" #include "code\modules\mob\status_procs.dm" #include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\camera\camera.dm" #include "code\modules\mob\dead\dead.dm" @@ -2185,9 +2324,9 @@ #include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\ipc_synths.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\legs_and_taurs.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\spines.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\synthliz.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" @@ -2206,7 +2345,10 @@ #include "code\modules\mob\living\emote.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_combat.dm" +#include "code\modules\mob\living\living_active_block.dm" +#include "code\modules\mob\living\living_active_parry.dm" +#include "code\modules\mob\living\living_block.dm" +#include "code\modules\mob\living\living_blocking_parrying.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_mobility.dm" @@ -2229,7 +2371,6 @@ #include "code\modules\mob\living\brain\say.dm" #include "code\modules\mob\living\brain\status_procs.dm" #include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_combat.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_movement.dm" @@ -2283,6 +2424,7 @@ #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_block.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm" @@ -2290,10 +2432,12 @@ #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\physiology.dm" #include "code\modules\mob\living\carbon\human\say.dm" #include "code\modules\mob\living\carbon\human\species.dm" #include "code\modules\mob\living\carbon\human\status_procs.dm" +#include "code\modules\mob\living\carbon\human\typing_indicator.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\species_types\abductors.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" @@ -2369,6 +2513,7 @@ #include "code\modules\mob\living\silicon\robot\login.dm" #include "code\modules\mob\living\silicon\robot\robot.dm" #include "code\modules\mob\living\silicon\robot\robot_defense.dm" +#include "code\modules\mob\living\silicon\robot\robot_defines.dm" #include "code\modules\mob\living\silicon\robot\robot_mobility.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" @@ -2411,6 +2556,7 @@ #include "code\modules\mob\living\simple_animal\friendly\panda.dm" #include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" +#include "code\modules\mob\living\simple_animal\friendly\plushie.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" #include "code\modules\mob\living\simple_animal\friendly\snake.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" @@ -2454,6 +2600,7 @@ #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\sharks.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" @@ -2478,19 +2625,25 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\demonic_frost_miner.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" @@ -2553,6 +2706,14 @@ #include "code\modules\modular_computers\hardware\printer.dm" #include "code\modules\modular_computers\hardware\recharger.dm" #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\movespeed\_movespeed_modifier.dm" +#include "code\modules\movespeed\modifiers\components.dm" +#include "code\modules\movespeed\modifiers\innate.dm" +#include "code\modules\movespeed\modifiers\items.dm" +#include "code\modules\movespeed\modifiers\misc.dm" +#include "code\modules\movespeed\modifiers\mobs.dm" +#include "code\modules\movespeed\modifiers\reagents.dm" +#include "code\modules\movespeed\modifiers\status_effects.dm" #include "code\modules\newscaster\_news.dm" #include "code\modules\newscaster\feed_channel.dm" #include "code\modules\newscaster\feed_comment.dm" @@ -2831,10 +2992,12 @@ #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" +#include "code\modules\reagents\reagent_containers\chem_pack.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" #include "code\modules\reagents\reagent_containers\glass.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" #include "code\modules\reagents\reagent_containers\hypovial.dm" +#include "code\modules\reagents\reagent_containers\maunamug.dm" #include "code\modules\reagents\reagent_containers\medspray.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" @@ -2852,6 +3015,7 @@ #include "code\modules\recycling\disposal\outlet.dm" #include "code\modules\recycling\disposal\pipe.dm" #include "code\modules\recycling\disposal\pipe_sorting.dm" +#include "code\modules\research\bepis.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\experimentor.dm" @@ -2924,6 +3088,7 @@ #include "code\modules\research\nanites\extra_settings\type.dm" #include "code\modules\research\nanites\nanite_programs\buffing.dm" #include "code\modules\research\nanites\nanite_programs\healing.dm" +#include "code\modules\research\nanites\nanite_programs\protocols.dm" #include "code\modules\research\nanites\nanite_programs\rogue.dm" #include "code\modules\research\nanites\nanite_programs\sensor.dm" #include "code\modules\research\nanites\nanite_programs\suppression.dm" @@ -2932,7 +3097,21 @@ #include "code\modules\research\techweb\__techweb_helpers.dm" #include "code\modules\research\techweb\_techweb.dm" #include "code\modules\research\techweb\_techweb_node.dm" -#include "code\modules\research\techweb\all_nodes.dm" +#include "code\modules\research\techweb\nodes\alien_nodes.dm" +#include "code\modules\research\techweb\nodes\bepis_nodes.dm" +#include "code\modules\research\techweb\nodes\biotech_nodes.dm" +#include "code\modules\research\techweb\nodes\bluespace_nodes.dm" +#include "code\modules\research\techweb\nodes\computer_hud_nodes.dm" +#include "code\modules\research\techweb\nodes\engineering_nodes.dm" +#include "code\modules\research\techweb\nodes\export_nodes.dm" +#include "code\modules\research\techweb\nodes\mecha_nodes.dm" +#include "code\modules\research\techweb\nodes\medical_nodes.dm" +#include "code\modules\research\techweb\nodes\misc_nodes.dm" +#include "code\modules\research\techweb\nodes\nanites_nodes.dm" +#include "code\modules\research\techweb\nodes\robotics_nodes.dm" +#include "code\modules\research\techweb\nodes\syndicate_nodes.dm" +#include "code\modules\research\techweb\nodes\tools_nodes.dm" +#include "code\modules\research\techweb\nodes\weaponry_nodes.dm" #include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" #include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" @@ -2953,8 +3132,11 @@ #include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" +#include "code\modules\ruins\icemoonruin_code\hotsprings.dm" +#include "code\modules\ruins\icemoonruin_code\library.dm" #include "code\modules\ruins\lavalandruin_code\alien_nest.dm" #include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" +#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm" #include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" #include "code\modules\ruins\lavalandruin_code\puzzle.dm" #include "code\modules\ruins\lavalandruin_code\sloth.dm" @@ -2985,6 +3167,7 @@ #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\custom_shuttle.dm" #include "code\modules\shuttle\docking.dm" #include "code\modules\shuttle\elevator.dm" #include "code\modules\shuttle\emergency.dm" @@ -2996,10 +3179,17 @@ #include "code\modules\shuttle\ripple.dm" #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\snaxi.dm" #include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_actions.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_console.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_eye.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_overlay.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\aimed.dm" #include "code\modules\spells\spell_types\area_teleport.dm" @@ -3170,7 +3360,7 @@ #include "code\modules\vending\clothesmate.dm" #include "code\modules\vending\coffee.dm" #include "code\modules\vending\cola.dm" -#include "code\modules\vending\drinnerware.dm" +#include "code\modules\vending\dinnerware.dm" #include "code\modules\vending\engineering.dm" #include "code\modules\vending\engivend.dm" #include "code\modules\vending\games.dm" @@ -3209,9 +3399,7 @@ #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" -#include "modular_citadel\code\__HELPERS\list2list.dm" -#include "modular_citadel\code\__HELPERS\lists.dm" -#include "modular_citadel\code\__HELPERS\mobs.dm" +#include "interface\skin.dmf" #include "modular_citadel\code\_onclick\click.dm" #include "modular_citadel\code\_onclick\item_attack.dm" #include "modular_citadel\code\_onclick\other_mobs.dm" @@ -3220,24 +3408,11 @@ #include "modular_citadel\code\_onclick\hud\stamina.dm" #include "modular_citadel\code\datums\components\souldeath.dm" #include "modular_citadel\code\datums\status_effects\chems.dm" -#include "modular_citadel\code\game\machinery\wishgranter.dm" #include "modular_citadel\code\game\objects\cit_screenshake.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" -#include "modular_citadel\code\modules\admin\chat_commands.dm" #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" -#include "modular_citadel\code\modules\arousal\arousal.dm" -#include "modular_citadel\code\modules\arousal\genitals.dm" -#include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm" -#include "modular_citadel\code\modules\arousal\organs\breasts.dm" -#include "modular_citadel\code\modules\arousal\organs\penis.dm" -#include "modular_citadel\code\modules\arousal\organs\testicles.dm" -#include "modular_citadel\code\modules\arousal\organs\vagina.dm" -#include "modular_citadel\code\modules\arousal\organs\womb.dm" -#include "modular_citadel\code\modules\arousal\toys\dildos.dm" -#include "modular_citadel\code\modules\client\client_defines.dm" #include "modular_citadel\code\modules\client\client_procs.dm" -#include "modular_citadel\code\modules\client\preferences.dm" #include "modular_citadel\code\modules\client\preferences_savefile.dm" #include "modular_citadel\code\modules\client\preferences_toggles.dm" #include "modular_citadel\code\modules\client\loadout\__donator.dm" @@ -3258,7 +3433,6 @@ #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\trek.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" #include "modular_citadel\code\modules\clothing\suits\suits.dm" #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" @@ -3276,12 +3450,9 @@ #include "modular_citadel\code\modules\mob\living\living.dm" #include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" #include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" -#include "modular_citadel\code\modules\mob\living\carbon\life.dm" #include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" #include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" -#include "modular_citadel\code\modules\projectiles\gun.dm" #include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" #include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" #include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" @@ -3301,11 +3472,8 @@ #include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" #include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" #include "modular_citadel\code\modules\reagents\objects\clothes.dm" #include "modular_citadel\code\modules\reagents\objects\items.dm" -#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" -#include "modular_citadel\interface\skin.dmf" // END_INCLUDE diff --git a/tgui-next/packages/tgui/interfaces/AirlockElectronics.js b/tgui-next/packages/tgui/interfaces/AirlockElectronics.js index 680849e649..f42afd1de2 100644 --- a/tgui-next/packages/tgui/interfaces/AirlockElectronics.js +++ b/tgui-next/packages/tgui/interfaces/AirlockElectronics.js @@ -79,7 +79,7 @@ export const AirlockElectronics = props => { />